@ir-kit/fn-schema-core 0.1.0

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 (51) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +114 -0
  3. package/dist/defaults.d.ts +4 -0
  4. package/dist/defaults.d.ts.map +1 -0
  5. package/dist/defaults.js +25 -0
  6. package/dist/defaults.js.map +1 -0
  7. package/dist/diagnostics.d.ts +15 -0
  8. package/dist/diagnostics.d.ts.map +1 -0
  9. package/dist/diagnostics.js +31 -0
  10. package/dist/diagnostics.js.map +1 -0
  11. package/dist/emit/bundle.d.ts +22 -0
  12. package/dist/emit/bundle.d.ts.map +1 -0
  13. package/dist/emit/bundle.js +62 -0
  14. package/dist/emit/bundle.js.map +1 -0
  15. package/dist/emit/files.d.ts +16 -0
  16. package/dist/emit/files.d.ts.map +1 -0
  17. package/dist/emit/files.js +30 -0
  18. package/dist/emit/files.js.map +1 -0
  19. package/dist/emit/index.d.ts +4 -0
  20. package/dist/emit/index.d.ts.map +1 -0
  21. package/dist/emit/index.js +4 -0
  22. package/dist/emit/index.js.map +1 -0
  23. package/dist/emit/openapi.d.ts +31 -0
  24. package/dist/emit/openapi.d.ts.map +1 -0
  25. package/dist/emit/openapi.js +46 -0
  26. package/dist/emit/openapi.js.map +1 -0
  27. package/dist/filter.d.ts +4 -0
  28. package/dist/filter.d.ts.map +1 -0
  29. package/dist/filter.js +67 -0
  30. package/dist/filter.js.map +1 -0
  31. package/dist/index.d.ts +9 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +8 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/naming.d.ts +3 -0
  36. package/dist/naming.d.ts.map +1 -0
  37. package/dist/naming.js +31 -0
  38. package/dist/naming.js.map +1 -0
  39. package/dist/project.d.ts +3 -0
  40. package/dist/project.d.ts.map +1 -0
  41. package/dist/project.js +335 -0
  42. package/dist/project.js.map +1 -0
  43. package/dist/targets.d.ts +12 -0
  44. package/dist/targets.d.ts.map +1 -0
  45. package/dist/targets.js +23 -0
  46. package/dist/targets.js.map +1 -0
  47. package/dist/types.d.ts +265 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +66 -0
package/dist/naming.js ADDED
@@ -0,0 +1,31 @@
1
+ import path from "node:path";
2
+ export function resolveNaming(strategy, fn, cwd) {
3
+ const s = strategy ?? "function-name";
4
+ if (typeof s === "function")
5
+ return s(fn);
6
+ switch (s) {
7
+ case "function-name":
8
+ return qualifiedName(fn);
9
+ case "file-function": {
10
+ const rel = path.relative(cwd, fn.file).replace(/\\/g, "/");
11
+ const base = rel
12
+ .replace(/\.(m|c)?(ts|tsx|js|jsx)$/, "")
13
+ .replace(/\//g, ".");
14
+ return `${base}.${qualifiedName(fn)}`;
15
+ }
16
+ case "jsdoc-tag": {
17
+ const tag = fn.jsDoc?.tags?.schema;
18
+ if (typeof tag === "string" && tag.length > 0)
19
+ return tag;
20
+ return qualifiedName(fn);
21
+ }
22
+ }
23
+ }
24
+ function qualifiedName(fn) {
25
+ // `className` is set for class methods and object-literal members alike;
26
+ // qualify whenever it's present so naming reflects the surface API.
27
+ if (fn.className)
28
+ return `${fn.className}.${fn.name}`;
29
+ return fn.name;
30
+ }
31
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,UAAU,aAAa,CAC3B,QAAoC,EACpC,EAAgB,EAChB,GAAW;IAEX,MAAM,CAAC,GAAG,QAAQ,IAAI,eAAe,CAAC;IACtC,IAAI,OAAO,CAAC,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAE1C,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,eAAe;YAClB,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;QAC3B,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,GAAG;iBACb,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;iBACvC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACvB,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;QACxC,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC;YACnC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;YAC1D,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,EAAgB;IACrC,yEAAyE;IACzE,oEAAoE;IACpE,IAAI,EAAE,CAAC,SAAS;QAAE,OAAO,GAAG,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACtD,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Project, ProjectOptions } from "./types.js";
2
+ export declare function createProject(opts: ProjectOptions): Project;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAWV,OAAO,EACP,cAAc,EAKf,MAAM,YAAY,CAAC;AAOpB,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CA6C3D"}
@@ -0,0 +1,335 @@
1
+ import { resolveSchemaOptions, resolveSignatureOptions } from "./defaults.js";
2
+ import { DiagnosticSink } from "./diagnostics.js";
3
+ import { applyFilter, resolveFilter } from "./filter.js";
4
+ import { resolveNaming } from "./naming.js";
5
+ export function createProject(opts) {
6
+ if (opts.extractors.length === 0) {
7
+ throw new Error("createProject: at least one extractor is required (e.g. @ir-kit/fn-schema-typescript)");
8
+ }
9
+ const cwd = opts.cwd ?? process.cwd();
10
+ let entries = null;
11
+ const ensureInit = async () => {
12
+ if (entries)
13
+ return entries;
14
+ entries = await Promise.all(opts.extractors.map(async (extractor) => ({
15
+ extractor,
16
+ instance: await extractor.init({
17
+ cwd,
18
+ tsConfigPath: opts.tsConfigPath,
19
+ }),
20
+ })));
21
+ return entries;
22
+ };
23
+ return {
24
+ async extract(callOpts) {
25
+ const merged = mergeOptions(opts, callOpts);
26
+ const init = await ensureInit();
27
+ return runExtract(init, merged, cwd);
28
+ },
29
+ async discover(callOpts) {
30
+ const merged = mergeOptions(opts, callOpts);
31
+ const init = await ensureInit();
32
+ return runDiscover(init, merged);
33
+ },
34
+ refresh(paths) {
35
+ if (!entries)
36
+ return;
37
+ const list = paths ?? [];
38
+ for (const e of entries)
39
+ e.instance.refresh(list);
40
+ },
41
+ dispose() {
42
+ if (!entries)
43
+ return;
44
+ for (const e of entries)
45
+ e.instance.dispose();
46
+ entries = null;
47
+ },
48
+ };
49
+ }
50
+ function mergeOptions(project, call) {
51
+ return {
52
+ cwd: project.cwd,
53
+ tsConfigPath: project.tsConfigPath,
54
+ ...(call ?? {}),
55
+ };
56
+ }
57
+ async function runExtract(entries, options, cwd) {
58
+ const start = Date.now();
59
+ const sink = new DiagnosticSink(options.onDiagnostic, options.failFast);
60
+ const filter = resolveFilter(options.include, options.exclude, options.filter);
61
+ const sigOpts = resolveSignatureOptions(options.signature);
62
+ const schemaOpts = resolveSchemaOptions(options.schema);
63
+ const { discovered: allDiscovered, filesScanned } = await runDiscoverPass(entries, options, sink, filter);
64
+ const signatures = [];
65
+ const definitions = {};
66
+ const seenIds = new Set();
67
+ for (const { entry, fn } of allDiscovered) {
68
+ try {
69
+ const pair = await entry.instance.toSchemas(fn, {
70
+ ...sigOpts,
71
+ ...schemaOpts,
72
+ });
73
+ const finalised = applySchemaHooks(fn, pair, options.hooks);
74
+ const id = uniqueId(resolveNaming(options.naming, fn, cwd), seenIds, sink, fn);
75
+ signatures.push({
76
+ id,
77
+ name: fn.name,
78
+ file: fn.file,
79
+ location: fn.location,
80
+ kind: fn.kind,
81
+ language: fn.language,
82
+ jsDoc: fn.jsDoc,
83
+ input: finalised.input,
84
+ output: finalised.output,
85
+ async: fn.async,
86
+ generic: fn.generic,
87
+ coverage: finalised.coverage,
88
+ });
89
+ if (finalised.definitions) {
90
+ for (const [k, v] of Object.entries(finalised.definitions)) {
91
+ const prior = definitions[k];
92
+ if (prior && !shallowSchemaEqual(prior, v)) {
93
+ sink.push({
94
+ severity: "warning",
95
+ code: "DUPLICATE_ID",
96
+ message: `Definition "${k}" emitted with conflicting shapes from "${fn.name}"; later schema overwrites the earlier one (cross-file types with the same name should be renamed or aliased)`,
97
+ file: fn.file,
98
+ function: fn.name,
99
+ });
100
+ }
101
+ definitions[k] = v;
102
+ }
103
+ }
104
+ if (finalised.coverage) {
105
+ emitCoverageDiagnostics(finalised.coverage, fn, sink);
106
+ }
107
+ }
108
+ catch (err) {
109
+ const skipped = err instanceof Error && err.name === "SignatureSkipped";
110
+ sink.push({
111
+ severity: skipped ? "warning" : "error",
112
+ code: skipped ? "GENERIC_SKIPPED" : "EXTRACTOR_FAILURE",
113
+ message: skipped
114
+ ? errMessage(err)
115
+ : `Failed to build schema for "${fn.name}": ${errMessage(err)}`,
116
+ file: fn.file,
117
+ location: fn.location,
118
+ function: fn.name,
119
+ });
120
+ }
121
+ }
122
+ if (signatures.length === 0) {
123
+ sink.push({
124
+ severity: "info",
125
+ code: "EMPTY_RESULT",
126
+ message: "No signatures extracted. Check `files` glob, `include` filter, or `tsConfigPath`.",
127
+ });
128
+ }
129
+ return {
130
+ signatures,
131
+ definitions,
132
+ diagnostics: sink.all(),
133
+ stats: {
134
+ filesScanned,
135
+ functionsFound: signatures.length,
136
+ durationMs: Date.now() - start,
137
+ },
138
+ };
139
+ }
140
+ async function runDiscover(entries, options) {
141
+ const start = Date.now();
142
+ const sink = new DiagnosticSink(options.onDiagnostic, options.failFast);
143
+ const filter = resolveFilter(options.include, options.exclude, options.filter);
144
+ const { discovered, filesScanned } = await runDiscoverPass(entries, options, sink, filter);
145
+ return {
146
+ signatures: discovered.map((d) => d.fn),
147
+ diagnostics: sink.all(),
148
+ stats: {
149
+ filesScanned,
150
+ functionsFound: discovered.length,
151
+ durationMs: Date.now() - start,
152
+ },
153
+ };
154
+ }
155
+ async function runDiscoverPass(entries, options, sink, filter) {
156
+ const filesByExtractor = groupFiles(entries, options, sink);
157
+ let filesScanned = 0;
158
+ const discovered = [];
159
+ for (const [language, { files, entry }] of filesByExtractor) {
160
+ if (files.length === 0)
161
+ continue;
162
+ filesScanned += files.length;
163
+ try {
164
+ const found = await entry.instance.discover(files, filter);
165
+ for (const fn of found) {
166
+ if (!applyFilter(fn, filter))
167
+ continue;
168
+ const transformed = applyOnFunctionHook(fn, options.hooks);
169
+ if (!transformed)
170
+ continue;
171
+ discovered.push({ entry, fn: transformed });
172
+ }
173
+ }
174
+ catch (err) {
175
+ sink.push({
176
+ severity: "error",
177
+ code: "EXTRACTOR_FAILURE",
178
+ message: `Extractor "${language}" failed during discover: ${errMessage(err)}`,
179
+ });
180
+ }
181
+ }
182
+ return { discovered, filesScanned };
183
+ }
184
+ function groupFiles(entries, options, sink) {
185
+ const result = new Map();
186
+ const collected = collectFilePaths(options, sink);
187
+ for (const entry of entries) {
188
+ result.set(entry.extractor.language, { files: [], entry });
189
+ }
190
+ for (const file of collected) {
191
+ const ext = extOf(file);
192
+ const match = entries.find((e) => e.extractor.extensions.includes(ext));
193
+ if (!match) {
194
+ sink.push({
195
+ severity: "warning",
196
+ code: "NO_EXTRACTOR",
197
+ message: `No extractor registered for "${ext}" (file: ${file})`,
198
+ file,
199
+ });
200
+ continue;
201
+ }
202
+ result.get(match.extractor.language).files.push(file);
203
+ }
204
+ return result;
205
+ }
206
+ function collectFilePaths(options, sink) {
207
+ const acc = [];
208
+ if (options.files) {
209
+ const arr = Array.isArray(options.files) ? options.files : [options.files];
210
+ for (const f of arr) {
211
+ if (looksLikeGlob(f)) {
212
+ sink.push({
213
+ severity: "warning",
214
+ code: "FILE_READ_ERROR",
215
+ message: `Glob "${f}" passed to core; expand globs in the caller (CLI or app).`,
216
+ });
217
+ continue;
218
+ }
219
+ acc.push(f);
220
+ }
221
+ }
222
+ if (options.source?.path)
223
+ acc.push(options.source.path);
224
+ return Array.from(new Set(acc));
225
+ }
226
+ function looksLikeGlob(p) {
227
+ return /[*?[\]{}]/.test(p);
228
+ }
229
+ function extOf(file) {
230
+ const i = file.lastIndexOf(".");
231
+ return i === -1 ? "" : file.slice(i);
232
+ }
233
+ function applyOnFunctionHook(fn, hooks) {
234
+ if (!hooks?.onFunction)
235
+ return fn;
236
+ const r = hooks.onFunction(fn);
237
+ if (r === null)
238
+ return null;
239
+ return r ?? fn;
240
+ }
241
+ function applySchemaHooks(fn, pair, hooks) {
242
+ if (!hooks?.onSchema)
243
+ return pair;
244
+ const onSchema = hooks.onSchema;
245
+ const ctxBase = { function: fn };
246
+ const transformInput = (s) => {
247
+ if (Array.isArray(s)) {
248
+ return s.map((schema, i) => onSchema(schema, {
249
+ ...ctxBase,
250
+ position: "parameter",
251
+ parameterIndex: i,
252
+ }));
253
+ }
254
+ return onSchema(s, { ...ctxBase, position: "input" });
255
+ };
256
+ return {
257
+ input: transformInput(pair.input),
258
+ output: onSchema(pair.output, { ...ctxBase, position: "output" }),
259
+ definitions: pair.definitions,
260
+ };
261
+ }
262
+ function uniqueId(desired, seen, sink, fn) {
263
+ if (!seen.has(desired)) {
264
+ seen.add(desired);
265
+ return desired;
266
+ }
267
+ let n = 2;
268
+ while (seen.has(`${desired}__${n}`))
269
+ n++;
270
+ const suffixed = `${desired}__${n}`;
271
+ seen.add(suffixed);
272
+ sink.push({
273
+ severity: "warning",
274
+ code: "DUPLICATE_ID",
275
+ message: `Naming collision on "${desired}"; renamed to "${suffixed}"`,
276
+ file: fn.file,
277
+ function: fn.name,
278
+ });
279
+ return suffixed;
280
+ }
281
+ function errMessage(err) {
282
+ if (err instanceof Error)
283
+ return err.message;
284
+ return String(err);
285
+ }
286
+ /** Equality via stable-key JSON — distinguishes a real shape conflict from two
287
+ * functions referencing the same shared type. */
288
+ function shallowSchemaEqual(a, b) {
289
+ return stableStringify(a) === stableStringify(b);
290
+ }
291
+ function emitCoverageDiagnostics(coverage, fn, sink) {
292
+ for (const m of coverage.mapped) {
293
+ sink.push({
294
+ severity: "info",
295
+ code: "TYPE_MAPPED",
296
+ message: `"${m.name}" mapped to canonical JSON Schema`,
297
+ file: fn.file,
298
+ location: fn.location,
299
+ function: fn.name,
300
+ });
301
+ }
302
+ for (const l of coverage.lossy) {
303
+ sink.push({
304
+ severity: "warning",
305
+ code: "LOSSY_MAPPING",
306
+ message: `"${l.name}" mapped lossily — ${l.reason}`,
307
+ file: fn.file,
308
+ location: fn.location,
309
+ function: fn.name,
310
+ });
311
+ }
312
+ for (const n of coverage.notRepresentable) {
313
+ sink.push({
314
+ severity: "error",
315
+ code: "NOT_REPRESENTABLE",
316
+ message: `"${n.name}" has no JSON Schema representation`,
317
+ file: fn.file,
318
+ location: fn.location,
319
+ function: fn.name,
320
+ });
321
+ }
322
+ }
323
+ function stableStringify(value) {
324
+ if (value === null || typeof value !== "object")
325
+ return JSON.stringify(value);
326
+ if (Array.isArray(value)) {
327
+ return `[${value.map(stableStringify).join(",")}]`;
328
+ }
329
+ const keys = Object.keys(value).sort();
330
+ const body = keys
331
+ .map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`)
332
+ .join(",");
333
+ return `{${body}}`;
334
+ }
335
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { TargetRef } from "./types.js";
2
+ export interface ParsedTarget {
3
+ file: string;
4
+ functionName: string;
5
+ className?: string;
6
+ }
7
+ /**
8
+ * Parse "src/api.ts#createUser" or "src/api.ts#User.create".
9
+ * Returns null on malformed input — caller emits an INVALID_TARGET diagnostic.
10
+ */
11
+ export declare function parseTarget(input: string | TargetRef): ParsedTarget | null;
12
+ //# sourceMappingURL=targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAc1E"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Parse "src/api.ts#createUser" or "src/api.ts#User.create".
3
+ * Returns null on malformed input — caller emits an INVALID_TARGET diagnostic.
4
+ */
5
+ export function parseTarget(input) {
6
+ const raw = typeof input === "string" ? input : input.value;
7
+ const hash = raw.lastIndexOf("#");
8
+ if (hash <= 0 || hash === raw.length - 1)
9
+ return null;
10
+ const file = raw.slice(0, hash);
11
+ const member = raw.slice(hash + 1);
12
+ const dot = member.indexOf(".");
13
+ if (dot === -1)
14
+ return { file, functionName: member };
15
+ if (dot === 0 || dot === member.length - 1)
16
+ return null;
17
+ return {
18
+ file,
19
+ className: member.slice(0, dot),
20
+ functionName: member.slice(dot + 1),
21
+ };
22
+ }
23
+ //# sourceMappingURL=targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IACtD,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO;QACL,IAAI;QACJ,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC/B,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;KACpC,CAAC;AACJ,CAAC"}