micro-contracts 0.16.4 → 0.17.1
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/dist/micro-contracts.bundle.mjs +4683 -0
- package/dist/micro-contracts.bundle.mjs.map +7 -0
- package/package.json +22 -25
- package/dist/agents/context-builder.d.ts +0 -5
- package/dist/agents/context-builder.d.ts.map +0 -1
- package/dist/agents/context-builder.js +0 -239
- package/dist/agents/context-builder.js.map +0 -1
- package/dist/agents/formatter.d.ts +0 -9
- package/dist/agents/formatter.d.ts.map +0 -1
- package/dist/agents/formatter.js +0 -124
- package/dist/agents/formatter.js.map +0 -1
- package/dist/agents/index.d.ts +0 -5
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/index.js +0 -3
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/orchestrator.d.ts +0 -5
- package/dist/agents/orchestrator.d.ts.map +0 -1
- package/dist/agents/orchestrator.js +0 -105
- package/dist/agents/orchestrator.js.map +0 -1
- package/dist/agents/types.d.ts +0 -21
- package/dist/agents/types.d.ts.map +0 -1
- package/dist/agents/types.js +0 -2
- package/dist/agents/types.js.map +0 -1
- package/dist/cli/templates.d.ts +0 -22
- package/dist/cli/templates.d.ts.map +0 -1
- package/dist/cli/templates.js +0 -445
- package/dist/cli/templates.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -1142
- package/dist/cli.js.map +0 -1
- package/dist/commands/audit-guardrails.d.ts +0 -13
- package/dist/commands/audit-guardrails.d.ts.map +0 -1
- package/dist/commands/audit-guardrails.js +0 -32
- package/dist/commands/audit-guardrails.js.map +0 -1
- package/dist/commands/audit-openapi.d.ts +0 -13
- package/dist/commands/audit-openapi.d.ts.map +0 -1
- package/dist/commands/audit-openapi.js +0 -32
- package/dist/commands/audit-openapi.js.map +0 -1
- package/dist/commands/propose-overlays.d.ts +0 -13
- package/dist/commands/propose-overlays.d.ts.map +0 -1
- package/dist/commands/propose-overlays.js +0 -32
- package/dist/commands/propose-overlays.js.map +0 -1
- package/dist/commands/review-published.d.ts +0 -13
- package/dist/commands/review-published.d.ts.map +0 -1
- package/dist/commands/review-published.js +0 -32
- package/dist/commands/review-published.js.map +0 -1
- package/dist/generated/commands.d.ts +0 -2
- package/dist/generated/commands.d.ts.map +0 -1
- package/dist/generated/commands.js +0 -2
- package/dist/generated/commands.js.map +0 -1
- package/dist/generated/dsl/agents.d.ts +0 -34
- package/dist/generated/dsl/agents.d.ts.map +0 -1
- package/dist/generated/dsl/agents.js +0 -98
- package/dist/generated/dsl/agents.js.map +0 -1
- package/dist/generated/dsl/handoffs.d.ts +0 -457
- package/dist/generated/dsl/handoffs.d.ts.map +0 -1
- package/dist/generated/dsl/handoffs.js +0 -205
- package/dist/generated/dsl/handoffs.js.map +0 -1
- package/dist/generated/dsl/index.d.ts +0 -13
- package/dist/generated/dsl/index.d.ts.map +0 -1
- package/dist/generated/dsl/index.js +0 -10
- package/dist/generated/dsl/index.js.map +0 -1
- package/dist/generated/dsl/tasks.d.ts +0 -26
- package/dist/generated/dsl/tasks.d.ts.map +0 -1
- package/dist/generated/dsl/tasks.js +0 -133
- package/dist/generated/dsl/tasks.js.map +0 -1
- package/dist/generated/dsl/workflows.d.ts +0 -34
- package/dist/generated/dsl/workflows.d.ts.map +0 -1
- package/dist/generated/dsl/workflows.js +0 -84
- package/dist/generated/dsl/workflows.js.map +0 -1
- package/dist/generated/index.d.ts +0 -7
- package/dist/generated/index.d.ts.map +0 -1
- package/dist/generated/index.js +0 -7
- package/dist/generated/index.js.map +0 -1
- package/dist/generated/policy-runtime.d.ts +0 -114
- package/dist/generated/policy-runtime.d.ts.map +0 -1
- package/dist/generated/policy-runtime.js +0 -195
- package/dist/generated/policy-runtime.js.map +0 -1
- package/dist/generated/policy.d.ts +0 -619
- package/dist/generated/policy.d.ts.map +0 -1
- package/dist/generated/policy.js +0 -802
- package/dist/generated/policy.js.map +0 -1
- package/dist/generated/program.d.ts +0 -112
- package/dist/generated/program.d.ts.map +0 -1
- package/dist/generated/program.js +0 -266
- package/dist/generated/program.js.map +0 -1
- package/dist/generated/schemas.d.ts +0 -778
- package/dist/generated/schemas.d.ts.map +0 -1
- package/dist/generated/schemas.js +0 -1005
- package/dist/generated/schemas.js.map +0 -1
- package/dist/generated/types.d.ts +0 -395
- package/dist/generated/types.d.ts.map +0 -1
- package/dist/generated/types.js +0 -3
- package/dist/generated/types.js.map +0 -1
- package/dist/generator/dependencyGenerator.d.ts +0 -43
- package/dist/generator/dependencyGenerator.d.ts.map +0 -1
- package/dist/generator/dependencyGenerator.js +0 -159
- package/dist/generator/dependencyGenerator.js.map +0 -1
- package/dist/generator/index.d.ts +0 -39
- package/dist/generator/index.d.ts.map +0 -1
- package/dist/generator/index.js +0 -720
- package/dist/generator/index.js.map +0 -1
- package/dist/generator/inputHash.d.ts +0 -23
- package/dist/generator/inputHash.d.ts.map +0 -1
- package/dist/generator/inputHash.js +0 -145
- package/dist/generator/inputHash.js.map +0 -1
- package/dist/generator/linter.d.ts +0 -26
- package/dist/generator/linter.d.ts.map +0 -1
- package/dist/generator/linter.js +0 -352
- package/dist/generator/linter.js.map +0 -1
- package/dist/generator/overlayProcessor.d.ts +0 -90
- package/dist/generator/overlayProcessor.d.ts.map +0 -1
- package/dist/generator/overlayProcessor.js +0 -541
- package/dist/generator/overlayProcessor.js.map +0 -1
- package/dist/generator/schemaGenerator.d.ts +0 -10
- package/dist/generator/schemaGenerator.d.ts.map +0 -1
- package/dist/generator/schemaGenerator.js +0 -299
- package/dist/generator/schemaGenerator.js.map +0 -1
- package/dist/generator/serviceGenerator.d.ts +0 -41
- package/dist/generator/serviceGenerator.d.ts.map +0 -1
- package/dist/generator/serviceGenerator.js +0 -296
- package/dist/generator/serviceGenerator.js.map +0 -1
- package/dist/generator/templateProcessor.d.ts +0 -245
- package/dist/generator/templateProcessor.d.ts.map +0 -1
- package/dist/generator/templateProcessor.js +0 -821
- package/dist/generator/templateProcessor.js.map +0 -1
- package/dist/generator/typeGenerator.d.ts +0 -9
- package/dist/generator/typeGenerator.d.ts.map +0 -1
- package/dist/generator/typeGenerator.js +0 -424
- package/dist/generator/typeGenerator.js.map +0 -1
- package/dist/generator/typeGenerator.test.d.ts +0 -2
- package/dist/generator/typeGenerator.test.d.ts.map +0 -1
- package/dist/generator/typeGenerator.test.js +0 -122
- package/dist/generator/typeGenerator.test.js.map +0 -1
- package/dist/guardrails/allowlist.d.ts +0 -45
- package/dist/guardrails/allowlist.d.ts.map +0 -1
- package/dist/guardrails/allowlist.js +0 -261
- package/dist/guardrails/allowlist.js.map +0 -1
- package/dist/guardrails/config.d.ts +0 -40
- package/dist/guardrails/config.d.ts.map +0 -1
- package/dist/guardrails/config.js +0 -174
- package/dist/guardrails/config.js.map +0 -1
- package/dist/guardrails/docs.d.ts +0 -24
- package/dist/guardrails/docs.d.ts.map +0 -1
- package/dist/guardrails/docs.js +0 -138
- package/dist/guardrails/docs.js.map +0 -1
- package/dist/guardrails/drift.d.ts +0 -23
- package/dist/guardrails/drift.d.ts.map +0 -1
- package/dist/guardrails/drift.js +0 -127
- package/dist/guardrails/drift.js.map +0 -1
- package/dist/guardrails/index.d.ts +0 -19
- package/dist/guardrails/index.d.ts.map +0 -1
- package/dist/guardrails/index.js +0 -23
- package/dist/guardrails/index.js.map +0 -1
- package/dist/guardrails/lint.d.ts +0 -20
- package/dist/guardrails/lint.d.ts.map +0 -1
- package/dist/guardrails/lint.js +0 -274
- package/dist/guardrails/lint.js.map +0 -1
- package/dist/guardrails/manifest.d.ts +0 -63
- package/dist/guardrails/manifest.d.ts.map +0 -1
- package/dist/guardrails/manifest.js +0 -299
- package/dist/guardrails/manifest.js.map +0 -1
- package/dist/guardrails/runner.d.ts +0 -43
- package/dist/guardrails/runner.d.ts.map +0 -1
- package/dist/guardrails/runner.js +0 -365
- package/dist/guardrails/runner.js.map +0 -1
- package/dist/guardrails/typecheck.d.ts +0 -15
- package/dist/guardrails/typecheck.d.ts.map +0 -1
- package/dist/guardrails/typecheck.js +0 -104
- package/dist/guardrails/typecheck.js.map +0 -1
- package/dist/guardrails/types.d.ts +0 -202
- package/dist/guardrails/types.d.ts.map +0 -1
- package/dist/guardrails/types.js +0 -8
- package/dist/guardrails/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts +0 -583
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -305
- package/dist/types.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/types.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { OpenapiAuditResult } from "../generated/dsl/handoffs.js";
|
|
2
|
-
export type TaskId = "audit-openapi-design" | "audit-published-api" | "propose-overlay-candidates" | "audit-guardrails-coverage";
|
|
3
|
-
export interface AuditConfig {
|
|
4
|
-
adapter?: string;
|
|
5
|
-
model?: string;
|
|
6
|
-
temperature?: number;
|
|
7
|
-
}
|
|
8
|
-
export interface AuditOptions {
|
|
9
|
-
failOn?: "warning" | "error" | "critical";
|
|
10
|
-
}
|
|
11
|
-
export interface AuditRunResult {
|
|
12
|
-
taskId: TaskId;
|
|
13
|
-
data: OpenapiAuditResult | null;
|
|
14
|
-
raw: string;
|
|
15
|
-
prompt: string;
|
|
16
|
-
status: "success" | "error" | "escalation" | "validation_error";
|
|
17
|
-
errorMessage?: string;
|
|
18
|
-
followUpsUsed: number;
|
|
19
|
-
retriesUsed: number;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,MAAM,MAAM,MAAM,GACd,sBAAsB,GACtB,qBAAqB,GACrB,4BAA4B,GAC5B,2BAA2B,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,kBAAkB,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/agents/types.js
DELETED
package/dist/agents/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agents/types.ts"],"names":[],"mappings":""}
|
package/dist/cli/templates.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Starter Templates for micro-contracts init command
|
|
3
|
-
*
|
|
4
|
-
* These templates are created in spec/default/templates/ and can be customized.
|
|
5
|
-
* Keep in sync with examples/spec/default/templates/
|
|
6
|
-
*/
|
|
7
|
-
export declare const STARTER_FASTIFY_ROUTES_TEMPLATE = "/**\n * Auto-generated Fastify routes\n * Generated from: {{spec.info.title}} v{{spec.info.version}}\n * DO NOT EDIT MANUALLY\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { allSchemas } from '{{contractPackage}}/schemas/index.js';\nimport * as types from '{{contractPackage}}/schemas/types.js';\n{{#if extensionInfo.length}}\nimport { runOverlays, toHttpRequest, sendError } from './overlayAdapter.generated.js';\n{{/if}}\n\nexport async function registerRoutes(fastify: FastifyInstance): Promise<void> {\n for (const schema of allSchemas) {\n fastify.addSchema(schema);\n }\n\n const { {{#each services}}{{key}}{{#unless @last}}, {{/unless}}{{/each}} } = {{servicesPath}};\n{{#if extensionInfo.length}}\n const handlers = fastify.overlayHandlers;\n{{/if}}\n\n{{#each routes}}\n // {{uppercase method}} {{path}}{{#if isPublished}} [PUBLISHED]{{/if}}\n fastify.{{method}}('{{fastifyPath}}', {\n schema: {\n{{#if paramsType}}\n params: { $ref: '{{typeNameBase}}Params#' },\n{{/if}}\n{{#if requestBody}}\n body: { $ref: '{{requestBody.schemaName}}#' },\n{{/if}}\n{{#if responses.length}}\n response: { {{#each responses}}{{#if schemaName}}{{statusCode}}: { $ref: '{{schemaName}}#' }{{#unless @last}}, {{/unless}}{{/if}}{{/each}} },\n{{/if}}\n },\n }, async (req: FastifyRequest, reply: FastifyReply) => {\n{{#if extensions.length}}\n const result = await runOverlays('{{operationId}}', handlers, toHttpRequest(req));\n if (!result.success) return sendError(reply, result.error);\n{{/if}}\n // Build input object (always required, even if empty)\n const input: types.{{inputType}} = {\n{{#if pathParams.length}}\n ...(req.params as types.{{typeNameBase}}Params),\n{{/if}}\n{{#if queryParams.length}}\n ...(req.query as types.{{typeNameBase}}Params),\n{{/if}}\n{{#if requestBody}}\n data: req.body as types.{{requestBody.schemaName}},\n{{/if}}\n };\n return {{serviceKey}}.{{serviceMethod}}(input);\n });\n\n{{/each}}\n}\n";
|
|
8
|
-
export declare const STARTER_FETCH_CLIENT_TEMPLATE = "/**\n * Auto-generated HTTP Client from OpenAPI specification\n * Generated from: {{title}} v{{version}}\n * \n * DO NOT EDIT MANUALLY\n * \n * Client API matches Service API signature (single input object).\n * Internally maps input to HTTP request (path params, query params, body).\n */\n\nimport type {\n{{#each serviceTypes}}\n {{this}},\n{{/each}}\n} from '{{contractPackage}}/services';\nimport type {\n{{#each schemaTypes}}\n {{this}},\n{{/each}}\n} from '{{contractPackage}}/schemas';\nimport { ApiError } from '{{contractPackage}}/errors';\n\n// BASE_URL derived from OpenAPI servers[0].url: {{baseUrl}}\n// Can be overridden via environment variable (Vite: VITE_API_BASE_URL)\nconst BASE_URL = (typeof import.meta !== 'undefined' && import.meta.env?.VITE_API_BASE_URL) || '{{baseUrl}}';\n\n/**\n * Handle HTTP response with typed error handling\n */\nasync function handleResponse<T>(res: Response): Promise<T> {\n if (!res.ok) {\n const problem = await res.json() as ProblemDetails;\n throw new ApiError(\n res.status,\n problem,\n res.headers.get('x-request-id') ?? undefined\n );\n }\n // Handle 204 No Content and empty responses\n if (res.status === 204 || res.headers.get('content-length') === '0') {\n return undefined as T;\n }\n return res.json();\n}\n\n{{#each services}}\n// ==========================================================================\n// {{name}} API Client\n// ==========================================================================\nexport const {{key}}Api: {{name}}ServiceApi = {\n{{#each ../routes}}\n{{#if (eq service ../name)}}\n /**\n * {{httpMethod}} {{path}}\n {{#if summary}}* {{summary}}{{/if}}\n {{#if isPublished}}* @published{{/if}}\n */\n async {{serviceMethod}}(input: {{inputType}}): Promise<{{responseType}}> {\n{{#if queryParams.length}}\n const searchParams = new URLSearchParams();\n{{#each queryParams}}\n if (input.{{name}} !== undefined) searchParams.set('{{name}}', String(input.{{name}}));\n{{/each}}\n{{/if}}\n{{#if pathParams.length}}\n const url = `${BASE_URL}{{clientUrlPatternInput}}`{{#if queryParams.length}} + (searchParams.toString() ? '?' + searchParams : ''){{/if}};\n{{else}}\n const url = `${BASE_URL}{{path}}`{{#if queryParams.length}} + (searchParams.toString() ? '?' + searchParams : ''){{/if}};\n{{/if}}\n{{#if (eq httpMethod \"GET\")}}\n const res = await fetch(url);\n{{else if requestType}}\n const res = await fetch(url, {\n method: '{{httpMethod}}',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input.data),\n });\n{{else}}\n const res = await fetch(url, { method: '{{httpMethod}}' });\n{{/if}}\n{{#if (eq responseType \"void\")}}\n await handleResponse<void>(res);\n{{else}}\n return handleResponse<{{responseType}}>(res);\n{{/if}}\n },\n\n{{/if}}\n{{/each}}\n};\n\n{{/each}}\n";
|
|
9
|
-
export declare const STARTER_SERVICE_STUBS_TEMPLATE = "{{!-- Service implementation stubs template --}}\n{{!-- Generates skeleton implementations for service methods --}}\n// Auto-generated service stubs - Edit to implement business logic\nimport type { {{#each services}}{{this}}ServiceApi{{#unless @last}}, {{/unless}}{{/each}} } from '{{config.contractPackage}}/services';\nimport type * as types from '{{config.contractPackage}}/schemas/types';\n\n{{#each services}}\n/**\n * {{this}} Service Implementation\n * \n * Implement the methods below with your business logic.\n * Generated methods receive HTTP-agnostic input objects.\n */\nexport class {{this}}Service implements {{this}}ServiceApi {\n{{#each ../operations}}\n{{#if (eq service ../this)}}\n /**\n * {{summary}}\n * {{method}} {{path}}\n */\n async {{serviceMethod}}({{#if inputType}}input: types.{{inputType}}{{/if}}): Promise<types.{{responseType}}> {\n // TODO: Implement {{serviceMethod}}\n throw new Error('Not implemented: {{serviceMethod}}');\n }\n\n{{/if}}\n{{/each}}\n}\n\n{{/each}}\n";
|
|
10
|
-
export declare const STARTER_OVERLAY_ADAPTER_TEMPLATE = "/**\n * Auto-generated Overlay Adapter\n * Generated from: {{spec.info.title}} v{{spec.info.version}}\n * DO NOT EDIT MANUALLY\n */\n\nimport type { FastifyReply } from 'fastify';\nimport type { OverlayResult, OverlayRegistry } from '{{contractPackage}}/overlays/index.js';\nimport type { ProblemDetails } from '{{contractPackage}}/schemas/types.js';\n\n// ==========================================================================\n// Types\n// ==========================================================================\n\n/** HTTP request abstraction */\nexport interface HttpRequest {\n headers: Record<string, string | string[] | undefined>;\n params: Record<string, string>;\n query: Record<string, unknown>;\n body: unknown;\n}\n\n/** Parameter extractor function */\ntype ParamExtractor = (req: HttpRequest) => Record<string, unknown>;\n\n// ==========================================================================\n// Parameter Extractors (one per overlay, shared across endpoints)\n// ==========================================================================\n\nconst getHeader = (req: HttpRequest, name: string): string | undefined =>\n req.headers[name.toLowerCase()] as string | undefined;\n\nconst getQuery = (req: HttpRequest, name: string): unknown => req.query[name];\n\nconst getParam = (req: HttpRequest, name: string): string | undefined => req.params[name];\n\n/** Overlay parameter extractors - each overlay defined once */\nconst extractors: Record<string, ParamExtractor> = {\n{{#each uniqueOverlays}}\n '{{name}}': (req) => ({\n{{#each params}}\n '{{name}}': {{#if (eq location \"headers\")}}getHeader(req, '{{name}}'){{else if (eq location \"query\")}}getQuery(req, '{{name}}'){{else}}getParam(req, '{{name}}'){{/if}},\n{{/each}}\n }),\n{{/each}}\n};\n\n// ==========================================================================\n// Endpoint \u2192 Overlay Mapping\n// ==========================================================================\n\n/** Which overlays apply to each endpoint */\nexport const endpointOverlays: Record<string, string[]> = {\n{{#each routes}}\n{{#if extensions.length}}\n '{{operationId}}': [{{#each extensions}}'{{value}}'{{#unless @last}}, {{/unless}}{{/each}}],\n{{/if}}\n{{/each}}\n};\n\n// ==========================================================================\n// Overlay Execution\n// ==========================================================================\n\n/**\n * Execute overlays for an endpoint\n */\nexport async function runOverlays(\n operationId: string,\n handlers: OverlayRegistry,\n req: HttpRequest\n): Promise<{ success: true; context: Record<string, unknown> } | { success: false; error: ProblemDetails }> {\n const overlayNames = endpointOverlays[operationId] || [];\n const context: Record<string, unknown> = {};\n\n for (const name of overlayNames) {\n const extract = extractors[name];\n const handler = handlers[name as keyof OverlayRegistry];\n \n if (!extract || !handler) continue;\n\n const input = extract(req);\n const result = await (handler as (input: Record<string, unknown>) => Promise<OverlayResult<unknown>>)(input);\n\n if (!result.success) {\n return {\n success: false,\n error: {\n type: `/errors/${result.error?.code?.toLowerCase() ?? 'error'}`,\n title: result.error?.message ?? 'Error',\n status: result.error?.status ?? 500,\n },\n };\n }\n\n if (result.context) {\n Object.assign(context, result.context);\n }\n }\n\n return { success: true, context };\n}\n\n/**\n * Build HttpRequest from Fastify request\n */\nexport function toHttpRequest(req: { headers: unknown; params: unknown; query: unknown; body: unknown }): HttpRequest {\n return {\n headers: req.headers as Record<string, string | string[] | undefined>,\n params: req.params as Record<string, string>,\n query: req.query as Record<string, unknown>,\n body: req.body,\n };\n}\n\n/**\n * Send error response\n */\nexport function sendError(reply: FastifyReply, error: ProblemDetails): void {\n reply.status(error.status).send(error);\n}\n";
|
|
11
|
-
export declare const STARTER_OVERLAY_STUBS_TEMPLATE = "{{!-- Extension implementation stubs template --}}\n{{!-- Generates skeleton implementations for overlay handlers --}}\n// Auto-generated extension stubs - Edit to implement overlay logic\nimport type {\n OverlayResult,\n{{#each extensionTypes}}\n {{this}}OverlayInput,\n {{this}}Overlay,\n{{/each}}\n OverlayRegistry,\n} from '{{config.contractPackage}}/overlays';\n\n{{#each extensions}}\n/**\n * {{name}} overlay handler\n * \n * Called when an endpoint has x-middleware: [{{name}}]\n * Returns OverlayResult with success/error status\n */\nexport async function {{camelCase name}}(\n input: {{pascalCase name}}OverlayInput\n): Promise<OverlayResult> {\n // TODO: Implement {{name}} logic\n{{#if injectedParameters}}\n // Input parameters:\n{{#each injectedParameters}}\n // - {{name}}: {{schema.type}}{{#if required}} (required){{/if}}\n{{/each}}\n{{/if}}\n\n // Example implementation:\n // if (!validateSomething(input)) {\n // return {\n // success: false,\n // error: { status: 4xx, message: 'Error message', code: 'ERROR_CODE' },\n // };\n // }\n\n return { success: true, context: { /* optional context for service */ } };\n}\n\n{{/each}}\n/**\n * Registry of all overlay handlers\n * Register this with your server framework\n */\nexport const overlayHandlers: OverlayRegistry = {\n{{#each extensions}}\n {{camelCase name}}: {{camelCase name}},\n{{/each}}\n};\n";
|
|
12
|
-
export declare const STARTER_SCREEN_NAVIGATION_TEMPLATE = "/**\n * Auto-generated screen navigation map from OpenAPI screen specification\n * Generated from: {{title}} v{{version}}\n * DO NOT EDIT MANUALLY\n */\n\nconst _OP_ROUTES = {\n{{#each screens}}\n {{operationId}}: '{{route}}',\n{{/each}}\n} as const;\n\nexport const SCREENS = {\n{{#each screens}}\n {{screenConst}}: { id: '{{screenId}}' as const, route: _OP_ROUTES.{{operationId}}, supportsBack: {{supportsBack}} } as const,\n{{/each}}\n} as const;\n\n{{#each screens}}\n{{#if links.length}}\nexport const {{screenConst}}_PAGE_LINKS = {\n{{#each links}}\n {{name}}: _OP_ROUTES.{{targetOperationId}},\n{{/each}}\n} as const;\n\n{{/if}}\n{{/each}}\n";
|
|
13
|
-
export declare const STARTER_SCREEN_EVENTS_TEMPLATE = "/**\n * Auto-generated analytics event hooks from OpenAPI screen specification\n * Generated from: {{title}} v{{version}}\n * DO NOT EDIT MANUALLY\n */\n\nimport { trackEvent } from '@/lib/analytics';\n\n{{#each screens}}\n{{#if events.length}}\nexport function use{{screenName}}Events() {\n return {\n{{#each events}}\n{{#if this.params}}\n {{this.method}}: ({{#each this.params}}{{@key}}: {{#if (eq this 'integer')}}number{{else}}{{this}}{{/if}}{{#unless @last}}, {{/unless}}{{/each}}) =>\n trackEvent('{{this.name}}', '{{this.type}}', { {{#each this.params}}{{@key}}{{#unless @last}}, {{/unless}}{{/each}} }),\n{{else}}\n {{this.method}}: () =>\n trackEvent('{{this.name}}', '{{this.type}}', {}),\n{{/if}}\n{{/each}}\n };\n}\n\n{{/if}}\n{{/each}}\n";
|
|
14
|
-
/**
|
|
15
|
-
* Get all starter templates
|
|
16
|
-
*/
|
|
17
|
-
export declare function getStarterTemplates(): Record<string, string>;
|
|
18
|
-
/**
|
|
19
|
-
* Get screen spec starter templates
|
|
20
|
-
*/
|
|
21
|
-
export declare function getScreenStarterTemplates(): Record<string, string>;
|
|
22
|
-
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/cli/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,+BAA+B,o/DA2D3C,CAAC;AAEF,eAAO,MAAM,6BAA6B,40FA4FzC,CAAC;AAEF,eAAO,MAAM,8BAA8B,ggCA8B1C,CAAC;AAEF,eAAO,MAAM,gCAAgC,ijIAyH5C,CAAC;AAEF,eAAO,MAAM,8BAA8B,83CAmD1C,CAAC;AAMF,eAAO,MAAM,kCAAkC,gpBA4B9C,CAAC;AAEF,eAAO,MAAM,8BAA8B,swBA0B1C,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ5D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKlE"}
|
package/dist/cli/templates.js
DELETED
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Starter Templates for micro-contracts init command
|
|
3
|
-
*
|
|
4
|
-
* These templates are created in spec/default/templates/ and can be customized.
|
|
5
|
-
* Keep in sync with examples/spec/default/templates/
|
|
6
|
-
*/
|
|
7
|
-
export const STARTER_FASTIFY_ROUTES_TEMPLATE = `/**
|
|
8
|
-
* Auto-generated Fastify routes
|
|
9
|
-
* Generated from: {{spec.info.title}} v{{spec.info.version}}
|
|
10
|
-
* DO NOT EDIT MANUALLY
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';
|
|
14
|
-
import { allSchemas } from '{{contractPackage}}/schemas/index.js';
|
|
15
|
-
import * as types from '{{contractPackage}}/schemas/types.js';
|
|
16
|
-
{{#if extensionInfo.length}}
|
|
17
|
-
import { runOverlays, toHttpRequest, sendError } from './overlayAdapter.generated.js';
|
|
18
|
-
{{/if}}
|
|
19
|
-
|
|
20
|
-
export async function registerRoutes(fastify: FastifyInstance): Promise<void> {
|
|
21
|
-
for (const schema of allSchemas) {
|
|
22
|
-
fastify.addSchema(schema);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const { {{#each services}}{{key}}{{#unless @last}}, {{/unless}}{{/each}} } = {{servicesPath}};
|
|
26
|
-
{{#if extensionInfo.length}}
|
|
27
|
-
const handlers = fastify.overlayHandlers;
|
|
28
|
-
{{/if}}
|
|
29
|
-
|
|
30
|
-
{{#each routes}}
|
|
31
|
-
// {{uppercase method}} {{path}}{{#if isPublished}} [PUBLISHED]{{/if}}
|
|
32
|
-
fastify.{{method}}('{{fastifyPath}}', {
|
|
33
|
-
schema: {
|
|
34
|
-
{{#if paramsType}}
|
|
35
|
-
params: { $ref: '{{typeNameBase}}Params#' },
|
|
36
|
-
{{/if}}
|
|
37
|
-
{{#if requestBody}}
|
|
38
|
-
body: { $ref: '{{requestBody.schemaName}}#' },
|
|
39
|
-
{{/if}}
|
|
40
|
-
{{#if responses.length}}
|
|
41
|
-
response: { {{#each responses}}{{#if schemaName}}{{statusCode}}: { $ref: '{{schemaName}}#' }{{#unless @last}}, {{/unless}}{{/if}}{{/each}} },
|
|
42
|
-
{{/if}}
|
|
43
|
-
},
|
|
44
|
-
}, async (req: FastifyRequest, reply: FastifyReply) => {
|
|
45
|
-
{{#if extensions.length}}
|
|
46
|
-
const result = await runOverlays('{{operationId}}', handlers, toHttpRequest(req));
|
|
47
|
-
if (!result.success) return sendError(reply, result.error);
|
|
48
|
-
{{/if}}
|
|
49
|
-
// Build input object (always required, even if empty)
|
|
50
|
-
const input: types.{{inputType}} = {
|
|
51
|
-
{{#if pathParams.length}}
|
|
52
|
-
...(req.params as types.{{typeNameBase}}Params),
|
|
53
|
-
{{/if}}
|
|
54
|
-
{{#if queryParams.length}}
|
|
55
|
-
...(req.query as types.{{typeNameBase}}Params),
|
|
56
|
-
{{/if}}
|
|
57
|
-
{{#if requestBody}}
|
|
58
|
-
data: req.body as types.{{requestBody.schemaName}},
|
|
59
|
-
{{/if}}
|
|
60
|
-
};
|
|
61
|
-
return {{serviceKey}}.{{serviceMethod}}(input);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
{{/each}}
|
|
65
|
-
}
|
|
66
|
-
`;
|
|
67
|
-
export const STARTER_FETCH_CLIENT_TEMPLATE = `/**
|
|
68
|
-
* Auto-generated HTTP Client from OpenAPI specification
|
|
69
|
-
* Generated from: {{title}} v{{version}}
|
|
70
|
-
*
|
|
71
|
-
* DO NOT EDIT MANUALLY
|
|
72
|
-
*
|
|
73
|
-
* Client API matches Service API signature (single input object).
|
|
74
|
-
* Internally maps input to HTTP request (path params, query params, body).
|
|
75
|
-
*/
|
|
76
|
-
|
|
77
|
-
import type {
|
|
78
|
-
{{#each serviceTypes}}
|
|
79
|
-
{{this}},
|
|
80
|
-
{{/each}}
|
|
81
|
-
} from '{{contractPackage}}/services';
|
|
82
|
-
import type {
|
|
83
|
-
{{#each schemaTypes}}
|
|
84
|
-
{{this}},
|
|
85
|
-
{{/each}}
|
|
86
|
-
} from '{{contractPackage}}/schemas';
|
|
87
|
-
import { ApiError } from '{{contractPackage}}/errors';
|
|
88
|
-
|
|
89
|
-
// BASE_URL derived from OpenAPI servers[0].url: {{baseUrl}}
|
|
90
|
-
// Can be overridden via environment variable (Vite: VITE_API_BASE_URL)
|
|
91
|
-
const BASE_URL = (typeof import.meta !== 'undefined' && import.meta.env?.VITE_API_BASE_URL) || '{{baseUrl}}';
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Handle HTTP response with typed error handling
|
|
95
|
-
*/
|
|
96
|
-
async function handleResponse<T>(res: Response): Promise<T> {
|
|
97
|
-
if (!res.ok) {
|
|
98
|
-
const problem = await res.json() as ProblemDetails;
|
|
99
|
-
throw new ApiError(
|
|
100
|
-
res.status,
|
|
101
|
-
problem,
|
|
102
|
-
res.headers.get('x-request-id') ?? undefined
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
// Handle 204 No Content and empty responses
|
|
106
|
-
if (res.status === 204 || res.headers.get('content-length') === '0') {
|
|
107
|
-
return undefined as T;
|
|
108
|
-
}
|
|
109
|
-
return res.json();
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
{{#each services}}
|
|
113
|
-
// ==========================================================================
|
|
114
|
-
// {{name}} API Client
|
|
115
|
-
// ==========================================================================
|
|
116
|
-
export const {{key}}Api: {{name}}ServiceApi = {
|
|
117
|
-
{{#each ../routes}}
|
|
118
|
-
{{#if (eq service ../name)}}
|
|
119
|
-
/**
|
|
120
|
-
* {{httpMethod}} {{path}}
|
|
121
|
-
{{#if summary}}* {{summary}}{{/if}}
|
|
122
|
-
{{#if isPublished}}* @published{{/if}}
|
|
123
|
-
*/
|
|
124
|
-
async {{serviceMethod}}(input: {{inputType}}): Promise<{{responseType}}> {
|
|
125
|
-
{{#if queryParams.length}}
|
|
126
|
-
const searchParams = new URLSearchParams();
|
|
127
|
-
{{#each queryParams}}
|
|
128
|
-
if (input.{{name}} !== undefined) searchParams.set('{{name}}', String(input.{{name}}));
|
|
129
|
-
{{/each}}
|
|
130
|
-
{{/if}}
|
|
131
|
-
{{#if pathParams.length}}
|
|
132
|
-
const url = \`\${BASE_URL}{{clientUrlPatternInput}}\`{{#if queryParams.length}} + (searchParams.toString() ? '?' + searchParams : ''){{/if}};
|
|
133
|
-
{{else}}
|
|
134
|
-
const url = \`\${BASE_URL}{{path}}\`{{#if queryParams.length}} + (searchParams.toString() ? '?' + searchParams : ''){{/if}};
|
|
135
|
-
{{/if}}
|
|
136
|
-
{{#if (eq httpMethod "GET")}}
|
|
137
|
-
const res = await fetch(url);
|
|
138
|
-
{{else if requestType}}
|
|
139
|
-
const res = await fetch(url, {
|
|
140
|
-
method: '{{httpMethod}}',
|
|
141
|
-
headers: { 'Content-Type': 'application/json' },
|
|
142
|
-
body: JSON.stringify(input.data),
|
|
143
|
-
});
|
|
144
|
-
{{else}}
|
|
145
|
-
const res = await fetch(url, { method: '{{httpMethod}}' });
|
|
146
|
-
{{/if}}
|
|
147
|
-
{{#if (eq responseType "void")}}
|
|
148
|
-
await handleResponse<void>(res);
|
|
149
|
-
{{else}}
|
|
150
|
-
return handleResponse<{{responseType}}>(res);
|
|
151
|
-
{{/if}}
|
|
152
|
-
},
|
|
153
|
-
|
|
154
|
-
{{/if}}
|
|
155
|
-
{{/each}}
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
{{/each}}
|
|
159
|
-
`;
|
|
160
|
-
export const STARTER_SERVICE_STUBS_TEMPLATE = `{{!-- Service implementation stubs template --}}
|
|
161
|
-
{{!-- Generates skeleton implementations for service methods --}}
|
|
162
|
-
// Auto-generated service stubs - Edit to implement business logic
|
|
163
|
-
import type { {{#each services}}{{this}}ServiceApi{{#unless @last}}, {{/unless}}{{/each}} } from '{{config.contractPackage}}/services';
|
|
164
|
-
import type * as types from '{{config.contractPackage}}/schemas/types';
|
|
165
|
-
|
|
166
|
-
{{#each services}}
|
|
167
|
-
/**
|
|
168
|
-
* {{this}} Service Implementation
|
|
169
|
-
*
|
|
170
|
-
* Implement the methods below with your business logic.
|
|
171
|
-
* Generated methods receive HTTP-agnostic input objects.
|
|
172
|
-
*/
|
|
173
|
-
export class {{this}}Service implements {{this}}ServiceApi {
|
|
174
|
-
{{#each ../operations}}
|
|
175
|
-
{{#if (eq service ../this)}}
|
|
176
|
-
/**
|
|
177
|
-
* {{summary}}
|
|
178
|
-
* {{method}} {{path}}
|
|
179
|
-
*/
|
|
180
|
-
async {{serviceMethod}}({{#if inputType}}input: types.{{inputType}}{{/if}}): Promise<types.{{responseType}}> {
|
|
181
|
-
// TODO: Implement {{serviceMethod}}
|
|
182
|
-
throw new Error('Not implemented: {{serviceMethod}}');
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
{{/if}}
|
|
186
|
-
{{/each}}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
{{/each}}
|
|
190
|
-
`;
|
|
191
|
-
export const STARTER_OVERLAY_ADAPTER_TEMPLATE = `/**
|
|
192
|
-
* Auto-generated Overlay Adapter
|
|
193
|
-
* Generated from: {{spec.info.title}} v{{spec.info.version}}
|
|
194
|
-
* DO NOT EDIT MANUALLY
|
|
195
|
-
*/
|
|
196
|
-
|
|
197
|
-
import type { FastifyReply } from 'fastify';
|
|
198
|
-
import type { OverlayResult, OverlayRegistry } from '{{contractPackage}}/overlays/index.js';
|
|
199
|
-
import type { ProblemDetails } from '{{contractPackage}}/schemas/types.js';
|
|
200
|
-
|
|
201
|
-
// ==========================================================================
|
|
202
|
-
// Types
|
|
203
|
-
// ==========================================================================
|
|
204
|
-
|
|
205
|
-
/** HTTP request abstraction */
|
|
206
|
-
export interface HttpRequest {
|
|
207
|
-
headers: Record<string, string | string[] | undefined>;
|
|
208
|
-
params: Record<string, string>;
|
|
209
|
-
query: Record<string, unknown>;
|
|
210
|
-
body: unknown;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/** Parameter extractor function */
|
|
214
|
-
type ParamExtractor = (req: HttpRequest) => Record<string, unknown>;
|
|
215
|
-
|
|
216
|
-
// ==========================================================================
|
|
217
|
-
// Parameter Extractors (one per overlay, shared across endpoints)
|
|
218
|
-
// ==========================================================================
|
|
219
|
-
|
|
220
|
-
const getHeader = (req: HttpRequest, name: string): string | undefined =>
|
|
221
|
-
req.headers[name.toLowerCase()] as string | undefined;
|
|
222
|
-
|
|
223
|
-
const getQuery = (req: HttpRequest, name: string): unknown => req.query[name];
|
|
224
|
-
|
|
225
|
-
const getParam = (req: HttpRequest, name: string): string | undefined => req.params[name];
|
|
226
|
-
|
|
227
|
-
/** Overlay parameter extractors - each overlay defined once */
|
|
228
|
-
const extractors: Record<string, ParamExtractor> = {
|
|
229
|
-
{{#each uniqueOverlays}}
|
|
230
|
-
'{{name}}': (req) => ({
|
|
231
|
-
{{#each params}}
|
|
232
|
-
'{{name}}': {{#if (eq location "headers")}}getHeader(req, '{{name}}'){{else if (eq location "query")}}getQuery(req, '{{name}}'){{else}}getParam(req, '{{name}}'){{/if}},
|
|
233
|
-
{{/each}}
|
|
234
|
-
}),
|
|
235
|
-
{{/each}}
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
// ==========================================================================
|
|
239
|
-
// Endpoint → Overlay Mapping
|
|
240
|
-
// ==========================================================================
|
|
241
|
-
|
|
242
|
-
/** Which overlays apply to each endpoint */
|
|
243
|
-
export const endpointOverlays: Record<string, string[]> = {
|
|
244
|
-
{{#each routes}}
|
|
245
|
-
{{#if extensions.length}}
|
|
246
|
-
'{{operationId}}': [{{#each extensions}}'{{value}}'{{#unless @last}}, {{/unless}}{{/each}}],
|
|
247
|
-
{{/if}}
|
|
248
|
-
{{/each}}
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
// ==========================================================================
|
|
252
|
-
// Overlay Execution
|
|
253
|
-
// ==========================================================================
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Execute overlays for an endpoint
|
|
257
|
-
*/
|
|
258
|
-
export async function runOverlays(
|
|
259
|
-
operationId: string,
|
|
260
|
-
handlers: OverlayRegistry,
|
|
261
|
-
req: HttpRequest
|
|
262
|
-
): Promise<{ success: true; context: Record<string, unknown> } | { success: false; error: ProblemDetails }> {
|
|
263
|
-
const overlayNames = endpointOverlays[operationId] || [];
|
|
264
|
-
const context: Record<string, unknown> = {};
|
|
265
|
-
|
|
266
|
-
for (const name of overlayNames) {
|
|
267
|
-
const extract = extractors[name];
|
|
268
|
-
const handler = handlers[name as keyof OverlayRegistry];
|
|
269
|
-
|
|
270
|
-
if (!extract || !handler) continue;
|
|
271
|
-
|
|
272
|
-
const input = extract(req);
|
|
273
|
-
const result = await (handler as (input: Record<string, unknown>) => Promise<OverlayResult<unknown>>)(input);
|
|
274
|
-
|
|
275
|
-
if (!result.success) {
|
|
276
|
-
return {
|
|
277
|
-
success: false,
|
|
278
|
-
error: {
|
|
279
|
-
type: \`/errors/\${result.error?.code?.toLowerCase() ?? 'error'}\`,
|
|
280
|
-
title: result.error?.message ?? 'Error',
|
|
281
|
-
status: result.error?.status ?? 500,
|
|
282
|
-
},
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (result.context) {
|
|
287
|
-
Object.assign(context, result.context);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
return { success: true, context };
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Build HttpRequest from Fastify request
|
|
296
|
-
*/
|
|
297
|
-
export function toHttpRequest(req: { headers: unknown; params: unknown; query: unknown; body: unknown }): HttpRequest {
|
|
298
|
-
return {
|
|
299
|
-
headers: req.headers as Record<string, string | string[] | undefined>,
|
|
300
|
-
params: req.params as Record<string, string>,
|
|
301
|
-
query: req.query as Record<string, unknown>,
|
|
302
|
-
body: req.body,
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Send error response
|
|
308
|
-
*/
|
|
309
|
-
export function sendError(reply: FastifyReply, error: ProblemDetails): void {
|
|
310
|
-
reply.status(error.status).send(error);
|
|
311
|
-
}
|
|
312
|
-
`;
|
|
313
|
-
export const STARTER_OVERLAY_STUBS_TEMPLATE = `{{!-- Extension implementation stubs template --}}
|
|
314
|
-
{{!-- Generates skeleton implementations for overlay handlers --}}
|
|
315
|
-
// Auto-generated extension stubs - Edit to implement overlay logic
|
|
316
|
-
import type {
|
|
317
|
-
OverlayResult,
|
|
318
|
-
{{#each extensionTypes}}
|
|
319
|
-
{{this}}OverlayInput,
|
|
320
|
-
{{this}}Overlay,
|
|
321
|
-
{{/each}}
|
|
322
|
-
OverlayRegistry,
|
|
323
|
-
} from '{{config.contractPackage}}/overlays';
|
|
324
|
-
|
|
325
|
-
{{#each extensions}}
|
|
326
|
-
/**
|
|
327
|
-
* {{name}} overlay handler
|
|
328
|
-
*
|
|
329
|
-
* Called when an endpoint has x-middleware: [{{name}}]
|
|
330
|
-
* Returns OverlayResult with success/error status
|
|
331
|
-
*/
|
|
332
|
-
export async function {{camelCase name}}(
|
|
333
|
-
input: {{pascalCase name}}OverlayInput
|
|
334
|
-
): Promise<OverlayResult> {
|
|
335
|
-
// TODO: Implement {{name}} logic
|
|
336
|
-
{{#if injectedParameters}}
|
|
337
|
-
// Input parameters:
|
|
338
|
-
{{#each injectedParameters}}
|
|
339
|
-
// - {{name}}: {{schema.type}}{{#if required}} (required){{/if}}
|
|
340
|
-
{{/each}}
|
|
341
|
-
{{/if}}
|
|
342
|
-
|
|
343
|
-
// Example implementation:
|
|
344
|
-
// if (!validateSomething(input)) {
|
|
345
|
-
// return {
|
|
346
|
-
// success: false,
|
|
347
|
-
// error: { status: 4xx, message: 'Error message', code: 'ERROR_CODE' },
|
|
348
|
-
// };
|
|
349
|
-
// }
|
|
350
|
-
|
|
351
|
-
return { success: true, context: { /* optional context for service */ } };
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
{{/each}}
|
|
355
|
-
/**
|
|
356
|
-
* Registry of all overlay handlers
|
|
357
|
-
* Register this with your server framework
|
|
358
|
-
*/
|
|
359
|
-
export const overlayHandlers: OverlayRegistry = {
|
|
360
|
-
{{#each extensions}}
|
|
361
|
-
{{camelCase name}}: {{camelCase name}},
|
|
362
|
-
{{/each}}
|
|
363
|
-
};
|
|
364
|
-
`;
|
|
365
|
-
// =============================================================================
|
|
366
|
-
// Screen Spec Templates
|
|
367
|
-
// =============================================================================
|
|
368
|
-
export const STARTER_SCREEN_NAVIGATION_TEMPLATE = `/**
|
|
369
|
-
* Auto-generated screen navigation map from OpenAPI screen specification
|
|
370
|
-
* Generated from: {{title}} v{{version}}
|
|
371
|
-
* DO NOT EDIT MANUALLY
|
|
372
|
-
*/
|
|
373
|
-
|
|
374
|
-
const _OP_ROUTES = {
|
|
375
|
-
{{#each screens}}
|
|
376
|
-
{{operationId}}: '{{route}}',
|
|
377
|
-
{{/each}}
|
|
378
|
-
} as const;
|
|
379
|
-
|
|
380
|
-
export const SCREENS = {
|
|
381
|
-
{{#each screens}}
|
|
382
|
-
{{screenConst}}: { id: '{{screenId}}' as const, route: _OP_ROUTES.{{operationId}}, supportsBack: {{supportsBack}} } as const,
|
|
383
|
-
{{/each}}
|
|
384
|
-
} as const;
|
|
385
|
-
|
|
386
|
-
{{#each screens}}
|
|
387
|
-
{{#if links.length}}
|
|
388
|
-
export const {{screenConst}}_PAGE_LINKS = {
|
|
389
|
-
{{#each links}}
|
|
390
|
-
{{name}}: _OP_ROUTES.{{targetOperationId}},
|
|
391
|
-
{{/each}}
|
|
392
|
-
} as const;
|
|
393
|
-
|
|
394
|
-
{{/if}}
|
|
395
|
-
{{/each}}
|
|
396
|
-
`;
|
|
397
|
-
export const STARTER_SCREEN_EVENTS_TEMPLATE = `/**
|
|
398
|
-
* Auto-generated analytics event hooks from OpenAPI screen specification
|
|
399
|
-
* Generated from: {{title}} v{{version}}
|
|
400
|
-
* DO NOT EDIT MANUALLY
|
|
401
|
-
*/
|
|
402
|
-
|
|
403
|
-
import { trackEvent } from '@/lib/analytics';
|
|
404
|
-
|
|
405
|
-
{{#each screens}}
|
|
406
|
-
{{#if events.length}}
|
|
407
|
-
export function use{{screenName}}Events() {
|
|
408
|
-
return {
|
|
409
|
-
{{#each events}}
|
|
410
|
-
{{#if this.params}}
|
|
411
|
-
{{this.method}}: ({{#each this.params}}{{@key}}: {{#if (eq this 'integer')}}number{{else}}{{this}}{{/if}}{{#unless @last}}, {{/unless}}{{/each}}) =>
|
|
412
|
-
trackEvent('{{this.name}}', '{{this.type}}', { {{#each this.params}}{{@key}}{{#unless @last}}, {{/unless}}{{/each}} }),
|
|
413
|
-
{{else}}
|
|
414
|
-
{{this.method}}: () =>
|
|
415
|
-
trackEvent('{{this.name}}', '{{this.type}}', {}),
|
|
416
|
-
{{/if}}
|
|
417
|
-
{{/each}}
|
|
418
|
-
};
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
{{/if}}
|
|
422
|
-
{{/each}}
|
|
423
|
-
`;
|
|
424
|
-
/**
|
|
425
|
-
* Get all starter templates
|
|
426
|
-
*/
|
|
427
|
-
export function getStarterTemplates() {
|
|
428
|
-
return {
|
|
429
|
-
'fastify-routes.hbs': STARTER_FASTIFY_ROUTES_TEMPLATE,
|
|
430
|
-
'fetch-client.hbs': STARTER_FETCH_CLIENT_TEMPLATE,
|
|
431
|
-
'service-stubs.hbs': STARTER_SERVICE_STUBS_TEMPLATE,
|
|
432
|
-
'overlay-adapter.hbs': STARTER_OVERLAY_ADAPTER_TEMPLATE,
|
|
433
|
-
'overlay-stubs.hbs': STARTER_OVERLAY_STUBS_TEMPLATE,
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* Get screen spec starter templates
|
|
438
|
-
*/
|
|
439
|
-
export function getScreenStarterTemplates() {
|
|
440
|
-
return {
|
|
441
|
-
'screen-navigation.hbs': STARTER_SCREEN_NAVIGATION_TEMPLATE,
|
|
442
|
-
'screen-events.hbs': STARTER_SCREEN_EVENTS_TEMPLATE,
|
|
443
|
-
};
|
|
444
|
-
}
|
|
445
|
-
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/cli/templates.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2D9C,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4F5C,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B7C,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyH/C,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmD7C,CAAC;AAEF,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,kCAAkC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjD,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B7C,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,oBAAoB,EAAE,+BAA+B;QACrD,kBAAkB,EAAE,6BAA6B;QACjD,mBAAmB,EAAE,8BAA8B;QACnD,qBAAqB,EAAE,gCAAgC;QACvD,mBAAmB,EAAE,8BAA8B;KACpD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,uBAAuB,EAAE,kCAAkC;QAC3D,mBAAmB,EAAE,8BAA8B;KACpD,CAAC;AACJ,CAAC"}
|
package/dist/cli.d.ts
DELETED
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|