@kosmojs/dev 0.0.26 → 0.0.27

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,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@kosmojs/dev",
4
- "version": "0.0.26",
4
+ "version": "0.0.27",
5
5
  "cacheVersion": "001",
6
6
  "author": "Slee Woo",
7
7
  "license": "MIT",
@@ -11,6 +11,9 @@
11
11
  "files": [
12
12
  "pkg/*"
13
13
  ],
14
+ "imports": {
15
+ "#templates/*": "./src/templates/*"
16
+ },
14
17
  "exports": {
15
18
  ".": {
16
19
  "types": "./pkg/index.d.ts",
@@ -24,20 +27,21 @@
24
27
  },
25
28
  "dependencies": {
26
29
  "crc": "^4.3.2",
27
- "@kosmojs/fetch-generator": "^0.0.26",
28
- "@kosmojs/hono-generator": "^0.0.26",
29
- "@kosmojs/koa-generator": "^0.0.26",
30
- "@kosmojs/lib": "^0.0.26",
31
- "@kosmojs/openapi-generator": "^0.0.26",
32
- "@kosmojs/react-generator": "^0.0.26",
33
- "@kosmojs/solid-generator": "^0.0.26",
34
- "@kosmojs/ssr-generator": "^0.0.26",
35
- "@kosmojs/vue-generator": "^0.0.26",
36
- "@kosmojs/typebox-generator": "^0.0.26"
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"
37
42
  },
38
43
  "devDependencies": {
39
- "vite": "^8.0.2",
40
- "@kosmojs/api": "^0.0.26"
44
+ "@kosmojs/core": "^0.0.27"
41
45
  },
42
46
  "scripts": {
43
47
  "build": "esbuilder src/index.ts src/chassis.ts",
package/pkg/cache.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { type RouteResolverCacheFactory } from "@kosmojs/lib";
1
+ import type { RouteResolverCacheFactory } from "@kosmojs/core";
2
2
  export declare const cacheFactory: RouteResolverCacheFactory;
package/pkg/chassis.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { type ProjectSettings } from "@kosmojs/lib";
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
@@ -1,13 +1,11 @@
1
1
  // src/chassis.ts
2
- import { rm } from "node:fs/promises";
3
2
  import http from "node:http";
4
3
  import net from "node:net";
5
4
  import { join, resolve as resolve2 } from "node:path";
6
5
  import { styleText } from "node:util";
7
- import { build, createServer, isRunnableDevEnvironment } from "vite";
6
+ import { build, createServer } from "vite";
8
7
  import {
9
8
  defaults,
10
- getGeneratorMeta,
11
9
  pathResolver as pathResolver3,
12
10
  routesFactory,
13
11
  spinnerFactory
@@ -18,10 +16,7 @@ import { mkdir, readFile, writeFile } from "node:fs/promises";
18
16
  import { dirname, resolve } from "node:path";
19
17
  import crc from "crc/crc32";
20
18
  import self from "@kosmojs/dev/package.json" with { type: "json" };
21
- import {
22
- pathExists,
23
- pathResolver
24
- } from "@kosmojs/lib";
19
+ import { pathExists, pathResolver } from "@kosmojs/lib";
25
20
  var cacheFactory = (route, sourceFolder, extraContext) => {
26
21
  const cacheFile = pathResolver(sourceFolder).createPath.libApi(
27
22
  dirname(route.file),
@@ -98,94 +93,162 @@ var identicalHashSum = (a, b) => {
98
93
  return a === b;
99
94
  };
100
95
 
101
- // src/stub-generator/index.ts
96
+ // src/core-generator/index.ts
102
97
  import { dirname as dirname2 } from "node:path";
103
98
  import {
104
99
  defineGenerator,
100
+ defineGeneratorFactory,
101
+ generateTsconfig,
105
102
  pathResolver as pathResolver2,
106
103
  renderToFile
107
104
  } from "@kosmojs/lib";
108
105
 
109
- // load-as-text:/volumes/studio/OpenSource/KosmoJS/Kosmo/packages/core/dev/src/stub-generator/templates/env.d.ts
110
- var env_d_default = 'declare const KOSMO_PRODUCTION_BUILD: boolean;\ndeclare const KOSMO_SSR_MODE: 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';
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';
111
108
 
112
- // src/stub-generator/templates/gitignore.hbs
109
+ // src/templates/gitignore.hbs
113
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";
114
111
 
115
- // src/stub-generator/templates/schemas.hbs
116
- var schemas_default = '// stub schemas, specialized generators supposed to overwrite this file\nimport type { ValidationSchemas } from "@kosmojs/api";\nexport type { ValidationSchemas };\nexport const validationSchemas: ValidationSchemas = {};\n';
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';
117
114
 
118
- // src/stub-generator/index.ts
119
- var stub_generator_default = defineGenerator(
120
- () => {
121
- return async (sourceFolder) => {
122
- const generateLibFiles = async (entries) => {
123
- const { createPath } = pathResolver2(sourceFolder);
124
- await renderToFile(createPath.lib("../env.d.ts"), env_d_default, {});
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") {
125
165
  await renderToFile(
126
- createPath.lib("../.gitignore"),
127
- gitignore_default,
128
- {},
166
+ createPath.libApi(dirname2(entry.file), "schemas.ts"),
167
+ schemas_default,
168
+ { route: entry },
129
169
  { overwrite: false }
130
170
  );
131
- for (const { kind, entry } of entries) {
132
- if (kind === "apiRoute") {
133
- await renderToFile(
134
- createPath.libApi(dirname2(entry.file), "schemas.ts"),
135
- schemas_default,
136
- { route: entry },
137
- { overwrite: false }
138
- );
139
- }
140
- }
141
- };
142
- return {
143
- watch: generateLibFiles,
144
- build: generateLibFiles
145
- };
146
- };
147
- },
148
- {
149
- name: "Stub"
150
- }
151
- );
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
+ });
152
190
 
153
191
  // src/chassis.ts
154
192
  var chassis_default = async (projectSettings) => {
155
193
  const { devPort, command } = projectSettings;
194
+ for (const sourceFolder of projectSettings.sourceFolders) {
195
+ for (const base of folderGenerators(sourceFolder)) {
196
+ if (!base.meta?.name || typeof base.factory !== "function") {
197
+ throw new Error(
198
+ `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`
199
+ );
200
+ }
201
+ const factory2 = base.factory(sourceFolder);
202
+ if (!factory2.meta?.name) {
203
+ throw new Error(
204
+ `${sourceFolder.name}: ${base.meta.name} generator is missing meta property`
205
+ );
206
+ }
207
+ try {
208
+ await factory2.start?.();
209
+ } catch (error) {
210
+ console.error(
211
+ styleText(
212
+ "red",
213
+ `${sourceFolder.name}: ${base.meta.name} generator failed to initialize`
214
+ )
215
+ );
216
+ throw error;
217
+ }
218
+ }
219
+ }
156
220
  if (command === "build") {
157
221
  for (const sourceFolder of projectSettings.sourceFolders) {
158
222
  const { config, baseurl } = sourceFolder;
159
- const { resolvers } = await routesFactory(sourceFolder, cacheFactory);
160
223
  const { createPath } = pathResolver3(sourceFolder);
161
- const resolvedEntries = [];
162
- const generators = folderGenerators(config);
224
+ const resolvedRoutes = [];
163
225
  {
164
- const spinner = spinnerFactory("Resolving Routes");
226
+ const { resolvers } = await routesFactory(sourceFolder, cacheFactory);
227
+ const spinner = spinnerFactory(
228
+ `${sourceFolder.name}: resolving routes`
229
+ );
165
230
  for (const { name, handler } of resolvers.values()) {
166
231
  spinner.append(
167
- `[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`
232
+ `[ ${resolvedRoutes.length + 1} of ${resolvers.size} ] ${name}`
168
233
  );
169
- resolvedEntries.push(await handler());
234
+ resolvedRoutes.push(await handler());
170
235
  }
171
- spinner.succeed();
236
+ spinner.succeed("ready \u2728");
172
237
  }
173
- for (const generator of generators) {
174
- const instance = await generator(sourceFolder);
175
- await instance.build(resolvedEntries);
238
+ const generators = folderGenerators(sourceFolder);
239
+ const plugins = [...config.plugins || []];
240
+ for (const base of generators) {
241
+ await base.factory(sourceFolder).build?.(resolvedRoutes);
242
+ plugins.push(...base.plugins?.(sourceFolder, command) || []);
176
243
  }
177
244
  {
178
245
  const outDir = createPath.distDir("client");
179
- await rm(outDir, { recursive: true, force: true });
180
246
  await build({
181
247
  ...config,
182
248
  configFile: false,
183
249
  root: createPath.src(),
184
250
  base: join(baseurl, "/"),
185
- define: {
186
- ...config.define,
187
- KOSMO_SSR_MODE: "false"
188
- },
251
+ plugins,
189
252
  resolve: {
190
253
  ...config.resolve,
191
254
  tsconfigPaths: true
@@ -193,23 +256,31 @@ var chassis_default = async (projectSettings) => {
193
256
  build: {
194
257
  ...config?.build,
195
258
  outDir,
196
- manifest: true
259
+ manifest: true,
260
+ emptyOutDir: true
197
261
  },
198
262
  cacheDir: cacheDir(sourceFolder, command, "client")
199
263
  });
200
264
  }
201
- if (generators.find((e) => getGeneratorMeta(e)?.slot === "api")) {
265
+ const apiGenerator = generators.find((e) => e.meta.slot === "api");
266
+ if (apiGenerator) {
202
267
  const dir = createPath.distDir("api");
203
- await rm(dir, { recursive: true, force: true });
268
+ const noExternal = Array.isArray(apiGenerator.options?.noExternal) ? apiGenerator.options.noExternal : generators.flatMap(({ meta }) => {
269
+ return Object.keys({
270
+ ...meta.dependencies,
271
+ ...meta.devDependencies
272
+ });
273
+ });
204
274
  await build({
205
275
  configFile: false,
206
276
  root: createPath.src(),
207
277
  appType: "custom",
208
- plugins: config.plugins || [],
278
+ plugins: [...apiGenerator.plugins?.(sourceFolder, command) || []],
209
279
  define: {
210
280
  ...config.define,
211
281
  KOSMO_PRODUCTION_BUILD: "true"
212
282
  },
283
+ ssr: { noExternal },
213
284
  resolve: {
214
285
  ...config.resolve,
215
286
  tsconfigPaths: true,
@@ -219,54 +290,75 @@ var chassis_default = async (projectSettings) => {
219
290
  ssr: true,
220
291
  target: "esnext",
221
292
  sourcemap: true,
293
+ emptyOutDir: true,
222
294
  rolldownOptions: {
223
295
  input: [createPath.api("app.ts"), createPath.api("server.ts")],
224
- output: { dir, format: "esm" }
296
+ output: {
297
+ dir,
298
+ format: "esm"
299
+ }
225
300
  }
226
301
  },
227
302
  cacheDir: cacheDir(sourceFolder, command, "backend")
228
303
  });
229
304
  }
305
+ for (const base of generators) {
306
+ await base.factory(sourceFolder).postBuild?.(resolvedRoutes);
307
+ }
230
308
  }
231
309
  return async () => {
232
310
  };
233
311
  }
234
- const requestHandlers = {};
312
+ const requestHandlers = [];
235
313
  const teardownHandlers = [];
314
+ const eventMap = {};
236
315
  for (const sourceFolder of projectSettings.sourceFolders) {
237
- const { config } = sourceFolder;
316
+ eventMap[sourceFolder.name] = await eventFactory(sourceFolder);
317
+ }
318
+ let port = await findFreePort(devPort);
319
+ for (const sourceFolder of projectSettings.sourceFolders) {
320
+ const { config, baseurl } = sourceFolder;
238
321
  const { createPath } = pathResolver3(sourceFolder);
239
322
  const requestMatchers = matchersFactory(sourceFolder);
240
- const port = await findFreePort(devPort);
323
+ const generators = folderGenerators(sourceFolder);
324
+ const plugins = [...config.plugins || []];
325
+ for (const base of generators) {
326
+ plugins.push(...base.plugins?.(sourceFolder, command) || []);
327
+ }
241
328
  const viteServer = await createServer({
242
329
  ...config,
243
330
  configFile: false,
244
331
  root: createPath.src(),
332
+ base: join(baseurl, "/"),
333
+ plugins,
245
334
  server: {
246
335
  ...config.server,
336
+ port: port++,
247
337
  middlewareMode: true,
248
- hmr: { port }
338
+ hmr: { port: port++ }
249
339
  },
250
340
  resolve: {
251
341
  ...config.resolve,
252
342
  tsconfigPaths: true
253
343
  },
254
344
  define: {
255
- ...config.define,
256
- KOSMO_SSR_MODE: "false"
345
+ ...config.define
257
346
  },
258
347
  cacheDir: cacheDir(sourceFolder, command, "client")
259
348
  });
260
- requestHandlers[sourceFolder.name] = [
349
+ for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {
350
+ viteServer.watcher.on(evt, handler);
351
+ }
352
+ requestHandlers.push([
353
+ [sourceFolder.baseurl],
261
354
  () => requestMatchers.base,
262
355
  () => viteServer.middlewares
263
- ];
356
+ ]);
264
357
  teardownHandlers.push(viteServer.close);
265
358
  }
266
359
  for (const sourceFolder of projectSettings.sourceFolders) {
267
360
  const { config } = sourceFolder;
268
- const events = await eventFactory(sourceFolder);
269
- if (!folderGenerators(config).find((e) => getGeneratorMeta(e)?.slot === "api")) {
361
+ if (!folderGenerators(sourceFolder).find((e) => e.meta.slot === "api")) {
270
362
  continue;
271
363
  }
272
364
  const { createPath } = pathResolver3(sourceFolder);
@@ -275,8 +367,11 @@ var chassis_default = async (projectSettings) => {
275
367
  configFile: false,
276
368
  root: createPath.src(),
277
369
  appType: "custom",
278
- server: { middlewareMode: true },
279
- plugins: config.plugins || [],
370
+ server: {
371
+ port: port++,
372
+ middlewareMode: true,
373
+ hmr: { port: port++ }
374
+ },
280
375
  resolve: { tsconfigPaths: true },
281
376
  define: {
282
377
  ...config?.define,
@@ -292,55 +387,40 @@ var chassis_default = async (projectSettings) => {
292
387
  cacheDir: cacheDir(sourceFolder, command, "backend")
293
388
  });
294
389
  const env = viteServer.environments.api;
295
- if (isRunnableDevEnvironment(env)) {
296
- const load = async () => {
297
- env.runner.clearCache();
298
- return env.runner.import(join(defaults.apiDir, "dev.ts")).then((e) => e.default);
299
- };
300
- let devSetup = await load();
301
- for (const [event, handler] of [
302
- ["add", events.create],
303
- ["unlink", events.update],
304
- ["change", events.update]
305
- ]) {
306
- viteServer.watcher.on(event, async (file) => {
307
- const mods = env.moduleGraph.getModulesByFile(file);
308
- if (mods?.size) {
309
- await handler(file);
310
- await devSetup?.teardownHandler?.();
311
- devSetup = await load();
312
- }
313
- });
314
- }
315
- requestHandlers[`${sourceFolder.name}/api`] = [
316
- () => devSetup.requestMatcher || requestMatchers.api,
317
- () => devSetup.requestHandler()
318
- ];
319
- teardownHandlers.push(viteServer.close);
320
- } else {
321
- console.warn(
322
- styleText(
323
- "red",
324
- `${sourceFolder.name}: api environment is not runnable`
325
- )
326
- );
327
- console.warn(
328
- `Ensure no custom createEnvironment override is preventing it, got "${env.constructor.name}"`
329
- );
330
- console.warn();
331
- try {
332
- await viteServer.close();
333
- } catch (error) {
334
- console.error(
335
- styleText("red", `${sourceFolder.name}: dev server failed to close`)
336
- );
337
- console.error(error.message);
338
- }
390
+ const loadDevSetup = async () => {
391
+ env.runner.clearCache();
392
+ return env.runner.import(join(defaults.apiDir, "dev.ts")).then((e) => e.default);
393
+ };
394
+ let devSetup = await loadDevSetup();
395
+ for (const [evt, handler] of Object.entries(eventMap[sourceFolder.name])) {
396
+ viteServer.watcher.on(evt, async (file) => {
397
+ const mods = env.moduleGraph.getModulesByFile(file);
398
+ if (mods?.size) {
399
+ await handler(file);
400
+ await devSetup?.teardownHandler?.();
401
+ devSetup = await loadDevSetup();
402
+ }
403
+ });
339
404
  }
405
+ requestHandlers.push([
406
+ [sourceFolder.baseurl, sourceFolder.apiurl],
407
+ () => devSetup.requestMatcher || requestMatchers.api,
408
+ () => devSetup.requestHandler()
409
+ ]);
410
+ teardownHandlers.push(viteServer.close);
340
411
  }
341
- const handlers = Object.entries(requestHandlers).sort(([a], [b]) => b.split("/").length - a.split("/").length).map(([, factories]) => factories);
412
+ const requestHandlerWeight = ([
413
+ segments
414
+ ]) => {
415
+ const [base, api] = segments;
416
+ const weight = base.split("/").filter(Boolean).length;
417
+ return api ? weight + 5 : weight;
418
+ };
419
+ const handlers = requestHandlers.sort(
420
+ (a, b) => requestHandlerWeight(b) - requestHandlerWeight(a)
421
+ );
342
422
  const httpServer = http.createServer((req, res) => {
343
- for (const [matcherFactory, handlerFactory] of handlers) {
423
+ for (const [, matcherFactory, handlerFactory] of handlers) {
344
424
  const [matcher, handler] = [matcherFactory(), handlerFactory()];
345
425
  if (matcher(req)) {
346
426
  handler(req, res);
@@ -371,30 +451,30 @@ var chassis_default = async (projectSettings) => {
371
451
  var cacheDir = ({ root, name }, command, mode) => {
372
452
  return resolve2(root, `var/.vite/${name}/${command}/${mode}`);
373
453
  };
374
- var folderGenerators = (config) => {
375
- const apiGenerator = config.generators?.find(
376
- (e) => getGeneratorMeta(e)?.slot === "api"
377
- );
378
- const fetchGenerator = config.generators?.find(
379
- (e) => getGeneratorMeta(e)?.slot === "fetch"
380
- );
381
- const ssrGenerator = config.generators?.find(
382
- (e) => getGeneratorMeta(e)?.slot === "ssr"
383
- );
454
+ var folderGenerators = (sourceFolder) => {
455
+ const { generators = [] } = sourceFolder.config;
456
+ const coreGenerators = {};
457
+ const userGenerators = [];
458
+ for (const base of generators) {
459
+ if (base.meta.slot) {
460
+ coreGenerators[base.meta.slot] = base;
461
+ } else {
462
+ userGenerators.push(base);
463
+ }
464
+ }
384
465
  return [
385
- // 1. stub generator should run first
386
- stub_generator_default(),
387
- // 2. then api generator
388
- ...apiGenerator ? [apiGenerator] : [],
389
- // 3. then fetch generator, only if api generator also enabled
390
- ...fetchGenerator && apiGenerator ? [fetchGenerator] : [],
391
- // 4. user generators in the order they were added
392
- ...config.generators?.filter((e) => {
393
- const slot = getGeneratorMeta(e)?.slot;
394
- return slot ? !["api", "fetch", "ssr"].includes(slot) : true;
395
- }) || [],
396
- // 5. ssr generator should run last
397
- ...ssrGenerator ? [ssrGenerator] : []
466
+ // core generator should run first
467
+ core_generator_default(),
468
+ // then api generator
469
+ ...coreGenerators.api ? [coreGenerators.api] : [],
470
+ // then fetch generator, only if api generator also enabled
471
+ ...coreGenerators.fetch && coreGenerators.api ? [coreGenerators.fetch] : [],
472
+ // then user generators in the order they were added
473
+ ...userGenerators,
474
+ // then ssr generator should run after user generators
475
+ ...coreGenerators.ssr ? [coreGenerators.ssr] : [],
476
+ // and ssg generator should run last
477
+ ...coreGenerators.ssg ? [coreGenerators.ssg] : []
398
478
  ];
399
479
  };
400
480
  var eventFactory = async (sourceFolder) => {
@@ -404,40 +484,23 @@ var eventFactory = async (sourceFolder) => {
404
484
  );
405
485
  const { createPath } = pathResolver3(sourceFolder);
406
486
  const generators = [];
407
- for (const generator of folderGenerators(sourceFolder.config)) {
408
- const meta = getGeneratorMeta(generator);
409
- if (!meta) {
410
- console.error(
411
- styleText(
412
- "red",
413
- `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`
414
- )
415
- );
416
- continue;
417
- }
418
- try {
419
- const instance = await generator(sourceFolder);
420
- generators.push({ name: meta.name, instance });
421
- } catch (error) {
422
- console.error(
423
- styleText(
424
- "red",
425
- `${sourceFolder.name}: ${meta.name} generator failed to initialize`
426
- )
427
- );
428
- console.error(error);
429
- }
487
+ for (const base of folderGenerators(sourceFolder)) {
488
+ const factory2 = base.factory(sourceFolder);
489
+ generators.push({ name: base.meta.name, factory: factory2 });
430
490
  }
431
- const resolvedEntries = /* @__PURE__ */ new Map();
491
+ const resolvedRoutes = /* @__PURE__ */ new Map();
432
492
  const runGenerators = async (event) => {
433
- const entries = Array.from(resolvedEntries.values());
434
- for (const { name, instance } of generators) {
493
+ const entries = Array.from(resolvedRoutes.values());
494
+ for (const { name, factory: factory2 } of generators) {
435
495
  try {
436
- await instance.watch(entries, event);
496
+ await factory2.watch?.(entries, event);
437
497
  } catch (error) {
438
498
  console.error(
439
499
  styleText("red", `${sourceFolder.name}: ${name} generator failed`)
440
500
  );
501
+ if (event) {
502
+ console.error(event);
503
+ }
441
504
  console.error(error);
442
505
  }
443
506
  }
@@ -449,7 +512,7 @@ var eventFactory = async (sourceFolder) => {
449
512
  }
450
513
  try {
451
514
  const resolvedEntry = await resolver.handler(file);
452
- resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
515
+ resolvedRoutes.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
453
516
  return resolvedEntry;
454
517
  } catch (error) {
455
518
  const route = file.replace(`${createPath.api()}/`, "");
@@ -464,24 +527,19 @@ var eventFactory = async (sourceFolder) => {
464
527
  }
465
528
  };
466
529
  {
467
- let spinner = spinnerFactory("Resolving Routes");
530
+ const spinner = spinnerFactory(`${sourceFolder.name}: resolving routes`);
468
531
  for (const { name, handler } of resolvers.values()) {
469
532
  spinner.append(
470
- `${sourceFolder.name}: [ ${resolvedEntries.size + 1} of ${resolvers.size} ] ${name}`
533
+ `[ ${resolvedRoutes.size + 1} of ${resolvers.size} ] ${name}`
471
534
  );
472
- try {
473
- const resolvedEntry = await handler();
474
- resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);
475
- } catch (error) {
476
- spinner.failed(error);
477
- spinner = spinnerFactory("Resolving Routes");
478
- }
535
+ const route = await handler();
536
+ resolvedRoutes.set(route.entry.fileFullpath, route);
479
537
  }
480
- spinner.succeed();
538
+ spinner.succeed("ready \u2728");
481
539
  }
482
540
  await runGenerators();
483
541
  return {
484
- async create(file) {
542
+ async add(file) {
485
543
  const [resolver] = resolversFactory([file]).values();
486
544
  if (!resolver) {
487
545
  return;
@@ -492,11 +550,11 @@ var eventFactory = async (sourceFolder) => {
492
550
  await runGenerators({ kind: "create", file });
493
551
  }
494
552
  },
495
- async update(file) {
496
- if (resolvedEntries.has(file)) {
553
+ async change(file) {
554
+ if (resolvedRoutes.has(file)) {
497
555
  await updateResolvedEntry(file);
498
556
  } else {
499
- const relatedRoutes = resolvedEntries.values().flatMap(({ kind, entry }) => {
557
+ const relatedRoutes = resolvedRoutes.values().flatMap(({ kind, entry }) => {
500
558
  return kind === "apiRoute" ? entry.referencedFiles.includes(file) ? [entry] : [] : [];
501
559
  });
502
560
  for (const route of relatedRoutes) {
@@ -505,9 +563,9 @@ var eventFactory = async (sourceFolder) => {
505
563
  }
506
564
  await runGenerators({ kind: "update", file });
507
565
  },
508
- async delete(file) {
566
+ async unlink(file) {
509
567
  resolvers.delete(file);
510
- resolvedEntries.delete(file);
568
+ resolvedRoutes.delete(file);
511
569
  await runGenerators({ kind: "delete", file });
512
570
  }
513
571
  };
@@ -537,7 +595,7 @@ var findFreePort = async (devPort) => {
537
595
  break;
538
596
  }
539
597
  }
540
- if (maxPort > 65e3) {
598
+ if (maxPort >= 65e3) {
541
599
  throw new Error("the devPort in package.json should be less than 64000");
542
600
  }
543
601
  const range = maxPort - minPort + 1;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/chassis.ts", "../src/cache.ts", "../src/stub-generator/index.ts", "load-as-text:/volumes/studio/OpenSource/KosmoJS/Kosmo/packages/core/dev/src/stub-generator/templates/env.d.ts", "../src/stub-generator/templates/gitignore.hbs", "../src/stub-generator/templates/schemas.hbs"],
4
- "sourcesContent": ["import { rm } from \"node:fs/promises\";\nimport 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, isRunnableDevEnvironment } from \"vite\";\n\nimport type { DevSetup } from \"@kosmojs/api\";\nimport {\n defaults,\n type FolderConfig,\n type GeneratorFactory,\n getGeneratorMeta,\n type ProjectSettings,\n pathResolver,\n type ResolvedEntry,\n routesFactory,\n type SourceFolder,\n spinnerFactory,\n type WatcherEvent,\n} from \"@kosmojs/lib\";\n\nimport { cacheFactory } from \"./cache\";\nimport stubGenerator from \"./stub-generator\";\n\nexport default async (\n projectSettings: ProjectSettings,\n): Promise<() => Promise<void>> => {\n const { devPort, command } = projectSettings;\n\n if (command === \"build\") {\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config, baseurl } = sourceFolder;\n const { resolvers } = await routesFactory(sourceFolder, cacheFactory);\n const { createPath } = pathResolver(sourceFolder);\n\n const resolvedEntries = [];\n const generators = folderGenerators(config);\n\n // resolving routes\n {\n const spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `[ ${resolvedEntries.length + 1} of ${resolvers.size} ] ${name}`,\n );\n resolvedEntries.push(await handler());\n }\n\n spinner.succeed();\n }\n\n // running generators for resolved routes\n for (const generator of generators) {\n const instance = await generator(sourceFolder);\n await instance.build(resolvedEntries);\n }\n\n // build client\n {\n const outDir = createPath.distDir(\"client\");\n\n // emptyOutDir wont work cause outDir is outside project root\n await rm(outDir, { recursive: true, force: true });\n\n await build({\n ...config,\n configFile: false,\n root: createPath.src(),\n base: join(baseurl, \"/\"),\n define: {\n ...config.define,\n KOSMO_SSR_MODE: \"false\",\n },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n build: {\n ...config?.build,\n outDir,\n manifest: true,\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n }\n\n // build backend\n if (generators.find((e) => getGeneratorMeta(e)?.slot === \"api\")) {\n const dir = createPath.distDir(\"api\");\n\n // emptyOutDir wont work cause dir is outside project root\n await rm(dir, { recursive: true, force: true });\n\n await build({\n configFile: false,\n root: createPath.src(),\n appType: \"custom\",\n plugins: config.plugins || [],\n define: {\n ...config.define,\n KOSMO_PRODUCTION_BUILD: \"true\",\n },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n conditions: [\"node\"],\n },\n build: {\n ssr: true,\n target: \"esnext\",\n sourcemap: true,\n rolldownOptions: {\n input: [createPath.api(\"app.ts\"), createPath.api(\"server.ts\")],\n output: { dir, format: \"esm\" },\n },\n },\n cacheDir: cacheDir(sourceFolder, command, \"backend\"),\n });\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: Record<\n string,\n [matcherFactory: () => RequestMatcher, handlerFactory: () => RequestHandler]\n > = {};\n\n const teardownHandlers: Array<() => Promise<unknown>> = [];\n\n // bootstraping client servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n const { createPath } = pathResolver(sourceFolder);\n const requestMatchers = matchersFactory(sourceFolder);\n const port = await findFreePort(devPort);\n\n const viteServer = await createServer({\n ...config,\n configFile: false,\n root: createPath.src(),\n server: {\n ...config.server,\n middlewareMode: true,\n hmr: { port },\n },\n resolve: {\n ...config.resolve,\n tsconfigPaths: true,\n },\n define: {\n ...config.define,\n KOSMO_SSR_MODE: \"false\",\n },\n cacheDir: cacheDir(sourceFolder, command, \"client\"),\n });\n\n requestHandlers[sourceFolder.name] = [\n () => requestMatchers.base,\n () => viteServer.middlewares,\n ];\n\n teardownHandlers.push(viteServer.close);\n }\n\n // bootstraping backend servers\n for (const sourceFolder of projectSettings.sourceFolders) {\n const { config } = sourceFolder;\n\n const events = await eventFactory(sourceFolder);\n\n if (\n !folderGenerators(config).find((e) => getGeneratorMeta(e)?.slot === \"api\")\n ) {\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: { middlewareMode: true },\n plugins: config.plugins || [],\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;\n\n if (isRunnableDevEnvironment(env)) {\n const load = 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 load();\n\n for (const [event, handler] of [\n [\"add\", events.create],\n [\"unlink\", events.update],\n [\"change\", events.update],\n ] as const) {\n viteServer.watcher.on(event, async (file) => {\n const mods = env.moduleGraph.getModulesByFile(file);\n if (mods?.size) {\n await handler(file);\n await devSetup?.teardownHandler?.();\n devSetup = await load();\n }\n });\n }\n\n requestHandlers[`${sourceFolder.name}/api`] = [\n () => devSetup.requestMatcher || requestMatchers.api,\n () => devSetup.requestHandler(),\n ];\n\n teardownHandlers.push(viteServer.close);\n } else {\n console.warn(\n styleText(\n \"red\",\n `${sourceFolder.name}: api environment is not runnable`,\n ),\n );\n console.warn(\n `Ensure no custom createEnvironment override is preventing it, got \"${env.constructor.name}\"`,\n );\n console.warn();\n try {\n await viteServer.close();\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n console.error(\n styleText(\"red\", `${sourceFolder.name}: dev server failed to close`),\n );\n console.error(error.message);\n }\n }\n }\n\n // sorting is essential to avoid matching /app before /app/admin\n const handlers = Object.entries(requestHandlers)\n .sort(([a], [b]) => b.split(\"/\").length - a.split(\"/\").length)\n .map(([, factories]) => factories);\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 = (config: FolderConfig) => {\n const apiGenerator = config.generators?.find(\n (e) => getGeneratorMeta(e)?.slot === \"api\",\n );\n\n const fetchGenerator = config.generators?.find(\n (e) => getGeneratorMeta(e)?.slot === \"fetch\",\n );\n\n const ssrGenerator = config.generators?.find(\n (e) => getGeneratorMeta(e)?.slot === \"ssr\",\n );\n\n return [\n // 1. stub generator should run first\n stubGenerator(),\n // 2. then api generator\n ...(apiGenerator ? [apiGenerator] : []),\n // 3. then fetch generator, only if api generator also enabled\n ...(fetchGenerator && apiGenerator ? [fetchGenerator] : []),\n // 4. user generators in the order they were added\n ...(config.generators?.filter((e) => {\n const slot = getGeneratorMeta(e)?.slot;\n return slot //\n ? ![\"api\", \"fetch\", \"ssr\"].includes(slot)\n : true;\n }) || []),\n // 5. ssr generator should run last\n ...(ssrGenerator ? [ssrGenerator] : []),\n ];\n};\n\nconst eventFactory = async (\n sourceFolder: SourceFolder,\n): Promise<\n Record<\"create\" | \"update\" | \"delete\", (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 instance: Awaited<ReturnType<GeneratorFactory>>;\n }> = [];\n\n for (const generator of folderGenerators(sourceFolder.config)) {\n const meta = getGeneratorMeta(generator);\n\n if (!meta) {\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: Unrecognized generator - must be created via defineGenerator()`,\n ),\n );\n continue;\n }\n\n try {\n const instance = await generator(sourceFolder);\n generators.push({ name: meta.name, instance });\n } catch (error) {\n console.error(\n styleText(\n \"red\",\n `${sourceFolder.name}: ${meta.name} generator failed to initialize`,\n ),\n );\n console.error(error);\n }\n }\n\n const resolvedEntries = 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(resolvedEntries.values());\n\n for (const { name, instance } of generators) {\n try {\n await instance.watch(entries, event);\n } catch (error) {\n console.error(\n styleText(\"red\", `${sourceFolder.name}: ${name} generator failed`),\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 resolvedEntries.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 let spinner = spinnerFactory(\"Resolving Routes\");\n\n for (const { name, handler } of resolvers.values()) {\n spinner.append(\n `${sourceFolder.name}: [ ${resolvedEntries.size + 1} of ${resolvers.size} ] ${name}`,\n );\n try {\n const resolvedEntry = await handler();\n resolvedEntries.set(resolvedEntry.entry.fileFullpath, resolvedEntry);\n } catch (\n // biome-ignore lint: any\n error: any\n ) {\n spinner.failed(error);\n spinner = spinnerFactory(\"Resolving Routes\");\n }\n }\n\n spinner.succeed();\n }\n\n // NOTE: call only after generators initialized and routes resolved\n await runGenerators();\n\n return {\n async create(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 update(file: string) {\n if (resolvedEntries.has(file)) {\n // route updated\n await updateResolvedEntry(file);\n } else {\n // updating entries that are referencing updated file\n const relatedRoutes = resolvedEntries\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 delete(file) {\n // route deleted\n resolvers.delete(file);\n resolvedEntries.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\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 {\n pathExists,\n pathResolver,\n type RouteResolverCache,\n type RouteResolverCacheFactory,\n} 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 {\n defineGenerator,\n pathResolver,\n type ResolvedEntry,\n renderToFile,\n} from \"@kosmojs/lib\";\n\nimport envTpl from \"./templates/env.d.ts?as=text\";\nimport gitignoreTpl from \"./templates/gitignore.hbs\";\nimport schemasTpl from \"./templates/schemas.hbs\";\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 () => {\n return async (sourceFolder) => {\n const generateLibFiles = async (entries: Array<ResolvedEntry>) => {\n const { createPath } = pathResolver(sourceFolder);\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\"), envTpl, {});\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 gitignoreTpl,\n {},\n { overwrite: false },\n );\n\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 schemasTpl,\n { route: entry },\n { overwrite: false },\n );\n }\n }\n };\n\n return {\n watch: generateLibFiles,\n build: generateLibFiles,\n };\n };\n },\n {\n name: \"Stub\",\n },\n);\n", "declare const KOSMO_PRODUCTION_BUILD: boolean;\ndeclare const KOSMO_SSR_MODE: 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/api\";\nexport type { ValidationSchemas };\nexport const validationSchemas: ValidationSchemas = {};\n"],
5
- "mappings": "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",
6
- "names": ["resolve", "pathResolver", "hash", "dirname", "pathResolver", "pathResolver", "dirname", "pathResolver", "resolve", "freePort"]
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"]
7
7
  }
@@ -3,5 +3,5 @@
3
3
  * Ensures cross-generator dependencies remain resolvable
4
4
  * even if specialized generators supposed to generate these files are not installed.
5
5
  * */
6
- declare const _default: () => import("@kosmojs/lib").GeneratorFactory;
6
+ declare const _default: () => import("@kosmojs/core").GeneratorBase;
7
7
  export default _default;
@@ -0,0 +1,3 @@
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";
package/pkg/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
- import type { FolderConfig } from "@kosmojs/lib";
1
+ import type { FolderConfig } from "@kosmojs/core";
2
2
  export { default as fetchGenerator } from "@kosmojs/fetch-generator";
3
3
  export { default as honoGenerator } from "@kosmojs/hono-generator";
4
4
  export { default as koaGenerator } from "@kosmojs/koa-generator";
5
+ export { default as mdxGenerator } from "@kosmojs/mdx-generator";
5
6
  export { default as openapiGenerator } from "@kosmojs/openapi-generator";
6
7
  export { default as reactGenerator } from "@kosmojs/react-generator";
7
8
  export { default as solidGenerator } from "@kosmojs/solid-generator";
9
+ export { default as ssgGenerator } from "@kosmojs/ssg-generator";
8
10
  export { default as ssrGenerator } from "@kosmojs/ssr-generator";
9
11
  export { default as typeboxGenerator } from "@kosmojs/typebox-generator";
10
12
  export { default as vueGenerator } from "@kosmojs/vue-generator";
package/pkg/index.js CHANGED
@@ -2,12 +2,14 @@
2
2
  import { default as default2 } from "@kosmojs/fetch-generator";
3
3
  import { default as default3 } from "@kosmojs/hono-generator";
4
4
  import { default as default4 } from "@kosmojs/koa-generator";
5
- import { default as default5 } from "@kosmojs/openapi-generator";
6
- import { default as default6 } from "@kosmojs/react-generator";
7
- import { default as default7 } from "@kosmojs/solid-generator";
8
- import { default as default8 } from "@kosmojs/ssr-generator";
9
- import { default as default9 } from "@kosmojs/typebox-generator";
10
- import { default as default10 } from "@kosmojs/vue-generator";
5
+ import { default as default5 } from "@kosmojs/mdx-generator";
6
+ import { default as default6 } from "@kosmojs/openapi-generator";
7
+ import { default as default7 } from "@kosmojs/react-generator";
8
+ import { default as default8 } from "@kosmojs/solid-generator";
9
+ import { default as default9 } from "@kosmojs/ssg-generator";
10
+ import { default as default10 } from "@kosmojs/ssr-generator";
11
+ import { default as default11 } from "@kosmojs/typebox-generator";
12
+ import { default as default12 } from "@kosmojs/vue-generator";
11
13
  var defineConfig = (config) => {
12
14
  return config;
13
15
  };
@@ -16,11 +18,13 @@ export {
16
18
  default2 as fetchGenerator,
17
19
  default3 as honoGenerator,
18
20
  default4 as koaGenerator,
19
- default5 as openapiGenerator,
20
- default6 as reactGenerator,
21
- default7 as solidGenerator,
22
- default8 as ssrGenerator,
23
- default9 as typeboxGenerator,
24
- default10 as vueGenerator
21
+ default5 as mdxGenerator,
22
+ default6 as openapiGenerator,
23
+ default7 as reactGenerator,
24
+ default8 as solidGenerator,
25
+ default9 as ssgGenerator,
26
+ default10 as ssrGenerator,
27
+ default11 as typeboxGenerator,
28
+ default12 as vueGenerator
25
29
  };
26
30
  //# sourceMappingURL=index.js.map
package/pkg/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import type { FolderConfig } from \"@kosmojs/lib\";\n\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\nexport { default as honoGenerator } from \"@kosmojs/hono-generator\";\nexport { default as koaGenerator } from \"@kosmojs/koa-generator\";\nexport { default as openapiGenerator } from \"@kosmojs/openapi-generator\";\nexport { default as reactGenerator } from \"@kosmojs/react-generator\";\nexport { default as solidGenerator } from \"@kosmojs/solid-generator\";\nexport { default as ssrGenerator } from \"@kosmojs/ssr-generator\";\nexport { default as typeboxGenerator } from \"@kosmojs/typebox-generator\";\nexport { default as vueGenerator } from \"@kosmojs/vue-generator\";\n\nexport const defineConfig: (config: FolderConfig) => FolderConfig = (\n config,\n) => {\n return config;\n};\n"],
5
- "mappings": ";AAEA,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAgC;AACzC,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,gBAAmC;AAC5C,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,gBAAmC;AAC5C,SAAoB,WAAXA,iBAA+B;AAEjC,IAAM,eAAuD,CAClE,WACG;AACH,SAAO;AACT;",
4
+ "sourcesContent": ["import type { FolderConfig } from \"@kosmojs/core\";\n\nexport { default as fetchGenerator } from \"@kosmojs/fetch-generator\";\nexport { default as honoGenerator } from \"@kosmojs/hono-generator\";\nexport { default as koaGenerator } from \"@kosmojs/koa-generator\";\nexport { default as mdxGenerator } from \"@kosmojs/mdx-generator\";\nexport { default as openapiGenerator } from \"@kosmojs/openapi-generator\";\nexport { default as reactGenerator } from \"@kosmojs/react-generator\";\nexport { default as solidGenerator } from \"@kosmojs/solid-generator\";\nexport { default as ssgGenerator } from \"@kosmojs/ssg-generator\";\nexport { default as ssrGenerator } from \"@kosmojs/ssr-generator\";\nexport { default as typeboxGenerator } from \"@kosmojs/typebox-generator\";\nexport { default as vueGenerator } from \"@kosmojs/vue-generator\";\n\nexport const defineConfig: (config: FolderConfig) => FolderConfig = (\n config,\n) => {\n return config;\n};\n"],
5
+ "mappings": ";AAEA,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAgC;AACzC,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,gBAAmC;AAC5C,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAAiC;AAC1C,SAAoB,WAAXA,gBAA+B;AACxC,SAAoB,WAAXA,iBAA+B;AACxC,SAAoB,WAAXA,iBAAmC;AAC5C,SAAoB,WAAXA,iBAA+B;AAEjC,IAAM,eAAuD,CAClE,WACG;AACH,SAAO;AACT;",
6
6
  "names": ["default"]
7
7
  }