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,483 @@
1
+ import * as jk_app from "jopi-toolkit/jk_app";
2
+ import * as jk_crypto from "jopi-toolkit/jk_crypto";
3
+ import * as jk_compress from "jopi-toolkit/jk_compress";
4
+
5
+ import type {CacheEntry, PageCache} from "./cache.ts";
6
+ import {octetToMo, ONE_KILO_OCTET, ONE_MEGA_OCTET} from "../publicTools.ts";
7
+ import {
8
+ cacheAddBrowserCacheValues,
9
+ cacheEntryToResponse,
10
+ makeIterable,
11
+ readContentLength,
12
+ responseToCacheEntry
13
+ } from "../internalTools.ts";
14
+ import type {JopiRequest} from "../jopiRequest.tsx";
15
+
16
+ const clearHotReloadKey = jk_app.clearHotReloadKey;
17
+ const keepOnHotReload = jk_app.keepOnHotReload;
18
+ const HOT_RELOAD_KEY = "jopi.rewrite.inMemoryCache.hotReloadKey";
19
+
20
+ export interface InMemoryCacheOptions {
21
+ /**
22
+ * The memory cache survives hot-reload.
23
+ * If a hot-reload occurs, the cache contact is kept as-is.
24
+ * This option allows changing this behavior and automatically clearing
25
+ * the memory cache if a hot-reload is detected.
26
+ */
27
+ clearOnHotReload?: boolean;
28
+
29
+ /**
30
+ * If an item is larger than this value, then he will not be added to the cache.
31
+ * Default value is 600 ko.
32
+ */
33
+ maxContentLength?: number;
34
+
35
+ /**
36
+ * The max number of items in the cache.
37
+ * Default is 5000.
38
+ */
39
+ maxItemCount?: number;
40
+
41
+ /**
42
+ * A delta which allows not triggering garbage collector too soon.
43
+ */
44
+ maxItemCountDelta?: number;
45
+
46
+ /**
47
+ * The max memory usage (mesure is Mo).
48
+ * Default is 500Mo
49
+ */
50
+ maxMemoryUsage_mo?: number;
51
+
52
+ /**
53
+ * A delta which allows not triggering garbage collector too soon.
54
+ */
55
+ maxMemoryUsageDela_mo?: number;
56
+ }
57
+
58
+ interface MyCacheEntry extends CacheEntry {
59
+ ucpBinary?: Uint8Array<ArrayBuffer>;
60
+ ucpBinarySize?: number;
61
+
62
+ gzipBinary?: Uint8Array<ArrayBuffer>;
63
+ gzipBinarySize?: number;
64
+ }
65
+
66
+ class InMemoryCache implements PageCache {
67
+ createSubCache(name: string): PageCache {
68
+ return new InMemorySubCache(this, name);
69
+ }
70
+
71
+ private readonly cache = keepOnHotReload(HOT_RELOAD_KEY, () => new Map<string, MyCacheEntry>());
72
+
73
+ private readonly maxContentLength: number;
74
+
75
+ private statItemCount = 0;
76
+ private readonly maxItemCount: number;
77
+ private readonly maxItemCountDelta: number;
78
+
79
+ private statMemoryUsage = 0;
80
+ private readonly maxMemoryUsage: number;
81
+ private readonly maxMemoryUsageDelta: number;
82
+
83
+ constructor(options?: InMemoryCacheOptions) {
84
+ options = options || {};
85
+
86
+ if (!options.maxContentLength) options.maxContentLength = ONE_KILO_OCTET * 600;
87
+
88
+ if (!options.maxItemCount) options.maxItemCount = 5000;
89
+ if (!options.maxItemCountDelta) options.maxItemCountDelta = Math.trunc(options.maxItemCount * 0.1);
90
+
91
+ if (!options.maxMemoryUsage_mo) options.maxMemoryUsage_mo = 500;
92
+ if (!options.maxMemoryUsageDela_mo) options.maxMemoryUsageDela_mo = Math.trunc(options.maxMemoryUsageDela_mo! * 0.1);
93
+
94
+ this.maxContentLength = options.maxContentLength!;
95
+
96
+ this.maxItemCount = options.maxItemCount!;
97
+ this.maxItemCountDelta = options.maxItemCountDelta!;
98
+
99
+ this.maxMemoryUsage = Math.trunc(options.maxMemoryUsage_mo * ONE_MEGA_OCTET);
100
+ this.maxMemoryUsageDelta = Math.trunc(options.maxMemoryUsageDela_mo * ONE_MEGA_OCTET);
101
+ }
102
+
103
+ async addToCache(_req: JopiRequest, url: URL, response: Response, headersToInclude: string[]|undefined): Promise<Response> {
104
+ return this.key_addToCache("", url.toString(), response, headersToInclude);
105
+ }
106
+
107
+ removeFromCache(url: URL): Promise<void> {
108
+ return this.key_removeFromCache(url.toString());
109
+ }
110
+
111
+ async getFromCache(req: JopiRequest, url: URL): Promise<Response|undefined> {
112
+ return this.key_getFromCache(req, ':' + url.href);
113
+ }
114
+
115
+ async hasInCache(url: URL): Promise<boolean> {
116
+ return this.key_hasInCache(':' + url.href);
117
+ }
118
+
119
+ private gzipMaxSize = 20 * ONE_MEGA_OCTET;
120
+
121
+ /**
122
+ * Set the binary value inside the cache entry.
123
+ * This by compressing the binary if needed.
124
+ */
125
+ private async storeBinary(cacheEntry: MyCacheEntry, response: Response): Promise<boolean> {
126
+ const asBinary = new Uint8Array(await response.arrayBuffer());
127
+ const byteLength = asBinary.byteLength;
128
+ const canCompress = byteLength < this.gzipMaxSize;
129
+
130
+ if (!canCompress) {
131
+ cacheEntry.ucpBinary = new Uint8Array(await response.arrayBuffer());
132
+ cacheEntry.ucpBinarySize = cacheEntry.ucpBinary.byteLength;
133
+ return false;
134
+ }
135
+
136
+ const bufferGzip = jk_compress.gzipSync(asBinary);
137
+ cacheEntry.gzipBinary = new Uint8Array(bufferGzip.buffer as ArrayBuffer);
138
+ cacheEntry.gzipBinarySize = cacheEntry.gzipBinary.byteLength;
139
+ cacheEntry.isGzipped = true;
140
+
141
+ return true;
142
+ }
143
+
144
+ getCacheEntryIterator(subCacheName?: string): Iterable<CacheEntry> {
145
+ const iterator = this.cache.entries();
146
+ if (!subCacheName) subCacheName = "";
147
+
148
+ return makeIterable({
149
+ next(): IteratorResult<CacheEntry> {
150
+ let result = iterator.next();
151
+
152
+ while (!result.done) {
153
+ let v = result.value[0];
154
+ let idx = v.indexOf(":");
155
+
156
+ if (subCacheName===v.substring(0, idx)) {
157
+ const entry = {...result.value[1], url: v.substring(idx+1)};
158
+ return {value: entry, done: false};
159
+ }
160
+
161
+ result = iterator.next();
162
+ }
163
+
164
+ return { value: undefined, done: true };
165
+ }
166
+ });
167
+ }
168
+
169
+ getSubCacheIterator(): Iterable<string> {
170
+ const alreadyReturned: string[] = [];
171
+ const iterator = this.cache.entries();
172
+
173
+ return makeIterable({
174
+ next(): IteratorResult<string> {
175
+ while (true) {
176
+ let result = iterator.next();
177
+ if (result.done) return { value: undefined, done: true };
178
+
179
+ let key = result.value[0];
180
+ let idx = key.indexOf(":");
181
+
182
+ if (idx===0) continue;
183
+
184
+ let subCacheName = key.substring(0, idx);
185
+
186
+ if (!alreadyReturned.includes(subCacheName)) {
187
+ alreadyReturned.push(subCacheName);
188
+ return { value: subCacheName, done: false };
189
+ }
190
+ }
191
+ }
192
+ });
193
+ }
194
+
195
+ //region With a key
196
+
197
+ async key_hasInCache(key: string): Promise<boolean> {
198
+ const cacheEntry = this.cache.get(key);
199
+ return !!cacheEntry;
200
+ }
201
+
202
+ async key_addToCache(subCacheName: string, url: string, response: Response, headersToInclude: string[]|undefined) {
203
+ if ((response.status!==200) || (!response.body)) {
204
+ return response;
205
+ }
206
+
207
+ const cacheEntry = responseToCacheEntry("", response, headersToInclude) as MyCacheEntry;
208
+ const key = subCacheName + ':' + url;
209
+
210
+ const contentLength = readContentLength(response.headers);
211
+ if (contentLength>this.maxContentLength) return response;
212
+
213
+ let isGzipped = await this.storeBinary(cacheEntry, response);
214
+
215
+ if (cacheEntry.ucpBinary) this.statMemoryUsage += cacheEntry.ucpBinarySize!;
216
+ if (cacheEntry.gzipBinary) this.statMemoryUsage += cacheEntry.gzipBinarySize!;
217
+
218
+ if (isGzipped) {
219
+ cacheEntry.binary = cacheEntry.gzipBinary;
220
+ cacheEntry.binarySize = cacheEntry.gzipBinarySize;
221
+ }
222
+ else {
223
+ cacheEntry.binary = cacheEntry.ucpBinary;
224
+ cacheEntry.binarySize = cacheEntry.ucpBinarySize;
225
+ }
226
+
227
+ // Add special headers for browser cache control.
228
+ const etag = jk_crypto.fastHash(cacheEntry.binary!);
229
+ cacheAddBrowserCacheValues(cacheEntry, etag);
230
+
231
+ response = cacheEntryToResponse(cacheEntry);
232
+
233
+ this.cache.set(key, cacheEntry);
234
+
235
+ this.statItemCount++;
236
+ cacheEntry._refCount = 1;
237
+ cacheEntry._refCountSinceGC = 1;
238
+
239
+ if (this.needToGC()) {
240
+ this.garbageCollector();
241
+ }
242
+
243
+ return response;
244
+ }
245
+
246
+ key_removeFromCache(key: string): Promise<void> {
247
+ const cacheEntry = this.cache.get(key);
248
+
249
+ if (cacheEntry) {
250
+ this.statItemCount--;
251
+
252
+ let size = 0;
253
+ if (cacheEntry.ucpBinarySize) size += cacheEntry.ucpBinarySize;
254
+ if (cacheEntry.gzipBinarySize) size += cacheEntry.gzipBinarySize;
255
+ if (size) this.statMemoryUsage -= size;
256
+ }
257
+
258
+ return Promise.resolve();
259
+ }
260
+
261
+ key_getFromCache(req: JopiRequest, key: string): Response|undefined {
262
+ const res = this.key_getValueFromCache(key);
263
+
264
+ if (res) {
265
+ let cacheRes = req.file_validateCacheHeadersWith(res.headers)
266
+ if (cacheRes) return cacheRes;
267
+
268
+ return cacheEntryToResponse(res);
269
+ }
270
+
271
+ return undefined;
272
+ }
273
+
274
+ private key_getValueFromCache(key: string): CacheEntry|undefined {
275
+ const cacheEntry = this.cache.get(key);
276
+ if (!cacheEntry) return undefined;
277
+
278
+ cacheEntry._refCount!++;
279
+ cacheEntry._refCountSinceGC!++;
280
+
281
+ if (cacheEntry.gzipBinary) {
282
+ cacheEntry.binary = cacheEntry.gzipBinary;
283
+ cacheEntry.binarySize = cacheEntry.gzipBinarySize;
284
+ cacheEntry.isGzipped = true;
285
+ return cacheEntry;
286
+ }
287
+
288
+ if (cacheEntry.ucpBinary) {
289
+ cacheEntry.binary = cacheEntry.ucpBinary;
290
+ cacheEntry.binarySize = cacheEntry.ucpBinarySize;
291
+ cacheEntry.isGzipped = false;
292
+ return cacheEntry;
293
+ }
294
+
295
+ cacheEntry.binary = undefined;
296
+ return cacheEntry;
297
+ }
298
+
299
+ //endregion
300
+
301
+ //region Garbage collector
302
+
303
+ private needToGC() {
304
+ if (this.statItemCount>this.maxItemCount) return true;
305
+ else if (this.statMemoryUsage>this.maxMemoryUsage) return true;
306
+ return false;
307
+ }
308
+
309
+ private garbageCollector() {
310
+ const removeEntry = (key: string, cacheEntry: MyCacheEntry) => {
311
+ if (key.endsWith(".html")) debugger;
312
+
313
+ keyToRemove.push(key);
314
+ this.statItemCount--;
315
+
316
+ let size = 0;
317
+ if (cacheEntry.ucpBinarySize) size += cacheEntry.ucpBinarySize;
318
+ if (cacheEntry.gzipBinarySize) size += cacheEntry.gzipBinarySize;
319
+
320
+ if (size) {
321
+ this.statMemoryUsage -= size;
322
+
323
+ console.log("|-> ... gc has removed " + key + " / size:", octetToMo(size), "mb");
324
+ } else {
325
+ console.log("|-> ... gc has removed " + key);
326
+ }
327
+ }
328
+
329
+ const purge = () => {
330
+ for (const key of keyToRemove) {
331
+ this.cache.delete(key);
332
+ }
333
+
334
+ keyToRemove.splice(0);
335
+ }
336
+
337
+ function isHtml(cacheEntry: MyCacheEntry) {
338
+ if (!cacheEntry.headers) return false;
339
+ if (!cacheEntry.gzipBinary && !cacheEntry.ucpBinary) return false;
340
+
341
+ const contentType = cacheEntry.headers["content-type"];
342
+ return contentType.startsWith("text/html");
343
+ }
344
+
345
+ const remove_NotUsedSince = (avoidHtml: boolean) => {
346
+ const limit = this.maxItemCount - this.maxItemCountDelta;
347
+ if (this.statItemCount < limit) return;
348
+
349
+ for (const [key, cacheEntry] of this.cache.entries()) {
350
+ if (!cacheEntry._refCountSinceGC) {
351
+ if (avoidHtml && isHtml(cacheEntry)) {
352
+ // Avoid removing HTML items since they need calculation.
353
+ continue;
354
+ }
355
+
356
+ removeEntry(key, cacheEntry);
357
+ if (this.statItemCount < limit) return;
358
+ }
359
+ }
360
+
361
+ purge();
362
+ }
363
+
364
+ const remove_WeighterEntries = (avoidHtml: boolean) => {
365
+ const exec = (): boolean => {
366
+ let maxWeight = 0;
367
+ let maxEntry: CacheEntry | undefined;
368
+ let maxKey = "";
369
+
370
+ for (const [key, cacheEntry] of this.cache.entries()) {
371
+ if (avoidHtml && isHtml(cacheEntry)) {
372
+ // Avoid removing HTML items since they need calculation.
373
+ continue;
374
+ }
375
+
376
+ let size = 0;
377
+ if (cacheEntry.ucpBinarySize) size += cacheEntry.ucpBinarySize;
378
+ if (cacheEntry.gzipBinarySize) size += cacheEntry.gzipBinarySize;
379
+
380
+ if (size > maxWeight) {
381
+ maxWeight = size;
382
+ maxEntry = cacheEntry;
383
+ maxKey = key;
384
+ }
385
+
386
+ cacheEntry._refCountSinceGC = 0;
387
+ }
388
+
389
+ if (maxEntry) {
390
+ removeEntry(maxKey, maxEntry);
391
+ purge();
392
+
393
+ return true;
394
+ }
395
+
396
+ return false;
397
+ }
398
+
399
+ const limit = this.maxMemoryUsage - this.maxMemoryUsageDelta;
400
+
401
+ while (this.statMemoryUsage > limit) {
402
+ if (!exec()) break;
403
+ }
404
+ }
405
+
406
+ const keyToRemove: string[] = [];
407
+ const itemCountBefore = this.statItemCount;
408
+ const memoryUsageBefore = this.statMemoryUsage;
409
+
410
+ console.log("====== InMemory cache is executing garbage collector ======");
411
+
412
+ remove_WeighterEntries(true);
413
+ remove_WeighterEntries(false);
414
+
415
+ remove_NotUsedSince(true);
416
+ remove_NotUsedSince(false);
417
+
418
+ for (const [_, cacheEntry] of this.cache.entries()) {
419
+ cacheEntry._refCountSinceGC = 0;
420
+ }
421
+
422
+ console.log("===========================================================");
423
+ console.log("Item count ----> before:", itemCountBefore + ", after:", this.statItemCount, " [limit: " + this.maxItemCount + " items]");
424
+ console.log("Memory usage --> before:", octetToMo(memoryUsageBefore) + "Mb, after:", octetToMo(this.statMemoryUsage), "mb [limit: " + octetToMo(this.maxMemoryUsage) + "mb]");
425
+ console.log("===========================================================");
426
+ console.log();
427
+ }
428
+
429
+ //endregion
430
+ }
431
+
432
+ class InMemorySubCache implements PageCache {
433
+ private readonly prefix: string;
434
+
435
+ constructor(private readonly parent: InMemoryCache, name: string) {
436
+ this.prefix = name + " : ";
437
+ }
438
+
439
+ async addToCache(_req: JopiRequest, url: URL, response: Response, headersToInclude: string[]|undefined): Promise<Response> {
440
+ return this.parent.key_addToCache(this.prefix, url.href, response, headersToInclude);
441
+ }
442
+
443
+ async hasInCache(url: URL): Promise<boolean> {
444
+ return this.parent.key_hasInCache(this.prefix + ':' + url.href);
445
+ }
446
+
447
+ removeFromCache(url: URL): Promise<void> {
448
+ return this.parent.key_removeFromCache(this.prefix + ':' + url.href);
449
+ }
450
+
451
+ async getFromCache(req: JopiRequest, url: URL): Promise<Response|undefined> {
452
+ return this.parent.key_getFromCache(req, this.prefix + ':' + url.href);
453
+ }
454
+
455
+ createSubCache(name: string): PageCache {
456
+ return this.parent.createSubCache(name);
457
+ }
458
+
459
+ getCacheEntryIterator(subCacheName?: string) {
460
+ return this.parent.getCacheEntryIterator(subCacheName);
461
+ }
462
+
463
+ getSubCacheIterator() {
464
+ return this.parent.getSubCacheIterator();
465
+ }
466
+ }
467
+
468
+ export function initMemoryCache(options: InMemoryCacheOptions) {
469
+ if (gInstance) return;
470
+
471
+ if (options.clearOnHotReload) {
472
+ clearHotReloadKey(HOT_RELOAD_KEY);
473
+ }
474
+
475
+ gInstance = new InMemoryCache(options);
476
+ }
477
+
478
+ export function getInMemoryCache(): PageCache {
479
+ if (!gInstance) initMemoryCache({});
480
+ return gInstance;
481
+ }
482
+
483
+ let gInstance: InMemoryCache;
@@ -0,0 +1,205 @@
1
+ import {gzipFile} from "../gzip.ts";
2
+ import path from "node:path";
3
+ import fs from "node:fs/promises";
4
+ import fss from "node:fs";
5
+ import type {CacheEntry, PageCache} from "./cache.ts";
6
+ import {
7
+ cacheAddBrowserCacheValues,
8
+ cacheEntryToResponse,
9
+ makeIterable,
10
+ responseToCacheEntry
11
+ } from "../internalTools.ts";
12
+
13
+ import * as jk_fs from "jopi-toolkit/jk_fs";
14
+ import * as jk_crypto from "jopi-toolkit/jk_crypto";
15
+ import type {JopiRequest} from "../jopiRequest.tsx";
16
+ import {ONE_MEGA_OCTET} from "../publicTools.ts";
17
+
18
+ export class SimpleFileCache implements PageCache {
19
+ public readonly rootDir: string;
20
+
21
+ constructor(rootDir: string) {
22
+ if (!rootDir) rootDir = ".";
23
+ if (!path.isAbsolute(rootDir)) rootDir = path.resolve(process.cwd(), rootDir);
24
+ this.rootDir = rootDir;
25
+ }
26
+
27
+ private calKey(url: URL): string {
28
+ // Using a hash allows avoiding difficulties with query string special characters.
29
+ return jk_crypto.fastHash(url.toString());
30
+ }
31
+
32
+ private calcFilePath(url: URL): string {
33
+ const key = this.calKey(url);
34
+ let fp = path.join(this.rootDir, key[0], key);
35
+ if (fp.endsWith("/")) fp += "index.html";
36
+ return fp;
37
+ }
38
+
39
+ private gzipMaxSize = 20 * ONE_MEGA_OCTET;
40
+
41
+ async addToCache(req: JopiRequest, url: URL, response: Response, headersToInclude: string[]|undefined): Promise<Response> {
42
+ if ((response.status!==200) || (!response.body)) {
43
+ return response;
44
+ }
45
+
46
+ let filePath = this.calcFilePath(url);
47
+ await jk_fs.writeResponseToFile(response, filePath);
48
+
49
+ let fileState = (await jk_fs.getFileStat(filePath))!;
50
+ const byteLength = fileState.size;
51
+ const canCompress = byteLength < this.gzipMaxSize;
52
+
53
+ await this.saveNewCacheEntry(url, response, headersToInclude, canCompress, filePath);
54
+
55
+ if (canCompress) {
56
+ // Compress the file and remove the uncompressed one.
57
+ await gzipFile(filePath, filePath + " gz");
58
+ await jk_fs.unlink(filePath);
59
+
60
+ return await req.file_returnFile(filePath + " gz", {contentEncoding: "gzip"});
61
+ } else {
62
+ return await req.file_returnFile(filePath);
63
+ }
64
+ }
65
+
66
+ async removeFromCache(url: URL): Promise<void> {
67
+ const filePath = this.calcFilePath(url);
68
+
69
+ await jk_fs.unlink(filePath);
70
+ await jk_fs.unlink(filePath + " gz");
71
+ await jk_fs.unlink(filePath + " info");
72
+
73
+ return Promise.resolve();
74
+ }
75
+
76
+ async getFromCache(req: JopiRequest, url: URL): Promise<Response|undefined> {
77
+ const cacheEntry = await this.getCacheEntry(url);
78
+
79
+ // Mean the entry doesn't exist.
80
+ if (!cacheEntry) {
81
+ return undefined;
82
+ }
83
+
84
+ if (cacheEntry.status===200) {
85
+ let toReturn = req.file_validateCacheHeadersWith(cacheEntry.headers);
86
+ if (toReturn) return toReturn;
87
+
88
+ let filePath = this.calcFilePath(url);
89
+ if (cacheEntry.isGzipped) filePath += " gz";
90
+
91
+ const fileBytes = await jk_fs.readFileToBytes(filePath);
92
+ cacheEntry.binary = new Uint8Array(fileBytes.buffer as ArrayBuffer);
93
+ cacheEntry.binarySize = fileBytes.length;
94
+ }
95
+
96
+ return cacheEntryToResponse(cacheEntry);
97
+ }
98
+
99
+ async hasInCache(url: URL, requireUncompressedVersion?: boolean|undefined): Promise<boolean> {
100
+ const cacheEntry = await this.getCacheEntry(url);
101
+ if (!cacheEntry) return false;
102
+
103
+ if (requireUncompressedVersion===undefined) return true;
104
+ if (requireUncompressedVersion) return cacheEntry.isGzipped===false;
105
+ return cacheEntry.isGzipped===true;
106
+ }
107
+
108
+ private async getCacheEntry(url: URL): Promise<CacheEntry|undefined> {
109
+ const filePath = this.calcFilePath(url);
110
+
111
+ try {
112
+ return JSON.parse(await jk_fs.readTextFromFile(filePath + " info"));
113
+ }
114
+ catch {
115
+ // We are here if the file doesn't exist.
116
+ return undefined;
117
+ }
118
+ }
119
+
120
+ private async saveNewCacheEntry(url: URL, response: Response, headersToInclude: string[]|undefined, isGzipped: boolean, filePath: string) {
121
+ const cacheEntry = responseToCacheEntry(url.href, response, headersToInclude);
122
+ cacheEntry.isGzipped = isGzipped;
123
+
124
+ const etag = (await jk_fs.calcFileHash(filePath))!;
125
+ cacheAddBrowserCacheValues(cacheEntry, etag);
126
+
127
+ filePath += " info";
128
+ await fs.mkdir(path.dirname(filePath), {recursive: true});
129
+ await jk_fs.writeTextToFile(filePath, JSON.stringify(cacheEntry));
130
+ }
131
+
132
+ createSubCache(name: string): PageCache {
133
+ const newDir = path.join(this.rootDir, "_ subCaches", name);
134
+ return new SimpleFileCache(newDir);
135
+ }
136
+
137
+ getCacheEntryIterator() {
138
+ function getCacheEntryFrom(filePath: string): CacheEntry|undefined {
139
+ try {
140
+ return JSON.parse(jk_fs.readTextFromFileSync(filePath));
141
+ }
142
+ catch {
143
+ // We are here if the file doesn't exist.
144
+ return undefined;
145
+ }
146
+ }
147
+
148
+ const rootDir = this.rootDir;
149
+ const nextFileProvider = iterateFiles(this.rootDir);
150
+
151
+ return makeIterable({
152
+ next(): IteratorResult<CacheEntry> {
153
+ while (true) {
154
+ let nextFile = nextFileProvider.next();
155
+ if (nextFile.done) return {done: true, value: undefined};
156
+
157
+ const cacheEntry = getCacheEntryFrom(path.join(rootDir, nextFile.value));
158
+ if (cacheEntry) return {done: false, value: cacheEntry};
159
+ }
160
+ }
161
+ });
162
+ }
163
+
164
+ getSubCacheIterator() {
165
+ const alreadyReturned: string[] = [];
166
+ const iterator = iterateFiles(this.rootDir);
167
+
168
+ return makeIterable({
169
+ next(): IteratorResult<string> {
170
+ while (true) {
171
+ const result = iterator.next();
172
+ if (!result.done) return {value: undefined, done: true};
173
+
174
+ const filePath = result.value[0];
175
+
176
+ if (filePath.startsWith("_ subCaches")) {
177
+ const parts = filePath.split(path.sep);
178
+ const subCacheName = parts[1];
179
+
180
+ if (!alreadyReturned.includes(subCacheName)) {
181
+ alreadyReturned.push(subCacheName);
182
+ return {value: subCacheName, done: false};
183
+ }
184
+ }
185
+ }
186
+ }
187
+ });
188
+ }
189
+ }
190
+
191
+ function* iterateFiles(rootDir: string): Generator<string> {
192
+ const items = fss.readdirSync(rootDir);
193
+
194
+ for (const item of items) {
195
+ const itemPath = path.join(rootDir, item);
196
+ const stats = fss.statSync(itemPath);
197
+
198
+ if (stats.isDirectory()) {
199
+ yield* iterateFiles(itemPath);
200
+ } else if (stats.isFile() && item.endsWith(' info')) {
201
+ const relativePath = path.relative(rootDir, itemPath);
202
+ yield relativePath;
203
+ }
204
+ }
205
+ }