@kosmojs/dev 0.0.7 → 0.0.8
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/package.json +7 -6
- package/pkg/base-plugin/routes.js +47 -42
- package/pkg/base-plugin/routes.js.map +3 -3
- package/pkg/base-plugin/worker.js +46 -48
- package/pkg/base-plugin/worker.js.map +3 -3
- package/pkg/cli/cli.js +4 -8
- package/pkg/cli/cli.js.map +2 -2
- package/pkg/cli/index.js +4 -8
- package/pkg/cli/index.js.map +2 -2
- package/pkg/index.js +44 -41
- package/pkg/index.js.map +3 -3
- package/pkg/src/base-plugin/routes.d.ts +7 -5
- package/pkg/src/index.d.ts +1 -1
package/pkg/cli/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cli/base.ts", "../../src/cli/factory.ts", "../../src/cli/templates/@src/api/app.hbs", "../../src/cli/templates/@src/api/router.hbs", "../../src/cli/templates/@src/api/server.hbs", "../../src/cli/templates/@src/api/use.hbs", "../../src/cli/templates/@src/config/index.hbs", "../../src/cli/templates/@src/vite.config.hbs", "../../src/cli/templates/vite.base.hbs"],
|
|
4
|
-
"sourcesContent": ["import { access, constants, cp } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nexport type Project = { name: string; distDir?: string };\n\nexport type SourceFolder = {\n name: string;\n framework?: (typeof FRAMEWORK_OPTIONS)[number];\n ssr?: boolean;\n base?: string;\n port?: number | string;\n};\n\nexport const CREATE_OPTIONS = [\"project\", \"folder\"] as const;\n\nexport const FRAMEWORK_OPTIONS = [\n \"none\",\n \"solid\",\n \"react\",\n \"vue\",\n // TODO: implement svelte generator\n // \"svelte\",\n] as const;\n\nexport const NODE_VERSION = \"22\";\nexport const DEFAULT_DIST = \"dist\";\nexport const DEFAULT_BASE = \"/\";\nexport const DEFAULT_PORT = \"4000\";\nexport const DEFAULT_FRAMEWORK = \"none\" as const;\n\nexport const copyFiles = async (\n src: string,\n dst: string,\n { exclude = [] }: { exclude?: Array<string | RegExp> } = {},\n): Promise<void> => {\n const filter = exclude.length\n ? (path: string) => {\n return !exclude.some((e) => {\n return typeof e === \"string\" ? e === basename(path) : e.test(path);\n });\n }\n : undefined;\n\n await cp(src, dst, {\n recursive: true,\n force: true,\n filter,\n });\n};\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const validateName = (name: string | undefined) => {\n if (!name) {\n return \"Invalid name provided\";\n }\n if (/[^\\w.@$+-]/.test(name)) {\n return \"May contain only alphanumerics, hyphens, periods or any of @ $ +\";\n }\n return undefined;\n};\n\nexport const validateBase = (base: string | undefined) => {\n if (!base?.startsWith(\"/\")) {\n return \"Should start with a slash\";\n }\n if (\n [\n // path traversal patterns\n /\\.\\.\\//,\n /\\/\\.\\//,\n ].some((e) => e.test(base.trim()))\n ) {\n return \"Should not contain path traversal patterns\";\n }\n return undefined;\n};\n\nexport const validatePort = (port: string | number | undefined) => {\n if (!port || /[^\\d]/.test(String(port).trim())) {\n return \"Invalid port number\";\n }\n return undefined;\n};\n\nexport const assertNoError = (validator: () => string | undefined) => {\n const error = validator();\n if (error) {\n throw new Error(`${styleText(\"red\", \"\u2717 ERROR\")}: ${error}`);\n }\n};\n\nexport const messageFactory = (logger?: (...lines: Array<unknown>) => void) => {\n const projectCreatedGreets = [\n \"\u2728 Well Done! Your new KosmoJS app is ready\",\n \"\uD83D\uDCAB Excellent! Your new KosmoJS project is all set\",\n \"\uD83C\uDF1F Nice work! Your KosmoJS setup is ready to perform\",\n \"\uD83D\uDE80 Success! Your KosmoJS project is ready for exploration\",\n \"\u2705 All Set! Your KosmoJS project is configured and ready\",\n ];\n\n const sourceFolderCreatedGreets = [\n \"\uD83D\uDCAB Awesome! You just created a new Source Folder\",\n \"\u2728 Nice! Your new Source Folder is ready to use\",\n \"\uD83C\uDFAF Perfect! Source Folder created successfully\",\n \"\u2705 Great! Your Source Folder is all set up\",\n \"\uD83C\uDF1F Excellent! New Source Folder is ready to perform\",\n ];\n\n const messageHandler = (lines: Array<unknown>) => {\n if (!logger) {\n return lines;\n }\n\n for (const line of lines) {\n logger(` ${line}`);\n }\n\n return undefined;\n };\n\n const greetText = (greets: Array<string>) =>\n styleText(\n [\"bold\", \"green\"],\n greets[Math.floor(Math.random() * greets.length)],\n );\n\n const nextStepText = (text: string) => {\n return styleText([\"bold\", \"italic\", \"cyan\"], text);\n };\n\n const cmdText = (cmd: string, ...altCmds: Array<string>) => {\n const altText = altCmds.length\n ? styleText(\"dim\", ` # or ${altCmds.map((e) => `\\`${e}\\``).join(\" / \")}`)\n : \"\";\n return `$ ${styleText(\"blue\", cmd)}${altText}`;\n };\n\n const docsText = () => \"\uD83D\uDCD8 Docs: https://kosmojs.dev\";\n\n return {\n projectCreated(project: Project) {\n return messageHandler([\n \"\",\n greetText(projectCreatedGreets),\n \"\",\n\n `${styleText([\"bold\", \"yellow\"], \"\u279C Next Steps\")}`,\n \"\",\n\n nextStepText(\"\uD83D\uDCE6 Install Dependencies\"),\n cmdText(`cd ./${project.name}`),\n cmdText(\"pnpm install\", \"npm install\", \"yarn install\"),\n \"\",\n\n nextStepText(\"\uD83D\uDCC1 Add a Source Folder\"),\n cmdText(\"pnpm +folder\", \"npm run +folder\", \"yarn +folder\"),\n \"\",\n\n docsText(),\n \"\",\n ]);\n },\n\n sourceFolderCreated(_folder: SourceFolder) {\n return messageHandler([\n \"\",\n greetText(sourceFolderCreatedGreets),\n \"\",\n\n nextStepText(\n \"\uD83D\uDCE6 Now install any new dependencies that may have been added\",\n ),\n cmdText(\"pnpm install\", \"npm install\", \"yarn install\"),\n \"\",\n\n nextStepText(\n \"\uD83D\uDE80 Once dependencies are installed, start the dev server\",\n ),\n cmdText(\"pnpm dev\", \"npm run dev\", \"yarn dev\"),\n \"\",\n\n docsText(),\n \"\",\n ]);\n },\n };\n};\n", "import { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * INFO: For best compatibility, all packages should share the same version.\n * When bumping the version (even a patch) for a single package, bump it for all packages\n * to keep versions fully synchronized across the project.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { defaults, renderToFile } from \"@kosmojs/devlib\";\n\nimport {\n copyFiles,\n DEFAULT_BASE,\n DEFAULT_DIST,\n DEFAULT_FRAMEWORK,\n DEFAULT_PORT,\n NODE_VERSION,\n type Project,\n pathExists,\n type SourceFolder,\n} from \"./base\";\n\nimport srcApiAppTpl from \"./templates/@src/api/app.hbs\";\nimport srcApiRouterTpl from \"./templates/@src/api/router.hbs\";\nimport srcApiServerTpl from \"./templates/@src/api/server.hbs\";\nimport srcApiUseTpl from \"./templates/@src/api/use.hbs\";\nimport srcConfigTpl from \"./templates/@src/config/index.hbs\";\nimport srcViteConfigTpl from \"./templates/@src/vite.config.hbs\";\nimport viteBaseTpl from \"./templates/vite.base.hbs\";\n\nconst TPL_DIR = resolve(import.meta.dirname, \"templates\");\n\ntype Plugin = {\n importDeclaration: string;\n importName: string;\n options: string;\n};\n\ntype Generator = {\n importDeclaration: string;\n importName: string;\n options: string;\n};\n\nconst tsconfigJson = {\n extends: \"@kosmojs/config/tsconfig.vite.json\",\n compilerOptions: {\n paths: {\n [`${defaults.appPrefix}/*`]: [\"./*\", `./${defaults.libDir}/*`],\n },\n },\n};\n\nconst SEMVER = `^${self.version}`;\n\nexport const createProject = async (\n path: string,\n project: Project,\n assets?: {\n NODE_VERSION?: `${number}`;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n) => {\n const packageJson = {\n type: \"module\",\n distDir: project.distDir || DEFAULT_DIST,\n scripts: {\n dev: \"kosmo dev\",\n build: \"kosmo build\",\n \"+folder\": \"kosmo folder\",\n },\n dependencies: {\n \"@kosmojs/api\": SEMVER,\n qs: self.devDependencies.qs,\n ...assets?.dependencies,\n },\n devDependencies: {\n \"@kosmojs/config\": SEMVER,\n \"@kosmojs/dev\": SEMVER,\n \"@types/node\": self.devDependencies[\"@types/node\"],\n \"@types/qs\": self.devDependencies[\"@types/qs\"],\n esbuild: self.dependencies.esbuild,\n tslib: self.devDependencies.tslib,\n typescript: self.dependencies.typescript,\n vite: self.devDependencies.vite,\n ...assets?.devDependencies,\n },\n pnpm: {\n onlyBuiltDependencies: [\"esbuild\"],\n },\n };\n\n const esbuildJson = {\n bundle: true,\n platform: \"node\",\n target: `node${assets?.NODE_VERSION || NODE_VERSION}`,\n format: \"esm\",\n packages: \"external\",\n sourcemap: \"linked\",\n logLevel: \"info\",\n };\n\n const projectPath = resolve(path, project.name);\n\n if (await pathExists(projectPath)) {\n throw new Error(`${project.name} already exists`);\n }\n\n await copyFiles(TPL_DIR, projectPath, {\n exclude: [/@src/, /.+\\.hbs/],\n });\n\n for (const [file, template] of [\n [\"vite.base.ts\", viteBaseTpl],\n [\"esbuild.json\", JSON.stringify(esbuildJson, null, 2)],\n [\"package.json\", JSON.stringify(packageJson, null, 2)],\n [\"tsconfig.json\", JSON.stringify(tsconfigJson, null, 2)],\n ]) {\n await renderToFile(resolve(projectPath, file), template, {\n defaults,\n distDir: project.distDir || DEFAULT_DIST,\n });\n }\n};\n\nexport const createSourceFolder = async (\n projectRoot: string, // path inside project\n folder: SourceFolder,\n opt?: {\n frameworkOptions?: Record<string, unknown>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n) => {\n const folderPath = resolve(projectRoot, folder.name);\n\n if (await pathExists(folderPath)) {\n throw new Error(`${folder.name} already exists`);\n }\n\n await copyFiles(resolve(TPL_DIR, \"@src\"), folderPath, {\n exclude: [/.+\\.hbs/],\n });\n\n const packageFile = resolve(projectRoot, \"package.json\");\n\n const packageImport = await import(packageFile, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const tsconfigFile = resolve(projectRoot, \"tsconfig.json\");\n\n const tsconfigImport = await import(tsconfigFile, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const compilerOptions = {\n ...tsconfigImport?.compilerOptions,\n // instruct TypeScript to preserve JSX\n jsx: \"preserve\",\n };\n\n const plugins: Array<Plugin> = [];\n const generators: Array<Generator> = [];\n\n const dependencies: Record<string, string> = {};\n const devDependencies: Record<string, string> = {};\n\n const framework: SourceFolder[\"framework\"] =\n folder.framework || DEFAULT_FRAMEWORK;\n\n if (framework === \"solid\") {\n Object.assign(dependencies, {\n \"@solidjs/router\": self.devDependencies[\"@solidjs/router\"],\n \"solid-js\": self.devDependencies[\"solid-js\"],\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/solid-generator\": SEMVER,\n \"vite-plugin-solid\": self.devDependencies[\"vite-plugin-solid\"],\n });\n\n plugins.push({\n importDeclaration: `import solidPlugin from \"vite-plugin-solid\";`,\n importName: \"solidPlugin\",\n options: folder.ssr ? \"{ ssr: true }\" : \"\",\n });\n\n generators.push({\n importDeclaration: `import solidGenerator from \"@kosmojs/solid-generator\";`,\n importName: \"solidGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n\n compilerOptions.jsxImportSource = \"solid-js\";\n } else if (framework === \"react\") {\n Object.assign(dependencies, {\n react: self.devDependencies.react,\n \"react-router\": self.devDependencies[\"react-router\"],\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/react-generator\": SEMVER,\n \"@vitejs/plugin-react\": self.devDependencies[\"@vitejs/plugin-react\"],\n \"@types/react\": self.devDependencies[\"@types/react\"],\n \"@types/react-dom\": self.devDependencies[\"@types/react-dom\"],\n \"react-dom\": self.devDependencies[\"react-dom\"],\n });\n\n plugins.push({\n importDeclaration: `import reactPlugin from \"@vitejs/plugin-react\";`,\n importName: \"reactPlugin\",\n options: \"\",\n });\n\n generators.push({\n importDeclaration: `import reactGenerator from \"@kosmojs/react-generator\";`,\n importName: \"reactGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n\n compilerOptions.jsxImportSource = \"react\";\n } else if (framework === \"vue\") {\n Object.assign(dependencies, {\n \"vue-router\": self.devDependencies[\"vue-router\"],\n vue: self.devDependencies.vue,\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/vue-generator\": SEMVER,\n \"@vitejs/plugin-vue\": self.devDependencies[\"@vitejs/plugin-vue\"],\n });\n\n plugins.push({\n importDeclaration: `import vuePlugin from \"@vitejs/plugin-vue\";`,\n importName: \"vuePlugin\",\n options: \"\",\n });\n\n generators.push({\n importDeclaration: `import vueGenerator from \"@kosmojs/vue-generator\";`,\n importName: \"vueGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n }\n\n if (folder.ssr) {\n generators.push({\n importDeclaration: `import ssrGenerator from \"@kosmojs/ssr-generator\";`,\n importName: \"ssrGenerator\",\n options: \"\",\n });\n Object.assign(devDependencies, {\n \"@kosmojs/ssr-generator\": SEMVER,\n });\n }\n\n const context = {\n folder: {\n base: DEFAULT_BASE,\n port: DEFAULT_PORT,\n ...folder,\n },\n defaults,\n plugins,\n generators,\n importPathmap: {\n core: [defaults.appPrefix, defaults.coreDir, defaults.apiDir].join(\"/\"),\n lib: [folder.name, defaults.apiLibDir].join(\"/\"),\n },\n };\n\n for (const [file, template] of [\n [`${defaults.configDir}/index.ts`, srcConfigTpl],\n [`${defaults.apiDir}/app.ts`, srcApiAppTpl],\n [`${defaults.apiDir}/router.ts`, srcApiRouterTpl],\n [`${defaults.apiDir}/server.ts`, srcApiServerTpl],\n [`${defaults.apiDir}/use.ts`, srcApiUseTpl],\n [\"vite.config.ts\", srcViteConfigTpl],\n // stub files for initial build to pass;\n // generators will fill them with appropriate content.\n [`${defaults.apiDir}/index/index.ts`, \"\"],\n ...([\"solid\", \"react\"].includes(framework)\n ? [\n [`${defaults.pagesDir}/index/index.tsx`, \"\"],\n [`${defaults.entryDir}/client.tsx`, \"\"],\n ]\n : []),\n ...([\"vue\"].includes(framework)\n ? [\n [`${defaults.pagesDir}/index/index.vue`, \"\"],\n [`${defaults.entryDir}/client.ts`, \"\"],\n ]\n : []),\n ]) {\n await renderToFile(resolve(folderPath, file), template, context);\n }\n\n const tsconfigUpdated = {\n ...tsconfigJson,\n ...tsconfigImport,\n compilerOptions: {\n ...compilerOptions,\n paths: {\n ...compilerOptions?.paths,\n [`${folder.name}/*`]: [\n `./${folder.name}/*`,\n `./${defaults.libDir}/${folder.name}/*`,\n ],\n },\n },\n };\n\n await writeFile(\n tsconfigFile,\n JSON.stringify(tsconfigUpdated, null, 2),\n \"utf8\",\n );\n\n const packageUpdated = {\n ...packageImport,\n dependencies: {\n ...packageImport.dependencies,\n ...dependencies,\n ...opt?.dependencies,\n },\n devDependencies: {\n ...packageImport.devDependencies,\n ...devDependencies,\n ...opt?.devDependencies,\n },\n };\n\n await writeFile(packageFile, JSON.stringify(packageUpdated, null, 2));\n};\n", "import createApp from \"{{importPathmap.core}}/app\";\n\nimport router from \"./router\";\n\nexport default () => {\n const app = createApp();\n\n // routes goes latest\n app.use(router.routes());\n\n return app;\n};\n\n/**\n * In dev mode, determines whether to pass the request to API handler or to Vite.\nexport const devMiddlewareFactory: import(\"@kosmojs/api\").DevMiddlewareFactory = (\n app,\n) => {\n return (req, res, next) => {\n return req.url?.startsWith(\"...\")\n ? app?.callback()(req, res) // send request to api handler\n : next(); // send request to vite dev server\n };\n};\n * */\n\n/**\n * In dev mode, used to cleanup before reloading api handler.\nexport const teardownHandler: import(\"@kosmojs/api\").TeardownHandler = () => {\n // close db connections, server sockets etc.\n};\n * */\n", "import { routerRoutes } from \"{{importPathmap.lib}}\";\n\nimport createRouter from \"{{importPathmap.core}}/router\";\n\nconst router = createRouter();\n\nfor (const { name, path, methods, middleware } of routerRoutes) {\n router.register(path, methods, middleware, { name });\n}\n\nexport default router;\n", "import createServer from \"{{importPathmap.core}}/server\";\nimport createApp from \"./app\";\n\ncreateServer(createApp);\n", "import globalMiddleware from \"{{defaults.appPrefix}}/core/api/use\";\n\nexport default [\n // Global middleware applied to all routes\n ...globalMiddleware,\n];\n", "export const baseurl = \"{{folder.base}}\";\nexport const apiurl = \"/api\"; // relative to baseurl\n", "import { join } from \"node:path\";\n\n{{#each plugins}}{{importDeclaration}}\n{{/each}}\nimport devPlugin, { apiGenerator, fetchGenerator } from \"@kosmojs/dev\";\n{{#each generators}}{{importDeclaration}}\n{{/each}}\n\nimport defineConfig from \"../vite.base\";\nimport { apiurl, baseurl } from \"./config\";\n\nexport default defineConfig(import.meta.dirname, {\n base: join(baseurl, \"/\"),\n server: {\n port: {{folder.port}},\n },\n plugins: [\n {{#each plugins}}{{importName}}({{options}}),\n {{/each}}\n devPlugin(apiurl, {\n generators: [\n apiGenerator(),\n fetchGenerator(),\n {{#each generators}}{{importName}}({{options}}),\n {{/each}}\n ],\n }),\n ],\n});\n", "import { basename, resolve } from \"node:path\";\n\nimport { aliasPlugin, definePlugin } from \"@kosmojs/dev\";\nimport { loadEnv, mergeConfig, type UserConfig } from \"vite\";\n\nimport pkg from \"./package.json\" with { type: \"json\" };\n\nexport default async (sourceFolderPath: string, config: UserConfig) => {\n const env = loadEnv(\"mock\", import.meta.dirname);\n const sourceFolder = basename(sourceFolderPath);\n return mergeConfig(config, {\n build: {\n outDir: resolve(import.meta.dirname, `${pkg.distDir}/${sourceFolder}`),\n emptyOutDir: true,\n sourcemap: true,\n },\n\n server: {\n host: true,\n allowedHosts: [env.VITE_HOSTNAME],\n fs: {\n strict: false,\n },\n watch: {\n awaitWriteFinish: {\n stabilityThreshold: 800,\n pollInterval: 200,\n },\n },\n },\n\n cacheDir: resolve(import.meta.dirname, `var/.vite/${sourceFolder}`),\n\n plugins: [\n aliasPlugin(import.meta.dirname),\n definePlugin([\n {\n // keys extracted from process.env and exposed to client\n keys: [\"DEBUG\"],\n },\n ]),\n ],\n });\n};\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,QAAQ,WAAW,UAAU;AACtC,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAYnB,IAAM,iBAAiB,CAAC,WAAW,QAAQ;AAE3C,IAAM,oBAAoB
|
|
4
|
+
"sourcesContent": ["import { access, constants, cp } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nexport type Project = { name: string; distDir?: string };\n\nexport type SourceFolder = {\n name: string;\n framework?: (typeof FRAMEWORK_OPTIONS)[number];\n ssr?: boolean;\n base?: string;\n port?: number | string;\n};\n\nexport const CREATE_OPTIONS = [\"project\", \"folder\"] as const;\n\nexport const FRAMEWORK_OPTIONS = [\"none\", \"solid\", \"react\", \"vue\"] as const;\n\nexport const NODE_VERSION = \"22\";\nexport const DEFAULT_DIST = \"dist\";\nexport const DEFAULT_BASE = \"/\";\nexport const DEFAULT_PORT = \"4000\";\nexport const DEFAULT_FRAMEWORK = \"none\" as const;\n\nexport const copyFiles = async (\n src: string,\n dst: string,\n { exclude = [] }: { exclude?: Array<string | RegExp> } = {},\n): Promise<void> => {\n const filter = exclude.length\n ? (path: string) => {\n return !exclude.some((e) => {\n return typeof e === \"string\" ? e === basename(path) : e.test(path);\n });\n }\n : undefined;\n\n await cp(src, dst, {\n recursive: true,\n force: true,\n filter,\n });\n};\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const validateName = (name: string | undefined) => {\n if (!name) {\n return \"Invalid name provided\";\n }\n if (/[^\\w.@$+-]/.test(name)) {\n return \"May contain only alphanumerics, hyphens, periods or any of @ $ +\";\n }\n return undefined;\n};\n\nexport const validateBase = (base: string | undefined) => {\n if (!base?.startsWith(\"/\")) {\n return \"Should start with a slash\";\n }\n if (\n [\n // path traversal patterns\n /\\.\\.\\//,\n /\\/\\.\\//,\n ].some((e) => e.test(base.trim()))\n ) {\n return \"Should not contain path traversal patterns\";\n }\n return undefined;\n};\n\nexport const validatePort = (port: string | number | undefined) => {\n if (!port || /[^\\d]/.test(String(port).trim())) {\n return \"Invalid port number\";\n }\n return undefined;\n};\n\nexport const assertNoError = (validator: () => string | undefined) => {\n const error = validator();\n if (error) {\n throw new Error(`${styleText(\"red\", \"\u2717 ERROR\")}: ${error}`);\n }\n};\n\nexport const messageFactory = (logger?: (...lines: Array<unknown>) => void) => {\n const projectCreatedGreets = [\n \"\u2728 Well Done! Your new KosmoJS app is ready\",\n \"\uD83D\uDCAB Excellent! Your new KosmoJS project is all set\",\n \"\uD83C\uDF1F Nice work! Your KosmoJS setup is ready to perform\",\n \"\uD83D\uDE80 Success! Your KosmoJS project is ready for exploration\",\n \"\u2705 All Set! Your KosmoJS project is configured and ready\",\n ];\n\n const sourceFolderCreatedGreets = [\n \"\uD83D\uDCAB Awesome! You just created a new Source Folder\",\n \"\u2728 Nice! Your new Source Folder is ready to use\",\n \"\uD83C\uDFAF Perfect! Source Folder created successfully\",\n \"\u2705 Great! Your Source Folder is all set up\",\n \"\uD83C\uDF1F Excellent! New Source Folder is ready to perform\",\n ];\n\n const messageHandler = (lines: Array<unknown>) => {\n if (!logger) {\n return lines;\n }\n\n for (const line of lines) {\n logger(` ${line}`);\n }\n\n return undefined;\n };\n\n const greetText = (greets: Array<string>) =>\n styleText(\n [\"bold\", \"green\"],\n greets[Math.floor(Math.random() * greets.length)],\n );\n\n const nextStepText = (text: string) => {\n return styleText([\"bold\", \"italic\", \"cyan\"], text);\n };\n\n const cmdText = (cmd: string, ...altCmds: Array<string>) => {\n const altText = altCmds.length\n ? styleText(\"dim\", ` # or ${altCmds.map((e) => `\\`${e}\\``).join(\" / \")}`)\n : \"\";\n return `$ ${styleText(\"blue\", cmd)}${altText}`;\n };\n\n const docsText = () => \"\uD83D\uDCD8 Docs: https://kosmojs.dev\";\n\n return {\n projectCreated(project: Project) {\n return messageHandler([\n \"\",\n greetText(projectCreatedGreets),\n \"\",\n\n `${styleText([\"bold\", \"yellow\"], \"\u279C Next Steps\")}`,\n \"\",\n\n nextStepText(\"\uD83D\uDCE6 Install Dependencies\"),\n cmdText(`cd ./${project.name}`),\n cmdText(\"pnpm install\", \"npm install\", \"yarn install\"),\n \"\",\n\n nextStepText(\"\uD83D\uDCC1 Add a Source Folder\"),\n cmdText(\"pnpm +folder\", \"npm run +folder\", \"yarn +folder\"),\n \"\",\n\n docsText(),\n \"\",\n ]);\n },\n\n sourceFolderCreated(_folder: SourceFolder) {\n return messageHandler([\n \"\",\n greetText(sourceFolderCreatedGreets),\n \"\",\n\n nextStepText(\n \"\uD83D\uDCE6 Now install any new dependencies that may have been added\",\n ),\n cmdText(\"pnpm install\", \"npm install\", \"yarn install\"),\n \"\",\n\n nextStepText(\n \"\uD83D\uDE80 Once dependencies are installed, start the dev server\",\n ),\n cmdText(\"pnpm dev\", \"npm run dev\", \"yarn dev\"),\n \"\",\n\n docsText(),\n \"\",\n ]);\n },\n };\n};\n", "import { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * INFO: For best compatibility, all packages should share the same version.\n * When bumping the version (even a patch) for a single package, bump it for all packages\n * to keep versions fully synchronized across the project.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { defaults, renderToFile } from \"@kosmojs/devlib\";\n\nimport {\n copyFiles,\n DEFAULT_BASE,\n DEFAULT_DIST,\n DEFAULT_FRAMEWORK,\n DEFAULT_PORT,\n NODE_VERSION,\n type Project,\n pathExists,\n type SourceFolder,\n} from \"./base\";\n\nimport srcApiAppTpl from \"./templates/@src/api/app.hbs\";\nimport srcApiRouterTpl from \"./templates/@src/api/router.hbs\";\nimport srcApiServerTpl from \"./templates/@src/api/server.hbs\";\nimport srcApiUseTpl from \"./templates/@src/api/use.hbs\";\nimport srcConfigTpl from \"./templates/@src/config/index.hbs\";\nimport srcViteConfigTpl from \"./templates/@src/vite.config.hbs\";\nimport viteBaseTpl from \"./templates/vite.base.hbs\";\n\nconst TPL_DIR = resolve(import.meta.dirname, \"templates\");\n\ntype Plugin = {\n importDeclaration: string;\n importName: string;\n options: string;\n};\n\ntype Generator = {\n importDeclaration: string;\n importName: string;\n options: string;\n};\n\nconst tsconfigJson = {\n extends: \"@kosmojs/config/tsconfig.vite.json\",\n compilerOptions: {\n paths: {\n [`${defaults.appPrefix}/*`]: [\"./*\", `./${defaults.libDir}/*`],\n },\n },\n};\n\nconst SEMVER = `^${self.version}`;\n\nexport const createProject = async (\n path: string,\n project: Project,\n assets?: {\n NODE_VERSION?: `${number}`;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n) => {\n const packageJson = {\n type: \"module\",\n distDir: project.distDir || DEFAULT_DIST,\n scripts: {\n dev: \"kosmo dev\",\n build: \"kosmo build\",\n \"+folder\": \"kosmo folder\",\n },\n dependencies: {\n \"@kosmojs/api\": SEMVER,\n qs: self.devDependencies.qs,\n ...assets?.dependencies,\n },\n devDependencies: {\n \"@kosmojs/config\": SEMVER,\n \"@kosmojs/dev\": SEMVER,\n \"@types/node\": self.devDependencies[\"@types/node\"],\n \"@types/qs\": self.devDependencies[\"@types/qs\"],\n esbuild: self.dependencies.esbuild,\n tslib: self.devDependencies.tslib,\n typescript: self.dependencies.typescript,\n vite: self.devDependencies.vite,\n ...assets?.devDependencies,\n },\n pnpm: {\n onlyBuiltDependencies: [\"esbuild\"],\n },\n };\n\n const esbuildJson = {\n bundle: true,\n platform: \"node\",\n target: `node${assets?.NODE_VERSION || NODE_VERSION}`,\n format: \"esm\",\n packages: \"external\",\n sourcemap: \"linked\",\n logLevel: \"info\",\n };\n\n const projectPath = resolve(path, project.name);\n\n if (await pathExists(projectPath)) {\n throw new Error(`${project.name} already exists`);\n }\n\n await copyFiles(TPL_DIR, projectPath, {\n exclude: [/@src/, /.+\\.hbs/],\n });\n\n for (const [file, template] of [\n [\"vite.base.ts\", viteBaseTpl],\n [\"esbuild.json\", JSON.stringify(esbuildJson, null, 2)],\n [\"package.json\", JSON.stringify(packageJson, null, 2)],\n [\"tsconfig.json\", JSON.stringify(tsconfigJson, null, 2)],\n ]) {\n await renderToFile(resolve(projectPath, file), template, {\n defaults,\n distDir: project.distDir || DEFAULT_DIST,\n });\n }\n};\n\nexport const createSourceFolder = async (\n projectRoot: string, // path inside project\n folder: SourceFolder,\n opt?: {\n frameworkOptions?: Record<string, unknown>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n) => {\n const folderPath = resolve(projectRoot, folder.name);\n\n if (await pathExists(folderPath)) {\n throw new Error(`${folder.name} already exists`);\n }\n\n await copyFiles(resolve(TPL_DIR, \"@src\"), folderPath, {\n exclude: [/.+\\.hbs/],\n });\n\n const packageFile = resolve(projectRoot, \"package.json\");\n\n const packageImport = await import(packageFile, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const tsconfigFile = resolve(projectRoot, \"tsconfig.json\");\n\n const tsconfigImport = await import(tsconfigFile, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const compilerOptions = {\n ...tsconfigImport?.compilerOptions,\n // instruct TypeScript to preserve JSX\n jsx: \"preserve\",\n };\n\n const plugins: Array<Plugin> = [];\n const generators: Array<Generator> = [];\n\n const dependencies: Record<string, string> = {};\n const devDependencies: Record<string, string> = {};\n\n const framework: SourceFolder[\"framework\"] =\n folder.framework || DEFAULT_FRAMEWORK;\n\n if (framework === \"solid\") {\n Object.assign(dependencies, {\n \"@solidjs/router\": self.devDependencies[\"@solidjs/router\"],\n \"solid-js\": self.devDependencies[\"solid-js\"],\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/solid-generator\": SEMVER,\n \"vite-plugin-solid\": self.devDependencies[\"vite-plugin-solid\"],\n });\n\n plugins.push({\n importDeclaration: `import solidPlugin from \"vite-plugin-solid\";`,\n importName: \"solidPlugin\",\n options: folder.ssr ? \"{ ssr: true }\" : \"\",\n });\n\n generators.push({\n importDeclaration: `import solidGenerator from \"@kosmojs/solid-generator\";`,\n importName: \"solidGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n\n compilerOptions.jsxImportSource = \"solid-js\";\n } else if (framework === \"react\") {\n Object.assign(dependencies, {\n react: self.devDependencies.react,\n \"react-router\": self.devDependencies[\"react-router\"],\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/react-generator\": SEMVER,\n \"@vitejs/plugin-react\": self.devDependencies[\"@vitejs/plugin-react\"],\n \"@types/react\": self.devDependencies[\"@types/react\"],\n \"@types/react-dom\": self.devDependencies[\"@types/react-dom\"],\n \"react-dom\": self.devDependencies[\"react-dom\"],\n });\n\n plugins.push({\n importDeclaration: `import reactPlugin from \"@vitejs/plugin-react\";`,\n importName: \"reactPlugin\",\n options: \"\",\n });\n\n generators.push({\n importDeclaration: `import reactGenerator from \"@kosmojs/react-generator\";`,\n importName: \"reactGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n\n compilerOptions.jsxImportSource = \"react\";\n } else if (framework === \"vue\") {\n Object.assign(dependencies, {\n \"vue-router\": self.devDependencies[\"vue-router\"],\n vue: self.devDependencies.vue,\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/vue-generator\": SEMVER,\n \"@vitejs/plugin-vue\": self.devDependencies[\"@vitejs/plugin-vue\"],\n });\n\n plugins.push({\n importDeclaration: `import vuePlugin from \"@vitejs/plugin-vue\";`,\n importName: \"vuePlugin\",\n options: \"\",\n });\n\n generators.push({\n importDeclaration: `import vueGenerator from \"@kosmojs/vue-generator\";`,\n importName: \"vueGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n }\n\n if (folder.ssr) {\n generators.push({\n importDeclaration: `import ssrGenerator from \"@kosmojs/ssr-generator\";`,\n importName: \"ssrGenerator\",\n options: \"\",\n });\n Object.assign(dependencies, {\n \"path-to-regexp\": self.devDependencies[\"path-to-regexp\"],\n });\n Object.assign(devDependencies, {\n \"@kosmojs/ssr-generator\": SEMVER,\n });\n }\n\n const context = {\n folder: {\n base: DEFAULT_BASE,\n port: DEFAULT_PORT,\n ...folder,\n },\n defaults,\n plugins,\n generators,\n importPathmap: {\n core: [defaults.appPrefix, defaults.coreDir, defaults.apiDir].join(\"/\"),\n lib: [folder.name, defaults.apiLibDir].join(\"/\"),\n },\n };\n\n for (const [file, template] of [\n [`${defaults.configDir}/index.ts`, srcConfigTpl],\n [`${defaults.apiDir}/app.ts`, srcApiAppTpl],\n [`${defaults.apiDir}/router.ts`, srcApiRouterTpl],\n [`${defaults.apiDir}/server.ts`, srcApiServerTpl],\n [`${defaults.apiDir}/use.ts`, srcApiUseTpl],\n [\"vite.config.ts\", srcViteConfigTpl],\n // stub files for initial build to pass;\n // generators will fill them with appropriate content.\n [`${defaults.apiDir}/index/index.ts`, \"\"],\n ...([\"solid\", \"react\"].includes(framework)\n ? [\n [`${defaults.pagesDir}/index/index.tsx`, \"\"],\n [`${defaults.entryDir}/client.tsx`, \"\"],\n ]\n : []),\n ...([\"vue\"].includes(framework)\n ? [\n [`${defaults.pagesDir}/index/index.vue`, \"\"],\n [`${defaults.entryDir}/client.ts`, \"\"],\n ]\n : []),\n ]) {\n await renderToFile(resolve(folderPath, file), template, context);\n }\n\n const tsconfigUpdated = {\n ...tsconfigJson,\n ...tsconfigImport,\n compilerOptions: {\n ...compilerOptions,\n paths: {\n ...compilerOptions?.paths,\n [`${folder.name}/*`]: [\n `./${folder.name}/*`,\n `./${defaults.libDir}/${folder.name}/*`,\n ],\n },\n },\n };\n\n await writeFile(\n tsconfigFile,\n JSON.stringify(tsconfigUpdated, null, 2),\n \"utf8\",\n );\n\n const packageUpdated = {\n ...packageImport,\n dependencies: {\n ...packageImport.dependencies,\n ...dependencies,\n ...opt?.dependencies,\n },\n devDependencies: {\n ...packageImport.devDependencies,\n ...devDependencies,\n ...opt?.devDependencies,\n },\n };\n\n await writeFile(packageFile, JSON.stringify(packageUpdated, null, 2));\n};\n", "import createApp from \"{{importPathmap.core}}/app\";\n\nimport router from \"./router\";\n\nexport default () => {\n const app = createApp();\n\n // routes goes latest\n app.use(router.routes());\n\n return app;\n};\n\n/**\n * In dev mode, determines whether to pass the request to API handler or to Vite.\nexport const devMiddlewareFactory: import(\"@kosmojs/api\").DevMiddlewareFactory = (\n app,\n) => {\n return (req, res, next) => {\n return req.url?.startsWith(\"...\")\n ? app?.callback()(req, res) // send request to api handler\n : next(); // send request to vite dev server\n };\n};\n * */\n\n/**\n * In dev mode, used to cleanup before reloading api handler.\nexport const teardownHandler: import(\"@kosmojs/api\").TeardownHandler = () => {\n // close db connections, server sockets etc.\n};\n * */\n", "import { routerRoutes } from \"{{importPathmap.lib}}\";\n\nimport createRouter from \"{{importPathmap.core}}/router\";\n\nconst router = createRouter();\n\nfor (const { name, path, methods, middleware } of routerRoutes) {\n router.register(path, methods, middleware, { name });\n}\n\nexport default router;\n", "import createServer from \"{{importPathmap.core}}/server\";\nimport createApp from \"./app\";\n\ncreateServer(createApp);\n", "import globalMiddleware from \"{{defaults.appPrefix}}/core/api/use\";\n\nexport default [\n // Global middleware applied to all routes\n ...globalMiddleware,\n];\n", "export const baseurl = \"{{folder.base}}\";\nexport const apiurl = \"/api\"; // relative to baseurl\n", "import { join } from \"node:path\";\n\n{{#each plugins}}{{importDeclaration}}\n{{/each}}\nimport devPlugin, { apiGenerator, fetchGenerator } from \"@kosmojs/dev\";\n{{#each generators}}{{importDeclaration}}\n{{/each}}\n\nimport defineConfig from \"../vite.base\";\nimport { apiurl, baseurl } from \"./config\";\n\nexport default defineConfig(import.meta.dirname, {\n base: join(baseurl, \"/\"),\n server: {\n port: {{folder.port}},\n },\n plugins: [\n {{#each plugins}}{{importName}}({{options}}),\n {{/each}}\n devPlugin(apiurl, {\n generators: [\n apiGenerator(),\n fetchGenerator(),\n {{#each generators}}{{importName}}({{options}}),\n {{/each}}\n ],\n }),\n ],\n});\n", "import { basename, resolve } from \"node:path\";\n\nimport { aliasPlugin, definePlugin } from \"@kosmojs/dev\";\nimport { loadEnv, mergeConfig, type UserConfig } from \"vite\";\n\nimport pkg from \"./package.json\" with { type: \"json\" };\n\nexport default async (sourceFolderPath: string, config: UserConfig) => {\n const env = loadEnv(\"mock\", import.meta.dirname);\n const sourceFolder = basename(sourceFolderPath);\n return mergeConfig(config, {\n build: {\n outDir: resolve(import.meta.dirname, `${pkg.distDir}/${sourceFolder}`),\n emptyOutDir: true,\n sourcemap: true,\n },\n\n server: {\n host: true,\n allowedHosts: [env.VITE_HOSTNAME],\n fs: {\n strict: false,\n },\n watch: {\n awaitWriteFinish: {\n stabilityThreshold: 800,\n pollInterval: 200,\n },\n },\n },\n\n cacheDir: resolve(import.meta.dirname, `var/.vite/${sourceFolder}`),\n\n plugins: [\n aliasPlugin(import.meta.dirname),\n definePlugin([\n {\n // keys extracted from process.env and exposed to client\n keys: [\"DEBUG\"],\n },\n ]),\n ],\n });\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/pkg/index.js
CHANGED
|
@@ -510,6 +510,43 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
|
|
|
510
510
|
var types_default = '{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n "{{name}}"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n';
|
|
511
511
|
|
|
512
512
|
// src/base-plugin/routes.ts
|
|
513
|
+
var API_INDEX_PATTERN = "index.ts";
|
|
514
|
+
var PAGE_INDEX_PATTERN = "index.{tsx,vue}";
|
|
515
|
+
var ROUTE_FILE_PATTERNS = [
|
|
516
|
+
`${defaults2.apiDir}/**/${API_INDEX_PATTERN}`,
|
|
517
|
+
`${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`
|
|
518
|
+
];
|
|
519
|
+
var resolveRouteFile = (file, { appRoot, sourceFolder }) => {
|
|
520
|
+
const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
|
|
521
|
+
if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
|
|
525
|
+
};
|
|
526
|
+
var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
|
|
527
|
+
const resolvedPaths = resolveRouteFile(_file, { appRoot, sourceFolder });
|
|
528
|
+
if (!resolvedPaths) {
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
const [folder, file] = resolvedPaths;
|
|
532
|
+
const fileFullpath = join2(appRoot, sourceFolder, folder, file);
|
|
533
|
+
const pathTokens = pathTokensFactory(dirname2(file));
|
|
534
|
+
const name = pathTokens.map((e) => e.orig).join("/");
|
|
535
|
+
const importPath = dirname2(file);
|
|
536
|
+
const importName = [
|
|
537
|
+
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
538
|
+
crc3(importPath)
|
|
539
|
+
].join("_");
|
|
540
|
+
return {
|
|
541
|
+
name,
|
|
542
|
+
folder,
|
|
543
|
+
file,
|
|
544
|
+
fileFullpath,
|
|
545
|
+
pathTokens,
|
|
546
|
+
importPath,
|
|
547
|
+
importName
|
|
548
|
+
};
|
|
549
|
+
};
|
|
513
550
|
var routes_default = async (pluginOptions) => {
|
|
514
551
|
const {
|
|
515
552
|
appRoot,
|
|
@@ -530,44 +567,11 @@ var routes_default = async (pluginOptions) => {
|
|
|
530
567
|
getSourceFile,
|
|
531
568
|
refreshSourceFile
|
|
532
569
|
} = typeResolverFactory(pluginOptions);
|
|
533
|
-
const routeFilePatterns = [
|
|
534
|
-
`${defaults2.apiDir}/**/index.ts`,
|
|
535
|
-
`${defaults2.pagesDir}/**/index.{ts,tsx,vue,svelte}`
|
|
536
|
-
];
|
|
537
|
-
const resolveRouteFile = (file) => {
|
|
538
|
-
const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
|
|
539
|
-
if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
|
|
540
|
-
return;
|
|
541
|
-
}
|
|
542
|
-
return picomatch.isMatch(join2(folder, ...rest), routeFilePatterns) ? [folder, rest.join("/")] : void 0;
|
|
543
|
-
};
|
|
544
570
|
const resolversFactory = (routeFiles2) => {
|
|
545
571
|
const resolvers = /* @__PURE__ */ new Map();
|
|
546
|
-
const entries = routeFiles2.flatMap((
|
|
547
|
-
const
|
|
548
|
-
|
|
549
|
-
return [];
|
|
550
|
-
}
|
|
551
|
-
const [folder, file] = resolvedPaths;
|
|
552
|
-
const fileFullpath = join2(appRoot, sourceFolder, folder, file);
|
|
553
|
-
const pathTokens = pathTokensFactory(dirname2(file));
|
|
554
|
-
const name = pathTokens.map((e) => e.orig).join("/");
|
|
555
|
-
const importPath = dirname2(file);
|
|
556
|
-
const importName = [
|
|
557
|
-
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
558
|
-
crc3(importPath)
|
|
559
|
-
].join("_");
|
|
560
|
-
return [
|
|
561
|
-
{
|
|
562
|
-
name,
|
|
563
|
-
folder,
|
|
564
|
-
file,
|
|
565
|
-
fileFullpath,
|
|
566
|
-
pathTokens,
|
|
567
|
-
importPath,
|
|
568
|
-
importName
|
|
569
|
-
}
|
|
570
|
-
];
|
|
572
|
+
const entries = routeFiles2.flatMap((file) => {
|
|
573
|
+
const entry = resolveRouteEntry(file, pluginOptions);
|
|
574
|
+
return entry ? [entry] : [];
|
|
571
575
|
});
|
|
572
576
|
for (const entry of entries.filter((e) => e.folder === defaults2.apiDir)) {
|
|
573
577
|
const {
|
|
@@ -746,19 +750,18 @@ var routes_default = async (pluginOptions) => {
|
|
|
746
750
|
}
|
|
747
751
|
return resolvers;
|
|
748
752
|
};
|
|
749
|
-
const routeFiles = await glob2(
|
|
753
|
+
const routeFiles = await glob2(ROUTE_FILE_PATTERNS, {
|
|
750
754
|
cwd: resolve4(appRoot, sourceFolder),
|
|
751
755
|
absolute: true,
|
|
752
756
|
onlyFiles: true,
|
|
753
757
|
ignore: [
|
|
754
|
-
`${defaults2.apiDir}
|
|
755
|
-
`${defaults2.pagesDir}
|
|
758
|
+
`${defaults2.apiDir}/${API_INDEX_PATTERN}`,
|
|
759
|
+
`${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`
|
|
756
760
|
]
|
|
757
761
|
});
|
|
758
762
|
return {
|
|
759
763
|
resolvers: resolversFactory(routeFiles),
|
|
760
|
-
resolversFactory
|
|
761
|
-
resolveRouteFile
|
|
764
|
+
resolversFactory
|
|
762
765
|
};
|
|
763
766
|
};
|
|
764
767
|
|
package/pkg/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/alias-plugin/index.ts", "../src/base-plugin/index.ts", "../src/base-plugin/api-handler.ts", "../src/base-plugin/routes.ts", "../src/base-plugin/ast.ts", "../src/base-plugin/cache.ts", "../src/base-plugin/templates/resolved-types.hbs", "../src/base-plugin/templates/types.hbs", "../src/base-plugin/spinner.ts", "../src/define-plugin/index.ts"],
|
|
4
|
-
"sourcesContent": ["export type { SSRFactory } from \"@kosmojs/devlib\";\n\nexport { default as apiGenerator } from \"@kosmojs/api-generator\";\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\n\nexport { default as aliasPlugin } from \"./alias-plugin\";\nexport { default } from \"./base-plugin\";\nexport { default as definePlugin } from \"./define-plugin\";\n", "import { glob } from \"tinyglobby\";\nimport type { Alias, Plugin } from \"vite\";\n\nexport default (\n appRoot: string,\n opt?: {\n ignore?: Array<string>;\n },\n): Plugin => {\n return {\n name: \"@kosmojs:aliasPlugin\",\n\n async config() {\n const compilerOptions: {\n paths: Record<string, Array<string>>;\n } = await import(`${appRoot}/tsconfig.json`, {\n with: { type: \"json\" },\n }).then((e) => e.default.compilerOptions);\n\n const aliasmap: Array<Alias> = [];\n\n const pathEntries = Object.entries({ ...compilerOptions?.paths });\n\n for (const [aliasPattern, pathPatterns] of pathEntries) {\n const alias = aliasPattern.replace(\"/*\", \"\");\n\n const paths = pathPatterns\n .map((e) => e.replace(\"/*\", \"\"))\n .sort((a, b) => a.split(/\\/+/).length - b.split(/\\/+/).length);\n\n if (paths.length === 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: `${appRoot}/${paths[0]}/`,\n });\n } else if (paths.length > 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: \"\",\n async customResolver(_src) {\n // escaping symbols that may break glob pattern matching\n const src = _src.replace(/(\\$|\\^|\\+|\\(|\\)|\\[|\\])/g, \"\\\\$1\");\n\n // Build a list of possible file resolution patterns for a given source path.\n // Covers explicit extensions, implicit extensions, and folder-based index files.\n const patterns = paths.flatMap((path) => [\n // Case 1: Extension is explicitly provided\n // e.g. import styles from \"@admin/{solid}/styles.module.css\"\n `${path}/${src}*`,\n\n // Case 2: No extension provided\n // Match any extension and return the first match\n `${path}/${src}.*`,\n\n // Case 3: Folder containing an index file of any extension\n `${path}/${src}/index.*`,\n ]);\n\n const [file] = await glob(patterns, {\n cwd: appRoot,\n onlyFiles: true,\n absolute: true,\n dot: true,\n followSymbolicLinks: false,\n braceExpansion: false,\n globstar: false,\n ignore: opt?.ignore || [\n \"**/.git/**\",\n \"**/node_modules/**\",\n \"**/public/**\",\n \"**/var/**\",\n ],\n });\n\n return file;\n },\n });\n }\n }\n\n return {\n resolve: {\n alias: aliasmap,\n },\n };\n },\n };\n};\n", "import { basename, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport { Worker } from \"node:worker_threads\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nimport type {\n GeneratorConstructor,\n PluginOptions,\n PluginOptionsResolved,\n RouteResolverEntry,\n} from \"@kosmojs/devlib\";\n\nimport apiGenerator from \"@kosmojs/api-generator\";\nimport stubGenerator from \"@kosmojs/dev/stub-generator\";\nimport fetchGenerator from \"@kosmojs/fetch-generator\";\n\nimport apiHandlerFactory from \"./api-handler\";\nimport routesFactory from \"./routes\";\nimport { type SpinnerFactory, spinnerFactory, withSpinner } from \"./spinner\";\nimport type { WorkerData, WorkerError, WorkerSpinner } from \"./worker\";\n\nexport default (apiurl: string, pluginOptions?: PluginOptions): Plugin => {\n const outDirSuffix = \"client\";\n\n const store: {\n config: ResolvedConfig;\n resolvedOptions: PluginOptionsResolved;\n } = {} as typeof store;\n\n const createWorker = () => {\n // Destructuring to separate common options from function-based ones.\n // Functions (e.g. generators, formatters) can't be passed to worker threads.\n const {\n generators = [],\n formatters = [],\n ...restOptions\n } = store.resolvedOptions;\n\n const generatorModules: WorkerData[\"generatorModules\"] = generators.map(\n (e) => [e.moduleImport, e.moduleConfig],\n );\n\n const formatterModules: WorkerData[\"formatterModules\"] =\n pluginOptions?.formatters\n ? pluginOptions.formatters.map((e) => [e.moduleImport, e.moduleConfig])\n : [];\n\n const workerData: WorkerData = {\n ...restOptions,\n generatorModules,\n formatterModules,\n };\n\n return new Worker(resolve(import.meta.dirname, \"base-plugin/worker.js\"), {\n workerData,\n env: {\n ...process.env,\n FORCE_COLOR: \"1\",\n },\n });\n };\n\n const workerHandler = (\n onReady?: () => Promise<void>,\n onExit?: () => Promise<void>,\n ) => {\n const worker = createWorker();\n\n const spinnerMap = new Map<string, SpinnerFactory>();\n\n worker.on(\"error\", async (error) => {\n console.error(error);\n });\n\n worker.on(\"exit\", async () => {\n await onExit?.();\n // TODO: revive worker only if it exited due to an error.\n // Note: worker.terminate() triggers an exit with code 1,\n // so it's not always possible to distinguish normal termination from a crash.\n });\n\n worker.on(\n \"message\",\n async (msg: { spinner?: WorkerSpinner; error?: WorkerError }) => {\n if (msg?.spinner) {\n const { id, startText, method, text } = msg.spinner;\n withSpinner(\n startText,\n (spinner) => {\n spinnerMap.set(id, spinner);\n spinner[method](text || \"\");\n if (method === \"succeed\" || method === \"failed\") {\n spinnerMap.delete(id);\n }\n },\n spinnerMap.get(id),\n );\n } else if (msg?.error) {\n const { error } = msg;\n if (error.stack) {\n const [message, ...stack] = error.stack.split(\"\\n\");\n console.error(styleText(\"red\", message));\n console.error(stack.join(\"\\n\"));\n } else if (error?.message) {\n console.error(`${styleText(\"red\", error?.name)}: ${error.message}`);\n } else {\n console.error(error);\n }\n }\n },\n );\n\n const readyHandler = async (msg: string) => {\n if (msg === \"ready\") {\n worker.off(\"message\", readyHandler);\n await onReady?.();\n }\n };\n\n worker.on(\"message\", readyHandler);\n\n return async () => {\n await worker.terminate();\n };\n };\n\n return {\n name: \"@kosmojs:basePlugin\",\n\n config(config) {\n if (!config.build?.outDir) {\n throw new Error(\"Incomplete config, missing build.outDir\");\n }\n return {\n build: {\n outDir: join(config.build.outDir, outDirSuffix),\n manifest: true,\n },\n };\n },\n\n async configResolved(_config) {\n store.config = _config;\n\n const appRoot = resolve(store.config.root, \"..\");\n const sourceFolder = basename(store.config.root);\n\n // removing outDirSuffix\n const outDir = resolve(appRoot, resolve(store.config.build.outDir, \"..\"));\n\n const { stabilityThreshold = 1000 } =\n typeof store.config.server.watch?.awaitWriteFinish === \"object\"\n ? store.config.server.watch.awaitWriteFinish\n : {};\n\n const watcher: PluginOptionsResolved[\"watcher\"] = {\n delay: stabilityThreshold,\n ...(store.config.server.watch\n ? { options: store.config.server.watch }\n : {}),\n };\n\n {\n const {\n generators = [],\n formatters = [],\n refineTypeName = \"TRefine\",\n } = { ...pluginOptions };\n\n const _apiGenerator = generators.find((e) => e.kind === \"api\");\n const _fetchGenerator = generators.find((e) => e.kind === \"fetch\");\n const _ssrGenerator = generators.find((e) => e.kind === \"ssr\");\n\n store.resolvedOptions = {\n ...pluginOptions,\n command: store.config.command,\n watcher,\n generators: [\n // 1. stub generator should run first\n stubGenerator(),\n // 2. then api generator\n _apiGenerator || (apiGenerator() as GeneratorConstructor),\n // 3. then fetch generator\n _fetchGenerator || (fetchGenerator() as GeneratorConstructor),\n // 4. user generators in the order they were added\n ...generators.filter((e) => {\n return e.kind //\n ? ![\"api\", \"fetch\", \"ssr\"].includes(e.kind)\n : true;\n }),\n // 5. ssr generator should run last\n ...(_ssrGenerator ? [_ssrGenerator] : []),\n ],\n formatters: formatters.map((e) => e.formatter),\n refineTypeName,\n baseurl: store.config.base,\n apiurl,\n appRoot,\n sourceFolder,\n outDir,\n };\n }\n\n if (store.config.command === \"build\") {\n const { resolvers } = await routesFactory(store.resolvedOptions);\n const resolvedRoutes: RouteResolverEntry[] = [];\n\n {\n const spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedRoutes.push(await handler());\n }\n\n spinner.succeed();\n }\n\n {\n const spinner = spinnerFactory(\"Running Generators\");\n\n for (const { name, factory } of store.resolvedOptions.generators) {\n spinner.append(name);\n const { watchHandler } = await factory(store.resolvedOptions);\n await watchHandler(resolvedRoutes);\n }\n\n spinner.succeed();\n }\n }\n },\n\n async configureServer(server) {\n if (store.config.command !== \"serve\") {\n return;\n }\n\n const apiHandler = await apiHandlerFactory(store.resolvedOptions);\n\n const apiWatcher = await apiHandler.watcher();\n\n const stopWorker = workerHandler(\n async () => {\n await apiWatcher.start();\n },\n async () => {\n await apiWatcher.stop();\n },\n );\n\n // Attach the dev middleware from apiHandler. It may intercept requests to\n // determine whether they should be handled by Vite or by another handler.\n server.middlewares.use(apiHandler.devMiddleware);\n\n // clean up when Vite dev server closes/restarts\n server.httpServer?.on(\"close\", stopWorker);\n },\n };\n};\n", "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { type BuildOptions, context, type Plugin } from \"esbuild\";\n\nimport type { App } from \"@kosmojs/api\";\nimport { defaults, type PluginOptionsResolved } from \"@kosmojs/devlib\";\n\nexport default async (options: PluginOptionsResolved) => {\n const { appRoot, sourceFolder, baseurl, apiurl } = options;\n\n const apiDir = join(sourceFolder, defaults.apiDir);\n const outDir = join(options.outDir, defaults.apiDir);\n\n const esbuildOptions: BuildOptions = await import(\n resolve(appRoot, \"esbuild.json\"),\n { with: { type: \"json\" } }\n ).then((e) => e.default);\n\n let app: App;\n let devMiddlewareFactory: Function | undefined;\n let teardownHandler: Function | undefined;\n\n const watcher = async () => {\n const outfile = join(outDir, \"dev.js\");\n\n const rebuildPlugin: Plugin = {\n name: \"rebuild\",\n setup(build) {\n build.onEnd(async () => {\n if (app) {\n await teardownHandler?.(app);\n }\n try {\n const exports = await import([outfile, Date.now()].join(\"?\"));\n devMiddlewareFactory = exports.devMiddlewareFactory;\n teardownHandler = exports.teardownHandler;\n app = await exports.default();\n console.debug(`${styleText(\"green\", \"\u279C\")} Api handler ready`);\n } catch (error) {\n console.error(`${styleText(\"red\", \"\u2717\")} Api handler error`);\n console.error(error);\n }\n });\n },\n };\n\n const ctx = await context({\n ...esbuildOptions,\n logLevel: \"error\",\n bundle: true,\n entryPoints: [join(apiDir, \"app.ts\")],\n plugins: [rebuildPlugin],\n outfile,\n });\n\n return {\n async start() {\n await ctx.watch({\n // waits this many milliseconds before rebuilding after a change is detected\n delay: options.watcher.delay,\n });\n },\n async stop() {\n await ctx.dispose();\n },\n };\n };\n\n const devMiddleware = async (\n req: IncomingMessage,\n res: ServerResponse,\n viteHandler: () => void,\n ) => {\n const next = () => {\n return viteHandler();\n };\n if (devMiddlewareFactory) {\n const handler = devMiddlewareFactory(app);\n await handler(req, res, next);\n } else {\n !req?.url || !new RegExp(`^${join(baseurl, apiurl)}($|/)`).test(req.url)\n ? next() // do not await here\n : await app?.callback()(req, res);\n }\n };\n\n return {\n watcher,\n devMiddleware,\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n type ApiRoute,\n defaults,\n type PageRoute,\n type PluginOptionsResolved,\n pathResolver,\n pathTokensFactory,\n type RouteEntry,\n type RouteResolver,\n render,\n renderToFile,\n} from \"@kosmojs/devlib\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"./ast\";\nimport { cacheFactory } from \"./cache\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\nexport type Resolvers = Map<string, RouteResolver>;\n\nexport type ResolveRouteFile = (file: string) =>\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | undefined;\n\nexport type ResolversFactory = (\n routeFiles: Array<string>,\n) => Map<string, RouteResolver>;\n\nexport default async (\n pluginOptions: PluginOptionsResolved,\n): Promise<{\n resolvers: Resolvers;\n resolversFactory: ResolversFactory;\n resolveRouteFile: ResolveRouteFile;\n}> => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n formatters = [],\n refineTypeName,\n } = pluginOptions;\n\n let resolveTypes = false;\n\n for (const { options } of generators) {\n if (options?.resolveTypes) {\n resolveTypes = true;\n }\n }\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n const routeFilePatterns = [\n `${defaults.apiDir}/**/index.ts`,\n `${defaults.pagesDir}/**/index.{ts,tsx,vue,svelte}`,\n ];\n\n const resolveRouteFile: ResolveRouteFile = (file) => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return;\n }\n\n return picomatch.isMatch(join(folder, ...rest), routeFilePatterns)\n ? [folder, rest.join(\"/\")]\n : undefined;\n };\n\n const resolversFactory: ResolversFactory = (routeFiles) => {\n const resolvers = new Map<\n string, // fileFullpath\n RouteResolver\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((_file) => {\n const resolvedPaths = resolveRouteFile(_file);\n\n if (!resolvedPaths) {\n return [];\n }\n\n const [folder, file] = resolvedPaths;\n\n const fileFullpath = join(appRoot, sourceFolder, folder, file);\n\n const pathTokens = pathTokensFactory(dirname(file));\n\n const name = pathTokens.map((e) => e.orig).join(\"/\");\n\n const importPath = dirname(file);\n\n const importName = [\n importPath\n .split(/\\[/)[0]\n .replace(/^\\W+|\\W+$/g, \"\")\n .replace(/\\W+/g, \"_\"),\n crc(importPath),\n ].join(\"_\");\n\n return [\n {\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n },\n ];\n });\n\n for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {\n const {\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async (updatedFile) => {\n const paramsSchema = pathTokens.flatMap((e) => {\n return e.param ? [e.param] : [];\n });\n\n const optionalParams = paramsSchema.length\n ? !paramsSchema.some((e) => e.isRequired)\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { file, fileFullpath, importName, importPath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n payloadTypes,\n responseTypes,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { importName, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({ appRoot, sourceFolder }).resolve(\n \"apiLibDir\",\n importPath,\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n payloadTypes,\n responseTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n overrides: [...payloadTypes, ...responseTypes].reduce(\n (map: Record<string, string>, { id, skipValidation }) => {\n if (skipValidation) {\n map[id] = \"never\";\n }\n return map;\n },\n { [refineTypeName]: refineTypeName },\n ),\n withProperties: [params.id, ...payloadTypes.map((e) => e.id)],\n formatters,\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n // text was needed at writing types.ts file, dropping from cache\n payloadTypes: payloadTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n responseTypes: responseTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n referencedFiles,\n });\n }\n\n const route: ApiRoute = {\n name,\n pathTokens,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n importName,\n importPath,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n payloadTypes: cache.payloadTypes,\n responseTypes: cache.responseTypes,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"api\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {\n const {\n //\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async () => {\n const route: PageRoute = {\n name,\n pathTokens,\n params: {\n schema: pathTokens.flatMap((e) => (e.param ? [e.param] : [])),\n },\n folder,\n file,\n fileFullpath,\n importPath,\n importName,\n };\n\n return {\n kind: \"page\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n return resolvers;\n };\n\n const routeFiles = await glob(routeFilePatterns, {\n cwd: resolve(appRoot, sourceFolder),\n absolute: true,\n onlyFiles: true,\n ignore: [\n `${defaults.apiDir}/index.ts`,\n `${defaults.pagesDir}/index.ts{x,}`,\n ],\n });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n resolveRouteFile,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n type Node,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n} from \"ts-morph\";\n\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/api\";\nimport type {\n ApiRoute,\n PayloadType,\n PluginOptionsResolved,\n ResponseType,\n TypeDeclaration,\n} from \"@kosmojs/devlib\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"importName\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(defaultExport, route)\n : [];\n\n const payloadTypes = methods.flatMap((e) => {\n return e.payloadType ? [e.payloadType] : [];\n });\n\n const responseTypes = methods.flatMap((e) => {\n return e.responseType ? [e.responseType] : [];\n });\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n payloadTypes,\n responseTypes,\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n):\n | Array<{\n index: number;\n text: string;\n }>\n | undefined => {\n const [firstGeneric] = extractGenerics(callExpression);\n\n if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n const tupleElements = firstGeneric.node.getElements();\n\n if (!tupleElements?.length) {\n return;\n }\n\n return tupleElements.map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n callExpression: CallExpression,\n route: Pick<ApiRoute, \"importName\" | \"optionalParams\">,\n): Array<{\n method: HTTPMethod;\n payloadType: (PayloadType & { text: string }) | undefined;\n responseType: (ResponseType & { text: string }) | undefined;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods = [];\n\n const skipValidationFilter = (e: string) => /@skip-validation/.test(e);\n\n for (const [callExpression, method] of callExpressions) {\n const [payloadGeneric, responseGeneric] = extractGenerics(callExpression);\n\n const payloadText = payloadGeneric?.node\n ? payloadGeneric.node.getChildren().length === 0\n ? \"{}\"\n : payloadGeneric.node.getFullText()\n : undefined;\n\n const responseText = responseGeneric?.node.getText();\n\n const responseType = responseText\n ? {\n id: [\"ResponseT\", crc(route.importName + method)].join(\"\"),\n method,\n skipValidation: responseGeneric?.comments\n ? responseGeneric.comments.some(skipValidationFilter)\n : false,\n text: [\"never\", \"object\"].includes(responseText)\n ? \"{}\"\n : responseText,\n resolvedType: undefined,\n }\n : undefined;\n\n const payloadType = payloadText\n ? {\n id: [\"PayloadT\", crc(route.importName + method)].join(\"\"),\n responseTypeId: responseType?.id,\n method,\n skipValidation: payloadGeneric?.comments\n ? payloadGeneric.comments.some(skipValidationFilter)\n : false,\n isOptional: payloadText\n ? payloadText === \"{}\" || route.optionalParams\n : true,\n text: payloadText,\n resolvedType: undefined,\n }\n : undefined;\n\n methods.push({\n method,\n payloadType,\n responseType,\n });\n }\n\n return methods;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (\n callExpression: CallExpression,\n): Array<{ node: Node; comments: Array<string> }> => {\n return callExpression.getTypeArguments().map((node) => {\n return {\n node,\n comments: node\n .getLeadingCommentRanges()\n .map((range) => range.getText().trim()),\n };\n });\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { type ApiRoute, pathExists, pathResolver } from \"@kosmojs/devlib\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"typeDeclarations\"\n | \"numericParams\"\n | \"payloadTypes\"\n | \"responseTypes\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"file\" | \"fileFullpath\" | \"importName\" | \"importPath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).resolve(\"apiLibDir\", route.importPath, \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\n if (await pathExists(cacheFile)) {\n try {\n const cache = JSON.parse(await readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n };\n\n const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(cache, null, 2), \"utf8\");\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n", "import ora from \"ora\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = ora().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.fail();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { readFile } from \"node:fs/promises\";\n\nimport { parse as dotenv } from \"dotenv\";\nimport type { Plugin } from \"vite\";\n\nimport { pathExists } from \"@kosmojs/devlib\";\n\ntype Entry = {\n keys: Array<string>;\n file?: string;\n defineOn?: string;\n use?: (key: string, val: string | undefined) => void;\n};\n\nexport default (entries: Array<Entry>): Plugin => {\n return {\n name: \"@kosmojs:definePlugin\",\n\n async config() {\n const define: Record<string, unknown> = {};\n\n for (const { keys, file, defineOn = \"process.env\", use } of entries) {\n define[defineOn] = {};\n\n const fileExists = file //\n ? await pathExists(file)\n : false;\n\n const env = fileExists\n ? dotenv(await readFile(file as never, \"utf8\"))\n : process.env;\n\n for (const [key, val] of Object.entries(env)) {\n if (keys.includes(key)) {\n // only explicitly given keys available on client\n define[`${defineOn}.${key}`] = JSON.stringify(val);\n }\n use?.(key, val);\n }\n }\n\n return { define };\n },\n };\n};\n"],
|
|
5
|
-
"mappings": ";AAEA,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,gBAAiC;;;ACH1C,SAAS,YAAY;AAGrB,IAAO,uBAAQ,CACb,SACA,QAGW;AACX,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,MAAM,SAAS;AACb,YAAM,kBAEF,MAAM,OAAO,GAAG,OAAO,kBAAkB;AAAA,QAC3C,MAAM,EAAE,MAAM,OAAO;AAAA,MACvB,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,eAAe;AAExC,YAAM,WAAyB,CAAC;AAEhC,YAAM,cAAc,OAAO,QAAQ,EAAE,GAAG,iBAAiB,MAAM,CAAC;AAEhE,iBAAW,CAAC,cAAc,YAAY,KAAK,aAAa;AACtD,cAAM,QAAQ,aAAa,QAAQ,MAAM,EAAE;AAE3C,cAAM,QAAQ,aACX,IAAI,CAAC,MAAM,EAAE,QAAQ,MAAM,EAAE,CAAC,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,EAAE,MAAM;AAE/D,YAAI,MAAM,WAAW,GAAG;AACtB,mBAAS,KAAK;AAAA,YACZ,MAAM,IAAI,OAAO,IAAI,KAAK,GAAG;AAAA,YAC7B,aAAa,GAAG,OAAO,IAAI,MAAM,CAAC,CAAC;AAAA,UACrC,CAAC;AAAA,QACH,WAAW,MAAM,SAAS,GAAG;AAC3B,mBAAS,KAAK;AAAA,YACZ,MAAM,IAAI,OAAO,IAAI,KAAK,GAAG;AAAA,YAC7B,aAAa;AAAA,YACb,MAAM,eAAe,MAAM;AAEzB,oBAAM,MAAM,KAAK,QAAQ,2BAA2B,MAAM;AAI1D,oBAAM,WAAW,MAAM,QAAQ,CAAC,SAAS;AAAA;AAAA;AAAA,gBAGvC,GAAG,IAAI,IAAI,GAAG;AAAA;AAAA;AAAA,gBAId,GAAG,IAAI,IAAI,GAAG;AAAA;AAAA,gBAGd,GAAG,IAAI,IAAI,GAAG;AAAA,cAChB,CAAC;AAED,oBAAM,CAAC,IAAI,IAAI,MAAM,KAAK,UAAU;AAAA,gBAClC,KAAK;AAAA,gBACL,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,qBAAqB;AAAA,gBACrB,gBAAgB;AAAA,gBAChB,UAAU;AAAA,gBACV,QAAQ,KAAK,UAAU;AAAA,kBACrB;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBACF;AAAA,cACF,CAAC;AAED,qBAAO;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACvFA,SAAS,UAAU,QAAAC,OAAM,WAAAC,gBAAe;AACxC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,cAAc;AAWvB,OAAO,kBAAkB;AACzB,OAAO,mBAAmB;AAC1B,OAAO,oBAAoB;;;ACd3B,SAAS,MAAM,eAAe;AAC9B,SAAS,iBAAiB;AAE1B,SAA4B,eAA4B;AAGxD,SAAS,gBAA4C;AAErD,IAAO,sBAAQ,OAAO,YAAmC;AACvD,QAAM,EAAE,SAAS,cAAc,SAAS,OAAO,IAAI;AAEnD,QAAM,SAAS,KAAK,cAAc,SAAS,MAAM;AACjD,QAAM,SAAS,KAAK,QAAQ,QAAQ,SAAS,MAAM;AAEnD,QAAM,iBAA+B,MAAM,OACzC,QAAQ,SAAS,cAAc,GAC/B,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,GACzB,KAAK,CAAC,MAAM,EAAE,OAAO;AAEvB,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,QAAM,UAAU,YAAY;AAC1B,UAAM,UAAU,KAAK,QAAQ,QAAQ;AAErC,UAAM,gBAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM,OAAO;AACX,cAAM,MAAM,YAAY;AACtB,cAAI,KAAK;AACP,kBAAM,kBAAkB,GAAG;AAAA,UAC7B;AACA,cAAI;AACF,kBAAM,UAAU,MAAM,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,KAAK,GAAG;AAC3D,mCAAuB,QAAQ;AAC/B,8BAAkB,QAAQ;AAC1B,kBAAM,MAAM,QAAQ,QAAQ;AAC5B,oBAAQ,MAAM,GAAG,UAAU,SAAS,QAAG,CAAC,oBAAoB;AAAA,UAC9D,SAAS,OAAO;AACd,oBAAQ,MAAM,GAAG,UAAU,OAAO,QAAG,CAAC,oBAAoB;AAC1D,oBAAQ,MAAM,KAAK;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,QAAQ;AAAA,MACxB,GAAG;AAAA,MACH,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,aAAa,CAAC,KAAK,QAAQ,QAAQ,CAAC;AAAA,MACpC,SAAS,CAAC,aAAa;AAAA,MACvB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,MAAM,QAAQ;AACZ,cAAM,IAAI,MAAM;AAAA;AAAA,UAEd,OAAO,QAAQ,QAAQ;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,MACA,MAAM,OAAO;AACX,cAAM,IAAI,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,OACpB,KACA,KACA,gBACG;AACH,UAAM,OAAO,MAAM;AACjB,aAAO,YAAY;AAAA,IACrB;AACA,QAAI,sBAAsB;AACxB,YAAM,UAAU,qBAAqB,GAAG;AACxC,YAAM,QAAQ,KAAK,KAAK,IAAI;AAAA,IAC9B,OAAO;AACL,OAAC,KAAK,OAAO,CAAC,IAAI,OAAO,IAAI,KAAK,SAAS,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,IACnE,KAAK,IACL,MAAM,KAAK,SAAS,EAAE,KAAK,GAAG;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AC5FA,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AAEvC,OAAOC,UAAS;AAChB,OAAO,eAAe;AACtB,SAAS,QAAAC,aAAY;AAErB;AAAA,EAEE,YAAAC;AAAA,EAGA,gBAAAC;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,OACK;;;ACjBP,SAAS,WAAAC,gBAAe;AAExB,OAAO,SAAS;AAChB,SAAS,iBAAiB;AAC1B;AAAA,EAIE;AAAA,EAGA;AAAA,OACK;AAEP,SAA0B,mBAAmB;AAWtC,IAAM,gBAAgB,CAAC,SAA0B,IAAI,QAAQ,IAAI;AAEjE,IAAM,wBAAwB,OACnC,OACA,SAKG;AACH,QAAM;AAAA,IACJ,aAAa,cAAc,EAAE,oBAAoB,MAAM,YAAY;AAAA,EACrE,IAAI,EAAE,GAAG,KAAK;AAEd,QAAM,CAAC,kBAAkB,eAAe,IAAI;AAAA,IAC1C;AAAA,IACA;AAAA,EACF;AAEA,QAAM,gBAAgB,qBAAqB,UAAU;AAErD,QAAM,oBAAoB,gBACtB,yBAAyB,aAAa,IACtC;AAEJ,QAAM,UAAU,gBACZ,oBAAoB,eAAe,KAAK,IACxC,CAAC;AAEL,QAAM,eAAe,QAAQ,QAAQ,CAAC,MAAM;AAC1C,WAAO,EAAE,cAAc,CAAC,EAAE,WAAW,IAAI,CAAC;AAAA,EAC5C,CAAC;AAED,QAAM,gBAAgB,QAAQ,QAAQ,CAAC,MAAM;AAC3C,WAAO,EAAE,eAAe,CAAC,EAAE,YAAY,IAAI,CAAC;AAAA,EAC9C,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB,CAClC,eAC+B;AAC/B,QAAM,CAAC,aAAa,IAAI,WACrB,qBAAqB,EACrB,QAAQ,CAAC,qBAAqB;AAC7B,QAAI,iBAAiB,eAAe,GAAG;AACrC,aAAO,CAAC;AAAA,IACV;AACA,UAAM,iBAAiB,iBAAiB,cAAc;AACtD,WAAO,eAAe,OAAO,WAAW,cAAc,IAClD,CAAC,cAAc,IACf,CAAC;AAAA,EACP,CAAC;AACH,SAAO;AACT;AAEO,IAAM,2BAA2B,CACtC,mBAMe;AACf,QAAM,CAAC,YAAY,IAAI,gBAAgB,cAAc;AAErD,MAAI,CAAC,cAAc,KAAK,OAAO,WAAW,SAAS,GAAG;AACpD;AAAA,EACF;AAEA,QAAM,gBAAgB,aAAa,KAAK,YAAY;AAEpD,MAAI,CAAC,eAAe,QAAQ;AAC1B;AAAA,EACF;AAEA,SAAO,cAAc,IAAI,CAAC,MAAM,UAAU;AACxC,WAAO;AAAA,MACL;AAAA,MACA,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAEO,IAAM,sBAAsB,CACjC,gBACA,UAKI;AACJ,QAAM,kBACJ,eAAe,oBAAoB,WAAW,aAAa,KAC3D,eAAe,oBAAoB,WAAW,kBAAkB;AAElE,MAAI,CAAC,iBAAiB;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,yBAAyB,gBAAgB;AAAA,IAC7C,WAAW;AAAA,EACb;AAEA,MAAI,CAAC,wBAAwB;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,kBAAuD,CAAC;AAE9D,aAAW,KAAK,uBAAuB;AAAA,IACrC,WAAW;AAAA,EACb,GAAG;AACD,UAAM,OAAO,EAAE,cAAc,EAAE,QAAQ;AACvC,QAAI,YAAY,IAAI,GAAG;AACrB,sBAAgB,KAAK,CAAC,GAAG,IAAI,CAAC;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,UAAU,CAAC;AAEjB,QAAM,uBAAuB,CAAC,MAAc,mBAAmB,KAAK,CAAC;AAErE,aAAW,CAACC,iBAAgB,MAAM,KAAK,iBAAiB;AACtD,UAAM,CAAC,gBAAgB,eAAe,IAAI,gBAAgBA,eAAc;AAExE,UAAM,cAAc,gBAAgB,OAChC,eAAe,KAAK,YAAY,EAAE,WAAW,IAC3C,OACA,eAAe,KAAK,YAAY,IAClC;AAEJ,UAAM,eAAe,iBAAiB,KAAK,QAAQ;AAEnD,UAAM,eAAe,eACjB;AAAA,MACE,IAAI,CAAC,aAAa,IAAI,MAAM,aAAa,MAAM,CAAC,EAAE,KAAK,EAAE;AAAA,MACzD;AAAA,MACA,gBAAgB,iBAAiB,WAC7B,gBAAgB,SAAS,KAAK,oBAAoB,IAClD;AAAA,MACJ,MAAM,CAAC,SAAS,QAAQ,EAAE,SAAS,YAAY,IAC3C,OACA;AAAA,MACJ,cAAc;AAAA,IAChB,IACA;AAEJ,UAAM,cAAc,cAChB;AAAA,MACE,IAAI,CAAC,YAAY,IAAI,MAAM,aAAa,MAAM,CAAC,EAAE,KAAK,EAAE;AAAA,MACxD,gBAAgB,cAAc;AAAA,MAC9B;AAAA,MACA,gBAAgB,gBAAgB,WAC5B,eAAe,SAAS,KAAK,oBAAoB,IACjD;AAAA,MACJ,YAAY,cACR,gBAAgB,QAAQ,MAAM,iBAC9B;AAAA,MACJ,MAAM;AAAA,MACN,cAAc;AAAA,IAChB,IACA;AAEJ,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,IAAM,0BAA0B,CACrC,YACA,SAImD;AACnD,QAAM,eAAuC,CAAC;AAE9C,QAAM,kBAA6C,MAAM,sBACrD,CAAC,IACD;AAEJ,aAAW,eAAe,WAAW,sBAAsB,GAAG;AAC5D,UAAM,aAAa,YAAY,wBAAwB;AAEvD,UAAM,OAAO,YAAY,KAAK,UAAU,IACpC,MAAM,kBACJ,KAAK,gBAAgB,UAAU,IAC/B,aACF;AAEJ,UAAM,sBAAsB,YAAY,WAAW;AAEnD,UAAM,gBAAgB,sBAClB,YAAY,iBAAiB,IAC7B;AAEJ,QAAI,eAAe;AACjB,YAAM,OAAO,cAAc,QAAQ;AACnC,YAAM,OAAO,eAAe,IAAI,UAAU,IAAI;AAC9C,mBAAa,KAAK;AAAA,QAChB,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,iBAAiB;AACnB,wBAAgB,KAAK,GAAG,mBAAmB,aAAa,CAAC;AAAA,MAC3D;AAAA,IACF;AAEA,eAAW,eAAe,YAAY,gBAAgB,GAAG;AACvD,UAAI,YAAY,WAAW,KAAK,qBAAqB;AACnD,cAAM,WAAW,YAAY,YAAY;AACzC,cAAM,OAAO,SAAS,QAAQ;AAC9B,cAAM,QAAQ,YAAY,aAAa,GAAG,QAAQ;AAClD,cAAM,WAAW,QAAQ,GAAG,IAAI,OAAO,KAAK,KAAK;AAEjD,qBAAa,KAAK;AAAA,UAChB,mBAAmB;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,MAAM,iBAAiB,QAAQ,YAAY,IAAI;AAAA,QACjD,CAAC;AAED,YAAI,iBAAiB;AACnB,cAAI,SAAS,OAAO,WAAW,UAAU,GAAG;AAC1C,4BAAgB,KAAK,GAAG,mBAAmB,QAAQ,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,eAAe,WAAW,eAAe,GAAG;AACrD,UAAM,OAAO,YAAY,QAAQ;AACjC,UAAM,OAAO,YAAY,YAAY,EAAE,KAAK;AAC5C,iBAAa,KAAK;AAAA,MAChB,sBAAsB,EAAE,KAAK;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,eAAe,WAAW,cAAc,GAAG;AACpD,UAAM,OAAO,YAAY,QAAQ;AACjC,UAAM,OAAO,YAAY,YAAY,EAAE,KAAK;AAC5C,iBAAa,KAAK;AAAA,MAChB,sBAAsB,EAAE,KAAK;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,eAAe,WAAW,SAAS,GAAG;AAC/C,UAAM,OAAO,YAAY,QAAQ;AACjC,UAAM,OAAO,YAAY,YAAY,EAAE,KAAK;AAC5C,iBAAa,KAAK;AAAA,MAChB,iBAAiB,EAAE,KAAK;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,eAAe,WAAW,sBAAsB,GAAG;AAC5D,UAAM,sBAAsB,YAAY,WAAW;AAEnD,UAAM,aAAa,YAAY,wBAAwB;AAEvD,UAAM,OAAO,aACT,YAAY,KAAK,UAAU,IACzB,MAAM,kBACJ,KAAK,gBAAgB,UAAU,IAC/B,aACF,aACF;AAEJ,eAAW,eAAe,YAAY,gBAAgB,GAAG;AACvD,UAAI,YAAY,WAAW,KAAK,qBAAqB;AACnD,cAAM,WAAW,YAAY,YAAY;AACzC,cAAM,OAAO,SAAS,QAAQ;AAC9B,cAAM,QAAQ,YAAY,aAAa,GAAG,QAAQ;AAClD,cAAM,WAAW,QAAQ,GAAG,IAAI,OAAO,KAAK,KAAK;AAEjD,qBAAa,KAAK;AAAA,UAChB,mBAAmB;AAAA,YACjB;AAAA,YACA,OAAO,SAAS;AAAA,YAChB;AAAA,UACF;AAAA,UACA,MAAM,OACF,iBAAiB,QAAQ,YAAY,IAAI,OACzC,iBAAiB,QAAQ;AAAA,QAC/B,CAAC;AAED,YAAI,iBAAiB;AACnB,cAAI,SAAS,OAAO,WAAW,UAAU,GAAG;AAC1C,4BAAgB,KAAK,GAAG,mBAAmB,QAAQ,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,kBACH,CAAC,cAAc,CAAC,GAAG,IAAI,IAAY,eAAe,CAAC,CAAC,IACpD,CAAC,YAAY;AACnB;AAEA,IAAM,qBAAqB,CAAC,qBAAgD;AAE1E,QAAM,eACJ,kBACI,UAAU,GACV,iBAAiB,GACjB,gBAAgB,KAAK,CAAC;AAE5B,SAAO,aAAa,QAAQ,CAAC,MAAM;AACjC,UAAM,aAAa,EAAE,cAAc;AACnC,WAAO,aACH,CAAC,WAAW,YAAY,CAAC,IACzB,CAAC;AAAA,EACP,CAAC;AACH;AAEA,IAAM,kBAAkB,CACtB,mBACmD;AACnD,SAAO,eAAe,iBAAiB,EAAE,IAAI,CAAC,SAAS;AACrD,WAAO;AAAA,MACL;AAAA,MACA,UAAU,KACP,wBAAwB,EACxB,IAAI,CAAC,UAAU,MAAM,QAAQ,EAAE,KAAK,CAAC;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEO,IAAM,sBAAsB,CAAC,EAAE,QAAQ,MAA6B;AACzE,QAAM,UAAU,cAAc;AAAA,IAC5B,kBAAkBD,SAAQ,SAAS,eAAe;AAAA,IAClD,6BAA6B;AAAA,EAC/B,CAAC;AAED,QAAM,uBAAuB,CAC3B,cACA,YACG;AACH,UAAM,aAAa,QAAQ;AAAA,MACzB,GAAG,IAAI,YAAY,CAAC,IAAI,KAAK,IAAI,CAAC;AAAA,MAClC;AAAA,MACA,EAAE,WAAW,KAAK;AAAA,IACpB;AAEA,UAAM,gBAAgB,UAAU,SAAS,YAAY;AAAA,MACnD,GAAG;AAAA,MACH,eAAe;AAAA,IACjB,CAAC;AAED,YAAQ,iBAAiB,UAAU;AAEnC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,eAAe,CAAC,iBAAyB;AACvC,aACE,QAAQ,cAAc,YAAY,KAClC,QAAQ,oBAAoB,YAAY;AAAA,IAE5C;AAAA,IACA,mBAAmB,OAAO,iBAAyB;AACjD,YAAM,aAAa,QAAQ,cAAc,YAAY;AACrD,UAAI,YAAY;AACd,cAAM,WAAW,sBAAsB;AAAA,MACzC;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;ACjaA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,SAAS,WAAAE,gBAAe;AAEjC,OAAOC,UAAS;AAOhB,OAAO,UAAU,4BAA4B,KAAK,EAAE,MAAM,OAAO;AACjE,SAAwB,YAAY,oBAAoB;AAiBjD,IAAM,eAAe,CAC1B,OACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,MAKG;AACH,QAAM,YAAY,aAAa;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,CAAC,EAAE,QAAQ,aAAa,MAAM,YAAY,YAAY;AAEtD,QAAM,WAAW,OAAO,QAEU;AAChC,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,MAAM,SAAS,WAAW,MAAM,CAAC;AAC1D,eAAO,KAAK,WACR,cAAc,KAAK,IACnB;AAAA,MACN,SAAS,IAAI;AAAA,MAAC;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,OAAO;AAAA,IAC1B,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACL,MAEsB;AACpB,UAAM,OAAO,MAAM,iBAAiB,MAAM,cAAc;AAAA,MACtD,GAAG;AAAA,IACL,CAAC;AAED,UAAM,kBAA4C,CAAC;AAEnD,eAAW,QAAQ,kBAAkB;AACnC;AAAA;AAAA;AAAA,QAGE,KAAK,QAAQ,GAAG,OAAO,KAAK,EAAE;AAAA,MAChC,IAAI,MAAM,iBAAiB,IAAI;AAAA,IACjC;AAEA,UAAM,QAAQ,EAAE,GAAG,MAAM,MAAM,gBAAgB;AAE/C,UAAM,MAAM,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,UAAU,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,MAAM;AAEjE,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,OACpB,UAC+B;AAC/B,QAAI,CAAC,OAAO,MAAM;AAChB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,oBAAoB,CAAC,MAAM,iBAAiB;AAErD;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,iBAAiB,MAAM,cAAc;AAAA,MACtD,GAAG;AAAA,IACL,CAAC;AAED,QAAI,CAAC,iBAAiB,MAAM,MAAM,IAAI,GAAG;AAEvC;AAAA,IACF;AAEA,eAAW,CAAC,MAAMC,KAAI,KAAK,OAAO,QAAQ,MAAM,eAAe,GAAG;AAChE,UACE,CAAC,iBAAiBA,OAAM,MAAM,iBAAiBF,SAAQ,SAAS,IAAI,CAAC,CAAC,GACtE;AAEA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,OACvB,MACA,iBACoB;AACpB,MAAI;AACJ,MAAI;AACF,kBAAc,MAAM,SAAS,MAAM,MAAM;AAAA,EAC3C,SAAS,IAAI;AAEX,WAAO;AAAA,EACT;AACA,SAAO,cACHC;AAAA,IACE,KAAK,UAAU;AAAA,MACb,GAAG;AAAA,MACH,CAAC,KAAK,YAAY,GAAG;AAAA,IACvB,CAAC;AAAA,EACH,IACA;AACN;AAGA,IAAM,mBAAmB,CAAC,GAAW,MAAc;AACjD,SAAO,MAAM;AACf;;;ACvJA;;;ACAA;;;AJwCA,IAAO,iBAAQ,OACb,kBAKI;AACJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa,CAAC;AAAA,IACd,aAAa,CAAC;AAAA,IACd;AAAA,EACF,IAAI;AAEJ,MAAI,eAAe;AAEnB,aAAW,EAAE,QAAQ,KAAK,YAAY;AACpC,QAAI,SAAS,cAAc;AACzB,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM;AAAA;AAAA,IAEJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,oBAAoB,aAAa;AAErC,QAAM,oBAAoB;AAAA,IACxB,GAAGE,UAAS,MAAM;AAAA,IAClB,GAAGA,UAAS,QAAQ;AAAA,EACtB;AAEA,QAAM,mBAAqC,CAAC,SAAS;AACnD,UAAM,CAAC,eAAe,QAAQ,GAAG,IAAI,IAAIC,SAAQ,SAAS,IAAI,EAC3D,QAAQ,GAAG,OAAO,KAAK,EAAE,EACzB,MAAM,GAAG;AAQZ,QAAI,CAAC,UAAU,kBAAkB,gBAAgB,KAAK,SAAS,GAAG;AAChE;AAAA,IACF;AAEA,WAAO,UAAU,QAAQC,MAAK,QAAQ,GAAG,IAAI,GAAG,iBAAiB,IAC7D,CAAC,QAAQ,KAAK,KAAK,GAAG,CAAC,IACvB;AAAA,EACN;AAEA,QAAM,mBAAqC,CAACC,gBAAe;AACzD,UAAM,YAAY,oBAAI,IAGpB;AAEF,UAAM,UAA6BA,YAAW,QAAQ,CAAC,UAAU;AAC/D,YAAM,gBAAgB,iBAAiB,KAAK;AAE5C,UAAI,CAAC,eAAe;AAClB,eAAO,CAAC;AAAA,MACV;AAEA,YAAM,CAAC,QAAQ,IAAI,IAAI;AAEvB,YAAM,eAAeD,MAAK,SAAS,cAAc,QAAQ,IAAI;AAE7D,YAAM,aAAa,kBAAkBE,SAAQ,IAAI,CAAC;AAElD,YAAM,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG;AAEnD,YAAM,aAAaA,SAAQ,IAAI;AAE/B,YAAM,aAAa;AAAA,QACjB,WACG,MAAM,IAAI,EAAE,CAAC,EACb,QAAQ,cAAc,EAAE,EACxB,QAAQ,QAAQ,GAAG;AAAA,QACtBC,KAAI,UAAU;AAAA,MAChB,EAAE,KAAK,GAAG;AAEV,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,eAAW,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAWL,UAAS,MAAM,GAAG;AACvE,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AAEJ,YAAM,UAAoC,OAAO,gBAAgB;AAC/D,cAAM,eAAe,WAAW,QAAQ,CAAC,MAAM;AAC7C,iBAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QAChC,CAAC;AAED,cAAM,iBAAiB,aAAa,SAChC,CAAC,aAAa,KAAK,CAAC,MAAM,EAAE,UAAU,IACtC;AAEJ,cAAM,EAAE,UAAU,aAAa,IAAI;AAAA,UACjC,EAAE,MAAM,cAAc,YAAY,WAAW;AAAA,UAC7C;AAAA,YACE;AAAA,YACA;AAAA,YACA,cAAc,EAAE,aAAa;AAAA,UAC/B;AAAA,QACF;AAEA,YAAI,QAAQ,MAAM,SAAS,EAAE,UAAU,KAAK,CAAC;AAE7C,YAAI,CAAC,OAAO;AACV,cAAI,gBAAgB,cAAc;AAChC,kBAAM,kBAAkB,YAAY;AAAA,UACtC;AAEA,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,kBAAkB,CAAC;AAAA,UACrB,IAAI,MAAM;AAAA,YACR,EAAE,YAAY,cAAc,eAAe;AAAA,YAC3C;AAAA,cACE,qBAAqB;AAAA,cACrB,YAAY,cAAc,YAAY;AAAA,cACtC,gBAAgB,MAAM;AACpB,uBAAOE,MAAK,cAAcF,UAAS,QAAQI,SAAQ,IAAI,GAAG,IAAI;AAAA,cAChE;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,gBAAgB,oBAClB,kBAAkB,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AAC7C,gBAAI,SAAS,UAAU;AACrB,oBAAM,QAAQ,aAAa,GAAG,KAAK;AACnC,qBAAO,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC;AAAA,YACjC;AACA,mBAAO,CAAC;AAAA,UACV,CAAC,IACD,CAAC;AAEL,gBAAM,YAAYE,cAAa,EAAE,SAAS,aAAa,CAAC,EAAE;AAAA,YACxD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,SAA6B;AAAA,YACjC,IAAI,CAAC,WAAWD,KAAI,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,YAClC,QAAQ;AAAA,YACR,cAAc;AAAA,UAChB;AAEA,gBAAM,mBAAmB,OAAO,eAAc;AAAA,YAC5C;AAAA,YACA,cAAc,aAAa,IAAI,CAAC,OAAO,UAAU;AAC/C,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,YAAY,mBAAmB,GAAG,KAAK;AAAA,cACzC;AAAA,YACF,CAAC;AAAA,YACD;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAED,gBAAM,gBAAgB,eAClB,qBAAqB,kBAAkB;AAAA,YACrC,WAAW,CAAC,GAAG,cAAc,GAAG,aAAa,EAAE;AAAA,cAC7C,CAAC,KAA6B,EAAE,IAAI,eAAe,MAAM;AACvD,oBAAI,gBAAgB;AAClB,sBAAI,EAAE,IAAI;AAAA,gBACZ;AACA,uBAAO;AAAA,cACT;AAAA,cACA,EAAE,CAAC,cAAc,GAAG,eAAe;AAAA,YACrC;AAAA,YACA,gBAAgB,CAAC,OAAO,IAAI,GAAG,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,YAC5D;AAAA,UACF,CAAC,IACD;AAOJ,gBAAM;AAAA,YACJ;AAAA,YACA,gBAAgB,yBAAmB;AAAA,YACnC,EAAE,cAAc;AAAA,UAClB;AAEA,iBAAO,eAAe,eAAe;AAAA,YACnC,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,UAC3B;AAEA,kBAAQ,MAAM,aAAa;AAAA,YACzB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,YAEA,cAAc,aAAa,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,MAAM;AACpD,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,cAAc,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE;AAAA,cAC7D;AAAA,YACF,CAAC;AAAA,YACD,eAAe,cAAc,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,MAAM;AACtD,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,cAAc,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE;AAAA,cAC7D;AAAA,YACF,CAAC;AAAA,YACD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,QAAkB;AAAA,UACtB;AAAA,UACA;AAAA,UACA,QAAQ,MAAM;AAAA,UACd,eAAe,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,MAAM;AAAA,UACf,kBAAkB,MAAM;AAAA,UACxB,cAAc,MAAM;AAAA,UACpB,eAAe,MAAM;AAAA,UACrB,iBAAiB,OAAO,KAAK,MAAM,eAAe,EAAE;AAAA;AAAA;AAAA,YAGlD,CAAC,MAAMJ,SAAQ,SAAS,CAAC;AAAA,UAC3B;AAAA,QACF;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAEA,gBAAU,IAAI,cAAc,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC/C;AAEA,eAAW,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAWD,UAAS,QAAQ,GAAG;AACzE,YAAM;AAAA;AAAA,QAEJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AAEJ,YAAM,UAAoC,YAAY;AACpD,cAAM,QAAmB;AAAA,UACvB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,YACN,QAAQ,WAAW,QAAQ,CAAC,MAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,CAAE;AAAA,UAC9D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAEA,gBAAU,IAAI,cAAc,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAMO,MAAK,mBAAmB;AAAA,IAC/C,KAAKN,SAAQ,SAAS,YAAY;AAAA,IAClC,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,MACN,GAAGD,UAAS,MAAM;AAAA,MAClB,GAAGA,UAAS,QAAQ;AAAA,IACtB;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,WAAW,iBAAiB,UAAU;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AACF;;;AK7WA,OAAO,SAAS;AAST,IAAM,iBAAiB,CAAC,cAAsC;AACnE,QAAM,UAAU,IAAI,EAAE,MAAM,SAAS;AACrC,MAAI,QAAQ;AACZ,SAAO;AAAA,IACL,KAAK,MAAM;AACT,cAAQ;AACR,cAAQ,OAAO;AAAA,IACjB;AAAA,IACA,OAAO,MAAM;AACX,cAAQ,OAAO,GAAG,KAAK,WAAM,IAAI;AAAA,IACnC;AAAA,IACA,QAAQ,MAAM;AACZ,UAAI,MAAM;AACR,aAAK,OAAO,IAAI;AAAA,MAClB,OAAO;AACL,aAAK,KAAK,KAAK;AAAA,MACjB;AACA,cAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,OAAO,MAAM;AACX,UAAI,MAAM;AACR,aAAK,KAAK,CAAC,OAAO,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MACpC;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,cAAc,CACzB,MACA,MACA,YACG,KAAK,WAAW,eAAe,IAAI,CAAC;;;APnBzC,IAAO,sBAAQ,CAAC,QAAgB,kBAA0C;AACxE,QAAM,eAAe;AAErB,QAAM,QAGF,CAAC;AAEL,QAAM,eAAe,MAAM;AAGzB,UAAM;AAAA,MACJ,aAAa,CAAC;AAAA,MACd,aAAa,CAAC;AAAA,MACd,GAAG;AAAA,IACL,IAAI,MAAM;AAEV,UAAM,mBAAmD,WAAW;AAAA,MAClE,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,YAAY;AAAA,IACxC;AAEA,UAAM,mBACJ,eAAe,aACX,cAAc,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,IACpE,CAAC;AAEP,UAAM,aAAyB;AAAA,MAC7B,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAEA,WAAO,IAAI,OAAOQ,SAAQ,YAAY,SAAS,uBAAuB,GAAG;AAAA,MACvE;AAAA,MACA,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CACpB,SACA,WACG;AACH,UAAM,SAAS,aAAa;AAE5B,UAAM,aAAa,oBAAI,IAA4B;AAEnD,WAAO,GAAG,SAAS,OAAO,UAAU;AAClC,cAAQ,MAAM,KAAK;AAAA,IACrB,CAAC;AAED,WAAO,GAAG,QAAQ,YAAY;AAC5B,YAAM,SAAS;AAAA,IAIjB,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAA0D;AAC/D,YAAI,KAAK,SAAS;AAChB,gBAAM,EAAE,IAAI,WAAW,QAAQ,KAAK,IAAI,IAAI;AAC5C;AAAA,YACE;AAAA,YACA,CAAC,YAAY;AACX,yBAAW,IAAI,IAAI,OAAO;AAC1B,sBAAQ,MAAM,EAAE,QAAQ,EAAE;AAC1B,kBAAI,WAAW,aAAa,WAAW,UAAU;AAC/C,2BAAW,OAAO,EAAE;AAAA,cACtB;AAAA,YACF;AAAA,YACA,WAAW,IAAI,EAAE;AAAA,UACnB;AAAA,QACF,WAAW,KAAK,OAAO;AACrB,gBAAM,EAAE,MAAM,IAAI;AAClB,cAAI,MAAM,OAAO;AACf,kBAAM,CAAC,SAAS,GAAG,KAAK,IAAI,MAAM,MAAM,MAAM,IAAI;AAClD,oBAAQ,MAAMC,WAAU,OAAO,OAAO,CAAC;AACvC,oBAAQ,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,UAChC,WAAW,OAAO,SAAS;AACzB,oBAAQ,MAAM,GAAGA,WAAU,OAAO,OAAO,IAAI,CAAC,KAAK,MAAM,OAAO,EAAE;AAAA,UACpE,OAAO;AACL,oBAAQ,MAAM,KAAK;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,OAAO,QAAgB;AAC1C,UAAI,QAAQ,SAAS;AACnB,eAAO,IAAI,WAAW,YAAY;AAClC,cAAM,UAAU;AAAA,MAClB;AAAA,IACF;AAEA,WAAO,GAAG,WAAW,YAAY;AAEjC,WAAO,YAAY;AACjB,YAAM,OAAO,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,OAAO,QAAQ;AACb,UAAI,CAAC,OAAO,OAAO,QAAQ;AACzB,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AACA,aAAO;AAAA,QACL,OAAO;AAAA,UACL,QAAQC,MAAK,OAAO,MAAM,QAAQ,YAAY;AAAA,UAC9C,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,eAAe,SAAS;AAC5B,YAAM,SAAS;AAEf,YAAM,UAAUF,SAAQ,MAAM,OAAO,MAAM,IAAI;AAC/C,YAAM,eAAe,SAAS,MAAM,OAAO,IAAI;AAG/C,YAAM,SAASA,SAAQ,SAASA,SAAQ,MAAM,OAAO,MAAM,QAAQ,IAAI,CAAC;AAExE,YAAM,EAAE,qBAAqB,IAAK,IAChC,OAAO,MAAM,OAAO,OAAO,OAAO,qBAAqB,WACnD,MAAM,OAAO,OAAO,MAAM,mBAC1B,CAAC;AAEP,YAAM,UAA4C;AAAA,QAChD,OAAO;AAAA,QACP,GAAI,MAAM,OAAO,OAAO,QACpB,EAAE,SAAS,MAAM,OAAO,OAAO,MAAM,IACrC,CAAC;AAAA,MACP;AAEA;AACE,cAAM;AAAA,UACJ,aAAa,CAAC;AAAA,UACd,aAAa,CAAC;AAAA,UACd,iBAAiB;AAAA,QACnB,IAAI,EAAE,GAAG,cAAc;AAEvB,cAAM,gBAAgB,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK;AAC7D,cAAM,kBAAkB,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACjE,cAAM,gBAAgB,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK;AAE7D,cAAM,kBAAkB;AAAA,UACtB,GAAG;AAAA,UACH,SAAS,MAAM,OAAO;AAAA,UACtB;AAAA,UACA,YAAY;AAAA;AAAA,YAEV,cAAc;AAAA;AAAA,YAEd,iBAAkB,aAAa;AAAA;AAAA,YAE/B,mBAAoB,eAAe;AAAA;AAAA,YAEnC,GAAG,WAAW,OAAO,CAAC,MAAM;AAC1B,qBAAO,EAAE,OACL,CAAC,CAAC,OAAO,SAAS,KAAK,EAAE,SAAS,EAAE,IAAI,IACxC;AAAA,YACN,CAAC;AAAA;AAAA,YAED,GAAI,gBAAgB,CAAC,aAAa,IAAI,CAAC;AAAA,UACzC;AAAA,UACA,YAAY,WAAW,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,UAC7C;AAAA,UACA,SAAS,MAAM,OAAO;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,MAAM,OAAO,YAAY,SAAS;AACpC,cAAM,EAAE,UAAU,IAAI,MAAM,eAAc,MAAM,eAAe;AAC/D,cAAM,iBAAuC,CAAC;AAE9C;AACE,gBAAM,UAAU,eAAe,kBAAkB;AAEjD,qBAAW,EAAE,MAAM,QAAQ,KAAK,UAAU,OAAO,GAAG;AAClD,oBAAQ;AAAA,cACN,KAAK,eAAe,SAAS,CAAC,OAAO,UAAU,IAAI,MAAM,IAAI;AAAA,YAC/D;AACA,2BAAe,KAAK,MAAM,QAAQ,CAAC;AAAA,UACrC;AAEA,kBAAQ,QAAQ;AAAA,QAClB;AAEA;AACE,gBAAM,UAAU,eAAe,oBAAoB;AAEnD,qBAAW,EAAE,MAAM,QAAQ,KAAK,MAAM,gBAAgB,YAAY;AAChE,oBAAQ,OAAO,IAAI;AACnB,kBAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,MAAM,eAAe;AAC5D,kBAAM,aAAa,cAAc;AAAA,UACnC;AAEA,kBAAQ,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAgB,QAAQ;AAC5B,UAAI,MAAM,OAAO,YAAY,SAAS;AACpC;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,oBAAkB,MAAM,eAAe;AAEhE,YAAM,aAAa,MAAM,WAAW,QAAQ;AAE5C,YAAM,aAAa;AAAA,QACjB,YAAY;AACV,gBAAM,WAAW,MAAM;AAAA,QACzB;AAAA,QACA,YAAY;AACV,gBAAM,WAAW,KAAK;AAAA,QACxB;AAAA,MACF;AAIA,aAAO,YAAY,IAAI,WAAW,aAAa;AAG/C,aAAO,YAAY,GAAG,SAAS,UAAU;AAAA,IAC3C;AAAA,EACF;AACF;;;AQrQA,SAAS,YAAAG,iBAAgB;AAEzB,SAAS,SAAS,cAAc;AAGhC,SAAS,cAAAC,mBAAkB;AAS3B,IAAO,wBAAQ,CAAC,YAAkC;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,MAAM,SAAS;AACb,YAAM,SAAkC,CAAC;AAEzC,iBAAW,EAAE,MAAM,MAAM,WAAW,eAAe,IAAI,KAAK,SAAS;AACnE,eAAO,QAAQ,IAAI,CAAC;AAEpB,cAAM,aAAa,OACf,MAAMA,YAAW,IAAI,IACrB;AAEJ,cAAM,MAAM,aACR,OAAO,MAAMD,UAAS,MAAe,MAAM,CAAC,IAC5C,QAAQ;AAEZ,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,cAAI,KAAK,SAAS,GAAG,GAAG;AAEtB,mBAAO,GAAG,QAAQ,IAAI,GAAG,EAAE,IAAI,KAAK,UAAU,GAAG;AAAA,UACnD;AACA,gBAAM,KAAK,GAAG;AAAA,QAChB;AAAA,MACF;AAEA,aAAO,EAAE,OAAO;AAAA,IAClB;AAAA,EACF;AACF;",
|
|
6
|
-
"names": ["default", "join", "resolve", "styleText", "dirname", "join", "resolve", "crc", "glob", "defaults", "pathResolver", "resolve", "callExpression", "resolve", "crc", "hash", "defaults", "resolve", "join", "
|
|
4
|
+
"sourcesContent": ["export type { SSRManifestEntry, SSRSetup } from \"@kosmojs/devlib\";\n\nexport { default as apiGenerator } from \"@kosmojs/api-generator\";\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\n\nexport { default as aliasPlugin } from \"./alias-plugin\";\nexport { default } from \"./base-plugin\";\nexport { default as definePlugin } from \"./define-plugin\";\n", "import { glob } from \"tinyglobby\";\nimport type { Alias, Plugin } from \"vite\";\n\nexport default (\n appRoot: string,\n opt?: {\n ignore?: Array<string>;\n },\n): Plugin => {\n return {\n name: \"@kosmojs:aliasPlugin\",\n\n async config() {\n const compilerOptions: {\n paths: Record<string, Array<string>>;\n } = await import(`${appRoot}/tsconfig.json`, {\n with: { type: \"json\" },\n }).then((e) => e.default.compilerOptions);\n\n const aliasmap: Array<Alias> = [];\n\n const pathEntries = Object.entries({ ...compilerOptions?.paths });\n\n for (const [aliasPattern, pathPatterns] of pathEntries) {\n const alias = aliasPattern.replace(\"/*\", \"\");\n\n const paths = pathPatterns\n .map((e) => e.replace(\"/*\", \"\"))\n .sort((a, b) => a.split(/\\/+/).length - b.split(/\\/+/).length);\n\n if (paths.length === 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: `${appRoot}/${paths[0]}/`,\n });\n } else if (paths.length > 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: \"\",\n async customResolver(_src) {\n // escaping symbols that may break glob pattern matching\n const src = _src.replace(/(\\$|\\^|\\+|\\(|\\)|\\[|\\])/g, \"\\\\$1\");\n\n // Build a list of possible file resolution patterns for a given source path.\n // Covers explicit extensions, implicit extensions, and folder-based index files.\n const patterns = paths.flatMap((path) => [\n // Case 1: Extension is explicitly provided\n // e.g. import styles from \"@admin/{solid}/styles.module.css\"\n `${path}/${src}*`,\n\n // Case 2: No extension provided\n // Match any extension and return the first match\n `${path}/${src}.*`,\n\n // Case 3: Folder containing an index file of any extension\n `${path}/${src}/index.*`,\n ]);\n\n const [file] = await glob(patterns, {\n cwd: appRoot,\n onlyFiles: true,\n absolute: true,\n dot: true,\n followSymbolicLinks: false,\n braceExpansion: false,\n globstar: false,\n ignore: opt?.ignore || [\n \"**/.git/**\",\n \"**/node_modules/**\",\n \"**/public/**\",\n \"**/var/**\",\n ],\n });\n\n return file;\n },\n });\n }\n }\n\n return {\n resolve: {\n alias: aliasmap,\n },\n };\n },\n };\n};\n", "import { basename, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport { Worker } from \"node:worker_threads\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nimport type {\n GeneratorConstructor,\n PluginOptions,\n PluginOptionsResolved,\n RouteResolverEntry,\n} from \"@kosmojs/devlib\";\n\nimport apiGenerator from \"@kosmojs/api-generator\";\nimport stubGenerator from \"@kosmojs/dev/stub-generator\";\nimport fetchGenerator from \"@kosmojs/fetch-generator\";\n\nimport apiHandlerFactory from \"./api-handler\";\nimport routesFactory from \"./routes\";\nimport { type SpinnerFactory, spinnerFactory, withSpinner } from \"./spinner\";\nimport type { WorkerData, WorkerError, WorkerSpinner } from \"./worker\";\n\nexport default (apiurl: string, pluginOptions?: PluginOptions): Plugin => {\n const outDirSuffix = \"client\";\n\n const store: {\n config: ResolvedConfig;\n resolvedOptions: PluginOptionsResolved;\n } = {} as typeof store;\n\n const createWorker = () => {\n // Destructuring to separate common options from function-based ones.\n // Functions (e.g. generators, formatters) can't be passed to worker threads.\n const {\n generators = [],\n formatters = [],\n ...restOptions\n } = store.resolvedOptions;\n\n const generatorModules: WorkerData[\"generatorModules\"] = generators.map(\n (e) => [e.moduleImport, e.moduleConfig],\n );\n\n const formatterModules: WorkerData[\"formatterModules\"] =\n pluginOptions?.formatters\n ? pluginOptions.formatters.map((e) => [e.moduleImport, e.moduleConfig])\n : [];\n\n const workerData: WorkerData = {\n ...restOptions,\n generatorModules,\n formatterModules,\n };\n\n return new Worker(resolve(import.meta.dirname, \"base-plugin/worker.js\"), {\n workerData,\n env: {\n ...process.env,\n FORCE_COLOR: \"1\",\n },\n });\n };\n\n const workerHandler = (\n onReady?: () => Promise<void>,\n onExit?: () => Promise<void>,\n ) => {\n const worker = createWorker();\n\n const spinnerMap = new Map<string, SpinnerFactory>();\n\n worker.on(\"error\", async (error) => {\n console.error(error);\n });\n\n worker.on(\"exit\", async () => {\n await onExit?.();\n // TODO: revive worker only if it exited due to an error.\n // Note: worker.terminate() triggers an exit with code 1,\n // so it's not always possible to distinguish normal termination from a crash.\n });\n\n worker.on(\n \"message\",\n async (msg: { spinner?: WorkerSpinner; error?: WorkerError }) => {\n if (msg?.spinner) {\n const { id, startText, method, text } = msg.spinner;\n withSpinner(\n startText,\n (spinner) => {\n spinnerMap.set(id, spinner);\n spinner[method](text || \"\");\n if (method === \"succeed\" || method === \"failed\") {\n spinnerMap.delete(id);\n }\n },\n spinnerMap.get(id),\n );\n } else if (msg?.error) {\n const { error } = msg;\n if (error.stack) {\n const [message, ...stack] = error.stack.split(\"\\n\");\n console.error(styleText(\"red\", message));\n console.error(stack.join(\"\\n\"));\n } else if (error?.message) {\n console.error(`${styleText(\"red\", error?.name)}: ${error.message}`);\n } else {\n console.error(error);\n }\n }\n },\n );\n\n const readyHandler = async (msg: string) => {\n if (msg === \"ready\") {\n worker.off(\"message\", readyHandler);\n await onReady?.();\n }\n };\n\n worker.on(\"message\", readyHandler);\n\n return async () => {\n await worker.terminate();\n };\n };\n\n return {\n name: \"@kosmojs:basePlugin\",\n\n config(config) {\n if (!config.build?.outDir) {\n throw new Error(\"Incomplete config, missing build.outDir\");\n }\n return {\n build: {\n outDir: join(config.build.outDir, outDirSuffix),\n manifest: true,\n },\n };\n },\n\n async configResolved(_config) {\n store.config = _config;\n\n const appRoot = resolve(store.config.root, \"..\");\n const sourceFolder = basename(store.config.root);\n\n // removing outDirSuffix\n const outDir = resolve(appRoot, resolve(store.config.build.outDir, \"..\"));\n\n const { stabilityThreshold = 1000 } =\n typeof store.config.server.watch?.awaitWriteFinish === \"object\"\n ? store.config.server.watch.awaitWriteFinish\n : {};\n\n const watcher: PluginOptionsResolved[\"watcher\"] = {\n delay: stabilityThreshold,\n ...(store.config.server.watch\n ? { options: store.config.server.watch }\n : {}),\n };\n\n {\n const {\n generators = [],\n formatters = [],\n refineTypeName = \"TRefine\",\n } = { ...pluginOptions };\n\n const _apiGenerator = generators.find((e) => e.kind === \"api\");\n const _fetchGenerator = generators.find((e) => e.kind === \"fetch\");\n const _ssrGenerator = generators.find((e) => e.kind === \"ssr\");\n\n store.resolvedOptions = {\n ...pluginOptions,\n command: store.config.command,\n watcher,\n generators: [\n // 1. stub generator should run first\n stubGenerator(),\n // 2. then api generator\n _apiGenerator || (apiGenerator() as GeneratorConstructor),\n // 3. then fetch generator\n _fetchGenerator || (fetchGenerator() as GeneratorConstructor),\n // 4. user generators in the order they were added\n ...generators.filter((e) => {\n return e.kind //\n ? ![\"api\", \"fetch\", \"ssr\"].includes(e.kind)\n : true;\n }),\n // 5. ssr generator should run last\n ...(_ssrGenerator ? [_ssrGenerator] : []),\n ],\n formatters: formatters.map((e) => e.formatter),\n refineTypeName,\n baseurl: store.config.base,\n apiurl,\n appRoot,\n sourceFolder,\n outDir,\n };\n }\n\n if (store.config.command === \"build\") {\n const { resolvers } = await routesFactory(store.resolvedOptions);\n const resolvedRoutes: RouteResolverEntry[] = [];\n\n {\n const spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedRoutes.push(await handler());\n }\n\n spinner.succeed();\n }\n\n {\n const spinner = spinnerFactory(\"Running Generators\");\n\n for (const { name, factory } of store.resolvedOptions.generators) {\n spinner.append(name);\n const { watchHandler } = await factory(store.resolvedOptions);\n await watchHandler(resolvedRoutes);\n }\n\n spinner.succeed();\n }\n }\n },\n\n async configureServer(server) {\n if (store.config.command !== \"serve\") {\n return;\n }\n\n const apiHandler = await apiHandlerFactory(store.resolvedOptions);\n\n const apiWatcher = await apiHandler.watcher();\n\n const stopWorker = workerHandler(\n async () => {\n await apiWatcher.start();\n },\n async () => {\n await apiWatcher.stop();\n },\n );\n\n // Attach the dev middleware from apiHandler. It may intercept requests to\n // determine whether they should be handled by Vite or by another handler.\n server.middlewares.use(apiHandler.devMiddleware);\n\n // clean up when Vite dev server closes/restarts\n server.httpServer?.on(\"close\", stopWorker);\n },\n };\n};\n", "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { type BuildOptions, context, type Plugin } from \"esbuild\";\n\nimport type { App } from \"@kosmojs/api\";\nimport { defaults, type PluginOptionsResolved } from \"@kosmojs/devlib\";\n\nexport default async (options: PluginOptionsResolved) => {\n const { appRoot, sourceFolder, baseurl, apiurl } = options;\n\n const apiDir = join(sourceFolder, defaults.apiDir);\n const outDir = join(options.outDir, defaults.apiDir);\n\n const esbuildOptions: BuildOptions = await import(\n resolve(appRoot, \"esbuild.json\"),\n { with: { type: \"json\" } }\n ).then((e) => e.default);\n\n let app: App;\n let devMiddlewareFactory: Function | undefined;\n let teardownHandler: Function | undefined;\n\n const watcher = async () => {\n const outfile = join(outDir, \"dev.js\");\n\n const rebuildPlugin: Plugin = {\n name: \"rebuild\",\n setup(build) {\n build.onEnd(async () => {\n if (app) {\n await teardownHandler?.(app);\n }\n try {\n const exports = await import([outfile, Date.now()].join(\"?\"));\n devMiddlewareFactory = exports.devMiddlewareFactory;\n teardownHandler = exports.teardownHandler;\n app = await exports.default();\n console.debug(`${styleText(\"green\", \"\u279C\")} Api handler ready`);\n } catch (error) {\n console.error(`${styleText(\"red\", \"\u2717\")} Api handler error`);\n console.error(error);\n }\n });\n },\n };\n\n const ctx = await context({\n ...esbuildOptions,\n logLevel: \"error\",\n bundle: true,\n entryPoints: [join(apiDir, \"app.ts\")],\n plugins: [rebuildPlugin],\n outfile,\n });\n\n return {\n async start() {\n await ctx.watch({\n // waits this many milliseconds before rebuilding after a change is detected\n delay: options.watcher.delay,\n });\n },\n async stop() {\n await ctx.dispose();\n },\n };\n };\n\n const devMiddleware = async (\n req: IncomingMessage,\n res: ServerResponse,\n viteHandler: () => void,\n ) => {\n const next = () => {\n return viteHandler();\n };\n if (devMiddlewareFactory) {\n const handler = devMiddlewareFactory(app);\n await handler(req, res, next);\n } else {\n !req?.url || !new RegExp(`^${join(baseurl, apiurl)}($|/)`).test(req.url)\n ? next() // do not await here\n : await app?.callback()(req, res);\n }\n };\n\n return {\n watcher,\n devMiddleware,\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n type ApiRoute,\n defaults,\n type PageRoute,\n type PluginOptionsResolved,\n pathResolver,\n pathTokensFactory,\n type RouteEntry,\n type RouteResolver,\n render,\n renderToFile,\n} from \"@kosmojs/devlib\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"./ast\";\nimport { cacheFactory } from \"./cache\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\ntype Resolvers = Map<string, RouteResolver>;\n\ntype ResolveRouteFile = (\n file: string,\n opts: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">,\n) =>\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | undefined;\n\ntype ResolveRouteEntry = (\n file: string,\n opts: Pick<PluginOptionsResolved, \"appRoot\" | \"sourceFolder\">,\n) => RouteEntry | undefined;\n\ntype ResolversFactory = (\n routeFiles: Array<string>,\n) => Map<string, RouteResolver>;\n\n// Only `index.ts` files matter for API endpoints\nconst API_INDEX_PATTERN = \"index.ts\";\n\n// Match component endpoints for Solid/React (.tsx) and Vue (.vue).\nconst PAGE_INDEX_PATTERN = \"index.{tsx,vue}\";\n\nconst ROUTE_FILE_PATTERNS = [\n `${defaults.apiDir}/**/${API_INDEX_PATTERN}`,\n `${defaults.pagesDir}/**/${PAGE_INDEX_PATTERN}`,\n];\n\nexport const resolveRouteFile: ResolveRouteFile = (\n file,\n { appRoot, sourceFolder },\n) => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return;\n }\n\n return picomatch.isMatch(join(folder, ...rest), ROUTE_FILE_PATTERNS)\n ? [folder, rest.join(\"/\")]\n : undefined;\n};\n\nexport const resolveRouteEntry: ResolveRouteEntry = (\n _file,\n { appRoot, sourceFolder },\n) => {\n const resolvedPaths = resolveRouteFile(_file, { appRoot, sourceFolder });\n\n if (!resolvedPaths) {\n return;\n }\n\n const [folder, file] = resolvedPaths;\n\n const fileFullpath = join(appRoot, sourceFolder, folder, file);\n\n const pathTokens = pathTokensFactory(dirname(file));\n\n const name = pathTokens.map((e) => e.orig).join(\"/\");\n\n const importPath = dirname(file);\n\n const importName = [\n importPath\n .split(/\\[/)[0]\n .replace(/^\\W+|\\W+$/g, \"\")\n .replace(/\\W+/g, \"_\"),\n crc(importPath),\n ].join(\"_\");\n\n return {\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n };\n};\n\nexport default async (\n pluginOptions: PluginOptionsResolved,\n): Promise<{\n resolvers: Resolvers;\n resolversFactory: ResolversFactory;\n}> => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n formatters = [],\n refineTypeName,\n } = pluginOptions;\n\n let resolveTypes = false;\n\n for (const { options } of generators) {\n if (options?.resolveTypes) {\n resolveTypes = true;\n }\n }\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n const resolversFactory: ResolversFactory = (routeFiles) => {\n const resolvers = new Map<\n string, // fileFullpath\n RouteResolver\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((file) => {\n const entry = resolveRouteEntry(file, pluginOptions);\n return entry ? [entry] : [];\n });\n\n // handle api routes\n for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {\n const {\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async (updatedFile) => {\n const paramsSchema = pathTokens.flatMap((e) => {\n return e.param ? [e.param] : [];\n });\n\n const optionalParams = paramsSchema.length\n ? !paramsSchema.some((e) => e.isRequired)\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { file, fileFullpath, importName, importPath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n payloadTypes,\n responseTypes,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { importName, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({ appRoot, sourceFolder }).resolve(\n \"apiLibDir\",\n importPath,\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n payloadTypes,\n responseTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n overrides: [...payloadTypes, ...responseTypes].reduce(\n (map: Record<string, string>, { id, skipValidation }) => {\n if (skipValidation) {\n map[id] = \"never\";\n }\n return map;\n },\n { [refineTypeName]: refineTypeName },\n ),\n withProperties: [params.id, ...payloadTypes.map((e) => e.id)],\n formatters,\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n // text was needed at writing types.ts file, dropping from cache\n payloadTypes: payloadTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n responseTypes: responseTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n referencedFiles,\n });\n }\n\n const route: ApiRoute = {\n name,\n pathTokens,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n importName,\n importPath,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n payloadTypes: cache.payloadTypes,\n responseTypes: cache.responseTypes,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"api\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n // handle page routes\n for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {\n const {\n //\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async () => {\n const route: PageRoute = {\n name,\n pathTokens,\n params: {\n schema: pathTokens.flatMap((e) => (e.param ? [e.param] : [])),\n },\n folder,\n file,\n fileFullpath,\n importPath,\n importName,\n };\n\n return {\n kind: \"page\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n return resolvers;\n };\n\n const routeFiles = await glob(ROUTE_FILE_PATTERNS, {\n cwd: resolve(appRoot, sourceFolder),\n absolute: true,\n onlyFiles: true,\n ignore: [\n `${defaults.apiDir}/${API_INDEX_PATTERN}`,\n `${defaults.pagesDir}/${PAGE_INDEX_PATTERN}`,\n ],\n });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n type Node,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n} from \"ts-morph\";\n\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/api\";\nimport type {\n ApiRoute,\n PayloadType,\n PluginOptionsResolved,\n ResponseType,\n TypeDeclaration,\n} from \"@kosmojs/devlib\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"importName\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(defaultExport, route)\n : [];\n\n const payloadTypes = methods.flatMap((e) => {\n return e.payloadType ? [e.payloadType] : [];\n });\n\n const responseTypes = methods.flatMap((e) => {\n return e.responseType ? [e.responseType] : [];\n });\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n payloadTypes,\n responseTypes,\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n):\n | Array<{\n index: number;\n text: string;\n }>\n | undefined => {\n const [firstGeneric] = extractGenerics(callExpression);\n\n if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n const tupleElements = firstGeneric.node.getElements();\n\n if (!tupleElements?.length) {\n return;\n }\n\n return tupleElements.map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n callExpression: CallExpression,\n route: Pick<ApiRoute, \"importName\" | \"optionalParams\">,\n): Array<{\n method: HTTPMethod;\n payloadType: (PayloadType & { text: string }) | undefined;\n responseType: (ResponseType & { text: string }) | undefined;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods = [];\n\n const skipValidationFilter = (e: string) => /@skip-validation/.test(e);\n\n for (const [callExpression, method] of callExpressions) {\n const [payloadGeneric, responseGeneric] = extractGenerics(callExpression);\n\n const payloadText = payloadGeneric?.node\n ? payloadGeneric.node.getChildren().length === 0\n ? \"{}\"\n : payloadGeneric.node.getFullText()\n : undefined;\n\n const responseText = responseGeneric?.node.getText();\n\n const responseType = responseText\n ? {\n id: [\"ResponseT\", crc(route.importName + method)].join(\"\"),\n method,\n skipValidation: responseGeneric?.comments\n ? responseGeneric.comments.some(skipValidationFilter)\n : false,\n text: [\"never\", \"object\"].includes(responseText)\n ? \"{}\"\n : responseText,\n resolvedType: undefined,\n }\n : undefined;\n\n const payloadType = payloadText\n ? {\n id: [\"PayloadT\", crc(route.importName + method)].join(\"\"),\n responseTypeId: responseType?.id,\n method,\n skipValidation: payloadGeneric?.comments\n ? payloadGeneric.comments.some(skipValidationFilter)\n : false,\n isOptional: payloadText\n ? payloadText === \"{}\" || route.optionalParams\n : true,\n text: payloadText,\n resolvedType: undefined,\n }\n : undefined;\n\n methods.push({\n method,\n payloadType,\n responseType,\n });\n }\n\n return methods;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (\n callExpression: CallExpression,\n): Array<{ node: Node; comments: Array<string> }> => {\n return callExpression.getTypeArguments().map((node) => {\n return {\n node,\n comments: node\n .getLeadingCommentRanges()\n .map((range) => range.getText().trim()),\n };\n });\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { type ApiRoute, pathExists, pathResolver } from \"@kosmojs/devlib\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"typeDeclarations\"\n | \"numericParams\"\n | \"payloadTypes\"\n | \"responseTypes\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"file\" | \"fileFullpath\" | \"importName\" | \"importPath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).resolve(\"apiLibDir\", route.importPath, \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\n if (await pathExists(cacheFile)) {\n try {\n const cache = JSON.parse(await readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n };\n\n const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(cache, null, 2), \"utf8\");\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n", "import ora from \"ora\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = ora().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.fail();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { readFile } from \"node:fs/promises\";\n\nimport { parse as dotenv } from \"dotenv\";\nimport type { Plugin } from \"vite\";\n\nimport { pathExists } from \"@kosmojs/devlib\";\n\ntype Entry = {\n keys: Array<string>;\n file?: string;\n defineOn?: string;\n use?: (key: string, val: string | undefined) => void;\n};\n\nexport default (entries: Array<Entry>): Plugin => {\n return {\n name: \"@kosmojs:definePlugin\",\n\n async config() {\n const define: Record<string, unknown> = {};\n\n for (const { keys, file, defineOn = \"process.env\", use } of entries) {\n define[defineOn] = {};\n\n const fileExists = file //\n ? await pathExists(file)\n : false;\n\n const env = fileExists\n ? dotenv(await readFile(file as never, \"utf8\"))\n : process.env;\n\n for (const [key, val] of Object.entries(env)) {\n if (keys.includes(key)) {\n // only explicitly given keys available on client\n define[`${defineOn}.${key}`] = JSON.stringify(val);\n }\n use?.(key, val);\n }\n }\n\n return { define };\n },\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["default", "join", "resolve", "styleText", "dirname", "join", "resolve", "crc", "glob", "defaults", "pathResolver", "resolve", "callExpression", "resolve", "crc", "hash", "defaults", "resolve", "join", "dirname", "crc", "routeFiles", "pathResolver", "glob", "resolve", "styleText", "join", "readFile", "pathExists"]
|
|
7
7
|
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { type PluginOptionsResolved, type RouteResolver } from "@kosmojs/devlib";
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { type PluginOptionsResolved, type RouteEntry, type RouteResolver } from "@kosmojs/devlib";
|
|
2
|
+
type Resolvers = Map<string, RouteResolver>;
|
|
3
|
+
type ResolveRouteFile = (file: string, opts: Pick<PluginOptionsResolved, "appRoot" | "sourceFolder">) => [
|
|
4
4
|
folder: string,
|
|
5
5
|
file: string
|
|
6
6
|
] | undefined;
|
|
7
|
-
|
|
7
|
+
type ResolveRouteEntry = (file: string, opts: Pick<PluginOptionsResolved, "appRoot" | "sourceFolder">) => RouteEntry | undefined;
|
|
8
|
+
type ResolversFactory = (routeFiles: Array<string>) => Map<string, RouteResolver>;
|
|
9
|
+
export declare const resolveRouteFile: ResolveRouteFile;
|
|
10
|
+
export declare const resolveRouteEntry: ResolveRouteEntry;
|
|
8
11
|
declare const _default: (pluginOptions: PluginOptionsResolved) => Promise<{
|
|
9
12
|
resolvers: Resolvers;
|
|
10
13
|
resolversFactory: ResolversFactory;
|
|
11
|
-
resolveRouteFile: ResolveRouteFile;
|
|
12
14
|
}>;
|
|
13
15
|
export default _default;
|