@devlusoft/devix 0.2.0 → 0.2.2

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.
Files changed (85) hide show
  1. package/dist/cli/build.js +31 -308
  2. package/dist/cli/build.js.map +3 -3
  3. package/dist/cli/dev.js +33 -395
  4. package/dist/cli/dev.js.map +3 -3
  5. package/dist/cli/generate.js +31 -434
  6. package/dist/cli/generate.js.map +3 -3
  7. package/dist/cli/index.js +34 -698
  8. package/dist/cli/index.js.map +3 -3
  9. package/dist/cli/start.js +1 -89
  10. package/dist/cli/start.js.map +2 -2
  11. package/dist/config.js +1 -16
  12. package/dist/config.js.map +2 -2
  13. package/dist/runtime/api-context.js +1 -17
  14. package/dist/runtime/api-context.js.map +2 -2
  15. package/dist/runtime/client-router.js +1 -58
  16. package/dist/runtime/client-router.js.map +2 -2
  17. package/dist/runtime/context.js +1 -14
  18. package/dist/runtime/context.js.map +2 -2
  19. package/dist/runtime/error-boundary.js +1 -36
  20. package/dist/runtime/error-boundary.js.map +2 -2
  21. package/dist/runtime/fetch.js +1 -34
  22. package/dist/runtime/fetch.js.map +2 -2
  23. package/dist/runtime/head.js +1 -68
  24. package/dist/runtime/head.js.map +2 -2
  25. package/dist/runtime/index.d.ts +1 -0
  26. package/dist/runtime/index.js +1 -367
  27. package/dist/runtime/index.js.map +3 -3
  28. package/dist/runtime/link.js +1 -42
  29. package/dist/runtime/link.js.map +2 -2
  30. package/dist/runtime/metadata.js +1 -21
  31. package/dist/runtime/metadata.js.map +2 -2
  32. package/dist/runtime/router-provider.js +1 -258
  33. package/dist/runtime/router-provider.js.map +2 -2
  34. package/dist/server/api-router.js +1 -64
  35. package/dist/server/api-router.js.map +2 -2
  36. package/dist/server/api.js +1 -123
  37. package/dist/server/api.js.map +2 -2
  38. package/dist/server/collect-css.js +1 -14
  39. package/dist/server/collect-css.js.map +2 -2
  40. package/dist/server/index.js +1 -132
  41. package/dist/server/index.js.map +2 -2
  42. package/dist/server/pages-router.js +1 -63
  43. package/dist/server/pages-router.js.map +2 -2
  44. package/dist/server/render.js +1 -305
  45. package/dist/server/render.js.map +2 -2
  46. package/dist/server/routes.js +1 -41
  47. package/dist/server/routes.js.map +2 -2
  48. package/dist/utils/async.js +1 -13
  49. package/dist/utils/async.js.map +2 -2
  50. package/dist/utils/banner.js +1 -33
  51. package/dist/utils/banner.js.map +2 -2
  52. package/dist/utils/cookies.js +1 -28
  53. package/dist/utils/cookies.js.map +2 -2
  54. package/dist/utils/duration.js +1 -21
  55. package/dist/utils/duration.js.map +2 -2
  56. package/dist/utils/env.js +1 -13
  57. package/dist/utils/env.js.map +2 -2
  58. package/dist/utils/html.js +1 -11
  59. package/dist/utils/html.js.map +2 -2
  60. package/dist/utils/patterns.js +1 -7
  61. package/dist/utils/patterns.js.map +2 -2
  62. package/dist/utils/response.d.ts +4 -1
  63. package/dist/utils/response.js +1 -9
  64. package/dist/utils/response.js.map +3 -3
  65. package/dist/vite/codegen/api.js +6 -12
  66. package/dist/vite/codegen/api.js.map +2 -2
  67. package/dist/vite/codegen/client-routes.js +6 -12
  68. package/dist/vite/codegen/client-routes.js.map +2 -2
  69. package/dist/vite/codegen/context.js +2 -8
  70. package/dist/vite/codegen/context.js.map +2 -2
  71. package/dist/vite/codegen/entry-client.js +4 -10
  72. package/dist/vite/codegen/entry-client.js.map +2 -2
  73. package/dist/vite/codegen/extract-methods.js +1 -15
  74. package/dist/vite/codegen/extract-methods.js.map +2 -2
  75. package/dist/vite/codegen/render.js +6 -12
  76. package/dist/vite/codegen/render.js.map +2 -2
  77. package/dist/vite/codegen/routes-dts.js +12 -49
  78. package/dist/vite/codegen/routes-dts.js.map +3 -3
  79. package/dist/vite/codegen/scan-api.js +1 -77
  80. package/dist/vite/codegen/scan-api.js.map +3 -3
  81. package/dist/vite/codegen/write-routes-dts.js +1 -16
  82. package/dist/vite/codegen/write-routes-dts.js.map +2 -2
  83. package/dist/vite/index.js +31 -247
  84. package/dist/vite/index.js.map +3 -3
  85. package/package.json +2 -2
package/dist/cli/index.js CHANGED
@@ -1,14 +1,7 @@
1
1
  #!/usr/bin/env node
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __esm = (fn, res) => function __init() {
4
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
5
- };
6
-
7
- // src/vite/codegen/entry-client.ts
8
- function generateEntryClient({ cssUrls }) {
9
- const cssImports = cssUrls.map((u) => `import '${u}'`).join("\n");
10
- return `
11
- ${cssImports}
2
+ var s=(e,t)=>()=>(e&&(t=e(e=0)),t);function Q({cssUrls:e}){return`
3
+ ${e.map(r=>`import '${r}'`).join(`
4
+ `)}
12
5
  import "@vitejs/plugin-react/preamble"
13
6
  import React from "react"
14
7
  import {hydrateRoot, createRoot} from 'react-dom/client'
@@ -62,22 +55,12 @@ if (!window.__DEVIX__) {
62
55
  )
63
56
  }
64
57
  }
65
- `;
66
- }
67
- var init_entry_client = __esm({
68
- "src/vite/codegen/entry-client.ts"() {
69
- "use strict";
70
- }
71
- });
72
-
73
- // src/vite/codegen/client-routes.ts
74
- function generateClientRoutes({ pagesDir, matcherPath }) {
75
- return `
58
+ `}var ee=s(()=>{"use strict"});function te({pagesDir:e,matcherPath:t}){return`
76
59
  import React from 'react'
77
- import { createMatcher } from '${matcherPath}'
78
- const pageFiles = import.meta.glob(['/${pagesDir}/**/*.tsx', '!**/error.tsx', '!**/layout.tsx'])
79
- const layoutFiles = import.meta.glob('/${pagesDir}/**/layout.tsx')
80
- const errorFiles = import.meta.glob('/${pagesDir}/**/error.tsx')
60
+ import { createMatcher } from '${t}'
61
+ const pageFiles = import.meta.glob(['/${e}/**/*.tsx', '!**/error.tsx', '!**/layout.tsx'])
62
+ const layoutFiles = import.meta.glob('/${e}/**/layout.tsx')
63
+ const errorFiles = import.meta.glob('/${e}/**/error.tsx')
81
64
 
82
65
  export const matchClientRoute = createMatcher(pageFiles, layoutFiles)
83
66
 
@@ -100,26 +83,16 @@ export function getDefaultErrorPage() {
100
83
  )
101
84
  }
102
85
  }
103
- `;
104
- }
105
- var init_client_routes = __esm({
106
- "src/vite/codegen/client-routes.ts"() {
107
- "use strict";
108
- }
109
- });
86
+ `}var re=s(()=>{"use strict"});function oe({pagesDir:e,renderPath:t}){return`
87
+ import { render as _render, runLoader as _runLoader, getStaticRoutes as _getStaticRoutes } from '${t}'
110
88
 
111
- // src/vite/codegen/render.ts
112
- function generateRender({ pagesDir, renderPath }) {
113
- return `
114
- import { render as _render, runLoader as _runLoader, getStaticRoutes as _getStaticRoutes } from '${renderPath}'
115
-
116
- const _pages = import.meta.glob(['/${pagesDir}/**/*.tsx', '!**/error.tsx', '!**/layout.tsx'])
117
- const _layouts = import.meta.glob('/${pagesDir}/**/layout.tsx')
89
+ const _pages = import.meta.glob(['/${e}/**/*.tsx', '!**/error.tsx', '!**/layout.tsx'])
90
+ const _layouts = import.meta.glob('/${e}/**/layout.tsx')
118
91
 
119
92
  const _glob = {
120
93
  pages: _pages,
121
94
  layouts: _layouts,
122
- pagesDir: '/${pagesDir}',
95
+ pagesDir: '/${e}',
123
96
  }
124
97
 
125
98
  export function render(url, request, options) {
@@ -133,679 +106,48 @@ export function runLoader(url, request, options) {
133
106
  export function getStaticRoutes() {
134
107
  return _getStaticRoutes(_glob)
135
108
  }
136
- `;
137
- }
138
- var init_render = __esm({
139
- "src/vite/codegen/render.ts"() {
140
- "use strict";
141
- }
142
- });
109
+ `}var ne=s(()=>{"use strict"});function ie({apiPath:e,appDir:t}){return`
110
+ import { handleApiRequest as _handleApiRequest } from '${e}'
143
111
 
144
- // src/vite/codegen/api.ts
145
- function generateApi({ apiPath, appDir }) {
146
- return `
147
- import { handleApiRequest as _handleApiRequest } from '${apiPath}'
148
-
149
- const _routes = import.meta.glob(['/${appDir}/api/**/*.ts', '!**/middleware.ts'])
150
- const _middlewares = import.meta.glob('/${appDir}/api/**/middleware.ts')
112
+ const _routes = import.meta.glob(['/${t}/api/**/*.ts', '!**/middleware.ts'])
113
+ const _middlewares = import.meta.glob('/${t}/api/**/middleware.ts')
151
114
 
152
115
  const _glob = {
153
116
  routes: _routes,
154
117
  middlewares: _middlewares,
155
- apiDir: '/${appDir}/api',
118
+ apiDir: '/${t}/api',
156
119
  }
157
120
 
158
121
  export function handleApiRequest(url, request) {
159
122
  return _handleApiRequest(url, request, _glob)
160
123
  }
161
- `;
162
- }
163
- var init_api = __esm({
164
- "src/vite/codegen/api.ts"() {
165
- "use strict";
166
- }
167
- });
168
-
169
- // src/utils/patterns.ts
170
- function routePattern(rel) {
171
- return rel.replace(/\.(tsx|ts|jsx|js)$/, "").replace(/\(.*?\)\//g, "").replace(/^index$|\/index$/, "").replace(/\[([^\]]+)]/g, ":$1") || "/";
172
- }
173
- var init_patterns = __esm({
174
- "src/utils/patterns.ts"() {
175
- "use strict";
176
- }
177
- });
178
-
179
- // src/server/pages-router.ts
180
- function invalidatePagesCache() {
181
- cache = null;
182
- }
183
- var cache;
184
- var init_pages_router = __esm({
185
- "src/server/pages-router.ts"() {
186
- "use strict";
187
- init_patterns();
188
- cache = null;
189
- }
190
- });
191
-
192
- // src/server/api-router.ts
193
- function keyToRoutePattern(key, apiDir) {
194
- const rel = key.slice(apiDir.length + 1).replace(/\\/g, "/");
195
- const pattern = routePattern(rel);
196
- return pattern === "/" ? "/api" : `/api/${pattern}`.replace("/api//", "/api/");
197
- }
198
- function invalidateApiCache() {
199
- cache2 = null;
200
- }
201
- var cache2;
202
- var init_api_router = __esm({
203
- "src/server/api-router.ts"() {
204
- "use strict";
205
- init_patterns();
206
- cache2 = null;
207
- }
208
- });
209
-
210
- // src/vite/codegen/context.ts
211
- function generateContext() {
212
- return `
124
+ `}var se=s(()=>{"use strict"});function T(e){return e.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}var _=s(()=>{"use strict"});function D(){Ue=null}var Ue,ae=s(()=>{"use strict";_();Ue=null});function ce(e,t){let r=e.slice(t.length+1).replace(/\\/g,"/"),n=T(r);return n==="/"?"/api":`/api/${n}`.replace("/api//","/api/")}function b(){Ie=null}var Ie,A=s(()=>{"use strict";_();Ie=null});function le(){return`
213
125
  export {RouterContext} from '@devlusoft/devix/runtime/context'
214
- `;
215
- }
216
- var init_context = __esm({
217
- "src/vite/codegen/context.ts"() {
218
- "use strict";
219
- }
220
- });
221
-
222
- // src/vite/codegen/extract-methods.ts
223
- function stripComments(content) {
224
- return content.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "");
225
- }
226
- function extractHttpMethods(content) {
227
- const found = /* @__PURE__ */ new Set();
228
- for (const match of stripComments(content).matchAll(METHOD_EXPORT_RE)) {
229
- found.add(match[1]);
230
- }
231
- return [...found];
232
- }
233
- var METHOD_EXPORT_RE;
234
- var init_extract_methods = __esm({
235
- "src/vite/codegen/extract-methods.ts"() {
236
- "use strict";
237
- METHOD_EXPORT_RE = /export\s+(?:const|async\s+function|function)\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\b/g;
238
- }
239
- });
240
-
241
- // src/vite/codegen/routes-dts.ts
242
- function filePathToIdentifier(filePath, apiDir) {
243
- return "_api_" + filePath.slice(`${apiDir}/`.length).replace(/\.(ts|tsx)$/, "").replace(/[^a-zA-Z0-9]/g, "_");
244
- }
245
- function buildRouteEntry(filePath, apiDir, methods) {
246
- return {
247
- filePath,
248
- urlPattern: keyToRoutePattern(filePath, apiDir),
249
- identifier: filePathToIdentifier(filePath, apiDir),
250
- methods
251
- };
252
- }
253
- function generateRoutesDts(entries, apiDir) {
254
- if (entries.length === 0) {
255
- return `// auto-generado por devix \u2014 no editar
126
+ `}var pe=s(()=>{"use strict"});function He(e){return e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"")}function ue(e){let t=new Set;for(let r of He(e).matchAll(je))t.add(r[1]);return[...t]}var je,de=s(()=>{"use strict";je=/export\s+(?:const|async\s+function|function)\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\b/g});function qe(e,t){return"_api_"+e.slice(`${t}/`.length).replace(/\.(ts|tsx)$/,"").replace(/[^a-zA-Z0-9]/g,"_")}function me(e,t,r){return{filePath:e,urlPattern:ce(e,t),identifier:qe(e,t),methods:r}}function C(e,t){if(e.length===0)return`// auto-generado por devix \u2014 no editar
256
127
  declare module '@devlusoft/devix' {
257
128
  interface ApiRoutes {}
258
129
  }
259
- `;
260
- }
261
- const imports = entries.map((e) => {
262
- const importPath = "../" + e.filePath.replace(/\.(ts|tsx)$/, "");
263
- return `import type * as ${e.identifier} from '${importPath}'`;
264
- }).join("\n");
265
- const routeLines = entries.flatMap(
266
- (e) => e.methods.map(
267
- (m) => ` '${m} ${e.urlPattern}': InferRoute<(typeof ${e.identifier})['${m}']>`
268
- )
269
- ).join("\n");
270
- return `// auto-generado por devix \u2014 no editar
271
- ${imports}
130
+ `;let r=e.map(o=>{let a="../"+o.filePath.replace(/\.(ts|tsx)$/,"");return`import type * as ${o.identifier} from '${a}'`}).join(`
131
+ `),n=e.flatMap(o=>o.methods.map(a=>` '${a} ${o.urlPattern}': InferRoute<(typeof ${o.identifier})['${a}']>`)).join(`
132
+ `);return`// auto-generado por devix \u2014 no editar
133
+ ${r}
272
134
 
135
+ type JsonResponse<T> = Response & { readonly __body: T }
136
+ type UnwrapJson<T> = T extends JsonResponse<infer U> ? U : never
273
137
  type InferRoute<T> = T extends (...args: any[]) => any
274
- ? Exclude<Awaited<ReturnType<T>>, Response | null | void>
138
+ ? [UnwrapJson<Awaited<ReturnType<T>>>] extends [never]
139
+ ? Exclude<Awaited<ReturnType<T>>, Response | null | void>
140
+ : UnwrapJson<Awaited<ReturnType<T>>>
275
141
  : never
276
142
 
277
143
  declare module '@devlusoft/devix' {
278
144
  interface ApiRoutes {
279
- ${routeLines}
280
- }
281
- }
282
- `;
283
- }
284
- var init_routes_dts = __esm({
285
- "src/vite/codegen/routes-dts.ts"() {
286
- "use strict";
287
- init_api_router();
288
- }
289
- });
290
-
291
- // src/vite/codegen/scan-api.ts
292
- import { readFileSync, readdirSync, statSync } from "node:fs";
293
- import { join, relative } from "node:path";
294
- function walkDir(dir, root) {
295
- const entries = [];
296
- for (const name of readdirSync(dir)) {
297
- const full = join(dir, name);
298
- if (statSync(full).isDirectory()) {
299
- entries.push(...walkDir(full, root));
300
- } else if (/\.(ts|tsx)$/.test(name)) {
301
- entries.push(relative(root, full).replace(/\\/g, "/"));
302
- }
303
- }
304
- return entries;
305
- }
306
- function scanApiFiles(appDir, projectRoot) {
307
- const apiDir = join(projectRoot, appDir, "api");
308
- let files;
309
- try {
310
- files = walkDir(apiDir, projectRoot);
311
- } catch {
312
- return [];
313
- }
314
- return files.filter((f) => !f.endsWith("middleware.ts") && !f.endsWith("middleware.tsx")).flatMap((filePath) => {
315
- try {
316
- const content = readFileSync(join(projectRoot, filePath), "utf-8");
317
- const methods = extractHttpMethods(content);
318
- if (methods.length === 0) return [];
319
- return [buildRouteEntry(filePath, `${appDir}/api`, methods)];
320
- } catch {
321
- return [];
322
- }
323
- });
324
- }
325
- var init_scan_api = __esm({
326
- "src/vite/codegen/scan-api.ts"() {
327
- "use strict";
328
- init_extract_methods();
329
- init_routes_dts();
330
- }
331
- });
332
-
333
- // src/vite/codegen/write-routes-dts.ts
334
- import { mkdirSync, readFileSync as readFileSync2, writeFileSync, existsSync } from "node:fs";
335
- import { join as join2 } from "node:path";
336
- function writeRoutesDts(content, projectRoot) {
337
- const devixDir = join2(projectRoot, ".devix");
338
- const outPath = join2(devixDir, "routes.d.ts");
339
- mkdirSync(devixDir, { recursive: true });
340
- if (existsSync(outPath) && readFileSync2(outPath, "utf-8") === content) {
341
- return false;
342
- }
343
- writeFileSync(outPath, content, "utf-8");
344
- return true;
345
- }
346
- var init_write_routes_dts = __esm({
347
- "src/vite/codegen/write-routes-dts.ts"() {
348
- "use strict";
349
- }
350
- });
351
-
352
- // src/vite/index.ts
353
- import { mergeConfig } from "vite";
354
- import react from "@vitejs/plugin-react";
355
- import { fileURLToPath } from "node:url";
356
- import { dirname, resolve } from "node:path";
357
- function devix(config3) {
358
- const appDir = config3.appDir ?? "app";
359
- const pagesDir = `${appDir}/pages`;
360
- const cssUrls = (config3.css ?? []).map((u) => u.startsWith("/") ? u : `/${u.replace(/^\.\//, "")}`);
361
- const renderPath = resolve(__dirname, "../server/render.js").replace(/\\/g, "/");
362
- const apiPath = resolve(__dirname, "../server/api.js").replace(/\\/g, "/");
363
- const matcherPath = resolve(__dirname, "../runtime/client-router.js").replace(/\\/g, "/");
364
- const virtualPlugin = {
365
- name: "devix",
366
- enforce: "pre",
367
- resolveId(id) {
368
- if (id === VIRTUAL_ENTRY_CLIENT) return `\0${VIRTUAL_ENTRY_CLIENT}`;
369
- if (id === VIRTUAL_CLIENT_ROUTES) return `\0${VIRTUAL_CLIENT_ROUTES}`;
370
- if (id === VIRTUAL_RENDER) return `\0${VIRTUAL_RENDER}`;
371
- if (id === VIRTUAL_API) return `\0${VIRTUAL_API}`;
372
- if (id === VIRTUAL_CONTEXT) return `\0${VIRTUAL_CONTEXT}`;
373
- },
374
- load(id) {
375
- if (id === `\0${VIRTUAL_ENTRY_CLIENT}`)
376
- return generateEntryClient({ cssUrls });
377
- if (id === `\0${VIRTUAL_CLIENT_ROUTES}`)
378
- return generateClientRoutes({ pagesDir, matcherPath });
379
- if (id === `\0${VIRTUAL_RENDER}`)
380
- return generateRender({ pagesDir, renderPath });
381
- if (id === `\0${VIRTUAL_API}`)
382
- return generateApi({ apiPath, appDir });
383
- if (id === `\0${VIRTUAL_CONTEXT}`)
384
- return generateContext();
385
- },
386
- buildStart() {
387
- const root = process.cwd();
388
- const entries = scanApiFiles(appDir, root);
389
- writeRoutesDts(generateRoutesDts(entries, `${appDir}/api`), root);
390
- },
391
- configureServer(server) {
392
- const root = process.cwd();
393
- const regenerateDts = () => {
394
- const entries = scanApiFiles(appDir, root);
395
- writeRoutesDts(generateRoutesDts(entries, `${appDir}/api`), root);
396
- };
397
- server.watcher.on("add", (file) => {
398
- if (file.startsWith(resolve(root, pagesDir))) invalidatePagesCache();
399
- if (file.includes(`${appDir}/api`)) {
400
- invalidateApiCache();
401
- regenerateDts();
402
- }
403
- });
404
- server.watcher.on("unlink", (file) => {
405
- if (file.startsWith(resolve(root, pagesDir))) invalidatePagesCache();
406
- if (file.includes(`${appDir}/api`)) {
407
- invalidateApiCache();
408
- regenerateDts();
409
- }
410
- });
411
- server.watcher.on("change", (file) => {
412
- if (file.includes(`${appDir}/api`) && !file.endsWith("middleware.ts")) {
413
- regenerateDts();
414
- }
415
- });
416
- }
417
- };
418
- const base = {
419
- plugins: [react(), virtualPlugin],
420
- ssr: { noExternal: ["@devlusoft/devix"] },
421
- ...config3.envPrefix ? { envPrefix: config3.envPrefix } : {}
422
- };
423
- return mergeConfig(base, config3.vite ?? {});
424
- }
425
- var __dirname, VIRTUAL_ENTRY_CLIENT, VIRTUAL_CLIENT_ROUTES, VIRTUAL_RENDER, VIRTUAL_API, VIRTUAL_CONTEXT;
426
- var init_vite = __esm({
427
- "src/vite/index.ts"() {
428
- "use strict";
429
- init_entry_client();
430
- init_client_routes();
431
- init_render();
432
- init_api();
433
- init_pages_router();
434
- init_api_router();
435
- init_context();
436
- init_scan_api();
437
- init_routes_dts();
438
- init_write_routes_dts();
439
- __dirname = dirname(fileURLToPath(import.meta.url));
440
- VIRTUAL_ENTRY_CLIENT = "virtual:devix/entry-client";
441
- VIRTUAL_CLIENT_ROUTES = "virtual:devix/client-routes";
442
- VIRTUAL_RENDER = "virtual:devix/render";
443
- VIRTUAL_API = "virtual:devix/api";
444
- VIRTUAL_CONTEXT = "virtual:devix/context";
445
- }
446
- });
447
-
448
- // src/server/routes.ts
449
- function registerApiRoutes(app3, { apiModule: apiModule3, renderModule: renderModule4, loaderTimeout }) {
450
- app3.all("/api/*", async (c) => {
451
- try {
452
- return await apiModule3.handleApiRequest(c.req.url, c.req.raw);
453
- } catch (e) {
454
- console.error(e);
455
- return c.json({ error: "internal error" }, 500);
456
- }
457
- });
458
- app3.get("/_data/*", async (c) => {
459
- try {
460
- const { pathname, search } = new URL(c.req.url, "http://localhost");
461
- const url = pathname.replace(/^\/_data/, "") + search;
462
- const data = await renderModule4.runLoader(url, c.req.raw, { loaderTimeout });
463
- return c.json(data);
464
- } catch (e) {
465
- console.error(e);
466
- return c.json({ error: "internal error" }, 500);
467
- }
468
- });
469
- }
470
- function registerSsrRoute(app3, { renderModule: renderModule4, manifest: manifest3, loaderTimeout }) {
471
- app3.get("*", async (c) => {
472
- try {
473
- const { html, statusCode, headers } = await renderModule4.render(c.req.url, c.req.raw, { manifest: manifest3, loaderTimeout });
474
- const res = c.html(`<!DOCTYPE html>${html}`, statusCode);
475
- for (const [key, value] of Object.entries(headers)) {
476
- res.headers.set(key, value);
477
- }
478
- return res;
479
- } catch (e) {
480
- console.error(e);
481
- return c.text("Internal Server Error", 500);
482
- }
483
- });
484
- }
485
- var init_routes = __esm({
486
- "src/server/routes.ts"() {
487
- "use strict";
488
- }
489
- });
490
-
491
- // src/utils/banner.ts
492
- import pc from "picocolors";
493
- import { networkInterfaces } from "node:os";
494
- import { createRequire } from "node:module";
495
- function getNetworkUrl(port3) {
496
- const nets = networkInterfaces();
497
- for (const interfaces of Object.values(nets)) {
498
- for (const net of interfaces ?? []) {
499
- if (net.family === "IPv4" && !net.internal) {
500
- return `http://${net.address}:${port3}/`;
501
- }
502
- }
503
- }
504
- return null;
505
- }
506
- function printDevBanner(port3) {
507
- const req = createRequire(import.meta.url);
508
- const version = req("../../package.json").version;
509
- const networkUrl = getNetworkUrl(port3);
510
- console.log();
511
- console.log(` ${pc.bold(pc.yellow("devix"))} ${pc.dim(`v${version}`)}`);
512
- console.log();
513
- console.log(` ${pc.green("\u279C")} ${pc.bold("Local:")} ${pc.cyan(`http://localhost:${port3}/`)}`);
514
- if (networkUrl) {
515
- console.log(` ${pc.green("\u279C")} ${pc.bold("Network:")} ${pc.cyan(networkUrl)}`);
516
- } else {
517
- console.log(` ${pc.green("\u279C")} ${pc.bold("Network:")} ${pc.dim("use --host to expose")}`);
518
- }
519
- console.log();
520
- }
521
- var init_banner = __esm({
522
- "src/utils/banner.ts"() {
523
- "use strict";
524
- }
525
- });
526
-
527
- // src/server/collect-css.ts
528
- async function collectCss(vite2) {
529
- const cssUrls = /* @__PURE__ */ new Set();
530
- for (const [, mod] of vite2.moduleGraph.idToModuleMap) {
531
- if (!mod.id) continue;
532
- if (mod.id.endsWith(".css") || mod.id.includes(".css?")) {
533
- cssUrls.add(mod.url);
534
- }
535
- }
536
- return [...cssUrls];
537
- }
538
- var init_collect_css = __esm({
539
- "src/server/collect-css.ts"() {
540
- "use strict";
541
- }
542
- });
543
-
544
- // src/utils/duration.ts
545
- function parseDuration(value) {
546
- if (typeof value === "number") return value;
547
- const match = value.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/);
548
- if (!match) throw new Error(`[devix] Invalid duration: "${value}". Use a number (ms) or a string like "5s", "2m", "500ms".`);
549
- const n = parseFloat(match[1]);
550
- switch (match[2]) {
551
- case "h":
552
- return n * 36e5;
553
- case "m":
554
- return n * 6e4;
555
- case "s":
556
- return n * 1e3;
557
- case "ms":
558
- default:
559
- return n;
560
- }
561
- }
562
- var init_duration = __esm({
563
- "src/utils/duration.ts"() {
564
- "use strict";
565
- }
566
- });
567
-
568
- // src/utils/env.ts
569
- import { loadEnv } from "vite";
570
- function loadDotenv(mode) {
571
- const env = loadEnv(mode, process.cwd(), "");
572
- for (const [key, value] of Object.entries(env)) {
573
- if (process.env[key] === void 0) {
574
- process.env[key] = value;
575
- }
145
+ ${n}
576
146
  }
577
147
  }
578
- var init_env = __esm({
579
- "src/utils/env.ts"() {
580
- "use strict";
581
- }
582
- });
583
-
584
- // src/cli/dev.ts
585
- var dev_exports = {};
586
- import { createServer } from "node:http";
587
- import { createServer as createViteServer } from "vite";
588
- import { getRequestListener } from "@hono/node-server";
589
- import { Hono } from "hono";
590
- var VIRTUAL_RENDER2, VIRTUAL_API2, config, port, host, vite, renderModule, apiModule, app, honoHandler;
591
- var init_dev = __esm({
592
- async "src/cli/dev.ts"() {
593
- "use strict";
594
- init_vite();
595
- init_routes();
596
- init_banner();
597
- init_collect_css();
598
- init_duration();
599
- init_env();
600
- loadDotenv("development");
601
- VIRTUAL_RENDER2 = "virtual:devix/render";
602
- VIRTUAL_API2 = "virtual:devix/api";
603
- config = (await import(`${process.cwd()}/devix.config.ts`)).default;
604
- port = Number(process.env.PORT) || config.port || 3e3;
605
- host = typeof config.host === "string" ? config.host : config.host ? "0.0.0.0" : "localhost";
606
- vite = await createViteServer({
607
- ...devix(config),
608
- configFile: false,
609
- appType: "custom",
610
- server: { middlewareMode: true }
611
- });
612
- renderModule = {
613
- render: async (...args) => (await vite.ssrLoadModule(VIRTUAL_RENDER2)).render(...args),
614
- runLoader: async (...args) => (await vite.ssrLoadModule(VIRTUAL_RENDER2)).runLoader(...args)
615
- };
616
- apiModule = {
617
- handleApiRequest: async (...args) => (await vite.ssrLoadModule(VIRTUAL_API2)).handleApiRequest(...args)
618
- };
619
- app = new Hono();
620
- registerApiRoutes(app, { renderModule, apiModule });
621
- app.get("*", async (c) => {
622
- try {
623
- const { html, statusCode, headers } = await renderModule.render(c.req.url, c.req.raw, { loaderTimeout: parseDuration(config.loaderTimeout ?? 1e4) });
624
- const cssUrls = await collectCss(vite);
625
- const cssLinks = cssUrls.map((url) => `<link rel="stylesheet" href="${url}">`).join("\n");
626
- const htmlWithCss = cssLinks ? html.replace("</head>", `${cssLinks}
627
- </head>`) : html;
628
- const transformed = await vite.transformIndexHtml(c.req.url, `<!DOCTYPE html>${htmlWithCss}`);
629
- const res = c.html(transformed, statusCode);
630
- for (const [key, value] of Object.entries(headers)) {
631
- res.headers.set(key, value);
632
- }
633
- return res;
634
- } catch (e) {
635
- vite.ssrFixStacktrace(e);
636
- console.error(e);
637
- return c.text("Internal Server Error", 500);
638
- }
639
- });
640
- honoHandler = getRequestListener(app.fetch);
641
- createServer(async (req, res) => {
642
- await new Promise((resolve5) => vite.middlewares(req, res, resolve5));
643
- if (!res.writableEnded) await honoHandler(req, res);
644
- }).listen(port, host, () => {
645
- printDevBanner(port);
646
- });
647
- }
648
- });
649
-
650
- // src/cli/build.ts
651
- var build_exports = {};
652
- import { writeFileSync as writeFileSync2 } from "node:fs";
653
- import { resolve as resolve2 } from "node:path";
654
- import { build } from "vite";
655
- var config2, baseConfig, runtimeConfig;
656
- var init_build = __esm({
657
- async "src/cli/build.ts"() {
658
- "use strict";
659
- init_vite();
660
- init_duration();
661
- config2 = (await import(`${process.cwd()}/devix.config.ts`)).default;
662
- baseConfig = devix(config2);
663
- await build({
664
- ...baseConfig,
665
- configFile: false,
666
- build: {
667
- outDir: "dist/client",
668
- manifest: true,
669
- rolldownOptions: {
670
- input: "virtual:devix/entry-client"
671
- }
672
- }
673
- });
674
- await build({
675
- ...baseConfig,
676
- configFile: false,
677
- build: {
678
- ssr: true,
679
- outDir: "dist/server",
680
- rolldownOptions: {
681
- input: {
682
- render: "virtual:devix/render",
683
- api: "virtual:devix/api"
684
- }
685
- }
686
- }
687
- });
688
- runtimeConfig = {
689
- port: config2.port ?? 3e3,
690
- host: config2.host ?? false,
691
- loaderTimeout: parseDuration(config2.loaderTimeout ?? 1e4),
692
- output: config2.output ?? "server"
693
- };
694
- writeFileSync2(
695
- resolve2(process.cwd(), "dist/devix.config.json"),
696
- JSON.stringify(runtimeConfig, null, 2),
697
- "utf-8"
698
- );
699
- }
700
- });
701
-
702
- // src/cli/generate.ts
703
- var generate_exports = {};
704
- import { readFileSync as readFileSync3, mkdirSync as mkdirSync2, writeFileSync as writeFileSync3 } from "node:fs";
705
- import { resolve as resolve3, join as join3 } from "node:path";
706
- var userConfig, t, renderModule2, manifest, urls;
707
- var init_generate = __esm({
708
- async "src/cli/generate.ts"() {
709
- "use strict";
710
- userConfig = (await import(`${process.cwd()}/devix.config.ts`)).default;
711
- if (userConfig.output !== "static") {
712
- console.warn('[devix] Tip: set output: "static" in devix.config.ts to skip the SSR server at runtime.');
713
- }
714
- await init_build().then(() => build_exports);
715
- t = Date.now();
716
- renderModule2 = await import(resolve3(process.cwd(), "dist/server/render.js") + `?t=${t}`);
717
- manifest = JSON.parse(
718
- readFileSync3(resolve3(process.cwd(), "dist/client/.vite/manifest.json"), "utf-8")
719
- );
720
- urls = await renderModule2.getStaticRoutes();
721
- console.log(`[devix] Generating ${urls.length} static page${urls.length === 1 ? "" : "s"}...`);
722
- for (const url of urls) {
723
- const fullUrl = `http://localhost${url}`;
724
- const { html, statusCode } = await renderModule2.render(fullUrl, new Request(fullUrl), { manifest });
725
- if (statusCode !== 200) {
726
- console.warn(`[devix] Skipping ${url} \u2014 status ${statusCode}`);
727
- continue;
728
- }
729
- const outPath = url === "/" ? join3(process.cwd(), "dist/client/index.html") : join3(process.cwd(), "dist/client", url, "index.html");
730
- mkdirSync2(join3(outPath, ".."), { recursive: true });
731
- writeFileSync3(outPath, `<!DOCTYPE html>${html}`, "utf-8");
732
- console.log(` \u2713 ${url}`);
733
- }
734
- console.log("[devix] Generation complete.");
735
- }
736
- });
737
-
738
- // src/cli/start.ts
739
- var start_exports = {};
740
- import { readFileSync as readFileSync4 } from "node:fs";
741
- import { serve } from "@hono/node-server";
742
- import { serveStatic } from "@hono/node-server/serve-static";
743
- import { Hono as Hono2 } from "hono";
744
- import { resolve as resolve4 } from "node:path";
745
- var renderModule3, apiModule2, manifest2, runtimeConfig2, port2, host2, app2;
746
- var init_start = __esm({
747
- async "src/cli/start.ts"() {
748
- "use strict";
749
- init_routes();
750
- init_env();
751
- loadDotenv("production");
752
- try {
753
- runtimeConfig2 = JSON.parse(readFileSync4(resolve4(process.cwd(), "dist/devix.config.json"), "utf-8"));
754
- if (runtimeConfig2.output !== "static") {
755
- renderModule3 = await import(resolve4(process.cwd(), "dist/server/render.js"));
756
- apiModule2 = await import(resolve4(process.cwd(), "dist/server/api.js"));
757
- }
758
- manifest2 = JSON.parse(readFileSync4(resolve4(process.cwd(), "dist/client/.vite/manifest.json"), "utf-8"));
759
- } catch {
760
- console.error('[devix] Build not found. Run "devix build" first.');
761
- process.exit(1);
762
- }
763
- port2 = Number(process.env.PORT) || runtimeConfig2.port || 3e3;
764
- host2 = typeof runtimeConfig2.host === "string" ? runtimeConfig2.host : runtimeConfig2.host ? "0.0.0.0" : process.env.HOST || "0.0.0.0";
765
- app2 = new Hono2();
766
- app2.use("/*", serveStatic({
767
- root: "./dist/client",
768
- onFound: (_path, c) => {
769
- c.header("Cache-Control", _path.includes("/assets/") ? "public, immutable, max-age=31536000" : "no-cache");
770
- }
771
- }));
772
- if (runtimeConfig2.output === "static") {
773
- console.log("[devix] Static mode \u2014 serving pre-generated files from dist/client");
774
- } else {
775
- registerApiRoutes(app2, { renderModule: renderModule3, apiModule: apiModule2, manifest: manifest2 });
776
- registerSsrRoute(app2, { renderModule: renderModule3, apiModule: apiModule2, manifest: manifest2, loaderTimeout: runtimeConfig2.loaderTimeout });
777
- }
778
- serve({ fetch: app2.fetch, port: port2, hostname: host2 }, (info) => console.log(`http://${info.address}:${info.port}`));
779
- }
780
- });
781
-
782
- // src/cli/index.ts
783
- import { readFileSync as readFileSync5 } from "node:fs";
784
- import { join as join4, dirname as dirname2 } from "node:path";
785
- import { fileURLToPath as fileURLToPath2 } from "node:url";
786
- var command = process.argv[2];
787
- switch (command) {
788
- case "dev":
789
- await init_dev().then(() => dev_exports);
790
- break;
791
- case "build":
792
- await init_build().then(() => build_exports);
793
- break;
794
- case "generate":
795
- await init_generate().then(() => generate_exports);
796
- break;
797
- case "start":
798
- await init_start().then(() => start_exports);
799
- break;
800
- case "--version":
801
- case "-v": {
802
- const pkg = JSON.parse(readFileSync5(join4(dirname2(fileURLToPath2(import.meta.url)), "../../package.json"), "utf-8"));
803
- console.log(pkg.version);
804
- break;
805
- }
806
- case "--help":
807
- case "-h":
808
- console.log(`
148
+ `}var M=s(()=>{"use strict";A()});import{readFileSync as Fe,readdirSync as Ne,statSync as Ve}from"node:fs";import{join as O,relative as We}from"node:path";function fe(e,t){let r=[];for(let n of Ne(e)){let o=O(e,n);Ve(o).isDirectory()?r.push(...fe(o,t)):/\.(ts|tsx)$/.test(n)&&r.push(We(t,o).replace(/\\/g,"/"))}return r}function k(e,t){let r=O(t,e,"api"),n;try{n=fe(r,t)}catch{return[]}return n.filter(o=>!o.endsWith("middleware.ts")&&!o.endsWith("middleware.tsx")).flatMap(o=>{try{let a=Fe(O(t,o),"utf-8"),l=ue(a);return l.length===0?[]:[me(o,`${e}/api`,l)]}catch{return[]}})}var ge=s(()=>{"use strict";de();M()});import{mkdirSync as Je,readFileSync as Ge,writeFileSync as Be,existsSync as Ye}from"node:fs";import{join as he}from"node:path";function L(e,t){let r=he(t,".devix"),n=he(r,"routes.d.ts");return Je(r,{recursive:!0}),Ye(n)&&Ge(n,"utf-8")===e?!1:(Be(n,e,"utf-8"),!0)}var ve=s(()=>{"use strict"});import{mergeConfig as Xe}from"vite";import ze from"@vitejs/plugin-react";import{fileURLToPath as Ze}from"node:url";import{dirname as Ke,resolve as v}from"node:path";function y(e){let t=e.appDir??"app",r=`${t}/pages`,n=(e.css??[]).map(i=>i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`),o=v(U,"../server/render.js").replace(/\\/g,"/"),a=v(U,"../server/api.js").replace(/\\/g,"/"),l=v(U,"../runtime/client-router.js").replace(/\\/g,"/"),f={name:"devix",enforce:"pre",resolveId(i){if(i===I)return`\0${I}`;if(i===j)return`\0${j}`;if(i===H)return`\0${H}`;if(i===q)return`\0${q}`;if(i===F)return`\0${F}`},load(i){if(i===`\0${I}`)return Q({cssUrls:n});if(i===`\0${j}`)return te({pagesDir:r,matcherPath:l});if(i===`\0${H}`)return oe({pagesDir:r,renderPath:o});if(i===`\0${q}`)return ie({apiPath:a,appDir:t});if(i===`\0${F}`)return le()},buildStart(){let i=process.cwd(),p=k(t,i);L(C(p,`${t}/api`),i)},configureServer(i){let p=process.cwd(),S=()=>{let u=k(t,p);L(C(u,`${t}/api`),p)};i.watcher.on("add",u=>{u.startsWith(v(p,r))&&D(),u.includes(`${t}/api`)&&(b(),S())}),i.watcher.on("unlink",u=>{u.startsWith(v(p,r))&&D(),u.includes(`${t}/api`)&&(b(),S())}),i.watcher.on("change",u=>{u.includes(`${t}/api`)&&!u.endsWith("middleware.ts")&&S()})}},d={plugins:[ze(),f],ssr:{noExternal:["@devlusoft/devix"]},...e.envPrefix?{envPrefix:e.envPrefix}:{}};return Xe(d,e.vite??{})}var U,I,j,H,q,F,N=s(()=>{"use strict";ee();re();ne();se();ae();A();pe();ge();M();ve();U=Ke(Ze(import.meta.url)),I="virtual:devix/entry-client",j="virtual:devix/client-routes",H="virtual:devix/render",q="virtual:devix/api",F="virtual:devix/context"});function w(e,{apiModule:t,renderModule:r,loaderTimeout:n}){e.all("/api/*",async o=>{try{return await t.handleApiRequest(o.req.url,o.req.raw)}catch(a){return console.error(a),o.json({error:"internal error"},500)}}),e.get("/_data/*",async o=>{try{let{pathname:a,search:l}=new URL(o.req.url,"http://localhost"),f=a.replace(/^\/_data/,"")+l,d=await r.runLoader(f,o.req.raw,{loaderTimeout:n});return o.json(d)}catch(a){return console.error(a),o.json({error:"internal error"},500)}})}function xe(e,{renderModule:t,manifest:r,loaderTimeout:n}){e.get("*",async o=>{try{let{html:a,statusCode:l,headers:f}=await t.render(o.req.url,o.req.raw,{manifest:r,loaderTimeout:n}),d=o.html(`<!DOCTYPE html>${a}`,l);for(let[i,p]of Object.entries(f))d.headers.set(i,p);return d}catch(a){return console.error(a),o.text("Internal Server Error",500)}})}var V=s(()=>{"use strict"});import c from"picocolors";import{networkInterfaces as Qe}from"node:os";import{createRequire as et}from"node:module";function tt(e){let t=Qe();for(let r of Object.values(t))for(let n of r??[])if(n.family==="IPv4"&&!n.internal)return`http://${n.address}:${e}/`;return null}function ye(e){let r=et(import.meta.url)("../../package.json").version,n=tt(e);console.log(),console.log(` ${c.bold(c.yellow("devix"))} ${c.dim(`v${r}`)}`),console.log(),console.log(` ${c.green("\u279C")} ${c.bold("Local:")} ${c.cyan(`http://localhost:${e}/`)}`),console.log(n?` ${c.green("\u279C")} ${c.bold("Network:")} ${c.cyan(n)}`:` ${c.green("\u279C")} ${c.bold("Network:")} ${c.dim("use --host to expose")}`),console.log()}var we=s(()=>{"use strict"});async function Re(e){let t=new Set;for(let[,r]of e.moduleGraph.idToModuleMap)r.id&&(r.id.endsWith(".css")||r.id.includes(".css?"))&&t.add(r.url);return[...t]}var $e=s(()=>{"use strict"});function R(e){if(typeof e=="number")return e;let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/);if(!t)throw new Error(`[devix] Invalid duration: "${e}". Use a number (ms) or a string like "5s", "2m", "500ms".`);let r=parseFloat(t[1]);switch(t[2]){case"h":return r*36e5;case"m":return r*6e4;case"s":return r*1e3;default:return r}}var W=s(()=>{"use strict"});import{loadEnv as rt}from"vite";function $(e){let t=rt(e,process.cwd(),"");for(let[r,n]of Object.entries(t))process.env[r]===void 0&&(process.env[r]=n)}var J=s(()=>{"use strict"});var ut={};import{createServer as ot}from"node:http";import{createServer as nt}from"vite";import{getRequestListener as it}from"@hono/node-server";import{Hono as st}from"hono";var Ee,at,h,Pe,ct,g,Se,lt,G,pt,Te=s(async()=>{"use strict";N();V();we();$e();W();J();$("development");Ee="virtual:devix/render",at="virtual:devix/api",h=(await import(`${process.cwd()}/devix.config.ts`)).default,Pe=Number(process.env.PORT)||h.port||3e3,ct=typeof h.host=="string"?h.host:h.host?"0.0.0.0":"localhost",g=await nt({...y(h),configFile:!1,appType:"custom",server:{middlewareMode:!0}}),Se={render:async(...e)=>(await g.ssrLoadModule(Ee)).render(...e),runLoader:async(...e)=>(await g.ssrLoadModule(Ee)).runLoader(...e)},lt={handleApiRequest:async(...e)=>(await g.ssrLoadModule(at)).handleApiRequest(...e)},G=new st;w(G,{renderModule:Se,apiModule:lt});G.get("*",async e=>{try{let{html:t,statusCode:r,headers:n}=await Se.render(e.req.url,e.req.raw,{loaderTimeout:R(h.loaderTimeout??1e4)}),a=(await Re(g)).map(i=>`<link rel="stylesheet" href="${i}">`).join(`
149
+ `),l=a?t.replace("</head>",`${a}
150
+ </head>`):t,f=await g.transformIndexHtml(e.req.url,`<!DOCTYPE html>${l}`),d=e.html(f,r);for(let[i,p]of Object.entries(n))d.headers.set(i,p);return d}catch(t){return g.ssrFixStacktrace(t),console.error(t),e.text("Internal Server Error",500)}});pt=it(G.fetch);ot(async(e,t)=>{await new Promise(r=>g.middlewares(e,t,r)),t.writableEnded||await pt(e,t)}).listen(Pe,ct,()=>{ye(Pe)})});var be={};import{writeFileSync as dt}from"node:fs";import{resolve as mt}from"node:path";import{build as _e}from"vite";var x,De,ft,B=s(async()=>{"use strict";N();W();x=(await import(`${process.cwd()}/devix.config.ts`)).default,De=y(x);await _e({...De,configFile:!1,build:{outDir:"dist/client",manifest:!0,rolldownOptions:{input:"virtual:devix/entry-client"}}});await _e({...De,configFile:!1,build:{ssr:!0,outDir:"dist/server",rolldownOptions:{input:{render:"virtual:devix/render",api:"virtual:devix/api"}}}});ft={port:x.port??3e3,host:x.host??!1,loaderTimeout:R(x.loaderTimeout??1e4),output:x.output??"server"};dt(mt(process.cwd(),"dist/devix.config.json"),JSON.stringify(ft,null,2),"utf-8")});var Rt={};import{readFileSync as gt,mkdirSync as ht,writeFileSync as vt}from"node:fs";import{resolve as Ae,join as Y}from"node:path";var xt,yt,Ce,wt,X,Me=s(async()=>{"use strict";xt=(await import(`${process.cwd()}/devix.config.ts`)).default;xt.output!=="static"&&console.warn('[devix] Tip: set output: "static" in devix.config.ts to skip the SSR server at runtime.');await B().then(()=>be);yt=Date.now(),Ce=await import(Ae(process.cwd(),"dist/server/render.js")+`?t=${yt}`),wt=JSON.parse(gt(Ae(process.cwd(),"dist/client/.vite/manifest.json"),"utf-8")),X=await Ce.getStaticRoutes();console.log(`[devix] Generating ${X.length} static page${X.length===1?"":"s"}...`);for(let e of X){let t=`http://localhost${e}`,{html:r,statusCode:n}=await Ce.render(t,new Request(t),{manifest:wt});if(n!==200){console.warn(`[devix] Skipping ${e} \u2014 status ${n}`);continue}let o=e==="/"?Y(process.cwd(),"dist/client/index.html"):Y(process.cwd(),"dist/client",e,"index.html");ht(Y(o,".."),{recursive:!0}),vt(o,`<!DOCTYPE html>${r}`,"utf-8"),console.log(` \u2713 ${e}`)}console.log("[devix] Generation complete.")});var _t={};import{readFileSync as Oe}from"node:fs";import{serve as $t}from"@hono/node-server";import{serveStatic as Et}from"@hono/node-server/serve-static";import{Hono as Pt}from"hono";import{resolve as E}from"node:path";var z,Z,K,m,St,Tt,P,ke=s(async()=>{"use strict";V();J();$("production");try{m=JSON.parse(Oe(E(process.cwd(),"dist/devix.config.json"),"utf-8")),m.output!=="static"&&(z=await import(E(process.cwd(),"dist/server/render.js")),Z=await import(E(process.cwd(),"dist/server/api.js"))),K=JSON.parse(Oe(E(process.cwd(),"dist/client/.vite/manifest.json"),"utf-8"))}catch{console.error('[devix] Build not found. Run "devix build" first.'),process.exit(1)}St=Number(process.env.PORT)||m.port||3e3,Tt=typeof m.host=="string"?m.host:m.host?"0.0.0.0":process.env.HOST||"0.0.0.0",P=new Pt;P.use("/*",Et({root:"./dist/client",onFound:(e,t)=>{t.header("Cache-Control",e.includes("/assets/")?"public, immutable, max-age=31536000":"no-cache")}}));m.output==="static"?console.log("[devix] Static mode \u2014 serving pre-generated files from dist/client"):(w(P,{renderModule:z,apiModule:Z,manifest:K}),xe(P,{renderModule:z,apiModule:Z,manifest:K,loaderTimeout:m.loaderTimeout}));$t({fetch:P.fetch,port:St,hostname:Tt},e=>console.log(`http://${e.address}:${e.port}`))});import{readFileSync as Dt}from"node:fs";import{join as bt,dirname as At}from"node:path";import{fileURLToPath as Ct}from"node:url";var Le=process.argv[2];switch(Le){case"dev":await Te().then(()=>ut);break;case"build":await B().then(()=>be);break;case"generate":await Me().then(()=>Rt);break;case"start":await ke().then(()=>_t);break;case"--version":case"-v":{let e=JSON.parse(Dt(bt(At(Ct(import.meta.url)),"../../package.json"),"utf-8"));console.log(e.version);break}case"--help":case"-h":console.log(`
809
151
  devix \u2014 a lightweight SSR framework
810
152
 
811
153
  Usage:
@@ -821,11 +163,5 @@ Options:
821
163
  Output modes (set in devix.config.ts):
822
164
  output: "server" SSR mode \u2014 devix start handles requests dynamically (default)
823
165
  output: "static" SSG mode \u2014 devix generate pre-renders all pages; devix start serves static files only
824
- `.trim());
825
- break;
826
- default:
827
- console.error(`Unknown command: ${command}`);
828
- console.error("Usage: devix <dev|build|generate|start>");
829
- process.exit(1);
830
- }
166
+ `.trim());break;default:console.error(`Unknown command: ${Le}`),console.error("Usage: devix <dev|build|generate|start>"),process.exit(1)}
831
167
  //# sourceMappingURL=index.js.map