@procedures/client 0.3.0 → 0.4.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/CHANGELOG.md +29 -0
- package/README.md +16 -6
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapters/http/server/transport.d.ts.map +1 -1
- package/dist/adapters/http/server/transport.js +2 -3
- package/dist/adapters/http/server/transport.js.map +1 -1
- package/dist/adapters/local/client/transport.d.ts.map +1 -1
- package/dist/adapters/local/client/transport.js +4 -2
- package/dist/adapters/local/client/transport.js.map +1 -1
- package/dist/adapters/websocket/client/node.d.ts +30 -0
- package/dist/adapters/websocket/client/node.d.ts.map +1 -0
- package/dist/adapters/websocket/client/node.js +32 -0
- package/dist/adapters/websocket/client/node.js.map +1 -0
- package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
- package/dist/adapters/websocket/client/transport.js +17 -9
- package/dist/adapters/websocket/client/transport.js.map +1 -1
- package/dist/adapters/websocket/client/types.d.ts +3 -2
- package/dist/adapters/websocket/client/types.d.ts.map +1 -1
- package/dist/adapters/websocket/client/types.js.map +1 -1
- package/dist/client/errors/http-errors.d.ts.map +1 -1
- package/dist/client/errors/http-errors.js +6 -0
- package/dist/client/errors/http-errors.js.map +1 -1
- package/dist/client/errors/index.d.ts +1 -1
- package/dist/client/errors/index.js +1 -1
- package/dist/client/errors/registry.d.ts +2 -1
- package/dist/client/errors/registry.d.ts.map +1 -1
- package/dist/client/errors/registry.js +72 -22
- package/dist/client/errors/registry.js.map +1 -1
- package/dist/client/middleware/rate-limit.d.ts.map +1 -1
- package/dist/client/middleware/rate-limit.js +0 -1
- package/dist/client/middleware/rate-limit.js.map +1 -1
- package/dist/client/middleware/timeout.d.ts.map +1 -1
- package/dist/client/middleware/timeout.js +2 -9
- package/dist/client/middleware/timeout.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +11 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +10 -0
- package/dist/node.js.map +1 -0
- package/dist/procedures/core/array.d.ts +1 -1
- package/dist/procedures/core/array.d.ts.map +1 -1
- package/dist/procedures/core/array.js +56 -15
- package/dist/procedures/core/array.js.map +1 -1
- package/dist/procedures/core/index.d.ts.map +1 -1
- package/dist/procedures/core/index.js +9 -2
- package/dist/procedures/core/index.js.map +1 -1
- package/dist/procedures/core/logic.js +1 -1
- package/dist/procedures/core/logic.js.map +1 -1
- package/dist/procedures/core/math.d.ts.map +1 -1
- package/dist/procedures/core/math.js +5 -1
- package/dist/procedures/core/math.js.map +1 -1
- package/dist/procedures/core/meta.d.ts.map +1 -1
- package/dist/procedures/core/meta.js +41 -7
- package/dist/procedures/core/meta.js.map +1 -1
- package/dist/procedures/core/type.d.ts.map +1 -1
- package/dist/procedures/core/type.js +4 -2
- package/dist/procedures/core/type.js.map +1 -1
- package/dist/procedures/discovery.d.ts +4 -6
- package/dist/procedures/discovery.d.ts.map +1 -1
- package/dist/procedures/discovery.js +4 -6
- package/dist/procedures/discovery.js.map +1 -1
- package/dist/procedures/ref.d.ts +4 -2
- package/dist/procedures/ref.d.ts.map +1 -1
- package/dist/procedures/ref.js +2 -1
- package/dist/procedures/ref.js.map +1 -1
- package/dist/protocol.d.ts +9 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +12 -2
- package/dist/protocol.js.map +1 -1
- package/dist/server/procedure-server.d.ts +2 -1
- package/dist/server/procedure-server.d.ts.map +1 -1
- package/dist/server/procedure-server.js +4 -2
- package/dist/server/procedure-server.js.map +1 -1
- package/package.json +5 -4
- package/src/adapters/http/server/transport.ts +2 -3
- package/src/adapters/local/client/transport.ts +4 -2
- package/src/adapters/websocket/client/node.ts +34 -0
- package/src/adapters/websocket/client/transport.ts +20 -9
- package/src/adapters/websocket/client/types.ts +3 -2
- package/src/client/errors/README.md +2 -0
- package/src/client/errors/http-errors.ts +5 -0
- package/src/client/errors/index.ts +1 -1
- package/src/client/errors/registry.ts +79 -22
- package/src/client/middleware/rate-limit.ts +0 -2
- package/src/client/middleware/timeout.ts +2 -9
- package/src/index.ts +4 -0
- package/src/node.ts +11 -0
- package/src/procedures/core/array.ts +53 -16
- package/src/procedures/core/index.ts +9 -2
- package/src/procedures/core/logic.ts +1 -1
- package/src/procedures/core/math.ts +5 -1
- package/src/procedures/core/meta.ts +43 -7
- package/src/procedures/core/type.ts +4 -2
- package/src/procedures/discovery.ts +4 -6
- package/src/procedures/ref.ts +4 -2
- package/src/protocol.ts +13 -2
- package/src/server/procedure-server.ts +4 -2
- package/dist/procedures/cli/announce.d.ts +0 -67
- package/dist/procedures/cli/announce.d.ts.map +0 -1
- package/dist/procedures/cli/announce.js +0 -392
- package/dist/procedures/cli/announce.js.map +0 -1
- package/dist/procedures/cli/discover.d.ts +0 -66
- package/dist/procedures/cli/discover.d.ts.map +0 -1
- package/dist/procedures/cli/discover.js +0 -310
- package/dist/procedures/cli/discover.js.map +0 -1
- package/dist/procedures/cli/index.d.ts +0 -13
- package/dist/procedures/cli/index.d.ts.map +0 -1
- package/dist/procedures/cli/index.js +0 -203
- package/dist/procedures/cli/index.js.map +0 -1
- package/dist/procedures/cli/init.d.ts +0 -17
- package/dist/procedures/cli/init.d.ts.map +0 -1
- package/dist/procedures/cli/init.js +0 -336
- package/dist/procedures/cli/init.js.map +0 -1
- package/src/procedures/cli/announce.ts +0 -470
- package/src/procedures/cli/discover.ts +0 -390
- package/src/procedures/cli/index.ts +0 -231
- package/src/procedures/cli/init.ts +0 -370
|
@@ -1,370 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Library Initialization
|
|
3
|
-
*
|
|
4
|
-
* Scaffolds a new library with procedure support.
|
|
5
|
-
* Creates the necessary file structure and configuration.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import * as fs from "node:fs/promises";
|
|
9
|
-
import * as path from "node:path";
|
|
10
|
-
|
|
11
|
-
// =============================================================================
|
|
12
|
-
// Types
|
|
13
|
-
// =============================================================================
|
|
14
|
-
|
|
15
|
-
export interface InitOptions {
|
|
16
|
-
/** Library name or "." for current directory */
|
|
17
|
-
name: string;
|
|
18
|
-
/** Overwrite existing files */
|
|
19
|
-
force: boolean;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// =============================================================================
|
|
23
|
-
// Templates
|
|
24
|
-
// =============================================================================
|
|
25
|
-
|
|
26
|
-
function getPackageJsonTemplate(name: string): string {
|
|
27
|
-
return `{
|
|
28
|
-
"name": "${name}",
|
|
29
|
-
"version": "1.0.0",
|
|
30
|
-
"description": "Library with client procedures",
|
|
31
|
-
"type": "module",
|
|
32
|
-
"main": "./dist/index.js",
|
|
33
|
-
"types": "./dist/index.d.ts",
|
|
34
|
-
"exports": {
|
|
35
|
-
".": {
|
|
36
|
-
"types": "./dist/index.d.ts",
|
|
37
|
-
"import": "./dist/index.js"
|
|
38
|
-
},
|
|
39
|
-
"./register": {
|
|
40
|
-
"types": "./dist/register.d.ts",
|
|
41
|
-
"import": "./dist/register.js"
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
"client": {
|
|
45
|
-
"procedures": "./dist/register.js"
|
|
46
|
-
},
|
|
47
|
-
"files": [
|
|
48
|
-
"dist",
|
|
49
|
-
"src"
|
|
50
|
-
],
|
|
51
|
-
"scripts": {
|
|
52
|
-
"build": "tsc -b",
|
|
53
|
-
"clean": "rm -rf dist",
|
|
54
|
-
"watch": "tsc -b --watch",
|
|
55
|
-
"prepare": "npm run build",
|
|
56
|
-
"postinstall": "client-registry announce || true"
|
|
57
|
-
},
|
|
58
|
-
"peerDependencies": {
|
|
59
|
-
"client": "^1.0.0",
|
|
60
|
-
"zod": "^3.0.0"
|
|
61
|
-
},
|
|
62
|
-
"devDependencies": {
|
|
63
|
-
"client": "^1.0.0",
|
|
64
|
-
"typescript": "^5.7.0",
|
|
65
|
-
"zod": "^3.0.0"
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
`;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function getTsconfigTemplate(): string {
|
|
72
|
-
return `{
|
|
73
|
-
"compilerOptions": {
|
|
74
|
-
"target": "ES2022",
|
|
75
|
-
"module": "NodeNext",
|
|
76
|
-
"moduleResolution": "NodeNext",
|
|
77
|
-
"declaration": true,
|
|
78
|
-
"declarationMap": true,
|
|
79
|
-
"sourceMap": true,
|
|
80
|
-
"outDir": "./dist",
|
|
81
|
-
"rootDir": "./src",
|
|
82
|
-
"strict": true,
|
|
83
|
-
"esModuleInterop": true,
|
|
84
|
-
"skipLibCheck": true,
|
|
85
|
-
"forceConsistentCasingInFileNames": true,
|
|
86
|
-
"exactOptionalPropertyTypes": true,
|
|
87
|
-
"noUncheckedIndexedAccess": true,
|
|
88
|
-
"noImplicitOverride": true
|
|
89
|
-
},
|
|
90
|
-
"include": ["src/**/*"],
|
|
91
|
-
"exclude": ["node_modules", "dist"]
|
|
92
|
-
}
|
|
93
|
-
`;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function getIndexTemplate(name: string): string {
|
|
97
|
-
const moduleName = name.replace(/[^a-zA-Z0-9]/g, "_").replace(/^_+|_+$/g, "");
|
|
98
|
-
return `/**
|
|
99
|
-
* ${name}
|
|
100
|
-
*
|
|
101
|
-
* Export your procedures and types from this file.
|
|
102
|
-
*/
|
|
103
|
-
|
|
104
|
-
// Export procedures
|
|
105
|
-
export { ${moduleName}Procedures } from "./procedures/index.js";
|
|
106
|
-
|
|
107
|
-
// Export individual procedures for direct use
|
|
108
|
-
export { exampleProcedure } from "./procedures/index.js";
|
|
109
|
-
|
|
110
|
-
// Export types if needed
|
|
111
|
-
export type { ExampleInput, ExampleOutput } from "./procedures/index.js";
|
|
112
|
-
`;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function getRegisterTemplate(name: string): string {
|
|
116
|
-
const moduleName = name.replace(/[^a-zA-Z0-9]/g, "_").replace(/^_+|_+$/g, "");
|
|
117
|
-
return `/**
|
|
118
|
-
* Procedure Registration
|
|
119
|
-
*
|
|
120
|
-
* This file is imported as a side-effect to register procedures.
|
|
121
|
-
* The path to this file is declared in package.json under "client.procedures".
|
|
122
|
-
*
|
|
123
|
-
* When another app runs \`npx client-registry discover\`, this file will be
|
|
124
|
-
* automatically imported, causing procedures to be registered.
|
|
125
|
-
*/
|
|
126
|
-
|
|
127
|
-
import { createAndRegister } from "client/procedures";
|
|
128
|
-
import { ${moduleName}Procedures } from "./procedures/index.js";
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Register all procedures from this library.
|
|
132
|
-
* This runs immediately when this file is imported.
|
|
133
|
-
*/
|
|
134
|
-
export const ${moduleName}Module = createAndRegister("${name}", ${moduleName}Procedures);
|
|
135
|
-
`;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function getProceduresTemplate(name: string): string {
|
|
139
|
-
const moduleName = name.replace(/[^a-zA-Z0-9]/g, "_").replace(/^_+|_+$/g, "");
|
|
140
|
-
return `/**
|
|
141
|
-
* Procedure Definitions
|
|
142
|
-
*
|
|
143
|
-
* Define your procedures here using defineProcedure().
|
|
144
|
-
*/
|
|
145
|
-
|
|
146
|
-
import { z } from "zod";
|
|
147
|
-
import { defineProcedure } from "client/procedures";
|
|
148
|
-
|
|
149
|
-
// =============================================================================
|
|
150
|
-
// Types
|
|
151
|
-
// =============================================================================
|
|
152
|
-
|
|
153
|
-
export const ExampleInputSchema = z.object({
|
|
154
|
-
id: z.string(),
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
export const ExampleOutputSchema = z.object({
|
|
158
|
-
id: z.string(),
|
|
159
|
-
name: z.string(),
|
|
160
|
-
createdAt: z.string(),
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
export type ExampleInput = z.infer<typeof ExampleInputSchema>;
|
|
164
|
-
export type ExampleOutput = z.infer<typeof ExampleOutputSchema>;
|
|
165
|
-
|
|
166
|
-
// =============================================================================
|
|
167
|
-
// Procedures
|
|
168
|
-
// =============================================================================
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Example procedure - replace with your actual procedures.
|
|
172
|
-
*/
|
|
173
|
-
export const exampleProcedure = defineProcedure({
|
|
174
|
-
path: ["${name}", "example", "get"],
|
|
175
|
-
input: ExampleInputSchema,
|
|
176
|
-
output: ExampleOutputSchema,
|
|
177
|
-
metadata: {
|
|
178
|
-
description: "Get an example by ID",
|
|
179
|
-
},
|
|
180
|
-
handler: async (input, ctx) => {
|
|
181
|
-
// Implement your procedure logic here
|
|
182
|
-
// Access storage via ctx.repository?.getStorage() if needed
|
|
183
|
-
|
|
184
|
-
return {
|
|
185
|
-
id: input.id,
|
|
186
|
-
name: "Example",
|
|
187
|
-
createdAt: new Date().toISOString(),
|
|
188
|
-
};
|
|
189
|
-
},
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Export all procedures as an array for registration.
|
|
194
|
-
*/
|
|
195
|
-
export const ${moduleName}Procedures = [
|
|
196
|
-
exampleProcedure,
|
|
197
|
-
// Add more procedures here
|
|
198
|
-
];
|
|
199
|
-
`;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
function getGitignoreTemplate(): string {
|
|
203
|
-
return `# Dependencies
|
|
204
|
-
node_modules/
|
|
205
|
-
|
|
206
|
-
# Build output
|
|
207
|
-
dist/
|
|
208
|
-
|
|
209
|
-
# IDE
|
|
210
|
-
.vscode/
|
|
211
|
-
.idea/
|
|
212
|
-
|
|
213
|
-
# OS
|
|
214
|
-
.DS_Store
|
|
215
|
-
Thumbs.db
|
|
216
|
-
|
|
217
|
-
# Logs
|
|
218
|
-
*.log
|
|
219
|
-
|
|
220
|
-
# Generated
|
|
221
|
-
__generated__/
|
|
222
|
-
`;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
function getReadmeTemplate(name: string): string {
|
|
226
|
-
return `# ${name}
|
|
227
|
-
|
|
228
|
-
A library with client procedures.
|
|
229
|
-
|
|
230
|
-
## Installation
|
|
231
|
-
|
|
232
|
-
\`\`\`bash
|
|
233
|
-
npm install ${name}
|
|
234
|
-
\`\`\`
|
|
235
|
-
|
|
236
|
-
## How It Works
|
|
237
|
-
|
|
238
|
-
This library announces its procedures when installed:
|
|
239
|
-
|
|
240
|
-
1. The \`postinstall\` script runs \`client-registry announce\`
|
|
241
|
-
2. This writes to \`.client-registry.json\` at your project root
|
|
242
|
-
3. When you run \`client-registry discover\`, it reads from this registry
|
|
243
|
-
|
|
244
|
-
This means **zero configuration** for consumers - just install and discover!
|
|
245
|
-
|
|
246
|
-
## Usage
|
|
247
|
-
|
|
248
|
-
### In Your App (Consumer)
|
|
249
|
-
|
|
250
|
-
After installing this library, run discovery to generate imports:
|
|
251
|
-
|
|
252
|
-
\`\`\`bash
|
|
253
|
-
npx client-registry discover
|
|
254
|
-
\`\`\`
|
|
255
|
-
|
|
256
|
-
Then import the generated file in your entry point:
|
|
257
|
-
|
|
258
|
-
\`\`\`typescript
|
|
259
|
-
import "./__generated__/procedures";
|
|
260
|
-
\`\`\`
|
|
261
|
-
|
|
262
|
-
### Manual Registration (Alternative)
|
|
263
|
-
|
|
264
|
-
\`\`\`typescript
|
|
265
|
-
import "${name}/register";
|
|
266
|
-
\`\`\`
|
|
267
|
-
|
|
268
|
-
### Direct Procedure Import
|
|
269
|
-
|
|
270
|
-
\`\`\`typescript
|
|
271
|
-
import { exampleProcedure } from "${name}";
|
|
272
|
-
\`\`\`
|
|
273
|
-
|
|
274
|
-
## Development
|
|
275
|
-
|
|
276
|
-
\`\`\`bash
|
|
277
|
-
# Build
|
|
278
|
-
npm run build
|
|
279
|
-
|
|
280
|
-
# Watch mode
|
|
281
|
-
npm run watch
|
|
282
|
-
\`\`\`
|
|
283
|
-
|
|
284
|
-
## License
|
|
285
|
-
|
|
286
|
-
MIT
|
|
287
|
-
`;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// =============================================================================
|
|
291
|
-
// File Writing
|
|
292
|
-
// =============================================================================
|
|
293
|
-
|
|
294
|
-
async function writeFile(
|
|
295
|
-
filePath: string,
|
|
296
|
-
content: string,
|
|
297
|
-
force: boolean
|
|
298
|
-
): Promise<boolean> {
|
|
299
|
-
try {
|
|
300
|
-
// Check if file exists
|
|
301
|
-
await fs.access(filePath);
|
|
302
|
-
if (!force) {
|
|
303
|
-
console.log(` Skipping (exists): ${path.basename(filePath)}`);
|
|
304
|
-
return false;
|
|
305
|
-
}
|
|
306
|
-
console.log(` Overwriting: ${path.basename(filePath)}`);
|
|
307
|
-
} catch {
|
|
308
|
-
console.log(` Creating: ${path.basename(filePath)}`);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
await fs.writeFile(filePath, content, "utf-8");
|
|
312
|
-
return true;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// =============================================================================
|
|
316
|
-
// Main
|
|
317
|
-
// =============================================================================
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Initialize a new library with procedure support.
|
|
321
|
-
*/
|
|
322
|
-
export async function init(options: InitOptions): Promise<void> {
|
|
323
|
-
const { name, force } = options;
|
|
324
|
-
|
|
325
|
-
// Determine target directory
|
|
326
|
-
const isCurrentDir = name === ".";
|
|
327
|
-
const targetDir = isCurrentDir ? process.cwd() : path.join(process.cwd(), name);
|
|
328
|
-
const packageName = isCurrentDir ? path.basename(process.cwd()) : name;
|
|
329
|
-
|
|
330
|
-
console.log(`\nInitializing ${packageName}...`);
|
|
331
|
-
|
|
332
|
-
// Create directory structure
|
|
333
|
-
const dirs = [
|
|
334
|
-
targetDir,
|
|
335
|
-
path.join(targetDir, "src"),
|
|
336
|
-
path.join(targetDir, "src", "procedures"),
|
|
337
|
-
];
|
|
338
|
-
|
|
339
|
-
for (const dir of dirs) {
|
|
340
|
-
await fs.mkdir(dir, { recursive: true });
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
// Write files
|
|
344
|
-
const files: Array<[string, string]> = [
|
|
345
|
-
[path.join(targetDir, "package.json"), getPackageJsonTemplate(packageName)],
|
|
346
|
-
[path.join(targetDir, "tsconfig.json"), getTsconfigTemplate()],
|
|
347
|
-
[path.join(targetDir, "src", "index.ts"), getIndexTemplate(packageName)],
|
|
348
|
-
[path.join(targetDir, "src", "register.ts"), getRegisterTemplate(packageName)],
|
|
349
|
-
[path.join(targetDir, "src", "procedures", "index.ts"), getProceduresTemplate(packageName)],
|
|
350
|
-
[path.join(targetDir, ".gitignore"), getGitignoreTemplate()],
|
|
351
|
-
[path.join(targetDir, "README.md"), getReadmeTemplate(packageName)],
|
|
352
|
-
];
|
|
353
|
-
|
|
354
|
-
for (const [filePath, content] of files) {
|
|
355
|
-
await writeFile(filePath, content, force);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
console.log(`
|
|
359
|
-
Done! Next steps:
|
|
360
|
-
|
|
361
|
-
${isCurrentDir ? "" : `cd ${name}`}
|
|
362
|
-
npm install
|
|
363
|
-
npm run build
|
|
364
|
-
|
|
365
|
-
Your library is ready to define procedures in src/procedures/index.ts
|
|
366
|
-
|
|
367
|
-
When consumers install your library and run \`npx client-registry discover\`,
|
|
368
|
-
your procedures will be automatically discovered and registered.
|
|
369
|
-
`);
|
|
370
|
-
}
|