@kosmojs/dev 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +34 -13
- package/pkg/base-plugin/routes.js +12 -11
- package/pkg/base-plugin/routes.js.map +3 -3
- package/pkg/base-plugin/worker.js +12 -11
- package/pkg/base-plugin/worker.js.map +3 -3
- package/pkg/cli/cli.js +589 -0
- package/pkg/cli/cli.js.map +7 -0
- package/pkg/cli/index.js +431 -0
- package/pkg/cli/index.js.map +7 -0
- package/pkg/cli/templates/.env +1 -0
- package/pkg/cli/templates/@src/api/app.hbs +32 -0
- package/pkg/cli/templates/@src/api/router.hbs +11 -0
- package/pkg/cli/templates/@src/api/server.hbs +4 -0
- package/pkg/cli/templates/@src/api/use.hbs +6 -0
- package/pkg/cli/templates/@src/config/index.hbs +2 -0
- package/pkg/cli/templates/@src/index.html +4 -0
- package/pkg/cli/templates/@src/vite.config.hbs +29 -0
- package/pkg/cli/templates/core/api/app.ts +6 -0
- package/pkg/cli/templates/core/api/env.d.ts +4 -0
- package/pkg/cli/templates/core/api/router.ts +6 -0
- package/pkg/cli/templates/core/api/server.ts +49 -0
- package/pkg/cli/templates/core/api/use.ts +21 -0
- package/pkg/cli/templates/vite.base.hbs +44 -0
- package/pkg/index.js +16 -13
- package/pkg/index.js.map +3 -3
- package/pkg/src/cli/base.d.ts +30 -0
- package/pkg/src/cli/cli.d.ts +2 -0
- package/pkg/src/cli/factory.d.ts +12 -0
- package/pkg/src/cli/index.d.ts +2 -0
- package/pkg/src/cli/templates/core/api/app.d.ts +3 -0
- package/pkg/src/cli/templates/core/api/router.d.ts +3 -0
- package/pkg/src/cli/templates/core/api/server.d.ts +3 -0
- package/pkg/src/cli/templates/core/api/use.d.ts +2 -0
- package/pkg/stub-generator/index.js +1 -1
- package/pkg/stub-generator/index.js.map +1 -1
- package/pkg/test/cli/create.test.d.ts +1 -0
- package/pkg/test/setup.d.ts +1 -0
- package/pkg/cli.js +0 -3
- package/pkg/cli.js.map +0 -7
- package/pkg/src/cli.d.ts +0 -1
|
@@ -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,29 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
|
|
3
|
+
{{#each plugins}}{{importDeclaration}}
|
|
4
|
+
{{/each}}
|
|
5
|
+
import devPlugin, { apiGenerator, fetchGenerator } from "@kosmojs/dev";
|
|
6
|
+
{{#each generators}}{{importDeclaration}}
|
|
7
|
+
{{/each}}
|
|
8
|
+
|
|
9
|
+
import defineConfig from "../vite.base";
|
|
10
|
+
import { apiurl, baseurl } from "./config";
|
|
11
|
+
|
|
12
|
+
export default defineConfig(import.meta.dirname, {
|
|
13
|
+
base: join(baseurl, "/"),
|
|
14
|
+
server: {
|
|
15
|
+
port: {{folder.port}},
|
|
16
|
+
},
|
|
17
|
+
plugins: [
|
|
18
|
+
{{#each plugins}}{{importName}}({{options}}),
|
|
19
|
+
{{/each}}
|
|
20
|
+
devPlugin(apiurl, {
|
|
21
|
+
generators: [
|
|
22
|
+
apiGenerator(),
|
|
23
|
+
fetchGenerator(),
|
|
24
|
+
{{#each generators}}{{importName}}({{options}}),
|
|
25
|
+
{{/each}}
|
|
26
|
+
],
|
|
27
|
+
}),
|
|
28
|
+
],
|
|
29
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { chmod, unlink } from "node:fs/promises";
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
|
|
4
|
+
import type { App } from "@kosmojs/api";
|
|
5
|
+
|
|
6
|
+
const {
|
|
7
|
+
values: { port, sock },
|
|
8
|
+
} = parseArgs({
|
|
9
|
+
options: {
|
|
10
|
+
port: {
|
|
11
|
+
type: "string",
|
|
12
|
+
short: "p",
|
|
13
|
+
},
|
|
14
|
+
sock: {
|
|
15
|
+
type: "string",
|
|
16
|
+
short: "s",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (![port, sock].some((e) => e)) {
|
|
22
|
+
console.error("Please provide either -p/--port number or -s/--sock path");
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
console.log("\n ➜ Starting Server", { port, sock });
|
|
27
|
+
|
|
28
|
+
if (sock) {
|
|
29
|
+
await unlink(sock).catch((error) => {
|
|
30
|
+
if (error.code === "ENOENT") {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.error(error.message);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export default async <T extends App = App>(
|
|
39
|
+
createApp: () => T | Promise<T>,
|
|
40
|
+
): Promise<import("node:http").Server> => {
|
|
41
|
+
const app = await createApp();
|
|
42
|
+
// app.listen is returning the actual server
|
|
43
|
+
return app.listen(port || sock, async () => {
|
|
44
|
+
if (sock) {
|
|
45
|
+
await chmod(sock, 0o777);
|
|
46
|
+
}
|
|
47
|
+
console.log("\n ➜ Server Started ✨\n");
|
|
48
|
+
});
|
|
49
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { use } from "@kosmojs/api";
|
|
2
|
+
import bodyparser from "@kosmojs/api/bodyparser";
|
|
3
|
+
|
|
4
|
+
// Middleware applied to all routes by default.
|
|
5
|
+
// Can be overridden on a per-route basis using the slot key.
|
|
6
|
+
export default [
|
|
7
|
+
use(bodyparser.json(), {
|
|
8
|
+
on: ["POST", "PUT", "PATCH"],
|
|
9
|
+
slot: "bodyparser",
|
|
10
|
+
}),
|
|
11
|
+
|
|
12
|
+
use(
|
|
13
|
+
(ctx, next) => {
|
|
14
|
+
ctx.payload = ["POST", "PUT", "PATCH"].includes(ctx.method)
|
|
15
|
+
? ctx.request.body
|
|
16
|
+
: ctx.query;
|
|
17
|
+
return next();
|
|
18
|
+
},
|
|
19
|
+
{ slot: "payload" },
|
|
20
|
+
),
|
|
21
|
+
];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { basename, resolve } from "node:path";
|
|
2
|
+
|
|
3
|
+
import { aliasPlugin, definePlugin } from "@kosmojs/dev";
|
|
4
|
+
import { loadEnv, mergeConfig, type UserConfig } from "vite";
|
|
5
|
+
|
|
6
|
+
import pkg from "./package.json" with { type: "json" };
|
|
7
|
+
|
|
8
|
+
export default async (sourceFolderPath: string, config: UserConfig) => {
|
|
9
|
+
const env = loadEnv("mock", import.meta.dirname);
|
|
10
|
+
const sourceFolder = basename(sourceFolderPath);
|
|
11
|
+
return mergeConfig(config, {
|
|
12
|
+
build: {
|
|
13
|
+
outDir: resolve(import.meta.dirname, `${pkg.distDir}/${sourceFolder}`),
|
|
14
|
+
emptyOutDir: true,
|
|
15
|
+
sourcemap: true,
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
server: {
|
|
19
|
+
host: true,
|
|
20
|
+
allowedHosts: [env.VITE_HOSTNAME],
|
|
21
|
+
fs: {
|
|
22
|
+
strict: false,
|
|
23
|
+
},
|
|
24
|
+
watch: {
|
|
25
|
+
awaitWriteFinish: {
|
|
26
|
+
stabilityThreshold: 800,
|
|
27
|
+
pollInterval: 200,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
cacheDir: resolve(import.meta.dirname, `var/.vite/${sourceFolder}`),
|
|
33
|
+
|
|
34
|
+
plugins: [
|
|
35
|
+
aliasPlugin(import.meta.dirname),
|
|
36
|
+
definePlugin([
|
|
37
|
+
{
|
|
38
|
+
// keys extracted from process.env and exposed to client
|
|
39
|
+
keys: ["DEBUG"],
|
|
40
|
+
},
|
|
41
|
+
]),
|
|
42
|
+
],
|
|
43
|
+
});
|
|
44
|
+
};
|
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
|
}
|
|
@@ -549,9 +550,9 @@ var routes_default = async (pluginOptions) => {
|
|
|
549
550
|
}
|
|
550
551
|
const [folder, file] = resolvedPaths;
|
|
551
552
|
const fileFullpath = join2(appRoot, sourceFolder, folder, file);
|
|
552
|
-
const pathTokens = pathTokensFactory(
|
|
553
|
+
const pathTokens = pathTokensFactory(dirname2(file));
|
|
553
554
|
const name = pathTokens.map((e) => e.orig).join("/");
|
|
554
|
-
const importPath =
|
|
555
|
+
const importPath = dirname2(file);
|
|
555
556
|
const importName = [
|
|
556
557
|
importPath.split(/\[/)[0].replace(/^\W+|\W+$/g, "").replace(/\W+/g, "_"),
|
|
557
558
|
crc3(importPath)
|
|
@@ -609,7 +610,7 @@ var routes_default = async (pluginOptions) => {
|
|
|
609
610
|
withReferencedFiles: true,
|
|
610
611
|
sourceFile: getSourceFile(fileFullpath),
|
|
611
612
|
relpathResolver(path) {
|
|
612
|
-
return join2(sourceFolder, defaults2.apiDir,
|
|
613
|
+
return join2(sourceFolder, defaults2.apiDir, dirname2(file), path);
|
|
613
614
|
}
|
|
614
615
|
}
|
|
615
616
|
);
|
|
@@ -973,8 +974,9 @@ var base_plugin_default = (apiurl, pluginOptions) => {
|
|
|
973
974
|
};
|
|
974
975
|
|
|
975
976
|
// src/define-plugin/index.ts
|
|
977
|
+
import { readFile as readFile2 } from "node:fs/promises";
|
|
976
978
|
import { parse as dotenv } from "dotenv";
|
|
977
|
-
import
|
|
979
|
+
import { pathExists as pathExists2 } from "@kosmojs/devlib";
|
|
978
980
|
var define_plugin_default = (entries) => {
|
|
979
981
|
return {
|
|
980
982
|
name: "@kosmojs:definePlugin",
|
|
@@ -982,7 +984,8 @@ var define_plugin_default = (entries) => {
|
|
|
982
984
|
const define = {};
|
|
983
985
|
for (const { keys, file, defineOn = "process.env", use } of entries) {
|
|
984
986
|
define[defineOn] = {};
|
|
985
|
-
const
|
|
987
|
+
const fileExists = file ? await pathExists2(file) : false;
|
|
988
|
+
const env = fileExists ? dotenv(await readFile2(file, "utf8")) : process.env;
|
|
986
989
|
for (const [key, val] of Object.entries(env)) {
|
|
987
990
|
if (keys.includes(key)) {
|
|
988
991
|
define[`${defineOn}.${key}`] = JSON.stringify(val);
|
package/pkg/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/alias-plugin/index.ts", "../src/base-plugin/index.ts", "../src/base-plugin/api-handler.ts", "../src/base-plugin/routes.ts", "../src/base-plugin/ast.ts", "../src/base-plugin/cache.ts", "../src/base-plugin/templates/resolved-types.hbs", "../src/base-plugin/templates/types.hbs", "../src/base-plugin/spinner.ts", "../src/define-plugin/index.ts"],
|
|
4
|
-
"sourcesContent": ["export type { SSRFactory } from \"@kosmojs/devlib\";\n\nexport { default as apiGenerator } from \"@kosmojs/api-generator\";\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\n\nexport { default as aliasPlugin } from \"./alias-plugin\";\nexport { default } from \"./base-plugin\";\nexport { default as definePlugin } from \"./define-plugin\";\n", "import { glob } from \"tinyglobby\";\nimport type { Alias, Plugin } from \"vite\";\n\nexport default (\n appRoot: string,\n opt?: {\n ignore?: Array<string>;\n },\n): Plugin => {\n return {\n name: \"@kosmojs:aliasPlugin\",\n\n async config() {\n const compilerOptions: {\n paths: Record<string, Array<string>>;\n } = await import(`${appRoot}/tsconfig.json`, {\n with: { type: \"json\" },\n }).then((e) => e.default.compilerOptions);\n\n const aliasmap: Array<Alias> = [];\n\n const pathEntries = Object.entries({ ...compilerOptions?.paths });\n\n for (const [aliasPattern, pathPatterns] of pathEntries) {\n const alias = aliasPattern.replace(\"/*\", \"\");\n\n const paths = pathPatterns\n .map((e) => e.replace(\"/*\", \"\"))\n .sort((a, b) => a.split(/\\/+/).length - b.split(/\\/+/).length);\n\n if (paths.length === 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: `${appRoot}/${paths[0]}/`,\n });\n } else if (paths.length > 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: \"\",\n async customResolver(_src) {\n // escaping symbols that may break glob pattern matching\n const src = _src.replace(/(\\$|\\^|\\+|\\(|\\)|\\[|\\])/g, \"\\\\$1\");\n\n // Build a list of possible file resolution patterns for a given source path.\n // Covers explicit extensions, implicit extensions, and folder-based index files.\n const patterns = paths.flatMap((path) => [\n // Case 1: Extension is explicitly provided\n // e.g. import styles from \"@admin/{solid}/styles.module.css\"\n `${path}/${src}*`,\n\n // Case 2: No extension provided\n // Match any extension and return the first match\n `${path}/${src}.*`,\n\n // Case 3: Folder containing an index file of any extension\n `${path}/${src}/index.*`,\n ]);\n\n const [file] = await glob(patterns, {\n cwd: appRoot,\n onlyFiles: true,\n absolute: true,\n dot: true,\n followSymbolicLinks: false,\n braceExpansion: false,\n globstar: false,\n ignore: opt?.ignore || [\n \"**/.git/**\",\n \"**/node_modules/**\",\n \"**/public/**\",\n \"**/var/**\",\n ],\n });\n\n return file;\n },\n });\n }\n }\n\n return {\n resolve: {\n alias: aliasmap,\n },\n };\n },\n };\n};\n", "import { basename, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport { Worker } from \"node:worker_threads\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nimport type {\n GeneratorConstructor,\n PluginOptions,\n PluginOptionsResolved,\n RouteResolverEntry,\n} from \"@kosmojs/devlib\";\n\nimport apiGenerator from \"@kosmojs/api-generator\";\nimport stubGenerator from \"@kosmojs/dev/stub-generator\";\nimport fetchGenerator from \"@kosmojs/fetch-generator\";\n\nimport apiHandlerFactory from \"./api-handler\";\nimport routesFactory from \"./routes\";\nimport { type SpinnerFactory, spinnerFactory, withSpinner } from \"./spinner\";\nimport type { WorkerData, WorkerError, WorkerSpinner } from \"./worker\";\n\nexport default (apiurl: string, pluginOptions?: PluginOptions): Plugin => {\n const outDirSuffix = \"client\";\n\n const store: {\n config: ResolvedConfig;\n resolvedOptions: PluginOptionsResolved;\n } = {} as typeof store;\n\n const createWorker = () => {\n // Destructuring to separate common options from function-based ones.\n // Functions (e.g. generators, formatters) can't be passed to worker threads.\n const {\n generators = [],\n formatters = [],\n ...restOptions\n } = store.resolvedOptions;\n\n const generatorModules: WorkerData[\"generatorModules\"] = generators.map(\n (e) => [e.moduleImport, e.moduleConfig],\n );\n\n const formatterModules: WorkerData[\"formatterModules\"] =\n pluginOptions?.formatters\n ? pluginOptions.formatters.map((e) => [e.moduleImport, e.moduleConfig])\n : [];\n\n const workerData: WorkerData = {\n ...restOptions,\n generatorModules,\n formatterModules,\n };\n\n return new Worker(resolve(import.meta.dirname, \"base-plugin/worker.js\"), {\n workerData,\n env: {\n ...process.env,\n FORCE_COLOR: \"1\",\n },\n });\n };\n\n const workerHandler = (\n onReady?: () => Promise<void>,\n onExit?: () => Promise<void>,\n ) => {\n const worker = createWorker();\n\n const spinnerMap = new Map<string, SpinnerFactory>();\n\n worker.on(\"error\", async (error) => {\n console.error(error);\n });\n\n worker.on(\"exit\", async () => {\n await onExit?.();\n // TODO: revive worker only if it exited due to an error.\n // Note: worker.terminate() triggers an exit with code 1,\n // so it's not always possible to distinguish normal termination from a crash.\n });\n\n worker.on(\n \"message\",\n async (msg: { spinner?: WorkerSpinner; error?: WorkerError }) => {\n if (msg?.spinner) {\n const { id, startText, method, text } = msg.spinner;\n withSpinner(\n startText,\n (spinner) => {\n spinnerMap.set(id, spinner);\n spinner[method](text || \"\");\n if (method === \"succeed\" || method === \"failed\") {\n spinnerMap.delete(id);\n }\n },\n spinnerMap.get(id),\n );\n } else if (msg?.error) {\n const { error } = msg;\n if (error.stack) {\n const [message, ...stack] = error.stack.split(\"\\n\");\n console.error(styleText(\"red\", message));\n console.error(stack.join(\"\\n\"));\n } else if (error?.message) {\n console.error(`${styleText(\"red\", error?.name)}: ${error.message}`);\n } else {\n console.error(error);\n }\n }\n },\n );\n\n const readyHandler = async (msg: string) => {\n if (msg === \"ready\") {\n worker.off(\"message\", readyHandler);\n await onReady?.();\n }\n };\n\n worker.on(\"message\", readyHandler);\n\n return async () => {\n await worker.terminate();\n };\n };\n\n return {\n name: \"@kosmojs:basePlugin\",\n\n config(config) {\n if (!config.build?.outDir) {\n throw new Error(\"Incomplete config, missing build.outDir\");\n }\n return {\n build: {\n outDir: join(config.build.outDir, outDirSuffix),\n manifest: true,\n },\n };\n },\n\n async configResolved(_config) {\n store.config = _config;\n\n const appRoot = resolve(store.config.root, \"..\");\n const sourceFolder = basename(store.config.root);\n\n // removing outDirSuffix\n const outDir = resolve(appRoot, resolve(store.config.build.outDir, \"..\"));\n\n const { stabilityThreshold = 1000 } =\n typeof store.config.server.watch?.awaitWriteFinish === \"object\"\n ? store.config.server.watch.awaitWriteFinish\n : {};\n\n const watcher: PluginOptionsResolved[\"watcher\"] = {\n delay: stabilityThreshold,\n ...(store.config.server.watch\n ? { options: store.config.server.watch }\n : {}),\n };\n\n {\n const {\n generators = [],\n formatters = [],\n refineTypeName = \"TRefine\",\n } = { ...pluginOptions };\n\n const _apiGenerator = generators.find((e) => e.kind === \"api\");\n const _fetchGenerator = generators.find((e) => e.kind === \"fetch\");\n const _ssrGenerator = generators.find((e) => e.kind === \"ssr\");\n\n store.resolvedOptions = {\n ...pluginOptions,\n command: store.config.command,\n watcher,\n generators: [\n // 1. stub generator should run first\n stubGenerator(),\n // 2. then api generator\n _apiGenerator || (apiGenerator() as GeneratorConstructor),\n // 3. then fetch generator\n _fetchGenerator || (fetchGenerator() as GeneratorConstructor),\n // 4. user generators in the order they were added\n ...generators.filter((e) => {\n return e.kind //\n ? ![\"api\", \"fetch\", \"ssr\"].includes(e.kind)\n : true;\n }),\n // 5. ssr generator should run last\n ...(_ssrGenerator ? [_ssrGenerator] : []),\n ],\n formatters: formatters.map((e) => e.formatter),\n refineTypeName,\n baseurl: store.config.base,\n apiurl,\n appRoot,\n sourceFolder,\n outDir,\n };\n }\n\n if (store.config.command === \"build\") {\n const { resolvers } = await routesFactory(store.resolvedOptions);\n const resolvedRoutes: RouteResolverEntry[] = [];\n\n {\n const spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedRoutes.push(await handler());\n }\n\n spinner.succeed();\n }\n\n {\n const spinner = spinnerFactory(\"Running Generators\");\n\n for (const { name, factory } of store.resolvedOptions.generators) {\n spinner.append(name);\n const { watchHandler } = await factory(store.resolvedOptions);\n await watchHandler(resolvedRoutes);\n }\n\n spinner.succeed();\n }\n }\n },\n\n async configureServer(server) {\n if (store.config.command !== \"serve\") {\n return;\n }\n\n const apiHandler = await apiHandlerFactory(store.resolvedOptions);\n\n const apiWatcher = await apiHandler.watcher();\n\n const stopWorker = workerHandler(\n async () => {\n await apiWatcher.start();\n },\n async () => {\n await apiWatcher.stop();\n },\n );\n\n // Attach the dev middleware from apiHandler. It may intercept requests to\n // determine whether they should be handled by Vite or by another handler.\n server.middlewares.use(apiHandler.devMiddleware);\n\n // clean up when Vite dev server closes/restarts\n server.httpServer?.on(\"close\", stopWorker);\n },\n };\n};\n", "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { type BuildOptions, context, type Plugin } from \"esbuild\";\n\nimport type { App } from \"@kosmojs/api\";\nimport { defaults, type PluginOptionsResolved } from \"@kosmojs/devlib\";\n\nexport default async (options: PluginOptionsResolved) => {\n const { appRoot, sourceFolder, baseurl, apiurl } = options;\n\n const apiDir = join(sourceFolder, defaults.apiDir);\n const outDir = join(options.outDir, defaults.apiDir);\n\n const esbuildOptions: BuildOptions = await import(\n resolve(appRoot, \"esbuild.json\"),\n { with: { type: \"json\" } }\n ).then((e) => e.default);\n\n let app: App;\n let devMiddlewareFactory: Function | undefined;\n let teardownHandler: Function | undefined;\n\n const watcher = async () => {\n const outfile = join(outDir, \"dev.js\");\n\n const rebuildPlugin: Plugin = {\n name: \"rebuild\",\n setup(build) {\n build.onEnd(async () => {\n if (app) {\n await teardownHandler?.(app);\n }\n try {\n const exports = await import([outfile, Date.now()].join(\"?\"));\n devMiddlewareFactory = exports.devMiddlewareFactory;\n teardownHandler = exports.teardownHandler;\n app = await exports.default();\n console.debug(`${styleText(\"green\", \"\u279C\")} Api handler ready`);\n } catch (error) {\n console.error(`${styleText(\"red\", \"\u2717\")} Api handler error`);\n console.error(error);\n }\n });\n },\n };\n\n const ctx = await context({\n ...esbuildOptions,\n logLevel: \"error\",\n bundle: true,\n entryPoints: [join(apiDir, \"app.ts\")],\n plugins: [rebuildPlugin],\n outfile,\n });\n\n return {\n async start() {\n await ctx.watch({\n // waits this many milliseconds before rebuilding after a change is detected\n delay: options.watcher.delay,\n });\n },\n async stop() {\n await ctx.dispose();\n },\n };\n };\n\n const devMiddleware = async (\n req: IncomingMessage,\n res: ServerResponse,\n viteHandler: () => void,\n ) => {\n const next = () => {\n return viteHandler();\n };\n if (devMiddlewareFactory) {\n const handler = devMiddlewareFactory(app);\n await handler(req, res, next);\n } else {\n !req?.url || !new RegExp(`^${join(baseurl, apiurl)}($|/)`).test(req.url)\n ? next() // do not await here\n : await app?.callback()(req, res);\n }\n };\n\n return {\n watcher,\n devMiddleware,\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n type ApiRoute,\n defaults,\n type PageRoute,\n type PluginOptionsResolved,\n pathResolver,\n pathTokensFactory,\n type RouteEntry,\n type RouteResolver,\n render,\n renderToFile,\n} from \"@kosmojs/devlib\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"./ast\";\nimport { cacheFactory } from \"./cache\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\nexport type Resolvers = Map<string, RouteResolver>;\n\nexport type ResolveRouteFile = (file: string) =>\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | undefined;\n\nexport type ResolversFactory = (\n routeFiles: Array<string>,\n) => Map<string, RouteResolver>;\n\nexport default async (\n pluginOptions: PluginOptionsResolved,\n): Promise<{\n resolvers: Resolvers;\n resolversFactory: ResolversFactory;\n resolveRouteFile: ResolveRouteFile;\n}> => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n formatters = [],\n refineTypeName,\n } = pluginOptions;\n\n let resolveTypes = false;\n\n for (const { options } of generators) {\n if (options?.resolveTypes) {\n resolveTypes = true;\n }\n }\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n const routeFilePatterns = [\n `${defaults.apiDir}/**/index.ts`,\n `${defaults.pagesDir}/**/index.{ts,tsx,vue,svelte}`,\n ];\n\n const resolveRouteFile: ResolveRouteFile = (file) => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return;\n }\n\n return picomatch.isMatch(join(folder, ...rest), routeFilePatterns)\n ? [folder, rest.join(\"/\")]\n : undefined;\n };\n\n const resolversFactory: ResolversFactory = (routeFiles) => {\n const resolvers = new Map<\n string, // fileFullpath\n RouteResolver\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((_file) => {\n const resolvedPaths = resolveRouteFile(_file);\n\n if (!resolvedPaths) {\n return [];\n }\n\n const [folder, file] = resolvedPaths;\n\n const fileFullpath = join(appRoot, sourceFolder, folder, file);\n\n const pathTokens = pathTokensFactory(dirname(file));\n\n const name = pathTokens.map((e) => e.orig).join(\"/\");\n\n const importPath = dirname(file);\n\n const importName = [\n importPath\n .split(/\\[/)[0]\n .replace(/^\\W+|\\W+$/g, \"\")\n .replace(/\\W+/g, \"_\"),\n crc(importPath),\n ].join(\"_\");\n\n return [\n {\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n },\n ];\n });\n\n for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {\n const {\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async (updatedFile) => {\n const paramsSchema = pathTokens.flatMap((e) => {\n return e.param ? [e.param] : [];\n });\n\n const optionalParams = paramsSchema.length\n ? !paramsSchema.some((e) => e.isRequired)\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { file, fileFullpath, importName, importPath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n payloadTypes,\n responseTypes,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { importName, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({ appRoot, sourceFolder }).resolve(\n \"apiLibDir\",\n importPath,\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n payloadTypes,\n responseTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n overrides: [...payloadTypes, ...responseTypes].reduce(\n (map: Record<string, string>, { id, skipValidation }) => {\n if (skipValidation) {\n map[id] = \"never\";\n }\n return map;\n },\n { [refineTypeName]: refineTypeName },\n ),\n withProperties: [params.id, ...payloadTypes.map((e) => e.id)],\n formatters,\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n // text was needed at writing types.ts file, dropping from cache\n payloadTypes: payloadTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n responseTypes: responseTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n referencedFiles,\n });\n }\n\n const route: ApiRoute = {\n name,\n pathTokens,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n importName,\n importPath,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n payloadTypes: cache.payloadTypes,\n responseTypes: cache.responseTypes,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"api\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {\n const {\n //\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async () => {\n const route: PageRoute = {\n name,\n pathTokens,\n params: {\n schema: pathTokens.flatMap((e) => (e.param ? [e.param] : [])),\n },\n folder,\n file,\n fileFullpath,\n importPath,\n importName,\n };\n\n return {\n kind: \"page\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n return resolvers;\n };\n\n const routeFiles = await glob(routeFilePatterns, {\n cwd: resolve(appRoot, sourceFolder),\n absolute: true,\n onlyFiles: true,\n ignore: [\n `${defaults.apiDir}/index.ts`,\n `${defaults.pagesDir}/index.ts{x,}`,\n ],\n });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n resolveRouteFile,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n type Node,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n} from \"ts-morph\";\n\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/api\";\nimport type {\n ApiRoute,\n PayloadType,\n PluginOptionsResolved,\n ResponseType,\n TypeDeclaration,\n} from \"@kosmojs/devlib\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"importName\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(defaultExport, route)\n : [];\n\n const payloadTypes = methods.flatMap((e) => {\n return e.payloadType ? [e.payloadType] : [];\n });\n\n const responseTypes = methods.flatMap((e) => {\n return e.responseType ? [e.responseType] : [];\n });\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n payloadTypes,\n responseTypes,\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n):\n | Array<{\n index: number;\n text: string;\n }>\n | undefined => {\n const [firstGeneric] = extractGenerics(callExpression);\n\n if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n const tupleElements = firstGeneric.node.getElements();\n\n if (!tupleElements?.length) {\n return;\n }\n\n return tupleElements.map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n callExpression: CallExpression,\n route: Pick<ApiRoute, \"importName\" | \"optionalParams\">,\n): Array<{\n method: HTTPMethod;\n payloadType: (PayloadType & { text: string }) | undefined;\n responseType: (ResponseType & { text: string }) | undefined;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods = [];\n\n const skipValidationFilter = (e: string) => /@skip-validation/.test(e);\n\n for (const [callExpression, method] of callExpressions) {\n const [payloadGeneric, responseGeneric] = extractGenerics(callExpression);\n\n const payloadText = payloadGeneric?.node\n ? payloadGeneric.node.getChildren().length === 0\n ? \"{}\"\n : payloadGeneric.node.getFullText()\n : undefined;\n\n const responseText = responseGeneric?.node.getText();\n\n const responseType = responseText\n ? {\n id: [\"ResponseT\", crc(route.importName + method)].join(\"\"),\n method,\n skipValidation: responseGeneric?.comments\n ? responseGeneric.comments.some(skipValidationFilter)\n : false,\n text: [\"never\", \"object\"].includes(responseText)\n ? \"{}\"\n : responseText,\n resolvedType: undefined,\n }\n : undefined;\n\n const payloadType = payloadText\n ? {\n id: [\"PayloadT\", crc(route.importName + method)].join(\"\"),\n responseTypeId: responseType?.id,\n method,\n skipValidation: payloadGeneric?.comments\n ? payloadGeneric.comments.some(skipValidationFilter)\n : false,\n isOptional: payloadText\n ? payloadText === \"{}\" || route.optionalParams\n : true,\n text: payloadText,\n resolvedType: undefined,\n }\n : undefined;\n\n methods.push({\n method,\n payloadType,\n responseType,\n });\n }\n\n return methods;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (\n callExpression: CallExpression,\n): Array<{ node: Node; comments: Array<string> }> => {\n return callExpression.getTypeArguments().map((node) => {\n return {\n node,\n comments: node\n .getLeadingCommentRanges()\n .map((range) => range.getText().trim()),\n };\n });\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport fsx from \"fs-extra\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { type ApiRoute, pathResolver } from \"@kosmojs/devlib\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"typeDeclarations\"\n | \"numericParams\"\n | \"payloadTypes\"\n | \"responseTypes\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"file\" | \"fileFullpath\" | \"importName\" | \"importPath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).resolve(\"apiLibDir\", route.importPath, \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\n if (await fsx.exists(cacheFile)) {\n try {\n const cache = JSON.parse(await fsx.readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n };\n\n const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await fsx.outputJson(cacheFile, cache, { spaces: 2 });\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await fsx.readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n", "import ora from \"ora\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = ora().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.fail();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { parse as dotenv } from \"dotenv\";\nimport fsx from \"fs-extra\";\nimport type { Plugin } from \"vite\";\n\ntype Entry = {\n keys: Array<string>;\n file?: string;\n defineOn?: string;\n use?: (key: string, val: string | undefined) => void;\n};\n\nexport default (entries: Array<Entry>): Plugin => {\n return {\n name: \"@kosmojs:definePlugin\",\n\n async config() {\n const define: Record<string, unknown> = {};\n\n for (const { keys, file, defineOn = \"process.env\", use } of entries) {\n define[defineOn] = {};\n\n const env =\n file && (await fsx.pathExists(file))\n ? dotenv(await fsx.readFile(file, \"utf8\"))\n : process.env;\n\n for (const [key, val] of Object.entries(env)) {\n if (keys.includes(key)) {\n // only explicitly given keys available on client\n define[`${defineOn}.${key}`] = JSON.stringify(val);\n }\n use?.(key, val);\n }\n }\n\n return { define };\n },\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["default", "join", "resolve", "styleText", "join", "resolve", "crc", "glob", "defaults", "pathResolver", "resolve", "callExpression", "resolve", "crc", "hash", "defaults", "resolve", "join", "routeFiles", "crc", "pathResolver", "glob", "resolve", "styleText", "join", "
|
|
4
|
+
"sourcesContent": ["export type { SSRFactory } from \"@kosmojs/devlib\";\n\nexport { default as apiGenerator } from \"@kosmojs/api-generator\";\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\n\nexport { default as aliasPlugin } from \"./alias-plugin\";\nexport { default } from \"./base-plugin\";\nexport { default as definePlugin } from \"./define-plugin\";\n", "import { glob } from \"tinyglobby\";\nimport type { Alias, Plugin } from \"vite\";\n\nexport default (\n appRoot: string,\n opt?: {\n ignore?: Array<string>;\n },\n): Plugin => {\n return {\n name: \"@kosmojs:aliasPlugin\",\n\n async config() {\n const compilerOptions: {\n paths: Record<string, Array<string>>;\n } = await import(`${appRoot}/tsconfig.json`, {\n with: { type: \"json\" },\n }).then((e) => e.default.compilerOptions);\n\n const aliasmap: Array<Alias> = [];\n\n const pathEntries = Object.entries({ ...compilerOptions?.paths });\n\n for (const [aliasPattern, pathPatterns] of pathEntries) {\n const alias = aliasPattern.replace(\"/*\", \"\");\n\n const paths = pathPatterns\n .map((e) => e.replace(\"/*\", \"\"))\n .sort((a, b) => a.split(/\\/+/).length - b.split(/\\/+/).length);\n\n if (paths.length === 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: `${appRoot}/${paths[0]}/`,\n });\n } else if (paths.length > 1) {\n aliasmap.push({\n find: new RegExp(`^${alias}/`),\n replacement: \"\",\n async customResolver(_src) {\n // escaping symbols that may break glob pattern matching\n const src = _src.replace(/(\\$|\\^|\\+|\\(|\\)|\\[|\\])/g, \"\\\\$1\");\n\n // Build a list of possible file resolution patterns for a given source path.\n // Covers explicit extensions, implicit extensions, and folder-based index files.\n const patterns = paths.flatMap((path) => [\n // Case 1: Extension is explicitly provided\n // e.g. import styles from \"@admin/{solid}/styles.module.css\"\n `${path}/${src}*`,\n\n // Case 2: No extension provided\n // Match any extension and return the first match\n `${path}/${src}.*`,\n\n // Case 3: Folder containing an index file of any extension\n `${path}/${src}/index.*`,\n ]);\n\n const [file] = await glob(patterns, {\n cwd: appRoot,\n onlyFiles: true,\n absolute: true,\n dot: true,\n followSymbolicLinks: false,\n braceExpansion: false,\n globstar: false,\n ignore: opt?.ignore || [\n \"**/.git/**\",\n \"**/node_modules/**\",\n \"**/public/**\",\n \"**/var/**\",\n ],\n });\n\n return file;\n },\n });\n }\n }\n\n return {\n resolve: {\n alias: aliasmap,\n },\n };\n },\n };\n};\n", "import { basename, join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport { Worker } from \"node:worker_threads\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nimport type {\n GeneratorConstructor,\n PluginOptions,\n PluginOptionsResolved,\n RouteResolverEntry,\n} from \"@kosmojs/devlib\";\n\nimport apiGenerator from \"@kosmojs/api-generator\";\nimport stubGenerator from \"@kosmojs/dev/stub-generator\";\nimport fetchGenerator from \"@kosmojs/fetch-generator\";\n\nimport apiHandlerFactory from \"./api-handler\";\nimport routesFactory from \"./routes\";\nimport { type SpinnerFactory, spinnerFactory, withSpinner } from \"./spinner\";\nimport type { WorkerData, WorkerError, WorkerSpinner } from \"./worker\";\n\nexport default (apiurl: string, pluginOptions?: PluginOptions): Plugin => {\n const outDirSuffix = \"client\";\n\n const store: {\n config: ResolvedConfig;\n resolvedOptions: PluginOptionsResolved;\n } = {} as typeof store;\n\n const createWorker = () => {\n // Destructuring to separate common options from function-based ones.\n // Functions (e.g. generators, formatters) can't be passed to worker threads.\n const {\n generators = [],\n formatters = [],\n ...restOptions\n } = store.resolvedOptions;\n\n const generatorModules: WorkerData[\"generatorModules\"] = generators.map(\n (e) => [e.moduleImport, e.moduleConfig],\n );\n\n const formatterModules: WorkerData[\"formatterModules\"] =\n pluginOptions?.formatters\n ? pluginOptions.formatters.map((e) => [e.moduleImport, e.moduleConfig])\n : [];\n\n const workerData: WorkerData = {\n ...restOptions,\n generatorModules,\n formatterModules,\n };\n\n return new Worker(resolve(import.meta.dirname, \"base-plugin/worker.js\"), {\n workerData,\n env: {\n ...process.env,\n FORCE_COLOR: \"1\",\n },\n });\n };\n\n const workerHandler = (\n onReady?: () => Promise<void>,\n onExit?: () => Promise<void>,\n ) => {\n const worker = createWorker();\n\n const spinnerMap = new Map<string, SpinnerFactory>();\n\n worker.on(\"error\", async (error) => {\n console.error(error);\n });\n\n worker.on(\"exit\", async () => {\n await onExit?.();\n // TODO: revive worker only if it exited due to an error.\n // Note: worker.terminate() triggers an exit with code 1,\n // so it's not always possible to distinguish normal termination from a crash.\n });\n\n worker.on(\n \"message\",\n async (msg: { spinner?: WorkerSpinner; error?: WorkerError }) => {\n if (msg?.spinner) {\n const { id, startText, method, text } = msg.spinner;\n withSpinner(\n startText,\n (spinner) => {\n spinnerMap.set(id, spinner);\n spinner[method](text || \"\");\n if (method === \"succeed\" || method === \"failed\") {\n spinnerMap.delete(id);\n }\n },\n spinnerMap.get(id),\n );\n } else if (msg?.error) {\n const { error } = msg;\n if (error.stack) {\n const [message, ...stack] = error.stack.split(\"\\n\");\n console.error(styleText(\"red\", message));\n console.error(stack.join(\"\\n\"));\n } else if (error?.message) {\n console.error(`${styleText(\"red\", error?.name)}: ${error.message}`);\n } else {\n console.error(error);\n }\n }\n },\n );\n\n const readyHandler = async (msg: string) => {\n if (msg === \"ready\") {\n worker.off(\"message\", readyHandler);\n await onReady?.();\n }\n };\n\n worker.on(\"message\", readyHandler);\n\n return async () => {\n await worker.terminate();\n };\n };\n\n return {\n name: \"@kosmojs:basePlugin\",\n\n config(config) {\n if (!config.build?.outDir) {\n throw new Error(\"Incomplete config, missing build.outDir\");\n }\n return {\n build: {\n outDir: join(config.build.outDir, outDirSuffix),\n manifest: true,\n },\n };\n },\n\n async configResolved(_config) {\n store.config = _config;\n\n const appRoot = resolve(store.config.root, \"..\");\n const sourceFolder = basename(store.config.root);\n\n // removing outDirSuffix\n const outDir = resolve(appRoot, resolve(store.config.build.outDir, \"..\"));\n\n const { stabilityThreshold = 1000 } =\n typeof store.config.server.watch?.awaitWriteFinish === \"object\"\n ? store.config.server.watch.awaitWriteFinish\n : {};\n\n const watcher: PluginOptionsResolved[\"watcher\"] = {\n delay: stabilityThreshold,\n ...(store.config.server.watch\n ? { options: store.config.server.watch }\n : {}),\n };\n\n {\n const {\n generators = [],\n formatters = [],\n refineTypeName = \"TRefine\",\n } = { ...pluginOptions };\n\n const _apiGenerator = generators.find((e) => e.kind === \"api\");\n const _fetchGenerator = generators.find((e) => e.kind === \"fetch\");\n const _ssrGenerator = generators.find((e) => e.kind === \"ssr\");\n\n store.resolvedOptions = {\n ...pluginOptions,\n command: store.config.command,\n watcher,\n generators: [\n // 1. stub generator should run first\n stubGenerator(),\n // 2. then api generator\n _apiGenerator || (apiGenerator() as GeneratorConstructor),\n // 3. then fetch generator\n _fetchGenerator || (fetchGenerator() as GeneratorConstructor),\n // 4. user generators in the order they were added\n ...generators.filter((e) => {\n return e.kind //\n ? ![\"api\", \"fetch\", \"ssr\"].includes(e.kind)\n : true;\n }),\n // 5. ssr generator should run last\n ...(_ssrGenerator ? [_ssrGenerator] : []),\n ],\n formatters: formatters.map((e) => e.formatter),\n refineTypeName,\n baseurl: store.config.base,\n apiurl,\n appRoot,\n sourceFolder,\n outDir,\n };\n }\n\n if (store.config.command === \"build\") {\n const { resolvers } = await routesFactory(store.resolvedOptions);\n const resolvedRoutes: RouteResolverEntry[] = [];\n\n {\n const spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedRoutes.push(await handler());\n }\n\n spinner.succeed();\n }\n\n {\n const spinner = spinnerFactory(\"Running Generators\");\n\n for (const { name, factory } of store.resolvedOptions.generators) {\n spinner.append(name);\n const { watchHandler } = await factory(store.resolvedOptions);\n await watchHandler(resolvedRoutes);\n }\n\n spinner.succeed();\n }\n }\n },\n\n async configureServer(server) {\n if (store.config.command !== \"serve\") {\n return;\n }\n\n const apiHandler = await apiHandlerFactory(store.resolvedOptions);\n\n const apiWatcher = await apiHandler.watcher();\n\n const stopWorker = workerHandler(\n async () => {\n await apiWatcher.start();\n },\n async () => {\n await apiWatcher.stop();\n },\n );\n\n // Attach the dev middleware from apiHandler. It may intercept requests to\n // determine whether they should be handled by Vite or by another handler.\n server.middlewares.use(apiHandler.devMiddleware);\n\n // clean up when Vite dev server closes/restarts\n server.httpServer?.on(\"close\", stopWorker);\n },\n };\n};\n", "import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { type BuildOptions, context, type Plugin } from \"esbuild\";\n\nimport type { App } from \"@kosmojs/api\";\nimport { defaults, type PluginOptionsResolved } from \"@kosmojs/devlib\";\n\nexport default async (options: PluginOptionsResolved) => {\n const { appRoot, sourceFolder, baseurl, apiurl } = options;\n\n const apiDir = join(sourceFolder, defaults.apiDir);\n const outDir = join(options.outDir, defaults.apiDir);\n\n const esbuildOptions: BuildOptions = await import(\n resolve(appRoot, \"esbuild.json\"),\n { with: { type: \"json\" } }\n ).then((e) => e.default);\n\n let app: App;\n let devMiddlewareFactory: Function | undefined;\n let teardownHandler: Function | undefined;\n\n const watcher = async () => {\n const outfile = join(outDir, \"dev.js\");\n\n const rebuildPlugin: Plugin = {\n name: \"rebuild\",\n setup(build) {\n build.onEnd(async () => {\n if (app) {\n await teardownHandler?.(app);\n }\n try {\n const exports = await import([outfile, Date.now()].join(\"?\"));\n devMiddlewareFactory = exports.devMiddlewareFactory;\n teardownHandler = exports.teardownHandler;\n app = await exports.default();\n console.debug(`${styleText(\"green\", \"\u279C\")} Api handler ready`);\n } catch (error) {\n console.error(`${styleText(\"red\", \"\u2717\")} Api handler error`);\n console.error(error);\n }\n });\n },\n };\n\n const ctx = await context({\n ...esbuildOptions,\n logLevel: \"error\",\n bundle: true,\n entryPoints: [join(apiDir, \"app.ts\")],\n plugins: [rebuildPlugin],\n outfile,\n });\n\n return {\n async start() {\n await ctx.watch({\n // waits this many milliseconds before rebuilding after a change is detected\n delay: options.watcher.delay,\n });\n },\n async stop() {\n await ctx.dispose();\n },\n };\n };\n\n const devMiddleware = async (\n req: IncomingMessage,\n res: ServerResponse,\n viteHandler: () => void,\n ) => {\n const next = () => {\n return viteHandler();\n };\n if (devMiddlewareFactory) {\n const handler = devMiddlewareFactory(app);\n await handler(req, res, next);\n } else {\n !req?.url || !new RegExp(`^${join(baseurl, apiurl)}($|/)`).test(req.url)\n ? next() // do not await here\n : await app?.callback()(req, res);\n }\n };\n\n return {\n watcher,\n devMiddleware,\n };\n};\n", "import { dirname, join, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport picomatch from \"picomatch\";\nimport { glob } from \"tinyglobby\";\n\nimport {\n type ApiRoute,\n defaults,\n type PageRoute,\n type PluginOptionsResolved,\n pathResolver,\n pathTokensFactory,\n type RouteEntry,\n type RouteResolver,\n render,\n renderToFile,\n} from \"@kosmojs/devlib\";\n\nimport { resolveRouteSignature, typeResolverFactory } from \"./ast\";\nimport { cacheFactory } from \"./cache\";\n\nimport resolvedTypesTpl from \"./templates/resolved-types.hbs\";\nimport typesFileTpl from \"./templates/types.hbs\";\n\nexport type Resolvers = Map<string, RouteResolver>;\n\nexport type ResolveRouteFile = (file: string) =>\n | [\n // Either `apiDir` or `pagesDir`\n folder: string,\n // Path to a file within the folder, nested at least one level deep\n file: string,\n ]\n | undefined;\n\nexport type ResolversFactory = (\n routeFiles: Array<string>,\n) => Map<string, RouteResolver>;\n\nexport default async (\n pluginOptions: PluginOptionsResolved,\n): Promise<{\n resolvers: Resolvers;\n resolversFactory: ResolversFactory;\n resolveRouteFile: ResolveRouteFile;\n}> => {\n const {\n appRoot,\n sourceFolder,\n generators = [],\n formatters = [],\n refineTypeName,\n } = pluginOptions;\n\n let resolveTypes = false;\n\n for (const { options } of generators) {\n if (options?.resolveTypes) {\n resolveTypes = true;\n }\n }\n\n const {\n //\n literalTypesResolver,\n getSourceFile,\n refreshSourceFile,\n } = typeResolverFactory(pluginOptions);\n\n const routeFilePatterns = [\n `${defaults.apiDir}/**/index.ts`,\n `${defaults.pagesDir}/**/index.{ts,tsx,vue,svelte}`,\n ];\n\n const resolveRouteFile: ResolveRouteFile = (file) => {\n const [_sourceFolder, folder, ...rest] = resolve(appRoot, file)\n .replace(`${appRoot}/`, \"\")\n .split(\"/\");\n\n /**\n * Ensure the file:\n * - is under the correct source root (`sourceFolder`)\n * - belongs to a known route folder (`apiDir` or `pagesDir`)\n * - is nested at least one level deep (not a direct child of the folder)\n */\n if (!folder || _sourceFolder !== sourceFolder || rest.length < 2) {\n return;\n }\n\n return picomatch.isMatch(join(folder, ...rest), routeFilePatterns)\n ? [folder, rest.join(\"/\")]\n : undefined;\n };\n\n const resolversFactory: ResolversFactory = (routeFiles) => {\n const resolvers = new Map<\n string, // fileFullpath\n RouteResolver\n >();\n\n const entries: Array<RouteEntry> = routeFiles.flatMap((_file) => {\n const resolvedPaths = resolveRouteFile(_file);\n\n if (!resolvedPaths) {\n return [];\n }\n\n const [folder, file] = resolvedPaths;\n\n const fileFullpath = join(appRoot, sourceFolder, folder, file);\n\n const pathTokens = pathTokensFactory(dirname(file));\n\n const name = pathTokens.map((e) => e.orig).join(\"/\");\n\n const importPath = dirname(file);\n\n const importName = [\n importPath\n .split(/\\[/)[0]\n .replace(/^\\W+|\\W+$/g, \"\")\n .replace(/\\W+/g, \"_\"),\n crc(importPath),\n ].join(\"_\");\n\n return [\n {\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n },\n ];\n });\n\n for (const entry of entries.filter((e) => e.folder === defaults.apiDir)) {\n const {\n name,\n file,\n folder,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async (updatedFile) => {\n const paramsSchema = pathTokens.flatMap((e) => {\n return e.param ? [e.param] : [];\n });\n\n const optionalParams = paramsSchema.length\n ? !paramsSchema.some((e) => e.isRequired)\n : true;\n\n const { getCache, persistCache } = cacheFactory(\n { file, fileFullpath, importName, importPath },\n {\n appRoot,\n sourceFolder,\n extraContext: { resolveTypes },\n },\n );\n\n let cache = await getCache({ validate: true });\n\n if (!cache) {\n if (updatedFile === fileFullpath) {\n await refreshSourceFile(fileFullpath);\n }\n\n const {\n typeDeclarations,\n paramsRefinements,\n methods,\n payloadTypes,\n responseTypes,\n referencedFiles = [],\n } = await resolveRouteSignature(\n { importName, fileFullpath, optionalParams },\n {\n withReferencedFiles: true,\n sourceFile: getSourceFile(fileFullpath),\n relpathResolver(path) {\n return join(sourceFolder, defaults.apiDir, dirname(file), path);\n },\n },\n );\n\n const numericParams = paramsRefinements\n ? paramsRefinements.flatMap(({ text, index }) => {\n if (text === \"number\") {\n const param = paramsSchema.at(index);\n return param ? [param.name] : [];\n }\n return [];\n })\n : [];\n\n const typesFile = pathResolver({ appRoot, sourceFolder }).resolve(\n \"apiLibDir\",\n importPath,\n \"types.ts\",\n );\n\n const params: ApiRoute[\"params\"] = {\n id: [\"ParamsT\", crc(name)].join(\"\"),\n schema: paramsSchema,\n resolvedType: undefined,\n };\n\n const typesFileContent = render(typesFileTpl, {\n params,\n paramsSchema: paramsSchema.map((param, index) => {\n return {\n ...param,\n refinement: paramsRefinements?.at(index),\n };\n }),\n typeDeclarations,\n payloadTypes,\n responseTypes,\n });\n\n const resolvedTypes = resolveTypes\n ? literalTypesResolver(typesFileContent, {\n overrides: [...payloadTypes, ...responseTypes].reduce(\n (map: Record<string, string>, { id, skipValidation }) => {\n if (skipValidation) {\n map[id] = \"never\";\n }\n return map;\n },\n { [refineTypeName]: refineTypeName },\n ),\n withProperties: [params.id, ...payloadTypes.map((e) => e.id)],\n formatters,\n })\n : undefined;\n\n /**\n * Deploy types.ts file; required by core generators (like fetch).\n * If types resolved, write resolved types;\n * otherwise write original types extracted from API route.\n * */\n await renderToFile(\n typesFile,\n resolvedTypes ? resolvedTypesTpl : typesFileContent,\n { resolvedTypes },\n );\n\n params.resolvedType = resolvedTypes?.find(\n (e) => e.name === params.id,\n );\n\n cache = await persistCache({\n params,\n methods,\n typeDeclarations,\n numericParams,\n // text was needed at writing types.ts file, dropping from cache\n payloadTypes: payloadTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n responseTypes: responseTypes.map(({ text, ...rest }) => {\n return {\n ...rest,\n resolvedType: resolvedTypes?.find((e) => e.name === rest.id),\n };\n }),\n referencedFiles,\n });\n }\n\n const route: ApiRoute = {\n name,\n pathTokens,\n params: cache.params,\n numericParams: cache.numericParams,\n optionalParams,\n importName,\n importPath,\n folder,\n file,\n fileFullpath,\n methods: cache.methods,\n typeDeclarations: cache.typeDeclarations,\n payloadTypes: cache.payloadTypes,\n responseTypes: cache.responseTypes,\n referencedFiles: Object.keys(cache.referencedFiles).map(\n // expand referenced files path,\n // they are stored as relative in cache\n (e) => resolve(appRoot, e),\n ),\n };\n\n return {\n kind: \"api\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n for (const entry of entries.filter((e) => e.folder === defaults.pagesDir)) {\n const {\n //\n name,\n folder,\n file,\n fileFullpath,\n pathTokens,\n importPath,\n importName,\n } = entry;\n\n const handler: RouteResolver[\"handler\"] = async () => {\n const route: PageRoute = {\n name,\n pathTokens,\n params: {\n schema: pathTokens.flatMap((e) => (e.param ? [e.param] : [])),\n },\n folder,\n file,\n fileFullpath,\n importPath,\n importName,\n };\n\n return {\n kind: \"page\",\n route,\n };\n };\n\n resolvers.set(fileFullpath, { name, handler });\n }\n\n return resolvers;\n };\n\n const routeFiles = await glob(routeFilePatterns, {\n cwd: resolve(appRoot, sourceFolder),\n absolute: true,\n onlyFiles: true,\n ignore: [\n `${defaults.apiDir}/index.ts`,\n `${defaults.pagesDir}/index.ts{x,}`,\n ],\n });\n\n return {\n resolvers: resolversFactory(routeFiles),\n resolversFactory,\n resolveRouteFile,\n };\n};\n", "import { resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\nimport { flattener } from \"tfusion\";\nimport {\n type CallExpression,\n type Identifier,\n type Node,\n Project,\n type ProjectOptions,\n type SourceFile,\n SyntaxKind,\n} from \"ts-morph\";\n\nimport { type HTTPMethod, HTTPMethods } from \"@kosmojs/api\";\nimport type {\n ApiRoute,\n PayloadType,\n PluginOptionsResolved,\n ResponseType,\n TypeDeclaration,\n} from \"@kosmojs/devlib\";\n\ntype PathResolver = (path: string) => string;\n\nexport const createProject = (opts?: ProjectOptions) => new Project(opts);\n\nexport const resolveRouteSignature = async (\n route: Pick<ApiRoute, \"importName\" | \"fileFullpath\" | \"optionalParams\">,\n opts?: {\n relpathResolver?: PathResolver;\n sourceFile?: SourceFile;\n withReferencedFiles?: boolean;\n },\n) => {\n const {\n sourceFile = createProject().addSourceFileAtPath(route.fileFullpath),\n } = { ...opts };\n\n const [typeDeclarations, referencedFiles] = extractTypeDeclarations(\n sourceFile,\n opts,\n );\n\n const defaultExport = extractDefaultExport(sourceFile);\n\n const paramsRefinements = defaultExport\n ? extractParamsRefinements(defaultExport)\n : undefined;\n\n const methods = defaultExport\n ? extractRouteMethods(defaultExport, route)\n : [];\n\n const payloadTypes = methods.flatMap((e) => {\n return e.payloadType ? [e.payloadType] : [];\n });\n\n const responseTypes = methods.flatMap((e) => {\n return e.responseType ? [e.responseType] : [];\n });\n\n return {\n typeDeclarations,\n paramsRefinements,\n methods: methods.map((e) => e.method),\n payloadTypes,\n responseTypes,\n referencedFiles,\n };\n};\n\nexport const extractDefaultExport = (\n sourceFile: SourceFile,\n): CallExpression | undefined => {\n const [defaultExport] = sourceFile\n .getExportAssignments()\n .flatMap((exportAssignment) => {\n if (exportAssignment.isExportEquals()) {\n return [];\n }\n const callExpression = exportAssignment.getExpression();\n return callExpression.isKind(SyntaxKind.CallExpression)\n ? [callExpression]\n : [];\n });\n return defaultExport;\n};\n\nexport const extractParamsRefinements = (\n callExpression: CallExpression,\n):\n | Array<{\n index: number;\n text: string;\n }>\n | undefined => {\n const [firstGeneric] = extractGenerics(callExpression);\n\n if (!firstGeneric?.node.isKind(SyntaxKind.TupleType)) {\n return;\n }\n\n const tupleElements = firstGeneric.node.getElements();\n\n if (!tupleElements?.length) {\n return;\n }\n\n return tupleElements.map((node, index) => {\n return {\n index,\n text: node.getText(),\n };\n });\n};\n\nexport const extractRouteMethods = (\n callExpression: CallExpression,\n route: Pick<ApiRoute, \"importName\" | \"optionalParams\">,\n): Array<{\n method: HTTPMethod;\n payloadType: (PayloadType & { text: string }) | undefined;\n responseType: (ResponseType & { text: string }) | undefined;\n}> => {\n const funcDeclaration =\n callExpression.getFirstChildByKind(SyntaxKind.ArrowFunction) ||\n callExpression.getFirstChildByKind(SyntaxKind.FunctionExpression);\n\n if (!funcDeclaration) {\n return [];\n }\n\n const arrayLiteralExpression = funcDeclaration.getFirstChildByKind(\n SyntaxKind.ArrayLiteralExpression,\n );\n\n if (!arrayLiteralExpression) {\n return [];\n }\n\n const callExpressions: Array<[CallExpression, HTTPMethod]> = [];\n\n for (const e of arrayLiteralExpression.getChildrenOfKind(\n SyntaxKind.CallExpression,\n )) {\n const name = e.getExpression().getText() as HTTPMethod;\n if (HTTPMethods[name]) {\n callExpressions.push([e, name]);\n }\n }\n\n const methods = [];\n\n const skipValidationFilter = (e: string) => /@skip-validation/.test(e);\n\n for (const [callExpression, method] of callExpressions) {\n const [payloadGeneric, responseGeneric] = extractGenerics(callExpression);\n\n const payloadText = payloadGeneric?.node\n ? payloadGeneric.node.getChildren().length === 0\n ? \"{}\"\n : payloadGeneric.node.getFullText()\n : undefined;\n\n const responseText = responseGeneric?.node.getText();\n\n const responseType = responseText\n ? {\n id: [\"ResponseT\", crc(route.importName + method)].join(\"\"),\n method,\n skipValidation: responseGeneric?.comments\n ? responseGeneric.comments.some(skipValidationFilter)\n : false,\n text: [\"never\", \"object\"].includes(responseText)\n ? \"{}\"\n : responseText,\n resolvedType: undefined,\n }\n : undefined;\n\n const payloadType = payloadText\n ? {\n id: [\"PayloadT\", crc(route.importName + method)].join(\"\"),\n responseTypeId: responseType?.id,\n method,\n skipValidation: payloadGeneric?.comments\n ? payloadGeneric.comments.some(skipValidationFilter)\n : false,\n isOptional: payloadText\n ? payloadText === \"{}\" || route.optionalParams\n : true,\n text: payloadText,\n resolvedType: undefined,\n }\n : undefined;\n\n methods.push({\n method,\n payloadType,\n responseType,\n });\n }\n\n return methods;\n};\n\nexport const extractTypeDeclarations = (\n sourceFile: SourceFile,\n opts?: {\n relpathResolver?: PathResolver;\n withReferencedFiles?: boolean;\n },\n): [d: Array<TypeDeclaration>, f?: Array<string>] => {\n const declarations: Array<TypeDeclaration> = [];\n\n const referencedFiles: Array<string> | undefined = opts?.withReferencedFiles\n ? []\n : undefined;\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath;\n\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const defaultImport = typeOnlyDeclaration\n ? declaration.getDefaultImport()\n : undefined;\n\n if (defaultImport) {\n const name = defaultImport.getText();\n const text = `import type ${name} from \"${path}\";`;\n declarations.push({\n importDeclaration: {\n name,\n path,\n },\n text,\n });\n if (referencedFiles) {\n referencedFiles.push(...getReferencedFiles(defaultImport));\n }\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedImport.getNameNode();\n const name = nameNode.getText();\n const alias = namedImport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n importDeclaration: {\n name,\n alias,\n path,\n },\n text: `import type { ${nameText} } from \"${path}\";`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n for (const declaration of sourceFile.getTypeAliases()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n typeAliasDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getInterfaces()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n interfaceDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getEnums()) {\n const name = declaration.getName();\n const text = declaration.getFullText().trim();\n declarations.push({\n enumDeclaration: { name },\n text,\n });\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n const typeOnlyDeclaration = declaration.isTypeOnly();\n\n const modulePath = declaration.getModuleSpecifierValue();\n\n const path = modulePath\n ? /^\\.\\.?\\/?/.test(modulePath)\n ? opts?.relpathResolver\n ? opts.relpathResolver(modulePath)\n : modulePath\n : modulePath\n : undefined;\n\n for (const namedExport of declaration.getNamedExports()) {\n if (namedExport.isTypeOnly() || typeOnlyDeclaration) {\n const nameNode = namedExport.getNameNode();\n const name = nameNode.getText();\n const alias = namedExport.getAliasNode()?.getText();\n const nameText = alias ? `${name} as ${alias}` : name;\n\n declarations.push({\n exportDeclaration: {\n name,\n alias: alias ?? name,\n path,\n },\n text: path\n ? `export type { ${nameText} } from \"${path}\";`\n : `export type { ${nameText} };`,\n });\n\n if (referencedFiles) {\n if (nameNode.isKind(SyntaxKind.Identifier)) {\n referencedFiles.push(...getReferencedFiles(nameNode));\n }\n }\n }\n }\n }\n\n return referencedFiles\n ? [declarations, [...new Set<string>(referencedFiles)]]\n : [declarations];\n};\n\nconst getReferencedFiles = (importIdentifier: Identifier): Array<string> => {\n // ambient modules may have declarations in multiple files\n const declarations =\n importIdentifier //\n ?.getSymbol()\n ?.getAliasedSymbol()\n ?.getDeclarations() || [];\n\n return declarations.flatMap((e) => {\n const sourceFile = e.getSourceFile();\n return sourceFile //\n ? [sourceFile.getFilePath()]\n : [];\n });\n};\n\nconst extractGenerics = (\n callExpression: CallExpression,\n): Array<{ node: Node; comments: Array<string> }> => {\n return callExpression.getTypeArguments().map((node) => {\n return {\n node,\n comments: node\n .getLeadingCommentRanges()\n .map((range) => range.getText().trim()),\n };\n });\n};\n\nexport const typeResolverFactory = ({ appRoot }: PluginOptionsResolved) => {\n const project = createProject({\n tsConfigFilePath: resolve(appRoot, \"tsconfig.json\"),\n skipAddingFilesFromTsConfig: true,\n });\n\n const literalTypesResolver = (\n literalTypes: string,\n options: Parameters<typeof flattener>[2],\n ) => {\n const sourceFile = project.createSourceFile(\n `${crc(literalTypes)}-${Date.now()}.ts`,\n literalTypes,\n { overwrite: true },\n );\n\n const resolvedTypes = flattener(project, sourceFile, {\n ...options,\n stripComments: true,\n });\n\n project.removeSourceFile(sourceFile);\n\n return resolvedTypes;\n };\n\n return {\n getSourceFile: (fileFullpath: string) => {\n return (\n project.getSourceFile(fileFullpath) ||\n project.addSourceFileAtPath(fileFullpath)\n );\n },\n refreshSourceFile: async (fileFullpath: string) => {\n const sourceFile = project.getSourceFile(fileFullpath);\n if (sourceFile) {\n await sourceFile.refreshFromFileSystem();\n }\n },\n literalTypesResolver,\n };\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\n/**\n * Import from published package to ensure correct version at runtime.\n * Local import would be bundled with pre-bump version; this external\n * import resolves to the actual published package.json.\n * */\nimport self from \"@kosmojs/dev/package.json\" with { type: \"json\" };\nimport { type ApiRoute, pathExists, pathResolver } from \"@kosmojs/devlib\";\n\nexport type Cache = {\n hash: number;\n referencedFiles: Record<string, number>;\n} & Pick<\n ApiRoute,\n | \"params\"\n | \"methods\"\n | \"typeDeclarations\"\n | \"numericParams\"\n | \"payloadTypes\"\n | \"responseTypes\"\n>;\n\ntype ExtraContext = Record<string | number, unknown>;\n\nexport const cacheFactory = (\n route: Pick<ApiRoute, \"file\" | \"fileFullpath\" | \"importName\" | \"importPath\">,\n {\n appRoot,\n sourceFolder,\n extraContext,\n }: {\n appRoot: string;\n sourceFolder: string;\n extraContext?: ExtraContext;\n },\n) => {\n const cacheFile = pathResolver({\n appRoot,\n sourceFolder,\n }).resolve(\"apiLibDir\", route.importPath, \"cache.json\");\n\n const getCache = async (opt?: {\n validate?: boolean;\n }): Promise<Cache | undefined> => {\n if (await pathExists(cacheFile)) {\n try {\n const cache = JSON.parse(await readFile(cacheFile, \"utf8\"));\n return opt?.validate //\n ? validateCache(cache)\n : cache;\n } catch (_e) {}\n }\n return undefined;\n };\n\n const persistCache = async ({\n referencedFiles: _referencedFiles,\n ...rest\n }: Omit<Cache, \"hash\" | \"referencedFiles\"> & {\n referencedFiles: Array<string>;\n }): Promise<Cache> => {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Cache[\"referencedFiles\"] = {};\n\n for (const file of _referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${appRoot}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const cache = { ...rest, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(cache, null, 2), \"utf8\");\n\n return cache;\n };\n\n const validateCache = async (\n cache: Cache | undefined,\n ): Promise<Cache | undefined> => {\n if (!cache?.hash) {\n return;\n }\n\n if (!cache.typeDeclarations || !cache.referencedFiles) {\n // incomplete cache\n return;\n }\n\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n if (!identicalHashSum(cache.hash, hash)) {\n // route itself updated\n return;\n }\n\n for (const [file, hash] of Object.entries(cache.referencedFiles)) {\n if (\n !identicalHashSum(hash, await generateFileHash(resolve(appRoot, file)))\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n getCache,\n validateCache,\n persistCache,\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: ExtraContext,\n): Promise<number> => {\n let fileContent: string | undefined;\n try {\n fileContent = await readFile(file, \"utf8\");\n } catch (_e) {\n // file could be deleted since last build\n return 0;\n }\n return fileContent\n ? crc(\n JSON.stringify({\n ...extraContext,\n [self.cacheVersion]: fileContent,\n }),\n )\n : 0;\n};\n\n// return true if sums are identical\nconst identicalHashSum = (a: number, b: number) => {\n return a === b;\n};\n", "{{#each resolvedTypes}}\nexport type {{name}} = {{text}};\n{{/each}}\n", "{{#each typeDeclarations}}{{text}}\n{{/each}}\n\nexport type {{params.id}} = {\n {{#each paramsSchema}}\n \"{{name}}\"{{#unless isRequired}}?{{/unless}}:{{#if isRest}} Array<{{/if}}\n {{#if refinement}}{{refinement.text}}{{else}}string{{/if}}\n {{#if isRest}}>{{/if}}\n {{/each}}\n};\n\n{{#each payloadTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n\n{{#each responseTypes}}\nexport type {{id}} = {{text}};\n{{/each}}\n", "import ora from \"ora\";\n\nexport type SpinnerFactory = {\n text: (text: string) => void;\n append: (text: string) => void;\n succeed: (text?: string) => void;\n failed: (text?: string) => void;\n};\n\nexport const spinnerFactory = (startText: string): SpinnerFactory => {\n const spinner = ora().start(startText);\n let _text = startText;\n return {\n text(text) {\n _text = text;\n spinner.text = text;\n },\n append(text) {\n spinner.text = `${_text} \u203A ${text}`;\n },\n succeed(text) {\n if (text) {\n this.append(text);\n } else {\n this.text(_text);\n }\n spinner.succeed();\n },\n failed(text) {\n if (text) {\n this.text([_text, text].join(\"\\n\"));\n }\n spinner.fail();\n },\n };\n};\n\nexport const withSpinner = (\n text: string,\n pipe: (spinner: SpinnerFactory) => void | Promise<void>,\n spinner?: SpinnerFactory,\n) => pipe(spinner || spinnerFactory(text));\n", "import { readFile } from \"node:fs/promises\";\n\nimport { parse as dotenv } from \"dotenv\";\nimport type { Plugin } from \"vite\";\n\nimport { pathExists } from \"@kosmojs/devlib\";\n\ntype Entry = {\n keys: Array<string>;\n file?: string;\n defineOn?: string;\n use?: (key: string, val: string | undefined) => void;\n};\n\nexport default (entries: Array<Entry>): Plugin => {\n return {\n name: \"@kosmojs:definePlugin\",\n\n async config() {\n const define: Record<string, unknown> = {};\n\n for (const { keys, file, defineOn = \"process.env\", use } of entries) {\n define[defineOn] = {};\n\n const fileExists = file //\n ? await pathExists(file)\n : false;\n\n const env = fileExists\n ? dotenv(await readFile(file as never, \"utf8\"))\n : process.env;\n\n for (const [key, val] of Object.entries(env)) {\n if (keys.includes(key)) {\n // only explicitly given keys available on client\n define[`${defineOn}.${key}`] = JSON.stringify(val);\n }\n use?.(key, val);\n }\n }\n\n return { define };\n },\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["default", "join", "resolve", "styleText", "dirname", "join", "resolve", "crc", "glob", "defaults", "pathResolver", "resolve", "callExpression", "resolve", "crc", "hash", "defaults", "resolve", "join", "routeFiles", "dirname", "crc", "pathResolver", "glob", "resolve", "styleText", "join", "readFile", "pathExists"]
|
|
7
7
|
}
|