@codexsploitx/schemaapi 1.0.5 → 1.1.7
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/bin/schemaapi +17 -331
- package/dist/adapters/deno.d.ts +4 -0
- package/dist/adapters/express.d.ts +21 -0
- package/dist/adapters/fastify.d.ts +23 -0
- package/dist/adapters/hapi.d.ts +28 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/koa.d.ts +22 -0
- package/dist/adapters/nest.d.ts +35 -0
- package/dist/adapters/next.d.ts +30 -0
- package/dist/adapters/remix.d.ts +14 -0
- package/dist/adapters/ws.d.ts +14 -0
- package/dist/cli/commands/docs.d.ts +1 -0
- package/dist/cli/commands/generate.d.ts +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/templates/contract.d.ts +1 -0
- package/dist/cli/templates/deno.d.ts +1 -0
- package/dist/cli/templates/express.d.ts +1 -0
- package/dist/cli/templates/fastify.d.ts +1 -0
- package/dist/cli/templates/hapi.d.ts +1 -0
- package/dist/cli/templates/koa.d.ts +1 -0
- package/dist/cli/templates/nest.d.ts +2 -0
- package/dist/cli/templates/next.d.ts +1 -0
- package/dist/cli/templates/remix.d.ts +1 -0
- package/dist/cli/utils.d.ts +6 -0
- package/dist/cli.js +819 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/client.d.ts +16 -0
- package/dist/core/contract.d.ts +74 -3
- package/dist/core/versioning.test.d.ts +1 -0
- package/dist/docs.d.ts +12 -0
- package/dist/index.d.ts +4 -0
- package/dist/playground.d.ts +65 -0
- package/dist/playground.test.d.ts +1 -0
- package/dist/schemaapi.cjs.js +1713 -2
- package/dist/schemaapi.cjs.js.map +1 -1
- package/dist/schemaapi.esm.js +1705 -3
- package/dist/schemaapi.esm.js.map +1 -1
- package/dist/schemaapi.umd.js +1715 -6
- package/dist/schemaapi.umd.js.map +1 -1
- package/dist/sdk.d.ts +8 -0
- package/package.json +1 -1
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/cli/utils.ts","../src/cli/commands/init.ts","../src/cli/templates/contract.ts","../src/cli/templates/nest.ts","../src/cli/templates/express.ts","../src/cli/templates/fastify.ts","../src/cli/templates/koa.ts","../src/cli/templates/hapi.ts","../src/cli/templates/deno.ts","../src/cli/templates/remix.ts","../src/cli/templates/next.ts","../src/cli/commands/docs.ts","../src/cli/commands/generate.ts","../src/cli/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n\nexport function loadConfig() {\n const cwd = process.cwd();\n const configPath = path.join(cwd, \"schemaapi.config.json\");\n if (!fs.existsSync(configPath)) {\n return null;\n }\n try {\n const raw = fs.readFileSync(configPath, \"utf8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nexport function ensureDir(dir: string) {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function writeFile(filePath: string, content: string) {\n ensureDir(path.dirname(filePath));\n fs.writeFileSync(filePath, content, 'utf8');\n}\n\nexport function toPascalCase(str: string) {\n return str.replace(/(^\\w|-\\w)/g, (clear) => clear.replace(/-/, \"\").toUpperCase());\n}\n\nexport function toCamelCase(str: string) {\n return str.replace(/-\\w/g, (clear) => clear[1].toUpperCase());\n}\n\nexport function toKebabCase(str: string) {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { ensureDir, writeFile } from '../utils';\n\nfunction normalizeAdapter(value: string | undefined): string {\n if (!value) return \"generic\";\n const v = String(value).toLowerCase();\n if (v === \"next\" || v === \"nextjs\") return \"next\";\n if (v === \"remix\") return \"remix\";\n if (v === \"express\") return \"express\";\n if (v === \"fastify\") return \"fastify\";\n if (v === \"nest\" || v === \"nestjs\") return \"nest\";\n if (v === \"koa\") return \"koa\";\n if (v === \"hapi\") return \"hapi\";\n if (v === \"deno\") return \"deno\";\n return v;\n}\n\nexport function handleInit(adapterArg?: string) {\n const adapter = normalizeAdapter(adapterArg);\n const cwd = process.cwd();\n const contractsDir = path.join(cwd, \"contracts\");\n\n ensureDir(contractsDir);\n\n const usersContractPath = path.join(contractsDir, \"usersContract.ts\");\n if (!fs.existsSync(usersContractPath)) {\n const usersContractContent = [\n 'import { createContract } from \"@codexsploitx/schemaapi\";',\n 'import { z } from \"zod\";',\n \"\",\n \"export const usersContract = createContract({\",\n ' \"/users/:id\": {',\n \" GET: {\",\n \" params: z.object({ id: z.string() }),\",\n \" response: z.object({ id: z.string(), name: z.string() }),\",\n \" },\",\n \" },\",\n \"});\",\n \"\",\n ].join(\"\\n\");\n writeFile(usersContractPath, usersContractContent);\n }\n\n const indexPath = path.join(contractsDir, \"index.ts\");\n if (!fs.existsSync(indexPath)) {\n writeFile(indexPath, 'export * from \"./usersContract\";\\n');\n }\n\n if (adapter === \"next\") {\n const appApiUsersDir = path.join(cwd, \"app\", \"api\", \"users\");\n ensureDir(appApiUsersDir);\n \n const routePath = path.join(appApiUsersDir, \"route.ts\");\n if (!fs.existsSync(routePath)) {\n const nextRouteContent = [\n 'import { adapters } from \"@codexsploitx/schemaapi\";',\n 'import { usersContract } from \"../../../contracts\";',\n \"\",\n \"const handlers = adapters.next.handleContract(usersContract, {\",\n ' \"GET /users/:id\": async ({ params }) => {',\n \" return {\",\n \" id: String(params && params.id),\",\n ' name: \"John Doe\",',\n \" };\",\n \" },\",\n \"});\",\n \"\",\n \"export const GET = handlers.GET;\",\n \"\",\n ].join(\"\\n\");\n writeFile(routePath, nextRouteContent);\n }\n }\n\n const configPath = path.join(cwd, \"schemaapi.config.json\");\n let existingConfig: any = null;\n if (fs.existsSync(configPath)) {\n try {\n const raw = fs.readFileSync(configPath, \"utf8\");\n existingConfig = JSON.parse(raw);\n } catch {\n existingConfig = null;\n }\n }\n\n const config = {\n ...(existingConfig || {}),\n adapter,\n contractsDir: existingConfig?.contractsDir || \"contracts\",\n };\n\n writeFile(configPath, JSON.stringify(config, null, 2));\n console.log(`Initialized SchemaApi with adapter \"${adapter}\"`);\n}\n","export function generateContract(name: string) {\n const camelName = name.replace(/^[A-Z]/, c => c.toLowerCase());\n \n return `import { createContract } from \"@codexsploitx/schemaapi\";\nimport { z } from \"zod\";\n\nconst ${camelName}Schema = z.object({\n id: z.string(),\n name: z.string(),\n createdAt: z.string().datetime(),\n});\n\nexport const ${camelName}Contract = createContract({\n \"/${name}\": {\n GET: {\n query: z.object({\n limit: z.string().optional().transform(Number),\n offset: z.string().optional().transform(Number),\n }),\n response: z.array(${camelName}Schema),\n },\n POST: {\n body: ${camelName}Schema.omit({ id: true, createdAt: true }),\n response: ${camelName}Schema,\n },\n },\n \"/${name}/:id\": {\n GET: {\n params: z.object({ id: z.string() }),\n response: ${camelName}Schema,\n },\n PUT: {\n params: z.object({ id: z.string() }),\n body: ${camelName}Schema.partial(),\n response: ${camelName}Schema,\n },\n DELETE: {\n params: z.object({ id: z.string() }),\n response: z.object({ success: z.boolean() }),\n },\n },\n});\n`;\n}\n","import { toPascalCase, toCamelCase } from \"../utils\";\n\nexport function generateNestModule(name: string) {\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n return `import { Module, OnModuleInit, INestApplication } from '@nestjs/common';\nimport { ${camelName}Service } from './${name}.service';\nimport { adapters } from '@codexsploitx/schemaapi';\nimport { ${camelName}Contract } from '../../contracts/${name}.contract';\n\n@Module({\n providers: [${pascalName}Service],\n exports: [${pascalName}Service],\n})\nexport class ${pascalName}Module implements OnModuleInit {\n constructor(private readonly service: ${pascalName}Service) {}\n\n onModuleInit() {\n // Note: SchemaApi registration requires the app instance.\n // Usually done in main.ts or via a global module.\n // This is a placeholder for the implementation logic.\n }\n\n static register(app: INestApplication) {\n const service = app.get(${pascalName}Service);\n \n adapters.nest.SchemaApiModule.register(app, ${camelName}Contract, {\n \"GET /${name}\": async (ctx) => service.findAll(ctx.query),\n \"POST /${name}\": async (ctx) => service.create(ctx.body),\n \"GET /${name}/:id\": async (ctx) => service.findOne(ctx.params.id),\n \"PUT /${name}/:id\": async (ctx) => service.update(ctx.params.id, ctx.body),\n \"DELETE /${name}/:id\": async (ctx) => service.remove(ctx.params.id),\n });\n }\n}\n`;\n}\n\nexport function generateNestService(name: string) {\n const pascalName = toPascalCase(name);\n const camelName = toCamelCase(name);\n\n return `import { Injectable, NotFoundException } from '@nestjs/common';\n\n@Injectable()\nexport class ${pascalName}Service {\n private items = [];\n\n async findAll(query: any) {\n return this.items;\n }\n\n async create(data: any) {\n const newItem = { id: Date.now().toString(), createdAt: new Date().toISOString(), ...data };\n this.items.push(newItem);\n return newItem;\n }\n\n async findOne(id: string) {\n const item = this.items.find(i => i.id === id);\n if (!item) throw new NotFoundException();\n return item;\n }\n\n async update(id: string, data: any) {\n const index = this.items.findIndex(i => i.id === id);\n if (index === -1) throw new NotFoundException();\n this.items[index] = { ...this.items[index], ...data };\n return this.items[index];\n }\n\n async remove(id: string) {\n const index = this.items.findIndex(i => i.id === id);\n if (index === -1) throw new NotFoundException();\n this.items.splice(index, 1);\n return { success: true };\n }\n}\n`;\n}\n","import { toCamelCase } from \"../utils\";\n\nexport function generateExpressRoute(name: string) {\n const camelName = toCamelCase(name);\n\n return `import { Router } from \"express\";\nimport { adapters } from \"@codexsploitx/schemaapi\";\nimport { ${camelName}Contract } from \"../../contracts/${name}Contract\";\n\nexport const ${camelName}Router = Router();\n\n// Mock database\nconst items: any[] = [];\n\nadapters.express.handleContract(${camelName}Router, ${camelName}Contract, {\n \"GET /${name}\": async ({ query }) => {\n return items;\n },\n \"POST /${name}\": async ({ body }) => {\n const newItem = { id: Date.now().toString(), createdAt: new Date().toISOString(), ...body };\n items.push(newItem);\n return newItem;\n },\n \"GET /${name}/:id\": async ({ params }) => {\n const item = items.find((i) => i.id === params.id);\n if (!item) throw { status: 404, message: \"Not Found\" };\n return item;\n },\n \"PUT /${name}/:id\": async ({ params, body }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items[index] = { ...items[index], ...body };\n return items[index];\n },\n \"DELETE /${name}/:id\": async ({ params }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items.splice(index, 1);\n return { success: true };\n },\n});\n`;\n}\n","import { toCamelCase } from \"../utils\";\n\nexport function generateFastifyRoute(name: string) {\n const camelName = toCamelCase(name);\n\n return `import { FastifyInstance } from \"fastify\";\nimport { adapters } from \"@codexsploitx/schemaapi\";\nimport { ${camelName}Contract } from \"../../contracts/${name}Contract\";\n\n// Mock database\nconst items: any[] = [];\n\nexport async function ${camelName}Routes(fastify: FastifyInstance) {\n adapters.fastify.handleContract(fastify, ${camelName}Contract, {\n \"GET /${name}\": async ({ query }) => {\n return items;\n },\n \"POST /${name}\": async ({ body }) => {\n const newItem = { id: Date.now().toString(), createdAt: new Date().toISOString(), ...body };\n items.push(newItem);\n return newItem;\n },\n \"GET /${name}/:id\": async ({ params }) => {\n const item = items.find((i) => i.id === params.id);\n if (!item) throw { status: 404, message: \"Not Found\" };\n return item;\n },\n \"PUT /${name}/:id\": async ({ params, body }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items[index] = { ...items[index], ...body };\n return items[index];\n },\n \"DELETE /${name}/:id\": async ({ params }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items.splice(index, 1);\n return { success: true };\n },\n });\n}\n`;\n}\n","import { toCamelCase } from \"../utils\";\n\nexport function generateKoaRoute(name: string) {\n const camelName = toCamelCase(name);\n\n return `import Router from \"@koa/router\";\nimport { adapters } from \"@codexsploitx/schemaapi\";\nimport { ${camelName}Contract } from \"../../contracts/${name}Contract\";\n\nexport const ${camelName}Router = new Router();\n\n// Mock database\nconst items: any[] = [];\n\nadapters.koa.handleContract(${camelName}Router, ${camelName}Contract, {\n \"GET /${name}\": async ({ query }) => {\n return items;\n },\n \"POST /${name}\": async ({ body }) => {\n const newItem = { id: Date.now().toString(), createdAt: new Date().toISOString(), ...body };\n items.push(newItem);\n return newItem;\n },\n \"GET /${name}/:id\": async ({ params }) => {\n const item = items.find((i) => i.id === params.id);\n if (!item) throw { status: 404, message: \"Not Found\" };\n return item;\n },\n \"PUT /${name}/:id\": async ({ params, body }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items[index] = { ...items[index], ...body };\n return items[index];\n },\n \"DELETE /${name}/:id\": async ({ params }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items.splice(index, 1);\n return { success: true };\n },\n});\n`;\n}\n","import { toCamelCase, toPascalCase } from \"../utils\";\n\nexport function generateHapiRoute(name: string) {\n const camelName = toCamelCase(name);\n const pascalName = toPascalCase(name);\n\n return `import Hapi from \"@hapi/hapi\";\nimport { adapters } from \"@codexsploitx/schemaapi\";\nimport { ${camelName}Contract } from \"../../contracts/${name}Contract\";\n\n// Mock database\nconst items: any[] = [];\n\nexport async function register${pascalName}Routes(server: Hapi.Server) {\n adapters.hapi.handleContract(server, ${camelName}Contract, {\n \"GET /${name}\": async ({ query }) => {\n return items;\n },\n \"POST /${name}\": async ({ body }) => {\n const newItem = { id: Date.now().toString(), createdAt: new Date().toISOString(), ...body };\n items.push(newItem);\n return newItem;\n },\n \"GET /${name}/:id\": async ({ params }) => {\n const item = items.find((i) => i.id === params.id);\n if (!item) throw { status: 404, message: \"Not Found\" };\n return item;\n },\n \"PUT /${name}/:id\": async ({ params, body }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items[index] = { ...items[index], ...body };\n return items[index];\n },\n \"DELETE /${name}/:id\": async ({ params }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw { status: 404, message: \"Not Found\" };\n items.splice(index, 1);\n return { success: true };\n },\n });\n}\n`;\n}\n","import { toCamelCase } from \"../utils\";\n\nexport function generateDenoRoute(name: string) {\n const camelName = toCamelCase(name);\n\n return `import { adapters } from \"@codexsploitx/schemaapi\";\nimport { ${camelName}Contract } from \"../../contracts/${name}Contract.ts\";\n\n// Mock database\nconst items: any[] = [];\n\nexport const handler = adapters.deno.handleContract(${camelName}Contract, {\n \"GET /${name}\": async ({ query }) => {\n return items;\n },\n \"POST /${name}\": async ({ body }) => {\n const newItem = { id: Date.now().toString(), createdAt: new Date().toISOString(), ...body };\n items.push(newItem);\n return newItem;\n },\n \"GET /${name}/:id\": async ({ params }) => {\n const item = items.find((i) => i.id === params.id);\n if (!item) return new Response(\"Not Found\", { status: 404 });\n return item;\n },\n \"PUT /${name}/:id\": async ({ params, body }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) return new Response(\"Not Found\", { status: 404 });\n items[index] = { ...items[index], ...body };\n return items[index];\n },\n \"DELETE /${name}/:id\": async ({ params }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) return new Response(\"Not Found\", { status: 404 });\n items.splice(index, 1);\n return { success: true };\n },\n});\n`;\n}\n","import { toCamelCase } from \"../utils\";\n\nexport function generateRemixRoute(name: string) {\n const camelName = toCamelCase(name);\n\n return `import { adapters } from \"@codexsploitx/schemaapi\";\nimport { ${camelName}Contract } from \"../../contracts/${name}Contract\";\nimport type { ActionFunctionArgs, LoaderFunctionArgs } from \"@remix-run/node\";\n\n// Mock database\nconst items: any[] = [];\n\nconst handlers = {\n \"GET /${name}\": async ({ query }) => {\n return items;\n },\n \"POST /${name}\": async ({ body }) => {\n const newItem = { id: Date.now().toString(), createdAt: new Date().toISOString(), ...body };\n items.push(newItem);\n return newItem;\n },\n \"GET /${name}/:id\": async ({ params }) => {\n const item = items.find((i) => i.id === params.id);\n if (!item) throw new Response(\"Not Found\", { status: 404 });\n return item;\n },\n \"PUT /${name}/:id\": async ({ params, body }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw new Response(\"Not Found\", { status: 404 });\n items[index] = { ...items[index], ...body };\n return items[index];\n },\n \"DELETE /${name}/:id\": async ({ params }) => {\n const index = items.findIndex((i) => i.id === params.id);\n if (index === -1) throw new Response(\"Not Found\", { status: 404 });\n items.splice(index, 1);\n return { success: true };\n },\n};\n\nconst { loader, action } = adapters.remix.createRouteHandlers(\n ${camelName}Contract,\n handlers,\n \"/${name}\" // Adjust route pattern if needed\n);\n\nexport { loader, action };\n`;\n}\n","import { toCamelCase } from \"../utils\";\n\nexport function generateNextRoute(name: string) {\n const camelName = toCamelCase(name);\n\n return `import { adapters } from \"@codexsploitx/schemaapi\";\nimport { ${camelName}Contract } from \"../../../contracts/${name}Contract\";\n\nconst handlers = adapters.next.handleContract(${camelName}Contract, {\n \"GET /${name}\": async ({ query }) => {\n return [];\n },\n \"POST /${name}\": async ({ body }) => {\n return { id: \"1\", ...body, createdAt: new Date().toISOString() };\n },\n \"GET /${name}/:id\": async ({ params }) => {\n return { id: params.id, name: \"Item \" + params.id };\n },\n \"PUT /${name}/:id\": async ({ params, body }) => {\n return { id: params.id, ...body };\n },\n \"DELETE /${name}/:id\": async ({ params }) => {\n return { success: true };\n },\n});\n\nexport const { GET, POST, PUT, DELETE } = handlers;\n`;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { loadConfig } from '../utils';\n\n// Helper to load the main library\nfunction loadSchemaApi() {\n try {\n // When running from dist/cli.js, .. resolves to project root\n // which should load the main entry point defined in package.json\n return require(path.resolve(__dirname, '../../..'));\n } catch {\n return {};\n }\n}\n\nfunction loadContractsModule(contractsDir: string) {\n const cwd = process.cwd();\n const baseDir = path.join(cwd, contractsDir || \"contracts\");\n const candidates = [\"index.js\", \"index.cjs\", \"index.ts\"];\n\n // In a CLI context, we might be running against TS source (via ts-node) or compiled JS.\n // The original CLI looked for compiled files. Let's try to support TS if registered, \n // but primarily look for what the user has.\n \n // Note: requiring .ts files natively without ts-node registration won't work in standard node.\n // The original CLI used require() so it likely expected the user to have compiled contracts \n // OR was running in a dev environment that supported it.\n // For safety, we'll try standard require.\n \n for (const file of candidates) {\n const fullPath = path.join(baseDir, file);\n if (fs.existsSync(fullPath)) {\n try {\n return require(fullPath);\n } catch (error: any) {\n // If it's a syntax error due to TS, we might want to warn\n console.error(\n `Failed to load contracts module at ${fullPath}:`,\n (error && error.message) || error\n );\n // Continue to next candidate? No, if found but failed, it's an error.\n return null;\n }\n }\n }\n \n // If we didn't find index.js/cjs, maybe the user is in a TS project and hasn't compiled contracts yet?\n // The original CLI errored here.\n return null;\n}\n\nfunction renderDocsHtmlFallback(docs: any) {\n const items = Array.isArray(docs.routes)\n ? docs.routes\n .map((route: any) => {\n const method = route && route.method ? String(route.method) : \"\";\n const pathValue = route && route.path ? String(route.path) : \"\";\n return `<li><code>${method} ${pathValue}</code></li>`;\n })\n .join(\"\\n\")\n : \"\";\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>SchemaApi Docs</title>\n</head>\n<body>\n <h1>SchemaApi Docs</h1>\n <ul>\n${items}\n </ul>\n</body>\n</html>`;\n}\n\nexport function generateDocs(config: any) {\n const adapter = config && config.adapter ? String(config.adapter) : null;\n const contractsDir = config && config.contractsDir ? String(config.contractsDir) : \"contracts\";\n\n console.log(\"Generating docs from contract\");\n if (adapter || contractsDir) {\n console.log(\n `Using config: adapter=${adapter || \"unknown\"}, contractsDir=${contractsDir}`\n );\n }\n\n const contractsModule = loadContractsModule(contractsDir);\n if (!contractsModule) {\n console.error(\n `Could not find contracts entry in ${contractsDir}. Expected index.js or index.cjs`\n );\n return;\n }\n\n const candidates = Object.values(contractsModule).filter(\n (value: any) =>\n value &&\n typeof value === \"object\" &&\n typeof value.docs === \"function\"\n );\n\n if (candidates.length === 0) {\n console.error(\n \"No contracts with a docs() method were found in the contracts entry file.\"\n );\n return;\n }\n\n const combinedDocs = {\n routes: candidates.flatMap((contract: any) => {\n try {\n const docs = contract.docs();\n return Array.isArray(docs.routes) ? docs.routes : [];\n } catch {\n return [];\n }\n }),\n };\n\n if (!combinedDocs.routes.length) {\n console.error(\n \"Contracts loaded, but no routes were found when calling docs().\"\n );\n return;\n }\n\n const outDir = path.join(process.cwd(), \"schemaapi-docs\");\n if (!fs.existsSync(outDir)) {\n fs.mkdirSync(outDir, { recursive: true });\n }\n const outPath = path.join(outDir, \"index.html\");\n\n const schemaapi = loadSchemaApi();\n const hasRenderDocs =\n schemaapi && typeof schemaapi.renderDocs === \"function\";\n \n const html = hasRenderDocs\n ? schemaapi.renderDocs(combinedDocs, {\n format: \"html\",\n title: \"SchemaApi Docs\",\n theme: \"dark\",\n })\n : renderDocsHtmlFallback(combinedDocs);\n\n fs.writeFileSync(outPath, html, \"utf8\");\n console.log(`Docs generated at: ${path.relative(process.cwd(), outPath)}`);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { generateContract } from '../templates/contract';\nimport { generateNestModule, generateNestService } from '../templates/nest';\nimport { generateExpressRoute } from '../templates/express';\nimport { generateFastifyRoute } from '../templates/fastify';\nimport { generateKoaRoute } from '../templates/koa';\nimport { generateHapiRoute } from '../templates/hapi';\nimport { generateDenoRoute } from '../templates/deno';\nimport { generateRemixRoute } from '../templates/remix';\nimport { generateNextRoute } from '../templates/next';\nimport { ensureDir, writeFile, loadConfig } from '../utils';\nimport { generateDocs } from './docs';\n\nexport function handleGenerate(args: string[]) {\n const [type, name] = args;\n\n const config = loadConfig();\n let adapter = config?.adapter;\n\n if (type === 'docs') {\n generateDocs(config || {});\n return;\n }\n \n if (type === 'sdk') {\n console.log(\"Generating SDK from contract\");\n // Placeholder restoration\n if (adapter || config?.contractsDir) {\n console.log(\n `Using config: adapter=${adapter || \"unknown\"}, contractsDir=${config?.contractsDir || \"contracts\"}`\n );\n }\n return;\n }\n\n if (type === 'tests') {\n console.log(\"Generating tests from contract\");\n // Placeholder restoration\n if (adapter || config?.contractsDir) {\n console.log(\n `Using config: adapter=${adapter || \"unknown\"}, contractsDir=${config?.contractsDir || \"contracts\"}`\n );\n }\n return;\n }\n\n if (type !== 'resource') {\n console.error(`Unknown generate type: ${type}. Supported: resource, docs, sdk, tests`);\n return;\n }\n\n if (!name) {\n console.error('Usage: schemaapi generate resource <name>');\n return;\n }\n\n if (!adapter) {\n console.warn(\"⚠️ No schemaapi.config.json found. Defaulting to 'express'.\");\n console.warn(\" Run 'npx schemaapi init <framework>' to set your preference permanently.\");\n adapter = 'express';\n }\n\n const cwd = process.cwd();\n\n console.log(`Generating resource \"${name}\" for adapter \"${adapter}\"...`);\n\n // 1. Generate Contract\n const contractsDir = path.join(cwd, config?.contractsDir || 'contracts');\n const contractContent = generateContract(name);\n const contractPath = path.join(contractsDir, `${name}Contract.ts`);\n \n if (fs.existsSync(contractPath)) {\n console.warn(`Contract ${contractPath} already exists. Skipping.`);\n } else {\n writeFile(contractPath, contractContent);\n console.log(`Created contract: ${contractPath}`);\n \n // Update index.ts in contracts if exists\n const indexContractPath = path.join(contractsDir, 'index.ts');\n if (fs.existsSync(indexContractPath)) {\n const indexContent = fs.readFileSync(indexContractPath, 'utf8');\n if (!indexContent.includes(`./${name}Contract`)) {\n fs.appendFileSync(indexContractPath, `export * from \"./${name}Contract\";\\n`);\n console.log(`Updated contracts/index.ts`);\n }\n }\n }\n\n // 2. Generate Implementation based on adapter\n switch (adapter) {\n case 'nest': {\n const srcDir = path.join(cwd, 'src', name);\n const serviceContent = generateNestService(name);\n const moduleContent = generateNestModule(name);\n \n writeFile(path.join(srcDir, `${name}.service.ts`), serviceContent);\n writeFile(path.join(srcDir, `${name}.module.ts`), moduleContent);\n console.log(`Created NestJS resources in src/${name}`);\n console.log(`\\nIMPORTANT: Register ${name}Module.register(app) in your main.ts or AppModule!`);\n break;\n }\n case 'express': {\n const routesDir = path.join(cwd, 'src', 'routes');\n const routeContent = generateExpressRoute(name);\n writeFile(path.join(routesDir, `${name}.ts`), routeContent);\n console.log(`Created Express router in src/routes/${name}.ts`);\n console.log(`\\nIMPORTANT: Mount the router in your app: app.use(routes.${name}Router)`);\n break;\n }\n case 'fastify': {\n const routesDir = path.join(cwd, 'src', 'routes');\n const routeContent = generateFastifyRoute(name);\n writeFile(path.join(routesDir, `${name}.ts`), routeContent);\n console.log(`Created Fastify routes in src/routes/${name}.ts`);\n console.log(`\\nIMPORTANT: Register the routes in your app: fastify.register(${name}Routes)`);\n break;\n }\n case 'koa': {\n const routesDir = path.join(cwd, 'src', 'routes');\n const routeContent = generateKoaRoute(name);\n writeFile(path.join(routesDir, `${name}.ts`), routeContent);\n console.log(`Created Koa router in src/routes/${name}.ts`);\n console.log(`\\nIMPORTANT: Use the router in your app: app.use(${name}Router.routes())`);\n break;\n }\n case 'hapi': {\n const routesDir = path.join(cwd, 'src', 'routes');\n const routeContent = generateHapiRoute(name);\n writeFile(path.join(routesDir, `${name}.ts`), routeContent);\n console.log(`Created Hapi routes in src/routes/${name}.ts`);\n console.log(`\\nIMPORTANT: Register routes: await register${name.charAt(0).toUpperCase() + name.slice(1)}Routes(server)`);\n break;\n }\n case 'deno': {\n const routesDir = path.join(cwd, 'src', 'handlers');\n const routeContent = generateDenoRoute(name);\n writeFile(path.join(routesDir, `${name}.ts`), routeContent);\n console.log(`Created Deno handler in src/handlers/${name}.ts`);\n break;\n }\n case 'remix': {\n const routesDir = path.join(cwd, 'app', 'routes');\n const routeContent = generateRemixRoute(name);\n writeFile(path.join(routesDir, `${name}.tsx`), routeContent);\n console.log(`Created Remix route in app/routes/${name}.tsx`);\n break;\n }\n case 'next': {\n const routeDir = path.join(cwd, 'app', 'api', name);\n const routeContent = generateNextRoute(name);\n writeFile(path.join(routeDir, 'route.ts'), routeContent);\n console.log(`Created Next.js route in app/api/${name}/route.ts`);\n break;\n }\n default:\n console.warn(`Adapter \"${adapter}\" scaffolding is not yet fully supported.`);\n }\n}\n","import { handleInit } from './commands/init';\nimport { handleGenerate } from './commands/generate';\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nswitch (command) {\n case 'init':\n handleInit(args[1]);\n break;\n case 'generate':\n handleGenerate(args.slice(1));\n break;\n case 'audit':\n console.log('Running SchemaApi audit');\n // Minimal implementation for now, as it was in the original\n break;\n default:\n console.log(`\nSchemaApi CLI\n\nUsage:\n npx schemaapi init <framework> Initialize configuration\n npx schemaapi generate resource <name> Generate a new resource\n npx schemaapi generate docs Generate documentation\n npx schemaapi generate sdk Generate SDK (coming soon)\n npx schemaapi generate tests Generate tests (coming soon)\n npx schemaapi audit Audit contracts\n`);\n}\n"],"names":["path","fs"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type WebSocketLike = {
|
|
2
|
+
close: (code?: number, reason?: string) => void;
|
|
3
|
+
};
|
|
4
|
+
type WebSocketConstructor = new (url: string) => WebSocketLike;
|
|
5
|
+
type ClientConfig = {
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
fetch?: typeof fetch;
|
|
8
|
+
WebSocket?: WebSocketConstructor;
|
|
9
|
+
};
|
|
10
|
+
export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
|
|
11
|
+
export type ExtractSchema<TContract> = TContract;
|
|
12
|
+
export type InferResponse<TContract, Endpoint extends string> = unknown;
|
|
13
|
+
export declare function createClient<T>(contract: {
|
|
14
|
+
schema: T;
|
|
15
|
+
}, config: ClientConfig): Record<string, unknown>;
|
|
16
|
+
export {};
|
package/dist/core/contract.d.ts
CHANGED
|
@@ -1,4 +1,75 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { ZodTypeAny } from "zod";
|
|
2
|
+
export declare class SchemaApiError extends Error {
|
|
3
|
+
code: number;
|
|
4
|
+
constructor(code: number, message: string);
|
|
5
|
+
}
|
|
6
|
+
type RequestContext = {
|
|
7
|
+
params?: unknown;
|
|
8
|
+
query?: unknown;
|
|
9
|
+
body?: unknown;
|
|
10
|
+
headers?: unknown;
|
|
11
|
+
user?: {
|
|
12
|
+
role?: string;
|
|
13
|
+
};
|
|
14
|
+
[key: string]: unknown;
|
|
4
15
|
};
|
|
16
|
+
type MediaConfig = {
|
|
17
|
+
kind?: "upload" | "download";
|
|
18
|
+
contentTypes?: string[];
|
|
19
|
+
maxSize?: number;
|
|
20
|
+
};
|
|
21
|
+
export type NormalizedErrorPayload = {
|
|
22
|
+
error: string;
|
|
23
|
+
message: string;
|
|
24
|
+
status: number;
|
|
25
|
+
};
|
|
26
|
+
export declare function buildErrorPayload(error: unknown): NormalizedErrorPayload;
|
|
27
|
+
type MethodDefinition = {
|
|
28
|
+
params?: ZodTypeAny;
|
|
29
|
+
query?: ZodTypeAny;
|
|
30
|
+
body?: ZodTypeAny;
|
|
31
|
+
headers?: ZodTypeAny;
|
|
32
|
+
roles?: string[];
|
|
33
|
+
response?: ZodTypeAny;
|
|
34
|
+
clientMessages?: ZodTypeAny;
|
|
35
|
+
serverMessages?: ZodTypeAny;
|
|
36
|
+
media?: MediaConfig;
|
|
37
|
+
errors?: Record<string, unknown>;
|
|
38
|
+
[key: string]: unknown;
|
|
39
|
+
};
|
|
40
|
+
type RouteDefinition = Record<string, MethodDefinition>;
|
|
41
|
+
type ContractDefinition = Record<string, RouteDefinition>;
|
|
42
|
+
type CompareResult = {
|
|
43
|
+
breakingChanges: string[];
|
|
44
|
+
};
|
|
45
|
+
export type FieldDoc = {
|
|
46
|
+
name: string;
|
|
47
|
+
type?: string;
|
|
48
|
+
optional: boolean;
|
|
49
|
+
};
|
|
50
|
+
export type MethodDoc = {
|
|
51
|
+
method: string;
|
|
52
|
+
path: string;
|
|
53
|
+
params?: FieldDoc[];
|
|
54
|
+
query?: FieldDoc[];
|
|
55
|
+
body?: FieldDoc[];
|
|
56
|
+
headers?: FieldDoc[];
|
|
57
|
+
roles?: string[];
|
|
58
|
+
errors?: {
|
|
59
|
+
status: string;
|
|
60
|
+
code: string;
|
|
61
|
+
}[];
|
|
62
|
+
media?: MediaConfig;
|
|
63
|
+
};
|
|
64
|
+
export type ContractDocs = {
|
|
65
|
+
routes: MethodDoc[];
|
|
66
|
+
};
|
|
67
|
+
export declare function createContract<T extends ContractDefinition>(schema: T): {
|
|
68
|
+
handle(endpoint: string, handler: (ctx: RequestContext) => unknown | Promise<unknown>): (ctx: RequestContext) => Promise<unknown>;
|
|
69
|
+
compareWith(other: {
|
|
70
|
+
schema: ContractDefinition;
|
|
71
|
+
}): CompareResult;
|
|
72
|
+
docs(): ContractDocs;
|
|
73
|
+
schema: T;
|
|
74
|
+
};
|
|
75
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/docs.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ContractDocs } from "./core/contract";
|
|
2
|
+
export type DocsFormat = "json" | "html" | "text";
|
|
3
|
+
export type RenderHtmlOptions = {
|
|
4
|
+
title?: string;
|
|
5
|
+
theme?: "light" | "dark" | "auto";
|
|
6
|
+
};
|
|
7
|
+
export declare function renderDocsJSON(docs: ContractDocs): string;
|
|
8
|
+
export declare function renderDocsText(docs: ContractDocs): string;
|
|
9
|
+
export declare function renderDocsHTML(docs: ContractDocs, options?: RenderHtmlOptions): string;
|
|
10
|
+
export declare function renderDocs(docs: ContractDocs, options: {
|
|
11
|
+
format: DocsFormat;
|
|
12
|
+
} & Partial<RenderHtmlOptions>): string;
|
package/dist/index.d.ts
CHANGED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const contract: {
|
|
3
|
+
handle(endpoint: string, handler: (ctx: {
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
params?: unknown;
|
|
6
|
+
query?: unknown;
|
|
7
|
+
body?: unknown;
|
|
8
|
+
headers?: unknown;
|
|
9
|
+
user?: {
|
|
10
|
+
role?: string;
|
|
11
|
+
};
|
|
12
|
+
}) => unknown | Promise<unknown>): (ctx: {
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
params?: unknown;
|
|
15
|
+
query?: unknown;
|
|
16
|
+
body?: unknown;
|
|
17
|
+
headers?: unknown;
|
|
18
|
+
user?: {
|
|
19
|
+
role?: string;
|
|
20
|
+
};
|
|
21
|
+
}) => Promise<unknown>;
|
|
22
|
+
compareWith(other: {
|
|
23
|
+
schema: {
|
|
24
|
+
[x: string]: {
|
|
25
|
+
[x: string]: {
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
params?: z.ZodType;
|
|
28
|
+
query?: z.ZodType;
|
|
29
|
+
body?: z.ZodType;
|
|
30
|
+
headers?: z.ZodType;
|
|
31
|
+
roles?: string[];
|
|
32
|
+
response?: z.ZodType;
|
|
33
|
+
clientMessages?: z.ZodType;
|
|
34
|
+
serverMessages?: z.ZodType;
|
|
35
|
+
media?: {
|
|
36
|
+
kind?: "upload" | "download";
|
|
37
|
+
contentTypes?: string[];
|
|
38
|
+
maxSize?: number;
|
|
39
|
+
};
|
|
40
|
+
errors?: Record<string, unknown>;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
}): {
|
|
45
|
+
breakingChanges: string[];
|
|
46
|
+
};
|
|
47
|
+
docs(): import("./index").ContractDocs;
|
|
48
|
+
schema: {
|
|
49
|
+
"/users/:id": {
|
|
50
|
+
GET: {
|
|
51
|
+
params: z.ZodObject<{
|
|
52
|
+
id: z.ZodString;
|
|
53
|
+
}, z.core.$strip>;
|
|
54
|
+
headers: z.ZodObject<{
|
|
55
|
+
authorization: z.ZodString;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
roles: string[];
|
|
58
|
+
response: z.ZodObject<{
|
|
59
|
+
id: z.ZodString;
|
|
60
|
+
username: z.ZodString;
|
|
61
|
+
}, z.core.$strip>;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|