jsii-rosetta 5.9.59 → 5.9.60

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.
@@ -83,6 +83,43 @@ export interface TypeLookupAssembly {
83
83
  * load the assembly into memory.
84
84
  */
85
85
  export declare function findTypeLookupAssembly(startingDirectory: string): TypeLookupAssembly | undefined;
86
+ /**
87
+ * Look up the jsii fqn for a given symbolId in a `TypeLookupAssembly`
88
+ *
89
+ * The symbolId as computed from the TypeScript AST is not guaranteed to
90
+ * match the symbolId recorded in the assembly: symbolIds in the assembly are
91
+ * relative to the package's source root (`rootDir`), while the symbolId
92
+ * computed by a consumer is derived from the shipped `.d.ts` files (under
93
+ * `outDir`).
94
+ *
95
+ * `symbolIdentifier()` normalizes the path if it can determine both `rootDir`
96
+ * and `outDir`, but packages that manage their own `tsconfig.json` (via
97
+ * `jsii.tsconfig`) don't have `jsii.tsc` in their `package.json`, and their
98
+ * `tsconfig.json` is typically not published to npm. In that case the computed
99
+ * symbolId comes out as (e.g.) `lib/construct:Construct` while the assembly
100
+ * records `src/construct:Construct`, and a direct map lookup misses.
101
+ *
102
+ * To compensate, if the direct lookup fails we try to reconstruct the source
103
+ * path ourselves:
104
+ *
105
+ * - If the assembly records the `outDir` in its metadata (`tscOutDir`, written
106
+ * by newer jsii compilers, symmetric with `tscRootDir`), we re-root the path
107
+ * exactly.
108
+ * - Otherwise (e.g. `constructs@10.8.0`), we only know the `rootDir`, so we
109
+ * progressively strip leading path segments (candidate `outDir`s) from the
110
+ * computed symbolId, prepend the `rootDir`, and accept the first candidate
111
+ * that matches a symbolId recorded in the assembly.
112
+ */
113
+ export declare function resolveSymbolIdFqn(lookup: TypeLookupAssembly, symbolId: string): string | undefined;
114
+ /**
115
+ * Warn (once per unique occurrence) that a symbolId could not be resolved against an assembly
116
+ *
117
+ * If we get here, the type demonstrably lives in a package with a jsii
118
+ * assembly, so we *should* have been able to resolve it. Failing to do so
119
+ * means the translation will silently fall back to guessing target names,
120
+ * which may well be wrong. Make that failure visible.
121
+ */
122
+ export declare function reportUnresolvedSymbolId(lookup: TypeLookupAssembly, symbolId: string): void;
86
123
  /**
87
124
  * Find the jsii [sub]module that contains the given FQN
88
125
  *
@@ -8,6 +8,8 @@ exports.compressedTabletExists = compressedTabletExists;
8
8
  exports.allSnippetSources = allSnippetSources;
9
9
  exports.allTypeScriptSnippets = allTypeScriptSnippets;
10
10
  exports.findTypeLookupAssembly = findTypeLookupAssembly;
11
+ exports.resolveSymbolIdFqn = resolveSymbolIdFqn;
12
+ exports.reportUnresolvedSymbolId = reportUnresolvedSymbolId;
11
13
  exports.findContainingSubmodule = findContainingSubmodule;
12
14
  const node_fs_1 = require("node:fs");
13
15
  const fs = require("node:fs");
@@ -15,6 +17,7 @@ const path = require("node:path");
15
17
  const spec_1 = require("@jsii/spec");
16
18
  const spec = require("@jsii/spec");
17
19
  const fixtures_1 = require("../fixtures");
20
+ const logging = require("../logging");
18
21
  const extract_snippets_1 = require("../markdown/extract-snippets");
19
22
  const snippet_1 = require("../snippet");
20
23
  const snippet_dependencies_1 = require("../snippet-dependencies");
@@ -235,6 +238,97 @@ function loadLookupAssembly(directory) {
235
238
  return undefined;
236
239
  }
237
240
  }
241
+ /**
242
+ * Look up the jsii fqn for a given symbolId in a `TypeLookupAssembly`
243
+ *
244
+ * The symbolId as computed from the TypeScript AST is not guaranteed to
245
+ * match the symbolId recorded in the assembly: symbolIds in the assembly are
246
+ * relative to the package's source root (`rootDir`), while the symbolId
247
+ * computed by a consumer is derived from the shipped `.d.ts` files (under
248
+ * `outDir`).
249
+ *
250
+ * `symbolIdentifier()` normalizes the path if it can determine both `rootDir`
251
+ * and `outDir`, but packages that manage their own `tsconfig.json` (via
252
+ * `jsii.tsconfig`) don't have `jsii.tsc` in their `package.json`, and their
253
+ * `tsconfig.json` is typically not published to npm. In that case the computed
254
+ * symbolId comes out as (e.g.) `lib/construct:Construct` while the assembly
255
+ * records `src/construct:Construct`, and a direct map lookup misses.
256
+ *
257
+ * To compensate, if the direct lookup fails we try to reconstruct the source
258
+ * path ourselves:
259
+ *
260
+ * - If the assembly records the `outDir` in its metadata (`tscOutDir`, written
261
+ * by newer jsii compilers, symmetric with `tscRootDir`), we re-root the path
262
+ * exactly.
263
+ * - Otherwise (e.g. `constructs@10.8.0`), we only know the `rootDir`, so we
264
+ * progressively strip leading path segments (candidate `outDir`s) from the
265
+ * computed symbolId, prepend the `rootDir`, and accept the first candidate
266
+ * that matches a symbolId recorded in the assembly.
267
+ */
268
+ function resolveSymbolIdFqn(lookup, symbolId) {
269
+ const direct = lookup.symbolIdMap[symbolId];
270
+ if (direct !== undefined) {
271
+ return direct;
272
+ }
273
+ const metadata = lookup.assembly.metadata;
274
+ const tsc = lookup.packageJson.jsii?.tsc;
275
+ const rootDir = splitPrefix(tsc?.rootDir ?? metadata?.tscRootDir);
276
+ if (rootDir === undefined) {
277
+ return undefined;
278
+ }
279
+ const parts = symbolId.split(':');
280
+ if (parts.length !== 2) {
281
+ return undefined;
282
+ }
283
+ const [fileName, typeName] = parts;
284
+ const segments = fileName.split('/');
285
+ const outDir = splitPrefix(tsc?.outDir ?? metadata?.tscOutDir);
286
+ if (outDir !== undefined) {
287
+ // We know the exact outDir: re-root the path and do a single lookup
288
+ if (!outDir.every((seg, i) => segments[i] === seg)) {
289
+ return undefined;
290
+ }
291
+ return lookup.symbolIdMap[`${[...rootDir, ...segments.slice(outDir.length)].join('/')}:${typeName}`];
292
+ }
293
+ // The outDir is unknown: try candidate outDirs of increasing depth
294
+ for (let strip = 0; strip <= segments.length - 1; strip++) {
295
+ const found = lookup.symbolIdMap[`${[...rootDir, ...segments.slice(strip)].join('/')}:${typeName}`];
296
+ if (found !== undefined) {
297
+ return found;
298
+ }
299
+ }
300
+ return undefined;
301
+ }
302
+ /**
303
+ * Split a relative directory prefix into segments, treating '', '.' and undefined appropriately
304
+ */
305
+ function splitPrefix(dir) {
306
+ if (dir === undefined) {
307
+ return undefined;
308
+ }
309
+ return dir.split('/').filter((seg) => seg !== '' && seg !== '.');
310
+ }
311
+ /**
312
+ * Symbol ids we have already warned about, so we only warn once per unique failure
313
+ */
314
+ const REPORTED_UNRESOLVED_SYMBOL_IDS = new Set();
315
+ /**
316
+ * Warn (once per unique occurrence) that a symbolId could not be resolved against an assembly
317
+ *
318
+ * If we get here, the type demonstrably lives in a package with a jsii
319
+ * assembly, so we *should* have been able to resolve it. Failing to do so
320
+ * means the translation will silently fall back to guessing target names,
321
+ * which may well be wrong. Make that failure visible.
322
+ */
323
+ function reportUnresolvedSymbolId(lookup, symbolId) {
324
+ const key = `${lookup.assembly.name}:${symbolId}`;
325
+ if (REPORTED_UNRESOLVED_SYMBOL_IDS.has(key)) {
326
+ return;
327
+ }
328
+ REPORTED_UNRESOLVED_SYMBOL_IDS.add(key);
329
+ logging.warn(`Could not resolve symbol id ${JSON.stringify(symbolId)} against the assembly of ${JSON.stringify(lookup.assembly.name)}. Target language names for this symbol will be guessed and may be incorrect. ` +
330
+ `To fix this, rebuild ${JSON.stringify(lookup.assembly.name)} with an up-to-date jsii compiler, or report the issue to the library maintainers.`);
331
+ }
238
332
  function findPackageJsonLocation(currentPath) {
239
333
  // eslint-disable-next-line no-constant-condition
240
334
  while (true) {
@@ -1 +1 @@
1
- {"version":3,"file":"assemblies.js","sourceRoot":"","sources":["../../src/jsii/assemblies.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fsPromises } from 'node:fs';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadAssemblyFromFile, loadAssemblyFromPath, findAssemblyFile } from '@jsii/spec';\nimport * as spec from '@jsii/spec';\nimport { fixturize } from '../fixtures';\nimport { extractTypescriptSnippetsFromMarkdown } from '../markdown/extract-snippets';\nimport {\n TypeScriptSnippet,\n updateParameters,\n SnippetParameters,\n ApiLocation,\n parseMetadataLine,\n CompilationDependency,\n INITIALIZER_METHOD_NAME,\n typeScriptSnippetFromVisibleSource,\n} from '../snippet';\nimport { resolveDependenciesFromPackageJson } from '../snippet-dependencies';\nimport { enforcesStrictMode } from '../strict';\nimport { LanguageTablet, DEFAULT_TABLET_NAME, DEFAULT_TABLET_NAME_COMPRESSED } from '../tablets/tablets';\nimport { fmap, mkDict, pathExists, sortBy } from '../util';\n\n/**\n * The Assembly features jsii-rosetta supports\n *\n * In actual fact, Rosetta doesn't do much with the Assembly, just crawl all\n * API documentations, so basically most new features would be supported... but\n * we technically should advertise a known list here anyway since we don't\n * know what future extension are going to be.\n */\nexport const SUPPORTED_ASSEMBLY_FEATURES: spec.JsiiFeature[] = ['intersection-types', 'class-covariant-overrides'];\n\n/**\n * The JSDoc tag users can use to associate non-visible metadata with an example\n *\n * In a Markdown section, metadata goes after the code block fence, where it will\n * be attached to the example but invisible.\n *\n * ```ts metadata=goes here\n *\n * But in doc comments, '@example' already delineates the example, and any metadata\n * in there added by the '///' tags becomes part of the visible code (there is no\n * place to put hidden information).\n *\n * We introduce the '@exampleMetadata' tag to put that additional information.\n */\nexport const EXAMPLE_METADATA_JSDOCTAG = 'exampleMetadata';\n\ninterface RosettaPackageJson extends spec.PackageJson {\n readonly jsiiRosetta?: {\n readonly strict?: boolean;\n readonly exampleDependencies?: Record<string, string>;\n };\n}\n\nexport interface LoadedAssembly {\n readonly assembly: spec.Assembly;\n readonly directory: string;\n readonly packageJson?: RosettaPackageJson;\n}\n\n/**\n * Load assemblies by filename or directory\n */\nexport function loadAssemblies(\n assemblyLocations: readonly string[],\n validateAssemblies: boolean,\n): readonly LoadedAssembly[] {\n return assemblyLocations.map(loadAssembly);\n\n function loadAssembly(location: string): LoadedAssembly {\n const stat = fs.statSync(location);\n if (stat.isDirectory()) {\n return loadAssembly(findAssemblyFile(location));\n }\n\n const directory = path.dirname(location);\n const pjLocation = path.join(directory, 'package.json');\n\n const assembly = loadAssemblyFromFile(location, validateAssemblies, SUPPORTED_ASSEMBLY_FEATURES);\n const packageJson = fs.existsSync(pjLocation) ? JSON.parse(fs.readFileSync(pjLocation, 'utf-8')) : undefined;\n\n return { assembly, directory, packageJson };\n }\n}\n\n/**\n * Load the default tablets for every assembly, if available\n *\n * Returns a map of { directory -> tablet }.\n */\nexport async function loadAllDefaultTablets(asms: readonly LoadedAssembly[]): Promise<Record<string, LanguageTablet>> {\n return mkDict(\n await Promise.all(\n asms.map(\n async (a) => [a.directory, await LanguageTablet.fromOptionalFile(guessTabletLocation(a.directory))] as const,\n ),\n ),\n );\n}\n\n/**\n * Returns the location of the tablet file, either .jsii.tabl.json or .jsii.tabl.json.gz.\n * Assumes that a tablet exists in the directory and if not, the ensuing behavior is\n * handled by the caller of this function.\n */\nexport function guessTabletLocation(directory: string) {\n return compressedTabletExists(directory)\n ? path.join(directory, DEFAULT_TABLET_NAME_COMPRESSED)\n : path.join(directory, DEFAULT_TABLET_NAME);\n}\n\nexport function compressedTabletExists(directory: string) {\n return fs.existsSync(path.join(directory, DEFAULT_TABLET_NAME_COMPRESSED));\n}\n\nexport type AssemblySnippetSource =\n | { type: 'markdown'; markdown: string; location: ApiLocation }\n | { type: 'example'; source: string; metadata?: { [key: string]: string }; location: ApiLocation };\n\n/**\n * Return all markdown and example snippets from the given assembly\n */\nexport function allSnippetSources(assembly: spec.Assembly): AssemblySnippetSource[] {\n const ret: AssemblySnippetSource[] = [];\n\n if (assembly.readme) {\n ret.push({\n type: 'markdown',\n markdown: assembly.readme.markdown,\n location: { api: 'moduleReadme', moduleFqn: assembly.name },\n });\n }\n\n for (const [submoduleFqn, submodule] of Object.entries(assembly.submodules ?? {})) {\n if (submodule.readme) {\n ret.push({\n type: 'markdown',\n markdown: submodule.readme.markdown,\n location: { api: 'moduleReadme', moduleFqn: submoduleFqn },\n });\n }\n }\n\n if (assembly.types) {\n for (const type of Object.values(assembly.types)) {\n emitDocs(type.docs, { api: 'type', fqn: type.fqn });\n\n if (spec.isEnumType(type)) {\n for (const m of type.members) emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });\n }\n if (spec.isClassType(type)) {\n emitDocsForCallable(type.initializer, type.fqn);\n }\n if (spec.isClassOrInterfaceType(type)) {\n for (const m of type.methods ?? []) emitDocsForCallable(m, type.fqn, m.name);\n for (const m of type.properties ?? []) emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });\n }\n }\n }\n\n return ret;\n\n function emitDocsForCallable(callable: spec.Callable | undefined, fqn: string, memberName?: string) {\n if (!callable) {\n return;\n }\n emitDocs(callable.docs, memberName ? { api: 'member', fqn, memberName } : { api: 'initializer', fqn });\n\n for (const parameter of callable.parameters ?? []) {\n emitDocs(parameter.docs, {\n api: 'parameter',\n fqn: fqn,\n methodName: memberName ?? INITIALIZER_METHOD_NAME,\n parameterName: parameter.name,\n });\n }\n }\n\n function emitDocs(docs: spec.Docs | undefined, location: ApiLocation) {\n if (!docs) {\n return;\n }\n\n if (docs.remarks) {\n ret.push({\n type: 'markdown',\n markdown: docs.remarks,\n location,\n });\n }\n if (docs.example) {\n ret.push({\n type: 'example',\n source: docs.example,\n metadata: fmap(docs.custom?.[EXAMPLE_METADATA_JSDOCTAG], parseMetadataLine),\n location,\n });\n }\n }\n}\n\nexport async function allTypeScriptSnippets(\n assemblies: readonly LoadedAssembly[],\n loose = false,\n): Promise<TypeScriptSnippet[]> {\n const sources = assemblies\n .flatMap((loaded) => allSnippetSources(loaded.assembly).map((source) => ({ source, loaded })))\n .flatMap(({ source, loaded }) => {\n switch (source.type) {\n case 'example':\n return [\n {\n snippet: updateParameters(\n typeScriptSnippetFromVisibleSource(\n source.source,\n { api: source.location, field: { field: 'example' } },\n isStrict(loaded),\n ),\n source.metadata ?? {},\n ),\n loaded,\n },\n ];\n case 'markdown':\n return extractTypescriptSnippetsFromMarkdown(source.markdown, source.location, isStrict(loaded)).map(\n (snippet) => ({ snippet, loaded }),\n );\n }\n });\n\n const fixtures = [];\n for (let { snippet, loaded } of sources) {\n const isInfused = snippet.parameters?.infused != null;\n\n // Ignore fixturization errors if requested on this command, or if the snippet was infused\n const ignoreFixtureErrors = loose || isInfused;\n\n // Also if the snippet was infused: switch off 'strict' mode if it was set\n if (isInfused) {\n snippet = { ...snippet, strict: false };\n }\n\n snippet = await withDependencies(loaded, withProjectDirectory(loaded.directory, snippet));\n fixtures.push(fixturize(snippet, ignoreFixtureErrors));\n }\n\n return fixtures;\n}\n\nexport interface TypeLookupAssembly {\n readonly packageJson: any;\n readonly assembly: spec.Assembly;\n readonly directory: string;\n readonly symbolIdMap: Record<string, string>;\n}\n\nconst MAX_ASM_CACHE = 3;\nconst ASM_CACHE: TypeLookupAssembly[] = [];\n\n/**\n * Recursively searches for a .jsii file in the directory.\n * When file is found, checks cache to see if we already\n * stored the assembly in memory. If not, we synchronously\n * load the assembly into memory.\n */\nexport function findTypeLookupAssembly(startingDirectory: string): TypeLookupAssembly | undefined {\n const pjLocation = findPackageJsonLocation(path.resolve(startingDirectory));\n if (!pjLocation) {\n return undefined;\n }\n const directory = path.dirname(pjLocation);\n\n const fromCache = ASM_CACHE.find((c) => c.directory === directory);\n if (fromCache) {\n return fromCache;\n }\n\n const loaded = loadLookupAssembly(directory);\n if (!loaded) {\n return undefined;\n }\n\n while (ASM_CACHE.length >= MAX_ASM_CACHE) {\n ASM_CACHE.pop();\n }\n ASM_CACHE.unshift(loaded);\n return loaded;\n}\n\nfunction loadLookupAssembly(directory: string): TypeLookupAssembly | undefined {\n try {\n const packageJson = JSON.parse(fs.readFileSync(path.join(directory, 'package.json'), 'utf-8'));\n const assembly: spec.Assembly = loadAssemblyFromPath(directory, false, SUPPORTED_ASSEMBLY_FEATURES);\n const symbolIdMap = mkDict([\n ...Object.values(assembly.types ?? {}).map((type) => [type.symbolId ?? '', type.fqn] as const),\n ...Object.entries(assembly.submodules ?? {}).map(([fqn, mod]) => [mod.symbolId ?? '', fqn] as const),\n ]);\n\n return {\n packageJson,\n assembly,\n directory,\n symbolIdMap,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction findPackageJsonLocation(currentPath: string): string | undefined {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const candidate = path.join(currentPath, 'package.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n\n const parentPath = path.resolve(currentPath, '..');\n if (parentPath === currentPath) {\n return undefined;\n }\n currentPath = parentPath;\n }\n}\n\n/**\n * Find the jsii [sub]module that contains the given FQN\n *\n * @returns `undefined` if the type is a member of the assembly root.\n */\nexport function findContainingSubmodule(assembly: spec.Assembly, fqn: string): string | undefined {\n const submoduleNames = Object.keys(assembly.submodules ?? {});\n sortBy(submoduleNames, (s) => [-s.length]); // Longest first\n for (const s of submoduleNames) {\n if (fqn.startsWith(`${s}.`)) {\n return s;\n }\n }\n return undefined;\n}\n\nfunction withProjectDirectory(dir: string, snippet: TypeScriptSnippet) {\n return updateParameters(snippet, {\n [SnippetParameters.$PROJECT_DIRECTORY]: dir,\n });\n}\n\n/**\n * Return a TypeScript snippet with dependencies added\n *\n * The dependencies will be taken from the package.json, and will consist of:\n *\n * - The package itself\n * - The package's dependencies and peerDependencies (but NOT devDependencies). Will\n * symlink to the files on disk.\n * - Any additional dependencies declared in `jsiiRosetta.exampleDependencies`.\n */\nasync function withDependencies(asm: LoadedAssembly, snippet: TypeScriptSnippet): Promise<TypeScriptSnippet> {\n const compilationDependencies: Record<string, CompilationDependency> = {};\n\n if (await pathExists(path.join(asm.directory, 'package.json'))) {\n compilationDependencies[asm.assembly.name] = {\n type: 'concrete',\n resolvedDirectory: await fsPromises.realpath(asm.directory),\n };\n }\n\n Object.assign(compilationDependencies, await resolveDependenciesFromPackageJson(asm.packageJson, asm.directory));\n\n Object.assign(\n compilationDependencies,\n mkDict(\n Object.entries(asm.packageJson?.jsiiRosetta?.exampleDependencies ?? {}).map(\n ([name, versionRange]) => [name, { type: 'symbolic', versionRange }] as const,\n ),\n ),\n );\n\n return {\n ...snippet,\n compilationDependencies,\n };\n}\n\n/**\n * Whether samples in the assembly should be treated as strict\n *\n * True if the strict flag is found in the package.json (modern) or the assembly itself (legacy).\n */\nfunction isStrict(loaded: LoadedAssembly) {\n return loaded.packageJson?.jsiiRosetta?.strict ?? enforcesStrictMode(loaded.assembly);\n}\n"]}
1
+ {"version":3,"file":"assemblies.js","sourceRoot":"","sources":["../../src/jsii/assemblies.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fsPromises } from 'node:fs';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { loadAssemblyFromFile, loadAssemblyFromPath, findAssemblyFile } from '@jsii/spec';\nimport * as spec from '@jsii/spec';\nimport { fixturize } from '../fixtures';\nimport * as logging from '../logging';\nimport { extractTypescriptSnippetsFromMarkdown } from '../markdown/extract-snippets';\nimport {\n TypeScriptSnippet,\n updateParameters,\n SnippetParameters,\n ApiLocation,\n parseMetadataLine,\n CompilationDependency,\n INITIALIZER_METHOD_NAME,\n typeScriptSnippetFromVisibleSource,\n} from '../snippet';\nimport { resolveDependenciesFromPackageJson } from '../snippet-dependencies';\nimport { enforcesStrictMode } from '../strict';\nimport { LanguageTablet, DEFAULT_TABLET_NAME, DEFAULT_TABLET_NAME_COMPRESSED } from '../tablets/tablets';\nimport { fmap, mkDict, pathExists, sortBy } from '../util';\n\n/**\n * The Assembly features jsii-rosetta supports\n *\n * In actual fact, Rosetta doesn't do much with the Assembly, just crawl all\n * API documentations, so basically most new features would be supported... but\n * we technically should advertise a known list here anyway since we don't\n * know what future extension are going to be.\n */\nexport const SUPPORTED_ASSEMBLY_FEATURES: spec.JsiiFeature[] = ['intersection-types', 'class-covariant-overrides'];\n\n/**\n * The JSDoc tag users can use to associate non-visible metadata with an example\n *\n * In a Markdown section, metadata goes after the code block fence, where it will\n * be attached to the example but invisible.\n *\n * ```ts metadata=goes here\n *\n * But in doc comments, '@example' already delineates the example, and any metadata\n * in there added by the '///' tags becomes part of the visible code (there is no\n * place to put hidden information).\n *\n * We introduce the '@exampleMetadata' tag to put that additional information.\n */\nexport const EXAMPLE_METADATA_JSDOCTAG = 'exampleMetadata';\n\ninterface RosettaPackageJson extends spec.PackageJson {\n readonly jsiiRosetta?: {\n readonly strict?: boolean;\n readonly exampleDependencies?: Record<string, string>;\n };\n}\n\nexport interface LoadedAssembly {\n readonly assembly: spec.Assembly;\n readonly directory: string;\n readonly packageJson?: RosettaPackageJson;\n}\n\n/**\n * Load assemblies by filename or directory\n */\nexport function loadAssemblies(\n assemblyLocations: readonly string[],\n validateAssemblies: boolean,\n): readonly LoadedAssembly[] {\n return assemblyLocations.map(loadAssembly);\n\n function loadAssembly(location: string): LoadedAssembly {\n const stat = fs.statSync(location);\n if (stat.isDirectory()) {\n return loadAssembly(findAssemblyFile(location));\n }\n\n const directory = path.dirname(location);\n const pjLocation = path.join(directory, 'package.json');\n\n const assembly = loadAssemblyFromFile(location, validateAssemblies, SUPPORTED_ASSEMBLY_FEATURES);\n const packageJson = fs.existsSync(pjLocation) ? JSON.parse(fs.readFileSync(pjLocation, 'utf-8')) : undefined;\n\n return { assembly, directory, packageJson };\n }\n}\n\n/**\n * Load the default tablets for every assembly, if available\n *\n * Returns a map of { directory -> tablet }.\n */\nexport async function loadAllDefaultTablets(asms: readonly LoadedAssembly[]): Promise<Record<string, LanguageTablet>> {\n return mkDict(\n await Promise.all(\n asms.map(\n async (a) => [a.directory, await LanguageTablet.fromOptionalFile(guessTabletLocation(a.directory))] as const,\n ),\n ),\n );\n}\n\n/**\n * Returns the location of the tablet file, either .jsii.tabl.json or .jsii.tabl.json.gz.\n * Assumes that a tablet exists in the directory and if not, the ensuing behavior is\n * handled by the caller of this function.\n */\nexport function guessTabletLocation(directory: string) {\n return compressedTabletExists(directory)\n ? path.join(directory, DEFAULT_TABLET_NAME_COMPRESSED)\n : path.join(directory, DEFAULT_TABLET_NAME);\n}\n\nexport function compressedTabletExists(directory: string) {\n return fs.existsSync(path.join(directory, DEFAULT_TABLET_NAME_COMPRESSED));\n}\n\nexport type AssemblySnippetSource =\n | { type: 'markdown'; markdown: string; location: ApiLocation }\n | { type: 'example'; source: string; metadata?: { [key: string]: string }; location: ApiLocation };\n\n/**\n * Return all markdown and example snippets from the given assembly\n */\nexport function allSnippetSources(assembly: spec.Assembly): AssemblySnippetSource[] {\n const ret: AssemblySnippetSource[] = [];\n\n if (assembly.readme) {\n ret.push({\n type: 'markdown',\n markdown: assembly.readme.markdown,\n location: { api: 'moduleReadme', moduleFqn: assembly.name },\n });\n }\n\n for (const [submoduleFqn, submodule] of Object.entries(assembly.submodules ?? {})) {\n if (submodule.readme) {\n ret.push({\n type: 'markdown',\n markdown: submodule.readme.markdown,\n location: { api: 'moduleReadme', moduleFqn: submoduleFqn },\n });\n }\n }\n\n if (assembly.types) {\n for (const type of Object.values(assembly.types)) {\n emitDocs(type.docs, { api: 'type', fqn: type.fqn });\n\n if (spec.isEnumType(type)) {\n for (const m of type.members) emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });\n }\n if (spec.isClassType(type)) {\n emitDocsForCallable(type.initializer, type.fqn);\n }\n if (spec.isClassOrInterfaceType(type)) {\n for (const m of type.methods ?? []) emitDocsForCallable(m, type.fqn, m.name);\n for (const m of type.properties ?? []) emitDocs(m.docs, { api: 'member', fqn: type.fqn, memberName: m.name });\n }\n }\n }\n\n return ret;\n\n function emitDocsForCallable(callable: spec.Callable | undefined, fqn: string, memberName?: string) {\n if (!callable) {\n return;\n }\n emitDocs(callable.docs, memberName ? { api: 'member', fqn, memberName } : { api: 'initializer', fqn });\n\n for (const parameter of callable.parameters ?? []) {\n emitDocs(parameter.docs, {\n api: 'parameter',\n fqn: fqn,\n methodName: memberName ?? INITIALIZER_METHOD_NAME,\n parameterName: parameter.name,\n });\n }\n }\n\n function emitDocs(docs: spec.Docs | undefined, location: ApiLocation) {\n if (!docs) {\n return;\n }\n\n if (docs.remarks) {\n ret.push({\n type: 'markdown',\n markdown: docs.remarks,\n location,\n });\n }\n if (docs.example) {\n ret.push({\n type: 'example',\n source: docs.example,\n metadata: fmap(docs.custom?.[EXAMPLE_METADATA_JSDOCTAG], parseMetadataLine),\n location,\n });\n }\n }\n}\n\nexport async function allTypeScriptSnippets(\n assemblies: readonly LoadedAssembly[],\n loose = false,\n): Promise<TypeScriptSnippet[]> {\n const sources = assemblies\n .flatMap((loaded) => allSnippetSources(loaded.assembly).map((source) => ({ source, loaded })))\n .flatMap(({ source, loaded }) => {\n switch (source.type) {\n case 'example':\n return [\n {\n snippet: updateParameters(\n typeScriptSnippetFromVisibleSource(\n source.source,\n { api: source.location, field: { field: 'example' } },\n isStrict(loaded),\n ),\n source.metadata ?? {},\n ),\n loaded,\n },\n ];\n case 'markdown':\n return extractTypescriptSnippetsFromMarkdown(source.markdown, source.location, isStrict(loaded)).map(\n (snippet) => ({ snippet, loaded }),\n );\n }\n });\n\n const fixtures = [];\n for (let { snippet, loaded } of sources) {\n const isInfused = snippet.parameters?.infused != null;\n\n // Ignore fixturization errors if requested on this command, or if the snippet was infused\n const ignoreFixtureErrors = loose || isInfused;\n\n // Also if the snippet was infused: switch off 'strict' mode if it was set\n if (isInfused) {\n snippet = { ...snippet, strict: false };\n }\n\n snippet = await withDependencies(loaded, withProjectDirectory(loaded.directory, snippet));\n fixtures.push(fixturize(snippet, ignoreFixtureErrors));\n }\n\n return fixtures;\n}\n\nexport interface TypeLookupAssembly {\n readonly packageJson: any;\n readonly assembly: spec.Assembly;\n readonly directory: string;\n readonly symbolIdMap: Record<string, string>;\n}\n\nconst MAX_ASM_CACHE = 3;\nconst ASM_CACHE: TypeLookupAssembly[] = [];\n\n/**\n * Recursively searches for a .jsii file in the directory.\n * When file is found, checks cache to see if we already\n * stored the assembly in memory. If not, we synchronously\n * load the assembly into memory.\n */\nexport function findTypeLookupAssembly(startingDirectory: string): TypeLookupAssembly | undefined {\n const pjLocation = findPackageJsonLocation(path.resolve(startingDirectory));\n if (!pjLocation) {\n return undefined;\n }\n const directory = path.dirname(pjLocation);\n\n const fromCache = ASM_CACHE.find((c) => c.directory === directory);\n if (fromCache) {\n return fromCache;\n }\n\n const loaded = loadLookupAssembly(directory);\n if (!loaded) {\n return undefined;\n }\n\n while (ASM_CACHE.length >= MAX_ASM_CACHE) {\n ASM_CACHE.pop();\n }\n ASM_CACHE.unshift(loaded);\n return loaded;\n}\n\nfunction loadLookupAssembly(directory: string): TypeLookupAssembly | undefined {\n try {\n const packageJson = JSON.parse(fs.readFileSync(path.join(directory, 'package.json'), 'utf-8'));\n const assembly: spec.Assembly = loadAssemblyFromPath(directory, false, SUPPORTED_ASSEMBLY_FEATURES);\n const symbolIdMap = mkDict([\n ...Object.values(assembly.types ?? {}).map((type) => [type.symbolId ?? '', type.fqn] as const),\n ...Object.entries(assembly.submodules ?? {}).map(([fqn, mod]) => [mod.symbolId ?? '', fqn] as const),\n ]);\n\n return {\n packageJson,\n assembly,\n directory,\n symbolIdMap,\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Look up the jsii fqn for a given symbolId in a `TypeLookupAssembly`\n *\n * The symbolId as computed from the TypeScript AST is not guaranteed to\n * match the symbolId recorded in the assembly: symbolIds in the assembly are\n * relative to the package's source root (`rootDir`), while the symbolId\n * computed by a consumer is derived from the shipped `.d.ts` files (under\n * `outDir`).\n *\n * `symbolIdentifier()` normalizes the path if it can determine both `rootDir`\n * and `outDir`, but packages that manage their own `tsconfig.json` (via\n * `jsii.tsconfig`) don't have `jsii.tsc` in their `package.json`, and their\n * `tsconfig.json` is typically not published to npm. In that case the computed\n * symbolId comes out as (e.g.) `lib/construct:Construct` while the assembly\n * records `src/construct:Construct`, and a direct map lookup misses.\n *\n * To compensate, if the direct lookup fails we try to reconstruct the source\n * path ourselves:\n *\n * - If the assembly records the `outDir` in its metadata (`tscOutDir`, written\n * by newer jsii compilers, symmetric with `tscRootDir`), we re-root the path\n * exactly.\n * - Otherwise (e.g. `constructs@10.8.0`), we only know the `rootDir`, so we\n * progressively strip leading path segments (candidate `outDir`s) from the\n * computed symbolId, prepend the `rootDir`, and accept the first candidate\n * that matches a symbolId recorded in the assembly.\n */\nexport function resolveSymbolIdFqn(lookup: TypeLookupAssembly, symbolId: string): string | undefined {\n const direct = lookup.symbolIdMap[symbolId];\n if (direct !== undefined) {\n return direct;\n }\n\n const metadata = lookup.assembly.metadata as { tscRootDir?: string; tscOutDir?: string } | undefined;\n const tsc = lookup.packageJson.jsii?.tsc;\n const rootDir = splitPrefix(tsc?.rootDir ?? metadata?.tscRootDir);\n if (rootDir === undefined) {\n return undefined;\n }\n\n const parts = symbolId.split(':');\n if (parts.length !== 2) {\n return undefined;\n }\n const [fileName, typeName] = parts;\n const segments = fileName.split('/');\n\n const outDir = splitPrefix(tsc?.outDir ?? metadata?.tscOutDir);\n if (outDir !== undefined) {\n // We know the exact outDir: re-root the path and do a single lookup\n if (!outDir.every((seg, i) => segments[i] === seg)) {\n return undefined;\n }\n return lookup.symbolIdMap[`${[...rootDir, ...segments.slice(outDir.length)].join('/')}:${typeName}`];\n }\n\n // The outDir is unknown: try candidate outDirs of increasing depth\n for (let strip = 0; strip <= segments.length - 1; strip++) {\n const found = lookup.symbolIdMap[`${[...rootDir, ...segments.slice(strip)].join('/')}:${typeName}`];\n if (found !== undefined) {\n return found;\n }\n }\n return undefined;\n}\n\n/**\n * Split a relative directory prefix into segments, treating '', '.' and undefined appropriately\n */\nfunction splitPrefix(dir: string | undefined): string[] | undefined {\n if (dir === undefined) {\n return undefined;\n }\n return dir.split('/').filter((seg) => seg !== '' && seg !== '.');\n}\n\n/**\n * Symbol ids we have already warned about, so we only warn once per unique failure\n */\nconst REPORTED_UNRESOLVED_SYMBOL_IDS = new Set<string>();\n\n/**\n * Warn (once per unique occurrence) that a symbolId could not be resolved against an assembly\n *\n * If we get here, the type demonstrably lives in a package with a jsii\n * assembly, so we *should* have been able to resolve it. Failing to do so\n * means the translation will silently fall back to guessing target names,\n * which may well be wrong. Make that failure visible.\n */\nexport function reportUnresolvedSymbolId(lookup: TypeLookupAssembly, symbolId: string) {\n const key = `${lookup.assembly.name}:${symbolId}`;\n if (REPORTED_UNRESOLVED_SYMBOL_IDS.has(key)) {\n return;\n }\n REPORTED_UNRESOLVED_SYMBOL_IDS.add(key);\n logging.warn(\n `Could not resolve symbol id ${JSON.stringify(symbolId)} against the assembly of ${JSON.stringify(\n lookup.assembly.name,\n )}. Target language names for this symbol will be guessed and may be incorrect. ` +\n `To fix this, rebuild ${JSON.stringify(\n lookup.assembly.name,\n )} with an up-to-date jsii compiler, or report the issue to the library maintainers.`,\n );\n}\n\nfunction findPackageJsonLocation(currentPath: string): string | undefined {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const candidate = path.join(currentPath, 'package.json');\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n\n const parentPath = path.resolve(currentPath, '..');\n if (parentPath === currentPath) {\n return undefined;\n }\n currentPath = parentPath;\n }\n}\n\n/**\n * Find the jsii [sub]module that contains the given FQN\n *\n * @returns `undefined` if the type is a member of the assembly root.\n */\nexport function findContainingSubmodule(assembly: spec.Assembly, fqn: string): string | undefined {\n const submoduleNames = Object.keys(assembly.submodules ?? {});\n sortBy(submoduleNames, (s) => [-s.length]); // Longest first\n for (const s of submoduleNames) {\n if (fqn.startsWith(`${s}.`)) {\n return s;\n }\n }\n return undefined;\n}\n\nfunction withProjectDirectory(dir: string, snippet: TypeScriptSnippet) {\n return updateParameters(snippet, {\n [SnippetParameters.$PROJECT_DIRECTORY]: dir,\n });\n}\n\n/**\n * Return a TypeScript snippet with dependencies added\n *\n * The dependencies will be taken from the package.json, and will consist of:\n *\n * - The package itself\n * - The package's dependencies and peerDependencies (but NOT devDependencies). Will\n * symlink to the files on disk.\n * - Any additional dependencies declared in `jsiiRosetta.exampleDependencies`.\n */\nasync function withDependencies(asm: LoadedAssembly, snippet: TypeScriptSnippet): Promise<TypeScriptSnippet> {\n const compilationDependencies: Record<string, CompilationDependency> = {};\n\n if (await pathExists(path.join(asm.directory, 'package.json'))) {\n compilationDependencies[asm.assembly.name] = {\n type: 'concrete',\n resolvedDirectory: await fsPromises.realpath(asm.directory),\n };\n }\n\n Object.assign(compilationDependencies, await resolveDependenciesFromPackageJson(asm.packageJson, asm.directory));\n\n Object.assign(\n compilationDependencies,\n mkDict(\n Object.entries(asm.packageJson?.jsiiRosetta?.exampleDependencies ?? {}).map(\n ([name, versionRange]) => [name, { type: 'symbolic', versionRange }] as const,\n ),\n ),\n );\n\n return {\n ...snippet,\n compilationDependencies,\n };\n}\n\n/**\n * Whether samples in the assembly should be treated as strict\n *\n * True if the strict flag is found in the package.json (modern) or the assembly itself (legacy).\n */\nfunction isStrict(loaded: LoadedAssembly) {\n return loaded.packageJson?.jsiiRosetta?.strict ?? enforcesStrictMode(loaded.assembly);\n}\n"]}
@@ -160,7 +160,7 @@ function lookupJsiiSymbol(typeChecker, sym) {
160
160
  // This is a module.
161
161
  const sourceAssembly = (0, assemblies_1.findTypeLookupAssembly)(decl.fileName);
162
162
  return (0, util_1.fmap)(sourceAssembly, (asm) => ({
163
- fqn: (0, util_1.fmap)((0, common_1.symbolIdentifier)(typeChecker, sym, (0, util_1.fmap)(sourceAssembly, (sa) => ({ assembly: sa.assembly }))), (symbolId) => sourceAssembly?.symbolIdMap[symbolId]) ?? sourceAssembly?.assembly.name,
163
+ fqn: (0, util_1.fmap)((0, common_1.symbolIdentifier)(typeChecker, sym, (0, util_1.fmap)(sourceAssembly, (sa) => ({ assembly: sa.assembly }))), (symbolId) => (0, util_1.fmap)(sourceAssembly, (sa) => (0, assemblies_1.resolveSymbolIdFqn)(sa, symbolId))) ?? sourceAssembly?.assembly.name,
164
164
  sourceAssembly: asm,
165
165
  symbolType: 'module',
166
166
  }));
@@ -183,14 +183,23 @@ function lookupJsiiSymbol(typeChecker, sym) {
183
183
  return undefined;
184
184
  }
185
185
  return (0, util_1.fmap)(/([^#]*)(#.*)?/.exec(symbolId), ([, typeSymbolId, memberFragment]) => {
186
+ const fqn = (0, util_1.fmap)(sourceAssembly, (sa) => (0, assemblies_1.resolveSymbolIdFqn)(sa, typeSymbolId));
187
+ if (fqn === undefined) {
188
+ // The symbol lives in a package that demonstrably has a jsii assembly,
189
+ // yet we cannot resolve it. Warn user about guessed target names.
190
+ if (sourceAssembly) {
191
+ (0, assemblies_1.reportUnresolvedSymbolId)(sourceAssembly, typeSymbolId);
192
+ }
193
+ return undefined;
194
+ }
186
195
  if (memberFragment) {
187
- return (0, util_1.fmap)(sourceAssembly?.symbolIdMap[typeSymbolId], (fqn) => ({
196
+ return {
188
197
  fqn: `${fqn}${memberFragment}`,
189
198
  sourceAssembly,
190
199
  symbolType: 'member',
191
- }));
200
+ };
192
201
  }
193
- return (0, util_1.fmap)(sourceAssembly?.symbolIdMap[typeSymbolId], (fqn) => ({ fqn, sourceAssembly, symbolType: 'type' }));
202
+ return { fqn, sourceAssembly, symbolType: 'type' };
194
203
  });
195
204
  }
196
205
  function isDeclaration(x) {
@@ -1 +1 @@
1
- {"version":3,"file":"jsii-utils.js","sourceRoot":"","sources":["../../src/jsii/jsii-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as spec from '@jsii/spec';\nimport { symbolIdentifier } from 'jsii/common';\nimport * as ts from 'typescript';\n\nimport { findTypeLookupAssembly, TypeLookupAssembly } from './assemblies';\nimport { ObjectLiteralStruct } from './jsii-types';\nimport { AstRenderer } from '../renderer';\nimport { typeContainsUndefined } from '../typescript/types';\nimport { fmap } from '../util';\n\nexport function isNamedLikeStruct(name: string) {\n // Start with an I and another uppercase character\n return !/^I[A-Z]/.test(name);\n}\n\nexport function analyzeStructType(typeChecker: ts.TypeChecker, type: ts.Type): ObjectLiteralStruct | false {\n if (\n !type.isClassOrInterface() ||\n !hasAllFlags(type.objectFlags, ts.ObjectFlags.Interface) ||\n !isNamedLikeStruct(type.symbol.name)\n ) {\n return false;\n }\n\n const jsiiSym = lookupJsiiSymbol(typeChecker, type.symbol);\n if (jsiiSym) {\n return { kind: 'struct', type, jsiiSym };\n }\n\n return { kind: 'local-struct', type };\n}\n\n/**\n * Whether the given type is a protocol AND comes from jsii\n *\n * - Protocol: a TypeScript interface that is *not* a \"struct\" type.\n * A.k.a. \"behavioral interface\".\n * - From jsii: whether the interface type is defined in and exported\n * via a jsii assembly. There can be literal interfaces defined\n * in an example, and they will not be mangled in the same way\n * as a jsii interface would be.\n *\n *\n * Examples:\n *\n * ```ts\n * // isJsiiProtocolType() -> false: not a protocol\n * interface Banana {\n * readonly arc: number;\n * }\n *\n * // isJsiiProtocolType() -> might be true: depends on whether it was defined\n * // in a jsii assembly.\n * interface IHello {\n * sayIt(): void;\n * }\n *\n * // isJsiiProtocolType() -> false: declared to not be a protocol, even though\n * // it has the naming scheme of one\n * /**\n * * @struct\n * * /\n * interface IPAddress {\n * readonly octets: number[];\n * }\n * ```\n */\nexport function isJsiiProtocolType(typeChecker: ts.TypeChecker, type: ts.Type): boolean | undefined {\n if (!type.isClassOrInterface() || !hasAllFlags(type.objectFlags, ts.ObjectFlags.Interface)) {\n return false;\n }\n\n const sym = lookupJsiiSymbol(typeChecker, type.symbol);\n if (!sym) {\n return false;\n }\n\n if (!sym.sourceAssembly) {\n // No source assembly, so this is a 'fake-from-jsii' type\n return !isNamedLikeStruct(type.symbol.name);\n }\n\n const jsiiType = resolveJsiiSymbolType(sym);\n return spec.isInterfaceType(jsiiType) && !jsiiType.datatype;\n}\n\nexport function hasAllFlags<A extends number>(flags: A, test: A) {\n // tslint:disable-next-line:no-bitwise\n return test !== 0 && (flags & test) === test;\n}\n\nexport function hasAnyFlag<A extends number>(flags: A, test: A) {\n // tslint:disable-next-line:no-bitwise\n return test !== 0 && (flags & test) !== 0;\n}\n\nexport interface StructProperty {\n name: string;\n type: ts.Type | undefined;\n questionMark: boolean;\n}\n\nexport function propertiesOfStruct(type: ts.Type, context: AstRenderer<any>): StructProperty[] {\n return type.isClassOrInterface()\n ? type.getProperties().map((s) => {\n let propType;\n let questionMark = false;\n\n const propSymbol = type.getProperty(s.name)!;\n const symbolDecl = propSymbol.valueDeclaration ?? propSymbol.declarations![0];\n if (ts.isPropertyDeclaration(symbolDecl) || ts.isPropertySignature(symbolDecl)) {\n questionMark = symbolDecl.questionToken !== undefined;\n propType = symbolDecl.type && context.typeOfType(symbolDecl.type);\n }\n\n return {\n name: s.name,\n type: propType,\n questionMark,\n };\n })\n : [];\n}\n\nexport function structPropertyAcceptsUndefined(prop: StructProperty): boolean {\n return prop.questionMark || (!!prop.type && typeContainsUndefined(prop.type));\n}\n\n/**\n * A TypeScript symbol resolved to its jsii type\n */\nexport interface JsiiSymbol {\n /**\n * FQN of the symbol\n *\n * Is either the FQN of a type (for a type). For a membr, the FQN looks like:\n * 'type.fqn#memberName'.\n */\n readonly fqn: string;\n\n /**\n * What kind of symbol this is\n */\n readonly symbolType: 'module' | 'type' | 'member';\n\n /**\n * Assembly where the type was found\n *\n * Might be undefined if the type was FAKE from jsii (for tests)\n */\n readonly sourceAssembly?: TypeLookupAssembly;\n}\n\nexport function lookupJsiiSymbolFromNode(typeChecker: ts.TypeChecker, node: ts.Node): JsiiSymbol | undefined {\n return fmap(typeChecker.getSymbolAtLocation(node), (s) => lookupJsiiSymbol(typeChecker, s));\n}\n\nexport function resolveJsiiSymbolType(jsiiSymbol: JsiiSymbol): spec.Type {\n if (jsiiSymbol.symbolType !== 'type') {\n throw new Error(\n `Expected symbol to refer to a 'type', got '${jsiiSymbol.fqn}' which is a '${jsiiSymbol.symbolType}'`,\n );\n }\n\n if (!jsiiSymbol.sourceAssembly) {\n throw new Error('`resolveJsiiSymbolType: requires an actual source assembly');\n }\n\n const type = jsiiSymbol.sourceAssembly?.assembly.types?.[jsiiSymbol.fqn];\n if (!type) {\n throw new Error(\n `resolveJsiiSymbolType: ${jsiiSymbol.fqn} not found in assembly ${jsiiSymbol.sourceAssembly.assembly.name}`,\n );\n }\n return type;\n}\n\n/**\n * Returns the jsii FQN for a TypeScript (class or type) symbol\n *\n * TypeScript only knows the symbol NAME plus the FILE the symbol is defined\n * in. We need to extract two things:\n *\n * 1. The package name (extracted from the nearest `package.json`)\n * 2. The submodule name (...?? don't know how to get this yet)\n * 3. Any containing type names or namespace names.\n *\n * For tests, we also treat symbols in a file that has the string '/// fake-from-jsii'\n * as coming from jsii.\n */\nexport function lookupJsiiSymbol(typeChecker: ts.TypeChecker, sym: ts.Symbol): JsiiSymbol | undefined {\n // Resolve alias, if it is one. This comes into play if the symbol refers to a module,\n // we need to resolve the alias to find the ACTUAL module.\n if (hasAnyFlag(sym.flags, ts.SymbolFlags.Alias)) {\n sym = typeChecker.getAliasedSymbol(sym);\n }\n\n const decl: ts.Node | undefined = sym.declarations?.[0];\n if (!decl) {\n return undefined;\n }\n\n if (ts.isSourceFile(decl)) {\n // This is a module.\n const sourceAssembly = findTypeLookupAssembly(decl.fileName);\n return fmap(\n sourceAssembly,\n (asm) =>\n ({\n fqn:\n fmap(\n symbolIdentifier(\n typeChecker,\n sym,\n fmap(sourceAssembly, (sa) => ({ assembly: sa.assembly })),\n ),\n (symbolId) => sourceAssembly?.symbolIdMap[symbolId],\n ) ?? sourceAssembly?.assembly.name,\n sourceAssembly: asm,\n symbolType: 'module',\n } as JsiiSymbol),\n );\n }\n\n if (!isDeclaration(decl)) {\n return undefined;\n }\n\n const declaringFile = decl.getSourceFile();\n if (/^\\/\\/\\/ fake-from-jsii/m.test(declaringFile.getFullText())) {\n return { fqn: `fake_jsii.${sym.name}`, symbolType: 'type' };\n }\n\n const declSym = getSymbolFromDeclaration(decl, typeChecker);\n if (!declSym) {\n return undefined;\n }\n\n const fileName = decl.getSourceFile().fileName;\n const sourceAssembly = findTypeLookupAssembly(fileName);\n const symbolId = symbolIdentifier(typeChecker, declSym, { assembly: sourceAssembly?.assembly });\n if (!symbolId) {\n return undefined;\n }\n\n return fmap(/([^#]*)(#.*)?/.exec(symbolId), ([, typeSymbolId, memberFragment]) => {\n if (memberFragment) {\n return fmap(sourceAssembly?.symbolIdMap[typeSymbolId], (fqn) => ({\n fqn: `${fqn}${memberFragment}`,\n sourceAssembly,\n symbolType: 'member',\n }));\n }\n\n return fmap(sourceAssembly?.symbolIdMap[typeSymbolId], (fqn) => ({ fqn, sourceAssembly, symbolType: 'type' }));\n });\n}\n\nfunction isDeclaration(x: ts.Node): x is ts.Declaration {\n return (\n ts.isClassDeclaration(x) ||\n ts.isNamespaceExportDeclaration(x) ||\n ts.isNamespaceExport(x) ||\n ts.isModuleDeclaration(x) ||\n ts.isEnumDeclaration(x) ||\n ts.isEnumMember(x) ||\n ts.isInterfaceDeclaration(x) ||\n ts.isMethodDeclaration(x) ||\n ts.isMethodSignature(x) ||\n ts.isPropertyDeclaration(x) ||\n ts.isPropertySignature(x)\n );\n}\n\n/**\n * If the given type is an enum literal, resolve to the enum type\n */\nexport function resolveEnumLiteral(typeChecker: ts.TypeChecker, type: ts.Type) {\n if (!hasAnyFlag(type.flags, ts.TypeFlags.EnumLiteral)) {\n return type;\n }\n\n return typeChecker.getBaseTypeOfLiteralType(type);\n}\n\nexport function resolvedSymbolAtLocation(typeChecker: ts.TypeChecker, node: ts.Node) {\n let symbol = typeChecker.getSymbolAtLocation(node);\n while (symbol && hasAnyFlag(symbol.flags, ts.SymbolFlags.Alias)) {\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n return symbol;\n}\n\nfunction getSymbolFromDeclaration(decl: ts.Node, typeChecker: ts.TypeChecker): ts.Symbol | undefined {\n if (!isDeclaration(decl)) {\n return undefined;\n }\n\n const name = ts.getNameOfDeclaration(decl);\n return name ? typeChecker.getSymbolAtLocation(name) : undefined;\n}\n\nexport function parentSymbol(sym: JsiiSymbol): JsiiSymbol | undefined {\n const parts = sym.fqn.split('.');\n if (parts.length === 1) {\n return undefined;\n }\n\n return {\n fqn: parts.slice(0, -1).join('.'),\n symbolType: 'module', // Might not be true, but probably good enough\n sourceAssembly: sym.sourceAssembly,\n };\n}\n\n/**\n * Get the last part of a dot-separated string\n */\nexport function simpleName(x: string) {\n return x.split('.').slice(-1)[0];\n}\n\n/**\n * Get all parts except the last of a dot-separated string\n */\nexport function namespaceName(x: string) {\n return x.split('.').slice(0, -1).join('.');\n}\n"]}
1
+ {"version":3,"file":"jsii-utils.js","sourceRoot":"","sources":["../../src/jsii/jsii-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as spec from '@jsii/spec';\nimport { symbolIdentifier } from 'jsii/common';\nimport * as ts from 'typescript';\n\nimport { findTypeLookupAssembly, reportUnresolvedSymbolId, resolveSymbolIdFqn, TypeLookupAssembly } from './assemblies';\nimport { ObjectLiteralStruct } from './jsii-types';\nimport { AstRenderer } from '../renderer';\nimport { typeContainsUndefined } from '../typescript/types';\nimport { fmap } from '../util';\n\nexport function isNamedLikeStruct(name: string) {\n // Start with an I and another uppercase character\n return !/^I[A-Z]/.test(name);\n}\n\nexport function analyzeStructType(typeChecker: ts.TypeChecker, type: ts.Type): ObjectLiteralStruct | false {\n if (\n !type.isClassOrInterface() ||\n !hasAllFlags(type.objectFlags, ts.ObjectFlags.Interface) ||\n !isNamedLikeStruct(type.symbol.name)\n ) {\n return false;\n }\n\n const jsiiSym = lookupJsiiSymbol(typeChecker, type.symbol);\n if (jsiiSym) {\n return { kind: 'struct', type, jsiiSym };\n }\n\n return { kind: 'local-struct', type };\n}\n\n/**\n * Whether the given type is a protocol AND comes from jsii\n *\n * - Protocol: a TypeScript interface that is *not* a \"struct\" type.\n * A.k.a. \"behavioral interface\".\n * - From jsii: whether the interface type is defined in and exported\n * via a jsii assembly. There can be literal interfaces defined\n * in an example, and they will not be mangled in the same way\n * as a jsii interface would be.\n *\n *\n * Examples:\n *\n * ```ts\n * // isJsiiProtocolType() -> false: not a protocol\n * interface Banana {\n * readonly arc: number;\n * }\n *\n * // isJsiiProtocolType() -> might be true: depends on whether it was defined\n * // in a jsii assembly.\n * interface IHello {\n * sayIt(): void;\n * }\n *\n * // isJsiiProtocolType() -> false: declared to not be a protocol, even though\n * // it has the naming scheme of one\n * /**\n * * @struct\n * * /\n * interface IPAddress {\n * readonly octets: number[];\n * }\n * ```\n */\nexport function isJsiiProtocolType(typeChecker: ts.TypeChecker, type: ts.Type): boolean | undefined {\n if (!type.isClassOrInterface() || !hasAllFlags(type.objectFlags, ts.ObjectFlags.Interface)) {\n return false;\n }\n\n const sym = lookupJsiiSymbol(typeChecker, type.symbol);\n if (!sym) {\n return false;\n }\n\n if (!sym.sourceAssembly) {\n // No source assembly, so this is a 'fake-from-jsii' type\n return !isNamedLikeStruct(type.symbol.name);\n }\n\n const jsiiType = resolveJsiiSymbolType(sym);\n return spec.isInterfaceType(jsiiType) && !jsiiType.datatype;\n}\n\nexport function hasAllFlags<A extends number>(flags: A, test: A) {\n // tslint:disable-next-line:no-bitwise\n return test !== 0 && (flags & test) === test;\n}\n\nexport function hasAnyFlag<A extends number>(flags: A, test: A) {\n // tslint:disable-next-line:no-bitwise\n return test !== 0 && (flags & test) !== 0;\n}\n\nexport interface StructProperty {\n name: string;\n type: ts.Type | undefined;\n questionMark: boolean;\n}\n\nexport function propertiesOfStruct(type: ts.Type, context: AstRenderer<any>): StructProperty[] {\n return type.isClassOrInterface()\n ? type.getProperties().map((s) => {\n let propType;\n let questionMark = false;\n\n const propSymbol = type.getProperty(s.name)!;\n const symbolDecl = propSymbol.valueDeclaration ?? propSymbol.declarations![0];\n if (ts.isPropertyDeclaration(symbolDecl) || ts.isPropertySignature(symbolDecl)) {\n questionMark = symbolDecl.questionToken !== undefined;\n propType = symbolDecl.type && context.typeOfType(symbolDecl.type);\n }\n\n return {\n name: s.name,\n type: propType,\n questionMark,\n };\n })\n : [];\n}\n\nexport function structPropertyAcceptsUndefined(prop: StructProperty): boolean {\n return prop.questionMark || (!!prop.type && typeContainsUndefined(prop.type));\n}\n\n/**\n * A TypeScript symbol resolved to its jsii type\n */\nexport interface JsiiSymbol {\n /**\n * FQN of the symbol\n *\n * Is either the FQN of a type (for a type). For a membr, the FQN looks like:\n * 'type.fqn#memberName'.\n */\n readonly fqn: string;\n\n /**\n * What kind of symbol this is\n */\n readonly symbolType: 'module' | 'type' | 'member';\n\n /**\n * Assembly where the type was found\n *\n * Might be undefined if the type was FAKE from jsii (for tests)\n */\n readonly sourceAssembly?: TypeLookupAssembly;\n}\n\nexport function lookupJsiiSymbolFromNode(typeChecker: ts.TypeChecker, node: ts.Node): JsiiSymbol | undefined {\n return fmap(typeChecker.getSymbolAtLocation(node), (s) => lookupJsiiSymbol(typeChecker, s));\n}\n\nexport function resolveJsiiSymbolType(jsiiSymbol: JsiiSymbol): spec.Type {\n if (jsiiSymbol.symbolType !== 'type') {\n throw new Error(\n `Expected symbol to refer to a 'type', got '${jsiiSymbol.fqn}' which is a '${jsiiSymbol.symbolType}'`,\n );\n }\n\n if (!jsiiSymbol.sourceAssembly) {\n throw new Error('`resolveJsiiSymbolType: requires an actual source assembly');\n }\n\n const type = jsiiSymbol.sourceAssembly?.assembly.types?.[jsiiSymbol.fqn];\n if (!type) {\n throw new Error(\n `resolveJsiiSymbolType: ${jsiiSymbol.fqn} not found in assembly ${jsiiSymbol.sourceAssembly.assembly.name}`,\n );\n }\n return type;\n}\n\n/**\n * Returns the jsii FQN for a TypeScript (class or type) symbol\n *\n * TypeScript only knows the symbol NAME plus the FILE the symbol is defined\n * in. We need to extract two things:\n *\n * 1. The package name (extracted from the nearest `package.json`)\n * 2. The submodule name (...?? don't know how to get this yet)\n * 3. Any containing type names or namespace names.\n *\n * For tests, we also treat symbols in a file that has the string '/// fake-from-jsii'\n * as coming from jsii.\n */\nexport function lookupJsiiSymbol(typeChecker: ts.TypeChecker, sym: ts.Symbol): JsiiSymbol | undefined {\n // Resolve alias, if it is one. This comes into play if the symbol refers to a module,\n // we need to resolve the alias to find the ACTUAL module.\n if (hasAnyFlag(sym.flags, ts.SymbolFlags.Alias)) {\n sym = typeChecker.getAliasedSymbol(sym);\n }\n\n const decl: ts.Node | undefined = sym.declarations?.[0];\n if (!decl) {\n return undefined;\n }\n\n if (ts.isSourceFile(decl)) {\n // This is a module.\n const sourceAssembly = findTypeLookupAssembly(decl.fileName);\n return fmap(\n sourceAssembly,\n (asm) =>\n ({\n fqn:\n fmap(\n symbolIdentifier(\n typeChecker,\n sym,\n fmap(sourceAssembly, (sa) => ({ assembly: sa.assembly })),\n ),\n (symbolId) => fmap(sourceAssembly, (sa) => resolveSymbolIdFqn(sa, symbolId)),\n ) ?? sourceAssembly?.assembly.name,\n sourceAssembly: asm,\n symbolType: 'module',\n } as JsiiSymbol),\n );\n }\n\n if (!isDeclaration(decl)) {\n return undefined;\n }\n\n const declaringFile = decl.getSourceFile();\n if (/^\\/\\/\\/ fake-from-jsii/m.test(declaringFile.getFullText())) {\n return { fqn: `fake_jsii.${sym.name}`, symbolType: 'type' };\n }\n\n const declSym = getSymbolFromDeclaration(decl, typeChecker);\n if (!declSym) {\n return undefined;\n }\n\n const fileName = decl.getSourceFile().fileName;\n const sourceAssembly = findTypeLookupAssembly(fileName);\n const symbolId = symbolIdentifier(typeChecker, declSym, { assembly: sourceAssembly?.assembly });\n if (!symbolId) {\n return undefined;\n }\n\n return fmap(/([^#]*)(#.*)?/.exec(symbolId), ([, typeSymbolId, memberFragment]) => {\n const fqn = fmap(sourceAssembly, (sa) => resolveSymbolIdFqn(sa, typeSymbolId));\n if (fqn === undefined) {\n // The symbol lives in a package that demonstrably has a jsii assembly,\n // yet we cannot resolve it. Warn user about guessed target names.\n if (sourceAssembly) {\n reportUnresolvedSymbolId(sourceAssembly, typeSymbolId);\n }\n return undefined;\n }\n\n if (memberFragment) {\n return {\n fqn: `${fqn}${memberFragment}`,\n sourceAssembly,\n symbolType: 'member',\n } as JsiiSymbol;\n }\n return { fqn, sourceAssembly, symbolType: 'type' } as JsiiSymbol;\n });\n}\n\nfunction isDeclaration(x: ts.Node): x is ts.Declaration {\n return (\n ts.isClassDeclaration(x) ||\n ts.isNamespaceExportDeclaration(x) ||\n ts.isNamespaceExport(x) ||\n ts.isModuleDeclaration(x) ||\n ts.isEnumDeclaration(x) ||\n ts.isEnumMember(x) ||\n ts.isInterfaceDeclaration(x) ||\n ts.isMethodDeclaration(x) ||\n ts.isMethodSignature(x) ||\n ts.isPropertyDeclaration(x) ||\n ts.isPropertySignature(x)\n );\n}\n\n/**\n * If the given type is an enum literal, resolve to the enum type\n */\nexport function resolveEnumLiteral(typeChecker: ts.TypeChecker, type: ts.Type) {\n if (!hasAnyFlag(type.flags, ts.TypeFlags.EnumLiteral)) {\n return type;\n }\n\n return typeChecker.getBaseTypeOfLiteralType(type);\n}\n\nexport function resolvedSymbolAtLocation(typeChecker: ts.TypeChecker, node: ts.Node) {\n let symbol = typeChecker.getSymbolAtLocation(node);\n while (symbol && hasAnyFlag(symbol.flags, ts.SymbolFlags.Alias)) {\n symbol = typeChecker.getAliasedSymbol(symbol);\n }\n return symbol;\n}\n\nfunction getSymbolFromDeclaration(decl: ts.Node, typeChecker: ts.TypeChecker): ts.Symbol | undefined {\n if (!isDeclaration(decl)) {\n return undefined;\n }\n\n const name = ts.getNameOfDeclaration(decl);\n return name ? typeChecker.getSymbolAtLocation(name) : undefined;\n}\n\nexport function parentSymbol(sym: JsiiSymbol): JsiiSymbol | undefined {\n const parts = sym.fqn.split('.');\n if (parts.length === 1) {\n return undefined;\n }\n\n return {\n fqn: parts.slice(0, -1).join('.'),\n symbolType: 'module', // Might not be true, but probably good enough\n sourceAssembly: sym.sourceAssembly,\n };\n}\n\n/**\n * Get the last part of a dot-separated string\n */\nexport function simpleName(x: string) {\n return x.split('.').slice(-1)[0];\n}\n\n/**\n * Get all parts except the last of a dot-separated string\n */\nexport function namespaceName(x: string) {\n return x.split('.').slice(0, -1).join('.');\n}\n"]}
package/package.json CHANGED
@@ -91,7 +91,7 @@
91
91
  "publishConfig": {
92
92
  "access": "public"
93
93
  },
94
- "version": "5.9.59",
94
+ "version": "5.9.60",
95
95
  "packageManager": "yarn@4.13.0",
96
96
  "types": "lib/index.d.ts",
97
97
  "exports": {