qhttpx 2.1.0 → 2.3.1

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 (267) hide show
  1. package/LICENSE +201 -21
  2. package/README.md +117 -221
  3. package/dist/chunk-QW72SEAS.mjs +98 -0
  4. package/dist/{src/cli/index.d.ts → cli.d.mts} +0 -1
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.js +287 -0
  7. package/dist/cli.mjs +209 -0
  8. package/dist/index.d.mts +433 -0
  9. package/dist/index.d.ts +433 -0
  10. package/dist/index.js +1955 -0
  11. package/dist/index.mjs +1863 -0
  12. package/dist/qhttpx-core-new.linux-x64-gnu.node +0 -0
  13. package/dist/qhttpx-core-new.node +0 -0
  14. package/dist/qhttpx-core-new.win32-x64-msvc.node +0 -0
  15. package/examples/benchmark.ts +67 -0
  16. package/examples/body_demo.ts +32 -0
  17. package/examples/chat_client.ts +36 -0
  18. package/examples/chat_demo.ts +41 -0
  19. package/examples/cluster_demo.ts +26 -0
  20. package/examples/cors_demo.ts +25 -0
  21. package/examples/db_auth_demo.ts +66 -0
  22. package/examples/demo.ts +52 -0
  23. package/examples/headers_demo.ts +24 -0
  24. package/examples/hello.ts +7 -0
  25. package/examples/http2_demo.ts +52 -0
  26. package/examples/magic-dev.ts +15 -0
  27. package/examples/middleware_demo.ts +34 -0
  28. package/examples/mongo_demo.ts +40 -0
  29. package/examples/native_policy_demo.ts +33 -0
  30. package/examples/observability_demo.ts +24 -0
  31. package/examples/public/1mb.dat +1 -0
  32. package/examples/query_demo.ts +29 -0
  33. package/examples/response_demo.ts +21 -0
  34. package/examples/routing_demo.ts +24 -0
  35. package/examples/server.ts +51 -0
  36. package/examples/static_demo.ts +29 -0
  37. package/examples/test_middleware_client.ts +33 -0
  38. package/examples/test_query_client.ts +34 -0
  39. package/examples/test_response_client.ts +30 -0
  40. package/examples/tls_demo.ts +32 -0
  41. package/examples/upload_demo.ts +43 -0
  42. package/examples/uploads/test.txt +1 -0
  43. package/examples/verify_upload.ts +69 -0
  44. package/examples/ws_client.ts +26 -0
  45. package/examples/ws_demo.ts +21 -0
  46. package/package.json +65 -81
  47. package/CHANGELOG.md +0 -285
  48. package/dist/examples/api-server.d.ts +0 -1
  49. package/dist/examples/api-server.js +0 -80
  50. package/dist/examples/basic.d.ts +0 -1
  51. package/dist/examples/basic.js +0 -9
  52. package/dist/examples/compression.d.ts +0 -1
  53. package/dist/examples/compression.js +0 -15
  54. package/dist/examples/cors.d.ts +0 -1
  55. package/dist/examples/cors.js +0 -18
  56. package/dist/examples/errors.d.ts +0 -1
  57. package/dist/examples/errors.js +0 -26
  58. package/dist/examples/file-upload.d.ts +0 -1
  59. package/dist/examples/file-upload.js +0 -22
  60. package/dist/examples/fusion.d.ts +0 -1
  61. package/dist/examples/fusion.js +0 -21
  62. package/dist/examples/rate-limiting.d.ts +0 -1
  63. package/dist/examples/rate-limiting.js +0 -17
  64. package/dist/examples/validation.d.ts +0 -1
  65. package/dist/examples/validation.js +0 -22
  66. package/dist/examples/websockets.d.ts +0 -1
  67. package/dist/examples/websockets.js +0 -19
  68. package/dist/package.json +0 -107
  69. package/dist/src/benchmarks/quantam-users.d.ts +0 -1
  70. package/dist/src/benchmarks/quantam-users.js +0 -56
  71. package/dist/src/benchmarks/quick-bench.d.ts +0 -1
  72. package/dist/src/benchmarks/quick-bench.js +0 -57
  73. package/dist/src/benchmarks/simple-json.d.ts +0 -1
  74. package/dist/src/benchmarks/simple-json.js +0 -171
  75. package/dist/src/benchmarks/ultra-mode.d.ts +0 -1
  76. package/dist/src/benchmarks/ultra-mode.js +0 -64
  77. package/dist/src/cli/index.js +0 -222
  78. package/dist/src/client/index.d.ts +0 -17
  79. package/dist/src/client/index.js +0 -72
  80. package/dist/src/core/batch.d.ts +0 -24
  81. package/dist/src/core/batch.js +0 -97
  82. package/dist/src/core/body-parser.d.ts +0 -15
  83. package/dist/src/core/body-parser.js +0 -121
  84. package/dist/src/core/buffer-pool.d.ts +0 -41
  85. package/dist/src/core/buffer-pool.js +0 -70
  86. package/dist/src/core/config.d.ts +0 -7
  87. package/dist/src/core/config.js +0 -50
  88. package/dist/src/core/context-pool.d.ts +0 -12
  89. package/dist/src/core/context-pool.js +0 -34
  90. package/dist/src/core/errors.d.ts +0 -34
  91. package/dist/src/core/errors.js +0 -70
  92. package/dist/src/core/fusion.d.ts +0 -20
  93. package/dist/src/core/fusion.js +0 -191
  94. package/dist/src/core/logger.d.ts +0 -22
  95. package/dist/src/core/logger.js +0 -49
  96. package/dist/src/core/metrics.d.ts +0 -50
  97. package/dist/src/core/metrics.js +0 -123
  98. package/dist/src/core/resources.d.ts +0 -9
  99. package/dist/src/core/resources.js +0 -25
  100. package/dist/src/core/scheduler.d.ts +0 -38
  101. package/dist/src/core/scheduler.js +0 -126
  102. package/dist/src/core/scope.d.ts +0 -41
  103. package/dist/src/core/scope.js +0 -107
  104. package/dist/src/core/serializer.d.ts +0 -10
  105. package/dist/src/core/serializer.js +0 -82
  106. package/dist/src/core/server.d.ts +0 -179
  107. package/dist/src/core/server.js +0 -1511
  108. package/dist/src/core/stream.d.ts +0 -15
  109. package/dist/src/core/stream.js +0 -71
  110. package/dist/src/core/tasks.d.ts +0 -29
  111. package/dist/src/core/tasks.js +0 -87
  112. package/dist/src/core/timer.d.ts +0 -11
  113. package/dist/src/core/timer.js +0 -29
  114. package/dist/src/core/types.d.ts +0 -225
  115. package/dist/src/core/types.js +0 -19
  116. package/dist/src/core/websocket.d.ts +0 -25
  117. package/dist/src/core/websocket.js +0 -86
  118. package/dist/src/core/worker-queue.d.ts +0 -41
  119. package/dist/src/core/worker-queue.js +0 -73
  120. package/dist/src/database/adapters/memory.d.ts +0 -21
  121. package/dist/src/database/adapters/memory.js +0 -90
  122. package/dist/src/database/adapters/mongo.d.ts +0 -11
  123. package/dist/src/database/adapters/mongo.js +0 -141
  124. package/dist/src/database/adapters/postgres.d.ts +0 -10
  125. package/dist/src/database/adapters/postgres.js +0 -111
  126. package/dist/src/database/adapters/sqlite.d.ts +0 -10
  127. package/dist/src/database/adapters/sqlite.js +0 -42
  128. package/dist/src/database/coalescer.d.ts +0 -14
  129. package/dist/src/database/coalescer.js +0 -134
  130. package/dist/src/database/manager.d.ts +0 -35
  131. package/dist/src/database/manager.js +0 -87
  132. package/dist/src/database/types.d.ts +0 -20
  133. package/dist/src/database/types.js +0 -2
  134. package/dist/src/index.d.ts +0 -52
  135. package/dist/src/index.js +0 -92
  136. package/dist/src/middleware/compression.d.ts +0 -2
  137. package/dist/src/middleware/compression.js +0 -133
  138. package/dist/src/middleware/cors.d.ts +0 -2
  139. package/dist/src/middleware/cors.js +0 -66
  140. package/dist/src/middleware/presets.d.ts +0 -15
  141. package/dist/src/middleware/presets.js +0 -52
  142. package/dist/src/middleware/rate-limit.d.ts +0 -14
  143. package/dist/src/middleware/rate-limit.js +0 -83
  144. package/dist/src/middleware/security.d.ts +0 -10
  145. package/dist/src/middleware/security.js +0 -74
  146. package/dist/src/middleware/static.d.ts +0 -11
  147. package/dist/src/middleware/static.js +0 -191
  148. package/dist/src/openapi/generator.d.ts +0 -19
  149. package/dist/src/openapi/generator.js +0 -149
  150. package/dist/src/router/radix-router.d.ts +0 -18
  151. package/dist/src/router/radix-router.js +0 -89
  152. package/dist/src/router/radix-tree.d.ts +0 -21
  153. package/dist/src/router/radix-tree.js +0 -175
  154. package/dist/src/router/router.d.ts +0 -37
  155. package/dist/src/router/router.js +0 -203
  156. package/dist/src/testing/index.d.ts +0 -25
  157. package/dist/src/testing/index.js +0 -84
  158. package/dist/src/utils/cookies.d.ts +0 -3
  159. package/dist/src/utils/cookies.js +0 -59
  160. package/dist/src/utils/logger.d.ts +0 -2
  161. package/dist/src/utils/logger.js +0 -45
  162. package/dist/src/utils/signals.d.ts +0 -6
  163. package/dist/src/utils/signals.js +0 -31
  164. package/dist/src/utils/sse.d.ts +0 -6
  165. package/dist/src/utils/sse.js +0 -32
  166. package/dist/src/validation/index.d.ts +0 -3
  167. package/dist/src/validation/index.js +0 -19
  168. package/dist/src/validation/simple.d.ts +0 -5
  169. package/dist/src/validation/simple.js +0 -102
  170. package/dist/src/validation/types.d.ts +0 -32
  171. package/dist/src/validation/types.js +0 -12
  172. package/dist/src/validation/zod.d.ts +0 -4
  173. package/dist/src/validation/zod.js +0 -18
  174. package/dist/src/views/index.d.ts +0 -1
  175. package/dist/src/views/index.js +0 -17
  176. package/dist/src/views/types.d.ts +0 -3
  177. package/dist/src/views/types.js +0 -2
  178. package/dist/tests/adapters.test.d.ts +0 -1
  179. package/dist/tests/adapters.test.js +0 -106
  180. package/dist/tests/batch.test.d.ts +0 -1
  181. package/dist/tests/batch.test.js +0 -117
  182. package/dist/tests/body-parser.test.d.ts +0 -1
  183. package/dist/tests/body-parser.test.js +0 -52
  184. package/dist/tests/compression-sse.test.d.ts +0 -1
  185. package/dist/tests/compression-sse.test.js +0 -87
  186. package/dist/tests/cookies.test.d.ts +0 -1
  187. package/dist/tests/cookies.test.js +0 -63
  188. package/dist/tests/cors.test.d.ts +0 -1
  189. package/dist/tests/cors.test.js +0 -55
  190. package/dist/tests/database.test.d.ts +0 -1
  191. package/dist/tests/database.test.js +0 -80
  192. package/dist/tests/dx.test.d.ts +0 -1
  193. package/dist/tests/dx.test.js +0 -114
  194. package/dist/tests/ecosystem.test.d.ts +0 -1
  195. package/dist/tests/ecosystem.test.js +0 -133
  196. package/dist/tests/features.test.d.ts +0 -1
  197. package/dist/tests/features.test.js +0 -47
  198. package/dist/tests/fusion.test.d.ts +0 -1
  199. package/dist/tests/fusion.test.js +0 -92
  200. package/dist/tests/http-basic.test.d.ts +0 -1
  201. package/dist/tests/http-basic.test.js +0 -124
  202. package/dist/tests/logger.test.d.ts +0 -1
  203. package/dist/tests/logger.test.js +0 -33
  204. package/dist/tests/middleware.test.d.ts +0 -1
  205. package/dist/tests/middleware.test.js +0 -109
  206. package/dist/tests/observability.test.d.ts +0 -1
  207. package/dist/tests/observability.test.js +0 -59
  208. package/dist/tests/openapi.test.d.ts +0 -1
  209. package/dist/tests/openapi.test.js +0 -64
  210. package/dist/tests/plugin.test.d.ts +0 -1
  211. package/dist/tests/plugin.test.js +0 -65
  212. package/dist/tests/plugins.test.d.ts +0 -1
  213. package/dist/tests/plugins.test.js +0 -71
  214. package/dist/tests/rate-limit.test.d.ts +0 -1
  215. package/dist/tests/rate-limit.test.js +0 -77
  216. package/dist/tests/resources.test.d.ts +0 -1
  217. package/dist/tests/resources.test.js +0 -47
  218. package/dist/tests/scheduler.test.d.ts +0 -1
  219. package/dist/tests/scheduler.test.js +0 -46
  220. package/dist/tests/schema-routes.test.d.ts +0 -1
  221. package/dist/tests/schema-routes.test.js +0 -79
  222. package/dist/tests/security.test.d.ts +0 -1
  223. package/dist/tests/security.test.js +0 -83
  224. package/dist/tests/server-db.test.d.ts +0 -1
  225. package/dist/tests/server-db.test.js +0 -72
  226. package/dist/tests/smoke.test.d.ts +0 -1
  227. package/dist/tests/smoke.test.js +0 -10
  228. package/dist/tests/sqlite-fusion.test.d.ts +0 -1
  229. package/dist/tests/sqlite-fusion.test.js +0 -92
  230. package/dist/tests/static.test.d.ts +0 -1
  231. package/dist/tests/static.test.js +0 -102
  232. package/dist/tests/stream.test.d.ts +0 -1
  233. package/dist/tests/stream.test.js +0 -44
  234. package/dist/tests/task-metrics.test.d.ts +0 -1
  235. package/dist/tests/task-metrics.test.js +0 -53
  236. package/dist/tests/tasks.test.d.ts +0 -1
  237. package/dist/tests/tasks.test.js +0 -62
  238. package/dist/tests/testing.test.d.ts +0 -1
  239. package/dist/tests/testing.test.js +0 -47
  240. package/dist/tests/validation.test.d.ts +0 -1
  241. package/dist/tests/validation.test.js +0 -107
  242. package/dist/tests/websocket.test.d.ts +0 -1
  243. package/dist/tests/websocket.test.js +0 -146
  244. package/dist/vitest.config.d.ts +0 -2
  245. package/dist/vitest.config.js +0 -9
  246. package/docs/AEGIS.md +0 -91
  247. package/docs/API_REFERENCE.md +0 -749
  248. package/docs/BENCHMARKS.md +0 -39
  249. package/docs/CAPABILITIES.md +0 -70
  250. package/docs/CLI.md +0 -43
  251. package/docs/DATABASE.md +0 -142
  252. package/docs/ECOSYSTEM.md +0 -146
  253. package/docs/ERRORS.md +0 -112
  254. package/docs/FUSION.md +0 -87
  255. package/docs/MIDDLEWARE.md +0 -65
  256. package/docs/MIGRATION_1.9_TO_2.0.md +0 -495
  257. package/docs/NEXT_STEPS.md +0 -99
  258. package/docs/OPENAPI.md +0 -99
  259. package/docs/PLUGINS.md +0 -59
  260. package/docs/PRODUCTION_DEPLOYMENT.md +0 -798
  261. package/docs/REAL_WORLD_EXAMPLES.md +0 -109
  262. package/docs/ROADMAP.md +0 -366
  263. package/docs/ROUTING.md +0 -78
  264. package/docs/SECURITY.md +0 -876
  265. package/docs/STATIC.md +0 -61
  266. package/docs/VALIDATION.md +0 -114
  267. package/docs/WEBSOCKETS.md +0 -76
@@ -0,0 +1,98 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
9
+ }) : x)(function(x) {
10
+ if (typeof require !== "undefined") return require.apply(this, arguments);
11
+ throw Error('Dynamic require of "' + x + '" is not supported');
12
+ });
13
+ var __commonJS = (cb, mod) => function __require2() {
14
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
15
+ };
16
+ var __copyProps = (to, from, except, desc) => {
17
+ if (from && typeof from === "object" || typeof from === "function") {
18
+ for (let key of __getOwnPropNames(from))
19
+ if (!__hasOwnProp.call(to, key) && key !== except)
20
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
21
+ }
22
+ return to;
23
+ };
24
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
25
+ // If the importer is in node compatibility mode or this is not an ESM
26
+ // file that has been converted to a CommonJS file using a Babel-
27
+ // compatible transform (i.e. "__esModule" has not been set), then set
28
+ // "default" to the CommonJS "module.exports" for node compatibility.
29
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
30
+ mod
31
+ ));
32
+
33
+ // core/index.js
34
+ var require_core = __commonJS({
35
+ "core/index.js"(exports, module) {
36
+ "use strict";
37
+ var { join } = __require("path");
38
+ var { platform, arch } = process;
39
+ var nativeBinding = null;
40
+ if (platform === "win32" && arch === "x64") {
41
+ nativeBinding = __require("./qhttpx-core-new.win32-x64-msvc.node");
42
+ } else if (platform === "linux" && arch === "x64") {
43
+ nativeBinding = __require("./qhttpx-core-new.linux-x64-gnu.node");
44
+ } else if (platform === "darwin") {
45
+ if (arch === "x64") {
46
+ nativeBinding = __require("./qhttpx-core-new.darwin-x64.node");
47
+ } else if (arch === "arm64") {
48
+ nativeBinding = __require("./qhttpx-core-new.darwin-arm64.node");
49
+ }
50
+ } else {
51
+ throw new Error(`Unsupported platform: ${platform} ${arch}`);
52
+ }
53
+ module.exports = nativeBinding;
54
+ }
55
+ });
56
+
57
+ // src/env.ts
58
+ import fs from "fs";
59
+ import path from "path";
60
+ function parseEnv(content) {
61
+ const env2 = {};
62
+ const lines = content.split("\n");
63
+ for (const line of lines) {
64
+ const trimmed = line.trim();
65
+ if (!trimmed || trimmed.startsWith("#")) continue;
66
+ const [key, ...values] = trimmed.split("=");
67
+ if (!key) continue;
68
+ const value = values.join("=").trim();
69
+ const finalValue = value.replace(/^['"](.*)['"]$/, "$1");
70
+ env2[key.trim()] = finalValue;
71
+ }
72
+ return env2;
73
+ }
74
+ function loadEnv(filePath) {
75
+ const envPath = filePath || path.resolve(process.cwd(), ".env");
76
+ if (fs.existsSync(envPath)) {
77
+ const content = fs.readFileSync(envPath, "utf-8");
78
+ const parsed = parseEnv(content);
79
+ for (const [key, value] of Object.entries(parsed)) {
80
+ if (!process.env[key]) {
81
+ process.env[key] = value;
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+ function env(key, defaultValue) {
89
+ return process.env[key] || defaultValue || "";
90
+ }
91
+
92
+ export {
93
+ __require,
94
+ __toESM,
95
+ require_core,
96
+ loadEnv,
97
+ env
98
+ };
@@ -1,2 +1 @@
1
1
  #!/usr/bin/env node
2
- export {};
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/cli.js ADDED
@@ -0,0 +1,287 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __commonJS = (cb, mod) => function __require() {
10
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+
29
+ // core/index.js
30
+ var require_core = __commonJS({
31
+ "core/index.js"(exports2, module2) {
32
+ "use strict";
33
+ var { join } = require("path");
34
+ var { platform, arch } = process;
35
+ var nativeBinding = null;
36
+ if (platform === "win32" && arch === "x64") {
37
+ nativeBinding = require("./qhttpx-core-new.win32-x64-msvc.node");
38
+ } else if (platform === "linux" && arch === "x64") {
39
+ nativeBinding = require("./qhttpx-core-new.linux-x64-gnu.node");
40
+ } else if (platform === "darwin") {
41
+ if (arch === "x64") {
42
+ nativeBinding = require("./qhttpx-core-new.darwin-x64.node");
43
+ } else if (arch === "arm64") {
44
+ nativeBinding = require("./qhttpx-core-new.darwin-arm64.node");
45
+ }
46
+ } else {
47
+ throw new Error(`Unsupported platform: ${platform} ${arch}`);
48
+ }
49
+ module2.exports = nativeBinding;
50
+ }
51
+ });
52
+
53
+ // src/cli.ts
54
+ var import_commander = require("commander");
55
+ var import_child_process = require("child_process");
56
+ var import_path2 = __toESM(require("path"));
57
+ var import_picocolors = __toESM(require("picocolors"));
58
+ var import_fs2 = __toESM(require("fs"));
59
+ var import_core = __toESM(require_core());
60
+
61
+ // src/env.ts
62
+ var import_fs = __toESM(require("fs"));
63
+ var import_path = __toESM(require("path"));
64
+ function parseEnv(content) {
65
+ const env = {};
66
+ const lines = content.split("\n");
67
+ for (const line of lines) {
68
+ const trimmed = line.trim();
69
+ if (!trimmed || trimmed.startsWith("#")) continue;
70
+ const [key, ...values] = trimmed.split("=");
71
+ if (!key) continue;
72
+ const value = values.join("=").trim();
73
+ const finalValue = value.replace(/^['"](.*)['"]$/, "$1");
74
+ env[key.trim()] = finalValue;
75
+ }
76
+ return env;
77
+ }
78
+ function loadEnv(filePath) {
79
+ const envPath = filePath || import_path.default.resolve(process.cwd(), ".env");
80
+ if (import_fs.default.existsSync(envPath)) {
81
+ const content = import_fs.default.readFileSync(envPath, "utf-8");
82
+ const parsed = parseEnv(content);
83
+ for (const [key, value] of Object.entries(parsed)) {
84
+ if (!process.env[key]) {
85
+ process.env[key] = value;
86
+ }
87
+ }
88
+ return true;
89
+ }
90
+ return false;
91
+ }
92
+
93
+ // src/cli.ts
94
+ loadEnv();
95
+ var resolveDbTarget = (options) => {
96
+ const postgresUrl = options.postgres ?? process.env.POSTGRES_URL;
97
+ const sqliteUrl = options.sqlite ?? process.env.SQLITE_URL;
98
+ if (postgresUrl && sqliteUrl) {
99
+ throw new Error("Provide only one of --postgres or --sqlite.");
100
+ }
101
+ if (sqliteUrl) {
102
+ return { type: "sqlite", url: sqliteUrl };
103
+ }
104
+ if (postgresUrl) {
105
+ return { type: "postgres", url: postgresUrl };
106
+ }
107
+ const envUrl = process.env.DATABASE_URL;
108
+ if (envUrl) {
109
+ const type = envUrl.startsWith("sqlite") ? "sqlite" : "postgres";
110
+ return { type, url: envUrl };
111
+ }
112
+ return null;
113
+ };
114
+ var splitSqlStatements = (sql) => {
115
+ const statements = [];
116
+ let current = "";
117
+ let inSingle = false;
118
+ let inDouble = false;
119
+ for (let i = 0; i < sql.length; i += 1) {
120
+ const ch = sql[i];
121
+ const prev = i > 0 ? sql[i - 1] : "";
122
+ if (ch === "'" && !inDouble && prev !== "\\") {
123
+ inSingle = !inSingle;
124
+ } else if (ch === '"' && !inSingle && prev !== "\\") {
125
+ inDouble = !inDouble;
126
+ }
127
+ if (ch === ";" && !inSingle && !inDouble) {
128
+ const trimmed2 = current.trim();
129
+ if (trimmed2) statements.push(trimmed2);
130
+ current = "";
131
+ continue;
132
+ }
133
+ current += ch;
134
+ }
135
+ const trimmed = current.trim();
136
+ if (trimmed) statements.push(trimmed);
137
+ return statements;
138
+ };
139
+ var readSqlStatements = async (filePath) => {
140
+ const raw = await import_fs2.default.promises.readFile(filePath, "utf8");
141
+ const cleaned = raw.replace(/^\s*--.*$/gm, "").trim();
142
+ if (!cleaned) return [];
143
+ return splitSqlStatements(cleaned);
144
+ };
145
+ var ensureMigrationsTable = async (engine, dbType) => {
146
+ const sql = dbType === "sqlite" ? "CREATE TABLE IF NOT EXISTS _qhttpx_migrations (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL, applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP)" : "CREATE TABLE IF NOT EXISTS _qhttpx_migrations (id SERIAL PRIMARY KEY, name TEXT UNIQUE NOT NULL, applied_at TIMESTAMP NOT NULL DEFAULT NOW())";
147
+ await engine.queryDb(sql);
148
+ };
149
+ var getAppliedMigrations = async (engine) => {
150
+ const res = await engine.queryDb("SELECT name FROM _qhttpx_migrations ORDER BY id");
151
+ const rows = JSON.parse(res);
152
+ return rows.map((row) => row.name).filter((name) => Boolean(name));
153
+ };
154
+ var getMigrationFiles = async (dir) => {
155
+ const entries = await import_fs2.default.promises.readdir(dir, { withFileTypes: true });
156
+ const migrations = entries.filter((entry) => entry.isFile() && entry.name.endsWith(".up.sql")).map((entry) => {
157
+ const name = entry.name.replace(/\.up\.sql$/, "");
158
+ const upPath = import_path2.default.join(dir, entry.name);
159
+ const downPath = import_path2.default.join(dir, `${name}.down.sql`);
160
+ return { name, upPath, downPath };
161
+ }).sort((a, b) => a.name.localeCompare(b.name));
162
+ return migrations;
163
+ };
164
+ var applyStatements = async (engine, statements) => {
165
+ for (const statement of statements) {
166
+ await engine.queryDb(statement);
167
+ }
168
+ };
169
+ var insertMigration = async (engine, dbType, name) => {
170
+ const placeholder = dbType === "sqlite" ? "?" : "$1";
171
+ await engine.queryDbWithParams(
172
+ `INSERT INTO _qhttpx_migrations (name) VALUES (${placeholder})`,
173
+ [name]
174
+ );
175
+ };
176
+ var removeMigration = async (engine, dbType, name) => {
177
+ const placeholder = dbType === "sqlite" ? "?" : "$1";
178
+ await engine.queryDbWithParams(
179
+ `DELETE FROM _qhttpx_migrations WHERE name = ${placeholder}`,
180
+ [name]
181
+ );
182
+ };
183
+ var runMigrations = async (direction, options) => {
184
+ const dbTarget = resolveDbTarget(options);
185
+ if (!dbTarget) {
186
+ throw new Error("No database configured. Use --postgres, --sqlite, or set DATABASE_URL.");
187
+ }
188
+ const migrationsDir = import_path2.default.resolve(process.cwd(), options.dir || "migrations");
189
+ if (!import_fs2.default.existsSync(migrationsDir)) {
190
+ throw new Error(`Migrations directory not found: ${migrationsDir}`);
191
+ }
192
+ const engine = new import_core.NativeEngine(0);
193
+ if (dbTarget.type === "sqlite") {
194
+ await engine.connectSqlite(dbTarget.url);
195
+ } else {
196
+ await engine.connectPostgres(dbTarget.url);
197
+ }
198
+ await ensureMigrationsTable(engine, dbTarget.type);
199
+ const migrations = await getMigrationFiles(migrationsDir);
200
+ if (migrations.length === 0) {
201
+ console.log(import_picocolors.default.yellow("No migrations found."));
202
+ return;
203
+ }
204
+ if (direction === "up") {
205
+ const applied2 = new Set(await getAppliedMigrations(engine));
206
+ const pending = migrations.filter((m) => !applied2.has(m.name));
207
+ if (pending.length === 0) {
208
+ console.log(import_picocolors.default.green("All migrations already applied."));
209
+ return;
210
+ }
211
+ for (const migration of pending) {
212
+ const statements = await readSqlStatements(migration.upPath);
213
+ if (statements.length === 0) continue;
214
+ await applyStatements(engine, statements);
215
+ await insertMigration(engine, dbTarget.type, migration.name);
216
+ console.log(import_picocolors.default.green(`Applied ${migration.name}`));
217
+ }
218
+ return;
219
+ }
220
+ const applied = await getAppliedMigrations(engine);
221
+ const steps = Math.max(1, Number.parseInt(options.steps || "1", 10) || 1);
222
+ const toRollback = applied.slice(-steps).reverse();
223
+ if (toRollback.length === 0) {
224
+ console.log(import_picocolors.default.yellow("No migrations to roll back."));
225
+ return;
226
+ }
227
+ for (const name of toRollback) {
228
+ const migration = migrations.find((m) => m.name === name);
229
+ if (!migration) {
230
+ throw new Error(`Migration file missing for ${name}`);
231
+ }
232
+ if (!import_fs2.default.existsSync(migration.downPath)) {
233
+ throw new Error(`Down migration not found for ${name}`);
234
+ }
235
+ const statements = await readSqlStatements(migration.downPath);
236
+ if (statements.length === 0) continue;
237
+ await applyStatements(engine, statements);
238
+ await removeMigration(engine, dbTarget.type, name);
239
+ console.log(import_picocolors.default.yellow(`Reverted ${name}`));
240
+ }
241
+ };
242
+ var program = new import_commander.Command();
243
+ program.name("qhttpx").description("The AI-Native High-Performance Web Engine CLI").version("0.1.1");
244
+ program.command("dev [entry]").description('Start the development server with "Magic" Dev Mode').action((entry = "src/index.ts") => {
245
+ console.clear();
246
+ console.log(import_picocolors.default.bold(import_picocolors.default.cyan(`
247
+ \u2728 QHTTPX Magic Dev Mode
248
+ `)));
249
+ const args = ["watch", entry];
250
+ const fs3 = require("fs");
251
+ if (!fs3.existsSync(entry)) {
252
+ console.error(import_picocolors.default.red(`\u274C Entry file not found: ${entry}`));
253
+ console.log(import_picocolors.default.gray(`Please provide a valid entry file (default: src/index.ts)`));
254
+ process.exit(1);
255
+ }
256
+ console.log(import_picocolors.default.gray(`Watching ${entry} and dependencies...`));
257
+ const child = (0, import_child_process.spawn)("npx", ["tsx", ...args], {
258
+ stdio: "inherit",
259
+ shell: true,
260
+ env: { ...process.env, NODE_ENV: "development", FORCE_COLOR: "1" }
261
+ });
262
+ child.on("error", (err) => {
263
+ console.error(import_picocolors.default.red(`Failed to start server: ${err.message}`));
264
+ });
265
+ process.on("SIGINT", () => {
266
+ child.kill("SIGINT");
267
+ process.exit(0);
268
+ });
269
+ });
270
+ var migrate = program.command("migrate").description("Run SQL migrations");
271
+ migrate.command("up").option("--dir <path>", "Migrations directory", "migrations").option("--postgres <url>", "Postgres connection string").option("--sqlite <url>", "SQLite connection string").action(async (options) => {
272
+ try {
273
+ await runMigrations("up", options);
274
+ } catch (err) {
275
+ console.error(import_picocolors.default.red(err?.message || "Migration failed."));
276
+ process.exitCode = 1;
277
+ }
278
+ });
279
+ migrate.command("down").option("--dir <path>", "Migrations directory", "migrations").option("--postgres <url>", "Postgres connection string").option("--sqlite <url>", "SQLite connection string").option("--steps <count>", "Number of migrations to roll back", "1").action(async (options) => {
280
+ try {
281
+ await runMigrations("down", options);
282
+ } catch (err) {
283
+ console.error(import_picocolors.default.red(err?.message || "Migration failed."));
284
+ process.exitCode = 1;
285
+ }
286
+ });
287
+ program.parse();
package/dist/cli.mjs ADDED
@@ -0,0 +1,209 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ __require,
4
+ __toESM,
5
+ loadEnv,
6
+ require_core
7
+ } from "./chunk-QW72SEAS.mjs";
8
+
9
+ // src/cli.ts
10
+ var import_core = __toESM(require_core());
11
+ import { Command } from "commander";
12
+ import { spawn } from "child_process";
13
+ import path from "path";
14
+ import pc from "picocolors";
15
+ import fs from "fs";
16
+ loadEnv();
17
+ var resolveDbTarget = (options) => {
18
+ const postgresUrl = options.postgres ?? process.env.POSTGRES_URL;
19
+ const sqliteUrl = options.sqlite ?? process.env.SQLITE_URL;
20
+ if (postgresUrl && sqliteUrl) {
21
+ throw new Error("Provide only one of --postgres or --sqlite.");
22
+ }
23
+ if (sqliteUrl) {
24
+ return { type: "sqlite", url: sqliteUrl };
25
+ }
26
+ if (postgresUrl) {
27
+ return { type: "postgres", url: postgresUrl };
28
+ }
29
+ const envUrl = process.env.DATABASE_URL;
30
+ if (envUrl) {
31
+ const type = envUrl.startsWith("sqlite") ? "sqlite" : "postgres";
32
+ return { type, url: envUrl };
33
+ }
34
+ return null;
35
+ };
36
+ var splitSqlStatements = (sql) => {
37
+ const statements = [];
38
+ let current = "";
39
+ let inSingle = false;
40
+ let inDouble = false;
41
+ for (let i = 0; i < sql.length; i += 1) {
42
+ const ch = sql[i];
43
+ const prev = i > 0 ? sql[i - 1] : "";
44
+ if (ch === "'" && !inDouble && prev !== "\\") {
45
+ inSingle = !inSingle;
46
+ } else if (ch === '"' && !inSingle && prev !== "\\") {
47
+ inDouble = !inDouble;
48
+ }
49
+ if (ch === ";" && !inSingle && !inDouble) {
50
+ const trimmed2 = current.trim();
51
+ if (trimmed2) statements.push(trimmed2);
52
+ current = "";
53
+ continue;
54
+ }
55
+ current += ch;
56
+ }
57
+ const trimmed = current.trim();
58
+ if (trimmed) statements.push(trimmed);
59
+ return statements;
60
+ };
61
+ var readSqlStatements = async (filePath) => {
62
+ const raw = await fs.promises.readFile(filePath, "utf8");
63
+ const cleaned = raw.replace(/^\s*--.*$/gm, "").trim();
64
+ if (!cleaned) return [];
65
+ return splitSqlStatements(cleaned);
66
+ };
67
+ var ensureMigrationsTable = async (engine, dbType) => {
68
+ const sql = dbType === "sqlite" ? "CREATE TABLE IF NOT EXISTS _qhttpx_migrations (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL, applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP)" : "CREATE TABLE IF NOT EXISTS _qhttpx_migrations (id SERIAL PRIMARY KEY, name TEXT UNIQUE NOT NULL, applied_at TIMESTAMP NOT NULL DEFAULT NOW())";
69
+ await engine.queryDb(sql);
70
+ };
71
+ var getAppliedMigrations = async (engine) => {
72
+ const res = await engine.queryDb("SELECT name FROM _qhttpx_migrations ORDER BY id");
73
+ const rows = JSON.parse(res);
74
+ return rows.map((row) => row.name).filter((name) => Boolean(name));
75
+ };
76
+ var getMigrationFiles = async (dir) => {
77
+ const entries = await fs.promises.readdir(dir, { withFileTypes: true });
78
+ const migrations = entries.filter((entry) => entry.isFile() && entry.name.endsWith(".up.sql")).map((entry) => {
79
+ const name = entry.name.replace(/\.up\.sql$/, "");
80
+ const upPath = path.join(dir, entry.name);
81
+ const downPath = path.join(dir, `${name}.down.sql`);
82
+ return { name, upPath, downPath };
83
+ }).sort((a, b) => a.name.localeCompare(b.name));
84
+ return migrations;
85
+ };
86
+ var applyStatements = async (engine, statements) => {
87
+ for (const statement of statements) {
88
+ await engine.queryDb(statement);
89
+ }
90
+ };
91
+ var insertMigration = async (engine, dbType, name) => {
92
+ const placeholder = dbType === "sqlite" ? "?" : "$1";
93
+ await engine.queryDbWithParams(
94
+ `INSERT INTO _qhttpx_migrations (name) VALUES (${placeholder})`,
95
+ [name]
96
+ );
97
+ };
98
+ var removeMigration = async (engine, dbType, name) => {
99
+ const placeholder = dbType === "sqlite" ? "?" : "$1";
100
+ await engine.queryDbWithParams(
101
+ `DELETE FROM _qhttpx_migrations WHERE name = ${placeholder}`,
102
+ [name]
103
+ );
104
+ };
105
+ var runMigrations = async (direction, options) => {
106
+ const dbTarget = resolveDbTarget(options);
107
+ if (!dbTarget) {
108
+ throw new Error("No database configured. Use --postgres, --sqlite, or set DATABASE_URL.");
109
+ }
110
+ const migrationsDir = path.resolve(process.cwd(), options.dir || "migrations");
111
+ if (!fs.existsSync(migrationsDir)) {
112
+ throw new Error(`Migrations directory not found: ${migrationsDir}`);
113
+ }
114
+ const engine = new import_core.NativeEngine(0);
115
+ if (dbTarget.type === "sqlite") {
116
+ await engine.connectSqlite(dbTarget.url);
117
+ } else {
118
+ await engine.connectPostgres(dbTarget.url);
119
+ }
120
+ await ensureMigrationsTable(engine, dbTarget.type);
121
+ const migrations = await getMigrationFiles(migrationsDir);
122
+ if (migrations.length === 0) {
123
+ console.log(pc.yellow("No migrations found."));
124
+ return;
125
+ }
126
+ if (direction === "up") {
127
+ const applied2 = new Set(await getAppliedMigrations(engine));
128
+ const pending = migrations.filter((m) => !applied2.has(m.name));
129
+ if (pending.length === 0) {
130
+ console.log(pc.green("All migrations already applied."));
131
+ return;
132
+ }
133
+ for (const migration of pending) {
134
+ const statements = await readSqlStatements(migration.upPath);
135
+ if (statements.length === 0) continue;
136
+ await applyStatements(engine, statements);
137
+ await insertMigration(engine, dbTarget.type, migration.name);
138
+ console.log(pc.green(`Applied ${migration.name}`));
139
+ }
140
+ return;
141
+ }
142
+ const applied = await getAppliedMigrations(engine);
143
+ const steps = Math.max(1, Number.parseInt(options.steps || "1", 10) || 1);
144
+ const toRollback = applied.slice(-steps).reverse();
145
+ if (toRollback.length === 0) {
146
+ console.log(pc.yellow("No migrations to roll back."));
147
+ return;
148
+ }
149
+ for (const name of toRollback) {
150
+ const migration = migrations.find((m) => m.name === name);
151
+ if (!migration) {
152
+ throw new Error(`Migration file missing for ${name}`);
153
+ }
154
+ if (!fs.existsSync(migration.downPath)) {
155
+ throw new Error(`Down migration not found for ${name}`);
156
+ }
157
+ const statements = await readSqlStatements(migration.downPath);
158
+ if (statements.length === 0) continue;
159
+ await applyStatements(engine, statements);
160
+ await removeMigration(engine, dbTarget.type, name);
161
+ console.log(pc.yellow(`Reverted ${name}`));
162
+ }
163
+ };
164
+ var program = new Command();
165
+ program.name("qhttpx").description("The AI-Native High-Performance Web Engine CLI").version("0.1.1");
166
+ program.command("dev [entry]").description('Start the development server with "Magic" Dev Mode').action((entry = "src/index.ts") => {
167
+ console.clear();
168
+ console.log(pc.bold(pc.cyan(`
169
+ \u2728 QHTTPX Magic Dev Mode
170
+ `)));
171
+ const args = ["watch", entry];
172
+ const fs2 = __require("fs");
173
+ if (!fs2.existsSync(entry)) {
174
+ console.error(pc.red(`\u274C Entry file not found: ${entry}`));
175
+ console.log(pc.gray(`Please provide a valid entry file (default: src/index.ts)`));
176
+ process.exit(1);
177
+ }
178
+ console.log(pc.gray(`Watching ${entry} and dependencies...`));
179
+ const child = spawn("npx", ["tsx", ...args], {
180
+ stdio: "inherit",
181
+ shell: true,
182
+ env: { ...process.env, NODE_ENV: "development", FORCE_COLOR: "1" }
183
+ });
184
+ child.on("error", (err) => {
185
+ console.error(pc.red(`Failed to start server: ${err.message}`));
186
+ });
187
+ process.on("SIGINT", () => {
188
+ child.kill("SIGINT");
189
+ process.exit(0);
190
+ });
191
+ });
192
+ var migrate = program.command("migrate").description("Run SQL migrations");
193
+ migrate.command("up").option("--dir <path>", "Migrations directory", "migrations").option("--postgres <url>", "Postgres connection string").option("--sqlite <url>", "SQLite connection string").action(async (options) => {
194
+ try {
195
+ await runMigrations("up", options);
196
+ } catch (err) {
197
+ console.error(pc.red(err?.message || "Migration failed."));
198
+ process.exitCode = 1;
199
+ }
200
+ });
201
+ migrate.command("down").option("--dir <path>", "Migrations directory", "migrations").option("--postgres <url>", "Postgres connection string").option("--sqlite <url>", "SQLite connection string").option("--steps <count>", "Number of migrations to roll back", "1").action(async (options) => {
202
+ try {
203
+ await runMigrations("down", options);
204
+ } catch (err) {
205
+ console.error(pc.red(err?.message || "Migration failed."));
206
+ process.exitCode = 1;
207
+ }
208
+ });
209
+ program.parse();