@kosmojs/dev 0.0.27 → 0.0.28

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 CHANGED
@@ -1,19 +1,13 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@kosmojs/dev",
4
- "version": "0.0.27",
4
+ "version": "0.0.28",
5
5
  "cacheVersion": "001",
6
6
  "author": "Slee Woo",
7
7
  "license": "MIT",
8
- "publishConfig": {
9
- "access": "public"
10
- },
11
8
  "files": [
12
9
  "pkg/*"
13
10
  ],
14
- "imports": {
15
- "#templates/*": "./src/templates/*"
16
- },
17
11
  "exports": {
18
12
  ".": {
19
13
  "types": "./pkg/index.d.ts",
@@ -27,21 +21,22 @@
27
21
  },
28
22
  "dependencies": {
29
23
  "crc": "^4.3.2",
30
- "@kosmojs/fetch-generator": "^0.0.27",
31
- "@kosmojs/hono-generator": "^0.0.27",
32
- "@kosmojs/koa-generator": "^0.0.27",
33
- "@kosmojs/mdx-generator": "^0.0.27",
34
- "@kosmojs/lib": "^0.0.27",
35
- "@kosmojs/openapi-generator": "^0.0.27",
36
- "@kosmojs/react-generator": "^0.0.27",
37
- "@kosmojs/solid-generator": "^0.0.27",
38
- "@kosmojs/ssg-generator": "^0.0.27",
39
- "@kosmojs/ssr-generator": "^0.0.27",
40
- "@kosmojs/typebox-generator": "^0.0.27",
41
- "@kosmojs/vue-generator": "^0.0.27"
24
+ "@kosmojs/core-generator": "^0.0.28",
25
+ "@kosmojs/hono-generator": "^0.0.28",
26
+ "@kosmojs/koa-generator": "^0.0.28",
27
+ "@kosmojs/mdx-generator": "^0.0.28",
28
+ "@kosmojs/lib": "^0.0.28",
29
+ "@kosmojs/react-generator": "^0.0.28",
30
+ "@kosmojs/openapi-generator": "^0.0.28",
31
+ "@kosmojs/solid-generator": "^0.0.28",
32
+ "@kosmojs/ssg-generator": "^0.0.28",
33
+ "@kosmojs/ssr-generator": "^0.0.28",
34
+ "@kosmojs/fetch-generator": "^0.0.28",
35
+ "@kosmojs/typebox-generator": "^0.0.28",
36
+ "@kosmojs/vue-generator": "^0.0.28"
42
37
  },
43
38
  "devDependencies": {
44
- "@kosmojs/core": "^0.0.27"
39
+ "@kosmojs/core": "^0.0.28"
45
40
  },
46
41
  "scripts": {
47
42
  "build": "esbuilder src/index.ts src/chassis.ts",
package/pkg/chassis.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import type { ProjectSettings } from "@kosmojs/core";
1
+ import { type ProjectSettings } from "@kosmojs/core";
2
2
  declare const _default: (projectSettings: ProjectSettings) => Promise<() => Promise<void>>;
3
3
  export default _default;
package/pkg/chassis.js CHANGED
@@ -5,11 +5,10 @@ import { join, resolve as resolve2 } from "node:path";
5
5
  import { styleText } from "node:util";
6
6
  import { build, createServer } from "vite";
7
7
  import {
8
- defaults,
9
- pathResolver as pathResolver3,
10
- routesFactory,
11
- spinnerFactory
12
- } from "@kosmojs/lib";
8
+ defaults
9
+ } from "@kosmojs/core";
10
+ import { pathResolver as pathResolver2, routesFactory, spinnerFactory } from "@kosmojs/lib";
11
+ import coreGenerator from "@kosmojs/core-generator";
13
12
 
14
13
  // src/cache.ts
15
14
  import { mkdir, readFile, writeFile } from "node:fs/promises";
@@ -93,101 +92,6 @@ var identicalHashSum = (a, b) => {
93
92
  return a === b;
94
93
  };
95
94
 
96
- // src/core-generator/index.ts
97
- import { dirname as dirname2 } from "node:path";
98
- import {
99
- defineGenerator,
100
- defineGeneratorFactory,
101
- generateTsconfig,
102
- pathResolver as pathResolver2,
103
- renderToFile
104
- } from "@kosmojs/lib";
105
-
106
- // src/templates/env.d.ts
107
- var env_d_default = 'declare const KOSMO_PRODUCTION_BUILD: boolean;\n\n/**\n * Enhances base TypeScript types with JSON Schema validation constraints.\n * Allows declaring refined types that carry validation metadata for runtime\n * schema validation while maintaining full TypeScript type safety.\n *\n * Useful for generating validation schemas and ensuring\n * data conforms to specific business rules beyond basic type checking.\n * */\ndeclare type VRefine<\n T extends unknown[] | number | string | object,\n _ extends T extends unknown[]\n ? TArrayOptions\n : T extends number\n ? TNumberOptions\n : T extends string\n ? TStringOptions\n : TObjectOptions,\n> = T;\n\n/**\n * Type definitions inspired by and gently adapted from TypeBox.\n * Original TypeBox created by sinclairzx81: https://github.com/sinclairzx81/typebox\n * TypeBox is licensed under MIT: https://github.com/sinclairzx81/typebox/blob/main/license\n *\n * These types provide JSON Schema compatible type refinements for TypeScript.\n * */\ninterface TSchema {}\n\n// ------------------------------------------------------------------\n// ObjectOptions\n// ------------------------------------------------------------------\ninterface TObjectOptions {\n /**\n * Defines whether additional properties are allowed beyond those explicitly defined in `properties`.\n */\n additionalProperties?: TSchema | boolean;\n /**\n * The minimum number of properties required in the object.\n */\n minProperties?: number;\n /**\n * The maximum number of properties allowed in the object.\n */\n maxProperties?: number;\n /**\n * Defines conditional requirements for properties.\n */\n dependencies?: Record<string, boolean | TSchema | string[]>;\n /**\n * Specifies properties that *must* be present if a given property is present.\n */\n dependentRequired?: Record<string, string[]>;\n /**\n * Defines schemas that apply if a specific property is present.\n */\n dependentSchemas?: Record<string, TSchema>;\n /**\n * Maps regular expressions to schemas properties matching a pattern must validate against the schema.\n */\n patternProperties?: Record<string, TSchema>;\n /**\n * A schema that all property names within the object must validate against.\n */\n propertyNames?: TSchema;\n}\n\n// ------------------------------------------------------------------\n// ArrayOptions\n// ------------------------------------------------------------------\ninterface TArrayOptions {\n /**\n * The minimum number of items allowed in the array.\n */\n minItems?: number;\n /**\n * The maximum number of items allowed in the array.\n */\n maxItems?: number;\n /**\n * A schema that at least one item in the array must validate against.\n */\n contains?: TSchema;\n /**\n * The minimum number of array items that must validate against the `contains` schema.\n */\n minContains?: number;\n /**\n * The maximum number of array items that may validate against the `contains` schema.\n */\n maxContains?: number;\n /**\n * An array of schemas, where each schema in `prefixItems` validates against items at corresponding positions from the beginning of the array.\n */\n prefixItems?: TSchema[];\n /**\n * If `true`, all items in the array must be unique.\n */\n uniqueItems?: boolean;\n}\n\n// ------------------------------------------------------------------\n// NumberOptions\n// ------------------------------------------------------------------\ninterface TNumberOptions {\n /**\n * Specifies an exclusive upper limit for the number (number must be less than this value).\n */\n exclusiveMaximum?: number | bigint;\n /**\n * Specifies an exclusive lower limit for the number (number must be greater than this value).\n */\n exclusiveMinimum?: number | bigint;\n /**\n * Specifies an inclusive upper limit for the number (number must be less than or equal to this value).\n */\n maximum?: number | bigint;\n /**\n * Specifies an inclusive lower limit for the number (number must be greater than or equal to this value).\n */\n minimum?: number | bigint;\n /**\n * Specifies that the number must be a multiple of this value.\n */\n multipleOf?: number | bigint;\n}\n\n// ------------------------------------------------------------------\n// StringOptions\n// ------------------------------------------------------------------\ntype TFormat =\n | "date-time"\n | "date"\n | "duration"\n | "email"\n | "hostname"\n | "idn-email"\n | "idn-hostname"\n | "ipv4"\n | "ipv6"\n | "iri-reference"\n | "iri"\n | "json-pointer-uri-fragment"\n | "json-pointer"\n | "json-string"\n | "regex"\n | "relative-json-pointer"\n | "time"\n | "uri-reference"\n | "uri-template"\n | "url"\n | "uuid";\n\ninterface TStringOptions {\n /**\n * Specifies the expected string format.\n *\n * Common values include:\n * - `base64` \u2013 Base64-encoded string.\n * - `date-time` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time format.\n * - `date` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date (YYYY-MM-DD).\n * - `duration` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) duration format.\n * - `email` \u2013 RFC 5321/5322 compliant email address.\n * - `hostname` \u2013 RFC 1034/1035 compliant host name.\n * - `idn-email` \u2013 Internationalized email address.\n * - `idn-hostname` \u2013 Internationalized host name.\n * - `ipv4` \u2013 IPv4 address.\n * - `ipv6` \u2013 IPv6 address.\n * - `iri` / `iri-reference` \u2013 Internationalized Resource Identifier.\n * - `json-pointer` / `json-pointer-uri-fragment` \u2013 JSON Pointer format.\n * - `json-string` \u2013 String containing valid JSON.\n * - `regex` \u2013 Regular expression syntax.\n * - `relative-json-pointer` \u2013 Relative JSON Pointer format.\n * - `time` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) time (HH:MM:SS).\n * - `uri-reference` / `uri-template` \u2013 URI reference or template.\n * - `url` \u2013 Web URL format.\n * - `uuid` \u2013 RFC 4122 UUID string.\n *\n * May also be a custom format string.\n */\n format?: TFormat;\n /**\n * Specifies the minimum number of characters allowed in the string.\n * Must be a non-negative integer.\n */\n minLength?: number;\n /**\n * Specifies the maximum number of characters allowed in the string.\n * Must be a non-negative integer.\n */\n maxLength?: number;\n /**\n * Specifies a regular expression pattern that the string value must match.\n * Can be provided as a string (ECMA-262 regex syntax) or a `RegExp` object.\n */\n pattern?: string | RegExp;\n}\n';
108
-
109
- // src/templates/gitignore.hbs
110
- var gitignore_default = "# Ignore all files\n*\n\n# But don't ignore directories (so Git can traverse them)\n!*/\n\n# And don't ignore these files at any depth\n!cache.json\n!types.ts\n";
111
-
112
- // src/templates/schemas.hbs
113
- var schemas_default = '// stub schemas, specialized generators supposed to overwrite this file\nimport type { ValidationSchemas } from "@kosmojs/core/api";\nexport type { ValidationSchemas };\nexport const validationSchemas: ValidationSchemas = {};\n';
114
-
115
- // src/core-generator/index.ts
116
- var factory = defineGeneratorFactory((meta, sourceFolder) => {
117
- const { createPath } = pathResolver2(sourceFolder);
118
- const start = async () => {
119
- await renderToFile(
120
- createPath.lib("../tsconfig.base.json"),
121
- JSON.stringify(generateTsconfig(), void 0, 2),
122
- {}
123
- );
124
- {
125
- const tsconfig = generateTsconfig(sourceFolder.name);
126
- const compilerOptions = {};
127
- const types = new Set(tsconfig.compilerOptions.types || []);
128
- for (const { meta: meta2 } of sourceFolder.config.generators || []) {
129
- if (meta2.jsxImportSource) {
130
- compilerOptions.jsxImportSource = meta2.jsxImportSource;
131
- }
132
- for (const type of meta2.types || []) {
133
- types.add(type);
134
- }
135
- }
136
- await renderToFile(
137
- createPath.lib("tsconfig.base.json"),
138
- JSON.stringify(
139
- {
140
- ...tsconfig,
141
- compilerOptions: {
142
- ...tsconfig.compilerOptions,
143
- ...compilerOptions,
144
- types: [...types.values()]
145
- }
146
- },
147
- void 0,
148
- 2
149
- ),
150
- {}
151
- );
152
- }
153
- await renderToFile(createPath.lib("../env.d.ts"), env_d_default, {});
154
- await renderToFile(
155
- createPath.lib("../.gitignore"),
156
- gitignore_default,
157
- {},
158
- { overwrite: false }
159
- );
160
- await renderToFile(createPath.lib("ssg.ts"), "export default [];", {});
161
- };
162
- const generateLibFiles = async (entries) => {
163
- for (const { kind, entry } of entries) {
164
- if (kind === "apiRoute") {
165
- await renderToFile(
166
- createPath.libApi(dirname2(entry.file), "schemas.ts"),
167
- schemas_default,
168
- { route: entry },
169
- { overwrite: false }
170
- );
171
- }
172
- }
173
- };
174
- return {
175
- meta,
176
- options: void 0,
177
- start,
178
- watch: generateLibFiles,
179
- build: generateLibFiles
180
- };
181
- });
182
- var core_generator_default = defineGenerator(() => {
183
- const meta = { name: "Core" };
184
- return {
185
- meta,
186
- options: void 0,
187
- factory: (sourceFolder) => factory(meta, sourceFolder)
188
- };
189
- });
190
-
191
95
  // src/chassis.ts
192
96
  var chassis_default = async (projectSettings) => {
193
97
  const { devPort, command } = projectSettings;
@@ -198,14 +102,14 @@ var chassis_default = async (projectSettings) => {
198
102
  `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`
199
103
  );
200
104
  }
201
- const factory2 = base.factory(sourceFolder);
202
- if (!factory2.meta?.name) {
105
+ const factory = base.factory(sourceFolder);
106
+ if (!factory.meta?.name) {
203
107
  throw new Error(
204
108
  `${sourceFolder.name}: ${base.meta.name} generator is missing meta property`
205
109
  );
206
110
  }
207
111
  try {
208
- await factory2.start?.();
112
+ await factory.start?.();
209
113
  } catch (error) {
210
114
  console.error(
211
115
  styleText(
@@ -220,7 +124,7 @@ var chassis_default = async (projectSettings) => {
220
124
  if (command === "build") {
221
125
  for (const sourceFolder of projectSettings.sourceFolders) {
222
126
  const { config, baseurl } = sourceFolder;
223
- const { createPath } = pathResolver3(sourceFolder);
127
+ const { createPath } = pathResolver2(sourceFolder);
224
128
  const resolvedRoutes = [];
225
129
  {
226
130
  const { resolvers } = await routesFactory(sourceFolder, cacheFactory);
@@ -318,7 +222,7 @@ var chassis_default = async (projectSettings) => {
318
222
  let port = await findFreePort(devPort);
319
223
  for (const sourceFolder of projectSettings.sourceFolders) {
320
224
  const { config, baseurl } = sourceFolder;
321
- const { createPath } = pathResolver3(sourceFolder);
225
+ const { createPath } = pathResolver2(sourceFolder);
322
226
  const requestMatchers = matchersFactory(sourceFolder);
323
227
  const generators = folderGenerators(sourceFolder);
324
228
  const plugins = [...config.plugins || []];
@@ -361,7 +265,7 @@ var chassis_default = async (projectSettings) => {
361
265
  if (!folderGenerators(sourceFolder).find((e) => e.meta.slot === "api")) {
362
266
  continue;
363
267
  }
364
- const { createPath } = pathResolver3(sourceFolder);
268
+ const { createPath } = pathResolver2(sourceFolder);
365
269
  const requestMatchers = matchersFactory(sourceFolder);
366
270
  const viteServer = await createServer({
367
271
  configFile: false,
@@ -464,7 +368,7 @@ var folderGenerators = (sourceFolder) => {
464
368
  }
465
369
  return [
466
370
  // core generator should run first
467
- core_generator_default(),
371
+ coreGenerator(),
468
372
  // then api generator
469
373
  ...coreGenerators.api ? [coreGenerators.api] : [],
470
374
  // then fetch generator, only if api generator also enabled
@@ -482,18 +386,18 @@ var eventFactory = async (sourceFolder) => {
482
386
  sourceFolder,
483
387
  cacheFactory
484
388
  );
485
- const { createPath } = pathResolver3(sourceFolder);
389
+ const { createPath } = pathResolver2(sourceFolder);
486
390
  const generators = [];
487
391
  for (const base of folderGenerators(sourceFolder)) {
488
- const factory2 = base.factory(sourceFolder);
489
- generators.push({ name: base.meta.name, factory: factory2 });
392
+ const factory = base.factory(sourceFolder);
393
+ generators.push({ name: base.meta.name, factory });
490
394
  }
491
395
  const resolvedRoutes = /* @__PURE__ */ new Map();
492
396
  const runGenerators = async (event) => {
493
397
  const entries = Array.from(resolvedRoutes.values());
494
- for (const { name, factory: factory2 } of generators) {
398
+ for (const { name, factory } of generators) {
495
399
  try {
496
- await factory2.watch?.(entries, event);
400
+ await factory.watch?.(entries, event);
497
401
  } catch (error) {
498
402
  console.error(
499
403
  styleText("red", `${sourceFolder.name}: ${name} generator failed`)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/chassis.ts", "../src/cache.ts", "../src/core-generator/index.ts", "../src/templates/env.d.ts", "../src/templates/gitignore.hbs", "../src/templates/schemas.hbs"],
4
- "sourcesContent": ["import http, { type IncomingMessage, type ServerResponse } from \"node:http\";\nimport net from \"node:net\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { build, createServer, type RunnableDevEnvironment } from \"vite\";\n\nimport type {\n GeneratorBase,\n GeneratorFactoryInstance,\n GeneratorMeta,\n ProjectSettings,\n ResolvedEntry,\n SourceFolder,\n WatcherEvent,\n} from \"@kosmojs/core\";\nimport type { DevSetup } from \"@kosmojs/core/api\";\nimport {\n defaults,\n pathResolver,\n routesFactory,\n spinnerFactory,\n} from \"@kosmojs/lib\";\n\nimport { cacheFactory } from \"./cache\";\nimport coreGenerator from \"./core-generator\";\n\nexport default async (\n projectSettings: ProjectSettings,\n): Promise<() => Promise<void>> => {\n const { devPort, command } = projectSettings;\n\n // NOTE: initialize generators before anything else, regardless command\n for (const sourceFolder of projectSettings.sourceFolders) {\n for (const base of folderGenerators(sourceFolder)) {\n if (!base.meta?.name || typeof base.factory !== \"function\") {\n throw new Error(\n `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`,\n );\n }\n\n const factory = base.factory(sourceFolder);\n\n if (!factory.meta?.name) {\n throw new Error(\n `${sourceFolder.name}: ${base.meta.name} generator is missing meta property`,\n );\n }\n\n try {\n await factory.start?.();\n } catch (error) {\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${base.meta.name} generator failed to initialize`,\n ),\n );\n throw error;\n }\n }\n }\n\n if (command === \"build\") {\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config, baseurl } = sourceFolder;\n const { createPath } = pathResolver(sourceFolder);\n\n const resolvedRoutes = [];\n\n {\n const { resolvers } = await routesFactory(sourceFolder, cacheFactory);\n\n const spinner = spinnerFactory(\n `${sourceFolder.name}: resolving routes`,\n );\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(\"ready \u2728\");\n }\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n await base.factory(sourceFolder).build?.(resolvedRoutes);\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n // build client\n {\n const outDir = createPath.distDir(\"client\");\n\n await build({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(baseurl, \"/\"),\n plugins,\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n build: {\n ...config?.build,\n outDir,\n manifest: true,\n emptyOutDir: true,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n }\n\n // build backend\n const apiGenerator = generators.find((e) => e.meta.slot === \"api\");\n\n if (apiGenerator) {\n const dir = createPath.distDir(\"api\");\n\n const noExternal = Array.isArray(apiGenerator.options?.noExternal)\n ? apiGenerator.options.noExternal\n : generators.flatMap(({ meta }) => {\n return Object.keys({\n ...meta.dependencies,\n ...meta.devDependencies,\n });\n });\n\n await build({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n plugins: [...(apiGenerator.plugins?.(sourceFolder, command) || [])],\n define: {\n ...config.define,\n KOSMO_PRODUCTION_BUILD: \"true\",\n },\n ssr: { noExternal },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n conditions: [\"node\"],\n },\n build: {\n ssr: true,\n target: \"esnext\",\n sourcemap: true,\n emptyOutDir: true,\n rolldownOptions: {\n input: [createPath.api(\"app.ts\"), createPath.api(\"server.ts\")],\n output: {\n dir,\n format: \"esm\",\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n }\n\n for (const base of generators) {\n await base.factory(sourceFolder).postBuild?.(resolvedRoutes);\n }\n }\n\n return async () => {};\n }\n\n type RequestMatcher = (req: IncomingMessage) => boolean;\n type RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\n const requestHandlers: Array<\n [\n segments: [base: string, api?: string],\n matcherFactory: () => RequestMatcher,\n handlerFactory: () => RequestHandler,\n ]\n > = [];\n\n const teardownHandlers: Array<() => Promise<unknown>> = [];\n\n const eventMap: Record<string, Awaited<ReturnType<typeof eventFactory>>> = {};\n\n // WARN: call this before starting any server!\n for (const sourceFolder of projectSettings.sourceFolders) {\n eventMap[sourceFolder.name] = await eventFactory(sourceFolder);\n }\n\n let port = await findFreePort(devPort);\n\n // start client servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config, baseurl } = sourceFolder;\n\n const { createPath } = pathResolver(sourceFolder);\n const requestMatchers = matchersFactory(sourceFolder);\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n const viteServer = await createServer({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(baseurl, \"/\"),\n plugins,\n server: {\n ...config.server,\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n define: {\n ...config.define,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, handler);\n }\n\n requestHandlers.push([\n [sourceFolder.baseurl],\n () => requestMatchers.base,\n () => viteServer.middlewares,\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n // start backend servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n if (!folderGenerators(sourceFolder).find((e) => e.meta.slot === \"api\")) {\n continue;\n }\n\n const { createPath } = pathResolver(sourceFolder);\n\n const requestMatchers = matchersFactory(sourceFolder);\n\n const viteServer = await createServer({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n server: {\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: { tsconfigPaths: true },\n define: {\n ...config?.define,\n KOSMO_PRODUCTION_BUILD: \"false\",\n },\n environments: {\n api: {\n resolve: {\n conditions: [\"node\"],\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n\n const env = viteServer.environments.api as RunnableDevEnvironment;\n\n const loadDevSetup = async () => {\n env.runner.clearCache();\n return env.runner\n .import<{ default: DevSetup }>(join(defaults.apiDir, \"dev.ts\"))\n .then((e) => e.default);\n };\n\n let devSetup = await loadDevSetup();\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, async (file) => {\n const mods = env.moduleGraph.getModulesByFile(file);\n if (mods?.size) {\n await handler(file);\n await devSetup?.teardownHandler?.();\n devSetup = await loadDevSetup();\n }\n });\n }\n\n requestHandlers.push([\n [sourceFolder.baseurl, sourceFolder.apiurl],\n () => devSetup.requestMatcher || requestMatchers.api,\n () => devSetup.requestHandler(),\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n /**\n * Sorting is essential to ensure more specific paths are matched before broader ones.\n *\n * Given source folders:\n * - main app: baseurl=/ apiurl=/api\n * - admin app: baseurl=/admin apiurl=/admin/api\n *\n * Correct sort order:\n * 1. /admin/api \u2014 most specific\n * 2. /api\n * 3. /admin\n * 4. /\n * */\n const requestHandlerWeight = ([\n segments,\n ]: (typeof requestHandlers)[number]) => {\n const [base, api] = segments;\n /**\n * set weight to number of non-empty segments:\n * \"/\" weight is 0\n * \"/admin\" weight is 1\n * */\n const weight = base.split(\"/\").filter(Boolean).length;\n return api ? weight + 5 : weight;\n };\n\n const handlers = requestHandlers.sort(\n (a, b) => requestHandlerWeight(b) - requestHandlerWeight(a),\n );\n\n const httpServer = http.createServer((req, res) => {\n for (const [, matcherFactory, handlerFactory] of handlers) {\n // should be called on every request\n const [matcher, handler] = [matcherFactory(), handlerFactory()];\n if (matcher(req)) {\n handler(req, res);\n return;\n }\n }\n res.writeHead(404, { \"Content-Type\": \"text/html\" });\n res.end(\"<h1>404: Not Found</h1>\");\n });\n\n httpServer.on(\"error\", (error) => {\n console.error(\n styleText(\"red\", `Failed to start dev server on port ${devPort}`),\n );\n console.error(error.message);\n process.exit(1);\n });\n\n httpServer.listen(devPort);\n\n teardownHandlers.push(async () => {\n httpServer.close();\n });\n\n return async () => {\n for (const handler of teardownHandlers) {\n await handler().catch(console.error);\n }\n // Let chokidar fully release file handles\n await new Promise((resolve) => setTimeout(resolve, 100));\n };\n};\n\nconst cacheDir = (\n { root, name }: SourceFolder,\n command: ProjectSettings[\"command\"],\n mode: \"client\" | \"backend\",\n) => {\n return resolve(root, `var/.vite/${name}/${command}/${mode}`);\n};\n\nconst folderGenerators = (sourceFolder: SourceFolder): Array<GeneratorBase> => {\n const { generators = [] } = sourceFolder.config;\n\n const coreGenerators: Partial<\n Record<NonNullable<GeneratorMeta[\"slot\"]>, GeneratorBase>\n > = {};\n\n const userGenerators: Array<GeneratorBase> = [];\n\n for (const base of generators) {\n if (base.meta.slot) {\n coreGenerators[base.meta.slot] = base;\n } else {\n userGenerators.push(base);\n }\n }\n\n return [\n // core generator should run first\n coreGenerator(),\n // then api generator\n ...(coreGenerators.api ? [coreGenerators.api] : []),\n // then fetch generator, only if api generator also enabled\n ...(coreGenerators.fetch && coreGenerators.api\n ? [coreGenerators.fetch]\n : []),\n // then user generators in the order they were added\n ...userGenerators,\n // then ssr generator should run after user generators\n ...(coreGenerators.ssr ? [coreGenerators.ssr] : []),\n // and ssg generator should run last\n ...(coreGenerators.ssg ? [coreGenerators.ssg] : []),\n ];\n};\n\nconst eventFactory = async (\n sourceFolder: SourceFolder,\n): Promise<\n Record<\"add\" | \"change\" | \"unlink\", (f: string) => Promise<void>>\n> => {\n const { resolvers, resolversFactory } = await routesFactory(\n sourceFolder,\n cacheFactory,\n );\n\n const { createPath } = pathResolver(sourceFolder);\n\n const generators: Array<{\n name: string | undefined;\n factory: GeneratorFactoryInstance;\n }> = [];\n\n for (const base of folderGenerators(sourceFolder)) {\n const factory = base.factory(sourceFolder);\n generators.push({ name: base.meta.name, factory });\n }\n\n const resolvedRoutes = new Map<\n string, // fileFullpath\n ResolvedEntry\n >();\n\n const runGenerators = async (event?: WatcherEvent) => {\n /**\n * Watch handlers receive the full list of entries\n * and should process only those whose source file or dependencies were updated.\n * */\n const entries = Array.from(resolvedRoutes.values());\n\n for (const { name, factory } of generators) {\n try {\n await factory.watch?.(entries, event);\n } catch (error) {\n console.error(\n styleText(\"red\", `${sourceFolder.name}: ${name} generator failed`),\n );\n if (event) {\n console.error(event);\n }\n console.error(error);\n }\n }\n };\n\n const updateResolvedEntry = async (file: string) => {\n const resolver = resolvers.get(file);\n\n if (!resolver) {\n return;\n }\n\n try {\n const resolvedEntry = await resolver.handler(file);\n resolvedRoutes.set(resolvedEntry.entry.fileFullpath, resolvedEntry);\n return resolvedEntry;\n } catch (error) {\n const route = file.replace(`${createPath.api()}/`, \"\");\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${route} route resolution failed`,\n ),\n );\n console.error(error);\n return;\n }\n };\n\n {\n const spinner = spinnerFactory(`${sourceFolder.name}: resolving routes`);\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`,\n );\n const route = await handler();\n resolvedRoutes.set(route.entry.fileFullpath, route);\n }\n spinner.succeed(\"ready \u2728\");\n }\n\n // NOTE: call only after routes resolved\n await runGenerators();\n\n return {\n async add(file: string) {\n const [resolver] = resolversFactory([file]).values();\n\n if (!resolver) {\n return;\n }\n\n resolvers.set(file, resolver);\n\n // call only after `resolvers.set(file)`\n const resolvedEntry = await updateResolvedEntry(file);\n\n if (resolvedEntry) {\n await runGenerators({ kind: \"create\", file });\n }\n },\n\n async change(file: string) {\n if (resolvedRoutes.has(file)) {\n // route updated\n await updateResolvedEntry(file);\n } else {\n // updating entries that are referencing updated file\n const relatedRoutes = resolvedRoutes\n .values()\n .flatMap(({ kind, entry }) => {\n return kind === \"apiRoute\"\n ? entry.referencedFiles.includes(file)\n ? [entry]\n : []\n : [];\n });\n\n for (const route of relatedRoutes) {\n await updateResolvedEntry(route.fileFullpath);\n }\n }\n\n await runGenerators({ kind: \"update\", file });\n },\n\n async unlink(file) {\n // route deleted\n resolvers.delete(file);\n resolvedRoutes.delete(file);\n await runGenerators({ kind: \"delete\", file });\n },\n };\n};\n\nconst matchersFactory: (\n sourceFolder: SourceFolder,\n) => Record<\"base\" | \"api\", (req: IncomingMessage) => boolean> = ({\n baseurl,\n apiurl,\n}) => {\n const basePattern = new RegExp(`^${baseurl}($|/*)`);\n const apiPattern = new RegExp(`^${join(baseurl, apiurl)}($|/*)`);\n return {\n base(req) {\n return apiPattern.test(req.url as string)\n ? false\n : basePattern.test(req.url as string);\n },\n api(req) {\n return apiPattern.test(req.url as string);\n },\n };\n};\n\nconst findFreePort = async (devPort: number): Promise<number> => {\n let minPort = 0;\n let maxPort = 0;\n\n for (const n of [3, 2, 1, \"\"]) {\n minPort = Number(`${n}${devPort}`) + 100;\n maxPort = minPort + 100;\n if (maxPort < 65000) {\n break;\n }\n }\n\n if (maxPort >= 65000) {\n throw new Error(\"the devPort in package.json should be less than 64000\");\n }\n\n const range = maxPort - minPort + 1;\n const startOffset = Math.floor(Math.random() * range);\n\n const ports = Array.from({ length: range }, (_, i) => {\n return minPort + ((startOffset + i) % range);\n });\n\n const freePort = await ports.reduce(\n async (prevPromise, port) => {\n const freePort = await prevPromise;\n if (freePort) {\n return freePort;\n }\n const isFree = await isPortFree(port);\n return isFree ? port : undefined;\n },\n Promise.resolve(undefined as number | undefined),\n );\n\n if (!freePort) {\n throw new Error(`No free ports found in range ${minPort}-${maxPort}`);\n }\n\n return freePort;\n};\n\nconst isPortFree = (port: number): Promise<boolean> => {\n return new Promise((resolve) => {\n const server = net.createServer();\n\n server.once(\"error\", () => resolve(false));\n\n server.once(\"listening\", () => {\n server.close();\n resolve(true);\n });\n\n server.listen(port, \"127.0.0.1\");\n });\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\nimport type {\n RouteResolverCache,\n RouteResolverCacheFactory,\n} from \"@kosmojs/core\";\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 { pathExists, pathResolver } from \"@kosmojs/lib\";\n\nexport const cacheFactory: RouteResolverCacheFactory = (\n route,\n sourceFolder,\n extraContext,\n) => {\n const cacheFile = pathResolver(sourceFolder).createPath.libApi(\n dirname(route.file),\n \"cache.json\",\n );\n\n const validateCache = async (cache: RouteResolverCache) => {\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(\n hash,\n await generateFileHash(resolve(sourceFolder.root, file)),\n )\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n async get(opt?: { validate?: boolean }) {\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 async set(cache) {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Record<string, number> = {};\n\n for (const file of cache.referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${sourceFolder.root}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const value = { ...cache, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(value, null, 2), \"utf8\");\n\n return value;\n },\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: object,\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", "import { dirname } from \"node:path\";\n\nimport type { GeneratorMeta, ResolvedEntry } from \"@kosmojs/core\";\nimport {\n defineGenerator,\n defineGeneratorFactory,\n generateTsconfig,\n pathResolver,\n renderToFile,\n} from \"@kosmojs/lib\";\n\nimport * as templates from \"./templates\";\n\nconst factory = defineGeneratorFactory((meta, sourceFolder) => {\n const { createPath } = pathResolver(sourceFolder);\n\n const start = async () => {\n // deploy a tsconfig file for root tsconfig to extend from\n await renderToFile(\n createPath.lib(\"../tsconfig.base.json\"),\n JSON.stringify(generateTsconfig(), undefined, 2),\n {},\n );\n\n // deploy a tsconfig file for sourceFolder tsconfig to extend from\n {\n const tsconfig = generateTsconfig(sourceFolder.name);\n\n const compilerOptions: { jsxImportSource?: string | undefined } = {};\n const types = new Set<string>(tsconfig.compilerOptions.types || []);\n\n for (const { meta } of sourceFolder.config.generators || []) {\n if (meta.jsxImportSource) {\n compilerOptions.jsxImportSource = meta.jsxImportSource;\n }\n for (const type of meta.types || []) {\n types.add(type);\n }\n }\n\n await renderToFile(\n createPath.lib(\"tsconfig.base.json\"),\n JSON.stringify(\n {\n ...tsconfig,\n compilerOptions: {\n ...tsconfig.compilerOptions,\n ...compilerOptions,\n types: [...types.values()],\n },\n },\n undefined,\n 2,\n ),\n {},\n );\n }\n\n /**\n * expose VRefine as a global type.\n * not supposed to be overriden by generators.\n * */\n await renderToFile(createPath.lib(\"../env.d.ts\"), templates.env, {});\n\n /**\n * deploy a default gitignore file that ignore everything,\n * except cache.json files; if file exists, do not override.\n * */\n await renderToFile(\n createPath.lib(\"../.gitignore\"),\n templates.gitignore,\n {},\n { overwrite: false },\n );\n\n /**\n * deploy a stub SSG file.\n * generators that support SSG will override it as needed.\n * then SSG generator will import it and generate static files for exported routes.\n * */\n await renderToFile(createPath.lib(\"ssg.ts\"), \"export default [];\", {});\n };\n\n const generateLibFiles = async (entries: Array<ResolvedEntry>) => {\n for (const { kind, entry } of entries) {\n if (kind === \"apiRoute\") {\n // Generating stub schemas file.\n // It is required by various generators, e.g. api-generator, fetch-generator.\n // Specialized generators (e.g. typebox-generator) may override this later.\n await renderToFile(\n createPath.libApi(dirname(entry.file), \"schemas.ts\"),\n templates.schemas,\n { route: entry },\n { overwrite: false },\n );\n }\n }\n };\n\n return {\n meta,\n options: undefined,\n start,\n watch: generateLibFiles,\n build: generateLibFiles,\n };\n});\n\n/**\n * Generates stub files required by various generators.\n * Ensures cross-generator dependencies remain resolvable\n * even if specialized generators supposed to generate these files are not installed.\n * */\nexport default defineGenerator(() => {\n const meta: GeneratorMeta = { name: \"Core\" };\n return {\n meta,\n options: undefined,\n factory: (sourceFolder) => factory(meta, sourceFolder),\n };\n});\n", "declare const KOSMO_PRODUCTION_BUILD: boolean;\n\n/**\n * Enhances base TypeScript types with JSON Schema validation constraints.\n * Allows declaring refined types that carry validation metadata for runtime\n * schema validation while maintaining full TypeScript type safety.\n *\n * Useful for generating validation schemas and ensuring\n * data conforms to specific business rules beyond basic type checking.\n * */\ndeclare type VRefine<\n T extends unknown[] | number | string | object,\n _ extends T extends unknown[]\n ? TArrayOptions\n : T extends number\n ? TNumberOptions\n : T extends string\n ? TStringOptions\n : TObjectOptions,\n> = T;\n\n/**\n * Type definitions inspired by and gently adapted from TypeBox.\n * Original TypeBox created by sinclairzx81: https://github.com/sinclairzx81/typebox\n * TypeBox is licensed under MIT: https://github.com/sinclairzx81/typebox/blob/main/license\n *\n * These types provide JSON Schema compatible type refinements for TypeScript.\n * */\ninterface TSchema {}\n\n// ------------------------------------------------------------------\n// ObjectOptions\n// ------------------------------------------------------------------\ninterface TObjectOptions {\n /**\n * Defines whether additional properties are allowed beyond those explicitly defined in `properties`.\n */\n additionalProperties?: TSchema | boolean;\n /**\n * The minimum number of properties required in the object.\n */\n minProperties?: number;\n /**\n * The maximum number of properties allowed in the object.\n */\n maxProperties?: number;\n /**\n * Defines conditional requirements for properties.\n */\n dependencies?: Record<string, boolean | TSchema | string[]>;\n /**\n * Specifies properties that *must* be present if a given property is present.\n */\n dependentRequired?: Record<string, string[]>;\n /**\n * Defines schemas that apply if a specific property is present.\n */\n dependentSchemas?: Record<string, TSchema>;\n /**\n * Maps regular expressions to schemas properties matching a pattern must validate against the schema.\n */\n patternProperties?: Record<string, TSchema>;\n /**\n * A schema that all property names within the object must validate against.\n */\n propertyNames?: TSchema;\n}\n\n// ------------------------------------------------------------------\n// ArrayOptions\n// ------------------------------------------------------------------\ninterface TArrayOptions {\n /**\n * The minimum number of items allowed in the array.\n */\n minItems?: number;\n /**\n * The maximum number of items allowed in the array.\n */\n maxItems?: number;\n /**\n * A schema that at least one item in the array must validate against.\n */\n contains?: TSchema;\n /**\n * The minimum number of array items that must validate against the `contains` schema.\n */\n minContains?: number;\n /**\n * The maximum number of array items that may validate against the `contains` schema.\n */\n maxContains?: number;\n /**\n * An array of schemas, where each schema in `prefixItems` validates against items at corresponding positions from the beginning of the array.\n */\n prefixItems?: TSchema[];\n /**\n * If `true`, all items in the array must be unique.\n */\n uniqueItems?: boolean;\n}\n\n// ------------------------------------------------------------------\n// NumberOptions\n// ------------------------------------------------------------------\ninterface TNumberOptions {\n /**\n * Specifies an exclusive upper limit for the number (number must be less than this value).\n */\n exclusiveMaximum?: number | bigint;\n /**\n * Specifies an exclusive lower limit for the number (number must be greater than this value).\n */\n exclusiveMinimum?: number | bigint;\n /**\n * Specifies an inclusive upper limit for the number (number must be less than or equal to this value).\n */\n maximum?: number | bigint;\n /**\n * Specifies an inclusive lower limit for the number (number must be greater than or equal to this value).\n */\n minimum?: number | bigint;\n /**\n * Specifies that the number must be a multiple of this value.\n */\n multipleOf?: number | bigint;\n}\n\n// ------------------------------------------------------------------\n// StringOptions\n// ------------------------------------------------------------------\ntype TFormat =\n | \"date-time\"\n | \"date\"\n | \"duration\"\n | \"email\"\n | \"hostname\"\n | \"idn-email\"\n | \"idn-hostname\"\n | \"ipv4\"\n | \"ipv6\"\n | \"iri-reference\"\n | \"iri\"\n | \"json-pointer-uri-fragment\"\n | \"json-pointer\"\n | \"json-string\"\n | \"regex\"\n | \"relative-json-pointer\"\n | \"time\"\n | \"uri-reference\"\n | \"uri-template\"\n | \"url\"\n | \"uuid\";\n\ninterface TStringOptions {\n /**\n * Specifies the expected string format.\n *\n * Common values include:\n * - `base64` \u2013 Base64-encoded string.\n * - `date-time` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date-time format.\n * - `date` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) date (YYYY-MM-DD).\n * - `duration` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) duration format.\n * - `email` \u2013 RFC 5321/5322 compliant email address.\n * - `hostname` \u2013 RFC 1034/1035 compliant host name.\n * - `idn-email` \u2013 Internationalized email address.\n * - `idn-hostname` \u2013 Internationalized host name.\n * - `ipv4` \u2013 IPv4 address.\n * - `ipv6` \u2013 IPv6 address.\n * - `iri` / `iri-reference` \u2013 Internationalized Resource Identifier.\n * - `json-pointer` / `json-pointer-uri-fragment` \u2013 JSON Pointer format.\n * - `json-string` \u2013 String containing valid JSON.\n * - `regex` \u2013 Regular expression syntax.\n * - `relative-json-pointer` \u2013 Relative JSON Pointer format.\n * - `time` \u2013 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) time (HH:MM:SS).\n * - `uri-reference` / `uri-template` \u2013 URI reference or template.\n * - `url` \u2013 Web URL format.\n * - `uuid` \u2013 RFC 4122 UUID string.\n *\n * May also be a custom format string.\n */\n format?: TFormat;\n /**\n * Specifies the minimum number of characters allowed in the string.\n * Must be a non-negative integer.\n */\n minLength?: number;\n /**\n * Specifies the maximum number of characters allowed in the string.\n * Must be a non-negative integer.\n */\n maxLength?: number;\n /**\n * Specifies a regular expression pattern that the string value must match.\n * Can be provided as a string (ECMA-262 regex syntax) or a `RegExp` object.\n */\n pattern?: string | RegExp;\n}\n", "# Ignore all files\n*\n\n# But don't ignore directories (so Git can traverse them)\n!*/\n\n# And don't ignore these files at any depth\n!cache.json\n!types.ts\n", "// stub schemas, specialized generators supposed to overwrite this file\nimport type { ValidationSchemas } from \"@kosmojs/core/api\";\nexport type { ValidationSchemas };\nexport const validationSchemas: ValidationSchemas = {};\n"],
5
- "mappings": "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",
6
- "names": ["resolve", "pathResolver", "hash", "dirname", "pathResolver", "pathResolver", "meta", "dirname", "factory", "pathResolver", "resolve", "freePort"]
3
+ "sources": ["../src/chassis.ts", "../src/cache.ts"],
4
+ "sourcesContent": ["import http, { type IncomingMessage, type ServerResponse } from \"node:http\";\nimport net from \"node:net\";\nimport { join, resolve } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport { build, createServer, type RunnableDevEnvironment } from \"vite\";\n\nimport {\n defaults,\n type GeneratorBase,\n type GeneratorFactoryInstance,\n type GeneratorMeta,\n type ProjectSettings,\n type ResolvedEntry,\n type SourceFolder,\n type WatcherEvent,\n} from \"@kosmojs/core\";\nimport type { DevSetup } from \"@kosmojs/core/api\";\nimport { pathResolver, routesFactory, spinnerFactory } from \"@kosmojs/lib\";\n\nimport coreGenerator from \"@kosmojs/core-generator\";\n\nimport { cacheFactory } from \"./cache\";\n\nexport default async (\n projectSettings: ProjectSettings,\n): Promise<() => Promise<void>> => {\n const { devPort, command } = projectSettings;\n\n // NOTE: initialize generators before anything else, regardless command\n for (const sourceFolder of projectSettings.sourceFolders) {\n for (const base of folderGenerators(sourceFolder)) {\n if (!base.meta?.name || typeof base.factory !== \"function\") {\n throw new Error(\n `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`,\n );\n }\n\n const factory = base.factory(sourceFolder);\n\n if (!factory.meta?.name) {\n throw new Error(\n `${sourceFolder.name}: ${base.meta.name} generator is missing meta property`,\n );\n }\n\n try {\n await factory.start?.();\n } catch (error) {\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${base.meta.name} generator failed to initialize`,\n ),\n );\n throw error;\n }\n }\n }\n\n if (command === \"build\") {\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config, baseurl } = sourceFolder;\n const { createPath } = pathResolver(sourceFolder);\n\n const resolvedRoutes = [];\n\n {\n const { resolvers } = await routesFactory(sourceFolder, cacheFactory);\n\n const spinner = spinnerFactory(\n `${sourceFolder.name}: resolving routes`,\n );\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(\"ready \u2728\");\n }\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n await base.factory(sourceFolder).build?.(resolvedRoutes);\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n // build client\n {\n const outDir = createPath.distDir(\"client\");\n\n await build({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(baseurl, \"/\"),\n plugins,\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n build: {\n ...config?.build,\n outDir,\n manifest: true,\n emptyOutDir: true,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n }\n\n // build backend\n const apiGenerator = generators.find((e) => e.meta.slot === \"api\");\n\n if (apiGenerator) {\n const dir = createPath.distDir(\"api\");\n\n const noExternal = Array.isArray(apiGenerator.options?.noExternal)\n ? apiGenerator.options.noExternal\n : generators.flatMap(({ meta }) => {\n return Object.keys({\n ...meta.dependencies,\n ...meta.devDependencies,\n });\n });\n\n await build({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n plugins: [...(apiGenerator.plugins?.(sourceFolder, command) || [])],\n define: {\n ...config.define,\n KOSMO_PRODUCTION_BUILD: \"true\",\n },\n ssr: { noExternal },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n conditions: [\"node\"],\n },\n build: {\n ssr: true,\n target: \"esnext\",\n sourcemap: true,\n emptyOutDir: true,\n rolldownOptions: {\n input: [createPath.api(\"app.ts\"), createPath.api(\"server.ts\")],\n output: {\n dir,\n format: \"esm\",\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n }\n\n for (const base of generators) {\n await base.factory(sourceFolder).postBuild?.(resolvedRoutes);\n }\n }\n\n return async () => {};\n }\n\n type RequestMatcher = (req: IncomingMessage) => boolean;\n type RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\n const requestHandlers: Array<\n [\n segments: [base: string, api?: string],\n matcherFactory: () => RequestMatcher,\n handlerFactory: () => RequestHandler,\n ]\n > = [];\n\n const teardownHandlers: Array<() => Promise<unknown>> = [];\n\n const eventMap: Record<string, Awaited<ReturnType<typeof eventFactory>>> = {};\n\n // WARN: call this before starting any server!\n for (const sourceFolder of projectSettings.sourceFolders) {\n eventMap[sourceFolder.name] = await eventFactory(sourceFolder);\n }\n\n let port = await findFreePort(devPort);\n\n // start client servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config, baseurl } = sourceFolder;\n\n const { createPath } = pathResolver(sourceFolder);\n const requestMatchers = matchersFactory(sourceFolder);\n\n const generators = folderGenerators(sourceFolder);\n const plugins = [...(config.plugins || [])];\n\n for (const base of generators) {\n plugins.push(...(base.plugins?.(sourceFolder, command) || []));\n }\n\n const viteServer = await createServer({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(baseurl, \"/\"),\n plugins,\n server: {\n ...config.server,\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n define: {\n ...config.define,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, handler);\n }\n\n requestHandlers.push([\n [sourceFolder.baseurl],\n () => requestMatchers.base,\n () => viteServer.middlewares,\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n // start backend servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n if (!folderGenerators(sourceFolder).find((e) => e.meta.slot === \"api\")) {\n continue;\n }\n\n const { createPath } = pathResolver(sourceFolder);\n\n const requestMatchers = matchersFactory(sourceFolder);\n\n const viteServer = await createServer({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n server: {\n port: port++,\n middlewareMode: true,\n hmr: { port: port++ },\n },\n resolve: { tsconfigPaths: true },\n define: {\n ...config?.define,\n KOSMO_PRODUCTION_BUILD: \"false\",\n },\n environments: {\n api: {\n resolve: {\n conditions: [\"node\"],\n },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\n\n const env = viteServer.environments.api as RunnableDevEnvironment;\n\n const loadDevSetup = async () => {\n env.runner.clearCache();\n return env.runner\n .import<{ default: DevSetup }>(join(defaults.apiDir, \"dev.ts\"))\n .then((e) => e.default);\n };\n\n let devSetup = await loadDevSetup();\n\n for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {\n viteServer.watcher.on(evt, async (file) => {\n const mods = env.moduleGraph.getModulesByFile(file);\n if (mods?.size) {\n await handler(file);\n await devSetup?.teardownHandler?.();\n devSetup = await loadDevSetup();\n }\n });\n }\n\n requestHandlers.push([\n [sourceFolder.baseurl, sourceFolder.apiurl],\n () => devSetup.requestMatcher || requestMatchers.api,\n () => devSetup.requestHandler(),\n ]);\n\n teardownHandlers.push(viteServer.close);\n }\n\n /**\n * Sorting is essential to ensure more specific paths are matched before broader ones.\n *\n * Given source folders:\n * - main app: baseurl=/ apiurl=/api\n * - admin app: baseurl=/admin apiurl=/admin/api\n *\n * Correct sort order:\n * 1. /admin/api \u2014 most specific\n * 2. /api\n * 3. /admin\n * 4. /\n * */\n const requestHandlerWeight = ([\n segments,\n ]: (typeof requestHandlers)[number]) => {\n const [base, api] = segments;\n /**\n * set weight to number of non-empty segments:\n * \"/\" weight is 0\n * \"/admin\" weight is 1\n * */\n const weight = base.split(\"/\").filter(Boolean).length;\n return api ? weight + 5 : weight;\n };\n\n const handlers = requestHandlers.sort(\n (a, b) => requestHandlerWeight(b) - requestHandlerWeight(a),\n );\n\n const httpServer = http.createServer((req, res) => {\n for (const [, matcherFactory, handlerFactory] of handlers) {\n // should be called on every request\n const [matcher, handler] = [matcherFactory(), handlerFactory()];\n if (matcher(req)) {\n handler(req, res);\n return;\n }\n }\n res.writeHead(404, { \"Content-Type\": \"text/html\" });\n res.end(\"<h1>404: Not Found</h1>\");\n });\n\n httpServer.on(\"error\", (error) => {\n console.error(\n styleText(\"red\", `Failed to start dev server on port ${devPort}`),\n );\n console.error(error.message);\n process.exit(1);\n });\n\n httpServer.listen(devPort);\n\n teardownHandlers.push(async () => {\n httpServer.close();\n });\n\n return async () => {\n for (const handler of teardownHandlers) {\n await handler().catch(console.error);\n }\n // Let chokidar fully release file handles\n await new Promise((resolve) => setTimeout(resolve, 100));\n };\n};\n\nconst cacheDir = (\n { root, name }: SourceFolder,\n command: ProjectSettings[\"command\"],\n mode: \"client\" | \"backend\",\n) => {\n return resolve(root, `var/.vite/${name}/${command}/${mode}`);\n};\n\nconst folderGenerators = (sourceFolder: SourceFolder): Array<GeneratorBase> => {\n const { generators = [] } = sourceFolder.config;\n\n const coreGenerators: Partial<\n Record<NonNullable<GeneratorMeta[\"slot\"]>, GeneratorBase>\n > = {};\n\n const userGenerators: Array<GeneratorBase> = [];\n\n for (const base of generators) {\n if (base.meta.slot) {\n coreGenerators[base.meta.slot] = base;\n } else {\n userGenerators.push(base);\n }\n }\n\n return [\n // core generator should run first\n coreGenerator(),\n // then api generator\n ...(coreGenerators.api ? [coreGenerators.api] : []),\n // then fetch generator, only if api generator also enabled\n ...(coreGenerators.fetch && coreGenerators.api\n ? [coreGenerators.fetch]\n : []),\n // then user generators in the order they were added\n ...userGenerators,\n // then ssr generator should run after user generators\n ...(coreGenerators.ssr ? [coreGenerators.ssr] : []),\n // and ssg generator should run last\n ...(coreGenerators.ssg ? [coreGenerators.ssg] : []),\n ];\n};\n\nconst eventFactory = async (\n sourceFolder: SourceFolder,\n): Promise<\n Record<\"add\" | \"change\" | \"unlink\", (f: string) => Promise<void>>\n> => {\n const { resolvers, resolversFactory } = await routesFactory(\n sourceFolder,\n cacheFactory,\n );\n\n const { createPath } = pathResolver(sourceFolder);\n\n const generators: Array<{\n name: string | undefined;\n factory: GeneratorFactoryInstance;\n }> = [];\n\n for (const base of folderGenerators(sourceFolder)) {\n const factory = base.factory(sourceFolder);\n generators.push({ name: base.meta.name, factory });\n }\n\n const resolvedRoutes = new Map<\n string, // fileFullpath\n ResolvedEntry\n >();\n\n const runGenerators = async (event?: WatcherEvent) => {\n /**\n * Watch handlers receive the full list of entries\n * and should process only those whose source file or dependencies were updated.\n * */\n const entries = Array.from(resolvedRoutes.values());\n\n for (const { name, factory } of generators) {\n try {\n await factory.watch?.(entries, event);\n } catch (error) {\n console.error(\n styleText(\"red\", `${sourceFolder.name}: ${name} generator failed`),\n );\n if (event) {\n console.error(event);\n }\n console.error(error);\n }\n }\n };\n\n const updateResolvedEntry = async (file: string) => {\n const resolver = resolvers.get(file);\n\n if (!resolver) {\n return;\n }\n\n try {\n const resolvedEntry = await resolver.handler(file);\n resolvedRoutes.set(resolvedEntry.entry.fileFullpath, resolvedEntry);\n return resolvedEntry;\n } catch (error) {\n const route = file.replace(`${createPath.api()}/`, \"\");\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${route} route resolution failed`,\n ),\n );\n console.error(error);\n return;\n }\n };\n\n {\n const spinner = spinnerFactory(`${sourceFolder.name}: resolving routes`);\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`,\n );\n const route = await handler();\n resolvedRoutes.set(route.entry.fileFullpath, route);\n }\n spinner.succeed(\"ready \u2728\");\n }\n\n // NOTE: call only after routes resolved\n await runGenerators();\n\n return {\n async add(file: string) {\n const [resolver] = resolversFactory([file]).values();\n\n if (!resolver) {\n return;\n }\n\n resolvers.set(file, resolver);\n\n // call only after `resolvers.set(file)`\n const resolvedEntry = await updateResolvedEntry(file);\n\n if (resolvedEntry) {\n await runGenerators({ kind: \"create\", file });\n }\n },\n\n async change(file: string) {\n if (resolvedRoutes.has(file)) {\n // route updated\n await updateResolvedEntry(file);\n } else {\n // updating entries that are referencing updated file\n const relatedRoutes = resolvedRoutes\n .values()\n .flatMap(({ kind, entry }) => {\n return kind === \"apiRoute\"\n ? entry.referencedFiles.includes(file)\n ? [entry]\n : []\n : [];\n });\n\n for (const route of relatedRoutes) {\n await updateResolvedEntry(route.fileFullpath);\n }\n }\n\n await runGenerators({ kind: \"update\", file });\n },\n\n async unlink(file) {\n // route deleted\n resolvers.delete(file);\n resolvedRoutes.delete(file);\n await runGenerators({ kind: \"delete\", file });\n },\n };\n};\n\nconst matchersFactory: (\n sourceFolder: SourceFolder,\n) => Record<\"base\" | \"api\", (req: IncomingMessage) => boolean> = ({\n baseurl,\n apiurl,\n}) => {\n const basePattern = new RegExp(`^${baseurl}($|/*)`);\n const apiPattern = new RegExp(`^${join(baseurl, apiurl)}($|/*)`);\n return {\n base(req) {\n return apiPattern.test(req.url as string)\n ? false\n : basePattern.test(req.url as string);\n },\n api(req) {\n return apiPattern.test(req.url as string);\n },\n };\n};\n\nconst findFreePort = async (devPort: number): Promise<number> => {\n let minPort = 0;\n let maxPort = 0;\n\n for (const n of [3, 2, 1, \"\"]) {\n minPort = Number(`${n}${devPort}`) + 100;\n maxPort = minPort + 100;\n if (maxPort < 65000) {\n break;\n }\n }\n\n if (maxPort >= 65000) {\n throw new Error(\"the devPort in package.json should be less than 64000\");\n }\n\n const range = maxPort - minPort + 1;\n const startOffset = Math.floor(Math.random() * range);\n\n const ports = Array.from({ length: range }, (_, i) => {\n return minPort + ((startOffset + i) % range);\n });\n\n const freePort = await ports.reduce(\n async (prevPromise, port) => {\n const freePort = await prevPromise;\n if (freePort) {\n return freePort;\n }\n const isFree = await isPortFree(port);\n return isFree ? port : undefined;\n },\n Promise.resolve(undefined as number | undefined),\n );\n\n if (!freePort) {\n throw new Error(`No free ports found in range ${minPort}-${maxPort}`);\n }\n\n return freePort;\n};\n\nconst isPortFree = (port: number): Promise<boolean> => {\n return new Promise((resolve) => {\n const server = net.createServer();\n\n server.once(\"error\", () => resolve(false));\n\n server.once(\"listening\", () => {\n server.close();\n resolve(true);\n });\n\n server.listen(port, \"127.0.0.1\");\n });\n};\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport crc from \"crc/crc32\";\n\nimport type {\n RouteResolverCache,\n RouteResolverCacheFactory,\n} from \"@kosmojs/core\";\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 { pathExists, pathResolver } from \"@kosmojs/lib\";\n\nexport const cacheFactory: RouteResolverCacheFactory = (\n route,\n sourceFolder,\n extraContext,\n) => {\n const cacheFile = pathResolver(sourceFolder).createPath.libApi(\n dirname(route.file),\n \"cache.json\",\n );\n\n const validateCache = async (cache: RouteResolverCache) => {\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(\n hash,\n await generateFileHash(resolve(sourceFolder.root, file)),\n )\n ) {\n // some referenced file updated\n return;\n }\n }\n\n return cache;\n };\n\n return {\n async get(opt?: { validate?: boolean }) {\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 async set(cache) {\n const hash = await generateFileHash(route.fileFullpath, {\n ...extraContext,\n });\n\n const referencedFiles: Record<string, number> = {};\n\n for (const file of cache.referencedFiles) {\n referencedFiles[\n // Strip project root to ensure cached paths are relative\n // and portable across environments (CI, local, etc.)\n file.replace(`${sourceFolder.root}/`, \"\")\n ] = await generateFileHash(file);\n }\n\n const value = { ...cache, hash, referencedFiles };\n\n await mkdir(dirname(cacheFile), { recursive: true });\n await writeFile(cacheFile, JSON.stringify(value, null, 2), \"utf8\");\n\n return value;\n },\n };\n};\n\nconst generateFileHash = async (\n file: string,\n extraContext?: object,\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"],
5
+ "mappings": "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",
6
+ "names": ["resolve", "pathResolver", "hash", "pathResolver", "resolve", "freePort"]
7
7
  }
@@ -1,7 +0,0 @@
1
- /**
2
- * Generates stub files required by various generators.
3
- * Ensures cross-generator dependencies remain resolvable
4
- * even if specialized generators supposed to generate these files are not installed.
5
- * */
6
- declare const _default: () => import("@kosmojs/core").GeneratorBase;
7
- export default _default;
@@ -1,3 +0,0 @@
1
- export { default as env } from "#templates/env.d";
2
- export { default as gitignore } from "#templates/gitignore.hbs";
3
- export { default as schemas } from "#templates/schemas.hbs";