@webda/content-mapper 0.0.0-stage → 4.0.0-beta.4
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/LICENSE +166 -0
- package/lib/coercions.d.ts +22 -0
- package/lib/coercions.d.ts.map +1 -0
- package/lib/coercions.js +10 -0
- package/lib/coercions.js.map +1 -0
- package/lib/context.d.ts +56 -0
- package/lib/context.d.ts.map +1 -0
- package/lib/context.js +111 -0
- package/lib/context.js.map +1 -0
- package/lib/defaults.d.ts +31 -0
- package/lib/defaults.d.ts.map +1 -0
- package/lib/defaults.js +33 -0
- package/lib/defaults.js.map +1 -0
- package/lib/generators/accessors.d.ts +15 -0
- package/lib/generators/accessors.d.ts.map +1 -0
- package/lib/generators/accessors.js +567 -0
- package/lib/generators/accessors.js.map +1 -0
- package/lib/generators/behaviors.d.ts +21 -0
- package/lib/generators/behaviors.d.ts.map +1 -0
- package/lib/generators/behaviors.js +292 -0
- package/lib/generators/behaviors.js.map +1 -0
- package/lib/generators/imports.d.ts +86 -0
- package/lib/generators/imports.d.ts.map +1 -0
- package/lib/generators/imports.js +205 -0
- package/lib/generators/imports.js.map +1 -0
- package/lib/generators/loadparameters.d.ts +7 -0
- package/lib/generators/loadparameters.d.ts.map +1 -0
- package/lib/generators/loadparameters.js +175 -0
- package/lib/generators/loadparameters.js.map +1 -0
- package/lib/generators/qlvalidator.d.ts +53 -0
- package/lib/generators/qlvalidator.d.ts.map +1 -0
- package/lib/generators/qlvalidator.js +238 -0
- package/lib/generators/qlvalidator.js.map +1 -0
- package/lib/index.d.ts +53 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +36 -0
- package/lib/index.js.map +1 -0
- package/lib/module-discovery.d.ts +211 -0
- package/lib/module-discovery.d.ts.map +1 -0
- package/lib/module-discovery.js +662 -0
- package/lib/module-discovery.js.map +1 -0
- package/lib/module.d.ts +213 -0
- package/lib/module.d.ts.map +1 -0
- package/lib/module.js +1243 -0
- package/lib/module.js.map +1 -0
- package/lib/plan.d.ts +101 -0
- package/lib/plan.d.ts.map +1 -0
- package/lib/plan.js +61 -0
- package/lib/plan.js.map +1 -0
- package/lib/property-order.d.ts +37 -0
- package/lib/property-order.d.ts.map +1 -0
- package/lib/property-order.js +141 -0
- package/lib/property-order.js.map +1 -0
- package/lib/schema/action.d.ts +46 -0
- package/lib/schema/action.d.ts.map +1 -0
- package/lib/schema/action.js +190 -0
- package/lib/schema/action.js.map +1 -0
- package/lib/schema/annotations.d.ts +63 -0
- package/lib/schema/annotations.d.ts.map +1 -0
- package/lib/schema/annotations.js +116 -0
- package/lib/schema/annotations.js.map +1 -0
- package/lib/schema/converter.d.ts +363 -0
- package/lib/schema/converter.d.ts.map +1 -0
- package/lib/schema/converter.js +1377 -0
- package/lib/schema/converter.js.map +1 -0
- package/lib/schema/jsdoc.d.ts +34 -0
- package/lib/schema/jsdoc.d.ts.map +1 -0
- package/lib/schema/jsdoc.js +206 -0
- package/lib/schema/jsdoc.js.map +1 -0
- package/lib/schema/model.d.ts +27 -0
- package/lib/schema/model.d.ts.map +1 -0
- package/lib/schema/model.js +86 -0
- package/lib/schema/model.js.map +1 -0
- package/lib/schema/project.d.ts +34 -0
- package/lib/schema/project.d.ts.map +1 -0
- package/lib/schema/project.js +305 -0
- package/lib/schema/project.js.map +1 -0
- package/lib/schema/service.d.ts +62 -0
- package/lib/schema/service.d.ts.map +1 -0
- package/lib/schema/service.js +130 -0
- package/lib/schema/service.js.map +1 -0
- package/lib/schema/types.d.ts +61 -0
- package/lib/schema/types.d.ts.map +1 -0
- package/lib/schema/types.js +36 -0
- package/lib/schema/types.js.map +1 -0
- package/lib/schema/worker-cli.d.ts +3 -0
- package/lib/schema/worker-cli.d.ts.map +1 -0
- package/lib/schema/worker-cli.js +7 -0
- package/lib/schema/worker-cli.js.map +1 -0
- package/lib/schema/worker.d.ts +81 -0
- package/lib/schema/worker.d.ts.map +1 -0
- package/lib/schema/worker.js +186 -0
- package/lib/schema/worker.js.map +1 -0
- package/lib/server.d.ts +2 -0
- package/lib/server.d.ts.map +1 -0
- package/lib/server.js +133 -0
- package/lib/server.js.map +1 -0
- package/lib/session.d.ts +84 -0
- package/lib/session.d.ts.map +1 -0
- package/lib/session.js +141 -0
- package/lib/session.js.map +1 -0
- package/lib/spans.d.ts +46 -0
- package/lib/spans.d.ts.map +1 -0
- package/lib/spans.js +64 -0
- package/lib/spans.js.map +1 -0
- package/lib/twopass.d.ts +45 -0
- package/lib/twopass.d.ts.map +1 -0
- package/lib/twopass.js +87 -0
- package/lib/twopass.js.map +1 -0
- package/lib/vite.d.ts +20 -0
- package/lib/vite.d.ts.map +1 -0
- package/lib/vite.js +41 -0
- package/lib/vite.js.map +1 -0
- package/package.json +89 -3
- package/README.md +0 -3
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessor generator — the typed replacement for `createAccessorTransformer`
|
|
3
|
+
* and `createDeclarationAccessorTransformer`.
|
|
4
|
+
*
|
|
5
|
+
* Handles all three coercion kinds from
|
|
6
|
+
* `packages/ts-plugin/src/transforms/accessors.ts`:
|
|
7
|
+
*
|
|
8
|
+
* | kind | trigger | generated |
|
|
9
|
+
* |------------------------|-------------------------------------------|-----------|
|
|
10
|
+
* | `builtin` | type name in the coercion registry (Date) | asymmetric accessor pair |
|
|
11
|
+
* | `set-method` | type has a `@WebdaAutoSetter` `set(...)` | asymmetric accessor pair |
|
|
12
|
+
* | `relation-initializer` | type resolves to `ModelRelated` | readonly initializer |
|
|
13
|
+
*
|
|
14
|
+
* The first two emit *asymmetric accessors*, which are ordinary TypeScript, so
|
|
15
|
+
* any compiler produces the right `.js` and `.d.ts` with no plugin.
|
|
16
|
+
*/
|
|
17
|
+
import { SymbolFlags } from "typescript/unstable/sync";
|
|
18
|
+
import * as is from "typescript/unstable/ast/is";
|
|
19
|
+
import { DEFAULT_COERCIONS } from "../coercions.js";
|
|
20
|
+
import { classesOf, isStatic, memberName } from "../context.js";
|
|
21
|
+
import { ValueImports } from "./imports.js";
|
|
22
|
+
/**
|
|
23
|
+
* How to coerce each registry type at runtime.
|
|
24
|
+
*
|
|
25
|
+
* Which types coerce, and the widened setter type they accept, comes from
|
|
26
|
+
* {@link DEFAULT_COERCIONS} so that this generator, `@webda/compiler` and the
|
|
27
|
+
* language service cannot drift apart. Only the runtime coercion expression —
|
|
28
|
+
* which is meaningless outside code generation — lives here.
|
|
29
|
+
*/
|
|
30
|
+
const COERCE_EXPRESSIONS = {
|
|
31
|
+
Date: v => `new Date(${v} as string | number | Date)`
|
|
32
|
+
};
|
|
33
|
+
const BUILTINS = Object.fromEntries(Object.entries(DEFAULT_COERCIONS)
|
|
34
|
+
.filter(([name]) => COERCE_EXPRESSIONS[name])
|
|
35
|
+
.map(([name, rule]) => [name, { setterType: rule.setterType, coerce: COERCE_EXPRESSIONS[name] }]));
|
|
36
|
+
/** Class names treated as model bases. */
|
|
37
|
+
const MODEL_BASES = new Set(["Model", "UuidModel", "CoreModel"]);
|
|
38
|
+
/**
|
|
39
|
+
* Whether a class is a model, following the base chain through the checker.
|
|
40
|
+
*
|
|
41
|
+
* The direct `extends` clause is not enough. In `@webda/core`, `Ident extends
|
|
42
|
+
* OwnerModel` and `SimpleUser extends User` are both models, several links away
|
|
43
|
+
* from `UuidModel`; matching only the written base name silently skips them and
|
|
44
|
+
* their fields are never coerced. The chain is walked with the checker so it also
|
|
45
|
+
* crosses package boundaries into `@webda/models`.
|
|
46
|
+
* @param ctx - analysis context
|
|
47
|
+
* @param sf - file declaring the class
|
|
48
|
+
* @param cls - the class declaration
|
|
49
|
+
* @returns true when the class derives from a known model base
|
|
50
|
+
*/
|
|
51
|
+
function isModelClass(ctx, sf, cls) {
|
|
52
|
+
// Cheap syntactic hit first: most models name a known base directly.
|
|
53
|
+
if (ctx.baseNames(sf, cls).some(b => MODEL_BASES.has(b)))
|
|
54
|
+
return true;
|
|
55
|
+
// `getTypeAtLocation` on a class declaration yields the static side, whose
|
|
56
|
+
// base types are constructor types — the instance chain is what we need.
|
|
57
|
+
const symbol = cls.name ? ctx.checker.getSymbolAtLocation(cls.name) : undefined;
|
|
58
|
+
const declared = symbol ? ctx.checker.getDeclaredTypeOfSymbol(symbol) : undefined;
|
|
59
|
+
if (!declared)
|
|
60
|
+
return false;
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
const queue = [declared];
|
|
63
|
+
while (queue.length) {
|
|
64
|
+
const type = queue.shift();
|
|
65
|
+
if (!type)
|
|
66
|
+
continue;
|
|
67
|
+
const symbol = type.getSymbol?.() ?? type.symbol;
|
|
68
|
+
const name = symbol?.name;
|
|
69
|
+
if (name && MODEL_BASES.has(name))
|
|
70
|
+
return true;
|
|
71
|
+
// Keyed by declaration: a model may legitimately share its base's name,
|
|
72
|
+
// e.g. sample-app's `User extends User` from `@webda/core`. Guarding on the
|
|
73
|
+
// name alone stops the walk one link short and the class is never detected.
|
|
74
|
+
const declaration = symbol?.valueDeclaration ?? symbol?.declarations?.[0];
|
|
75
|
+
const owner = declaration?.resolve(ctx.project);
|
|
76
|
+
const file = owner?.getSourceFile?.()?.fileName ?? owner?._sourceFile?.fileName ?? "";
|
|
77
|
+
const key = name ? `${name}@${file}` : type;
|
|
78
|
+
if (seen.has(key))
|
|
79
|
+
continue;
|
|
80
|
+
seen.add(key);
|
|
81
|
+
// Guard against pathological hierarchies rather than trusting the graph.
|
|
82
|
+
if (seen.size > 64)
|
|
83
|
+
return false;
|
|
84
|
+
// `getBaseTypes()` hands back instantiated references whose own bases are
|
|
85
|
+
// empty, so a generic link such as `AbstractOwnerModel<T> extends UuidModel`
|
|
86
|
+
// terminates the walk. Re-resolving each base through its symbol gets the
|
|
87
|
+
// declared type, which does carry the next link.
|
|
88
|
+
const resolved = symbol ? (ctx.checker.getDeclaredTypeOfSymbol(symbol) ?? type) : type;
|
|
89
|
+
for (const base of resolved.getBaseTypes?.() ?? type.getBaseTypes?.() ?? [])
|
|
90
|
+
queue.push(base);
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
/** Runtime class name that needs an initializer rather than an accessor. */
|
|
95
|
+
const RELATION_CONTAINER = "ModelRelated";
|
|
96
|
+
/**
|
|
97
|
+
* Follow a type to the class that actually implements it, so aliases like
|
|
98
|
+
* `ManyToOne<T>` resolve to `ModelLink` and `OneToMany<T>` to `ModelRelated`.
|
|
99
|
+
* @param ctx - analysis context
|
|
100
|
+
* @param typeNode - the property's type node
|
|
101
|
+
* @returns the resolved class name, if any
|
|
102
|
+
*/
|
|
103
|
+
function resolveRuntimeClass(ctx, typeNode) {
|
|
104
|
+
const type = ctx.checker.getTypeFromTypeNode(typeNode);
|
|
105
|
+
if (!type)
|
|
106
|
+
return undefined;
|
|
107
|
+
const symbol = type.getSymbol?.() ?? type.symbol;
|
|
108
|
+
const name = symbol?.name;
|
|
109
|
+
if (name && name !== "__type")
|
|
110
|
+
return name;
|
|
111
|
+
// Fall back to the printed type, taking the head of `Foo<Bar>`.
|
|
112
|
+
const printed = ctx.checker.typeToString(type);
|
|
113
|
+
const head = /^([A-Za-z_$][\w$]*)/.exec(printed)?.[1];
|
|
114
|
+
return head;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Find a `set` method tagged `@WebdaAutoSetter` on the property's type and
|
|
118
|
+
* return its parameter type as a string.
|
|
119
|
+
* @param ctx - analysis context
|
|
120
|
+
* @param typeNode - the property's type node
|
|
121
|
+
* @returns the widened parameter type, if the tag is present
|
|
122
|
+
*/
|
|
123
|
+
function autoSetterParamType(ctx, typeNode) {
|
|
124
|
+
const type = ctx.checker.getTypeFromTypeNode(typeNode);
|
|
125
|
+
if (!type)
|
|
126
|
+
return undefined;
|
|
127
|
+
const setSymbol = ctx.checker.getPropertyOfType(type, "set");
|
|
128
|
+
if (!setSymbol)
|
|
129
|
+
return undefined;
|
|
130
|
+
const decl = setSymbol.valueDeclaration ?? setSymbol.declarations?.[0];
|
|
131
|
+
const node = decl?.resolve(ctx.project);
|
|
132
|
+
if (!node)
|
|
133
|
+
return undefined;
|
|
134
|
+
const owner = node.getSourceFile?.() ?? node._sourceFile;
|
|
135
|
+
if (!owner || !/@WebdaAutoSetter\b/.test(ctx.triviaOf(owner, node)))
|
|
136
|
+
return undefined;
|
|
137
|
+
const setType = ctx.checker.getTypeOfSymbol(setSymbol);
|
|
138
|
+
if (!setType)
|
|
139
|
+
return undefined;
|
|
140
|
+
// 0 === SignatureKind.Call
|
|
141
|
+
const sigs = ctx.checker.getSignaturesOfType(setType, 0);
|
|
142
|
+
if (!sigs.length)
|
|
143
|
+
return undefined;
|
|
144
|
+
const param = ctx.checker.getParameterType(sigs[0], 0);
|
|
145
|
+
return param ? ctx.checker.typeToString(param) : undefined;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Whether a name reaches this file only through a type-only import.
|
|
149
|
+
*
|
|
150
|
+
* `import type { Team }` is erased at emit, so referencing `Team` as a value
|
|
151
|
+
* produces TS1361. `Checker.resolveName` still resolves it — it answers about
|
|
152
|
+
* the symbol, not about what survives emit — so the import form has to be
|
|
153
|
+
* inspected directly.
|
|
154
|
+
* @param sf - the file that will contain the generated reference
|
|
155
|
+
* @param name - identifier to be used as a value
|
|
156
|
+
* @returns true when the name is imported for types only
|
|
157
|
+
*/
|
|
158
|
+
function isTypeOnlyImport(sf, name) {
|
|
159
|
+
for (const statement of sf.statements) {
|
|
160
|
+
if (!is.isImportDeclaration(statement))
|
|
161
|
+
continue;
|
|
162
|
+
const clause = statement.importClause;
|
|
163
|
+
if (!clause)
|
|
164
|
+
continue;
|
|
165
|
+
const bindings = clause.namedBindings;
|
|
166
|
+
if (!bindings?.elements)
|
|
167
|
+
continue;
|
|
168
|
+
for (const element of bindings.elements) {
|
|
169
|
+
if (element.name?.text !== name)
|
|
170
|
+
continue;
|
|
171
|
+
if (clause.isTypeOnly || element.isTypeOnly)
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Whether every identifier a generated snippet references is usable here.
|
|
179
|
+
*
|
|
180
|
+
* The emit-time transformer erased types, so a printed type could name classes
|
|
181
|
+
* the file never imported and nothing noticed. Generated *source* is checked,
|
|
182
|
+
* so `set x(value: string | Classroom | ...)` is TS2304 when `Classroom` is not
|
|
183
|
+
* in scope, and `new BinariesImpl()` is TS2304 when the file imports the public
|
|
184
|
+
* alias instead of the implementation.
|
|
185
|
+
*
|
|
186
|
+
* Conservative on purpose: anything not clearly resolvable means the property
|
|
187
|
+
* is skipped and keeps today's behaviour.
|
|
188
|
+
* @param ctx - analysis context
|
|
189
|
+
* @param sf - file the snippet will live in
|
|
190
|
+
* @param snippet - generated text to check
|
|
191
|
+
* @param location - node used for scope resolution
|
|
192
|
+
* @param provided - names the caller has just made available through imports
|
|
193
|
+
* @returns true when every referenced name resolves
|
|
194
|
+
*/
|
|
195
|
+
function referencesResolve(ctx, sf, snippet, location, provided = new Set()) {
|
|
196
|
+
const skip = new Set([
|
|
197
|
+
"string",
|
|
198
|
+
"number",
|
|
199
|
+
"boolean",
|
|
200
|
+
"any",
|
|
201
|
+
"unknown",
|
|
202
|
+
"never",
|
|
203
|
+
"void",
|
|
204
|
+
"null",
|
|
205
|
+
"undefined",
|
|
206
|
+
"object",
|
|
207
|
+
"symbol",
|
|
208
|
+
"bigint",
|
|
209
|
+
"this",
|
|
210
|
+
"value",
|
|
211
|
+
"readonly",
|
|
212
|
+
"get",
|
|
213
|
+
"set",
|
|
214
|
+
"new",
|
|
215
|
+
"return",
|
|
216
|
+
"if",
|
|
217
|
+
"else",
|
|
218
|
+
"const",
|
|
219
|
+
"instanceof",
|
|
220
|
+
"true",
|
|
221
|
+
"false",
|
|
222
|
+
"Date",
|
|
223
|
+
"Record",
|
|
224
|
+
"Array",
|
|
225
|
+
"Promise",
|
|
226
|
+
// Injected by this generator, so not yet resolvable in the authored text.
|
|
227
|
+
"WEBDA_STORAGE"
|
|
228
|
+
]);
|
|
229
|
+
for (const match of snippet.matchAll(/\b[A-Z][\w$]*\b/g)) {
|
|
230
|
+
const name = match[0];
|
|
231
|
+
if (skip.has(name) || provided.has(name))
|
|
232
|
+
continue;
|
|
233
|
+
// A type-only import is legitimate inside a type annotation, so the test is
|
|
234
|
+
// simply whether the name means anything here at all. Value positions are
|
|
235
|
+
// checked separately by the caller, where the distinction matters.
|
|
236
|
+
const asValue = ctx.checker.resolveName(name, SymbolFlags.Value, location);
|
|
237
|
+
const asType = ctx.checker.resolveName(name, SymbolFlags.Type, location);
|
|
238
|
+
if (!asValue && !asType)
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* How many parameters the runtime class's constructor declares.
|
|
245
|
+
*
|
|
246
|
+
* Read from the property's *type*, not by looking the class name up in the
|
|
247
|
+
* file: `BelongTo<User>` resolves to `ModelLink`, which the file usually does
|
|
248
|
+
* not import at all.
|
|
249
|
+
* @param ctx - analysis context
|
|
250
|
+
* @param typeNode - the property's type node
|
|
251
|
+
* @returns the largest declared parameter count, or undefined
|
|
252
|
+
*/
|
|
253
|
+
function constructorParameterCount(ctx, typeNode) {
|
|
254
|
+
const symbol = ctx.checker.getTypeFromTypeNode(typeNode)?.getSymbol?.();
|
|
255
|
+
if (!symbol || !(symbol.flags & SymbolFlags.Class))
|
|
256
|
+
return undefined;
|
|
257
|
+
const ctorType = ctx.checker.getTypeOfSymbol(symbol);
|
|
258
|
+
// 1 === SignatureKind.Construct
|
|
259
|
+
const counts = ctx.checker.getSignaturesOfType(ctorType, 1).map(sig => sig.parameters.length);
|
|
260
|
+
return counts.length ? Math.max(...counts) : undefined;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* The runtime class a type argument names, falling back from a type parameter.
|
|
264
|
+
*
|
|
265
|
+
* On a generic class the written argument can be a type parameter, which does
|
|
266
|
+
* not exist at runtime — `new ModelLink(T)` is a ReferenceError on first use,
|
|
267
|
+
* and it is exactly what the TypeScript 6 transformer emits for
|
|
268
|
+
* `AbstractOwnerModel<T extends User>`. The parameter's default, then its
|
|
269
|
+
* constraint, is the most specific class that does exist.
|
|
270
|
+
* @param ctx - analysis context
|
|
271
|
+
* @param arg - the type argument
|
|
272
|
+
* @returns a class name, or undefined
|
|
273
|
+
*/
|
|
274
|
+
function runtimeClassOf(ctx, arg) {
|
|
275
|
+
if (arg?.isTypeParameter?.()) {
|
|
276
|
+
arg =
|
|
277
|
+
ctx.checker.getDefaultFromTypeParameter?.(arg) ??
|
|
278
|
+
ctx.checker.getConstraintOfTypeParameter?.(arg) ??
|
|
279
|
+
undefined;
|
|
280
|
+
}
|
|
281
|
+
const name = arg?.getSymbol?.()?.name;
|
|
282
|
+
return name && /^[A-Za-z_$][\w$]*$/.test(name) ? name : undefined;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Constructor arguments for a relation class, derived from its type arguments.
|
|
286
|
+
*
|
|
287
|
+
* Decided by the kind of coercion, as the TypeScript 6 transformer decides it
|
|
288
|
+
* — not by constructor arity, which the 7.1 API does not report reliably
|
|
289
|
+
* (`minArgumentCount` is absent, so defaulted parameters count as required):
|
|
290
|
+
*
|
|
291
|
+
* - set-method (`ModelLink<T>`, `ModelLinksSimpleArray<T>`, ...): `(Target)`
|
|
292
|
+
* - relation container (`ModelRelated<Target, Owner, "attribute">`):
|
|
293
|
+
* `(Target, this)`, plus the attribute when the author wrote one — a
|
|
294
|
+
* defaulted third parameter resolves to `""`, which is not what was written
|
|
295
|
+
* @param ctx - analysis context
|
|
296
|
+
* @param typeNode - the property's type node
|
|
297
|
+
* @param kind - which coercion is being generated
|
|
298
|
+
* @returns the arguments, or undefined when the target cannot be named
|
|
299
|
+
*/
|
|
300
|
+
function constructorArguments(ctx, typeNode, kind) {
|
|
301
|
+
// A class whose constructor declares no parameters takes no arguments.
|
|
302
|
+
// Parameter *count* is reliable in 7.1 where the minimum arity is not.
|
|
303
|
+
if (constructorParameterCount(ctx, typeNode) === 0)
|
|
304
|
+
return { text: "", values: [] };
|
|
305
|
+
const type = ctx.checker.getTypeFromTypeNode(typeNode);
|
|
306
|
+
const args = type?.isTypeReference?.() ? ctx.checker.getTypeArguments(type) : [];
|
|
307
|
+
// The name as written, when it is a plain identifier naming a class: a
|
|
308
|
+
// default export's symbol is called `default`, which is not what the file
|
|
309
|
+
// binds it to. The symbol is only consulted for a type parameter, whose
|
|
310
|
+
// written name does not exist at runtime — and only when it provably names
|
|
311
|
+
// the same class as the resolved argument, since an alias may reorder its
|
|
312
|
+
// parameters.
|
|
313
|
+
const written = typeNode?.typeArguments?.[0];
|
|
314
|
+
const writtenName = written && is.isTypeReferenceNode(written) ? written.typeName?.text : undefined;
|
|
315
|
+
const resolvedSymbol = args[0]?.isTypeParameter?.() ? undefined : args[0]?.getSymbol?.();
|
|
316
|
+
const sameClass = !!resolvedSymbol &&
|
|
317
|
+
(resolvedSymbol.flags & SymbolFlags.Class) !== 0 &&
|
|
318
|
+
(resolvedSymbol.name === writtenName || resolvedSymbol.name === "default");
|
|
319
|
+
const target = writtenName && sameClass ? writtenName : runtimeClassOf(ctx, args[0]);
|
|
320
|
+
if (!target || target === "default")
|
|
321
|
+
return undefined;
|
|
322
|
+
if (kind === "set-method")
|
|
323
|
+
return { text: target, values: [target] };
|
|
324
|
+
const writtenCount = typeNode?.typeArguments?.length ?? 0;
|
|
325
|
+
if (writtenCount <= 2)
|
|
326
|
+
return { text: `${target}, this`, values: [target] };
|
|
327
|
+
if (!args[2]?.isStringLiteralType?.())
|
|
328
|
+
return undefined;
|
|
329
|
+
return { text: `${target}, this, ${JSON.stringify(args[2].value)}`, values: [target] };
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Indentation of the line containing an offset.
|
|
333
|
+
* @param text - file text
|
|
334
|
+
* @param offset - offset within the line
|
|
335
|
+
* @returns leading whitespace
|
|
336
|
+
*/
|
|
337
|
+
function indentAt(text, offset) {
|
|
338
|
+
const lineStart = text.lastIndexOf("\n", offset - 1) + 1;
|
|
339
|
+
const prefix = text.slice(lineStart, offset);
|
|
340
|
+
return /^[ \t]*$/.test(prefix) ? prefix : " ";
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Render the generated members for one resolved property.
|
|
344
|
+
* @param r - the resolved coercion
|
|
345
|
+
* @returns generated TypeScript source
|
|
346
|
+
*/
|
|
347
|
+
function render(r) {
|
|
348
|
+
const slot = `this[WEBDA_STORAGE][${JSON.stringify(r.name)}]`;
|
|
349
|
+
const i = r.indent;
|
|
350
|
+
if (r.kind === "relation-initializer") {
|
|
351
|
+
// Not assignable, so no accessor pair — just a readonly initialised field.
|
|
352
|
+
return `readonly ${r.name}: ${r.typeText} = new ${r.runtimeClass}(${r.ctorArg ?? ""}) as ${r.typeText};`;
|
|
353
|
+
}
|
|
354
|
+
const lines = [];
|
|
355
|
+
lines.push(`get ${r.name}(): ${r.typeText} {`);
|
|
356
|
+
lines.push(r.defaultExpr === undefined ? `${i} return ${slot};` : `${i} return ${slot} ?? ${r.defaultExpr};`);
|
|
357
|
+
lines.push(`${i}}`);
|
|
358
|
+
lines.push(`${i}set ${r.name}(value: ${r.setterType}) {`);
|
|
359
|
+
if (r.kind === "builtin") {
|
|
360
|
+
lines.push(`${i} ${slot} = value !== undefined && value !== null ? ${r.coerce("value")} : value;`);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
// The TypeScript 6 transformer's exact structure, so the emit-parity
|
|
364
|
+
// oracle proves equivalence instead of it being argued. `null` /
|
|
365
|
+
// `undefined` clear the relation rather than being wrapped in a new one.
|
|
366
|
+
lines.push(`${i} if (value instanceof ${r.runtimeClass}) {`);
|
|
367
|
+
lines.push(`${i} ${slot} = value;`);
|
|
368
|
+
lines.push(`${i} } else if (value != null) {`);
|
|
369
|
+
lines.push(`${i} const inst: ${r.typeText} = ${slot} || new ${r.runtimeClass}(${r.ctorArg ?? ""});`);
|
|
370
|
+
lines.push(`${i} inst.set(value as any);`);
|
|
371
|
+
lines.push(`${i} ${slot} = inst;`);
|
|
372
|
+
lines.push(`${i} } else {`);
|
|
373
|
+
lines.push(`${i} ${slot} = value;`);
|
|
374
|
+
lines.push(`${i} }`);
|
|
375
|
+
}
|
|
376
|
+
lines.push(`${i}}`);
|
|
377
|
+
return lines.join("\n");
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* The `toJSON` the TypeScript 6 transformer injected, as source.
|
|
381
|
+
*
|
|
382
|
+
* Own properties first, then the storage slot, over whatever the parent
|
|
383
|
+
* produced — so a subclass of a class that already merges storage is
|
|
384
|
+
* unaffected, and the order matches what ships today. One deliberate
|
|
385
|
+
* departure: when the parent hands back the instance itself, as
|
|
386
|
+
* `Model.toJSON()` does, a fresh object is used instead.
|
|
387
|
+
* @param i - indentation of the class members
|
|
388
|
+
* @returns the method source, framed by newlines
|
|
389
|
+
*/
|
|
390
|
+
function renderToJson(i) {
|
|
391
|
+
return [
|
|
392
|
+
"",
|
|
393
|
+
`${i}/** Generated by @webda/content-mapper: include values held in WEBDA_STORAGE. */`,
|
|
394
|
+
`${i}toJSON(): any {`,
|
|
395
|
+
// `as unknown` keeps the runtime check — a base may not define toJSON —
|
|
396
|
+
// without TS2774 under `strict`.
|
|
397
|
+
`${i} const parent: any = (super.toJSON as unknown) ? super.toJSON() : {};`,
|
|
398
|
+
// `Model.toJSON()` returns `this`: merging into it would only re-run the
|
|
399
|
+
// setters, and the accessors would still be invisible to JSON.stringify.
|
|
400
|
+
`${i} const result: any = parent === this ? {} : parent;`,
|
|
401
|
+
`${i} for (const key of Object.keys(this)) {`,
|
|
402
|
+
`${i} result[key] = (this as any)[key];`,
|
|
403
|
+
`${i} }`,
|
|
404
|
+
`${i} Object.assign(result, (this as any)[WEBDA_STORAGE]);`,
|
|
405
|
+
`${i} return result;`,
|
|
406
|
+
`${i}}`,
|
|
407
|
+
""
|
|
408
|
+
].join("\n");
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Create the accessor generator.
|
|
412
|
+
* @param options - generator options
|
|
413
|
+
* @returns a generator
|
|
414
|
+
*/
|
|
415
|
+
export function accessorsGenerator(options = {}) {
|
|
416
|
+
const storageModule = options.storageModule ?? "@webda/models";
|
|
417
|
+
return {
|
|
418
|
+
name: "accessors",
|
|
419
|
+
analyze(ctx) {
|
|
420
|
+
const out = [];
|
|
421
|
+
for (const sf of ctx.sourceFiles) {
|
|
422
|
+
const edits = [];
|
|
423
|
+
const imports = new ValueImports(ctx, sf, "accessors");
|
|
424
|
+
let needsStorage = false;
|
|
425
|
+
for (const cls of classesOf(sf)) {
|
|
426
|
+
const eligible = options.accessorsForAll || isModelClass(ctx, sf, cls);
|
|
427
|
+
if (!eligible)
|
|
428
|
+
continue;
|
|
429
|
+
let transformed = false;
|
|
430
|
+
// Never clobber an explicitly written accessor.
|
|
431
|
+
const existing = new Set();
|
|
432
|
+
for (const m of cls.members) {
|
|
433
|
+
if (is.isGetAccessorDeclaration(m) || is.isSetAccessorDeclaration(m)) {
|
|
434
|
+
const n = memberName(m);
|
|
435
|
+
if (n)
|
|
436
|
+
existing.add(n);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
for (const m of cls.members) {
|
|
440
|
+
if (!is.isPropertyDeclaration(m) || isStatic(m))
|
|
441
|
+
continue;
|
|
442
|
+
const name = memberName(m);
|
|
443
|
+
if (!name || existing.has(name))
|
|
444
|
+
continue;
|
|
445
|
+
if (!m.type)
|
|
446
|
+
continue;
|
|
447
|
+
// An initialiser is preserved by moving it into the getter as a
|
|
448
|
+
// fallback. The observable trade-off is that an explicit
|
|
449
|
+
// `undefined` now reads back as the default.
|
|
450
|
+
const initializer = m.initializer;
|
|
451
|
+
const defaultExpr = initializer ? ctx.textOf(sf, initializer) : undefined;
|
|
452
|
+
const typeText = ctx.textOf(sf, m.type);
|
|
453
|
+
const start = m.getStart();
|
|
454
|
+
const indent = indentAt(sf.text, start);
|
|
455
|
+
const head = /^([A-Za-z_$][\w$]*)/.exec(typeText)?.[1] ?? typeText;
|
|
456
|
+
let resolved;
|
|
457
|
+
const builtin = BUILTINS[head];
|
|
458
|
+
if (builtin) {
|
|
459
|
+
resolved = {
|
|
460
|
+
name,
|
|
461
|
+
typeText,
|
|
462
|
+
kind: "builtin",
|
|
463
|
+
setterType: builtin.setterType,
|
|
464
|
+
coerce: builtin.coerce,
|
|
465
|
+
defaultExpr,
|
|
466
|
+
start,
|
|
467
|
+
end: m.end,
|
|
468
|
+
indent
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
const runtimeClass = resolveRuntimeClass(ctx, m.type);
|
|
473
|
+
if (runtimeClass === RELATION_CONTAINER) {
|
|
474
|
+
const ctor = constructorArguments(ctx, m.type, "relation-initializer");
|
|
475
|
+
// An author-written initialiser wins for a readonly field.
|
|
476
|
+
if (defaultExpr !== undefined || !ctor)
|
|
477
|
+
continue;
|
|
478
|
+
resolved = {
|
|
479
|
+
name,
|
|
480
|
+
typeText,
|
|
481
|
+
kind: "relation-initializer",
|
|
482
|
+
runtimeClass,
|
|
483
|
+
ctorArg: ctor.text,
|
|
484
|
+
ctorValues: ctor.values,
|
|
485
|
+
start,
|
|
486
|
+
end: m.end,
|
|
487
|
+
indent
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
const param = autoSetterParamType(ctx, m.type);
|
|
492
|
+
const ctor = param && runtimeClass ? constructorArguments(ctx, m.type, "set-method") : undefined;
|
|
493
|
+
if (param && runtimeClass && ctor) {
|
|
494
|
+
resolved = {
|
|
495
|
+
name,
|
|
496
|
+
typeText,
|
|
497
|
+
kind: "set-method",
|
|
498
|
+
setterType: `${param} | ${typeText}`,
|
|
499
|
+
runtimeClass,
|
|
500
|
+
ctorArg: ctor.text,
|
|
501
|
+
ctorValues: ctor.values,
|
|
502
|
+
defaultExpr,
|
|
503
|
+
start,
|
|
504
|
+
end: m.end,
|
|
505
|
+
indent
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
if (!resolved)
|
|
511
|
+
continue;
|
|
512
|
+
const rendered = render(resolved);
|
|
513
|
+
// Whatever the generated members construct or test with
|
|
514
|
+
// `instanceof` must survive emit as a value. Promoted or added
|
|
515
|
+
// imports are rolled back if any name cannot be made available, so
|
|
516
|
+
// a skipped property leaves nothing behind.
|
|
517
|
+
const rollback = imports.checkpoint();
|
|
518
|
+
const runtimeNames = [resolved.runtimeClass, ...(resolved.ctorValues ?? [])].filter(Boolean);
|
|
519
|
+
// `BelongTo<User>` names the alias; the module that exports it is
|
|
520
|
+
// where `ModelLink` is looked for.
|
|
521
|
+
const via = [head, ...new Set(typeText.match(/[A-Za-z_$][\w$]*/g) ?? [])];
|
|
522
|
+
// Then everything else they mention must already exist here. The
|
|
523
|
+
// runtime names were just made available, so they count.
|
|
524
|
+
// Types the printed setter signature names but the file lacks
|
|
525
|
+
// (`PrimaryKeyType<User>`) get an erased `import type`.
|
|
526
|
+
const typeNames = [...new Set(resolved.setterType?.match(/\b[A-Z][\w$]*\b/g) ?? [])];
|
|
527
|
+
if (!runtimeNames.every(runtime => imports.ensure(runtime, m, via)) ||
|
|
528
|
+
!typeNames.every(typeName => runtimeNames.includes(typeName) || imports.ensureType(typeName, m, via)) ||
|
|
529
|
+
!referencesResolve(ctx, sf, rendered, m, new Set([...runtimeNames, ...typeNames]))) {
|
|
530
|
+
rollback();
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
if (resolved.kind !== "relation-initializer")
|
|
534
|
+
needsStorage = true;
|
|
535
|
+
transformed = true;
|
|
536
|
+
edits.push({ start, end: m.end, text: rendered, source: "accessors" });
|
|
537
|
+
}
|
|
538
|
+
// Any class this generator touched gets the TypeScript 6
|
|
539
|
+
// transformer's `toJSON`, unless it declares one. It is not
|
|
540
|
+
// optional: `Model.toJSON()` returns `this`, `JSON.stringify` skips
|
|
541
|
+
// the symbol-keyed storage, and without this every generated
|
|
542
|
+
// accessor's value would be silently dropped from serialisation.
|
|
543
|
+
if (transformed && !cls.members.some((member) => memberName(member) === "toJSON")) {
|
|
544
|
+
needsStorage = true;
|
|
545
|
+
const close = cls.end - 1;
|
|
546
|
+
const indent = indentAt(sf.text, cls.members[0]?.getStart?.() ?? close);
|
|
547
|
+
edits.push({ start: close, end: close, text: renderToJson(indent), source: "accessors" });
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
if (edits.length) {
|
|
551
|
+
edits.push(...imports.collect());
|
|
552
|
+
if (needsStorage && !new RegExp(`\\bWEBDA_STORAGE\\b`).test(sf.text)) {
|
|
553
|
+
edits.push({
|
|
554
|
+
start: 0,
|
|
555
|
+
end: 0,
|
|
556
|
+
text: `import { WEBDA_STORAGE } from ${JSON.stringify(storageModule)};\n`,
|
|
557
|
+
source: "accessors"
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
out.push({ fileName: sf.fileName, edits });
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
return out;
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
//# sourceMappingURL=accessors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessors.js","sourceRoot":"","sources":["../../src/generators/accessors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Generator } from "../plan.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Storage slot backing a Behaviour's `parent` reference.
|
|
4
|
+
*
|
|
5
|
+
* Must match `BEHAVIOR_PARENT_KEY` in `@webda/ts-plugin`: the per-Behaviour
|
|
6
|
+
* `parent` getter reads it and `toJSON` filters it out, so a mismatch silently
|
|
7
|
+
* serialises the parent back into stored data.
|
|
8
|
+
*/
|
|
9
|
+
export declare const BEHAVIOR_PARENT_KEY = "__parent__";
|
|
10
|
+
/** Options for the behaviour generator. */
|
|
11
|
+
export interface BehaviorOptions {
|
|
12
|
+
/** Module specifier providing `WEBDA_STORAGE`. */
|
|
13
|
+
storageModule?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create the behaviour generator.
|
|
17
|
+
* @param options - generator options
|
|
18
|
+
* @returns a generator
|
|
19
|
+
*/
|
|
20
|
+
export declare function behaviorsGenerator(options?: BehaviorOptions): Generator;
|
|
21
|
+
//# sourceMappingURL=behaviors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"behaviors.d.ts","sourceRoot":"","sources":["../../src/generators/behaviors.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAoC,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAqLD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,GAAG,SAAS,CAsG3E"}
|