@1nder-labs/schemalint 1.0.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-APACHE +176 -0
- package/LICENSE-MIT +19 -0
- package/README.md +52 -0
- package/bin/schemalint-zod.js +6 -0
- package/dist/discover.d.ts +43 -0
- package/dist/discover.d.ts.map +1 -0
- package/dist/discover.js +145 -0
- package/dist/discover.js.map +1 -0
- package/dist/discover_ast.d.ts +30 -0
- package/dist/discover_ast.d.ts.map +1 -0
- package/dist/discover_ast.js +202 -0
- package/dist/discover_ast.js.map +1 -0
- package/dist/evaluate.d.ts +18 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +112 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +3 -0
- package/dist/main.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +82 -0
- package/dist/server.js.map +1 -0
- package/dist/target_emit.d.ts +12 -0
- package/dist/target_emit.d.ts.map +1 -0
- package/dist/target_emit.js +111 -0
- package/dist/target_emit.js.map +1 -0
- package/dist/target_imports.d.ts +19 -0
- package/dist/target_imports.d.ts.map +1 -0
- package/dist/target_imports.js +79 -0
- package/dist/target_imports.js.map +1 -0
- package/dist/target_resolution.d.ts +20 -0
- package/dist/target_resolution.d.ts.map +1 -0
- package/dist/target_resolution.js +174 -0
- package/dist/target_resolution.js.map +1 -0
- package/dist/targets.d.ts +5 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +116 -0
- package/dist/targets.js.map +1 -0
- package/index.cjs +504 -0
- package/package.json +34 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find top-level `const` declarations that are `z.object({...})` calls.
|
|
3
|
+
*/
|
|
4
|
+
export function findExportedSchemaCalls(sourceFile, tsModule) {
|
|
5
|
+
const results = [];
|
|
6
|
+
function walk(node) {
|
|
7
|
+
if (tsModule.isVariableStatement(node) &&
|
|
8
|
+
node.declarationList.declarations.length === 1) {
|
|
9
|
+
const decl = node.declarationList.declarations[0];
|
|
10
|
+
if (tsModule.isIdentifier(decl.name) &&
|
|
11
|
+
decl.initializer) {
|
|
12
|
+
const call = findZObjectCall(decl.initializer, tsModule);
|
|
13
|
+
if (call) {
|
|
14
|
+
const entry = {
|
|
15
|
+
name: decl.name.text,
|
|
16
|
+
objectArg: call,
|
|
17
|
+
};
|
|
18
|
+
if (hasExportModifier(node, tsModule)) {
|
|
19
|
+
results.push(entry);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Also handle `export default z.object({...})`
|
|
25
|
+
if (tsModule.isExportAssignment(node) &&
|
|
26
|
+
!node.isExportEquals &&
|
|
27
|
+
tsModule.isCallExpression(node.expression)) {
|
|
28
|
+
const call = findZObjectCall(node.expression, tsModule);
|
|
29
|
+
if (call) {
|
|
30
|
+
const entry = {
|
|
31
|
+
name: 'default',
|
|
32
|
+
objectArg: call,
|
|
33
|
+
};
|
|
34
|
+
results.push(entry);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
tsModule.forEachChild(node, walk);
|
|
38
|
+
}
|
|
39
|
+
tsModule.forEachChild(sourceFile, walk);
|
|
40
|
+
return results;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Scan a source file's import declarations for provider SDKs.
|
|
44
|
+
* Returns "openai" or "anthropic" if detected, undefined otherwise.
|
|
45
|
+
*/
|
|
46
|
+
export function scanProviderImports(sourceFile, tsModule) {
|
|
47
|
+
for (const stmt of sourceFile.statements) {
|
|
48
|
+
if (!tsModule.isImportDeclaration(stmt))
|
|
49
|
+
continue;
|
|
50
|
+
const spec = stmt.moduleSpecifier;
|
|
51
|
+
if (!tsModule.isStringLiteral(spec))
|
|
52
|
+
continue;
|
|
53
|
+
const mod = spec.text;
|
|
54
|
+
if (mod === 'openai' || mod.startsWith('openai/')) {
|
|
55
|
+
return 'openai';
|
|
56
|
+
}
|
|
57
|
+
if (mod === '@ai-sdk/openai' || mod.startsWith('@ai-sdk/openai/')) {
|
|
58
|
+
return 'openai';
|
|
59
|
+
}
|
|
60
|
+
if (mod === '@anthropic-ai/sdk' || mod.startsWith('@anthropic-ai/')) {
|
|
61
|
+
return 'anthropic';
|
|
62
|
+
}
|
|
63
|
+
if (mod === '@ai-sdk/anthropic' || mod.startsWith('@ai-sdk/anthropic/')) {
|
|
64
|
+
return 'anthropic';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
export function hasExportModifier(node, tsModule) {
|
|
70
|
+
if (!tsModule.canHaveModifiers(node))
|
|
71
|
+
return false;
|
|
72
|
+
const modifiers = tsModule.getModifiers(node);
|
|
73
|
+
if (!modifiers)
|
|
74
|
+
return false;
|
|
75
|
+
for (const mod of modifiers) {
|
|
76
|
+
if (mod.kind === tsModule.SyntaxKind.ExportKeyword)
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Given a node, if it is `z.object({...})`, return the ObjectLiteralExpression argument.
|
|
83
|
+
* Handles chaining: `z.object({...}).extend({...})` — returns the initial object.
|
|
84
|
+
*/
|
|
85
|
+
export function findZObjectCall(node, tsModule) {
|
|
86
|
+
// Unwrap parenthesized expressions
|
|
87
|
+
while (tsModule.isParenthesizedExpression(node)) {
|
|
88
|
+
node = node.expression;
|
|
89
|
+
}
|
|
90
|
+
// Handle `export default z.object({...})` wrapped in another call expression
|
|
91
|
+
// e.g., z.object({...}).extend({...})
|
|
92
|
+
if (tsModule.isCallExpression(node) &&
|
|
93
|
+
tsModule.isPropertyAccessExpression(node.expression)) {
|
|
94
|
+
// Check if the inner node is a z.object() call
|
|
95
|
+
const innerNode = node.expression.expression;
|
|
96
|
+
if (tsModule.isCallExpression(innerNode) &&
|
|
97
|
+
isZObjectCallExpression(innerNode, tsModule)) {
|
|
98
|
+
const prop = innerNode.arguments[0];
|
|
99
|
+
if (prop && tsModule.isObjectLiteralExpression(prop)) {
|
|
100
|
+
return prop;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Check for .extend() / .merge() / .pick() / .omit() chaining on z.object()
|
|
104
|
+
if (tsModule.isIdentifier(node.expression.name)) {
|
|
105
|
+
const methodName = node.expression.name.text;
|
|
106
|
+
if (methodName === 'extend' ||
|
|
107
|
+
methodName === 'merge' ||
|
|
108
|
+
methodName === 'pick' ||
|
|
109
|
+
methodName === 'omit') {
|
|
110
|
+
return findZObjectCall(node.expression.expression, tsModule);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Direct z.object() call
|
|
115
|
+
if (tsModule.isCallExpression(node) &&
|
|
116
|
+
isZObjectCallExpression(node, tsModule)) {
|
|
117
|
+
const arg = node.arguments[0];
|
|
118
|
+
if (arg && tsModule.isObjectLiteralExpression(arg)) {
|
|
119
|
+
return arg;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if a CallExpression is `z.object(...)`.
|
|
126
|
+
*/
|
|
127
|
+
function isZObjectCallExpression(node, tsModule) {
|
|
128
|
+
const expr = node.expression;
|
|
129
|
+
if (!tsModule.isPropertyAccessExpression(expr))
|
|
130
|
+
return false;
|
|
131
|
+
return (tsModule.isIdentifier(expr.expression) &&
|
|
132
|
+
expr.expression.text === 'z' &&
|
|
133
|
+
tsModule.isIdentifier(expr.name) &&
|
|
134
|
+
expr.name.text === 'object');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Walk an ObjectLiteralExpression (`{ email: z.string(), ... }`) and build a
|
|
138
|
+
* source map mapping JSON Pointer paths to file:line locations.
|
|
139
|
+
*
|
|
140
|
+
* Handles nested `z.object({...})` by recursing into inner object literals.
|
|
141
|
+
*/
|
|
142
|
+
export function buildSourceMapFromObjectLiteral(objLit, sourceFile, tsModule) {
|
|
143
|
+
const map = {};
|
|
144
|
+
for (const prop of objLit.properties) {
|
|
145
|
+
if (!tsModule.isPropertyAssignment(prop)) {
|
|
146
|
+
// SpreadAssignment and ShorthandPropertyAssignment have no static key
|
|
147
|
+
// that maps to a JSON Pointer — skip them.
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// Resolve a static property name.
|
|
151
|
+
// - Identifier: { email: ... } → prop.name.text
|
|
152
|
+
// - StringLiteral: { 'email': ... } → prop.name.text
|
|
153
|
+
// - ComputedPropertyName with string literal:
|
|
154
|
+
// { ['email']: ... } → inner text
|
|
155
|
+
// - ComputedPropertyName with dynamic expression:
|
|
156
|
+
// { [k]: ... } → skip (not statically known)
|
|
157
|
+
let propName;
|
|
158
|
+
if (tsModule.isIdentifier(prop.name) || tsModule.isStringLiteral(prop.name)) {
|
|
159
|
+
propName = prop.name.text;
|
|
160
|
+
}
|
|
161
|
+
else if (tsModule.isComputedPropertyName(prop.name) &&
|
|
162
|
+
tsModule.isStringLiteral(prop.name.expression)) {
|
|
163
|
+
propName = prop.name.expression.text;
|
|
164
|
+
}
|
|
165
|
+
if (propName === undefined) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const { line } = sourceFile.getLineAndCharacterOfPosition(prop.getStart(sourceFile));
|
|
169
|
+
// Pointer keys intentionally use the raw property name — NOT RFC 6901-escaped
|
|
170
|
+
// (i.e. '/' is NOT replaced with '~1', nor '~' with '~0').
|
|
171
|
+
// The Rust normalizer builds pointers the same way:
|
|
172
|
+
// `format!("{}/properties/{}", ptr, key)` in crates/schemalint/src/normalize/traverse.rs
|
|
173
|
+
// Both sides must be byte-identical so that `source_map.get(&pointer)` matches.
|
|
174
|
+
// Escaping only this side would desync the two and break source-mapping for any
|
|
175
|
+
// property whose name contains '/' or '~'. A coordinated change on both sides
|
|
176
|
+
// would be required if RFC-6901 canonical pointers are ever desired.
|
|
177
|
+
const pointer = `/properties/${propName}`;
|
|
178
|
+
map[pointer] = {
|
|
179
|
+
file: sourceFile.fileName,
|
|
180
|
+
line: line + 1, // 1-indexed
|
|
181
|
+
};
|
|
182
|
+
// Recurse into nested z.object() values
|
|
183
|
+
const innerCall = findZObjectCall(prop.initializer, tsModule);
|
|
184
|
+
if (innerCall) {
|
|
185
|
+
const nested = buildSourceMapFromObjectLiteral(innerCall, sourceFile, tsModule);
|
|
186
|
+
for (const [nestedPointer, nestedSpan] of Object.entries(nested)) {
|
|
187
|
+
map[`/properties/${propName}${nestedPointer}`] = nestedSpan;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return map;
|
|
192
|
+
}
|
|
193
|
+
export function buildRootSourceMap(node, sourceFile) {
|
|
194
|
+
const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
|
|
195
|
+
return {
|
|
196
|
+
'': {
|
|
197
|
+
file: sourceFile.fileName,
|
|
198
|
+
line: line + 1,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=discover_ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover_ast.js","sourceRoot":"","sources":["../src/discover_ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime schema evaluation.
|
|
3
|
+
*
|
|
4
|
+
* Given a file path and export name, dynamically imports the user's TypeScript
|
|
5
|
+
* file, accesses the exported Zod schema, and converts it to JSON Schema.
|
|
6
|
+
*
|
|
7
|
+
* Uses `zod-to-json-schema` by default, but detects Zod v4's native
|
|
8
|
+
* `toJSONSchema()` method when available.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Dynamically import a user's TypeScript file and evaluate an exported
|
|
12
|
+
* Zod schema to JSON Schema.
|
|
13
|
+
*
|
|
14
|
+
* Requires `tsx` for JIT compilation of TypeScript imports.
|
|
15
|
+
*/
|
|
16
|
+
export declare function evaluateSchema(filePath: string, exportName: string): Promise<Record<string, unknown>>;
|
|
17
|
+
export declare function evaluateSyntheticSchema(source: string, exportName: string, baseFilePath: string): Promise<Record<string, unknown>>;
|
|
18
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclC;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC"}
|
package/dist/evaluate.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime schema evaluation.
|
|
3
|
+
*
|
|
4
|
+
* Given a file path and export name, dynamically imports the user's TypeScript
|
|
5
|
+
* file, accesses the exported Zod schema, and converts it to JSON Schema.
|
|
6
|
+
*
|
|
7
|
+
* Uses `zod-to-json-schema` by default, but detects Zod v4's native
|
|
8
|
+
* `toJSONSchema()` method when available.
|
|
9
|
+
*/
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { createRequire } from 'node:module';
|
|
13
|
+
import { mkdtemp, rm, symlink, writeFile } from 'node:fs/promises';
|
|
14
|
+
import { tmpdir } from 'node:os';
|
|
15
|
+
import { dirname, join } from 'node:path';
|
|
16
|
+
import { pathToFileURL } from 'node:url';
|
|
17
|
+
const localRequire = createRequire(import.meta.url);
|
|
18
|
+
/**
|
|
19
|
+
* Dynamically import a user's TypeScript file and evaluate an exported
|
|
20
|
+
* Zod schema to JSON Schema.
|
|
21
|
+
*
|
|
22
|
+
* Requires `tsx` for JIT compilation of TypeScript imports.
|
|
23
|
+
*/
|
|
24
|
+
export async function evaluateSchema(filePath, exportName) {
|
|
25
|
+
return withStdoutRedirect(async () => {
|
|
26
|
+
const mod = await importModule(filePath);
|
|
27
|
+
const schema = mod[exportName];
|
|
28
|
+
if (!schema) {
|
|
29
|
+
throw new Error(`Export '${exportName}' not found in module '${filePath}'. ` +
|
|
30
|
+
`Available exports: ${Object.keys(mod).join(', ') || '(none)'}`);
|
|
31
|
+
}
|
|
32
|
+
return zodToJsonSchema(schema);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function evaluateSyntheticSchema(source, exportName, baseFilePath) {
|
|
36
|
+
const dir = await mkdtemp(join(tmpdir(), 'schemalint-zod-'));
|
|
37
|
+
const filePath = join(dir, `${randomUUID()}.ts`);
|
|
38
|
+
try {
|
|
39
|
+
await linkNodeModules(dir, baseFilePath);
|
|
40
|
+
await writeFile(filePath, source, 'utf8');
|
|
41
|
+
return await evaluateSchema(filePath, exportName);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
await rm(dir, { recursive: true, force: true });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function withStdoutRedirect(fn) {
|
|
48
|
+
// Redirect stdout to stderr during evaluation so user-code console.log()
|
|
49
|
+
// calls don't corrupt the JSON-RPC protocol channel.
|
|
50
|
+
const originalStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
51
|
+
process.stdout.write = process.stderr.write.bind(process.stderr);
|
|
52
|
+
try {
|
|
53
|
+
return await fn();
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
// Restore stdout
|
|
57
|
+
process.stdout.write = originalStdoutWrite;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function importModule(filePath) {
|
|
61
|
+
const importPath = filePath.startsWith('file://')
|
|
62
|
+
? filePath
|
|
63
|
+
: pathToFileURL(filePath).href;
|
|
64
|
+
return (await import(importPath));
|
|
65
|
+
}
|
|
66
|
+
async function linkNodeModules(dir, baseFilePath) {
|
|
67
|
+
const nodeModules = findNearestNodeModules(baseFilePath);
|
|
68
|
+
if (!nodeModules)
|
|
69
|
+
return;
|
|
70
|
+
try {
|
|
71
|
+
await symlink(nodeModules, join(dir, 'node_modules'), 'dir');
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
// Bare imports may still be rewritten to file URLs. A symlink failure should
|
|
75
|
+
// not prevent evaluating schemas that do not need package resolution.
|
|
76
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
77
|
+
console.warn(`[schemalint-zod] Could not symlink node_modules into temp dir: ${msg}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function findNearestNodeModules(filePath) {
|
|
81
|
+
let dir = dirname(filePath);
|
|
82
|
+
while (true) {
|
|
83
|
+
const candidate = join(dir, 'node_modules');
|
|
84
|
+
if (existsSync(candidate))
|
|
85
|
+
return candidate;
|
|
86
|
+
const parent = dirname(dir);
|
|
87
|
+
if (parent === dir)
|
|
88
|
+
return undefined;
|
|
89
|
+
dir = parent;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Convert a Zod schema to JSON Schema.
|
|
94
|
+
*
|
|
95
|
+
* Detects Zod v4's native `toJSONSchema()` method and uses it when available.
|
|
96
|
+
* Falls back to `zod-to-json-schema` for Zod v3.
|
|
97
|
+
*/
|
|
98
|
+
function zodToJsonSchema(schema) {
|
|
99
|
+
// Check for Zod v4 native toJSONSchema()
|
|
100
|
+
if (schema &&
|
|
101
|
+
typeof schema === 'object' &&
|
|
102
|
+
'_def' in schema &&
|
|
103
|
+
'toJSONSchema' in schema &&
|
|
104
|
+
typeof schema.toJSONSchema === 'function') {
|
|
105
|
+
return schema.toJSONSchema();
|
|
106
|
+
}
|
|
107
|
+
// Fall back to zod-to-json-schema (Zod v3)
|
|
108
|
+
// Use createRequire to load from the helper's own node_modules.
|
|
109
|
+
const zodToJsonSchemaModule = localRequire('zod-to-json-schema');
|
|
110
|
+
return zodToJsonSchemaModule.zodToJsonSchema(schema);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|
package/dist/main.js
ADDED
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,IAAI,EAAE,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAuGA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAW1C"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { discoverZodSchemas } from './discover.js';
|
|
2
|
+
function sendResponse(id, result) {
|
|
3
|
+
const response = { jsonrpc: '2.0', result, id };
|
|
4
|
+
process.stdout.write(JSON.stringify(response) + '\n');
|
|
5
|
+
}
|
|
6
|
+
function sendFinalResponse(id, result) {
|
|
7
|
+
const response = { jsonrpc: '2.0', result, id };
|
|
8
|
+
process.stdout.write(JSON.stringify(response) + '\n', () => {
|
|
9
|
+
process.exit(0);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function sendError(id, code, message, data) {
|
|
13
|
+
const error = {
|
|
14
|
+
code,
|
|
15
|
+
message,
|
|
16
|
+
};
|
|
17
|
+
if (data !== undefined)
|
|
18
|
+
error.data = data;
|
|
19
|
+
const response = { jsonrpc: '2.0', error, id };
|
|
20
|
+
process.stdout.write(JSON.stringify(response) + '\n');
|
|
21
|
+
}
|
|
22
|
+
function handleDiscover(request, reqId) {
|
|
23
|
+
const params = request.params ?? {};
|
|
24
|
+
const source = params.source;
|
|
25
|
+
if (!source || typeof source !== 'string') {
|
|
26
|
+
return Promise.resolve(sendError(reqId, -32602, "Missing or invalid 'source' parameter"));
|
|
27
|
+
}
|
|
28
|
+
return discoverZodSchemas(source)
|
|
29
|
+
.then((result) => {
|
|
30
|
+
sendResponse(reqId, result);
|
|
31
|
+
})
|
|
32
|
+
.catch((err) => {
|
|
33
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
34
|
+
sendError(reqId, -32603, `Discovery failed: ${message}`);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async function processLine(line) {
|
|
38
|
+
const trimmed = line.trim();
|
|
39
|
+
if (!trimmed)
|
|
40
|
+
return true;
|
|
41
|
+
let request;
|
|
42
|
+
try {
|
|
43
|
+
request = JSON.parse(trimmed);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
sendError(null, -32700, 'Parse error');
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
if (request.jsonrpc !== '2.0') {
|
|
50
|
+
sendError(request.id, -32600, 'Invalid JSON-RPC: missing or incorrect jsonrpc field');
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
const method = request.method ?? '';
|
|
54
|
+
const reqId = request.id;
|
|
55
|
+
if (method === 'discover') {
|
|
56
|
+
await handleDiscover(request, reqId);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (method === 'shutdown') {
|
|
60
|
+
sendFinalResponse(reqId, 'ok');
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (method === '') {
|
|
64
|
+
sendError(reqId, -32600, 'Invalid JSON-RPC request: missing method');
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
sendError(reqId, -32601, `Method not found: ${method}`);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
export async function main() {
|
|
71
|
+
const readline = await import('node:readline');
|
|
72
|
+
const rl = readline.createInterface({
|
|
73
|
+
input: process.stdin,
|
|
74
|
+
crlfDelay: Infinity,
|
|
75
|
+
});
|
|
76
|
+
for await (const line of rl) {
|
|
77
|
+
const shouldContinue = await processLine(line);
|
|
78
|
+
if (!shouldContinue)
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type * as ts from 'typescript';
|
|
2
|
+
import type { SourceMapEntry } from './discover.js';
|
|
3
|
+
import { type TargetExpression } from './target_resolution.js';
|
|
4
|
+
export interface SchemaTarget {
|
|
5
|
+
name: string;
|
|
6
|
+
filePath: string;
|
|
7
|
+
exportName: string;
|
|
8
|
+
sourceMap: Record<string, SourceMapEntry>;
|
|
9
|
+
syntheticSource?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveTarget(target: TargetExpression, checker: ts.TypeChecker, tsModule: typeof ts, compilerOptions: ts.CompilerOptions): SchemaTarget;
|
|
12
|
+
//# sourceMappingURL=target_emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target_emit.d.ts","sourceRoot":"","sources":["../src/target_emit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAOpD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,QAAQ,EAAE,OAAO,EAAE,EACnB,eAAe,EAAE,EAAE,CAAC,eAAe,GAClC,YAAY,CA+Bd"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { pathToFileURL } from 'node:url';
|
|
2
|
+
import { buildRootSourceMap, buildSourceMapFromObjectLiteral, findZObjectCall, hasExportModifier, } from './discover_ast.js';
|
|
3
|
+
import { resolveVariableDeclaration, } from './target_resolution.js';
|
|
4
|
+
export function resolveTarget(target, checker, tsModule, compilerOptions) {
|
|
5
|
+
const expr = skipParens(target.expression, tsModule);
|
|
6
|
+
const sourceFile = target.sourceFile;
|
|
7
|
+
const sourceMap = sourceMapForTarget(expr, sourceFile, checker, tsModule);
|
|
8
|
+
if (tsModule.isIdentifier(expr)) {
|
|
9
|
+
const exported = resolveExportedIdentifier(expr, checker, tsModule);
|
|
10
|
+
if (exported) {
|
|
11
|
+
return {
|
|
12
|
+
name: target.name,
|
|
13
|
+
filePath: exported.filePath,
|
|
14
|
+
exportName: exported.exportName,
|
|
15
|
+
sourceMap,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const exportName = `__schemalint_target_${safeName(target.name)}`;
|
|
20
|
+
return {
|
|
21
|
+
name: target.name,
|
|
22
|
+
filePath: sourceFile.fileName,
|
|
23
|
+
exportName,
|
|
24
|
+
sourceMap,
|
|
25
|
+
syntheticSource: buildSyntheticModule(sourceFile, expr, exportName, tsModule, compilerOptions),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function resolveExportedIdentifier(id, checker, tsModule) {
|
|
29
|
+
const decl = resolveVariableDeclaration(id, checker, tsModule);
|
|
30
|
+
if (!decl)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (tsModule.isIdentifier(decl.name)) {
|
|
33
|
+
const stmt = decl.parent.parent;
|
|
34
|
+
if (tsModule.isVariableStatement(stmt) && hasExportModifier(stmt, tsModule)) {
|
|
35
|
+
return {
|
|
36
|
+
filePath: decl.getSourceFile().fileName,
|
|
37
|
+
exportName: decl.name.text,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
function buildSyntheticModule(sourceFile, expr, exportName, tsModule, compilerOptions) {
|
|
44
|
+
const parts = [];
|
|
45
|
+
// Identify the top-level statement that directly contains the target
|
|
46
|
+
// expression so we can skip it (we replace it with the export below).
|
|
47
|
+
const containingStmt = sourceFile.statements.find((stmt) => stmt.getStart(sourceFile) <= expr.getStart(sourceFile) &&
|
|
48
|
+
expr.getEnd() <= stmt.getEnd());
|
|
49
|
+
for (const stmt of sourceFile.statements) {
|
|
50
|
+
if (tsModule.isImportDeclaration(stmt)) {
|
|
51
|
+
parts.push(rewriteImport(stmt, sourceFile, tsModule, compilerOptions));
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
// Include all reusable declarations except the one containing the target
|
|
55
|
+
// expression. This allows the target to reference helpers declared either
|
|
56
|
+
// before or after it in source order without a ReferenceError.
|
|
57
|
+
if (stmt !== containingStmt && isReusableDeclaration(stmt, tsModule)) {
|
|
58
|
+
parts.push(stmt.getText(sourceFile));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
parts.push(`export const ${exportName} = ${expr.getText(sourceFile)};`);
|
|
62
|
+
return parts.join('\n\n');
|
|
63
|
+
}
|
|
64
|
+
function isReusableDeclaration(stmt, tsModule) {
|
|
65
|
+
return (tsModule.isVariableStatement(stmt) ||
|
|
66
|
+
tsModule.isFunctionDeclaration(stmt) ||
|
|
67
|
+
tsModule.isClassDeclaration(stmt) ||
|
|
68
|
+
tsModule.isEnumDeclaration(stmt) ||
|
|
69
|
+
tsModule.isInterfaceDeclaration(stmt) ||
|
|
70
|
+
tsModule.isTypeAliasDeclaration(stmt));
|
|
71
|
+
}
|
|
72
|
+
function rewriteImport(stmt, sourceFile, tsModule, compilerOptions) {
|
|
73
|
+
const spec = stmt.moduleSpecifier;
|
|
74
|
+
if (!tsModule.isStringLiteral(spec)) {
|
|
75
|
+
return stmt.getText(sourceFile);
|
|
76
|
+
}
|
|
77
|
+
const resolved = tsModule.resolveModuleName(spec.text, sourceFile.fileName, compilerOptions, tsModule.sys).resolvedModule?.resolvedFileName;
|
|
78
|
+
if (!resolved)
|
|
79
|
+
return stmt.getText(sourceFile);
|
|
80
|
+
if (resolved.includes('/node_modules/') || resolved.endsWith('.d.ts')) {
|
|
81
|
+
return stmt.getText(sourceFile);
|
|
82
|
+
}
|
|
83
|
+
const text = stmt.getText(sourceFile);
|
|
84
|
+
// pathToFileURL produces a forward-slash percent-encoded file:// URL (Windows-safe);
|
|
85
|
+
// JSON.stringify is the correct way to embed it as a JS string literal — not double-escaping.
|
|
86
|
+
return text.replace(spec.getText(sourceFile), JSON.stringify(pathToFileURL(resolved).href));
|
|
87
|
+
}
|
|
88
|
+
function sourceMapForExpression(expr, sourceFile, tsModule) {
|
|
89
|
+
const objectArg = findZObjectCall(expr, tsModule);
|
|
90
|
+
if (objectArg)
|
|
91
|
+
return buildSourceMapFromObjectLiteral(objectArg, sourceFile, tsModule);
|
|
92
|
+
return buildRootSourceMap(expr, sourceFile);
|
|
93
|
+
}
|
|
94
|
+
function sourceMapForTarget(expr, sourceFile, checker, tsModule) {
|
|
95
|
+
if (tsModule.isIdentifier(expr)) {
|
|
96
|
+
const decl = resolveVariableDeclaration(expr, checker, tsModule);
|
|
97
|
+
if (decl?.initializer) {
|
|
98
|
+
return sourceMapForExpression(decl.initializer, decl.getSourceFile(), tsModule);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return sourceMapForExpression(expr, sourceFile, tsModule);
|
|
102
|
+
}
|
|
103
|
+
function skipParens(node, tsModule) {
|
|
104
|
+
while (tsModule.isParenthesizedExpression(node))
|
|
105
|
+
node = node.expression;
|
|
106
|
+
return node;
|
|
107
|
+
}
|
|
108
|
+
function safeName(name) {
|
|
109
|
+
return name.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=target_emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target_emit.js","sourceRoot":"","sources":["../src/target_emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type * as ts from 'typescript';
|
|
2
|
+
export interface TargetImports {
|
|
3
|
+
outputCalls: Set<string>;
|
|
4
|
+
toolCalls: Set<string>;
|
|
5
|
+
formatCalls: Set<string>;
|
|
6
|
+
outputObjects: Set<string>;
|
|
7
|
+
aiNamespaces: Set<string>;
|
|
8
|
+
helperNamespaces: Set<string>;
|
|
9
|
+
}
|
|
10
|
+
export interface CallRef {
|
|
11
|
+
name: string;
|
|
12
|
+
receiver?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const OUTPUT_CALLS: Set<string>;
|
|
15
|
+
export declare const TOOL_CALLS: Set<string>;
|
|
16
|
+
export declare const FORMAT_CALLS: Set<string>;
|
|
17
|
+
export declare function collectTargetImports(sourceFile: ts.SourceFile, tsModule: typeof ts): TargetImports;
|
|
18
|
+
export declare function isProviderCall(ref: CallRef, imports: TargetImports): boolean;
|
|
19
|
+
//# sourceMappingURL=target_imports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target_imports.d.ts","sourceRoot":"","sources":["../src/target_imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,YAAY,aAA8C,CAAC;AACxE,eAAO,MAAM,UAAU,aAAkD,CAAC;AAC1E,eAAO,MAAM,YAAY,aAAkD,CAAC;AAE5E,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,QAAQ,EAAE,OAAO,EAAE,GAClB,aAAa,CA6Cf;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,aAAa,GACrB,OAAO,CAgBT"}
|