diff --git a/packages/aws-cdk/lib/config.ts b/packages/aws-cdk/lib/config.ts index 0bfcdc657cf28..62714e334f66f 100644 --- a/packages/aws-cdk/lib/config.ts +++ b/packages/aws-cdk/lib/config.ts @@ -422,9 +422,11 @@ export class DynamicValue { } public static fromInline(f: () => any): DynamicResult { + const ARROW = '=>'; + const body = f.toString(); return { dynamicType: 'function', - dynamicValue: f.toString(), + dynamicValue: body.substring(body.indexOf(ARROW) + ARROW.length).trim(), }; } } diff --git a/packages/aws-cdk/package.json b/packages/aws-cdk/package.json index b6419bd8e3d4d..c60fb2eae4e73 100644 --- a/packages/aws-cdk/package.json +++ b/packages/aws-cdk/package.json @@ -7,7 +7,7 @@ }, "scripts": { "build": "cdk-build", - "yargs-gen": "yarn ts-node --preferTsExts scripts/yargs-gen.ts", + "yargs-gen": "ts-node --preferTsExts scripts/yargs-gen.ts", "watch": "cdk-watch", "lint": "cdk-lint", "pkglint": "pkglint -f", @@ -75,8 +75,8 @@ "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", "@types/jest": "^29.5.12", - "@types/node": "^18.18.14", "@types/mockery": "^1.4.33", + "@types/node": "^18.18.14", "@types/promptly": "^3.0.5", "@types/semver": "^7.5.8", "@types/sinon": "^9.0.11", @@ -97,6 +97,7 @@ "nock": "^13.5.5", "sinon": "^9.2.4", "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", "ts-mock-imports": "^1.3.16", "xml-js": "^1.6.11" }, @@ -128,12 +129,12 @@ "@jsii/check-node": "1.104.0", "@smithy/middleware-endpoint": "3.1.4", "@smithy/node-http-handler": "3.2.4", + "@smithy/property-provider": "3.1.10", "@smithy/shared-ini-file-loader": "3.1.8", "@smithy/types": "3.5.0", "@smithy/util-retry": "3.0.7", "@smithy/util-stream": "3.1.9", "@smithy/util-waiter": "3.1.6", - "@smithy/property-provider": "3.1.10", "archiver": "^5.3.2", "camelcase": "^6.3.0", "cdk-assets": "^3.0.0-rc.48", diff --git a/tools/@aws-cdk/pkglint/lib/rules.ts b/tools/@aws-cdk/pkglint/lib/rules.ts index b6a105ad7089e..bb78293efc82f 100644 --- a/tools/@aws-cdk/pkglint/lib/rules.ts +++ b/tools/@aws-cdk/pkglint/lib/rules.ts @@ -1370,7 +1370,7 @@ export class AllVersionsTheSame extends ValidationRule { private validateDep(pkg: PackageJson, depField: string, dep: string) { if (dep in this.ourPackages) { - expectJSON(this.name, pkg, depField + '.' + dep, this.ourPackages[dep]); + expectJSON(this.name, pkg, [depField, dep], this.ourPackages[dep]); return; } @@ -1380,7 +1380,7 @@ export class AllVersionsTheSame extends ValidationRule { const versions = this.usedDeps[dep]; versions.sort((a, b) => b.count - a.count); - expectJSON(this.name, pkg, depField + '.' + dep, versions[0].version); + expectJSON(this.name, pkg, [depField, dep], versions[0].version); } } diff --git a/tools/@aws-cdk/pkglint/lib/util.ts b/tools/@aws-cdk/pkglint/lib/util.ts index 0b34682b510de..439ce4fc05889 100644 --- a/tools/@aws-cdk/pkglint/lib/util.ts +++ b/tools/@aws-cdk/pkglint/lib/util.ts @@ -8,13 +8,13 @@ import { PackageJson, PKGLINT_IGNORES } from './packagejson'; export function expectJSON( ruleName: string, pkg: PackageJson, - jsonPath: string, + jsonPath: string | string[], expected: any, ignore?: RegExp, caseInsensitive: boolean = false, regexMatch: boolean = false, ) { - const parts = jsonPath.split('.'); + const parts = Array.isArray(jsonPath) ? jsonPath : jsonPath.split('.'); const actual = deepGet(pkg.json, parts); if (checkEquality()) { pkg.report({ diff --git a/tools/@aws-cdk/yargs-gen/lib/yargs-gen.ts b/tools/@aws-cdk/yargs-gen/lib/yargs-gen.ts index ac6b82f7c5c9b..0bfc5af85412e 100644 --- a/tools/@aws-cdk/yargs-gen/lib/yargs-gen.ts +++ b/tools/@aws-cdk/yargs-gen/lib/yargs-gen.ts @@ -3,6 +3,11 @@ import { EsLintRules } from '@cdklabs/typewriter/lib/eslint-rules'; import * as prettier from 'prettier'; import { CliConfig, CliOption, YargsOption } from './yargs-types'; +// to import lodash.clonedeep properly, we would need to set esModuleInterop: true +// however that setting does not work in the CLI, so we fudge it. +// eslint-disable-next-line @typescript-eslint/no-require-imports +const cloneDeep = require('lodash.clonedeep'); + export async function renderYargs(config: CliConfig): Promise<string> { const scope = new Module('aws-cdk'); @@ -106,7 +111,7 @@ function makeOptions(prefix: Expression, options: { [optionName: string]: CliOpt let optionsExpr = prefix; for (const option of Object.keys(options)) { const theOption: CliOption = options[option]; - const optionProps: YargsOption = structuredClone(theOption); + const optionProps: YargsOption = cloneDeep(theOption); const optionArgs: { [key: string]: Expression } = {}; // Array defaults @@ -121,9 +126,7 @@ function makeOptions(prefix: Expression, options: { [optionName: string]: CliOpt optionArgs[optionProp] = code.expr.ident(optionValue.dynamicValue); } else if (optionValue && optionValue.dynamicType === 'function') { const inlineFunction: string = optionValue.dynamicValue; - const NUMBER_OF_SPACES_BETWEEN_ARROW_AND_CODE = 3; - // this only works with arrow functions, like () => - optionArgs[optionProp] = code.expr.directCode(inlineFunction.substring(inlineFunction.indexOf('=>') + NUMBER_OF_SPACES_BETWEEN_ARROW_AND_CODE)); + optionArgs[optionProp] = code.expr.directCode(inlineFunction); } else { optionArgs[optionProp] = lit(optionValue); } diff --git a/tools/@aws-cdk/yargs-gen/package.json b/tools/@aws-cdk/yargs-gen/package.json index 7a794db607fa3..31aec381b0c3a 100644 --- a/tools/@aws-cdk/yargs-gen/package.json +++ b/tools/@aws-cdk/yargs-gen/package.json @@ -29,12 +29,14 @@ "license": "Apache-2.0", "dependencies": { "@cdklabs/typewriter": "^0.0.4", + "lodash.clonedeep": "^4.5.0", "prettier": "^2.8.8" }, "devDependencies": { "@aws-cdk/cdk-build-tools": "0.0.0", "@aws-cdk/pkglint": "0.0.0", "@types/jest": "^29.5.12", + "@types/lodash.clonedeep": "^4.5.0", "@types/node": "^18", "jest": "^29.7.0" }, diff --git a/yarn.lock b/yarn.lock index f45e00f0bbfaa..10b4bc41a6463 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7927,6 +7927,18 @@ resolved "https://registry.npmjs.org/@types/license-checker/-/license-checker-25.0.6.tgz#c346285ee7e42bac58a4922059453f50a5d4175d" integrity sha512-ju/75+YPkNE5vX1iPer+qtI1eI/LqJVYZgOsmSHI1iiEM1bQL5Gh1lEvyjR9T7ZXVE1FwJa2doWJEEmPNwbZkw== +"@types/lodash.clonedeep@^4.5.0": + version "4.5.9" + resolved "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz#ea48276c7cc18d080e00bb56cf965bcceb3f0fc1" + integrity sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.17.13" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" + integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== + "@types/lodash@^4.17.12": version "4.17.12" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.12.tgz#25d71312bf66512105d71e55d42e22c36bcfc689" @@ -14259,6 +14271,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"