jsii-rosetta 5.0.3-dev.0 → 5.0.3-dev.1
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.
- package/lib/commands/transliterate.js +1 -1
- package/lib/commands/transliterate.js.map +1 -1
- package/lib/main.js +3 -3
- package/lib/main.js.map +1 -1
- package/lib/rosetta-reader.d.ts +1 -1
- package/lib/rosetta-reader.js +2 -2
- package/lib/rosetta-reader.js.map +1 -1
- package/lib/util.d.ts +1 -1
- package/lib/util.js +10 -2
- package/lib/util.js.map +1 -1
- package/package.json +1 -1
|
@@ -68,7 +68,7 @@ async function transliterateAssembly(assemblyLocations, targetLanguages, options
|
|
|
68
68
|
(0, logging_1.debug)(`Done transliterating ${result.name}@${result.version} to ${language} after ${then - now} milliseconds`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
rosetta.printDiagnostics(process.stderr);
|
|
71
|
+
rosetta.printDiagnostics(process.stderr, process.stderr.isTTY);
|
|
72
72
|
if (rosetta.hasErrors && options.strict) {
|
|
73
73
|
throw new Error('Strict mode is enabled and some examples failed compilation!');
|
|
74
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transliterate.js","sourceRoot":"","sources":["../../src/commands/transliterate.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Assembly, Docs, SPEC_FILE_NAME, Type, TypeKind, loadAssemblyFromPath } from '@jsii/spec';\n\nimport { extractSnippets } from './extract';\nimport { TargetLanguage } from '../languages';\nimport { targetName } from '../languages/target-language';\nimport { debug } from '../logging';\nimport { RosettaTabletReader, UnknownSnippetMode } from '../rosetta-reader';\nimport { typeScriptSnippetFromVisibleSource, ApiLocation } from '../snippet';\nimport { Mutable } from '../util';\n\nexport interface TransliterateAssemblyOptions {\n /**\n * Whether to ignore any missing fixture files or literate markdown documents\n * referenced by the assembly, instead of failing.\n *\n * @default false\n */\n readonly loose?: boolean;\n\n /**\n * Whether transliteration should fail upon failing to compile an example that\n * required live transliteration.\n *\n * @default false\n */\n readonly strict?: boolean;\n\n /**\n * A pre-build translation tablet (as produced by `jsii-rosetta extract`).\n *\n * @default - Only the default tablet (`.jsii.tabl.json`) files will be used.\n */\n readonly tablet?: string;\n\n /**\n * A directory to output translated assemblies to\n *\n * @default - assembly location\n */\n readonly outdir?: string;\n\n /**\n * Whether or not to live-convert samples\n *\n * @default UnknownSnippetMode.FAIL\n */\n readonly unknownSnippets?: UnknownSnippetMode;\n}\n\n/**\n * Prepares transliterated versions of the designated assemblies into the\n * selected taregt languages.\n *\n * @param assemblyLocations the directories which contain assemblies to\n * transliterate.\n * @param targetLanguages the languages into which to transliterate.\n * @param tabletLocation an optional Rosetta tablet file to source\n * pre-transliterated snippets from.\n *\n * @experimental\n */\nexport async function transliterateAssembly(\n assemblyLocations: readonly string[],\n targetLanguages: readonly TargetLanguage[],\n options: TransliterateAssemblyOptions = {},\n): Promise<void> {\n // Start by doing an 'extract' for all these assemblies\n //\n // This will locate all examples that haven't been translated yet and translate\n // them. Importantly: it will translate them in parallel, which is going to improve\n // performance a lot. We ignore diagnostics.\n const { tablet } = await extractSnippets(assemblyLocations, {\n includeCompilerDiagnostics: true,\n loose: options.loose,\n cacheFromFile: options.tablet,\n writeToImplicitTablets: false,\n allowDirtyTranslations: true,\n });\n\n // Now do a regular \"tablet reader\" cycle, expecting everything to be translated already,\n // and therefore it doesn't matter that we do this all in a single-threaded loop.\n const rosetta = new RosettaTabletReader({\n unknownSnippets: options?.unknownSnippets ?? UnknownSnippetMode.FAIL,\n targetLanguages,\n prefixDisclaimer: true,\n });\n // Put in the same caching tablet here\n if (options.tablet) {\n await rosetta.loadTabletFromFile(options.tablet);\n }\n // Any fresh translations we just came up with\n rosetta.addTablet(tablet);\n\n const assemblies = await loadAssemblies(assemblyLocations, rosetta);\n\n for (const [location, loadAssembly] of assemblies.entries()) {\n for (const language of targetLanguages) {\n const now = new Date().getTime();\n const result = loadAssembly();\n\n if (result.targets?.[targetName(language)] == null) {\n // This language is not supported by the assembly, so we skip it...\n continue;\n }\n\n if (result.readme?.markdown) {\n result.readme.markdown = rosetta.translateSnippetsInMarkdown(\n { api: 'moduleReadme', moduleFqn: result.name },\n result.readme.markdown,\n language,\n true /* strict */,\n );\n }\n for (const type of Object.values(result.types ?? {})) {\n transliterateType(type, rosetta, language);\n }\n // eslint-disable-next-line no-await-in-loop\n await fs.writeFile(\n resolve(options?.outdir ?? location, `${SPEC_FILE_NAME}.${language}`),\n JSON.stringify(result, null, 2),\n );\n const then = new Date().getTime();\n debug(`Done transliterating ${result.name}@${result.version} to ${language} after ${then - now} milliseconds`);\n }\n }\n\n rosetta.printDiagnostics(process.stderr);\n if (rosetta.hasErrors && options.strict) {\n throw new Error('Strict mode is enabled and some examples failed compilation!');\n }\n}\n\n/**\n * Given a set of directories containing `.jsii` assemblies, load all the\n * assemblies into the provided `Rosetta` instance and return a map of\n * directories to assembly-loading functions (the function re-loads the original\n * assembly from disk on each invocation).\n *\n * @param directories the assembly-containing directories to traverse.\n * @param rosetta the `Rosetta` instance in which to load assemblies.\n *\n * @returns a map of directories to a function that loads the `.jsii` assembly\n * contained therein from disk.\n */\nasync function loadAssemblies(\n directories: readonly string[],\n rosetta: RosettaTabletReader,\n): Promise<ReadonlyMap<string, AssemblyLoader>> {\n const result = new Map<string, AssemblyLoader>();\n\n for (const directory of directories) {\n const loader = () => loadAssemblyFromPath(directory);\n // eslint-disable-next-line no-await-in-loop\n await rosetta.addAssembly(loader(), directory);\n result.set(directory, loader);\n }\n\n return result;\n}\n\ntype AssemblyLoader = () => Mutable<Assembly>;\n\nfunction transliterateType(type: Type, rosetta: RosettaTabletReader, language: TargetLanguage): void {\n transliterateDocs({ api: 'type', fqn: type.fqn }, type.docs);\n switch (type.kind) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore 7029\n case TypeKind.Class:\n if (type.initializer) {\n transliterateDocs({ api: 'initializer', fqn: type.fqn }, type.initializer.docs);\n }\n\n // fallthrough\n case TypeKind.Interface:\n for (const method of type.methods ?? []) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: method.name }, method.docs);\n for (const parameter of method.parameters ?? []) {\n transliterateDocs(\n { api: 'parameter', fqn: type.fqn, methodName: method.name, parameterName: parameter.name },\n parameter.docs,\n );\n }\n }\n for (const property of type.properties ?? []) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: property.name }, property.docs);\n }\n break;\n\n case TypeKind.Enum:\n for (const member of type.members) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: member.name }, member.docs);\n }\n break;\n\n default:\n throw new Error(`Unsupported type kind: ${(type as any).kind}`);\n }\n\n function transliterateDocs(api: ApiLocation, docs: Docs | undefined) {\n if (docs?.remarks) {\n docs.remarks = rosetta.translateSnippetsInMarkdown(api, docs.remarks, language, true /* strict */);\n }\n\n if (docs?.example) {\n const location = { api, field: { field: 'example' } } as const;\n const snippet = typeScriptSnippetFromVisibleSource(docs.example, location, true /* strict */);\n const translation = rosetta.translateSnippet(snippet, language);\n if (translation != null) {\n docs.example = translation.source;\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transliterate.js","sourceRoot":"","sources":["../../src/commands/transliterate.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Assembly, Docs, SPEC_FILE_NAME, Type, TypeKind, loadAssemblyFromPath } from '@jsii/spec';\n\nimport { extractSnippets } from './extract';\nimport { TargetLanguage } from '../languages';\nimport { targetName } from '../languages/target-language';\nimport { debug } from '../logging';\nimport { RosettaTabletReader, UnknownSnippetMode } from '../rosetta-reader';\nimport { typeScriptSnippetFromVisibleSource, ApiLocation } from '../snippet';\nimport { Mutable } from '../util';\n\nexport interface TransliterateAssemblyOptions {\n /**\n * Whether to ignore any missing fixture files or literate markdown documents\n * referenced by the assembly, instead of failing.\n *\n * @default false\n */\n readonly loose?: boolean;\n\n /**\n * Whether transliteration should fail upon failing to compile an example that\n * required live transliteration.\n *\n * @default false\n */\n readonly strict?: boolean;\n\n /**\n * A pre-build translation tablet (as produced by `jsii-rosetta extract`).\n *\n * @default - Only the default tablet (`.jsii.tabl.json`) files will be used.\n */\n readonly tablet?: string;\n\n /**\n * A directory to output translated assemblies to\n *\n * @default - assembly location\n */\n readonly outdir?: string;\n\n /**\n * Whether or not to live-convert samples\n *\n * @default UnknownSnippetMode.FAIL\n */\n readonly unknownSnippets?: UnknownSnippetMode;\n}\n\n/**\n * Prepares transliterated versions of the designated assemblies into the\n * selected taregt languages.\n *\n * @param assemblyLocations the directories which contain assemblies to\n * transliterate.\n * @param targetLanguages the languages into which to transliterate.\n * @param tabletLocation an optional Rosetta tablet file to source\n * pre-transliterated snippets from.\n *\n * @experimental\n */\nexport async function transliterateAssembly(\n assemblyLocations: readonly string[],\n targetLanguages: readonly TargetLanguage[],\n options: TransliterateAssemblyOptions = {},\n): Promise<void> {\n // Start by doing an 'extract' for all these assemblies\n //\n // This will locate all examples that haven't been translated yet and translate\n // them. Importantly: it will translate them in parallel, which is going to improve\n // performance a lot. We ignore diagnostics.\n const { tablet } = await extractSnippets(assemblyLocations, {\n includeCompilerDiagnostics: true,\n loose: options.loose,\n cacheFromFile: options.tablet,\n writeToImplicitTablets: false,\n allowDirtyTranslations: true,\n });\n\n // Now do a regular \"tablet reader\" cycle, expecting everything to be translated already,\n // and therefore it doesn't matter that we do this all in a single-threaded loop.\n const rosetta = new RosettaTabletReader({\n unknownSnippets: options?.unknownSnippets ?? UnknownSnippetMode.FAIL,\n targetLanguages,\n prefixDisclaimer: true,\n });\n // Put in the same caching tablet here\n if (options.tablet) {\n await rosetta.loadTabletFromFile(options.tablet);\n }\n // Any fresh translations we just came up with\n rosetta.addTablet(tablet);\n\n const assemblies = await loadAssemblies(assemblyLocations, rosetta);\n\n for (const [location, loadAssembly] of assemblies.entries()) {\n for (const language of targetLanguages) {\n const now = new Date().getTime();\n const result = loadAssembly();\n\n if (result.targets?.[targetName(language)] == null) {\n // This language is not supported by the assembly, so we skip it...\n continue;\n }\n\n if (result.readme?.markdown) {\n result.readme.markdown = rosetta.translateSnippetsInMarkdown(\n { api: 'moduleReadme', moduleFqn: result.name },\n result.readme.markdown,\n language,\n true /* strict */,\n );\n }\n for (const type of Object.values(result.types ?? {})) {\n transliterateType(type, rosetta, language);\n }\n // eslint-disable-next-line no-await-in-loop\n await fs.writeFile(\n resolve(options?.outdir ?? location, `${SPEC_FILE_NAME}.${language}`),\n JSON.stringify(result, null, 2),\n );\n const then = new Date().getTime();\n debug(`Done transliterating ${result.name}@${result.version} to ${language} after ${then - now} milliseconds`);\n }\n }\n\n rosetta.printDiagnostics(process.stderr, process.stderr.isTTY);\n if (rosetta.hasErrors && options.strict) {\n throw new Error('Strict mode is enabled and some examples failed compilation!');\n }\n}\n\n/**\n * Given a set of directories containing `.jsii` assemblies, load all the\n * assemblies into the provided `Rosetta` instance and return a map of\n * directories to assembly-loading functions (the function re-loads the original\n * assembly from disk on each invocation).\n *\n * @param directories the assembly-containing directories to traverse.\n * @param rosetta the `Rosetta` instance in which to load assemblies.\n *\n * @returns a map of directories to a function that loads the `.jsii` assembly\n * contained therein from disk.\n */\nasync function loadAssemblies(\n directories: readonly string[],\n rosetta: RosettaTabletReader,\n): Promise<ReadonlyMap<string, AssemblyLoader>> {\n const result = new Map<string, AssemblyLoader>();\n\n for (const directory of directories) {\n const loader = () => loadAssemblyFromPath(directory);\n // eslint-disable-next-line no-await-in-loop\n await rosetta.addAssembly(loader(), directory);\n result.set(directory, loader);\n }\n\n return result;\n}\n\ntype AssemblyLoader = () => Mutable<Assembly>;\n\nfunction transliterateType(type: Type, rosetta: RosettaTabletReader, language: TargetLanguage): void {\n transliterateDocs({ api: 'type', fqn: type.fqn }, type.docs);\n switch (type.kind) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore 7029\n case TypeKind.Class:\n if (type.initializer) {\n transliterateDocs({ api: 'initializer', fqn: type.fqn }, type.initializer.docs);\n }\n\n // fallthrough\n case TypeKind.Interface:\n for (const method of type.methods ?? []) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: method.name }, method.docs);\n for (const parameter of method.parameters ?? []) {\n transliterateDocs(\n { api: 'parameter', fqn: type.fqn, methodName: method.name, parameterName: parameter.name },\n parameter.docs,\n );\n }\n }\n for (const property of type.properties ?? []) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: property.name }, property.docs);\n }\n break;\n\n case TypeKind.Enum:\n for (const member of type.members) {\n transliterateDocs({ api: 'member', fqn: type.fqn, memberName: member.name }, member.docs);\n }\n break;\n\n default:\n throw new Error(`Unsupported type kind: ${(type as any).kind}`);\n }\n\n function transliterateDocs(api: ApiLocation, docs: Docs | undefined) {\n if (docs?.remarks) {\n docs.remarks = rosetta.translateSnippetsInMarkdown(api, docs.remarks, language, true /* strict */);\n }\n\n if (docs?.example) {\n const location = { api, field: { field: 'example' } } as const;\n const snippet = typeScriptSnippetFromVisibleSource(docs.example, location, true /* strict */);\n const translation = rosetta.translateSnippet(snippet, language);\n if (translation != null) {\n docs.example = translation.source;\n }\n }\n }\n}\n"]}
|
package/lib/main.js
CHANGED
|
@@ -428,7 +428,7 @@ function handleDiagnostics(diagnostics, fail, snippetCount = 1) {
|
|
|
428
428
|
if (fail !== false) {
|
|
429
429
|
// Fail on any diagnostic
|
|
430
430
|
if (diagnostics.length > 0) {
|
|
431
|
-
(0, util_1.printDiagnostics)(diagnostics, process.stderr);
|
|
431
|
+
(0, util_1.printDiagnostics)(diagnostics, process.stderr, process.stderr.isTTY);
|
|
432
432
|
logging.error([
|
|
433
433
|
`${diagnostics.length} diagnostics encountered in ${snippetCount} snippets`,
|
|
434
434
|
...(fail === true ? ["(running with '--fail')"] : []),
|
|
@@ -441,7 +441,7 @@ function handleDiagnostics(diagnostics, fail, snippetCount = 1) {
|
|
|
441
441
|
// (so it's very clear what is failing the build), otherwise print everything.
|
|
442
442
|
const strictDiagnostics = diagnostics.filter((diag) => diag.isFromStrictAssembly);
|
|
443
443
|
if (strictDiagnostics.length > 0) {
|
|
444
|
-
(0, util_1.printDiagnostics)(strictDiagnostics, process.stderr);
|
|
444
|
+
(0, util_1.printDiagnostics)(strictDiagnostics, process.stderr, process.stderr.isTTY);
|
|
445
445
|
const remaining = diagnostics.length - strictDiagnostics.length;
|
|
446
446
|
logging.warn([
|
|
447
447
|
`${strictDiagnostics.length} diagnostics from assemblies with 'strict' mode on`,
|
|
@@ -451,7 +451,7 @@ function handleDiagnostics(diagnostics, fail, snippetCount = 1) {
|
|
|
451
451
|
return;
|
|
452
452
|
}
|
|
453
453
|
if (diagnostics.length > 0) {
|
|
454
|
-
(0, util_1.printDiagnostics)(diagnostics, process.stderr);
|
|
454
|
+
(0, util_1.printDiagnostics)(diagnostics, process.stderr, process.stderr.isTTY);
|
|
455
455
|
logging.warn(`${diagnostics.length} diagnostics encountered in ${snippetCount} snippets`);
|
|
456
456
|
}
|
|
457
457
|
}
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import '@jsii/check-node/run';\n\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport * as yargs from 'yargs';\n\nimport { translateMarkdown } from './commands/convert';\nimport { checkCoverage } from './commands/coverage';\nimport { extractAndInfuse, extractSnippets, ExtractOptions } from './commands/extract';\nimport { infuse, DEFAULT_INFUSION_RESULTS_NAME } from './commands/infuse';\nimport { readTablet } from './commands/read';\nimport { transliterateAssembly } from './commands/transliterate';\nimport { trimCache } from './commands/trim-cache';\nimport { TranslateResult, translateTypeScript, RosettaDiagnostic } from './index';\nimport { TargetLanguage } from './languages';\nimport { PythonVisitor } from './languages/python';\nimport { VisualizeAstVisitor } from './languages/visualize';\nimport * as logging from './logging';\nimport { emitSupportPolicyInformation } from './support';\nimport { File, fmap, printDiagnostics } from './util';\n\nasync function main() {\n await emitSupportPolicyInformation();\n\n const argv = yargs\n .usage('$0 <cmd> [args]')\n .option('verbose', {\n alias: 'v',\n type: 'boolean',\n desc: 'Increase logging verbosity',\n count: true,\n default: 0,\n })\n .command(\n 'snippet FILE',\n 'Translate a single snippet',\n (command) =>\n command\n .positional('FILE', {\n type: 'string',\n describe: 'The file to translate (leave out for stdin)',\n })\n .option('python', {\n alias: 'p',\n boolean: true,\n description: 'Translate snippets to Python',\n }),\n wrapHandler(async (args) => {\n const result = translateTypeScript(await makeFileSource(args.FILE ?? '-', 'stdin.ts'), makeVisitor(args));\n handleSingleResult(result);\n }),\n )\n .command(\n 'markdown FILE',\n 'Translate a MarkDown file',\n (command) =>\n command\n .positional('FILE', {\n type: 'string',\n describe: 'The file to translate (leave out for stdin)',\n })\n .option('python', {\n alias: 'p',\n boolean: true,\n description: 'Translate snippets to Python',\n }),\n wrapHandler(async (args) => {\n const result = translateMarkdown(await makeFileSource(args.FILE ?? '-', 'stdin.md'), makeVisitor(args));\n handleSingleResult(result);\n }),\n )\n .command(\n 'infuse [ASSEMBLY..]',\n '(EXPERIMENTAL) mutates one or more assemblies by adding documentation examples to top-level types',\n (command) =>\n command\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n describe: 'Assembly or directory to mutate',\n })\n .option('log-file', {\n alias: 'l',\n type: 'string',\n describe: 'Output file to store logging results. Ignored if -log is not true',\n default: DEFAULT_INFUSION_RESULTS_NAME,\n })\n .option('cache-from', {\n alias: 'C',\n type: 'string',\n // eslint-disable-next-line prettier/prettier\n describe:\n 'Reuse translations from the given tablet file if the snippet and type definitions did not change',\n requiresArg: true,\n default: undefined,\n })\n .option('cache-to', {\n alias: 'o',\n type: 'string',\n describe: 'Append all translated snippets to the given tablet file',\n requiresArg: true,\n default: undefined,\n })\n .option('cache', {\n alias: 'k',\n type: 'string',\n describe: 'Alias for --cache-from and --cache-to together',\n requiresArg: true,\n default: undefined,\n })\n .conflicts('cache', 'cache-from')\n .conflicts('cache', 'cache-to'),\n wrapHandler(async (args) => {\n const absAssemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((x) => path.resolve(x));\n const absCacheFrom = fmap(args.cache ?? args['cache-from'], path.resolve);\n const absCacheTo = fmap(args.cache ?? args['cache-to'], path.resolve);\n const result = await infuse(absAssemblies, {\n logFile: args['log-file'],\n cacheToFile: absCacheTo,\n cacheFromFile: absCacheFrom,\n });\n\n let totalTypes = 0;\n let insertedExamples = 0;\n for (const [directory, map] of Object.entries(result.coverageResults)) {\n const commonName = directory.split('/').pop()!;\n const newCoverage = roundPercentage(map.typesWithInsertedExamples / map.types);\n process.stdout.write(\n `${commonName}: Added ${map.typesWithInsertedExamples} examples to ${map.types} types.\\n`,\n );\n process.stdout.write(`${commonName}: New coverage: ${newCoverage}%.\\n`);\n\n insertedExamples += map.typesWithInsertedExamples;\n totalTypes += map.types;\n }\n const newCoverage = roundPercentage(insertedExamples / totalTypes);\n process.stdout.write(`\\n\\nFinal Stats:\\nNew coverage: ${newCoverage}%.\\n`);\n }),\n )\n .command(\n ['extract [ASSEMBLY..]', '$0 [ASSEMBLY..]'],\n 'Extract code snippets from one or more assemblies into language tablets',\n (command) =>\n command\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n describe: 'Assembly or directory to extract from',\n })\n .option('output', {\n type: 'string',\n describe: 'Additional output file where to store translated samples (deprecated, alias for --cache-to)',\n requiresArg: true,\n default: undefined,\n })\n .option('compile', {\n alias: 'c',\n type: 'boolean',\n describe: 'Try compiling (on by default, use --no-compile to switch off)',\n default: true,\n })\n .option('directory', {\n alias: 'd',\n type: 'string',\n describe: 'Working directory (for require() etc)',\n })\n .option('include', {\n alias: 'i',\n type: 'string',\n array: true,\n describe: 'Extract only snippets with given ids',\n default: [],\n })\n .option('infuse', {\n type: 'boolean',\n describe: 'bundle this command with the infuse command',\n default: false,\n })\n .option('fail', {\n alias: 'f',\n type: 'boolean',\n describe: 'Fail if there are compilation errors',\n default: false,\n })\n .option('validate-assemblies', {\n type: 'boolean',\n describe: 'Whether to validate loaded assemblies or not (this can be slow)',\n default: false,\n })\n .option('cache-from', {\n alias: 'C',\n type: 'string',\n // eslint-disable-next-line prettier/prettier\n describe:\n 'Reuse translations from the given tablet file if the snippet and type definitions did not change',\n requiresArg: true,\n default: undefined,\n })\n .option('cache-to', {\n alias: 'o',\n type: 'string',\n describe: 'Append all translated snippets to the given tablet file',\n requiresArg: true,\n default: undefined,\n })\n .conflicts('cache-to', 'output')\n .option('cache', {\n alias: 'k',\n type: 'string',\n describe: 'Alias for --cache-from and --cache-to together',\n requiresArg: true,\n default: undefined,\n })\n .conflicts('cache', 'cache-from')\n .conflicts('cache', 'cache-to')\n .option('trim-cache', {\n alias: 'T',\n type: 'boolean',\n describe: 'Remove translations that are not referenced by any of the assemblies anymore from the cache',\n })\n .option('strict', {\n alias: 'S',\n type: 'boolean',\n describe:\n 'Require all code samples compile, and fail if one does not. Strict mode always enables --compile and --fail',\n default: false,\n })\n .options('loose', {\n alias: 'l',\n describe: 'Ignore missing fixtures and literate markdown files instead of failing',\n type: 'boolean',\n })\n .options('compress-tablet', {\n alias: 'z',\n type: 'boolean',\n describe: 'Compress the implicit tablet file',\n default: false,\n })\n .options('compress-cache', {\n type: 'boolean',\n describe: 'Compress the cache-to file',\n default: false,\n })\n .conflicts('loose', 'strict')\n .conflicts('loose', 'fail'),\n wrapHandler(async (args) => {\n // `--strict` is short for `--compile --fail`, and we'll override those even if they're set to `false`, such as\n // using `--no-(compile|fail)`, because yargs does not quite give us a better option that does not hurt CX.\n if (args.strict) {\n args.compile = args.c = true;\n args.fail = args.f = true;\n }\n\n const absAssemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((x) => path.resolve(x));\n\n const absCacheFrom = fmap(args.cache ?? args['cache-from'], path.resolve);\n const absCacheTo = fmap(args.cache ?? args['cache-to'] ?? args.output, path.resolve);\n\n const extractOptions: ExtractOptions = {\n compilationDirectory: args.directory,\n includeCompilerDiagnostics: !!args.compile,\n validateAssemblies: args['validate-assemblies'],\n only: args.include,\n cacheFromFile: absCacheFrom,\n cacheToFile: absCacheTo,\n trimCache: args['trim-cache'],\n loose: args.loose,\n compressTablet: args['compress-tablet'],\n compressCacheToFile: args['compress-cache'],\n };\n\n const result = args.infuse\n ? await extractAndInfuse(absAssemblies, extractOptions)\n : await extractSnippets(absAssemblies, extractOptions);\n\n handleDiagnostics(result.diagnostics, args.fail, result.tablet.count);\n }),\n )\n .command(\n 'transliterate [ASSEMBLY..]',\n '(EXPERIMENTAL) Transliterates the designated assemblies',\n (command) =>\n command\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n required: true,\n describe: 'Assembly to transliterate',\n })\n .option('language', {\n alias: 'l',\n type: 'string',\n array: true,\n default: [],\n describe: 'Language ID to transliterate to',\n })\n .options('strict', {\n alias: 's',\n conflicts: 'loose',\n describe:\n 'Fail if an example that needs live transliteration fails to compile (which could cause incorrect transpilation results)',\n type: 'boolean',\n })\n .options('loose', {\n alias: 'l',\n conflicts: 'strict',\n describe: 'Ignore missing fixtures and literate markdown files instead of failing',\n type: 'boolean',\n })\n .option('tablet', {\n alias: 't',\n type: 'string',\n describe:\n 'Language tablet containing pre-translated code examples to use (these are generated by the `extract` command)',\n }),\n wrapHandler((args) => {\n const assemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((dir) =>\n path.resolve(process.cwd(), dir),\n );\n const languages =\n args.language.length > 0\n ? args.language.map((lang) => {\n const target = Object.entries(TargetLanguage).find(([k]) => k === lang)?.[1];\n if (target == null) {\n throw new Error(\n `Unknown target language: ${lang}. Expected one of ${Object.keys(TargetLanguage).join(', ')}`,\n );\n }\n return target;\n })\n : Object.values(TargetLanguage);\n return transliterateAssembly(assemblies, languages, args);\n }),\n )\n .command(\n 'trim-cache <TABLET> [ASSEMBLY..]',\n 'Retain only those snippets in the cache which occur in one of the given assemblies',\n (command) =>\n command\n .positional('TABLET', {\n type: 'string',\n required: true,\n describe: 'Language tablet to trim',\n })\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n describe: 'Assembly or directory to search',\n })\n .demandOption('TABLET'),\n wrapHandler(async (args) => {\n await trimCache({\n cacheFile: args.TABLET,\n assemblyLocations: args.ASSEMBLY,\n });\n }),\n )\n .command(\n 'coverage [ASSEMBLY..]',\n 'Check the translation coverage of implicit tablets for the given assemblies',\n (command) =>\n command.positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: ['.'],\n describe: 'Assembly or directory to search',\n }),\n wrapHandler(async (args) => {\n const absAssemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((x) => path.resolve(x));\n await checkCoverage(absAssemblies);\n }),\n )\n .command(\n 'read <TABLET> [KEY] [LANGUAGE]',\n 'Display snippets in a language tablet file',\n (command) =>\n command\n .positional('TABLET', {\n type: 'string',\n required: true,\n describe: 'Language tablet to read',\n })\n .positional('KEY', {\n type: 'string',\n describe: 'Snippet key to read',\n })\n .positional('LANGUAGE', {\n type: 'string',\n describe: 'Language ID to read',\n })\n .demandOption('TABLET'),\n wrapHandler(async (args) => {\n await readTablet(args.TABLET, args.KEY, args.LANGUAGE);\n }),\n )\n .command(\n 'configure-strict [PACKAGE]',\n \"Enables strict mode for a package's assembly\",\n (command) =>\n command.positional('PACKAGE', {\n type: 'string',\n describe: 'The path to the package to configure',\n required: false,\n default: '.',\n normalize: true,\n }),\n wrapHandler(async (args) => {\n const packageJsonPath = (await fs.stat(args.PACKAGE)).isDirectory()\n ? path.join(args.PACKAGE, 'package.json')\n : args.PACKAGE;\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));\n if (packageJson.jsii == null) {\n console.error(\n `The package in ${args.PACKAGE} does not have a jsii configuration! You can set it up using jsii-config.`,\n );\n process.exitCode = 1;\n return Promise.resolve();\n }\n if (packageJson.jsii.metadata?.jsii?.rosetta?.strict) {\n // Nothing to do - it's already configured, so we assert idempotent success!\n return Promise.resolve();\n }\n const md = (packageJson.jsii.metadata = packageJson.jsii.metadata ?? {});\n const mdJsii = (md.jsii = md.jsii ?? {});\n const mdRosetta = (mdJsii.rosetta = mdJsii.rosetta ?? {});\n mdRosetta.strict = true;\n\n return fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }),\n )\n .demandCommand()\n .help()\n .strict() // Error on wrong command\n // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires\n .version(require('../package.json').version)\n .showHelpOnFail(false).argv;\n\n // Evaluating .argv triggers the parsing but the command gets implicitly executed,\n // so we don't need the output.\n Array.isArray(argv);\n}\n\n/**\n * Wrap a command's handler with standard pre- and post-work\n */\nfunction wrapHandler<A extends { verbose?: number }, R>(handler: (x: A) => Promise<R>) {\n return (argv: A) => {\n logging.configure({ level: argv.verbose !== undefined ? argv.verbose : 0 });\n handler(argv).catch((e) => {\n logging.error(e.message);\n logging.error(e.stack);\n process.exitCode = 1;\n });\n };\n}\n\nfunction makeVisitor(args: { python?: boolean }) {\n if (args.python) {\n return new PythonVisitor();\n }\n // Default to visualizing AST, including nodes we don't recognize yet\n return new VisualizeAstVisitor();\n}\n\nasync function makeFileSource(fileName: string, stdinName: string): Promise<File> {\n if (fileName === '-') {\n return {\n contents: await readStdin(),\n fileName: stdinName,\n };\n }\n return {\n contents: await fs.readFile(fileName, { encoding: 'utf-8' }),\n fileName: fileName,\n };\n}\n\nasync function readStdin(): Promise<string> {\n process.stdin.setEncoding('utf8');\n\n const parts: Buffer[] = [];\n\n return new Promise((resolve, reject) => {\n process.stdin.on('readable', () => {\n const chunk = process.stdin.read();\n if (chunk !== null) {\n parts.push(Buffer.from(chunk));\n }\n });\n\n process.stdin.on('error', reject);\n process.stdin.on('end', () => resolve(Buffer.concat(parts).toString('utf-8')));\n });\n}\n\nfunction handleSingleResult(result: TranslateResult) {\n process.stdout.write(`${result.translation}\\n`);\n\n // For a single result, we always request implicit failure.\n handleDiagnostics(result.diagnostics, 'implicit');\n}\n\n/**\n * Print diagnostics and set exit code\n *\n * 'fail' is whether or not the user passed '--fail' for commands that accept\n * it, or 'implicit' for commands that should always fail. 'implicit' will be\n * treated as 'fail=true, but will not print to the user that the '--fail' is\n * set (because for this particular command that switch does not exist and so it\n * would be confusing).\n */\nfunction handleDiagnostics(diagnostics: readonly RosettaDiagnostic[], fail: boolean | 'implicit', snippetCount = 1) {\n if (fail !== false) {\n // Fail on any diagnostic\n if (diagnostics.length > 0) {\n printDiagnostics(diagnostics, process.stderr);\n logging.error(\n [\n `${diagnostics.length} diagnostics encountered in ${snippetCount} snippets`,\n ...(fail === true ? [\"(running with '--fail')\"] : []),\n ].join(' '),\n );\n process.exitCode = 1;\n }\n\n return;\n }\n\n // Otherwise fail only on strict diagnostics. If we have strict diagnostics, print only those\n // (so it's very clear what is failing the build), otherwise print everything.\n const strictDiagnostics = diagnostics.filter((diag) => diag.isFromStrictAssembly);\n if (strictDiagnostics.length > 0) {\n printDiagnostics(strictDiagnostics, process.stderr);\n const remaining = diagnostics.length - strictDiagnostics.length;\n logging.warn(\n [\n `${strictDiagnostics.length} diagnostics from assemblies with 'strict' mode on`,\n ...(remaining > 0 ? [`(and ${remaining} more non-strict diagnostics)`] : []),\n ].join(' '),\n );\n process.exitCode = 1;\n return;\n }\n\n if (diagnostics.length > 0) {\n printDiagnostics(diagnostics, process.stderr);\n logging.warn(`${diagnostics.length} diagnostics encountered in ${snippetCount} snippets`);\n }\n}\n\n/**\n * Rounds a decimal number to two decimal points.\n * The function is useful for fractions that need to be outputted as percentages.\n */\nfunction roundPercentage(num: number): number {\n return Math.round(10000 * num) / 100;\n}\n\nmain().catch((cause) => {\n console.error(cause);\n process.exitCode = -1;\n});\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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","sourcesContent":["import '@jsii/check-node/run';\n\nimport { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport * as yargs from 'yargs';\n\nimport { translateMarkdown } from './commands/convert';\nimport { checkCoverage } from './commands/coverage';\nimport { extractAndInfuse, extractSnippets, ExtractOptions } from './commands/extract';\nimport { infuse, DEFAULT_INFUSION_RESULTS_NAME } from './commands/infuse';\nimport { readTablet } from './commands/read';\nimport { transliterateAssembly } from './commands/transliterate';\nimport { trimCache } from './commands/trim-cache';\nimport { TranslateResult, translateTypeScript, RosettaDiagnostic } from './index';\nimport { TargetLanguage } from './languages';\nimport { PythonVisitor } from './languages/python';\nimport { VisualizeAstVisitor } from './languages/visualize';\nimport * as logging from './logging';\nimport { emitSupportPolicyInformation } from './support';\nimport { File, fmap, printDiagnostics } from './util';\n\nasync function main() {\n await emitSupportPolicyInformation();\n\n const argv = yargs\n .usage('$0 <cmd> [args]')\n .option('verbose', {\n alias: 'v',\n type: 'boolean',\n desc: 'Increase logging verbosity',\n count: true,\n default: 0,\n })\n .command(\n 'snippet FILE',\n 'Translate a single snippet',\n (command) =>\n command\n .positional('FILE', {\n type: 'string',\n describe: 'The file to translate (leave out for stdin)',\n })\n .option('python', {\n alias: 'p',\n boolean: true,\n description: 'Translate snippets to Python',\n }),\n wrapHandler(async (args) => {\n const result = translateTypeScript(await makeFileSource(args.FILE ?? '-', 'stdin.ts'), makeVisitor(args));\n handleSingleResult(result);\n }),\n )\n .command(\n 'markdown FILE',\n 'Translate a MarkDown file',\n (command) =>\n command\n .positional('FILE', {\n type: 'string',\n describe: 'The file to translate (leave out for stdin)',\n })\n .option('python', {\n alias: 'p',\n boolean: true,\n description: 'Translate snippets to Python',\n }),\n wrapHandler(async (args) => {\n const result = translateMarkdown(await makeFileSource(args.FILE ?? '-', 'stdin.md'), makeVisitor(args));\n handleSingleResult(result);\n }),\n )\n .command(\n 'infuse [ASSEMBLY..]',\n '(EXPERIMENTAL) mutates one or more assemblies by adding documentation examples to top-level types',\n (command) =>\n command\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n describe: 'Assembly or directory to mutate',\n })\n .option('log-file', {\n alias: 'l',\n type: 'string',\n describe: 'Output file to store logging results. Ignored if -log is not true',\n default: DEFAULT_INFUSION_RESULTS_NAME,\n })\n .option('cache-from', {\n alias: 'C',\n type: 'string',\n // eslint-disable-next-line prettier/prettier\n describe:\n 'Reuse translations from the given tablet file if the snippet and type definitions did not change',\n requiresArg: true,\n default: undefined,\n })\n .option('cache-to', {\n alias: 'o',\n type: 'string',\n describe: 'Append all translated snippets to the given tablet file',\n requiresArg: true,\n default: undefined,\n })\n .option('cache', {\n alias: 'k',\n type: 'string',\n describe: 'Alias for --cache-from and --cache-to together',\n requiresArg: true,\n default: undefined,\n })\n .conflicts('cache', 'cache-from')\n .conflicts('cache', 'cache-to'),\n wrapHandler(async (args) => {\n const absAssemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((x) => path.resolve(x));\n const absCacheFrom = fmap(args.cache ?? args['cache-from'], path.resolve);\n const absCacheTo = fmap(args.cache ?? args['cache-to'], path.resolve);\n const result = await infuse(absAssemblies, {\n logFile: args['log-file'],\n cacheToFile: absCacheTo,\n cacheFromFile: absCacheFrom,\n });\n\n let totalTypes = 0;\n let insertedExamples = 0;\n for (const [directory, map] of Object.entries(result.coverageResults)) {\n const commonName = directory.split('/').pop()!;\n const newCoverage = roundPercentage(map.typesWithInsertedExamples / map.types);\n process.stdout.write(\n `${commonName}: Added ${map.typesWithInsertedExamples} examples to ${map.types} types.\\n`,\n );\n process.stdout.write(`${commonName}: New coverage: ${newCoverage}%.\\n`);\n\n insertedExamples += map.typesWithInsertedExamples;\n totalTypes += map.types;\n }\n const newCoverage = roundPercentage(insertedExamples / totalTypes);\n process.stdout.write(`\\n\\nFinal Stats:\\nNew coverage: ${newCoverage}%.\\n`);\n }),\n )\n .command(\n ['extract [ASSEMBLY..]', '$0 [ASSEMBLY..]'],\n 'Extract code snippets from one or more assemblies into language tablets',\n (command) =>\n command\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n describe: 'Assembly or directory to extract from',\n })\n .option('output', {\n type: 'string',\n describe: 'Additional output file where to store translated samples (deprecated, alias for --cache-to)',\n requiresArg: true,\n default: undefined,\n })\n .option('compile', {\n alias: 'c',\n type: 'boolean',\n describe: 'Try compiling (on by default, use --no-compile to switch off)',\n default: true,\n })\n .option('directory', {\n alias: 'd',\n type: 'string',\n describe: 'Working directory (for require() etc)',\n })\n .option('include', {\n alias: 'i',\n type: 'string',\n array: true,\n describe: 'Extract only snippets with given ids',\n default: [],\n })\n .option('infuse', {\n type: 'boolean',\n describe: 'bundle this command with the infuse command',\n default: false,\n })\n .option('fail', {\n alias: 'f',\n type: 'boolean',\n describe: 'Fail if there are compilation errors',\n default: false,\n })\n .option('validate-assemblies', {\n type: 'boolean',\n describe: 'Whether to validate loaded assemblies or not (this can be slow)',\n default: false,\n })\n .option('cache-from', {\n alias: 'C',\n type: 'string',\n // eslint-disable-next-line prettier/prettier\n describe:\n 'Reuse translations from the given tablet file if the snippet and type definitions did not change',\n requiresArg: true,\n default: undefined,\n })\n .option('cache-to', {\n alias: 'o',\n type: 'string',\n describe: 'Append all translated snippets to the given tablet file',\n requiresArg: true,\n default: undefined,\n })\n .conflicts('cache-to', 'output')\n .option('cache', {\n alias: 'k',\n type: 'string',\n describe: 'Alias for --cache-from and --cache-to together',\n requiresArg: true,\n default: undefined,\n })\n .conflicts('cache', 'cache-from')\n .conflicts('cache', 'cache-to')\n .option('trim-cache', {\n alias: 'T',\n type: 'boolean',\n describe: 'Remove translations that are not referenced by any of the assemblies anymore from the cache',\n })\n .option('strict', {\n alias: 'S',\n type: 'boolean',\n describe:\n 'Require all code samples compile, and fail if one does not. Strict mode always enables --compile and --fail',\n default: false,\n })\n .options('loose', {\n alias: 'l',\n describe: 'Ignore missing fixtures and literate markdown files instead of failing',\n type: 'boolean',\n })\n .options('compress-tablet', {\n alias: 'z',\n type: 'boolean',\n describe: 'Compress the implicit tablet file',\n default: false,\n })\n .options('compress-cache', {\n type: 'boolean',\n describe: 'Compress the cache-to file',\n default: false,\n })\n .conflicts('loose', 'strict')\n .conflicts('loose', 'fail'),\n wrapHandler(async (args) => {\n // `--strict` is short for `--compile --fail`, and we'll override those even if they're set to `false`, such as\n // using `--no-(compile|fail)`, because yargs does not quite give us a better option that does not hurt CX.\n if (args.strict) {\n args.compile = args.c = true;\n args.fail = args.f = true;\n }\n\n const absAssemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((x) => path.resolve(x));\n\n const absCacheFrom = fmap(args.cache ?? args['cache-from'], path.resolve);\n const absCacheTo = fmap(args.cache ?? args['cache-to'] ?? args.output, path.resolve);\n\n const extractOptions: ExtractOptions = {\n compilationDirectory: args.directory,\n includeCompilerDiagnostics: !!args.compile,\n validateAssemblies: args['validate-assemblies'],\n only: args.include,\n cacheFromFile: absCacheFrom,\n cacheToFile: absCacheTo,\n trimCache: args['trim-cache'],\n loose: args.loose,\n compressTablet: args['compress-tablet'],\n compressCacheToFile: args['compress-cache'],\n };\n\n const result = args.infuse\n ? await extractAndInfuse(absAssemblies, extractOptions)\n : await extractSnippets(absAssemblies, extractOptions);\n\n handleDiagnostics(result.diagnostics, args.fail, result.tablet.count);\n }),\n )\n .command(\n 'transliterate [ASSEMBLY..]',\n '(EXPERIMENTAL) Transliterates the designated assemblies',\n (command) =>\n command\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n required: true,\n describe: 'Assembly to transliterate',\n })\n .option('language', {\n alias: 'l',\n type: 'string',\n array: true,\n default: [],\n describe: 'Language ID to transliterate to',\n })\n .options('strict', {\n alias: 's',\n conflicts: 'loose',\n describe:\n 'Fail if an example that needs live transliteration fails to compile (which could cause incorrect transpilation results)',\n type: 'boolean',\n })\n .options('loose', {\n alias: 'l',\n conflicts: 'strict',\n describe: 'Ignore missing fixtures and literate markdown files instead of failing',\n type: 'boolean',\n })\n .option('tablet', {\n alias: 't',\n type: 'string',\n describe:\n 'Language tablet containing pre-translated code examples to use (these are generated by the `extract` command)',\n }),\n wrapHandler((args) => {\n const assemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((dir) =>\n path.resolve(process.cwd(), dir),\n );\n const languages =\n args.language.length > 0\n ? args.language.map((lang) => {\n const target = Object.entries(TargetLanguage).find(([k]) => k === lang)?.[1];\n if (target == null) {\n throw new Error(\n `Unknown target language: ${lang}. Expected one of ${Object.keys(TargetLanguage).join(', ')}`,\n );\n }\n return target;\n })\n : Object.values(TargetLanguage);\n return transliterateAssembly(assemblies, languages, args);\n }),\n )\n .command(\n 'trim-cache <TABLET> [ASSEMBLY..]',\n 'Retain only those snippets in the cache which occur in one of the given assemblies',\n (command) =>\n command\n .positional('TABLET', {\n type: 'string',\n required: true,\n describe: 'Language tablet to trim',\n })\n .positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: [],\n describe: 'Assembly or directory to search',\n })\n .demandOption('TABLET'),\n wrapHandler(async (args) => {\n await trimCache({\n cacheFile: args.TABLET,\n assemblyLocations: args.ASSEMBLY,\n });\n }),\n )\n .command(\n 'coverage [ASSEMBLY..]',\n 'Check the translation coverage of implicit tablets for the given assemblies',\n (command) =>\n command.positional('ASSEMBLY', {\n type: 'string',\n array: true,\n default: ['.'],\n describe: 'Assembly or directory to search',\n }),\n wrapHandler(async (args) => {\n const absAssemblies = (args.ASSEMBLY.length > 0 ? args.ASSEMBLY : ['.']).map((x) => path.resolve(x));\n await checkCoverage(absAssemblies);\n }),\n )\n .command(\n 'read <TABLET> [KEY] [LANGUAGE]',\n 'Display snippets in a language tablet file',\n (command) =>\n command\n .positional('TABLET', {\n type: 'string',\n required: true,\n describe: 'Language tablet to read',\n })\n .positional('KEY', {\n type: 'string',\n describe: 'Snippet key to read',\n })\n .positional('LANGUAGE', {\n type: 'string',\n describe: 'Language ID to read',\n })\n .demandOption('TABLET'),\n wrapHandler(async (args) => {\n await readTablet(args.TABLET, args.KEY, args.LANGUAGE);\n }),\n )\n .command(\n 'configure-strict [PACKAGE]',\n \"Enables strict mode for a package's assembly\",\n (command) =>\n command.positional('PACKAGE', {\n type: 'string',\n describe: 'The path to the package to configure',\n required: false,\n default: '.',\n normalize: true,\n }),\n wrapHandler(async (args) => {\n const packageJsonPath = (await fs.stat(args.PACKAGE)).isDirectory()\n ? path.join(args.PACKAGE, 'package.json')\n : args.PACKAGE;\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));\n if (packageJson.jsii == null) {\n console.error(\n `The package in ${args.PACKAGE} does not have a jsii configuration! You can set it up using jsii-config.`,\n );\n process.exitCode = 1;\n return Promise.resolve();\n }\n if (packageJson.jsii.metadata?.jsii?.rosetta?.strict) {\n // Nothing to do - it's already configured, so we assert idempotent success!\n return Promise.resolve();\n }\n const md = (packageJson.jsii.metadata = packageJson.jsii.metadata ?? {});\n const mdJsii = (md.jsii = md.jsii ?? {});\n const mdRosetta = (mdJsii.rosetta = mdJsii.rosetta ?? {});\n mdRosetta.strict = true;\n\n return fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n }),\n )\n .demandCommand()\n .help()\n .strict() // Error on wrong command\n // eslint-disable-next-line @typescript-eslint/no-require-imports,@typescript-eslint/no-var-requires\n .version(require('../package.json').version)\n .showHelpOnFail(false).argv;\n\n // Evaluating .argv triggers the parsing but the command gets implicitly executed,\n // so we don't need the output.\n Array.isArray(argv);\n}\n\n/**\n * Wrap a command's handler with standard pre- and post-work\n */\nfunction wrapHandler<A extends { verbose?: number }, R>(handler: (x: A) => Promise<R>) {\n return (argv: A) => {\n logging.configure({ level: argv.verbose !== undefined ? argv.verbose : 0 });\n handler(argv).catch((e) => {\n logging.error(e.message);\n logging.error(e.stack);\n process.exitCode = 1;\n });\n };\n}\n\nfunction makeVisitor(args: { python?: boolean }) {\n if (args.python) {\n return new PythonVisitor();\n }\n // Default to visualizing AST, including nodes we don't recognize yet\n return new VisualizeAstVisitor();\n}\n\nasync function makeFileSource(fileName: string, stdinName: string): Promise<File> {\n if (fileName === '-') {\n return {\n contents: await readStdin(),\n fileName: stdinName,\n };\n }\n return {\n contents: await fs.readFile(fileName, { encoding: 'utf-8' }),\n fileName: fileName,\n };\n}\n\nasync function readStdin(): Promise<string> {\n process.stdin.setEncoding('utf8');\n\n const parts: Buffer[] = [];\n\n return new Promise((resolve, reject) => {\n process.stdin.on('readable', () => {\n const chunk = process.stdin.read();\n if (chunk !== null) {\n parts.push(Buffer.from(chunk));\n }\n });\n\n process.stdin.on('error', reject);\n process.stdin.on('end', () => resolve(Buffer.concat(parts).toString('utf-8')));\n });\n}\n\nfunction handleSingleResult(result: TranslateResult) {\n process.stdout.write(`${result.translation}\\n`);\n\n // For a single result, we always request implicit failure.\n handleDiagnostics(result.diagnostics, 'implicit');\n}\n\n/**\n * Print diagnostics and set exit code\n *\n * 'fail' is whether or not the user passed '--fail' for commands that accept\n * it, or 'implicit' for commands that should always fail. 'implicit' will be\n * treated as 'fail=true, but will not print to the user that the '--fail' is\n * set (because for this particular command that switch does not exist and so it\n * would be confusing).\n */\nfunction handleDiagnostics(diagnostics: readonly RosettaDiagnostic[], fail: boolean | 'implicit', snippetCount = 1) {\n if (fail !== false) {\n // Fail on any diagnostic\n if (diagnostics.length > 0) {\n printDiagnostics(diagnostics, process.stderr, process.stderr.isTTY);\n logging.error(\n [\n `${diagnostics.length} diagnostics encountered in ${snippetCount} snippets`,\n ...(fail === true ? [\"(running with '--fail')\"] : []),\n ].join(' '),\n );\n process.exitCode = 1;\n }\n\n return;\n }\n\n // Otherwise fail only on strict diagnostics. If we have strict diagnostics, print only those\n // (so it's very clear what is failing the build), otherwise print everything.\n const strictDiagnostics = diagnostics.filter((diag) => diag.isFromStrictAssembly);\n if (strictDiagnostics.length > 0) {\n printDiagnostics(strictDiagnostics, process.stderr, process.stderr.isTTY);\n const remaining = diagnostics.length - strictDiagnostics.length;\n logging.warn(\n [\n `${strictDiagnostics.length} diagnostics from assemblies with 'strict' mode on`,\n ...(remaining > 0 ? [`(and ${remaining} more non-strict diagnostics)`] : []),\n ].join(' '),\n );\n process.exitCode = 1;\n return;\n }\n\n if (diagnostics.length > 0) {\n printDiagnostics(diagnostics, process.stderr, process.stderr.isTTY);\n logging.warn(`${diagnostics.length} diagnostics encountered in ${snippetCount} snippets`);\n }\n}\n\n/**\n * Rounds a decimal number to two decimal points.\n * The function is useful for fractions that need to be outputted as percentages.\n */\nfunction roundPercentage(num: number): number {\n return Math.round(10000 * num) / 100;\n}\n\nmain().catch((cause) => {\n console.error(cause);\n process.exitCode = -1;\n});\n"]}
|
package/lib/rosetta-reader.d.ts
CHANGED
|
@@ -139,7 +139,7 @@ export declare class RosettaTabletReader {
|
|
|
139
139
|
* method for documentation.
|
|
140
140
|
*/
|
|
141
141
|
translateSnippetsInMarkdown(apiLocation: ApiLocation, markdown: string, targetLang: TargetLanguage, strict: boolean, translationToCodeBlock?: (x: Translation) => CodeBlock, compileDirectory?: string): string;
|
|
142
|
-
printDiagnostics(stream: NodeJS.WritableStream): void;
|
|
142
|
+
printDiagnostics(stream: NodeJS.WritableStream, colors?: boolean): void;
|
|
143
143
|
get hasErrors(): boolean;
|
|
144
144
|
private get allTablets();
|
|
145
145
|
/**
|
package/lib/rosetta-reader.js
CHANGED
|
@@ -198,8 +198,8 @@ class RosettaTabletReader {
|
|
|
198
198
|
return translationToCodeBlock(translated);
|
|
199
199
|
}));
|
|
200
200
|
}
|
|
201
|
-
printDiagnostics(stream) {
|
|
202
|
-
(0, util_1.printDiagnostics)(this.diagnostics, stream);
|
|
201
|
+
printDiagnostics(stream, colors = true) {
|
|
202
|
+
(0, util_1.printDiagnostics)(this.diagnostics, stream, colors);
|
|
203
203
|
}
|
|
204
204
|
get hasErrors() {
|
|
205
205
|
return this.diagnostics.some((d) => d.isError);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rosetta-reader.js","sourceRoot":"","sources":["../src/rosetta-reader.ts"],"names":[],"mappings":"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","sourcesContent":["import * as spec from '@jsii/spec';\n\nimport { allTypeScriptSnippets, guessTabletLocation } from './jsii/assemblies';\nimport { TargetLanguage } from './languages';\nimport * as logging from './logging';\nimport { transformMarkdown } from './markdown/markdown';\nimport { MarkdownRenderer } from './markdown/markdown-renderer';\nimport { ReplaceTypeScriptTransform } from './markdown/replace-typescript-transform';\nimport { CodeBlock } from './markdown/types';\nimport {\n SnippetParameters,\n TypeScriptSnippet,\n updateParameters,\n ApiLocation,\n typeScriptSnippetFromSource,\n} from './snippet';\nimport { snippetKey } from './tablets/key';\nimport { LanguageTablet, Translation } from './tablets/tablets';\nimport { Translator } from './translate';\nimport { commentToken, pathExists, printDiagnostics } from './util';\n\nexport enum UnknownSnippetMode {\n /**\n * Return the snippet as given (untranslated)\n */\n VERBATIM = 'verbatim',\n\n /**\n * Live-translate the snippet as best as we can\n */\n TRANSLATE = 'translate',\n\n /**\n * Throw an error if this occurs\n */\n FAIL = 'fail',\n}\n\nexport interface RosettaOptions {\n /**\n * Whether or not to live-convert samples\n *\n * @default UnknownSnippetMode.VERBATIM\n */\n readonly unknownSnippets?: UnknownSnippetMode;\n\n /**\n * Target languages to use for live conversion\n *\n * @default All languages\n */\n readonly targetLanguages?: readonly TargetLanguage[];\n\n /**\n * Whether to include compiler diagnostics in the compilation results.\n */\n readonly includeCompilerDiagnostics?: boolean;\n\n /**\n * Whether this Rosetta should operate in \"loose\" mode, where missing literate\n * source files and missing fixtures are ignored instead of failing.\n *\n * @default false\n */\n readonly loose?: boolean;\n\n /**\n * Adds a disclaimer to start of snippet if it did not compile.\n *\n * @default false\n */\n readonly prefixDisclaimer?: boolean;\n}\n\n/**\n * Entry point class for consumers of Rosetta tablets (primarily: pacmak)\n *\n * Rosetta can work in one of two modes:\n *\n * 1. Live translation of snippets.\n * 2. Read translations from a pre-translated tablet (prepared using `jsii-rosetta extract` command).\n *\n * The second method affords more control over the precise circumstances of\n * sample compilation and is recommended, but the first method will do\n * when the second one is not necessary.\n */\nexport class RosettaTabletReader {\n /**\n * Newly translated samples\n *\n * In case live translation has been enabled, all samples that have been translated on-the-fly\n * are added to this tablet.\n */\n public readonly liveTablet = new LanguageTablet();\n\n private readonly loadedTablets: LanguageTablet[] = [];\n private readonly extractedSnippets = new Map<string, TypeScriptSnippet>();\n private readonly translator: Translator;\n private readonly loose: boolean;\n private readonly unknownSnippets: UnknownSnippetMode;\n private readonly _prefixDisclaimer: boolean;\n\n public constructor(private readonly options: RosettaOptions = {}) {\n this.loose = !!options.loose;\n this.unknownSnippets = options.unknownSnippets ?? UnknownSnippetMode.VERBATIM;\n this.translator = new Translator(options.includeCompilerDiagnostics ?? false);\n this._prefixDisclaimer = options.prefixDisclaimer ?? false;\n }\n\n /**\n * Diagnostics encountered while doing live translation\n */\n public get diagnostics() {\n return this.translator.diagnostics;\n }\n\n /**\n * Load a tablet as a source for translateable snippets\n *\n * Note: the snippets loaded from this tablet will NOT be validated for\n * their fingerprints or translator versions! If a matching snippet is found\n * in the tablet, it will always be returned, whether or not it is stale.\n */\n public async loadTabletFromFile(tabletFile: string) {\n const tablet = new LanguageTablet();\n await tablet.load(tabletFile);\n this.addTablet(tablet);\n }\n\n /**\n * Directly add a tablet to the list of tablets to load translations from\n */\n public addTablet(tablet: LanguageTablet) {\n this.loadedTablets.push(tablet);\n }\n\n /**\n * Add an assembly\n *\n * If a default tablet file is found in the assembly's directory, it will be\n * loaded (and assumed to contain a complete list of translated snippets for\n * this assembly already).\n *\n * Otherwise, if live conversion is enabled, the snippets in the assembly\n * become available for live translation later. This is necessary because we probably\n * need to fixturize snippets for successful compilation, and the information\n * pacmak sends our way later on is not going to be enough to do that.\n */\n public async addAssembly(assembly: spec.Assembly, assemblyDir: string) {\n const defaultTablet = guessTabletLocation(assemblyDir);\n if (await pathExists(defaultTablet)) {\n try {\n await this.loadTabletFromFile(defaultTablet);\n return;\n } catch (e: any) {\n logging.warn(`Error loading ${defaultTablet}: ${e.message}. Skipped.`);\n }\n }\n\n // Inventarize the snippets from this assembly, but only if there's a chance\n // we're going to need them.\n if (this.unknownSnippets === UnknownSnippetMode.TRANSLATE) {\n for (const tsnip of await allTypeScriptSnippets([{ assembly, directory: assemblyDir }], this.loose)) {\n this.extractedSnippets.set(snippetKey(tsnip), tsnip);\n }\n }\n }\n\n /**\n * Translate the given snippet for the given target language\n *\n * This will either:\n *\n * - Find an existing translation in a tablet and return that, if available.\n * - Otherwise, find a fixturized version of this snippet in an assembly that\n * was loaded beforehand, and translate it on-the-fly. Finding the fixture\n * will be based on the snippet key, which consists of a hash of the\n * visible source and the API location.\n * - Otherwise, translate the snippet as-is (without fixture information).\n *\n * This will do and store a full conversion of the given snippet, even if it only\n * returns one language. Subsequent retrievals for the same snippet in other\n * languages will reuse the translation from cache.\n *\n * If you are calling this for the side effect of adding translations to the live\n * tablet, you only need to do that for one language.\n */\n public translateSnippet(source: TypeScriptSnippet, targetLang: TargetLanguage): Translation | undefined {\n // Look for it in loaded tablets (or previous conversions)\n for (const tab of this.allTablets) {\n const ret = tab.lookup(source, targetLang);\n if (ret !== undefined) {\n return this.prefixDisclaimer(ret, this._prefixDisclaimer);\n }\n }\n\n if (this.unknownSnippets === UnknownSnippetMode.VERBATIM) {\n return this.prefixDisclaimer(\n {\n language: targetLang,\n source: source.visibleSource,\n },\n this._prefixDisclaimer,\n );\n }\n\n if (this.unknownSnippets === UnknownSnippetMode.FAIL) {\n const message = [\n 'The following snippet was not found in any of the loaded tablets:',\n source.visibleSource,\n `Location: ${JSON.stringify(source.location)}`,\n `Language: ${targetLang}`,\n ].join('\\n');\n throw new Error(message);\n }\n\n if (this.options.targetLanguages && !this.options.targetLanguages.includes(targetLang)) {\n throw new Error(\n `Rosetta configured for live conversion to ${this.options.targetLanguages.join(\n ', ',\n )}, but requested ${targetLang}`,\n );\n }\n\n // See if we can find a fixturized version of this snippet. If so, use that do the live\n // conversion.\n const extracted = this.extractedSnippets.get(snippetKey(source));\n if (extracted !== undefined) {\n const snippet = this.translator.translate(extracted, this.options.targetLanguages);\n this.liveTablet.addSnippet(snippet);\n return this.prefixDisclaimer(snippet.get(targetLang), this._prefixDisclaimer);\n }\n\n // Try to live-convert it as-is.\n const snippet = this.translator.translate(source, this.options.targetLanguages);\n this.liveTablet.addSnippet(snippet);\n return this.prefixDisclaimer(snippet.get(targetLang), this._prefixDisclaimer);\n }\n\n /**\n * Translate a snippet found in the \"@ example\" section of a jsii assembly\n *\n * Behaves exactly like `translateSnippet`, so see that method for documentation.\n */\n public translateExample(\n apiLocation: ApiLocation,\n example: string,\n targetLang: TargetLanguage,\n strict: boolean,\n compileDirectory = process.cwd(),\n ): Translation {\n const location = { api: apiLocation, field: { field: 'example' } } as const;\n\n const snippet = typeScriptSnippetFromSource(example, location, strict, {\n [SnippetParameters.$COMPILATION_DIRECTORY]: compileDirectory,\n });\n\n const translated = this.translateSnippet(snippet, targetLang);\n\n return translated ?? { language: 'typescript', source: example };\n }\n\n /**\n * Translate all TypeScript snippets found in a block of Markdown text\n *\n * For each snippet, behaves exactly like `translateSnippet`, so see that\n * method for documentation.\n */\n public translateSnippetsInMarkdown(\n apiLocation: ApiLocation,\n markdown: string,\n targetLang: TargetLanguage,\n strict: boolean,\n translationToCodeBlock: (x: Translation) => CodeBlock = id,\n compileDirectory = process.cwd(),\n ): string {\n return transformMarkdown(\n markdown,\n new MarkdownRenderer(),\n new ReplaceTypeScriptTransform(apiLocation, strict, (tsSnip) => {\n const translated = this.translateSnippet(\n updateParameters(tsSnip, {\n [SnippetParameters.$COMPILATION_DIRECTORY]: compileDirectory,\n }),\n targetLang,\n );\n if (!translated) {\n return undefined;\n }\n\n return translationToCodeBlock(translated);\n }),\n );\n }\n\n public printDiagnostics(stream: NodeJS.WritableStream) {\n printDiagnostics(this.diagnostics, stream);\n }\n\n public get hasErrors() {\n return this.diagnostics.some((d) => d.isError);\n }\n\n private get allTablets(): LanguageTablet[] {\n return [...this.loadedTablets, this.liveTablet];\n }\n\n /**\n * Adds a disclaimer to the front of the example if the prefixDisclaimer\n * flag is set and we know it does not compile.\n */\n private prefixDisclaimer(translation: Translation | undefined, prefixDisclaimer: boolean): Translation | undefined {\n if (!prefixDisclaimer || translation?.didCompile !== false) {\n return translation;\n }\n const comment = commentToken(translation.language);\n const disclaimer = 'Example automatically generated from non-compiling source. May contain errors.';\n return {\n ...translation,\n source: `${comment} ${disclaimer}\\n${translation.source}`,\n };\n }\n}\n\nfunction id(x: Translation) {\n return x;\n}\n\n/**\n * Backwards compatibility\n *\n * @deprecated use RosettaTabletReader instead\n */\nexport class Rosetta extends RosettaTabletReader {}\n"]}
|
|
1
|
+
{"version":3,"file":"rosetta-reader.js","sourceRoot":"","sources":["../src/rosetta-reader.ts"],"names":[],"mappings":";;;AAEA,kDAA+E;AAE/E,qCAAqC;AACrC,kDAAwD;AACxD,oEAAgE;AAChE,0FAAqF;AAErF,uCAMmB;AACnB,uCAA2C;AAC3C,+CAAgE;AAChE,2CAAyC;AACzC,iCAAoE;AAEpE,IAAY,kBAeX;AAfD,WAAY,kBAAkB;IAC5B;;OAEG;IACH,2CAAqB,CAAA;IAErB;;OAEG;IACH,6CAAuB,CAAA;IAEvB;;OAEG;IACH,mCAAa,CAAA;AACf,CAAC,EAfW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAe7B;AAsCD;;;;;;;;;;;GAWG;AACH,MAAa,mBAAmB;IAgB9B,YAAoC,UAA0B,EAAE;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAfhE;;;;;WAKG;QACa,eAAU,GAAG,IAAI,wBAAc,EAAE,CAAC;QAEjC,kBAAa,GAAqB,EAAE,CAAC;QACrC,sBAAiB,GAAG,IAAI,GAAG,EAA6B,CAAC;QAOxE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,kBAAkB,CAAC,QAAQ,CAAC;QAC9E,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAU,CAAC,OAAO,CAAC,0BAA0B,IAAI,KAAK,CAAC,CAAC;QAC9E,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QAChD,MAAM,MAAM,GAAG,IAAI,wBAAc,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,MAAsB;QACrC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,WAAW,CAAC,QAAuB,EAAE,WAAmB;QACnE,MAAM,aAAa,GAAG,IAAA,gCAAmB,EAAC,WAAW,CAAC,CAAC;QACvD,IAAI,MAAM,IAAA,iBAAU,EAAC,aAAa,CAAC,EAAE;YACnC,IAAI;gBACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;gBAC7C,OAAO;aACR;YAAC,OAAO,CAAM,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,iBAAiB,aAAa,KAAK,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC;aACxE;SACF;QAED,4EAA4E;QAC5E,4BAA4B;QAC5B,IAAI,IAAI,CAAC,eAAe,KAAK,kBAAkB,CAAC,SAAS,EAAE;YACzD,KAAK,MAAM,KAAK,IAAI,MAAM,IAAA,kCAAqB,EAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACnG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAA,gBAAU,EAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;aACtD;SACF;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACI,gBAAgB,CAAC,MAAyB,EAAE,UAA0B;QAC3E,0DAA0D;QAC1D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC3C,IAAI,GAAG,KAAK,SAAS,EAAE;gBACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;aAC3D;SACF;QAED,IAAI,IAAI,CAAC,eAAe,KAAK,kBAAkB,CAAC,QAAQ,EAAE;YACxD,OAAO,IAAI,CAAC,gBAAgB,CAC1B;gBACE,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,MAAM,CAAC,aAAa;aAC7B,EACD,IAAI,CAAC,iBAAiB,CACvB,CAAC;SACH;QAED,IAAI,IAAI,CAAC,eAAe,KAAK,kBAAkB,CAAC,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG;gBACd,mEAAmE;gBACnE,MAAM,CAAC,aAAa;gBACpB,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;gBAC9C,aAAa,UAAU,EAAE;aAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;SAC1B;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YACtF,MAAM,IAAI,KAAK,CACb,6CAA6C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAC5E,IAAI,CACL,mBAAmB,UAAU,EAAE,CACjC,CAAC;SACH;QAED,uFAAuF;QACvF,cAAc;QACd,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAA,gBAAU,EAAC,MAAM,CAAC,CAAC,CAAC;QACjE,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACnF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;SAC/E;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChF,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CACrB,WAAwB,EACxB,OAAe,EACf,UAA0B,EAC1B,MAAe,EACf,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QAEhC,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAW,CAAC;QAE5E,MAAM,OAAO,GAAG,IAAA,qCAA2B,EAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;YACrE,CAAC,2BAAiB,CAAC,sBAAsB,CAAC,EAAE,gBAAgB;SAC7D,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE9D,OAAO,UAAU,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACI,2BAA2B,CAChC,WAAwB,EACxB,QAAgB,EAChB,UAA0B,EAC1B,MAAe,EACf,yBAAwD,EAAE,EAC1D,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QAEhC,OAAO,IAAA,4BAAiB,EACtB,QAAQ,EACR,IAAI,oCAAgB,EAAE,EACtB,IAAI,yDAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CACtC,IAAA,0BAAgB,EAAC,MAAM,EAAE;gBACvB,CAAC,2BAAiB,CAAC,sBAAsB,CAAC,EAAE,gBAAgB;aAC7D,CAAC,EACF,UAAU,CACX,CAAC;YACF,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,SAAS,CAAC;aAClB;YAED,OAAO,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEM,gBAAgB,CAAC,MAA6B,EAAE,MAAM,GAAG,IAAI;QAClE,IAAA,uBAAgB,EAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,WAAoC,EAAE,gBAAyB;QACtF,IAAI,CAAC,gBAAgB,IAAI,WAAW,EAAE,UAAU,KAAK,KAAK,EAAE;YAC1D,OAAO,WAAW,CAAC;SACpB;QACD,MAAM,OAAO,GAAG,IAAA,mBAAY,EAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,gFAAgF,CAAC;QACpG,OAAO;YACL,GAAG,WAAW;YACd,MAAM,EAAE,GAAG,OAAO,IAAI,UAAU,KAAK,WAAW,CAAC,MAAM,EAAE;SAC1D,CAAC;IACJ,CAAC;CACF;AA5OD,kDA4OC;AAED,SAAS,EAAE,CAAC,CAAc;IACxB,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAa,OAAQ,SAAQ,mBAAmB;CAAG;AAAnD,0BAAmD","sourcesContent":["import * as spec from '@jsii/spec';\n\nimport { allTypeScriptSnippets, guessTabletLocation } from './jsii/assemblies';\nimport { TargetLanguage } from './languages';\nimport * as logging from './logging';\nimport { transformMarkdown } from './markdown/markdown';\nimport { MarkdownRenderer } from './markdown/markdown-renderer';\nimport { ReplaceTypeScriptTransform } from './markdown/replace-typescript-transform';\nimport { CodeBlock } from './markdown/types';\nimport {\n SnippetParameters,\n TypeScriptSnippet,\n updateParameters,\n ApiLocation,\n typeScriptSnippetFromSource,\n} from './snippet';\nimport { snippetKey } from './tablets/key';\nimport { LanguageTablet, Translation } from './tablets/tablets';\nimport { Translator } from './translate';\nimport { commentToken, pathExists, printDiagnostics } from './util';\n\nexport enum UnknownSnippetMode {\n /**\n * Return the snippet as given (untranslated)\n */\n VERBATIM = 'verbatim',\n\n /**\n * Live-translate the snippet as best as we can\n */\n TRANSLATE = 'translate',\n\n /**\n * Throw an error if this occurs\n */\n FAIL = 'fail',\n}\n\nexport interface RosettaOptions {\n /**\n * Whether or not to live-convert samples\n *\n * @default UnknownSnippetMode.VERBATIM\n */\n readonly unknownSnippets?: UnknownSnippetMode;\n\n /**\n * Target languages to use for live conversion\n *\n * @default All languages\n */\n readonly targetLanguages?: readonly TargetLanguage[];\n\n /**\n * Whether to include compiler diagnostics in the compilation results.\n */\n readonly includeCompilerDiagnostics?: boolean;\n\n /**\n * Whether this Rosetta should operate in \"loose\" mode, where missing literate\n * source files and missing fixtures are ignored instead of failing.\n *\n * @default false\n */\n readonly loose?: boolean;\n\n /**\n * Adds a disclaimer to start of snippet if it did not compile.\n *\n * @default false\n */\n readonly prefixDisclaimer?: boolean;\n}\n\n/**\n * Entry point class for consumers of Rosetta tablets (primarily: pacmak)\n *\n * Rosetta can work in one of two modes:\n *\n * 1. Live translation of snippets.\n * 2. Read translations from a pre-translated tablet (prepared using `jsii-rosetta extract` command).\n *\n * The second method affords more control over the precise circumstances of\n * sample compilation and is recommended, but the first method will do\n * when the second one is not necessary.\n */\nexport class RosettaTabletReader {\n /**\n * Newly translated samples\n *\n * In case live translation has been enabled, all samples that have been translated on-the-fly\n * are added to this tablet.\n */\n public readonly liveTablet = new LanguageTablet();\n\n private readonly loadedTablets: LanguageTablet[] = [];\n private readonly extractedSnippets = new Map<string, TypeScriptSnippet>();\n private readonly translator: Translator;\n private readonly loose: boolean;\n private readonly unknownSnippets: UnknownSnippetMode;\n private readonly _prefixDisclaimer: boolean;\n\n public constructor(private readonly options: RosettaOptions = {}) {\n this.loose = !!options.loose;\n this.unknownSnippets = options.unknownSnippets ?? UnknownSnippetMode.VERBATIM;\n this.translator = new Translator(options.includeCompilerDiagnostics ?? false);\n this._prefixDisclaimer = options.prefixDisclaimer ?? false;\n }\n\n /**\n * Diagnostics encountered while doing live translation\n */\n public get diagnostics() {\n return this.translator.diagnostics;\n }\n\n /**\n * Load a tablet as a source for translateable snippets\n *\n * Note: the snippets loaded from this tablet will NOT be validated for\n * their fingerprints or translator versions! If a matching snippet is found\n * in the tablet, it will always be returned, whether or not it is stale.\n */\n public async loadTabletFromFile(tabletFile: string) {\n const tablet = new LanguageTablet();\n await tablet.load(tabletFile);\n this.addTablet(tablet);\n }\n\n /**\n * Directly add a tablet to the list of tablets to load translations from\n */\n public addTablet(tablet: LanguageTablet) {\n this.loadedTablets.push(tablet);\n }\n\n /**\n * Add an assembly\n *\n * If a default tablet file is found in the assembly's directory, it will be\n * loaded (and assumed to contain a complete list of translated snippets for\n * this assembly already).\n *\n * Otherwise, if live conversion is enabled, the snippets in the assembly\n * become available for live translation later. This is necessary because we probably\n * need to fixturize snippets for successful compilation, and the information\n * pacmak sends our way later on is not going to be enough to do that.\n */\n public async addAssembly(assembly: spec.Assembly, assemblyDir: string) {\n const defaultTablet = guessTabletLocation(assemblyDir);\n if (await pathExists(defaultTablet)) {\n try {\n await this.loadTabletFromFile(defaultTablet);\n return;\n } catch (e: any) {\n logging.warn(`Error loading ${defaultTablet}: ${e.message}. Skipped.`);\n }\n }\n\n // Inventarize the snippets from this assembly, but only if there's a chance\n // we're going to need them.\n if (this.unknownSnippets === UnknownSnippetMode.TRANSLATE) {\n for (const tsnip of await allTypeScriptSnippets([{ assembly, directory: assemblyDir }], this.loose)) {\n this.extractedSnippets.set(snippetKey(tsnip), tsnip);\n }\n }\n }\n\n /**\n * Translate the given snippet for the given target language\n *\n * This will either:\n *\n * - Find an existing translation in a tablet and return that, if available.\n * - Otherwise, find a fixturized version of this snippet in an assembly that\n * was loaded beforehand, and translate it on-the-fly. Finding the fixture\n * will be based on the snippet key, which consists of a hash of the\n * visible source and the API location.\n * - Otherwise, translate the snippet as-is (without fixture information).\n *\n * This will do and store a full conversion of the given snippet, even if it only\n * returns one language. Subsequent retrievals for the same snippet in other\n * languages will reuse the translation from cache.\n *\n * If you are calling this for the side effect of adding translations to the live\n * tablet, you only need to do that for one language.\n */\n public translateSnippet(source: TypeScriptSnippet, targetLang: TargetLanguage): Translation | undefined {\n // Look for it in loaded tablets (or previous conversions)\n for (const tab of this.allTablets) {\n const ret = tab.lookup(source, targetLang);\n if (ret !== undefined) {\n return this.prefixDisclaimer(ret, this._prefixDisclaimer);\n }\n }\n\n if (this.unknownSnippets === UnknownSnippetMode.VERBATIM) {\n return this.prefixDisclaimer(\n {\n language: targetLang,\n source: source.visibleSource,\n },\n this._prefixDisclaimer,\n );\n }\n\n if (this.unknownSnippets === UnknownSnippetMode.FAIL) {\n const message = [\n 'The following snippet was not found in any of the loaded tablets:',\n source.visibleSource,\n `Location: ${JSON.stringify(source.location)}`,\n `Language: ${targetLang}`,\n ].join('\\n');\n throw new Error(message);\n }\n\n if (this.options.targetLanguages && !this.options.targetLanguages.includes(targetLang)) {\n throw new Error(\n `Rosetta configured for live conversion to ${this.options.targetLanguages.join(\n ', ',\n )}, but requested ${targetLang}`,\n );\n }\n\n // See if we can find a fixturized version of this snippet. If so, use that do the live\n // conversion.\n const extracted = this.extractedSnippets.get(snippetKey(source));\n if (extracted !== undefined) {\n const snippet = this.translator.translate(extracted, this.options.targetLanguages);\n this.liveTablet.addSnippet(snippet);\n return this.prefixDisclaimer(snippet.get(targetLang), this._prefixDisclaimer);\n }\n\n // Try to live-convert it as-is.\n const snippet = this.translator.translate(source, this.options.targetLanguages);\n this.liveTablet.addSnippet(snippet);\n return this.prefixDisclaimer(snippet.get(targetLang), this._prefixDisclaimer);\n }\n\n /**\n * Translate a snippet found in the \"@ example\" section of a jsii assembly\n *\n * Behaves exactly like `translateSnippet`, so see that method for documentation.\n */\n public translateExample(\n apiLocation: ApiLocation,\n example: string,\n targetLang: TargetLanguage,\n strict: boolean,\n compileDirectory = process.cwd(),\n ): Translation {\n const location = { api: apiLocation, field: { field: 'example' } } as const;\n\n const snippet = typeScriptSnippetFromSource(example, location, strict, {\n [SnippetParameters.$COMPILATION_DIRECTORY]: compileDirectory,\n });\n\n const translated = this.translateSnippet(snippet, targetLang);\n\n return translated ?? { language: 'typescript', source: example };\n }\n\n /**\n * Translate all TypeScript snippets found in a block of Markdown text\n *\n * For each snippet, behaves exactly like `translateSnippet`, so see that\n * method for documentation.\n */\n public translateSnippetsInMarkdown(\n apiLocation: ApiLocation,\n markdown: string,\n targetLang: TargetLanguage,\n strict: boolean,\n translationToCodeBlock: (x: Translation) => CodeBlock = id,\n compileDirectory = process.cwd(),\n ): string {\n return transformMarkdown(\n markdown,\n new MarkdownRenderer(),\n new ReplaceTypeScriptTransform(apiLocation, strict, (tsSnip) => {\n const translated = this.translateSnippet(\n updateParameters(tsSnip, {\n [SnippetParameters.$COMPILATION_DIRECTORY]: compileDirectory,\n }),\n targetLang,\n );\n if (!translated) {\n return undefined;\n }\n\n return translationToCodeBlock(translated);\n }),\n );\n }\n\n public printDiagnostics(stream: NodeJS.WritableStream, colors = true) {\n printDiagnostics(this.diagnostics, stream, colors);\n }\n\n public get hasErrors() {\n return this.diagnostics.some((d) => d.isError);\n }\n\n private get allTablets(): LanguageTablet[] {\n return [...this.loadedTablets, this.liveTablet];\n }\n\n /**\n * Adds a disclaimer to the front of the example if the prefixDisclaimer\n * flag is set and we know it does not compile.\n */\n private prefixDisclaimer(translation: Translation | undefined, prefixDisclaimer: boolean): Translation | undefined {\n if (!prefixDisclaimer || translation?.didCompile !== false) {\n return translation;\n }\n const comment = commentToken(translation.language);\n const disclaimer = 'Example automatically generated from non-compiling source. May contain errors.';\n return {\n ...translation,\n source: `${comment} ${disclaimer}\\n${translation.source}`,\n };\n }\n}\n\nfunction id(x: Translation) {\n return x;\n}\n\n/**\n * Backwards compatibility\n *\n * @deprecated use RosettaTabletReader instead\n */\nexport class Rosetta extends RosettaTabletReader {}\n"]}
|
package/lib/util.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface File {
|
|
|
6
6
|
readonly contents: string;
|
|
7
7
|
readonly fileName: string;
|
|
8
8
|
}
|
|
9
|
-
export declare function printDiagnostics(diags: readonly RosettaDiagnostic[], stream: NodeJS.WritableStream): void;
|
|
9
|
+
export declare function printDiagnostics(diags: readonly RosettaDiagnostic[], stream: NodeJS.WritableStream, colors: boolean): void;
|
|
10
10
|
export declare function formatList(xs: string[], n?: number): string;
|
|
11
11
|
export declare const StrictBrand = "jsii.strict";
|
|
12
12
|
/**
|
package/lib/util.js
CHANGED
|
@@ -6,11 +6,11 @@ function startsWithUppercase(x) {
|
|
|
6
6
|
return /^[A-Z]/.exec(x) != null;
|
|
7
7
|
}
|
|
8
8
|
exports.startsWithUppercase = startsWithUppercase;
|
|
9
|
-
function printDiagnostics(diags, stream) {
|
|
9
|
+
function printDiagnostics(diags, stream, colors) {
|
|
10
10
|
// Don't print too much, at some point it just clogs up the log
|
|
11
11
|
const maxDiags = 50;
|
|
12
12
|
for (const diag of diags.slice(0, maxDiags)) {
|
|
13
|
-
stream.write(diag.formattedMessage);
|
|
13
|
+
stream.write(colors ? diag.formattedMessage : stripColorCodes(diag.formattedMessage));
|
|
14
14
|
}
|
|
15
15
|
if (diags.length > maxDiags) {
|
|
16
16
|
stream.write(`(...and ${diags.length - maxDiags} more diagnostics not shown)`);
|
|
@@ -198,4 +198,12 @@ async function pathExists(path) {
|
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
exports.pathExists = pathExists;
|
|
201
|
+
// Copy/pasted from the 'ansi-regex' package to avoid taking a dependency for this one line that will never change
|
|
202
|
+
const ANSI_PATTERN = new RegExp([
|
|
203
|
+
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
|
|
204
|
+
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))',
|
|
205
|
+
].join('|'), 'g');
|
|
206
|
+
function stripColorCodes(x) {
|
|
207
|
+
return x.replace(ANSI_PATTERN, '');
|
|
208
|
+
}
|
|
201
209
|
//# sourceMappingURL=util.js.map
|
package/lib/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as ts from 'typescript';\n\nimport { RosettaDiagnostic } from './translate';\n\nexport function startsWithUppercase(x: string): boolean {\n return /^[A-Z]/.exec(x) != null;\n}\n\nexport interface File {\n readonly contents: string;\n readonly fileName: string;\n}\n\nexport function printDiagnostics(diags: readonly RosettaDiagnostic[], stream: NodeJS.WritableStream) {\n // Don't print too much, at some point it just clogs up the log\n const maxDiags = 50;\n\n for (const diag of diags.slice(0, maxDiags)) {\n stream.write(diag.formattedMessage);\n }\n\n if (diags.length > maxDiags) {\n stream.write(`(...and ${diags.length - maxDiags} more diagnostics not shown)`);\n }\n}\n\nexport function formatList(xs: string[], n = 5) {\n const tooMany = xs.length - n;\n\n return tooMany > 0 ? `${xs.slice(0, n).join(', ')} (and ${tooMany} more)` : xs.join(', ');\n}\n\nexport const StrictBrand = 'jsii.strict';\ninterface MaybeStrictDiagnostic {\n readonly [StrictBrand]?: boolean;\n}\n\n/**\n * Annotate a diagnostic with a magic property to indicate it's a strict diagnostic\n */\nexport function annotateStrictDiagnostic(diag: ts.Diagnostic) {\n Object.defineProperty(diag, StrictBrand, {\n configurable: false,\n enumerable: true,\n value: true,\n writable: false,\n });\n}\n\n/**\n * Return whether or not the given diagnostic was annotated with the magic strict property\n */\nexport function hasStrictBranding(diag: ts.Diagnostic) {\n return !!(diag as MaybeStrictDiagnostic)[StrictBrand];\n}\n\n/**\n * Chunk an array of elements into approximately equal groups\n */\nexport function divideEvenly<A>(groups: number, xs: A[]): A[][] {\n const chunkSize = Math.ceil(xs.length / groups);\n const ret: A[][] = [];\n\n for (let i = 0; i < groups; i++) {\n ret.push(xs.slice(i * chunkSize, (i + 1) * chunkSize));\n }\n\n return ret;\n}\n\nexport function flat<A>(xs: A[][]): A[] {\n return Array.prototype.concat.apply([], xs);\n}\n\n/**\n * Partition a list in twain using a predicate\n *\n * Returns [elements-matching-predicate, elements-not-matching-predicate];\n */\nexport function partition<A>(xs: A[], pred: (x: A) => boolean): [A[], A[]] {\n const truthy = new Array<A>();\n const falsy = new Array<A>();\n\n for (const x of xs) {\n if (pred(x)) {\n truthy.push(x);\n } else {\n falsy.push(x);\n }\n }\n\n return [truthy, falsy];\n}\n\nexport function setExtend<A>(xs: Set<A>, els: Iterable<A>) {\n for (const el of els) {\n xs.add(el);\n }\n}\n\nexport function mkDict<A extends string, B>(xs: Array<readonly [A, B]>): Record<A, B> {\n const ret: any = {};\n for (const [key, value] of xs) {\n ret[key] = value;\n }\n return ret;\n}\n\n/**\n * Apply a function to a value, as long as it's not `undefined`\n *\n * This is a companion helper to TypeScript's nice `??` and `?.` nullish\n * operators. Those operators are helpful if you're calling methods:\n *\n * object?.method() <- returns 'undefined' if 'object' is nullish\n *\n * But are no help when you want to use free functions:\n *\n * func(object) <- but what if 'object' is nullish and func\n * expects it not to be?\n *\n * Yes you can write `object ? func(object) : undefined` but the trailing\n * `: undefined` clutters your code. Instead, you write:\n *\n * fmap(object, func)\n *\n * The name `fmap` is taken from Haskell: it's a \"Functor-map\" (although\n * only for the `Maybe` Functor).\n */\nexport function fmap<A, B>(value: NonNullable<A>, fn: (x: NonNullable<A>) => B): B;\nexport function fmap<A, B>(value: undefined | null, fn: (x: NonNullable<A>) => B): undefined;\nexport function fmap<A, B>(value: A | undefined | null, fn: (x: A) => B): B | undefined;\nexport function fmap<A, B>(value: A, fn: (x: A) => B): B | undefined {\n if (value == null) {\n return undefined;\n }\n return fn(value);\n}\n\nexport function mapValues<A, B>(xs: Record<string, A>, fn: (x: A) => B): Record<string, B> {\n const ret: Record<string, B> = {};\n for (const [key, value] of Object.entries(xs)) {\n ret[key] = fn(value);\n }\n return ret;\n}\n\n/**\n * Sort an array by a key function.\n *\n * Instead of having to write your own comparators for your types any time you\n * want to sort, you supply a function that maps a value to a compound sort key\n * consisting of numbers or strings. The sorting will happen by that sort key\n * instead.\n */\nexport function sortBy<A>(xs: A[], keyFn: (x: A) => Array<string | number>) {\n return xs.sort((a, b) => {\n const aKey = keyFn(a);\n const bKey = keyFn(b);\n\n for (let i = 0; i < Math.min(aKey.length, bKey.length); i++) {\n // Compare aKey[i] to bKey[i]\n const av = aKey[i];\n const bv = bKey[i];\n\n if (av === bv) {\n continue;\n }\n\n if (typeof av !== typeof bv) {\n throw new Error(`Type of sort key ${JSON.stringify(aKey)} not same as ${JSON.stringify(bKey)}`);\n }\n\n if (typeof av === 'number' && typeof bv === 'number') {\n return av - bv;\n }\n\n if (typeof av === 'string' && typeof bv === 'string') {\n return av.localeCompare(bv);\n }\n }\n\n return aKey.length - bKey.length;\n });\n}\n\n/**\n * Group elements by a key\n *\n * Supply a function that maps each element to a key string.\n *\n * Returns a map of the key to the list of elements that map to that key.\n */\nexport function groupBy<A>(xs: A[], keyFn: (x: A) => string): Record<string, A[]> {\n const ret: Record<string, A[]> = {};\n for (const x of xs) {\n const key = keyFn(x);\n if (ret[key]) {\n ret[key].push(x);\n } else {\n ret[key] = [x];\n }\n }\n return ret;\n}\n\nexport function isDefined<A>(x: A): x is NonNullable<A> {\n return x !== undefined;\n}\n\nexport function indexBy<A>(xs: A[], fn: (x: A) => string): Record<string, A> {\n return mkDict(xs.map((x) => [fn(x), x] as const));\n}\n\nexport type Mutable<T> = { -readonly [P in keyof T]: Mutable<T[P]> };\n\nexport function commentToken(language: string) {\n // This is future-proofed a bit, but don't read too much in this...\n switch (language) {\n case 'python':\n case 'ruby':\n return '#';\n case 'csharp':\n case 'java':\n case 'go':\n default:\n return '//';\n }\n}\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await fs.stat(path);\n return true;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return false;\n }\n if (!err.stack) {\n Error.captureStackTrace(err);\n }\n throw err;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as ts from 'typescript';\n\nimport { RosettaDiagnostic } from './translate';\n\nexport function startsWithUppercase(x: string): boolean {\n return /^[A-Z]/.exec(x) != null;\n}\n\nexport interface File {\n readonly contents: string;\n readonly fileName: string;\n}\n\nexport function printDiagnostics(diags: readonly RosettaDiagnostic[], stream: NodeJS.WritableStream, colors: boolean) {\n // Don't print too much, at some point it just clogs up the log\n const maxDiags = 50;\n\n for (const diag of diags.slice(0, maxDiags)) {\n stream.write(colors ? diag.formattedMessage : stripColorCodes(diag.formattedMessage));\n }\n\n if (diags.length > maxDiags) {\n stream.write(`(...and ${diags.length - maxDiags} more diagnostics not shown)`);\n }\n}\n\nexport function formatList(xs: string[], n = 5) {\n const tooMany = xs.length - n;\n\n return tooMany > 0 ? `${xs.slice(0, n).join(', ')} (and ${tooMany} more)` : xs.join(', ');\n}\n\nexport const StrictBrand = 'jsii.strict';\ninterface MaybeStrictDiagnostic {\n readonly [StrictBrand]?: boolean;\n}\n\n/**\n * Annotate a diagnostic with a magic property to indicate it's a strict diagnostic\n */\nexport function annotateStrictDiagnostic(diag: ts.Diagnostic) {\n Object.defineProperty(diag, StrictBrand, {\n configurable: false,\n enumerable: true,\n value: true,\n writable: false,\n });\n}\n\n/**\n * Return whether or not the given diagnostic was annotated with the magic strict property\n */\nexport function hasStrictBranding(diag: ts.Diagnostic) {\n return !!(diag as MaybeStrictDiagnostic)[StrictBrand];\n}\n\n/**\n * Chunk an array of elements into approximately equal groups\n */\nexport function divideEvenly<A>(groups: number, xs: A[]): A[][] {\n const chunkSize = Math.ceil(xs.length / groups);\n const ret: A[][] = [];\n\n for (let i = 0; i < groups; i++) {\n ret.push(xs.slice(i * chunkSize, (i + 1) * chunkSize));\n }\n\n return ret;\n}\n\nexport function flat<A>(xs: A[][]): A[] {\n return Array.prototype.concat.apply([], xs);\n}\n\n/**\n * Partition a list in twain using a predicate\n *\n * Returns [elements-matching-predicate, elements-not-matching-predicate];\n */\nexport function partition<A>(xs: A[], pred: (x: A) => boolean): [A[], A[]] {\n const truthy = new Array<A>();\n const falsy = new Array<A>();\n\n for (const x of xs) {\n if (pred(x)) {\n truthy.push(x);\n } else {\n falsy.push(x);\n }\n }\n\n return [truthy, falsy];\n}\n\nexport function setExtend<A>(xs: Set<A>, els: Iterable<A>) {\n for (const el of els) {\n xs.add(el);\n }\n}\n\nexport function mkDict<A extends string, B>(xs: Array<readonly [A, B]>): Record<A, B> {\n const ret: any = {};\n for (const [key, value] of xs) {\n ret[key] = value;\n }\n return ret;\n}\n\n/**\n * Apply a function to a value, as long as it's not `undefined`\n *\n * This is a companion helper to TypeScript's nice `??` and `?.` nullish\n * operators. Those operators are helpful if you're calling methods:\n *\n * object?.method() <- returns 'undefined' if 'object' is nullish\n *\n * But are no help when you want to use free functions:\n *\n * func(object) <- but what if 'object' is nullish and func\n * expects it not to be?\n *\n * Yes you can write `object ? func(object) : undefined` but the trailing\n * `: undefined` clutters your code. Instead, you write:\n *\n * fmap(object, func)\n *\n * The name `fmap` is taken from Haskell: it's a \"Functor-map\" (although\n * only for the `Maybe` Functor).\n */\nexport function fmap<A, B>(value: NonNullable<A>, fn: (x: NonNullable<A>) => B): B;\nexport function fmap<A, B>(value: undefined | null, fn: (x: NonNullable<A>) => B): undefined;\nexport function fmap<A, B>(value: A | undefined | null, fn: (x: A) => B): B | undefined;\nexport function fmap<A, B>(value: A, fn: (x: A) => B): B | undefined {\n if (value == null) {\n return undefined;\n }\n return fn(value);\n}\n\nexport function mapValues<A, B>(xs: Record<string, A>, fn: (x: A) => B): Record<string, B> {\n const ret: Record<string, B> = {};\n for (const [key, value] of Object.entries(xs)) {\n ret[key] = fn(value);\n }\n return ret;\n}\n\n/**\n * Sort an array by a key function.\n *\n * Instead of having to write your own comparators for your types any time you\n * want to sort, you supply a function that maps a value to a compound sort key\n * consisting of numbers or strings. The sorting will happen by that sort key\n * instead.\n */\nexport function sortBy<A>(xs: A[], keyFn: (x: A) => Array<string | number>) {\n return xs.sort((a, b) => {\n const aKey = keyFn(a);\n const bKey = keyFn(b);\n\n for (let i = 0; i < Math.min(aKey.length, bKey.length); i++) {\n // Compare aKey[i] to bKey[i]\n const av = aKey[i];\n const bv = bKey[i];\n\n if (av === bv) {\n continue;\n }\n\n if (typeof av !== typeof bv) {\n throw new Error(`Type of sort key ${JSON.stringify(aKey)} not same as ${JSON.stringify(bKey)}`);\n }\n\n if (typeof av === 'number' && typeof bv === 'number') {\n return av - bv;\n }\n\n if (typeof av === 'string' && typeof bv === 'string') {\n return av.localeCompare(bv);\n }\n }\n\n return aKey.length - bKey.length;\n });\n}\n\n/**\n * Group elements by a key\n *\n * Supply a function that maps each element to a key string.\n *\n * Returns a map of the key to the list of elements that map to that key.\n */\nexport function groupBy<A>(xs: A[], keyFn: (x: A) => string): Record<string, A[]> {\n const ret: Record<string, A[]> = {};\n for (const x of xs) {\n const key = keyFn(x);\n if (ret[key]) {\n ret[key].push(x);\n } else {\n ret[key] = [x];\n }\n }\n return ret;\n}\n\nexport function isDefined<A>(x: A): x is NonNullable<A> {\n return x !== undefined;\n}\n\nexport function indexBy<A>(xs: A[], fn: (x: A) => string): Record<string, A> {\n return mkDict(xs.map((x) => [fn(x), x] as const));\n}\n\nexport type Mutable<T> = { -readonly [P in keyof T]: Mutable<T[P]> };\n\nexport function commentToken(language: string) {\n // This is future-proofed a bit, but don't read too much in this...\n switch (language) {\n case 'python':\n case 'ruby':\n return '#';\n case 'csharp':\n case 'java':\n case 'go':\n default:\n return '//';\n }\n}\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await fs.stat(path);\n return true;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return false;\n }\n if (!err.stack) {\n Error.captureStackTrace(err);\n }\n throw err;\n }\n}\n\n// Copy/pasted from the 'ansi-regex' package to avoid taking a dependency for this one line that will never change\nconst ANSI_PATTERN = new RegExp(\n [\n '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n '(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]))',\n ].join('|'),\n 'g',\n);\n\nfunction stripColorCodes(x: string) {\n return x.replace(ANSI_PATTERN, '');\n}\n"]}
|