@twin.org/tools-core 0.0.3-next.22 → 0.0.3-next.23
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/dist/es/utils/jsDoc.js +1 -1
- package/dist/es/utils/jsDoc.js.map +1 -1
- package/dist/es/utils/jsonSchemaBuilder.js +116 -9
- package/dist/es/utils/jsonSchemaBuilder.js.map +1 -1
- package/dist/es/utils/objectTransformer.js +1 -1
- package/dist/es/utils/objectTransformer.js.map +1 -1
- package/dist/es/utils/utilityTypeSchemaMapper.js +2 -2
- package/dist/es/utils/utilityTypeSchemaMapper.js.map +1 -1
- package/dist/types/utils/jsonSchemaBuilder.d.ts +8 -0
- package/docs/changelog.md +14 -0
- package/docs/reference/classes/JsonSchemaBuilder.md +34 -0
- package/package.json +2 -2
package/dist/es/utils/jsDoc.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsDoc.js","sourceRoot":"","sources":["../../../src/utils/jsDoc.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC;;GAEG;AACH,MAAM,OAAO,KAAK;IACjB;;;;;OAKG;IACI,MAAM,CAAC,uBAAuB,CAAC,IAAa;QAClD,kEAAkE;QAClE,MAAM,UAAU,GAAG,EAAE;aACnB,uBAAuB,CAAC,IAAI,CAAC;aAC7B,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,UAAU;aAC5B,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;aACrE,IAAI,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAEnD,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO,WAAW,CAAC;QACpB,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,sBAAsB,CAAC,QAAqB;QACzD,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC,OAAO,CAAC;QACzB,CAAC;QAED,IAAI,
|
|
1
|
+
{"version":3,"file":"jsDoc.js","sourceRoot":"","sources":["../../../src/utils/jsDoc.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Is } from \"@twin.org/core\";\nimport * as ts from \"typescript\";\n\n/**\n * General-purpose utility methods for working with JsDoc.\n */\nexport class JsDoc {\n\t/**\n\t * Extract the JSDoc description comment for an AST node.\n\t * Only top-level JSDoc block comments are considered; inline tags are ignored.\n\t * @param node The node to inspect.\n\t * @returns The trimmed description text, or undefined when absent.\n\t */\n\tpublic static getNodeJsDocDescription(node: ts.Node): string | undefined {\n\t\t// /** Description text */ (JSDoc block attached to a declaration)\n\t\tconst jsDocNodes = ts\n\t\t\t.getJSDocCommentsAndTags(node)\n\t\t\t.filter(commentOrTag => ts.isJSDoc(commentOrTag));\n\t\tconst description = jsDocNodes\n\t\t\t.map(jsDocNode => ts.getTextOfJSDocComment(jsDocNode.comment)?.trim())\n\t\t\t.find((value): value is string => Boolean(value));\n\n\t\tif (description) {\n\t\t\treturn description;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Convert a JSDoc tag's comment portion to a plain text string.\n\t * JSDoc tag comments may be plain strings or arrays of link/text parts.\n\t * @param jsDocTag The JSDoc tag.\n\t * @returns The comment text, or undefined when absent.\n\t */\n\tpublic static getJSDocTagCommentText(jsDocTag: ts.JSDocTag): string | undefined {\n\t\tif (Is.string(jsDocTag.comment)) {\n\t\t\treturn jsDocTag.comment;\n\t\t}\n\n\t\tif (Is.array(jsDocTag.comment)) {\n\t\t\treturn jsDocTag.comment\n\t\t\t\t.map(part => part.text)\n\t\t\t\t.join(\"\")\n\t\t\t\t.trim();\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Read all custom JSDoc tags matching a tag name from a node and convert them to key/value pairs.\n\t * Each matching tag's comment must be in the form \"key: value\"; entries that do not follow this\n\t * convention are silently skipped.\n\t * @param node The node to inspect.\n\t * @param tagName The tag name to filter by (e.g., 'json-schema').\n\t * @returns The extracted key/value pairs.\n\t */\n\tpublic static getNodeTags(node: ts.Node, tagName: string): { [id: string]: string } {\n\t\tconst output: { [id: string]: string } = {};\n\t\tfor (const jsDocTag of ts.getJSDocTags(node)) {\n\t\t\tif (jsDocTag.tagName.text === tagName) {\n\t\t\t\tconst commentText = JsDoc.getJSDocTagCommentText(jsDocTag);\n\t\t\t\tif (commentText) {\n\t\t\t\t\tconst separatorIndex = commentText.indexOf(\":\");\n\t\t\t\t\tif (separatorIndex > 0) {\n\t\t\t\t\t\tconst key = commentText.slice(0, separatorIndex).trim();\n\t\t\t\t\t\tconst value = commentText.slice(separatorIndex + 1).trim();\n\t\t\t\t\t\tif (key.length > 0) {\n\t\t\t\t\t\t\toutput[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn output;\n\t}\n\n\t/**\n\t * Read the plain comment text for the first matching JSDoc tag on a node.\n\t * @param node The node to inspect.\n\t * @param tagName The tag name to filter by (e.g., 'default').\n\t * @returns The trimmed comment text, or undefined when absent.\n\t */\n\tpublic static getNodeTagComment(node: ts.Node, tagName: string): string | undefined {\n\t\tfor (const jsDocTag of ts.getJSDocTags(node)) {\n\t\t\tif (jsDocTag.tagName.text === tagName) {\n\t\t\t\tconst commentText = JsDoc.getJSDocTagCommentText(jsDocTag)?.trim();\n\t\t\t\tif (commentText) {\n\t\t\t\t\treturn commentText;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Parse a custom JSDoc tag value into JSON-compatible data.\n\t * Values that begin with a JSON token character ({, [, \", true, false, null) or look like a\n\t * number are parsed with JSON.parse. All other values are returned as plain strings.\n\t * @param value The raw value text.\n\t * @returns The parsed value.\n\t */\n\tpublic static parseTagValue(value: string): unknown {\n\t\tconst trimmedValue = value.trim();\n\t\tif (trimmedValue.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst startsWithJsonToken =\n\t\t\ttrimmedValue.startsWith(\"{\") ||\n\t\t\ttrimmedValue.startsWith(\"[\") ||\n\t\t\ttrimmedValue.startsWith('\"') ||\n\t\t\ttrimmedValue === \"true\" ||\n\t\t\ttrimmedValue === \"false\" ||\n\t\t\ttrimmedValue === \"null\" ||\n\t\t\t/^-?\\d+(\\.\\d+)?$/u.test(trimmedValue);\n\n\t\tif (!startsWithJsonToken) {\n\t\t\treturn trimmedValue;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(trimmedValue);\n\t\t} catch {\n\t\t\treturn trimmedValue;\n\t\t}\n\t}\n}\n"]}
|
|
@@ -2133,16 +2133,22 @@ export class JsonSchemaBuilder {
|
|
|
2133
2133
|
// TypeReferenceNode is constructed here using the same expression + type
|
|
2134
2134
|
// arguments so the utility handler receives exactly the AST shape it expects.
|
|
2135
2135
|
if (JsonSchemaBuilder._utilityTypeHandlers[typeName] && ts.isIdentifier(expression)) {
|
|
2136
|
-
const
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
allOfRefs.push(mappedSchema);
|
|
2136
|
+
const refinedBaseReference = JsonSchemaBuilder.resolveRefinementUtilityBaseRef(context, declaration, extendedType);
|
|
2137
|
+
if (refinedBaseReference) {
|
|
2138
|
+
allOfRefs.push(refinedBaseReference);
|
|
2140
2139
|
}
|
|
2141
2140
|
else {
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2141
|
+
const syntheticTypeNode = ts.factory.createTypeReferenceNode(expression, extendedType.typeArguments);
|
|
2142
|
+
const mappedSchema = JsonSchemaBuilder.mapTypeNodeToSchema(context, syntheticTypeNode);
|
|
2143
|
+
if (mappedSchema) {
|
|
2144
|
+
allOfRefs.push(mappedSchema);
|
|
2145
|
+
}
|
|
2146
|
+
else {
|
|
2147
|
+
throw new GeneralError(JsonSchemaBuilder.CLASS_NAME, "missingTypeReferenceSchema", {
|
|
2148
|
+
typeName: extendedType.getText(),
|
|
2149
|
+
importSource: ""
|
|
2150
|
+
});
|
|
2151
|
+
}
|
|
2146
2152
|
}
|
|
2147
2153
|
}
|
|
2148
2154
|
else {
|
|
@@ -2156,8 +2162,102 @@ export class JsonSchemaBuilder {
|
|
|
2156
2162
|
}
|
|
2157
2163
|
if (allOfRefs.length > 0) {
|
|
2158
2164
|
schema.allOf = allOfRefs;
|
|
2165
|
+
// Extract properties defined in the derived interface to avoid duplication with expanded utility bases
|
|
2166
|
+
const derivedPropertyNames = new Set();
|
|
2167
|
+
for (const member of declaration.members) {
|
|
2168
|
+
if (ts.isPropertySignature(member) && member.name && ts.isIdentifier(member.name)) {
|
|
2169
|
+
derivedPropertyNames.add(member.name.text);
|
|
2170
|
+
}
|
|
2171
|
+
}
|
|
2172
|
+
// Remove redefined properties from inlined utility base schemas
|
|
2173
|
+
if (derivedPropertyNames.size > 0) {
|
|
2174
|
+
for (const allOfRef of allOfRefs) {
|
|
2175
|
+
if (allOfRef.properties && Is.object(allOfRef.properties)) {
|
|
2176
|
+
for (const propName of derivedPropertyNames) {
|
|
2177
|
+
delete allOfRef.properties[propName];
|
|
2178
|
+
}
|
|
2179
|
+
// Update required array to remove redefined properties
|
|
2180
|
+
if (Is.array(allOfRef.required)) {
|
|
2181
|
+
allOfRef.required = allOfRef.required.filter(req => !derivedPropertyNames.has(req));
|
|
2182
|
+
}
|
|
2183
|
+
}
|
|
2184
|
+
}
|
|
2185
|
+
// Ensure derived interface members are represented at the root schema level.
|
|
2186
|
+
const { properties: derivedProperties, required: derivedRequired } = JsonSchemaBuilder.buildObjectMembersSchema(context, declaration.members);
|
|
2187
|
+
if (Object.keys(derivedProperties).length > 0) {
|
|
2188
|
+
schema.properties = {
|
|
2189
|
+
...(schema.properties ?? {}),
|
|
2190
|
+
...derivedProperties
|
|
2191
|
+
};
|
|
2192
|
+
}
|
|
2193
|
+
if (derivedRequired.length > 0) {
|
|
2194
|
+
schema.required = [...new Set([...(schema.required ?? []), ...derivedRequired])];
|
|
2195
|
+
}
|
|
2196
|
+
}
|
|
2159
2197
|
}
|
|
2160
2198
|
}
|
|
2199
|
+
/**
|
|
2200
|
+
* Resolve a direct base reference for refinement Omit patterns in interface extends clauses.
|
|
2201
|
+
* @param context The generation context.
|
|
2202
|
+
* @param declaration The interface declaration being mapped.
|
|
2203
|
+
* @param extendedType The heritage type being processed.
|
|
2204
|
+
* @returns A direct base reference when a refinement pattern is detected.
|
|
2205
|
+
*/
|
|
2206
|
+
static resolveRefinementUtilityBaseRef(context, declaration, extendedType) {
|
|
2207
|
+
const expression = extendedType.expression;
|
|
2208
|
+
if (!ts.isIdentifier(expression) || expression.text !== "Omit") {
|
|
2209
|
+
return undefined;
|
|
2210
|
+
}
|
|
2211
|
+
const baseTypeNode = extendedType.typeArguments?.[0];
|
|
2212
|
+
if (!baseTypeNode || !ts.isTypeReferenceNode(baseTypeNode) || baseTypeNode.typeArguments) {
|
|
2213
|
+
return undefined;
|
|
2214
|
+
}
|
|
2215
|
+
const omittedKeys = JsonSchemaBuilder.extractUtilityTypeKeys(context, extendedType.typeArguments?.[1]);
|
|
2216
|
+
if (omittedKeys.length === 0) {
|
|
2217
|
+
return undefined;
|
|
2218
|
+
}
|
|
2219
|
+
const propertyNames = new Set();
|
|
2220
|
+
const optionalPropertyNames = new Set();
|
|
2221
|
+
for (const member of declaration.members) {
|
|
2222
|
+
if (ts.isPropertySignature(member) && member.name) {
|
|
2223
|
+
if (ts.isIdentifier(member.name)) {
|
|
2224
|
+
propertyNames.add(member.name.text);
|
|
2225
|
+
if (member.questionToken) {
|
|
2226
|
+
optionalPropertyNames.add(member.name.text);
|
|
2227
|
+
}
|
|
2228
|
+
}
|
|
2229
|
+
else if (ts.isStringLiteral(member.name) || ts.isNumericLiteral(member.name)) {
|
|
2230
|
+
propertyNames.add(member.name.text);
|
|
2231
|
+
if (member.questionToken) {
|
|
2232
|
+
optionalPropertyNames.add(member.name.text);
|
|
2233
|
+
}
|
|
2234
|
+
}
|
|
2235
|
+
}
|
|
2236
|
+
}
|
|
2237
|
+
// Ensure all omitted keys are redefined in the derived interface
|
|
2238
|
+
if (!omittedKeys.every(omittedKey => propertyNames.has(omittedKey))) {
|
|
2239
|
+
return undefined;
|
|
2240
|
+
}
|
|
2241
|
+
// Ensure ONLY omitted keys are being redefined (no extra properties are being added/redefined)
|
|
2242
|
+
const omittedKeySet = new Set(omittedKeys);
|
|
2243
|
+
if (!Array.from(propertyNames).every(propName => omittedKeySet.has(propName))) {
|
|
2244
|
+
return undefined;
|
|
2245
|
+
}
|
|
2246
|
+
const baseTypeName = ts.isIdentifier(baseTypeNode.typeName)
|
|
2247
|
+
? baseTypeNode.typeName.text
|
|
2248
|
+
: baseTypeNode.typeName.right.text;
|
|
2249
|
+
const baseSchema = JsonSchemaBuilder.resolveObjectTypeSchemaForUtility(context, baseTypeName);
|
|
2250
|
+
const baseRequiredKeys = new Set((Is.array(baseSchema?.required) ? baseSchema.required : []).filter((requiredKey) => Is.string(requiredKey)));
|
|
2251
|
+
const doesReverseOptionalityForRequiredBaseKey = omittedKeys.some(omittedKey => optionalPropertyNames.has(omittedKey) && baseRequiredKeys.has(omittedKey));
|
|
2252
|
+
if (doesReverseOptionalityForRequiredBaseKey) {
|
|
2253
|
+
return undefined;
|
|
2254
|
+
}
|
|
2255
|
+
const title = StringHelper.stripPrefix(baseTypeName);
|
|
2256
|
+
const existingSchemaId = JsonSchemaBuilder.findExistingSchemaIdByTitle(context, title);
|
|
2257
|
+
return {
|
|
2258
|
+
$ref: existingSchemaId ?? `${context.namespace}${title}`
|
|
2259
|
+
};
|
|
2260
|
+
}
|
|
2161
2261
|
/**
|
|
2162
2262
|
* Determine whether a type node represents null or undefined.
|
|
2163
2263
|
* @param typeNode The type node.
|
|
@@ -2382,9 +2482,16 @@ export class JsonSchemaBuilder {
|
|
|
2382
2482
|
* @returns The resolved object schema.
|
|
2383
2483
|
*/
|
|
2384
2484
|
static resolveMappedUtilityBaseObjectSchema(context, mappedSchema) {
|
|
2385
|
-
if (mappedSchema.type === "object"
|
|
2485
|
+
if (mappedSchema.type === "object") {
|
|
2386
2486
|
return ObjectHelper.clone(mappedSchema);
|
|
2387
2487
|
}
|
|
2488
|
+
if (Is.array(mappedSchema.allOf) && mappedSchema.allOf.length > 0) {
|
|
2489
|
+
const expandedSchema = JsonSchemaBuilder.expandAllOfReferences(context, ObjectHelper.clone(mappedSchema), mappedSchema.title);
|
|
2490
|
+
if (expandedSchema.type === "object" || expandedSchema.properties) {
|
|
2491
|
+
expandedSchema.type ??= "object";
|
|
2492
|
+
return expandedSchema;
|
|
2493
|
+
}
|
|
2494
|
+
}
|
|
2388
2495
|
if (mappedSchema.$ref) {
|
|
2389
2496
|
for (const packageSchemaEntries of Object.values(context.schemas)) {
|
|
2390
2497
|
for (const referencedSchema of Object.values(packageSchemaEntries)) {
|