jopijs 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/README.md +134 -0
  2. package/bin/jopib.js +4 -0
  3. package/bin/jopin.js +4 -0
  4. package/dist/@bundler/_logs.d.ts +2 -0
  5. package/dist/@bundler/_logs.js +4 -0
  6. package/dist/@bundler/_logs.js.map +1 -0
  7. package/dist/@bundler/core.d.ts +1 -0
  8. package/dist/@bundler/core.js +34 -0
  9. package/dist/@bundler/core.js.map +1 -0
  10. package/dist/@bundler/esbuild.d.ts +6 -0
  11. package/dist/@bundler/esbuild.js +111 -0
  12. package/dist/@bundler/esbuild.js.map +1 -0
  13. package/dist/@bundler/index.d.ts +2 -0
  14. package/dist/@bundler/index.js +3 -0
  15. package/dist/@bundler/index.js.map +1 -0
  16. package/dist/@bundler/plugins.d.ts +13 -0
  17. package/dist/@bundler/plugins.js +145 -0
  18. package/dist/@bundler/plugins.js.map +1 -0
  19. package/dist/@bundler/tailwind.d.ts +3 -0
  20. package/dist/@bundler/tailwind.js +119 -0
  21. package/dist/@bundler/tailwind.js.map +1 -0
  22. package/dist/@core/PageComponent.d.ts +6 -0
  23. package/dist/@core/PageComponent.js +10 -0
  24. package/dist/@core/PageComponent.js.map +1 -0
  25. package/dist/@core/_logs.d.ts +7 -0
  26. package/dist/@core/_logs.js +9 -0
  27. package/dist/@core/_logs.js.map +1 -0
  28. package/dist/@core/automaticStartStop.d.ts +25 -0
  29. package/dist/@core/automaticStartStop.js +106 -0
  30. package/dist/@core/automaticStartStop.js.map +1 -0
  31. package/dist/@core/browserCacheControl.d.ts +21 -0
  32. package/dist/@core/browserCacheControl.js +17 -0
  33. package/dist/@core/browserCacheControl.js.map +1 -0
  34. package/dist/@core/bundler/bundler.d.ts +22 -0
  35. package/dist/@core/bundler/bundler.js +90 -0
  36. package/dist/@core/bundler/bundler.js.map +1 -0
  37. package/dist/@core/bundler/common.d.ts +2 -0
  38. package/dist/@core/bundler/common.js +17 -0
  39. package/dist/@core/bundler/common.js.map +1 -0
  40. package/dist/@core/bundler/config.d.ts +20 -0
  41. package/dist/@core/bundler/config.js +11 -0
  42. package/dist/@core/bundler/config.js.map +1 -0
  43. package/dist/@core/bundler/extraContent.d.ts +6 -0
  44. package/dist/@core/bundler/extraContent.js +27 -0
  45. package/dist/@core/bundler/extraContent.js.map +1 -0
  46. package/dist/@core/bundler/pagesGenerator.d.ts +1 -0
  47. package/dist/@core/bundler/pagesGenerator.js +173 -0
  48. package/dist/@core/bundler/pagesGenerator.js.map +1 -0
  49. package/dist/@core/bundler/server.d.ts +8 -0
  50. package/dist/@core/bundler/server.js +35 -0
  51. package/dist/@core/bundler/server.js.map +1 -0
  52. package/dist/@core/caches/InMemoryCache.d.ts +35 -0
  53. package/dist/@core/caches/InMemoryCache.js +353 -0
  54. package/dist/@core/caches/InMemoryCache.js.map +1 -0
  55. package/dist/@core/caches/SimpleFileCache.d.ts +18 -0
  56. package/dist/@core/caches/SimpleFileCache.js +171 -0
  57. package/dist/@core/caches/SimpleFileCache.js.map +1 -0
  58. package/dist/@core/caches/cache.d.ts +36 -0
  59. package/dist/@core/caches/cache.js +33 -0
  60. package/dist/@core/caches/cache.js.map +1 -0
  61. package/dist/@core/caches/webSiteMirrorCache.d.ts +16 -0
  62. package/dist/@core/caches/webSiteMirrorCache.js +81 -0
  63. package/dist/@core/caches/webSiteMirrorCache.js.map +1 -0
  64. package/dist/@core/gzip.d.ts +4 -0
  65. package/dist/@core/gzip.js +31 -0
  66. package/dist/@core/gzip.js.map +1 -0
  67. package/dist/@core/index.d.ts +18 -0
  68. package/dist/@core/index.js +19 -0
  69. package/dist/@core/index.js.map +1 -0
  70. package/dist/@core/internalTools.d.ts +14 -0
  71. package/dist/@core/internalTools.js +79 -0
  72. package/dist/@core/internalTools.js.map +1 -0
  73. package/dist/@core/jQuery.d.ts +5 -0
  74. package/dist/@core/jQuery.js +18 -0
  75. package/dist/@core/jQuery.js.map +1 -0
  76. package/dist/@core/jopiEasy.d.ts +287 -0
  77. package/dist/@core/jopiEasy.js +983 -0
  78. package/dist/@core/jopiEasy.js.map +1 -0
  79. package/dist/@core/jopiRequest.d.ts +269 -0
  80. package/dist/@core/jopiRequest.js +1060 -0
  81. package/dist/@core/jopiRequest.js.map +1 -0
  82. package/dist/@core/jopiServer.d.ts +77 -0
  83. package/dist/@core/jopiServer.js +100 -0
  84. package/dist/@core/jopiServer.js.map +1 -0
  85. package/dist/@core/jopiWebSite.d.ts +319 -0
  86. package/dist/@core/jopiWebSite.js +653 -0
  87. package/dist/@core/jopiWebSite.js.map +1 -0
  88. package/dist/@core/letsEncrypt.d.ts +25 -0
  89. package/dist/@core/letsEncrypt.js +189 -0
  90. package/dist/@core/letsEncrypt.js.map +1 -0
  91. package/dist/@core/linker.d.ts +4 -0
  92. package/dist/@core/linker.js +37 -0
  93. package/dist/@core/linker.js.map +1 -0
  94. package/dist/@core/loadBalancing.d.ts +18 -0
  95. package/dist/@core/loadBalancing.js +126 -0
  96. package/dist/@core/loadBalancing.js.map +1 -0
  97. package/dist/@core/middlewares/CorsMiddleware.d.ts +5 -0
  98. package/dist/@core/middlewares/CorsMiddleware.js +15 -0
  99. package/dist/@core/middlewares/CorsMiddleware.js.map +1 -0
  100. package/dist/@core/middlewares/DdosProtection.d.ts +42 -0
  101. package/dist/@core/middlewares/DdosProtection.js +62 -0
  102. package/dist/@core/middlewares/DdosProtection.js.map +1 -0
  103. package/dist/@core/middlewares/index.d.ts +10 -0
  104. package/dist/@core/middlewares/index.js +14 -0
  105. package/dist/@core/middlewares/index.js.map +1 -0
  106. package/dist/@core/publicTools.d.ts +8 -0
  107. package/dist/@core/publicTools.js +11 -0
  108. package/dist/@core/publicTools.js.map +1 -0
  109. package/dist/@core/routeConfig.d.ts +48 -0
  110. package/dist/@core/routeConfig.js +102 -0
  111. package/dist/@core/routeConfig.js.map +1 -0
  112. package/dist/@core/searchParamFilter.d.ts +70 -0
  113. package/dist/@core/searchParamFilter.js +212 -0
  114. package/dist/@core/searchParamFilter.js.map +1 -0
  115. package/dist/@core/serverFetch.d.ts +122 -0
  116. package/dist/@core/serverFetch.js +312 -0
  117. package/dist/@core/serverFetch.js.map +1 -0
  118. package/dist/@core/serverImpl/server_bunjs.d.ts +29 -0
  119. package/dist/@core/serverImpl/server_bunjs.js +180 -0
  120. package/dist/@core/serverImpl/server_bunjs.js.map +1 -0
  121. package/dist/@core/serverImpl/server_nodejs.d.ts +22 -0
  122. package/dist/@core/serverImpl/server_nodejs.js +235 -0
  123. package/dist/@core/serverImpl/server_nodejs.js.map +1 -0
  124. package/dist/@core/serverInstanceBuilder.d.ts +17 -0
  125. package/dist/@core/serverInstanceBuilder.js +14 -0
  126. package/dist/@core/serverInstanceBuilder.js.map +1 -0
  127. package/dist/@core/userStores.d.ts +13 -0
  128. package/dist/@core/userStores.js +20 -0
  129. package/dist/@core/userStores.js.map +1 -0
  130. package/dist/@crawler/common.d.ts +203 -0
  131. package/dist/@crawler/common.js +68 -0
  132. package/dist/@crawler/common.js.map +1 -0
  133. package/dist/@crawler/core.d.ts +87 -0
  134. package/dist/@crawler/core.js +586 -0
  135. package/dist/@crawler/core.js.map +1 -0
  136. package/dist/@crawler/directFileCache.d.ts +10 -0
  137. package/dist/@crawler/directFileCache.js +60 -0
  138. package/dist/@crawler/directFileCache.js.map +1 -0
  139. package/dist/@crawler/index.d.ts +4 -0
  140. package/dist/@crawler/index.js +5 -0
  141. package/dist/@crawler/index.js.map +1 -0
  142. package/dist/@crawler/urlMapping.d.ts +21 -0
  143. package/dist/@crawler/urlMapping.js +52 -0
  144. package/dist/@crawler/urlMapping.js.map +1 -0
  145. package/dist/@crawler/utils.d.ts +6 -0
  146. package/dist/@crawler/utils.js +13 -0
  147. package/dist/@crawler/utils.js.map +1 -0
  148. package/dist/@generated/index.d.ts +29 -0
  149. package/dist/@generated/index.js +93 -0
  150. package/dist/@generated/index.js.map +1 -0
  151. package/dist/@linker/arobaseTypes.d.ts +50 -0
  152. package/dist/@linker/arobaseTypes.js +235 -0
  153. package/dist/@linker/arobaseTypes.js.map +1 -0
  154. package/dist/@linker/changeProof.d.ts +5 -0
  155. package/dist/@linker/changeProof.js +50 -0
  156. package/dist/@linker/changeProof.js.map +1 -0
  157. package/dist/@linker/config.d.ts +2 -0
  158. package/dist/@linker/config.js +40 -0
  159. package/dist/@linker/config.js.map +1 -0
  160. package/dist/@linker/engine.d.ts +156 -0
  161. package/dist/@linker/engine.js +665 -0
  162. package/dist/@linker/engine.js.map +1 -0
  163. package/dist/@linker/index.d.ts +3 -0
  164. package/dist/@linker/index.js +4 -0
  165. package/dist/@linker/index.js.map +1 -0
  166. package/dist/@linker/install.d.ts +4 -0
  167. package/dist/@linker/install.js +42 -0
  168. package/dist/@linker/install.js.map +1 -0
  169. package/dist/@linker/modInstaller.d.ts +10 -0
  170. package/dist/@linker/modInstaller.js +38 -0
  171. package/dist/@linker/modInstaller.js.map +1 -0
  172. package/dist/@linker/typeEvents.d.ts +9 -0
  173. package/dist/@linker/typeEvents.js +48 -0
  174. package/dist/@linker/typeEvents.js.map +1 -0
  175. package/dist/@linker/typeRoutes.d.ts +23 -0
  176. package/dist/@linker/typeRoutes.js +197 -0
  177. package/dist/@linker/typeRoutes.js.map +1 -0
  178. package/dist/@linker/typeUiComposite.d.ts +6 -0
  179. package/dist/@linker/typeUiComposite.js +16 -0
  180. package/dist/@linker/typeUiComposite.js.map +1 -0
  181. package/dist/@loader/index.d.ts +1 -0
  182. package/dist/@loader/index.js +17 -0
  183. package/dist/@loader/index.js.map +1 -0
  184. package/dist/@loader/nodeJsLoader.d.ts +2 -0
  185. package/dist/@loader/nodeJsLoader.js +19 -0
  186. package/dist/@loader/nodeJsLoader.js.map +1 -0
  187. package/dist/@loader-client/index.d.ts +33 -0
  188. package/dist/@loader-client/index.js +98 -0
  189. package/dist/@loader-client/index.js.map +1 -0
  190. package/dist/@loader-tools/bunJsLoader.d.ts +1 -0
  191. package/dist/@loader-tools/bunJsLoader.js +28 -0
  192. package/dist/@loader-tools/bunJsLoader.js.map +1 -0
  193. package/dist/@loader-tools/config.d.ts +49 -0
  194. package/dist/@loader-tools/config.js +79 -0
  195. package/dist/@loader-tools/config.js.map +1 -0
  196. package/dist/@loader-tools/cssModuleCompiler.d.ts +5 -0
  197. package/dist/@loader-tools/cssModuleCompiler.js +65 -0
  198. package/dist/@loader-tools/cssModuleCompiler.js.map +1 -0
  199. package/dist/@loader-tools/esBuildPlugin.d.ts +5 -0
  200. package/dist/@loader-tools/esBuildPlugin.js +113 -0
  201. package/dist/@loader-tools/esBuildPlugin.js.map +1 -0
  202. package/dist/@loader-tools/index.d.ts +9 -0
  203. package/dist/@loader-tools/index.js +10 -0
  204. package/dist/@loader-tools/index.js.map +1 -0
  205. package/dist/@loader-tools/jopin.d.ts +10 -0
  206. package/dist/@loader-tools/jopin.js +331 -0
  207. package/dist/@loader-tools/jopin.js.map +1 -0
  208. package/dist/@loader-tools/nodeJsLoader.d.ts +13 -0
  209. package/dist/@loader-tools/nodeJsLoader.js +101 -0
  210. package/dist/@loader-tools/nodeJsLoader.js.map +1 -0
  211. package/dist/@loader-tools/nodeJsResolver.d.ts +2 -0
  212. package/dist/@loader-tools/nodeJsResolver.js +117 -0
  213. package/dist/@loader-tools/nodeJsResolver.js.map +1 -0
  214. package/dist/@loader-tools/rules.d.ts +3 -0
  215. package/dist/@loader-tools/rules.js +33 -0
  216. package/dist/@loader-tools/rules.js.map +1 -0
  217. package/dist/@loader-tools/sourceChangesWatcher.d.ts +39 -0
  218. package/dist/@loader-tools/sourceChangesWatcher.js +182 -0
  219. package/dist/@loader-tools/sourceChangesWatcher.js.map +1 -0
  220. package/dist/@loader-tools/tools.d.ts +21 -0
  221. package/dist/@loader-tools/tools.js +113 -0
  222. package/dist/@loader-tools/tools.js.map +1 -0
  223. package/dist/@loader-tools/transform.d.ts +5 -0
  224. package/dist/@loader-tools/transform.js +114 -0
  225. package/dist/@loader-tools/transform.js.map +1 -0
  226. package/dist/@loader-tools/virtualUrl.d.ts +9 -0
  227. package/dist/@loader-tools/virtualUrl.js +40 -0
  228. package/dist/@loader-tools/virtualUrl.js.map +1 -0
  229. package/dist/@tool-jopinb/index.d.ts +1 -0
  230. package/dist/@tool-jopinb/index.js +9 -0
  231. package/dist/@tool-jopinb/index.js.map +1 -0
  232. package/dist/@ui/components.d.ts +27 -0
  233. package/dist/@ui/components.js +42 -0
  234. package/dist/@ui/components.js.map +1 -0
  235. package/dist/@ui/cssModules.d.ts +11 -0
  236. package/dist/@ui/cssModules.js +17 -0
  237. package/dist/@ui/cssModules.js.map +1 -0
  238. package/dist/@ui/hooks.d.ts +31 -0
  239. package/dist/@ui/hooks.js +71 -0
  240. package/dist/@ui/hooks.js.map +1 -0
  241. package/dist/@ui/index.d.ts +9 -0
  242. package/dist/@ui/index.js +11 -0
  243. package/dist/@ui/index.js.map +1 -0
  244. package/dist/@ui/internal.d.ts +4 -0
  245. package/dist/@ui/internal.js +10 -0
  246. package/dist/@ui/internal.js.map +1 -0
  247. package/dist/@ui/modules.d.ts +41 -0
  248. package/dist/@ui/modules.js +74 -0
  249. package/dist/@ui/modules.js.map +1 -0
  250. package/dist/@ui/objectRegistry.d.ts +12 -0
  251. package/dist/@ui/objectRegistry.js +35 -0
  252. package/dist/@ui/objectRegistry.js.map +1 -0
  253. package/dist/@ui/pageController.d.ts +61 -0
  254. package/dist/@ui/pageController.js +166 -0
  255. package/dist/@ui/pageController.js.map +1 -0
  256. package/dist/@ui/tools.d.ts +24 -0
  257. package/dist/@ui/tools.js +78 -0
  258. package/dist/@ui/tools.js.map +1 -0
  259. package/dist/@uikit/core/UiKitModule.d.ts +6 -0
  260. package/dist/@uikit/core/UiKitModule.js +18 -0
  261. package/dist/@uikit/core/UiKitModule.js.map +1 -0
  262. package/dist/@uikit/core/index.d.ts +1 -0
  263. package/dist/@uikit/core/index.js +4 -0
  264. package/dist/@uikit/core/index.js.map +1 -0
  265. package/dist/@uikit/core/jBundler_ifBrowser.d.ts +1 -0
  266. package/dist/@uikit/core/jBundler_ifBrowser.js +5 -0
  267. package/dist/@uikit/core/jBundler_ifBrowser.js.map +1 -0
  268. package/dist/@uikit/core/jBundler_ifServer.d.ts +6 -0
  269. package/dist/@uikit/core/jBundler_ifServer.js +17 -0
  270. package/dist/@uikit/core/jBundler_ifServer.js.map +1 -0
  271. package/dist/@uikit/forms/components.d.ts +18 -0
  272. package/dist/@uikit/forms/components.js +69 -0
  273. package/dist/@uikit/forms/components.js.map +1 -0
  274. package/dist/@uikit/forms/hooks.d.ts +4 -0
  275. package/dist/@uikit/forms/hooks.js +31 -0
  276. package/dist/@uikit/forms/hooks.js.map +1 -0
  277. package/dist/@uikit/forms/index.d.ts +3 -0
  278. package/dist/@uikit/forms/index.js +4 -0
  279. package/dist/@uikit/forms/index.js.map +1 -0
  280. package/dist/@uikit/forms/interfaces.d.ts +101 -0
  281. package/dist/@uikit/forms/interfaces.js +4 -0
  282. package/dist/@uikit/forms/interfaces.js.map +1 -0
  283. package/dist/@uikit/forms/private.d.ts +40 -0
  284. package/dist/@uikit/forms/private.js +307 -0
  285. package/dist/@uikit/forms/private.js.map +1 -0
  286. package/dist/@uikit/helpers/hooks.d.ts +33 -0
  287. package/dist/@uikit/helpers/hooks.js +107 -0
  288. package/dist/@uikit/helpers/hooks.js.map +1 -0
  289. package/dist/@uikit/helpers/index.d.ts +2 -0
  290. package/dist/@uikit/helpers/index.js +3 -0
  291. package/dist/@uikit/helpers/index.js.map +1 -0
  292. package/dist/@uikit/helpers/tools.d.ts +8 -0
  293. package/dist/@uikit/helpers/tools.js +35 -0
  294. package/dist/@uikit/helpers/tools.js.map +1 -0
  295. package/dist/@uikit/index.d.ts +10 -0
  296. package/dist/@uikit/index.js +13 -0
  297. package/dist/@uikit/index.js.map +1 -0
  298. package/dist/@uikit/menu/core.d.ts +21 -0
  299. package/dist/@uikit/menu/core.js +191 -0
  300. package/dist/@uikit/menu/core.js.map +1 -0
  301. package/dist/@uikit/menu/hooks.d.ts +5 -0
  302. package/dist/@uikit/menu/hooks.js +24 -0
  303. package/dist/@uikit/menu/hooks.js.map +1 -0
  304. package/dist/@uikit/menu/index.d.ts +3 -0
  305. package/dist/@uikit/menu/index.js +4 -0
  306. package/dist/@uikit/menu/index.js.map +1 -0
  307. package/dist/@uikit/menu/interfaces.d.ts +20 -0
  308. package/dist/@uikit/menu/interfaces.js +8 -0
  309. package/dist/@uikit/menu/interfaces.js.map +1 -0
  310. package/dist/@uikit/menu/internal.d.ts +40 -0
  311. package/dist/@uikit/menu/internal.js +191 -0
  312. package/dist/@uikit/menu/internal.js.map +1 -0
  313. package/dist/@uikit/reactRouter/hooks/jBundler_ifBrowser.d.ts +18 -0
  314. package/dist/@uikit/reactRouter/hooks/jBundler_ifBrowser.js +40 -0
  315. package/dist/@uikit/reactRouter/hooks/jBundler_ifBrowser.js.map +1 -0
  316. package/dist/@uikit/reactRouter/hooks/jBundler_ifServer.d.ts +28 -0
  317. package/dist/@uikit/reactRouter/hooks/jBundler_ifServer.js +35 -0
  318. package/dist/@uikit/reactRouter/hooks/jBundler_ifServer.js.map +1 -0
  319. package/dist/@uikit/reactRouter/index.d.ts +1 -0
  320. package/dist/@uikit/reactRouter/index.js +2 -0
  321. package/dist/@uikit/reactRouter/index.js.map +1 -0
  322. package/dist/@uikit/users/hooks.d.ts +10 -0
  323. package/dist/@uikit/users/hooks.js +39 -0
  324. package/dist/@uikit/users/hooks.js.map +1 -0
  325. package/dist/@uikit/users/index.d.ts +1 -0
  326. package/dist/@uikit/users/index.js +2 -0
  327. package/dist/@uikit/users/index.js.map +1 -0
  328. package/dist/@uikit/variants/index.d.ts +7 -0
  329. package/dist/@uikit/variants/index.js +16 -0
  330. package/dist/@uikit/variants/index.js.map +1 -0
  331. package/package.json +115 -0
  332. package/src/@bundler/README.md +1 -0
  333. package/src/@bundler/_logs.ts +4 -0
  334. package/src/@bundler/core.ts +41 -0
  335. package/src/@bundler/esbuild.ts +141 -0
  336. package/src/@bundler/index.ts +3 -0
  337. package/src/@bundler/plugins.ts +163 -0
  338. package/src/@bundler/tailwind.ts +139 -0
  339. package/src/@core/PageComponent.tsx +25 -0
  340. package/src/@core/README.md +1 -0
  341. package/src/@core/_logs.ts +11 -0
  342. package/src/@core/automaticStartStop.ts +132 -0
  343. package/src/@core/browserCacheControl.ts +40 -0
  344. package/src/@core/bundler/bundler.ts +128 -0
  345. package/src/@core/bundler/common.ts +18 -0
  346. package/src/@core/bundler/config.ts +37 -0
  347. package/src/@core/bundler/extraContent.ts +30 -0
  348. package/src/@core/bundler/pagesGenerator.ts +194 -0
  349. package/src/@core/bundler/server.ts +41 -0
  350. package/src/@core/caches/InMemoryCache.ts +483 -0
  351. package/src/@core/caches/SimpleFileCache.ts +205 -0
  352. package/src/@core/caches/cache.ts +77 -0
  353. package/src/@core/caches/webSiteMirrorCache.ts +90 -0
  354. package/src/@core/cheerio.d.ts +332 -0
  355. package/src/@core/gzip.ts +33 -0
  356. package/src/@core/index.ts +23 -0
  357. package/src/@core/internalTools.ts +95 -0
  358. package/src/@core/jQuery.ts +22 -0
  359. package/src/@core/jopiEasy.ts +1285 -0
  360. package/src/@core/jopiRequest.tsx +1279 -0
  361. package/src/@core/jopiServer.ts +188 -0
  362. package/src/@core/jopiWebSite.tsx +1027 -0
  363. package/src/@core/letsEncrypt.ts +243 -0
  364. package/src/@core/linker.ts +42 -0
  365. package/src/@core/loadBalancing.ts +152 -0
  366. package/src/@core/middlewares/CorsMiddleware.ts +23 -0
  367. package/src/@core/middlewares/DdosProtection.ts +120 -0
  368. package/src/@core/middlewares/index.ts +16 -0
  369. package/src/@core/publicTools.ts +14 -0
  370. package/src/@core/routeConfig.ts +104 -0
  371. package/src/@core/searchParamFilter.ts +315 -0
  372. package/src/@core/serverFetch.ts +454 -0
  373. package/src/@core/serverImpl/server_bunjs.tsx +230 -0
  374. package/src/@core/serverImpl/server_nodejs.ts +312 -0
  375. package/src/@core/serverInstanceBuilder.ts +36 -0
  376. package/src/@core/userStores.ts +34 -0
  377. package/src/@crawler/README.md +1 -0
  378. package/src/@crawler/common.ts +275 -0
  379. package/src/@crawler/core.ts +678 -0
  380. package/src/@crawler/directFileCache.ts +69 -0
  381. package/src/@crawler/index.ts +4 -0
  382. package/src/@crawler/urlMapping.ts +67 -0
  383. package/src/@crawler/utils.ts +13 -0
  384. package/src/@generated/index.ts +134 -0
  385. package/src/@linker/arobaseTypes.ts +325 -0
  386. package/src/@linker/changeProof.ts +53 -0
  387. package/src/@linker/config.ts +46 -0
  388. package/src/@linker/engine.ts +865 -0
  389. package/src/@linker/index.ts +3 -0
  390. package/src/@linker/install.ts +39 -0
  391. package/src/@linker/modInstaller.ts +50 -0
  392. package/src/@linker/typeEvents.ts +58 -0
  393. package/src/@linker/typeRoutes.ts +255 -0
  394. package/src/@linker/typeUiComposite.ts +19 -0
  395. package/src/@loader/README.md +4 -0
  396. package/src/@loader/bunHtmlCompiler.mjs +27 -0
  397. package/src/@loader/index.ts +19 -0
  398. package/src/@loader/loader.mjs +7 -0
  399. package/src/@loader/nodeJsLoader.ts +21 -0
  400. package/src/@loader-client/README.md +2 -0
  401. package/src/@loader-client/index.ts +108 -0
  402. package/src/@loader-tools/README.md +6 -0
  403. package/src/@loader-tools/bunJsLoader.ts +33 -0
  404. package/src/@loader-tools/config.ts +142 -0
  405. package/src/@loader-tools/cssModuleCompiler.ts +76 -0
  406. package/src/@loader-tools/esBuildPlugin.ts +142 -0
  407. package/src/@loader-tools/index.ts +11 -0
  408. package/src/@loader-tools/jopin.ts +403 -0
  409. package/src/@loader-tools/nodeJsLoader.ts +119 -0
  410. package/src/@loader-tools/nodeJsResolver.ts +140 -0
  411. package/src/@loader-tools/rules.ts +45 -0
  412. package/src/@loader-tools/sourceChangesWatcher.ts +225 -0
  413. package/src/@loader-tools/tools.ts +139 -0
  414. package/src/@loader-tools/transform.ts +138 -0
  415. package/src/@loader-tools/virtualUrl.ts +57 -0
  416. package/src/@loader-types/README.md +15 -0
  417. package/src/@loader-types/extensions.d.ts +65 -0
  418. package/src/@tool-jopinb/README.md +1 -0
  419. package/src/@tool-jopinb/index.ts +11 -0
  420. package/src/@ui/README.md +3 -0
  421. package/src/@ui/components.tsx +49 -0
  422. package/src/@ui/cssModules.tsx +27 -0
  423. package/src/@ui/hooks.tsx +95 -0
  424. package/src/@ui/index.ts +13 -0
  425. package/src/@ui/internal.ts +12 -0
  426. package/src/@ui/modules.ts +100 -0
  427. package/src/@ui/objectRegistry.ts +50 -0
  428. package/src/@ui/pageController.ts +203 -0
  429. package/src/@ui/tools.ts +116 -0
  430. package/src/@uikit/README.md +1 -0
  431. package/src/@uikit/core/UiKitModule.ts +20 -0
  432. package/src/@uikit/core/index.ts +4 -0
  433. package/src/@uikit/core/jBundler_ifBrowser.ts +4 -0
  434. package/src/@uikit/core/jBundler_ifServer.ts +18 -0
  435. package/src/@uikit/forms/components.tsx +97 -0
  436. package/src/@uikit/forms/hooks.ts +38 -0
  437. package/src/@uikit/forms/index.ts +3 -0
  438. package/src/@uikit/forms/interfaces.ts +159 -0
  439. package/src/@uikit/forms/private.ts +365 -0
  440. package/src/@uikit/helpers/hooks.ts +133 -0
  441. package/src/@uikit/helpers/index.ts +2 -0
  442. package/src/@uikit/helpers/tools.ts +39 -0
  443. package/src/@uikit/index.ts +15 -0
  444. package/src/@uikit/menu/core.ts +227 -0
  445. package/src/@uikit/menu/hooks.ts +28 -0
  446. package/src/@uikit/menu/index.ts +3 -0
  447. package/src/@uikit/menu/interfaces.ts +26 -0
  448. package/src/@uikit/menu/internal.ts +218 -0
  449. package/src/@uikit/package.json +15 -0
  450. package/src/@uikit/reactRouter/hooks/jBundler_ifBrowser.tsx +59 -0
  451. package/src/@uikit/reactRouter/hooks/jBundler_ifServer.tsx +51 -0
  452. package/src/@uikit/reactRouter/index.ts +1 -0
  453. package/src/@uikit/users/hooks.ts +50 -0
  454. package/src/@uikit/users/index.ts +1 -0
  455. package/src/@uikit/variants/index.tsx +20 -0
@@ -0,0 +1,1285 @@
1
+ // noinspection JSUnusedGlobalSymbols
2
+
3
+ import path from "node:path";
4
+ import fsc from "node:fs";
5
+ import * as jk_app from "jopi-toolkit/jk_app";
6
+ import * as jk_timer from "jopi-toolkit/jk_timer";
7
+ import * as jk_term from "jopi-toolkit/jk_term";
8
+ import * as jk_events from "jopi-toolkit/jk_events";
9
+
10
+ import type {Config as TailwindConfig} from 'tailwindcss';
11
+ import {type FetchOptions, type ServerDownResult, ServerFetch, type ServerFetchOptions} from "./serverFetch.ts";
12
+ import {getLetsEncryptCertificate, type LetsEncryptParams, type OnTimeoutError} from "./letsEncrypt.ts";
13
+ import {type UserInfos_WithLoginPassword, UserStore_WithLoginPassword} from "./userStores.ts";
14
+ import {getBundlerConfig, type PostCssInitializer} from "./bundler/config.ts";
15
+ import {serverInitChronos} from "./internalTools.ts";
16
+ import {getInMemoryCache, initMemoryCache, type InMemoryCacheOptions} from "./caches/InMemoryCache.ts";
17
+ import {SimpleFileCache} from "./caches/SimpleFileCache.ts";
18
+ import {
19
+ type CrawlerCanIgnoreIfAlreadyCrawled,
20
+ ProcessUrlResult,
21
+ type UrlProcessedInfos,
22
+ WebSiteCrawler,
23
+ type WebSiteCrawlerOptions
24
+ } from "jopijs/crawler";
25
+ import {type FakeNoUserListener, JopiRequest} from "./jopiRequest.ts";
26
+ import {
27
+ type UserAuthentificationFunction, type CacheRules, type HttpMethod, type JopiMiddleware, type JopiPostMiddleware,
28
+ type JopiRouteHandler, type MiddlewareOptions,
29
+ type UserInfos,
30
+ type WebSite,
31
+ WebSiteImpl,
32
+ WebSiteOptions
33
+ } from "./jopiWebSite.tsx";
34
+ import type {PageCache} from "./caches/cache.ts";
35
+ import {getServer, type SseEvent} from "./jopiServer.ts";
36
+ import {HTTP_VERBS} from "./publicTools.ts";
37
+ import {getPackageJsonConfig} from "jopijs/loader-tools";
38
+ import {initLinker} from "./linker.ts";
39
+ import {logServer_startApp} from "./_logs.ts";
40
+
41
+ serverInitChronos.start("jopiEasy lib");
42
+
43
+ class JopiApp {
44
+ private _isStartAppSet: boolean = false;
45
+
46
+ startApp(importMeta: any, f: (jopiEasy: JopiEasy) => void|Promise<void>): void {
47
+ async function doStart() {
48
+ await jk_app.waitServerSideReady();
49
+ await jk_app.declareAppStarted();
50
+
51
+ let res = f(new JopiEasy());
52
+ if (res instanceof Promise) await res;
53
+ }
54
+
55
+ if (this._isStartAppSet) throw "App is already started";
56
+ this._isStartAppSet = true;
57
+
58
+ const logEnd = logServer_startApp.beginInfo("Starting Application");
59
+ jk_app.setApplicationMainFile(importMeta.filename);
60
+ doStart().then(logEnd);
61
+ }
62
+ }
63
+
64
+ let gWebSiteCreated = false;
65
+
66
+ export class JopiEasy {
67
+ private getDefaultUrl(): string {
68
+ let config = getPackageJsonConfig();
69
+
70
+ if (config.webSiteListeningUrl) return config.webSiteListeningUrl;
71
+ if (config.webSiteUrl) return config.webSiteUrl;
72
+
73
+ throw new Error("Invalid package.json configuration. 'jopi.webSiteUrl' or 'jopi.webSiteListeningUrl' must be set");
74
+ }
75
+
76
+ create_creatWebSiteServer(url?: string, ref?: RefFor_WebSite): JopiEasyWebSite {
77
+ if (gWebSiteCreated) throw new Error("WebSite already created");
78
+ gWebSiteCreated = true;
79
+
80
+ if (!url) {
81
+ url = this.getDefaultUrl();
82
+ }
83
+
84
+ const res = new JopiEasyWebSite_ExposePrivate(url);
85
+ if (ref) ref.webSite = res;
86
+ return res;
87
+ }
88
+
89
+ create_webSiteDownloader(urlOrigin?: string|undefined): CrawlerDownloader {
90
+ if (gWebSiteCreated) throw new Error("WebSite already created");
91
+ gWebSiteCreated = true;
92
+
93
+ if (!urlOrigin) {
94
+ urlOrigin = this.getDefaultUrl();
95
+ }
96
+
97
+ return new CrawlerDownloader(urlOrigin);
98
+ }
99
+ }
100
+
101
+ export class RefFor_WebSite {
102
+ webSite?: JopiEasyWebSite;
103
+
104
+ waitWebSiteReady(): Promise<void> {
105
+ if (!this.webSite) return Promise.reject("website not set");
106
+
107
+ return new Promise<void>((resolve) => {
108
+ this.webSite?.on_webSiteReady(resolve);
109
+ });
110
+ }
111
+ }
112
+
113
+ export const jopiApp = new JopiApp();
114
+
115
+ //region Crawler
116
+
117
+ class CrawlerDownloader {
118
+ private readonly _options: WebSiteCrawlerOptions = {};
119
+ private _outputDir: string = "www-out";
120
+ private _startUrl?: string;
121
+ private readonly _urlPrefix: string;
122
+ private _ignoreIfAlreadyDownloaded?: boolean;
123
+ private _onUrlProcessed?: (infos: UrlProcessedInfos)=>void;
124
+ private _filter_canIgnoreIfAlreadyCrawled?: (url: string, infos: CrawlerCanIgnoreIfAlreadyCrawled) => boolean;
125
+
126
+
127
+ constructor(private readonly urlOrigin: string) {
128
+ const urlInfos = new URL(urlOrigin);
129
+ this._urlPrefix = urlInfos.origin;
130
+ this._outputDir = path.resolve(process.cwd(), "www_" + urlInfos.hostname);
131
+ }
132
+
133
+ /**
134
+ * Define the directory where files will be downloaded.
135
+ * If not set, that it takes the current url and the hostname.
136
+ */
137
+ set_outputDir(outputDir: string){
138
+ this._outputDir = outputDir;
139
+ return this;
140
+ }
141
+
142
+ /**
143
+ * Define the start point url.
144
+ * If not set, the default is "/".
145
+ * @param url
146
+ */
147
+ set_startUrl(url: string) {
148
+ this._startUrl = this.normalizeUrl(url);
149
+ return this;
150
+ }
151
+
152
+ private normalizeUrl(url: string): string {
153
+ if (url.startsWith(this._urlPrefix)) {
154
+ return url.substring(this._urlPrefix.length);
155
+ }
156
+
157
+ return url;
158
+ }
159
+
160
+ /**
161
+ * Add url with must be crawled.
162
+ * Is required if these urls aren't reachable from the start point.
163
+ */
164
+ set_extraUrls(urlList: string[]) {
165
+ urlList = urlList.map(u => this.normalizeUrl(u));
166
+ this._options.scanThisUrls = [...new Set([...this._options.scanThisUrls||[], ...urlList])];
167
+ return this;
168
+ }
169
+
170
+ /**
171
+ * Allow avoiding downloading again a resource if already in cache.
172
+ * @param value
173
+ */
174
+ setOption_ignoreIfAlreadyDownloaded(value = true) {
175
+ this._ignoreIfAlreadyDownloaded = value;
176
+ return this;
177
+ }
178
+
179
+ /**
180
+ * Set a function which is called when a URL has been processed.
181
+ *
182
+ * @param listener - A function that received information about the URL and his processing state.
183
+ */
184
+ on_urlProcessed(listener: (infos: UrlProcessedInfos) => void) {
185
+ this._onUrlProcessed = listener;
186
+ return this;
187
+ }
188
+
189
+ /**
190
+ * Sets a filter function to determine whether a URL can be downloaded.
191
+ *
192
+ * @param filter - A function that takes the URL as a string and a boolean flag
193
+ * indicating if it is a resource, and returns a boolean indicating
194
+ * whether the URL can be downloaded.
195
+ *
196
+ * Returns true if the url can be processed.
197
+ */
198
+ setFilter_canProcessThisUrl(filter: (url: string, isResource: boolean)=>boolean) {
199
+ this._options.canDownload = filter;
200
+ return this;
201
+ }
202
+
203
+ setFilter_canIgnoreIfAlreadyDownloaded(filter: (url: string, infos: CrawlerCanIgnoreIfAlreadyCrawled)=>boolean) {
204
+ if (this._ignoreIfAlreadyDownloaded===undefined) {
205
+ this._ignoreIfAlreadyDownloaded = true;
206
+ }
207
+
208
+ this._filter_canIgnoreIfAlreadyCrawled = filter;
209
+ return this;
210
+ }
211
+
212
+ async START_DOWNLOAD(): Promise<void> {
213
+ const downloader = this;
214
+
215
+ const crawler = new WebSiteCrawler(this.urlOrigin, {
216
+ outputDir: this._outputDir,
217
+
218
+ onUrlProcessed(infos) {
219
+ switch (infos.state) {
220
+ case ProcessUrlResult.IGNORED:
221
+ console.log("👎 Website downloader, url IGNORED:", infos.sourceUrl);
222
+ break;
223
+
224
+ case ProcessUrlResult.ERROR:
225
+ console.log("❌ Website downloader, url ERROR:", infos.sourceUrl);
226
+ break;
227
+
228
+ case ProcessUrlResult.OK:
229
+ console.log("✅ Website downloader, url DOWNLOADED:", infos.sourceUrl);
230
+ break;
231
+
232
+ case ProcessUrlResult.REDIRECTED:
233
+ console.log("🚫 Website downloader, url REDIRECTED:", infos.sourceUrl);
234
+ break;
235
+ }
236
+
237
+ if (downloader._onUrlProcessed) {
238
+ downloader._onUrlProcessed(infos);
239
+ }
240
+ },
241
+
242
+ canIgnoreIfAlreadyCrawled(url, infos) {
243
+ if (!downloader._ignoreIfAlreadyDownloaded) return false;
244
+
245
+ if (downloader._filter_canIgnoreIfAlreadyCrawled) {
246
+ return downloader._filter_canIgnoreIfAlreadyCrawled(url, infos)
247
+ }
248
+
249
+ return true;
250
+ },
251
+
252
+ ... this._options
253
+ });
254
+
255
+ console.log("Downloading website", this.urlOrigin)
256
+ await crawler.start(this._startUrl);
257
+ console.log("Download finished for", this.urlOrigin)
258
+ }
259
+ }
260
+
261
+ //endregion
262
+
263
+ //region CreateServerFetch
264
+
265
+ class CreateServerFetch<T, R extends CreateServerFetch_NextStep<T>> {
266
+ protected options?: ServerFetchOptions<T>;
267
+
268
+ protected createNextStep(options: ServerFetchOptions<T>): R {
269
+ return new CreateServerFetch_NextStep(options) as R;
270
+ }
271
+
272
+ /**
273
+ * The server will be call with his IP and not his hostname
274
+ * which will only be set in the headers. It's required when
275
+ * the DNS doesn't pinpoint to the god server.
276
+ */
277
+ useIp(serverOrigin: string, ip: string, options?: ServerFetchOptions<T>): R {
278
+ let rOptions = ServerFetch.getOptionsFor_useIP<T>(serverOrigin, ip, options);
279
+ this.options = rOptions;
280
+ return this.createNextStep(rOptions);
281
+ }
282
+
283
+ useOrigin(serverOrigin: string, options?: ServerFetchOptions<T>): R {
284
+ let rOptions = ServerFetch.getOptionsFor_useOrigin<T>(serverOrigin, options);
285
+ this.options = rOptions;
286
+ return this.createNextStep(rOptions);
287
+ }
288
+ }
289
+
290
+ class CreateServerFetch_NextStep<T> {
291
+ constructor(protected options: ServerFetchOptions<T>) {
292
+ }
293
+
294
+ set_weight(weight: number): this {
295
+ this.options.weight = weight;
296
+ return this;
297
+ }
298
+
299
+ set_isMainServer(): this {
300
+ return this.set_weight(1);
301
+ }
302
+
303
+ set_isBackupServer(): this {
304
+ return this.set_weight(0);
305
+ }
306
+
307
+ on_beforeRequesting(handler: (url: string, fetchOptions: FetchOptions, data: T)=>void|Promise<void>): this {
308
+ this.options.beforeRequesting = handler;
309
+ return this;
310
+ }
311
+
312
+ on_ifServerIsDown(handler: (builder: IfServerDownBuilder<T>)=>void|Promise<void>): this {
313
+ this.options.ifServerIsDown = async (_fetcher, data) => {
314
+ const {builder, getResult} = IfServerDownBuilder.newBuilder<T>(data);
315
+
316
+ let r = handler(builder);
317
+ if (r instanceof Promise) await r;
318
+
319
+ let options = getResult();
320
+
321
+ if (options) {
322
+ const res: ServerDownResult<T> = {
323
+ newServer: ServerFetch.useAsIs(options),
324
+ newServerWeight: options?.weight
325
+ }
326
+
327
+ return res;
328
+ }
329
+
330
+ return undefined;
331
+ }
332
+
333
+ return this;
334
+ }
335
+
336
+ do_startServer(handler: () => Promise<number>): this {
337
+ this.options.doStartServer = handler;
338
+ return this;
339
+ }
340
+
341
+ do_stopServer(handler: () => Promise<void>): this {
342
+ this.options.doStopServer = handler;
343
+ return this;
344
+ }
345
+ }
346
+
347
+ class IfServerDownBuilder<T> extends CreateServerFetch<T, CreateServerFetch_NextStep<T>> {
348
+ constructor(public readonly data: T) {
349
+ super();
350
+ }
351
+
352
+ static newBuilder<T>(data: T) {
353
+ const b = new IfServerDownBuilder<T>(data);
354
+ return {builder: b, getResult: () => b.options};
355
+ }
356
+ }
357
+
358
+ //endregion
359
+
360
+ //region WebSite
361
+
362
+ export interface FileServerOptions {
363
+ rootDir: string;
364
+ replaceIndexHtml: boolean,
365
+ onNotFound: (req: JopiRequest) => Response|Promise<Response>
366
+ }
367
+
368
+ export class JopiEasyWebSite {
369
+ protected readonly origin: string;
370
+ protected readonly hostName: string;
371
+ private webSite?: WebSiteImpl;
372
+ protected readonly options: WebSiteOptions = {};
373
+
374
+ protected readonly afterHook: ((webSite: WebSite)=>(Promise<void>))[] = [];
375
+ protected readonly beforeHook: (()=>Promise<void>)[] = [];
376
+
377
+ protected readonly internals: WebSiteInternal;
378
+ protected _isWebSiteReady: boolean = false;
379
+
380
+ protected fileServerOptions: FileServerOptions;
381
+
382
+ public readonly events = jk_events.defaultEventGroup;
383
+
384
+ constructor(url: string) {
385
+ setTimeout(async () => {
386
+ await this.initWebSiteInstance();
387
+ }, 1);
388
+
389
+ const urlInfos = new URL(url);
390
+ this.hostName = urlInfos.hostname; // 127.0.0.1
391
+ this.origin = urlInfos.origin; // https://127.0.0.1
392
+
393
+ this.internals = {
394
+ options: this.options,
395
+ origin: this.origin,
396
+ hostName: this.hostName,
397
+ afterHook: this.afterHook,
398
+ beforeHook: this.beforeHook
399
+ };
400
+
401
+ this.options.onWebSiteReady = [() => {
402
+ this._isWebSiteReady = true;
403
+ }];
404
+
405
+ if (this.origin.startsWith("https://")) {
406
+ this.internals.beforeHook.push(async () => {
407
+ if (!gIsSslCertificateDefined) {
408
+ this.internals.options.certificate = useCertificateStore("certs", this.hostName);
409
+ }
410
+ })
411
+ }
412
+
413
+ this.fileServerOptions = {
414
+ rootDir: "public",
415
+ replaceIndexHtml: true,
416
+ onNotFound: req => req.res_returnError404_NotFound()
417
+ };
418
+
419
+ this.internals.afterHook.push(async webSite => {
420
+ webSite.onGET("/**", req => {
421
+ return req.file_serveFromDir(this.fileServerOptions.rootDir, {
422
+ replaceIndexHtml: this.fileServerOptions.replaceIndexHtml,
423
+ onNotFound: this.fileServerOptions.onNotFound
424
+ });
425
+ });
426
+ });
427
+ }
428
+
429
+ private async initWebSiteInstance(): Promise<void> {
430
+ const onWebSiteCreate = (h: (webSite: WebSite) => void|Promise<void>) => {
431
+ this.internals.afterHook.push(h);
432
+ }
433
+
434
+ if (!this.webSite) {
435
+ await initLinker(this, onWebSiteCreate);
436
+
437
+ for (let hook of this.beforeHook) await hook();
438
+
439
+ this.webSite = new WebSiteImpl(this.origin, this.options);
440
+
441
+ for (const hook of this.afterHook) {
442
+ try {
443
+ await hook(this.webSite!);
444
+ }
445
+ catch (e: any) {
446
+ if (e instanceof Error) {
447
+ jk_term.logBgRed("Error when initializing website", this.origin);
448
+ jk_term.logRed(e.message);
449
+ console.log(e.stack);
450
+ }
451
+ else {
452
+ console.error("Error when initializing website", this.origin);
453
+ jk_term.logRed("|-", e.message);
454
+ }
455
+
456
+ process.exit(1);
457
+ }
458
+ }
459
+
460
+ if (!giIsCorsDisabled) {
461
+ this.webSite.enableCors([this.webSite.welcomeUrl, ...gCorsConstraints]);
462
+ }
463
+
464
+ myServer.setWebsite(this.webSite);
465
+ await autoStartServer();
466
+ }
467
+
468
+ if (this.internals.onHookWebSite) {
469
+ this.internals.onHookWebSite(this.webSite);
470
+ }
471
+ }
472
+
473
+ hook_webSite(hook: (webSite: WebSite) => void): this {
474
+ this.internals.onHookWebSite = hook;
475
+ return this;
476
+ }
477
+
478
+ DONE_createWebSite(): JopiApp {
479
+ return jopiApp;
480
+ }
481
+
482
+ add_httpCertificate(): CertificateBuilder {
483
+ return new CertificateBuilder(this, this.internals);
484
+ }
485
+
486
+ fastConfigure_fileServer(options: FileServerOptions) {
487
+ this.fileServerOptions = options;
488
+ return this;
489
+ }
490
+
491
+ configure_fileServer() {
492
+ const parent = this;
493
+
494
+ const me = {
495
+ set_rootDir: (rootDir: string) => {
496
+ this.fileServerOptions.rootDir = rootDir;
497
+ return me;
498
+ },
499
+
500
+ set_onNotFound: (handler: (req: JopiRequest) => Response|Promise<Response>) => {
501
+ this.fileServerOptions.onNotFound = handler;
502
+ return me;
503
+ },
504
+
505
+ DONE_configure_fileServer: (): JopiEasyWebSite => {
506
+ return parent;
507
+ }
508
+ };
509
+
510
+ return me;
511
+ }
512
+
513
+ configure_jwtTokenAuth(): JWT_BEGIN {
514
+ const builder = new JwtTokenAuth_Builder(this, this.internals);
515
+
516
+ return {
517
+ step_setPrivateKey: (privateKey: string) => builder.setPrivateKey_STEP(privateKey)
518
+ }
519
+ }
520
+
521
+ fastConfigure_jwtTokenAuth<T>(privateKey: string, store: any[] | UserAuthentificationFunction<T>): JopiEasyWebSite {
522
+ const builder = new JwtTokenAuth_Builder(this, this.internals);
523
+ let config = builder.setPrivateKey_STEP(privateKey).step_setUserStore();
524
+
525
+ if (store instanceof Array) {
526
+ config.use_simpleLoginPassword().addMany(store)
527
+ }
528
+ else {
529
+ config.use_customStore(store);
530
+ }
531
+
532
+ return this;
533
+ }
534
+
535
+ add_SseEvent(path: string|string[], handler: SseEvent) {
536
+ this.internals.afterHook.push((webSite) => {
537
+ webSite.addSseEVent(path, handler);
538
+ });
539
+
540
+ return this;
541
+ }
542
+
543
+ configure_postCss() {
544
+ const parent: JopiEasyWebSite = this;
545
+
546
+ const me = {
547
+ setPlugin: (handler: PostCssInitializer) => {
548
+ getBundlerConfig().postCss.initializer = handler;
549
+ return me;
550
+ },
551
+
552
+ END_configure_postCss() {
553
+ return parent;
554
+ }
555
+ };
556
+
557
+ return me;
558
+ }
559
+
560
+ configure_behaviors(): WebSite_ConfigureBehaviors {
561
+ const parent: JopiEasyWebSite = this;
562
+
563
+ const me: WebSite_ConfigureBehaviors = {
564
+ removeTrailingSlashs(value: boolean = true) {
565
+ parent.options.removeTrailingSlash = value;
566
+ return me;
567
+ },
568
+
569
+ DONE_configure_behaviors(): JopiEasyWebSite {
570
+ return parent;
571
+ }
572
+ }
573
+
574
+ return me;
575
+ }
576
+
577
+ configure_cache(): WebSite_CacheBuilder {
578
+ return new WebSite_CacheBuilder(this, this.internals);
579
+ }
580
+
581
+ configure_middlewares(): WebSite_MiddlewareBuilder {
582
+ return new WebSite_MiddlewareBuilder(this, this.internals);
583
+ }
584
+
585
+ configure_bundler() {
586
+ const parent: JopiEasyWebSite = this;
587
+
588
+ const me = {
589
+ dontEmbed_ReactJS: () => {
590
+ me.dontEmbedThis("react", "react-dom");
591
+ return me;
592
+ },
593
+
594
+ dontEmbedThis: (...packages: string[]) => {
595
+ let config = getBundlerConfig();
596
+ if (!config.embed.dontEmbedThis) config.embed.dontEmbedThis = [];
597
+ config.embed.dontEmbedThis.push(...packages);
598
+ return me;
599
+ },
600
+
601
+ END_configure_bundler(): JopiEasyWebSite {
602
+ return parent;
603
+ }
604
+ }
605
+
606
+ return me;
607
+ }
608
+
609
+ configure_tailwindProcessor() {
610
+ const parent: JopiEasyWebSite = this;
611
+
612
+ const me = {
613
+ disableTailwind: () => {
614
+ getBundlerConfig().tailwind.disable = true;
615
+ return me;
616
+ },
617
+
618
+ setGlobalCssContent: (template: string) => {
619
+ getBundlerConfig().tailwind.globalCssContent = template;
620
+ return me;
621
+ },
622
+
623
+ setConfig: (config: TailwindConfig) => {
624
+ getBundlerConfig().tailwind.config = config;
625
+ return me;
626
+ },
627
+
628
+ /**
629
+ * Allows adding extra-sources files to scan.
630
+ * Can also be motifs. Ex: "./myDir/*.{js,ts,jsx,tsx}"
631
+ */
632
+ addExtraSourceFiles: (...files: string[]) => {
633
+ const config = getBundlerConfig().tailwind;
634
+ if (!config.extraSourceFiles) config.extraSourceFiles = [];
635
+ config.extraSourceFiles.push(...files);
636
+ return me;
637
+ },
638
+
639
+ setGlobalCssFilePath: (filePath: string) => {
640
+ const config = getBundlerConfig().tailwind;
641
+ config.globalCssFilePath = filePath;
642
+ return me;
643
+ },
644
+
645
+ END_configure_tailwindProcessor(): JopiEasyWebSite {
646
+ return parent;
647
+ }
648
+ }
649
+
650
+ return me;
651
+ }
652
+
653
+ add_sourceServer<T>(): WebSite_AddSourceServerBuilder<T> {
654
+ return new WebSite_AddSourceServerBuilder<T>(this, this.internals);
655
+ }
656
+
657
+ add_specialPageHandler(): WebSite_AddSpecialPageHandler {
658
+ return new WebSite_AddSpecialPageHandler(this, this.internals);
659
+ }
660
+
661
+ on_webSiteReady(listener: () => void) {
662
+ if (this._isWebSiteReady) {
663
+ listener();
664
+ return;
665
+ }
666
+
667
+ this.options.onWebSiteReady!.push(listener);
668
+ return this;
669
+ }
670
+
671
+ configure_cors() {
672
+ return new WebSite_ConfigureCors(this);
673
+ }
674
+
675
+ fastConfigure_cors(allowedHosts?: string[]): JopiEasyWebSite {
676
+ const b = new WebSite_ConfigureCors(this);
677
+
678
+ if (allowedHosts) {
679
+ allowedHosts.forEach(o => b.add_allowedHost(o));
680
+ }
681
+
682
+ return this;
683
+ }
684
+ }
685
+
686
+ class JopiEasyWebSite_ExposePrivate extends JopiEasyWebSite {
687
+ isWebSiteReady() {
688
+ return this._isWebSiteReady;
689
+ }
690
+
691
+ getInternals(): WebSiteInternal {
692
+ return this.internals;
693
+ }
694
+ }
695
+
696
+ class WebSite_ConfigureCors {
697
+ constructor(private readonly webSite: JopiEasyWebSite) {
698
+ }
699
+
700
+ add_allowedHost(hostName: string) {
701
+ try {
702
+ let url = new URL(hostName);
703
+ gCorsConstraints.push(url.origin);
704
+ }
705
+ catch {
706
+ throw new Error(`Invalid host name: ${hostName}. Must be a valid URL.`);
707
+ }
708
+
709
+ return this;
710
+ }
711
+
712
+ disable_cors() {
713
+ giIsCorsDisabled = true;
714
+ return this;
715
+ }
716
+
717
+ DONE_configure_cors(): JopiEasyWebSite {
718
+ return this.webSite;
719
+ }
720
+ }
721
+
722
+ class WebSite_AddSpecialPageHandler {
723
+ constructor(private readonly webSite: JopiEasyWebSite, private readonly internals: WebSiteInternal) {
724
+ }
725
+
726
+ END_add_specialPageHandler(): JopiEasyWebSite {
727
+ return this.webSite;
728
+ }
729
+
730
+ on_404_NotFound(handler: (req: JopiRequest) => Promise<Response>): this {
731
+ this.internals.afterHook.push(async webSite => {
732
+ webSite.on404_NotFound(handler);
733
+ });
734
+
735
+ return this;
736
+ }
737
+
738
+ on_500_Error(handler: (req: JopiRequest) => Promise<Response>): this {
739
+ this.internals.afterHook.push(async webSite => {
740
+ webSite.on500_Error(handler);
741
+ });
742
+
743
+ return this;
744
+ }
745
+
746
+ on_401_Unauthorized(handler: (req: JopiRequest) => Promise<Response>): this {
747
+ this.internals.afterHook.push(async webSite => {
748
+ webSite.on401_Unauthorized(handler);
749
+ });
750
+
751
+ return this;
752
+ }
753
+ }
754
+
755
+ class WebSite_AddSourceServerBuilder<T> extends CreateServerFetch<T, WebSite_AddSourceServerBuilder_NextStep<T>> {
756
+ private serverFetch?: ServerFetch<T>;
757
+
758
+ constructor(private readonly webSite: JopiEasyWebSite, private readonly internals: WebSiteInternal) {
759
+ super();
760
+
761
+ this.internals.afterHook.push(async webSite => {
762
+ if (this.serverFetch) {
763
+ webSite.addSourceServer(this.serverFetch);
764
+ }
765
+ });
766
+ }
767
+
768
+ protected override createNextStep(options: ServerFetchOptions<T>): WebSite_AddSourceServerBuilder_NextStep<T> {
769
+ return new WebSite_AddSourceServerBuilder_NextStep(this.webSite, this.internals, options);
770
+ }
771
+
772
+ END_add_sourceServer(): JopiEasyWebSite {
773
+ return this.webSite;
774
+ }
775
+
776
+ add_sourceServer<T>(): WebSite_AddSourceServerBuilder<T> {
777
+ return new WebSite_AddSourceServerBuilder<T>(this.webSite, this.internals);
778
+ }
779
+ }
780
+
781
+ class WebSite_AddSourceServerBuilder_NextStep<T> extends CreateServerFetch_NextStep<T> {
782
+ constructor(private readonly webSite: JopiEasyWebSite, private readonly internals: WebSiteInternal, options: ServerFetchOptions<T>) {
783
+ super(options);
784
+
785
+ this.internals.afterHook.push(async webSite => {
786
+ webSite.addSourceServer(ServerFetch.useAsIs(this.options));
787
+ });
788
+ }
789
+
790
+ END_add_sourceServer(): JopiEasyWebSite {
791
+ return this.webSite;
792
+ }
793
+
794
+ add_sourceServer<T>(): WebSite_AddSourceServerBuilder<T> {
795
+ return new WebSite_AddSourceServerBuilder<T>(this.webSite, this.internals);
796
+ }
797
+ }
798
+
799
+ class WebSite_MiddlewareBuilder {
800
+ constructor(private readonly webSite: JopiEasyWebSite, private readonly internals: WebSiteInternal) {
801
+ }
802
+
803
+ add_middleware(method: HttpMethod|undefined, middleware: JopiMiddleware, options?: MiddlewareOptions): WebSite_MiddlewareBuilder {
804
+ this.internals.afterHook.push(async webSite => {
805
+ webSite.addGlobalMiddleware(method, middleware, options);
806
+ });
807
+
808
+ return this;
809
+ }
810
+
811
+ add_postMiddleware(method: HttpMethod|undefined, middleware: JopiPostMiddleware, options?: MiddlewareOptions): WebSite_MiddlewareBuilder {
812
+ this.internals.afterHook.push(async webSite => {
813
+ webSite.addGlobalPostMiddleware(method, middleware, options);
814
+ });
815
+
816
+ return this;
817
+ }
818
+
819
+ END_configure_middlewares(): JopiEasyWebSite {
820
+ return this.webSite;
821
+ }
822
+ }
823
+
824
+ class WebSite_CacheBuilder {
825
+ private cache?: PageCache;
826
+ private onFakeNoUser?: FakeNoUserListener;
827
+ private readonly rules: CacheRules[] = [];
828
+
829
+ constructor(private readonly webSite: JopiEasyWebSite, private readonly internals: WebSiteInternal) {
830
+ this.internals.afterHook.push(async webSite => {
831
+ (webSite as WebSiteImpl).setCacheRules(this.rules);
832
+
833
+ if (this.onFakeNoUser) {
834
+ (webSite as WebSiteImpl).setOnFakeNoUser(this.onFakeNoUser);
835
+ }
836
+
837
+ if (this.cache) {
838
+ webSite.setCache(this.cache);
839
+ }
840
+ });
841
+ }
842
+
843
+ on_fakeNoUser(listener: FakeNoUserListener): WebSite_CacheBuilder {
844
+ this.onFakeNoUser = listener;
845
+ return this;
846
+ }
847
+
848
+ use_inMemoryCache(options?: InMemoryCacheOptions): WebSite_CacheBuilder {
849
+ if (options) initMemoryCache(options);
850
+ this.cache = getInMemoryCache();
851
+
852
+ return this;
853
+ }
854
+
855
+ use_fileSystemCache(rootDir: string): WebSite_CacheBuilder {
856
+ this.cache = new SimpleFileCache(rootDir);
857
+ return this;
858
+ }
859
+
860
+ add_cacheRules(rules: CacheRules): WebSite_CacheBuilder {
861
+ this.rules.push(rules);
862
+ return this;
863
+ }
864
+
865
+ END_configure_cache(): JopiEasyWebSite {
866
+ return this.webSite;
867
+ }
868
+ }
869
+
870
+ interface WebSite_ConfigureBehaviors {
871
+ removeTrailingSlashs(value: boolean|undefined): WebSite_ConfigureBehaviors;
872
+ DONE_configure_behaviors(): JopiEasyWebSite;
873
+ }
874
+
875
+ //endregion
876
+
877
+ //region Server starting
878
+
879
+ let gIsAutoStartDone = false;
880
+
881
+ async function autoStartServer() {
882
+ if (gIsAutoStartDone) return;
883
+ gIsAutoStartDone = true;
884
+
885
+ await jk_timer.tick(5);
886
+ await myServer.startServer();
887
+ }
888
+
889
+ const myServer = getServer();
890
+
891
+ //endregion
892
+
893
+ //region Reverse proxy
894
+
895
+ class ReverseProxyBuilder {
896
+ private readonly webSite: JopiEasyWebSite_ExposePrivate;
897
+ private readonly internals: WebSiteInternal;
898
+
899
+ constructor(url: string, ref?: RefFor_WebSite) {
900
+ this.webSite = new JopiEasyWebSite_ExposePrivate(url);
901
+ if (ref) ref.webSite = this.webSite;
902
+
903
+ this.internals = this.webSite.getInternals();
904
+
905
+ this.internals.afterHook.push(async webSite => {
906
+ const handler: JopiRouteHandler = req => {
907
+ req.headers.set('X-Forwarded-Proto', req.urlInfos.protocol.replace(':', ''));
908
+ req.headers.set('X-Forwarded-Host', req.urlInfos.host)
909
+
910
+ const clientIp = req.coreServer.requestIP(req.coreRequest)?.address;
911
+ req.headers.set("X-Forwarded-For", clientIp!);
912
+
913
+ return req.proxy_directProxyToServer();
914
+ };
915
+
916
+ HTTP_VERBS.forEach(verb => {
917
+ webSite.onVerb(verb, "/**", handler);
918
+ });
919
+ });
920
+ }
921
+
922
+ add_target<T>(): ReverseProxyBuilder_AddTarget<T> {
923
+ const {builder, getOptions} = ReverseProxyBuilder_AddTarget.newBuilder<T>(this);
924
+
925
+ this.internals.afterHook.push(async webSite => {
926
+ let options = getOptions();
927
+
928
+ if (options) {
929
+ webSite.addSourceServer(ServerFetch.useAsIs<T>(options));
930
+ }
931
+ });
932
+
933
+ return builder;
934
+ }
935
+
936
+ DONE_create_reverseProxy(): JopiEasyWebSite_ExposePrivate {
937
+ return this.webSite;
938
+ }
939
+ }
940
+
941
+ class ReverseProxyBuilder_AddTarget<T> extends CreateServerFetch<T, ReverseProxyBuilder_AddTarget_NextStep<T>> {
942
+ static newBuilder<T>(parent: ReverseProxyBuilder): { builder: ReverseProxyBuilder_AddTarget<T>, getOptions: () => ServerFetchOptions<T> | undefined } {
943
+ const b = new ReverseProxyBuilder_AddTarget<T>(parent);
944
+ return {builder: b, getOptions: () => b.options};
945
+ }
946
+
947
+ constructor(private readonly parent: ReverseProxyBuilder) {
948
+ super();
949
+ }
950
+
951
+ DONE_add_target(): ReverseProxyBuilder {
952
+ return this.parent;
953
+ }
954
+ }
955
+
956
+ class ReverseProxyBuilder_AddTarget_NextStep<T> extends CreateServerFetch_NextStep<T> {
957
+ constructor(private readonly parent: ReverseProxyBuilder, protected options: ServerFetchOptions<T>) {
958
+ super(options);
959
+ }
960
+
961
+ DONE_add_target(): ReverseProxyBuilder {
962
+ return this.parent;
963
+ }
964
+ }
965
+
966
+ //endregion
967
+
968
+ //region TLS Certificates
969
+
970
+ //region CertificateBuilder
971
+
972
+ let gIsSslCertificateDefined = false;
973
+
974
+ function useCertificateStore(dirPath: string, hostName: string) {
975
+ dirPath = path.join(dirPath, hostName);
976
+
977
+ let cert:string = "";
978
+ let key: string = "";
979
+
980
+ try {
981
+ cert = path.resolve(dirPath, "certificate.crt.key")
982
+ fsc.statfsSync(cert)
983
+ } catch {
984
+ console.error("Certificat file not found: ", cert);
985
+ }
986
+
987
+ try {
988
+ key = path.resolve(dirPath, "certificate.key")
989
+ fsc.statfsSync(key)
990
+ } catch {
991
+ console.error("Certificat key file not found: ", key);
992
+ }
993
+
994
+ return {key, cert};
995
+ }
996
+
997
+ class CertificateBuilder {
998
+ constructor(private readonly parent: JopiEasyWebSite, private readonly internals: WebSiteInternal) {
999
+ }
1000
+
1001
+ generate_localDevCert(saveInDir: string = "certs") {
1002
+ gIsSslCertificateDefined = true;
1003
+
1004
+ this.internals.beforeHook.push(async () => {
1005
+ try {
1006
+ this.internals.options.certificate = await myServer.createDevCertificate(this.internals.hostName, saveInDir);
1007
+ }
1008
+ catch {
1009
+ console.error(`Can't create ssl certificate for ${this.internals.hostName}. Is mkcert tool installed ?`);
1010
+ }
1011
+ });
1012
+
1013
+ return {
1014
+ DONE_add_httpCertificate: () => this.parent
1015
+ }
1016
+ }
1017
+
1018
+ use_dirStore(dirPath: string) {
1019
+ gIsSslCertificateDefined = true;
1020
+ this.internals.options.certificate = useCertificateStore(dirPath, this.internals.hostName);
1021
+ return { DONE_add_httpCertificate: () => this.parent }
1022
+ }
1023
+
1024
+ generate_letsEncryptCert(email: string) {
1025
+ gIsSslCertificateDefined = true;
1026
+
1027
+ const params: LetsEncryptParams = {email};
1028
+
1029
+ this.internals.afterHook.push(async webSite => {
1030
+ await getLetsEncryptCertificate(webSite, params);
1031
+ });
1032
+
1033
+ return new LetsEncryptCertificateBuilder(this.parent, params);
1034
+ }
1035
+ }
1036
+
1037
+ //endregion
1038
+
1039
+ //region LetsEncryptCertificateBuilder
1040
+
1041
+ class LetsEncryptCertificateBuilder {
1042
+ constructor(private readonly parent: JopiEasyWebSite, private readonly params: LetsEncryptParams) {
1043
+ }
1044
+
1045
+ DONE_add_httpCertificate() {
1046
+ return this.parent;
1047
+ }
1048
+
1049
+ enable_production(value: boolean = true) {
1050
+ this.params.isProduction = value;
1051
+ return this;
1052
+ }
1053
+
1054
+ disable_log() {
1055
+ this.params.log = false;
1056
+ return this;
1057
+ }
1058
+
1059
+ set_certificateDir(dirPath: string) {
1060
+ this.params.certificateDir = dirPath;
1061
+ return this;
1062
+ }
1063
+
1064
+ force_expireAfter_days(dayCount: number) {
1065
+ this.params.expireAfter_days = dayCount;
1066
+ return this;
1067
+ }
1068
+
1069
+ force_timout_sec(value: number) {
1070
+ this.params.timout_sec = value;
1071
+ return this;
1072
+ }
1073
+
1074
+ if_timeOutError(handler: OnTimeoutError) {
1075
+ this.params.onTimeoutError = handler;
1076
+ return this;
1077
+ }
1078
+ }
1079
+
1080
+ //endregion
1081
+
1082
+ //endregion
1083
+
1084
+ //region JWT Tokens
1085
+
1086
+ //region Interfaces
1087
+
1088
+ interface JWT_BEGIN {
1089
+ step_setPrivateKey(privateKey: string): JWT_StepBegin_SetUserStore;
1090
+ }
1091
+
1092
+ interface JWT_FINISH {
1093
+ DONE_configure_jwtTokenAuth(): JopiEasyWebSite;
1094
+ }
1095
+
1096
+ interface JWT_StepBegin_SetUserStore {
1097
+ step_setUserStore(): JWT_Step_SetUserStore;
1098
+ }
1099
+
1100
+ interface JWT_Step_SetUserStore {
1101
+ use_simpleLoginPassword(): JWT_UseSimpleLoginPassword;
1102
+
1103
+ use_customStore<T>(store: UserAuthentificationFunction<T>): JWT_UseCustomStore;
1104
+ }
1105
+
1106
+ interface JWT_UseCustomStore {
1107
+ DONE_use_customStore(): JWT_StepBegin_Configure;
1108
+ }
1109
+
1110
+ interface JWT_UseSimpleLoginPassword {
1111
+ getStoreRef(h: GetValue<UserStore_WithLoginPassword>): JWT_UseSimpleLoginPassword;
1112
+ addOne(login: string, password: string, userInfos: UserInfos): JWT_UseSimpleLoginPassword;
1113
+ addMany(users: UserInfos_WithLoginPassword[]): JWT_UseSimpleLoginPassword;
1114
+ DONE_use_simpleLoginPassword(): JWT_StepBegin_Configure;
1115
+ }
1116
+
1117
+ interface JWT_StepBegin_Configure {
1118
+ stepConfigure(): JWT_Step_Configure;
1119
+ DONE_setUserStore(): JWT_FINISH;
1120
+ }
1121
+
1122
+ interface JWT_Step_Configure {
1123
+ set_cookieDuration(expirationDuration_hours: number): JWT_Step_Configure;
1124
+ DONE_stepConfigure(): JWT_FINISH;
1125
+ }
1126
+
1127
+
1128
+ //endregion
1129
+
1130
+ class JwtTokenAuth_Builder {
1131
+ constructor(private readonly parent: JopiEasyWebSite, private readonly internals: WebSiteInternal) {
1132
+ }
1133
+
1134
+ FINISH() {
1135
+ return {
1136
+ DONE_configure_jwtTokenAuth: () => this.parent
1137
+ }
1138
+ }
1139
+
1140
+ //region setPrivateKey_STEP (BEGIN / root)
1141
+
1142
+ setPrivateKey_STEP(privateKey: string): JWT_StepBegin_SetUserStore {
1143
+ this.internals.afterHook.push(async webSite => {
1144
+ webSite.setJwtSecret(privateKey);
1145
+ });
1146
+
1147
+ return {
1148
+ step_setUserStore: () => this.setUserStore_STEP()
1149
+ }
1150
+ }
1151
+
1152
+ //endregion
1153
+
1154
+ //region setUserStore_STEP
1155
+
1156
+ private loginPasswordStore?: UserStore_WithLoginPassword;
1157
+
1158
+ setUserStore_STEP(): JWT_Step_SetUserStore {
1159
+ const self = this;
1160
+
1161
+ return {
1162
+ use_simpleLoginPassword: () => {
1163
+ this.loginPasswordStore = new UserStore_WithLoginPassword();
1164
+
1165
+ this.internals.afterHook.push(async webSite => {
1166
+ this.loginPasswordStore!.setAuthHandler(webSite);
1167
+ });
1168
+
1169
+ return this.useSimpleLoginPassword_BEGIN()
1170
+ },
1171
+
1172
+ use_customStore<T>(store: UserAuthentificationFunction<T>) { return self.useCustomStore_BEGIN<T>(store) }
1173
+ }
1174
+ }
1175
+
1176
+ _setUserStore_NEXT(): JWT_StepBegin_Configure {
1177
+ return {
1178
+ stepConfigure: () => this.stepConfigure(),
1179
+ DONE_setUserStore: () => this.FINISH(),
1180
+ }
1181
+ }
1182
+
1183
+ //region useCustomStore
1184
+
1185
+ useCustomStore_BEGIN<T>(store: UserAuthentificationFunction<T>) {
1186
+ this.internals.afterHook.push(async webSite => {
1187
+ webSite.setAuthHandler(store);
1188
+ })
1189
+
1190
+ return {
1191
+ DONE_use_customStore : () => this.useCustomStore_DONE()
1192
+ }
1193
+ }
1194
+
1195
+ useCustomStore_DONE() {
1196
+ return this._setUserStore_NEXT();
1197
+ }
1198
+
1199
+ //endregion
1200
+
1201
+ //region useSimpleLoginPassword
1202
+
1203
+ useSimpleLoginPassword_BEGIN(): JWT_UseSimpleLoginPassword {
1204
+ return this._useSimpleLoginPassword_REPEAT();
1205
+ }
1206
+
1207
+ useSimpleLoginPassword_DONE(): JWT_StepBegin_Configure {
1208
+ return this._setUserStore_NEXT();
1209
+ }
1210
+
1211
+ _useSimpleLoginPassword_REPEAT(): JWT_UseSimpleLoginPassword {
1212
+ return {
1213
+ getStoreRef: (h: GetValue<UserStore_WithLoginPassword>) => {
1214
+ h(this.loginPasswordStore!);
1215
+ return this._useSimpleLoginPassword_REPEAT();
1216
+ },
1217
+
1218
+ addOne: (login: string, password: string, userInfos: UserInfos) => this.useSimpleLoginPassword_addOne(login, password, userInfos),
1219
+ addMany: (users: UserInfos_WithLoginPassword[]) => this.useSimpleLoginPassword_addMany(users),
1220
+ DONE_use_simpleLoginPassword: () => this.useSimpleLoginPassword_DONE()
1221
+ }
1222
+ }
1223
+
1224
+ useSimpleLoginPassword_addOne(login: string, password: string, userInfos: UserInfos): JWT_UseSimpleLoginPassword {
1225
+ this.loginPasswordStore!.add({login, password, userInfos});
1226
+
1227
+ return this._useSimpleLoginPassword_REPEAT();
1228
+ }
1229
+
1230
+ useSimpleLoginPassword_addMany(users: UserInfos_WithLoginPassword[]): JWT_UseSimpleLoginPassword {
1231
+ users.forEach(e => this.loginPasswordStore!.add(e));
1232
+ return this._useSimpleLoginPassword_REPEAT();
1233
+ }
1234
+
1235
+ //endregion
1236
+
1237
+ //endregion
1238
+
1239
+ //region setTokenStore
1240
+
1241
+ stepConfigure(): JWT_Step_Configure {
1242
+ return {
1243
+ set_cookieDuration: (expirationDuration_hours: number) => this.setTokenStore_useCookie(expirationDuration_hours),
1244
+ DONE_stepConfigure: () => this.FINISH()
1245
+ }
1246
+ }
1247
+
1248
+ setTokenStore_useCookie(expirationDuration_hours: number = 3600) {
1249
+ this.internals.afterHook.push(async webSite => {
1250
+ webSite.setJwtTokenStore((_token, cookieValue, req) => {
1251
+ req.cookie_addCookieToRes("authorization", cookieValue, {maxAge: jk_timer.ONE_HOUR * expirationDuration_hours})
1252
+ });
1253
+ });
1254
+
1255
+ return this.stepConfigure();
1256
+ }
1257
+
1258
+ //endregion
1259
+ }
1260
+
1261
+ //endregion
1262
+
1263
+ //region Config
1264
+
1265
+ let gCorsConstraints: string[] = [];
1266
+ let giIsCorsDisabled = false;
1267
+
1268
+ //endregion
1269
+
1270
+ //region Helpers
1271
+
1272
+ type GetValue<T> = (value: T) => void;
1273
+
1274
+ interface WebSiteInternal {
1275
+ origin: string;
1276
+ hostName: string;
1277
+ options: WebSiteOptions;
1278
+
1279
+ afterHook: ((webSite: WebSite) => void|Promise<void>)[];
1280
+ beforeHook: (() => Promise<void>)[];
1281
+
1282
+ onHookWebSite?: (webSite: WebSite) => void;
1283
+ }
1284
+
1285
+ //endregion