@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.
- package/LICENSE +674 -0
- package/README.md +40 -0
- package/dist/codegen/index.d.ts +50 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +364 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/scan.d.ts +105 -0
- package/dist/codegen/scan.d.ts.map +1 -0
- package/dist/codegen/scan.js +450 -0
- package/dist/codegen/scan.js.map +1 -0
- package/dist/codegen/witness.d.ts +76 -0
- package/dist/codegen/witness.d.ts.map +1 -0
- package/dist/codegen/witness.js +690 -0
- package/dist/codegen/witness.js.map +1 -0
- package/dist/config/contract.d.ts +41 -0
- package/dist/config/contract.d.ts.map +1 -0
- package/dist/config/contract.js +5 -0
- package/dist/config/contract.js.map +1 -0
- package/dist/config/index.d.ts +53 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +277 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.zmdb.generated.d.ts +12 -0
- package/dist/config/index.zmdb.generated.js +28 -0
- package/dist/config/index.zmdb.witness.d.ts +3 -0
- package/dist/config/index.zmdb.witness.d.ts.map +1 -0
- package/dist/config/index.zmdb.witness.js +20 -0
- package/dist/config/index.zmdb.witness.js.map +1 -0
- package/dist/configured-plugin.d.ts +11 -0
- package/dist/configured-plugin.d.ts.map +1 -0
- package/dist/configured-plugin.js +27 -0
- package/dist/configured-plugin.js.map +1 -0
- package/dist/emit/index.d.ts +103 -0
- package/dist/emit/index.d.ts.map +1 -0
- package/dist/emit/index.js +1356 -0
- package/dist/emit/index.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/ast.d.ts +17 -0
- package/dist/lint/ast.d.ts.map +1 -0
- package/dist/lint/ast.js +77 -0
- package/dist/lint/ast.js.map +1 -0
- package/dist/lint/host-types.d.ts +9 -0
- package/dist/lint/host-types.d.ts.map +1 -0
- package/dist/lint/host-types.js +2 -0
- package/dist/lint/host-types.js.map +1 -0
- package/dist/lint/index.d.ts +23 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +53 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/lint/rules/no-distributed-nullable-tags.d.ts +3 -0
- package/dist/lint/rules/no-distributed-nullable-tags.d.ts.map +1 -0
- package/dist/lint/rules/no-distributed-nullable-tags.js +71 -0
- package/dist/lint/rules/no-distributed-nullable-tags.js.map +1 -0
- package/dist/lint/rules/no-empty-patch.d.ts +3 -0
- package/dist/lint/rules/no-empty-patch.d.ts.map +1 -0
- package/dist/lint/rules/no-empty-patch.js +26 -0
- package/dist/lint/rules/no-empty-patch.js.map +1 -0
- package/dist/lint/rules/no-interpolated-sql.d.ts +3 -0
- package/dist/lint/rules/no-interpolated-sql.d.ts.map +1 -0
- package/dist/lint/rules/no-interpolated-sql.js +35 -0
- package/dist/lint/rules/no-interpolated-sql.js.map +1 -0
- package/dist/lint/rules/no-unbounded-find.d.ts +3 -0
- package/dist/lint/rules/no-unbounded-find.d.ts.map +1 -0
- package/dist/lint/rules/no-unbounded-find.js +26 -0
- package/dist/lint/rules/no-unbounded-find.js.map +1 -0
- package/dist/lint/rules/no-unknown-json-column.d.ts +3 -0
- package/dist/lint/rules/no-unknown-json-column.d.ts.map +1 -0
- package/dist/lint/rules/no-unknown-json-column.js +35 -0
- package/dist/lint/rules/no-unknown-json-column.js.map +1 -0
- package/dist/lint/rules/require-sql-on-number.d.ts +3 -0
- package/dist/lint/rules/require-sql-on-number.d.ts.map +1 -0
- package/dist/lint/rules/require-sql-on-number.js +34 -0
- package/dist/lint/rules/require-sql-on-number.js.map +1 -0
- package/dist/lint/types.d.ts +12 -0
- package/dist/lint/types.d.ts.map +1 -0
- package/dist/lint/types.js +2 -0
- package/dist/lint/types.js.map +1 -0
- package/dist/metro/metro.d.ts +22 -0
- package/dist/metro/metro.d.ts.map +1 -0
- package/dist/metro/metro.js +242 -0
- package/dist/metro/metro.js.map +1 -0
- package/dist/protobuf/decode.d.ts +20 -0
- package/dist/protobuf/decode.d.ts.map +1 -0
- package/dist/protobuf/decode.js +289 -0
- package/dist/protobuf/decode.js.map +1 -0
- package/dist/protobuf/descriptor.d.ts +16 -0
- package/dist/protobuf/descriptor.d.ts.map +1 -0
- package/dist/protobuf/descriptor.js +303 -0
- package/dist/protobuf/descriptor.js.map +1 -0
- package/dist/protobuf/encode.d.ts +20 -0
- package/dist/protobuf/encode.d.ts.map +1 -0
- package/dist/protobuf/encode.js +203 -0
- package/dist/protobuf/encode.js.map +1 -0
- package/dist/protobuf/grpc-ir.d.ts +16 -0
- package/dist/protobuf/grpc-ir.d.ts.map +1 -0
- package/dist/protobuf/grpc-ir.js +2 -0
- package/dist/protobuf/grpc-ir.js.map +1 -0
- package/dist/protobuf/plan.d.ts +42 -0
- package/dist/protobuf/plan.d.ts.map +1 -0
- package/dist/protobuf/plan.js +158 -0
- package/dist/protobuf/plan.js.map +1 -0
- package/dist/reflect/callsites.d.ts +40 -0
- package/dist/reflect/callsites.d.ts.map +1 -0
- package/dist/reflect/callsites.js +153 -0
- package/dist/reflect/callsites.js.map +1 -0
- package/dist/reflect/index.d.ts +106 -0
- package/dist/reflect/index.d.ts.map +1 -0
- package/dist/reflect/index.js +1421 -0
- package/dist/reflect/index.js.map +1 -0
- package/dist/reflect/session.d.ts +118 -0
- package/dist/reflect/session.d.ts.map +1 -0
- package/dist/reflect/session.js +228 -0
- package/dist/reflect/session.js.map +1 -0
- package/dist/testing/index.d.ts +69 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +210 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/transform/index.d.ts +74 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +572 -0
- package/dist/transform/index.js.map +1 -0
- package/dist/unplugin/index.d.ts +53 -0
- package/dist/unplugin/index.d.ts.map +1 -0
- package/dist/unplugin/index.js +130 -0
- package/dist/unplugin/index.js.map +1 -0
- package/dist/unplugin/inline-bench.d.ts +29 -0
- package/dist/unplugin/inline-bench.d.ts.map +1 -0
- package/dist/unplugin/inline-bench.js +82 -0
- package/dist/unplugin/inline-bench.js.map +1 -0
- package/package.json +110 -0
- package/src/codegen/index.ts +451 -0
- package/src/codegen/scan.ts +574 -0
- package/src/codegen/witness.ts +819 -0
- package/src/config/contract.ts +48 -0
- package/src/config/index.ts +384 -0
- package/src/config/index.zmdb.generated.d.ts +12 -0
- package/src/config/index.zmdb.generated.js +28 -0
- package/src/config/index.zmdb.witness.ts +22 -0
- package/src/configured-plugin.ts +35 -0
- package/src/emit/index.ts +1496 -0
- package/src/errors.ts +6 -0
- package/src/index.ts +336 -0
- package/src/lint/ast.ts +96 -0
- package/src/lint/host-types.ts +9 -0
- package/src/lint/index.ts +80 -0
- package/src/lint/rules/no-distributed-nullable-tags.ts +76 -0
- package/src/lint/rules/no-empty-patch.ts +26 -0
- package/src/lint/rules/no-interpolated-sql.ts +45 -0
- package/src/lint/rules/no-unbounded-find.ts +26 -0
- package/src/lint/rules/no-unknown-json-column.ts +36 -0
- package/src/lint/rules/require-sql-on-number.ts +34 -0
- package/src/lint/types.ts +11 -0
- package/src/metro/metro.ts +313 -0
- package/src/protobuf/decode.ts +375 -0
- package/src/protobuf/descriptor.ts +353 -0
- package/src/protobuf/encode.ts +277 -0
- package/src/protobuf/grpc-ir.ts +17 -0
- package/src/protobuf/plan.ts +244 -0
- package/src/reflect/callsites.ts +198 -0
- package/src/reflect/index.ts +1723 -0
- package/src/reflect/session.ts +276 -0
- package/src/testing/index.ts +298 -0
- package/src/transform/index.ts +690 -0
- package/src/unplugin/index.ts +182 -0
- 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
|