@ts-pf/codegen 0.1.0-beta.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 +96 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +232 -0
- package/dist/cli.js.map +1 -0
- package/dist/emit.d.ts +11 -0
- package/dist/emit.d.ts.map +1 -0
- package/dist/emit.js +147 -0
- package/dist/emit.js.map +1 -0
- package/dist/hash.d.ts +3 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +21 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/names.d.ts +6 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +73 -0
- package/dist/names.js.map +1 -0
- package/dist/phantom.d.ts +2 -0
- package/dist/phantom.d.ts.map +1 -0
- package/dist/phantom.js +9 -0
- package/dist/phantom.js.map +1 -0
- package/dist/print-type.d.ts +11 -0
- package/dist/print-type.d.ts.map +1 -0
- package/dist/print-type.js +390 -0
- package/dist/print-type.js.map +1 -0
- package/dist/tree.d.ts +12 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +45 -0
- package/dist/tree.js.map +1 -0
- package/package.json +56 -0
- package/skills/ts-pf-codegen/SKILL.md +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# @ts-pf/codegen
|
|
2
|
+
|
|
3
|
+
Print a nested `Contract` `.d.ts` from a `@ts-pf/docs` `catalog()`. The frontend uses today's `createClient<Contract>(link)` — no second runtime, no `as typeof contract`, no `tsc --dts` of the backend.
|
|
4
|
+
|
|
5
|
+
Agent skill: [`skills/ts-pf-codegen/`](skills/ts-pf-codegen/). Sync with `npx skills experimental_sync -y`.
|
|
6
|
+
|
|
7
|
+
Types never come from `fetch()` or `JSON.parse` casts. The catalog is the spec; the `.d.ts` is the TypeScript contract.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { catalog } from '@ts-pf/docs'
|
|
11
|
+
import { emit } from '@ts-pf/codegen'
|
|
12
|
+
import { writeFileSync } from 'node:fs'
|
|
13
|
+
|
|
14
|
+
const spec = catalog(contract, { prefix: '/rpc' })
|
|
15
|
+
writeFileSync('catalog.json', JSON.stringify(spec, null, 2))
|
|
16
|
+
writeFileSync('contract.d.ts', emit(spec))
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { asResult, createClient } from '@ts-pf/client'
|
|
21
|
+
import { FetchLink } from '@ts-pf/client-http'
|
|
22
|
+
import type { Contract } from './contract.js'
|
|
23
|
+
|
|
24
|
+
const client = createClient<Contract>(new FetchLink({ url: '/rpc' }))
|
|
25
|
+
await client.planet.find({ id: 1 })
|
|
26
|
+
|
|
27
|
+
const result = await asResult(client.planet.find({ id: 1 }))
|
|
28
|
+
if (!result.ok && result.error.code === 'NOT_FOUND') {
|
|
29
|
+
result.error.data.id
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## `emit` / `catalogHash`
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { emit, catalogHash, type EmitOptions } from '@ts-pf/codegen'
|
|
37
|
+
|
|
38
|
+
emit(catalog, {
|
|
39
|
+
name: 'Contract', // default
|
|
40
|
+
failOnUnavailable: false, // default; true throws on kind: 'unavailable'
|
|
41
|
+
banner: true, // catalogVersion + sha256 hash
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
catalogHash(catalog) // 'sha256:<hex>' of canonical JSON
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Generated procedures are `ContractProcedure<I, O, E>` with Phantom Standard Schema leaves so `InferErrorData` / `asResult` still narrow `error.code === 'NOT_FOUND'`. Protocol errors stay out of the generated error map (`ClientError` already unions them). No-input is `void`. Streams are `AsyncIterable<Item>`.
|
|
48
|
+
|
|
49
|
+
The generated file uses `import type { ContractProcedure } from '@ts-pf/contract'`. This package does not import contract at runtime.
|
|
50
|
+
|
|
51
|
+
## CLI
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
ts-pf-codegen emit <catalog.json|-> [-o contract.d.ts] [--name Contract] [--fail-on-unavailable]
|
|
55
|
+
ts-pf-codegen pull <url> [-o contract.d.ts] [--lock catalog.lock.json]
|
|
56
|
+
ts-pf-codegen hash <catalog.json|->
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`emit` and `hash` read stdin when the path is `-`. Omit `-o` to write the `.d.ts` to stdout.
|
|
60
|
+
|
|
61
|
+
Commit `contract.d.ts`, or CI-run `ts-pf-codegen pull` and pin `catalog.lock.json`:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"url": "https://api.example.com/catalog.json",
|
|
66
|
+
"catalogVersion": 1,
|
|
67
|
+
"catalogHash": "sha256:…"
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Mismatch on pull exits non-zero. No registry in v1.
|
|
72
|
+
|
|
73
|
+
## Serve the catalog in userland
|
|
74
|
+
|
|
75
|
+
Do **not** put this on `FetchHandler`. A GET under `/rpc/...` is a procedure miss / `METHOD_NOT_ALLOWED`, not a spec.
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
// Userland — not FetchHandler, not @ts-pf/codegen:
|
|
79
|
+
if (url.pathname === '/catalog.json') {
|
|
80
|
+
return Response.json(catalog(contract, { prefix: '/rpc' }))
|
|
81
|
+
}
|
|
82
|
+
const result = await handler.handle(req, { prefix: '/rpc', context })
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Not in this package
|
|
86
|
+
|
|
87
|
+
- `createClientFromCatalog`
|
|
88
|
+
- Folding into `@ts-pf/client` or `@ts-pf/docs`
|
|
89
|
+
- OpenAPI-TS as the typed client (use `@ts-pf/openapi` for the polyglot export)
|
|
90
|
+
- Type-level `FromSchema` over imported JSON
|
|
91
|
+
- `tsc --dts` of the live router
|
|
92
|
+
- Serving catalog from FetchHandler
|
|
93
|
+
- Auth on `pull` (later)
|
|
94
|
+
- A schema registry
|
|
95
|
+
|
|
96
|
+
The catalog is the portable spec. [`@ts-pf/openapi`](../openapi) remains the polyglot OpenAPI 3.1 export.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export type CliIo = {
|
|
3
|
+
stdin: {
|
|
4
|
+
read: () => Promise<string>;
|
|
5
|
+
};
|
|
6
|
+
stdout: {
|
|
7
|
+
write: (chunk: string) => void;
|
|
8
|
+
};
|
|
9
|
+
stderr: {
|
|
10
|
+
write: (chunk: string) => void;
|
|
11
|
+
};
|
|
12
|
+
readFile: (path: string) => Promise<string>;
|
|
13
|
+
writeFile: (path: string, content: string) => Promise<void>;
|
|
14
|
+
fetch: typeof fetch;
|
|
15
|
+
};
|
|
16
|
+
export declare function runCli(argv: string[], io: CliIo): Promise<number>;
|
|
17
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAaA,MAAM,MAAM,KAAK,GAAG;IAClB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,CAAA;IACtC,MAAM,EAAE;QAAE,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;IAC1C,MAAM,EAAE;QAAE,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;IAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,KAAK,EAAE,OAAO,KAAK,CAAA;CACpB,CAAA;AAQD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { stderr as nodeStderr, stdin as nodeStdin, stdout as nodeStdout, } from 'node:process';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { emit } from './emit.js';
|
|
7
|
+
import { catalogHash } from './hash.js';
|
|
8
|
+
const USAGE = 'Usage: ts-pf-codegen <emit|pull|hash> …\n' +
|
|
9
|
+
' ts-pf-codegen emit <catalog.json> [-o contract.d.ts] [--name Contract] [--fail-on-unavailable]\n' +
|
|
10
|
+
' ts-pf-codegen pull <url> [-o contract.d.ts] [--lock catalog.lock.json]\n' +
|
|
11
|
+
' ts-pf-codegen hash <catalog.json>\n';
|
|
12
|
+
export async function runCli(argv, io) {
|
|
13
|
+
const [cmd, ...rest] = argv;
|
|
14
|
+
if (cmd === 'emit') {
|
|
15
|
+
return emitCmd(rest, io);
|
|
16
|
+
}
|
|
17
|
+
if (cmd === 'pull') {
|
|
18
|
+
return pullCmd(rest, io);
|
|
19
|
+
}
|
|
20
|
+
if (cmd === 'hash') {
|
|
21
|
+
return hashCmd(rest, io);
|
|
22
|
+
}
|
|
23
|
+
io.stderr.write(USAGE);
|
|
24
|
+
return 1;
|
|
25
|
+
}
|
|
26
|
+
async function emitCmd(args, io) {
|
|
27
|
+
const parsed = parseArgs(args, {
|
|
28
|
+
flags: new Set(['fail-on-unavailable']),
|
|
29
|
+
values: new Set(['o', 'name']),
|
|
30
|
+
});
|
|
31
|
+
const input = parsed.positional[0];
|
|
32
|
+
if (input === undefined) {
|
|
33
|
+
io.stderr.write('emit: missing catalog path (use - for stdin)\n');
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
const raw = await readInput(input, io);
|
|
37
|
+
const catalog = parseCatalog(raw);
|
|
38
|
+
const name = typeof parsed.values.name === 'string' ? parsed.values.name : undefined;
|
|
39
|
+
const dts = emit(catalog, {
|
|
40
|
+
...(name !== undefined ? { name } : {}),
|
|
41
|
+
failOnUnavailable: parsed.flags.has('fail-on-unavailable'),
|
|
42
|
+
});
|
|
43
|
+
return writeOutput(dts, parsed.values.o, io);
|
|
44
|
+
}
|
|
45
|
+
async function pullCmd(args, io) {
|
|
46
|
+
const parsed = parseArgs(args, {
|
|
47
|
+
flags: new Set(),
|
|
48
|
+
values: new Set(['o', 'lock']),
|
|
49
|
+
});
|
|
50
|
+
const url = parsed.positional[0];
|
|
51
|
+
if (url === undefined) {
|
|
52
|
+
io.stderr.write('pull: missing catalog url\n');
|
|
53
|
+
return 1;
|
|
54
|
+
}
|
|
55
|
+
const response = await io.fetch(url);
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
io.stderr.write(`pull: GET ${url} failed (${String(response.status)})\n`);
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
const raw = await response.text();
|
|
61
|
+
const catalog = parseCatalog(raw);
|
|
62
|
+
const hash = catalogHash(catalog);
|
|
63
|
+
const lockPath = parsed.values.lock;
|
|
64
|
+
if (typeof lockPath === 'string') {
|
|
65
|
+
let existing;
|
|
66
|
+
try {
|
|
67
|
+
existing = await io.readFile(lockPath);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
existing = undefined;
|
|
71
|
+
}
|
|
72
|
+
if (existing !== undefined) {
|
|
73
|
+
const lock = parseLock(existing);
|
|
74
|
+
if (lock.catalogHash !== hash) {
|
|
75
|
+
io.stderr.write(`pull: catalog hash mismatch\n lock: ${lock.catalogHash}\n got: ${hash}\n`);
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const lock = {
|
|
81
|
+
url,
|
|
82
|
+
catalogVersion: catalog.catalogVersion,
|
|
83
|
+
catalogHash: hash,
|
|
84
|
+
};
|
|
85
|
+
await io.writeFile(`${lockPath}`, `${JSON.stringify(lock, null, 2)}\n`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const dts = emit(catalog);
|
|
89
|
+
return writeOutput(dts, parsed.values.o, io);
|
|
90
|
+
}
|
|
91
|
+
async function hashCmd(args, io) {
|
|
92
|
+
const parsed = parseArgs(args, { flags: new Set(), values: new Set() });
|
|
93
|
+
const input = parsed.positional[0];
|
|
94
|
+
if (input === undefined) {
|
|
95
|
+
io.stderr.write('hash: missing catalog path (use - for stdin)\n');
|
|
96
|
+
return 1;
|
|
97
|
+
}
|
|
98
|
+
const raw = await readInput(input, io);
|
|
99
|
+
const catalog = parseCatalog(raw);
|
|
100
|
+
io.stdout.write(`${catalogHash(catalog)}\n`);
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
async function readInput(path, io) {
|
|
104
|
+
if (path === '-') {
|
|
105
|
+
return io.stdin.read();
|
|
106
|
+
}
|
|
107
|
+
return io.readFile(path);
|
|
108
|
+
}
|
|
109
|
+
async function writeOutput(content, output, io) {
|
|
110
|
+
if (typeof output === 'string') {
|
|
111
|
+
await io.writeFile(output, content);
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
io.stdout.write(content);
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
function parseCatalog(raw) {
|
|
118
|
+
let value;
|
|
119
|
+
try {
|
|
120
|
+
value = JSON.parse(raw);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const message = error instanceof Error ? error.message : 'invalid JSON';
|
|
124
|
+
throw new Error(`catalog is not JSON: ${message}`);
|
|
125
|
+
}
|
|
126
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
127
|
+
throw new Error('catalog must be a JSON object');
|
|
128
|
+
}
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
function parseLock(raw) {
|
|
132
|
+
let value;
|
|
133
|
+
try {
|
|
134
|
+
value = JSON.parse(raw);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new Error('lockfile is not JSON');
|
|
138
|
+
}
|
|
139
|
+
if (typeof value !== 'object' ||
|
|
140
|
+
value === null ||
|
|
141
|
+
!('catalogHash' in value) ||
|
|
142
|
+
typeof value.catalogHash !== 'string') {
|
|
143
|
+
throw new Error('lockfile missing catalogHash');
|
|
144
|
+
}
|
|
145
|
+
return { catalogHash: value.catalogHash };
|
|
146
|
+
}
|
|
147
|
+
function parseArgs(args, spec) {
|
|
148
|
+
const positional = [];
|
|
149
|
+
const flags = new Set();
|
|
150
|
+
const values = {};
|
|
151
|
+
for (let i = 0; i < args.length; i++) {
|
|
152
|
+
const arg = args[i];
|
|
153
|
+
if (arg === undefined) {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
if (arg === '--') {
|
|
157
|
+
positional.push(...args.slice(i + 1));
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
if (arg.startsWith('--')) {
|
|
161
|
+
const eq = arg.indexOf('=');
|
|
162
|
+
const name = eq === -1 ? arg.slice(2) : arg.slice(2, eq);
|
|
163
|
+
if (spec.flags.has(name)) {
|
|
164
|
+
flags.add(name);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (spec.values.has(name)) {
|
|
168
|
+
const value = eq === -1 ? args[++i] : arg.slice(eq + 1);
|
|
169
|
+
if (value === undefined) {
|
|
170
|
+
throw new Error(`missing value for --${name}`);
|
|
171
|
+
}
|
|
172
|
+
values[name] = value;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
throw new Error(`unknown option --${name}`);
|
|
176
|
+
}
|
|
177
|
+
if (arg === '-o') {
|
|
178
|
+
const value = args[++i];
|
|
179
|
+
if (value === undefined) {
|
|
180
|
+
throw new Error('missing value for -o');
|
|
181
|
+
}
|
|
182
|
+
values.o = value;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (arg.startsWith('-') && arg !== '-') {
|
|
186
|
+
throw new Error(`unknown option ${arg}`);
|
|
187
|
+
}
|
|
188
|
+
positional.push(arg);
|
|
189
|
+
}
|
|
190
|
+
return { positional, flags, values };
|
|
191
|
+
}
|
|
192
|
+
async function readStdin() {
|
|
193
|
+
const chunks = [];
|
|
194
|
+
for await (const chunk of nodeStdin) {
|
|
195
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
196
|
+
}
|
|
197
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
198
|
+
}
|
|
199
|
+
function isMain() {
|
|
200
|
+
const argv1 = process.argv[1];
|
|
201
|
+
if (argv1 === undefined) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
return fileURLToPath(import.meta.url) === resolve(argv1);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async function main() {
|
|
212
|
+
const io = {
|
|
213
|
+
stdin: { read: readStdin },
|
|
214
|
+
stdout: { write: (chunk) => nodeStdout.write(chunk) },
|
|
215
|
+
stderr: { write: (chunk) => nodeStderr.write(chunk) },
|
|
216
|
+
readFile: (path) => readFile(path, 'utf8'),
|
|
217
|
+
writeFile: (path, content) => writeFile(path, content, 'utf8'),
|
|
218
|
+
fetch,
|
|
219
|
+
};
|
|
220
|
+
try {
|
|
221
|
+
process.exitCode = await runCli(process.argv.slice(2), io);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
225
|
+
nodeStderr.write(`${message}\n`);
|
|
226
|
+
process.exitCode = 1;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (isMain()) {
|
|
230
|
+
void main();
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/emit.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProcedureCatalog } from '@ts-pf/docs';
|
|
2
|
+
export type EmitOptions = {
|
|
3
|
+
/** Type name. Default `Contract`. */
|
|
4
|
+
name?: string;
|
|
5
|
+
/** Throw if any input/output/error data is `unavailable`. Default false. */
|
|
6
|
+
failOnUnavailable?: boolean;
|
|
7
|
+
/** Default true. Header comment with catalogVersion + catalogHash. */
|
|
8
|
+
banner?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function emit(catalog: ProcedureCatalog, options?: EmitOptions): string;
|
|
11
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,gBAAgB,EACjB,MAAM,aAAa,CAAA;AAOpB,MAAM,MAAM,WAAW,GAAG;IACxB,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,wBAAgB,IAAI,CAClB,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,WAAgB,GACxB,MAAM,CAqCR"}
|
package/dist/emit.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { catalogHash } from './hash.js';
|
|
2
|
+
import { aliasName, pascalCase, quoteKey, quoteString } from './names.js';
|
|
3
|
+
import { PHANTOM_SOURCE } from './phantom.js';
|
|
4
|
+
import { printJsonSchema } from './print-type.js';
|
|
5
|
+
import { buildTree } from './tree.js';
|
|
6
|
+
export function emit(catalog, options = {}) {
|
|
7
|
+
if (catalog.catalogVersion !== 1) {
|
|
8
|
+
throw new Error(`Unsupported catalogVersion: ${String(catalog.catalogVersion)}`);
|
|
9
|
+
}
|
|
10
|
+
if (!Array.isArray(catalog.procedures)) {
|
|
11
|
+
throw new Error('catalog.procedures must be an array');
|
|
12
|
+
}
|
|
13
|
+
const name = options.name ?? 'Contract';
|
|
14
|
+
const failOnUnavailable = options.failOnUnavailable ?? false;
|
|
15
|
+
const banner = options.banner ?? true;
|
|
16
|
+
const aliases = [];
|
|
17
|
+
const tree = buildTree(catalog.procedures);
|
|
18
|
+
const body = printNamespace(tree, aliases, failOnUnavailable);
|
|
19
|
+
const lines = [];
|
|
20
|
+
if (banner) {
|
|
21
|
+
lines.push('/**');
|
|
22
|
+
lines.push(' * Generated by @ts-pf/codegen. Do not edit.');
|
|
23
|
+
lines.push(` * catalogVersion: ${String(catalog.catalogVersion)}`);
|
|
24
|
+
lines.push(` * catalogHash: ${catalogHash(catalog)}`);
|
|
25
|
+
lines.push(' */');
|
|
26
|
+
lines.push('');
|
|
27
|
+
}
|
|
28
|
+
lines.push("import type { ContractProcedure } from '@ts-pf/contract'");
|
|
29
|
+
lines.push('');
|
|
30
|
+
lines.push(PHANTOM_SOURCE);
|
|
31
|
+
lines.push('');
|
|
32
|
+
for (const alias of aliases) {
|
|
33
|
+
lines.push(`type ${alias.name} = ${alias.ts}`);
|
|
34
|
+
lines.push('');
|
|
35
|
+
}
|
|
36
|
+
lines.push(`export type ${name} = ${body}`);
|
|
37
|
+
lines.push('');
|
|
38
|
+
return lines.join('\n');
|
|
39
|
+
}
|
|
40
|
+
function printNamespace(tree, aliases, failOnUnavailable) {
|
|
41
|
+
const lines = ['{'];
|
|
42
|
+
for (const [key, node] of tree) {
|
|
43
|
+
const value = node.kind === 'proc'
|
|
44
|
+
? printProcedure(node.proc, aliases, failOnUnavailable)
|
|
45
|
+
: printNamespace(node.children, aliases, failOnUnavailable);
|
|
46
|
+
const valueLines = value.split('\n');
|
|
47
|
+
lines.push(` ${quoteKey(key)}: ${valueLines[0]}`);
|
|
48
|
+
for (const line of valueLines.slice(1)) {
|
|
49
|
+
lines.push(` ${line}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
lines.push('}');
|
|
53
|
+
return lines.join('\n');
|
|
54
|
+
}
|
|
55
|
+
function printProcedure(proc, aliases, failOnUnavailable) {
|
|
56
|
+
const input = printSlot(proc.input, {
|
|
57
|
+
path: proc.path,
|
|
58
|
+
suffix: 'Input',
|
|
59
|
+
missing: 'void',
|
|
60
|
+
slot: 'input',
|
|
61
|
+
aliases,
|
|
62
|
+
failOnUnavailable,
|
|
63
|
+
});
|
|
64
|
+
const output = printSlot(proc.output, {
|
|
65
|
+
path: proc.path,
|
|
66
|
+
suffix: 'Output',
|
|
67
|
+
missing: 'unknown',
|
|
68
|
+
slot: 'output',
|
|
69
|
+
aliases,
|
|
70
|
+
failOnUnavailable,
|
|
71
|
+
});
|
|
72
|
+
const errors = printErrorMap(proc.errors, proc.path, aliases, failOnUnavailable);
|
|
73
|
+
const args = errors === undefined ? [input, output] : [input, output, errors];
|
|
74
|
+
const compact = args.every((arg) => !arg.includes('\n'));
|
|
75
|
+
if (compact) {
|
|
76
|
+
return `ContractProcedure<${args.join(', ')}>`;
|
|
77
|
+
}
|
|
78
|
+
return `ContractProcedure<\n${args.map((arg) => indentLines(arg, 1)).join(',\n')}\n>`;
|
|
79
|
+
}
|
|
80
|
+
function printErrorMap(errors, path, aliases, failOnUnavailable) {
|
|
81
|
+
if (errors.length === 0) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
const fields = [];
|
|
85
|
+
for (const err of errors) {
|
|
86
|
+
const body = [];
|
|
87
|
+
if (err.status !== undefined) {
|
|
88
|
+
body.push(`status: ${String(err.status)}`);
|
|
89
|
+
}
|
|
90
|
+
if (err.message !== undefined) {
|
|
91
|
+
body.push(`message: ${quoteString(err.message)}`);
|
|
92
|
+
}
|
|
93
|
+
if (err.data !== undefined) {
|
|
94
|
+
const data = printSlot(err.data, {
|
|
95
|
+
path,
|
|
96
|
+
suffix: `Error${pascalCase(err.code)}`,
|
|
97
|
+
missing: 'unknown',
|
|
98
|
+
slot: `error ${err.code} data`,
|
|
99
|
+
aliases,
|
|
100
|
+
failOnUnavailable,
|
|
101
|
+
});
|
|
102
|
+
body.push(`data: Phantom<${data}>`);
|
|
103
|
+
}
|
|
104
|
+
const def = body.length === 0
|
|
105
|
+
? '{}'
|
|
106
|
+
: `{\n${body.map((line) => ` ${line}`).join('\n')}\n}`;
|
|
107
|
+
const defLines = def.split('\n');
|
|
108
|
+
fields.push(`${quoteKey(err.code)}: ${defLines[0]}`);
|
|
109
|
+
for (const line of defLines.slice(1)) {
|
|
110
|
+
fields.push(line);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return `{\n${fields.map((line) => ` ${line}`).join('\n')}\n}`;
|
|
114
|
+
}
|
|
115
|
+
function printSlot(schema, opts) {
|
|
116
|
+
if (schema === undefined) {
|
|
117
|
+
return opts.missing;
|
|
118
|
+
}
|
|
119
|
+
if (schema.kind === 'unavailable') {
|
|
120
|
+
if (opts.failOnUnavailable) {
|
|
121
|
+
throw new Error(`Unavailable schema at ${opts.path.join('/')} ${opts.slot}: ${schema.reason}`);
|
|
122
|
+
}
|
|
123
|
+
return 'unknown';
|
|
124
|
+
}
|
|
125
|
+
if (schema.kind === 'stream') {
|
|
126
|
+
const item = printSlot(schema.item, {
|
|
127
|
+
...opts,
|
|
128
|
+
suffix: `${opts.suffix}Item`,
|
|
129
|
+
missing: 'unknown',
|
|
130
|
+
slot: `${opts.slot} item`,
|
|
131
|
+
});
|
|
132
|
+
return `AsyncIterable<${item}>`;
|
|
133
|
+
}
|
|
134
|
+
const printed = printJsonSchema(schema.jsonSchema, {
|
|
135
|
+
prefix: aliasName(opts.path, opts.suffix),
|
|
136
|
+
});
|
|
137
|
+
opts.aliases.push(...printed.aliases);
|
|
138
|
+
return printed.ts;
|
|
139
|
+
}
|
|
140
|
+
function indentLines(text, n) {
|
|
141
|
+
const pad = ' '.repeat(n);
|
|
142
|
+
return text
|
|
143
|
+
.split('\n')
|
|
144
|
+
.map((line) => `${pad}${line}`)
|
|
145
|
+
.join('\n');
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=emit.js.map
|
package/dist/emit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"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"}
|
package/dist/hash.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAI7D"}
|
package/dist/hash.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function catalogHash(catalog) {
|
|
3
|
+
const json = JSON.stringify(canonicalize(catalog));
|
|
4
|
+
const hex = createHash('sha256').update(json).digest('hex');
|
|
5
|
+
return `sha256:${hex}`;
|
|
6
|
+
}
|
|
7
|
+
function canonicalize(value) {
|
|
8
|
+
if (value === null || typeof value !== 'object') {
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
if (Array.isArray(value)) {
|
|
12
|
+
return value.map(canonicalize);
|
|
13
|
+
}
|
|
14
|
+
const input = value;
|
|
15
|
+
const output = {};
|
|
16
|
+
for (const key of Object.keys(input).sort()) {
|
|
17
|
+
output[key] = canonicalize(input[key]);
|
|
18
|
+
}
|
|
19
|
+
return output;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=hash.js.map
|
package/dist/hash.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,MAAM,UAAU,WAAW,CAAC,OAAyB;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3D,OAAO,UAAU,GAAG,EAAE,CAAA;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IAChC,CAAC;IACD,MAAM,KAAK,GAAG,KAAgC,CAAA;IAC9C,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
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,KAAK,WAAW,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,IAAI,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/names.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function isIdent(value: string): boolean;
|
|
2
|
+
export declare function quoteKey(value: string): string;
|
|
3
|
+
export declare function quoteString(value: string): string;
|
|
4
|
+
export declare function pascalCase(segment: string): string;
|
|
5
|
+
export declare function aliasName(path: readonly string[], suffix: string): string;
|
|
6
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAmDA,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASlD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGzE"}
|