@redocly/client-generator 0.0.0-snapshot.1784554531
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/README.md +506 -0
- package/lib/config-file.d.ts +8 -0
- package/lib/config-file.d.ts.map +1 -0
- package/lib/config-file.js +32 -0
- package/lib/config-file.js.map +1 -0
- package/lib/config.d.ts +63 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +2 -0
- package/lib/config.js.map +1 -0
- package/lib/emitters/auth.d.ts +14 -0
- package/lib/emitters/auth.d.ts.map +1 -0
- package/lib/emitters/auth.js +30 -0
- package/lib/emitters/auth.js.map +1 -0
- package/lib/emitters/client-assembly.d.ts +15 -0
- package/lib/emitters/client-assembly.d.ts.map +1 -0
- package/lib/emitters/client-assembly.js +299 -0
- package/lib/emitters/client-assembly.js.map +1 -0
- package/lib/emitters/descriptor.d.ts +22 -0
- package/lib/emitters/descriptor.d.ts.map +1 -0
- package/lib/emitters/descriptor.js +207 -0
- package/lib/emitters/descriptor.js.map +1 -0
- package/lib/emitters/emit-options.d.ts +71 -0
- package/lib/emitters/emit-options.d.ts.map +1 -0
- package/lib/emitters/emit-options.js +28 -0
- package/lib/emitters/emit-options.js.map +1 -0
- package/lib/emitters/faker.d.ts +11 -0
- package/lib/emitters/faker.d.ts.map +1 -0
- package/lib/emitters/faker.js +204 -0
- package/lib/emitters/faker.js.map +1 -0
- package/lib/emitters/identifier.d.ts +28 -0
- package/lib/emitters/identifier.d.ts.map +1 -0
- package/lib/emitters/identifier.js +94 -0
- package/lib/emitters/identifier.js.map +1 -0
- package/lib/emitters/inline-runtime.d.ts +11 -0
- package/lib/emitters/inline-runtime.d.ts.map +1 -0
- package/lib/emitters/inline-runtime.js +97 -0
- package/lib/emitters/inline-runtime.js.map +1 -0
- package/lib/emitters/jsdoc.d.ts +9 -0
- package/lib/emitters/jsdoc.d.ts.map +1 -0
- package/lib/emitters/jsdoc.js +83 -0
- package/lib/emitters/jsdoc.js.map +1 -0
- package/lib/emitters/mock.d.ts +22 -0
- package/lib/emitters/mock.d.ts.map +1 -0
- package/lib/emitters/mock.js +243 -0
- package/lib/emitters/mock.js.map +1 -0
- package/lib/emitters/operation-aliases.d.ts +27 -0
- package/lib/emitters/operation-aliases.d.ts.map +1 -0
- package/lib/emitters/operation-aliases.js +138 -0
- package/lib/emitters/operation-aliases.js.map +1 -0
- package/lib/emitters/operation-signature.d.ts +23 -0
- package/lib/emitters/operation-signature.d.ts.map +1 -0
- package/lib/emitters/operation-signature.js +34 -0
- package/lib/emitters/operation-signature.js.map +1 -0
- package/lib/emitters/operation-types.d.ts +32 -0
- package/lib/emitters/operation-types.d.ts.map +1 -0
- package/lib/emitters/operation-types.js +117 -0
- package/lib/emitters/operation-types.js.map +1 -0
- package/lib/emitters/operations.d.ts +39 -0
- package/lib/emitters/operations.d.ts.map +1 -0
- package/lib/emitters/operations.js +33 -0
- package/lib/emitters/operations.js.map +1 -0
- package/lib/emitters/pagination.d.ts +69 -0
- package/lib/emitters/pagination.d.ts.map +1 -0
- package/lib/emitters/pagination.js +223 -0
- package/lib/emitters/pagination.js.map +1 -0
- package/lib/emitters/runtime-sources.d.ts +16 -0
- package/lib/emitters/runtime-sources.d.ts.map +1 -0
- package/lib/emitters/runtime-sources.js +16 -0
- package/lib/emitters/runtime-sources.js.map +1 -0
- package/lib/emitters/sample.d.ts +27 -0
- package/lib/emitters/sample.d.ts.map +1 -0
- package/lib/emitters/sample.js +161 -0
- package/lib/emitters/sample.js.map +1 -0
- package/lib/emitters/setup-bake.d.ts +15 -0
- package/lib/emitters/setup-bake.d.ts.map +1 -0
- package/lib/emitters/setup-bake.js +65 -0
- package/lib/emitters/setup-bake.js.map +1 -0
- package/lib/emitters/sse.d.ts +10 -0
- package/lib/emitters/sse.d.ts.map +1 -0
- package/lib/emitters/sse.js +46 -0
- package/lib/emitters/sse.js.map +1 -0
- package/lib/emitters/support.d.ts +13 -0
- package/lib/emitters/support.d.ts.map +1 -0
- package/lib/emitters/support.js +21 -0
- package/lib/emitters/support.js.map +1 -0
- package/lib/emitters/swr.d.ts +10 -0
- package/lib/emitters/swr.d.ts.map +1 -0
- package/lib/emitters/swr.js +88 -0
- package/lib/emitters/swr.js.map +1 -0
- package/lib/emitters/tanstack-query.d.ts +11 -0
- package/lib/emitters/tanstack-query.d.ts.map +1 -0
- package/lib/emitters/tanstack-query.js +68 -0
- package/lib/emitters/tanstack-query.js.map +1 -0
- package/lib/emitters/transformers.d.ts +11 -0
- package/lib/emitters/transformers.d.ts.map +1 -0
- package/lib/emitters/transformers.js +334 -0
- package/lib/emitters/transformers.js.map +1 -0
- package/lib/emitters/ts.d.ts +40 -0
- package/lib/emitters/ts.d.ts.map +1 -0
- package/lib/emitters/ts.js +104 -0
- package/lib/emitters/ts.js.map +1 -0
- package/lib/emitters/type-guards.d.ts +21 -0
- package/lib/emitters/type-guards.d.ts.map +1 -0
- package/lib/emitters/type-guards.js +183 -0
- package/lib/emitters/type-guards.js.map +1 -0
- package/lib/emitters/types.d.ts +23 -0
- package/lib/emitters/types.d.ts.map +1 -0
- package/lib/emitters/types.js +127 -0
- package/lib/emitters/types.js.map +1 -0
- package/lib/emitters/wrapper-support.d.ts +40 -0
- package/lib/emitters/wrapper-support.d.ts.map +1 -0
- package/lib/emitters/wrapper-support.js +112 -0
- package/lib/emitters/wrapper-support.js.map +1 -0
- package/lib/emitters/zod.d.ts +13 -0
- package/lib/emitters/zod.d.ts.map +1 -0
- package/lib/emitters/zod.js +344 -0
- package/lib/emitters/zod.js.map +1 -0
- package/lib/errors.d.ts +4 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +7 -0
- package/lib/errors.js.map +1 -0
- package/lib/generators/anchor.d.ts +9 -0
- package/lib/generators/anchor.d.ts.map +1 -0
- package/lib/generators/anchor.js +10 -0
- package/lib/generators/anchor.js.map +1 -0
- package/lib/generators/index.d.ts +15 -0
- package/lib/generators/index.d.ts.map +1 -0
- package/lib/generators/index.js +62 -0
- package/lib/generators/index.js.map +1 -0
- package/lib/generators/mock.d.ts +9 -0
- package/lib/generators/mock.d.ts.map +1 -0
- package/lib/generators/mock.js +23 -0
- package/lib/generators/mock.js.map +1 -0
- package/lib/generators/resolve.d.ts +19 -0
- package/lib/generators/resolve.d.ts.map +1 -0
- package/lib/generators/resolve.js +68 -0
- package/lib/generators/resolve.js.map +1 -0
- package/lib/generators/sdk.d.ts +12 -0
- package/lib/generators/sdk.d.ts.map +1 -0
- package/lib/generators/sdk.js +26 -0
- package/lib/generators/sdk.js.map +1 -0
- package/lib/generators/swr.d.ts +15 -0
- package/lib/generators/swr.d.ts.map +1 -0
- package/lib/generators/swr.js +27 -0
- package/lib/generators/swr.js.map +1 -0
- package/lib/generators/tanstack-query.d.ts +17 -0
- package/lib/generators/tanstack-query.d.ts.map +1 -0
- package/lib/generators/tanstack-query.js +30 -0
- package/lib/generators/tanstack-query.js.map +1 -0
- package/lib/generators/transformers.d.ts +19 -0
- package/lib/generators/transformers.d.ts.map +1 -0
- package/lib/generators/transformers.js +28 -0
- package/lib/generators/transformers.js.map +1 -0
- package/lib/generators/types.d.ts +66 -0
- package/lib/generators/types.d.ts.map +1 -0
- package/lib/generators/types.js +2 -0
- package/lib/generators/types.js.map +1 -0
- package/lib/generators/zod.d.ts +14 -0
- package/lib/generators/zod.d.ts.map +1 -0
- package/lib/generators/zod.js +23 -0
- package/lib/generators/zod.js.map +1 -0
- package/lib/index.d.ts +29 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +119 -0
- package/lib/index.js.map +1 -0
- package/lib/intermediate-representation/build.d.ts +4 -0
- package/lib/intermediate-representation/build.d.ts.map +1 -0
- package/lib/intermediate-representation/build.js +761 -0
- package/lib/intermediate-representation/build.js.map +1 -0
- package/lib/intermediate-representation/model.d.ts +275 -0
- package/lib/intermediate-representation/model.d.ts.map +1 -0
- package/lib/intermediate-representation/model.js +5 -0
- package/lib/intermediate-representation/model.js.map +1 -0
- package/lib/intermediate-representation/normalize-swagger2.d.ts +10 -0
- package/lib/intermediate-representation/normalize-swagger2.d.ts.map +1 -0
- package/lib/intermediate-representation/normalize-swagger2.js +210 -0
- package/lib/intermediate-representation/normalize-swagger2.js.map +1 -0
- package/lib/intermediate-representation/sanitize-identifiers.d.ts +30 -0
- package/lib/intermediate-representation/sanitize-identifiers.d.ts.map +1 -0
- package/lib/intermediate-representation/sanitize-identifiers.js +153 -0
- package/lib/intermediate-representation/sanitize-identifiers.js.map +1 -0
- package/lib/loader.d.ts +4 -0
- package/lib/loader.d.ts.map +1 -0
- package/lib/loader.js +14 -0
- package/lib/loader.js.map +1 -0
- package/lib/plugin.d.ts +19 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +41 -0
- package/lib/plugin.js.map +1 -0
- package/lib/runtime/auth.d.ts +15 -0
- package/lib/runtime/auth.d.ts.map +1 -0
- package/lib/runtime/auth.js +67 -0
- package/lib/runtime/auth.js.map +1 -0
- package/lib/runtime/create-client.d.ts +35 -0
- package/lib/runtime/create-client.d.ts.map +1 -0
- package/lib/runtime/create-client.js +215 -0
- package/lib/runtime/create-client.js.map +1 -0
- package/lib/runtime/errors.d.ts +11 -0
- package/lib/runtime/errors.d.ts.map +1 -0
- package/lib/runtime/errors.js +25 -0
- package/lib/runtime/errors.js.map +1 -0
- package/lib/runtime/index.d.ts +14 -0
- package/lib/runtime/index.d.ts.map +1 -0
- package/lib/runtime/index.js +24 -0
- package/lib/runtime/index.js.map +1 -0
- package/lib/runtime/multipart.d.ts +9 -0
- package/lib/runtime/multipart.d.ts.map +1 -0
- package/lib/runtime/multipart.js +31 -0
- package/lib/runtime/multipart.js.map +1 -0
- package/lib/runtime/paginate.d.ts +36 -0
- package/lib/runtime/paginate.d.ts.map +1 -0
- package/lib/runtime/paginate.js +99 -0
- package/lib/runtime/paginate.js.map +1 -0
- package/lib/runtime/parse.d.ts +9 -0
- package/lib/runtime/parse.d.ts.map +1 -0
- package/lib/runtime/parse.js +37 -0
- package/lib/runtime/parse.js.map +1 -0
- package/lib/runtime/retry.d.ts +15 -0
- package/lib/runtime/retry.d.ts.map +1 -0
- package/lib/runtime/retry.js +51 -0
- package/lib/runtime/retry.js.map +1 -0
- package/lib/runtime/send.d.ts +31 -0
- package/lib/runtime/send.d.ts.map +1 -0
- package/lib/runtime/send.js +138 -0
- package/lib/runtime/send.js.map +1 -0
- package/lib/runtime/setup.d.ts +11 -0
- package/lib/runtime/setup.d.ts.map +1 -0
- package/lib/runtime/setup.js +13 -0
- package/lib/runtime/setup.js.map +1 -0
- package/lib/runtime/sse.d.ts +21 -0
- package/lib/runtime/sse.d.ts.map +1 -0
- package/lib/runtime/sse.js +163 -0
- package/lib/runtime/sse.js.map +1 -0
- package/lib/runtime/types.d.ts +232 -0
- package/lib/runtime/types.d.ts.map +1 -0
- package/lib/runtime/types.js +9 -0
- package/lib/runtime/types.js.map +1 -0
- package/lib/runtime/url.d.ts +25 -0
- package/lib/runtime/url.d.ts.map +1 -0
- package/lib/runtime/url.js +97 -0
- package/lib/runtime/url.js.map +1 -0
- package/lib/runtime-contract.d.ts +27 -0
- package/lib/runtime-contract.d.ts.map +1 -0
- package/lib/runtime-contract.js +14 -0
- package/lib/runtime-contract.js.map +1 -0
- package/lib/types.d.ts +118 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// Emits standalone Date-transformer functions from the IR. For each named
|
|
2
|
+
// schema that (recursively) carries a `format: date-time`/`date` string field,
|
|
3
|
+
// emits `export const transform<Name> = (data: <Name>): <Name> => { … };` that
|
|
4
|
+
// walks the value and rewrites those wire ISO strings to `new Date(...)` in
|
|
5
|
+
// place, so the runtime value matches the sdk's `--date-type Date` types.
|
|
6
|
+
//
|
|
7
|
+
// Pairs with the sdk generated under `dateType: 'Date'`; the client itself
|
|
8
|
+
// stays zero-dep (Date is standard). Transformers compose across refs:
|
|
9
|
+
// `transformPet` calls `transformPerson(data["owner"])` when `Pet.owner` is a
|
|
10
|
+
// `Person` that has dates.
|
|
11
|
+
import { safeIdent } from './identifier.js';
|
|
12
|
+
import { pascalCase } from './support.js';
|
|
13
|
+
import { arrow, exportConstStatement, printStatements, ts } from './ts.js';
|
|
14
|
+
const { factory } = ts;
|
|
15
|
+
/** `transform<Name>` — the function bound to a named schema. */
|
|
16
|
+
function transformName(name) {
|
|
17
|
+
return `transform${pascalCase(name)}`;
|
|
18
|
+
}
|
|
19
|
+
/** A scalar string with a `date-time`/`date` format — the leaf we convert. */
|
|
20
|
+
function isDateScalar(schema) {
|
|
21
|
+
return (schema.kind === 'scalar' &&
|
|
22
|
+
schema.scalar === 'string' &&
|
|
23
|
+
(schema.metadata?.format === 'date-time' || schema.metadata?.format === 'date'));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether a schema contains a date leaf, following refs. `seen` guards ref
|
|
27
|
+
* cycles (a self-referential schema would otherwise recurse forever); a ref
|
|
28
|
+
* back into the visited set carries no *new* dates from here.
|
|
29
|
+
*/
|
|
30
|
+
function hasDates(schema, byName, seen) {
|
|
31
|
+
if (isDateScalar(schema))
|
|
32
|
+
return true;
|
|
33
|
+
switch (schema.kind) {
|
|
34
|
+
case 'array':
|
|
35
|
+
return hasDates(schema.items, byName, seen);
|
|
36
|
+
case 'record':
|
|
37
|
+
return hasDates(schema.value, byName, seen);
|
|
38
|
+
case 'object':
|
|
39
|
+
return schema.properties.some((p) => hasDates(p.schema, byName, seen));
|
|
40
|
+
case 'union':
|
|
41
|
+
case 'intersection':
|
|
42
|
+
return schema.members.some((m) => hasDates(m, byName, seen));
|
|
43
|
+
case 'ref': {
|
|
44
|
+
const target = byName.get(schema.name);
|
|
45
|
+
return target !== undefined && !seen.has(schema.name)
|
|
46
|
+
? hasDates(target, byName, new Set(seen).add(schema.name))
|
|
47
|
+
: false;
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** `<target>["key"]` — bracket access, robust for any (incl. non-identifier) key. */
|
|
54
|
+
function index(target, key) {
|
|
55
|
+
return factory.createElementAccessExpression(target, factory.createStringLiteral(key));
|
|
56
|
+
}
|
|
57
|
+
/** `new Date(<arg>)`. */
|
|
58
|
+
function newDate(arg) {
|
|
59
|
+
return factory.createNewExpression(factory.createIdentifier('Date'), undefined, [arg]);
|
|
60
|
+
}
|
|
61
|
+
/** `typeof <expr> === "string"`. */
|
|
62
|
+
function isStringGuard(expr) {
|
|
63
|
+
return factory.createBinaryExpression(factory.createTypeOfExpression(expr), factory.createToken(ts.SyntaxKind.EqualsEqualsEqualsToken), factory.createStringLiteral('string'));
|
|
64
|
+
}
|
|
65
|
+
/** `Array.isArray(<expr>)`. */
|
|
66
|
+
function isArrayGuard(expr) {
|
|
67
|
+
return factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier('Array'), 'isArray'), undefined, [expr]);
|
|
68
|
+
}
|
|
69
|
+
/** `<expr> && typeof <expr> === "object"` — truthy and a (non-null) object. */
|
|
70
|
+
function isObjectGuard(expr) {
|
|
71
|
+
return factory.createBinaryExpression(expr, factory.createToken(ts.SyntaxKind.AmpersandAmpersandToken), factory.createBinaryExpression(factory.createTypeOfExpression(expr), factory.createToken(ts.SyntaxKind.EqualsEqualsEqualsToken), factory.createStringLiteral('object')));
|
|
72
|
+
}
|
|
73
|
+
/** `<expr> as <Type>` — a type assertion, to satisfy a union-narrowing transform. */
|
|
74
|
+
function asType(expr, typeName) {
|
|
75
|
+
return factory.createAsExpression(expr, factory.createTypeReferenceNode(pascalCase(typeName)));
|
|
76
|
+
}
|
|
77
|
+
/** `if (<cond>) <then>;`. */
|
|
78
|
+
function ifThen(cond, then) {
|
|
79
|
+
return factory.createIfStatement(cond, then);
|
|
80
|
+
}
|
|
81
|
+
function exprStatement(expr) {
|
|
82
|
+
return factory.createExpressionStatement(expr);
|
|
83
|
+
}
|
|
84
|
+
/** `<target> = <value>;`. */
|
|
85
|
+
function assign(target, value) {
|
|
86
|
+
return exprStatement(factory.createBinaryExpression(target, factory.createToken(ts.SyntaxKind.EqualsToken), value));
|
|
87
|
+
}
|
|
88
|
+
/** `<recv>.<method>(<args>)`. */
|
|
89
|
+
function method(recv, name, args) {
|
|
90
|
+
return factory.createCallExpression(factory.createPropertyAccessExpression(recv, name), undefined, args);
|
|
91
|
+
}
|
|
92
|
+
function param(name) {
|
|
93
|
+
return factory.createParameterDeclaration(undefined, undefined, name);
|
|
94
|
+
}
|
|
95
|
+
/** Next nested loop variable: `item`, `item2`, `item3`, … (avoids shadowing). */
|
|
96
|
+
function nextItemVar(current) {
|
|
97
|
+
if (current === 'data')
|
|
98
|
+
return 'item';
|
|
99
|
+
return `item${Number(current.slice('item'.length)) + 1}`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Conversion statements that, given the runtime value at `target` typed by
|
|
103
|
+
* `schema`, rewrite date leaves in place. Each branch self-gates by returning
|
|
104
|
+
* `[]` when nothing under it carries a date, so callers need no pre-check.
|
|
105
|
+
* `seen` follows refs and guards cycles; `itemVar` names nested loop variables.
|
|
106
|
+
*
|
|
107
|
+
* Covers the shapes a date can hide in: date scalars, arrays of them, refs to
|
|
108
|
+
* date-bearing schemas (composed via `transform<Ref>`), arrays of such refs,
|
|
109
|
+
* records, nested inline objects, and the date-bearing members of a
|
|
110
|
+
* union/intersection.
|
|
111
|
+
*/
|
|
112
|
+
function convert(target, schema, byName, seen, itemVar) {
|
|
113
|
+
if (isDateScalar(schema)) {
|
|
114
|
+
return [ifThen(isStringGuard(target), assign(target, newDate(target)))];
|
|
115
|
+
}
|
|
116
|
+
switch (schema.kind) {
|
|
117
|
+
case 'ref':
|
|
118
|
+
return convertRef(target, schema.name, byName, seen);
|
|
119
|
+
case 'object': {
|
|
120
|
+
const stmts = [];
|
|
121
|
+
for (const p of schema.properties) {
|
|
122
|
+
stmts.push(...convertProperty(index(target, p.name), p.schema, byName, seen, itemVar));
|
|
123
|
+
}
|
|
124
|
+
return stmts;
|
|
125
|
+
}
|
|
126
|
+
case 'array':
|
|
127
|
+
return convertArray(target, schema.items, byName, seen, itemVar);
|
|
128
|
+
case 'record':
|
|
129
|
+
return convertCollection(target, schema.value, byName, seen, itemVar, true);
|
|
130
|
+
case 'intersection': {
|
|
131
|
+
// An intersection value satisfies *every* member type, so each member's
|
|
132
|
+
// transform applies directly to `target` with no narrowing needed.
|
|
133
|
+
const stmts = [];
|
|
134
|
+
for (const m of schema.members)
|
|
135
|
+
stmts.push(...convert(target, m, byName, seen, itemVar));
|
|
136
|
+
return stmts;
|
|
137
|
+
}
|
|
138
|
+
case 'union':
|
|
139
|
+
return convertUnion(target, schema.members, byName, seen, itemVar);
|
|
140
|
+
default:
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A union position. A runtime value inhabits exactly one member, so we apply
|
|
146
|
+
* every date-bearing member's conversion to the same `target` and let the
|
|
147
|
+
* unmatched members' runtime guards no-op.
|
|
148
|
+
*
|
|
149
|
+
* Type-safety is the catch: `target` is typed as the whole union, so an
|
|
150
|
+
* object/ref member's `transform<Ref>(target)` would fail `--date-type Date`
|
|
151
|
+
* strict-tsc (TS2345). We therefore gate the object-shaped members behind a
|
|
152
|
+
* single `typeof target === "object"` check and CAST `target` to each member's
|
|
153
|
+
* type — the cast makes it compile, the cast target's own internal string
|
|
154
|
+
* guards make a wrong-member application a safe runtime no-op. Scalar date
|
|
155
|
+
* members keep their `typeof === "string"` guard (their type is `Date` under
|
|
156
|
+
* `--date-type Date`, so the assignment type-checks).
|
|
157
|
+
*/
|
|
158
|
+
function convertUnion(target, members, byName, seen, itemVar) {
|
|
159
|
+
const stmts = [];
|
|
160
|
+
const objectGuarded = [];
|
|
161
|
+
for (const m of members) {
|
|
162
|
+
if (isDateScalar(m)) {
|
|
163
|
+
stmts.push(...convert(target, m, byName, seen, itemVar));
|
|
164
|
+
}
|
|
165
|
+
else if (m.kind === 'ref') {
|
|
166
|
+
if (!hasDates(m, byName, seen))
|
|
167
|
+
continue;
|
|
168
|
+
objectGuarded.push(exprStatement(factory.createCallExpression(factory.createIdentifier(transformName(m.name)), undefined, [
|
|
169
|
+
asType(target, m.name),
|
|
170
|
+
])));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// Object/array/record members: recurse under the shared object guard.
|
|
174
|
+
objectGuarded.push(...convert(target, m, byName, seen, itemVar));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (objectGuarded.length > 0) {
|
|
178
|
+
stmts.push(ifThen(isObjectGuard(target), factory.createBlock(objectGuarded, true)));
|
|
179
|
+
}
|
|
180
|
+
return stmts;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* A ref position: `if (<target>) transform<Ref>(<target>);`, emitted only when
|
|
184
|
+
* the ref target carries dates (so the sibling transform exists).
|
|
185
|
+
*/
|
|
186
|
+
function convertRef(target, name, byName, seen) {
|
|
187
|
+
if (!hasDates({ kind: 'ref', name }, byName, seen))
|
|
188
|
+
return [];
|
|
189
|
+
const call = factory.createCallExpression(factory.createIdentifier(transformName(name)), undefined, [target]);
|
|
190
|
+
return [ifThen(target, exprStatement(call))];
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* A property position: a nested inline object guards presence and recurses
|
|
194
|
+
* inside a block; everything else (scalars, refs, arrays, …) delegates to
|
|
195
|
+
* `convert`, which guards itself.
|
|
196
|
+
*/
|
|
197
|
+
function convertProperty(target, schema, byName, seen, itemVar) {
|
|
198
|
+
if (schema.kind === 'ref')
|
|
199
|
+
return convertRef(target, schema.name, byName, seen);
|
|
200
|
+
if (schema.kind === 'object') {
|
|
201
|
+
const inner = convert(target, schema, byName, seen, itemVar);
|
|
202
|
+
return inner.length === 0 ? [] : [ifThen(target, factory.createBlock(inner, true))];
|
|
203
|
+
}
|
|
204
|
+
return convert(target, schema, byName, seen, itemVar);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* A "replace-by-value" element is one a transform must overwrite wholesale
|
|
208
|
+
* rather than mutate in place: a date scalar (`new Date(v)`) or an array of
|
|
209
|
+
* such elements (`v.map(...)`). Returns the expression that yields the replaced
|
|
210
|
+
* value for the element bound to `value`, or `null` when the element instead
|
|
211
|
+
* mutates in place (object/ref/record). Recurses for arrays-of-arrays.
|
|
212
|
+
*
|
|
213
|
+
* Reassigning a loop *variable* is a no-op, so date scalars (and arrays of
|
|
214
|
+
* them) can only be converted by reassigning their container slot — an array
|
|
215
|
+
* via `slot = slot.map(...)`, a record via per-key assignment. This builds the
|
|
216
|
+
* per-element value for those write-backs.
|
|
217
|
+
*/
|
|
218
|
+
function replacer(value, element, depth = 0) {
|
|
219
|
+
if (isDateScalar(element))
|
|
220
|
+
return newDate(value);
|
|
221
|
+
if (element.kind === 'array') {
|
|
222
|
+
// Map var for the level below: `v` over the scalar leaf, else `row`, `row2`,
|
|
223
|
+
// … per array level — distinct names by depth avoid shadowing. Yields
|
|
224
|
+
// `.map((v) => new Date(v))` and `.map((row) => row.map((v) => new Date(v)))`.
|
|
225
|
+
const varName = element.items.kind === 'array' ? rowVar(depth + 1) : 'v';
|
|
226
|
+
const inner = replacer(factory.createIdentifier(varName), element.items, depth + 1);
|
|
227
|
+
if (inner === null)
|
|
228
|
+
return null;
|
|
229
|
+
return method(value, 'map', [arrow([param(varName)], inner)]);
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
/** Array map-var name by depth: `row`, `row2`, `row3`, … (avoids shadowing). */
|
|
234
|
+
function rowVar(depth) {
|
|
235
|
+
return depth <= 1 ? 'row' : `row${depth}`;
|
|
236
|
+
}
|
|
237
|
+
/** Conversions for `target` being an array whose elements are typed by `items`. */
|
|
238
|
+
function convertArray(target, items, byName, seen, itemVar) {
|
|
239
|
+
// Date scalars / arrays-of-date-scalars are replace-by-value: map over the
|
|
240
|
+
// array and reassign the slot (reassigning a loop var would be lost).
|
|
241
|
+
const varName = items.kind === 'array' ? rowVar(1) : 'v';
|
|
242
|
+
const mapped = replacer(factory.createIdentifier(varName), items, 1);
|
|
243
|
+
if (mapped !== null) {
|
|
244
|
+
// `if (Array.isArray(t)) t = t.map((v) => new Date(v));` (or nested `row`)
|
|
245
|
+
return [
|
|
246
|
+
ifThen(isArrayGuard(target), assign(target, method(target, 'map', [arrow([param(varName)], mapped)]))),
|
|
247
|
+
];
|
|
248
|
+
}
|
|
249
|
+
if (items.kind === 'ref') {
|
|
250
|
+
if (!hasDates(items, byName, seen))
|
|
251
|
+
return [];
|
|
252
|
+
// `if (Array.isArray(t)) t.forEach(transformRef);`
|
|
253
|
+
const forEach = method(target, 'forEach', [
|
|
254
|
+
factory.createIdentifier(transformName(items.name)),
|
|
255
|
+
]);
|
|
256
|
+
return [ifThen(isArrayGuard(target), exprStatement(forEach))];
|
|
257
|
+
}
|
|
258
|
+
return convertCollection(target, items, byName, seen, itemVar, false);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Iterate a collection (array or record) of mutate-in-place elements (objects,
|
|
262
|
+
* refs, records) and recurse with a fresh loop variable. Arrays iterate the
|
|
263
|
+
* value directly; records iterate `Object.values(...)`. `[]` when the element
|
|
264
|
+
* bears no dates.
|
|
265
|
+
*
|
|
266
|
+
* Replace-by-value elements (date scalars) never reach the array path here —
|
|
267
|
+
* `convertArray` handles them via map-and-reassign. A *record* of date scalars
|
|
268
|
+
* does land here: a `forEach` loop variable can't write back, so we iterate the
|
|
269
|
+
* keys and assign back into the record (`rec[k] = new Date(rec[k])`).
|
|
270
|
+
*/
|
|
271
|
+
function convertCollection(target, element, byName, seen, itemVar, isRecord) {
|
|
272
|
+
if (isRecord) {
|
|
273
|
+
// Replace-by-value elements (date scalars, arrays of them) can't be written
|
|
274
|
+
// through a `forEach` loop var, so iterate the keys and assign back into the
|
|
275
|
+
// record slot. Date scalars are string-guarded; nested arrays array-guarded.
|
|
276
|
+
const slot = factory.createElementAccessExpression(target, factory.createIdentifier('__k'));
|
|
277
|
+
const replaced = replacer(slot, element);
|
|
278
|
+
if (replaced !== null) {
|
|
279
|
+
const guard = isDateScalar(element) ? isStringGuard(slot) : isArrayGuard(slot);
|
|
280
|
+
return [ifThen(target, keyLoop(target, ifThen(guard, assign(slot, replaced))))];
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const next = nextItemVar(itemVar);
|
|
284
|
+
const body = convert(factory.createIdentifier(next), element, byName, seen, next);
|
|
285
|
+
if (body.length === 0)
|
|
286
|
+
return [];
|
|
287
|
+
const iterable = isRecord
|
|
288
|
+
? method(factory.createIdentifier('Object'), 'values', [target])
|
|
289
|
+
: target;
|
|
290
|
+
const forEach = method(iterable, 'forEach', [
|
|
291
|
+
arrow([param(next)], factory.createBlock(body, true)),
|
|
292
|
+
]);
|
|
293
|
+
return [ifThen(isRecord ? target : isArrayGuard(target), exprStatement(forEach))];
|
|
294
|
+
}
|
|
295
|
+
/** `for (const __k of Object.keys(<target>)) <body>`. */
|
|
296
|
+
function keyLoop(target, body) {
|
|
297
|
+
return factory.createForOfStatement(undefined, factory.createVariableDeclarationList([factory.createVariableDeclaration('__k')], ts.NodeFlags.Const), method(factory.createIdentifier('Object'), 'keys', [target]), body);
|
|
298
|
+
}
|
|
299
|
+
/** `export const transform<Name> = (data: <Name>): <Name> => { … };`. */
|
|
300
|
+
function transformStatement(named, byName) {
|
|
301
|
+
const typeName = pascalCase(named.name);
|
|
302
|
+
const data = factory.createIdentifier('data');
|
|
303
|
+
const body = named.schema.kind === 'ref'
|
|
304
|
+
? convertRef(data, named.schema.name, byName, new Set())
|
|
305
|
+
: convert(data, named.schema, byName, new Set(), 'data');
|
|
306
|
+
const fn = arrow([
|
|
307
|
+
factory.createParameterDeclaration(undefined, undefined, 'data', undefined, factory.createTypeReferenceNode(typeName)),
|
|
308
|
+
], factory.createBlock([...body, factory.createReturnStatement(data)], true));
|
|
309
|
+
const typed = factory.createArrowFunction(fn.modifiers, fn.typeParameters, fn.parameters, factory.createTypeReferenceNode(typeName), fn.equalsGreaterThanToken, fn.body);
|
|
310
|
+
return exportConstStatement(transformName(named.name), typed);
|
|
311
|
+
}
|
|
312
|
+
/** `import type { <Name>, … } from "<module>";`. */
|
|
313
|
+
function typeImport(names, module) {
|
|
314
|
+
return factory.createImportDeclaration(undefined, factory.createImportClause(true, undefined, factory.createNamedImports(names.map((n) => factory.createImportSpecifier(false, undefined, factory.createIdentifier(safeIdent(n)))))), factory.createStringLiteral(module));
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Render the transformers module. Emits one `transform<Name>` per named schema
|
|
318
|
+
* that carries a date field; `''` when none do. `opts.sdkModule` is the import
|
|
319
|
+
* specifier the schema TYPES are pulled from (the transformers call each other
|
|
320
|
+
* as siblings, so only the types need importing).
|
|
321
|
+
*/
|
|
322
|
+
export function renderTransformersModule(model, opts) {
|
|
323
|
+
const byName = new Map(model.schemas.map((s) => [s.name, s.schema]));
|
|
324
|
+
const dated = model.schemas.filter((s) => hasDates(s.schema, byName, new Set()));
|
|
325
|
+
if (dated.length === 0)
|
|
326
|
+
return '';
|
|
327
|
+
const types = dated.map((s) => pascalCase(s.name));
|
|
328
|
+
const statements = [
|
|
329
|
+
typeImport(types, opts.sdkModule),
|
|
330
|
+
...dated.map((s) => transformStatement(s, byName)),
|
|
331
|
+
];
|
|
332
|
+
return printStatements(statements);
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=transformers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../src/emitters/transformers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
export { ts };
|
|
3
|
+
/** Print a list of nodes to source, tight (one per line) — for import/export groups and single nodes. */
|
|
4
|
+
export declare function printNodes(nodes: readonly ts.Node[]): string;
|
|
5
|
+
/** Print top-level declarations separated by one blank line, for readable declaration bodies. */
|
|
6
|
+
export declare function printStatements(nodes: readonly ts.Node[]): string;
|
|
7
|
+
/** Parse a source string into its top-level statements (for embedding hand-authored code). */
|
|
8
|
+
export declare function parseStatements(source: string): ts.Statement[];
|
|
9
|
+
/** Parse a single source expression into a ts.Expression (for emitting generator-authored
|
|
10
|
+
* expressions like `new Blob([])` that aren't plain data literals). */
|
|
11
|
+
export declare function parseExpression(source: string): ts.Expression;
|
|
12
|
+
/**
|
|
13
|
+
* Attach a block JSDoc leading comment to `node` so it prints as a `/** … */`
|
|
14
|
+
* block above the node. Multi-line `text` becomes `*`-prefixed lines.
|
|
15
|
+
*/
|
|
16
|
+
export declare function jsdoc<T extends ts.Node>(node: T, text: string): T;
|
|
17
|
+
/** Backslash-escape any comment-closing star-slash so it cannot terminate a block comment. */
|
|
18
|
+
export declare function escapeJsDoc(text: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Shared `ts.factory` builders for the handful of node shapes every emitter was
|
|
21
|
+
* re-implementing locally (variable statements, arrow functions, `as const`
|
|
22
|
+
* arrays). Centralizing them keeps emitters terse and their output identical.
|
|
23
|
+
*/
|
|
24
|
+
/** `export const <name> = <init>;` */
|
|
25
|
+
export declare function exportConstStatement(name: string, init: ts.Expression): ts.Statement;
|
|
26
|
+
/** An arrow function `(<params>) => <body>` (no explicit return type). */
|
|
27
|
+
export declare function arrow(params: ts.ParameterDeclaration[], body: ts.ConciseBody): ts.ArrowFunction;
|
|
28
|
+
/** `[<elements…>] as const`. */
|
|
29
|
+
export declare function constArray(elements: ts.Expression[]): ts.Expression;
|
|
30
|
+
/**
|
|
31
|
+
* A plain JS value as a printable literal expression. Negative numbers print as
|
|
32
|
+
* a unary minus over the positive literal (a `NumericLiteral` node cannot carry
|
|
33
|
+
* the sign); arrays and objects recurse and print compact, with keys quoted only
|
|
34
|
+
* when they fail the identifier GRAMMAR — reserved words (a descriptor's `in`
|
|
35
|
+
* field) are legal bare object-literal keys. The primitive overload's narrower
|
|
36
|
+
* return type fits `factory.createLiteralTypeNode`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function literalExpression(value: string | number | boolean | null): ts.LiteralExpression | ts.BooleanLiteral | ts.NullLiteral | ts.PrefixUnaryExpression;
|
|
39
|
+
export declare function literalExpression(value: unknown): ts.Expression;
|
|
40
|
+
//# sourceMappingURL=ts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts.d.ts","sourceRoot":"","sources":["../../src/emitters/ts.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,OAAO,EAAE,EAAE,EAAE,CAAC;AASd,yGAAyG;AACzG,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,MAAM,CAE5D;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,MAAM,CAEjE;AAkBD,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAK9D;AAED;wEACwE;AACxE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,UAAU,CAU7D;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CASjE;AAED,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAID;;;;GAIG;AAEH,sCAAsC;AACtC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,SAAS,CAQpF;AAED,0EAA0E;AAC1E,wBAAgB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,aAAa,CAS/F;AAED,gCAAgC;AAChC,wBAAgB,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAKnE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GACtC,EAAE,CAAC,iBAAiB,GAAG,EAAE,CAAC,cAAc,GAAG,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,qBAAqB,CAAC;AACxF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Foundation for AST-based code emission: a shared TypeScript printer plus
|
|
2
|
+
// `ts.factory` ergonomics. Emitters build `ts.Node`s and print them through
|
|
3
|
+
// `printNodes`; hand-authored reference TypeScript is embedded via
|
|
4
|
+
// `parseStatements`. The compiler (`ts`) is re-exported so emitters import the
|
|
5
|
+
// factory from one place.
|
|
6
|
+
import ts from 'typescript';
|
|
7
|
+
import { isIdentifier } from './identifier.js';
|
|
8
|
+
export { ts };
|
|
9
|
+
const printer = ts.createPrinter({
|
|
10
|
+
newLine: ts.NewLineKind.LineFeed,
|
|
11
|
+
removeComments: false,
|
|
12
|
+
});
|
|
13
|
+
const blankFile = ts.createSourceFile('', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
|
|
14
|
+
/** Print a list of nodes to source, tight (one per line) — for import/export groups and single nodes. */
|
|
15
|
+
export function printNodes(nodes) {
|
|
16
|
+
return nodes.map(printOne).join('\n');
|
|
17
|
+
}
|
|
18
|
+
/** Print top-level declarations separated by one blank line, for readable declaration bodies. */
|
|
19
|
+
export function printStatements(nodes) {
|
|
20
|
+
return nodes.map(printOne).join('\n\n');
|
|
21
|
+
}
|
|
22
|
+
function printOne(node) {
|
|
23
|
+
return printer.printNode(ts.EmitHint.Unspecified, node, sourceFileOf(node));
|
|
24
|
+
}
|
|
25
|
+
// Synthesized (`ts.factory`) nodes have no parent chain — print them against the
|
|
26
|
+
// shared blank file. Parsed nodes (from `parseStatements`, built with parent
|
|
27
|
+
// nodes set) must print against their own source so literal token text survives.
|
|
28
|
+
function sourceFileOf(node) {
|
|
29
|
+
let current = node;
|
|
30
|
+
while (current) {
|
|
31
|
+
if (ts.isSourceFile(current))
|
|
32
|
+
return current;
|
|
33
|
+
current = current.parent;
|
|
34
|
+
}
|
|
35
|
+
return blankFile;
|
|
36
|
+
}
|
|
37
|
+
/** Parse a source string into its top-level statements (for embedding hand-authored code). */
|
|
38
|
+
export function parseStatements(source) {
|
|
39
|
+
return [
|
|
40
|
+
...ts.createSourceFile('__embed.ts', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS)
|
|
41
|
+
.statements,
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
/** Parse a single source expression into a ts.Expression (for emitting generator-authored
|
|
45
|
+
* expressions like `new Blob([])` that aren't plain data literals). */
|
|
46
|
+
export function parseExpression(source) {
|
|
47
|
+
const stmt = ts.createSourceFile('__expr.ts', `(${source});`, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS).statements[0];
|
|
48
|
+
const parenthesized = stmt.expression;
|
|
49
|
+
return parenthesized.expression;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Attach a block JSDoc leading comment to `node` so it prints as a `/** … */`
|
|
53
|
+
* block above the node. Multi-line `text` becomes `*`-prefixed lines.
|
|
54
|
+
*/
|
|
55
|
+
export function jsdoc(node, text) {
|
|
56
|
+
// Neutralize any embedded `*/` here, at the single choke point every JSDoc block
|
|
57
|
+
// flows through: a spec-supplied description/summary/title containing `*/` would
|
|
58
|
+
// otherwise close the comment early and turn the rest into live code (injection).
|
|
59
|
+
const body = `*\n${escapeJsDoc(text)
|
|
60
|
+
.split('\n')
|
|
61
|
+
.map((line) => ` * ${line}`.replace(/ +$/, ''))
|
|
62
|
+
.join('\n')}\n `;
|
|
63
|
+
return ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, body, true);
|
|
64
|
+
}
|
|
65
|
+
/** Backslash-escape any comment-closing star-slash so it cannot terminate a block comment. */
|
|
66
|
+
export function escapeJsDoc(text) {
|
|
67
|
+
return text.replace(/\*\//g, '*\\/');
|
|
68
|
+
}
|
|
69
|
+
const { factory } = ts;
|
|
70
|
+
/**
|
|
71
|
+
* Shared `ts.factory` builders for the handful of node shapes every emitter was
|
|
72
|
+
* re-implementing locally (variable statements, arrow functions, `as const`
|
|
73
|
+
* arrays). Centralizing them keeps emitters terse and their output identical.
|
|
74
|
+
*/
|
|
75
|
+
/** `export const <name> = <init>;` */
|
|
76
|
+
export function exportConstStatement(name, init) {
|
|
77
|
+
return factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.ExportKeyword)], factory.createVariableDeclarationList([factory.createVariableDeclaration(name, undefined, undefined, init)], ts.NodeFlags.Const));
|
|
78
|
+
}
|
|
79
|
+
/** An arrow function `(<params>) => <body>` (no explicit return type). */
|
|
80
|
+
export function arrow(params, body) {
|
|
81
|
+
return factory.createArrowFunction(undefined, undefined, params, undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), body);
|
|
82
|
+
}
|
|
83
|
+
/** `[<elements…>] as const`. */
|
|
84
|
+
export function constArray(elements) {
|
|
85
|
+
return factory.createAsExpression(factory.createArrayLiteralExpression(elements, false), factory.createTypeReferenceNode('const'));
|
|
86
|
+
}
|
|
87
|
+
export function literalExpression(value) {
|
|
88
|
+
if (typeof value === 'string')
|
|
89
|
+
return factory.createStringLiteral(value);
|
|
90
|
+
if (typeof value === 'boolean')
|
|
91
|
+
return value ? factory.createTrue() : factory.createFalse();
|
|
92
|
+
if (typeof value === 'number') {
|
|
93
|
+
return value < 0
|
|
94
|
+
? factory.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, factory.createNumericLiteral(-value))
|
|
95
|
+
: factory.createNumericLiteral(value);
|
|
96
|
+
}
|
|
97
|
+
if (value === null)
|
|
98
|
+
return factory.createNull();
|
|
99
|
+
if (Array.isArray(value)) {
|
|
100
|
+
return factory.createArrayLiteralExpression(value.map(literalExpression), false);
|
|
101
|
+
}
|
|
102
|
+
return factory.createObjectLiteralExpression(Object.entries(value).map(([key, entryValue]) => factory.createPropertyAssignment(isIdentifier(key) ? key : factory.createStringLiteral(key), literalExpression(entryValue))), false);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=ts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts.js","sourceRoot":"","sources":["../../src/emitters/ts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { NamedSchemaModel } from '../intermediate-representation/model.js';
|
|
2
|
+
import { ts } from './ts.js';
|
|
3
|
+
/**
|
|
4
|
+
* Emit `is<Member>(value): value is <Member>` type guards for every discriminated
|
|
5
|
+
* union with a usable discriminator — whether it is a top-level named schema
|
|
6
|
+
* (`MenuItem = A | B`) or nested inside one (e.g. the `items` of an array, the
|
|
7
|
+
* value of a property). Two discriminator sources:
|
|
8
|
+
*
|
|
9
|
+
* - Explicit: the union carries a `discriminator` (built from the spec).
|
|
10
|
+
* - Implicit: no discriminator, but every member is a ref to a named schema and
|
|
11
|
+
* they all constrain one shared property to a distinct string `const`.
|
|
12
|
+
*
|
|
13
|
+
* Nested unions only qualify when every member is a ref to a named schema, so the
|
|
14
|
+
* `value` parameter is a clean union of exported types. Guard names are globally
|
|
15
|
+
* deduped (`is<Member>`), keeping the first in document order — so a top-level
|
|
16
|
+
* union wins its nicer `value: <UnionName>` parameter over a nested re-occurrence.
|
|
17
|
+
* Undiscriminated unions are skipped — TypeScript can't soundly narrow them.
|
|
18
|
+
* Returns the guard declarations as nodes (empty when no union narrows).
|
|
19
|
+
*/
|
|
20
|
+
export declare function typeGuardStatements(schemas: NamedSchemaModel[]): ts.FunctionDeclaration[];
|
|
21
|
+
//# sourceMappingURL=type-guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-guards.d.ts","sourceRoot":"","sources":["../../src/emitters/type-guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAEjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAS,EAAE,EAAE,MAAM,SAAS,CAAC;AAgBpC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAuCzF"}
|