@static-suite/static-suite-data-server 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 (484) hide show
  1. package/.eslintignore +4 -0
  2. package/.eslintrc.json +49 -0
  3. package/.nvmrc +1 -0
  4. package/.prettierrc +10 -0
  5. package/.vscode/launch.json +44 -0
  6. package/LICENSE.txt +339 -0
  7. package/README.md +300 -0
  8. package/__mocks__/clear-module.js +7 -0
  9. package/api-extractor.json +339 -0
  10. package/dist/bin/serve.d.ts +3 -0
  11. package/dist/bin/serve.d.ts.map +1 -0
  12. package/dist/bin/serve.js +105 -0
  13. package/dist/http/README.md +300 -0
  14. package/dist/http/httpServer.d.ts +4 -0
  15. package/dist/http/httpServer.d.ts.map +1 -0
  16. package/dist/http/httpServer.js +24 -0
  17. package/dist/http/public/assets/bulma/bulma-tooltip.min.css +2 -0
  18. package/dist/http/public/assets/bulma/bulma.min.css +1 -0
  19. package/dist/http/public/assets/clipboard/clipboard.min.js +7 -0
  20. package/dist/http/public/assets/simple-datatables/index.js +12 -0
  21. package/dist/http/public/assets/simple-datatables/style.css +173 -0
  22. package/dist/http/routes/cache.d.ts +4 -0
  23. package/dist/http/routes/cache.d.ts.map +1 -0
  24. package/dist/http/routes/cache.js +19 -0
  25. package/dist/http/routes/data.d.ts +4 -0
  26. package/dist/http/routes/data.d.ts.map +1 -0
  27. package/dist/http/routes/data.js +104 -0
  28. package/dist/http/routes/docs.d.ts +3 -0
  29. package/dist/http/routes/docs.d.ts.map +1 -0
  30. package/dist/http/routes/docs.js +14 -0
  31. package/dist/http/routes/dump.d.ts +8 -0
  32. package/dist/http/routes/dump.d.ts.map +1 -0
  33. package/dist/http/routes/dump.js +57 -0
  34. package/dist/http/routes/home.d.ts +3 -0
  35. package/dist/http/routes/home.d.ts.map +1 -0
  36. package/dist/http/routes/home.js +17 -0
  37. package/dist/http/routes/index.d.ts +3 -0
  38. package/dist/http/routes/index.d.ts.map +1 -0
  39. package/dist/http/routes/index.js +33 -0
  40. package/dist/http/routes/query.d.ts +5 -0
  41. package/dist/http/routes/query.d.ts.map +1 -0
  42. package/dist/http/routes/query.js +21 -0
  43. package/dist/http/routes/status.d.ts +9 -0
  44. package/dist/http/routes/status.d.ts.map +1 -0
  45. package/dist/http/routes/status.js +74 -0
  46. package/dist/http/routes/task.d.ts +5 -0
  47. package/dist/http/routes/task.d.ts.map +1 -0
  48. package/dist/http/routes/task.js +22 -0
  49. package/dist/http/views/cacheClear.pug +17 -0
  50. package/dist/http/views/cacheIndex.pug +19 -0
  51. package/dist/http/views/data.pug +68 -0
  52. package/dist/http/views/docs.pug +7 -0
  53. package/dist/http/views/dumpIndex.pug +14 -0
  54. package/dist/http/views/home.pug +15 -0
  55. package/dist/http/views/includes/layout.pug +23 -0
  56. package/dist/http/views/queryIndex.pug +17 -0
  57. package/dist/http/views/statusIndex.pug +14 -0
  58. package/dist/http/views/taskIndex.pug +17 -0
  59. package/dist/lib/config/config.d.ts +26 -0
  60. package/dist/lib/config/config.d.ts.map +1 -0
  61. package/dist/lib/config/config.js +122 -0
  62. package/dist/lib/config/config.types.d.ts +74 -0
  63. package/dist/lib/config/config.types.d.ts.map +1 -0
  64. package/dist/lib/config/config.types.js +2 -0
  65. package/dist/lib/config/error/InvalidRunMode.d.ts +15 -0
  66. package/dist/lib/config/error/InvalidRunMode.d.ts.map +1 -0
  67. package/dist/lib/config/error/InvalidRunMode.js +20 -0
  68. package/dist/lib/config/error/MissingDirectory.d.ts +24 -0
  69. package/dist/lib/config/error/MissingDirectory.d.ts.map +1 -0
  70. package/dist/lib/config/error/MissingDirectory.js +23 -0
  71. package/dist/lib/config/error/MissingRequiredOption.d.ts +19 -0
  72. package/dist/lib/config/error/MissingRequiredOption.d.ts.map +1 -0
  73. package/dist/lib/config/error/MissingRequiredOption.js +21 -0
  74. package/dist/lib/config/error/NonWritableDirectory.d.ts +24 -0
  75. package/dist/lib/config/error/NonWritableDirectory.d.ts.map +1 -0
  76. package/dist/lib/config/error/NonWritableDirectory.js +23 -0
  77. package/dist/lib/config/error/index.d.ts +5 -0
  78. package/dist/lib/config/error/index.d.ts.map +1 -0
  79. package/dist/lib/config/error/index.js +16 -0
  80. package/dist/lib/config/index.d.ts +2 -0
  81. package/dist/lib/config/index.d.ts.map +1 -0
  82. package/dist/lib/config/index.js +13 -0
  83. package/dist/lib/dataServer.d.ts +21 -0
  84. package/dist/lib/dataServer.d.ts.map +1 -0
  85. package/dist/lib/dataServer.js +56 -0
  86. package/dist/lib/dataServer.types.d.ts +84 -0
  87. package/dist/lib/dataServer.types.d.ts.map +1 -0
  88. package/dist/lib/dataServer.types.js +13 -0
  89. package/dist/lib/error/DomainError.d.ts +9 -0
  90. package/dist/lib/error/DomainError.d.ts.map +1 -0
  91. package/dist/lib/error/DomainError.js +20 -0
  92. package/dist/lib/index.d.ts +2 -0
  93. package/dist/lib/index.d.ts.map +1 -0
  94. package/dist/lib/index.js +15 -0
  95. package/dist/lib/query/index.d.ts +3 -0
  96. package/dist/lib/query/index.d.ts.map +1 -0
  97. package/dist/lib/query/index.js +14 -0
  98. package/dist/lib/query/query.types.d.ts +206 -0
  99. package/dist/lib/query/query.types.d.ts.map +1 -0
  100. package/dist/lib/query/query.types.js +21 -0
  101. package/dist/lib/query/queryManager.d.ts +10 -0
  102. package/dist/lib/query/queryManager.d.ts.map +1 -0
  103. package/dist/lib/query/queryManager.js +12 -0
  104. package/dist/lib/query/queryRunner copy.d.ts +3 -0
  105. package/dist/lib/query/queryRunner copy.d.ts.map +1 -0
  106. package/dist/lib/query/queryRunner copy.js +87 -0
  107. package/dist/lib/query/queryRunner.d.ts +3 -0
  108. package/dist/lib/query/queryRunner.d.ts.map +1 -0
  109. package/dist/lib/query/queryRunner.js +96 -0
  110. package/dist/lib/query/queryTagManager.d.ts +3 -0
  111. package/dist/lib/query/queryTagManager.d.ts.map +1 -0
  112. package/dist/lib/query/queryTagManager.js +47 -0
  113. package/dist/lib/store/dataDir/dataDir.types.d.ts +36 -0
  114. package/dist/lib/store/dataDir/dataDir.types.d.ts.map +1 -0
  115. package/dist/lib/store/dataDir/dataDir.types.js +2 -0
  116. package/dist/lib/store/dataDir/dataDirManager.d.ts +3 -0
  117. package/dist/lib/store/dataDir/dataDirManager.d.ts.map +1 -0
  118. package/dist/lib/store/dataDir/dataDirManager.js +97 -0
  119. package/dist/lib/store/dataDir/index.d.ts +2 -0
  120. package/dist/lib/store/dataDir/index.d.ts.map +1 -0
  121. package/dist/lib/store/dataDir/index.js +13 -0
  122. package/dist/lib/store/dependency/dependency.types.d.ts +70 -0
  123. package/dist/lib/store/dependency/dependency.types.d.ts.map +1 -0
  124. package/dist/lib/store/dependency/dependency.types.js +2 -0
  125. package/dist/lib/store/dependency/dependencyFileHelper.d.ts +6 -0
  126. package/dist/lib/store/dependency/dependencyFileHelper.d.ts.map +1 -0
  127. package/dist/lib/store/dependency/dependencyFileHelper.js +46 -0
  128. package/dist/lib/store/dependency/dependencyManager copy.d.ts +6 -0
  129. package/dist/lib/store/dependency/dependencyManager copy.d.ts.map +1 -0
  130. package/dist/lib/store/dependency/dependencyManager copy.js +91 -0
  131. package/dist/lib/store/dependency/dependencyManager.d.ts +6 -0
  132. package/dist/lib/store/dependency/dependencyManager.d.ts.map +1 -0
  133. package/dist/lib/store/dependency/dependencyManager.js +78 -0
  134. package/dist/lib/store/dependency/dependencyManager.types.d.ts +48 -0
  135. package/dist/lib/store/dependency/dependencyManager.types.d.ts.map +1 -0
  136. package/dist/lib/store/dependency/dependencyManager.types.js +2 -0
  137. package/dist/lib/store/dependency/dependencyTagManager.d.ts +6 -0
  138. package/dist/lib/store/dependency/dependencyTagManager.d.ts.map +1 -0
  139. package/dist/lib/store/dependency/dependencyTagManager.js +33 -0
  140. package/dist/lib/store/dependency/dependencyTagger.d.ts +11 -0
  141. package/dist/lib/store/dependency/dependencyTagger.d.ts.map +1 -0
  142. package/dist/lib/store/dependency/dependencyTagger.js +99 -0
  143. package/dist/lib/store/diff/diffManager.d.ts +3 -0
  144. package/dist/lib/store/diff/diffManager.d.ts.map +1 -0
  145. package/dist/lib/store/diff/diffManager.js +114 -0
  146. package/dist/lib/store/diff/diffManager.types.d.ts +50 -0
  147. package/dist/lib/store/diff/diffManager.types.d.ts.map +1 -0
  148. package/dist/lib/store/diff/diffManager.types.js +2 -0
  149. package/dist/lib/store/diff/index.d.ts +2 -0
  150. package/dist/lib/store/diff/index.d.ts.map +1 -0
  151. package/dist/lib/store/diff/index.js +13 -0
  152. package/dist/lib/store/diff/tracker.d.ts +3 -0
  153. package/dist/lib/store/diff/tracker.d.ts.map +1 -0
  154. package/dist/lib/store/diff/tracker.js +82 -0
  155. package/dist/lib/store/diff/tracker.types.d.ts +31 -0
  156. package/dist/lib/store/diff/tracker.types.d.ts.map +1 -0
  157. package/dist/lib/store/diff/tracker.types.js +2 -0
  158. package/dist/lib/store/dump/dumpManager.d.ts +3 -0
  159. package/dist/lib/store/dump/dumpManager.d.ts.map +1 -0
  160. package/dist/lib/store/dump/dumpManager.js +199 -0
  161. package/dist/lib/store/dump/dumpManager.types.d.ts +62 -0
  162. package/dist/lib/store/dump/dumpManager.types.d.ts.map +1 -0
  163. package/dist/lib/store/dump/dumpManager.types.js +2 -0
  164. package/dist/lib/store/dump/index.d.ts +2 -0
  165. package/dist/lib/store/dump/index.d.ts.map +1 -0
  166. package/dist/lib/store/dump/index.js +13 -0
  167. package/dist/lib/store/hook/hook.types.d.ts +205 -0
  168. package/dist/lib/store/hook/hook.types.d.ts.map +1 -0
  169. package/dist/lib/store/hook/hook.types.js +2 -0
  170. package/dist/lib/store/hook/hookManager.d.ts +6 -0
  171. package/dist/lib/store/hook/hookManager.d.ts.map +1 -0
  172. package/dist/lib/store/hook/hookManager.js +168 -0
  173. package/dist/lib/store/hook/index.d.ts +2 -0
  174. package/dist/lib/store/hook/index.d.ts.map +1 -0
  175. package/dist/lib/store/hook/index.js +13 -0
  176. package/dist/lib/store/include/includeIndex.d.ts +6 -0
  177. package/dist/lib/store/include/includeIndex.d.ts.map +1 -0
  178. package/dist/lib/store/include/includeIndex.js +65 -0
  179. package/dist/lib/store/include/includeIndex.types.d.ts +29 -0
  180. package/dist/lib/store/include/includeIndex.types.d.ts.map +1 -0
  181. package/dist/lib/store/include/includeIndex.types.js +2 -0
  182. package/dist/lib/store/include/includeParser.d.ts +3 -0
  183. package/dist/lib/store/include/includeParser.d.ts.map +1 -0
  184. package/dist/lib/store/include/includeParser.js +46 -0
  185. package/dist/lib/store/include/includeParser.types.d.ts +88 -0
  186. package/dist/lib/store/include/includeParser.types.d.ts.map +1 -0
  187. package/dist/lib/store/include/includeParser.types.js +2 -0
  188. package/dist/lib/store/include/index.d.ts +2 -0
  189. package/dist/lib/store/include/index.d.ts.map +1 -0
  190. package/dist/lib/store/include/index.js +13 -0
  191. package/dist/lib/store/include/parsers/configIncludeParser.d.ts +3 -0
  192. package/dist/lib/store/include/parsers/configIncludeParser.d.ts.map +1 -0
  193. package/dist/lib/store/include/parsers/configIncludeParser.js +8 -0
  194. package/dist/lib/store/include/parsers/customIncludeParser.d.ts +3 -0
  195. package/dist/lib/store/include/parsers/customIncludeParser.d.ts.map +1 -0
  196. package/dist/lib/store/include/parsers/customIncludeParser.js +8 -0
  197. package/dist/lib/store/include/parsers/entityIncludeParser.d.ts +3 -0
  198. package/dist/lib/store/include/parsers/entityIncludeParser.d.ts.map +1 -0
  199. package/dist/lib/store/include/parsers/entityIncludeParser.js +13 -0
  200. package/dist/lib/store/include/parsers/index.d.ts +6 -0
  201. package/dist/lib/store/include/parsers/index.d.ts.map +1 -0
  202. package/dist/lib/store/include/parsers/index.js +17 -0
  203. package/dist/lib/store/include/parsers/localeIncludeParser.d.ts +3 -0
  204. package/dist/lib/store/include/parsers/localeIncludeParser.d.ts.map +1 -0
  205. package/dist/lib/store/include/parsers/localeIncludeParser.js +8 -0
  206. package/dist/lib/store/include/parsers/queryIncludeParser.d.ts +11 -0
  207. package/dist/lib/store/include/parsers/queryIncludeParser.d.ts.map +1 -0
  208. package/dist/lib/store/include/parsers/queryIncludeParser.js +45 -0
  209. package/dist/lib/store/include/parsers/types/aliasIncludeParser.d.ts +3 -0
  210. package/dist/lib/store/include/parsers/types/aliasIncludeParser.d.ts.map +1 -0
  211. package/dist/lib/store/include/parsers/types/aliasIncludeParser.js +10 -0
  212. package/dist/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.d.ts +8 -0
  213. package/dist/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.d.ts.map +1 -0
  214. package/dist/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.js +18 -0
  215. package/dist/lib/store/index.d.ts +2 -0
  216. package/dist/lib/store/index.d.ts.map +1 -0
  217. package/dist/lib/store/index.js +13 -0
  218. package/dist/lib/store/store.d.ts +7 -0
  219. package/dist/lib/store/store.d.ts.map +1 -0
  220. package/dist/lib/store/store.js +89 -0
  221. package/dist/lib/store/store.types.d.ts +231 -0
  222. package/dist/lib/store/store.types.d.ts.map +1 -0
  223. package/dist/lib/store/store.types.js +2 -0
  224. package/dist/lib/store/storeManager.d.ts +3 -0
  225. package/dist/lib/store/storeManager.d.ts.map +1 -0
  226. package/dist/lib/store/storeManager.js +149 -0
  227. package/dist/lib/store/workDir/index.d.ts +2 -0
  228. package/dist/lib/store/workDir/index.d.ts.map +1 -0
  229. package/dist/lib/store/workDir/index.js +13 -0
  230. package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts +9 -0
  231. package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts.map +1 -0
  232. package/dist/lib/store/workDir/storage/getChangedLinesSince.js +47 -0
  233. package/dist/lib/store/workDir/storage/getDataFromLogLine.d.ts +10 -0
  234. package/dist/lib/store/workDir/storage/getDataFromLogLine.d.ts.map +1 -0
  235. package/dist/lib/store/workDir/storage/getDataFromLogLine.js +33 -0
  236. package/dist/lib/store/workDir/storage/getLogFile.d.ts +8 -0
  237. package/dist/lib/store/workDir/storage/getLogFile.d.ts.map +1 -0
  238. package/dist/lib/store/workDir/storage/getLogFile.js +11 -0
  239. package/dist/lib/store/workDir/storage/index.d.ts +4 -0
  240. package/dist/lib/store/workDir/storage/index.d.ts.map +1 -0
  241. package/dist/lib/store/workDir/storage/index.js +20 -0
  242. package/dist/lib/store/workDir/workDir.types.d.ts +44 -0
  243. package/dist/lib/store/workDir/workDir.types.d.ts.map +1 -0
  244. package/dist/lib/store/workDir/workDir.types.js +2 -0
  245. package/dist/lib/store/workDir/workDirHelper.d.ts +20 -0
  246. package/dist/lib/store/workDir/workDirHelper.d.ts.map +1 -0
  247. package/dist/lib/store/workDir/workDirHelper.js +52 -0
  248. package/dist/lib/task/index.d.ts +3 -0
  249. package/dist/lib/task/index.d.ts.map +1 -0
  250. package/dist/lib/task/index.js +14 -0
  251. package/dist/lib/task/task.types.d.ts +140 -0
  252. package/dist/lib/task/task.types.d.ts.map +1 -0
  253. package/dist/lib/task/task.types.js +11 -0
  254. package/dist/lib/task/taskManager.d.ts +10 -0
  255. package/dist/lib/task/taskManager.d.ts.map +1 -0
  256. package/dist/lib/task/taskManager.js +12 -0
  257. package/dist/lib/task/taskRunner.d.ts +3 -0
  258. package/dist/lib/task/taskRunner.d.ts.map +1 -0
  259. package/dist/lib/task/taskRunner.js +71 -0
  260. package/dist/lib/tsdoc-metadata.json +11 -0
  261. package/dist/lib/utils/array/arrayUtils.d.ts +2 -0
  262. package/dist/lib/utils/array/arrayUtils.d.ts.map +1 -0
  263. package/dist/lib/utils/array/arrayUtils.js +11 -0
  264. package/dist/lib/utils/cache/cacheBinManager.d.ts +37 -0
  265. package/dist/lib/utils/cache/cacheBinManager.d.ts.map +1 -0
  266. package/dist/lib/utils/cache/cacheBinManager.js +53 -0
  267. package/dist/lib/utils/cache/index.d.ts +2 -0
  268. package/dist/lib/utils/cache/index.d.ts.map +1 -0
  269. package/dist/lib/utils/cache/index.js +13 -0
  270. package/dist/lib/utils/fs/fs.types.d.ts +20 -0
  271. package/dist/lib/utils/fs/fs.types.d.ts.map +1 -0
  272. package/dist/lib/utils/fs/fs.types.js +2 -0
  273. package/dist/lib/utils/fs/fsUtils.d.ts +62 -0
  274. package/dist/lib/utils/fs/fsUtils.d.ts.map +1 -0
  275. package/dist/lib/utils/fs/fsUtils.js +137 -0
  276. package/dist/lib/utils/fs/index.d.ts +2 -0
  277. package/dist/lib/utils/fs/index.d.ts.map +1 -0
  278. package/dist/lib/utils/fs/index.js +13 -0
  279. package/dist/lib/utils/logger/index.d.ts +2 -0
  280. package/dist/lib/utils/logger/index.d.ts.map +1 -0
  281. package/dist/lib/utils/logger/index.js +13 -0
  282. package/dist/lib/utils/logger/logger.d.ts +32 -0
  283. package/dist/lib/utils/logger/logger.d.ts.map +1 -0
  284. package/dist/lib/utils/logger/logger.js +82 -0
  285. package/dist/lib/utils/logger/logger.types.d.ts +37 -0
  286. package/dist/lib/utils/logger/logger.types.d.ts.map +1 -0
  287. package/dist/lib/utils/logger/logger.types.js +15 -0
  288. package/dist/lib/utils/module/dirBasedModuleGroupManager.d.ts +30 -0
  289. package/dist/lib/utils/module/dirBasedModuleGroupManager.d.ts.map +1 -0
  290. package/dist/lib/utils/module/dirBasedModuleGroupManager.js +78 -0
  291. package/dist/lib/utils/module/index.d.ts +3 -0
  292. package/dist/lib/utils/module/index.d.ts.map +1 -0
  293. package/dist/lib/utils/module/index.js +14 -0
  294. package/dist/lib/utils/module/module.types.d.ts +53 -0
  295. package/dist/lib/utils/module/module.types.d.ts.map +1 -0
  296. package/dist/lib/utils/module/module.types.js +2 -0
  297. package/dist/lib/utils/module/moduleManager.d.ts +64 -0
  298. package/dist/lib/utils/module/moduleManager.d.ts.map +1 -0
  299. package/dist/lib/utils/module/moduleManager.js +139 -0
  300. package/dist/lib/utils/object/index.d.ts +2 -0
  301. package/dist/lib/utils/object/index.d.ts.map +1 -0
  302. package/dist/lib/utils/object/index.js +13 -0
  303. package/dist/lib/utils/object/object.types.d.ts +72 -0
  304. package/dist/lib/utils/object/object.types.d.ts.map +1 -0
  305. package/dist/lib/utils/object/object.types.js +2 -0
  306. package/dist/lib/utils/object/objectUtils.d.ts +45 -0
  307. package/dist/lib/utils/object/objectUtils.d.ts.map +1 -0
  308. package/dist/lib/utils/object/objectUtils.js +64 -0
  309. package/dist/lib/utils/string/index.d.ts +2 -0
  310. package/dist/lib/utils/string/index.d.ts.map +1 -0
  311. package/dist/lib/utils/string/index.js +13 -0
  312. package/dist/lib/utils/string/string.types.d.ts +2 -0
  313. package/dist/lib/utils/string/string.types.d.ts.map +1 -0
  314. package/dist/lib/utils/string/string.types.js +2 -0
  315. package/dist/lib/utils/string/stringUtils.d.ts +37 -0
  316. package/dist/lib/utils/string/stringUtils.d.ts.map +1 -0
  317. package/dist/lib/utils/string/stringUtils.js +62 -0
  318. package/dist/lib/watcher/index.d.ts +2 -0
  319. package/dist/lib/watcher/index.d.ts.map +1 -0
  320. package/dist/lib/watcher/index.js +13 -0
  321. package/dist/lib/watcher/watcher.d.ts +17 -0
  322. package/dist/lib/watcher/watcher.d.ts.map +1 -0
  323. package/dist/lib/watcher/watcher.js +65 -0
  324. package/dist/static-suite-data-server.d.ts +392 -0
  325. package/package.json +102 -0
  326. package/scripts/copy-http-files-to-src.js +45 -0
  327. package/src/__tests__/fixtures/data/en/en.json +3 -0
  328. package/src/__tests__/fixtures/data/en/entity/entity.json +3 -0
  329. package/src/__tests__/fixtures/data/en/entity/node/article/article1--card.json +3 -0
  330. package/src/__tests__/fixtures/data/en/entity/node/article/article1--small.json +3 -0
  331. package/src/__tests__/fixtures/data/en/entity/node/article/article1.json +40 -0
  332. package/src/__tests__/fixtures/data/en/entity/node/article/article2--card.json +3 -0
  333. package/src/__tests__/fixtures/data/en/entity/node/article/article2--small.json +3 -0
  334. package/src/__tests__/fixtures/data/en/entity/node/article/article2.json +40 -0
  335. package/src/__tests__/fixtures/data/en/entity/node/article/article3--card.json +3 -0
  336. package/src/__tests__/fixtures/data/en/entity/node/article/article3--small.json +3 -0
  337. package/src/__tests__/fixtures/data/en/entity/node/article/article3.json +7 -0
  338. package/src/__tests__/fixtures/data/en/entity/node/node.json +3 -0
  339. package/src/__tests__/fixtures/data/en/entity/node/page/page1--card.json +3 -0
  340. package/src/__tests__/fixtures/data/en/entity/node/page/page1--small.json +3 -0
  341. package/src/__tests__/fixtures/data/en/entity/node/page/page1.json +3 -0
  342. package/src/__tests__/fixtures/data/en/entity/node/page/page2--card.json +3 -0
  343. package/src/__tests__/fixtures/data/en/entity/node/page/page2--small.json +3 -0
  344. package/src/__tests__/fixtures/data/en/entity/node/page/page2.json +3 -0
  345. package/src/__tests__/fixtures/data/global--block.json +3 -0
  346. package/src/__tests__/fixtures/data/global.json +3 -0
  347. package/src/__tests__/fixtures/hook/main.hook.js +15 -0
  348. package/src/__tests__/fixtures/hook/taxonomy/main.hook.js +15 -0
  349. package/src/__tests__/fixtures/hook/taxonomy/taxo.hook.js +15 -0
  350. package/src/__tests__/fixtures/query/error.query.js +6 -0
  351. package/src/__tests__/fixtures/query/noHandler.query.js +14 -0
  352. package/src/__tests__/fixtures/query/query1.query.js +15 -0
  353. package/src/__tests__/fixtures/query/query2.query.js +14 -0
  354. package/src/__tests__/fixtures/query/wrongNamequery.js +14 -0
  355. package/src/__tests__/fixtures/task/error.task.js +6 -0
  356. package/src/__tests__/fixtures/task/noHandler.task.js +13 -0
  357. package/src/__tests__/fixtures/task/task1.task.js +14 -0
  358. package/src/__tests__/fixtures/task/task2.task.js +13 -0
  359. package/src/__tests__/fixtures/task/wrongNametask.js +13 -0
  360. package/src/bin/serve.ts +107 -0
  361. package/src/http/httpServer.ts +21 -0
  362. package/src/http/routes/cache.ts +17 -0
  363. package/src/http/routes/data.ts +114 -0
  364. package/src/http/routes/docs.ts +9 -0
  365. package/src/http/routes/dump.ts +61 -0
  366. package/src/http/routes/home.ts +16 -0
  367. package/src/http/routes/index.ts +47 -0
  368. package/src/http/routes/query.ts +27 -0
  369. package/src/http/routes/status.ts +89 -0
  370. package/src/http/routes/task.ts +29 -0
  371. package/src/http/views/cacheClear.pug +17 -0
  372. package/src/http/views/cacheIndex.pug +19 -0
  373. package/src/http/views/data.pug +68 -0
  374. package/src/http/views/docs.pug +7 -0
  375. package/src/http/views/dumpIndex.pug +14 -0
  376. package/src/http/views/home.pug +15 -0
  377. package/src/http/views/includes/layout.pug +23 -0
  378. package/src/http/views/queryIndex.pug +17 -0
  379. package/src/http/views/statusIndex.pug +14 -0
  380. package/src/http/views/taskIndex.pug +17 -0
  381. package/src/lib/config/__tests__/config.test.ts +132 -0
  382. package/src/lib/config/config.ts +143 -0
  383. package/src/lib/config/config.types.ts +87 -0
  384. package/src/lib/config/error/InvalidRunMode.ts +17 -0
  385. package/src/lib/config/error/MissingDirectory.ts +30 -0
  386. package/src/lib/config/error/MissingRequiredOption.ts +23 -0
  387. package/src/lib/config/error/NonWritableDirectory.ts +30 -0
  388. package/src/lib/config/error/index.ts +4 -0
  389. package/src/lib/config/index.ts +1 -0
  390. package/src/lib/dataServer.ts +81 -0
  391. package/src/lib/dataServer.types.ts +98 -0
  392. package/src/lib/error/DomainError.ts +18 -0
  393. package/src/lib/index.ts +4 -0
  394. package/src/lib/query/__tests__/queryRunner.test.ts +61 -0
  395. package/src/lib/query/index.ts +2 -0
  396. package/src/lib/query/query.types.ts +231 -0
  397. package/src/lib/query/queryManager.ts +11 -0
  398. package/src/lib/query/queryRunner.ts +110 -0
  399. package/src/lib/query/queryTagManager.ts +53 -0
  400. package/src/lib/store/dataDir/__tests__/dataDirManager.test.ts +15 -0
  401. package/src/lib/store/dataDir/dataDir.types.ts +38 -0
  402. package/src/lib/store/dataDir/dataDirManager.ts +121 -0
  403. package/src/lib/store/dataDir/index.ts +1 -0
  404. package/src/lib/store/dependency/dependency.types.ts +78 -0
  405. package/src/lib/store/dependency/dependencyFileHelper.ts +50 -0
  406. package/src/lib/store/dependency/dependencyManager.ts +82 -0
  407. package/src/lib/store/dependency/dependencyTagger.ts +105 -0
  408. package/src/lib/store/diff/diffManager.ts +122 -0
  409. package/src/lib/store/diff/diffManager.types.ts +51 -0
  410. package/src/lib/store/diff/index.ts +1 -0
  411. package/src/lib/store/dump/dumpManager.ts +235 -0
  412. package/src/lib/store/dump/dumpManager.types.ts +61 -0
  413. package/src/lib/store/dump/index.ts +1 -0
  414. package/src/lib/store/hook/hook.types.ts +232 -0
  415. package/src/lib/store/hook/hookManager.ts +180 -0
  416. package/src/lib/store/hook/index.ts +1 -0
  417. package/src/lib/store/include/__tests__/includeParser.test.ts +80 -0
  418. package/src/lib/store/include/includeParser.ts +54 -0
  419. package/src/lib/store/include/includeParser.types.ts +99 -0
  420. package/src/lib/store/include/index.ts +1 -0
  421. package/src/lib/store/include/parsers/__tests__/entityIncludeParser.test.ts +43 -0
  422. package/src/lib/store/include/parsers/configIncludeParser.ts +8 -0
  423. package/src/lib/store/include/parsers/customIncludeParser.ts +8 -0
  424. package/src/lib/store/include/parsers/entityIncludeParser.ts +15 -0
  425. package/src/lib/store/include/parsers/index.ts +5 -0
  426. package/src/lib/store/include/parsers/localeIncludeParser.ts +8 -0
  427. package/src/lib/store/include/parsers/queryIncludeParser.ts +51 -0
  428. package/src/lib/store/include/parsers/types/__tests__/aliasIncludeParser.test.ts +37 -0
  429. package/src/lib/store/include/parsers/types/__tests__/aliasWithoutTypeIncludeParser.test.ts +43 -0
  430. package/src/lib/store/include/parsers/types/aliasIncludeParser.ts +13 -0
  431. package/src/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.ts +22 -0
  432. package/src/lib/store/index.ts +1 -0
  433. package/src/lib/store/store.ts +105 -0
  434. package/src/lib/store/store.types.ts +251 -0
  435. package/src/lib/store/storeManager.ts +187 -0
  436. package/src/lib/store/workDir/__tests__/workDirHelper.test.ts +25 -0
  437. package/src/lib/store/workDir/index.ts +1 -0
  438. package/src/lib/store/workDir/storage/__tests__/getChangedLinesSince.test.ts +23 -0
  439. package/src/lib/store/workDir/storage/__tests__/getDataFromLogLine.test.ts +21 -0
  440. package/src/lib/store/workDir/storage/getChangedLinesSince.ts +47 -0
  441. package/src/lib/store/workDir/storage/getDataFromLogLine.ts +31 -0
  442. package/src/lib/store/workDir/storage/getLogFile.ts +11 -0
  443. package/src/lib/store/workDir/storage/index.ts +8 -0
  444. package/src/lib/store/workDir/workDir.types.ts +48 -0
  445. package/src/lib/store/workDir/workDirHelper.ts +59 -0
  446. package/src/lib/task/__tests__/taskRunner.test.ts +47 -0
  447. package/src/lib/task/index.ts +2 -0
  448. package/src/lib/task/task.types.ts +151 -0
  449. package/src/lib/task/taskManager.ts +11 -0
  450. package/src/lib/task/taskRunner.ts +79 -0
  451. package/src/lib/utils/array/__tests__/arrayUtils.test.ts +16 -0
  452. package/src/lib/utils/array/arrayUtils.ts +7 -0
  453. package/src/lib/utils/cache/__tests__/cache.test.ts +24 -0
  454. package/src/lib/utils/cache/cacheBinManager.ts +88 -0
  455. package/src/lib/utils/cache/index.ts +1 -0
  456. package/src/lib/utils/fs/__tests__/fixtures/file.json +3 -0
  457. package/src/lib/utils/fs/__tests__/fixtures/file.txt +3 -0
  458. package/src/lib/utils/fs/__tests__/fsUtils.test.ts +93 -0
  459. package/src/lib/utils/fs/fs.types.ts +21 -0
  460. package/src/lib/utils/fs/fsUtils.ts +141 -0
  461. package/src/lib/utils/fs/index.ts +1 -0
  462. package/src/lib/utils/logger/__tests__/logger.test.ts +12 -0
  463. package/src/lib/utils/logger/index.ts +1 -0
  464. package/src/lib/utils/logger/logger.ts +87 -0
  465. package/src/lib/utils/logger/logger.types.ts +41 -0
  466. package/src/lib/utils/module/__mocks__/dummyModule.query.js +4 -0
  467. package/src/lib/utils/module/__mocks__/dummyModule2.query.js +4 -0
  468. package/src/lib/utils/module/__tests__/dirBasedModuleGroupManager.test.ts +34 -0
  469. package/src/lib/utils/module/__tests__/moduleHandler.test.ts +100 -0
  470. package/src/lib/utils/module/dirBasedModuleGroupManager.ts +78 -0
  471. package/src/lib/utils/module/index.ts +2 -0
  472. package/src/lib/utils/module/module.types.ts +57 -0
  473. package/src/lib/utils/module/moduleManager.ts +144 -0
  474. package/src/lib/utils/object/__tests__/objectUtils.test.ts +62 -0
  475. package/src/lib/utils/object/index.ts +1 -0
  476. package/src/lib/utils/object/object.types.ts +74 -0
  477. package/src/lib/utils/object/objectUtils.ts +71 -0
  478. package/src/lib/utils/string/__tests__/stringUtils.test.ts +30 -0
  479. package/src/lib/utils/string/index.ts +1 -0
  480. package/src/lib/utils/string/string.types.ts +1 -0
  481. package/src/lib/utils/string/stringUtils.ts +61 -0
  482. package/src/lib/watcher/index.ts +1 -0
  483. package/src/lib/watcher/watcher.ts +66 -0
  484. package/tsconfig.json +83 -0
@@ -0,0 +1,50 @@
1
+ import { Json } from '@lib/utils/object/object.types';
2
+ import { dependencyTagger } from './dependencyTagger';
3
+
4
+ export const dependencyIncludeHelper = {
5
+ setIncludeDependencies: (filepath: string, json: Json): void => {
6
+ const includes = json?.metadata?.includes;
7
+
8
+ if (includes?.static) {
9
+ const staticIncludes = Object.values(includes?.static);
10
+ dependencyTagger.setDependency(filepath, staticIncludes);
11
+ }
12
+
13
+ if (includes?.dynamic) {
14
+ const dynamicIncludes = Object.values(includes?.dynamic);
15
+ dependencyTagger.setDependency(filepath, dynamicIncludes);
16
+ // Queries are invalidated by any data change until they are executed,
17
+ // when they return their dependencies. They are "globally invalidable" when:
18
+ // 1) Are added for the first time
19
+ // 2) Are updated: file can contain another query include,
20
+ // or different parameters, etc
21
+ // In another words:
22
+ // 1) When a file with a query is loaded for he first time,
23
+ // that query has a dependency on "*"
24
+ // 2) When that query is executed, it has a dependency on "node:1234"
25
+ // 3) When that file with a query is updated, the query has again a dependency on "*"
26
+ dynamicIncludes.forEach(queryDefinition => {
27
+ dependencyTagger.setDependency(queryDefinition, ['*']);
28
+ });
29
+ }
30
+ },
31
+
32
+ deleteIncludeDependencies: (filepath: string, json: Json): void => {
33
+ const includes = json?.metadata?.includes;
34
+
35
+ if (includes?.static) {
36
+ const staticIncludes = Object.values(includes?.static);
37
+ dependencyTagger.deleteDependency(filepath, staticIncludes);
38
+ }
39
+
40
+ if (includes?.dynamic) {
41
+ const dynamicIncludes = Object.values(includes?.dynamic);
42
+ dependencyTagger.deleteDependency(filepath, dynamicIncludes);
43
+ // Queries are invalidated by any data change until they are executed,
44
+ // when they return their dependencies. Remove that dependency if still present.
45
+ dynamicIncludes.forEach(queryDefinition => {
46
+ dependencyTagger.deleteDependency(queryDefinition, ['*']);
47
+ });
48
+ }
49
+ },
50
+ };
@@ -0,0 +1,82 @@
1
+ import { store } from '../store';
2
+ import { DependencyManager } from './dependency.types';
3
+ import { getReversedDependencyTree, invalidatedTags } from './dependencyTagger';
4
+
5
+ const invalidatedFilepaths = {
6
+ updated: new Set<string>(),
7
+ deleted: new Set<string>(),
8
+ };
9
+
10
+ /**
11
+ * Gets a list of parents of a dependency tag
12
+ */
13
+ const getTagParents = (tag: string, parents = new Set<string>()) => {
14
+ getReversedDependencyTree()
15
+ .get(tag)
16
+ ?.forEach(parent => {
17
+ if (!parents.has(parent)) {
18
+ parents.add(parent);
19
+ getTagParents(parent, parents);
20
+ }
21
+ });
22
+ return parents;
23
+ };
24
+
25
+ /**
26
+ * Gets a recursive list of invalidated tags.
27
+ *
28
+ * @remarks
29
+ * Iterates over all explicitly invalidated tags, and obtains all
30
+ * its parents.
31
+ */
32
+ const getInvalidatedTags = (): string[] => {
33
+ const allInvalidatedTags = new Set<string>();
34
+ const invalidatedTagsArray = Array.from(invalidatedTags);
35
+ if (invalidatedTagsArray.length > 0) {
36
+ invalidatedTagsArray.push('*');
37
+ }
38
+ invalidatedTagsArray.forEach(invalidatedTag => {
39
+ // Mark this tag as invalidated.
40
+ if (invalidatedTag !== '*') {
41
+ allInvalidatedTags.add(invalidatedTag);
42
+ }
43
+
44
+ // Search for parents of this invalidated tag.
45
+ getTagParents(invalidatedTag).forEach(parentTag => {
46
+ allInvalidatedTags.add(parentTag);
47
+ });
48
+ });
49
+ return Array.from(allInvalidatedTags);
50
+ };
51
+
52
+ /**
53
+ * Manager that keeps control of dependencies between data.
54
+ */
55
+ export const dependencyManager: DependencyManager = {
56
+ trackInvalidatedFilepaths: () => {
57
+ const allInvalidatedTags = getInvalidatedTags();
58
+ allInvalidatedTags.forEach(invalidatedTag => {
59
+ if (store.deleted.has(invalidatedTag)) {
60
+ invalidatedFilepaths.deleted.add(invalidatedTag);
61
+ invalidatedFilepaths.updated.delete(invalidatedTag);
62
+ } else if (store.data.has(invalidatedTag)) {
63
+ invalidatedFilepaths.updated.add(invalidatedTag);
64
+ invalidatedFilepaths.deleted.delete(invalidatedTag);
65
+ }
66
+ });
67
+ },
68
+
69
+ getInvalidatedFilepaths: () => {
70
+ dependencyManager.trackInvalidatedFilepaths();
71
+ return {
72
+ updated: Array.from(invalidatedFilepaths.updated),
73
+ deleted: Array.from(invalidatedFilepaths.deleted),
74
+ };
75
+ },
76
+
77
+ reset: () => {
78
+ invalidatedTags.clear();
79
+ invalidatedFilepaths.updated.clear();
80
+ invalidatedFilepaths.deleted.clear();
81
+ },
82
+ };
@@ -0,0 +1,105 @@
1
+ import { DependencyTagger, DependencyTree } from './dependency.types';
2
+
3
+ export const dependencyTree: DependencyTree = new Map<string, Set<string>>();
4
+
5
+ export const invalidatedTags = new Set<string>();
6
+
7
+ const reversedDependencyTree: DependencyTree = new Map<string, Set<string>>();
8
+
9
+ let reversedDependencyTreeIsValid = false;
10
+
11
+ /**
12
+ * Makes a reverted version of the dependency tree
13
+ *
14
+ * @remarks Required to be able to search for dependencies in a fast way.
15
+ */
16
+ export const getReversedDependencyTree = (): DependencyTree => {
17
+ if (!reversedDependencyTreeIsValid) {
18
+ reversedDependencyTree.clear();
19
+ dependencyTree.forEach((children, parent) => {
20
+ children.forEach(child => {
21
+ const previousData = reversedDependencyTree.get(child);
22
+ if (previousData) {
23
+ previousData.add(parent);
24
+ } else {
25
+ reversedDependencyTree.set(child, new Set([parent]));
26
+ }
27
+ });
28
+ });
29
+ reversedDependencyTreeIsValid = true;
30
+ }
31
+
32
+ return reversedDependencyTree;
33
+ };
34
+
35
+ export const dependencyTagger: DependencyTagger = {
36
+ setDependency: (tag, dependsOnTags) => {
37
+ dependencyTree.set(tag, new Set(dependsOnTags));
38
+ reversedDependencyTreeIsValid = false;
39
+ },
40
+
41
+ addDependency: (tag, dependsOnTags) => {
42
+ const previousData = dependencyTree.get(tag);
43
+ if (previousData) {
44
+ dependsOnTags.forEach(dependsOnTag => previousData.add(dependsOnTag));
45
+ } else {
46
+ dependencyTree.set(tag, new Set(dependsOnTags));
47
+ }
48
+ reversedDependencyTreeIsValid = false;
49
+ },
50
+
51
+ deleteDependency: (tag, dependsOnTags) => {
52
+ const previousData = dependencyTree.get(tag);
53
+ if (previousData) {
54
+ dependsOnTags?.forEach(dependsOnTag => previousData.delete(dependsOnTag));
55
+ if (previousData.size === 0) {
56
+ dependencyTree.delete(tag);
57
+ }
58
+ }
59
+ reversedDependencyTreeIsValid = false;
60
+ },
61
+
62
+ invalidateTags: tags => {
63
+ tags.forEach(tag => {
64
+ invalidatedTags.add(tag);
65
+ });
66
+ },
67
+ };
68
+
69
+ /*
70
+ import { DependencyTagger } from './dependency.types';
71
+
72
+ export const dependencyTree = new Map<string, Set<string>>();
73
+
74
+ export const invalidatedTags = new Set<string>();
75
+
76
+ export const dependencyTagger: DependencyTagger = {
77
+ setDependency: (tag, dependsOnTags) => {
78
+ dependsOnTags.forEach(dependsOnTag => {
79
+ const previousData = dependencyTree.get(dependsOnTag);
80
+ if (previousData) {
81
+ previousData.add(tag);
82
+ } else {
83
+ dependencyTree.set(dependsOnTag, new Set<string>([tag]));
84
+ }
85
+ });
86
+ },
87
+
88
+ deleteDependency: (tag, dependsOnTags) => {
89
+ dependsOnTags.forEach(dependsOnTag => {
90
+ const previousData = dependencyTree.get(dependsOnTag);
91
+ if (previousData) {
92
+ previousData.delete(tag);
93
+ if (previousData.size === 0) {
94
+ dependencyTree.delete(dependsOnTag);
95
+ }
96
+ }
97
+ });
98
+ },
99
+
100
+ invalidateTags: tags => {
101
+ tags.forEach(tag => {
102
+ invalidatedTags.add(tag);
103
+ });
104
+ },
105
+ }; */
@@ -0,0 +1,122 @@
1
+ import microtime from 'microtime';
2
+ import { logger } from '@lib/utils/logger';
3
+ import { store } from '../store';
4
+ import { DiffManager, Diff } from './diffManager.types';
5
+ import { dataDirManager } from '../dataDir/dataDirManager';
6
+ import { dependencyManager } from '../dependency/dependencyManager';
7
+
8
+ let lastDiffDate: Date | null = null;
9
+
10
+ export const diffManager: DiffManager = {
11
+ reset(date: Date): void {
12
+ lastDiffDate = date;
13
+ dependencyManager.reset();
14
+ },
15
+
16
+ getDiff(options = { incremental: true }): Diff {
17
+ const startDate = microtime.now();
18
+
19
+ // Before getting any diff data, update any pending changes from data dir.
20
+ dataDirManager.update();
21
+
22
+ let updated = new Set<string>();
23
+ let deleted = new Set<string>();
24
+ if (options.incremental && lastDiffDate) {
25
+ logger.debug(`Getting incremental diff using date "${lastDiffDate}"`);
26
+ const invalidatedFilepaths = dependencyManager.getInvalidatedFilepaths();
27
+ updated = new Set<string>(invalidatedFilepaths.updated);
28
+ deleted = new Set<string>(invalidatedFilepaths.deleted);
29
+ } else {
30
+ // If no sinceDate is passed, return all files
31
+ logger.debug(`Getting full diff with no date`);
32
+ updated = new Set<string>(store.data.keys());
33
+ }
34
+
35
+ const diff: Diff = {
36
+ since: lastDiffDate ? lastDiffDate.getTime() : new Date(0).getTime(),
37
+ updated,
38
+ deleted,
39
+ };
40
+
41
+ logger.info(
42
+ `Diff created in ${(microtime.now() - startDate) / 1000} ms. Updated: ${
43
+ diff.updated.size
44
+ } / Deleted: ${diff.deleted.size}`,
45
+ );
46
+
47
+ // Log diff if not empty
48
+ // if (diff.updated.length || diff.deleted.length) {
49
+ // logger.debug(`Diff: "${JSON.stringify(jsonify(diff))}"`);
50
+ // }
51
+
52
+ return diff;
53
+ },
54
+
55
+ /*
56
+ getDiff(options = { incremental: true }): Diff {
57
+ const startDate = microtime.now();
58
+
59
+ // Before getting any diff data, update any pending changes from data dir.
60
+ const changedFiles = dataDirManager.update();
61
+
62
+ let updated = new Set<string>();
63
+ let deleted = new Set<string>();
64
+ const sinceDate = getLastDiffDate();
65
+ if (options.incremental && sinceDate) {
66
+ logger.debug(`Getting incremental diff using date "${sinceDate}"`);
67
+ // Only process changedFiles if not empty.
68
+ if (changedFiles.updated.length || changedFiles.deleted.length) {
69
+ // Update tracked files so no affected parent is missed.
70
+ changedFiles.updated.forEach(file => {
71
+ tracker.trackChangedFile(file);
72
+ });
73
+ changedFiles.deleted.forEach(file => {
74
+ tracker.trackChangedFile(file);
75
+ });
76
+ }
77
+
78
+ // Create the resulting set of updated and deleted files.
79
+ // "updated" includes all affected parents tracked down
80
+ // by tracker, without any deleted file.
81
+ updated = new Set<string>(tracker.getChangedFiles());
82
+ changedFiles.deleted.forEach(file => updated.delete(file));
83
+
84
+ // "deleted" includes only deleted files, and is based only
85
+ // on data coming from changedFiles, because all deleted files
86
+ // are stored on Static Suite Data Server log
87
+ deleted = new Set<string>(changedFiles.deleted);
88
+
89
+ // Add updated files affected by queries only if "updated" or "deleted"
90
+ // contain any changes.
91
+ if (updated.size > 0 || deleted.size > 0) {
92
+ queryTagManager
93
+ .getInvalidFilepaths()
94
+ .forEach(file => updated.add(file));
95
+ queryTagManager.resetInvalidatedTags();
96
+ }
97
+ } else {
98
+ // If no sinceDate is passed, return all files
99
+ logger.debug(`Getting full diff with no date`);
100
+ updated = new Set<string>(store.data.keys());
101
+ }
102
+
103
+ const diff: Diff = {
104
+ since: sinceDate ? sinceDate.getTime() : new Date(0).getTime(),
105
+ updated,
106
+ deleted,
107
+ };
108
+
109
+ logger.info(
110
+ `Diff created in ${(microtime.now() - startDate) / 1000} ms. Updated: ${
111
+ diff.updated.size
112
+ } / Deleted: ${diff.deleted.size}`,
113
+ );
114
+
115
+ // Log diff if not empty
116
+ // if (diff.updated.length || diff.deleted.length) {
117
+ // logger.debug(`Diff: "${JSON.stringify(jsonify(diff))}"`);
118
+ // }
119
+
120
+ return diff;
121
+ }, */
122
+ };
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Service that handles the incremental differences in data (includes and queries).
3
+ */
4
+ export type DiffManager = {
5
+ /**
6
+ * Clears intermediate changes tracked by trackChangedFile().
7
+ *
8
+ * @param date - Date to be used as a timestamp for the next diff.
9
+ */
10
+ reset(date: Date): void;
11
+
12
+ /**
13
+ * Gets a list of changed files affected by includes and queries.
14
+ *
15
+ * @remarks
16
+ * This function does not need any date passed as argument to get a diff from.
17
+ * It simply uses the timestamp of the last generated diff. Calling this function does
18
+ * not automatically update that timestamp, because diff data must be stored in
19
+ * disk (a process called "dump"). Once a dump is finished, we can use the new
20
+ * timestamp for further diffs.
21
+ *
22
+ * To obtain a diff, we need changed files from:
23
+ *
24
+ * 1) includes: every time a file changes, all its parents are affected.
25
+ * 2) queries: there is no easy way to know if a changed file will alter a query,
26
+ * so we run all of them and check if something has changed.
27
+
28
+ * @param options - Configuration options
29
+ */
30
+ getDiff(options?: { incremental: boolean }): Diff;
31
+ };
32
+
33
+ /**
34
+ * A group of changed files in Static Suite's data dir.
35
+ */
36
+ export type Diff = {
37
+ /**
38
+ * Timestamp in milliseconds.
39
+ */
40
+ since: number;
41
+
42
+ /**
43
+ * A list of updated files (both newly added and changed files).
44
+ */
45
+ updated: Set<string>;
46
+
47
+ /**
48
+ * A list of deleted files.
49
+ */
50
+ deleted: Set<string>;
51
+ };
@@ -0,0 +1 @@
1
+ export * from './diffManager';
@@ -0,0 +1,235 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import microtime from 'microtime';
4
+ import { logger } from '@lib/utils/logger';
5
+ import { jsonify } from '@lib/utils/object';
6
+ import { getFileContent, isJsonFile, readFile } from '@lib/utils/fs';
7
+ import { config } from '@lib/config';
8
+ import { store } from '@lib/store';
9
+ import { diffManager } from '../diff/diffManager';
10
+ import { Diff } from '../diff/diffManager.types';
11
+ import { Dump, DumpManager } from './dumpManager.types';
12
+ import { hookManager } from '../hook';
13
+
14
+ const removeEmptyDirsUpwards = (dir: string): void => {
15
+ const isEmpty = fs.readdirSync(dir).length === 0;
16
+ if (isEmpty) {
17
+ try {
18
+ fs.rmdirSync(dir);
19
+ } catch (e) {
20
+ logger.debug(`Error deleting empty directory "${dir}": ${e}`);
21
+ }
22
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
23
+ removeEmptyDirsUpwards(path.dirname(dir));
24
+ }
25
+ };
26
+
27
+ const storeUpdatedFiles = (diff: Diff, dump: Dump, dumpDir: string): void => {
28
+ diff.updated.forEach(relativeFilepath => {
29
+ const storeFileContentData = store.data.get(relativeFilepath);
30
+ if (storeFileContentData) {
31
+ const absoluteFilepathInDumpDir = `${dumpDir}/${relativeFilepath}`;
32
+ try {
33
+ // Create parent directories if they are missing.
34
+ const dir = path.dirname(absoluteFilepathInDumpDir);
35
+ if (!fs.existsSync(dir)) {
36
+ fs.mkdirSync(dir, { recursive: true });
37
+ }
38
+
39
+ // If store data is an object, stringify it to execute its
40
+ // queries and resolve its includes.
41
+ const isJson = isJsonFile(relativeFilepath);
42
+ const storeFileContentString = isJson
43
+ ? JSON.stringify(storeFileContentData)
44
+ : storeFileContentData;
45
+
46
+ // Before overwriting a file, check it has changed.
47
+ let needsSave = true;
48
+ let oldPublicUrl: string | null = null;
49
+ const newPublicUrl: string | null =
50
+ storeFileContentData.data?.content?.url?.path || null;
51
+ if (fs.existsSync(absoluteFilepathInDumpDir)) {
52
+ const dumpFileContentString = readFile(absoluteFilepathInDumpDir);
53
+ if (storeFileContentString === dumpFileContentString) {
54
+ // No need to save it, file has not changed.
55
+ needsSave = false;
56
+ } else if (isJson && dumpFileContentString) {
57
+ // Get old public URL before it changes on disk.
58
+ oldPublicUrl =
59
+ JSON.parse(dumpFileContentString)?.data?.content?.url?.path ||
60
+ null;
61
+ /*
62
+ fs.renameSync(
63
+ absoluteFilepathInDumpDir,
64
+ absoluteFilepathInDumpDir.replace('.json', '.2.json'),
65
+ );
66
+ */
67
+ }
68
+ }
69
+ if (needsSave) {
70
+ // Save it.
71
+ fs.writeFileSync(absoluteFilepathInDumpDir, storeFileContentString);
72
+
73
+ // Mark it as updated.
74
+ dump.updated.set(relativeFilepath, {
75
+ oldPublicUrl,
76
+ newPublicUrl,
77
+ });
78
+ }
79
+ } catch (e) {
80
+ logger.error(
81
+ `Dump: error writing file "${absoluteFilepathInDumpDir}": ${e}`,
82
+ );
83
+ }
84
+ } else {
85
+ logger.error(
86
+ `Dump: store data for file "${relativeFilepath}" not found.`,
87
+ );
88
+ }
89
+ });
90
+ };
91
+
92
+ const removeDeletedFiles = (diff: Diff, dump: Dump, dumpDir: string): void => {
93
+ diff.deleted.forEach(relativeFilepath => {
94
+ const absoluteFilepath = `${dumpDir}/${relativeFilepath}`;
95
+ try {
96
+ if (fs.existsSync(absoluteFilepath)) {
97
+ // Get old public URLs before they change on disk.
98
+ const dumpContent = getFileContent(absoluteFilepath);
99
+ const oldPublicUrl: string | null =
100
+ dumpContent.json?.data?.content?.url?.path;
101
+
102
+ // Delete it.
103
+ fs.unlinkSync(absoluteFilepath);
104
+
105
+ // Mark it as deleted.
106
+ dump.deleted.set(relativeFilepath, {
107
+ oldPublicUrl,
108
+ newPublicUrl: null,
109
+ });
110
+ }
111
+ } catch (e) {
112
+ logger.error(`Dump: error deleting file "${absoluteFilepath}": ${e}`);
113
+ }
114
+ });
115
+ };
116
+
117
+ const storeDumpMetadata = (
118
+ metadataFilepath: string,
119
+ dump: Dump,
120
+ diffResetDate: Date,
121
+ ) => {
122
+ let currentDumpMetadata: Dump[] = [];
123
+ try {
124
+ currentDumpMetadata = JSON.parse(
125
+ fs.readFileSync(metadataFilepath).toString(),
126
+ );
127
+ } catch (e) {
128
+ currentDumpMetadata = [];
129
+ }
130
+ currentDumpMetadata.push(jsonify(dump));
131
+ try {
132
+ const currentDumpMetadataString = JSON.stringify(currentDumpMetadata);
133
+ fs.writeFileSync(metadataFilepath, currentDumpMetadataString);
134
+ // Resetting the diff must happen when dump metadata is successfully
135
+ // stored into disk.
136
+ diffManager.reset(diffResetDate);
137
+ } catch (e) {
138
+ logger.error(
139
+ `Dump: error saving dump metadata to "${metadataFilepath}": ${e}`,
140
+ );
141
+ }
142
+ };
143
+
144
+ export const dumpManager: DumpManager = {
145
+ dump(options = { incremental: true }): Dump {
146
+ const startDate = microtime.now();
147
+
148
+ // Create a diff reset date just before consuming a diff.
149
+ const diffResetDate = new Date();
150
+ const diff = diffManager.getDiff({ incremental: options.incremental });
151
+
152
+ // Diff data is processed and transformed into a dump object.
153
+ let dump: Dump = {
154
+ since: diff.since,
155
+ updated: new Map(),
156
+ deleted: new Map(),
157
+ };
158
+
159
+ if (config.dumpDir) {
160
+ const dumpDir = `${config.dumpDir}/files`;
161
+ const metadataFilepath = `${config.dumpDir}/metadata.json`;
162
+
163
+ if (diff.updated.size || diff.deleted.size) {
164
+ // Store updated files.
165
+ storeUpdatedFiles(diff, dump, dumpDir);
166
+
167
+ // Remove deleted files.
168
+ removeDeletedFiles(diff, dump, dumpDir);
169
+
170
+ // Invoke "onDumpCreate" hook.
171
+ dump = hookManager.invokeOnDumpCreate(dump);
172
+
173
+ const execTimeMs = (microtime.now() - startDate) / 1000;
174
+ dump.execTimeMs = execTimeMs;
175
+
176
+ // Merge and store dump metadata if any.
177
+ if (dump.updated.size || dump.deleted.size) {
178
+ storeDumpMetadata(metadataFilepath, dump, diffResetDate);
179
+
180
+ logger.info(
181
+ `Dump created in ${execTimeMs} ms. Updated: ${dump.updated.size} / Deleted: ${dump.deleted.size}`,
182
+ );
183
+
184
+ // Log dump if not empty
185
+ if (dump.updated.size || dump.deleted.size) {
186
+ logger.debug(`Dump: "${JSON.stringify(jsonify(dump))}"`);
187
+ }
188
+ } else {
189
+ // Resetting the diff must happen when no other operations are pending.
190
+ diffManager.reset(diffResetDate);
191
+ logger.info(
192
+ `Dump done in ${execTimeMs} ms without changes stored into disk.`,
193
+ );
194
+ }
195
+ } else {
196
+ logger.info('Dump not stored into disk due to an empty diff.');
197
+ }
198
+ } else {
199
+ logger.error('"dumpDir" option not provided. Dump cannot be executed.');
200
+ }
201
+
202
+ return dump;
203
+ },
204
+
205
+ reset(timestamp: number): void {
206
+ if (config.dumpDir) {
207
+ const metadataFilepath = `${config.dumpDir}/metadata.json`;
208
+
209
+ const metadata = JSON.parse(
210
+ fs.existsSync(metadataFilepath)
211
+ ? fs.readFileSync(metadataFilepath).toString()
212
+ : '[]',
213
+ );
214
+
215
+ // Remove any dump data older that timestamp
216
+ const resetMetadata = metadata.filter(
217
+ (dump: Dump) => dump.since > timestamp,
218
+ );
219
+
220
+ logger.debug(`Dump reset : "${JSON.stringify(resetMetadata)}"`);
221
+
222
+ try {
223
+ fs.writeFileSync(metadataFilepath, JSON.stringify(resetMetadata));
224
+ } catch (e) {
225
+ logger.error(
226
+ `Dump: error resetting dump metadata to "${metadataFilepath}": ${e}`,
227
+ );
228
+ }
229
+ } else {
230
+ logger.error(
231
+ '"dumpDir" option not provided. Dump reset cannot be executed.',
232
+ );
233
+ }
234
+ },
235
+ };