@kosmojs/dev 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +15 -13
- package/pkg/base-plugin/routes.js +57 -51
- package/pkg/base-plugin/routes.js.map +3 -3
- package/pkg/base-plugin/worker.js +56 -57
- package/pkg/base-plugin/worker.js.map +3 -3
- package/pkg/cli/cli.js +27 -8
- package/pkg/cli/cli.js.map +2 -2
- package/pkg/cli/index.js +27 -8
- package/pkg/cli/index.js.map +2 -2
- package/pkg/index.js +58 -52
- package/pkg/index.js.map +3 -3
- package/pkg/src/base-plugin/routes.d.ts +7 -5
- package/pkg/src/cli/base.d.ts +1 -1
- package/pkg/src/index.d.ts +1 -1
- package/pkg/stub-generator/index.js +1 -1
- package/pkg/stub-generator/index.js.map +1 -1
package/pkg/cli/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/cli/base.ts", "../../src/cli/factory.ts", "../../src/cli/templates/@src/api/app.hbs", "../../src/cli/templates/@src/api/router.hbs", "../../src/cli/templates/@src/api/server.hbs", "../../src/cli/templates/@src/api/use.hbs", "../../src/cli/templates/@src/config/index.hbs", "../../src/cli/templates/@src/vite.config.hbs", "../../src/cli/templates/vite.base.hbs"],
|
|
4
|
-
"sourcesContent": ["import { access, constants, cp } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nexport type Project = { name: string; distDir?: string };\n\nexport type SourceFolder = {\n name: string;\n framework?: (typeof FRAMEWORK_OPTIONS)[number];\n ssr?: boolean;\n base?: string;\n port?: number | string;\n};\n\nexport const CREATE_OPTIONS = [\"project\", \"folder\"] as const;\n\nexport const FRAMEWORK_OPTIONS = [\n \"none\",\n \"solid\",\n \"react\",\n // 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": ";AAAA,SAAS,QAAQ,WAAW,UAAU;AACtC,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAYnB,IAAM,iBAAiB,CAAC,WAAW,QAAQ;AAE3C,IAAM,oBAAoB
|
|
4
|
+
"sourcesContent": ["import { access, constants, cp } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nexport type Project = { name: string; distDir?: string };\n\nexport type SourceFolder = {\n name: string;\n framework?: (typeof FRAMEWORK_OPTIONS)[number];\n ssr?: boolean;\n base?: string;\n port?: number | string;\n};\n\nexport const CREATE_OPTIONS = [\"project\", \"folder\"] as const;\n\nexport const FRAMEWORK_OPTIONS = [\"none\", \"solid\", \"react\", \"vue\"] as const;\n\nexport const NODE_VERSION = \"22\";\nexport const DEFAULT_DIST = \"dist\";\nexport const DEFAULT_BASE = \"/\";\nexport const DEFAULT_PORT = \"4000\";\nexport const DEFAULT_FRAMEWORK = \"none\" as const;\n\nexport const copyFiles = async (\n src: string,\n dst: string,\n { exclude = [] }: { exclude?: Array<string | RegExp> } = {},\n): Promise<void> => {\n const filter = exclude.length\n ? (path: string) => {\n return !exclude.some((e) => {\n return typeof e === \"string\" ? e === basename(path) : e.test(path);\n });\n }\n : undefined;\n\n await cp(src, dst, {\n recursive: true,\n force: true,\n filter,\n });\n};\n\nexport const pathExists = async (path: string): Promise<boolean> => {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const validateName = (name: string | undefined) => {\n if (!name) {\n return \"Invalid name provided\";\n }\n if (/[^\\w.@$+-]/.test(name)) {\n return \"May contain only alphanumerics, hyphens, periods or any of @ $ +\";\n }\n return undefined;\n};\n\nexport const validateBase = (base: string | undefined) => {\n if (!base?.startsWith(\"/\")) {\n return \"Should start with a slash\";\n }\n if (\n [\n // path traversal patterns\n /\\.\\.\\//,\n /\\/\\.\\//,\n ].some((e) => e.test(base.trim()))\n ) {\n return \"Should not contain path traversal patterns\";\n }\n return undefined;\n};\n\nexport const validatePort = (port: string | number | undefined) => {\n if (!port || /[^\\d]/.test(String(port).trim())) {\n return \"Invalid port number\";\n }\n return undefined;\n};\n\nexport const assertNoError = (validator: () => string | undefined) => {\n const error = validator();\n if (error) {\n throw new Error(`${styleText(\"red\", \"\u2717 ERROR\")}: ${error}`);\n }\n};\n\nexport const messageFactory = (logger?: (...lines: Array<unknown>) => void) => {\n const projectCreatedGreets = [\n \"\u2728 Well Done! Your new KosmoJS app is ready\",\n \"\uD83D\uDCAB Excellent! Your new KosmoJS project is all set\",\n \"\uD83C\uDF1F Nice work! Your KosmoJS setup is ready to perform\",\n \"\uD83D\uDE80 Success! Your KosmoJS project is ready for exploration\",\n \"\u2705 All Set! Your KosmoJS project is configured and ready\",\n ];\n\n const sourceFolderCreatedGreets = [\n \"\uD83D\uDCAB Awesome! You just created a new Source Folder\",\n \"\u2728 Nice! Your new Source Folder is ready to use\",\n \"\uD83C\uDFAF Perfect! Source Folder created successfully\",\n \"\u2705 Great! Your Source Folder is all set up\",\n \"\uD83C\uDF1F Excellent! New Source Folder is ready to perform\",\n ];\n\n const messageHandler = (lines: Array<unknown>) => {\n if (!logger) {\n return lines;\n }\n\n for (const line of lines) {\n logger(` ${line}`);\n }\n\n return undefined;\n };\n\n const greetText = (greets: Array<string>) =>\n styleText(\n [\"bold\", \"green\"],\n greets[Math.floor(Math.random() * greets.length)],\n );\n\n const nextStepText = (text: string) => {\n return styleText([\"bold\", \"italic\", \"cyan\"], text);\n };\n\n const cmdText = (cmd: string, ...altCmds: Array<string>) => {\n const altText = altCmds.length\n ? styleText(\"dim\", ` # or ${altCmds.map((e) => `\\`${e}\\``).join(\" / \")}`)\n : \"\";\n return `$ ${styleText(\"blue\", cmd)}${altText}`;\n };\n\n const docsText = () => \"\uD83D\uDCD8 Docs: https://kosmojs.dev\";\n\n return {\n projectCreated(project: Project) {\n return messageHandler([\n \"\",\n greetText(projectCreatedGreets),\n \"\",\n\n `${styleText([\"bold\", \"yellow\"], \"\u279C Next Steps\")}`,\n \"\",\n\n nextStepText(\"\uD83D\uDCE6 Install Dependencies\"),\n cmdText(`cd ./${project.name}`),\n cmdText(\"pnpm install\", \"npm install\", \"yarn install\"),\n \"\",\n\n nextStepText(\"\uD83D\uDCC1 Add a Source Folder\"),\n cmdText(\"pnpm +folder\", \"npm run +folder\", \"yarn +folder\"),\n \"\",\n\n docsText(),\n \"\",\n ]);\n },\n\n sourceFolderCreated(_folder: SourceFolder) {\n return messageHandler([\n \"\",\n greetText(sourceFolderCreatedGreets),\n \"\",\n\n nextStepText(\n \"\uD83D\uDCE6 Now install any new dependencies that may have been added\",\n ),\n cmdText(\"pnpm install\", \"npm install\", \"yarn install\"),\n \"\",\n\n nextStepText(\n \"\uD83D\uDE80 Once dependencies are installed, start the dev server\",\n ),\n cmdText(\"pnpm dev\", \"npm run dev\", \"yarn dev\"),\n \"\",\n\n docsText(),\n \"\",\n ]);\n },\n };\n};\n", "import { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * INFO: For best compatibility, all packages should share the same version.\n * When bumping the version (even a patch) for a single package, bump it for all packages\n * to keep versions fully synchronized across the project.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { defaults, renderToFile } from \"@kosmojs/devlib\";\n\nimport {\n copyFiles,\n DEFAULT_BASE,\n DEFAULT_DIST,\n DEFAULT_FRAMEWORK,\n DEFAULT_PORT,\n NODE_VERSION,\n type Project,\n pathExists,\n type SourceFolder,\n} from \"./base\";\n\nimport srcApiAppTpl from \"./templates/@src/api/app.hbs\";\nimport srcApiRouterTpl from \"./templates/@src/api/router.hbs\";\nimport srcApiServerTpl from \"./templates/@src/api/server.hbs\";\nimport srcApiUseTpl from \"./templates/@src/api/use.hbs\";\nimport srcConfigTpl from \"./templates/@src/config/index.hbs\";\nimport srcViteConfigTpl from \"./templates/@src/vite.config.hbs\";\nimport viteBaseTpl from \"./templates/vite.base.hbs\";\n\nconst TPL_DIR = resolve(import.meta.dirname, \"templates\");\n\ntype Plugin = {\n importDeclaration: string;\n importName: string;\n options: string;\n};\n\ntype Generator = {\n importDeclaration: string;\n importName: string;\n options: string;\n};\n\nconst tsconfigJson = {\n extends: \"@kosmojs/config/tsconfig.vite.json\",\n compilerOptions: {\n paths: {\n [`${defaults.appPrefix}/*`]: [\"./*\", `./${defaults.libDir}/*`],\n },\n },\n};\n\nconst SEMVER = `^${self.version}`;\n\nexport const createProject = async (\n path: string,\n project: Project,\n assets?: {\n NODE_VERSION?: `${number}`;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n) => {\n const packageJson = {\n type: \"module\",\n distDir: project.distDir || DEFAULT_DIST,\n scripts: {\n dev: \"kosmo dev\",\n build: \"kosmo build\",\n \"+folder\": \"kosmo folder\",\n },\n dependencies: {\n \"@kosmojs/api\": SEMVER,\n qs: self.devDependencies.qs,\n ...assets?.dependencies,\n },\n devDependencies: {\n \"@kosmojs/config\": SEMVER,\n \"@kosmojs/dev\": SEMVER,\n \"@types/node\": self.devDependencies[\"@types/node\"],\n \"@types/qs\": self.devDependencies[\"@types/qs\"],\n esbuild: self.dependencies.esbuild,\n tslib: self.devDependencies.tslib,\n typescript: self.dependencies.typescript,\n vite: self.devDependencies.vite,\n ...assets?.devDependencies,\n },\n pnpm: {\n onlyBuiltDependencies: [\"esbuild\"],\n },\n };\n\n const esbuildJson = {\n bundle: true,\n platform: \"node\",\n target: `node${assets?.NODE_VERSION || NODE_VERSION}`,\n format: \"esm\",\n packages: \"external\",\n sourcemap: \"linked\",\n logLevel: \"info\",\n };\n\n const projectPath = resolve(path, project.name);\n\n if (await pathExists(projectPath)) {\n throw new Error(`${project.name} already exists`);\n }\n\n await copyFiles(TPL_DIR, projectPath, {\n exclude: [/@src/, /.+\\.hbs/],\n });\n\n for (const [file, template] of [\n [\"vite.base.ts\", viteBaseTpl],\n [\"esbuild.json\", JSON.stringify(esbuildJson, null, 2)],\n [\"package.json\", JSON.stringify(packageJson, null, 2)],\n [\"tsconfig.json\", JSON.stringify(tsconfigJson, null, 2)],\n ]) {\n await renderToFile(resolve(projectPath, file), template, {\n defaults,\n distDir: project.distDir || DEFAULT_DIST,\n });\n }\n};\n\nexport const createSourceFolder = async (\n projectRoot: string, // path inside project\n folder: SourceFolder,\n opt?: {\n frameworkOptions?: Record<string, unknown>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n },\n) => {\n const folderPath = resolve(projectRoot, folder.name);\n\n if (await pathExists(folderPath)) {\n throw new Error(`${folder.name} already exists`);\n }\n\n await copyFiles(resolve(TPL_DIR, \"@src\"), folderPath, {\n exclude: [/.+\\.hbs/],\n });\n\n const packageFile = resolve(projectRoot, \"package.json\");\n\n const packageImport = await import(packageFile, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const tsconfigFile = resolve(projectRoot, \"tsconfig.json\");\n\n const tsconfigImport = await import(tsconfigFile, {\n with: { type: \"json\" },\n }).then((e) => e.default);\n\n const compilerOptions = {\n ...tsconfigImport?.compilerOptions,\n // instruct TypeScript to preserve JSX\n jsx: \"preserve\",\n };\n\n const plugins: Array<Plugin> = [];\n const generators: Array<Generator> = [];\n\n const dependencies: Record<string, string> = {};\n const devDependencies: Record<string, string> = {};\n\n const framework: SourceFolder[\"framework\"] =\n folder.framework || DEFAULT_FRAMEWORK;\n\n if (framework === \"solid\") {\n Object.assign(dependencies, {\n \"@solidjs/router\": self.devDependencies[\"@solidjs/router\"],\n \"solid-js\": self.devDependencies[\"solid-js\"],\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/solid-generator\": SEMVER,\n \"vite-plugin-solid\": self.devDependencies[\"vite-plugin-solid\"],\n });\n\n plugins.push({\n importDeclaration: `import solidPlugin from \"vite-plugin-solid\";`,\n importName: \"solidPlugin\",\n options: folder.ssr ? \"{ ssr: true }\" : \"\",\n });\n\n generators.push({\n importDeclaration: `import solidGenerator from \"@kosmojs/solid-generator\";`,\n importName: \"solidGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n\n compilerOptions.jsxImportSource = \"solid-js\";\n } else if (framework === \"react\") {\n Object.assign(dependencies, {\n react: self.devDependencies.react,\n \"react-router\": self.devDependencies[\"react-router\"],\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/react-generator\": SEMVER,\n \"@vitejs/plugin-react\": self.devDependencies[\"@vitejs/plugin-react\"],\n \"@types/react\": self.devDependencies[\"@types/react\"],\n \"@types/react-dom\": self.devDependencies[\"@types/react-dom\"],\n \"react-dom\": self.devDependencies[\"react-dom\"],\n });\n\n plugins.push({\n importDeclaration: `import reactPlugin from \"@vitejs/plugin-react\";`,\n importName: \"reactPlugin\",\n options: \"\",\n });\n\n generators.push({\n importDeclaration: `import reactGenerator from \"@kosmojs/react-generator\";`,\n importName: \"reactGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n\n compilerOptions.jsxImportSource = \"react\";\n } else if (framework === \"vue\") {\n Object.assign(dependencies, {\n \"vue-router\": self.devDependencies[\"vue-router\"],\n vue: self.devDependencies.vue,\n });\n\n Object.assign(devDependencies, {\n \"@kosmojs/vue-generator\": SEMVER,\n \"@vitejs/plugin-vue\": self.devDependencies[\"@vitejs/plugin-vue\"],\n });\n\n plugins.push({\n importDeclaration: `import vuePlugin from \"@vitejs/plugin-vue\";`,\n importName: \"vuePlugin\",\n options: \"\",\n });\n\n generators.push({\n importDeclaration: `import vueGenerator from \"@kosmojs/vue-generator\";`,\n importName: \"vueGenerator\",\n options: opt?.frameworkOptions\n ? JSON.stringify(opt.frameworkOptions, null, 2)\n : \"\",\n });\n }\n\n if (folder.ssr) {\n generators.push({\n importDeclaration: `import ssrGenerator from \"@kosmojs/ssr-generator\";`,\n importName: \"ssrGenerator\",\n options: \"\",\n });\n Object.assign(dependencies, {\n \"path-to-regexp\": self.devDependencies[\"path-to-regexp\"],\n });\n Object.assign(devDependencies, {\n \"@kosmojs/ssr-generator\": SEMVER,\n });\n }\n\n const context = {\n folder: {\n base: DEFAULT_BASE,\n port: DEFAULT_PORT,\n ...folder,\n },\n defaults,\n plugins,\n generators,\n importPathmap: {\n core: [defaults.appPrefix, defaults.coreDir, defaults.apiDir].join(\"/\"),\n lib: [folder.name, defaults.apiLibDir].join(\"/\"),\n },\n };\n\n for (const [file, template] of [\n [`${defaults.configDir}/index.ts`, srcConfigTpl],\n [`${defaults.apiDir}/app.ts`, srcApiAppTpl],\n [`${defaults.apiDir}/router.ts`, srcApiRouterTpl],\n [`${defaults.apiDir}/server.ts`, srcApiServerTpl],\n [`${defaults.apiDir}/use.ts`, srcApiUseTpl],\n [\"vite.config.ts\", srcViteConfigTpl],\n // stub files for initial build to pass;\n // generators will fill them with appropriate content.\n [`${defaults.apiDir}/index/index.ts`, \"\"],\n ...([\"solid\", \"react\"].includes(framework)\n ? [\n [`${defaults.pagesDir}/index/index.tsx`, \"\"],\n [`${defaults.entryDir}/client.tsx`, \"\"],\n ]\n : []),\n ...([\"vue\"].includes(framework)\n ? [\n [`${defaults.pagesDir}/index/index.vue`, \"\"],\n [`${defaults.entryDir}/client.ts`, \"\"],\n ]\n : []),\n ]) {\n await renderToFile(resolve(folderPath, file), template, context);\n }\n\n const tsconfigUpdated = {\n ...tsconfigJson,\n ...tsconfigImport,\n compilerOptions: {\n ...compilerOptions,\n paths: {\n ...compilerOptions?.paths,\n [`${folder.name}/*`]: [\n `./${folder.name}/*`,\n `./${defaults.libDir}/${folder.name}/*`,\n ],\n },\n },\n };\n\n await writeFile(\n tsconfigFile,\n JSON.stringify(tsconfigUpdated, null, 2),\n \"utf8\",\n );\n\n const packageUpdated = {\n ...packageImport,\n dependencies: {\n ...packageImport.dependencies,\n ...dependencies,\n ...opt?.dependencies,\n },\n devDependencies: {\n ...packageImport.devDependencies,\n ...devDependencies,\n ...opt?.devDependencies,\n },\n };\n\n await writeFile(packageFile, JSON.stringify(packageUpdated, null, 2));\n};\n", "import createApp from \"{{importPathmap.core}}/app\";\n\nimport router from \"./router\";\n\nexport default () => {\n const app = createApp();\n\n // routes goes latest\n app.use(router.routes());\n\n return app;\n};\n\n/**\n * In dev mode, determines whether to pass the request to API handler or to Vite.\nexport const devMiddlewareFactory: import(\"@kosmojs/api\").DevMiddlewareFactory = (\n app,\n) => {\n return (req, res, next) => {\n return req.url?.startsWith(\"...\")\n ? app?.callback()(req, res) // send request to api handler\n : next(); // send request to vite dev server\n };\n};\n * */\n\n/**\n * In dev mode, used to cleanup before reloading api handler.\nexport const teardownHandler: import(\"@kosmojs/api\").TeardownHandler = () => {\n // close db connections, server sockets etc.\n};\n * */\n", "import { routerRoutes } from \"{{importPathmap.lib}}\";\n\nimport createRouter from \"{{importPathmap.core}}/router\";\n\nconst router = createRouter();\n\nfor (const { name, path, methods, middleware } of routerRoutes) {\n router.register(path, methods, middleware, { name });\n}\n\nexport default router;\n", "import createServer from \"{{importPathmap.core}}/server\";\nimport createApp from \"./app\";\n\ncreateServer(createApp);\n", "import globalMiddleware from \"{{defaults.appPrefix}}/core/api/use\";\n\nexport default [\n // Global middleware applied to all routes\n ...globalMiddleware,\n];\n", "export const baseurl = \"{{folder.base}}\";\nexport const apiurl = \"/api\"; // relative to baseurl\n", "import { join } from \"node:path\";\n\n{{#each plugins}}{{importDeclaration}}\n{{/each}}\nimport devPlugin, { apiGenerator, fetchGenerator } from \"@kosmojs/dev\";\n{{#each generators}}{{importDeclaration}}\n{{/each}}\n\nimport defineConfig from \"../vite.base\";\nimport { apiurl, baseurl } from \"./config\";\n\nexport default defineConfig(import.meta.dirname, {\n base: join(baseurl, \"/\"),\n server: {\n port: {{folder.port}},\n },\n plugins: [\n {{#each plugins}}{{importName}}({{options}}),\n {{/each}}\n devPlugin(apiurl, {\n generators: [\n apiGenerator(),\n fetchGenerator(),\n {{#each generators}}{{importName}}({{options}}),\n {{/each}}\n ],\n }),\n ],\n});\n", "import { basename, resolve } from \"node:path\";\n\nimport { aliasPlugin, definePlugin } from \"@kosmojs/dev\";\nimport { loadEnv, mergeConfig, type UserConfig } from \"vite\";\n\nimport pkg from \"./package.json\" with { type: \"json\" };\n\nexport default async (sourceFolderPath: string, config: UserConfig) => {\n const env = loadEnv(\"mock\", import.meta.dirname);\n const sourceFolder = basename(sourceFolderPath);\n return mergeConfig(config, {\n build: {\n outDir: resolve(import.meta.dirname, `${pkg.distDir}/${sourceFolder}`),\n emptyOutDir: true,\n sourcemap: true,\n },\n\n server: {\n host: true,\n allowedHosts: [env.VITE_HOSTNAME],\n fs: {\n strict: false,\n },\n watch: {\n awaitWriteFinish: {\n stabilityThreshold: 800,\n pollInterval: 200,\n },\n },\n },\n\n cacheDir: resolve(import.meta.dirname, `var/.vite/${sourceFolder}`),\n\n plugins: [\n aliasPlugin(import.meta.dirname),\n definePlugin([\n {\n // keys extracted from process.env and exposed to client\n keys: [\"DEBUG\"],\n },\n ]),\n ],\n });\n};\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,QAAQ,WAAW,UAAU;AACtC,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAYnB,IAAM,iBAAiB,CAAC,WAAW,QAAQ;AAE3C,IAAM,oBAAoB,CAAC,QAAQ,SAAS,SAAS,KAAK;AAE1D,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,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;;;AC5LA,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AAUxB,OAAO,UAAU,4BAA4B,KAAK,EAAE,MAAM,OAAO;AACjE,SAAS,UAAU,oBAAoB;;;ACZvC;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;APkCA,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;AAExB,IAAM,gBAAgB,OAC3B,MACA,SACA,WAKG;AACH,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,SAAS,QAAQ,WAAW;AAAA,IAC5B,SAAS;AAAA,MACP,KAAK;AAAA,MACL,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACZ,gBAAgB;AAAA,MAChB,IAAI,KAAK,gBAAgB;AAAA,MACzB,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,iBAAiB;AAAA,MACf,mBAAmB;AAAA,MACnB,gBAAgB;AAAA,MAChB,eAAe,KAAK,gBAAgB,aAAa;AAAA,MACjD,aAAa,KAAK,gBAAgB,WAAW;AAAA,MAC7C,SAAS,KAAK,aAAa;AAAA,MAC3B,OAAO,KAAK,gBAAgB;AAAA,MAC5B,YAAY,KAAK,aAAa;AAAA,MAC9B,MAAM,KAAK,gBAAgB;AAAA,MAC3B,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,MAAM;AAAA,MACJ,uBAAuB,CAAC,SAAS;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ,OAAO,QAAQ,gBAAgB,YAAY;AAAA,IACnD,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,QAAM,cAAc,QAAQ,MAAM,QAAQ,IAAI;AAE9C,MAAI,MAAM,WAAW,WAAW,GAAG;AACjC,UAAM,IAAI,MAAM,GAAG,QAAQ,IAAI,iBAAiB;AAAA,EAClD;AAEA,QAAM,UAAU,SAAS,aAAa;AAAA,IACpC,SAAS,CAAC,QAAQ,SAAS;AAAA,EAC7B,CAAC;AAED,aAAW,CAAC,MAAM,QAAQ,KAAK;AAAA,IAC7B,CAAC,gBAAgB,iBAAW;AAAA,IAC5B,CAAC,gBAAgB,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,IACrD,CAAC,gBAAgB,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAAA,IACrD,CAAC,iBAAiB,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AAAA,EACzD,GAAG;AACD,UAAM,aAAa,QAAQ,aAAa,IAAI,GAAG,UAAU;AAAA,MACvD;AAAA,MACA,SAAS,QAAQ,WAAW;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AAEO,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,QAAM,cAAc,QAAQ,aAAa,cAAc;AAEvD,QAAM,gBAAgB,MAAM,OAAO,aAAa;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,WAAW,cAAc,OAAO;AAC9B,WAAO,OAAO,cAAc;AAAA,MAC1B,cAAc,KAAK,gBAAgB,YAAY;AAAA,MAC/C,KAAK,KAAK,gBAAgB;AAAA,IAC5B,CAAC;AAED,WAAO,OAAO,iBAAiB;AAAA,MAC7B,0BAA0B;AAAA,MAC1B,sBAAsB,KAAK,gBAAgB,oBAAoB;AAAA,IACjE,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;AAAA,EACH;AAEA,MAAI,OAAO,KAAK;AACd,eAAW,KAAK;AAAA,MACd,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AACD,WAAO,OAAO,cAAc;AAAA,MAC1B,kBAAkB,KAAK,gBAAgB,gBAAgB;AAAA,IACzD,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,IACL,GAAI,CAAC,KAAK,EAAE,SAAS,SAAS,IAC1B;AAAA,MACE,CAAC,GAAG,SAAS,QAAQ,oBAAoB,EAAE;AAAA,MAC3C,CAAC,GAAG,SAAS,QAAQ,cAAc,EAAE;AAAA,IACvC,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,UAAU,aAAa,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AACtE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/pkg/index.js
CHANGED
|
@@ -147,7 +147,7 @@ var api_handler_default = async (options) => {
|
|
|
147
147
|
};
|
|
148
148
|
|
|
149
149
|
// src/base-plugin/routes.ts
|
|
150
|
-
import { dirname, join as join2, resolve as resolve4 } from "node:path";
|
|
150
|
+
import { dirname as dirname2, join as join2, resolve as resolve4 } from "node:path";
|
|
151
151
|
import crc3 from "crc/crc32";
|
|
152
152
|
import picomatch from "picomatch";
|
|
153
153
|
import { glob as glob2 } from "tinyglobby";
|
|
@@ -415,11 +415,11 @@ var typeResolverFactory = ({ appRoot }) => {
|
|
|
415
415
|
};
|
|
416
416
|
|
|
417
417
|
// src/base-plugin/cache.ts
|
|
418
|
-
import {
|
|
418
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
419
|
+
import { dirname, resolve as resolve3 } from "node:path";
|
|
419
420
|
import crc2 from "crc/crc32";
|
|
420
|
-
import fsx from "fs-extra";
|
|
421
421
|
import self from "@kosmojs/dev/package.json" with { type: "json" };
|
|
422
|
-
import { pathResolver } from "@kosmojs/devlib";
|
|
422
|
+
import { pathExists, pathResolver } from "@kosmojs/devlib";
|
|
423
423
|
var cacheFactory = (route, {
|
|
424
424
|
appRoot,
|
|
425
425
|
sourceFolder,
|
|
@@ -430,9 +430,9 @@ var cacheFactory = (route, {
|
|
|
430
430
|
sourceFolder
|
|
431
431
|
}).resolve("apiLibDir", route.importPath, "cache.json");
|
|
432
432
|
const getCache = async (opt) => {
|
|
433
|
-
if (await
|
|
433
|
+
if (await pathExists(cacheFile)) {
|
|
434
434
|
try {
|
|
435
|
-
const cache = JSON.parse(await
|
|
435
|
+
const cache = JSON.parse(await readFile(cacheFile, "utf8"));
|
|
436
436
|
return opt?.validate ? validateCache(cache) : cache;
|
|
437
437
|
} catch (_e) {
|
|
438
438
|
}
|
|
@@ -455,7 +455,8 @@ var cacheFactory = (route, {
|
|
|
455
455
|
] = await generateFileHash(file);
|
|
456
456
|
}
|
|
457
457
|
const cache = { ...rest, hash, referencedFiles };
|
|
458
|
-
await
|
|
458
|
+
await mkdir(dirname(cacheFile), { recursive: true });
|
|
459
|
+
await writeFile(cacheFile, JSON.stringify(cache, null, 2), "utf8");
|
|
459
460
|
return cache;
|
|
460
461
|
};
|
|
461
462
|
const validateCache = async (cache) => {
|
|
@@ -487,7 +488,7 @@ var cacheFactory = (route, {
|
|
|
487
488
|
var generateFileHash = async (file, extraContext) => {
|
|
488
489
|
let fileContent;
|
|
489
490
|
try {
|
|
490
|
-
fileContent = await
|
|
491
|
+
fileContent = await readFile(file, "utf8");
|
|
491
492
|
} catch (_e) {
|
|
492
493
|
return 0;
|
|
493
494
|
}
|
|
@@ -509,6 +510,43 @@ var resolved_types_default = "{{#each resolvedTypes}}\nexport type {{name}} = {{
|
|
|
509
510
|
var types_default = '{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n "{{name}}"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n';
|
|
510
511
|
|
|
511
512
|
// src/base-plugin/routes.ts
|
|
513
|
+
var API_INDEX_PATTERN = "index.ts";
|
|
514
|
+
var PAGE_INDEX_PATTERN = "index.{tsx,vue}";
|
|
515
|
+
var ROUTE_FILE_PATTERNS = [
|
|
516
|
+
`${defaults2.apiDir}/**/${API_INDEX_PATTERN}`,
|
|
517
|
+
`${defaults2.pagesDir}/**/${PAGE_INDEX_PATTERN}`
|
|
518
|
+
];
|
|
519
|
+
var resolveRouteFile = (file, { appRoot, sourceFolder }) => {
|
|
520
|
+
const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
|
|
521
|
+
if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
return picomatch.isMatch(join2(folder, ...rest), ROUTE_FILE_PATTERNS) ? [folder, rest.join("/")] : void 0;
|
|
525
|
+
};
|
|
526
|
+
var resolveRouteEntry = (_file, { appRoot, sourceFolder }) => {
|
|
527
|
+
const resolvedPaths = resolveRouteFile(_file, { appRoot, sourceFolder });
|
|
528
|
+
if (!resolvedPaths) {
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
const [folder, file] = resolvedPaths;
|
|
532
|
+
const fileFullpath = join2(appRoot, sourceFolder, folder, file);
|
|
533
|
+
const pathTokens = pathTokensFactory(dirname2(file));
|
|
534
|
+
const name = pathTokens.map((e) => e.orig).join("/");
|
|
535
|
+
const importPath = dirname2(file);
|
|
536
|
+
const importName = [
|
|
537
|
+
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
538
|
+
crc3(importPath)
|
|
539
|
+
].join("_");
|
|
540
|
+
return {
|
|
541
|
+
name,
|
|
542
|
+
folder,
|
|
543
|
+
file,
|
|
544
|
+
fileFullpath,
|
|
545
|
+
pathTokens,
|
|
546
|
+
importPath,
|
|
547
|
+
importName
|
|
548
|
+
};
|
|
549
|
+
};
|
|
512
550
|
var routes_default = async (pluginOptions) => {
|
|
513
551
|
const {
|
|
514
552
|
appRoot,
|
|
@@ -529,44 +567,11 @@ var routes_default = async (pluginOptions) => {
|
|
|
529
567
|
getSourceFile,
|
|
530
568
|
refreshSourceFile
|
|
531
569
|
} = typeResolverFactory(pluginOptions);
|
|
532
|
-
const routeFilePatterns = [
|
|
533
|
-
`${defaults2.apiDir}/**/index.ts`,
|
|
534
|
-
`${defaults2.pagesDir}/**/index.{ts,tsx,vue,svelte}`
|
|
535
|
-
];
|
|
536
|
-
const resolveRouteFile = (file) => {
|
|
537
|
-
const [_sourceFolder, folder, ...rest] = resolve4(appRoot, file).replace(`${appRoot}/`, "").split("/");
|
|
538
|
-
if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {
|
|
539
|
-
return;
|
|
540
|
-
}
|
|
541
|
-
return picomatch.isMatch(join2(folder, ...rest), routeFilePatterns) ? [folder, rest.join("/")] : void 0;
|
|
542
|
-
};
|
|
543
570
|
const resolversFactory = (routeFiles2) => {
|
|
544
571
|
const resolvers = /* @__PURE__ */ new Map();
|
|
545
|
-
const entries = routeFiles2.flatMap((
|
|
546
|
-
const
|
|
547
|
-
|
|
548
|
-
return [];
|
|
549
|
-
}
|
|
550
|
-
const [folder, file] = resolvedPaths;
|
|
551
|
-
const fileFullpath = join2(appRoot, sourceFolder, folder, file);
|
|
552
|
-
const pathTokens = pathTokensFactory(dirname(file));
|
|
553
|
-
const name = pathTokens.map((e) => e.orig).join("/");
|
|
554
|
-
const importPath = dirname(file);
|
|
555
|
-
const importName = [
|
|
556
|
-
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
557
|
-
crc3(importPath)
|
|
558
|
-
].join("_");
|
|
559
|
-
return [
|
|
560
|
-
{
|
|
561
|
-
name,
|
|
562
|
-
folder,
|
|
563
|
-
file,
|
|
564
|
-
fileFullpath,
|
|
565
|
-
pathTokens,
|
|
566
|
-
importPath,
|
|
567
|
-
importName
|
|
568
|
-
}
|
|
569
|
-
];
|
|
572
|
+
const entries = routeFiles2.flatMap((file) => {
|
|
573
|
+
const entry = resolveRouteEntry(file, pluginOptions);
|
|
574
|
+
return entry ? [entry] : [];
|
|
570
575
|
});
|
|
571
576
|
for (const entry of entries.filter((e) => e.folder === defaults2.apiDir)) {
|
|
572
577
|
const {
|
|
@@ -609,7 +614,7 @@ var routes_default = async (pluginOptions) => {
|
|
|
609
614
|
withReferencedFiles: true,
|
|
610
615
|
sourceFile: getSourceFile(fileFullpath),
|
|
611
616
|
relpathResolver(path) {
|
|
612
|
-
return join2(sourceFolder, defaults2.apiDir,
|
|
617
|
+
return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
|
|
613
618
|
}
|
|
614
619
|
}
|
|
615
620
|
);
|
|
@@ -745,19 +750,18 @@ var routes_default = async (pluginOptions) => {
|
|
|
745
750
|
}
|
|
746
751
|
return resolvers;
|
|
747
752
|
};
|
|
748
|
-
const routeFiles = await glob2(
|
|
753
|
+
const routeFiles = await glob2(ROUTE_FILE_PATTERNS, {
|
|
749
754
|
cwd: resolve4(appRoot, sourceFolder),
|
|
750
755
|
absolute: true,
|
|
751
756
|
onlyFiles: true,
|
|
752
757
|
ignore: [
|
|
753
|
-
`${defaults2.apiDir}
|
|
754
|
-
`${defaults2.pagesDir}
|
|
758
|
+
`${defaults2.apiDir}/${API_INDEX_PATTERN}`,
|
|
759
|
+
`${defaults2.pagesDir}/${PAGE_INDEX_PATTERN}`
|
|
755
760
|
]
|
|
756
761
|
});
|
|
757
762
|
return {
|
|
758
763
|
resolvers: resolversFactory(routeFiles),
|
|
759
|
-
resolversFactory
|
|
760
|
-
resolveRouteFile
|
|
764
|
+
resolversFactory
|
|
761
765
|
};
|
|
762
766
|
};
|
|
763
767
|
|
|
@@ -973,8 +977,9 @@ var base_plugin_default = (apiurl, pluginOptions) => {
|
|
|
973
977
|
};
|
|
974
978
|
|
|
975
979
|
// src/define-plugin/index.ts
|
|
980
|
+
import { readFile as readFile2 } from "node:fs/promises";
|
|
976
981
|
import { parse as dotenv } from "dotenv";
|
|
977
|
-
import
|
|
982
|
+
import { pathExists as pathExists2 } from "@kosmojs/devlib";
|
|
978
983
|
var define_plugin_default = (entries) => {
|
|
979
984
|
return {
|
|
980
985
|
name: "@kosmojs:definePlugin",
|
|
@@ -982,7 +987,8 @@ var define_plugin_default = (entries) => {
|
|
|
982
987
|
const define = {};
|
|
983
988
|
for (const { keys, file, defineOn = "process.env", use } of entries) {
|
|
984
989
|
define[defineOn] = {};
|
|
985
|
-
const
|
|
990
|
+
const fileExists = file ? await pathExists2(file) : false;
|
|
991
|
+
const env = fileExists ? dotenv(await readFile2(file, "utf8")) : process.env;
|
|
986
992
|
for (const [key, val] of Object.entries(env)) {
|
|
987
993
|
if (keys.includes(key)) {
|
|
988
994
|
define[`${defineOn}.${key}`] = JSON.stringify(val);
|