@openmirai/typeforge 0.1.8 → 0.2.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/README.md +1 -5
- package/dist/adapters/axios/index.d.ts +13 -2
- package/dist/adapters/axios/index.js +1 -43
- package/dist/adapters/fetch/index.d.ts +17 -2
- package/dist/adapters/fetch/index.js +1 -77
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +5 -168
- package/dist/http/types.d.ts +12 -2
- package/dist/http/types.js +1 -2
- package/dist/http/validate.d.ts +1 -2
- package/dist/http/validate.js +1 -21
- package/dist/index.d.ts +133 -5
- package/dist/index.js +1 -13
- package/dist/init-CqBQsEHz.js +134 -0
- package/dist/routes/index.d.ts +1 -2
- package/dist/routes/index.js +1 -38
- package/dist/validation/zod.d.ts +1 -2
- package/dist/validation/zod.js +1 -8
- package/package.json +3 -4
- package/assets/typeforge-logo.png +0 -0
- package/dist/adapters/axios/index.d.ts.map +0 -1
- package/dist/adapters/axios/index.js.map +0 -1
- package/dist/adapters/fetch/index.d.ts.map +0 -1
- package/dist/adapters/fetch/index.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/http/types.d.ts.map +0 -1
- package/dist/http/validate.d.ts.map +0 -1
- package/dist/http/validate.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-BBNO0SYd.js +0 -2029
- package/dist/init-BBNO0SYd.js.map +0 -1
- package/dist/routes/index.d.ts.map +0 -1
- package/dist/routes/index.js.map +0 -1
- package/dist/validation/zod.d.ts.map +0 -1
- package/dist/validation/zod.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/http/validate.ts","../../../src/adapters/axios/index.ts"],"sourcesContent":["export type ResponseValidator<T> = (value: unknown) => T;\n\nexport class ResponseValidationError extends Error {\n override readonly cause: unknown;\n\n constructor(message: string, cause: unknown) {\n super(message);\n this.name = \"ResponseValidationError\";\n this.cause = cause;\n }\n}\n\nexport function coerceResponseData<T>(\n value: unknown,\n validator?: ResponseValidator<T>\n): T {\n if (validator === undefined) {\n return value as T;\n }\n\n try {\n return validator(value);\n } catch (error) {\n throw new ResponseValidationError(\"Response validation failed\", error);\n }\n}\n","import type { AxiosInstance, AxiosRequestConfig } from \"axios\";\n\nimport { coerceResponseData } from \"../../http/validate\";\nimport type { HTTPFetch, HTTPFetchConfig } from \"../../http/types\";\nimport type { QueryParams } from \"../../json/types\";\n\nfunction toAxiosConfig<TParams extends object>(\n config?: HTTPFetchConfig<TParams, unknown>\n): AxiosRequestConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n const axiosConfig: AxiosRequestConfig = {};\n if (config.signal !== undefined) {\n axiosConfig.signal = config.signal;\n }\n if (config.params !== undefined) {\n axiosConfig.params = config.params;\n }\n if (config.headers !== undefined) {\n axiosConfig.headers = config.headers;\n }\n return axiosConfig;\n}\n\nfunction mapResponse<TResponse, TParams extends object>(\n data: unknown,\n config?: HTTPFetchConfig<TParams, TResponse>\n): { data: TResponse } {\n return {\n data: coerceResponseData<TResponse>(data, config?.validateResponse),\n };\n}\n\nexport function createAxiosAdapter(instance: AxiosInstance): HTTPFetch {\n return {\n delete: <TResponse, TParams extends object = QueryParams>(\n route: string,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) =>\n instance\n .delete<TResponse>(route, toAxiosConfig(config))\n .then((response) => mapResponse(response.data, config)),\n get: <TResponse, TParams extends object = QueryParams>(\n route: string,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) =>\n instance\n .get<TResponse>(route, toAxiosConfig(config))\n .then((response) => mapResponse(response.data, config)),\n patch: <TResponse, TBody = unknown, TParams extends object = QueryParams>(\n route: string,\n body: TBody,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) =>\n instance\n .patch<TResponse>(route, body, toAxiosConfig(config))\n .then((response) => mapResponse(response.data, config)),\n post: <TResponse, TBody = unknown, TParams extends object = QueryParams>(\n route: string,\n body: TBody,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) =>\n instance\n .post<TResponse>(route, body, toAxiosConfig(config))\n .then((response) => mapResponse(response.data, config)),\n put: <TResponse, TBody = unknown, TParams extends object = QueryParams>(\n route: string,\n body: TBody,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) =>\n instance\n .put<TResponse>(route, body, toAxiosConfig(config))\n .then((response) => mapResponse(response.data, config)),\n };\n}\n\nexport type { HTTPFetch, HTTPFetchConfig } from \"../../http/types\";\n"],"mappings":";AAEA,IAAa,0BAAb,cAA6C,MAAM;CACjD;CAEA,YAAY,SAAiB,OAAgB;EAC3C,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,QAAQ;CACf;AACF;AAEA,SAAgB,mBACd,OACA,WACG;CACH,IAAI,cAAc,KAAA,GAChB,OAAO;CAGT,IAAI;EACF,OAAO,UAAU,KAAK;CACxB,SAAS,OAAO;EACd,MAAM,IAAI,wBAAwB,8BAA8B,KAAK;CACvE;AACF;;;ACnBA,SAAS,cACP,QACgC;CAChC,IAAI,WAAW,KAAA,GACb;CAGF,MAAM,cAAkC,CAAC;CACzC,IAAI,OAAO,WAAW,KAAA,GACpB,YAAY,SAAS,OAAO;CAE9B,IAAI,OAAO,WAAW,KAAA,GACpB,YAAY,SAAS,OAAO;CAE9B,IAAI,OAAO,YAAY,KAAA,GACrB,YAAY,UAAU,OAAO;CAE/B,OAAO;AACT;AAEA,SAAS,YACP,MACA,QACqB;CACrB,OAAO,EACL,MAAM,mBAA8B,MAAM,QAAQ,gBAAgB,EACpE;AACF;AAEA,SAAgB,mBAAmB,UAAoC;CACrE,OAAO;EACL,SACE,OACA,WAEA,SACG,OAAkB,OAAO,cAAc,MAAM,CAAC,CAAC,CAC/C,MAAM,aAAa,YAAY,SAAS,MAAM,MAAM,CAAC;EAC1D,MACE,OACA,WAEA,SACG,IAAe,OAAO,cAAc,MAAM,CAAC,CAAC,CAC5C,MAAM,aAAa,YAAY,SAAS,MAAM,MAAM,CAAC;EAC1D,QACE,OACA,MACA,WAEA,SACG,MAAiB,OAAO,MAAM,cAAc,MAAM,CAAC,CAAC,CACpD,MAAM,aAAa,YAAY,SAAS,MAAM,MAAM,CAAC;EAC1D,OACE,OACA,MACA,WAEA,SACG,KAAgB,OAAO,MAAM,cAAc,MAAM,CAAC,CAAC,CACnD,MAAM,aAAa,YAAY,SAAS,MAAM,MAAM,CAAC;EAC1D,MACE,OACA,MACA,WAEA,SACG,IAAe,OAAO,MAAM,cAAc,MAAM,CAAC,CAAC,CAClD,MAAM,aAAa,YAAY,SAAS,MAAM,MAAM,CAAC;CAC5D;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/json/types.ts","../../../src/http/validate.ts","../../../src/http/types.ts","../../../src/adapters/fetch/index.ts"],"mappings":";KAUY;KAEA,cAAc,eAAe;;;KCZ7B,kBAAkB,MAAM,mBAAmB;;;UCOtC,gBACf,yBAAyB,aACzB;EAEA,SAAS;EACT,SAAS;EACT,UAAU;EACV,mBAAmB,kBAAkB;;UAGtB;EACf,IAAI,WAAW,yBAAyB,aACtC,eACA,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,KAAK,WAAW,iBAAiB,yBAAyB,aACxD,eACA,MAAM,OACN,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,IAAI,WAAW,iBAAiB,yBAAyB,aACvD,eACA,MAAM,OACN,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,MAAM,WAAW,iBAAiB,yBAAyB,aACzD,eACA,MAAM,OACN,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,OAAO,WAAW,yBAAyB,aACzC,eACA,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;;;;UCnCJ;EACf;EACA,UAAU;EACV,eAAe;;iBAqED,mBACd,UAAS,sBACR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/json/types.ts","../../../src/http/validate.ts","../../../src/adapters/fetch/index.ts"],"sourcesContent":["export type JsonPrimitive = string | number | boolean | null;\n\nexport interface JsonObject {\n [key: string]: JsonValue;\n}\n\nexport type JsonArray = Array<JsonValue>;\n\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport type QueryParamValue = string | number | boolean | null | undefined;\n\nexport type QueryParams = Record<string, QueryParamValue>;\n\nexport function isJsonPrimitive(value: JsonValue): value is JsonPrimitive {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n\nexport function isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n\n if (typeof value === \"object\" && value !== null) {\n return Object.values(value).every(isJsonValue);\n }\n\n return false;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return (\n isJsonValue(value) &&\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value)\n );\n}\n\nexport function isJsonArray(value: unknown): value is JsonArray {\n return Array.isArray(value) && value.every(isJsonValue);\n}\n\nexport function parseJson(text: string): JsonValue {\n const parsed: unknown = JSON.parse(text);\n if (!isJsonValue(parsed)) {\n throw new TypeError(\"JSON text did not parse to a valid JSON value\");\n }\n return parsed;\n}\n\nexport function readJsonObject(text: string): JsonObject {\n const parsed = parseJson(text);\n if (!isJsonObject(parsed)) {\n throw new TypeError(\"JSON text did not parse to a JSON object\");\n }\n return parsed;\n}\n\nexport function readJsonPrimitives(\n values: JsonValue | undefined\n): Array<JsonPrimitive> {\n if (!isJsonArray(values)) {\n return [];\n }\n\n return values.filter(isJsonPrimitive);\n}\n","export type ResponseValidator<T> = (value: unknown) => T;\n\nexport class ResponseValidationError extends Error {\n override readonly cause: unknown;\n\n constructor(message: string, cause: unknown) {\n super(message);\n this.name = \"ResponseValidationError\";\n this.cause = cause;\n }\n}\n\nexport function coerceResponseData<T>(\n value: unknown,\n validator?: ResponseValidator<T>\n): T {\n if (validator === undefined) {\n return value as T;\n }\n\n try {\n return validator(value);\n } catch (error) {\n throw new ResponseValidationError(\"Response validation failed\", error);\n }\n}\n","import type { JsonValue, QueryParams } from \"../../json/types\";\nimport { parseJson } from \"../../json/types\";\nimport { coerceResponseData } from \"../../http/validate\";\nimport type { HTTPFetch, HTTPFetchConfig } from \"../../http/types\";\n\nexport interface FetchAdapterOptions {\n baseURL?: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\nfunction appendQuery(url: string, params?: object): string {\n if (params === undefined || Object.keys(params).length === 0) {\n return url;\n }\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n search.append(key, String(value));\n }\n\n const query = search.toString();\n if (query.length === 0) {\n return url;\n }\n\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n}\n\nfunction readResponseBody(text: string): JsonValue | undefined {\n if (text.length === 0) {\n return undefined;\n }\n return parseJson(text);\n}\n\nasync function request<TResponse, TParams extends object>(\n method: string,\n route: string,\n options: FetchAdapterOptions,\n body?: unknown,\n config?: HTTPFetchConfig<TParams, TResponse>\n): Promise<{ data: TResponse }> {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n const baseURL = options.baseURL ?? \"\";\n const url = appendQuery(`${baseURL}${route}`, config?.params);\n\n const headers: Record<string, string> = {\n ...options.headers,\n ...config?.headers,\n };\n\n const init: RequestInit = {\n headers,\n method,\n };\n if (config?.signal !== undefined) {\n init.signal = config.signal;\n }\n\n if (body !== undefined) {\n headers[\"Content-Type\"] ??= \"application/json\";\n init.body = JSON.stringify(body);\n }\n\n const response = await fetchImpl(url, init);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n\n const text = await response.text();\n const parsed = readResponseBody(text);\n return {\n data: coerceResponseData<TResponse>(parsed, config?.validateResponse),\n };\n}\n\nexport function createFetchAdapter(\n options: FetchAdapterOptions = {}\n): HTTPFetch {\n return {\n delete: <TResponse, TParams extends object = QueryParams>(\n route: string,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) =>\n request<TResponse, TParams>(\"DELETE\", route, options, undefined, config),\n get: <TResponse, TParams extends object = QueryParams>(\n route: string,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) => request<TResponse, TParams>(\"GET\", route, options, undefined, config),\n patch: <TResponse, TBody = unknown, TParams extends object = QueryParams>(\n route: string,\n body: TBody,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) => request<TResponse, TParams>(\"PATCH\", route, options, body, config),\n post: <TResponse, TBody = unknown, TParams extends object = QueryParams>(\n route: string,\n body: TBody,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) => request<TResponse, TParams>(\"POST\", route, options, body, config),\n put: <TResponse, TBody = unknown, TParams extends object = QueryParams>(\n route: string,\n body: TBody,\n config?: HTTPFetchConfig<TParams, TResponse>\n ) => request<TResponse, TParams>(\"PUT\", route, options, body, config),\n };\n}\n\nexport type { HTTPFetch, HTTPFetchConfig } from \"../../http/types\";\n"],"mappings":";AAuBA,SAAgB,YAAY,OAAoC;CAC9D,IACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WAEjB,OAAO;CAGT,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,MAAM,WAAW;CAGhC,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,WAAW;CAG/C,OAAO;AACT;AAeA,SAAgB,UAAU,MAAyB;CACjD,MAAM,SAAkB,KAAK,MAAM,IAAI;CACvC,IAAI,CAAC,YAAY,MAAM,GACrB,MAAM,IAAI,UAAU,+CAA+C;CAErE,OAAO;AACT;;;AC7DA,IAAa,0BAAb,cAA6C,MAAM;CACjD;CAEA,YAAY,SAAiB,OAAgB;EAC3C,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,QAAQ;CACf;AACF;AAEA,SAAgB,mBACd,OACA,WACG;CACH,IAAI,cAAc,KAAA,GAChB,OAAO;CAGT,IAAI;EACF,OAAO,UAAU,KAAK;CACxB,SAAS,OAAO;EACd,MAAM,IAAI,wBAAwB,8BAA8B,KAAK;CACvE;AACF;;;ACdA,SAAS,YAAY,KAAa,QAAyB;CACzD,IAAI,WAAW,KAAA,KAAa,OAAO,KAAK,MAAM,CAAC,CAAC,WAAW,GACzD,OAAO;CAGT,MAAM,SAAS,IAAI,gBAAgB;CACnC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC;CAGlC,MAAM,QAAQ,OAAO,SAAS;CAC9B,IAAI,MAAM,WAAW,GACnB,OAAO;CAGT,OAAO,GAAG,MAAM,IAAI,SAAS,GAAG,IAAI,MAAM,MAAM;AAClD;AAEA,SAAS,iBAAiB,MAAqC;CAC7D,IAAI,KAAK,WAAW,GAClB;CAEF,OAAO,UAAU,IAAI;AACvB;AAEA,eAAe,QACb,QACA,OACA,SACA,MACA,QAC8B;CAC9B,MAAM,YAAY,QAAQ,SAAS,WAAW;CAE9C,MAAM,MAAM,YAAY,GADR,QAAQ,WAAW,KACE,SAAS,QAAQ,MAAM;CAE5D,MAAM,UAAkC;EACtC,GAAG,QAAQ;EACX,GAAG,QAAQ;CACb;CAEA,MAAM,OAAoB;EACxB;EACA;CACF;CACA,IAAI,QAAQ,WAAW,KAAA,GACrB,KAAK,SAAS,OAAO;CAGvB,IAAI,SAAS,KAAA,GAAW;EACtB,QAAQ,oBAAoB;EAC5B,KAAK,OAAO,KAAK,UAAU,IAAI;CACjC;CAEA,MAAM,WAAW,MAAM,UAAU,KAAK,IAAI;CAC1C,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MAAM,QAAQ,SAAS,OAAO,GAAG,SAAS,YAAY;CAKlE,OAAO,EACL,MAAM,mBAFO,iBAAiB,MADb,SAAS,KAAK,CAGK,GAAQ,QAAQ,gBAAgB,EACtE;AACF;AAEA,SAAgB,mBACd,UAA+B,CAAC,GACrB;CACX,OAAO;EACL,SACE,OACA,WAEA,QAA4B,UAAU,OAAO,SAAS,KAAA,GAAW,MAAM;EACzE,MACE,OACA,WACG,QAA4B,OAAO,OAAO,SAAS,KAAA,GAAW,MAAM;EACzE,QACE,OACA,MACA,WACG,QAA4B,SAAS,OAAO,SAAS,MAAM,MAAM;EACtE,OACE,OACA,MACA,WACG,QAA4B,QAAQ,OAAO,SAAS,MAAM,MAAM;EACrE,MACE,OACA,MACA,WACG,QAA4B,OAAO,OAAO,SAAS,MAAM,MAAM;CACtE;AACF"}
|
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","names":[],"sources":["../src/cli.ts"],"mappings":";UASU;EACR;;EAEA;;EAEA,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;;iBAGc,UAAU,MAAM,gBAAgB"}
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport { listSourceKeys, loadProjectConfig } from \"./config/load\";\nimport { generateForSource } from \"./generate/index\";\nimport type { GenerateOptions } from \"./generate/index\";\nimport { initProject } from \"./init/index\";\nimport type { InitOptions } from \"./init/index\";\n\ninterface ParsedArgs {\n command?: string;\n /** Populated by the first --source value; kept for init (single-source) compat. */\n source?: string;\n /** All --source values collected for multi-source generate. */\n sources: Array<string>;\n spec?: string;\n client?: \"axios\" | \"fetch\" | \"custom\";\n layout?: \"monolith\" | \"packages\";\n check?: boolean;\n acceptBase?: boolean;\n all?: boolean;\n}\n\nexport function parseArgs(argv: Array<string>): ParsedArgs {\n const parsed: ParsedArgs = { sources: [] };\n const positional: Array<string> = [];\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === undefined) {\n continue;\n }\n\n if (arg === \"--check\") {\n parsed.check = true;\n continue;\n }\n if (arg === \"--accept-base\") {\n parsed.acceptBase = true;\n continue;\n }\n if (arg === \"--all\") {\n parsed.all = true;\n continue;\n }\n if (arg.startsWith(\"--source=\")) {\n const value = arg.slice(\"--source=\".length);\n parsed.sources.push(value);\n if (parsed.source === undefined) {\n parsed.source = value;\n }\n continue;\n }\n if (arg === \"--source\") {\n const value = argv[index + 1];\n if (value !== undefined) {\n parsed.sources.push(value);\n if (parsed.source === undefined) {\n parsed.source = value;\n }\n index += 1;\n }\n continue;\n }\n if (arg.startsWith(\"--spec=\")) {\n parsed.spec = arg.slice(\"--spec=\".length);\n continue;\n }\n if (arg === \"--spec\") {\n const value = argv[index + 1];\n if (value !== undefined) {\n parsed.spec = value;\n index += 1;\n }\n continue;\n }\n if (arg.startsWith(\"--client=\")) {\n const value = arg.slice(\"--client=\".length);\n if (value === \"axios\" || value === \"fetch\" || value === \"custom\") {\n parsed.client = value;\n }\n continue;\n }\n if (arg === \"--client\") {\n const value = argv[index + 1];\n if (value === \"axios\" || value === \"fetch\" || value === \"custom\") {\n parsed.client = value;\n index += 1;\n }\n continue;\n }\n if (arg.startsWith(\"--layout=\")) {\n const value = arg.slice(\"--layout=\".length);\n if (value === \"monolith\" || value === \"packages\") {\n parsed.layout = value;\n }\n continue;\n }\n if (arg === \"--layout\") {\n const value = argv[index + 1];\n if (value === \"monolith\" || value === \"packages\") {\n parsed.layout = value;\n index += 1;\n }\n continue;\n }\n if (!arg.startsWith(\"-\")) {\n positional.push(arg);\n }\n }\n\n const command = positional[0];\n if (command !== undefined) {\n parsed.command = command;\n }\n return parsed;\n}\n\nfunction printHelp(): void {\n process.stdout.write(`typeforge — headless OpenAPI TypeScript codegen\n\nUsage:\n typeforge init --source <key> --client axios|fetch|custom [--layout monolith|packages]\n typeforge generate --source <key> [--source <key2> ...] [--spec <path>] [--check] [--accept-base]\n typeforge generate --all [--check] [--accept-base]\n typeforge check --source <key> [--spec <path>]\n typeforge accept-base --source <key> [--spec <path>]\n\nMulti-source generate:\n Provide multiple --source flags, or use --all to generate every source under apiRoot.\n Configure per-source spec paths in each source.ts:\n import { defineSourceConfig } from \"@openmirai/typeforge\";\n export default defineSourceConfig({ spec: \"./specs/acme.json\", ... });\n`);\n}\n\nasync function runGenerate(args: ParsedArgs): Promise<number> {\n if (args.check === true && args.acceptBase === true) {\n process.stderr.write(\n \"typeforge: --accept-base is not allowed with --check\\n\"\n );\n return 1;\n }\n\n const cwd = process.cwd();\n const projectConfig = loadProjectConfig(cwd);\n const apiRoot = projectConfig.apiRoot ?? \"src/api\";\n let sources: Array<string>;\n if (args.all === true) {\n sources = listSourceKeys(cwd, apiRoot);\n } else if (args.sources.length > 0) {\n sources = args.sources;\n } else {\n sources = [];\n }\n\n if (sources.length === 0) {\n process.stderr.write(\"typeforge: --source <key> or --all is required\\n\");\n return 1;\n }\n\n let exitCode = 0;\n for (const sourceKey of sources) {\n try {\n const generateOptions: GenerateOptions = { sourceKey };\n if (args.acceptBase === true) {\n generateOptions.acceptBase = true;\n }\n if (args.check === true) {\n generateOptions.check = true;\n }\n if (args.spec !== undefined) {\n generateOptions.specFlag = args.spec;\n }\n\n const result = await generateForSource(generateOptions);\n\n if (args.check === true) {\n if (result.changed.length > 0) {\n process.stderr.write(\n `typeforge: stale generated files for \"${sourceKey}\":\\n`\n );\n for (const file of result.changed) {\n process.stderr.write(` ${file}\\n`);\n }\n exitCode = 1;\n } else {\n process.stdout.write(`typeforge: \"${sourceKey}\" is up to date\\n`);\n }\n } else {\n process.stdout.write(\n `typeforge: generated ${result.files} files for \"${sourceKey}\" (${result.changed.length} changed)\\n`\n );\n }\n } catch (error) {\n exitCode = 1;\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`${message}\\n`);\n }\n }\n\n return exitCode;\n}\n\nasync function main(): Promise<void> {\n const args = parseArgs(process.argv.slice(2));\n\n if (\n args.command === undefined ||\n args.command === \"help\" ||\n args.command === \"--help\" ||\n args.command === \"-h\"\n ) {\n printHelp();\n process.exit(0);\n }\n\n if (args.command === \"init\") {\n if (args.source === undefined || args.client === undefined) {\n process.stderr.write(\"typeforge: init requires --source and --client\\n\");\n process.exit(1);\n }\n\n const initOptions: InitOptions = {\n client: args.client,\n sourceKey: args.source,\n };\n if (args.layout !== undefined) {\n initOptions.layout = args.layout;\n }\n\n const result = initProject(initOptions);\n\n for (const file of result.created) {\n process.stdout.write(`created ${file}\\n`);\n }\n for (const file of result.skipped) {\n process.stdout.write(`skipped ${file} (already exists)\\n`);\n }\n process.exit(0);\n }\n\n if (\n args.command === \"generate\" ||\n args.command === \"check\" ||\n args.command === \"accept-base\"\n ) {\n if (args.command === \"check\") {\n args.check = true;\n }\n if (args.command === \"accept-base\") {\n args.acceptBase = true;\n }\n process.exit(await runGenerate(args));\n }\n\n process.stderr.write(`typeforge: unknown command \"${args.command}\"\\n`);\n printHelp();\n process.exit(1);\n}\n\n// Only auto-execute when this file is the Node.js entry point.\n// Guarding with import.meta.url allows the module to be safely imported\n// in tests without triggering process.exit.\nconst isEntryPoint = ((): boolean => {\n const entry = process.argv[1];\n if (entry === undefined) {\n return false;\n }\n try {\n return import.meta.url === pathToFileURL(realpathSync(entry)).href;\n } catch {\n return false;\n }\n})();\n\nif (isEntryPoint) {\n main().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`${message}\\n`);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|
package/dist/http/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/json/types.ts","../../src/http/types.ts"],"mappings":";;KAUY;KAEA,cAAc,eAAe;;;UCLxB,gBACf,yBAAyB,aACzB;EAEA,SAAS;EACT,SAAS;EACT,UAAU;EACV,mBAAmB,kBAAkB;;UAGtB;EACf,IAAI,WAAW,yBAAyB,aACtC,eACA,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,KAAK,WAAW,iBAAiB,yBAAyB,aACxD,eACA,MAAM,OACN,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,IAAI,WAAW,iBAAiB,yBAAyB,aACvD,eACA,MAAM,OACN,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,MAAM,WAAW,iBAAiB,yBAAyB,aACzD,eACA,MAAM,OACN,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM;;EACnB,OAAO,WAAW,yBAAyB,aACzC,eACA,SAAS,gBAAgB,SAAS,aACjC;IAAU,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","names":[],"sources":["../../src/http/validate.ts"],"mappings":";KAAY,kBAAkB,MAAM,mBAAmB;cAE1C,gCAAgC;WACzB;EAElB,YAAY,iBAAiB;;iBAOf,mBAAmB,GACjC,gBACA,YAAY,kBAAkB,KAC7B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","names":[],"sources":["../../src/http/validate.ts"],"sourcesContent":["export type ResponseValidator<T> = (value: unknown) => T;\n\nexport class ResponseValidationError extends Error {\n override readonly cause: unknown;\n\n constructor(message: string, cause: unknown) {\n super(message);\n this.name = \"ResponseValidationError\";\n this.cause = cause;\n }\n}\n\nexport function coerceResponseData<T>(\n value: unknown,\n validator?: ResponseValidator<T>\n): T {\n if (validator === undefined) {\n return value as T;\n }\n\n try {\n return validator(value);\n } catch (error) {\n throw new ResponseValidationError(\"Response validation failed\", error);\n }\n}\n"],"mappings":";AAEA,IAAa,0BAAb,cAA6C,MAAM;CACjD;CAEA,YAAY,SAAiB,OAAgB;EAC3C,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,QAAQ;CACf;AACF;AAEA,SAAgB,mBACd,OACA,WACG;CACH,IAAI,cAAc,KAAA,GAChB,OAAO;CAGT,IAAI;EACF,OAAO,UAAU,KAAK;CACxB,SAAS,OAAO;EACd,MAAM,IAAI,wBAAwB,8BAA8B,KAAK;CACvE;AACF"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/json/types.ts","../src/parser/types.ts","../src/parser/index.ts","../src/parser/loader.ts","../src/http/validate.ts","../src/http/types.ts","../src/config/types.ts","../src/config/define.ts","../src/generate/index.ts","../src/init/index.ts","../src/envelope-guard/index.ts","../src/emitters/recursive-ref-error.ts","../src/plugins/known-types/types.ts","../src/plugins/known-types/index.ts"],"mappings":"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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/config/define.ts"],"sourcesContent":["import type { SourceConfig } from \"./types\";\n\n/**\n * Identity helper for `source.ts`. Use it so the object is checked against\n * `SourceConfig` and editors can autocomplete fields.\n */\nexport function defineSourceConfig(config: SourceConfig): SourceConfig {\n return config;\n}\n"],"mappings":";;;;;;AAMA,SAAgB,mBAAmB,QAAoC;CACrE,OAAO;AACT"}
|