jsii 5.9.44 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +111 -285
  2. package/lib/assembler.js +95 -46
  3. package/lib/assembler.js.map +1 -1
  4. package/lib/case.js +13 -10
  5. package/lib/case.js.map +1 -1
  6. package/lib/common/find-utils.js +35 -2
  7. package/lib/common/find-utils.js.map +1 -1
  8. package/lib/common/symbol-id.js +39 -7
  9. package/lib/common/symbol-id.js.map +1 -1
  10. package/lib/compiler.js +51 -8
  11. package/lib/compiler.js.map +1 -1
  12. package/lib/directives.js +48 -16
  13. package/lib/directives.js.map +1 -1
  14. package/lib/docs.js +36 -4
  15. package/lib/docs.js.map +1 -1
  16. package/lib/helpers.js +38 -4
  17. package/lib/helpers.js.map +1 -1
  18. package/lib/jsii-diagnostic.js +524 -497
  19. package/lib/jsii-diagnostic.js.map +1 -1
  20. package/lib/literate.js +35 -2
  21. package/lib/literate.js.map +1 -1
  22. package/lib/main.js +100 -13
  23. package/lib/main.js.map +1 -1
  24. package/lib/project-info.d.ts +1 -1
  25. package/lib/project-info.js +41 -11
  26. package/lib/project-info.js.map +1 -1
  27. package/lib/support.js +7 -4
  28. package/lib/support.js.map +1 -1
  29. package/lib/transforms/deprecated-remover.js +65 -23
  30. package/lib/transforms/deprecated-remover.js.map +1 -1
  31. package/lib/transforms/deprecation-warnings.js +50 -10
  32. package/lib/transforms/deprecation-warnings.js.map +1 -1
  33. package/lib/transforms/runtime-info.js +36 -2
  34. package/lib/transforms/runtime-info.js.map +1 -1
  35. package/lib/tsconfig/compiler-options.js +40 -5
  36. package/lib/tsconfig/compiler-options.js.map +1 -1
  37. package/lib/tsconfig/rule-set-format.d.ts +34 -0
  38. package/lib/tsconfig/rule-set-format.js +101 -0
  39. package/lib/tsconfig/rule-set-format.js.map +1 -0
  40. package/lib/tsconfig/rulesets/configurable-options.js +10 -1
  41. package/lib/tsconfig/rulesets/configurable-options.js.map +1 -1
  42. package/lib/tsconfig/rulesets/deprecated-options.js +16 -1
  43. package/lib/tsconfig/rulesets/deprecated-options.js.map +1 -1
  44. package/lib/tsconfig/rulesets/generated.public.js +7 -2
  45. package/lib/tsconfig/rulesets/generated.public.js.map +1 -1
  46. package/lib/tsconfig/rulesets/jsii-configured-options.js +0 -1
  47. package/lib/tsconfig/rulesets/jsii-configured-options.js.map +1 -1
  48. package/lib/tsconfig/rulesets/minimal.public.js +4 -1
  49. package/lib/tsconfig/rulesets/minimal.public.js.map +1 -1
  50. package/lib/tsconfig/rulesets/strict.public.js +12 -9
  51. package/lib/tsconfig/rulesets/strict.public.js.map +1 -1
  52. package/lib/tsconfig/tsconfig-validator.d.ts +39 -0
  53. package/lib/tsconfig/tsconfig-validator.js +124 -3
  54. package/lib/tsconfig/tsconfig-validator.js.map +1 -1
  55. package/lib/tsconfig/validator.d.ts +39 -0
  56. package/lib/tsconfig/validator.js +65 -16
  57. package/lib/tsconfig/validator.js.map +1 -1
  58. package/lib/type-analysis.js +39 -3
  59. package/lib/type-analysis.js.map +1 -1
  60. package/lib/type-reference.js +34 -1
  61. package/lib/type-reference.js.map +1 -1
  62. package/lib/type-tracker.js +35 -4
  63. package/lib/type-tracker.js.map +1 -1
  64. package/lib/type-visitor.js +34 -1
  65. package/lib/type-visitor.js.map +1 -1
  66. package/lib/utils.js +37 -2
  67. package/lib/utils.js.map +1 -1
  68. package/lib/validator.js +49 -11
  69. package/lib/validator.js.map +1 -1
  70. package/lib/version.d.ts +3 -3
  71. package/lib/version.js +2 -2
  72. package/lib/version.js.map +1 -1
  73. package/lib/warnings.js +34 -1
  74. package/lib/warnings.js.map +1 -1
  75. package/package.json +5 -7
  76. package/releases.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"deprecation-warnings.js","sourceRoot":"","sources":["../../src/transforms/deprecation-warnings.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as spec from '@jsii/spec';\nimport { Assembly } from '@jsii/spec';\nimport * as ts from 'typescript';\n\nimport { symbolIdentifier } from '../common/symbol-id';\nimport { ProjectInfo } from '../project-info';\nimport { TypeTracker } from '../type-tracker';\n\nexport const WARNINGSCODE_FILE_NAME = '.warnings.jsii.js';\nconst WARNING_FUNCTION_NAME = 'print';\nconst PARAMETER_NAME = 'p';\nconst FOR_LOOP_ITEM_NAME = 'o';\nconst NAMESPACE = 'jsiiDeprecationWarnings';\nconst VISITED_OBJECTS_SET_NAME = 'visitedObjects';\nconst DEPRECATION_ERROR = 'DeprecationError';\nconst GET_PROPERTY_DESCRIPTOR = 'getPropertyDescriptor';\nconst VALIDATORS_OBJ = 'VALIDATORS';\n\nexport class DeprecationWarningsInjector {\n private transformers: ts.CustomTransformers = {\n before: [],\n };\n\n private shouldRenderValidatorCache: Record<string, boolean> = {};\n private validatorCacheSeenSet = new Set<string>();\n\n public constructor(private readonly typeChecker: ts.TypeChecker, private readonly typeTracker: TypeTracker) {}\n\n public process(assembly: Assembly, projectInfo: ProjectInfo) {\n const projectRoot = projectInfo.projectRoot;\n const validationFunctions: ts.ObjectLiteralElementLike[] = [];\n\n const types = assembly.types ?? {};\n for (const type of Object.values(types)) {\n const fnStatements = this.generateTypeValidation(type, assembly, projectInfo, types);\n if (fnStatements.length === 0) {\n continue;\n }\n\n const paramValue = ts.factory.createParameterDeclaration(undefined, undefined, PARAMETER_NAME);\n const functionName = fnName(type.fqn);\n const functionExpr = ts.factory.createFunctionExpression(\n undefined,\n undefined,\n ts.factory.createIdentifier(functionName),\n [],\n [paramValue],\n undefined,\n createFunctionBlock(fnStatements),\n );\n validationFunctions.push(ts.factory.createPropertyAssignment(functionName, functionExpr));\n }\n\n const fileStatements: ts.Statement[] = [];\n fileStatements.push(\n ts.factory.createVariableStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n VALIDATORS_OBJ,\n undefined,\n undefined,\n ts.factory.createObjectLiteralExpression(validationFunctions),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n );\n\n this.transformers = {\n before: [\n (context) => {\n const transformer = new Transformer(\n this.typeChecker,\n context,\n projectRoot,\n this.buildTypeIndex(assembly),\n assembly,\n );\n return transformer.transform.bind(transformer);\n },\n ],\n };\n\n generateWarningsFile(projectRoot, fileStatements);\n }\n\n public get customTransformers(): ts.CustomTransformers {\n return this.transformers;\n }\n\n private buildTypeIndex(assembly: Assembly): Map<string, spec.Type> {\n const result = new Map<string, spec.Type>();\n\n for (const type of Object.values(assembly.types ?? {})) {\n const symbolId = type.symbolId;\n if (symbolId) {\n result.set(symbolId, type);\n }\n }\n\n return result;\n }\n\n /**\n * Whether the validator for the given type should be rendered\n *\n * A validator should be rendered if:\n *\n * - It contains any deprecated members (base case).\n * - It references any other types whose validators should be rendered.\n * - It inherits from other types whose validators should be rendered.\n * - It references types that reference this type (recursive types).\n * - It references types from another assembly.\n *\n * For the last one we technically return `true`, indicating that a validator\n * *should* be rendered, but when we get to rendering no statements are\n * actually produced and the validator function is never rendered. This was\n * pre-existing behavior that I didn't change because introducing calls into\n * other assemblies out of the blue introduces risk.\n */\n private shouldRenderValidator(type: spec.Type, assembly: Assembly): boolean {\n if (this.shouldRenderValidatorCache[type.fqn] !== undefined) {\n return this.shouldRenderValidatorCache[type.fqn];\n }\n\n if (this.validatorCacheSeenSet.has(type.fqn)) {\n // To be safe we need to say this is true.\n return true;\n }\n if (!type.fqn.startsWith(`${assembly.name}.`)) {\n // Foreign type, always check\n return true;\n }\n this.validatorCacheSeenSet.add(type.fqn);\n\n this.shouldRenderValidatorCache[type.fqn] = calculate.call(this);\n this.validatorCacheSeenSet.delete(type.fqn);\n\n return this.shouldRenderValidatorCache[type.fqn];\n\n function calculate(this: DeprecationWarningsInjector): boolean {\n if (spec.isDeprecated(type)) {\n return true;\n }\n if (spec.isEnumType(type)) {\n return (type.members ?? []).some(spec.isDeprecated);\n }\n if (spec.isInterfaceType(type) && type.datatype) {\n for (const prop of type.properties ?? []) {\n if (spec.isDeprecated(prop)) {\n return true;\n }\n\n const typesToInspect = spec.isCollectionTypeReference(prop.type)\n ? [prop.type.collection.elementtype]\n : spec.isUnionTypeReference(prop.type)\n ? prop.type.union.types\n : [prop.type];\n\n for (const typeToInspect of typesToInspect) {\n if (!spec.isNamedTypeReference(typeToInspect)) {\n continue;\n }\n\n // Is from a different assembly?\n const typeObj = findType2(typeToInspect.fqn, assembly);\n if (typeObj === 'other-assembly') {\n return true;\n }\n if (this.shouldRenderValidator(typeObj, assembly)) {\n return true;\n }\n }\n }\n\n for (const interfaceName of type.interfaces ?? []) {\n const typeObj = findType2(interfaceName, assembly);\n if (typeObj === 'other-assembly') {\n return true;\n }\n if (this.shouldRenderValidator(typeObj, assembly)) {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n private generateTypeValidation(\n type: spec.Type,\n assembly: Assembly,\n projectInfo: ProjectInfo,\n types: Record<string, spec.Type>,\n ): ts.Statement[] {\n if (!this.shouldRenderValidator(type, assembly)) {\n return [];\n }\n\n const statements: ts.Statement[] = [];\n let isEmpty = true;\n\n // This will add the parameter to the set of visited objects, to prevent infinite recursion\n statements.push(\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(VISITED_OBJECTS_SET_NAME), 'add'),\n undefined,\n [ts.factory.createIdentifier(PARAMETER_NAME)],\n ),\n ),\n );\n\n const tryStatements = [];\n if (spec.isDeprecated(type) && spec.isEnumType(type)) {\n // The type is deprecated\n tryStatements.push(createWarningFunctionCall(type.fqn, type.docs?.deprecated));\n isEmpty = false;\n }\n\n if (spec.isEnumType(type) && type.locationInModule?.filename) {\n // Check for deprecated enum members\n //\n // We need to compare to the value of the deprecated enum. We can do that in one of 2 ways:\n //\n // - Compare against `require('./actual-file').EnumType.SOME_ENUM_MEMBER`\n // - Look up the enum member value and compare against `'some-enum-member'`.\n //\n // The first one introduces a circular dependency between this file and `actual-file.js`, so we\n // will go with the second.\n //\n // One complication: two enum members can have the same value (shouldn't, but can!) where\n // one symbolic name is deprecated but the other isn't. In that case we don't treat it as deprecated.\n const memDecls = this.typeTracker.getEnumMembers(type.fqn);\n\n const nonDeprecatedValues = new Set(\n (type.members ?? [])\n .filter((m) => !spec.isDeprecated(m))\n .map((m) => this.typeChecker.getConstantValue(memDecls[m.name])!),\n );\n const deprecatedMembers = (type.members ?? []).filter(spec.isDeprecated);\n\n for (const member of deprecatedMembers) {\n const constantValue = this.typeChecker.getConstantValue(memDecls[member.name])!;\n if (nonDeprecatedValues.has(constantValue)) {\n // Collission with non-deprecated enum member\n continue;\n }\n\n const condition = ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(PARAMETER_NAME),\n ts.SyntaxKind.EqualsEqualsEqualsToken,\n typeof constantValue === 'string'\n ? ts.factory.createStringLiteral(constantValue)\n : ts.factory.createNumericLiteral(constantValue),\n );\n tryStatements.push(createWarningFunctionCall(`${type.fqn}#${member.name}`, member.docs?.deprecated, condition));\n isEmpty = false;\n }\n } else if (spec.isInterfaceType(type) && type.datatype) {\n const { statementsByProp, excludedProps } = this.processInterfaceType(\n type,\n types,\n assembly,\n projectInfo,\n undefined,\n undefined,\n );\n\n for (const [name, statement] of statementsByProp.entries()) {\n if (!excludedProps.has(name)) {\n tryStatements.push(statement);\n isEmpty = false;\n }\n }\n }\n\n statements.push(\n ts.factory.createTryStatement(\n ts.factory.createBlock(tryStatements),\n undefined,\n ts.factory.createBlock([\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(VISITED_OBJECTS_SET_NAME),\n 'delete',\n ),\n undefined,\n [ts.factory.createIdentifier(PARAMETER_NAME)],\n ),\n ),\n ]),\n ),\n );\n\n return isEmpty ? [] : statements;\n }\n\n private processInterfaceType(\n type: spec.InterfaceType,\n types: { [p: string]: spec.Type },\n assembly: Assembly,\n projectInfo: ProjectInfo,\n statementsByProp: Map<string, ts.Statement> = new Map<string, ts.Statement>(),\n excludedProps: Set<string> = new Set<string>(),\n ) {\n for (const prop of Object.values(type.properties ?? {})) {\n const fqn = `${type.fqn}#${prop.name}`;\n if (spec.isDeprecated(prop) || spec.isDeprecated(type)) {\n // If the property individually is deprecated, or the entire type is deprecated\n const deprecatedDocs = prop.docs?.deprecated ?? type.docs?.deprecated;\n const statement = createWarningFunctionCall(\n fqn,\n deprecatedDocs,\n ts.factory.createBinaryExpression(\n ts.factory.createStringLiteral(prop.name),\n ts.SyntaxKind.InKeyword,\n ts.factory.createIdentifier(PARAMETER_NAME),\n ),\n undefined,\n );\n statementsByProp.set(prop.name, statement);\n } else {\n /* If a prop is not deprecated, we don't want to generate a warning for it,\n even if another property with the same name is deprecated in another\n super-interface. */\n excludedProps.add(prop.name);\n }\n\n if (spec.isNamedTypeReference(prop.type) && Object.keys(types).includes(prop.type.fqn)) {\n if (this.shouldRenderValidator(types[prop.type.fqn], assembly)) {\n const functionName = importedFunctionName(prop.type.fqn, assembly, projectInfo);\n if (functionName) {\n const statement = createTypeHandlerCall(functionName, `${PARAMETER_NAME}.${prop.name}`);\n statementsByProp.set(`${prop.name}_`, statement);\n }\n }\n } else if (\n spec.isCollectionTypeReference(prop.type) &&\n spec.isNamedTypeReference(prop.type.collection.elementtype)\n ) {\n const functionName = importedFunctionName(prop.type.collection.elementtype.fqn, assembly, projectInfo);\n if (functionName) {\n const statement = createTypeHandlerCall(\n functionName,\n `${PARAMETER_NAME}.${prop.name}`,\n prop.type.collection.kind,\n );\n statementsByProp.set(`${prop.name}_`, statement);\n }\n } else if (\n spec.isUnionTypeReference(prop.type) &&\n spec.isNamedTypeReference(prop.type.union.types[0]) &&\n Object.keys(types).includes(prop.type.union.types[0].fqn)\n ) {\n const functionName = importedFunctionName(prop.type.union.types[0].fqn, assembly, projectInfo);\n if (functionName) {\n const statement = createTypeHandlerCall(functionName, `${PARAMETER_NAME}.${prop.name}`);\n statementsByProp.set(`${prop.name}_`, statement);\n }\n }\n }\n\n // We also generate calls to all the supertypes\n for (const interfaceName of type.interfaces ?? []) {\n const assemblies = projectInfo.dependencyClosure.concat(assembly);\n const superType = findType(interfaceName, assemblies);\n if (superType.type) {\n this.processInterfaceType(\n superType.type as spec.InterfaceType,\n types,\n assembly,\n projectInfo,\n statementsByProp,\n excludedProps,\n );\n }\n }\n return { statementsByProp, excludedProps };\n }\n}\n\nfunction fnName(fqn: string): string {\n return fqn.replace(/[^\\w\\d]/g, '_');\n}\n\nfunction createFunctionBlock(statements: ts.Statement[]): ts.Block {\n if (statements.length > 0) {\n const validation = ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(PARAMETER_NAME),\n ts.SyntaxKind.EqualsEqualsToken,\n ts.factory.createNull(),\n ),\n ts.factory.createReturnStatement(),\n );\n return ts.factory.createBlock([validation, ...statements], true);\n }\n return ts.factory.createBlock([], true);\n}\n\nfunction createWarningFunctionCall(\n fqn: string,\n message = '',\n condition?: ts.Expression,\n includeNamespace = false,\n): ts.Statement {\n const functionName = includeNamespace ? `${NAMESPACE}.${WARNING_FUNCTION_NAME}` : WARNING_FUNCTION_NAME;\n\n const mainStatement = ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(ts.factory.createIdentifier(functionName), undefined, [\n ts.factory.createStringLiteral(fqn),\n ts.factory.createStringLiteral(message),\n ]),\n );\n\n return condition ? ts.factory.createIfStatement(condition, mainStatement) : mainStatement;\n}\n\nfunction generateWarningsFile(projectRoot: string, validatorStatements: ts.Statement[]) {\n const functionText = `function ${WARNING_FUNCTION_NAME}(name, deprecationMessage) {\n const deprecated = process.env.JSII_DEPRECATED;\n const deprecationMode = ['warn', 'fail', 'quiet'].includes(deprecated) ? deprecated : 'warn';\n const message = \\`\\${name} is deprecated.\\\\n \\${deprecationMessage.trim()}\\\\n This API will be removed in the next major release.\\`;\n switch (deprecationMode) {\n case \"fail\":\n throw new ${DEPRECATION_ERROR}(message);\n case \"warn\":\n console.warn(\"[WARNING]\", message);\n break;\n }\n}\n\nfunction ${GET_PROPERTY_DESCRIPTOR}(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor) {\n return descriptor;\n }\n const proto = Object.getPrototypeOf(obj);\n const prototypeDescriptor = proto && getPropertyDescriptor(proto, prop);\n if (prototypeDescriptor) {\n return prototypeDescriptor;\n }\n return {};\n}\n\nconst ${VISITED_OBJECTS_SET_NAME} = new Set();\n\nclass ${DEPRECATION_ERROR} extends Error {\n constructor(...args) {\n super(...args);\n Object.defineProperty(this, 'name', {\n configurable: false,\n enumerable: true,\n value: '${DEPRECATION_ERROR}',\n writable: false,\n });\n }\n}\n\nfunction nop() {\n}\n\nmodule.exports = new Proxy({}, {\n get(target, prop, receiver) {\n if (prop === '${WARNING_FUNCTION_NAME}') return ${WARNING_FUNCTION_NAME};\n if (prop === '${GET_PROPERTY_DESCRIPTOR}') return ${GET_PROPERTY_DESCRIPTOR};\n if (prop === '${DEPRECATION_ERROR}') return ${DEPRECATION_ERROR};\n\n return ${VALIDATORS_OBJ}[prop] ?? nop;\n },\n});\n`;\n\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n const resultFile = ts.createSourceFile(\n path.join(projectRoot, WARNINGSCODE_FILE_NAME),\n functionText,\n ts.ScriptTarget.Latest,\n false,\n ts.ScriptKind.JS,\n );\n\n const declarations = validatorStatements.map((st) => printer.printNode(ts.EmitHint.Unspecified, st, resultFile));\n\n const content = declarations.concat(printer.printFile(resultFile)).join('\\n');\n\n fs.writeFileSync(path.join(projectRoot, WARNINGSCODE_FILE_NAME), content);\n}\n\nclass Transformer {\n private warningCallsWereInjected = false;\n\n public constructor(\n private readonly typeChecker: ts.TypeChecker,\n private readonly context: ts.TransformationContext,\n private readonly projectRoot: string,\n private readonly typeIndex: Map<string, spec.Type>,\n private readonly assembly: Assembly,\n ) {}\n\n public transform<T extends ts.Node>(node: T): T {\n this.warningCallsWereInjected = false;\n\n const result = this.visitEachChild(node);\n\n if (ts.isSourceFile(result) && this.warningCallsWereInjected) {\n const importDir = path.relative(path.dirname(result.fileName), this.projectRoot);\n const importPath = importDir.startsWith('..')\n ? unixPath(path.join(importDir, WARNINGSCODE_FILE_NAME))\n : `./${WARNINGSCODE_FILE_NAME}`;\n\n return ts.factory.updateSourceFile(result, [\n createRequireStatement(NAMESPACE, importPath),\n ...result.statements,\n ]) as any;\n }\n return result;\n }\n\n private visitEachChild<T extends ts.Node>(node: T): T {\n return ts.visitEachChild(node, this.visitor.bind(this), this.context);\n }\n\n private visitor<T extends ts.Node>(node: T): ts.VisitResult<T> {\n if (ts.isMethodDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateMethodDeclaration(\n node,\n node.modifiers,\n node.asteriskToken,\n node.name,\n node.questionToken,\n node.typeParameters,\n node.parameters,\n node.type,\n ts.factory.updateBlock(node.body, [\n ...wrapWithRethrow(\n statements,\n ts.factory.createPropertyAccessExpression(ts.factory.createThis(), node.name.getText(node.getSourceFile())),\n ),\n ...node.body.statements,\n ]),\n ) as any;\n } else if (ts.isGetAccessorDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateGetAccessorDeclaration(\n node,\n node.modifiers,\n node.name,\n node.parameters,\n node.type,\n ts.factory.updateBlock(node.body, [\n ...wrapWithRethrow(\n statements,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(NAMESPACE),\n GET_PROPERTY_DESCRIPTOR,\n ),\n undefined,\n [ts.factory.createThis(), ts.factory.createStringLiteral(node.name.getText(node.getSourceFile()))],\n ),\n 'get',\n ),\n ),\n ...node.body.statements,\n ]),\n ) as any;\n } else if (ts.isSetAccessorDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateSetAccessorDeclaration(\n node,\n node.modifiers,\n node.name,\n node.parameters,\n ts.factory.updateBlock(node.body, [\n ...wrapWithRethrow(\n statements,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(NAMESPACE),\n GET_PROPERTY_DESCRIPTOR,\n ),\n undefined,\n [ts.factory.createThis(), ts.factory.createStringLiteral(node.name.getText(node.getSourceFile()))],\n ),\n 'set',\n ),\n ),\n ...node.body.statements,\n ]),\n ) as any;\n } else if (ts.isConstructorDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateConstructorDeclaration(\n node,\n node.modifiers,\n node.parameters,\n ts.factory.updateBlock(node.body, insertStatements(node.body, wrapWithRethrow(statements, node.parent.name!))),\n ) as any;\n }\n\n return this.visitEachChild(node);\n }\n\n /**\n * @param getOrSet for property accessors, determines which of the getter or\n * setter should be used to get the caller function value.\n */\n private getStatementsForDeclaration(\n node: ts.MethodDeclaration | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.ConstructorDeclaration,\n ): ts.Statement[] {\n const klass = node.parent;\n const classSymbolId = symbolIdentifier(this.typeChecker, this.typeChecker.getTypeAtLocation(klass).symbol);\n if (classSymbolId && this.typeIndex.has(classSymbolId)) {\n const classType = this.typeIndex.get(classSymbolId)! as spec.ClassType;\n\n if (ts.isConstructorDeclaration(node)) {\n const initializer = classType?.initializer;\n if (initializer) {\n return this.getStatements(classType, initializer);\n }\n }\n\n const methods = classType?.methods ?? [];\n const method = methods.find((m) => m.name === node.name?.getText());\n if (method) {\n return this.getStatements(classType, method);\n }\n\n const properties = classType?.properties ?? [];\n const property = properties.find((p) => p.name === node.name?.getText());\n if (property) {\n return createWarningStatementForElement(property, classType);\n }\n }\n return [];\n }\n\n private getStatements(classType: spec.ClassType, method: spec.Method | spec.Initializer) {\n const statements = createWarningStatementForElement(method, classType);\n for (const parameter of Object.values(method.parameters ?? {})) {\n const parameterType =\n this.assembly.types && spec.isNamedTypeReference(parameter.type)\n ? this.assembly.types[parameter.type.fqn]\n : undefined;\n\n if (parameterType) {\n const functionName = `${NAMESPACE}.${fnName(parameterType.fqn)}`;\n statements.push(\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(ts.factory.createIdentifier(functionName), undefined, [\n ts.factory.createIdentifier(parameter.name),\n ]),\n ),\n );\n }\n }\n\n return statements;\n }\n}\n\nfunction findType2(fqn: string, assembly: Assembly): spec.Type | 'other-assembly' {\n // Is from a different assembly?\n if (!fqn.startsWith(`${assembly.name}.`)) {\n return 'other-assembly';\n }\n\n const type = (assembly.types ?? {})[fqn];\n if (!type) {\n throw new Error(`Could not find type in same assembly: ${fqn}`);\n }\n return type;\n}\n\nfunction createWarningStatementForElement(\n element: spec.Callable | spec.Property,\n classType: spec.ClassType,\n): ts.Statement[] {\n if (spec.isDeprecated(element)) {\n const elementName = (element as spec.Method | spec.Property).name;\n const fqn = elementName ? `${classType.fqn}#${elementName}` : classType.fqn;\n const message = element.docs?.deprecated ?? classType.docs?.deprecated;\n return [createWarningFunctionCall(fqn, message, undefined, true)];\n }\n return [];\n}\n\n/**\n * Inserts a list of statements in the correct position inside a block of statements.\n * If there is a `super` call, It inserts the statements just after it. Otherwise,\n * insert the statements right at the beginning of the block.\n */\nfunction insertStatements(block: ts.Block, newStatements: ts.Statement[]) {\n function splicePoint(statement: ts.Statement | undefined) {\n if (statement == null) {\n return 0;\n }\n let isSuper = false;\n statement.forEachChild((node) => {\n if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.SuperKeyword) {\n isSuper = true;\n }\n });\n return isSuper ? 1 : 0;\n }\n\n const result = [...block.statements];\n result.splice(splicePoint(block.statements[0]), 0, ...newStatements);\n return ts.factory.createNodeArray(result);\n}\n\nfunction createRequireStatement(name: string, importPath: string): ts.Statement {\n return ts.factory.createVariableStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n name,\n undefined,\n undefined,\n ts.factory.createCallExpression(ts.factory.createIdentifier('require'), undefined, [\n ts.factory.createStringLiteral(importPath),\n ]),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n );\n}\n\n/**\n * Returns a ready-to-used function name (including a `require`, if necessary)\n */\nfunction importedFunctionName(typeName: string, assembly: Assembly, projectInfo: ProjectInfo) {\n const assemblies = projectInfo.dependencyClosure.concat(assembly);\n const { type, moduleName } = findType(typeName, assemblies);\n if (type) {\n return moduleName !== assembly.name\n ? `require(\"${moduleName}/${WARNINGSCODE_FILE_NAME}\").${fnName(type.fqn)}`\n : `module.exports.${fnName(type.fqn)}`;\n }\n return undefined;\n}\n\n/**\n * Find the type and module name in an array of assemblies\n * matching a given type name\n */\nfunction findType(typeName: string, assemblies: Assembly[]) {\n for (const asm of assemblies) {\n if (asm.metadata?.jsii?.compiledWithDeprecationWarnings) {\n const types = asm.types ?? {};\n for (const name of Object.keys(types)) {\n if (typeName === name) {\n return { type: types[name], moduleName: asm.name };\n }\n }\n }\n }\n return {};\n}\n\nfunction createTypeHandlerCall(\n functionName: string,\n parameter: string,\n collectionKind?: spec.CollectionKind,\n): ts.Statement {\n switch (collectionKind) {\n case spec.CollectionKind.Array:\n return ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(parameter),\n ts.SyntaxKind.ExclamationEqualsToken,\n ts.factory.createNull(),\n ),\n ts.factory.createForOfStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [ts.factory.createVariableDeclaration(FOR_LOOP_ITEM_NAME)],\n ts.NodeFlags.Const,\n ),\n ts.factory.createIdentifier(parameter),\n createTypeHandlerCall(functionName, FOR_LOOP_ITEM_NAME),\n ),\n );\n case spec.CollectionKind.Map:\n return ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(parameter),\n ts.SyntaxKind.ExclamationEqualsToken,\n ts.factory.createNull(),\n ),\n ts.factory.createForOfStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [ts.factory.createVariableDeclaration(FOR_LOOP_ITEM_NAME)],\n ts.NodeFlags.Const,\n ),\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('Object'), 'values'),\n undefined,\n [ts.factory.createIdentifier(parameter)],\n ),\n createTypeHandlerCall(functionName, FOR_LOOP_ITEM_NAME),\n ),\n );\n case undefined:\n return ts.factory.createIfStatement(\n ts.factory.createPrefixUnaryExpression(\n ts.SyntaxKind.ExclamationToken,\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(VISITED_OBJECTS_SET_NAME),\n ts.factory.createIdentifier('has'),\n ),\n undefined,\n [ts.factory.createIdentifier(parameter)],\n ),\n ),\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(ts.factory.createIdentifier(functionName), undefined, [\n ts.factory.createIdentifier(parameter),\n ]),\n ),\n );\n }\n}\n\n// We try-then-rethrow exceptions to avoid runtimes displaying an uncanny wall of text if the place\n// where the error was thrown is webpacked. For example, jest somehow manages to capture the throw\n// location and renders the source line (which may be the whole file) when bundled.\nfunction wrapWithRethrow(statements: ts.Statement[], caller: ts.Expression): ts.Statement[] {\n if (statements.length === 0) {\n return statements;\n }\n return [\n ts.factory.createTryStatement(\n ts.factory.createBlock(statements),\n ts.factory.createCatchClause(\n ts.factory.createVariableDeclaration('error'),\n ts.factory.createBlock([\n // If this is a DeprecationError, trim its stack trace to surface level before re-throwing,\n // so we don't carry out possibly confusing frames from injected code. That can be toggled\n // off by setting JSII_DEBUG=1, so we can also diagnose in-injected code faults.\n ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createBinaryExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('process'), 'env'),\n 'JSII_DEBUG',\n ),\n ts.SyntaxKind.ExclamationEqualsEqualsToken,\n ts.factory.createStringLiteral('1'),\n ),\n ts.SyntaxKind.AmpersandAmpersandToken,\n ts.factory.createBinaryExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('error'), 'name'),\n ts.SyntaxKind.EqualsEqualsEqualsToken,\n ts.factory.createStringLiteral(DEPRECATION_ERROR),\n ),\n ),\n ts.factory.createBlock([\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('Error'), 'captureStackTrace'),\n undefined,\n [ts.factory.createIdentifier('error'), caller],\n ),\n ),\n ]),\n ),\n ts.factory.createThrowStatement(ts.factory.createIdentifier('error')),\n ]),\n ),\n undefined,\n ),\n ];\n}\n\n/**\n * Force a path to be UNIXy (use `/` as a separator)\n *\n * `path.join()` etc. will use the system-dependent path separator (either `/` or `\\`\n * depending on your platform).\n *\n * However, if we actually emit the path-dependent separator to the `.js` files, then\n * files compiled with jsii on Windows cannot be used on any other platform. That seems\n * like an unnecessary restriction, especially since a `/` will work fine on Windows,\n * so make sure to always emit `/`.\n *\n * TSC itself always strictly emits `/` (or at least, emits the same what you put in).\n */\nfunction unixPath(filePath: string) {\n if (path.sep === '\\\\') {\n return filePath.replace(/\\\\/g, '/');\n }\n return filePath;\n}\n"]}
1
+ {"version":3,"file":"deprecation-warnings.js","sourceRoot":"","sources":["../../src/transforms/deprecation-warnings.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as spec from '@jsii/spec';\nimport { Assembly } from '@jsii/spec';\nimport * as ts from 'typescript';\n\nimport { symbolIdentifier } from '../common/symbol-id';\nimport { ProjectInfo } from '../project-info';\nimport { TypeTracker } from '../type-tracker';\n\nexport const WARNINGSCODE_FILE_NAME = '.warnings.jsii.js';\nconst WARNING_FUNCTION_NAME = 'print';\nconst PARAMETER_NAME = 'p';\nconst FOR_LOOP_ITEM_NAME = 'o';\nconst NAMESPACE = 'jsiiDeprecationWarnings';\nconst VISITED_OBJECTS_SET_NAME = 'visitedObjects';\nconst DEPRECATION_ERROR = 'DeprecationError';\nconst GET_PROPERTY_DESCRIPTOR = 'getPropertyDescriptor';\nconst VALIDATORS_OBJ = 'VALIDATORS';\n\nexport class DeprecationWarningsInjector {\n private transformers: ts.CustomTransformers = {\n before: [],\n };\n\n private shouldRenderValidatorCache: Record<string, boolean> = {};\n private validatorCacheSeenSet = new Set<string>();\n\n public constructor(private readonly typeChecker: ts.TypeChecker, private readonly typeTracker: TypeTracker) {}\n\n public process(assembly: Assembly, projectInfo: ProjectInfo) {\n const projectRoot = projectInfo.projectRoot;\n const validationFunctions: ts.ObjectLiteralElementLike[] = [];\n\n const types = assembly.types ?? {};\n for (const type of Object.values(types)) {\n const fnStatements = this.generateTypeValidation(type, assembly, projectInfo, types);\n if (fnStatements.length === 0) {\n continue;\n }\n\n const paramValue = ts.factory.createParameterDeclaration(undefined, undefined, PARAMETER_NAME);\n const functionName = fnName(type.fqn);\n const functionExpr = ts.factory.createFunctionExpression(\n undefined,\n undefined,\n ts.factory.createIdentifier(functionName),\n [],\n [paramValue],\n undefined,\n createFunctionBlock(fnStatements),\n );\n validationFunctions.push(ts.factory.createPropertyAssignment(functionName, functionExpr));\n }\n\n const fileStatements: ts.Statement[] = [];\n fileStatements.push(\n ts.factory.createVariableStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n VALIDATORS_OBJ,\n undefined,\n undefined,\n ts.factory.createObjectLiteralExpression(validationFunctions),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n ),\n );\n\n this.transformers = {\n before: [\n (context) => {\n const transformer = new Transformer(\n this.typeChecker,\n context,\n projectRoot,\n this.buildTypeIndex(assembly),\n assembly,\n );\n return transformer.transform.bind(transformer);\n },\n ],\n };\n\n generateWarningsFile(projectRoot, fileStatements);\n }\n\n public get customTransformers(): ts.CustomTransformers {\n return this.transformers;\n }\n\n private buildTypeIndex(assembly: Assembly): Map<string, spec.Type> {\n const result = new Map<string, spec.Type>();\n\n for (const type of Object.values(assembly.types ?? {})) {\n const symbolId = type.symbolId;\n if (symbolId) {\n result.set(symbolId, type);\n }\n }\n\n return result;\n }\n\n /**\n * Whether the validator for the given type should be rendered\n *\n * A validator should be rendered if:\n *\n * - It contains any deprecated members (base case).\n * - It references any other types whose validators should be rendered.\n * - It inherits from other types whose validators should be rendered.\n * - It references types that reference this type (recursive types).\n * - It references types from another assembly.\n *\n * For the last one we technically return `true`, indicating that a validator\n * *should* be rendered, but when we get to rendering no statements are\n * actually produced and the validator function is never rendered. This was\n * pre-existing behavior that I didn't change because introducing calls into\n * other assemblies out of the blue introduces risk.\n */\n private shouldRenderValidator(type: spec.Type, assembly: Assembly): boolean {\n if (this.shouldRenderValidatorCache[type.fqn] !== undefined) {\n return this.shouldRenderValidatorCache[type.fqn];\n }\n\n if (this.validatorCacheSeenSet.has(type.fqn)) {\n // To be safe we need to say this is true.\n return true;\n }\n if (!type.fqn.startsWith(`${assembly.name}.`)) {\n // Foreign type, always check\n return true;\n }\n this.validatorCacheSeenSet.add(type.fqn);\n\n this.shouldRenderValidatorCache[type.fqn] = calculate.call(this);\n this.validatorCacheSeenSet.delete(type.fqn);\n\n return this.shouldRenderValidatorCache[type.fqn];\n\n function calculate(this: DeprecationWarningsInjector): boolean {\n if (spec.isDeprecated(type)) {\n return true;\n }\n if (spec.isEnumType(type)) {\n return (type.members ?? []).some(spec.isDeprecated);\n }\n if (spec.isInterfaceType(type) && type.datatype) {\n for (const prop of type.properties ?? []) {\n if (spec.isDeprecated(prop)) {\n return true;\n }\n\n const typesToInspect = spec.isCollectionTypeReference(prop.type)\n ? [prop.type.collection.elementtype]\n : spec.isUnionTypeReference(prop.type)\n ? prop.type.union.types\n : [prop.type];\n\n for (const typeToInspect of typesToInspect) {\n if (!spec.isNamedTypeReference(typeToInspect)) {\n continue;\n }\n\n // Is from a different assembly?\n const typeObj = findType2(typeToInspect.fqn, assembly);\n if (typeObj === 'other-assembly') {\n return true;\n }\n if (this.shouldRenderValidator(typeObj, assembly)) {\n return true;\n }\n }\n }\n\n for (const interfaceName of type.interfaces ?? []) {\n const typeObj = findType2(interfaceName, assembly);\n if (typeObj === 'other-assembly') {\n return true;\n }\n if (this.shouldRenderValidator(typeObj, assembly)) {\n return true;\n }\n }\n }\n\n return false;\n }\n }\n\n private generateTypeValidation(\n type: spec.Type,\n assembly: Assembly,\n projectInfo: ProjectInfo,\n types: Record<string, spec.Type>,\n ): ts.Statement[] {\n if (!this.shouldRenderValidator(type, assembly)) {\n return [];\n }\n\n const statements: ts.Statement[] = [];\n let isEmpty = true;\n\n // This will add the parameter to the set of visited objects, to prevent infinite recursion\n statements.push(\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(VISITED_OBJECTS_SET_NAME), 'add'),\n undefined,\n [ts.factory.createIdentifier(PARAMETER_NAME)],\n ),\n ),\n );\n\n const tryStatements = [];\n if (spec.isDeprecated(type) && spec.isEnumType(type)) {\n // The type is deprecated\n tryStatements.push(createWarningFunctionCall(type.fqn, type.docs?.deprecated));\n isEmpty = false;\n }\n\n if (spec.isEnumType(type) && type.locationInModule?.filename) {\n // Check for deprecated enum members\n //\n // We need to compare to the value of the deprecated enum. We can do that in one of 2 ways:\n //\n // - Compare against `require('./actual-file').EnumType.SOME_ENUM_MEMBER`\n // - Look up the enum member value and compare against `'some-enum-member'`.\n //\n // The first one introduces a circular dependency between this file and `actual-file.js`, so we\n // will go with the second.\n //\n // One complication: two enum members can have the same value (shouldn't, but can!) where\n // one symbolic name is deprecated but the other isn't. In that case we don't treat it as deprecated.\n const memDecls = this.typeTracker.getEnumMembers(type.fqn);\n\n const nonDeprecatedValues = new Set(\n (type.members ?? [])\n .filter((m) => !spec.isDeprecated(m))\n .map((m) => this.typeChecker.getConstantValue(memDecls[m.name])!),\n );\n const deprecatedMembers = (type.members ?? []).filter(spec.isDeprecated);\n\n for (const member of deprecatedMembers) {\n const constantValue = this.typeChecker.getConstantValue(memDecls[member.name])!;\n if (nonDeprecatedValues.has(constantValue)) {\n // Collission with non-deprecated enum member\n continue;\n }\n\n const condition = ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(PARAMETER_NAME),\n ts.SyntaxKind.EqualsEqualsEqualsToken,\n typeof constantValue === 'string'\n ? ts.factory.createStringLiteral(constantValue)\n : ts.factory.createNumericLiteral(constantValue),\n );\n tryStatements.push(createWarningFunctionCall(`${type.fqn}#${member.name}`, member.docs?.deprecated, condition));\n isEmpty = false;\n }\n } else if (spec.isInterfaceType(type) && type.datatype) {\n const { statementsByProp, excludedProps } = this.processInterfaceType(\n type,\n types,\n assembly,\n projectInfo,\n undefined,\n undefined,\n );\n\n for (const [name, statement] of statementsByProp.entries()) {\n if (!excludedProps.has(name)) {\n tryStatements.push(statement);\n isEmpty = false;\n }\n }\n }\n\n statements.push(\n ts.factory.createTryStatement(\n ts.factory.createBlock(tryStatements),\n undefined,\n ts.factory.createBlock([\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(VISITED_OBJECTS_SET_NAME),\n 'delete',\n ),\n undefined,\n [ts.factory.createIdentifier(PARAMETER_NAME)],\n ),\n ),\n ]),\n ),\n );\n\n return isEmpty ? [] : statements;\n }\n\n private processInterfaceType(\n type: spec.InterfaceType,\n types: { [p: string]: spec.Type },\n assembly: Assembly,\n projectInfo: ProjectInfo,\n statementsByProp: Map<string, ts.Statement> = new Map<string, ts.Statement>(),\n excludedProps: Set<string> = new Set<string>(),\n ) {\n for (const prop of Object.values(type.properties ?? {})) {\n const fqn = `${type.fqn}#${prop.name}`;\n if (spec.isDeprecated(prop) || spec.isDeprecated(type)) {\n // If the property individually is deprecated, or the entire type is deprecated\n const deprecatedDocs = prop.docs?.deprecated ?? type.docs?.deprecated;\n const statement = createWarningFunctionCall(\n fqn,\n deprecatedDocs,\n ts.factory.createBinaryExpression(\n ts.factory.createStringLiteral(prop.name),\n ts.SyntaxKind.InKeyword,\n ts.factory.createIdentifier(PARAMETER_NAME),\n ),\n undefined,\n );\n statementsByProp.set(prop.name, statement);\n } else {\n /* If a prop is not deprecated, we don't want to generate a warning for it,\n even if another property with the same name is deprecated in another\n super-interface. */\n excludedProps.add(prop.name);\n }\n\n if (spec.isNamedTypeReference(prop.type) && Object.keys(types).includes(prop.type.fqn)) {\n if (this.shouldRenderValidator(types[prop.type.fqn], assembly)) {\n const functionName = importedFunctionName(prop.type.fqn, assembly, projectInfo);\n if (functionName) {\n const statement = createTypeHandlerCall(functionName, `${PARAMETER_NAME}.${prop.name}`);\n statementsByProp.set(`${prop.name}_`, statement);\n }\n }\n } else if (\n spec.isCollectionTypeReference(prop.type) &&\n spec.isNamedTypeReference(prop.type.collection.elementtype)\n ) {\n const functionName = importedFunctionName(prop.type.collection.elementtype.fqn, assembly, projectInfo);\n if (functionName) {\n const statement = createTypeHandlerCall(\n functionName,\n `${PARAMETER_NAME}.${prop.name}`,\n prop.type.collection.kind,\n );\n statementsByProp.set(`${prop.name}_`, statement);\n }\n } else if (\n spec.isUnionTypeReference(prop.type) &&\n spec.isNamedTypeReference(prop.type.union.types[0]) &&\n Object.keys(types).includes(prop.type.union.types[0].fqn)\n ) {\n const functionName = importedFunctionName(prop.type.union.types[0].fqn, assembly, projectInfo);\n if (functionName) {\n const statement = createTypeHandlerCall(functionName, `${PARAMETER_NAME}.${prop.name}`);\n statementsByProp.set(`${prop.name}_`, statement);\n }\n }\n }\n\n // We also generate calls to all the supertypes\n for (const interfaceName of type.interfaces ?? []) {\n const assemblies = projectInfo.dependencyClosure.concat(assembly);\n const superType = findType(interfaceName, assemblies);\n if (superType.type) {\n this.processInterfaceType(\n superType.type as spec.InterfaceType,\n types,\n assembly,\n projectInfo,\n statementsByProp,\n excludedProps,\n );\n }\n }\n return { statementsByProp, excludedProps };\n }\n}\n\nfunction fnName(fqn: string): string {\n return fqn.replace(/[^\\w\\d]/g, '_');\n}\n\nfunction createFunctionBlock(statements: ts.Statement[]): ts.Block {\n if (statements.length > 0) {\n const validation = ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(PARAMETER_NAME),\n ts.SyntaxKind.EqualsEqualsToken,\n ts.factory.createNull(),\n ),\n ts.factory.createReturnStatement(),\n );\n return ts.factory.createBlock([validation, ...statements], true);\n }\n return ts.factory.createBlock([], true);\n}\n\nfunction createWarningFunctionCall(\n fqn: string,\n message = '',\n condition?: ts.Expression,\n includeNamespace = false,\n): ts.Statement {\n const functionName = includeNamespace ? `${NAMESPACE}.${WARNING_FUNCTION_NAME}` : WARNING_FUNCTION_NAME;\n\n const mainStatement = ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(ts.factory.createIdentifier(functionName), undefined, [\n ts.factory.createStringLiteral(fqn),\n ts.factory.createStringLiteral(message),\n ]),\n );\n\n return condition ? ts.factory.createIfStatement(condition, mainStatement) : mainStatement;\n}\n\nfunction generateWarningsFile(projectRoot: string, validatorStatements: ts.Statement[]) {\n const functionText = `function ${WARNING_FUNCTION_NAME}(name, deprecationMessage) {\n const deprecated = process.env.JSII_DEPRECATED;\n const deprecationMode = ['warn', 'fail', 'quiet'].includes(deprecated) ? deprecated : 'warn';\n const message = \\`\\${name} is deprecated.\\\\n \\${deprecationMessage.trim()}\\\\n This API will be removed in the next major release.\\`;\n switch (deprecationMode) {\n case \"fail\":\n throw new ${DEPRECATION_ERROR}(message);\n case \"warn\":\n console.warn(\"[WARNING]\", message);\n break;\n }\n}\n\nfunction ${GET_PROPERTY_DESCRIPTOR}(obj, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor) {\n return descriptor;\n }\n const proto = Object.getPrototypeOf(obj);\n const prototypeDescriptor = proto && getPropertyDescriptor(proto, prop);\n if (prototypeDescriptor) {\n return prototypeDescriptor;\n }\n return {};\n}\n\nconst ${VISITED_OBJECTS_SET_NAME} = new Set();\n\nclass ${DEPRECATION_ERROR} extends Error {\n constructor(...args) {\n super(...args);\n Object.defineProperty(this, 'name', {\n configurable: false,\n enumerable: true,\n value: '${DEPRECATION_ERROR}',\n writable: false,\n });\n }\n}\n\nfunction nop() {\n}\n\nmodule.exports = new Proxy({}, {\n get(target, prop, receiver) {\n if (prop === '${WARNING_FUNCTION_NAME}') return ${WARNING_FUNCTION_NAME};\n if (prop === '${GET_PROPERTY_DESCRIPTOR}') return ${GET_PROPERTY_DESCRIPTOR};\n if (prop === '${DEPRECATION_ERROR}') return ${DEPRECATION_ERROR};\n\n return ${VALIDATORS_OBJ}[prop] ?? nop;\n },\n});\n`;\n\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n const resultFile = ts.createSourceFile(\n path.join(projectRoot, WARNINGSCODE_FILE_NAME),\n functionText,\n ts.ScriptTarget.Latest,\n false,\n ts.ScriptKind.JS,\n );\n\n const declarations = validatorStatements.map((st) => printer.printNode(ts.EmitHint.Unspecified, st, resultFile));\n\n const content = declarations.concat(printer.printFile(resultFile)).join('\\n');\n\n fs.writeFileSync(path.join(projectRoot, WARNINGSCODE_FILE_NAME), content);\n}\n\nclass Transformer {\n private warningCallsWereInjected = false;\n\n public constructor(\n private readonly typeChecker: ts.TypeChecker,\n private readonly context: ts.TransformationContext,\n private readonly projectRoot: string,\n private readonly typeIndex: Map<string, spec.Type>,\n private readonly assembly: Assembly,\n ) {}\n\n public transform<T extends ts.Node>(node: T): T {\n this.warningCallsWereInjected = false;\n\n const result = this.visitEachChild(node);\n\n if (ts.isSourceFile(result) && this.warningCallsWereInjected) {\n const importDir = path.relative(path.dirname(result.fileName), this.projectRoot);\n const importPath = importDir.startsWith('..')\n ? unixPath(path.join(importDir, WARNINGSCODE_FILE_NAME))\n : `./${WARNINGSCODE_FILE_NAME}`;\n\n return ts.factory.updateSourceFile(result, [\n createRequireStatement(NAMESPACE, importPath),\n ...result.statements,\n ]) as any;\n }\n return result;\n }\n\n private visitEachChild<T extends ts.Node>(node: T): T {\n return ts.visitEachChild(node, this.visitor.bind(this), this.context);\n }\n\n private visitor<T extends ts.Node>(node: T): ts.VisitResult<T> {\n if (ts.isMethodDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateMethodDeclaration(\n node,\n node.modifiers,\n node.asteriskToken,\n node.name,\n node.questionToken,\n node.typeParameters,\n node.parameters,\n node.type,\n ts.factory.updateBlock(node.body, [\n ...wrapWithRethrow(\n statements,\n ts.factory.createPropertyAccessExpression(ts.factory.createThis(), node.name.getText(node.getSourceFile())),\n ),\n ...node.body.statements,\n ]),\n ) as any;\n } else if (ts.isGetAccessorDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateGetAccessorDeclaration(\n node,\n node.modifiers,\n node.name,\n node.parameters,\n node.type,\n ts.factory.updateBlock(node.body, [\n ...wrapWithRethrow(\n statements,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(NAMESPACE),\n GET_PROPERTY_DESCRIPTOR,\n ),\n undefined,\n [ts.factory.createThis(), ts.factory.createStringLiteral(node.name.getText(node.getSourceFile()))],\n ),\n 'get',\n ),\n ),\n ...node.body.statements,\n ]),\n ) as any;\n } else if (ts.isSetAccessorDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateSetAccessorDeclaration(\n node,\n node.modifiers,\n node.name,\n node.parameters,\n ts.factory.updateBlock(node.body, [\n ...wrapWithRethrow(\n statements,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(NAMESPACE),\n GET_PROPERTY_DESCRIPTOR,\n ),\n undefined,\n [ts.factory.createThis(), ts.factory.createStringLiteral(node.name.getText(node.getSourceFile()))],\n ),\n 'set',\n ),\n ),\n ...node.body.statements,\n ]),\n ) as any;\n } else if (ts.isConstructorDeclaration(node) && node.body != null) {\n const statements = this.getStatementsForDeclaration(node);\n this.warningCallsWereInjected = this.warningCallsWereInjected || statements.length > 0;\n return ts.factory.updateConstructorDeclaration(\n node,\n node.modifiers,\n node.parameters,\n ts.factory.updateBlock(node.body, insertStatements(node.body, wrapWithRethrow(statements, node.parent.name!))),\n ) as any;\n }\n\n return this.visitEachChild(node);\n }\n\n /**\n * @param getOrSet for property accessors, determines which of the getter or\n * setter should be used to get the caller function value.\n */\n private getStatementsForDeclaration(\n node: ts.MethodDeclaration | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.ConstructorDeclaration,\n ): ts.Statement[] {\n const klass = node.parent;\n const classSymbolId = symbolIdentifier(this.typeChecker, this.typeChecker.getTypeAtLocation(klass).symbol);\n if (classSymbolId && this.typeIndex.has(classSymbolId)) {\n const classType = this.typeIndex.get(classSymbolId)! as spec.ClassType;\n\n if (ts.isConstructorDeclaration(node)) {\n const initializer = classType?.initializer;\n if (initializer) {\n return this.getStatements(classType, initializer);\n }\n }\n\n const methods = classType?.methods ?? [];\n const method = methods.find((m) => m.name === node.name?.getText());\n if (method) {\n return this.getStatements(classType, method);\n }\n\n const properties = classType?.properties ?? [];\n const property = properties.find((p) => p.name === node.name?.getText());\n if (property) {\n return createWarningStatementForElement(property, classType);\n }\n }\n return [];\n }\n\n private getStatements(classType: spec.ClassType, method: spec.Method | spec.Initializer) {\n const statements = createWarningStatementForElement(method, classType);\n for (const parameter of Object.values(method.parameters ?? {})) {\n const parameterType =\n this.assembly.types && spec.isNamedTypeReference(parameter.type)\n ? this.assembly.types[parameter.type.fqn]\n : undefined;\n\n if (parameterType) {\n const functionName = `${NAMESPACE}.${fnName(parameterType.fqn)}`;\n statements.push(\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(ts.factory.createIdentifier(functionName), undefined, [\n ts.factory.createIdentifier(parameter.name),\n ]),\n ),\n );\n }\n }\n\n return statements;\n }\n}\n\nfunction findType2(fqn: string, assembly: Assembly): spec.Type | 'other-assembly' {\n // Is from a different assembly?\n if (!fqn.startsWith(`${assembly.name}.`)) {\n return 'other-assembly';\n }\n\n const type = (assembly.types ?? {})[fqn];\n if (!type) {\n throw new Error(`Could not find type in same assembly: ${fqn}`);\n }\n return type;\n}\n\nfunction createWarningStatementForElement(\n element: spec.Callable | spec.Property,\n classType: spec.ClassType,\n): ts.Statement[] {\n if (spec.isDeprecated(element)) {\n const elementName = (element as spec.Method | spec.Property).name;\n const fqn = elementName ? `${classType.fqn}#${elementName}` : classType.fqn;\n const message = element.docs?.deprecated ?? classType.docs?.deprecated;\n return [createWarningFunctionCall(fqn, message, undefined, true)];\n }\n return [];\n}\n\n/**\n * Inserts a list of statements in the correct position inside a block of statements.\n * If there is a `super` call, It inserts the statements just after it. Otherwise,\n * insert the statements right at the beginning of the block.\n */\nfunction insertStatements(block: ts.Block, newStatements: ts.Statement[]) {\n function splicePoint(statement: ts.Statement | undefined) {\n if (statement == null) {\n return 0;\n }\n let isSuper = false;\n statement.forEachChild((node) => {\n if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.SuperKeyword) {\n isSuper = true;\n }\n });\n return isSuper ? 1 : 0;\n }\n\n const result = [...block.statements];\n result.splice(splicePoint(block.statements[0]), 0, ...newStatements);\n return ts.factory.createNodeArray(result);\n}\n\nfunction createRequireStatement(name: string, importPath: string): ts.Statement {\n return ts.factory.createVariableStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n name,\n undefined,\n undefined,\n ts.factory.createCallExpression(ts.factory.createIdentifier('require'), undefined, [\n ts.factory.createStringLiteral(importPath),\n ]),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n );\n}\n\n/**\n * Returns a ready-to-used function name (including a `require`, if necessary)\n */\nfunction importedFunctionName(typeName: string, assembly: Assembly, projectInfo: ProjectInfo) {\n const assemblies = projectInfo.dependencyClosure.concat(assembly);\n const { type, moduleName } = findType(typeName, assemblies);\n if (type) {\n return moduleName !== assembly.name\n ? `require(\"${moduleName}/${WARNINGSCODE_FILE_NAME}\").${fnName(type.fqn)}`\n : `module.exports.${fnName(type.fqn)}`;\n }\n return undefined;\n}\n\n/**\n * Find the type and module name in an array of assemblies\n * matching a given type name\n */\nfunction findType(typeName: string, assemblies: Assembly[]) {\n for (const asm of assemblies) {\n if (asm.metadata?.jsii?.compiledWithDeprecationWarnings) {\n const types = asm.types ?? {};\n for (const name of Object.keys(types)) {\n if (typeName === name) {\n return { type: types[name], moduleName: asm.name };\n }\n }\n }\n }\n return {};\n}\n\nfunction createTypeHandlerCall(\n functionName: string,\n parameter: string,\n collectionKind?: spec.CollectionKind,\n): ts.Statement {\n switch (collectionKind) {\n case spec.CollectionKind.Array:\n return ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(parameter),\n ts.SyntaxKind.ExclamationEqualsToken,\n ts.factory.createNull(),\n ),\n ts.factory.createForOfStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [ts.factory.createVariableDeclaration(FOR_LOOP_ITEM_NAME)],\n ts.NodeFlags.Const,\n ),\n ts.factory.createIdentifier(parameter),\n createTypeHandlerCall(functionName, FOR_LOOP_ITEM_NAME),\n ),\n );\n case spec.CollectionKind.Map:\n return ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createIdentifier(parameter),\n ts.SyntaxKind.ExclamationEqualsToken,\n ts.factory.createNull(),\n ),\n ts.factory.createForOfStatement(\n undefined,\n ts.factory.createVariableDeclarationList(\n [ts.factory.createVariableDeclaration(FOR_LOOP_ITEM_NAME)],\n ts.NodeFlags.Const,\n ),\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('Object'), 'values'),\n undefined,\n [ts.factory.createIdentifier(parameter)],\n ),\n createTypeHandlerCall(functionName, FOR_LOOP_ITEM_NAME),\n ),\n );\n case undefined:\n return ts.factory.createIfStatement(\n ts.factory.createPrefixUnaryExpression(\n ts.SyntaxKind.ExclamationToken,\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier(VISITED_OBJECTS_SET_NAME),\n ts.factory.createIdentifier('has'),\n ),\n undefined,\n [ts.factory.createIdentifier(parameter)],\n ),\n ),\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(ts.factory.createIdentifier(functionName), undefined, [\n ts.factory.createIdentifier(parameter),\n ]),\n ),\n );\n }\n}\n\n// We try-then-rethrow exceptions to avoid runtimes displaying an uncanny wall of text if the place\n// where the error was thrown is webpacked. For example, jest somehow manages to capture the throw\n// location and renders the source line (which may be the whole file) when bundled.\nfunction wrapWithRethrow(statements: ts.Statement[], caller: ts.Expression): ts.Statement[] {\n if (statements.length === 0) {\n return statements;\n }\n return [\n ts.factory.createTryStatement(\n ts.factory.createBlock(statements),\n ts.factory.createCatchClause(\n ts.factory.createVariableDeclaration('error'),\n ts.factory.createBlock([\n // If this is a DeprecationError, trim its stack trace to surface level before re-throwing,\n // so we don't carry out possibly confusing frames from injected code. That can be toggled\n // off by setting JSII_DEBUG=1, so we can also diagnose in-injected code faults.\n ts.factory.createIfStatement(\n ts.factory.createBinaryExpression(\n ts.factory.createBinaryExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('process'), 'env'),\n 'JSII_DEBUG',\n ),\n ts.SyntaxKind.ExclamationEqualsEqualsToken,\n ts.factory.createStringLiteral('1'),\n ),\n ts.SyntaxKind.AmpersandAmpersandToken,\n ts.factory.createBinaryExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('error'), 'name'),\n ts.SyntaxKind.EqualsEqualsEqualsToken,\n ts.factory.createStringLiteral(DEPRECATION_ERROR),\n ),\n ),\n ts.factory.createBlock([\n ts.factory.createExpressionStatement(\n ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('Error'), 'captureStackTrace'),\n undefined,\n [ts.factory.createIdentifier('error'), caller],\n ),\n ),\n ]),\n ),\n ts.factory.createThrowStatement(ts.factory.createIdentifier('error')),\n ]),\n ),\n undefined,\n ),\n ];\n}\n\n/**\n * Force a path to be UNIXy (use `/` as a separator)\n *\n * `path.join()` etc. will use the system-dependent path separator (either `/` or `\\`\n * depending on your platform).\n *\n * However, if we actually emit the path-dependent separator to the `.js` files, then\n * files compiled with jsii on Windows cannot be used on any other platform. That seems\n * like an unnecessary restriction, especially since a `/` will work fine on Windows,\n * so make sure to always emit `/`.\n *\n * TSC itself always strictly emits `/` (or at least, emits the same what you put in).\n */\nfunction unixPath(filePath: string) {\n if (path.sep === '\\\\') {\n return filePath.replace(/\\\\/g, '/');\n }\n return filePath;\n}\n"]}
@@ -1,7 +1,40 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.RuntimeTypeInfoInjector = void 0;
4
- const ts = require("typescript");
37
+ const ts = __importStar(require("typescript"));
5
38
  /**
6
39
  * Provides a TransformerFactory to annotate classes with runtime information
7
40
  * (e.g., fully-qualified name, version).
@@ -18,9 +51,10 @@ const ts = require("typescript");
18
51
  * ```
19
52
  */
20
53
  class RuntimeTypeInfoInjector {
54
+ version;
55
+ fqnsByClass = new Map();
21
56
  constructor(version) {
22
57
  this.version = version;
23
- this.fqnsByClass = new Map();
24
58
  }
25
59
  /**
26
60
  * Register the fully-qualified name (fqn) of a class with its ClassDeclaration.
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-info.js","sourceRoot":"","sources":["../../src/transforms/runtime-info.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\n/**\n * Provides a TransformerFactory to annotate classes with runtime information\n * (e.g., fully-qualified name, version).\n *\n * It does this by first inserting this definition at the top of each source file:\n * ```\n * var JSII_RTTI_SYMBOL_1 = Symbol.for(\"jsii.rtti\");\n * ```\n *\n * Then, for each class that has registered runtime information during assembly,\n * insert a static member to the class with its fqn and version:\n * ```\n * private static readonly [JSII_RTTI_SYMBOL_1] = { fqn: \"ModuleName.ClassName\", version: \"1.2.3\" }\n * ```\n */\nexport class RuntimeTypeInfoInjector {\n private readonly fqnsByClass = new Map<ts.ClassDeclaration, string>();\n\n public constructor(private readonly version: string) {}\n\n /**\n * Register the fully-qualified name (fqn) of a class with its ClassDeclaration.\n * Only ClassDeclarations with registered fqns will be annotated.\n */\n public registerClassFqn(clazz: ts.ClassDeclaration, fqn: string) {\n this.fqnsByClass.set(clazz, fqn);\n }\n\n /**\n * Return the set of Transformers to be used in TSC's program.emit()\n */\n public makeTransformers(): ts.CustomTransformers {\n return {\n before: [this.runtimeTypeTransformer()],\n };\n }\n\n public runtimeTypeTransformer(): ts.TransformerFactory<ts.SourceFile> {\n return (context) => {\n const { factory } = context;\n\n return (sourceFile): ts.SourceFile => {\n const rttiSymbolIdentifier = factory.createUniqueName('JSII_RTTI_SYMBOL');\n\n let classesAnnotated = false;\n const visitor = (node: ts.Node): ts.Node => {\n if (ts.isClassDeclaration(node)) {\n const fqn = this.getClassFqn(node);\n if (fqn) {\n classesAnnotated = true;\n return this.addRuntimeInfoToClass(node, fqn, rttiSymbolIdentifier, factory);\n }\n }\n return ts.visitEachChild(node, visitor, context);\n };\n\n // Visit the source file, annotating the classes.\n let annotatedSourceFile = ts.visitNode(sourceFile, visitor) as ts.SourceFile;\n\n // Only add the symbol definition if it's actually used.\n if (classesAnnotated) {\n const rttiSymbol = factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('Symbol'), factory.createIdentifier('for')),\n undefined,\n [factory.createStringLiteral('jsii.rtti')],\n );\n const rttiSymbolDeclaration = factory.createVariableDeclaration(\n rttiSymbolIdentifier,\n undefined,\n undefined,\n rttiSymbol,\n );\n const variableDeclaration = factory.createVariableStatement(\n [],\n factory.createVariableDeclarationList([rttiSymbolDeclaration], ts.NodeFlags.Const),\n );\n\n annotatedSourceFile = factory.updateSourceFile(annotatedSourceFile, [\n variableDeclaration,\n ...annotatedSourceFile.statements,\n ]);\n }\n\n return annotatedSourceFile;\n };\n };\n }\n\n /** Used instead of direct access to the map to faciliate testing. */\n protected getClassFqn(clazz: ts.ClassDeclaration): string | undefined {\n return this.fqnsByClass.get(clazz);\n }\n\n /**\n * If the ClassDeclaration has an associated fully-qualified name registered,\n * will append a static property to the class with the fqn and version.\n */\n private addRuntimeInfoToClass(\n node: ts.ClassDeclaration,\n fqn: string,\n rttiSymbol: ts.Identifier,\n factory: ts.NodeFactory,\n ): ts.ClassDeclaration {\n const runtimeInfo = factory.createObjectLiteralExpression([\n factory.createPropertyAssignment(factory.createIdentifier('fqn'), factory.createStringLiteral(fqn)),\n factory.createPropertyAssignment(factory.createIdentifier('version'), factory.createStringLiteral(this.version)),\n ]);\n\n const runtimeProperty = factory.createPropertyDeclaration(\n [\n factory.createModifier(ts.SyntaxKind.PrivateKeyword),\n factory.createModifier(ts.SyntaxKind.StaticKeyword),\n factory.createModifier(ts.SyntaxKind.ReadonlyKeyword),\n ],\n factory.createComputedPropertyName(rttiSymbol),\n undefined,\n undefined,\n runtimeInfo,\n );\n\n return factory.updateClassDeclaration(\n node,\n node.modifiers,\n node.name,\n node.typeParameters,\n node.heritageClauses,\n factory.createNodeArray([runtimeProperty, ...node.members]),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"runtime-info.js","sourceRoot":"","sources":["../../src/transforms/runtime-info.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\n/**\n * Provides a TransformerFactory to annotate classes with runtime information\n * (e.g., fully-qualified name, version).\n *\n * It does this by first inserting this definition at the top of each source file:\n * ```\n * var JSII_RTTI_SYMBOL_1 = Symbol.for(\"jsii.rtti\");\n * ```\n *\n * Then, for each class that has registered runtime information during assembly,\n * insert a static member to the class with its fqn and version:\n * ```\n * private static readonly [JSII_RTTI_SYMBOL_1] = { fqn: \"ModuleName.ClassName\", version: \"1.2.3\" }\n * ```\n */\nexport class RuntimeTypeInfoInjector {\n private readonly fqnsByClass = new Map<ts.ClassDeclaration, string>();\n\n public constructor(private readonly version: string) {}\n\n /**\n * Register the fully-qualified name (fqn) of a class with its ClassDeclaration.\n * Only ClassDeclarations with registered fqns will be annotated.\n */\n public registerClassFqn(clazz: ts.ClassDeclaration, fqn: string) {\n this.fqnsByClass.set(clazz, fqn);\n }\n\n /**\n * Return the set of Transformers to be used in TSC's program.emit()\n */\n public makeTransformers(): ts.CustomTransformers {\n return {\n before: [this.runtimeTypeTransformer()],\n };\n }\n\n public runtimeTypeTransformer(): ts.TransformerFactory<ts.SourceFile> {\n return (context) => {\n const { factory } = context;\n\n return (sourceFile): ts.SourceFile => {\n const rttiSymbolIdentifier = factory.createUniqueName('JSII_RTTI_SYMBOL');\n\n let classesAnnotated = false;\n const visitor = (node: ts.Node): ts.Node => {\n if (ts.isClassDeclaration(node)) {\n const fqn = this.getClassFqn(node);\n if (fqn) {\n classesAnnotated = true;\n return this.addRuntimeInfoToClass(node, fqn, rttiSymbolIdentifier, factory);\n }\n }\n return ts.visitEachChild(node, visitor, context);\n };\n\n // Visit the source file, annotating the classes.\n let annotatedSourceFile = ts.visitNode(sourceFile, visitor) as ts.SourceFile;\n\n // Only add the symbol definition if it's actually used.\n if (classesAnnotated) {\n const rttiSymbol = factory.createCallExpression(\n factory.createPropertyAccessExpression(factory.createIdentifier('Symbol'), factory.createIdentifier('for')),\n undefined,\n [factory.createStringLiteral('jsii.rtti')],\n );\n const rttiSymbolDeclaration = factory.createVariableDeclaration(\n rttiSymbolIdentifier,\n undefined,\n undefined,\n rttiSymbol,\n );\n const variableDeclaration = factory.createVariableStatement(\n [],\n factory.createVariableDeclarationList([rttiSymbolDeclaration], ts.NodeFlags.Const),\n );\n\n annotatedSourceFile = factory.updateSourceFile(annotatedSourceFile, [\n variableDeclaration,\n ...annotatedSourceFile.statements,\n ]);\n }\n\n return annotatedSourceFile;\n };\n };\n }\n\n /** Used instead of direct access to the map to faciliate testing. */\n protected getClassFqn(clazz: ts.ClassDeclaration): string | undefined {\n return this.fqnsByClass.get(clazz);\n }\n\n /**\n * If the ClassDeclaration has an associated fully-qualified name registered,\n * will append a static property to the class with the fqn and version.\n */\n private addRuntimeInfoToClass(\n node: ts.ClassDeclaration,\n fqn: string,\n rttiSymbol: ts.Identifier,\n factory: ts.NodeFactory,\n ): ts.ClassDeclaration {\n const runtimeInfo = factory.createObjectLiteralExpression([\n factory.createPropertyAssignment(factory.createIdentifier('fqn'), factory.createStringLiteral(fqn)),\n factory.createPropertyAssignment(factory.createIdentifier('version'), factory.createStringLiteral(this.version)),\n ]);\n\n const runtimeProperty = factory.createPropertyDeclaration(\n [\n factory.createModifier(ts.SyntaxKind.PrivateKeyword),\n factory.createModifier(ts.SyntaxKind.StaticKeyword),\n factory.createModifier(ts.SyntaxKind.ReadonlyKeyword),\n ],\n factory.createComputedPropertyName(rttiSymbol),\n undefined,\n undefined,\n runtimeInfo,\n );\n\n return factory.updateClassDeclaration(\n node,\n node.modifiers,\n node.name,\n node.typeParameters,\n node.heritageClauses,\n factory.createNodeArray([runtimeProperty, ...node.members]),\n );\n }\n}\n"]}
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.BASE_COMPILER_OPTIONS = void 0;
4
37
  exports.enumAsCamel = enumAsCamel;
@@ -8,19 +41,21 @@ exports.convertForJson = convertForJson;
8
41
  exports.convertEnumToJson = convertEnumToJson;
9
42
  exports.convertLibForJson = convertLibForJson;
10
43
  exports.convertNewLineForJson = convertNewLineForJson;
11
- const ts = require("typescript");
12
- const Case = require("../case");
44
+ const ts = __importStar(require("typescript"));
45
+ const Case = __importStar(require("../case"));
13
46
  exports.BASE_COMPILER_OPTIONS = {
14
47
  alwaysStrict: true,
15
48
  declaration: true,
49
+ esModuleInterop: true,
16
50
  incremental: true,
17
- lib: ['lib.es2020.d.ts'],
18
- module: ts.ModuleKind.CommonJS,
51
+ lib: ['lib.es2023.d.ts'],
52
+ module: ts.ModuleKind.Node20,
19
53
  noEmitOnError: true,
20
54
  noFallthroughCasesInSwitch: true,
21
55
  noImplicitAny: true,
22
56
  noImplicitReturns: true,
23
57
  noImplicitThis: true,
58
+ noUncheckedSideEffectImports: true,
24
59
  noUnusedLocals: true,
25
60
  noUnusedParameters: true,
26
61
  resolveJsonModule: true,
@@ -29,7 +64,7 @@ exports.BASE_COMPILER_OPTIONS = {
29
64
  strictNullChecks: true,
30
65
  strictPropertyInitialization: true,
31
66
  stripInternal: false,
32
- target: ts.ScriptTarget.ES2020,
67
+ target: ts.ScriptTarget.ES2023,
33
68
  };
34
69
  /**
35
70
  * Helper function to convert a TS enum into a list of allowed values,
@@ -1 +1 @@
1
- {"version":3,"file":"compiler-options.js","sourceRoot":"","sources":["../../src/tsconfig/compiler-options.ts"],"names":[],"mappings":";;;AA8BA,kCAIC;AAOD,kCAIC;AAOD,kCAIC;AASD,wCAkBC;AAqCD,8CAMC;AAOD,8CAEC;AAWD,sDAOC;AAzJD,iCAAiC;AACjC,gCAAgC;AAEnB,QAAA,qBAAqB,GAAuB;IACvD,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,CAAC,iBAAiB,CAAC;IACxB,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ;IAC9B,aAAa,EAAE,IAAI;IACnB,0BAA0B,EAAE,IAAI;IAChC,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,IAAI;IACZ,gBAAgB,EAAE,IAAI;IACtB,4BAA4B,EAAE,IAAI;IAClC,aAAa,EAAE,KAAK;IACpB,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;CAC/B,CAAC;AAEF;;;;GAIG;AACH,SAAgB,WAAW,CAAC,QAAyC;IACnE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,QAAyC;IACnE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,QAAyC;IACnE,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;SAC/C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,GAAuB;IACpD,OAAO;QACL,GAAG,GAAG;QAEN,qFAAqF;QACrF,GAAG,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC;QAEjD,uFAAuF;QACvF,GAAG,UAAU,CAAC,wBAAwB,EAAE,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,sBAAsB,CAAC;QAC9F,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QACrD,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC;QAClD,GAAG,UAAU,CAAC,kBAAkB,EAAE,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC;QAChF,GAAG,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,mBAAmB,CAAC;QAC7E,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC;QAEpD,oEAAoE;QACpE,GAAG,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,IAAY,EACZ,KAAoB,EACpB,SAA0B;IAI1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CACjB,IAAY,EACZ,KAAU,EACV,OAAU,EACV,SAAqC;IAIrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC/B,KAAc,EACd,OAAU,EACV,YAAuC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;IAE7D,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAQ,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,KAAe;IAC/C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CAAC,OAAuB;IAC3D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,EAAE,CAAC,WAAW,CAAC,sBAAsB;YACxC,OAAO,MAAM,CAAC;QAChB,KAAK,EAAE,CAAC,WAAW,CAAC,QAAQ;YAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC","sourcesContent":["import * as ts from 'typescript';\nimport * as Case from '../case';\n\nexport const BASE_COMPILER_OPTIONS: ts.CompilerOptions = {\n alwaysStrict: true,\n declaration: true,\n incremental: true,\n lib: ['lib.es2020.d.ts'],\n module: ts.ModuleKind.CommonJS,\n noEmitOnError: true,\n noFallthroughCasesInSwitch: true,\n noImplicitAny: true,\n noImplicitReturns: true,\n noImplicitThis: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n resolveJsonModule: true,\n skipLibCheck: true,\n strict: true,\n strictNullChecks: true,\n strictPropertyInitialization: true,\n stripInternal: false,\n target: ts.ScriptTarget.ES2020,\n};\n\n/**\n * Helper function to convert a TS enum into a list of allowed values,\n * converting everything to camel case.\n * This is used for example for the watch options\n */\nexport function enumAsCamel(enumData: Record<string, string | number>): string[] {\n return Object.keys(enumData)\n .filter((v) => isNaN(Number(v)))\n .map(Case.camel);\n}\n\n/**\n * Helper function to convert a TS enum into a list of allowed values,\n * converting everything to lower case.\n * This is used for example for the \"target\" compiler option\n */\nexport function enumAsLower(enumData: Record<string, string | number>): string[] {\n return Object.keys(enumData)\n .filter((v) => isNaN(Number(v)) && v !== 'None')\n .map((v) => v.toLowerCase());\n}\n\n/**\n * Helper function to convert a TS enum into a list of allowed values,\n * converting everything to kebab case.\n * This is used for example for the \"jsx\" compiler option\n */\nexport function enumAsKebab(enumData: Record<string, string | number>): string[] {\n return Object.keys(enumData)\n .filter((v) => isNaN(Number(v)) && v !== 'None')\n .map(Case.kebab);\n}\n\n/**\n * The compilerOptions in the programmatic API are slightly differently than the format used in tsconfig.json\n * This helper performs the necessary conversion from the programmatic API format the one used in tsconfig.json\n *\n * @param opt compilerOptions in programmatic API format\n * @returns compilerOptions ready to be written on disk\n */\nexport function convertForJson(opt: ts.CompilerOptions): ts.CompilerOptions {\n return {\n ...opt,\n\n // Drop the \"lib.\" prefix and \".d.ts\" suffix before writing up the tsconfig.json file\n ...valueHelper('lib', opt.lib, convertLibForJson),\n\n // Re-write the module, targets & jsx to be the JSON format instead of Programmatic API\n ...enumHelper('importsNotUsedAsValues', opt.importsNotUsedAsValues, ts.ImportsNotUsedAsValues),\n ...enumHelper('jsx', opt.jsx, ts.JsxEmit, Case.kebab),\n ...enumHelper('module', opt.module, ts.ModuleKind),\n ...enumHelper('moduleResolution', opt.moduleResolution, ts.ModuleResolutionKind),\n ...enumHelper('moduleDetection', opt.moduleDetection, ts.ModuleDetectionKind),\n ...enumHelper('target', opt.target, ts.ScriptTarget),\n\n // rewrite newline to be the JSON format instead of Programmatic API\n ...valueHelper('newLine', opt.newLine, convertNewLineForJson),\n };\n}\n\nfunction valueHelper<T, U>(\n name: string,\n value: T | undefined,\n converter: (value: T) => U,\n): {\n [name: string]: U;\n} {\n if (!value) {\n return {};\n }\n return { [name]: converter(value) };\n}\n\nfunction enumHelper<T>(\n name: string,\n value: any,\n enumObj: T,\n converter?: (value: string) => string,\n): {\n [name: string]: string;\n} {\n if (!value) {\n return {};\n }\n return { [name]: convertEnumToJson(value, enumObj, converter) };\n}\n\n/**\n * Convert an internal enum value to what a user would write in tsconfig.json\n * Possibly using a converter function to adjust casing.\n * @param value The internal enum value\n * @param enumObj The enum object to convert from\n * @param converter The converter function, defaults to lowercase\n * @returns The humanized version of the enum value\n */\nexport function convertEnumToJson<T>(\n value: keyof T,\n enumObj: T,\n converter: (value: string) => string = (v) => v.toLowerCase(),\n): string {\n return converter(enumObj[value] as any);\n}\n\n/**\n * Convert the internal lib strings to what a user would write in tsconfig.json\n * @param input The input libs array\n * @returns The humanized version lib array\n */\nexport function convertLibForJson(input: string[]): string[] {\n return input.map((lib) => lib.slice(4, lib.length - 5));\n}\n\n/**\n * This is annoying - the values expected in the tsconfig.json file are not\n * the same as the enum constant names, or their values. So we need this\n * function to map the \"compiler API version\" to the \"tsconfig.json version\"\n *\n * @param newLine the compiler form of the new line configuration\n *\n * @return the equivalent value to put in tsconfig.json\n */\nexport function convertNewLineForJson(newLine: ts.NewLineKind): string {\n switch (newLine) {\n case ts.NewLineKind.CarriageReturnLineFeed:\n return 'crlf';\n case ts.NewLineKind.LineFeed:\n return 'lf';\n }\n}\n"]}
1
+ {"version":3,"file":"compiler-options.js","sourceRoot":"","sources":["../../src/tsconfig/compiler-options.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\nimport * as Case from '../case';\n\nexport const BASE_COMPILER_OPTIONS: ts.CompilerOptions = {\n alwaysStrict: true,\n declaration: true,\n esModuleInterop: true,\n incremental: true,\n lib: ['lib.es2023.d.ts'],\n module: ts.ModuleKind.Node20,\n noEmitOnError: true,\n noFallthroughCasesInSwitch: true,\n noImplicitAny: true,\n noImplicitReturns: true,\n noImplicitThis: true,\n noUncheckedSideEffectImports: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n resolveJsonModule: true,\n skipLibCheck: true,\n strict: true,\n strictNullChecks: true,\n strictPropertyInitialization: true,\n stripInternal: false,\n target: ts.ScriptTarget.ES2023,\n};\n\n/**\n * Helper function to convert a TS enum into a list of allowed values,\n * converting everything to camel case.\n * This is used for example for the watch options\n */\nexport function enumAsCamel(enumData: Record<string, string | number>): string[] {\n return Object.keys(enumData)\n .filter((v) => isNaN(Number(v)))\n .map(Case.camel);\n}\n\n/**\n * Helper function to convert a TS enum into a list of allowed values,\n * converting everything to lower case.\n * This is used for example for the \"target\" compiler option\n */\nexport function enumAsLower(enumData: Record<string, string | number>): string[] {\n return Object.keys(enumData)\n .filter((v) => isNaN(Number(v)) && v !== 'None')\n .map((v) => v.toLowerCase());\n}\n\n/**\n * Helper function to convert a TS enum into a list of allowed values,\n * converting everything to kebab case.\n * This is used for example for the \"jsx\" compiler option\n */\nexport function enumAsKebab(enumData: Record<string, string | number>): string[] {\n return Object.keys(enumData)\n .filter((v) => isNaN(Number(v)) && v !== 'None')\n .map(Case.kebab);\n}\n\n/**\n * The compilerOptions in the programmatic API are slightly differently than the format used in tsconfig.json\n * This helper performs the necessary conversion from the programmatic API format the one used in tsconfig.json\n *\n * @param opt compilerOptions in programmatic API format\n * @returns compilerOptions ready to be written on disk\n */\nexport function convertForJson(opt: ts.CompilerOptions): ts.CompilerOptions {\n return {\n ...opt,\n\n // Drop the \"lib.\" prefix and \".d.ts\" suffix before writing up the tsconfig.json file\n ...valueHelper('lib', opt.lib, convertLibForJson),\n\n // Re-write the module, targets & jsx to be the JSON format instead of Programmatic API\n ...enumHelper('importsNotUsedAsValues', opt.importsNotUsedAsValues, ts.ImportsNotUsedAsValues),\n ...enumHelper('jsx', opt.jsx, ts.JsxEmit, Case.kebab),\n ...enumHelper('module', opt.module, ts.ModuleKind),\n ...enumHelper('moduleResolution', opt.moduleResolution, ts.ModuleResolutionKind),\n ...enumHelper('moduleDetection', opt.moduleDetection, ts.ModuleDetectionKind),\n ...enumHelper('target', opt.target, ts.ScriptTarget),\n\n // rewrite newline to be the JSON format instead of Programmatic API\n ...valueHelper('newLine', opt.newLine, convertNewLineForJson),\n };\n}\n\nfunction valueHelper<T, U>(\n name: string,\n value: T | undefined,\n converter: (value: T) => U,\n): {\n [name: string]: U;\n} {\n if (!value) {\n return {};\n }\n return { [name]: converter(value) };\n}\n\nfunction enumHelper<T>(\n name: string,\n value: any,\n enumObj: T,\n converter?: (value: string) => string,\n): {\n [name: string]: string;\n} {\n if (!value) {\n return {};\n }\n return { [name]: convertEnumToJson(value, enumObj, converter) };\n}\n\n/**\n * Convert an internal enum value to what a user would write in tsconfig.json\n * Possibly using a converter function to adjust casing.\n * @param value The internal enum value\n * @param enumObj The enum object to convert from\n * @param converter The converter function, defaults to lowercase\n * @returns The humanized version of the enum value\n */\nexport function convertEnumToJson<T>(\n value: keyof T,\n enumObj: T,\n converter: (value: string) => string = (v) => v.toLowerCase(),\n): string {\n return converter(enumObj[value] as any);\n}\n\n/**\n * Convert the internal lib strings to what a user would write in tsconfig.json\n * @param input The input libs array\n * @returns The humanized version lib array\n */\nexport function convertLibForJson(input: string[]): string[] {\n return input.map((lib) => lib.slice(4, lib.length - 5));\n}\n\n/**\n * This is annoying - the values expected in the tsconfig.json file are not\n * the same as the enum constant names, or their values. So we need this\n * function to map the \"compiler API version\" to the \"tsconfig.json version\"\n *\n * @param newLine the compiler form of the new line configuration\n *\n * @return the equivalent value to put in tsconfig.json\n */\nexport function convertNewLineForJson(newLine: ts.NewLineKind): string {\n switch (newLine) {\n case ts.NewLineKind.CarriageReturnLineFeed:\n return 'crlf';\n case ts.NewLineKind.LineFeed:\n return 'lf';\n }\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import { TypeScriptConfigValidationRuleSet } from '.';
2
+ import { RuleDescription } from './validator';
3
+ /**
4
+ * Human-readable descriptions for each tsconfig validation rule set.
5
+ *
6
+ * These are surfaced both as CLI option help (e.g. for `--validate-tsconfig` and
7
+ * `--rule-set`) and as the heading when printing a rule set via `formatRuleSet`.
8
+ */
9
+ export declare const RULE_SET_DESCRIPTIONS: {
10
+ [choice in TypeScriptConfigValidationRuleSet]: string;
11
+ };
12
+ /**
13
+ * Render a single rule set (its `compilerOptions` rules) as a human-readable block.
14
+ *
15
+ * @param ruleSet the rule set to render
16
+ * @returns a multi-line string suitable for printing to the console
17
+ */
18
+ export declare function formatRuleSet(ruleSet: TypeScriptConfigValidationRuleSet): string;
19
+ /**
20
+ * Render a single rule's constraint as a human-readable phrase.
21
+ *
22
+ * @param rule the rule description to render
23
+ * @returns a phrase such as `must be one of: es2022, es2023` or `not allowed`
24
+ */
25
+ export declare function formatConstraint(rule: RuleDescription): string;
26
+ /**
27
+ * Render a single hinted value as a highlighted code literal. Strings are shown
28
+ * verbatim (as a user writes them in tsconfig.json), everything else is JSON-encoded.
29
+ *
30
+ * @param value the hinted value to render
31
+ * @returns the value as a (possibly colorized) code literal
32
+ */
33
+ export declare function formatRuleValue(value: any): string;
34
+ //# sourceMappingURL=rule-set-format.d.ts.map
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RULE_SET_DESCRIPTIONS = void 0;
7
+ exports.formatRuleSet = formatRuleSet;
8
+ exports.formatConstraint = formatConstraint;
9
+ exports.formatRuleValue = formatRuleValue;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const _1 = require(".");
12
+ const tsconfig_validator_1 = require("./tsconfig-validator");
13
+ const validator_1 = require("./validator");
14
+ /**
15
+ * Human-readable descriptions for each tsconfig validation rule set.
16
+ *
17
+ * These are surfaced both as CLI option help (e.g. for `--validate-tsconfig` and
18
+ * `--rule-set`) and as the heading when printing a rule set via `formatRuleSet`.
19
+ */
20
+ exports.RULE_SET_DESCRIPTIONS = {
21
+ [_1.TypeScriptConfigValidationRuleSet.STRICT]: 'Validates the provided config against a strict rule set designed for maximum backwards-compatibility.',
22
+ [_1.TypeScriptConfigValidationRuleSet.GENERATED]: 'Enforces a config as created by --generate-tsconfig. Use this to stay compatible with the generated config, but have full ownership over the file.',
23
+ [_1.TypeScriptConfigValidationRuleSet.MINIMAL]: 'Only enforce options that are known to be incompatible with jsii. This rule set is likely to be incomplete and new rules will be added without notice as incompatibilities emerge.',
24
+ [_1.TypeScriptConfigValidationRuleSet.NONE]: 'Disables all config validation, including options that are known to be incompatible with jsii. Intended for experimentation only. Use at your own risk.',
25
+ };
26
+ /**
27
+ * Render a single rule set (its `compilerOptions` rules) as a human-readable block.
28
+ *
29
+ * @param ruleSet the rule set to render
30
+ * @returns a multi-line string suitable for printing to the console
31
+ */
32
+ function formatRuleSet(ruleSet) {
33
+ const lines = [`${chalk_1.default.bold('Rule set:')} ${chalk_1.default.bold.cyan(ruleSet)}`];
34
+ const description = exports.RULE_SET_DESCRIPTIONS[ruleSet];
35
+ if (description) {
36
+ lines.push(chalk_1.default.dim(description));
37
+ }
38
+ const rules = (0, tsconfig_validator_1.describeRuleSet)(ruleSet);
39
+ if (rules.length === 0) {
40
+ lines.push('');
41
+ lines.push(chalk_1.default.dim(' No rules. Configuration validation is disabled for this rule set.'));
42
+ return lines.join('\n');
43
+ }
44
+ const unknownRejected = (0, tsconfig_validator_1.getCompilerOptionsRuleSet)(ruleSet).options.unexpectedFields === validator_1.RuleType.FAIL;
45
+ lines.push('');
46
+ lines.push(chalk_1.default.dim(`Applies to: compilerOptions (other options: ${unknownRejected ? 'rejected' : 'allowed'})`));
47
+ lines.push('');
48
+ // Group rules by field, preserving the order in which each field first appears.
49
+ const byField = new Map();
50
+ for (const rule of rules) {
51
+ const list = byField.get(rule.field) ?? [];
52
+ list.push(rule);
53
+ byField.set(rule.field, list);
54
+ }
55
+ const width = Math.max(...[...byField.keys()].map((field) => field.length));
56
+ for (const [field, fieldRules] of byField) {
57
+ const phrases = fieldRules.map(formatConstraint);
58
+ // A required field is surfaced as an explicit "required" constraint at the front.
59
+ if (fieldRules.some((rule) => rule.required)) {
60
+ phrases.unshift(chalk_1.default.italic('required'));
61
+ }
62
+ // Dedupe identical phrases (some fields are constrained by several rules that overlap).
63
+ const constraints = [...new Set(phrases)].join('; ');
64
+ lines.push(` ${chalk_1.default.bold(field.padEnd(width))} ${constraints}`);
65
+ }
66
+ return lines.join('\n');
67
+ }
68
+ /**
69
+ * Render a single rule's constraint as a human-readable phrase.
70
+ *
71
+ * @param rule the rule description to render
72
+ * @returns a phrase such as `must be one of: es2022, es2023` or `not allowed`
73
+ */
74
+ function formatConstraint(rule) {
75
+ const { type, values } = rule;
76
+ // No hints means the matcher accepts anything (e.g. Match.ANY).
77
+ if (values === undefined) {
78
+ return type === validator_1.RuleType.PASS ? chalk_1.default.italic('any value') : 'must not be set to the matched value';
79
+ }
80
+ // Only null/undefined hints means the option must be absent (e.g. Match.MISSING).
81
+ if (values.length > 0 && values.every((value) => value == null)) {
82
+ return chalk_1.default.italic('not allowed');
83
+ }
84
+ const formatted = values.map(formatRuleValue);
85
+ if (type === validator_1.RuleType.FAIL) {
86
+ return formatted.length > 1 ? `must not be one of: ${formatted.join(', ')}` : `must not be ${formatted[0]}`;
87
+ }
88
+ return formatted.length > 1 ? `must be one of: ${formatted.join(', ')}` : `must be ${formatted[0]}`;
89
+ }
90
+ /**
91
+ * Render a single hinted value as a highlighted code literal. Strings are shown
92
+ * verbatim (as a user writes them in tsconfig.json), everything else is JSON-encoded.
93
+ *
94
+ * @param value the hinted value to render
95
+ * @returns the value as a (possibly colorized) code literal
96
+ */
97
+ function formatRuleValue(value) {
98
+ const literal = typeof value === 'string' ? value : JSON.stringify(value);
99
+ return chalk_1.default.cyan(literal);
100
+ }
101
+ //# sourceMappingURL=rule-set-format.js.map