@kosmojs/dev 0.0.9 → 0.0.10

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.
@@ -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 = [\"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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",
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 ...assets?.dependencies,\n },\n devDependencies: {\n \"@kosmojs/config\": SEMVER,\n \"@kosmojs/dev\": SEMVER,\n \"@types/node\": self.devDependencies[\"@types/node\"],\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 { routeStackBuilder } from \"{{importPathmap.lib}}\";\n\nimport createRouter from \"{{importPathmap.core}}/router\";\n\nconst router = createRouter();\n\nfor (const { name, path, methods, middleware } of routeStackBuilder()) {\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
  }
@@ -1,10 +1,10 @@
1
- import { routerRoutes } from "{{importPathmap.lib}}";
1
+ import { routeStackBuilder } from "{{importPathmap.lib}}";
2
2
 
3
3
  import createRouter from "{{importPathmap.core}}/router";
4
4
 
5
5
  const router = createRouter();
6
6
 
7
- for (const { name, path, methods, middleware } of routerRoutes) {
7
+ for (const { name, path, methods, middleware } of routeStackBuilder()) {
8
8
  router.register(path, methods, middleware, { name });
9
9
  }
10
10
 
package/pkg/index.js CHANGED
@@ -88,7 +88,6 @@ var api_handler_default = async (options) => {
88
88
  let devMiddlewareFactory;
89
89
  let teardownHandler;
90
90
  const watcher = async () => {
91
- const outfile = join(outDir, "dev.js");
92
91
  const rebuildPlugin = {
93
92
  name: "rebuild",
94
93
  setup(build) {
@@ -97,7 +96,7 @@ var api_handler_default = async (options) => {
97
96
  await teardownHandler?.(app);
98
97
  }
99
98
  try {
100
- const exports = await import([outfile, Date.now()].join("?"));
99
+ const exports = await import(`${outDir}/app.js?${Date.now()}`);
101
100
  devMiddlewareFactory = exports.devMiddlewareFactory;
102
101
  teardownHandler = exports.teardownHandler;
103
102
  app = await exports.default();
@@ -115,7 +114,7 @@ var api_handler_default = async (options) => {
115
114
  bundle: true,
116
115
  entryPoints: [join(apiDir, "app.ts")],
117
116
  plugins: [rebuildPlugin],
118
- outfile
117
+ outdir: outDir
119
118
  });
120
119
  return {
121
120
  async start() {
@@ -517,6 +516,8 @@ var types_default = '{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport typ
517
516
  // src/base-plugin/routes/resolve.ts
518
517
  var API_INDEX_BASENAME = "index";
519
518
  var API_INDEX_PATTERN = `${API_INDEX_BASENAME}.ts`;
519
+ var API_USE_BASENAME = "use";
520
+ var API_USE_PATTERN = `${API_USE_BASENAME}.ts`;
520
521
  var PAGE_INDEX_BASENAME = "index";
521
522
  var PAGE_INDEX_PATTERN = `${PAGE_INDEX_BASENAME}.{tsx,vue}`;
522
523
  var PAGE_LAYOUT_BASENAME = "layout";
@@ -524,6 +525,8 @@ var PAGE_LAYOUT_PATTERN = `${PAGE_LAYOUT_BASENAME}.{tsx,vue}`;
524
525
  var ROUTE_FILE_PATTERNS = [
525
526
  // match index files in api dir
526
527
  `${defaults2.apiDir}/**/${API_INDEX_PATTERN}`,
528
+ // match use files in api dir
529
+ `${defaults2.apiDir}/**/${API_USE_PATTERN}`,
527
530
  // match index files in pages dir
528
531
  `${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`,
529
532
  // match layout files in pages dir
@@ -541,6 +544,7 @@ var scanRoutes = async ({
541
544
  ignore: [
542
545
  // ignore top-level matches, routes resides in folders, even index route
543
546
  `${defaults2.apiDir}/${API_INDEX_PATTERN}`,
547
+ `${defaults2.apiDir}/${API_USE_PATTERN}`,
544
548
  `${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`,
545
549
  `${defaults2.pagesDir}/${PAGE_LAYOUT_PATTERN}`
546
550
  ]
@@ -556,8 +560,17 @@ var isRouteFile = (file, {
556
560
  }
557
561
  return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
558
562
  };
559
- var isPageFile = (file) => {
560
- return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`) ? { kind: "index" } : picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`) ? { kind: "layout" } : void 0;
563
+ var isApiRoute = (file) => {
564
+ return picomatch.matchBase(file, `**/${API_INDEX_PATTERN}`);
565
+ };
566
+ var isApiUse = (file) => {
567
+ return picomatch.matchBase(file, `**/${API_USE_PATTERN}`);
568
+ };
569
+ var isPageRoute = (file) => {
570
+ return picomatch.matchBase(file, `**/${PAGE_INDEX_PATTERN}`);
571
+ };
572
+ var isPageLayout = (file) => {
573
+ return picomatch.matchBase(file, `**/${PAGE_LAYOUT_PATTERN}`);
561
574
  };
562
575
  var createRouteEntry = (_file, {
563
576
  appRoot,
@@ -627,6 +640,18 @@ var pageRouteResolverFactory = () => {
627
640
  return { name, handler };
628
641
  };
629
642
  };
643
+ var apiUseResolverFactory = () => {
644
+ return (entry) => {
645
+ const { name } = entry;
646
+ const handler = async () => {
647
+ return {
648
+ kind: "apiUse",
649
+ entry
650
+ };
651
+ };
652
+ return { name, handler };
653
+ };
654
+ };
630
655
  var apiRouteResolverFactory = (pluginOptions) => {
631
656
  const {
632
657
  appRoot,
@@ -800,6 +825,7 @@ import {
800
825
  var routes_default = async (pluginOptions) => {
801
826
  const { appRoot, sourceFolder } = pluginOptions;
802
827
  const apiRouteResolver = apiRouteResolverFactory(pluginOptions);
828
+ const apiUseResolver = apiUseResolverFactory(pluginOptions);
803
829
  const pageRouteResolver = pageRouteResolverFactory(pluginOptions);
804
830
  const pageLayoutResolver = pageLayoutResolverFactory(pluginOptions);
805
831
  const resolversFactory = (routeFiles2) => {
@@ -810,12 +836,15 @@ var routes_default = async (pluginOptions) => {
810
836
  });
811
837
  for (const entry of entries) {
812
838
  if (entry.folder === defaults3.apiDir) {
813
- resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
839
+ if (isApiRoute(entry.file)) {
840
+ resolvers.set(entry.fileFullpath, apiRouteResolver(entry));
841
+ } else if (isApiUse(entry.file)) {
842
+ resolvers.set(entry.fileFullpath, apiUseResolver(entry));
843
+ }
814
844
  } else if (entry.folder === defaults3.pagesDir) {
815
- const pageFile = isPageFile(entry.file);
816
- if (pageFile?.kind === "index") {
845
+ if (isPageRoute(entry.file)) {
817
846
  resolvers.set(entry.fileFullpath, pageRouteResolver(entry));
818
- } else if (pageFile?.kind === "layout") {
847
+ } else if (isPageLayout(entry.file)) {
819
848
  resolvers.set(entry.fileFullpath, pageLayoutResolver(entry));
820
849
  }
821
850
  }