exisjs 0.7.4 → 0.7.6

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 (197) hide show
  1. package/dist/cli/commands/build.d.ts +4 -2
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +80 -22
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/dev.d.ts.map +1 -1
  6. package/dist/cli/commands/dev.js +229 -64
  7. package/dist/cli/commands/dev.js.map +1 -1
  8. package/dist/cli/commands/doctor.d.ts.map +1 -1
  9. package/dist/cli/commands/doctor.js +5 -2
  10. package/dist/cli/commands/doctor.js.map +1 -1
  11. package/dist/cli/commands/generate.d.ts +1 -0
  12. package/dist/cli/commands/generate.d.ts.map +1 -1
  13. package/dist/cli/commands/generate.js +25 -0
  14. package/dist/cli/commands/generate.js.map +1 -1
  15. package/dist/cli/commands/start.d.ts.map +1 -1
  16. package/dist/cli/commands/start.js +65 -15
  17. package/dist/cli/commands/start.js.map +1 -1
  18. package/dist/cli/index.js +20 -4
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/manifest.d.ts.map +1 -1
  21. package/dist/cli/manifest.js +118 -17
  22. package/dist/cli/manifest.js.map +1 -1
  23. package/dist/cli/resolve-aliases.d.ts +1 -1
  24. package/dist/cli/resolve-aliases.d.ts.map +1 -1
  25. package/dist/cli/resolve-aliases.js +30 -13
  26. package/dist/cli/resolve-aliases.js.map +1 -1
  27. package/dist/config/config.d.ts +3 -1
  28. package/dist/config/config.d.ts.map +1 -1
  29. package/dist/config/config.js.map +1 -1
  30. package/dist/config/env.d.ts.map +1 -1
  31. package/dist/config/env.js +8 -0
  32. package/dist/config/env.js.map +1 -1
  33. package/dist/config/types.d.ts +2 -0
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/decorators/constants.d.ts +2 -0
  36. package/dist/decorators/constants.d.ts.map +1 -1
  37. package/dist/decorators/middleware.d.ts +65 -2
  38. package/dist/decorators/middleware.d.ts.map +1 -1
  39. package/dist/decorators/middleware.js +148 -62
  40. package/dist/decorators/middleware.js.map +1 -1
  41. package/dist/decorators/params.d.ts +5 -0
  42. package/dist/decorators/params.d.ts.map +1 -1
  43. package/dist/decorators/params.js +11 -1
  44. package/dist/decorators/params.js.map +1 -1
  45. package/dist/decorators/response.d.ts.map +1 -1
  46. package/dist/decorators/response.js +32 -22
  47. package/dist/decorators/response.js.map +1 -1
  48. package/dist/di/container.d.ts.map +1 -1
  49. package/dist/di/container.js +6 -1
  50. package/dist/di/container.js.map +1 -1
  51. package/dist/docs/content/boundaries.mdx +33 -3
  52. package/dist/docs/content/cli/commands.mdx +1 -1
  53. package/dist/docs/content/config.mdx +26 -0
  54. package/dist/docs/content/controllers.mdx +127 -10
  55. package/dist/docs/content/decorators.mdx +22 -4
  56. package/dist/docs/content/errors.mdx +38 -2
  57. package/dist/docs/content/introduction.mdx +7 -7
  58. package/dist/docs/content/middleware.mdx +269 -6
  59. package/dist/docs/content/requests.mdx +217 -10
  60. package/dist/docs/content/responses.mdx +323 -34
  61. package/dist/docs/content/routing.mdx +46 -0
  62. package/dist/docs/content/security.mdx +17 -4
  63. package/dist/docs/content/structure.mdx +91 -12
  64. package/dist/docs/content/validation.mdx +226 -11
  65. package/dist/docs/reference/context.mdx +11 -0
  66. package/dist/docs/reference/decorators.mdx +14 -4
  67. package/dist/docs/reference/error.mdx +44 -0
  68. package/dist/docs/reference/logger.mdx +175 -43
  69. package/dist/docs/reference/middleware.mdx +31 -0
  70. package/dist/docs/reference/router.mdx +22 -0
  71. package/dist/docs/reference/validator.mdx +83 -23
  72. package/dist/error/errors.d.ts.map +1 -1
  73. package/dist/error/errors.js +95 -43
  74. package/dist/error/errors.js.map +1 -1
  75. package/dist/error/index.d.ts +1 -0
  76. package/dist/error/index.d.ts.map +1 -1
  77. package/dist/error/index.js +11 -1
  78. package/dist/error/index.js.map +1 -1
  79. package/dist/error/overlay.d.ts +42 -0
  80. package/dist/error/overlay.d.ts.map +1 -0
  81. package/dist/error/overlay.js +306 -0
  82. package/dist/error/overlay.js.map +1 -0
  83. package/dist/index.d.ts +1 -0
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +22 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/lib/start-server.js +49 -7
  88. package/dist/lib/start-server.js.map +1 -1
  89. package/dist/logger/index.d.ts +1 -1
  90. package/dist/logger/index.d.ts.map +1 -1
  91. package/dist/logger/index.js +9 -1
  92. package/dist/logger/index.js.map +1 -1
  93. package/dist/middleware/guard.d.ts +2 -2
  94. package/dist/middleware/guard.d.ts.map +1 -1
  95. package/dist/middleware/guard.js.map +1 -1
  96. package/dist/middleware/ip-filter.d.ts +1 -0
  97. package/dist/middleware/ip-filter.d.ts.map +1 -1
  98. package/dist/middleware/ip-filter.js +2 -0
  99. package/dist/middleware/ip-filter.js.map +1 -1
  100. package/dist/middleware/middleware.d.ts +2 -2
  101. package/dist/middleware/middleware.d.ts.map +1 -1
  102. package/dist/middleware/middleware.js +20 -2
  103. package/dist/middleware/middleware.js.map +1 -1
  104. package/dist/middleware/rate-limit.d.ts.map +1 -1
  105. package/dist/middleware/rate-limit.js +9 -0
  106. package/dist/middleware/rate-limit.js.map +1 -1
  107. package/dist/middleware/security.d.ts +43 -1
  108. package/dist/middleware/security.d.ts.map +1 -1
  109. package/dist/middleware/security.js +101 -0
  110. package/dist/middleware/security.js.map +1 -1
  111. package/dist/response/index.d.ts +229 -6
  112. package/dist/response/index.d.ts.map +1 -1
  113. package/dist/response/index.js +272 -2
  114. package/dist/response/index.js.map +1 -1
  115. package/dist/router/boundary.d.ts +25 -5
  116. package/dist/router/boundary.d.ts.map +1 -1
  117. package/dist/router/boundary.js.map +1 -1
  118. package/dist/router/controller-registrar.d.ts.map +1 -1
  119. package/dist/router/controller-registrar.js +56 -1
  120. package/dist/router/controller-registrar.js.map +1 -1
  121. package/dist/router/index.d.ts +2 -2
  122. package/dist/router/index.d.ts.map +1 -1
  123. package/dist/router/index.js +2 -1
  124. package/dist/router/index.js.map +1 -1
  125. package/dist/router/route-builder.d.ts +70 -36
  126. package/dist/router/route-builder.d.ts.map +1 -1
  127. package/dist/router/route-builder.js +13 -15
  128. package/dist/router/route-builder.js.map +1 -1
  129. package/dist/router/route-scanner.d.ts +1 -0
  130. package/dist/router/route-scanner.d.ts.map +1 -1
  131. package/dist/router/route-scanner.js +217 -10
  132. package/dist/router/route-scanner.js.map +1 -1
  133. package/dist/router/router.d.ts.map +1 -1
  134. package/dist/router/router.js +35 -17
  135. package/dist/router/router.js.map +1 -1
  136. package/dist/router/types.d.ts +11 -1
  137. package/dist/router/types.d.ts.map +1 -1
  138. package/dist/sanitize/index.d.ts +6 -6
  139. package/dist/sanitize/index.d.ts.map +1 -1
  140. package/dist/sanitize/index.js +8 -8
  141. package/dist/sanitize/index.js.map +1 -1
  142. package/dist/server/app.d.ts +2 -0
  143. package/dist/server/app.d.ts.map +1 -1
  144. package/dist/server/app.js +14 -0
  145. package/dist/server/app.js.map +1 -1
  146. package/dist/server/bootstrapper.d.ts.map +1 -1
  147. package/dist/server/bootstrapper.js +91 -30
  148. package/dist/server/bootstrapper.js.map +1 -1
  149. package/dist/server/cluster.d.ts.map +1 -1
  150. package/dist/server/cluster.js +13 -2
  151. package/dist/server/cluster.js.map +1 -1
  152. package/dist/server/context.d.ts +8 -0
  153. package/dist/server/context.d.ts.map +1 -1
  154. package/dist/server/context.js +50 -6
  155. package/dist/server/context.js.map +1 -1
  156. package/dist/server/engines/node-engine.d.ts.map +1 -1
  157. package/dist/server/engines/node-engine.js +1 -0
  158. package/dist/server/engines/node-engine.js.map +1 -1
  159. package/dist/server/lifecycle.d.ts +22 -0
  160. package/dist/server/lifecycle.d.ts.map +1 -0
  161. package/dist/server/lifecycle.js +106 -0
  162. package/dist/server/lifecycle.js.map +1 -0
  163. package/dist/server/request-handler.d.ts +1 -0
  164. package/dist/server/request-handler.d.ts.map +1 -1
  165. package/dist/server/request-handler.js +42 -18
  166. package/dist/server/request-handler.js.map +1 -1
  167. package/dist/server/request.d.ts +6 -0
  168. package/dist/server/request.d.ts.map +1 -1
  169. package/dist/server/request.js +112 -33
  170. package/dist/server/request.js.map +1 -1
  171. package/dist/server/response.d.ts +13 -2
  172. package/dist/server/response.d.ts.map +1 -1
  173. package/dist/server/response.js +250 -10
  174. package/dist/server/response.js.map +1 -1
  175. package/dist/testing/index.d.ts.map +1 -1
  176. package/dist/testing/index.js +6 -1
  177. package/dist/testing/index.js.map +1 -1
  178. package/dist/testing/mocks.d.ts.map +1 -1
  179. package/dist/testing/mocks.js +15 -3
  180. package/dist/testing/mocks.js.map +1 -1
  181. package/dist/utils/logger.d.ts +8 -0
  182. package/dist/utils/logger.d.ts.map +1 -1
  183. package/dist/utils/logger.js +184 -1
  184. package/dist/utils/logger.js.map +1 -1
  185. package/dist/validator/tex-types.d.ts +2 -1
  186. package/dist/validator/tex-types.d.ts.map +1 -1
  187. package/dist/validator/tex-types.js +2 -1
  188. package/dist/validator/tex-types.js.map +1 -1
  189. package/dist/validator/tex.d.ts +38 -22
  190. package/dist/validator/tex.d.ts.map +1 -1
  191. package/dist/validator/tex.js +490 -40
  192. package/dist/validator/tex.js.map +1 -1
  193. package/package.json +10 -10
  194. package/dist/dev/error-overlay.d.ts +0 -3
  195. package/dist/dev/error-overlay.d.ts.map +0 -1
  196. package/dist/dev/error-overlay.js +0 -118
  197. package/dist/dev/error-overlay.js.map +0 -1
@@ -1,7 +1,9 @@
1
- interface BuildOptions {
1
+ export interface BuildOptions {
2
2
  outDir?: string;
3
3
  clean?: boolean;
4
+ skipEnvCheck?: boolean;
5
+ dryRun?: boolean;
6
+ mode?: string;
4
7
  }
5
8
  export declare function buildCommand(options?: BuildOptions): Promise<void>;
6
- export {};
7
9
  //# sourceMappingURL=build.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsN5E"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoS5E"}
@@ -47,6 +47,12 @@ const resolve_aliases_js_1 = require("../resolve-aliases.js");
47
47
  const env_js_1 = require("../../config/env.js");
48
48
  async function buildCommand(options = {}) {
49
49
  process.env.__EXIS_BUILD = 'true';
50
+ if (options.skipEnvCheck ||
51
+ options.dryRun ||
52
+ process.env.EXIS_SKIP_ENV_CHECK === 'true') {
53
+ process.env.EXIS_SKIP_ENV_CHECK = 'true';
54
+ process.env.__EXIS_SKIP_ENV_CHECK = 'true';
55
+ }
50
56
  process.on('SIGINT', () => {
51
57
  const time = (0, time_1.getFormattedTime)();
52
58
  const primary = '\x1b[38;2;160;70;255m';
@@ -55,7 +61,8 @@ async function buildCommand(options = {}) {
55
61
  });
56
62
  const cwd = process.cwd();
57
63
  // Load .env files so process.env is populated during build-time route validation
58
- (0, env_js_1.loadEnv)(cwd);
64
+ const mode = options.mode || process.env.NODE_ENV || 'production';
65
+ (0, env_js_1.loadEnv)(cwd, mode, true);
59
66
  const outDir = options.outDir ?? '.exis/server';
60
67
  const tsconfigPath = node_path_1.default.join(cwd, 'tsconfig.json');
61
68
  let version = '0.0.0';
@@ -106,7 +113,33 @@ async function buildCommand(options = {}) {
106
113
  process.exit(1);
107
114
  }
108
115
  const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, node_path_1.default.dirname(tsconfigPathForTs));
109
- const entryPoints = parsedConfig.fileNames.filter((f) => !f.endsWith('.d.ts'));
116
+ const isServerSourceFile = (filePath) => {
117
+ const rel = node_path_1.default.relative(cwd, filePath).replace(/\\/g, '/');
118
+ if (rel.startsWith('..') || node_path_1.default.isAbsolute(rel))
119
+ return false;
120
+ // Ignore test files, scripts, docs
121
+ if (rel.startsWith('tests/') ||
122
+ rel.startsWith('test/') ||
123
+ rel.startsWith('__tests__/') ||
124
+ rel.startsWith('scripts/') ||
125
+ rel.startsWith('docs/') ||
126
+ /\.(test|spec)\.[jt]sx?$/.test(rel)) {
127
+ return false;
128
+ }
129
+ // Exclude root tool config files (e.g. drizzle.config.ts, vite.config.ts, tailwind.config.ts)
130
+ // Only exis.config.* belongs to the ExisJS server configuration
131
+ if (!rel.includes('/')) {
132
+ const base = node_path_1.default.basename(rel);
133
+ return (base === 'exis.config.ts' ||
134
+ base === 'exis.config.js' ||
135
+ base === 'exis.config.mjs');
136
+ }
137
+ // Server code is strictly in src/ or http/
138
+ return rel.startsWith('src/') || rel.startsWith('http/');
139
+ };
140
+ const allNonDeclFiles = parsedConfig.fileNames.filter((f) => !f.endsWith('.d.ts'));
141
+ const serverEntryPoints = allNonDeclFiles.filter(isServerSourceFile);
142
+ const entryPoints = serverEntryPoints.length > 0 ? serverEntryPoints : allNonDeclFiles;
110
143
  let format = 'cjs';
111
144
  try {
112
145
  const pkg = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(cwd, 'package.json'), 'utf8'));
@@ -121,14 +154,22 @@ async function buildCommand(options = {}) {
121
154
  // broken imports, and syntax errors BEFORE esbuild runs.
122
155
  if (process.env.NODE_ENV !== 'test') {
123
156
  process.stdout.write(`${utils_1.c.dim}type-checking...${utils_1.c.reset}`);
124
- const program = ts.createProgram(parsedConfig.fileNames, {
157
+ const filesToCheck = serverEntryPoints.length > 0 ? serverEntryPoints : parsedConfig.fileNames;
158
+ const program = ts.createProgram(filesToCheck, {
125
159
  ...parsedConfig.options,
160
+ skipLibCheck: true,
126
161
  noEmit: true,
127
162
  });
128
- const diagnostics = [
163
+ const allDiagnostics = [
129
164
  ...parsedConfig.errors,
130
165
  ...ts.getPreEmitDiagnostics(program),
131
166
  ];
167
+ // Only fail the build for errors that actually affect the server environment
168
+ const diagnostics = allDiagnostics.filter((diag) => {
169
+ if (!diag.file)
170
+ return true; // Global configuration error
171
+ return isServerSourceFile(diag.file.fileName);
172
+ });
132
173
  if (diagnostics.length > 0) {
133
174
  process.stdout.write('\n');
134
175
  const formatted = ts.formatDiagnosticsWithColorAndContext(diagnostics, {
@@ -184,28 +225,45 @@ async function buildCommand(options = {}) {
184
225
  // errors (e.g. missing cache keyGenerator, invalid middleware options) NOW,
185
226
  // at build time, rather than letting them crash the production server on first
186
227
  // request or startup.
187
- process.stdout.write(`${utils_1.c.dim}validating routes...${utils_1.c.reset}`);
188
- try {
189
- const manifestPath = node_path_1.default.join(cwd, '.exis', 'routes-manifest.js');
190
- if (node_fs_1.default.existsSync(manifestPath)) {
191
- try {
192
- const { registerPathAliasLoader } = await Promise.resolve().then(() => __importStar(require('../resolve-aliases.js')));
193
- registerPathAliasLoader(cwd);
228
+ if (options.skipEnvCheck ||
229
+ options.dryRun ||
230
+ process.env.EXIS_SKIP_ENV_CHECK === 'true') {
231
+ process.stdout.write(`${utils_1.c.yellow}↷${utils_1.c.reset} ${utils_1.c.dim}route validation skipped (--skip-env-check).${utils_1.c.reset}\n`);
232
+ }
233
+ else {
234
+ process.stdout.write(`${utils_1.c.dim}validating routes...${utils_1.c.reset}`);
235
+ try {
236
+ const manifestPath = node_path_1.default.join(cwd, '.exis', 'routes-manifest.js');
237
+ if (node_fs_1.default.existsSync(manifestPath)) {
238
+ try {
239
+ const { registerPathAliasLoader } = await Promise.resolve().then(() => __importStar(require('../resolve-aliases.js')));
240
+ registerPathAliasLoader(cwd);
241
+ }
242
+ catch {
243
+ // ignore
244
+ }
245
+ const dynamicImport = new Function('specifier', 'return import(specifier)');
246
+ await dynamicImport((0, node_url_1.pathToFileURL)(manifestPath).href);
247
+ process.stdout.write(`\r${utils_1.c.green}✓${utils_1.c.reset} ${utils_1.c.dim}all routes validated.${utils_1.c.reset}\n`);
194
248
  }
195
- catch {
196
- // ignore
249
+ }
250
+ catch (err) {
251
+ const isEnvError = err.message?.includes('Validation Error') ||
252
+ err.message?.includes('Expected value, received undefined') ||
253
+ err.message?.includes('env') ||
254
+ err.code === 'VALIDATION_ERROR';
255
+ console.error('');
256
+ (0, utils_1.error)(`BUILD_VALIDATION_FAILED: ${err.message}`);
257
+ if (isEnvError) {
258
+ console.error(`\n${utils_1.c.yellow} Tip: If this environment variable is injected at runtime, run:${utils_1.c.reset}` +
259
+ `\n${utils_1.c.primary} exis build --skip-env-check${utils_1.c.reset}\n`);
260
+ }
261
+ else {
262
+ console.error(`\n${utils_1.c.yellow} Fix the error above, then run ${utils_1.c.reset}${utils_1.c.primary}exis build${utils_1.c.reset}${utils_1.c.yellow} again.${utils_1.c.reset}\n`);
197
263
  }
198
- const dynamicImport = new Function('specifier', 'return import(specifier)');
199
- await dynamicImport((0, node_url_1.pathToFileURL)(manifestPath).href);
200
- process.stdout.write(`\r${utils_1.c.green}✓${utils_1.c.reset} ${utils_1.c.dim}all routes validated.${utils_1.c.reset}\n`);
264
+ process.exit(1);
201
265
  }
202
266
  }
203
- catch (err) {
204
- console.error('');
205
- (0, utils_1.error)(`BUILD_VALIDATION_FAILED: ${err.message}`);
206
- console.error(`\n${utils_1.c.yellow} Fix the error above, then run ${utils_1.c.reset}${utils_1.c.primary}exis build${utils_1.c.reset}${utils_1.c.yellow} again.${utils_1.c.reset}\n`);
207
- process.exit(1);
208
- }
209
267
  const ms = Date.now() - start;
210
268
  console.log(`\n${utils_1.c.green}✓ built in ${ms}ms${utils_1.c.reset}\n`);
211
269
  process.exit(0);
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,oCAsNC;AApOD,0DAA4B;AAC5B,sDAAwB;AACxB,uCAAwC;AACxC,oCAAmC;AACnC,2CAAmD;AACnD,gDAAkE;AAClE,8DAA0D;AAC1D,gDAA6C;AAOtC,KAAK,UAAU,YAAY,CAAC,UAAwB,EAAE;IAC3D,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAA;IAEjC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,MAAM,IAAI,GAAG,IAAA,uBAAgB,GAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,uBAAuB,CAAA;QACvC,OAAO,CAAC,GAAG,CACT,KAAK,SAAC,CAAC,GAAG,GAAG,IAAI,GAAG,SAAC,CAAC,KAAK,IAAI,OAAO,SAAS,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,GAAG,mBAAmB,SAAC,CAAC,KAAK,EAAE,CAC5F,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IAEzB,iFAAiF;IACjF,IAAA,gBAAO,EAAC,GAAG,CAAC,CAAA;IACZ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAA;IAC/C,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA;IAEpD,IAAI,OAAO,GAAG,OAAO,CAAA;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAA;QACtE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CACT,KAAK,SAAC,CAAC,OAAO,SAAS,OAAO,GAAG,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,KAAK,gDAAgD,SAAC,CAAC,KAAK,EAAE,CAC7G,CAAA;QACD,OAAO,CAAC,GAAG,CACT,GAAG,SAAC,CAAC,MAAM,gEAAgE,SAAC,CAAC,KAAK,EAAE,CACrF,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,WAAW,SAAC,CAAC,OAAO,aAAa,SAAC,CAAC,KAAK,sBAAsB,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CACT,KAAK,SAAC,CAAC,OAAO,SAAS,OAAO,GAAG,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,KAAK,gDAAgD,SAAC,CAAC,KAAK,EAAE,CAC7G,CAAA;IAED,qBAAqB;IACrB,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACzC,IAAI,iBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAC,CAAC,GAAG,cAAc,SAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YACrD,iBAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,GAAG,4BAA4B,SAAC,CAAC,KAAK,IAAI,CACxE,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAC,CAAC,GAAG,eAAe,SAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAExB,0FAA0F;IAC1F,MAAM,IAAA,6BAAe,EAAC,GAAG,CAAC,CAAA;IAE1B,IAAI,EAAO,CAAA;IACX,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACtE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAA;QACrE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,aAAK,EAAC,2CAA2C,CAAC,CAAA;QAClD,IAAA,aAAK,EAAC,uCAAuC,CAAC,CAAA;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,mCAAmC;IACnC,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC1D,MAAM,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxE,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,IAAA,aAAK,EAAC,6BAA6B,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,CAAC,0BAA0B,CAChD,UAAU,CAAC,MAAM,EACjB,EAAE,CAAC,GAAG,EACN,mBAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAChC,CAAA;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAC/C,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACpC,CAAA;IAED,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,iBAAE,CAAC,YAAY,CAAC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACxD,CAAA;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,KAAK,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;IAED,8EAA8E;IAC9E,yEAAyE;IACzE,yDAAyD;IACzD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAC,CAAC,GAAG,mBAAmB,SAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE;YACvD,GAAG,YAAY,CAAC,OAAO;YACvB,MAAM,EAAE,IAAI;SACb,CAAC,CAAA;QACF,MAAM,WAAW,GAAG;YAClB,GAAG,YAAY,CAAC,MAAM;YACtB,GAAG,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC;SACrC,CAAA;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,oCAAoC,CAAC,WAAW,EAAE;gBACrE,oBAAoB,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;gBACtC,mBAAmB,EAAE,EAAE,CAAC,GAAG,CAAC,mBAAmB;gBAC/C,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;aACvB,CAAC,CAAA;YACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;YACtC,IAAA,aAAK,EAAC,sBAAsB,WAAW,CAAC,MAAM,kBAAkB,CAAC,CAAA;YACjE,OAAO,CAAC,KAAK,CACX,KAAK,SAAC,CAAC,MAAM,oCAAoC,SAAC,CAAC,KAAK,GAAG,SAAC,CAAC,OAAO,aAAa,SAAC,CAAC,KAAK,GAAG,SAAC,CAAC,MAAM,UAAU,SAAC,CAAC,KAAK,IAAI,CACzH,CAAA;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,SAAC,CAAC,MAAM,IAAI,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,GAAG,0CAA0C,SAAC,CAAC,KAAK,IAAI,CACvF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,GAAG,qBAAqB,SAAC,CAAC,KAAK,IAAI,CACjE,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAC,CAAC,GAAG,eAAe,SAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,wDAAa,SAAS,GAAC,CAAA;QACvC,MAAM,OAAO,CAAC,KAAK,CAAC;YAClB,WAAW;YACX,MAAM,EAAE,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;YAC9B,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAuB;YAC/B,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;QAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,GAAG,2BAA2B,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,SAAC,CAAC,KAAK,IAAI,CAC/F,CAAA;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACjB,IAAA,aAAK,EAAC,mBAAmB,GAAG,EAAE,OAAO,IAAI,8BAA8B,EAAE,CAAC,CAAA;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,mDAAmD;IACnD,MAAM,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAEjC,2CAA2C;IAC3C,IAAI,CAAC;QACH,MAAM,IAAA,8BAAgB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACjB,IAAA,aAAK,EAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,KAAK,CACX,KAAK,SAAC,CAAC,MAAM,4CAA4C,SAAC,CAAC,KAAK,GAAG,SAAC,CAAC,OAAO,aAAa,SAAC,CAAC,KAAK,GAAG,SAAC,CAAC,MAAM,UAAU,SAAC,CAAC,KAAK,IAAI,CACjI,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,+EAA+E;IAC/E,2EAA2E;IAC3E,4EAA4E;IAC5E,+EAA+E;IAC/E,sBAAsB;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAC,CAAC,GAAG,uBAAuB,SAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IAC9D,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAA;QAClE,IAAI,iBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,EAAE,uBAAuB,EAAE,GAC/B,wDAAa,uBAAuB,GAAC,CAAA;gBACvC,uBAAuB,CAAC,GAAG,CAAC,CAAA;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,QAAQ,CAChC,WAAW,EACX,0BAA0B,CAC3B,CAAA;YACD,MAAM,aAAa,CAAC,IAAA,wBAAa,EAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAA;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,GAAG,wBAAwB,SAAC,CAAC,KAAK,IAAI,CACpE,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACjB,IAAA,aAAK,EAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,KAAK,CACX,KAAK,SAAC,CAAC,MAAM,mCAAmC,SAAC,CAAC,KAAK,GAAG,SAAC,CAAC,OAAO,aAAa,SAAC,CAAC,KAAK,GAAG,SAAC,CAAC,MAAM,UAAU,SAAC,CAAC,KAAK,IAAI,CACxH,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;IAE7B,OAAO,CAAC,GAAG,CAAC,KAAK,SAAC,CAAC,KAAK,cAAc,EAAE,KAAK,SAAC,CAAC,KAAK,IAAI,CAAC,CAAA;IAEzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,MAAc;IACvD,IAAI,CAAC;QACH,MAAM,IAAA,uCAAkB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,SAAC,CAAC,MAAM,IAAI,SAAC,CAAC,KAAK,IAAI,SAAC,CAAC,GAAG,4BAA4B,GAAG,CAAC,OAAO,GAAG,SAAC,CAAC,KAAK,IAAI,CACvF,CAAA;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAUA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAocxE"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAWA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2nBxE"}
@@ -42,6 +42,7 @@ const node_path_1 = __importDefault(require("node:path"));
42
42
  const node_fs_1 = __importDefault(require("node:fs"));
43
43
  const node_http_1 = __importDefault(require("node:http"));
44
44
  const node_net_1 = __importDefault(require("node:net"));
45
+ const node_url_1 = require("node:url");
45
46
  const utils_1 = require("../utils");
46
47
  const time_1 = require("../../utils/time");
47
48
  const env_1 = require("../../config/env");
@@ -133,15 +134,23 @@ async function devCommand(options = {}) {
133
134
  const time = (0, time_1.getFormattedTime)();
134
135
  console.log(`\n${utils_1.c.dim}${time}${utils_1.c.reset} ${primary}[exis]${utils_1.c.reset} ${utils_1.c.dim}starting development server (v${version})...${utils_1.c.reset}`);
135
136
  // Hardcode Esbuild (tsx) as the Native HMR runner
137
+ let tsxArgs = [require.resolve('tsx/cli')];
138
+ try {
139
+ const resolved = require.resolve('tsx', { paths: [cwd, __dirname] });
140
+ tsxArgs = ['--import', (0, node_url_1.pathToFileURL)(resolved).href];
141
+ }
142
+ catch {
143
+ /* fallback to tsx/cli if resolve fails */
144
+ }
136
145
  const runner = {
137
146
  name: 'tsx',
138
147
  bin: process.execPath,
139
- args: [require.resolve('tsx/cli')],
148
+ args: tsxArgs,
140
149
  needsManualWatch: true,
141
150
  };
142
151
  let child = null;
143
152
  let isShuttingDown = false;
144
- const CHILD_EXIT_TIMEOUT_MS = 10000;
153
+ let watcher = null;
145
154
  function cleanupPid() {
146
155
  try {
147
156
  if (node_fs_1.default.existsSync(pidFile)) {
@@ -152,14 +161,45 @@ async function devCommand(options = {}) {
152
161
  /* ignore */
153
162
  }
154
163
  }
164
+ let forceExitTriggered = false;
155
165
  async function handleSessionStop(_signal) {
156
- if (isShuttingDown)
166
+ if (isShuttingDown) {
167
+ if (!forceExitTriggered) {
168
+ forceExitTriggered = true;
169
+ cleanupPid();
170
+ if (child && child.pid) {
171
+ try {
172
+ if (process.platform === 'win32') {
173
+ (0, node_child_process_1.spawnSync)('taskkill', ['/pid', String(child.pid), '/f', '/t'], {
174
+ stdio: 'ignore',
175
+ });
176
+ }
177
+ else {
178
+ child.kill('SIGKILL');
179
+ }
180
+ }
181
+ catch {
182
+ /* ignore */
183
+ }
184
+ }
185
+ process.exit(0);
186
+ }
157
187
  return;
188
+ }
158
189
  isShuttingDown = true;
159
190
  cleanupPid();
160
191
  const time = (0, time_1.getFormattedTime)();
161
192
  const primary = '\x1b[38;2;160;70;255m';
162
193
  console.log(`\n${utils_1.c.dim}${time}${utils_1.c.reset} ${primary}[exis]${utils_1.c.reset} ${utils_1.c.dim}gracefully shutting down server...${utils_1.c.reset}`);
194
+ if (watcher) {
195
+ try {
196
+ watcher.close();
197
+ }
198
+ catch {
199
+ /* ignore */
200
+ }
201
+ watcher = null;
202
+ }
163
203
  if (global._tscProcess) {
164
204
  try {
165
205
  ;
@@ -169,14 +209,30 @@ async function devCommand(options = {}) {
169
209
  /* ignore */
170
210
  }
171
211
  }
172
- if (child && child.pid) {
173
- if (child.exitCode !== null || child.signalCode !== null) {
174
- process.exit(0);
212
+ if (child &&
213
+ child.pid &&
214
+ child.exitCode === null &&
215
+ child.signalCode === null) {
216
+ try {
217
+ if (child.connected) {
218
+ child.send({ type: 'exis:shutdown' });
219
+ child.disconnect();
220
+ }
221
+ }
222
+ catch {
223
+ /* ignore */
224
+ }
225
+ try {
226
+ if (process.platform !== 'win32') {
227
+ child.kill('SIGTERM');
228
+ }
229
+ }
230
+ catch {
231
+ /* ignore */
175
232
  }
176
233
  const exitTimeout = setTimeout(() => {
177
- if (child && !child.killed) {
178
- console.log(`${utils_1.c.red} Force killing process after timeout...${utils_1.c.reset}`);
179
- try {
234
+ try {
235
+ if (child && !child.killed) {
180
236
  if (process.platform === 'win32') {
181
237
  (0, node_child_process_1.spawnSync)('taskkill', ['/pid', String(child.pid), '/f', '/t'], {
182
238
  stdio: 'ignore',
@@ -186,33 +242,18 @@ async function devCommand(options = {}) {
186
242
  child.kill('SIGKILL');
187
243
  }
188
244
  }
189
- catch {
190
- /* ignore */
191
- }
245
+ }
246
+ catch {
247
+ /* ignore */
192
248
  }
193
249
  process.exit(0);
194
- }, CHILD_EXIT_TIMEOUT_MS);
195
- child.on('exit', () => {
250
+ }, 2000);
251
+ const onChildDone = () => {
196
252
  clearTimeout(exitTimeout);
197
- // Small delay to allow the child's buffered stdout to fully flush
198
- // before the parent exits (fixes Windows race condition where the
199
- // PS prompt appears before the last log lines are printed).
200
- setTimeout(() => process.exit(0), 300);
201
- });
202
- try {
203
- if (process.platform === 'win32') {
204
- // On Windows, signals are not natively supported — send Ctrl+C
205
- // event to the child's console group so it can shut down gracefully.
206
- // The child already receives SIGINT from the terminal directly, so
207
- // this is a no-op safety net; the real fix is the drain delay above.
208
- }
209
- else {
210
- child.kill('SIGTERM');
211
- }
212
- }
213
- catch {
214
- /* ignore */
215
- }
253
+ process.exit(0);
254
+ };
255
+ child.once('close', onChildDone);
256
+ child.once('exit', onChildDone);
216
257
  }
217
258
  else {
218
259
  process.exit(0);
@@ -232,9 +273,31 @@ async function devCommand(options = {}) {
232
273
  fallbackServer = null;
233
274
  }
234
275
  }
235
- function startFallbackServer(errorMessage) {
276
+ let configuredPort = null;
277
+ try {
278
+ const configTs = node_path_1.default.join(cwd, 'exis.config.ts');
279
+ const configJs = node_path_1.default.join(cwd, 'exis.config.js');
280
+ const configFile = node_fs_1.default.existsSync(configTs)
281
+ ? configTs
282
+ : node_fs_1.default.existsSync(configJs)
283
+ ? configJs
284
+ : null;
285
+ if (configFile) {
286
+ const content = node_fs_1.default.readFileSync(configFile, 'utf8');
287
+ const match = content.match(/\bport\s*:\s*(\d+)/);
288
+ if (match) {
289
+ configuredPort = parseInt(match[1], 10);
290
+ }
291
+ }
292
+ }
293
+ catch {
294
+ /* ignore */
295
+ }
296
+ function startFallbackServer(errorMessage, customPort) {
236
297
  closeFallbackServer();
237
- const port = parseInt(process.env.PORT || '4000', 10);
298
+ const port = customPort ??
299
+ (process.env.PORT ? parseInt(process.env.PORT, 10) : configuredPort) ??
300
+ 4000;
238
301
  fallbackServer = node_http_1.default.createServer((req, res) => {
239
302
  res.writeHead(500, { 'Content-Type': 'text/html' });
240
303
  res.end(`
@@ -268,25 +331,89 @@ async function devCommand(options = {}) {
268
331
  });
269
332
  }
270
333
  let isRestarting = false;
334
+ let pendingRestart = false;
335
+ let reloadDebounceTimer = null;
336
+ const queuedChangedFiles = new Set();
337
+ const RELOAD_DEBOUNCE_MS = 150;
338
+ const RELOAD_TIMEOUT_MS = 3000;
339
+ async function killChildGracefully() {
340
+ if (!child || child.killed)
341
+ return;
342
+ // 1. Send IPC shutdown message so the child can run app.close() / onClose hooks
343
+ try {
344
+ if (child.connected) {
345
+ child.send({ type: 'exis:shutdown' });
346
+ }
347
+ }
348
+ catch {
349
+ /* ignore — child may have already exited */
350
+ }
351
+ // 2. Disconnect the IPC channel IMMEDIATELY after sending the shutdown message.
352
+ // On Windows, this is CRITICAL: it closes the parent's end of the IPC pipe
353
+ // before the child starts tearing down its libuv handles, preventing the
354
+ // UV_HANDLE_CLOSING assertion crash in src\win\async.c.
355
+ try {
356
+ if (child.connected) {
357
+ child.disconnect();
358
+ }
359
+ }
360
+ catch {
361
+ /* ignore — channel may already be closed */
362
+ }
363
+ // 3. On non-Windows, also send SIGTERM as a direct signal
364
+ try {
365
+ if (process.platform !== 'win32') {
366
+ child.kill('SIGTERM');
367
+ }
368
+ }
369
+ catch {
370
+ /* ignore */
371
+ }
372
+ // 4. Wait for clean exit with a generous graceful timeout (3000ms).
373
+ // Child will usually exit in ~50-200ms once onClose finishes.
374
+ await new Promise((resolve) => {
375
+ let resolved = false;
376
+ const onExitOrClose = () => {
377
+ if (resolved)
378
+ return;
379
+ resolved = true;
380
+ clearTimeout(timer);
381
+ resolve();
382
+ };
383
+ const timer = setTimeout(() => {
384
+ if (resolved)
385
+ return;
386
+ resolved = true;
387
+ // Timeout expired — force kill the child process tree
388
+ if (child && !child.killed) {
389
+ try {
390
+ if (process.platform === 'win32') {
391
+ (0, node_child_process_1.spawnSync)('taskkill', ['/pid', String(child.pid), '/f', '/t'], {
392
+ stdio: 'ignore',
393
+ });
394
+ }
395
+ else {
396
+ child.kill('SIGKILL');
397
+ }
398
+ }
399
+ catch {
400
+ /* ignore */
401
+ }
402
+ }
403
+ resolve();
404
+ }, RELOAD_TIMEOUT_MS);
405
+ child.once('close', onExitOrClose);
406
+ child.once('exit', onExitOrClose);
407
+ });
408
+ }
271
409
  async function startProcess() {
272
- if (isRestarting)
410
+ if (isRestarting) {
411
+ pendingRestart = true;
273
412
  return;
413
+ }
274
414
  isRestarting = true;
275
415
  closeFallbackServer();
276
- if (child) {
277
- child.kill('SIGTERM');
278
- await new Promise((resolve) => {
279
- const timeout = setTimeout(() => {
280
- if (child)
281
- child.kill('SIGKILL');
282
- resolve();
283
- }, 5000);
284
- child.once('exit', () => {
285
- clearTimeout(timeout);
286
- resolve();
287
- });
288
- });
289
- }
416
+ await killChildGracefully();
290
417
  child = (0, node_child_process_1.spawn)(runner.bin, [...runner.args, startServerPath], {
291
418
  cwd,
292
419
  env: {
@@ -295,14 +422,11 @@ async function devCommand(options = {}) {
295
422
  __EXIS_IS_RESTART: global._hasStartedBefore ? '1' : '',
296
423
  EXIS_ENTRY_FILE: entryFile,
297
424
  },
298
- stdio: ['inherit', 'pipe', 'pipe', 'ipc'],
425
+ stdio: ['inherit', 'inherit', 'pipe', 'ipc'],
299
426
  shell: runner.bin === process.execPath ? false : true,
300
427
  });
301
428
  global._hasStartedBefore = true;
302
429
  let stderrBuffer = '';
303
- child.stdout?.on('data', (chunk) => {
304
- process.stdout.write(chunk);
305
- });
306
430
  child.stderr?.on('data', (chunk) => {
307
431
  const str = chunk.toString();
308
432
  process.stderr.write(chunk);
@@ -330,29 +454,70 @@ async function devCommand(options = {}) {
330
454
  }
331
455
  });
332
456
  isRestarting = false;
457
+ // If more file changes arrived while we were restarting, trigger consolidated reload
458
+ if (pendingRestart) {
459
+ pendingRestart = false;
460
+ startProcess();
461
+ }
462
+ }
463
+ function scheduleReload(file) {
464
+ if (file) {
465
+ queuedChangedFiles.add(file);
466
+ }
467
+ if (reloadDebounceTimer) {
468
+ clearTimeout(reloadDebounceTimer);
469
+ }
470
+ reloadDebounceTimer = setTimeout(async () => {
471
+ reloadDebounceTimer = null;
472
+ const files = Array.from(queuedChangedFiles);
473
+ queuedChangedFiles.clear();
474
+ const time = (0, time_1.getFormattedTime)();
475
+ const primary = '\x1b[38;2;160;70;255m';
476
+ const fileLabel = files.length === 1
477
+ ? files[0]
478
+ : files.length > 1
479
+ ? `${files[0]} (+${files.length - 1} other files)`
480
+ : 'file changes';
481
+ console.log(`${utils_1.c.dim}${time}${utils_1.c.reset} ${primary}[exis]${utils_1.c.reset} ${utils_1.c.dim}reloading due to change in ${fileLabel}${utils_1.c.reset}`);
482
+ await generateManifest(cwd, '', true);
483
+ startProcess();
484
+ }, RELOAD_DEBOUNCE_MS);
333
485
  }
334
486
  // Handle restarts for runners that don't support watch natively
335
487
  if (runner.needsManualWatch && !options._disableWatch) {
336
488
  const chokidar = await importChokidar();
337
489
  if (chokidar) {
338
- const watcher = chokidar.watch([cwd], {
490
+ watcher = chokidar.watch([cwd], {
339
491
  cwd,
340
492
  ignoreInitial: true,
341
493
  ignored: [
342
494
  // eslint-disable-next-line no-useless-escape
343
- /(^|[\/\\])\../, // ignore dotfiles
495
+ /(^|[\/\\])\../, // ignore dotfiles (.git, .vscode, .idea, etc.)
344
496
  /node_modules/,
345
497
  /\.exis/,
346
498
  /dist/,
499
+ /build/,
347
500
  /exis\.d\.ts$/,
501
+ /\.(rar|zip|7z|tar|gz|tgz|bz2|xz|iso)$/i, // compressed archives
502
+ /\.(bak|tmp|temp|swp|swo|lock|pid)$/i, // temporary and lock files
503
+ /\.(log|log\.\d+|sqlite|sqlite3|db|db-shm|db-wal|db-journal)$/i, // logs and databases
504
+ /\.(png|jpe?g|gif|svg|ico|webp|avif|mp4|webm|mov|mp3|wav|pdf|docx?|xlsx?|pptx?)$/i, // media & binary docs
348
505
  ],
349
506
  });
507
+ watcher.on('error', (err) => {
508
+ // Suppress non-fatal Windows file lock / permission errors (EBUSY / EPERM)
509
+ if (err?.code === 'EBUSY' ||
510
+ err?.code === 'EPERM' ||
511
+ err?.code === 'UNKNOWN') {
512
+ return;
513
+ }
514
+ console.warn(`\x1b[33m[exis watcher notice]\x1b[0m ${err?.message || err}`);
515
+ });
350
516
  watcher.on('all', async (eventName, file) => {
351
- const time = (0, time_1.getFormattedTime)();
352
- const primary = '\x1b[38;2;160;70;255m';
353
- console.log(`${utils_1.c.dim}${time}${utils_1.c.reset} ${primary}[exis]${utils_1.c.reset} ${utils_1.c.dim}reloading due to change in ${file}${utils_1.c.reset}`);
354
- await generateManifest(cwd, '', true);
355
- startProcess();
517
+ if (/\.(rar|zip|7z|tar|gz|tgz|bz2|xz|iso|bak|tmp|temp|swp|swo|lock|pid|log|sqlite|sqlite3|db|png|jpe?g|gif|svg|ico|webp|pdf)$/i.test(file)) {
518
+ return;
519
+ }
520
+ scheduleReload(file);
356
521
  });
357
522
  }
358
523
  }
@@ -388,13 +553,13 @@ async function devCommand(options = {}) {
388
553
  }
389
554
  else if (line.includes('error TS')) {
390
555
  const time = getTime();
391
- console.error(`\n${utils_1.c.red}[${time}] ERROR:${utils_1.c.reset} ${line}`);
556
+ console.error(`\n${utils_1.c.red}${time} ERROR:${utils_1.c.reset} ${line}`);
392
557
  tscErrors.push(line);
393
558
  }
394
559
  else if (line.includes('Found') && line.includes('error')) {
395
560
  // "Found X errors." summary line
396
561
  const time = getTime();
397
- console.error(`\n${utils_1.c.yellow}[${time}] INFO:${utils_1.c.reset} ${line}`);
562
+ console.error(`\n${utils_1.c.yellow}${time} INFO:${utils_1.c.reset} ${line}`);
398
563
  if (tscErrors.length > 0) {
399
564
  startFallbackServer(`TypeScript Compilation Errors\n${'─'.repeat(50)}\n\n` +
400
565
  tscErrors.join('\n'));
@@ -403,7 +568,7 @@ async function devCommand(options = {}) {
403
568
  else if (!line.includes('Starting compilation in watch mode') &&
404
569
  !line.includes('File change detected')) {
405
570
  const time = getTime();
406
- console.error(`${utils_1.c.yellow}[${time}] INFO:${utils_1.c.reset} ${line}`);
571
+ console.error(`${utils_1.c.yellow}${time} INFO:${utils_1.c.reset} ${line}`);
407
572
  }
408
573
  }
409
574
  });