1 | {"version":3,"file":"downlevel-dts.js","sourceRoot":"","sources":["../src/downlevel-dts.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n copyFileSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { basename, dirname, join, relative } from 'node:path';\nimport { main as downlevel } from 'downlevel-dts';\nimport * as log4js from 'log4js';\nimport { SemVer } from 'semver';\nimport * as ts from 'typescript';\nimport type { PackageJson, ProjectInfo } from './project-info';\nimport type { Mutable } from './utils';\n\nexport const TYPES_COMPAT = '.types-compat';\n\nconst LOG = log4js.getLogger('jsii/compiler');\n\nconst TS_VERSION = new SemVer(`${ts.versionMajorMinor}.0`);\n\n/**\n * Declares what versions of the TypeScript language will be supported by the\n * declarations files (and `typesVersions` entries) produced by this compiler\n * release.\n *\n * This should contain only `major.minor` specifiers, similar to the value of\n * the `ts.versionMajorMinor` property, and must be sorted in ascending version\n * order, as this dictates the order of entries in the `typesVersions` redirects\n * which has a direct impact on resolution (first match wins), and we don't want\n * to have to perform a sort pass on this list.\n */\nconst DOWNLEVEL_BREAKPOINTS: readonly SemVer[] = ['3.9'].map((ver) => new SemVer(`${ver}.0`));\n\n/**\n * Produces down-leveled declaration files to ensure compatibility with previous\n * compiler releases (macthing TypeScript's `major.minor` versioning scheme).\n * This is necessary in order to ensure a package change compiler release lines\n * does not force all it's consumers to do the same (and vice-versa).\n *\n * @returns the `typesVersions` object that should be recorded in `package.json`\n */\nexport function emitDownleveledDeclarations({ packageJson, projectRoot, tsc }: ProjectInfo) {\n const compatRoot = join(projectRoot, ...(tsc?.outDir != null ? [tsc?.outDir] : []), TYPES_COMPAT);\n rmSync(compatRoot, { force: true, recursive: true });\n\n const rewrites = new Set<`${number}.${number}`>();\n\n for (const breakpoint of DOWNLEVEL_BREAKPOINTS) {\n if (TS_VERSION.compare(breakpoint) <= 0) {\n // This TypeScript release is older or same as the breakpoint, so no need\n // for down-leveling here.\n continue;\n }\n\n const rewriteSet = new Map<string, string>();\n let needed = false;\n\n // We'll emit down-leveled declarations in a temporary directory...\n const workdir = mkdtempSync(join(tmpdir(), `downlevel-dts-${breakpoint}-${basename(projectRoot)}-`));\n try {\n downlevel(projectRoot, workdir, breakpoint.version);\n const projectOutDir = tsc?.outDir != null ? join(projectRoot, tsc.outDir) : projectRoot;\n const workOutDir = tsc?.outDir != null ? join(workdir, tsc.outDir) : workdir;\n for (const dts of walkDirectory(workOutDir)) {\n const original = readFileSync(join(projectOutDir, dts), 'utf-8');\n const downleveledPath = join(workOutDir, dts);\n const downleveled = readFileSync(downleveledPath, 'utf-8');\n needed ||= !semanticallyEqualDeclarations(original, downleveled);\n rewriteSet.set(dts, downleveledPath);\n }\n\n // If none of the declarations files changed during the down-level, then\n // we don't need to actually write it out & cause a redirect. This would\n // be wasteful. Most codebases won't incur any rewrite at all, since the\n // declarations files only reference \"visible\" members, and `jsii`\n // actually does not allow most of the unsupported syntaxes to be used\n // anyway.\n if (needed) {\n rewrites.add(`${breakpoint.major}.${breakpoint.minor}`);\n\n const versionSuffix = `ts${breakpoint.major}.${breakpoint.minor}`;\n const compatDir = join(compatRoot, versionSuffix);\n if (!existsSync(compatDir)) {\n mkdirSync(compatDir, { recursive: true });\n try {\n // Write an empty .npmignore file so that npm pack doesn't use the .gitignore file...\n writeFileSync(join(compatRoot, '.npmignore'), '\\n', 'utf-8');\n // Make sure all of this is gitignored, out of courtesy...\n writeFileSync(join(compatRoot, '.gitignore'), '*\\n', 'utf-8');\n } catch {\n // Ignore any error here... This is inconsequential.\n }\n }\n\n for (const [dts, downleveledPath] of rewriteSet) {\n const rewritten = join(compatDir, dts);\n // Make sure the parent directory exists (dts might be nested)\n mkdirSync(dirname(rewritten), { recursive: true });\n // Write the re-written declarations file there...\n copyFileSync(downleveledPath, rewritten);\n }\n }\n } finally {\n // Clean up after outselves...\n rmSync(workdir, { force: true, recursive: true });\n }\n }\n\n let typesVersions: Mutable<PackageJson['typesVersions']>;\n\n for (const version of rewrites) {\n // Register the type redirect in the typesVersions configuration\n typesVersions ??= {};\n const from = [...(tsc?.outDir != null ? [tsc?.outDir] : []), '*'].join('/');\n const to = [...(tsc?.outDir != null ? [tsc?.outDir] : []), TYPES_COMPAT, `ts${version}`, '*'].join('/');\n // We put 2 candidate redirects (first match wins), so that it works for nested imports, too (see: https://github.com/microsoft/TypeScript/issues/43133)\n typesVersions[`<=${version}`] = { [from]: [to, `${to}/index.d.ts`] };\n }\n\n // Compare JSON stringifications, as the order of keys is important here...\n if (JSON.stringify(packageJson.typesVersions) === JSON.stringify(typesVersions)) {\n // The existing configuration matches the new one. We're done here.\n return;\n }\n\n LOG.info('The required `typesVersions` configuration has changed. Updating \"package.json\" accordingly...');\n\n // Prepare the new contents of `PackageJson`.\n const newPackageJson = Object.entries(packageJson).reduce((obj, [key, value]) => {\n // NB: \"as any\" below are required becuase we must ignore `readonly` attributes from the source.\n if (key === 'typesVersions') {\n if (typesVersions != null) {\n obj[key] = typesVersions as any;\n }\n } else {\n obj[key] = value as any;\n // If there isn't currently a `typesVersions` entry, but there is a `types` entry,\n // we'll insert `typesVersions` right after `types`.\n if (key === 'types' && typesVersions != null && !('typesVersions' in packageJson)) {\n obj.typesVersions = typesVersions as any;\n }\n }\n return obj;\n }, {} as Mutable<PackageJson>);\n // If there was neither `types` nor `typesVersions` in the original `package.json`, we'll\n // add `typesVersions` at the end of it.\n if (!('typesVersions' in newPackageJson)) {\n newPackageJson.typesVersions = typesVersions as any;\n }\n\n const packageJsonFile = join(projectRoot, 'package.json');\n\n // We try \"hard\" to preserve the existing indent in the `package.json` file when updating it.\n const [, indent] = readFileSync(packageJsonFile, 'utf-8').match(/^(\\s*)\"/m) ?? [null, 2];\n\n writeFileSync(packageJsonFile, `${JSON.stringify(newPackageJson, undefined, indent)}\\n`, 'utf-8');\n}\n\n/**\n * Compares the contents of two declaration files semantically.\n *\n * @param left the first string.\n * @param right the second string.\n *\n * @returns `true` if `left` and `right` contain the same declarations.\n */\nfunction semanticallyEqualDeclarations(left: string, right: string): boolean {\n // We normalize declarations largely by parsing & re-printing them.\n const normalizeDeclarations = (code: string): string => {\n const sourceFile = ts.createSourceFile('index.d.ts', code, ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);\n const printer = ts.createPrinter({\n newLine: ts.NewLineKind.LineFeed,\n noEmitHelpers: true,\n omitTrailingSemicolon: false,\n removeComments: true,\n });\n let normalized = printer.printFile(sourceFile);\n\n // TypeScript may emit duplicated reference declarations... which are absent from Downlevel-DTS' output...\n // https://github.com/microsoft/TypeScript/issues/48143\n const REFERENCES_TYPES_NODE = '/// <reference types=\"node\" />';\n while (normalized.startsWith(`${REFERENCES_TYPES_NODE}\\n${REFERENCES_TYPES_NODE}`)) {\n normalized = normalized.slice(REFERENCES_TYPES_NODE.length + 1);\n }\n\n return normalized;\n };\n\n left = normalizeDeclarations(left);\n right = normalizeDeclarations(right);\n\n return left === right;\n}\n\n/**\n * Recursively traverse the provided directory and yield the relative (to the\n * specified `root`) paths of all the `.d.ts` files found there.\n *\n * @param dir the directory to be walked.\n * @param root the root to which paths should be relative.\n */\nfunction* walkDirectory(dir: string, root: string = dir): Generator<string, void, void> {\n for (const file of readdirSync(dir)) {\n const filePath = join(dir, file);\n if (statSync(filePath).isDirectory()) {\n // This is a directory, recurse down...\n yield* walkDirectory(filePath, root);\n } else if (file.toLowerCase().endsWith('.d.ts')) {\n // This is a declaration file, yield it...\n yield relative(root, filePath);\n }\n }\n}\n"]} |