jsii-rosetta 5.4.32-dev.3 → 5.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. package/README.md +2 -2
  2. package/lib/commands/convert.js +1 -2
  3. package/lib/commands/convert.js.map +1 -1
  4. package/lib/commands/coverage.js +1 -2
  5. package/lib/commands/coverage.js.map +1 -1
  6. package/lib/commands/extract.js +2 -3
  7. package/lib/commands/extract.js.map +1 -1
  8. package/lib/commands/infuse.js +2 -2
  9. package/lib/commands/infuse.js.map +1 -1
  10. package/lib/commands/read.js +1 -2
  11. package/lib/commands/read.js.map +1 -1
  12. package/lib/commands/transliterate.js +1 -2
  13. package/lib/commands/transliterate.js.map +1 -1
  14. package/lib/commands/trim-cache.js +1 -2
  15. package/lib/commands/trim-cache.js.map +1 -1
  16. package/lib/find-utils.js +4 -5
  17. package/lib/find-utils.js.map +1 -1
  18. package/lib/fixtures.js +1 -2
  19. package/lib/fixtures.js.map +1 -1
  20. package/lib/jsii/assemblies.js +9 -9
  21. package/lib/jsii/assemblies.js.map +1 -1
  22. package/lib/jsii/jsii-types.js +2 -3
  23. package/lib/jsii/jsii-types.js.map +1 -1
  24. package/lib/jsii/jsii-utils.js +15 -16
  25. package/lib/jsii/jsii-utils.js.map +1 -1
  26. package/lib/jsii/packages.js +1 -2
  27. package/lib/jsii/packages.js.map +1 -1
  28. package/lib/json.d.ts +0 -2
  29. package/lib/json.js +2 -3
  30. package/lib/json.js.map +1 -1
  31. package/lib/languages/target-language.js +3 -3
  32. package/lib/languages/target-language.js.map +1 -1
  33. package/lib/logging.js +6 -6
  34. package/lib/logging.js.map +1 -1
  35. package/lib/markdown/escapes.js +2 -3
  36. package/lib/markdown/escapes.js.map +1 -1
  37. package/lib/markdown/extract-snippets.js +1 -2
  38. package/lib/markdown/extract-snippets.js.map +1 -1
  39. package/lib/markdown/index.js +3 -4
  40. package/lib/markdown/index.js.map +1 -1
  41. package/lib/markdown/markdown-renderer.js +5 -5
  42. package/lib/markdown/markdown-renderer.js.map +1 -1
  43. package/lib/markdown/markdown.js +5 -6
  44. package/lib/markdown/markdown.js.map +1 -1
  45. package/lib/o-tree.js +2 -2
  46. package/lib/o-tree.js.map +1 -1
  47. package/lib/renderer.js +3 -2
  48. package/lib/renderer.js.map +1 -1
  49. package/lib/rosetta-reader.d.ts +0 -1
  50. package/lib/snippet-dependencies.js +5 -6
  51. package/lib/snippet-dependencies.js.map +1 -1
  52. package/lib/snippet-selectors.js +4 -5
  53. package/lib/snippet-selectors.js.map +1 -1
  54. package/lib/snippet.js +11 -11
  55. package/lib/snippet.js.map +1 -1
  56. package/lib/strict.js +1 -2
  57. package/lib/strict.js.map +1 -1
  58. package/lib/support.js +1 -2
  59. package/lib/support.js.map +1 -1
  60. package/lib/tablets/key.js +1 -2
  61. package/lib/tablets/key.js.map +1 -1
  62. package/lib/translate.js +4 -4
  63. package/lib/translate.js.map +1 -1
  64. package/lib/translate_all.js +1 -2
  65. package/lib/translate_all.js.map +1 -1
  66. package/lib/translate_all_worker.js +1 -2
  67. package/lib/translate_all_worker.js.map +1 -1
  68. package/lib/typescript/ast-utils.d.ts +1 -1
  69. package/lib/typescript/ast-utils.js +23 -23
  70. package/lib/typescript/ast-utils.js.map +1 -1
  71. package/lib/typescript/imports.d.ts +2 -2
  72. package/lib/typescript/imports.js +2 -3
  73. package/lib/typescript/imports.js.map +1 -1
  74. package/lib/typescript/types.js +16 -17
  75. package/lib/typescript/types.js.map +1 -1
  76. package/lib/typescript/visible-spans.js +4 -4
  77. package/lib/typescript/visible-spans.js.map +1 -1
  78. package/lib/util.d.ts +0 -1
  79. package/lib/util.js +19 -19
  80. package/lib/util.js.map +1 -1
  81. package/package.json +4 -4
  82. package/releases.json +4 -3
@@ -1,6 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.determineReturnType = exports.renderFlags = exports.isStaticReadonlyAccess = exports.isEnumAccess = exports.isNumber = exports.inferredTypeOfExpression = exports.typeOfExpression = exports.arrayElementType = exports.inferMapElementType = exports.mapElementType = exports.renderTypeFlags = exports.typeContainsUndefined = exports.parameterAcceptsUndefined = exports.renderType = exports.builtInTypeName = exports.firstTypeInUnion = void 0;
3
+ exports.firstTypeInUnion = firstTypeInUnion;
4
+ exports.builtInTypeName = builtInTypeName;
5
+ exports.renderType = renderType;
6
+ exports.parameterAcceptsUndefined = parameterAcceptsUndefined;
7
+ exports.typeContainsUndefined = typeContainsUndefined;
8
+ exports.renderTypeFlags = renderTypeFlags;
9
+ exports.mapElementType = mapElementType;
10
+ exports.inferMapElementType = inferMapElementType;
11
+ exports.arrayElementType = arrayElementType;
12
+ exports.typeOfExpression = typeOfExpression;
13
+ exports.inferredTypeOfExpression = inferredTypeOfExpression;
14
+ exports.isNumber = isNumber;
15
+ exports.isEnumAccess = isEnumAccess;
16
+ exports.isStaticReadonlyAccess = isStaticReadonlyAccess;
17
+ exports.renderFlags = renderFlags;
18
+ exports.determineReturnType = determineReturnType;
4
19
  const ts = require("typescript");
5
20
  const jsii_utils_1 = require("../jsii/jsii-utils");
6
21
  const util_1 = require("../util");
@@ -14,7 +29,6 @@ function firstTypeInUnion(typeChecker, type) {
14
29
  }
15
30
  return type.types[0];
16
31
  }
17
- exports.firstTypeInUnion = firstTypeInUnion;
18
32
  function builtInTypeName(type) {
19
33
  if ((0, jsii_utils_1.hasAnyFlag)(type.flags, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
20
34
  return 'any';
@@ -30,7 +44,6 @@ function builtInTypeName(type) {
30
44
  }
31
45
  return undefined;
32
46
  }
33
- exports.builtInTypeName = builtInTypeName;
34
47
  function renderType(type) {
35
48
  if (type.isClassOrInterface()) {
36
49
  return type.symbol.name;
@@ -41,7 +54,6 @@ function renderType(type) {
41
54
  }
42
55
  return renderTypeFlags(type);
43
56
  }
44
- exports.renderType = renderType;
45
57
  function parameterAcceptsUndefined(param, type) {
46
58
  if (param.initializer !== undefined) {
47
59
  return true;
@@ -54,7 +66,6 @@ function parameterAcceptsUndefined(param, type) {
54
66
  }
55
67
  return false;
56
68
  }
57
- exports.parameterAcceptsUndefined = parameterAcceptsUndefined;
58
69
  /**
59
70
  * This is a simplified check that should be good enough for most purposes
60
71
  */
@@ -67,11 +78,9 @@ function typeContainsUndefined(type) {
67
78
  }
68
79
  return false;
69
80
  }
70
- exports.typeContainsUndefined = typeContainsUndefined;
71
81
  function renderTypeFlags(type) {
72
82
  return renderFlags(type.flags, ts.TypeFlags);
73
83
  }
74
- exports.renderTypeFlags = renderTypeFlags;
75
84
  /**
76
85
  * If this is a map type, return the type mapped *to* (key must always be `string` anyway).
77
86
  */
@@ -96,7 +105,6 @@ function mapElementType(type, typeChecker) {
96
105
  }
97
106
  return { result: 'nonMap' };
98
107
  }
99
- exports.mapElementType = mapElementType;
100
108
  /**
101
109
  * Try to infer the map element type from the properties if they're all the same
102
110
  */
@@ -104,7 +112,6 @@ function inferMapElementType(elements, typeChecker) {
104
112
  const types = elements.map((e) => typeOfObjectLiteralProperty(typeChecker, e)).filter(util_1.isDefined);
105
113
  return types.every((t) => isSameType(types[0], t)) ? types[0] : undefined;
106
114
  }
107
- exports.inferMapElementType = inferMapElementType;
108
115
  function typeOfObjectLiteralProperty(typeChecker, el) {
109
116
  if (ts.isPropertyAssignment(el)) {
110
117
  return typeOfExpression(typeChecker, el.initializer);
@@ -134,12 +141,10 @@ function arrayElementType(type) {
134
141
  }
135
142
  return undefined;
136
143
  }
137
- exports.arrayElementType = arrayElementType;
138
144
  function typeOfExpression(typeChecker, node) {
139
145
  const t = typeChecker.getContextualType(node) ?? typeChecker.getTypeAtLocation(node);
140
146
  return (0, jsii_utils_1.resolveEnumLiteral)(typeChecker, t);
141
147
  }
142
- exports.typeOfExpression = typeOfExpression;
143
148
  /**
144
149
  * Infer type of expression by the argument it is assigned to
145
150
  *
@@ -152,16 +157,13 @@ function inferredTypeOfExpression(typeChecker, node) {
152
157
  const type = typeChecker.getContextualType(node);
153
158
  return type ? typeChecker.getNonNullableType(type) : undefined;
154
159
  }
155
- exports.inferredTypeOfExpression = inferredTypeOfExpression;
156
160
  function isNumber(x) {
157
161
  return typeof x === 'number';
158
162
  }
159
- exports.isNumber = isNumber;
160
163
  function isEnumAccess(typeChecker, access) {
161
164
  const symbol = (0, jsii_utils_1.resolvedSymbolAtLocation)(typeChecker, access.expression);
162
165
  return symbol ? (0, jsii_utils_1.hasAnyFlag)(symbol.flags, ts.SymbolFlags.Enum) : false;
163
166
  }
164
- exports.isEnumAccess = isEnumAccess;
165
167
  function isStaticReadonlyAccess(typeChecker, access) {
166
168
  const symbol = (0, jsii_utils_1.resolvedSymbolAtLocation)(typeChecker, access);
167
169
  const decl = symbol?.getDeclarations();
@@ -171,7 +173,6 @@ function isStaticReadonlyAccess(typeChecker, access) {
171
173
  }
172
174
  return false;
173
175
  }
174
- exports.isStaticReadonlyAccess = isStaticReadonlyAccess;
175
176
  function renderFlags(flags, flagObject) {
176
177
  if (flags === undefined) {
177
178
  return '';
@@ -182,7 +183,6 @@ function renderFlags(flags, flagObject) {
182
183
  .map((f) => flagObject[f])
183
184
  .join(',');
184
185
  }
185
- exports.renderFlags = renderFlags;
186
186
  function determineReturnType(typeChecker, node) {
187
187
  const signature = typeChecker.getSignatureFromDeclaration(node);
188
188
  if (!signature) {
@@ -190,5 +190,4 @@ function determineReturnType(typeChecker, node) {
190
190
  }
191
191
  return typeChecker.getReturnTypeOfSignature(signature);
192
192
  }
193
- exports.determineReturnType = determineReturnType;
194
193
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/typescript/types.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { hasAllFlags, hasAnyFlag, resolveEnumLiteral, resolvedSymbolAtLocation } from '../jsii/jsii-utils';\nimport { isDefined } from '../util';\n\n/**\n * Return the first non-undefined type from a union\n */\nexport function firstTypeInUnion(typeChecker: ts.TypeChecker, type: ts.Type): ts.Type {\n type = typeChecker.getNonNullableType(type);\n\n if (!type.isUnion()) {\n return type;\n }\n\n return type.types[0];\n}\n\nexport type BuiltInType = 'any' | 'boolean' | 'number' | 'string' | 'void';\nexport function builtInTypeName(type: ts.Type): BuiltInType | undefined {\n if (hasAnyFlag(type.flags, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {\n return 'any';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.BooleanLike)) {\n return 'boolean';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.NumberLike)) {\n return 'number';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.StringLike)) {\n return 'string';\n }\n return undefined;\n}\n\nexport function renderType(type: ts.Type): string {\n if (type.isClassOrInterface()) {\n return type.symbol.name;\n }\n if (type.isLiteral()) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${type.value}`;\n }\n return renderTypeFlags(type);\n}\n\nexport function parameterAcceptsUndefined(param: ts.ParameterDeclaration, type?: ts.Type): boolean {\n if (param.initializer !== undefined) {\n return true;\n }\n if (param.questionToken !== undefined) {\n return true;\n }\n if (type) {\n return typeContainsUndefined(type);\n }\n return false;\n}\n\n/**\n * This is a simplified check that should be good enough for most purposes\n */\nexport function typeContainsUndefined(type: ts.Type): boolean {\n if (type.getFlags() & ts.TypeFlags.Undefined) {\n return true;\n }\n if (type.isUnion()) {\n return type.types.some(typeContainsUndefined);\n }\n return false;\n}\n\nexport function renderTypeFlags(type: ts.Type): string {\n return renderFlags(type.flags, ts.TypeFlags);\n}\n\nexport type MapAnalysis = { result: 'nonMap' } | { result: 'map'; elementType: ts.Type | undefined };\n\n/**\n * If this is a map type, return the type mapped *to* (key must always be `string` anyway).\n */\nexport function mapElementType(type: ts.Type, typeChecker: ts.TypeChecker): MapAnalysis {\n if (hasAnyFlag(type.flags, ts.TypeFlags.Object) && type.symbol) {\n if (type.symbol.name === '__type') {\n // Declared map type: {[k: string]: A}\n return { result: 'map', elementType: type.getStringIndexType() };\n }\n\n if (type.symbol.name === '__object') {\n // Derived map type from object literal: typeof({ k: \"value\" })\n // For every property, get the node that created it (PropertyAssignment), and get the type of the initializer of that node\n const initializerTypes = type.getProperties().map((p) => {\n const expression = p.valueDeclaration ?? p.declarations![0];\n return typeOfObjectLiteralProperty(typeChecker, expression);\n });\n return {\n result: 'map',\n elementType: typeIfSame([...initializerTypes, type.getStringIndexType()].filter(isDefined)),\n };\n }\n }\n\n return { result: 'nonMap' };\n}\n\n/**\n * Try to infer the map element type from the properties if they're all the same\n */\nexport function inferMapElementType(\n elements: readonly ts.ObjectLiteralElementLike[],\n typeChecker: ts.TypeChecker,\n): ts.Type | undefined {\n const types = elements.map((e) => typeOfObjectLiteralProperty(typeChecker, e)).filter(isDefined);\n\n return types.every((t) => isSameType(types[0], t)) ? types[0] : undefined;\n}\n\nfunction typeOfObjectLiteralProperty(typeChecker: ts.TypeChecker, el: ts.Node): ts.Type | undefined {\n if (ts.isPropertyAssignment(el)) {\n return typeOfExpression(typeChecker, el.initializer);\n }\n if (ts.isShorthandPropertyAssignment(el)) {\n return typeOfExpression(typeChecker, el.name);\n }\n return undefined;\n}\n\nfunction isSameType(a: ts.Type, b: ts.Type) {\n return a.flags === b.flags && a.symbol?.name === b.symbol?.name;\n}\n\nfunction typeIfSame(types: Array<ts.Type | undefined>): ts.Type | undefined {\n const ttypes = types.filter(isDefined);\n if (types.length === 0) {\n return undefined;\n }\n\n return ttypes.every((t) => isSameType(ttypes[0], t)) ? ttypes[0] : undefined;\n}\n\n/**\n * If this is an array type, return the element type of the array\n */\nexport function arrayElementType(type: ts.Type): ts.Type | undefined {\n if (type.symbol && type.symbol.name === 'Array') {\n const tr = type as ts.TypeReference;\n return tr.aliasTypeArguments && tr.aliasTypeArguments[0];\n }\n return undefined;\n}\n\nexport function typeOfExpression(typeChecker: ts.TypeChecker, node: ts.Expression) {\n const t = typeChecker.getContextualType(node) ?? typeChecker.getTypeAtLocation(node);\n return resolveEnumLiteral(typeChecker, t);\n}\n\n/**\n * Infer type of expression by the argument it is assigned to\n *\n * If the type of the expression can include undefined (if the value is\n * optional), `undefined` will be removed from the union.\n *\n * (Will return undefined for object literals not unified with a declared type)\n */\nexport function inferredTypeOfExpression(typeChecker: ts.TypeChecker, node: ts.Expression) {\n const type = typeChecker.getContextualType(node);\n return type ? typeChecker.getNonNullableType(type) : undefined;\n}\n\nexport function isNumber(x: any): x is number {\n return typeof x === 'number';\n}\n\nexport function isEnumAccess(typeChecker: ts.TypeChecker, access: ts.PropertyAccessExpression) {\n const symbol = resolvedSymbolAtLocation(typeChecker, access.expression);\n return symbol ? hasAnyFlag(symbol.flags, ts.SymbolFlags.Enum) : false;\n}\n\nexport function isStaticReadonlyAccess(typeChecker: ts.TypeChecker, access: ts.PropertyAccessExpression) {\n const symbol = resolvedSymbolAtLocation(typeChecker, access);\n const decl = symbol?.getDeclarations();\n if (decl && decl[0] && ts.isPropertyDeclaration(decl[0])) {\n const flags = ts.getCombinedModifierFlags(decl[0]);\n return hasAllFlags(flags, ts.ModifierFlags.Readonly | ts.ModifierFlags.Static);\n }\n return false;\n}\n\nexport function renderFlags(flags: number | undefined, flagObject: Record<string, number | string>) {\n if (flags === undefined) {\n return '';\n }\n\n return Object.values(flagObject)\n .filter(isNumber)\n .filter((f) => hasAllFlags(flags, f))\n .map((f) => flagObject[f])\n .join(',');\n}\n\nexport function determineReturnType(typeChecker: ts.TypeChecker, node: ts.SignatureDeclaration): ts.Type | undefined {\n const signature = typeChecker.getSignatureFromDeclaration(node);\n if (!signature) {\n return undefined;\n }\n return typeChecker.getReturnTypeOfSignature(signature);\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/typescript/types.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { hasAllFlags, hasAnyFlag, resolveEnumLiteral, resolvedSymbolAtLocation } from '../jsii/jsii-utils';\nimport { isDefined } from '../util';\n\n/**\n * Return the first non-undefined type from a union\n */\nexport function firstTypeInUnion(typeChecker: ts.TypeChecker, type: ts.Type): ts.Type {\n type = typeChecker.getNonNullableType(type);\n\n if (!type.isUnion()) {\n return type;\n }\n\n return type.types[0];\n}\n\nexport type BuiltInType = 'any' | 'boolean' | 'number' | 'string' | 'void';\nexport function builtInTypeName(type: ts.Type): BuiltInType | undefined {\n if (hasAnyFlag(type.flags, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {\n return 'any';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.BooleanLike)) {\n return 'boolean';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.NumberLike)) {\n return 'number';\n }\n if (hasAnyFlag(type.flags, ts.TypeFlags.StringLike)) {\n return 'string';\n }\n return undefined;\n}\n\nexport function renderType(type: ts.Type): string {\n if (type.isClassOrInterface()) {\n return type.symbol.name;\n }\n if (type.isLiteral()) {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${type.value}`;\n }\n return renderTypeFlags(type);\n}\n\nexport function parameterAcceptsUndefined(param: ts.ParameterDeclaration, type?: ts.Type): boolean {\n if (param.initializer !== undefined) {\n return true;\n }\n if (param.questionToken !== undefined) {\n return true;\n }\n if (type) {\n return typeContainsUndefined(type);\n }\n return false;\n}\n\n/**\n * This is a simplified check that should be good enough for most purposes\n */\nexport function typeContainsUndefined(type: ts.Type): boolean {\n if (type.getFlags() & ts.TypeFlags.Undefined) {\n return true;\n }\n if (type.isUnion()) {\n return type.types.some(typeContainsUndefined);\n }\n return false;\n}\n\nexport function renderTypeFlags(type: ts.Type): string {\n return renderFlags(type.flags, ts.TypeFlags);\n}\n\nexport type MapAnalysis = { result: 'nonMap' } | { result: 'map'; elementType: ts.Type | undefined };\n\n/**\n * If this is a map type, return the type mapped *to* (key must always be `string` anyway).\n */\nexport function mapElementType(type: ts.Type, typeChecker: ts.TypeChecker): MapAnalysis {\n if (hasAnyFlag(type.flags, ts.TypeFlags.Object) && type.symbol) {\n if (type.symbol.name === '__type') {\n // Declared map type: {[k: string]: A}\n return { result: 'map', elementType: type.getStringIndexType() };\n }\n\n if (type.symbol.name === '__object') {\n // Derived map type from object literal: typeof({ k: \"value\" })\n // For every property, get the node that created it (PropertyAssignment), and get the type of the initializer of that node\n const initializerTypes = type.getProperties().map((p) => {\n const expression = p.valueDeclaration ?? p.declarations![0];\n return typeOfObjectLiteralProperty(typeChecker, expression);\n });\n return {\n result: 'map',\n elementType: typeIfSame([...initializerTypes, type.getStringIndexType()].filter(isDefined)),\n };\n }\n }\n\n return { result: 'nonMap' };\n}\n\n/**\n * Try to infer the map element type from the properties if they're all the same\n */\nexport function inferMapElementType(\n elements: readonly ts.ObjectLiteralElementLike[],\n typeChecker: ts.TypeChecker,\n): ts.Type | undefined {\n const types = elements.map((e) => typeOfObjectLiteralProperty(typeChecker, e)).filter(isDefined);\n\n return types.every((t) => isSameType(types[0], t)) ? types[0] : undefined;\n}\n\nfunction typeOfObjectLiteralProperty(typeChecker: ts.TypeChecker, el: ts.Node): ts.Type | undefined {\n if (ts.isPropertyAssignment(el)) {\n return typeOfExpression(typeChecker, el.initializer);\n }\n if (ts.isShorthandPropertyAssignment(el)) {\n return typeOfExpression(typeChecker, el.name);\n }\n return undefined;\n}\n\nfunction isSameType(a: ts.Type, b: ts.Type) {\n return a.flags === b.flags && a.symbol?.name === b.symbol?.name;\n}\n\nfunction typeIfSame(types: Array<ts.Type | undefined>): ts.Type | undefined {\n const ttypes = types.filter(isDefined);\n if (types.length === 0) {\n return undefined;\n }\n\n return ttypes.every((t) => isSameType(ttypes[0], t)) ? ttypes[0] : undefined;\n}\n\n/**\n * If this is an array type, return the element type of the array\n */\nexport function arrayElementType(type: ts.Type): ts.Type | undefined {\n if (type.symbol && type.symbol.name === 'Array') {\n const tr = type as ts.TypeReference;\n return tr.aliasTypeArguments && tr.aliasTypeArguments[0];\n }\n return undefined;\n}\n\nexport function typeOfExpression(typeChecker: ts.TypeChecker, node: ts.Expression) {\n const t = typeChecker.getContextualType(node) ?? typeChecker.getTypeAtLocation(node);\n return resolveEnumLiteral(typeChecker, t);\n}\n\n/**\n * Infer type of expression by the argument it is assigned to\n *\n * If the type of the expression can include undefined (if the value is\n * optional), `undefined` will be removed from the union.\n *\n * (Will return undefined for object literals not unified with a declared type)\n */\nexport function inferredTypeOfExpression(typeChecker: ts.TypeChecker, node: ts.Expression) {\n const type = typeChecker.getContextualType(node);\n return type ? typeChecker.getNonNullableType(type) : undefined;\n}\n\nexport function isNumber(x: any): x is number {\n return typeof x === 'number';\n}\n\nexport function isEnumAccess(typeChecker: ts.TypeChecker, access: ts.PropertyAccessExpression) {\n const symbol = resolvedSymbolAtLocation(typeChecker, access.expression);\n return symbol ? hasAnyFlag(symbol.flags, ts.SymbolFlags.Enum) : false;\n}\n\nexport function isStaticReadonlyAccess(typeChecker: ts.TypeChecker, access: ts.PropertyAccessExpression) {\n const symbol = resolvedSymbolAtLocation(typeChecker, access);\n const decl = symbol?.getDeclarations();\n if (decl && decl[0] && ts.isPropertyDeclaration(decl[0])) {\n const flags = ts.getCombinedModifierFlags(decl[0]);\n return hasAllFlags(flags, ts.ModifierFlags.Readonly | ts.ModifierFlags.Static);\n }\n return false;\n}\n\nexport function renderFlags(flags: number | undefined, flagObject: Record<string, number | string>) {\n if (flags === undefined) {\n return '';\n }\n\n return Object.values(flagObject)\n .filter(isNumber)\n .filter((f) => hasAllFlags(flags, f))\n .map((f) => flagObject[f])\n .join(',');\n}\n\nexport function determineReturnType(typeChecker: ts.TypeChecker, node: ts.SignatureDeclaration): ts.Type | undefined {\n const signature = typeChecker.getSignatureFromDeclaration(node);\n if (!signature) {\n return undefined;\n }\n return typeChecker.getReturnTypeOfSignature(signature);\n}\n"]}
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.spanContains = exports.spanInside = exports.trimCompleteSourceToVisible = exports.Spans = void 0;
3
+ exports.Spans = void 0;
4
+ exports.trimCompleteSourceToVisible = trimCompleteSourceToVisible;
5
+ exports.spanInside = spanInside;
6
+ exports.spanContains = spanContains;
4
7
  /**
5
8
  * A class representing a set of non-overlapping Spans.
6
9
  */
@@ -84,7 +87,6 @@ function trimCompleteSourceToVisible(source) {
84
87
  .join('')
85
88
  .trimRight();
86
89
  }
87
- exports.trimCompleteSourceToVisible = trimCompleteSourceToVisible;
88
90
  function calculateMarkedSpans(source) {
89
91
  const regEx = /^[ \t]*[/]{3}[ \t]*(!(?:show|hide))[ \t]*$/gm;
90
92
  const ret = new Array();
@@ -120,9 +122,7 @@ function calculateMarkedSpans(source) {
120
122
  function spanInside(a, b) {
121
123
  return b.start <= a.start && a.end <= b.end;
122
124
  }
123
- exports.spanInside = spanInside;
124
125
  function spanContains(a, position) {
125
126
  return a.start <= position && position < a.end;
126
127
  }
127
- exports.spanContains = spanContains;
128
128
  //# sourceMappingURL=visible-spans.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"visible-spans.js","sourceRoot":"","sources":["../../src/typescript/visible-spans.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { Span } from '../o-tree';\n\n/**\n * A class representing a set of non-overlapping Spans.\n */\nexport class Spans {\n /**\n * Derive visible spans from marked source (`/// !show` and `/// !hide` directives).\n */\n public static visibleSpansFromSource(source: string) {\n return new Spans(calculateMarkedSpans(source).filter((s) => s.visible));\n }\n\n public constructor(private readonly _spans: Span[]) {\n _spans.sort((a, b) => a.start - b.start);\n\n // Merge adjacent spans\n let i = 0;\n while (i < this._spans.length - 1) {\n const current = this._spans[i];\n const next = this._spans[i + 1];\n\n if (current.end === next.start) {\n // Replace these two with a new, merged one\n this._spans.splice(i, 2, {\n start: current.start,\n end: next.end,\n });\n } else {\n // Else advance\n i++;\n }\n }\n }\n\n public get spans(): readonly Span[] {\n return this._spans;\n }\n\n /**\n * Whether another span is fully contained within this set of spans\n */\n public fullyContainsSpan(span: Span) {\n const candidate = this.findSpan(span.start);\n return !!candidate && spanInside(span, candidate);\n }\n\n public containsPosition(pos: number) {\n const candidate = this.findSpan(pos);\n return !!candidate && spanContains(candidate, pos);\n }\n\n /**\n * Return whether the START of the given node is visible\n *\n * For nodes that potentially span many lines (like class declarations)\n * this will check the first line.\n */\n public containsStartOfNode(node: ts.Node) {\n return this.containsPosition(node.getStart());\n }\n\n /**\n * Find the span that would contain the given position, if any\n *\n * Returns the highest span s.t. span.start <= position. Uses the fact that\n * spans are non-overlapping.\n */\n private findSpan(position: number): Span | undefined {\n // For now, using linear search as the amount of spans is rather trivial.\n // Change to binary search if this ever becomes an issue\n if (this.spans.length === 0 || position < this._spans[0].start) {\n return undefined;\n }\n\n let candidate = this._spans[0];\n let i = 1;\n while (i < this.spans.length && this.spans[i].start <= position) {\n candidate = this._spans[i];\n i++;\n }\n return candidate;\n }\n}\n\nexport function trimCompleteSourceToVisible(source: string): string {\n const spans = Spans.visibleSpansFromSource(source);\n\n return spans.spans\n .map((span) => source.substring(span.start, span.end))\n .join('')\n .trimRight();\n}\n\nexport interface MarkedSpan {\n start: number;\n end: number;\n visible: boolean;\n}\n\nfunction calculateMarkedSpans(source: string): MarkedSpan[] {\n const regEx = /^[ \\t]*[/]{3}[ \\t]*(!(?:show|hide))[ \\t]*$/gm;\n\n const ret = new Array<MarkedSpan>();\n let match;\n let spanStart;\n let visible = true;\n while ((match = regEx.exec(source)) != null) {\n const directiveStart = match.index;\n const directive = match[1].trim();\n if (['!hide', '!show'].includes(directive)) {\n const isShow = directive === '!show';\n if (spanStart === undefined) {\n // Add a span at the start which is the reverse of the actual first directive\n ret.push({ start: 0, end: directiveStart, visible: !isShow });\n } else {\n // Else add a span for the current directive\n ret.push({ start: spanStart, end: directiveStart, visible });\n }\n visible = isShow;\n\n // A directive eats its trailing newline.\n spanStart = match.index + match[0].length + 1;\n }\n }\n\n // Add the remainder under the last visibility\n ret.push({ start: spanStart ?? 0, end: source.length, visible });\n\n // Filter empty spans and return\n return ret.filter((s) => s.start < s.end);\n}\n\n/**\n * Whether span a is fully inside span b\n */\nexport function spanInside(a: Span, b: Span) {\n return b.start <= a.start && a.end <= b.end;\n}\n\nexport function spanContains(a: Span, position: number) {\n return a.start <= position && position < a.end;\n}\n"]}
1
+ {"version":3,"file":"visible-spans.js","sourceRoot":"","sources":["../../src/typescript/visible-spans.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ts from 'typescript';\n\nimport { Span } from '../o-tree';\n\n/**\n * A class representing a set of non-overlapping Spans.\n */\nexport class Spans {\n /**\n * Derive visible spans from marked source (`/// !show` and `/// !hide` directives).\n */\n public static visibleSpansFromSource(source: string) {\n return new Spans(calculateMarkedSpans(source).filter((s) => s.visible));\n }\n\n public constructor(private readonly _spans: Span[]) {\n _spans.sort((a, b) => a.start - b.start);\n\n // Merge adjacent spans\n let i = 0;\n while (i < this._spans.length - 1) {\n const current = this._spans[i];\n const next = this._spans[i + 1];\n\n if (current.end === next.start) {\n // Replace these two with a new, merged one\n this._spans.splice(i, 2, {\n start: current.start,\n end: next.end,\n });\n } else {\n // Else advance\n i++;\n }\n }\n }\n\n public get spans(): readonly Span[] {\n return this._spans;\n }\n\n /**\n * Whether another span is fully contained within this set of spans\n */\n public fullyContainsSpan(span: Span) {\n const candidate = this.findSpan(span.start);\n return !!candidate && spanInside(span, candidate);\n }\n\n public containsPosition(pos: number) {\n const candidate = this.findSpan(pos);\n return !!candidate && spanContains(candidate, pos);\n }\n\n /**\n * Return whether the START of the given node is visible\n *\n * For nodes that potentially span many lines (like class declarations)\n * this will check the first line.\n */\n public containsStartOfNode(node: ts.Node) {\n return this.containsPosition(node.getStart());\n }\n\n /**\n * Find the span that would contain the given position, if any\n *\n * Returns the highest span s.t. span.start <= position. Uses the fact that\n * spans are non-overlapping.\n */\n private findSpan(position: number): Span | undefined {\n // For now, using linear search as the amount of spans is rather trivial.\n // Change to binary search if this ever becomes an issue\n if (this.spans.length === 0 || position < this._spans[0].start) {\n return undefined;\n }\n\n let candidate = this._spans[0];\n let i = 1;\n while (i < this.spans.length && this.spans[i].start <= position) {\n candidate = this._spans[i];\n i++;\n }\n return candidate;\n }\n}\n\nexport function trimCompleteSourceToVisible(source: string): string {\n const spans = Spans.visibleSpansFromSource(source);\n\n return spans.spans\n .map((span) => source.substring(span.start, span.end))\n .join('')\n .trimRight();\n}\n\nexport interface MarkedSpan {\n start: number;\n end: number;\n visible: boolean;\n}\n\nfunction calculateMarkedSpans(source: string): MarkedSpan[] {\n const regEx = /^[ \\t]*[/]{3}[ \\t]*(!(?:show|hide))[ \\t]*$/gm;\n\n const ret = new Array<MarkedSpan>();\n let match;\n let spanStart;\n let visible = true;\n while ((match = regEx.exec(source)) != null) {\n const directiveStart = match.index;\n const directive = match[1].trim();\n if (['!hide', '!show'].includes(directive)) {\n const isShow = directive === '!show';\n if (spanStart === undefined) {\n // Add a span at the start which is the reverse of the actual first directive\n ret.push({ start: 0, end: directiveStart, visible: !isShow });\n } else {\n // Else add a span for the current directive\n ret.push({ start: spanStart, end: directiveStart, visible });\n }\n visible = isShow;\n\n // A directive eats its trailing newline.\n spanStart = match.index + match[0].length + 1;\n }\n }\n\n // Add the remainder under the last visibility\n ret.push({ start: spanStart ?? 0, end: source.length, visible });\n\n // Filter empty spans and return\n return ret.filter((s) => s.start < s.end);\n}\n\n/**\n * Whether span a is fully inside span b\n */\nexport function spanInside(a: Span, b: Span) {\n return b.start <= a.start && a.end <= b.end;\n}\n\nexport function spanContains(a: Span, position: number) {\n return a.start <= position && position < a.end;\n}\n"]}
package/lib/util.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import * as ts from 'typescript';
3
2
  import { RosettaDiagnostic } from './translate';
4
3
  export declare function startsWithUppercase(x: string): boolean;
package/lib/util.js CHANGED
@@ -1,11 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pathExists = exports.commentToken = exports.indexBy = exports.isDefined = exports.groupBy = exports.sortBy = exports.mapValues = exports.fmap = exports.mkDict = exports.setExtend = exports.partition = exports.flat = exports.divideEvenly = exports.hasStrictBranding = exports.annotateStrictDiagnostic = exports.StrictBrand = exports.formatList = exports.printDiagnostics = exports.startsWithUppercase = void 0;
3
+ exports.StrictBrand = void 0;
4
+ exports.startsWithUppercase = startsWithUppercase;
5
+ exports.printDiagnostics = printDiagnostics;
6
+ exports.formatList = formatList;
7
+ exports.annotateStrictDiagnostic = annotateStrictDiagnostic;
8
+ exports.hasStrictBranding = hasStrictBranding;
9
+ exports.divideEvenly = divideEvenly;
10
+ exports.flat = flat;
11
+ exports.partition = partition;
12
+ exports.setExtend = setExtend;
13
+ exports.mkDict = mkDict;
14
+ exports.fmap = fmap;
15
+ exports.mapValues = mapValues;
16
+ exports.sortBy = sortBy;
17
+ exports.groupBy = groupBy;
18
+ exports.isDefined = isDefined;
19
+ exports.indexBy = indexBy;
20
+ exports.commentToken = commentToken;
21
+ exports.pathExists = pathExists;
4
22
  const node_fs_1 = require("node:fs");
5
23
  function startsWithUppercase(x) {
6
24
  return /^[A-Z]/.exec(x) != null;
7
25
  }
8
- exports.startsWithUppercase = startsWithUppercase;
9
26
  function printDiagnostics(diags, stream, colors) {
10
27
  // Don't print too much, at some point it just clogs up the log
11
28
  const maxDiags = 50;
@@ -16,12 +33,10 @@ function printDiagnostics(diags, stream, colors) {
16
33
  stream.write(`(...and ${diags.length - maxDiags} more diagnostics not shown)`);
17
34
  }
18
35
  }
19
- exports.printDiagnostics = printDiagnostics;
20
36
  function formatList(xs, n = 5) {
21
37
  const tooMany = xs.length - n;
22
38
  return tooMany > 0 ? `${xs.slice(0, n).join(', ')} (and ${tooMany} more)` : xs.join(', ');
23
39
  }
24
- exports.formatList = formatList;
25
40
  exports.StrictBrand = 'jsii.strict';
26
41
  /**
27
42
  * Annotate a diagnostic with a magic property to indicate it's a strict diagnostic
@@ -34,14 +49,12 @@ function annotateStrictDiagnostic(diag) {
34
49
  writable: false,
35
50
  });
36
51
  }
37
- exports.annotateStrictDiagnostic = annotateStrictDiagnostic;
38
52
  /**
39
53
  * Return whether or not the given diagnostic was annotated with the magic strict property
40
54
  */
41
55
  function hasStrictBranding(diag) {
42
56
  return !!diag[exports.StrictBrand];
43
57
  }
44
- exports.hasStrictBranding = hasStrictBranding;
45
58
  /**
46
59
  * Chunk an array of elements into approximately equal groups
47
60
  */
@@ -53,11 +66,9 @@ function divideEvenly(groups, xs) {
53
66
  }
54
67
  return ret;
55
68
  }
56
- exports.divideEvenly = divideEvenly;
57
69
  function flat(xs) {
58
70
  return Array.prototype.concat.apply([], xs);
59
71
  }
60
- exports.flat = flat;
61
72
  /**
62
73
  * Partition a list in twain using a predicate
63
74
  *
@@ -76,13 +87,11 @@ function partition(xs, pred) {
76
87
  }
77
88
  return [truthy, falsy];
78
89
  }
79
- exports.partition = partition;
80
90
  function setExtend(xs, els) {
81
91
  for (const el of els) {
82
92
  xs.add(el);
83
93
  }
84
94
  }
85
- exports.setExtend = setExtend;
86
95
  function mkDict(xs) {
87
96
  const ret = {};
88
97
  for (const [key, value] of xs) {
@@ -90,14 +99,12 @@ function mkDict(xs) {
90
99
  }
91
100
  return ret;
92
101
  }
93
- exports.mkDict = mkDict;
94
102
  function fmap(value, fn) {
95
103
  if (value == null) {
96
104
  return undefined;
97
105
  }
98
106
  return fn(value);
99
107
  }
100
- exports.fmap = fmap;
101
108
  function mapValues(xs, fn) {
102
109
  const ret = {};
103
110
  for (const [key, value] of Object.entries(xs)) {
@@ -105,7 +112,6 @@ function mapValues(xs, fn) {
105
112
  }
106
113
  return ret;
107
114
  }
108
- exports.mapValues = mapValues;
109
115
  /**
110
116
  * Sort an array by a key function.
111
117
  *
@@ -138,7 +144,6 @@ function sortBy(xs, keyFn) {
138
144
  return aKey.length - bKey.length;
139
145
  });
140
146
  }
141
- exports.sortBy = sortBy;
142
147
  /**
143
148
  * Group elements by a key
144
149
  *
@@ -159,15 +164,12 @@ function groupBy(xs, keyFn) {
159
164
  }
160
165
  return ret;
161
166
  }
162
- exports.groupBy = groupBy;
163
167
  function isDefined(x) {
164
168
  return x !== undefined;
165
169
  }
166
- exports.isDefined = isDefined;
167
170
  function indexBy(xs, fn) {
168
171
  return mkDict(xs.map((x) => [fn(x), x]));
169
172
  }
170
- exports.indexBy = indexBy;
171
173
  function commentToken(language) {
172
174
  // This is future-proofed a bit, but don't read too much in this...
173
175
  switch (language) {
@@ -181,7 +183,6 @@ function commentToken(language) {
181
183
  return '//';
182
184
  }
183
185
  }
184
- exports.commentToken = commentToken;
185
186
  async function pathExists(path) {
186
187
  try {
187
188
  await node_fs_1.promises.stat(path);
@@ -197,7 +198,6 @@ async function pathExists(path) {
197
198
  throw err;
198
199
  }
199
200
  }
200
- exports.pathExists = pathExists;
201
201
  // Copy/pasted from the 'ansi-regex' package to avoid taking a dependency for this one line that will never change
202
202
  const ANSI_PATTERN = new RegExp([
203
203
  '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
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, 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"]}
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"]}
package/package.json CHANGED
@@ -59,7 +59,7 @@
59
59
  "memfs": "^4.11.1",
60
60
  "mock-fs": "^5.2.0",
61
61
  "prettier": "^2.8.8",
62
- "projen": "^0.85.2",
62
+ "projen": "^0.86.0",
63
63
  "tar": "^6.2.1",
64
64
  "ts-jest": "^29.2.4",
65
65
  "ts-node": "^10.9.2"
@@ -71,11 +71,11 @@
71
71
  "chalk": "^4",
72
72
  "commonmark": "^0.31.1",
73
73
  "fast-glob": "^3.3.2",
74
- "jsii": "~5.4.0",
74
+ "jsii": "~5.5.0",
75
75
  "semver": "^7.6.3",
76
76
  "semver-intersect": "^1.5.0",
77
77
  "stream-json": "^1.8.0",
78
- "typescript": "~5.4",
78
+ "typescript": "~5.5",
79
79
  "workerpool": "^6.5.1",
80
80
  "yargs": "^17.7.2"
81
81
  },
@@ -88,7 +88,7 @@
88
88
  "publishConfig": {
89
89
  "access": "public"
90
90
  },
91
- "version": "5.4.32-dev.3",
91
+ "version": "5.5.0",
92
92
  "types": "lib/index.d.ts",
93
93
  "exports": {
94
94
  ".": "./lib/index.js",
package/releases.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
- "current": "5.4",
3
- "currentMinVersionNumber": "5.4.0",
2
+ "current": "5.5",
3
+ "currentMinVersionNumber": "5.5.0",
4
4
  "maintenance": {
5
5
  "5.0": "2024-01-31T00:00:00.000Z",
6
6
  "5.1": "2024-04-30T00:00:00.000Z",
7
7
  "5.2": "2024-06-30T00:00:00.000Z",
8
- "5.3": "2024-10-15T00:00:00.000Z"
8
+ "5.3": "2024-10-15T00:00:00.000Z",
9
+ "5.4": "2025-02-28T00:00:00.000Z"
9
10
  },
10
11
  "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
11
12
  }