noodleseed-cli 0.1.11 → 0.1.12

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 (68) hide show
  1. package/dist/agents.d.ts +3 -0
  2. package/dist/agents.d.ts.map +1 -0
  3. package/dist/agents.js +231 -0
  4. package/dist/agents.js.map +1 -0
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +1102 -107
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +2 -4
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +1 -1
  11. package/dist/config.js.map +1 -1
  12. package/dist/control-plane.d.ts +15 -1
  13. package/dist/control-plane.d.ts.map +1 -1
  14. package/dist/control-plane.js +90 -15
  15. package/dist/control-plane.js.map +1 -1
  16. package/dist/deploy.d.ts +3 -5
  17. package/dist/deploy.d.ts.map +1 -1
  18. package/dist/deploy.js +20 -7
  19. package/dist/deploy.js.map +1 -1
  20. package/dist/dev.d.ts +11 -5
  21. package/dist/dev.d.ts.map +1 -1
  22. package/dist/dev.js +7 -17
  23. package/dist/dev.js.map +1 -1
  24. package/dist/diagnostics.d.ts +9 -0
  25. package/dist/diagnostics.d.ts.map +1 -0
  26. package/dist/diagnostics.js +10 -0
  27. package/dist/diagnostics.js.map +1 -0
  28. package/dist/doctor.d.ts +7 -0
  29. package/dist/doctor.d.ts.map +1 -0
  30. package/dist/doctor.js +396 -0
  31. package/dist/doctor.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/openapi-import.d.ts +12 -0
  37. package/dist/openapi-import.d.ts.map +1 -0
  38. package/dist/openapi-import.js +95 -0
  39. package/dist/openapi-import.js.map +1 -0
  40. package/dist/project.d.ts +45 -0
  41. package/dist/project.d.ts.map +1 -0
  42. package/dist/project.js +252 -0
  43. package/dist/project.js.map +1 -0
  44. package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.d.ts +2 -2
  45. package/node_modules/@noodle-borg/runtime/dist/broker/secret-box.js +2 -2
  46. package/node_modules/@noodle-borg/service/dist/service.d.ts +6 -25
  47. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  48. package/node_modules/@noodle-borg/service/dist/service.js +219 -175
  49. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  50. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +2 -1
  51. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
  52. package/node_modules/@noodle-borg/service/dist/store/postgres.js +19 -78
  53. package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
  54. package/node_modules/@noodle-borg/service/dist/store.d.ts +24 -12
  55. package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
  56. package/node_modules/@noodle-borg/service/dist/store.js +18 -18
  57. package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
  58. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +2 -21
  59. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts.map +1 -1
  60. package/node_modules/@noodle-borg/transport-http/dist/handler.js +14 -25
  61. package/node_modules/@noodle-borg/transport-http/dist/handler.js.map +1 -1
  62. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts +1 -2
  63. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts.map +1 -1
  64. package/node_modules/@noodle-borg/transport-http/dist/index.js +0 -1
  65. package/node_modules/@noodle-borg/transport-http/dist/index.js.map +1 -1
  66. package/node_modules/@noodle-borg/transport-http/dist/logging.d.ts +1 -1
  67. package/node_modules/@noodle-borg/transport-http/dist/logging.js +1 -1
  68. package/package.json +1 -1
package/dist/doctor.js ADDED
@@ -0,0 +1,396 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { compileConnectors } from '@noodle-borg/connector-defs';
5
+ import { readConfig, readServers } from './config.js';
6
+ import { resolveControlPlaneToken, serviceJson } from './control-plane.js';
7
+ import { DEFAULT_SERVICE_URL, readDeployInput } from './deploy.js';
8
+ import { readProjectLink, resolveLinkedEntrypoint } from './project.js';
9
+ import { currentCliVersion } from './update.js';
10
+ import { validate } from './validate.js';
11
+ export async function runDoctor(options) {
12
+ const args = parseDoctorArgs(options.rest);
13
+ const project = readProjectLink();
14
+ const config = readConfig(options.home);
15
+ const checks = [];
16
+ const node = nodeCheck();
17
+ checks.push(node);
18
+ checks.push({ level: 'PASS', name: 'CLI', message: currentCliVersion() });
19
+ const { serviceUrl, token, config: resolvedConfig } = await resolveControlPlaneToken({
20
+ serviceFlag: args.service ??
21
+ (options.env.NOODLE_SERVICE_URL === undefined && project?.serviceUrl !== undefined
22
+ ? project.serviceUrl
23
+ : undefined),
24
+ authFlag: args.authToken,
25
+ env: options.env,
26
+ home: options.home,
27
+ });
28
+ const hasLogin = token !== undefined ||
29
+ resolvedConfig.identity !== undefined ||
30
+ config.identity !== undefined ||
31
+ config.authToken !== undefined;
32
+ checks.push(hasLogin
33
+ ? {
34
+ level: 'PASS',
35
+ name: 'Login',
36
+ message: resolvedConfig.identity?.email ?? config.identity?.email ?? 'token available',
37
+ }
38
+ : {
39
+ level: 'FAIL',
40
+ name: 'Login',
41
+ message: 'missing',
42
+ cause: 'No saved Noodle login token or identity was found.',
43
+ fix: 'Sign in to Noodle Cloud before deploy and management commands.',
44
+ next: 'noodle login',
45
+ });
46
+ checks.push(await serviceCheck(serviceUrl));
47
+ const entrypoint = args.entrypoint ?? resolveLinkedEntrypoint();
48
+ const target = {
49
+ org: args.org ?? project?.org ?? config.defaultOrg ?? 'local',
50
+ app: args.app ?? project?.app ?? config.defaultApp ?? appFromEntrypoint(entrypoint ?? 'app'),
51
+ env: args.targetEnv ?? project?.env ?? config.defaultEnv ?? 'prod',
52
+ };
53
+ checks.push(await orgMembershipCheck(serviceUrl, token, target.org));
54
+ if (project === undefined && args.entrypoint === undefined) {
55
+ checks.push({
56
+ level: 'FAIL',
57
+ name: 'Project link',
58
+ message: 'missing',
59
+ cause: 'No readable .noodle/project.json was found in this directory.',
60
+ fix: 'Create or bind a local Noodle project.',
61
+ next: 'noodle init && noodle link --org <org> --app <app>',
62
+ });
63
+ }
64
+ else {
65
+ checks.push({
66
+ level: 'PASS',
67
+ name: 'Project link',
68
+ message: project !== undefined
69
+ ? `${project.org}/${project.app}/${project.env}`
70
+ : 'explicit entrypoint',
71
+ });
72
+ }
73
+ if (entrypoint === undefined || !existsSync(entrypoint)) {
74
+ checks.push({
75
+ level: 'FAIL',
76
+ name: 'Entrypoint',
77
+ message: 'missing',
78
+ cause: 'The linked or supplied project entrypoint does not exist.',
79
+ fix: 'Point the project at a deployable server.ts, manifest.yaml, or manifest.json file.',
80
+ next: 'noodle link --entrypoint <path>',
81
+ });
82
+ }
83
+ else {
84
+ checks.push({ level: 'PASS', name: 'Entrypoint', message: entrypoint });
85
+ const validation = await validate({
86
+ manifestPath: entrypoint,
87
+ ...(args.connectorsPath !== undefined ? { connectorsPath: args.connectorsPath } : {}),
88
+ });
89
+ if (validation.ok) {
90
+ checks.push({ level: 'PASS', name: 'Validate', message: 'manifest compiles locally' });
91
+ checks.push(await secretsCheck({
92
+ entrypoint,
93
+ serviceUrl,
94
+ target,
95
+ ...(args.connectorsPath !== undefined ? { connectorsPath: args.connectorsPath } : {}),
96
+ ...(token !== undefined ? { token } : {}),
97
+ }));
98
+ }
99
+ else {
100
+ const first = validation.errors[0];
101
+ checks.push({
102
+ level: 'FAIL',
103
+ name: 'Validate',
104
+ message: `${validation.errors.length} error(s)`,
105
+ cause: first !== undefined
106
+ ? `${first.code}${first.path ? ` at ${first.path}` : ''}: ${first.message}`
107
+ : 'The project did not compile.',
108
+ fix: 'Fix the manifest or authored server before running dev or deploy.',
109
+ next: 'noodle validate',
110
+ });
111
+ }
112
+ }
113
+ checks.push(await endpointHealthCheck(options.home));
114
+ if (args.agentOutput) {
115
+ console.log(agentDoctorOutput(checks));
116
+ return checks.some((check) => check.level === 'FAIL') ? 1 : 0;
117
+ }
118
+ for (const check of checks)
119
+ printCheck(check);
120
+ const next = checks.find((check) => check.level === 'FAIL' && check.next !== undefined)?.next;
121
+ console.log(`Next: ${next ?? 'noodle dev'}`);
122
+ return checks.some((check) => check.level === 'FAIL') ? 1 : 0;
123
+ }
124
+ async function orgMembershipCheck(serviceUrl, token, org) {
125
+ if (token === undefined) {
126
+ return {
127
+ level: 'WARN',
128
+ name: 'Org membership',
129
+ message: 'skipped',
130
+ cause: 'No login token was available to verify org membership.',
131
+ fix: 'Sign in before deploying to hosted Noodle Cloud.',
132
+ next: 'noodle login',
133
+ };
134
+ }
135
+ try {
136
+ const body = await serviceJson(`${serviceUrl}/v1/whoami`, token);
137
+ if (body.identity.superAdmin || body.orgs.some((item) => item.slug === org)) {
138
+ return { level: 'PASS', name: 'Org membership', message: org };
139
+ }
140
+ return {
141
+ level: 'FAIL',
142
+ name: 'Org membership',
143
+ message: org,
144
+ cause: `The current identity is not a member of org "${org}".`,
145
+ fix: 'Ask an org owner to add this identity before deploying.',
146
+ next: `noodle members add --org ${org} --email <email> --subject <subject>`,
147
+ };
148
+ }
149
+ catch (error) {
150
+ return {
151
+ level: 'WARN',
152
+ name: 'Org membership',
153
+ message: 'could not verify',
154
+ cause: error instanceof Error ? error.message : String(error),
155
+ fix: 'Confirm login and service reachability.',
156
+ next: `noodle login --service ${serviceUrl}`,
157
+ };
158
+ }
159
+ }
160
+ async function endpointHealthCheck(home) {
161
+ const latest = readServers(home).at(-1);
162
+ if (latest === undefined) {
163
+ return { level: 'WARN', name: 'Endpoint health', message: 'no saved deployment metadata' };
164
+ }
165
+ try {
166
+ const res = await fetch(latest.url, { method: 'HEAD' });
167
+ if (res.status < 500)
168
+ return { level: 'PASS', name: 'Endpoint health', message: latest.url };
169
+ return {
170
+ level: 'FAIL',
171
+ name: 'Endpoint health',
172
+ message: latest.url,
173
+ cause: `Endpoint returned HTTP ${res.status}.`,
174
+ fix: 'Check deployment status and service logs.',
175
+ next: 'noodle deploy',
176
+ };
177
+ }
178
+ catch (error) {
179
+ return {
180
+ level: 'WARN',
181
+ name: 'Endpoint health',
182
+ message: latest.url,
183
+ cause: error instanceof Error ? error.message : String(error),
184
+ fix: 'Confirm the saved deployment endpoint is still reachable.',
185
+ next: 'noodle deploy',
186
+ };
187
+ }
188
+ }
189
+ function parseDoctorArgs(rest) {
190
+ let service;
191
+ let authToken;
192
+ let org;
193
+ let app;
194
+ let targetEnv;
195
+ let entrypoint;
196
+ let connectorsPath;
197
+ let agentOutput = false;
198
+ for (let i = 0; i < rest.length; i++) {
199
+ const arg = rest[i];
200
+ if (arg === '--service')
201
+ service = rest[++i];
202
+ else if (arg === '--auth-token')
203
+ authToken = rest[++i];
204
+ else if (arg === '--org')
205
+ org = rest[++i];
206
+ else if (arg === '--app')
207
+ app = rest[++i];
208
+ else if (arg === '--env')
209
+ targetEnv = rest[++i];
210
+ else if (arg === '--entrypoint')
211
+ entrypoint = resolve(rest[++i] ?? 'server.ts');
212
+ else if (arg === '--connectors')
213
+ connectorsPath = rest[++i];
214
+ else if (arg === '--agent-output' || arg === '--fix-prompt')
215
+ agentOutput = true;
216
+ }
217
+ return {
218
+ ...(service !== undefined ? { service } : {}),
219
+ ...(authToken !== undefined ? { authToken } : {}),
220
+ ...(org !== undefined ? { org } : {}),
221
+ ...(app !== undefined ? { app } : {}),
222
+ ...(targetEnv !== undefined ? { targetEnv } : {}),
223
+ ...(entrypoint !== undefined ? { entrypoint } : {}),
224
+ ...(connectorsPath !== undefined ? { connectorsPath } : {}),
225
+ ...(agentOutput ? { agentOutput } : {}),
226
+ };
227
+ }
228
+ function agentDoctorOutput(checks) {
229
+ const failed = checks.filter((check) => check.level === 'FAIL');
230
+ return [
231
+ 'Fix this Noodle project readiness failure from `doctor`.',
232
+ '',
233
+ ...(failed.length > 0
234
+ ? failed.map((check) => `- ${check.name}: ${check.cause ?? check.message}. Next: ${check.next ?? 'noodle doctor'}`)
235
+ : ['- No blocking failures. Keep using `noodle validate`, `noodle test`, and `noodle deploy`.']),
236
+ '',
237
+ 'Do not inspect or print tokens, `.env.noodle`, or secret values.',
238
+ ].join('\n');
239
+ }
240
+ function nodeCheck() {
241
+ const required = requiredNodeMajor();
242
+ const actual = Number(process.versions.node.split('.')[0]);
243
+ if (Number.isFinite(actual) && actual >= required) {
244
+ return { level: 'PASS', name: 'Node', message: `v${process.versions.node}` };
245
+ }
246
+ return {
247
+ level: 'FAIL',
248
+ name: 'Node',
249
+ message: `v${process.versions.node}`,
250
+ cause: `Noodle CLI requires Node ${required} or newer.`,
251
+ fix: `Install and select Node ${required} LTS.`,
252
+ next: `nvm install ${required} && nvm use ${required}`,
253
+ };
254
+ }
255
+ function requiredNodeMajor() {
256
+ try {
257
+ const pkg = JSON.parse(readFileSync(join(packageRoot(), 'package.json'), 'utf8'));
258
+ const match = /^>=(\d+)/.exec(pkg.engines?.node ?? '');
259
+ return match ? Number(match[1]) : 24;
260
+ }
261
+ catch {
262
+ return 24;
263
+ }
264
+ }
265
+ async function serviceCheck(serviceUrl) {
266
+ try {
267
+ const auth = await fetch(`${serviceUrl}/v1/auth/google`, { headers: { accept: 'application/json' } });
268
+ if (auth.ok)
269
+ return { level: 'PASS', name: 'Service', message: serviceUrl };
270
+ }
271
+ catch { }
272
+ try {
273
+ const ready = await fetch(`${serviceUrl}/readyz`, { headers: { accept: 'application/json' } });
274
+ if (ready.ok)
275
+ return { level: 'PASS', name: 'Service', message: serviceUrl };
276
+ return serviceFailure(serviceUrl, `ready check returned HTTP ${ready.status}`);
277
+ }
278
+ catch (error) {
279
+ return serviceFailure(serviceUrl, error instanceof Error ? error.message : String(error));
280
+ }
281
+ }
282
+ function serviceFailure(serviceUrl, cause) {
283
+ return {
284
+ level: 'FAIL',
285
+ name: 'Service',
286
+ message: serviceUrl,
287
+ cause: `Could not reach ${serviceUrl}: ${cause}`,
288
+ fix: 'Check the service URL and network connection.',
289
+ next: `noodle login --service ${serviceUrl}`,
290
+ };
291
+ }
292
+ async function secretsCheck(input) {
293
+ const refs = await requiredSecretRefs(input.entrypoint, input.connectorsPath);
294
+ if (!refs.ok) {
295
+ return {
296
+ level: 'FAIL',
297
+ name: 'Secrets',
298
+ message: 'could not inspect connector secrets',
299
+ cause: refs.message,
300
+ fix: 'Fix connector definitions before deploying.',
301
+ next: 'noodle validate',
302
+ };
303
+ }
304
+ if (refs.names.length === 0) {
305
+ return { level: 'PASS', name: 'Secrets', message: 'no required connector secrets' };
306
+ }
307
+ const available = await availableManagedSecretNames(input.serviceUrl, input.token, input.target);
308
+ if (!available.ok) {
309
+ return {
310
+ level: 'FAIL',
311
+ name: 'Secrets',
312
+ message: 'could not inspect managed secrets',
313
+ cause: available.message,
314
+ fix: 'Confirm your login and service target before deploy.',
315
+ next: 'noodle login',
316
+ };
317
+ }
318
+ const missing = refs.names.filter((name) => !available.names.has(name));
319
+ if (missing.length === 0) {
320
+ return { level: 'PASS', name: 'Secrets', message: `${refs.names.length} required secret(s) configured` };
321
+ }
322
+ return {
323
+ level: 'FAIL',
324
+ name: 'Secrets',
325
+ message: `missing ${missing.join(', ')}`,
326
+ cause: `Missing required managed secret(s): ${missing.join(', ')}`,
327
+ fix: 'Set the missing secret(s) at the environment scope.',
328
+ next: secretSetCommand(missing[0], input.target),
329
+ };
330
+ }
331
+ async function requiredSecretRefs(entrypoint, connectorsPath) {
332
+ try {
333
+ const input = await readDeployInput(entrypoint);
334
+ const connectors = connectorsPath !== undefined
335
+ ? readFileSync(connectorsPath, 'utf8')
336
+ : input.connectors;
337
+ if (connectors === undefined || connectors.trim() === '')
338
+ return { ok: true, names: [] };
339
+ const compiled = compileConnectors(connectors);
340
+ if (!compiled.ok) {
341
+ return {
342
+ ok: false,
343
+ message: compiled.errors.map((error) => `${error.code}: ${error.message}`).join('; '),
344
+ };
345
+ }
346
+ return {
347
+ ok: true,
348
+ names: [...new Set(compiled.secretBindings.map((binding) => binding.secretRef))].sort(),
349
+ };
350
+ }
351
+ catch (error) {
352
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
353
+ }
354
+ }
355
+ async function availableManagedSecretNames(serviceUrl, token, target) {
356
+ const paths = [
357
+ `/v1/orgs/${encodeURIComponent(target.org)}/secrets`,
358
+ `/v1/orgs/${encodeURIComponent(target.org)}/apps/${encodeURIComponent(target.app)}/secrets`,
359
+ `/v1/orgs/${encodeURIComponent(target.org)}/apps/${encodeURIComponent(target.app)}/envs/${encodeURIComponent(target.env)}/secrets`,
360
+ ];
361
+ const names = new Set();
362
+ try {
363
+ for (const path of paths) {
364
+ const body = await serviceJson(`${serviceUrl}${path}`, token);
365
+ for (const value of body.values)
366
+ names.add(value.name);
367
+ }
368
+ return { ok: true, names };
369
+ }
370
+ catch (error) {
371
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
372
+ }
373
+ }
374
+ function printCheck(check) {
375
+ console.log(`${check.level} ${check.name}: ${check.message}`);
376
+ if (check.cause !== undefined)
377
+ console.log(` Cause: ${check.cause}`);
378
+ if (check.fix !== undefined)
379
+ console.log(` Fix: ${check.fix}`);
380
+ if (check.next !== undefined)
381
+ console.log(` Next: ${check.next}`);
382
+ }
383
+ function secretSetCommand(name, target) {
384
+ return (`noodle secrets set ${name} --scope env --org ${target.org}` +
385
+ ` --app ${target.app} --env ${target.env} --value <value>`);
386
+ }
387
+ function appFromEntrypoint(entrypoint) {
388
+ return entrypoint
389
+ .split(/[\\/]/)
390
+ .pop()
391
+ ?.replace(/\.[^.]+$/, '') ?? 'app';
392
+ }
393
+ function packageRoot() {
394
+ return resolve(dirname(fileURLToPath(import.meta.url)), '..');
395
+ }
396
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,8 @@ export { run } from './cli.js';
2
2
  export { appendServer, clearConfig, configPath, type NoodleConfig, maskToken, readConfig, readServers, resolveAuthToken, resolveServiceUrl, type SavedServer, serversPath, writeConfig, } from './config.js';
3
3
  export { DEFAULT_SERVICE_URL, type DeployOptions, type DeployOutcome, deploy } from './deploy.js';
4
4
  export { type DevHandle, type DevOptions, type DevReloadResult, dev } from './dev.js';
5
+ export { connector, server, when, z } from '@noodle-borg/authoring';
5
6
  export { deleteLocalConfigValue, type LocalConfigKind, type LocalConfigRecord, localConfigPath, type LocalConfigScope, readLocalConfigValues, resolveLocalConfigValues, setLocalConfigValue, } from './local-config.js';
6
7
  export { type ValidateOptions, type ValidateOutcome, type ValidationIssue, validate, } from './validate.js';
8
+ export { initProject, type InitProjectOptions, type InitTemplate, type LinkProjectOptions, type ProjectLink, type ProjectDeployment, projectConfigPath, projectDeploymentPath, readProjectDeployment, readProjectLink, relativeEntrypoint, resolveLinkedEntrypoint, writeProjectDeployment, writeProjectLink, } from './project.js';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,KAAK,YAAY,EACjB,SAAS,EACT,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,WAAW,EAChB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,eAAe,EACf,KAAK,gBAAgB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,QAAQ,GACT,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,KAAK,YAAY,EACjB,SAAS,EACT,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,WAAW,EAChB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,eAAe,EACf,KAAK,gBAAgB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,8 @@ export { run } from './cli.js';
2
2
  export { appendServer, clearConfig, configPath, maskToken, readConfig, readServers, resolveAuthToken, resolveServiceUrl, serversPath, writeConfig, } from './config.js';
3
3
  export { DEFAULT_SERVICE_URL, deploy } from './deploy.js';
4
4
  export { dev } from './dev.js';
5
+ export { connector, server, when, z } from '@noodle-borg/authoring';
5
6
  export { deleteLocalConfigValue, localConfigPath, readLocalConfigValues, resolveLocalConfigValues, setLocalConfigValue, } from './local-config.js';
6
7
  export { validate, } from './validate.js';
8
+ export { initProject, projectConfigPath, projectDeploymentPath, readProjectDeployment, readProjectLink, relativeEntrypoint, resolveLinkedEntrypoint, writeProjectDeployment, writeProjectLink, } from './project.js';
7
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EAEV,SAAS,EACT,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAEjB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAA0C,MAAM,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAyD,GAAG,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EACL,sBAAsB,EAGtB,eAAe,EAEf,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,QAAQ,GACT,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EAEV,SAAS,EACT,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAEjB,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAA0C,MAAM,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAyD,GAAG,EAAE,MAAM,UAAU,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,sBAAsB,EAGtB,eAAe,EAEf,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,WAAW,EAMX,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ImportOpenApiOptions {
2
+ readonly specPath: string;
3
+ readonly output: string;
4
+ readonly name: string;
5
+ readonly baseUrl?: string;
6
+ readonly force?: boolean;
7
+ }
8
+ export declare function importOpenApiProject(options: ImportOpenApiOptions): {
9
+ readonly output: string;
10
+ readonly warnings: readonly string[];
11
+ };
12
+ //# sourceMappingURL=openapi-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-import.d.ts","sourceRoot":"","sources":["../src/openapi-import.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAID,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAwFrI"}
@@ -0,0 +1,95 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import YAML from 'yaml';
4
+ import { initProject } from './project.js';
5
+ const METHODS = new Set(['get', 'post', 'put', 'patch', 'delete']);
6
+ export function importOpenApiProject(options) {
7
+ const doc = YAML.parse(readFileSync(options.specPath, 'utf8'));
8
+ if (typeof doc.openapi !== 'string' || !/^3\.[01]\./.test(doc.openapi)) {
9
+ throw new Error('import openapi: only OpenAPI 3.0 and 3.1 documents are supported');
10
+ }
11
+ const baseUrl = options.baseUrl ?? doc.servers?.find((server) => typeof server.url === 'string')?.url;
12
+ if (baseUrl === undefined)
13
+ throw new Error('import openapi: missing base URL; pass --base-url');
14
+ initProject({ dir: options.output, name: options.name, force: options.force ?? true });
15
+ const operations = [];
16
+ const tools = [];
17
+ const warnings = [];
18
+ for (const [path, item] of Object.entries(doc.paths ?? {})) {
19
+ for (const [method, rawOperation] of Object.entries(item)) {
20
+ if (!METHODS.has(method))
21
+ continue;
22
+ const operation = rawOperation;
23
+ const opName = identifier(typeof operation.operationId === 'string' ? operation.operationId : `${method}_${path}`);
24
+ const params = operation.parameters ?? [];
25
+ const inputEntries = params
26
+ .filter((param) => param.in === 'path' || param.in === 'query')
27
+ .map((param) => {
28
+ const name = identifier(String(param.name ?? 'param'));
29
+ return `${name}: { type: 'string'${param.required ? ', required: true' : ''} }`;
30
+ });
31
+ if (operation.requestBody !== undefined)
32
+ warnings.push(`${opName}: requestBody imported as opaque JSON string placeholder`);
33
+ operations.push(`${opName}: {
34
+ type: '${method === 'get' ? 'read' : 'action'}',
35
+ method: '${method.toUpperCase()}',
36
+ path: '${path.replace(/\{([^}]+)\}/g, '${args.$1}')}',
37
+ input: { ${inputEntries.join(', ')} },
38
+ ${params.some((param) => param.in === 'query') ? `query: [${params.filter((param) => param.in === 'query').map((param) => `'${identifier(String(param.name ?? 'param'))}'`).join(', ')}],` : ''}
39
+ output: { value: { type: 'object' } },
40
+ response: { value: '\${response.json}' },
41
+ }`);
42
+ const zodShape = params
43
+ .filter((param) => param.in === 'path' || param.in === 'query')
44
+ .map((param) => `${identifier(String(param.name ?? 'param'))}: z.string()`)
45
+ .join(', ');
46
+ tools.push(`.tool('${opName}', {
47
+ description: 'Call ${method.toUpperCase()} ${path}.',
48
+ input: z.object({ ${zodShape} }),
49
+ fulfil({ input, connectors }) {
50
+ return connectors.api.${opName}(input);
51
+ },
52
+ })`);
53
+ }
54
+ }
55
+ if (operations.length === 0)
56
+ throw new Error('import openapi: no supported operations found');
57
+ const connectorName = identifier(options.name);
58
+ const server = `import { connector, server, z } from 'noodleseed-cli';
59
+
60
+ const api = connector('${connectorName}')
61
+ .version('1.0.0')
62
+ .http({
63
+ baseUrl: '${baseUrl}',
64
+ allowedOrigins: ['${baseUrl}'],
65
+ operations: {
66
+ ${operations.join(',\n ')}
67
+ },
68
+ });
69
+
70
+ export default server('${connectorName}', { title: '${title(options.name)}', version: '1.0.0' })
71
+ .use({ api })
72
+ ${tools.join('\n ')};
73
+ `;
74
+ writeFileSync(join(options.output, 'server.ts'), server);
75
+ mkdirSync(dirname(join(options.output, 'README.md')), { recursive: true });
76
+ writeFileSync(join(options.output, 'README.md'), `# ${title(options.name)}
77
+
78
+ Generated from OpenAPI.
79
+
80
+ \`\`\`sh
81
+ noodle validate
82
+ noodle dev
83
+ noodle deploy
84
+ \`\`\`
85
+ `);
86
+ return { output: options.output, warnings };
87
+ }
88
+ function identifier(value) {
89
+ const out = value.replace(/[^A-Za-z0-9_]+/g, '_').replace(/^_+|_+$/g, '');
90
+ return /^[A-Za-z_]/.test(out) ? out : `op_${out || 'operation'}`;
91
+ }
92
+ function title(value) {
93
+ return value.replace(/[-_]+/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
94
+ }
95
+ //# sourceMappingURL=openapi-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-import.js","sourceRoot":"","sources":["../src/openapi-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type AccessMode } from './deploy.js';
2
+ export type InitTemplate = 'hello' | 'http-api';
3
+ export interface ProjectLink {
4
+ readonly entrypoint: string;
5
+ readonly org: string;
6
+ readonly app: string;
7
+ readonly env: string;
8
+ readonly serviceUrl: string;
9
+ readonly accessMode: AccessMode;
10
+ }
11
+ export interface ProjectDeployment {
12
+ readonly deploymentId: string;
13
+ readonly url: string;
14
+ readonly org: string;
15
+ readonly app: string;
16
+ readonly env: string;
17
+ readonly accessMode: AccessMode;
18
+ readonly serviceUrl: string;
19
+ readonly createdAt: string;
20
+ }
21
+ export interface InitProjectOptions {
22
+ readonly dir?: string;
23
+ readonly template?: InitTemplate;
24
+ readonly name?: string;
25
+ readonly force?: boolean;
26
+ }
27
+ export interface LinkProjectOptions {
28
+ readonly entrypoint?: string;
29
+ readonly org: string;
30
+ readonly app: string;
31
+ readonly env?: string;
32
+ readonly serviceUrl?: string;
33
+ readonly accessMode?: AccessMode;
34
+ readonly cwd?: string;
35
+ }
36
+ export declare function projectConfigPath(cwd?: string): string;
37
+ export declare function projectDeploymentPath(cwd?: string): string;
38
+ export declare function readProjectLink(cwd?: string): ProjectLink | undefined;
39
+ export declare function writeProjectLink(options: LinkProjectOptions): ProjectLink;
40
+ export declare function readProjectDeployment(cwd?: string): ProjectDeployment | undefined;
41
+ export declare function writeProjectDeployment(deployment: ProjectDeployment, cwd?: string): ProjectDeployment;
42
+ export declare function initProject(options?: InitProjectOptions): string;
43
+ export declare function resolveLinkedEntrypoint(cwd?: string): string | undefined;
44
+ export declare function relativeEntrypoint(path: string, cwd?: string): string;
45
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAUA,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAErE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAEzE;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,WAAW,GAAG,SAAS,CAwBpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAczE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAsB,GAAG,iBAAiB,GAAG,SAAS,CA4BhG;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,iBAAiB,EAC7B,GAAG,GAAE,MAAsB,GAC1B,iBAAiB,CAOnB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAsBpE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,SAAS,CAKvF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAGpF"}