Frequently Asked Questions
What's the difference between PDK and Projen?
Projen is a framework which allows you to define and maintain complex project configuration through code. PDK uses this framework, and vends several Projen projects. PDK is not a replacement or alternative to Projen, but rather builds on Projen to define opinionated projects which work synergistically with one another.
What's the difference between PDK and CDK?
CDK is a framework for defining AWS infrastructure as code. PDK vends several CDK constructs which can be used in traditional CDK projects, but are more powerful when used within the context of a PDK project. For example, the StaticWebsite
CDK construct vended by PDK can be used in any CDK project to deploy the infrastructure to host a static website on AWS, however when the Infrastructure and CloudscapeReactTsWebsite PDK projects are used, the StaticWebsite
CDK construct is automatically configured to deploy your Cloudscape website, and deploy the necessary runtime configuration to set up Cognito login for your website.
While many of the PDK projects generate CDK code, PDK is not considered an abstraction over CDK. You still work with CDK to define your AWS infrastructure, but you may use these generated CDK constructs to supplement your CDK code.
I want to change a “pre-defined” task (e.g.: add --verbose to a tsc compile task)
Use the reset
function:
myPackage.compileTask.reset("tsc --build --verbose");
Passing parameters between CDK stacks will cause Unresolved resource dependencies
error while trying to deploy
Links
- Cross stack values do not work with Source.data/jsonData [CDK github]
- Nested stack runtime-config.json properties [PDK github]
TLDR;
- Create SSM Parameters in the stack where you create e.g.: a
userPool
// in UserIdentityStack
this.userIdentity = new UserIdentity(this, "UserIdentity");
new StringParameter(this, "userPoolIdSsmParam", {
parameterName: ssmParamNames.userPoolId,
stringValue: this.userIdentity.userPool.userPoolId,
});
- Setup explicit dependencies between stacks/constructs
// in ApplicationStack
websiteStack.node.addDependency(userIdentityStack);
- Use already created SSM Parameters in the dependent stack
// in WebsiteStack
const userPoolIdParam = StringParameter.fromStringParameterName(this, "userPoolIdSsmParam", ssmParamNames.userPoolId);
const website = new StaticWebsite(this, "Website", {
websiteContentPath: ...,
runtimeOptions: {
jsonPayload: {
...,
userPoolId: userPoolIdParam.stringValue,
...,
}
}
})
How do I include js
files in my project?
Option #1 - via tsconfig
const myPackage = new TypeScriptProject({
// ...
tsconfig: {
compilerOptions: {
allowJs: true, // <--------
},
},
tsconfigDev: {
compilerOptions: {
allowJs: true, // <---------
},
},
});
myPackage.tsconfig?.addInclude("src/**/*.js");
// OR more specific path:
// myPackage.tsconfig?.addInclude("src/**/@lambda/**/*.js");
Option #2 - with rsync
(example)
this.compileTask.exec(
'rsync -a ./src/** ./lib --include="*/" --include="**/*.js" --exclude="*" --prune-empty-dirs'
);
I don’t want projen
to generate sample code and tests
const myPackage = new TypeScriptProject({
parent: this.monorepoProject,
outdir: "packages/my-package",
defaultReleaseBranch: this.defaultReleaseBranch,
name: "my-package",
sampleCode: false, // <-------- turn off sampleCode
});
I get react
-related duplicate identifier error
The error
myPackage: ../../../../node_modules/@types/react/index.d.ts(3131,14): error TS2300: Duplicate identifier 'LibraryManagedAttributes'.
myPackage: ../../../../node_modules/@types/react-dom/node_modules/@types/react/index.d.ts(3131,14): error TS2300: Duplicate identifier 'LibraryManagedAttributes'.
myPackage: 👾 Task "build » compile" failed when executing "tsc --build" (cwd: /Users/<user>/projects/myProject/packages/myPackage/generated/typescript)
Solution
react-dom
depends on @types/react@*
while react
may have another version in your project, meaning multiple versions are present.
// fix react version example
monorepoProject.package.addPackageResolutions("@types/react@^18.0.21");
Fine-tune typedoc
configuration inside packages
myProject.addFields({
typedoc: {
entryPoint: "src/index.ts",
readmeFile: "./README.md",
displayName: "My Project",
tsConfig: "./tsconfig.json",
},
});
Check the typedoc docs for setting up for monorepo: https://typedoc.org/guides/monorepo/
typedoc
fails while generating docs with Javascript heap out of memory error
Set max_old_space_size
in NODE_OPTIONS
:
myMonoRepo.addTask("doc:generate", {
exec: "NODE_OPTIONS=--max_old_space_size=16384 npx typedoc", // experiment with the value needed
});
Note: Make sure there is enough RAM in your code build environment if you automate this using
CodePipeline
.