aiplang 1.0.0 → 2.0.0

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 (754) hide show
  1. package/bin/aiplang.js +26 -1
  2. package/package.json +8 -2
  3. package/server/node_modules/.package-lock.json +966 -0
  4. package/server/node_modules/accepts/HISTORY.md +250 -0
  5. package/server/node_modules/accepts/LICENSE +23 -0
  6. package/server/node_modules/accepts/README.md +140 -0
  7. package/server/node_modules/accepts/index.js +238 -0
  8. package/server/node_modules/accepts/package.json +47 -0
  9. package/server/node_modules/bcryptjs/LICENSE +27 -0
  10. package/server/node_modules/bcryptjs/README.md +201 -0
  11. package/server/node_modules/bcryptjs/bin/bcrypt +23 -0
  12. package/server/node_modules/bcryptjs/index.d.ts +3 -0
  13. package/server/node_modules/bcryptjs/index.js +1159 -0
  14. package/server/node_modules/bcryptjs/package.json +76 -0
  15. package/server/node_modules/bcryptjs/types.d.ts +157 -0
  16. package/server/node_modules/bcryptjs/umd/index.d.ts +3 -0
  17. package/server/node_modules/bcryptjs/umd/index.js +1220 -0
  18. package/server/node_modules/bcryptjs/umd/package.json +3 -0
  19. package/server/node_modules/bcryptjs/umd/types.d.ts +157 -0
  20. package/server/node_modules/body-parser/LICENSE +23 -0
  21. package/server/node_modules/body-parser/README.md +494 -0
  22. package/server/node_modules/body-parser/index.js +71 -0
  23. package/server/node_modules/body-parser/lib/read.js +247 -0
  24. package/server/node_modules/body-parser/lib/types/json.js +158 -0
  25. package/server/node_modules/body-parser/lib/types/raw.js +42 -0
  26. package/server/node_modules/body-parser/lib/types/text.js +36 -0
  27. package/server/node_modules/body-parser/lib/types/urlencoded.js +142 -0
  28. package/server/node_modules/body-parser/lib/utils.js +98 -0
  29. package/server/node_modules/body-parser/package.json +52 -0
  30. package/server/node_modules/buffer-equal-constant-time/.travis.yml +4 -0
  31. package/server/node_modules/buffer-equal-constant-time/LICENSE.txt +12 -0
  32. package/server/node_modules/buffer-equal-constant-time/README.md +50 -0
  33. package/server/node_modules/buffer-equal-constant-time/index.js +41 -0
  34. package/server/node_modules/buffer-equal-constant-time/package.json +21 -0
  35. package/server/node_modules/buffer-equal-constant-time/test.js +42 -0
  36. package/server/node_modules/bytes/History.md +97 -0
  37. package/server/node_modules/bytes/LICENSE +23 -0
  38. package/server/node_modules/bytes/Readme.md +152 -0
  39. package/server/node_modules/bytes/index.js +170 -0
  40. package/server/node_modules/bytes/package.json +42 -0
  41. package/server/node_modules/call-bind-apply-helpers/.eslintrc +17 -0
  42. package/server/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  43. package/server/node_modules/call-bind-apply-helpers/.nycrc +9 -0
  44. package/server/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  45. package/server/node_modules/call-bind-apply-helpers/LICENSE +21 -0
  46. package/server/node_modules/call-bind-apply-helpers/README.md +62 -0
  47. package/server/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  48. package/server/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
  49. package/server/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  50. package/server/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
  51. package/server/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  52. package/server/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
  53. package/server/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  54. package/server/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
  55. package/server/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
  56. package/server/node_modules/call-bind-apply-helpers/index.js +15 -0
  57. package/server/node_modules/call-bind-apply-helpers/package.json +85 -0
  58. package/server/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  59. package/server/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  60. package/server/node_modules/call-bind-apply-helpers/test/index.js +63 -0
  61. package/server/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  62. package/server/node_modules/call-bound/.eslintrc +13 -0
  63. package/server/node_modules/call-bound/.github/FUNDING.yml +12 -0
  64. package/server/node_modules/call-bound/.nycrc +9 -0
  65. package/server/node_modules/call-bound/CHANGELOG.md +42 -0
  66. package/server/node_modules/call-bound/LICENSE +21 -0
  67. package/server/node_modules/call-bound/README.md +53 -0
  68. package/server/node_modules/call-bound/index.d.ts +94 -0
  69. package/server/node_modules/call-bound/index.js +19 -0
  70. package/server/node_modules/call-bound/package.json +99 -0
  71. package/server/node_modules/call-bound/test/index.js +61 -0
  72. package/server/node_modules/call-bound/tsconfig.json +10 -0
  73. package/server/node_modules/content-disposition/HISTORY.md +72 -0
  74. package/server/node_modules/content-disposition/LICENSE +22 -0
  75. package/server/node_modules/content-disposition/README.md +142 -0
  76. package/server/node_modules/content-disposition/index.js +458 -0
  77. package/server/node_modules/content-disposition/package.json +43 -0
  78. package/server/node_modules/content-type/HISTORY.md +29 -0
  79. package/server/node_modules/content-type/LICENSE +22 -0
  80. package/server/node_modules/content-type/README.md +94 -0
  81. package/server/node_modules/content-type/index.js +225 -0
  82. package/server/node_modules/content-type/package.json +42 -0
  83. package/server/node_modules/cookie/LICENSE +24 -0
  84. package/server/node_modules/cookie/README.md +317 -0
  85. package/server/node_modules/cookie/SECURITY.md +25 -0
  86. package/server/node_modules/cookie/index.js +335 -0
  87. package/server/node_modules/cookie/package.json +44 -0
  88. package/server/node_modules/cookie-signature/History.md +70 -0
  89. package/server/node_modules/cookie-signature/LICENSE +22 -0
  90. package/server/node_modules/cookie-signature/Readme.md +23 -0
  91. package/server/node_modules/cookie-signature/index.js +47 -0
  92. package/server/node_modules/cookie-signature/package.json +24 -0
  93. package/server/node_modules/debug/LICENSE +20 -0
  94. package/server/node_modules/debug/README.md +481 -0
  95. package/server/node_modules/debug/package.json +64 -0
  96. package/server/node_modules/debug/src/browser.js +272 -0
  97. package/server/node_modules/debug/src/common.js +292 -0
  98. package/server/node_modules/debug/src/index.js +10 -0
  99. package/server/node_modules/debug/src/node.js +263 -0
  100. package/server/node_modules/depd/History.md +103 -0
  101. package/server/node_modules/depd/LICENSE +22 -0
  102. package/server/node_modules/depd/Readme.md +280 -0
  103. package/server/node_modules/depd/index.js +538 -0
  104. package/server/node_modules/depd/lib/browser/index.js +77 -0
  105. package/server/node_modules/depd/package.json +45 -0
  106. package/server/node_modules/dunder-proto/.eslintrc +5 -0
  107. package/server/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
  108. package/server/node_modules/dunder-proto/.nycrc +13 -0
  109. package/server/node_modules/dunder-proto/CHANGELOG.md +24 -0
  110. package/server/node_modules/dunder-proto/LICENSE +21 -0
  111. package/server/node_modules/dunder-proto/README.md +54 -0
  112. package/server/node_modules/dunder-proto/get.d.ts +5 -0
  113. package/server/node_modules/dunder-proto/get.js +30 -0
  114. package/server/node_modules/dunder-proto/package.json +76 -0
  115. package/server/node_modules/dunder-proto/set.d.ts +5 -0
  116. package/server/node_modules/dunder-proto/set.js +35 -0
  117. package/server/node_modules/dunder-proto/test/get.js +34 -0
  118. package/server/node_modules/dunder-proto/test/index.js +4 -0
  119. package/server/node_modules/dunder-proto/test/set.js +50 -0
  120. package/server/node_modules/dunder-proto/tsconfig.json +9 -0
  121. package/server/node_modules/ecdsa-sig-formatter/CODEOWNERS +1 -0
  122. package/server/node_modules/ecdsa-sig-formatter/LICENSE +201 -0
  123. package/server/node_modules/ecdsa-sig-formatter/README.md +65 -0
  124. package/server/node_modules/ecdsa-sig-formatter/package.json +46 -0
  125. package/server/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.d.ts +17 -0
  126. package/server/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js +187 -0
  127. package/server/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js +23 -0
  128. package/server/node_modules/ee-first/LICENSE +22 -0
  129. package/server/node_modules/ee-first/README.md +80 -0
  130. package/server/node_modules/ee-first/index.js +95 -0
  131. package/server/node_modules/ee-first/package.json +29 -0
  132. package/server/node_modules/encodeurl/LICENSE +22 -0
  133. package/server/node_modules/encodeurl/README.md +109 -0
  134. package/server/node_modules/encodeurl/index.js +60 -0
  135. package/server/node_modules/encodeurl/package.json +40 -0
  136. package/server/node_modules/es-define-property/.eslintrc +13 -0
  137. package/server/node_modules/es-define-property/.github/FUNDING.yml +12 -0
  138. package/server/node_modules/es-define-property/.nycrc +9 -0
  139. package/server/node_modules/es-define-property/CHANGELOG.md +29 -0
  140. package/server/node_modules/es-define-property/LICENSE +21 -0
  141. package/server/node_modules/es-define-property/README.md +49 -0
  142. package/server/node_modules/es-define-property/index.d.ts +3 -0
  143. package/server/node_modules/es-define-property/index.js +14 -0
  144. package/server/node_modules/es-define-property/package.json +81 -0
  145. package/server/node_modules/es-define-property/test/index.js +56 -0
  146. package/server/node_modules/es-define-property/tsconfig.json +10 -0
  147. package/server/node_modules/es-errors/.eslintrc +5 -0
  148. package/server/node_modules/es-errors/.github/FUNDING.yml +12 -0
  149. package/server/node_modules/es-errors/CHANGELOG.md +40 -0
  150. package/server/node_modules/es-errors/LICENSE +21 -0
  151. package/server/node_modules/es-errors/README.md +55 -0
  152. package/server/node_modules/es-errors/eval.d.ts +3 -0
  153. package/server/node_modules/es-errors/eval.js +4 -0
  154. package/server/node_modules/es-errors/index.d.ts +3 -0
  155. package/server/node_modules/es-errors/index.js +4 -0
  156. package/server/node_modules/es-errors/package.json +80 -0
  157. package/server/node_modules/es-errors/range.d.ts +3 -0
  158. package/server/node_modules/es-errors/range.js +4 -0
  159. package/server/node_modules/es-errors/ref.d.ts +3 -0
  160. package/server/node_modules/es-errors/ref.js +4 -0
  161. package/server/node_modules/es-errors/syntax.d.ts +3 -0
  162. package/server/node_modules/es-errors/syntax.js +4 -0
  163. package/server/node_modules/es-errors/test/index.js +19 -0
  164. package/server/node_modules/es-errors/tsconfig.json +49 -0
  165. package/server/node_modules/es-errors/type.d.ts +3 -0
  166. package/server/node_modules/es-errors/type.js +4 -0
  167. package/server/node_modules/es-errors/uri.d.ts +3 -0
  168. package/server/node_modules/es-errors/uri.js +4 -0
  169. package/server/node_modules/es-object-atoms/.eslintrc +16 -0
  170. package/server/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  171. package/server/node_modules/es-object-atoms/CHANGELOG.md +37 -0
  172. package/server/node_modules/es-object-atoms/LICENSE +21 -0
  173. package/server/node_modules/es-object-atoms/README.md +63 -0
  174. package/server/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  175. package/server/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  176. package/server/node_modules/es-object-atoms/ToObject.d.ts +7 -0
  177. package/server/node_modules/es-object-atoms/ToObject.js +10 -0
  178. package/server/node_modules/es-object-atoms/index.d.ts +3 -0
  179. package/server/node_modules/es-object-atoms/index.js +4 -0
  180. package/server/node_modules/es-object-atoms/isObject.d.ts +3 -0
  181. package/server/node_modules/es-object-atoms/isObject.js +6 -0
  182. package/server/node_modules/es-object-atoms/package.json +80 -0
  183. package/server/node_modules/es-object-atoms/test/index.js +38 -0
  184. package/server/node_modules/es-object-atoms/tsconfig.json +6 -0
  185. package/server/node_modules/escape-html/LICENSE +24 -0
  186. package/server/node_modules/escape-html/Readme.md +43 -0
  187. package/server/node_modules/escape-html/index.js +78 -0
  188. package/server/node_modules/escape-html/package.json +24 -0
  189. package/server/node_modules/etag/HISTORY.md +83 -0
  190. package/server/node_modules/etag/LICENSE +22 -0
  191. package/server/node_modules/etag/README.md +159 -0
  192. package/server/node_modules/etag/index.js +131 -0
  193. package/server/node_modules/etag/package.json +47 -0
  194. package/server/node_modules/express/LICENSE +24 -0
  195. package/server/node_modules/express/Readme.md +276 -0
  196. package/server/node_modules/express/index.js +11 -0
  197. package/server/node_modules/express/lib/application.js +631 -0
  198. package/server/node_modules/express/lib/express.js +81 -0
  199. package/server/node_modules/express/lib/request.js +514 -0
  200. package/server/node_modules/express/lib/response.js +1053 -0
  201. package/server/node_modules/express/lib/utils.js +271 -0
  202. package/server/node_modules/express/lib/view.js +205 -0
  203. package/server/node_modules/express/package.json +99 -0
  204. package/server/node_modules/finalhandler/HISTORY.md +239 -0
  205. package/server/node_modules/finalhandler/LICENSE +22 -0
  206. package/server/node_modules/finalhandler/README.md +150 -0
  207. package/server/node_modules/finalhandler/index.js +293 -0
  208. package/server/node_modules/finalhandler/package.json +47 -0
  209. package/server/node_modules/forwarded/HISTORY.md +21 -0
  210. package/server/node_modules/forwarded/LICENSE +22 -0
  211. package/server/node_modules/forwarded/README.md +57 -0
  212. package/server/node_modules/forwarded/index.js +90 -0
  213. package/server/node_modules/forwarded/package.json +45 -0
  214. package/server/node_modules/fresh/HISTORY.md +80 -0
  215. package/server/node_modules/fresh/LICENSE +23 -0
  216. package/server/node_modules/fresh/README.md +117 -0
  217. package/server/node_modules/fresh/index.js +136 -0
  218. package/server/node_modules/fresh/package.json +46 -0
  219. package/server/node_modules/function-bind/.eslintrc +21 -0
  220. package/server/node_modules/function-bind/.github/FUNDING.yml +12 -0
  221. package/server/node_modules/function-bind/.github/SECURITY.md +3 -0
  222. package/server/node_modules/function-bind/.nycrc +13 -0
  223. package/server/node_modules/function-bind/CHANGELOG.md +136 -0
  224. package/server/node_modules/function-bind/LICENSE +20 -0
  225. package/server/node_modules/function-bind/README.md +46 -0
  226. package/server/node_modules/function-bind/implementation.js +84 -0
  227. package/server/node_modules/function-bind/index.js +5 -0
  228. package/server/node_modules/function-bind/package.json +87 -0
  229. package/server/node_modules/function-bind/test/.eslintrc +9 -0
  230. package/server/node_modules/function-bind/test/index.js +252 -0
  231. package/server/node_modules/get-intrinsic/.eslintrc +42 -0
  232. package/server/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  233. package/server/node_modules/get-intrinsic/.nycrc +9 -0
  234. package/server/node_modules/get-intrinsic/CHANGELOG.md +186 -0
  235. package/server/node_modules/get-intrinsic/LICENSE +21 -0
  236. package/server/node_modules/get-intrinsic/README.md +71 -0
  237. package/server/node_modules/get-intrinsic/index.js +378 -0
  238. package/server/node_modules/get-intrinsic/package.json +97 -0
  239. package/server/node_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  240. package/server/node_modules/get-proto/.eslintrc +10 -0
  241. package/server/node_modules/get-proto/.github/FUNDING.yml +12 -0
  242. package/server/node_modules/get-proto/.nycrc +9 -0
  243. package/server/node_modules/get-proto/CHANGELOG.md +21 -0
  244. package/server/node_modules/get-proto/LICENSE +21 -0
  245. package/server/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  246. package/server/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
  247. package/server/node_modules/get-proto/README.md +50 -0
  248. package/server/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  249. package/server/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  250. package/server/node_modules/get-proto/index.d.ts +5 -0
  251. package/server/node_modules/get-proto/index.js +27 -0
  252. package/server/node_modules/get-proto/package.json +81 -0
  253. package/server/node_modules/get-proto/test/index.js +68 -0
  254. package/server/node_modules/get-proto/tsconfig.json +9 -0
  255. package/server/node_modules/gopd/.eslintrc +16 -0
  256. package/server/node_modules/gopd/.github/FUNDING.yml +12 -0
  257. package/server/node_modules/gopd/CHANGELOG.md +45 -0
  258. package/server/node_modules/gopd/LICENSE +21 -0
  259. package/server/node_modules/gopd/README.md +40 -0
  260. package/server/node_modules/gopd/gOPD.d.ts +1 -0
  261. package/server/node_modules/gopd/gOPD.js +4 -0
  262. package/server/node_modules/gopd/index.d.ts +5 -0
  263. package/server/node_modules/gopd/index.js +15 -0
  264. package/server/node_modules/gopd/package.json +77 -0
  265. package/server/node_modules/gopd/test/index.js +36 -0
  266. package/server/node_modules/gopd/tsconfig.json +9 -0
  267. package/server/node_modules/has-symbols/.eslintrc +11 -0
  268. package/server/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  269. package/server/node_modules/has-symbols/.nycrc +9 -0
  270. package/server/node_modules/has-symbols/CHANGELOG.md +91 -0
  271. package/server/node_modules/has-symbols/LICENSE +21 -0
  272. package/server/node_modules/has-symbols/README.md +46 -0
  273. package/server/node_modules/has-symbols/index.d.ts +3 -0
  274. package/server/node_modules/has-symbols/index.js +14 -0
  275. package/server/node_modules/has-symbols/package.json +111 -0
  276. package/server/node_modules/has-symbols/shams.d.ts +3 -0
  277. package/server/node_modules/has-symbols/shams.js +45 -0
  278. package/server/node_modules/has-symbols/test/index.js +22 -0
  279. package/server/node_modules/has-symbols/test/shams/core-js.js +29 -0
  280. package/server/node_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  281. package/server/node_modules/has-symbols/test/tests.js +58 -0
  282. package/server/node_modules/has-symbols/tsconfig.json +10 -0
  283. package/server/node_modules/hasown/.eslintrc +5 -0
  284. package/server/node_modules/hasown/.github/FUNDING.yml +12 -0
  285. package/server/node_modules/hasown/.nycrc +13 -0
  286. package/server/node_modules/hasown/CHANGELOG.md +40 -0
  287. package/server/node_modules/hasown/LICENSE +21 -0
  288. package/server/node_modules/hasown/README.md +40 -0
  289. package/server/node_modules/hasown/index.d.ts +3 -0
  290. package/server/node_modules/hasown/index.js +8 -0
  291. package/server/node_modules/hasown/package.json +92 -0
  292. package/server/node_modules/hasown/tsconfig.json +6 -0
  293. package/server/node_modules/http-errors/HISTORY.md +186 -0
  294. package/server/node_modules/http-errors/LICENSE +23 -0
  295. package/server/node_modules/http-errors/README.md +169 -0
  296. package/server/node_modules/http-errors/index.js +290 -0
  297. package/server/node_modules/http-errors/package.json +54 -0
  298. package/server/node_modules/iconv-lite/LICENSE +21 -0
  299. package/server/node_modules/iconv-lite/README.md +138 -0
  300. package/server/node_modules/iconv-lite/encodings/dbcs-codec.js +532 -0
  301. package/server/node_modules/iconv-lite/encodings/dbcs-data.js +185 -0
  302. package/server/node_modules/iconv-lite/encodings/index.js +23 -0
  303. package/server/node_modules/iconv-lite/encodings/internal.js +218 -0
  304. package/server/node_modules/iconv-lite/encodings/sbcs-codec.js +75 -0
  305. package/server/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  306. package/server/node_modules/iconv-lite/encodings/sbcs-data.js +178 -0
  307. package/server/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  308. package/server/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  309. package/server/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  310. package/server/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  311. package/server/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  312. package/server/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  313. package/server/node_modules/iconv-lite/encodings/tables/gbk-added.json +56 -0
  314. package/server/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  315. package/server/node_modules/iconv-lite/encodings/utf16.js +187 -0
  316. package/server/node_modules/iconv-lite/encodings/utf32.js +307 -0
  317. package/server/node_modules/iconv-lite/encodings/utf7.js +283 -0
  318. package/server/node_modules/iconv-lite/lib/bom-handling.js +48 -0
  319. package/server/node_modules/iconv-lite/lib/helpers/merge-exports.js +13 -0
  320. package/server/node_modules/iconv-lite/lib/index.d.ts +129 -0
  321. package/server/node_modules/iconv-lite/lib/index.js +182 -0
  322. package/server/node_modules/iconv-lite/lib/streams.js +105 -0
  323. package/server/node_modules/iconv-lite/package.json +70 -0
  324. package/server/node_modules/iconv-lite/types/encodings.d.ts +423 -0
  325. package/server/node_modules/inherits/LICENSE +16 -0
  326. package/server/node_modules/inherits/README.md +42 -0
  327. package/server/node_modules/inherits/inherits.js +9 -0
  328. package/server/node_modules/inherits/inherits_browser.js +27 -0
  329. package/server/node_modules/inherits/package.json +29 -0
  330. package/server/node_modules/ipaddr.js/LICENSE +19 -0
  331. package/server/node_modules/ipaddr.js/README.md +233 -0
  332. package/server/node_modules/ipaddr.js/ipaddr.min.js +1 -0
  333. package/server/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
  334. package/server/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
  335. package/server/node_modules/ipaddr.js/package.json +35 -0
  336. package/server/node_modules/is-promise/LICENSE +19 -0
  337. package/server/node_modules/is-promise/index.d.ts +2 -0
  338. package/server/node_modules/is-promise/index.js +6 -0
  339. package/server/node_modules/is-promise/index.mjs +3 -0
  340. package/server/node_modules/is-promise/package.json +30 -0
  341. package/server/node_modules/is-promise/readme.md +33 -0
  342. package/server/node_modules/jsonwebtoken/LICENSE +21 -0
  343. package/server/node_modules/jsonwebtoken/README.md +396 -0
  344. package/server/node_modules/jsonwebtoken/decode.js +30 -0
  345. package/server/node_modules/jsonwebtoken/index.js +8 -0
  346. package/server/node_modules/jsonwebtoken/lib/JsonWebTokenError.js +14 -0
  347. package/server/node_modules/jsonwebtoken/lib/NotBeforeError.js +13 -0
  348. package/server/node_modules/jsonwebtoken/lib/TokenExpiredError.js +13 -0
  349. package/server/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js +3 -0
  350. package/server/node_modules/jsonwebtoken/lib/psSupported.js +3 -0
  351. package/server/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js +3 -0
  352. package/server/node_modules/jsonwebtoken/lib/timespan.js +18 -0
  353. package/server/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js +66 -0
  354. package/server/node_modules/jsonwebtoken/package.json +70 -0
  355. package/server/node_modules/jsonwebtoken/sign.js +253 -0
  356. package/server/node_modules/jsonwebtoken/verify.js +263 -0
  357. package/server/node_modules/jwa/LICENSE +17 -0
  358. package/server/node_modules/jwa/README.md +150 -0
  359. package/server/node_modules/jwa/index.js +266 -0
  360. package/server/node_modules/jwa/opslevel.yml +6 -0
  361. package/server/node_modules/jwa/package.json +37 -0
  362. package/server/node_modules/jws/CHANGELOG.md +56 -0
  363. package/server/node_modules/jws/LICENSE +17 -0
  364. package/server/node_modules/jws/index.js +22 -0
  365. package/server/node_modules/jws/lib/data-stream.js +55 -0
  366. package/server/node_modules/jws/lib/sign-stream.js +83 -0
  367. package/server/node_modules/jws/lib/tostring.js +10 -0
  368. package/server/node_modules/jws/lib/verify-stream.js +125 -0
  369. package/server/node_modules/jws/opslevel.yml +6 -0
  370. package/server/node_modules/jws/package.json +34 -0
  371. package/server/node_modules/jws/readme.md +255 -0
  372. package/server/node_modules/lodash.includes/LICENSE +47 -0
  373. package/server/node_modules/lodash.includes/README.md +18 -0
  374. package/server/node_modules/lodash.includes/index.js +745 -0
  375. package/server/node_modules/lodash.includes/package.json +17 -0
  376. package/server/node_modules/lodash.isboolean/LICENSE +22 -0
  377. package/server/node_modules/lodash.isboolean/README.md +18 -0
  378. package/server/node_modules/lodash.isboolean/index.js +70 -0
  379. package/server/node_modules/lodash.isboolean/package.json +17 -0
  380. package/server/node_modules/lodash.isinteger/LICENSE +47 -0
  381. package/server/node_modules/lodash.isinteger/README.md +18 -0
  382. package/server/node_modules/lodash.isinteger/index.js +265 -0
  383. package/server/node_modules/lodash.isinteger/package.json +17 -0
  384. package/server/node_modules/lodash.isnumber/LICENSE +22 -0
  385. package/server/node_modules/lodash.isnumber/README.md +18 -0
  386. package/server/node_modules/lodash.isnumber/index.js +79 -0
  387. package/server/node_modules/lodash.isnumber/package.json +17 -0
  388. package/server/node_modules/lodash.isplainobject/LICENSE +47 -0
  389. package/server/node_modules/lodash.isplainobject/README.md +18 -0
  390. package/server/node_modules/lodash.isplainobject/index.js +139 -0
  391. package/server/node_modules/lodash.isplainobject/package.json +17 -0
  392. package/server/node_modules/lodash.isstring/LICENSE +22 -0
  393. package/server/node_modules/lodash.isstring/README.md +18 -0
  394. package/server/node_modules/lodash.isstring/index.js +95 -0
  395. package/server/node_modules/lodash.isstring/package.json +17 -0
  396. package/server/node_modules/lodash.once/LICENSE +47 -0
  397. package/server/node_modules/lodash.once/README.md +18 -0
  398. package/server/node_modules/lodash.once/index.js +294 -0
  399. package/server/node_modules/lodash.once/package.json +17 -0
  400. package/server/node_modules/math-intrinsics/.eslintrc +16 -0
  401. package/server/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  402. package/server/node_modules/math-intrinsics/CHANGELOG.md +24 -0
  403. package/server/node_modules/math-intrinsics/LICENSE +21 -0
  404. package/server/node_modules/math-intrinsics/README.md +50 -0
  405. package/server/node_modules/math-intrinsics/abs.d.ts +1 -0
  406. package/server/node_modules/math-intrinsics/abs.js +4 -0
  407. package/server/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  408. package/server/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  409. package/server/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  410. package/server/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  411. package/server/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  412. package/server/node_modules/math-intrinsics/constants/maxValue.js +5 -0
  413. package/server/node_modules/math-intrinsics/floor.d.ts +1 -0
  414. package/server/node_modules/math-intrinsics/floor.js +4 -0
  415. package/server/node_modules/math-intrinsics/isFinite.d.ts +3 -0
  416. package/server/node_modules/math-intrinsics/isFinite.js +12 -0
  417. package/server/node_modules/math-intrinsics/isInteger.d.ts +3 -0
  418. package/server/node_modules/math-intrinsics/isInteger.js +16 -0
  419. package/server/node_modules/math-intrinsics/isNaN.d.ts +1 -0
  420. package/server/node_modules/math-intrinsics/isNaN.js +6 -0
  421. package/server/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  422. package/server/node_modules/math-intrinsics/isNegativeZero.js +6 -0
  423. package/server/node_modules/math-intrinsics/max.d.ts +1 -0
  424. package/server/node_modules/math-intrinsics/max.js +4 -0
  425. package/server/node_modules/math-intrinsics/min.d.ts +1 -0
  426. package/server/node_modules/math-intrinsics/min.js +4 -0
  427. package/server/node_modules/math-intrinsics/mod.d.ts +3 -0
  428. package/server/node_modules/math-intrinsics/mod.js +9 -0
  429. package/server/node_modules/math-intrinsics/package.json +86 -0
  430. package/server/node_modules/math-intrinsics/pow.d.ts +1 -0
  431. package/server/node_modules/math-intrinsics/pow.js +4 -0
  432. package/server/node_modules/math-intrinsics/round.d.ts +1 -0
  433. package/server/node_modules/math-intrinsics/round.js +4 -0
  434. package/server/node_modules/math-intrinsics/sign.d.ts +3 -0
  435. package/server/node_modules/math-intrinsics/sign.js +11 -0
  436. package/server/node_modules/math-intrinsics/test/index.js +192 -0
  437. package/server/node_modules/math-intrinsics/tsconfig.json +3 -0
  438. package/server/node_modules/media-typer/HISTORY.md +50 -0
  439. package/server/node_modules/media-typer/LICENSE +22 -0
  440. package/server/node_modules/media-typer/README.md +93 -0
  441. package/server/node_modules/media-typer/index.js +143 -0
  442. package/server/node_modules/media-typer/package.json +33 -0
  443. package/server/node_modules/merge-descriptors/index.d.ts +11 -0
  444. package/server/node_modules/merge-descriptors/index.js +26 -0
  445. package/server/node_modules/merge-descriptors/license +11 -0
  446. package/server/node_modules/merge-descriptors/package.json +50 -0
  447. package/server/node_modules/merge-descriptors/readme.md +55 -0
  448. package/server/node_modules/mime-db/HISTORY.md +541 -0
  449. package/server/node_modules/mime-db/LICENSE +23 -0
  450. package/server/node_modules/mime-db/README.md +109 -0
  451. package/server/node_modules/mime-db/db.json +9342 -0
  452. package/server/node_modules/mime-db/index.js +12 -0
  453. package/server/node_modules/mime-db/package.json +56 -0
  454. package/server/node_modules/mime-types/HISTORY.md +428 -0
  455. package/server/node_modules/mime-types/LICENSE +23 -0
  456. package/server/node_modules/mime-types/README.md +126 -0
  457. package/server/node_modules/mime-types/index.js +211 -0
  458. package/server/node_modules/mime-types/mimeScore.js +57 -0
  459. package/server/node_modules/mime-types/package.json +49 -0
  460. package/server/node_modules/ms/index.js +162 -0
  461. package/server/node_modules/ms/license.md +21 -0
  462. package/server/node_modules/ms/package.json +38 -0
  463. package/server/node_modules/ms/readme.md +59 -0
  464. package/server/node_modules/negotiator/HISTORY.md +114 -0
  465. package/server/node_modules/negotiator/LICENSE +24 -0
  466. package/server/node_modules/negotiator/README.md +212 -0
  467. package/server/node_modules/negotiator/index.js +83 -0
  468. package/server/node_modules/negotiator/lib/charset.js +169 -0
  469. package/server/node_modules/negotiator/lib/encoding.js +205 -0
  470. package/server/node_modules/negotiator/lib/language.js +179 -0
  471. package/server/node_modules/negotiator/lib/mediaType.js +294 -0
  472. package/server/node_modules/negotiator/package.json +43 -0
  473. package/server/node_modules/object-inspect/.eslintrc +53 -0
  474. package/server/node_modules/object-inspect/.github/FUNDING.yml +12 -0
  475. package/server/node_modules/object-inspect/.nycrc +13 -0
  476. package/server/node_modules/object-inspect/CHANGELOG.md +424 -0
  477. package/server/node_modules/object-inspect/LICENSE +21 -0
  478. package/server/node_modules/object-inspect/example/all.js +23 -0
  479. package/server/node_modules/object-inspect/example/circular.js +6 -0
  480. package/server/node_modules/object-inspect/example/fn.js +5 -0
  481. package/server/node_modules/object-inspect/example/inspect.js +10 -0
  482. package/server/node_modules/object-inspect/index.js +544 -0
  483. package/server/node_modules/object-inspect/package-support.json +20 -0
  484. package/server/node_modules/object-inspect/package.json +105 -0
  485. package/server/node_modules/object-inspect/readme.markdown +84 -0
  486. package/server/node_modules/object-inspect/test/bigint.js +58 -0
  487. package/server/node_modules/object-inspect/test/browser/dom.js +15 -0
  488. package/server/node_modules/object-inspect/test/circular.js +16 -0
  489. package/server/node_modules/object-inspect/test/deep.js +12 -0
  490. package/server/node_modules/object-inspect/test/element.js +53 -0
  491. package/server/node_modules/object-inspect/test/err.js +48 -0
  492. package/server/node_modules/object-inspect/test/fakes.js +29 -0
  493. package/server/node_modules/object-inspect/test/fn.js +76 -0
  494. package/server/node_modules/object-inspect/test/global.js +17 -0
  495. package/server/node_modules/object-inspect/test/has.js +15 -0
  496. package/server/node_modules/object-inspect/test/holes.js +15 -0
  497. package/server/node_modules/object-inspect/test/indent-option.js +271 -0
  498. package/server/node_modules/object-inspect/test/inspect.js +139 -0
  499. package/server/node_modules/object-inspect/test/lowbyte.js +12 -0
  500. package/server/node_modules/object-inspect/test/number.js +58 -0
  501. package/server/node_modules/object-inspect/test/quoteStyle.js +26 -0
  502. package/server/node_modules/object-inspect/test/toStringTag.js +40 -0
  503. package/server/node_modules/object-inspect/test/undef.js +12 -0
  504. package/server/node_modules/object-inspect/test/values.js +261 -0
  505. package/server/node_modules/object-inspect/test-core-js.js +26 -0
  506. package/server/node_modules/object-inspect/util.inspect.js +1 -0
  507. package/server/node_modules/on-finished/HISTORY.md +98 -0
  508. package/server/node_modules/on-finished/LICENSE +23 -0
  509. package/server/node_modules/on-finished/README.md +162 -0
  510. package/server/node_modules/on-finished/index.js +234 -0
  511. package/server/node_modules/on-finished/package.json +39 -0
  512. package/server/node_modules/once/LICENSE +15 -0
  513. package/server/node_modules/once/README.md +79 -0
  514. package/server/node_modules/once/once.js +42 -0
  515. package/server/node_modules/once/package.json +33 -0
  516. package/server/node_modules/parseurl/HISTORY.md +58 -0
  517. package/server/node_modules/parseurl/LICENSE +24 -0
  518. package/server/node_modules/parseurl/README.md +133 -0
  519. package/server/node_modules/parseurl/index.js +158 -0
  520. package/server/node_modules/parseurl/package.json +40 -0
  521. package/server/node_modules/path-to-regexp/LICENSE +21 -0
  522. package/server/node_modules/path-to-regexp/Readme.md +224 -0
  523. package/server/node_modules/path-to-regexp/dist/index.d.ts +144 -0
  524. package/server/node_modules/path-to-regexp/dist/index.js +409 -0
  525. package/server/node_modules/path-to-regexp/dist/index.js.map +1 -0
  526. package/server/node_modules/path-to-regexp/package.json +64 -0
  527. package/server/node_modules/proxy-addr/HISTORY.md +161 -0
  528. package/server/node_modules/proxy-addr/LICENSE +22 -0
  529. package/server/node_modules/proxy-addr/README.md +139 -0
  530. package/server/node_modules/proxy-addr/index.js +327 -0
  531. package/server/node_modules/proxy-addr/package.json +47 -0
  532. package/server/node_modules/qs/.editorconfig +46 -0
  533. package/server/node_modules/qs/.github/FUNDING.yml +12 -0
  534. package/server/node_modules/qs/.github/SECURITY.md +11 -0
  535. package/server/node_modules/qs/.github/THREAT_MODEL.md +78 -0
  536. package/server/node_modules/qs/.nycrc +13 -0
  537. package/server/node_modules/qs/CHANGELOG.md +806 -0
  538. package/server/node_modules/qs/LICENSE.md +29 -0
  539. package/server/node_modules/qs/README.md +758 -0
  540. package/server/node_modules/qs/dist/qs.js +141 -0
  541. package/server/node_modules/qs/eslint.config.mjs +56 -0
  542. package/server/node_modules/qs/lib/formats.js +23 -0
  543. package/server/node_modules/qs/lib/index.js +11 -0
  544. package/server/node_modules/qs/lib/parse.js +373 -0
  545. package/server/node_modules/qs/lib/stringify.js +356 -0
  546. package/server/node_modules/qs/lib/utils.js +342 -0
  547. package/server/node_modules/qs/package.json +94 -0
  548. package/server/node_modules/qs/test/empty-keys-cases.js +267 -0
  549. package/server/node_modules/qs/test/parse.js +1568 -0
  550. package/server/node_modules/qs/test/stringify.js +1310 -0
  551. package/server/node_modules/qs/test/utils.js +404 -0
  552. package/server/node_modules/range-parser/HISTORY.md +56 -0
  553. package/server/node_modules/range-parser/LICENSE +23 -0
  554. package/server/node_modules/range-parser/README.md +84 -0
  555. package/server/node_modules/range-parser/index.js +162 -0
  556. package/server/node_modules/range-parser/package.json +44 -0
  557. package/server/node_modules/raw-body/LICENSE +22 -0
  558. package/server/node_modules/raw-body/README.md +223 -0
  559. package/server/node_modules/raw-body/index.d.ts +85 -0
  560. package/server/node_modules/raw-body/index.js +336 -0
  561. package/server/node_modules/raw-body/package.json +46 -0
  562. package/server/node_modules/router/HISTORY.md +228 -0
  563. package/server/node_modules/router/LICENSE +23 -0
  564. package/server/node_modules/router/README.md +416 -0
  565. package/server/node_modules/router/index.js +748 -0
  566. package/server/node_modules/router/lib/layer.js +247 -0
  567. package/server/node_modules/router/lib/route.js +242 -0
  568. package/server/node_modules/router/package.json +44 -0
  569. package/server/node_modules/safe-buffer/LICENSE +21 -0
  570. package/server/node_modules/safe-buffer/README.md +584 -0
  571. package/server/node_modules/safe-buffer/index.d.ts +187 -0
  572. package/server/node_modules/safe-buffer/index.js +65 -0
  573. package/server/node_modules/safe-buffer/package.json +51 -0
  574. package/server/node_modules/safer-buffer/LICENSE +21 -0
  575. package/server/node_modules/safer-buffer/Porting-Buffer.md +268 -0
  576. package/server/node_modules/safer-buffer/Readme.md +156 -0
  577. package/server/node_modules/safer-buffer/dangerous.js +58 -0
  578. package/server/node_modules/safer-buffer/package.json +34 -0
  579. package/server/node_modules/safer-buffer/safer.js +77 -0
  580. package/server/node_modules/safer-buffer/tests.js +406 -0
  581. package/server/node_modules/semver/LICENSE +15 -0
  582. package/server/node_modules/semver/README.md +665 -0
  583. package/server/node_modules/semver/bin/semver.js +191 -0
  584. package/server/node_modules/semver/classes/comparator.js +143 -0
  585. package/server/node_modules/semver/classes/index.js +7 -0
  586. package/server/node_modules/semver/classes/range.js +557 -0
  587. package/server/node_modules/semver/classes/semver.js +333 -0
  588. package/server/node_modules/semver/functions/clean.js +8 -0
  589. package/server/node_modules/semver/functions/cmp.js +54 -0
  590. package/server/node_modules/semver/functions/coerce.js +62 -0
  591. package/server/node_modules/semver/functions/compare-build.js +9 -0
  592. package/server/node_modules/semver/functions/compare-loose.js +5 -0
  593. package/server/node_modules/semver/functions/compare.js +7 -0
  594. package/server/node_modules/semver/functions/diff.js +60 -0
  595. package/server/node_modules/semver/functions/eq.js +5 -0
  596. package/server/node_modules/semver/functions/gt.js +5 -0
  597. package/server/node_modules/semver/functions/gte.js +5 -0
  598. package/server/node_modules/semver/functions/inc.js +21 -0
  599. package/server/node_modules/semver/functions/lt.js +5 -0
  600. package/server/node_modules/semver/functions/lte.js +5 -0
  601. package/server/node_modules/semver/functions/major.js +5 -0
  602. package/server/node_modules/semver/functions/minor.js +5 -0
  603. package/server/node_modules/semver/functions/neq.js +5 -0
  604. package/server/node_modules/semver/functions/parse.js +18 -0
  605. package/server/node_modules/semver/functions/patch.js +5 -0
  606. package/server/node_modules/semver/functions/prerelease.js +8 -0
  607. package/server/node_modules/semver/functions/rcompare.js +5 -0
  608. package/server/node_modules/semver/functions/rsort.js +5 -0
  609. package/server/node_modules/semver/functions/satisfies.js +12 -0
  610. package/server/node_modules/semver/functions/sort.js +5 -0
  611. package/server/node_modules/semver/functions/valid.js +8 -0
  612. package/server/node_modules/semver/index.js +91 -0
  613. package/server/node_modules/semver/internal/constants.js +37 -0
  614. package/server/node_modules/semver/internal/debug.js +11 -0
  615. package/server/node_modules/semver/internal/identifiers.js +29 -0
  616. package/server/node_modules/semver/internal/lrucache.js +42 -0
  617. package/server/node_modules/semver/internal/parse-options.js +17 -0
  618. package/server/node_modules/semver/internal/re.js +223 -0
  619. package/server/node_modules/semver/package.json +78 -0
  620. package/server/node_modules/semver/preload.js +4 -0
  621. package/server/node_modules/semver/range.bnf +16 -0
  622. package/server/node_modules/semver/ranges/gtr.js +6 -0
  623. package/server/node_modules/semver/ranges/intersects.js +9 -0
  624. package/server/node_modules/semver/ranges/ltr.js +6 -0
  625. package/server/node_modules/semver/ranges/max-satisfying.js +27 -0
  626. package/server/node_modules/semver/ranges/min-satisfying.js +26 -0
  627. package/server/node_modules/semver/ranges/min-version.js +63 -0
  628. package/server/node_modules/semver/ranges/outside.js +82 -0
  629. package/server/node_modules/semver/ranges/simplify.js +49 -0
  630. package/server/node_modules/semver/ranges/subset.js +249 -0
  631. package/server/node_modules/semver/ranges/to-comparators.js +10 -0
  632. package/server/node_modules/semver/ranges/valid.js +13 -0
  633. package/server/node_modules/send/LICENSE +23 -0
  634. package/server/node_modules/send/README.md +317 -0
  635. package/server/node_modules/send/index.js +997 -0
  636. package/server/node_modules/send/package.json +63 -0
  637. package/server/node_modules/serve-static/LICENSE +25 -0
  638. package/server/node_modules/serve-static/README.md +253 -0
  639. package/server/node_modules/serve-static/index.js +208 -0
  640. package/server/node_modules/serve-static/package.json +44 -0
  641. package/server/node_modules/setprototypeof/LICENSE +13 -0
  642. package/server/node_modules/setprototypeof/README.md +31 -0
  643. package/server/node_modules/setprototypeof/index.d.ts +2 -0
  644. package/server/node_modules/setprototypeof/index.js +17 -0
  645. package/server/node_modules/setprototypeof/package.json +38 -0
  646. package/server/node_modules/setprototypeof/test/index.js +24 -0
  647. package/server/node_modules/side-channel/.editorconfig +9 -0
  648. package/server/node_modules/side-channel/.eslintrc +12 -0
  649. package/server/node_modules/side-channel/.github/FUNDING.yml +12 -0
  650. package/server/node_modules/side-channel/.nycrc +13 -0
  651. package/server/node_modules/side-channel/CHANGELOG.md +110 -0
  652. package/server/node_modules/side-channel/LICENSE +21 -0
  653. package/server/node_modules/side-channel/README.md +61 -0
  654. package/server/node_modules/side-channel/index.d.ts +14 -0
  655. package/server/node_modules/side-channel/index.js +43 -0
  656. package/server/node_modules/side-channel/package.json +85 -0
  657. package/server/node_modules/side-channel/test/index.js +104 -0
  658. package/server/node_modules/side-channel/tsconfig.json +9 -0
  659. package/server/node_modules/side-channel-list/.editorconfig +9 -0
  660. package/server/node_modules/side-channel-list/.eslintrc +11 -0
  661. package/server/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
  662. package/server/node_modules/side-channel-list/.nycrc +13 -0
  663. package/server/node_modules/side-channel-list/CHANGELOG.md +15 -0
  664. package/server/node_modules/side-channel-list/LICENSE +21 -0
  665. package/server/node_modules/side-channel-list/README.md +62 -0
  666. package/server/node_modules/side-channel-list/index.d.ts +13 -0
  667. package/server/node_modules/side-channel-list/index.js +113 -0
  668. package/server/node_modules/side-channel-list/list.d.ts +14 -0
  669. package/server/node_modules/side-channel-list/package.json +77 -0
  670. package/server/node_modules/side-channel-list/test/index.js +104 -0
  671. package/server/node_modules/side-channel-list/tsconfig.json +9 -0
  672. package/server/node_modules/side-channel-map/.editorconfig +9 -0
  673. package/server/node_modules/side-channel-map/.eslintrc +11 -0
  674. package/server/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
  675. package/server/node_modules/side-channel-map/.nycrc +13 -0
  676. package/server/node_modules/side-channel-map/CHANGELOG.md +22 -0
  677. package/server/node_modules/side-channel-map/LICENSE +21 -0
  678. package/server/node_modules/side-channel-map/README.md +62 -0
  679. package/server/node_modules/side-channel-map/index.d.ts +15 -0
  680. package/server/node_modules/side-channel-map/index.js +68 -0
  681. package/server/node_modules/side-channel-map/package.json +80 -0
  682. package/server/node_modules/side-channel-map/test/index.js +114 -0
  683. package/server/node_modules/side-channel-map/tsconfig.json +9 -0
  684. package/server/node_modules/side-channel-weakmap/.editorconfig +9 -0
  685. package/server/node_modules/side-channel-weakmap/.eslintrc +12 -0
  686. package/server/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
  687. package/server/node_modules/side-channel-weakmap/.nycrc +13 -0
  688. package/server/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
  689. package/server/node_modules/side-channel-weakmap/LICENSE +21 -0
  690. package/server/node_modules/side-channel-weakmap/README.md +62 -0
  691. package/server/node_modules/side-channel-weakmap/index.d.ts +15 -0
  692. package/server/node_modules/side-channel-weakmap/index.js +84 -0
  693. package/server/node_modules/side-channel-weakmap/package.json +87 -0
  694. package/server/node_modules/side-channel-weakmap/test/index.js +114 -0
  695. package/server/node_modules/side-channel-weakmap/tsconfig.json +9 -0
  696. package/server/node_modules/sql.js/.devcontainer/Dockerfile +76 -0
  697. package/server/node_modules/sql.js/.devcontainer/devcontainer.json +20 -0
  698. package/server/node_modules/sql.js/.eslintrc.js +68 -0
  699. package/server/node_modules/sql.js/.jsdoc.config.json +38 -0
  700. package/server/node_modules/sql.js/.nojekyll +0 -0
  701. package/server/node_modules/sql.js/AUTHORS +8 -0
  702. package/server/node_modules/sql.js/CONTRIBUTING.md +66 -0
  703. package/server/node_modules/sql.js/LICENSE +44 -0
  704. package/server/node_modules/sql.js/README.md +357 -0
  705. package/server/node_modules/sql.js/dist/sql-asm-debug.js +140890 -0
  706. package/server/node_modules/sql.js/dist/sql-asm-memory-growth.js +204 -0
  707. package/server/node_modules/sql.js/dist/sql-asm.js +202 -0
  708. package/server/node_modules/sql.js/dist/sql-wasm-browser-debug.js +7157 -0
  709. package/server/node_modules/sql.js/dist/sql-wasm-browser-debug.wasm +0 -0
  710. package/server/node_modules/sql.js/dist/sql-wasm-browser.js +183 -0
  711. package/server/node_modules/sql.js/dist/sql-wasm-browser.wasm +0 -0
  712. package/server/node_modules/sql.js/dist/sql-wasm-debug.js +7265 -0
  713. package/server/node_modules/sql.js/dist/sql-wasm-debug.wasm +0 -0
  714. package/server/node_modules/sql.js/dist/sql-wasm.js +185 -0
  715. package/server/node_modules/sql.js/dist/sql-wasm.wasm +0 -0
  716. package/server/node_modules/sql.js/dist/worker.sql-asm-debug.js +141011 -0
  717. package/server/node_modules/sql.js/dist/worker.sql-asm.js +323 -0
  718. package/server/node_modules/sql.js/dist/worker.sql-wasm-debug.js +7386 -0
  719. package/server/node_modules/sql.js/dist/worker.sql-wasm.js +306 -0
  720. package/server/node_modules/sql.js/documentation_index.md +26 -0
  721. package/server/node_modules/sql.js/eslint.config.cjs +57 -0
  722. package/server/node_modules/sql.js/logo.svg +13 -0
  723. package/server/node_modules/sql.js/package.json +58 -0
  724. package/server/node_modules/statuses/HISTORY.md +87 -0
  725. package/server/node_modules/statuses/LICENSE +23 -0
  726. package/server/node_modules/statuses/README.md +139 -0
  727. package/server/node_modules/statuses/codes.json +65 -0
  728. package/server/node_modules/statuses/index.js +146 -0
  729. package/server/node_modules/statuses/package.json +49 -0
  730. package/server/node_modules/toidentifier/HISTORY.md +9 -0
  731. package/server/node_modules/toidentifier/LICENSE +21 -0
  732. package/server/node_modules/toidentifier/README.md +61 -0
  733. package/server/node_modules/toidentifier/index.js +32 -0
  734. package/server/node_modules/toidentifier/package.json +38 -0
  735. package/server/node_modules/type-is/HISTORY.md +292 -0
  736. package/server/node_modules/type-is/LICENSE +23 -0
  737. package/server/node_modules/type-is/README.md +198 -0
  738. package/server/node_modules/type-is/index.js +250 -0
  739. package/server/node_modules/type-is/package.json +47 -0
  740. package/server/node_modules/unpipe/HISTORY.md +4 -0
  741. package/server/node_modules/unpipe/LICENSE +22 -0
  742. package/server/node_modules/unpipe/README.md +43 -0
  743. package/server/node_modules/unpipe/index.js +69 -0
  744. package/server/node_modules/unpipe/package.json +27 -0
  745. package/server/node_modules/vary/HISTORY.md +39 -0
  746. package/server/node_modules/vary/LICENSE +22 -0
  747. package/server/node_modules/vary/README.md +101 -0
  748. package/server/node_modules/vary/index.js +149 -0
  749. package/server/node_modules/vary/package.json +43 -0
  750. package/server/node_modules/wrappy/LICENSE +15 -0
  751. package/server/node_modules/wrappy/README.md +36 -0
  752. package/server/node_modules/wrappy/package.json +29 -0
  753. package/server/node_modules/wrappy/wrappy.js +33 -0
  754. package/server/server.js +1082 -0
@@ -0,0 +1,1082 @@
1
+ 'use strict'
2
+ // aiplang Full-Stack Server
3
+ // Competes with Laravel: ORM, relationships, migrations, auth, middleware, validation, queues, email
4
+
5
+ const http = require('http')
6
+ const fs = require('fs')
7
+ const path = require('path')
8
+ const url = require('url')
9
+ const crypto = require('crypto')
10
+ const bcrypt = require('bcryptjs')
11
+ const jwt = require('jsonwebtoken')
12
+
13
+ // ── SQL.js DB (pure JS SQLite, no native deps) ─────────────────
14
+ let SQL, DB_FILE
15
+ let _db = null
16
+
17
+ async function getDB(dbFile = ':memory:') {
18
+ if (_db) return _db
19
+ const initSqlJs = require('sql.js')
20
+ SQL = await initSqlJs()
21
+ if (dbFile !== ':memory:' && fs.existsSync(dbFile)) {
22
+ const fileBuffer = fs.readFileSync(dbFile)
23
+ _db = new SQL.Database(fileBuffer)
24
+ } else {
25
+ _db = new SQL.Database()
26
+ }
27
+ DB_FILE = dbFile
28
+ return _db
29
+ }
30
+
31
+ function persistDB() {
32
+ if (!_db || !DB_FILE || DB_FILE === ':memory:') return
33
+ const data = _db.export()
34
+ fs.writeFileSync(DB_FILE, Buffer.from(data))
35
+ }
36
+
37
+ function dbRun(sql, params = []) {
38
+ _db.run(sql, params)
39
+ persistDB()
40
+ }
41
+
42
+ function dbAll(sql, params = []) {
43
+ const stmt = _db.prepare(sql)
44
+ stmt.bind(params)
45
+ const rows = []
46
+ while (stmt.step()) {
47
+ rows.push(stmt.getAsObject())
48
+ }
49
+ stmt.free()
50
+ return rows
51
+ }
52
+
53
+ function dbGet(sql, params = []) {
54
+ const rows = dbAll(sql, params)
55
+ return rows[0] || null
56
+ }
57
+
58
+ // ── UUID ────────────────────────────────────────────────────────
59
+ const uuid = () => crypto.randomUUID()
60
+
61
+ // ── JWT ─────────────────────────────────────────────────────────
62
+ let JWT_SECRET = process.env.JWT_SECRET || 'aiplang-secret-change-in-production'
63
+ let JWT_EXPIRE = '7d'
64
+
65
+ function generateJWT(user) {
66
+ const payload = { id: user.id, email: user.email, role: user.role || 'user' }
67
+ return jwt.sign(payload, JWT_SECRET, { expiresIn: JWT_EXPIRE })
68
+ }
69
+
70
+ function verifyJWT(token) {
71
+ try { return jwt.verify(token, JWT_SECRET) }
72
+ catch { return null }
73
+ }
74
+
75
+ // ═══════════════════════════════════════════════════════════════
76
+ // PARSER — extends aiplang v2 syntax
77
+ // ═══════════════════════════════════════════════════════════════
78
+
79
+ function parseApp(src) {
80
+ const app = {
81
+ env: [], db: null, auth: null, cache: null,
82
+ middleware: [], models: [], apis: [], pages: [],
83
+ seeds: [], jobs: [], events: []
84
+ }
85
+
86
+ const lines = src.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'))
87
+ let i = 0
88
+ let inModel = false, inAPI = false, currentModel = null, currentAPI = null
89
+ let pageLines = [], inPage = false
90
+
91
+ while (i < lines.length) {
92
+ const line = lines[i]
93
+
94
+ // Page separator
95
+ if (line === '---') {
96
+ if (inPage && pageLines.length) app.pages.push(parsePage(pageLines.join('\n')))
97
+ pageLines = []; inPage = false; inModel = false; inAPI = false
98
+ currentModel = null; currentAPI = null
99
+ i++; continue
100
+ }
101
+
102
+ // Page start
103
+ if (line.startsWith('%')) {
104
+ inPage = true; inModel = false; inAPI = false
105
+ currentModel = null; currentAPI = null
106
+ pageLines.push(line); i++; continue
107
+ }
108
+ if (inPage) { pageLines.push(line); i++; continue }
109
+
110
+ // Config directives
111
+ if (line.startsWith('~env ')) { app.env.push(parseEnvLine(line.slice(5))); i++; continue }
112
+ if (line.startsWith('~db ')) { app.db = parseDBLine(line.slice(4)); i++; continue }
113
+ if (line.startsWith('~auth ')) { app.auth = parseAuthLine(line.slice(6)); i++; continue }
114
+ if (line.startsWith('~middleware ')) { app.middleware = line.slice(12).split('|').map(s=>s.trim()); i++; continue }
115
+ if (line.startsWith('~cache ')) { app.cache = parseCacheLine(line.slice(7)); i++; continue }
116
+
117
+ // Model block
118
+ if (line.startsWith('model ')) {
119
+ if (inModel && currentModel) app.models.push(currentModel)
120
+ const mName = line.slice(6).replace('{','').trim()
121
+ currentModel = { name: mName, fields: [], relationships: [], hooks: [] }
122
+ inModel = true; inAPI = false; i++; continue
123
+ }
124
+ if (inModel && line === '}') { if (currentModel) app.models.push(currentModel); currentModel = null; inModel = false; i++; continue }
125
+ if (inModel && currentModel) {
126
+ if (line.startsWith('~has-many ')) currentModel.relationships.push({ type: 'hasMany', model: line.slice(10).trim() })
127
+ else if (line.startsWith('~belongs ')) currentModel.relationships.push({ type: 'belongsTo', model: line.slice(9).trim() })
128
+ else if (line.startsWith('~hook ')) currentModel.hooks.push(line.slice(6).trim())
129
+ else if (line && line !== '{') currentModel.fields.push(parseModelField(line))
130
+ i++; continue
131
+ }
132
+
133
+ // API block
134
+ if (line.startsWith('api ')) {
135
+ if (inAPI && currentAPI) app.apis.push(currentAPI)
136
+ const parts = line.slice(4).replace('{','').trim().split(/\s+/)
137
+ currentAPI = { method: parts[0], path: parts[1], guards: [], validate: [], query: [], body: [], return: null }
138
+ inAPI = true; i++; continue
139
+ }
140
+ if (inAPI && line === '}') { if (currentAPI) app.apis.push(currentAPI); currentAPI = null; inAPI = false; i++; continue }
141
+ if (inAPI && currentAPI) { parseAPILine(line, currentAPI); i++; continue }
142
+
143
+ i++
144
+ }
145
+
146
+ if (inPage && pageLines.length) app.pages.push(parsePage(pageLines.join('\n')))
147
+ if (inModel && currentModel) app.models.push(currentModel)
148
+ if (inAPI && currentAPI) app.apis.push(currentAPI)
149
+
150
+ return app
151
+ }
152
+
153
+ function parseEnvLine(s) {
154
+ const parts = s.split(/\s+/)
155
+ const ev = { name: '', required: false, default: null }
156
+ for (const p of parts) {
157
+ if (p === 'required') ev.required = true
158
+ else if (p.includes('=')) { const [k,v] = p.split('='); ev.name = k; ev.default = v }
159
+ else ev.name = p
160
+ }
161
+ return ev
162
+ }
163
+
164
+ function parseDBLine(s) {
165
+ const parts = s.split(/\s+/)
166
+ return { driver: parts[0] || 'sqlite', dsn: parts[1] || './app.db' }
167
+ }
168
+
169
+ function parseAuthLine(s) {
170
+ const parts = s.split(/\s+/)
171
+ const auth = { provider: parts[0] || 'jwt', secret: parts[1] || '$JWT_SECRET', expire: '7d' }
172
+ for (const p of parts) { if (p.startsWith('expire=')) auth.expire = p.slice(7) }
173
+ return auth
174
+ }
175
+
176
+ function parseCacheLine(s) {
177
+ const parts = s.split(/\s+/)
178
+ return { driver: parts[0] || 'memory', url: parts[1] || '', ttl: 300 }
179
+ }
180
+
181
+ function parseModelField(line) {
182
+ const parts = line.split(':').map(s => s.trim())
183
+ const f = { name: parts[0], type: parts[1] || 'text', modifiers: [], enumVals: [], default: null, ref: null }
184
+ for (let j = 2; j < parts.length; j++) {
185
+ const p = parts[j]
186
+ if (p.startsWith('default=')) f.default = p.slice(8)
187
+ else if (p.startsWith('ref ')) f.ref = p.slice(4)
188
+ else if (p.startsWith('enum:')) f.enumVals = p.slice(5).split(',')
189
+ else if (p !== '') f.modifiers.push(p)
190
+ }
191
+ return f
192
+ }
193
+
194
+ function parseAPILine(line, route) {
195
+ if (line.startsWith('~guard ')) route.guards = line.slice(7).split('|').map(s=>s.trim())
196
+ else if (line.startsWith('~validate ')) {
197
+ line.slice(10).split('|').forEach(v => {
198
+ const parts = v.trim().split(/\s+/)
199
+ if (parts[0]) route.validate.push({ field: parts[0], rules: parts.slice(1) })
200
+ })
201
+ }
202
+ else if (line.startsWith('~query ')) {
203
+ line.slice(7).split('|').forEach(q => {
204
+ q = q.trim(); const eq = q.indexOf('=')
205
+ route.query.push(eq !== -1 ? { name: q.slice(0,eq), default: q.slice(eq+1) } : { name: q, default: null })
206
+ })
207
+ }
208
+ else route.body.push(line)
209
+ }
210
+
211
+ function parsePage(src) {
212
+ // Reuse existing frontend parser logic
213
+ const lines = src.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'))
214
+ const p = { id: 'page', theme: 'dark', route: '/', themeVars: null, state: {}, queries: [], blocks: [] }
215
+ for (const line of lines) {
216
+ if (line.startsWith('%')) {
217
+ const pts = line.slice(1).trim().split(/\s+/)
218
+ p.id = pts[0]||'page'; p.route = pts[2]||'/'
219
+ const rt = pts[1]||'dark'
220
+ if (rt.includes('#')) { const c=rt.split(','); p.theme='custom'; p.customTheme={bg:c[0],text:c[1]||'#f1f5f9',accent:c[2]||'#2563eb'} }
221
+ else p.theme = rt
222
+ } else if (line.startsWith('~theme ')) {
223
+ p.themeVars = p.themeVars || {}
224
+ line.slice(7).trim().split(/\s+/).forEach(pair => { const eq=pair.indexOf('='); if(eq!==-1) p.themeVars[pair.slice(0,eq)]=pair.slice(eq+1) })
225
+ } else if (line.startsWith('@') && line.includes('=')) {
226
+ const eq = line.indexOf('='); p.state[line.slice(1,eq).trim()] = line.slice(eq+1).trim()
227
+ } else if (line.startsWith('~')) {
228
+ const pts = line.slice(1).trim().split(/\s+/)
229
+ const ai = pts.indexOf('=>')
230
+ if (pts[0]==='mount') p.queries.push({ trigger:'mount', method:pts[1], path:pts[2], target:ai===-1?pts[3]:null, action:ai!==-1?pts.slice(ai+1).join(' '):null })
231
+ else if (pts[0]==='interval') p.queries.push({ trigger:'interval', interval:parseInt(pts[1]), method:pts[2], path:pts[3], target:ai===-1?pts[4]:null, action:ai!==-1?pts.slice(ai+1).join(' '):null })
232
+ } else {
233
+ p.blocks.push({ kind: blockKind(line), rawLine: line })
234
+ }
235
+ }
236
+ return p
237
+ }
238
+
239
+ function blockKind(line) {
240
+ const bi = line.indexOf('{'); if (bi === -1) return 'unknown'
241
+ const head = line.slice(0, bi).trim()
242
+ const m = head.match(/^([a-z]+)\d+$/)
243
+ return m ? m[1] : head
244
+ }
245
+
246
+ // ═══════════════════════════════════════════════════════════════
247
+ // AUTO MIGRATION
248
+ // ═══════════════════════════════════════════════════════════════
249
+
250
+ function toTableName(model) {
251
+ return model.toLowerCase().replace(/([A-Z])/g, '_$1').replace(/^_/, '') + 's'
252
+ }
253
+
254
+ function toColumnName(field) {
255
+ return field.replace(/([A-Z])/g, '_$1').toLowerCase()
256
+ }
257
+
258
+ function migrateModels(models) {
259
+ for (const model of models) {
260
+ const table = toTableName(model.name)
261
+ let cols = []
262
+
263
+ for (const f of model.fields) {
264
+ const col = toColumnName(f.name)
265
+ let sqlType = 'TEXT'
266
+ switch (f.type) {
267
+ case 'uuid': sqlType = 'TEXT'; break
268
+ case 'int': sqlType = 'INTEGER'; break
269
+ case 'float': sqlType = 'REAL'; break
270
+ case 'bool': sqlType = 'INTEGER'; break
271
+ case 'timestamp': sqlType = 'TEXT'; break
272
+ case 'json': sqlType = 'TEXT'; break
273
+ case 'enum': sqlType = 'TEXT'; break
274
+ default: sqlType = 'TEXT'
275
+ }
276
+
277
+ let def = `${col} ${sqlType}`
278
+ if (f.modifiers.includes('pk')) def += ' PRIMARY KEY'
279
+ if (f.modifiers.includes('required')) def += ' NOT NULL'
280
+ if (f.modifiers.includes('unique')) def += ' UNIQUE'
281
+ if (f.default !== null) def += ` DEFAULT '${f.default}'`
282
+
283
+ cols.push(def)
284
+ }
285
+
286
+ // Add relationship foreign keys
287
+ for (const rel of model.relationships || []) {
288
+ if (rel.type === 'belongsTo') {
289
+ const fkCol = rel.model.toLowerCase() + '_id'
290
+ cols.push(`${fkCol} TEXT`)
291
+ }
292
+ }
293
+
294
+ // Always include timestamp columns
295
+ const hasCreatedAt = cols.some(c => c.startsWith('created_at'))
296
+ const hasUpdatedAt = cols.some(c => c.startsWith('updated_at'))
297
+ if (!hasCreatedAt) cols.push('created_at TEXT')
298
+ if (!hasUpdatedAt) cols.push('updated_at TEXT')
299
+
300
+ const sql = `CREATE TABLE IF NOT EXISTS ${table} (${cols.join(', ')})`
301
+ try { dbRun(sql) } catch (e) { /* table might already exist - try ALTER */ }
302
+
303
+ console.log(`[aiplang] ✓ ${table} (${cols.length} columns)`)
304
+ }
305
+ }
306
+
307
+ // ═══════════════════════════════════════════════════════════════
308
+ // ORM — Model operations
309
+ // ═══════════════════════════════════════════════════════════════
310
+
311
+ class Model {
312
+ constructor(name) {
313
+ this.tableName = toTableName(name)
314
+ this.modelName = name
315
+ }
316
+
317
+ all(opts = {}) {
318
+ let sql = `SELECT * FROM ${this.tableName}`
319
+ const params = []
320
+ if (opts.where) { sql += ` WHERE ${opts.where}`; if (opts.whereParams) params.push(...opts.whereParams) }
321
+ if (opts.order) sql += ` ORDER BY ${opts.order}`
322
+ if (opts.limit) sql += ` LIMIT ${opts.limit}`
323
+ if (opts.offset) sql += ` OFFSET ${opts.offset}`
324
+ return dbAll(sql, params)
325
+ }
326
+
327
+ find(id) { return dbGet(`SELECT * FROM ${this.tableName} WHERE id = ?`, [id]) }
328
+
329
+ findBy(field, value) { return dbGet(`SELECT * FROM ${this.tableName} WHERE ${field} = ? LIMIT 1`, [value]) }
330
+
331
+ where(field, op, value) {
332
+ return dbAll(`SELECT * FROM ${this.tableName} WHERE ${field} ${op} ?`, [value])
333
+ }
334
+
335
+ paginate(page = 1, perPage = 15, opts = {}) {
336
+ const offset = (page - 1) * perPage
337
+ const total = dbGet(`SELECT COUNT(*) as count FROM ${this.tableName}`)?.count || 0
338
+ const data = this.all({ ...opts, limit: perPage, offset })
339
+ return {
340
+ data,
341
+ meta: { total, page, per_page: perPage, last_page: Math.ceil(total / perPage) }
342
+ }
343
+ }
344
+
345
+ create(data) {
346
+ const row = { ...data }
347
+ if (!row.id) row.id = uuid()
348
+ if (!row.created_at) row.created_at = new Date().toISOString()
349
+ if (!row.updated_at) row.updated_at = new Date().toISOString()
350
+
351
+ const keys = Object.keys(row)
352
+ const vals = Object.values(row)
353
+ const sql = `INSERT INTO ${this.tableName} (${keys.join(',')}) VALUES (${keys.map(()=>'?').join(',')})`
354
+ dbRun(sql, vals)
355
+ return row
356
+ }
357
+
358
+ update(id, data) {
359
+ data.updated_at = new Date().toISOString()
360
+ delete data.id; delete data.created_at; delete data.password
361
+ const sets = Object.keys(data).map(k => `${k} = ?`).join(', ')
362
+ dbRun(`UPDATE ${this.tableName} SET ${sets} WHERE id = ?`, [...Object.values(data), id])
363
+ return this.find(id)
364
+ }
365
+
366
+ delete(id) {
367
+ dbRun(`DELETE FROM ${this.tableName} WHERE id = ?`, [id])
368
+ }
369
+
370
+ count(opts = {}) {
371
+ let sql = `SELECT COUNT(*) as count FROM ${this.tableName}`
372
+ if (opts.where) sql += ` WHERE ${opts.where}`
373
+ return dbGet(sql)?.count || 0
374
+ }
375
+
376
+ // Relationships
377
+ hasMany(relModel, foreignKey) {
378
+ return (parentId) => {
379
+ const m = new Model(relModel)
380
+ const fk = foreignKey || this.modelName.toLowerCase() + '_id'
381
+ return dbAll(`SELECT * FROM ${m.tableName} WHERE ${fk} = ?`, [parentId])
382
+ }
383
+ }
384
+
385
+ belongsTo(relModel, foreignKey) {
386
+ return (childRow) => {
387
+ const m = new Model(relModel)
388
+ const fk = foreignKey || relModel.toLowerCase() + '_id'
389
+ return m.find(childRow[fk])
390
+ }
391
+ }
392
+ }
393
+
394
+ // ═══════════════════════════════════════════════════════════════
395
+ // HTTP SERVER — Express-like but stdlib
396
+ // ═══════════════════════════════════════════════════════════════
397
+
398
+ class AiplangServer {
399
+ constructor() {
400
+ this.routes = []
401
+ this.globalMiddleware = []
402
+ this.models = {}
403
+ this.app = null
404
+ }
405
+
406
+ use(fn) { this.globalMiddleware.push(fn) }
407
+
408
+ addRoute(method, routePath, handler) {
409
+ this.routes.push({ method: method.toUpperCase(), path: routePath, handler, params: parseRouteParams(routePath) })
410
+ }
411
+
412
+ registerModel(name) {
413
+ this.models[name] = new Model(name)
414
+ return this.models[name]
415
+ }
416
+
417
+ async handleRequest(req, res) {
418
+ // Parse body
419
+ if (req.method !== 'GET' && req.method !== 'DELETE') {
420
+ req.body = await parseBody(req)
421
+ } else {
422
+ req.body = {}
423
+ }
424
+
425
+ // Parse query string
426
+ const parsed = url.parse(req.url, true)
427
+ req.query = parsed.query
428
+ req.path = parsed.pathname
429
+
430
+ // Parse auth token
431
+ const token = extractToken(req)
432
+ req.user = token ? verifyJWT(token) : null
433
+
434
+ // CORS
435
+ res.setHeader('Access-Control-Allow-Origin', '*')
436
+ res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS')
437
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization')
438
+ if (req.method === 'OPTIONS') { res.writeHead(204); res.end(); return }
439
+
440
+ // Match route
441
+ for (const route of this.routes) {
442
+ if (route.method !== req.method) continue
443
+ const match = matchRoute(route.path, req.path)
444
+ if (!match) continue
445
+ req.params = match
446
+
447
+ // Helper methods
448
+ res.json = (status, data) => {
449
+ if (typeof status === 'object') { data = status; status = 200 }
450
+ res.writeHead(status, { 'Content-Type': 'application/json' })
451
+ res.end(JSON.stringify(data))
452
+ }
453
+ res.error = (status, msg) => res.json(status, { error: msg })
454
+ res.noContent = () => { res.writeHead(204); res.end() }
455
+
456
+ try { await route.handler(req, res) }
457
+ catch (e) {
458
+ console.error('[aiplang] Route error:', e.message)
459
+ res.json(500, { error: 'Internal server error' })
460
+ }
461
+ return
462
+ }
463
+
464
+ res.writeHead(404, { 'Content-Type': 'application/json' })
465
+ res.end(JSON.stringify({ error: 'Not found' }))
466
+ }
467
+
468
+ listen(port) {
469
+ const server = http.createServer((req, res) => this.handleRequest(req, res))
470
+ server.listen(port, () => console.log(`[aiplang] Server running → http://localhost:${port}`))
471
+ return server
472
+ }
473
+ }
474
+
475
+ // ═══════════════════════════════════════════════════════════════
476
+ // API ROUTE COMPILER
477
+ // ═══════════════════════════════════════════════════════════════
478
+
479
+ function compileAPIRoute(route, app, server) {
480
+ const handler = async (req, res) => {
481
+ const ctx = {
482
+ req, res, params: req.params,
483
+ body: req.body, query: req.query,
484
+ user: req.user,
485
+ vars: {},
486
+ models: server.models,
487
+ }
488
+
489
+ // Guards
490
+ for (const guard of route.guards) {
491
+ if (guard === 'auth') {
492
+ if (!req.user) { res.error(401, 'Unauthorized'); return }
493
+ ctx.authUser = req.user
494
+ }
495
+ if (guard === 'admin') {
496
+ if (!req.user || req.user.role !== 'admin') { res.error(403, 'Forbidden'); return }
497
+ }
498
+ if (guard === 'owner') {
499
+ // Check if record belongs to user — simple implementation
500
+ if (!req.user) { res.error(401, 'Unauthorized'); return }
501
+ }
502
+ }
503
+
504
+ // Query params
505
+ for (const qp of route.query) {
506
+ ctx.vars[qp.name] = req.query[qp.name] || qp.default
507
+ }
508
+
509
+ // Validation
510
+ for (const v of route.validate) {
511
+ const val = ctx.body[v.field]
512
+ for (const rule of v.rules) {
513
+ if (rule === 'required' && (!val || val === '')) {
514
+ res.error(422, `${v.field} is required`); return
515
+ }
516
+ if (rule === 'email' && val && !val.includes('@')) {
517
+ res.error(422, `${v.field} must be a valid email`); return
518
+ }
519
+ if (rule.startsWith('min=')) {
520
+ const min = parseInt(rule.slice(4))
521
+ if (!val || String(val).length < min) { res.error(422, `${v.field} must be at least ${min} characters`); return }
522
+ }
523
+ if (rule.startsWith('max=')) {
524
+ const max = parseInt(rule.slice(4))
525
+ if (val && String(val).length > max) { res.error(422, `${v.field} must be at most ${max} characters`); return }
526
+ }
527
+ if (rule.startsWith('unique:')) {
528
+ const modelName = rule.slice(7)
529
+ const m = server.models[modelName]
530
+ if (m) {
531
+ const existing = m.findBy(v.field, val)
532
+ if (existing) { res.error(409, `${v.field} already exists`); return }
533
+ }
534
+ }
535
+ if (rule.startsWith('exists:')) {
536
+ const modelName = rule.slice(7)
537
+ const m = server.models[modelName]
538
+ if (m && !m.find(val)) { res.error(422, `${v.field} does not exist`); return }
539
+ }
540
+ if (rule.startsWith('in:')) {
541
+ const allowed = rule.slice(3).split(',')
542
+ if (val && !allowed.includes(val)) { res.error(422, `${v.field} must be one of: ${allowed.join(', ')}`); return }
543
+ }
544
+ }
545
+ }
546
+
547
+ // Execute body operations
548
+ for (const op of route.body) {
549
+ const result = await execOp(op, ctx, server)
550
+ if (result === '__RESPONDED__') return
551
+ if (result !== null && result !== undefined) {
552
+ ctx.lastResult = result
553
+ }
554
+ }
555
+
556
+ // Default 200 if no explicit return
557
+ if (!res.writableEnded) res.json(200, ctx.lastResult || {})
558
+ }
559
+
560
+ server.addRoute(route.method, route.path, handler)
561
+ }
562
+
563
+ async function execOp(line, ctx, server) {
564
+ line = line.trim()
565
+ if (!line) return null
566
+
567
+ // ~hash field
568
+ if (line.startsWith('~hash ')) {
569
+ const field = line.slice(6).trim()
570
+ if (ctx.body[field]) ctx.body[field] = await bcrypt.hash(ctx.body[field], 12)
571
+ return null
572
+ }
573
+
574
+ // ~check password plain hashed | 401
575
+ if (line.startsWith('~check ')) {
576
+ const parts = line.slice(7).trim().split(/\s+/)
577
+ const plain = resolveVar(parts[1], ctx)
578
+ const hashed = resolveVar(parts[2], ctx)
579
+ const status = parseInt(parts[4]) || 401
580
+ const ok = await bcrypt.compare(String(plain||''), String(hashed||''))
581
+ if (!ok) { ctx.res.error(status, 'Invalid credentials'); return '__RESPONDED__' }
582
+ return null
583
+ }
584
+
585
+ // ~unique Model field value | status
586
+ if (line.startsWith('~unique ')) {
587
+ const parts = line.slice(8).trim().split(/\s+/)
588
+ const modelName = parts[0], field = parts[1], value = resolveVar(parts[2], ctx)
589
+ const status = parseInt(parts[4]) || 409
590
+ const m = server.models[modelName]
591
+ if (m) {
592
+ const existing = m.findBy(field, value)
593
+ if (existing) { ctx.res.error(status, `${field} already exists`); return '__RESPONDED__' }
594
+ }
595
+ return null
596
+ }
597
+
598
+ // $var = expr
599
+ if (line.startsWith('$') && line.includes('=')) {
600
+ const eq = line.indexOf('=')
601
+ const varName = line.slice(1, eq).trim()
602
+ const expr = line.slice(eq+1).trim()
603
+ ctx.vars[varName] = evalExpr(expr, ctx, server)
604
+ return null
605
+ }
606
+
607
+ // insert Model($body)
608
+ if (line.startsWith('insert ')) {
609
+ const modelName = line.match(/insert\s+(\w+)/)?.[1]
610
+ const m = server.models[modelName]
611
+ if (m) {
612
+ const data = { ...ctx.body }
613
+ ctx.vars['inserted'] = m.create(data)
614
+ return ctx.vars['inserted']
615
+ }
616
+ return null
617
+ }
618
+
619
+ // update Model($id, $body)
620
+ if (line.startsWith('update ')) {
621
+ const modelName = line.match(/update\s+(\w+)/)?.[1]
622
+ const m = server.models[modelName]
623
+ if (m) {
624
+ const id = ctx.params.id || ctx.vars['id']
625
+ ctx.vars['updated'] = m.update(id, { ...ctx.body })
626
+ return ctx.vars['updated']
627
+ }
628
+ return null
629
+ }
630
+
631
+ // delete Model($id)
632
+ if (line.startsWith('delete ')) {
633
+ const modelName = line.match(/delete\s+(\w+)/)?.[1]
634
+ const m = server.models[modelName]
635
+ if (m) {
636
+ const id = ctx.params.id || ctx.vars['id']
637
+ m.delete(id)
638
+ ctx.res.noContent(); return '__RESPONDED__'
639
+ }
640
+ return null
641
+ }
642
+
643
+ // return expr statusCode
644
+ if (line.startsWith('return ')) {
645
+ const parts = line.slice(7).trim().split(/\s+/)
646
+ const expr = parts[0]
647
+ const status = parseInt(parts[1]) || 200
648
+ let result = evalExpr(expr, ctx, server)
649
+ if (result === null || result === undefined) result = ctx.vars['inserted'] || ctx.vars['updated'] || {}
650
+ ctx.res.json(status, result)
651
+ return '__RESPONDED__'
652
+ }
653
+
654
+ return null
655
+ }
656
+
657
+ function evalExpr(expr, ctx, server) {
658
+ expr = expr.trim()
659
+
660
+ // jwt($var)
661
+ if (expr.startsWith('jwt(')) {
662
+ const varName = expr.match(/jwt\(\$([^)]+)\)/)?.[1]
663
+ const user = varName ? ctx.vars[varName] : ctx.body
664
+ return { token: generateJWT(user), user: sanitize(user) }
665
+ }
666
+
667
+ // Model.all(...)
668
+ if (expr.includes('.all(')) {
669
+ const modelName = expr.match(/^(\w+)\.all/)?.[1]
670
+ const m = server.models[modelName]
671
+ if (!m) return []
672
+ const opts = {}
673
+ const limitM = expr.match(/limit=(\$?[\w.]+)/)
674
+ const offsetM = expr.match(/offset=([^,)]+)/)
675
+ const orderM = expr.match(/order=([^,)]+)/)
676
+ const whereM = expr.match(/where=([^,)]+)/)
677
+ if (limitM) opts.limit = resolveVar(limitM[1], ctx)
678
+ if (offsetM) opts.offset = evalMath(offsetM[1], ctx)
679
+ if (orderM) opts.order = orderM[1]
680
+ if (whereM) opts.where = whereM[1]
681
+ return m.all(opts)
682
+ }
683
+
684
+ // Model.find($id)
685
+ if (expr.includes('.find(')) {
686
+ const modelName = expr.match(/^(\w+)\.find/)?.[1]
687
+ const idExpr = expr.match(/\.find\(([^)]+)\)/)?.[1]
688
+ const m = server.models[modelName]
689
+ return m ? m.find(resolveVar(idExpr, ctx)) : null
690
+ }
691
+
692
+ // Model.findBy(field=value)
693
+ if (expr.includes('.findBy(')) {
694
+ const modelName = expr.match(/^(\w+)\.findBy/)?.[1]
695
+ const args = expr.match(/\.findBy\(([^)]+)\)/)?.[1]
696
+ const [field, valExpr] = (args || '').split('=')
697
+ const m = server.models[modelName]
698
+ return m ? m.findBy(field.trim(), resolveVar(valExpr?.trim(), ctx)) : null
699
+ }
700
+
701
+ // Model.paginate(page, perPage)
702
+ if (expr.includes('.paginate(')) {
703
+ const modelName = expr.match(/^(\w+)\.paginate/)?.[1]
704
+ const args = expr.match(/\.paginate\(([^)]+)\)/)?.[1]?.split(',')
705
+ const m = server.models[modelName]
706
+ if (!m) return { data: [], meta: {} }
707
+ const page = parseInt(resolveVar(args?.[0]?.trim(), ctx)) || 1
708
+ const perPage = parseInt(resolveVar(args?.[1]?.trim(), ctx)) || 15
709
+ return m.paginate(page, perPage)
710
+ }
711
+
712
+ // Model.count()
713
+ if (expr.includes('.count(')) {
714
+ const modelName = expr.match(/^(\w+)\.count/)?.[1]
715
+ const m = server.models[modelName]
716
+ return m ? m.count() : 0
717
+ }
718
+
719
+ // $var references
720
+ if (expr === '$auth.user') return ctx.user
721
+ if (expr.startsWith('$')) return resolveVar(expr, ctx)
722
+
723
+ // @auth.user
724
+ if (expr === '$auth.user' || expr === '$auth') return ctx.user
725
+
726
+ return expr
727
+ }
728
+
729
+ function resolveVar(expr, ctx) {
730
+ if (!expr) return undefined
731
+ expr = expr.trim()
732
+ if (expr.startsWith('$body.')) return ctx.body[expr.slice(6)]
733
+ if (expr.startsWith('$params.') || expr === '$id') {
734
+ const key = expr.startsWith('$params.') ? expr.slice(8) : 'id'
735
+ return ctx.params[key] || ctx.params['id']
736
+ }
737
+ if (expr.startsWith('$query.')) return ctx.query[expr.slice(7)]
738
+ if (expr.startsWith('$auth.')) return ctx.user?.[expr.slice(6)]
739
+ if (expr.startsWith('$')) {
740
+ const path = expr.slice(1).split('.')
741
+ let val = ctx.vars[path[0]]
742
+ for (let i = 1; i < path.length; i++) val = val?.[path[i]]
743
+ return val
744
+ }
745
+ return expr
746
+ }
747
+
748
+ function evalMath(expr, ctx) {
749
+ // Handles simple expressions like ($page-1)*$limit
750
+ try {
751
+ const resolved = expr.replace(/\$[\w.]+/g, m => resolveVar(m, ctx) || 0)
752
+ return Function(`"use strict"; return (${resolved})`)()
753
+ } catch { return 0 }
754
+ }
755
+
756
+ // ═══════════════════════════════════════════════════════════════
757
+ // FRONTEND RENDERER — same as v1 but served dynamically
758
+ // ═══════════════════════════════════════════════════════════════
759
+
760
+ function serveStaticFrontend(server, pages) {
761
+ // Serve CSS + hydration runtime
762
+ server.addRoute('GET', '/aiplang-hydrate.js', (req, res) => {
763
+ const hydratePath = path.join(__dirname, 'node_modules', '..', 'flux-lang', 'runtime', 'aiplang-hydrate.js')
764
+ if (fs.existsSync(hydratePath)) {
765
+ res.writeHead(200, { 'Content-Type': 'application/javascript', 'Cache-Control': 'public, max-age=3600' })
766
+ res.end(fs.readFileSync(hydratePath))
767
+ } else {
768
+ res.writeHead(404); res.end('// hydrate runtime not found')
769
+ }
770
+ })
771
+
772
+ // Serve each page
773
+ for (const page of pages) {
774
+ const route = page.route || '/'
775
+ server.addRoute('GET', route, (req, res) => {
776
+ const html = renderPageHTML(page, pages)
777
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' })
778
+ res.end(html)
779
+ })
780
+ }
781
+ }
782
+
783
+ function renderPageHTML(page, allPages) {
784
+ const needsJS = page.queries.length > 0 || page.blocks.some(b => ['table','form','if','btn','select','faq'].includes(b.kind))
785
+ const body = page.blocks.map(b => renderBlock(b)).join('')
786
+ const config = needsJS ? JSON.stringify({
787
+ id: page.id, theme: page.theme, state: page.state,
788
+ routes: allPages.map(p=>p.route), queries: page.queries
789
+ }) : ''
790
+ const hydrate = needsJS ? `\n<script>window.__FLUX_PAGE__=${config};</script>\n<script src="/aiplang-hydrate.js" defer></script>` : ''
791
+ const themeCSS = page.themeVars ? genThemeVarCSS(page.themeVars) : ''
792
+ const customCSS = page.customTheme ? genCustomCSS(page.customTheme) : ''
793
+ return `<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${page.id}</title><style>${getBaseCSS(page.theme)}${customCSS}${themeCSS}</style></head><body>${body}${hydrate}</body></html>`
794
+ }
795
+
796
+ function renderBlock(b) {
797
+ const line = b.rawLine
798
+ switch (b.kind) {
799
+ case 'nav': return renderNav(line)
800
+ case 'hero': return renderHero(line)
801
+ case 'stats': return renderStats(line)
802
+ case 'row': return renderRow(line)
803
+ case 'sect': return renderSect(line)
804
+ case 'foot': return renderFoot(line)
805
+ case 'table': return renderTable(line)
806
+ case 'form': return renderForm(line)
807
+ case 'pricing': return renderPricing(line)
808
+ case 'faq': return renderFaq(line)
809
+ case 'raw': return extractBody(line) + '\n'
810
+ case 'if': return `<div class="fx-if-wrap" data-fx-if="${extractCond(line)}" style="display:none"></div>\n`
811
+ default: return ''
812
+ }
813
+ }
814
+
815
+ const esc = s => s==null?'':String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;')
816
+ const ic = n => ({bolt:'⚡',rocket:'🚀',shield:'🛡',chart:'📊',star:'⭐',check:'✓',globe:'🌐',lock:'🔒',user:'👤',gear:'⚙',fire:'🔥',money:'💰',bell:'🔔',mail:'✉'}[n] || n)
817
+
818
+ function extractBody(line) {
819
+ const bi=line.indexOf('{'),li=line.lastIndexOf('}')
820
+ return bi!==-1&&li!==-1?line.slice(bi+1,li).trim():''
821
+ }
822
+ function extractCond(line) { return line.slice(3,line.indexOf('{')).trim() }
823
+
824
+ function parseItems(body) {
825
+ return body.split('|').map(raw=>{
826
+ raw=raw.trim();if(!raw)return null
827
+ return raw.split('>').map(f=>{
828
+ f=f.trim()
829
+ if(f.startsWith('img:')) return{isImg:true,src:f.slice(4)}
830
+ if(f.startsWith('/')) {const[p,l]=f.split(':');return{isLink:true,path:p.trim(),label:(l||'').trim()}}
831
+ return{isLink:false,text:f}
832
+ })
833
+ }).filter(Boolean)
834
+ }
835
+
836
+ function renderNav(line) {
837
+ const items=parseItems(extractBody(line))
838
+ if(!items[0]) return ''
839
+ const it=items[0],brand=!it[0]?.isLink?`<span class="fx-brand">${esc(it[0].text)}</span>`:''
840
+ const start=!it[0]?.isLink?1:0
841
+ const links=it.slice(start).filter(f=>f.isLink).map(f=>`<a href="${esc(f.path)}" class="fx-nav-link">${esc(f.label)}</a>`).join('')
842
+ return `<nav class="fx-nav">${brand}<button class="fx-hamburger" onclick="this.classList.toggle('open');document.querySelector('.fx-nav-links').classList.toggle('open')"><span></span><span></span><span></span></button><div class="fx-nav-links">${links}</div></nav>\n`
843
+ }
844
+
845
+ function renderHero(line) {
846
+ const items=parseItems(extractBody(line))
847
+ let h1='',sub='',img='',ctas=''
848
+ for(const item of items) for(const f of item){
849
+ if(f.isImg) img=`<img src="${esc(f.src)}" class="fx-hero-img" alt="hero" loading="eager">`
850
+ else if(f.isLink) ctas+=`<a href="${esc(f.path)}" class="fx-cta">${esc(f.label)}</a>`
851
+ else if(!h1) h1=`<h1 class="fx-title">${esc(f.text)}</h1>`
852
+ else sub+=`<p class="fx-sub">${esc(f.text)}</p>`
853
+ }
854
+ return `<section class="fx-hero${img?' fx-hero-split':''}"><div class="fx-hero-inner">${h1}${sub}${ctas}</div>${img}</section>\n`
855
+ }
856
+
857
+ function renderStats(line) {
858
+ const cells=parseItems(extractBody(line)).map(item=>{
859
+ const[val,lbl]=(item[0]?.text||'').split(':')
860
+ const bind=(val?.includes('@')||val?.includes('$'))?` data-fx-bind="${esc(val?.trim())}"` :''
861
+ return`<div class="fx-stat"><div class="fx-stat-val"${bind}>${esc(val?.trim())}</div><div class="fx-stat-lbl">${esc(lbl?.trim())}</div></div>`
862
+ }).join('')
863
+ return `<div class="fx-stats">${cells}</div>\n`
864
+ }
865
+
866
+ function renderRow(line) {
867
+ const bi=line.indexOf('{'),head=line.slice(0,bi).trim()
868
+ const m=head.match(/row(\d+)/),cols=m?parseInt(m[1]):3
869
+ const cards=parseItems(extractBody(line)).map(item=>{
870
+ const inner=item.map((f,fi)=>{
871
+ if(f.isImg) return`<img src="${esc(f.src)}" class="fx-card-img" alt="" loading="lazy">`
872
+ if(f.isLink) return`<a href="${esc(f.path)}" class="fx-card-link">${esc(f.label)} →</a>`
873
+ if(fi===0) return`<div class="fx-icon">${ic(f.text)}</div>`
874
+ if(fi===1) return`<h3 class="fx-card-title">${esc(f.text)}</h3>`
875
+ return`<p class="fx-card-body">${esc(f.text)}</p>`
876
+ }).join('')
877
+ return`<div class="fx-card">${inner}</div>`
878
+ }).join('')
879
+ return `<div class="fx-grid fx-grid-${cols}">${cards}</div>\n`
880
+ }
881
+
882
+ function renderSect(line) {
883
+ let inner=''
884
+ parseItems(extractBody(line)).forEach((item,ii)=>item.forEach(f=>{
885
+ if(f.isLink) inner+=`<a href="${esc(f.path)}" class="fx-sect-link">${esc(f.label)}</a>`
886
+ else if(ii===0) inner+=`<h2 class="fx-sect-title">${esc(f.text)}</h2>`
887
+ else inner+=`<p class="fx-sect-body">${esc(f.text)}</p>`
888
+ }))
889
+ return `<section class="fx-sect">${inner}</section>\n`
890
+ }
891
+
892
+ function renderFoot(line) {
893
+ let inner=''
894
+ for(const item of parseItems(extractBody(line))) for(const f of item){
895
+ if(f.isLink) inner+=`<a href="${esc(f.path)}" class="fx-footer-link">${esc(f.label)}</a>`
896
+ else inner+=`<p class="fx-footer-text">${esc(f.text)}</p>`
897
+ }
898
+ return `<footer class="fx-footer">${inner}</footer>\n`
899
+ }
900
+
901
+ function renderTable(line) {
902
+ const bi=line.indexOf('{'),binding=line.slice(6,bi).trim()
903
+ const content=extractBody(line)
904
+ const em=content.match(/edit\s+(PUT|PATCH)\s+(\S+)/),dm=content.match(/delete\s+(?:DELETE\s+)?(\S+)/)
905
+ const clean=content.replace(/edit\s+(PUT|PATCH)\s+\S+/g,'').replace(/delete\s+(?:DELETE\s+)?\S+/g,'')
906
+ const cols=clean.split('|').map(c=>{c=c.trim();if(c.startsWith('empty:')||!c)return null;const[l,k]=c.split(':').map(x=>x.trim());return k?{label:l,key:k}:null}).filter(Boolean)
907
+ const emptyMsg=clean.match(/empty:\s*([^|]+)/)?.[1]||'No data.'
908
+ const ths=cols.map(c=>`<th class="fx-th">${esc(c.label)}</th>`).join('')
909
+ const ea=em?` data-fx-edit="${esc(em[2])}" data-fx-edit-method="${esc(em[1])}"` :''
910
+ const da=dm?` data-fx-delete="${esc(dm[1])}"` :''
911
+ const at=(em||dm)?'<th class="fx-th fx-th-actions">Actions</th>':''
912
+ return `<div class="fx-table-wrap"><table class="fx-table" data-fx-table="${esc(binding)}" data-fx-cols='${JSON.stringify(cols.map(c=>c.key))}'${ea}${da}><thead><tr>${ths}${at}</tr></thead><tbody class="fx-tbody"><tr><td colspan="${cols.length+(em||dm?1:0)}" class="fx-td-empty">${esc(emptyMsg)}</td></tr></tbody></table></div>\n`
913
+ }
914
+
915
+ function renderForm(line) {
916
+ const bi=line.indexOf('{')
917
+ let head=line.slice(5,bi).trim(),action='',method='POST',bpath='#'
918
+ const ai=head.indexOf('=>');if(ai!==-1){action=head.slice(ai+2).trim();head=head.slice(0,ai).trim()}
919
+ const pts=head.split(/\s+/);method=pts[0]||'POST';bpath=pts[1]||'#'
920
+ const fields=extractBody(line).split('|').map(f=>{
921
+ const[label,type,ph]=f.split(':').map(x=>x.trim())
922
+ if(!label) return''
923
+ const name=label.toLowerCase().replace(/\s+/g,'_')
924
+ const inp=type==='select'?`<select class="fx-input" name="${esc(name)}"><option value="">Select...</option></select>`:`<input class="fx-input" type="${esc(type||'text')}" name="${esc(name)}" placeholder="${esc(ph||'')}">`
925
+ return`<div class="fx-field"><label class="fx-label">${esc(label)}</label>${inp}</div>`
926
+ }).join('')
927
+ return `<div class="fx-form-wrap"><form class="fx-form" data-fx-form="${esc(bpath)}" data-fx-method="${esc(method)}" data-fx-action="${esc(action)}">${fields}<div class="fx-form-msg"></div><button type="submit" class="fx-btn">Submit</button></form></div>\n`
928
+ }
929
+
930
+ function renderPricing(line) {
931
+ const plans=extractBody(line).split('|').map(p=>{
932
+ const pts=p.trim().split('>').map(x=>x.trim())
933
+ return{name:pts[0],price:pts[1],desc:pts[2],linkRaw:pts[3]}
934
+ }).filter(p=>p.name)
935
+ const cards=plans.map((p,i)=>{
936
+ let lh='#',ll='Get started'
937
+ if(p.linkRaw){const m=p.linkRaw.match(/\/([^:]+):(.+)/);if(m){lh='/'+m[1];ll=m[2]}}
938
+ const f=i===1?' fx-pricing-featured':''
939
+ return`<div class="fx-pricing-card${f}">${i===1?'<div class="fx-pricing-badge">Most popular</div>':''}<div class="fx-pricing-name">${esc(p.name)}</div><div class="fx-pricing-price">${esc(p.price)}</div><p class="fx-pricing-desc">${esc(p.desc)}</p><a href="${esc(lh)}" class="fx-cta fx-pricing-cta">${esc(ll)}</a></div>`
940
+ }).join('')
941
+ return `<div class="fx-pricing">${cards}</div>\n`
942
+ }
943
+
944
+ function renderFaq(line) {
945
+ const items=extractBody(line).split('|').map(i=>{const idx=i.indexOf('>');return{q:i.slice(0,idx).trim(),a:i.slice(idx+1).trim()}}).filter(i=>i.q)
946
+ const html=items.map(i=>`<div class="fx-faq-item" onclick="this.classList.toggle('open')"><div class="fx-faq-q">${esc(i.q)}<span class="fx-faq-arrow">▸</span></div><div class="fx-faq-a">${esc(i.a)}</div></div>`).join('')
947
+ return `<section class="fx-sect"><div class="fx-faq">${html}</div></section>\n`
948
+ }
949
+
950
+ // ─── Helpers ──────────────────────────────────────────────────
951
+
952
+ function parseRouteParams(routePath) {
953
+ return routePath.split('/').filter(s => s.startsWith(':')).map(s => s.slice(1))
954
+ }
955
+
956
+ function matchRoute(routePattern, reqPath) {
957
+ const rParts = routePattern.split('/')
958
+ const uParts = reqPath.split('/')
959
+ if (rParts.length !== uParts.length) return null
960
+ const params = {}
961
+ for (let i = 0; i < rParts.length; i++) {
962
+ if (rParts[i].startsWith(':')) params[rParts[i].slice(1)] = uParts[i]
963
+ else if (rParts[i] !== uParts[i]) return null
964
+ }
965
+ return params
966
+ }
967
+
968
+ function extractToken(req) {
969
+ const auth = req.headers.authorization
970
+ if (auth?.startsWith('Bearer ')) return auth.slice(7)
971
+ return null
972
+ }
973
+
974
+ async function parseBody(req) {
975
+ return new Promise((resolve) => {
976
+ let data = ''
977
+ req.on('data', chunk => data += chunk)
978
+ req.on('end', () => {
979
+ try { resolve(JSON.parse(data)) }
980
+ catch { resolve({}) }
981
+ })
982
+ req.on('error', () => resolve({}))
983
+ })
984
+ }
985
+
986
+ function sanitize(obj) {
987
+ if (!obj) return obj
988
+ const s = { ...obj }
989
+ delete s.password
990
+ return s
991
+ }
992
+
993
+ function genThemeVarCSS(t) {
994
+ const r=[]
995
+ if(t.accent) r.push(`.fx-cta,.fx-btn{background:${t.accent}!important;color:#fff!important}`)
996
+ if(t.bg) r.push(`body{background:${t.bg}!important}`)
997
+ if(t.text) r.push(`body{color:${t.text}!important}`)
998
+ if(t.font) r.push(`@import url('https://fonts.googleapis.com/css2?family=${t.font.replace(/ /g,'+')}:wght@400;700;900&display=swap');body{font-family:'${t.font}',system-ui,sans-serif!important}`)
999
+ if(t.radius) r.push(`.fx-card,.fx-form,.fx-btn,.fx-input,.fx-cta{border-radius:${t.radius}!important}`)
1000
+ if(t.surface)r.push(`.fx-card,.fx-form{background:${t.surface}!important}`)
1001
+ return r.join('')
1002
+ }
1003
+
1004
+ function genCustomCSS(ct) {
1005
+ return `body{background:${ct.bg};color:${ct.text}}.fx-cta,.fx-btn{background:${ct.accent};color:#fff}`
1006
+ }
1007
+
1008
+ function getBaseCSS(theme) {
1009
+ const base=`*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{font-family:-apple-system,'Segoe UI',system-ui,sans-serif;-webkit-font-smoothing:antialiased;min-height:100vh}a{text-decoration:none;color:inherit}input,button,select{font-family:inherit}img{max-width:100%;height:auto}.fx-nav{display:flex;align-items:center;justify-content:space-between;padding:1rem 2.5rem;position:sticky;top:0;z-index:50;backdrop-filter:blur(12px);flex-wrap:wrap;gap:.5rem}.fx-brand{font-size:1.25rem;font-weight:800;letter-spacing:-.03em}.fx-nav-links{display:flex;align-items:center;gap:1.75rem}.fx-nav-link{font-size:.875rem;font-weight:500;opacity:.65;transition:opacity .15s}.fx-nav-link:hover{opacity:1}.fx-hamburger{display:none;flex-direction:column;gap:5px;background:none;border:none;cursor:pointer;padding:.25rem}.fx-hamburger span{display:block;width:22px;height:2px;background:currentColor;transition:all .2s;border-radius:1px}.fx-hamburger.open span:nth-child(1){transform:rotate(45deg) translate(5px,5px)}.fx-hamburger.open span:nth-child(2){opacity:0}.fx-hamburger.open span:nth-child(3){transform:rotate(-45deg) translate(5px,-5px)}@media(max-width:640px){.fx-hamburger{display:flex}.fx-nav-links{display:none;width:100%;flex-direction:column;align-items:flex-start;gap:.75rem;padding:.75rem 0}.fx-nav-links.open{display:flex}}.fx-hero{display:flex;align-items:center;justify-content:center;min-height:92vh;padding:4rem 1.5rem}.fx-hero-split{display:grid;grid-template-columns:1fr 1fr;gap:3rem;align-items:center;padding:4rem 2.5rem;min-height:70vh}.fx-hero-img{width:100%;border-radius:1.25rem;object-fit:cover;max-height:500px}.fx-hero-inner{max-width:56rem;text-align:center;display:flex;flex-direction:column;align-items:center;gap:1.5rem}.fx-hero-split .fx-hero-inner{text-align:left;align-items:flex-start;max-width:none}.fx-title{font-size:clamp(2.5rem,8vw,5.5rem);font-weight:900;letter-spacing:-.04em;line-height:1}.fx-sub{font-size:clamp(1rem,2vw,1.25rem);line-height:1.75;max-width:40rem}.fx-cta{display:inline-flex;align-items:center;padding:.875rem 2.5rem;border-radius:.75rem;font-weight:700;font-size:1rem;transition:transform .15s;margin:.25rem}.fx-cta:hover{transform:translateY(-1px)}.fx-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:3rem;padding:5rem 2.5rem;text-align:center}.fx-stat-val{font-size:clamp(2.5rem,5vw,4rem);font-weight:900;letter-spacing:-.04em;line-height:1}.fx-stat-lbl{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;margin-top:.5rem}.fx-grid{display:grid;gap:1.25rem;padding:1rem 2.5rem 5rem}.fx-grid-2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}.fx-grid-3{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}.fx-grid-4{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}.fx-card{border-radius:1rem;padding:1.75rem;transition:transform .2s,box-shadow .2s}.fx-card:hover{transform:translateY(-2px)}.fx-card-img{width:100%;border-radius:.75rem;object-fit:cover;height:180px;margin-bottom:1rem}.fx-icon{font-size:2rem;margin-bottom:1rem}.fx-card-title{font-size:1.0625rem;font-weight:700;letter-spacing:-.02em;margin-bottom:.5rem}.fx-card-body{font-size:.875rem;line-height:1.65}.fx-sect{padding:5rem 2.5rem}.fx-sect-title{font-size:clamp(1.75rem,4vw,3rem);font-weight:800;letter-spacing:-.04em;margin-bottom:1.5rem;text-align:center}.fx-sect-body{font-size:1rem;line-height:1.75;text-align:center;max-width:48rem;margin:0 auto}.fx-form-wrap{padding:3rem 2.5rem;display:flex;justify-content:center}.fx-form{width:100%;max-width:28rem;border-radius:1.25rem;padding:2.5rem}.fx-field{margin-bottom:1.25rem}.fx-label{display:block;font-size:.8125rem;font-weight:600;margin-bottom:.5rem}.fx-input{width:100%;padding:.75rem 1rem;border-radius:.625rem;font-size:.9375rem;outline:none;transition:box-shadow .15s}.fx-input:focus{box-shadow:0 0 0 3px rgba(37,99,235,.35)}.fx-btn{width:100%;padding:.875rem 1.5rem;border:none;border-radius:.625rem;font-size:.9375rem;font-weight:700;cursor:pointer;margin-top:.5rem;transition:transform .15s,opacity .15s}.fx-btn:hover{transform:translateY(-1px)}.fx-btn:disabled{opacity:.5;cursor:not-allowed}.fx-form-msg{font-size:.8125rem;padding:.5rem 0;min-height:1.5rem;text-align:center}.fx-form-err{color:#f87171}.fx-form-ok{color:#4ade80}.fx-table-wrap{overflow-x:auto;padding:0 2.5rem 4rem}.fx-table{width:100%;border-collapse:collapse;font-size:.875rem}.fx-th{text-align:left;padding:.875rem 1.25rem;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.fx-th-actions{opacity:.6}.fx-tr{transition:background .1s}.fx-td{padding:.875rem 1.25rem}.fx-td-empty{padding:2rem 1.25rem;text-align:center;opacity:.4}.fx-td-actions{white-space:nowrap;padding:.5rem 1rem!important}.fx-action-btn{border:none;cursor:pointer;font-size:.75rem;font-weight:600;padding:.3rem .75rem;border-radius:.375rem;margin-right:.375rem;font-family:inherit;transition:opacity .15s}.fx-action-btn:hover{opacity:.85}.fx-edit-btn{background:#1e40af;color:#93c5fd}.fx-delete-btn{background:#7f1d1d;color:#fca5a5}.fx-pricing{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:1.5rem;padding:2rem 2.5rem 5rem;align-items:start}.fx-pricing-card{border-radius:1.25rem;padding:2rem;position:relative;transition:transform .2s}.fx-pricing-featured{transform:scale(1.03)}.fx-pricing-badge{position:absolute;top:-12px;left:50%;transform:translateX(-50%);background:#2563eb;color:#fff;font-size:.7rem;font-weight:700;padding:.25rem .875rem;border-radius:999px;white-space:nowrap}.fx-pricing-name{font-size:.875rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;margin-bottom:.5rem;opacity:.7}.fx-pricing-price{font-size:3rem;font-weight:900;letter-spacing:-.05em;line-height:1;margin-bottom:.75rem}.fx-pricing-desc{font-size:.875rem;line-height:1.65;margin-bottom:1.5rem;opacity:.7}.fx-pricing-cta{display:block;text-align:center;padding:.75rem;border-radius:.625rem;font-weight:700;font-size:.9rem}.fx-faq{max-width:48rem;margin:0 auto}.fx-faq-item{border-radius:.75rem;margin-bottom:.625rem;cursor:pointer;overflow:hidden}.fx-faq-q{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.25rem;font-size:.9375rem;font-weight:600}.fx-faq-arrow{transition:transform .2s;font-size:.75rem;opacity:.5}.fx-faq-item.open .fx-faq-arrow{transform:rotate(90deg)}.fx-faq-a{max-height:0;overflow:hidden;padding:0 1.25rem;font-size:.875rem;line-height:1.7;transition:max-height .3s,padding .3s}.fx-faq-item.open .fx-faq-a{max-height:300px;padding:.75rem 1.25rem 1.25rem}.fx-if-wrap{display:contents}.fx-footer{padding:3rem 2.5rem;text-align:center}.fx-footer-text{font-size:.8125rem}.fx-footer-link{font-size:.8125rem;margin:0 .75rem;opacity:.5;transition:opacity .15s}.fx-footer-link:hover{opacity:1}`
1010
+ const T={dark:`body{background:#030712;color:#f1f5f9}.fx-nav{border-bottom:1px solid #1e293b;background:rgba(3,7,18,.85)}.fx-nav-link{color:#cbd5e1}.fx-sub{color:#94a3b8}.fx-cta{background:#2563eb;color:#fff;box-shadow:0 8px 24px rgba(37,99,235,.35)}.fx-stat-lbl{color:#64748b}.fx-card{background:#0f172a;border:1px solid #1e293b}.fx-card:hover{box-shadow:0 20px 40px rgba(0,0,0,.5)}.fx-card-body{color:#64748b}.fx-sect-body{color:#64748b}.fx-form{background:#0f172a;border:1px solid #1e293b}.fx-label{color:#94a3b8}.fx-input{background:#020617;border:1px solid #1e293b;color:#f1f5f9}.fx-input::placeholder{color:#334155}.fx-btn{background:#2563eb;color:#fff;box-shadow:0 4px 14px rgba(37,99,235,.4)}.fx-th{color:#475569;border-bottom:1px solid #1e293b}.fx-tr:hover{background:#0f172a}.fx-td{border-bottom:1px solid rgba(255,255,255,.03)}.fx-footer{border-top:1px solid #1e293b}.fx-footer-text{color:#334155}.fx-pricing-card{background:#0f172a;border:1px solid #1e293b}.fx-faq-item{background:#0f172a}`,light:`body{background:#fff;color:#0f172a}.fx-nav{border-bottom:1px solid #e2e8f0;background:rgba(255,255,255,.85)}.fx-cta{background:#2563eb;color:#fff}.fx-btn{background:#2563eb;color:#fff}.fx-card{background:#f8fafc;border:1px solid #e2e8f0}.fx-form{background:#f8fafc;border:1px solid #e2e8f0}.fx-input{background:#fff;border:1px solid #cbd5e1;color:#0f172a}.fx-th{color:#94a3b8;border-bottom:1px solid #e2e8f0}.fx-tr:hover{background:#f8fafc}.fx-footer{border-top:1px solid #e2e8f0}.fx-pricing-card{background:#f8fafc;border:1px solid #e2e8f0}.fx-faq-item{background:#f8fafc}`}
1011
+ return base+(T[theme]||T.dark)
1012
+ }
1013
+
1014
+ // ═══════════════════════════════════════════════════════════════
1015
+ // MAIN ENTRY POINT
1016
+ // ═══════════════════════════════════════════════════════════════
1017
+
1018
+ async function startServer(fluxFile, port = 3000) {
1019
+ const src = fs.readFileSync(fluxFile, 'utf8')
1020
+ const app = parseApp(src)
1021
+ const srv = new AiplangServer()
1022
+
1023
+ // Setup JWT
1024
+ if (app.auth) {
1025
+ JWT_SECRET = resolveEnvValue(app.auth.secret) || JWT_SECRET
1026
+ JWT_EXPIRE = app.auth.expire || '7d'
1027
+ }
1028
+
1029
+ // Setup DB
1030
+ const dbFile = app.db ? resolveEnvValue(app.db.dsn) : ':memory:'
1031
+ await getDB(dbFile === ':memory:' ? ':memory:' : dbFile)
1032
+ console.log(`[aiplang] DB: ${dbFile}`)
1033
+
1034
+ // Migrate models
1035
+ console.log(`[aiplang] Migrations:`)
1036
+ migrateModels(app.models)
1037
+
1038
+ // Register models in server
1039
+ for (const model of app.models) {
1040
+ srv.registerModel(model.name)
1041
+ }
1042
+
1043
+ // Register API routes
1044
+ for (const route of app.apis) {
1045
+ compileAPIRoute(route, app, srv)
1046
+ console.log(`[aiplang] Route: ${route.method} ${route.path}`)
1047
+ }
1048
+
1049
+ // Register frontend pages
1050
+ serveStaticFrontend(srv, app.pages)
1051
+ for (const page of app.pages) {
1052
+ console.log(`[aiplang] Page: GET ${page.route}`)
1053
+ }
1054
+
1055
+ // Health check
1056
+ srv.addRoute('GET', '/health', (req, res) => {
1057
+ res.json(200, {
1058
+ status: 'ok', version: '1.0.0',
1059
+ models: app.models.map(m => m.name),
1060
+ routes: app.apis.length, pages: app.pages.length
1061
+ })
1062
+ })
1063
+
1064
+ srv.listen(port)
1065
+ return srv
1066
+ }
1067
+
1068
+ function resolveEnvValue(val) {
1069
+ if (!val) return val
1070
+ if (val.startsWith('$')) return process.env[val.slice(1)] || val
1071
+ return val
1072
+ }
1073
+
1074
+ module.exports = { startServer, parseApp, Model, getDB }
1075
+
1076
+ // Run if called directly
1077
+ if (require.main === module) {
1078
+ const fluxFile = process.argv[2]
1079
+ const port = parseInt(process.argv[3] || process.env.PORT || '3000')
1080
+ if (!fluxFile) { console.error('Usage: node server.js <app.flux> [port]'); process.exit(1) }
1081
+ startServer(fluxFile, port).catch(e => { console.error(e); process.exit(1) })
1082
+ }