ts-procedures 5.6.0-beta.2 → 5.7.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.
- package/README.md +0 -150
- package/agent_config/claude-code/skills/guide/api-reference.md +0 -177
- package/agent_config/claude-code/skills/guide/patterns.md +0 -107
- package/agent_config/copilot/copilot-instructions.md +0 -80
- package/agent_config/cursor/cursorrules +0 -80
- package/build/codegen/bin/cli.d.ts +27 -1
- package/build/codegen/bin/cli.js +90 -11
- package/build/codegen/bin/cli.js.map +1 -1
- package/build/codegen/bin/cli.test.js +96 -1
- package/build/codegen/bin/cli.test.js.map +1 -1
- package/build/codegen/constants.d.ts +1 -0
- package/build/codegen/constants.js +2 -0
- package/build/codegen/constants.js.map +1 -0
- package/build/codegen/e2e.test.js +143 -0
- package/build/codegen/e2e.test.js.map +1 -1
- package/build/codegen/emit-client-runtime.d.ts +9 -0
- package/build/codegen/emit-client-runtime.js +99 -0
- package/build/codegen/emit-client-runtime.js.map +1 -0
- package/build/codegen/emit-client-runtime.test.d.ts +1 -0
- package/build/codegen/emit-client-runtime.test.js +78 -0
- package/build/codegen/emit-client-runtime.test.js.map +1 -0
- package/build/codegen/emit-client-types.d.ts +8 -0
- package/build/codegen/emit-client-types.js +25 -0
- package/build/codegen/emit-client-types.js.map +1 -0
- package/build/codegen/emit-client-types.test.d.ts +1 -0
- package/build/codegen/emit-client-types.test.js +33 -0
- package/build/codegen/emit-client-types.test.js.map +1 -0
- package/build/codegen/emit-errors.d.ts +8 -1
- package/build/codegen/emit-errors.js +36 -13
- package/build/codegen/emit-errors.js.map +1 -1
- package/build/codegen/emit-errors.test.js +29 -1
- package/build/codegen/emit-errors.test.js.map +1 -1
- package/build/codegen/emit-index.d.ts +5 -1
- package/build/codegen/emit-index.js +4 -5
- package/build/codegen/emit-index.js.map +1 -1
- package/build/codegen/emit-index.test.js +1 -1
- package/build/codegen/emit-index.test.js.map +1 -1
- package/build/codegen/emit-scope.d.ts +10 -1
- package/build/codegen/emit-scope.js +133 -54
- package/build/codegen/emit-scope.js.map +1 -1
- package/build/codegen/emit-scope.test.js +126 -9
- package/build/codegen/emit-scope.test.js.map +1 -1
- package/build/codegen/emit-types.d.ts +29 -0
- package/build/codegen/emit-types.js +79 -8
- package/build/codegen/emit-types.js.map +1 -1
- package/build/codegen/emit-types.test.js +103 -1
- package/build/codegen/emit-types.test.js.map +1 -1
- package/build/codegen/index.d.ts +2 -0
- package/build/codegen/index.js +2 -0
- package/build/codegen/index.js.map +1 -1
- package/build/codegen/pipeline.d.ts +2 -0
- package/build/codegen/pipeline.js +29 -4
- package/build/codegen/pipeline.js.map +1 -1
- package/build/codegen/pipeline.test.js +59 -1
- package/build/codegen/pipeline.test.js.map +1 -1
- package/build/implementations/http/doc-registry.test.js +1 -27
- package/build/implementations/http/doc-registry.test.js.map +1 -1
- package/build/implementations/http/express-rpc/index.js +0 -1
- package/build/implementations/http/express-rpc/index.js.map +1 -1
- package/build/implementations/http/express-rpc/index.test.js +1 -1
- package/build/implementations/http/express-rpc/index.test.js.map +1 -1
- package/build/implementations/http/hono-api/index.js +0 -2
- package/build/implementations/http/hono-api/index.js.map +1 -1
- package/build/implementations/http/hono-api/index.test.js +0 -9
- package/build/implementations/http/hono-api/index.test.js.map +1 -1
- package/build/implementations/http/hono-rpc/index.js +0 -1
- package/build/implementations/http/hono-rpc/index.js.map +1 -1
- package/build/implementations/http/hono-rpc/index.test.js +1 -1
- package/build/implementations/http/hono-rpc/index.test.js.map +1 -1
- package/build/implementations/http/hono-stream/index.js +1 -17
- package/build/implementations/http/hono-stream/index.js.map +1 -1
- package/build/implementations/http/hono-stream/index.test.js +0 -61
- package/build/implementations/http/hono-stream/index.test.js.map +1 -1
- package/build/implementations/http/hono-stream/types.d.ts +13 -4
- package/build/implementations/types.d.ts +0 -5
- package/build/index.js +1 -8
- package/build/index.js.map +1 -1
- package/package.json +2 -12
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { readFile, access } from 'node:fs/promises';
|
|
4
|
+
import { CODEGEN_HEADER } from './constants.js';
|
|
5
|
+
const TYPES_IMPORT = `import type {
|
|
6
|
+
ClientAdapter,
|
|
7
|
+
AdapterRequest,
|
|
8
|
+
AdapterResponse,
|
|
9
|
+
AdapterStreamResponse,
|
|
10
|
+
ClientHooks,
|
|
11
|
+
BeforeRequestContext,
|
|
12
|
+
AfterResponseContext,
|
|
13
|
+
ErrorContext,
|
|
14
|
+
CallDescriptor,
|
|
15
|
+
StreamDescriptor,
|
|
16
|
+
TypedStream,
|
|
17
|
+
ClientInstance,
|
|
18
|
+
ProcedureCallOptions,
|
|
19
|
+
CreateClientConfig,
|
|
20
|
+
} from './_types'`;
|
|
21
|
+
/**
|
|
22
|
+
* Source files to bundle, in dependency order.
|
|
23
|
+
* Each will be read from `src/client/` relative to the package root.
|
|
24
|
+
*/
|
|
25
|
+
const SOURCE_FILES = [
|
|
26
|
+
'errors.ts',
|
|
27
|
+
'request-builder.ts',
|
|
28
|
+
'hooks.ts',
|
|
29
|
+
'call.ts',
|
|
30
|
+
'stream.ts',
|
|
31
|
+
'fetch-adapter.ts',
|
|
32
|
+
'index.ts',
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Strips all `import` statements from source content.
|
|
36
|
+
* These are inter-file imports that become unnecessary in a single bundled file.
|
|
37
|
+
*
|
|
38
|
+
* Note: the regex requires a `from` clause, so side-effect imports like
|
|
39
|
+
* `import './polyfill.js'` are NOT stripped. This is intentional — src/client/
|
|
40
|
+
* has no side-effect imports.
|
|
41
|
+
*/
|
|
42
|
+
function stripImports(content) {
|
|
43
|
+
// Handle both single-line and multi-line import statements
|
|
44
|
+
return content.replace(/^import\s[\s\S]*?from\s+['"][^'"]+['"]\s*;?\s*$/gm, '');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Strips barrel re-export lines from index.ts content:
|
|
48
|
+
* - `export type { ... } from '...'`
|
|
49
|
+
* - `export { ... } from '...'`
|
|
50
|
+
*/
|
|
51
|
+
function stripReExports(content) {
|
|
52
|
+
// `[^}]*` matches across newlines intentionally, handling multi-line export blocks
|
|
53
|
+
return content.replace(/^export\s+(type\s+)?{[^}]*}\s+from\s+['"][^'"]+['"]\s*;?\s*$/gm, '');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Reads all client runtime source files from `src/client/`, strips inter-file
|
|
57
|
+
* imports and barrel re-exports, and returns a single bundled `_client.ts`
|
|
58
|
+
* file content.
|
|
59
|
+
*
|
|
60
|
+
* The output is self-contained and only imports types from the sibling
|
|
61
|
+
* `_types.ts` file.
|
|
62
|
+
*/
|
|
63
|
+
export async function emitClientRuntimeFile() {
|
|
64
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
65
|
+
const __dirname = dirname(__filename);
|
|
66
|
+
// Works from both src/codegen/ (source) and build/codegen/ (compiled)
|
|
67
|
+
const packageRoot = resolve(__dirname, '../..');
|
|
68
|
+
const clientDir = resolve(packageRoot, 'src/client');
|
|
69
|
+
// Verify all source files exist
|
|
70
|
+
for (const file of SOURCE_FILES) {
|
|
71
|
+
const filePath = resolve(clientDir, file);
|
|
72
|
+
await access(filePath).catch(() => {
|
|
73
|
+
throw new Error(`[ts-procedures-codegen] Cannot locate src/client/${file} at expected path: ${filePath}. ` +
|
|
74
|
+
`Ensure ts-procedures is installed correctly.`);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const sections = [];
|
|
78
|
+
for (const file of SOURCE_FILES) {
|
|
79
|
+
const filePath = resolve(clientDir, file);
|
|
80
|
+
let content = await readFile(filePath, 'utf-8');
|
|
81
|
+
// Strip all import statements (inter-file imports)
|
|
82
|
+
content = stripImports(content);
|
|
83
|
+
// For index.ts, also strip barrel re-export lines
|
|
84
|
+
if (file === 'index.ts') {
|
|
85
|
+
content = stripReExports(content);
|
|
86
|
+
// Strip trailing comment-only blocks (e.g., "// ── Barrel exports ─────")
|
|
87
|
+
content = content.replace(/(?:\n\/\/[^\n]*)+\s*$/, '');
|
|
88
|
+
}
|
|
89
|
+
// Collapse runs of 3+ blank lines into 2
|
|
90
|
+
content = content.replace(/\n{3,}/g, '\n\n');
|
|
91
|
+
// Trim leading/trailing whitespace
|
|
92
|
+
content = content.trim();
|
|
93
|
+
if (content.length > 0) {
|
|
94
|
+
sections.push(content);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return [CODEGEN_HEADER, '', TYPES_IMPORT, '', ...sections, ''].join('\n');
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=emit-client-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-client-runtime.js","sourceRoot":"","sources":["../../src/codegen/emit-client-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;kBAeH,CAAA;AAElB;;;GAGG;AACH,MAAM,YAAY,GAAG;IACnB,WAAW;IACX,oBAAoB;IACpB,UAAU;IACV,SAAS;IACT,WAAW;IACX,kBAAkB;IAClB,UAAU;CACF,CAAA;AAEV;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,2DAA2D;IAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,mDAAmD,EAAE,EAAE,CAAC,CAAA;AACjF,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,mFAAmF;IACnF,OAAO,OAAO,CAAC,OAAO,CAAC,gEAAgE,EAAE,EAAE,CAAC,CAAA;AAC9F,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACrC,sEAAsE;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IAEpD,gCAAgC;IAChC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACzC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,IAAI,KAAK,CACb,oDAAoD,IAAI,sBAAsB,QAAQ,IAAI;gBAC1F,8CAA8C,CAC/C,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACzC,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAE/C,mDAAmD;QACnD,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;QAE/B,kDAAkD;QAClD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;YACjC,0EAA0E;YAC1E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAA;QACxD,CAAC;QAED,yCAAyC;QACzC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAE5C,mCAAmC;QACnC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;QAExB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { emitClientRuntimeFile } from './emit-client-runtime.js';
|
|
3
|
+
import { CODEGEN_HEADER } from './constants.js';
|
|
4
|
+
describe('emitClientRuntimeFile', () => {
|
|
5
|
+
it('returns a string', async () => {
|
|
6
|
+
const result = await emitClientRuntimeFile();
|
|
7
|
+
expect(typeof result).toBe('string');
|
|
8
|
+
});
|
|
9
|
+
it('contains the auto-generated header comment', async () => {
|
|
10
|
+
const result = await emitClientRuntimeFile();
|
|
11
|
+
expect(result.startsWith(CODEGEN_HEADER)).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it("imports from './_types' (not './types.js' or 'ts-procedures/client')", async () => {
|
|
14
|
+
const result = await emitClientRuntimeFile();
|
|
15
|
+
expect(result).toContain("from './_types'");
|
|
16
|
+
expect(result).not.toContain("from './types.js'");
|
|
17
|
+
expect(result).not.toContain("from 'ts-procedures/client'");
|
|
18
|
+
});
|
|
19
|
+
it('contains NO inter-file imports from sibling modules', async () => {
|
|
20
|
+
const result = await emitClientRuntimeFile();
|
|
21
|
+
const interFileImports = [
|
|
22
|
+
'./errors.js',
|
|
23
|
+
'./hooks.js',
|
|
24
|
+
'./request-builder.js',
|
|
25
|
+
'./call.js',
|
|
26
|
+
'./stream.js',
|
|
27
|
+
'./fetch-adapter.js',
|
|
28
|
+
];
|
|
29
|
+
for (const mod of interFileImports) {
|
|
30
|
+
expect(result).not.toContain(`from '${mod}'`);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
it('contains export function createClient', async () => {
|
|
34
|
+
const result = await emitClientRuntimeFile();
|
|
35
|
+
expect(result).toMatch(/export function createClient/);
|
|
36
|
+
});
|
|
37
|
+
it('contains export function createFetchAdapter', async () => {
|
|
38
|
+
const result = await emitClientRuntimeFile();
|
|
39
|
+
expect(result).toMatch(/export function createFetchAdapter/);
|
|
40
|
+
});
|
|
41
|
+
it('contains export class ClientRequestError', async () => {
|
|
42
|
+
const result = await emitClientRuntimeFile();
|
|
43
|
+
expect(result).toMatch(/export class ClientRequestError/);
|
|
44
|
+
});
|
|
45
|
+
it('contains export class ClientPathParamError', async () => {
|
|
46
|
+
const result = await emitClientRuntimeFile();
|
|
47
|
+
expect(result).toMatch(/export class ClientPathParamError/);
|
|
48
|
+
});
|
|
49
|
+
it('contains export class ClientStreamError', async () => {
|
|
50
|
+
const result = await emitClientRuntimeFile();
|
|
51
|
+
expect(result).toMatch(/export class ClientStreamError/);
|
|
52
|
+
});
|
|
53
|
+
it('contains export async function executeCall', async () => {
|
|
54
|
+
const result = await emitClientRuntimeFile();
|
|
55
|
+
expect(result).toMatch(/export async function executeCall/);
|
|
56
|
+
});
|
|
57
|
+
it('contains export async function executeStream', async () => {
|
|
58
|
+
const result = await emitClientRuntimeFile();
|
|
59
|
+
expect(result).toMatch(/export async function executeStream/);
|
|
60
|
+
});
|
|
61
|
+
it('contains export function createTypedStream', async () => {
|
|
62
|
+
const result = await emitClientRuntimeFile();
|
|
63
|
+
expect(result).toMatch(/export function createTypedStream/);
|
|
64
|
+
});
|
|
65
|
+
it('contains export interface FetchAdapterConfig', async () => {
|
|
66
|
+
const result = await emitClientRuntimeFile();
|
|
67
|
+
expect(result).toMatch(/export interface FetchAdapterConfig/);
|
|
68
|
+
});
|
|
69
|
+
it('does NOT contain export type { re-export blocks from index.ts barrel', async () => {
|
|
70
|
+
const result = await emitClientRuntimeFile();
|
|
71
|
+
expect(result).not.toMatch(/export type \{[\s\S]*?\} from/);
|
|
72
|
+
});
|
|
73
|
+
it('does NOT contain orphaned "Barrel exports" section comment', async () => {
|
|
74
|
+
const result = await emitClientRuntimeFile();
|
|
75
|
+
expect(result).not.toContain('// ── Barrel exports');
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=emit-client-runtime.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-client-runtime.test.js","sourceRoot":"","sources":["../../src/codegen/emit-client-runtime.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads `src/client/types.ts` from the package root and returns it as the
|
|
3
|
+
* content of a `_types.ts` file, prepended with the auto-generated header.
|
|
4
|
+
*
|
|
5
|
+
* This enables a self-contained codegen mode where consumers don't need
|
|
6
|
+
* `ts-procedures` as a runtime dependency.
|
|
7
|
+
*/
|
|
8
|
+
export declare function emitClientTypesFile(): Promise<string>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { readFile, access } from 'node:fs/promises';
|
|
4
|
+
import { CODEGEN_HEADER } from './constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Reads `src/client/types.ts` from the package root and returns it as the
|
|
7
|
+
* content of a `_types.ts` file, prepended with the auto-generated header.
|
|
8
|
+
*
|
|
9
|
+
* This enables a self-contained codegen mode where consumers don't need
|
|
10
|
+
* `ts-procedures` as a runtime dependency.
|
|
11
|
+
*/
|
|
12
|
+
export async function emitClientTypesFile() {
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = dirname(__filename);
|
|
15
|
+
// Works from both src/codegen/ (source) and build/codegen/ (compiled)
|
|
16
|
+
const packageRoot = resolve(__dirname, '../..');
|
|
17
|
+
const typesPath = resolve(packageRoot, 'src/client/types.ts');
|
|
18
|
+
await access(typesPath).catch(() => {
|
|
19
|
+
throw new Error(`[ts-procedures-codegen] Cannot locate src/client/types.ts at expected path: ${typesPath}. ` +
|
|
20
|
+
`Ensure ts-procedures is installed correctly.`);
|
|
21
|
+
});
|
|
22
|
+
const content = await readFile(typesPath, 'utf-8');
|
|
23
|
+
return [CODEGEN_HEADER, '', content].join('\n');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=emit-client-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-client-types.js","sourceRoot":"","sources":["../../src/codegen/emit-client-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACrC,sEAAsE;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAA;IAC7D,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACjC,MAAM,IAAI,KAAK,CACb,+EAA+E,SAAS,IAAI;YAC5F,8CAA8C,CAC/C,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAClD,OAAO,CAAC,cAAc,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname, resolve } from 'node:path';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { emitClientTypesFile } from './emit-client-types.js';
|
|
6
|
+
import { CODEGEN_HEADER } from './constants.js';
|
|
7
|
+
describe('emitClientTypesFile', () => {
|
|
8
|
+
it('returns a string', async () => {
|
|
9
|
+
const result = await emitClientTypesFile();
|
|
10
|
+
expect(typeof result).toBe('string');
|
|
11
|
+
});
|
|
12
|
+
it('header is first line', async () => {
|
|
13
|
+
const result = await emitClientTypesFile();
|
|
14
|
+
expect(result.startsWith(CODEGEN_HEADER)).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it('no import statements', async () => {
|
|
17
|
+
const result = await emitClientTypesFile();
|
|
18
|
+
// types.ts has zero imports — the emitted file should be fully self-contained
|
|
19
|
+
expect(result).not.toMatch(/^import\s/m);
|
|
20
|
+
});
|
|
21
|
+
it('output content (after header) matches src/client/types.ts verbatim', async () => {
|
|
22
|
+
const result = await emitClientTypesFile();
|
|
23
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
24
|
+
const __dirname = dirname(__filename);
|
|
25
|
+
const packageRoot = resolve(__dirname, '../..');
|
|
26
|
+
const typesPath = resolve(packageRoot, 'src/client/types.ts');
|
|
27
|
+
const typesContent = await readFile(typesPath, 'utf-8');
|
|
28
|
+
// The function prepends CODEGEN_HEADER + '\n' + '\n' before the file content
|
|
29
|
+
const expected = [CODEGEN_HEADER, '', typesContent].join('\n');
|
|
30
|
+
expect(result).toBe(expected);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=emit-client-types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-client-types.test.js","sourceRoot":"","sources":["../../src/codegen/emit-client-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAA;QAC1C,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAA;QAC1C,8EAA8E;QAC9E,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAA;QAE1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAA;QAC7D,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAEvD,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { type AjscOptions } from './emit-types.js';
|
|
2
2
|
import type { ErrorDoc } from '../implementations/types.js';
|
|
3
|
+
export interface EmitErrorsOptions {
|
|
4
|
+
ajsc?: AjscOptions;
|
|
5
|
+
clientImportPath?: string;
|
|
6
|
+
namespaceTypes?: boolean;
|
|
7
|
+
}
|
|
3
8
|
/**
|
|
4
9
|
* Generates a TypeScript file with error type declarations from the DocEnvelope.errors array.
|
|
5
10
|
*
|
|
6
11
|
* Only errors with a `schema` property are included. If no errors have schemas,
|
|
7
12
|
* returns `undefined` (no file generated).
|
|
13
|
+
*
|
|
14
|
+
* When `namespaceTypes` is true, error types are wrapped in `export namespace Errors { ... }`.
|
|
8
15
|
*/
|
|
9
|
-
export declare function emitErrorsFile(errors: ErrorDoc[],
|
|
16
|
+
export declare function emitErrorsFile(errors: ErrorDoc[], options?: EmitErrorsOptions): Promise<string | undefined>;
|
|
@@ -1,30 +1,53 @@
|
|
|
1
|
-
import { jsonSchemaToTypeString } from './emit-types.js';
|
|
1
|
+
import { jsonSchemaToTypeString, jsonSchemaToExtractedTypes } from './emit-types.js';
|
|
2
|
+
import { CODEGEN_HEADER } from './constants.js';
|
|
2
3
|
/**
|
|
3
4
|
* Generates a TypeScript file with error type declarations from the DocEnvelope.errors array.
|
|
4
5
|
*
|
|
5
6
|
* Only errors with a `schema` property are included. If no errors have schemas,
|
|
6
7
|
* returns `undefined` (no file generated).
|
|
8
|
+
*
|
|
9
|
+
* When `namespaceTypes` is true, error types are wrapped in `export namespace Errors { ... }`.
|
|
7
10
|
*/
|
|
8
|
-
export async function emitErrorsFile(errors,
|
|
11
|
+
export async function emitErrorsFile(errors, options) {
|
|
12
|
+
const { ajsc: ajscOpts, namespaceTypes = false } = options ?? {};
|
|
9
13
|
// Filter to only errors that have a schema
|
|
10
14
|
const errorsWithSchema = errors.filter((e) => e.schema != null);
|
|
11
15
|
if (errorsWithSchema.length === 0) {
|
|
12
16
|
return undefined;
|
|
13
17
|
}
|
|
14
18
|
const typeLines = [];
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
if (namespaceTypes) {
|
|
20
|
+
typeLines.push('export namespace Errors {');
|
|
21
|
+
for (const error of errorsWithSchema) {
|
|
22
|
+
const result = await jsonSchemaToExtractedTypes(error.schema, ajscOpts);
|
|
23
|
+
if (result != null) {
|
|
24
|
+
typeLines.push(` /** ${error.description} (HTTP ${error.statusCode}) */`);
|
|
25
|
+
for (const decl of result.declarations) {
|
|
26
|
+
typeLines.push(` ${decl}`);
|
|
27
|
+
}
|
|
28
|
+
typeLines.push(` export type ${error.name} = ${result.body}`);
|
|
29
|
+
typeLines.push('');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const unionMembers = errorsWithSchema.map((e) => e.name).join(' | ');
|
|
33
|
+
typeLines.push(` export type ProcedureErrorUnion = ${unionMembers}`);
|
|
34
|
+
typeLines.push('}');
|
|
35
|
+
typeLines.push('');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
for (const error of errorsWithSchema) {
|
|
39
|
+
const typeDecl = await jsonSchemaToTypeString(error.name, error.schema, ajscOpts);
|
|
40
|
+
if (typeDecl != null) {
|
|
41
|
+
typeLines.push(`/** ${error.description} (HTTP ${error.statusCode}) */`);
|
|
42
|
+
typeLines.push(typeDecl);
|
|
43
|
+
typeLines.push('');
|
|
44
|
+
}
|
|
21
45
|
}
|
|
46
|
+
const unionMembers = errorsWithSchema.map((e) => e.name).join(' | ');
|
|
47
|
+
typeLines.push(`export type ProcedureErrorUnion = ${unionMembers}`);
|
|
48
|
+
typeLines.push('');
|
|
22
49
|
}
|
|
23
|
-
// Discriminated union of all error types
|
|
24
|
-
const unionMembers = errorsWithSchema.map((e) => e.name).join(' | ');
|
|
25
|
-
typeLines.push(`export type ProcedureErrorUnion = ${unionMembers}`);
|
|
26
|
-
typeLines.push('');
|
|
27
50
|
const body = typeLines.join('\n');
|
|
28
|
-
return [
|
|
51
|
+
return [CODEGEN_HEADER, '', body].join('\n');
|
|
29
52
|
}
|
|
30
53
|
//# sourceMappingURL=emit-errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit-errors.js","sourceRoot":"","sources":["../../src/codegen/emit-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"emit-errors.js","sourceRoot":"","sources":["../../src/codegen/emit-errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -102,9 +102,37 @@ describe('emitErrorsFile', () => {
|
|
|
102
102
|
});
|
|
103
103
|
it('respects ajscOpts passed to jsonSchemaToTypeString', async () => {
|
|
104
104
|
// Just verify it does not crash when options are passed — behavior is tested in emit-types.test.ts
|
|
105
|
-
const result = await emitErrorsFile([procedureErrorDoc], { enumStyle: 'union' });
|
|
105
|
+
const result = await emitErrorsFile([procedureErrorDoc], { ajsc: { enumStyle: 'union' } });
|
|
106
106
|
expect(result).toBeDefined();
|
|
107
107
|
expect(result).toContain('export type ProcedureError =');
|
|
108
108
|
});
|
|
109
|
+
describe('namespaceTypes', () => {
|
|
110
|
+
it('wraps error types in export namespace Errors', async () => {
|
|
111
|
+
const result = await emitErrorsFile([procedureErrorDoc, validationErrorDoc], { namespaceTypes: true });
|
|
112
|
+
expect(result).toBeDefined();
|
|
113
|
+
expect(result).toContain('export namespace Errors {');
|
|
114
|
+
expect(result).toContain('export type ProcedureError =');
|
|
115
|
+
expect(result).toContain('export type ProcedureValidationError =');
|
|
116
|
+
});
|
|
117
|
+
it('places union inside the namespace', async () => {
|
|
118
|
+
const result = await emitErrorsFile([procedureErrorDoc, validationErrorDoc], { namespaceTypes: true });
|
|
119
|
+
expect(result).toBeDefined();
|
|
120
|
+
expect(result).toContain('export type ProcedureErrorUnion = ProcedureError | ProcedureValidationError');
|
|
121
|
+
// Union should be inside the namespace (indented)
|
|
122
|
+
const lines = result.split('\n');
|
|
123
|
+
const unionLine = lines.find((l) => l.includes('ProcedureErrorUnion'));
|
|
124
|
+
expect(unionLine).toMatch(/^\s+export type ProcedureErrorUnion/);
|
|
125
|
+
});
|
|
126
|
+
it('includes JSDoc inside namespace', async () => {
|
|
127
|
+
const result = await emitErrorsFile([procedureErrorDoc], { namespaceTypes: true });
|
|
128
|
+
expect(result).toBeDefined();
|
|
129
|
+
expect(result).toContain('(HTTP 500)');
|
|
130
|
+
});
|
|
131
|
+
it('flat mode does not wrap in namespace', async () => {
|
|
132
|
+
const result = await emitErrorsFile([procedureErrorDoc], { namespaceTypes: false });
|
|
133
|
+
expect(result).toBeDefined();
|
|
134
|
+
expect(result).not.toContain('export namespace Errors');
|
|
135
|
+
});
|
|
136
|
+
});
|
|
109
137
|
});
|
|
110
138
|
//# sourceMappingURL=emit-errors.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit-errors.test.js","sourceRoot":"","sources":["../../src/codegen/emit-errors.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"emit-errors.test.js","sourceRoot":"","sources":["../../src/codegen/emit-errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { ScopeGroup } from './group-routes.js';
|
|
2
|
+
export interface EmitIndexOptions {
|
|
3
|
+
clientImportPath?: string;
|
|
4
|
+
hasErrors?: boolean;
|
|
5
|
+
}
|
|
2
6
|
/**
|
|
3
7
|
* Generates a barrel index file that re-exports all scope files and provides
|
|
4
8
|
* a `createScopeBindings` factory function.
|
|
5
9
|
*/
|
|
6
|
-
export declare function emitIndexFile(groups: ScopeGroup[],
|
|
10
|
+
export declare function emitIndexFile(groups: ScopeGroup[], options?: EmitIndexOptions): string;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CODEGEN_HEADER } from './constants.js';
|
|
1
2
|
// ---------------------------------------------------------------------------
|
|
2
3
|
// Helpers
|
|
3
4
|
// ---------------------------------------------------------------------------
|
|
@@ -12,14 +13,12 @@ function toPascalCase(str) {
|
|
|
12
13
|
function bindFunctionName(camelCase) {
|
|
13
14
|
return `bind${toPascalCase(camelCase)}Scope`;
|
|
14
15
|
}
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// emitIndexFile
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
16
|
/**
|
|
19
17
|
* Generates a barrel index file that re-exports all scope files and provides
|
|
20
18
|
* a `createScopeBindings` factory function.
|
|
21
19
|
*/
|
|
22
|
-
export function emitIndexFile(groups,
|
|
20
|
+
export function emitIndexFile(groups, options) {
|
|
21
|
+
const { clientImportPath = 'ts-procedures/client', hasErrors = false } = options ?? {};
|
|
23
22
|
const bindImports = groups
|
|
24
23
|
.map((g) => `import { ${bindFunctionName(g.camelCase)} } from './${g.scopeKey}'`)
|
|
25
24
|
.join('\n');
|
|
@@ -32,7 +31,7 @@ export function emitIndexFile(groups, clientImportPath = 'ts-procedures/client',
|
|
|
32
31
|
.map((g) => ` ${g.camelCase}: ${bindFunctionName(g.camelCase)}(client),`)
|
|
33
32
|
.join('\n');
|
|
34
33
|
return [
|
|
35
|
-
|
|
34
|
+
CODEGEN_HEADER,
|
|
36
35
|
`import type { ClientInstance } from '${clientImportPath}'`,
|
|
37
36
|
bindImports,
|
|
38
37
|
'',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit-index.js","sourceRoot":"","sources":["../../src/codegen/emit-index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"emit-index.js","sourceRoot":"","sources":["../../src/codegen/emit-index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,oFAAoF;AACpF,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG;SACP,KAAK,CAAC,UAAU,CAAC;SACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,wEAAwE;AACxE,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,OAAO,YAAY,CAAC,SAAS,CAAC,OAAO,CAAA;AAC9C,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,OAA0B;IAC5E,MAAM,EAAE,gBAAgB,GAAG,sBAAsB,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;IACtF,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,GAAG,CAAC;SAChF,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,cAAc,GAAG,MAAM;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,GAAG,CAAC;SAC7C,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnE,MAAM,SAAS,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE7E,MAAM,aAAa,GAAG,MAAM;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;SAC3E,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;QACL,cAAc;QACd,wCAAwC,gBAAgB,GAAG;QAC3D,WAAW;QACX,EAAE;QACF,SAAS;QACT,EAAE;QACF,+DAA+D;QAC/D,YAAY;QACZ,aAAa;QACb,KAAK;QACL,GAAG;QACH,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|
|
@@ -70,7 +70,7 @@ describe('emitIndexFile', () => {
|
|
|
70
70
|
});
|
|
71
71
|
describe('clientImportPath', () => {
|
|
72
72
|
it('uses custom clientImportPath in import statement', () => {
|
|
73
|
-
const output = emitIndexFile([usersGroup], '@my-app/client');
|
|
73
|
+
const output = emitIndexFile([usersGroup], { clientImportPath: '@my-app/client' });
|
|
74
74
|
expect(output).toContain("import type { ClientInstance } from '@my-app/client'");
|
|
75
75
|
expect(output).not.toContain("from 'ts-procedures/client'");
|
|
76
76
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit-index.test.js","sourceRoot":"","sources":["../../src/codegen/emit-index.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"emit-index.test.js","sourceRoot":"","sources":["../../src/codegen/emit-index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { ScopeGroup } from './group-routes.js';
|
|
2
2
|
import { type AjscOptions } from './emit-types.js';
|
|
3
|
+
export interface EmitScopeOptions {
|
|
4
|
+
ajsc?: AjscOptions;
|
|
5
|
+
clientImportPath?: string;
|
|
6
|
+
namespaceTypes?: boolean;
|
|
7
|
+
}
|
|
3
8
|
/**
|
|
4
9
|
* Generates a complete TypeScript scope file for a ScopeGroup.
|
|
10
|
+
*
|
|
11
|
+
* When `namespaceTypes` is true, types are wrapped in nested TypeScript namespaces
|
|
12
|
+
* and ajsc runs with `inlineTypes: false` so formatting options (enumStyle, depluralize,
|
|
13
|
+
* jsdoc, etc.) produce extracted sub-types inside each namespace.
|
|
5
14
|
*/
|
|
6
|
-
export declare function emitScopeFile(group: ScopeGroup,
|
|
15
|
+
export declare function emitScopeFile(group: ScopeGroup, options?: EmitScopeOptions): Promise<string>;
|