@kosmojs/dev 0.0.5 → 0.0.6

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cli/cli.ts", "../../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"],
4
+ "sourcesContent": ["#!/usr/bin/env -S node --enable-source-maps --no-warnings=ExperimentalWarning\n\nimport { dirname, resolve } from \"node:path\";\nimport { parseArgs, styleText } from \"node:util\";\n\nimport concurrently from \"concurrently\";\nimport prompts, { type PromptObject } from \"prompts\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n assertNoError,\n DEFAULT_BASE,\n DEFAULT_PORT,\n FRAMEWORK_OPTIONS,\n messageFactory,\n pathExists,\n type SourceFolder,\n validateBase,\n validateName,\n validatePort,\n} from \"./base\";\nimport { createSourceFolder } from \"./factory\";\n\nconst usage = [\n \"\",\n `\uD83D\uDE80 ${styleText([\"bold\", \"underline\", \"cyan\"], \"KosmoJS CLI\")}`,\n \"\",\n\n styleText(\"bold\", \"FOLDER COMMAND\"),\n \"\",\n ` ${styleText(\"blue\", \"kosmo folder\")}`,\n ` Create a new Source Folder in interactive mode, prompting for each step`,\n \"\",\n styleText(\n \"bold\",\n \" Use these options to create a Source Folder in non-interactive mode:\",\n ),\n \"\",\n ` ${styleText(\"cyan\", \"--name\")} ${styleText(\"dim\", \"<name>\")}`,\n ` Source folder name`,\n \"\",\n ` ${styleText(\"cyan\", \"--base\")} ${styleText(\"dim\", \"<path>\")}`,\n ` Base URL`,\n \"\",\n ` ${styleText(\"cyan\", \"--port\")} ${styleText(\"dim\", \"<number>\")}`,\n ` Development server port`,\n \"\",\n ` ${styleText(\"cyan\", \"--framework\")} ${styleText(\"dim\", \"<framework>\")}`,\n ` Frontend framework: ${FRAMEWORK_OPTIONS.map((e) => styleText(\"yellow\", e)).join(\", \")}`,\n \"\",\n ` ${styleText(\"cyan\", \"--ssr\")}`,\n ` Enable server-side rendering (SSR)`,\n \"\",\n\n styleText(\"bold\", \"DEV COMMAND\"),\n \"\",\n ` ${styleText(\"blue\", \"kosmo dev\")}`,\n ` Start dev server for all source folders`,\n \"\",\n ` ${styleText(\"blue\", \"kosmo dev\")} ${styleText(\"magenta\", \"@admin\")}`,\n ` Start dev server for single source folder`,\n \"\",\n ` ${styleText(\"blue\", \"kosmo dev\")} ${styleText(\"magenta\", \"@admin @front\")}`,\n ` Start dev server for multiple source folders`,\n \"\",\n\n styleText(\"bold\", \"BUILD COMMAND\"),\n \"\",\n ` ${styleText(\"blue\", \"kosmo build\")}`,\n ` Build all source folders`,\n \"\",\n ` ${styleText(\"blue\", \"kosmo build\")} ${styleText(\"magenta\", \"@admin\")}`,\n ` Build single source folder`,\n \"\",\n ` ${styleText(\"blue\", \"kosmo build\")} ${styleText(\"magenta\", \"@admin @front\")}`,\n ` Build multiple source folders`,\n \"\",\n\n styleText(\"bold\", \"COMMON OPTIONS\"),\n \"\",\n ` ${styleText(\"magenta\", \"-q, --quiet\")}`,\n ` Suppress all output in non-interactive mode (errors still shown)`,\n \"\",\n ` ${styleText(\"magenta\", \"-h, --help\")}`,\n ` Display this help message and exit`,\n \"\",\n];\n\nconst printUsage = () => {\n for (const line of usage) {\n console.log(line);\n }\n};\n\nconst options = parseArgs({\n options: {\n name: { type: \"string\" },\n framework: { type: \"string\" },\n ssr: { type: \"boolean\" },\n base: { type: \"string\" },\n port: { type: \"string\" },\n quiet: { type: \"boolean\", short: \"q\" },\n help: { type: \"boolean\", short: \"h\" },\n },\n allowPositionals: true,\n strict: true,\n});\n\nif (options.values.help) {\n printUsage();\n process.exit(0);\n}\n\nconst cwd = process.cwd();\n\nconst prefixColors = [\"cyan\", \"magenta\", \"yellow\", \"green\", \"blue\", \"auto\"];\n\nconst packageFile = resolve(cwd, \"package.json\");\nconst packageFileExists = await pathExists(packageFile);\n\nconst packageJson = packageFileExists\n ? await import(packageFile, { with: { type: \"json\" } }).then((e) => e.default)\n : undefined;\n\nconst handlers: Record<\n \"folder\" | \"dev\" | \"build\",\n (f: Array<string>) => Promise<void>\n> = {\n async folder() {\n const messages = messageFactory(\n options.values.quiet ? () => {} : console.log,\n );\n\n if (\"name\" in options.values) {\n // non-interactive mode\n\n assertNoError(() => validateName(options.values.name));\n\n assertNoError(() => validateBase(options.values.base));\n\n assertNoError(() => validatePort(options.values.port));\n\n assertNoError(() => {\n return FRAMEWORK_OPTIONS.includes(options.values.framework as never)\n ? undefined\n : `Invalid framework, use one of: ${FRAMEWORK_OPTIONS.join(\", \")}`;\n });\n\n const folder = options.values as SourceFolder;\n\n await createSourceFolder(cwd, folder);\n\n messages.sourceFolderCreated(folder);\n\n return;\n }\n\n // interactive mode\n\n const onState: PromptObject[\"onState\"] = (state) => {\n if (state.aborted) {\n process.nextTick(() => process.exit(1));\n }\n };\n\n console.log(\n styleText(\n [\"bold\", \"green\"],\n \"\u279C Great! Let's create a new Source Folder:\\n\",\n ),\n );\n\n const folder = await prompts<\n \"name\" | \"base\" | \"port\" | \"framework\" | \"ssr\"\n >([\n {\n type: \"text\",\n name: \"name\",\n message: \"Folder Name\",\n onState,\n validate: (name) => validateName(name) || true,\n },\n\n {\n type: \"text\",\n name: \"base\",\n message: \"Base URL\",\n initial: DEFAULT_BASE,\n onState,\n validate: (base) => validateBase(base || DEFAULT_BASE) || true,\n },\n\n {\n type: \"number\",\n name: \"port\",\n message: \"Dev Server Port\",\n initial: DEFAULT_PORT,\n onState,\n validate: (port) => validatePort(port || DEFAULT_PORT) || true,\n },\n\n {\n type: \"select\",\n name: \"framework\",\n message: \"Frontend Framework\",\n onState,\n choices: FRAMEWORK_OPTIONS.map((name) => {\n return { title: name, value: name };\n }),\n },\n\n {\n type: (prev: (typeof FRAMEWORK_OPTIONS)[number]) => {\n return prev === \"none\" // skip if no framework\n ? undefined\n : \"toggle\";\n },\n name: \"ssr\",\n message: \"Enable server-side rendering (SSR)?\",\n initial: false,\n active: \"yes\",\n inactive: \"no\",\n },\n ]);\n\n await createSourceFolder(cwd, folder);\n\n messages.sourceFolderCreated(folder);\n },\n\n async dev(folders) {\n const { result, commands } = concurrently(\n folders.map((name) => {\n return { name, command: \"vite dev\", cwd: name };\n }),\n {\n prefixColors,\n handleInput: true,\n },\n );\n\n let manualShutdown = false;\n\n process.stdin.on(\"end\", async () => {\n manualShutdown = true;\n console.log(\"\\nEOF detected - stopping all processes...\");\n for (const cmd of commands) {\n cmd.kill();\n }\n // Give processes time to cleanup\n await new Promise((resolve) => setTimeout(resolve, 500));\n });\n\n return result.then(\n () => process.exit(0),\n () => process.exit(manualShutdown ? 0 : 1),\n );\n },\n\n async build(folders) {\n const { result } = concurrently(\n folders.map((name) => {\n return { name, command: \"vite build\", cwd: name };\n }),\n { prefixColors },\n );\n await result;\n },\n};\n\nconst [command, ...optedFolders] = options.positionals as [\n command: keyof typeof handlers,\n ...optedFolders: Array<string>,\n];\n\ntry {\n assertNoError(() => {\n return packageJson?.distDir\n ? undefined\n : \"No KosmoJS project found in current directory\";\n });\n\n assertNoError(() => {\n return handlers[command]\n ? undefined\n : `Invalid command, use one of ${Object.keys(handlers).join(\", \")}`;\n });\n\n if (command === \"folder\") {\n await handlers[command]([]);\n } else {\n const configs = await glob(\n optedFolders.length\n ? optedFolders.map((e) => `${e}/vite.config.*`)\n : \"**/vite.config.*\",\n {\n absolute: false,\n deep: 2,\n },\n );\n\n const sourceFolders = configs.map(dirname);\n\n assertNoError(() => {\n if (optedFolders.length) {\n return optedFolders.length === sourceFolders.length\n ? undefined\n : \"Some of given names does not contain a valid KosmoJS source folder\";\n }\n\n return sourceFolders.length //\n ? undefined\n : \"No source folders detected\";\n });\n\n await handlers[command](sourceFolders);\n }\n} catch (\n // biome-ignore lint: any\n error: any\n) {\n console.error(error.message);\n process.exit(1);\n}\n", "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 // TODO: implement vue/svelte generators\n // \"vue\",\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 }\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 ]) {\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"],
5
+ "mappings": ";;;AAEA,SAAS,SAAS,WAAAA,gBAAe;AACjC,SAAS,WAAW,aAAAC,kBAAiB;AAErC,OAAO,kBAAkB;AACzB,OAAO,aAAoC;AAC3C,SAAS,YAAY;;;ACPrB,SAAS,QAAQ,WAAW,UAAU;AACtC,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAcnB,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAIF;AAIO,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,oBAAoB;AAE1B,IAAM,YAAY,OACvB,KACA,KACA,EAAE,UAAU,CAAC,EAAE,IAA0C,CAAC,MACxC;AAClB,QAAM,SAAS,QAAQ,SACnB,CAAC,SAAiB;AAChB,WAAO,CAAC,QAAQ,KAAK,CAAC,MAAM;AAC1B,aAAO,OAAO,MAAM,WAAW,MAAM,SAAS,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,IACnE,CAAC;AAAA,EACH,IACA;AAEJ,QAAM,GAAG,KAAK,KAAK;AAAA,IACjB,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AACH;AAEO,IAAM,aAAa,OAAO,SAAmC;AAClE,MAAI;AACF,UAAM,OAAO,MAAM,UAAU,IAAI;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,eAAe,CAAC,SAA6B;AACxD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,aAAa,KAAK,IAAI,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,eAAe,CAAC,SAA6B;AACxD,MAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MACE;AAAA;AAAA,IAEE;AAAA,IACA;AAAA,EACF,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,GACjC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,eAAe,CAAC,SAAsC;AACjE,MAAI,CAAC,QAAQ,QAAQ,KAAK,OAAO,IAAI,EAAE,KAAK,CAAC,GAAG;AAC9C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,gBAAgB,CAAC,cAAwC;AACpE,QAAM,QAAQ,UAAU;AACxB,MAAI,OAAO;AACT,UAAM,IAAI,MAAM,GAAG,UAAU,OAAO,cAAS,CAAC,KAAK,KAAK,EAAE;AAAA,EAC5D;AACF;AAEO,IAAM,iBAAiB,CAAC,WAAgD;AAC7E,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,UAA0B;AAChD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,eAAW,QAAQ,OAAO;AACxB,aAAO,KAAK,IAAI,EAAE;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,WACjB;AAAA,IACE,CAAC,QAAQ,OAAO;AAAA,IAChB,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AAAA,EAClD;AAEF,QAAM,eAAe,CAAC,SAAiB;AACrC,WAAO,UAAU,CAAC,QAAQ,UAAU,MAAM,GAAG,IAAI;AAAA,EACnD;AAEA,QAAM,UAAU,CAAC,QAAgB,YAA2B;AAC1D,UAAM,UAAU,QAAQ,SACpB,UAAU,OAAO,SAAS,QAAQ,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,IACtE;AACJ,WAAO,KAAK,UAAU,QAAQ,GAAG,CAAC,GAAG,OAAO;AAAA,EAC9C;AAEA,QAAM,WAAW,MAAM;AAEvB,SAAO;AAAA,IACL,eAAe,SAAkB;AAC/B,aAAO,eAAe;AAAA,QACpB;AAAA,QACA,UAAU,oBAAoB;AAAA,QAC9B;AAAA,QAEA,GAAG,UAAU,CAAC,QAAQ,QAAQ,GAAG,mBAAc,CAAC;AAAA,QAChD;AAAA,QAEA,aAAa,gCAAyB;AAAA,QACtC,QAAQ,QAAQ,QAAQ,IAAI,EAAE;AAAA,QAC9B,QAAQ,gBAAgB,eAAe,cAAc;AAAA,QACrD;AAAA,QAEA,aAAa,+BAAwB;AAAA,QACrC,QAAQ,gBAAgB,mBAAmB,cAAc;AAAA,QACzD;AAAA,QAEA,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,oBAAoB,SAAuB;AACzC,aAAO,eAAe;AAAA,QACpB;AAAA,QACA,UAAU,yBAAyB;AAAA,QACnC;AAAA,QAEA;AAAA,UACE;AAAA,QACF;AAAA,QACA,QAAQ,gBAAgB,eAAe,cAAc;AAAA,QACrD;AAAA,QAEA;AAAA,UACE;AAAA,QACF;AAAA,QACA,QAAQ,YAAY,eAAe,UAAU;AAAA,QAC7C;AAAA,QAEA,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACnMA,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAUxB,OAAO,UAAU,4BAA4B,KAAK,EAAE,MAAM,OAAO;AACjE,SAAS,UAAU,oBAAoB;;;ACZvC;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ANkCA,IAAM,UAAU,QAAQ,YAAY,SAAS,WAAW;AAcxD,IAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,iBAAiB;AAAA,IACf,OAAO;AAAA,MACL,CAAC,GAAG,SAAS,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,MAAM,IAAI;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,IAAM,SAAS,IAAI,KAAK,OAAO;AAyExB,IAAM,qBAAqB,OAChC,aACA,QACA,QAKG;AACH,QAAM,aAAa,QAAQ,aAAa,OAAO,IAAI;AAEnD,MAAI,MAAM,WAAW,UAAU,GAAG;AAChC,UAAM,IAAI,MAAM,GAAG,OAAO,IAAI,iBAAiB;AAAA,EACjD;AAEA,QAAM,UAAU,QAAQ,SAAS,MAAM,GAAG,YAAY;AAAA,IACpD,SAAS,CAAC,SAAS;AAAA,EACrB,CAAC;AAED,QAAMC,eAAc,QAAQ,aAAa,cAAc;AAEvD,QAAM,gBAAgB,MAAM,OAAOA,cAAa;AAAA,IAC9C,MAAM,EAAE,MAAM,OAAO;AAAA,EACvB,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO;AAExB,QAAM,eAAe,QAAQ,aAAa,eAAe;AAEzD,QAAM,iBAAiB,MAAM,OAAO,cAAc;AAAA,IAChD,MAAM,EAAE,MAAM,OAAO;AAAA,EACvB,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO;AAExB,QAAM,kBAAkB;AAAA,IACtB,GAAG,gBAAgB;AAAA;AAAA,IAEnB,KAAK;AAAA,EACP;AAEA,QAAM,UAAyB,CAAC;AAChC,QAAM,aAA+B,CAAC;AAEtC,QAAM,eAAuC,CAAC;AAC9C,QAAM,kBAA0C,CAAC;AAEjD,QAAM,YACJ,OAAO,aAAa;AAEtB,MAAI,cAAc,SAAS;AACzB,WAAO,OAAO,cAAc;AAAA,MAC1B,mBAAmB,KAAK,gBAAgB,iBAAiB;AAAA,MACzD,YAAY,KAAK,gBAAgB,UAAU;AAAA,IAC7C,CAAC;AAED,WAAO,OAAO,iBAAiB;AAAA,MAC7B,4BAA4B;AAAA,MAC5B,qBAAqB,KAAK,gBAAgB,mBAAmB;AAAA,IAC/D,CAAC;AAED,YAAQ,KAAK;AAAA,MACX,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS,OAAO,MAAM,kBAAkB;AAAA,IAC1C,CAAC;AAED,eAAW,KAAK;AAAA,MACd,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS,KAAK,mBACV,KAAK,UAAU,IAAI,kBAAkB,MAAM,CAAC,IAC5C;AAAA,IACN,CAAC;AAED,oBAAgB,kBAAkB;AAAA,EACpC,WAAW,cAAc,SAAS;AAChC,WAAO,OAAO,cAAc;AAAA,MAC1B,OAAO,KAAK,gBAAgB;AAAA,MAC5B,gBAAgB,KAAK,gBAAgB,cAAc;AAAA,IACrD,CAAC;AAED,WAAO,OAAO,iBAAiB;AAAA,MAC7B,4BAA4B;AAAA,MAC5B,wBAAwB,KAAK,gBAAgB,sBAAsB;AAAA,MACnE,gBAAgB,KAAK,gBAAgB,cAAc;AAAA,MACnD,oBAAoB,KAAK,gBAAgB,kBAAkB;AAAA,MAC3D,aAAa,KAAK,gBAAgB,WAAW;AAAA,IAC/C,CAAC;AAED,YAAQ,KAAK;AAAA,MACX,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAED,eAAW,KAAK;AAAA,MACd,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS,KAAK,mBACV,KAAK,UAAU,IAAI,kBAAkB,MAAM,CAAC,IAC5C;AAAA,IACN,CAAC;AAED,oBAAgB,kBAAkB;AAAA,EACpC;AAEA,MAAI,OAAO,KAAK;AACd,eAAW,KAAK;AAAA,MACd,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AACD,WAAO,OAAO,iBAAiB;AAAA,MAC7B,0BAA0B;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,QAAM,UAAU;AAAA,IACd,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,GAAG;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,MACb,MAAM,CAAC,SAAS,WAAW,SAAS,SAAS,SAAS,MAAM,EAAE,KAAK,GAAG;AAAA,MACtE,KAAK,CAAC,OAAO,MAAM,SAAS,SAAS,EAAE,KAAK,GAAG;AAAA,IACjD;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,QAAQ,KAAK;AAAA,IAC7B,CAAC,GAAG,SAAS,SAAS,aAAa,cAAY;AAAA,IAC/C,CAAC,GAAG,SAAS,MAAM,WAAW,WAAY;AAAA,IAC1C,CAAC,GAAG,SAAS,MAAM,cAAc,cAAe;AAAA,IAChD,CAAC,GAAG,SAAS,MAAM,cAAc,cAAe;AAAA,IAChD,CAAC,GAAG,SAAS,MAAM,WAAW,WAAY;AAAA,IAC1C,CAAC,kBAAkB,mBAAgB;AAAA;AAAA;AAAA,IAGnC,CAAC,GAAG,SAAS,MAAM,mBAAmB,EAAE;AAAA,IACxC,GAAI,CAAC,SAAS,OAAO,EAAE,SAAS,SAAS,IACrC;AAAA,MACE,CAAC,GAAG,SAAS,QAAQ,oBAAoB,EAAE;AAAA,MAC3C,CAAC,GAAG,SAAS,QAAQ,eAAe,EAAE;AAAA,IACxC,IACA,CAAC;AAAA,EACP,GAAG;AACD,UAAM,aAAa,QAAQ,YAAY,IAAI,GAAG,UAAU,OAAO;AAAA,EACjE;AAEA,QAAM,kBAAkB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,iBAAiB;AAAA,MACf,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG,iBAAiB;AAAA,QACpB,CAAC,GAAG,OAAO,IAAI,IAAI,GAAG;AAAA,UACpB,KAAK,OAAO,IAAI;AAAA,UAChB,KAAK,SAAS,MAAM,IAAI,OAAO,IAAI;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,GAAG;AAAA,IACH,cAAc;AAAA,MACZ,GAAG,cAAc;AAAA,MACjB,GAAG;AAAA,MACH,GAAG,KAAK;AAAA,IACV;AAAA,IACA,iBAAiB;AAAA,MACf,GAAG,cAAc;AAAA,MACjB,GAAG;AAAA,MACH,GAAG,KAAK;AAAA,IACV;AAAA,EACF;AAEA,QAAM,UAAUA,cAAa,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AACtE;;;AFpSA,IAAM,QAAQ;AAAA,EACZ;AAAA,EACA,aAAMC,WAAU,CAAC,QAAQ,aAAa,MAAM,GAAG,aAAa,CAAC;AAAA,EAC7D;AAAA,EAEAA,WAAU,QAAQ,gBAAgB;AAAA,EAClC;AAAA,EACA,KAAKA,WAAU,QAAQ,cAAc,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACAA;AAAA,IACE;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,QAAQ,CAAC,IAAIA,WAAU,OAAO,QAAQ,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,QAAQ,CAAC,IAAIA,WAAU,OAAO,QAAQ,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,QAAQ,CAAC,IAAIA,WAAU,OAAO,UAAU,CAAC;AAAA,EAChE;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,aAAa,CAAC,IAAIA,WAAU,OAAO,aAAa,CAAC;AAAA,EACxE,yBAAyB,kBAAkB,IAAI,CAAC,MAAMA,WAAU,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACxF;AAAA,EACA,KAAKA,WAAU,QAAQ,OAAO,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EAEAA,WAAU,QAAQ,aAAa;AAAA,EAC/B;AAAA,EACA,KAAKA,WAAU,QAAQ,WAAW,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,WAAW,CAAC,IAAIA,WAAU,WAAW,QAAQ,CAAC;AAAA,EACrE;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,WAAW,CAAC,IAAIA,WAAU,WAAW,eAAe,CAAC;AAAA,EAC5E;AAAA,EACA;AAAA,EAEAA,WAAU,QAAQ,eAAe;AAAA,EACjC;AAAA,EACA,KAAKA,WAAU,QAAQ,aAAa,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,aAAa,CAAC,IAAIA,WAAU,WAAW,QAAQ,CAAC;AAAA,EACvE;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,QAAQ,aAAa,CAAC,IAAIA,WAAU,WAAW,eAAe,CAAC;AAAA,EAC9E;AAAA,EACA;AAAA,EAEAA,WAAU,QAAQ,gBAAgB;AAAA,EAClC;AAAA,EACA,KAAKA,WAAU,WAAW,aAAa,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA,KAAKA,WAAU,WAAW,YAAY,CAAC;AAAA,EACvC;AAAA,EACA;AACF;AAEA,IAAM,aAAa,MAAM;AACvB,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,IAAI;AAAA,EAClB;AACF;AAEA,IAAM,UAAU,UAAU;AAAA,EACxB,SAAS;AAAA,IACP,MAAM,EAAE,MAAM,SAAS;AAAA,IACvB,WAAW,EAAE,MAAM,SAAS;AAAA,IAC5B,KAAK,EAAE,MAAM,UAAU;AAAA,IACvB,MAAM,EAAE,MAAM,SAAS;AAAA,IACvB,MAAM,EAAE,MAAM,SAAS;AAAA,IACvB,OAAO,EAAE,MAAM,WAAW,OAAO,IAAI;AAAA,IACrC,MAAM,EAAE,MAAM,WAAW,OAAO,IAAI;AAAA,EACtC;AAAA,EACA,kBAAkB;AAAA,EAClB,QAAQ;AACV,CAAC;AAED,IAAI,QAAQ,OAAO,MAAM;AACvB,aAAW;AACX,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,MAAM,QAAQ,IAAI;AAExB,IAAM,eAAe,CAAC,QAAQ,WAAW,UAAU,SAAS,QAAQ,MAAM;AAE1E,IAAM,cAAcC,SAAQ,KAAK,cAAc;AAC/C,IAAM,oBAAoB,MAAM,WAAW,WAAW;AAEtD,IAAM,cAAc,oBAChB,MAAM,OAAO,aAAa,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,IAC3E;AAEJ,IAAM,WAGF;AAAA,EACF,MAAM,SAAS;AACb,UAAM,WAAW;AAAA,MACf,QAAQ,OAAO,QAAQ,MAAM;AAAA,MAAC,IAAI,QAAQ;AAAA,IAC5C;AAEA,QAAI,UAAU,QAAQ,QAAQ;AAG5B,oBAAc,MAAM,aAAa,QAAQ,OAAO,IAAI,CAAC;AAErD,oBAAc,MAAM,aAAa,QAAQ,OAAO,IAAI,CAAC;AAErD,oBAAc,MAAM,aAAa,QAAQ,OAAO,IAAI,CAAC;AAErD,oBAAc,MAAM;AAClB,eAAO,kBAAkB,SAAS,QAAQ,OAAO,SAAkB,IAC/D,SACA,kCAAkC,kBAAkB,KAAK,IAAI,CAAC;AAAA,MACpE,CAAC;AAED,YAAMC,UAAS,QAAQ;AAEvB,YAAM,mBAAmB,KAAKA,OAAM;AAEpC,eAAS,oBAAoBA,OAAM;AAEnC;AAAA,IACF;AAIA,UAAM,UAAmC,CAAC,UAAU;AAClD,UAAI,MAAM,SAAS;AACjB,gBAAQ,SAAS,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,MACxC;AAAA,IACF;AAEA,YAAQ;AAAA,MACNF;AAAA,QACE,CAAC,QAAQ,OAAO;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,QAEnB;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA,UAAU,CAAC,SAAS,aAAa,IAAI,KAAK;AAAA,MAC5C;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA,UAAU,CAAC,SAAS,aAAa,QAAQ,YAAY,KAAK;AAAA,MAC5D;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA,UAAU,CAAC,SAAS,aAAa,QAAQ,YAAY,KAAK;AAAA,MAC5D;AAAA,MAEA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA,SAAS,kBAAkB,IAAI,CAAC,SAAS;AACvC,iBAAO,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA;AAAA,QACE,MAAM,CAAC,SAA6C;AAClD,iBAAO,SAAS,SACZ,SACA;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAED,UAAM,mBAAmB,KAAK,MAAM;AAEpC,aAAS,oBAAoB,MAAM;AAAA,EACrC;AAAA,EAEA,MAAM,IAAI,SAAS;AACjB,UAAM,EAAE,QAAQ,SAAS,IAAI;AAAA,MAC3B,QAAQ,IAAI,CAAC,SAAS;AACpB,eAAO,EAAE,MAAM,SAAS,YAAY,KAAK,KAAK;AAAA,MAChD,CAAC;AAAA,MACD;AAAA,QACE;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,QAAI,iBAAiB;AAErB,YAAQ,MAAM,GAAG,OAAO,YAAY;AAClC,uBAAiB;AACjB,cAAQ,IAAI,4CAA4C;AACxD,iBAAW,OAAO,UAAU;AAC1B,YAAI,KAAK;AAAA,MACX;AAEA,YAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,GAAG,CAAC;AAAA,IACzD,CAAC;AAED,WAAO,OAAO;AAAA,MACZ,MAAM,QAAQ,KAAK,CAAC;AAAA,MACpB,MAAM,QAAQ,KAAK,iBAAiB,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,SAAS;AACnB,UAAM,EAAE,OAAO,IAAI;AAAA,MACjB,QAAQ,IAAI,CAAC,SAAS;AACpB,eAAO,EAAE,MAAM,SAAS,cAAc,KAAK,KAAK;AAAA,MAClD,CAAC;AAAA,MACD,EAAE,aAAa;AAAA,IACjB;AACA,UAAM;AAAA,EACR;AACF;AAEA,IAAM,CAAC,SAAS,GAAG,YAAY,IAAI,QAAQ;AAK3C,IAAI;AACF,gBAAc,MAAM;AAClB,WAAO,aAAa,UAChB,SACA;AAAA,EACN,CAAC;AAED,gBAAc,MAAM;AAClB,WAAO,SAAS,OAAO,IACnB,SACA,+BAA+B,OAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA,EACrE,CAAC;AAED,MAAI,YAAY,UAAU;AACxB,UAAM,SAAS,OAAO,EAAE,CAAC,CAAC;AAAA,EAC5B,OAAO;AACL,UAAM,UAAU,MAAM;AAAA,MACpB,aAAa,SACT,aAAa,IAAI,CAAC,MAAM,GAAG,CAAC,gBAAgB,IAC5C;AAAA,MACJ;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,gBAAgB,QAAQ,IAAI,OAAO;AAEzC,kBAAc,MAAM;AAClB,UAAI,aAAa,QAAQ;AACvB,eAAO,aAAa,WAAW,cAAc,SACzC,SACA;AAAA,MACN;AAEA,aAAO,cAAc,SACjB,SACA;AAAA,IACN,CAAC;AAED,UAAM,SAAS,OAAO,EAAE,aAAa;AAAA,EACvC;AACF,SAEE,OACA;AACA,UAAQ,MAAM,MAAM,OAAO;AAC3B,UAAQ,KAAK,CAAC;AAChB;",
6
+ "names": ["resolve", "styleText", "packageFile", "styleText", "resolve", "folder"]
7
+ }
@@ -0,0 +1,408 @@
1
+ // src/cli/base.ts
2
+ import { access, constants, cp } from "node:fs/promises";
3
+ import { basename } from "node:path";
4
+ import { styleText } from "node:util";
5
+ var CREATE_OPTIONS = ["project", "folder"];
6
+ var FRAMEWORK_OPTIONS = [
7
+ "none",
8
+ "solid",
9
+ "react"
10
+ // TODO: implement vue/svelte generators
11
+ // "vue",
12
+ // "svelte",
13
+ ];
14
+ var NODE_VERSION = "22";
15
+ var DEFAULT_DIST = "dist";
16
+ var DEFAULT_BASE = "/";
17
+ var DEFAULT_PORT = "4000";
18
+ var DEFAULT_FRAMEWORK = "none";
19
+ var copyFiles = async (src, dst, { exclude = [] } = {}) => {
20
+ const filter = exclude.length ? (path) => {
21
+ return !exclude.some((e) => {
22
+ return typeof e === "string" ? e === basename(path) : e.test(path);
23
+ });
24
+ } : void 0;
25
+ await cp(src, dst, {
26
+ recursive: true,
27
+ force: true,
28
+ filter
29
+ });
30
+ };
31
+ var pathExists = async (path) => {
32
+ try {
33
+ await access(path, constants.F_OK);
34
+ return true;
35
+ } catch {
36
+ return false;
37
+ }
38
+ };
39
+ var validateName = (name) => {
40
+ if (!name) {
41
+ return "Invalid name provided";
42
+ }
43
+ if (/[^\w.@$+-]/.test(name)) {
44
+ return "May contain only alphanumerics, hyphens, periods or any of @ $ +";
45
+ }
46
+ return void 0;
47
+ };
48
+ var validateBase = (base) => {
49
+ if (!base?.startsWith("/")) {
50
+ return "Should start with a slash";
51
+ }
52
+ if ([
53
+ // path traversal patterns
54
+ /\.\.\//,
55
+ /\/\.\//
56
+ ].some((e) => e.test(base.trim()))) {
57
+ return "Should not contain path traversal patterns";
58
+ }
59
+ return void 0;
60
+ };
61
+ var validatePort = (port) => {
62
+ if (!port || /[^\d]/.test(String(port).trim())) {
63
+ return "Invalid port number";
64
+ }
65
+ return void 0;
66
+ };
67
+ var assertNoError = (validator) => {
68
+ const error = validator();
69
+ if (error) {
70
+ throw new Error(`${styleText("red", "\u2717 ERROR")}: ${error}`);
71
+ }
72
+ };
73
+ var messageFactory = (logger) => {
74
+ const projectCreatedGreets = [
75
+ "\u2728 Well Done! Your new KosmoJS app is ready",
76
+ "\u{1F4AB} Excellent! Your new KosmoJS project is all set",
77
+ "\u{1F31F} Nice work! Your KosmoJS setup is ready to perform",
78
+ "\u{1F680} Success! Your KosmoJS project is ready for exploration",
79
+ "\u2705 All Set! Your KosmoJS project is configured and ready"
80
+ ];
81
+ const sourceFolderCreatedGreets = [
82
+ "\u{1F4AB} Awesome! You just created a new Source Folder",
83
+ "\u2728 Nice! Your new Source Folder is ready to use",
84
+ "\u{1F3AF} Perfect! Source Folder created successfully",
85
+ "\u2705 Great! Your Source Folder is all set up",
86
+ "\u{1F31F} Excellent! New Source Folder is ready to perform"
87
+ ];
88
+ const messageHandler = (lines) => {
89
+ if (!logger) {
90
+ return lines;
91
+ }
92
+ for (const line of lines) {
93
+ logger(` ${line}`);
94
+ }
95
+ return void 0;
96
+ };
97
+ const greetText = (greets) => styleText(
98
+ ["bold", "green"],
99
+ greets[Math.floor(Math.random() * greets.length)]
100
+ );
101
+ const nextStepText = (text) => {
102
+ return styleText(["bold", "italic", "cyan"], text);
103
+ };
104
+ const cmdText = (cmd, ...altCmds) => {
105
+ const altText = altCmds.length ? styleText("dim", ` # or ${altCmds.map((e) => `\`${e}\``).join(" / ")}`) : "";
106
+ return `$ ${styleText("blue", cmd)}${altText}`;
107
+ };
108
+ const docsText = () => "\u{1F4D8} Docs: https://kosmojs.dev";
109
+ return {
110
+ projectCreated(project) {
111
+ return messageHandler([
112
+ "",
113
+ greetText(projectCreatedGreets),
114
+ "",
115
+ `${styleText(["bold", "yellow"], "\u279C Next Steps")}`,
116
+ "",
117
+ nextStepText("\u{1F4E6} Install Dependencies"),
118
+ cmdText(`cd ./${project.name}`),
119
+ cmdText("pnpm install", "npm install", "yarn install"),
120
+ "",
121
+ nextStepText("\u{1F4C1} Add a Source Folder"),
122
+ cmdText("pnpm +folder", "npm run +folder", "yarn +folder"),
123
+ "",
124
+ docsText(),
125
+ ""
126
+ ]);
127
+ },
128
+ sourceFolderCreated(_folder) {
129
+ return messageHandler([
130
+ "",
131
+ greetText(sourceFolderCreatedGreets),
132
+ "",
133
+ nextStepText(
134
+ "\u{1F4E6} Now install any new dependencies that may have been added"
135
+ ),
136
+ cmdText("pnpm install", "npm install", "yarn install"),
137
+ "",
138
+ nextStepText(
139
+ "\u{1F680} Once dependencies are installed, start the dev server"
140
+ ),
141
+ cmdText("pnpm dev", "npm run dev", "yarn dev"),
142
+ "",
143
+ docsText(),
144
+ ""
145
+ ]);
146
+ }
147
+ };
148
+ };
149
+
150
+ // src/cli/factory.ts
151
+ import { writeFile } from "node:fs/promises";
152
+ import { resolve } from "node:path";
153
+ import self from "@kosmojs/dev/package.json" with { type: "json" };
154
+ import { defaults, renderToFile } from "@kosmojs/devlib";
155
+
156
+ // src/cli/templates/@src/api/app.hbs
157
+ var app_default = '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';
158
+
159
+ // src/cli/templates/@src/api/router.hbs
160
+ var router_default = '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';
161
+
162
+ // src/cli/templates/@src/api/server.hbs
163
+ var server_default = 'import createServer from "{{importPathmap.core}}/server";\nimport createApp from "./app";\n\ncreateServer(createApp);\n';
164
+
165
+ // src/cli/templates/@src/api/use.hbs
166
+ var use_default = 'import globalMiddleware from "{{defaults.appPrefix}}/core/api/use";\n\nexport default [\n // Global middleware applied to all routes\n ...globalMiddleware,\n];\n';
167
+
168
+ // src/cli/templates/@src/config/index.hbs
169
+ var config_default = 'export const baseurl = "{{folder.base}}";\nexport const apiurl = "/api"; // relative to baseurl\n';
170
+
171
+ // src/cli/templates/@src/vite.config.hbs
172
+ var vite_config_default = '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';
173
+
174
+ // src/cli/templates/vite.base.hbs
175
+ var vite_base_default = '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';
176
+
177
+ // src/cli/factory.ts
178
+ var TPL_DIR = resolve(import.meta.dirname, "templates");
179
+ var tsconfigJson = {
180
+ extends: "@kosmojs/config/tsconfig.vite.json",
181
+ compilerOptions: {
182
+ paths: {
183
+ [`${defaults.appPrefix}/*`]: ["./*", `./${defaults.libDir}/*`]
184
+ }
185
+ }
186
+ };
187
+ var SEMVER = `^${self.version}`;
188
+ var createProject = async (path, project, assets) => {
189
+ const packageJson = {
190
+ type: "module",
191
+ distDir: project.distDir || DEFAULT_DIST,
192
+ scripts: {
193
+ dev: "kosmo dev",
194
+ build: "kosmo build",
195
+ "+folder": "kosmo folder"
196
+ },
197
+ dependencies: {
198
+ "@kosmojs/api": SEMVER,
199
+ qs: self.devDependencies.qs,
200
+ ...assets?.dependencies
201
+ },
202
+ devDependencies: {
203
+ "@kosmojs/config": SEMVER,
204
+ "@kosmojs/dev": SEMVER,
205
+ "@types/node": self.devDependencies["@types/node"],
206
+ "@types/qs": self.devDependencies["@types/qs"],
207
+ esbuild: self.dependencies.esbuild,
208
+ tslib: self.devDependencies.tslib,
209
+ typescript: self.dependencies.typescript,
210
+ vite: self.devDependencies.vite,
211
+ ...assets?.devDependencies
212
+ },
213
+ pnpm: {
214
+ onlyBuiltDependencies: ["esbuild"]
215
+ }
216
+ };
217
+ const esbuildJson = {
218
+ bundle: true,
219
+ platform: "node",
220
+ target: `node${assets?.NODE_VERSION || NODE_VERSION}`,
221
+ format: "esm",
222
+ packages: "external",
223
+ sourcemap: "linked",
224
+ logLevel: "info"
225
+ };
226
+ const projectPath = resolve(path, project.name);
227
+ if (await pathExists(projectPath)) {
228
+ throw new Error(`${project.name} already exists`);
229
+ }
230
+ await copyFiles(TPL_DIR, projectPath, {
231
+ exclude: [/@src/, /.+\.hbs/]
232
+ });
233
+ for (const [file, template] of [
234
+ ["vite.base.ts", vite_base_default],
235
+ ["esbuild.json", JSON.stringify(esbuildJson, null, 2)],
236
+ ["package.json", JSON.stringify(packageJson, null, 2)],
237
+ ["tsconfig.json", JSON.stringify(tsconfigJson, null, 2)]
238
+ ]) {
239
+ await renderToFile(resolve(projectPath, file), template, {
240
+ defaults,
241
+ distDir: project.distDir || DEFAULT_DIST
242
+ });
243
+ }
244
+ };
245
+ var createSourceFolder = async (projectRoot, folder, opt) => {
246
+ const folderPath = resolve(projectRoot, folder.name);
247
+ if (await pathExists(folderPath)) {
248
+ throw new Error(`${folder.name} already exists`);
249
+ }
250
+ await copyFiles(resolve(TPL_DIR, "@src"), folderPath, {
251
+ exclude: [/.+\.hbs/]
252
+ });
253
+ const packageFile = resolve(projectRoot, "package.json");
254
+ const packageImport = await import(packageFile, {
255
+ with: { type: "json" }
256
+ }).then((e) => e.default);
257
+ const tsconfigFile = resolve(projectRoot, "tsconfig.json");
258
+ const tsconfigImport = await import(tsconfigFile, {
259
+ with: { type: "json" }
260
+ }).then((e) => e.default);
261
+ const compilerOptions = {
262
+ ...tsconfigImport?.compilerOptions,
263
+ // instruct TypeScript to preserve JSX
264
+ jsx: "preserve"
265
+ };
266
+ const plugins = [];
267
+ const generators = [];
268
+ const dependencies = {};
269
+ const devDependencies = {};
270
+ const framework = folder.framework || DEFAULT_FRAMEWORK;
271
+ if (framework === "solid") {
272
+ Object.assign(dependencies, {
273
+ "@solidjs/router": self.devDependencies["@solidjs/router"],
274
+ "solid-js": self.devDependencies["solid-js"]
275
+ });
276
+ Object.assign(devDependencies, {
277
+ "@kosmojs/solid-generator": SEMVER,
278
+ "vite-plugin-solid": self.devDependencies["vite-plugin-solid"]
279
+ });
280
+ plugins.push({
281
+ importDeclaration: `import solidPlugin from "vite-plugin-solid";`,
282
+ importName: "solidPlugin",
283
+ options: folder.ssr ? "{ ssr: true }" : ""
284
+ });
285
+ generators.push({
286
+ importDeclaration: `import solidGenerator from "@kosmojs/solid-generator";`,
287
+ importName: "solidGenerator",
288
+ options: opt?.frameworkOptions ? JSON.stringify(opt.frameworkOptions, null, 2) : ""
289
+ });
290
+ compilerOptions.jsxImportSource = "solid-js";
291
+ } else if (framework === "react") {
292
+ Object.assign(dependencies, {
293
+ react: self.devDependencies.react,
294
+ "react-router": self.devDependencies["react-router"]
295
+ });
296
+ Object.assign(devDependencies, {
297
+ "@kosmojs/react-generator": SEMVER,
298
+ "@vitejs/plugin-react": self.devDependencies["@vitejs/plugin-react"],
299
+ "@types/react": self.devDependencies["@types/react"],
300
+ "@types/react-dom": self.devDependencies["@types/react-dom"],
301
+ "react-dom": self.devDependencies["react-dom"]
302
+ });
303
+ plugins.push({
304
+ importDeclaration: `import reactPlugin from "@vitejs/plugin-react";`,
305
+ importName: "reactPlugin",
306
+ options: ""
307
+ });
308
+ generators.push({
309
+ importDeclaration: `import reactGenerator from "@kosmojs/react-generator";`,
310
+ importName: "reactGenerator",
311
+ options: opt?.frameworkOptions ? JSON.stringify(opt.frameworkOptions, null, 2) : ""
312
+ });
313
+ compilerOptions.jsxImportSource = "react";
314
+ }
315
+ if (folder.ssr) {
316
+ generators.push({
317
+ importDeclaration: `import ssrGenerator from "@kosmojs/ssr-generator";`,
318
+ importName: "ssrGenerator",
319
+ options: ""
320
+ });
321
+ Object.assign(devDependencies, {
322
+ "@kosmojs/ssr-generator": SEMVER
323
+ });
324
+ }
325
+ const context = {
326
+ folder: {
327
+ base: DEFAULT_BASE,
328
+ port: DEFAULT_PORT,
329
+ ...folder
330
+ },
331
+ defaults,
332
+ plugins,
333
+ generators,
334
+ importPathmap: {
335
+ core: [defaults.appPrefix, defaults.coreDir, defaults.apiDir].join("/"),
336
+ lib: [folder.name, defaults.apiLibDir].join("/")
337
+ }
338
+ };
339
+ for (const [file, template] of [
340
+ [`${defaults.configDir}/index.ts`, config_default],
341
+ [`${defaults.apiDir}/app.ts`, app_default],
342
+ [`${defaults.apiDir}/router.ts`, router_default],
343
+ [`${defaults.apiDir}/server.ts`, server_default],
344
+ [`${defaults.apiDir}/use.ts`, use_default],
345
+ ["vite.config.ts", vite_config_default],
346
+ // stub files for initial build to pass;
347
+ // generators will fill them with appropriate content.
348
+ [`${defaults.apiDir}/index/index.ts`, ""],
349
+ ...["solid", "react"].includes(framework) ? [
350
+ [`${defaults.pagesDir}/index/index.tsx`, ""],
351
+ [`${defaults.entryDir}/client.tsx`, ""]
352
+ ] : []
353
+ ]) {
354
+ await renderToFile(resolve(folderPath, file), template, context);
355
+ }
356
+ const tsconfigUpdated = {
357
+ ...tsconfigJson,
358
+ ...tsconfigImport,
359
+ compilerOptions: {
360
+ ...compilerOptions,
361
+ paths: {
362
+ ...compilerOptions?.paths,
363
+ [`${folder.name}/*`]: [
364
+ `./${folder.name}/*`,
365
+ `./${defaults.libDir}/${folder.name}/*`
366
+ ]
367
+ }
368
+ }
369
+ };
370
+ await writeFile(
371
+ tsconfigFile,
372
+ JSON.stringify(tsconfigUpdated, null, 2),
373
+ "utf8"
374
+ );
375
+ const packageUpdated = {
376
+ ...packageImport,
377
+ dependencies: {
378
+ ...packageImport.dependencies,
379
+ ...dependencies,
380
+ ...opt?.dependencies
381
+ },
382
+ devDependencies: {
383
+ ...packageImport.devDependencies,
384
+ ...devDependencies,
385
+ ...opt?.devDependencies
386
+ }
387
+ };
388
+ await writeFile(packageFile, JSON.stringify(packageUpdated, null, 2));
389
+ };
390
+ export {
391
+ CREATE_OPTIONS,
392
+ DEFAULT_BASE,
393
+ DEFAULT_DIST,
394
+ DEFAULT_FRAMEWORK,
395
+ DEFAULT_PORT,
396
+ FRAMEWORK_OPTIONS,
397
+ NODE_VERSION,
398
+ assertNoError,
399
+ copyFiles,
400
+ createProject,
401
+ createSourceFolder,
402
+ messageFactory,
403
+ pathExists,
404
+ validateBase,
405
+ validateName,
406
+ validatePort
407
+ };
408
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 // TODO: implement vue/svelte generators\n // \"vue\",\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 }\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 ]) {\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
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ VITE_HOSTNAME=localhost
@@ -0,0 +1,32 @@
1
+ import createApp from "{{importPathmap.core}}/app";
2
+
3
+ import router from "./router";
4
+
5
+ export default () => {
6
+ const app = createApp();
7
+
8
+ // routes goes latest
9
+ app.use(router.routes());
10
+
11
+ return app;
12
+ };
13
+
14
+ /**
15
+ * In dev mode, determines whether to pass the request to API handler or to Vite.
16
+ export const devMiddlewareFactory: import("@kosmojs/api").DevMiddlewareFactory = (
17
+ app,
18
+ ) => {
19
+ return (req, res, next) => {
20
+ return req.url?.startsWith("...")
21
+ ? app?.callback()(req, res) // send request to api handler
22
+ : next(); // send request to vite dev server
23
+ };
24
+ };
25
+ * */
26
+
27
+ /**
28
+ * In dev mode, used to cleanup before reloading api handler.
29
+ export const teardownHandler: import("@kosmojs/api").TeardownHandler = () => {
30
+ // close db connections, server sockets etc.
31
+ };
32
+ * */
@@ -0,0 +1,11 @@
1
+ import { routerRoutes } from "{{importPathmap.lib}}";
2
+
3
+ import createRouter from "{{importPathmap.core}}/router";
4
+
5
+ const router = createRouter();
6
+
7
+ for (const { name, path, methods, middleware } of routerRoutes) {
8
+ router.register(path, methods, middleware, { name });
9
+ }
10
+
11
+ export default router;
@@ -0,0 +1,4 @@
1
+ import createServer from "{{importPathmap.core}}/server";
2
+ import createApp from "./app";
3
+
4
+ createServer(createApp);
@@ -0,0 +1,6 @@
1
+ import globalMiddleware from "{{defaults.appPrefix}}/core/api/use";
2
+
3
+ export default [
4
+ // Global middleware applied to all routes
5
+ ...globalMiddleware,
6
+ ];
@@ -0,0 +1,2 @@
1
+ export const baseurl = "{{folder.base}}";
2
+ export const apiurl = "/api"; // relative to baseurl
@@ -0,0 +1,4 @@
1
+ <!--
2
+ Do not remove! Build process requires this file for framework-less source folders.
3
+ Framework generators will override this stub with their own setup.
4
+ -->