@zmdb/compiler 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +40 -0
  3. package/dist/codegen/index.d.ts +50 -0
  4. package/dist/codegen/index.d.ts.map +1 -0
  5. package/dist/codegen/index.js +364 -0
  6. package/dist/codegen/index.js.map +1 -0
  7. package/dist/codegen/scan.d.ts +105 -0
  8. package/dist/codegen/scan.d.ts.map +1 -0
  9. package/dist/codegen/scan.js +450 -0
  10. package/dist/codegen/scan.js.map +1 -0
  11. package/dist/codegen/witness.d.ts +76 -0
  12. package/dist/codegen/witness.d.ts.map +1 -0
  13. package/dist/codegen/witness.js +690 -0
  14. package/dist/codegen/witness.js.map +1 -0
  15. package/dist/config/contract.d.ts +41 -0
  16. package/dist/config/contract.d.ts.map +1 -0
  17. package/dist/config/contract.js +5 -0
  18. package/dist/config/contract.js.map +1 -0
  19. package/dist/config/index.d.ts +53 -0
  20. package/dist/config/index.d.ts.map +1 -0
  21. package/dist/config/index.js +277 -0
  22. package/dist/config/index.js.map +1 -0
  23. package/dist/config/index.zmdb.generated.d.ts +12 -0
  24. package/dist/config/index.zmdb.generated.js +28 -0
  25. package/dist/config/index.zmdb.witness.d.ts +3 -0
  26. package/dist/config/index.zmdb.witness.d.ts.map +1 -0
  27. package/dist/config/index.zmdb.witness.js +20 -0
  28. package/dist/config/index.zmdb.witness.js.map +1 -0
  29. package/dist/configured-plugin.d.ts +11 -0
  30. package/dist/configured-plugin.d.ts.map +1 -0
  31. package/dist/configured-plugin.js +27 -0
  32. package/dist/configured-plugin.js.map +1 -0
  33. package/dist/emit/index.d.ts +103 -0
  34. package/dist/emit/index.d.ts.map +1 -0
  35. package/dist/emit/index.js +1356 -0
  36. package/dist/emit/index.js.map +1 -0
  37. package/dist/errors.d.ts +7 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +2 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/index.d.ts +46 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +254 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lint/ast.d.ts +17 -0
  46. package/dist/lint/ast.d.ts.map +1 -0
  47. package/dist/lint/ast.js +77 -0
  48. package/dist/lint/ast.js.map +1 -0
  49. package/dist/lint/host-types.d.ts +9 -0
  50. package/dist/lint/host-types.d.ts.map +1 -0
  51. package/dist/lint/host-types.js +2 -0
  52. package/dist/lint/host-types.js.map +1 -0
  53. package/dist/lint/index.d.ts +23 -0
  54. package/dist/lint/index.d.ts.map +1 -0
  55. package/dist/lint/index.js +53 -0
  56. package/dist/lint/index.js.map +1 -0
  57. package/dist/lint/rules/no-distributed-nullable-tags.d.ts +3 -0
  58. package/dist/lint/rules/no-distributed-nullable-tags.d.ts.map +1 -0
  59. package/dist/lint/rules/no-distributed-nullable-tags.js +71 -0
  60. package/dist/lint/rules/no-distributed-nullable-tags.js.map +1 -0
  61. package/dist/lint/rules/no-empty-patch.d.ts +3 -0
  62. package/dist/lint/rules/no-empty-patch.d.ts.map +1 -0
  63. package/dist/lint/rules/no-empty-patch.js +26 -0
  64. package/dist/lint/rules/no-empty-patch.js.map +1 -0
  65. package/dist/lint/rules/no-interpolated-sql.d.ts +3 -0
  66. package/dist/lint/rules/no-interpolated-sql.d.ts.map +1 -0
  67. package/dist/lint/rules/no-interpolated-sql.js +35 -0
  68. package/dist/lint/rules/no-interpolated-sql.js.map +1 -0
  69. package/dist/lint/rules/no-unbounded-find.d.ts +3 -0
  70. package/dist/lint/rules/no-unbounded-find.d.ts.map +1 -0
  71. package/dist/lint/rules/no-unbounded-find.js +26 -0
  72. package/dist/lint/rules/no-unbounded-find.js.map +1 -0
  73. package/dist/lint/rules/no-unknown-json-column.d.ts +3 -0
  74. package/dist/lint/rules/no-unknown-json-column.d.ts.map +1 -0
  75. package/dist/lint/rules/no-unknown-json-column.js +35 -0
  76. package/dist/lint/rules/no-unknown-json-column.js.map +1 -0
  77. package/dist/lint/rules/require-sql-on-number.d.ts +3 -0
  78. package/dist/lint/rules/require-sql-on-number.d.ts.map +1 -0
  79. package/dist/lint/rules/require-sql-on-number.js +34 -0
  80. package/dist/lint/rules/require-sql-on-number.js.map +1 -0
  81. package/dist/lint/types.d.ts +12 -0
  82. package/dist/lint/types.d.ts.map +1 -0
  83. package/dist/lint/types.js +2 -0
  84. package/dist/lint/types.js.map +1 -0
  85. package/dist/metro/metro.d.ts +22 -0
  86. package/dist/metro/metro.d.ts.map +1 -0
  87. package/dist/metro/metro.js +242 -0
  88. package/dist/metro/metro.js.map +1 -0
  89. package/dist/protobuf/decode.d.ts +20 -0
  90. package/dist/protobuf/decode.d.ts.map +1 -0
  91. package/dist/protobuf/decode.js +289 -0
  92. package/dist/protobuf/decode.js.map +1 -0
  93. package/dist/protobuf/descriptor.d.ts +16 -0
  94. package/dist/protobuf/descriptor.d.ts.map +1 -0
  95. package/dist/protobuf/descriptor.js +303 -0
  96. package/dist/protobuf/descriptor.js.map +1 -0
  97. package/dist/protobuf/encode.d.ts +20 -0
  98. package/dist/protobuf/encode.d.ts.map +1 -0
  99. package/dist/protobuf/encode.js +203 -0
  100. package/dist/protobuf/encode.js.map +1 -0
  101. package/dist/protobuf/grpc-ir.d.ts +16 -0
  102. package/dist/protobuf/grpc-ir.d.ts.map +1 -0
  103. package/dist/protobuf/grpc-ir.js +2 -0
  104. package/dist/protobuf/grpc-ir.js.map +1 -0
  105. package/dist/protobuf/plan.d.ts +42 -0
  106. package/dist/protobuf/plan.d.ts.map +1 -0
  107. package/dist/protobuf/plan.js +158 -0
  108. package/dist/protobuf/plan.js.map +1 -0
  109. package/dist/reflect/callsites.d.ts +40 -0
  110. package/dist/reflect/callsites.d.ts.map +1 -0
  111. package/dist/reflect/callsites.js +153 -0
  112. package/dist/reflect/callsites.js.map +1 -0
  113. package/dist/reflect/index.d.ts +106 -0
  114. package/dist/reflect/index.d.ts.map +1 -0
  115. package/dist/reflect/index.js +1421 -0
  116. package/dist/reflect/index.js.map +1 -0
  117. package/dist/reflect/session.d.ts +118 -0
  118. package/dist/reflect/session.d.ts.map +1 -0
  119. package/dist/reflect/session.js +228 -0
  120. package/dist/reflect/session.js.map +1 -0
  121. package/dist/testing/index.d.ts +69 -0
  122. package/dist/testing/index.d.ts.map +1 -0
  123. package/dist/testing/index.js +210 -0
  124. package/dist/testing/index.js.map +1 -0
  125. package/dist/transform/index.d.ts +74 -0
  126. package/dist/transform/index.d.ts.map +1 -0
  127. package/dist/transform/index.js +572 -0
  128. package/dist/transform/index.js.map +1 -0
  129. package/dist/unplugin/index.d.ts +53 -0
  130. package/dist/unplugin/index.d.ts.map +1 -0
  131. package/dist/unplugin/index.js +130 -0
  132. package/dist/unplugin/index.js.map +1 -0
  133. package/dist/unplugin/inline-bench.d.ts +29 -0
  134. package/dist/unplugin/inline-bench.d.ts.map +1 -0
  135. package/dist/unplugin/inline-bench.js +82 -0
  136. package/dist/unplugin/inline-bench.js.map +1 -0
  137. package/package.json +110 -0
  138. package/src/codegen/index.ts +451 -0
  139. package/src/codegen/scan.ts +574 -0
  140. package/src/codegen/witness.ts +819 -0
  141. package/src/config/contract.ts +48 -0
  142. package/src/config/index.ts +384 -0
  143. package/src/config/index.zmdb.generated.d.ts +12 -0
  144. package/src/config/index.zmdb.generated.js +28 -0
  145. package/src/config/index.zmdb.witness.ts +22 -0
  146. package/src/configured-plugin.ts +35 -0
  147. package/src/emit/index.ts +1496 -0
  148. package/src/errors.ts +6 -0
  149. package/src/index.ts +336 -0
  150. package/src/lint/ast.ts +96 -0
  151. package/src/lint/host-types.ts +9 -0
  152. package/src/lint/index.ts +80 -0
  153. package/src/lint/rules/no-distributed-nullable-tags.ts +76 -0
  154. package/src/lint/rules/no-empty-patch.ts +26 -0
  155. package/src/lint/rules/no-interpolated-sql.ts +45 -0
  156. package/src/lint/rules/no-unbounded-find.ts +26 -0
  157. package/src/lint/rules/no-unknown-json-column.ts +36 -0
  158. package/src/lint/rules/require-sql-on-number.ts +34 -0
  159. package/src/lint/types.ts +11 -0
  160. package/src/metro/metro.ts +313 -0
  161. package/src/protobuf/decode.ts +375 -0
  162. package/src/protobuf/descriptor.ts +353 -0
  163. package/src/protobuf/encode.ts +277 -0
  164. package/src/protobuf/grpc-ir.ts +17 -0
  165. package/src/protobuf/plan.ts +244 -0
  166. package/src/reflect/callsites.ts +198 -0
  167. package/src/reflect/index.ts +1723 -0
  168. package/src/reflect/session.ts +276 -0
  169. package/src/testing/index.ts +298 -0
  170. package/src/transform/index.ts +690 -0
  171. package/src/unplugin/index.ts +182 -0
  172. package/src/unplugin/inline-bench.ts +92 -0
@@ -0,0 +1,572 @@
1
+ // The front door: source text in, source text out.
2
+ //
3
+ // Two paths, and the split is the whole point of Phase 5.
4
+ //
5
+ // `transformFile` is the real one. It asks the compiler what `T` is, reflects the answer
6
+ // into IR, and hands the IR to the emitter. Every type TypeScript can express is
7
+ // therefore either understood exactly or refused by name (REQ-TF-8).
8
+ //
9
+ // `transformCode` is what is left of the old text-based transformer: `validate(tags.X,
10
+ // …)` inlining, which needs no types because the rule is spelled out at the call site.
11
+ // It used to *also* parse type arguments with a 60-line hand-rolled parser, and that is
12
+ // deleted rather than kept as a fallback. `f70186c6` is the reason: the parser read
13
+ // `string[]` as `string` and `number | string` as `number`, so a call was inlined to a
14
+ // check that answers a different question, and a wrong answer that looks right is worse
15
+ // than no answer at all. A call site the checker cannot reach is now left alone.
16
+ //
17
+ // Rewriting is by text offset rather than by AST printing, because `sourceFile.text` is
18
+ // byte-identical to the file on disk (measured) and every other byte of the file — the
19
+ // comments, the formatting, the sourcemap-relevant line breaks — should survive
20
+ // untouched. The price is that the offsets are only valid for the exact text the
21
+ // compiler parsed, so `transformFile` checks that before it trusts one.
22
+ import {} from '@zmdb/schema/ir';
23
+ import { MAX_REGEX_CACHE_SIZE, validatePatternComplexity } from '@zmdb/validator';
24
+ import { createScanner, LanguageVariant, SyntaxKind } from 'typescript/unstable/ast';
25
+ import { isLiteralTypeNode, isNumericLiteral, isPrefixUnaryExpression, isStringLiteral, } from 'typescript/unstable/ast/is';
26
+ import { Emitter, escapePattern } from '../emit/index.js';
27
+ import { CALL_OWNERS, findOwnedCallSites, OWNED_CALLEES } from '../reflect/callsites.js';
28
+ import { Reflector } from '../reflect/index.js';
29
+ /**
30
+ * The calls `transformFile` rewrites. Matched by identifier text — see `callsites.ts`.
31
+ *
32
+ * Exported because no-bundler project compilation asks the same question about the same names, and
33
+ * two lists would drift: a callee added here and not there is a call the bundler inlines
34
+ * and the CLI leaves as a runtime walk, which is a silent performance cliff between two
35
+ * paths that are supposed to be equivalent.
36
+ */
37
+ export const CALLEES = OWNED_CALLEES;
38
+ const SHALLOW_CALLEES = new Set(['isShallow', 'assertShallow', 'validateShallow']);
39
+ const TOOL_PROVIDERS = new Set(['openai', 'openai-strict', 'anthropic', 'gemini', 'json-schema']);
40
+ /**
41
+ * Rewrite every reachable validation call in one file.
42
+ *
43
+ * The file must be part of the session's project and its text must be what the compiler
44
+ * parsed. When either does not hold the offsets are meaningless, so this degrades to
45
+ * `transformCode` and says so, rather than rewriting at a position it guessed.
46
+ */
47
+ export function transformFile(fileName, code, context) {
48
+ const { session } = context;
49
+ const sourceFile = session.sourceFile(fileName);
50
+ if (!sourceFile) {
51
+ return degrade(fileName, code, 'this file is not part of the TypeScript project the session loaded');
52
+ }
53
+ if (sourceFile.text !== code) {
54
+ // Another plugin got here first, or the watcher is a revision behind. Either way the
55
+ // AST describes text we do not have, and an offset into the wrong string lands in
56
+ // the middle of an identifier.
57
+ return degrade(fileName, code, 'the text handed to the transformer is not the text the compiler parsed, so every offset in it would be a guess');
58
+ }
59
+ const sites = findOwnedCallSites(sourceFile, session.checker, CALLEES, CALL_OWNERS, {
60
+ allowUnbound: context.allowUnboundCallees === true,
61
+ });
62
+ if (sites.length === 0) {
63
+ const out = transformCode(code);
64
+ return { code: out, changed: out !== code, diagnostics: [] };
65
+ }
66
+ const emitter = new Emitter(context.emit);
67
+ // One reflector for the file, so two `is<User>(…)` calls agree on `User`'s name and
68
+ // the emitter can then share one hoisted helper between them.
69
+ const reflector = new Reflector(session.checker, sourceFile, context.reflect);
70
+ const diagnostics = [];
71
+ const rewriter = new Rewriter(code);
72
+ let rewritten = 0;
73
+ // Back to front. `findCallSites` walks pre-order, so reversing puts the innermost and
74
+ // last call first, which is what keeps the offsets of everything before it valid.
75
+ for (const site of sites.toReversed()) {
76
+ const position = site.node.getStart();
77
+ const reflectedAt = reflector.diagnostics.length;
78
+ const emittedAt = emitter.diagnostics.length;
79
+ const depth = emissionDepth(site);
80
+ if (depth.kind === 'refused') {
81
+ diagnostics.push({
82
+ fileName,
83
+ position,
84
+ callee: site.callee,
85
+ path: '',
86
+ reason: depth.reason,
87
+ });
88
+ continue;
89
+ }
90
+ const type = session.checker.getTypeFromTypeNode(site.typeArgument);
91
+ if (!type) {
92
+ // The checker has no type for a node it parsed, which in practice means the file
93
+ // has an error in it. Rewriting from a type the compiler could not resolve is the
94
+ // one thing this path exists to avoid.
95
+ diagnostics.push({
96
+ fileName,
97
+ position,
98
+ callee: site.callee,
99
+ path: '',
100
+ reason: 'the compiler could not resolve this type argument; the file probably does not compile',
101
+ });
102
+ continue;
103
+ }
104
+ const reflected = reflect(reflector, site.callee, type);
105
+ const provider = site.callee === 'toolFor' ? toolProvider(site) : undefined;
106
+ if (site.callee === 'toolFor' && provider === undefined) {
107
+ diagnostics.push({
108
+ fileName,
109
+ position,
110
+ callee: site.callee,
111
+ path: '',
112
+ reason: '`toolFor<T>` needs a provider argument',
113
+ });
114
+ continue;
115
+ }
116
+ if (site.callee === 'toolFor' && site.node.arguments[1] === undefined) {
117
+ diagnostics.push({
118
+ fileName,
119
+ position,
120
+ callee: site.callee,
121
+ path: '',
122
+ reason: '`toolFor<T>` needs a tool name',
123
+ });
124
+ continue;
125
+ }
126
+ const refusals = reflector.diagnostics.slice(reflectedAt);
127
+ if (refusals.length > 0) {
128
+ // The type is only partly understood, so nothing is emitted from it. This is the
129
+ // f70186c6 rule applied to the checker-driven path: partial knowledge produces a
130
+ // named build error, never a partial check.
131
+ for (const refusal of refusals)
132
+ diagnostics.push({ fileName, position, callee: site.callee, ...refusal });
133
+ continue;
134
+ }
135
+ const replacement = emitFor(emitter, site, reflected, rewriter, depth.kind === 'shallow' ? depth.value : undefined, provider);
136
+ if (replacement === undefined) {
137
+ const emitted = emitter.diagnostics.slice(emittedAt);
138
+ if (emitted.length === 0) {
139
+ diagnostics.push({
140
+ fileName,
141
+ position,
142
+ callee: site.callee,
143
+ path: '',
144
+ reason: `\`${site.callee}<T>()\` needs a value to check`,
145
+ });
146
+ }
147
+ for (const refusal of emitted)
148
+ diagnostics.push({ fileName, position, callee: site.callee, ...refusal });
149
+ continue;
150
+ }
151
+ rewriter.replace(position, site.node.end, replacement);
152
+ rewritten += 1;
153
+ }
154
+ let out = transformCode(rewriter.text);
155
+ // No prelude when nothing was rewritten. A refused site can still have hoisted a helper
156
+ // on its way to the refusal — `random<T>` reserves its integer sampler before it
157
+ // discovers the `pattern` it cannot invert — and emitting that alone would leave dead
158
+ // code in a file the transformer decided not to touch.
159
+ if (rewritten > 0 && emitter.hasPrelude)
160
+ out = withPrelude(out, emitter.prelude());
161
+ return { code: out, changed: out !== code, diagnostics };
162
+ }
163
+ function emissionDepth(site) {
164
+ if (!SHALLOW_CALLEES.has(site.callee))
165
+ return { kind: 'full' };
166
+ const argument = site.node.typeArguments?.[1];
167
+ if (argument === undefined)
168
+ return { kind: 'shallow', value: 1 };
169
+ if (!isLiteralTypeNode(argument)) {
170
+ return { kind: 'refused', reason: '`depth` must be a positive integer literal type' };
171
+ }
172
+ const literal = argument.literal;
173
+ let value;
174
+ if (isNumericLiteral(literal)) {
175
+ value = Number(literal.text);
176
+ }
177
+ else if (isPrefixUnaryExpression(literal) &&
178
+ (literal.operator === SyntaxKind.PlusToken || literal.operator === SyntaxKind.MinusToken) &&
179
+ isNumericLiteral(literal.operand)) {
180
+ const magnitude = Number(literal.operand.text);
181
+ value = literal.operator === SyntaxKind.MinusToken ? -magnitude : magnitude;
182
+ }
183
+ if (value === undefined) {
184
+ return { kind: 'refused', reason: '`depth` must be a positive integer literal type' };
185
+ }
186
+ if (!Number.isInteger(value) || value <= 0) {
187
+ return { kind: 'refused', reason: '`depth` must be a positive integer literal' };
188
+ }
189
+ return { kind: 'shallow', value };
190
+ }
191
+ function degrade(fileName, code, reason) {
192
+ const out = transformCode(code);
193
+ return { code: out, changed: out !== code, diagnostics: [{ fileName, path: '', reason }] };
194
+ }
195
+ function reflect(reflector, callee, type) {
196
+ switch (callee) {
197
+ case 'toJsonSchema':
198
+ return { kind: 'shape', shape: reflector.shapeIR(type) };
199
+ case 'schemaOf':
200
+ case 'toolFor':
201
+ return { kind: 'schema', ir: reflector.schemaIR(type) };
202
+ case 'grpcDescriptor':
203
+ case 'loadGrpcService':
204
+ return { kind: 'grpc', service: reflector.grpcServiceIR(type) };
205
+ case 'protoDescriptor':
206
+ case 'protoDecode':
207
+ case 'protoEncode':
208
+ return { kind: 'protobuf', node: reflector.protobufIR(type), name: protobufName(type) };
209
+ default:
210
+ return { kind: 'type', node: reflector.typeIR(type) };
211
+ }
212
+ }
213
+ function emitFor(emitter, site, reflected, rewriter, maxDepth, provider) {
214
+ if (site.callee === 'toolFor' && reflected.kind === 'schema' && provider !== undefined) {
215
+ const providerArgument = site.node.arguments[0];
216
+ const name = site.node.arguments[1];
217
+ if (providerArgument === undefined || name === undefined)
218
+ return undefined;
219
+ const providerExpression = rewriter.slice(providerArgument.getStart(), providerArgument.end);
220
+ const nameExpression = rewriter.slice(name.getStart(), name.end);
221
+ const options = site.node.arguments[2];
222
+ const optionsExpression = options === undefined ? undefined : rewriter.slice(options.getStart(), options.end);
223
+ if (provider !== 'dynamic') {
224
+ const parameters = emitter.emitToolSchema(reflected.ir, provider);
225
+ return parameters === undefined ? undefined : toolFrame(provider, nameExpression, parameters, optionsExpression);
226
+ }
227
+ const documents = toolProviders().map(target => {
228
+ const parameters = emitter.emitToolSchema(reflected.ir, target);
229
+ return parameters === undefined ? undefined : { provider: target, parameters };
230
+ });
231
+ if (documents.some(document => document === undefined))
232
+ return undefined;
233
+ return toolFrameDynamic(providerExpression, nameExpression, documents.filter(document => document !== undefined), optionsExpression);
234
+ }
235
+ // Both of these are the answer itself, so there is nothing to check and no argument
236
+ // to read.
237
+ if (reflected.kind === 'shape')
238
+ return emitter.emitJsonSchema(reflected.shape);
239
+ if (reflected.kind === 'schema')
240
+ return emitter.emitSchemaValue(reflected.ir);
241
+ if (reflected.kind === 'grpc') {
242
+ const names = grpcNames(site, emitter);
243
+ if (names === undefined)
244
+ return undefined;
245
+ return site.callee === 'grpcDescriptor'
246
+ ? emitter.emitGrpcDescriptor(reflected.service, names.service, names.pkg)
247
+ : emitter.emitGrpcService(reflected.service, names.service, names.pkg);
248
+ }
249
+ if (reflected.kind === 'protobuf' && site.callee === 'protoDescriptor') {
250
+ return emitter.emitProtoDescriptor(reflected.node, reflected.name);
251
+ }
252
+ const node = reflected.node;
253
+ if (site.callee === 'random')
254
+ return emitter.emitRandom(node);
255
+ const argument = site.node.arguments[0];
256
+ if (!argument)
257
+ return undefined;
258
+ // Read through the rewriter, not the original text: in `assert<A>(is<B>(x))` the inner
259
+ // call has already been replaced, and taking the original text here would carry a live
260
+ // `is<B>(x)` into the output and silently undo it.
261
+ const expression = rewriter.slice(argument.getStart(), argument.end);
262
+ switch (site.callee) {
263
+ case 'protoDecode':
264
+ return emitter.emitProtoDecode(node, reflected.kind === 'protobuf' ? reflected.name : 'Message', expression);
265
+ case 'protoEncode':
266
+ return emitter.emitProtoEncode(node, reflected.kind === 'protobuf' ? reflected.name : 'Message', expression);
267
+ case 'is':
268
+ return emitter.emitIs(node, expression);
269
+ case 'isShallow':
270
+ return emitter.emitIs(node, expression, maxDepth);
271
+ case 'equals':
272
+ return emitter.emitEquals(node, expression);
273
+ case 'assert':
274
+ return emitter.emitAssert(node, expression, false);
275
+ case 'assertShallow':
276
+ return emitter.emitAssert(node, expression, false, maxDepth);
277
+ case 'assertEquals':
278
+ return emitter.emitAssert(node, expression, true);
279
+ case 'validate':
280
+ return emitter.emitValidate(node, expression);
281
+ case 'validateShallow':
282
+ return emitter.emitValidate(node, expression, false, maxDepth);
283
+ default:
284
+ return undefined;
285
+ }
286
+ }
287
+ function toolProvider(site) {
288
+ const argument = site.node.arguments[0];
289
+ if (argument === undefined)
290
+ return undefined;
291
+ if (!isStringLiteral(argument))
292
+ return 'dynamic';
293
+ if (!TOOL_PROVIDERS.has(argument.text))
294
+ return undefined;
295
+ switch (argument.text) {
296
+ case 'openai':
297
+ case 'openai-strict':
298
+ case 'anthropic':
299
+ case 'gemini':
300
+ case 'json-schema':
301
+ return argument.text;
302
+ }
303
+ }
304
+ function toolProviders() {
305
+ return ['openai', 'openai-strict', 'anthropic', 'gemini', 'json-schema'];
306
+ }
307
+ function toolFrame(provider, name, parameters, options) {
308
+ const description = options === undefined ? '' : '...(_o?.description ? { description: _o.description } : {}), ';
309
+ let body;
310
+ switch (provider) {
311
+ case 'openai':
312
+ body = `{ type: "function", function: { name: _n, ${description}parameters: ${parameters} } }`;
313
+ break;
314
+ case 'openai-strict':
315
+ body = `{ type: "function", function: { name: _n, ${description}strict: true, parameters: ${parameters} } }`;
316
+ break;
317
+ case 'anthropic':
318
+ body = `{ name: _n, ${description}input_schema: ${parameters} }`;
319
+ break;
320
+ case 'gemini':
321
+ case 'json-schema':
322
+ body = `{ name: _n, ${description}parameters: ${parameters} }`;
323
+ break;
324
+ }
325
+ return options === undefined ? `((_n) => (${body}))(${name})` : `((_n, _o) => (${body}))(${name}, ${options})`;
326
+ }
327
+ function toolFrameDynamic(provider, name, documents, options) {
328
+ const cases = documents
329
+ .map(document => {
330
+ const framed = toolFrame(document.provider, '_n', document.parameters, options === undefined ? undefined : '_o');
331
+ return `case ${JSON.stringify(document.provider)}: return ${framed};`;
332
+ })
333
+ .join(' ');
334
+ const body = `switch (_p) { ${cases} } throw new Error(\`unsupported tool provider \${String(_p)}\`);`;
335
+ return options === undefined
336
+ ? `((_p, _n) => { ${body} })(${provider}, ${name})`
337
+ : `((_p, _n, _o) => { ${body} })(${provider}, ${name}, ${options})`;
338
+ }
339
+ function grpcNames(site, emitter) {
340
+ const service = site.node.arguments[0];
341
+ const pkg = site.node.arguments[1];
342
+ if (service === undefined || pkg === undefined || site.node.arguments.length !== 2) {
343
+ return emitter.refuse('', `\`${site.callee}<S>()\` needs exactly two string literals: service and package`);
344
+ }
345
+ if (!isStringLiteral(service)) {
346
+ return emitter.refuse('service', 'the gRPC service name must be a string literal so the build artifact is stable');
347
+ }
348
+ if (!isStringLiteral(pkg)) {
349
+ return emitter.refuse('package', 'the gRPC package name must be a string literal so the build artifact is stable');
350
+ }
351
+ return { service: service.text, pkg: pkg.text };
352
+ }
353
+ function protobufName(type) {
354
+ const alias = type.getAliasSymbol()?.name;
355
+ if (alias !== undefined && alias !== '__type')
356
+ return alias;
357
+ const symbol = type.getSymbol()?.name;
358
+ return symbol === undefined || symbol === '__type' ? 'Message' : symbol;
359
+ }
360
+ /** Hoisted helpers go at the top of the module, but after a shebang if there is one. */
361
+ function withPrelude(code, prelude) {
362
+ if (!code.startsWith('#!'))
363
+ return `${prelude}\n${code}`;
364
+ const newline = code.indexOf('\n');
365
+ if (newline === -1)
366
+ return `${code}\n${prelude}\n`;
367
+ return `${code.slice(0, newline + 1)}${prelude}\n${code.slice(newline + 1)}`;
368
+ }
369
+ /**
370
+ * Text edits in original coordinates, applied back to front, with one twist: `slice`
371
+ * reads the *current* text, so an outer call sees an inner one already rewritten.
372
+ *
373
+ * The bookkeeping is a list of applied edits and their length deltas. Because AST spans
374
+ * nest and never partially overlap, and because callers work backwards, every applied
375
+ * edit is either inside the span being asked about or entirely after it — which is what
376
+ * makes a single sum the right answer.
377
+ */
378
+ export class Rewriter {
379
+ #text;
380
+ /** Applied edits in original coordinates. Nested ones are folded into their parent. */
381
+ #edits = [];
382
+ constructor(text) {
383
+ this.#text = text;
384
+ }
385
+ get text() {
386
+ return this.#text;
387
+ }
388
+ /** A span of the original text, as it reads now. */
389
+ slice(start, end) {
390
+ return this.#text.slice(start, this.#current(start, end));
391
+ }
392
+ /** Replace a span of the original text. Call in descending order of `start`. */
393
+ replace(start, end, text) {
394
+ const current = this.#current(start, end);
395
+ this.#text = this.#text.slice(0, start) + text + this.#text.slice(current);
396
+ // `text` was built from the current buffer, so it already contains every nested
397
+ // edit. They stop being separate deltas and become part of this one; leaving them
398
+ // in the list would count their lengths twice.
399
+ this.#edits = this.#edits.filter(edit => edit.start < start || edit.end > end);
400
+ this.#edits.push({ start, end, delta: text.length - (end - start) });
401
+ }
402
+ #current(start, end) {
403
+ let shift = 0;
404
+ for (const edit of this.#edits) {
405
+ if (edit.start >= start && edit.end <= end)
406
+ shift += edit.delta;
407
+ }
408
+ return end + shift;
409
+ }
410
+ }
411
+ // ---------------------------------------------------------------------------
412
+ // The no-checker path: `validate(tags.X, expr)`
413
+ // ---------------------------------------------------------------------------
414
+ function splitTopLevelComma(s) {
415
+ let depth = 0;
416
+ for (let k = 0; k < s.length; k++) {
417
+ const ch = s[k] ?? '';
418
+ if (ch === '(' || ch === '[')
419
+ depth++;
420
+ else if (ch === ')' || ch === ']')
421
+ depth--;
422
+ else if (ch === ',' && depth === 0)
423
+ return [s.slice(0, k), s.slice(k + 1)];
424
+ }
425
+ return [s, ''];
426
+ }
427
+ function splitArgs(s) {
428
+ const parts = [];
429
+ let depth = 0;
430
+ let cur = '';
431
+ for (const ch of s) {
432
+ if (ch === '(' || ch === '[')
433
+ depth++;
434
+ else if (ch === ')' || ch === ']')
435
+ depth--;
436
+ if (ch === ',' && depth === 0) {
437
+ parts.push(cur.trim());
438
+ cur = '';
439
+ }
440
+ else
441
+ cur += ch;
442
+ }
443
+ if (cur.trim())
444
+ parts.push(cur.trim());
445
+ return parts;
446
+ }
447
+ function inlineCheck(ruleSrc, expr, ensureRegexCache) {
448
+ const m = /^tags\.(\w+)\((.*)\)$/s.exec(ruleSrc);
449
+ if (!m)
450
+ return `validate(${ruleSrc}, ${expr})`;
451
+ const kind = m[1] ?? '';
452
+ const args = (m[2] ?? '').trim();
453
+ switch (kind) {
454
+ case 'Min':
455
+ return `(typeof ${expr} === "number" && ${expr} >= ${args})`;
456
+ case 'Max':
457
+ return `(typeof ${expr} === "number" && ${expr} <= ${args})`;
458
+ case 'MinLength':
459
+ return `(typeof ${expr} === "string" && ${expr}.length >= ${args})`;
460
+ case 'MaxLength':
461
+ return `(typeof ${expr} === "string" && ${expr}.length <= ${args})`;
462
+ case 'Pattern': {
463
+ let raw = args.trim();
464
+ const first = raw[0] ?? '';
465
+ const last = raw.length > 0 ? (raw[raw.length - 1] ?? '') : '';
466
+ const isQuoted = raw.length >= 2 &&
467
+ ((first === '"' && last === '"') || (first === "'" && last === "'") || (first === '`' && last === '`'));
468
+ if (!isQuoted || (first === '`' && raw.includes('${'))) {
469
+ if (ensureRegexCache) {
470
+ ensureRegexCache();
471
+ return `(typeof ${expr} === "string" && _getRegExp(${raw}).test(${expr}))`;
472
+ }
473
+ return `(typeof ${expr} === "string" && new RegExp(${raw}).test(${expr}))`;
474
+ }
475
+ raw = raw.slice(1, -1);
476
+ const re = escapePattern(raw);
477
+ validatePatternComplexity(re);
478
+ return `(typeof ${expr} === "string" && /${re}/.test(${expr}))`;
479
+ }
480
+ case 'Enum': {
481
+ const values = splitArgs(args);
482
+ return `(${values.map(v => `${expr} === ${v}`).join(' || ')})`;
483
+ }
484
+ default:
485
+ return `validate(${ruleSrc}, ${expr})`;
486
+ }
487
+ }
488
+ /**
489
+ * Inline `validate(tags.X(…), expr)`, and nothing else.
490
+ *
491
+ * A rule spelled at the call site needs no type information, which is why this survives
492
+ * without a compiler: the scanner is here only to avoid rewriting the inside of a string
493
+ * literal or a comment. `validate<T>(expr)` and every other type-argument form are left
494
+ * for `transformFile`; this function does not look at type arguments at all beyond
495
+ * skipping past them.
496
+ */
497
+ export function transformCode(code) {
498
+ const scanner = createScanner(false, LanguageVariant.Standard);
499
+ scanner.setText(code);
500
+ let out = '';
501
+ let lastPos = 0;
502
+ const hoisted = [];
503
+ let hasRegexCache = false;
504
+ const ensureRegexCache = () => {
505
+ if (!hasRegexCache) {
506
+ hasRegexCache = true;
507
+ hoisted.push(`const _MAX_REGEX_CACHE_SIZE = ${MAX_REGEX_CACHE_SIZE};\nconst _regexCache = new Map();\nfunction _getRegExp(p) { let re = _regexCache.get(p); if (re) { _regexCache.delete(p); _regexCache.set(p, re); return re; } if (_regexCache.size >= _MAX_REGEX_CACHE_SIZE) { const k = _regexCache.keys().next().value; if (k !== undefined) _regexCache.delete(k); } re = new RegExp(p); _regexCache.set(p, re); return re; }`);
508
+ }
509
+ };
510
+ let token = scanner.scan();
511
+ while (token !== SyntaxKind.EndOfFile) {
512
+ const tokenStart = scanner.getTokenStart();
513
+ const tokenEnd = scanner.getTokenEnd();
514
+ if (tokenStart < lastPos) {
515
+ token = scanner.scan();
516
+ continue;
517
+ }
518
+ if (scanner.getTokenText() === 'validate') {
519
+ const prevChar = tokenStart > 0 ? (code[tokenStart - 1] ?? '') : '';
520
+ if (prevChar && /[A-Za-z0-9_$.]/.test(prevChar)) {
521
+ token = scanner.scan();
522
+ continue;
523
+ }
524
+ let i = tokenEnd;
525
+ while (i < code.length && /\s/.test(code[i] ?? ''))
526
+ i++;
527
+ // A type argument means this is `validate<T>(…)`, which belongs to the checker.
528
+ let typed = false;
529
+ if (i < code.length && code[i] === '<') {
530
+ let depth = 1;
531
+ i++;
532
+ while (i < code.length && depth > 0) {
533
+ if (code[i] === '<')
534
+ depth++;
535
+ else if (code[i] === '>')
536
+ depth--;
537
+ i++;
538
+ }
539
+ typed = depth === 0;
540
+ }
541
+ while (i < code.length && /\s/.test(code[i] ?? ''))
542
+ i++;
543
+ if (!typed && i < code.length && code[i] === '(') {
544
+ let depth = 1;
545
+ const argStart = i + 1;
546
+ i++;
547
+ while (i < code.length && depth > 0) {
548
+ if (code[i] === '(')
549
+ depth++;
550
+ else if (code[i] === ')')
551
+ depth--;
552
+ i++;
553
+ }
554
+ if (depth === 0) {
555
+ const [ruleSrc, exprSrc] = splitTopLevelComma(code.slice(argStart, i - 1));
556
+ if (ruleSrc && exprSrc) {
557
+ out += code.slice(lastPos, tokenStart);
558
+ out += inlineCheck(ruleSrc.trim(), exprSrc.trim(), ensureRegexCache);
559
+ lastPos = i;
560
+ }
561
+ }
562
+ }
563
+ }
564
+ token = scanner.scan();
565
+ }
566
+ out += code.slice(lastPos);
567
+ if (hoisted.length > 0) {
568
+ return hoisted.join('\n') + '\n' + out;
569
+ }
570
+ return out;
571
+ }
572
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type NamingStrategyConfig } from '@zmdb/schema/naming';
2
+ import type { EmitOptions } from '../emit/index.js';
3
+ import { ReflectSession } from '../reflect/session.js';
4
+ import { type TransformDiagnostic } from '../transform/index.js';
5
+ /** Inline `validate(tags.X(…), …)` with no compiler. Type arguments need `transformFile`. */
6
+ export declare function transformTypeChecks(code: string): string;
7
+ export interface UnpluginLike {
8
+ readonly name: string;
9
+ /**
10
+ * Rollup/Vite ordering. `'pre'` because the offsets this plugin rewrites at are only
11
+ * valid for the text the compiler parsed.
12
+ */
13
+ readonly enforce?: 'pre' | 'post';
14
+ transform(code: string, id: string): {
15
+ code: string;
16
+ } | null;
17
+ /**
18
+ * Watch mode: re-check the changed file without reloading the project.
19
+ *
20
+ * The `change` argument is Rollup's, and it matters rather than being decorative: a
21
+ * `changed` notification for a file the program has never seen does nothing at all, so a
22
+ * newly added module has to be reported as `create` or it stays invisible.
23
+ */
24
+ watchChange?(id: string, change?: WatchChange): void;
25
+ buildEnd?(): void;
26
+ }
27
+ /** Rollup's second argument to `watchChange`. */
28
+ export interface WatchChange {
29
+ readonly event: 'create' | 'update' | 'delete';
30
+ }
31
+ export interface ZmdbAotOptions {
32
+ /**
33
+ * Absolute path to the `tsconfig.json` that defines the program. Without one — and
34
+ * without `session` — the plugin cannot ask what a type is, so it inlines only the
35
+ * `validate(tags.X(…), …)` form and leaves every `f<T>(…)` call alone.
36
+ */
37
+ readonly project?: string;
38
+ readonly cwd?: string;
39
+ /** An already-open session. The caller keeps ownership, including closing it. */
40
+ readonly session?: ReflectSession;
41
+ readonly emit?: EmitOptions;
42
+ /** A named or custom build-time strategy, resolved once for this plugin instance. */
43
+ readonly naming?: NamingStrategyConfig;
44
+ /**
45
+ * Called for each refused call site. The default throws, because a type the emitter
46
+ * could not model means the call falls back to a runtime walker that has no
47
+ * descriptor to walk — a build that "succeeded" and a program that throws on first
48
+ * use (plan D4).
49
+ */
50
+ readonly onDiagnostic?: (diagnostic: TransformDiagnostic) => void;
51
+ }
52
+ export declare function zmdbAot(options?: ZmdbAotOptions): UnpluginLike;
53
+ //# sourceMappingURL=index.d.ts.map