@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.
- package/.eslintignore +4 -0
- package/.eslintrc.json +49 -0
- package/.nvmrc +1 -0
- package/.prettierrc +10 -0
- package/.vscode/launch.json +44 -0
- package/LICENSE.txt +339 -0
- package/README.md +300 -0
- package/__mocks__/clear-module.js +7 -0
- package/api-extractor.json +339 -0
- package/dist/bin/serve.d.ts +3 -0
- package/dist/bin/serve.d.ts.map +1 -0
- package/dist/bin/serve.js +105 -0
- package/dist/http/README.md +300 -0
- package/dist/http/httpServer.d.ts +4 -0
- package/dist/http/httpServer.d.ts.map +1 -0
- package/dist/http/httpServer.js +24 -0
- package/dist/http/public/assets/bulma/bulma-tooltip.min.css +2 -0
- package/dist/http/public/assets/bulma/bulma.min.css +1 -0
- package/dist/http/public/assets/clipboard/clipboard.min.js +7 -0
- package/dist/http/public/assets/simple-datatables/index.js +12 -0
- package/dist/http/public/assets/simple-datatables/style.css +173 -0
- package/dist/http/routes/cache.d.ts +4 -0
- package/dist/http/routes/cache.d.ts.map +1 -0
- package/dist/http/routes/cache.js +19 -0
- package/dist/http/routes/data.d.ts +4 -0
- package/dist/http/routes/data.d.ts.map +1 -0
- package/dist/http/routes/data.js +104 -0
- package/dist/http/routes/docs.d.ts +3 -0
- package/dist/http/routes/docs.d.ts.map +1 -0
- package/dist/http/routes/docs.js +14 -0
- package/dist/http/routes/dump.d.ts +8 -0
- package/dist/http/routes/dump.d.ts.map +1 -0
- package/dist/http/routes/dump.js +57 -0
- package/dist/http/routes/home.d.ts +3 -0
- package/dist/http/routes/home.d.ts.map +1 -0
- package/dist/http/routes/home.js +17 -0
- package/dist/http/routes/index.d.ts +3 -0
- package/dist/http/routes/index.d.ts.map +1 -0
- package/dist/http/routes/index.js +33 -0
- package/dist/http/routes/query.d.ts +5 -0
- package/dist/http/routes/query.d.ts.map +1 -0
- package/dist/http/routes/query.js +21 -0
- package/dist/http/routes/status.d.ts +9 -0
- package/dist/http/routes/status.d.ts.map +1 -0
- package/dist/http/routes/status.js +74 -0
- package/dist/http/routes/task.d.ts +5 -0
- package/dist/http/routes/task.d.ts.map +1 -0
- package/dist/http/routes/task.js +22 -0
- package/dist/http/views/cacheClear.pug +17 -0
- package/dist/http/views/cacheIndex.pug +19 -0
- package/dist/http/views/data.pug +68 -0
- package/dist/http/views/docs.pug +7 -0
- package/dist/http/views/dumpIndex.pug +14 -0
- package/dist/http/views/home.pug +15 -0
- package/dist/http/views/includes/layout.pug +23 -0
- package/dist/http/views/queryIndex.pug +17 -0
- package/dist/http/views/statusIndex.pug +14 -0
- package/dist/http/views/taskIndex.pug +17 -0
- package/dist/lib/config/config.d.ts +26 -0
- package/dist/lib/config/config.d.ts.map +1 -0
- package/dist/lib/config/config.js +122 -0
- package/dist/lib/config/config.types.d.ts +74 -0
- package/dist/lib/config/config.types.d.ts.map +1 -0
- package/dist/lib/config/config.types.js +2 -0
- package/dist/lib/config/error/InvalidRunMode.d.ts +15 -0
- package/dist/lib/config/error/InvalidRunMode.d.ts.map +1 -0
- package/dist/lib/config/error/InvalidRunMode.js +20 -0
- package/dist/lib/config/error/MissingDirectory.d.ts +24 -0
- package/dist/lib/config/error/MissingDirectory.d.ts.map +1 -0
- package/dist/lib/config/error/MissingDirectory.js +23 -0
- package/dist/lib/config/error/MissingRequiredOption.d.ts +19 -0
- package/dist/lib/config/error/MissingRequiredOption.d.ts.map +1 -0
- package/dist/lib/config/error/MissingRequiredOption.js +21 -0
- package/dist/lib/config/error/NonWritableDirectory.d.ts +24 -0
- package/dist/lib/config/error/NonWritableDirectory.d.ts.map +1 -0
- package/dist/lib/config/error/NonWritableDirectory.js +23 -0
- package/dist/lib/config/error/index.d.ts +5 -0
- package/dist/lib/config/error/index.d.ts.map +1 -0
- package/dist/lib/config/error/index.js +16 -0
- package/dist/lib/config/index.d.ts +2 -0
- package/dist/lib/config/index.d.ts.map +1 -0
- package/dist/lib/config/index.js +13 -0
- package/dist/lib/dataServer.d.ts +21 -0
- package/dist/lib/dataServer.d.ts.map +1 -0
- package/dist/lib/dataServer.js +56 -0
- package/dist/lib/dataServer.types.d.ts +84 -0
- package/dist/lib/dataServer.types.d.ts.map +1 -0
- package/dist/lib/dataServer.types.js +13 -0
- package/dist/lib/error/DomainError.d.ts +9 -0
- package/dist/lib/error/DomainError.d.ts.map +1 -0
- package/dist/lib/error/DomainError.js +20 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +15 -0
- package/dist/lib/query/index.d.ts +3 -0
- package/dist/lib/query/index.d.ts.map +1 -0
- package/dist/lib/query/index.js +14 -0
- package/dist/lib/query/query.types.d.ts +206 -0
- package/dist/lib/query/query.types.d.ts.map +1 -0
- package/dist/lib/query/query.types.js +21 -0
- package/dist/lib/query/queryManager.d.ts +10 -0
- package/dist/lib/query/queryManager.d.ts.map +1 -0
- package/dist/lib/query/queryManager.js +12 -0
- package/dist/lib/query/queryRunner copy.d.ts +3 -0
- package/dist/lib/query/queryRunner copy.d.ts.map +1 -0
- package/dist/lib/query/queryRunner copy.js +87 -0
- package/dist/lib/query/queryRunner.d.ts +3 -0
- package/dist/lib/query/queryRunner.d.ts.map +1 -0
- package/dist/lib/query/queryRunner.js +96 -0
- package/dist/lib/query/queryTagManager.d.ts +3 -0
- package/dist/lib/query/queryTagManager.d.ts.map +1 -0
- package/dist/lib/query/queryTagManager.js +47 -0
- package/dist/lib/store/dataDir/dataDir.types.d.ts +36 -0
- package/dist/lib/store/dataDir/dataDir.types.d.ts.map +1 -0
- package/dist/lib/store/dataDir/dataDir.types.js +2 -0
- package/dist/lib/store/dataDir/dataDirManager.d.ts +3 -0
- package/dist/lib/store/dataDir/dataDirManager.d.ts.map +1 -0
- package/dist/lib/store/dataDir/dataDirManager.js +97 -0
- package/dist/lib/store/dataDir/index.d.ts +2 -0
- package/dist/lib/store/dataDir/index.d.ts.map +1 -0
- package/dist/lib/store/dataDir/index.js +13 -0
- package/dist/lib/store/dependency/dependency.types.d.ts +70 -0
- package/dist/lib/store/dependency/dependency.types.d.ts.map +1 -0
- package/dist/lib/store/dependency/dependency.types.js +2 -0
- package/dist/lib/store/dependency/dependencyFileHelper.d.ts +6 -0
- package/dist/lib/store/dependency/dependencyFileHelper.d.ts.map +1 -0
- package/dist/lib/store/dependency/dependencyFileHelper.js +46 -0
- package/dist/lib/store/dependency/dependencyManager copy.d.ts +6 -0
- package/dist/lib/store/dependency/dependencyManager copy.d.ts.map +1 -0
- package/dist/lib/store/dependency/dependencyManager copy.js +91 -0
- package/dist/lib/store/dependency/dependencyManager.d.ts +6 -0
- package/dist/lib/store/dependency/dependencyManager.d.ts.map +1 -0
- package/dist/lib/store/dependency/dependencyManager.js +78 -0
- package/dist/lib/store/dependency/dependencyManager.types.d.ts +48 -0
- package/dist/lib/store/dependency/dependencyManager.types.d.ts.map +1 -0
- package/dist/lib/store/dependency/dependencyManager.types.js +2 -0
- package/dist/lib/store/dependency/dependencyTagManager.d.ts +6 -0
- package/dist/lib/store/dependency/dependencyTagManager.d.ts.map +1 -0
- package/dist/lib/store/dependency/dependencyTagManager.js +33 -0
- package/dist/lib/store/dependency/dependencyTagger.d.ts +11 -0
- package/dist/lib/store/dependency/dependencyTagger.d.ts.map +1 -0
- package/dist/lib/store/dependency/dependencyTagger.js +99 -0
- package/dist/lib/store/diff/diffManager.d.ts +3 -0
- package/dist/lib/store/diff/diffManager.d.ts.map +1 -0
- package/dist/lib/store/diff/diffManager.js +114 -0
- package/dist/lib/store/diff/diffManager.types.d.ts +50 -0
- package/dist/lib/store/diff/diffManager.types.d.ts.map +1 -0
- package/dist/lib/store/diff/diffManager.types.js +2 -0
- package/dist/lib/store/diff/index.d.ts +2 -0
- package/dist/lib/store/diff/index.d.ts.map +1 -0
- package/dist/lib/store/diff/index.js +13 -0
- package/dist/lib/store/diff/tracker.d.ts +3 -0
- package/dist/lib/store/diff/tracker.d.ts.map +1 -0
- package/dist/lib/store/diff/tracker.js +82 -0
- package/dist/lib/store/diff/tracker.types.d.ts +31 -0
- package/dist/lib/store/diff/tracker.types.d.ts.map +1 -0
- package/dist/lib/store/diff/tracker.types.js +2 -0
- package/dist/lib/store/dump/dumpManager.d.ts +3 -0
- package/dist/lib/store/dump/dumpManager.d.ts.map +1 -0
- package/dist/lib/store/dump/dumpManager.js +199 -0
- package/dist/lib/store/dump/dumpManager.types.d.ts +62 -0
- package/dist/lib/store/dump/dumpManager.types.d.ts.map +1 -0
- package/dist/lib/store/dump/dumpManager.types.js +2 -0
- package/dist/lib/store/dump/index.d.ts +2 -0
- package/dist/lib/store/dump/index.d.ts.map +1 -0
- package/dist/lib/store/dump/index.js +13 -0
- package/dist/lib/store/hook/hook.types.d.ts +205 -0
- package/dist/lib/store/hook/hook.types.d.ts.map +1 -0
- package/dist/lib/store/hook/hook.types.js +2 -0
- package/dist/lib/store/hook/hookManager.d.ts +6 -0
- package/dist/lib/store/hook/hookManager.d.ts.map +1 -0
- package/dist/lib/store/hook/hookManager.js +168 -0
- package/dist/lib/store/hook/index.d.ts +2 -0
- package/dist/lib/store/hook/index.d.ts.map +1 -0
- package/dist/lib/store/hook/index.js +13 -0
- package/dist/lib/store/include/includeIndex.d.ts +6 -0
- package/dist/lib/store/include/includeIndex.d.ts.map +1 -0
- package/dist/lib/store/include/includeIndex.js +65 -0
- package/dist/lib/store/include/includeIndex.types.d.ts +29 -0
- package/dist/lib/store/include/includeIndex.types.d.ts.map +1 -0
- package/dist/lib/store/include/includeIndex.types.js +2 -0
- package/dist/lib/store/include/includeParser.d.ts +3 -0
- package/dist/lib/store/include/includeParser.d.ts.map +1 -0
- package/dist/lib/store/include/includeParser.js +46 -0
- package/dist/lib/store/include/includeParser.types.d.ts +88 -0
- package/dist/lib/store/include/includeParser.types.d.ts.map +1 -0
- package/dist/lib/store/include/includeParser.types.js +2 -0
- package/dist/lib/store/include/index.d.ts +2 -0
- package/dist/lib/store/include/index.d.ts.map +1 -0
- package/dist/lib/store/include/index.js +13 -0
- package/dist/lib/store/include/parsers/configIncludeParser.d.ts +3 -0
- package/dist/lib/store/include/parsers/configIncludeParser.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/configIncludeParser.js +8 -0
- package/dist/lib/store/include/parsers/customIncludeParser.d.ts +3 -0
- package/dist/lib/store/include/parsers/customIncludeParser.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/customIncludeParser.js +8 -0
- package/dist/lib/store/include/parsers/entityIncludeParser.d.ts +3 -0
- package/dist/lib/store/include/parsers/entityIncludeParser.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/entityIncludeParser.js +13 -0
- package/dist/lib/store/include/parsers/index.d.ts +6 -0
- package/dist/lib/store/include/parsers/index.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/index.js +17 -0
- package/dist/lib/store/include/parsers/localeIncludeParser.d.ts +3 -0
- package/dist/lib/store/include/parsers/localeIncludeParser.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/localeIncludeParser.js +8 -0
- package/dist/lib/store/include/parsers/queryIncludeParser.d.ts +11 -0
- package/dist/lib/store/include/parsers/queryIncludeParser.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/queryIncludeParser.js +45 -0
- package/dist/lib/store/include/parsers/types/aliasIncludeParser.d.ts +3 -0
- package/dist/lib/store/include/parsers/types/aliasIncludeParser.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/types/aliasIncludeParser.js +10 -0
- package/dist/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.d.ts +8 -0
- package/dist/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.d.ts.map +1 -0
- package/dist/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.js +18 -0
- package/dist/lib/store/index.d.ts +2 -0
- package/dist/lib/store/index.d.ts.map +1 -0
- package/dist/lib/store/index.js +13 -0
- package/dist/lib/store/store.d.ts +7 -0
- package/dist/lib/store/store.d.ts.map +1 -0
- package/dist/lib/store/store.js +89 -0
- package/dist/lib/store/store.types.d.ts +231 -0
- package/dist/lib/store/store.types.d.ts.map +1 -0
- package/dist/lib/store/store.types.js +2 -0
- package/dist/lib/store/storeManager.d.ts +3 -0
- package/dist/lib/store/storeManager.d.ts.map +1 -0
- package/dist/lib/store/storeManager.js +149 -0
- package/dist/lib/store/workDir/index.d.ts +2 -0
- package/dist/lib/store/workDir/index.d.ts.map +1 -0
- package/dist/lib/store/workDir/index.js +13 -0
- package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts +9 -0
- package/dist/lib/store/workDir/storage/getChangedLinesSince.d.ts.map +1 -0
- package/dist/lib/store/workDir/storage/getChangedLinesSince.js +47 -0
- package/dist/lib/store/workDir/storage/getDataFromLogLine.d.ts +10 -0
- package/dist/lib/store/workDir/storage/getDataFromLogLine.d.ts.map +1 -0
- package/dist/lib/store/workDir/storage/getDataFromLogLine.js +33 -0
- package/dist/lib/store/workDir/storage/getLogFile.d.ts +8 -0
- package/dist/lib/store/workDir/storage/getLogFile.d.ts.map +1 -0
- package/dist/lib/store/workDir/storage/getLogFile.js +11 -0
- package/dist/lib/store/workDir/storage/index.d.ts +4 -0
- package/dist/lib/store/workDir/storage/index.d.ts.map +1 -0
- package/dist/lib/store/workDir/storage/index.js +20 -0
- package/dist/lib/store/workDir/workDir.types.d.ts +44 -0
- package/dist/lib/store/workDir/workDir.types.d.ts.map +1 -0
- package/dist/lib/store/workDir/workDir.types.js +2 -0
- package/dist/lib/store/workDir/workDirHelper.d.ts +20 -0
- package/dist/lib/store/workDir/workDirHelper.d.ts.map +1 -0
- package/dist/lib/store/workDir/workDirHelper.js +52 -0
- package/dist/lib/task/index.d.ts +3 -0
- package/dist/lib/task/index.d.ts.map +1 -0
- package/dist/lib/task/index.js +14 -0
- package/dist/lib/task/task.types.d.ts +140 -0
- package/dist/lib/task/task.types.d.ts.map +1 -0
- package/dist/lib/task/task.types.js +11 -0
- package/dist/lib/task/taskManager.d.ts +10 -0
- package/dist/lib/task/taskManager.d.ts.map +1 -0
- package/dist/lib/task/taskManager.js +12 -0
- package/dist/lib/task/taskRunner.d.ts +3 -0
- package/dist/lib/task/taskRunner.d.ts.map +1 -0
- package/dist/lib/task/taskRunner.js +71 -0
- package/dist/lib/tsdoc-metadata.json +11 -0
- package/dist/lib/utils/array/arrayUtils.d.ts +2 -0
- package/dist/lib/utils/array/arrayUtils.d.ts.map +1 -0
- package/dist/lib/utils/array/arrayUtils.js +11 -0
- package/dist/lib/utils/cache/cacheBinManager.d.ts +37 -0
- package/dist/lib/utils/cache/cacheBinManager.d.ts.map +1 -0
- package/dist/lib/utils/cache/cacheBinManager.js +53 -0
- package/dist/lib/utils/cache/index.d.ts +2 -0
- package/dist/lib/utils/cache/index.d.ts.map +1 -0
- package/dist/lib/utils/cache/index.js +13 -0
- package/dist/lib/utils/fs/fs.types.d.ts +20 -0
- package/dist/lib/utils/fs/fs.types.d.ts.map +1 -0
- package/dist/lib/utils/fs/fs.types.js +2 -0
- package/dist/lib/utils/fs/fsUtils.d.ts +62 -0
- package/dist/lib/utils/fs/fsUtils.d.ts.map +1 -0
- package/dist/lib/utils/fs/fsUtils.js +137 -0
- package/dist/lib/utils/fs/index.d.ts +2 -0
- package/dist/lib/utils/fs/index.d.ts.map +1 -0
- package/dist/lib/utils/fs/index.js +13 -0
- package/dist/lib/utils/logger/index.d.ts +2 -0
- package/dist/lib/utils/logger/index.d.ts.map +1 -0
- package/dist/lib/utils/logger/index.js +13 -0
- package/dist/lib/utils/logger/logger.d.ts +32 -0
- package/dist/lib/utils/logger/logger.d.ts.map +1 -0
- package/dist/lib/utils/logger/logger.js +82 -0
- package/dist/lib/utils/logger/logger.types.d.ts +37 -0
- package/dist/lib/utils/logger/logger.types.d.ts.map +1 -0
- package/dist/lib/utils/logger/logger.types.js +15 -0
- package/dist/lib/utils/module/dirBasedModuleGroupManager.d.ts +30 -0
- package/dist/lib/utils/module/dirBasedModuleGroupManager.d.ts.map +1 -0
- package/dist/lib/utils/module/dirBasedModuleGroupManager.js +78 -0
- package/dist/lib/utils/module/index.d.ts +3 -0
- package/dist/lib/utils/module/index.d.ts.map +1 -0
- package/dist/lib/utils/module/index.js +14 -0
- package/dist/lib/utils/module/module.types.d.ts +53 -0
- package/dist/lib/utils/module/module.types.d.ts.map +1 -0
- package/dist/lib/utils/module/module.types.js +2 -0
- package/dist/lib/utils/module/moduleManager.d.ts +64 -0
- package/dist/lib/utils/module/moduleManager.d.ts.map +1 -0
- package/dist/lib/utils/module/moduleManager.js +139 -0
- package/dist/lib/utils/object/index.d.ts +2 -0
- package/dist/lib/utils/object/index.d.ts.map +1 -0
- package/dist/lib/utils/object/index.js +13 -0
- package/dist/lib/utils/object/object.types.d.ts +72 -0
- package/dist/lib/utils/object/object.types.d.ts.map +1 -0
- package/dist/lib/utils/object/object.types.js +2 -0
- package/dist/lib/utils/object/objectUtils.d.ts +45 -0
- package/dist/lib/utils/object/objectUtils.d.ts.map +1 -0
- package/dist/lib/utils/object/objectUtils.js +64 -0
- package/dist/lib/utils/string/index.d.ts +2 -0
- package/dist/lib/utils/string/index.d.ts.map +1 -0
- package/dist/lib/utils/string/index.js +13 -0
- package/dist/lib/utils/string/string.types.d.ts +2 -0
- package/dist/lib/utils/string/string.types.d.ts.map +1 -0
- package/dist/lib/utils/string/string.types.js +2 -0
- package/dist/lib/utils/string/stringUtils.d.ts +37 -0
- package/dist/lib/utils/string/stringUtils.d.ts.map +1 -0
- package/dist/lib/utils/string/stringUtils.js +62 -0
- package/dist/lib/watcher/index.d.ts +2 -0
- package/dist/lib/watcher/index.d.ts.map +1 -0
- package/dist/lib/watcher/index.js +13 -0
- package/dist/lib/watcher/watcher.d.ts +17 -0
- package/dist/lib/watcher/watcher.d.ts.map +1 -0
- package/dist/lib/watcher/watcher.js +65 -0
- package/dist/static-suite-data-server.d.ts +392 -0
- package/package.json +102 -0
- package/scripts/copy-http-files-to-src.js +45 -0
- package/src/__tests__/fixtures/data/en/en.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/entity.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article1--card.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article1--small.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article1.json +40 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article2--card.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article2--small.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article2.json +40 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article3--card.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article3--small.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/article/article3.json +7 -0
- package/src/__tests__/fixtures/data/en/entity/node/node.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/page/page1--card.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/page/page1--small.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/page/page1.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/page/page2--card.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/page/page2--small.json +3 -0
- package/src/__tests__/fixtures/data/en/entity/node/page/page2.json +3 -0
- package/src/__tests__/fixtures/data/global--block.json +3 -0
- package/src/__tests__/fixtures/data/global.json +3 -0
- package/src/__tests__/fixtures/hook/main.hook.js +15 -0
- package/src/__tests__/fixtures/hook/taxonomy/main.hook.js +15 -0
- package/src/__tests__/fixtures/hook/taxonomy/taxo.hook.js +15 -0
- package/src/__tests__/fixtures/query/error.query.js +6 -0
- package/src/__tests__/fixtures/query/noHandler.query.js +14 -0
- package/src/__tests__/fixtures/query/query1.query.js +15 -0
- package/src/__tests__/fixtures/query/query2.query.js +14 -0
- package/src/__tests__/fixtures/query/wrongNamequery.js +14 -0
- package/src/__tests__/fixtures/task/error.task.js +6 -0
- package/src/__tests__/fixtures/task/noHandler.task.js +13 -0
- package/src/__tests__/fixtures/task/task1.task.js +14 -0
- package/src/__tests__/fixtures/task/task2.task.js +13 -0
- package/src/__tests__/fixtures/task/wrongNametask.js +13 -0
- package/src/bin/serve.ts +107 -0
- package/src/http/httpServer.ts +21 -0
- package/src/http/routes/cache.ts +17 -0
- package/src/http/routes/data.ts +114 -0
- package/src/http/routes/docs.ts +9 -0
- package/src/http/routes/dump.ts +61 -0
- package/src/http/routes/home.ts +16 -0
- package/src/http/routes/index.ts +47 -0
- package/src/http/routes/query.ts +27 -0
- package/src/http/routes/status.ts +89 -0
- package/src/http/routes/task.ts +29 -0
- package/src/http/views/cacheClear.pug +17 -0
- package/src/http/views/cacheIndex.pug +19 -0
- package/src/http/views/data.pug +68 -0
- package/src/http/views/docs.pug +7 -0
- package/src/http/views/dumpIndex.pug +14 -0
- package/src/http/views/home.pug +15 -0
- package/src/http/views/includes/layout.pug +23 -0
- package/src/http/views/queryIndex.pug +17 -0
- package/src/http/views/statusIndex.pug +14 -0
- package/src/http/views/taskIndex.pug +17 -0
- package/src/lib/config/__tests__/config.test.ts +132 -0
- package/src/lib/config/config.ts +143 -0
- package/src/lib/config/config.types.ts +87 -0
- package/src/lib/config/error/InvalidRunMode.ts +17 -0
- package/src/lib/config/error/MissingDirectory.ts +30 -0
- package/src/lib/config/error/MissingRequiredOption.ts +23 -0
- package/src/lib/config/error/NonWritableDirectory.ts +30 -0
- package/src/lib/config/error/index.ts +4 -0
- package/src/lib/config/index.ts +1 -0
- package/src/lib/dataServer.ts +81 -0
- package/src/lib/dataServer.types.ts +98 -0
- package/src/lib/error/DomainError.ts +18 -0
- package/src/lib/index.ts +4 -0
- package/src/lib/query/__tests__/queryRunner.test.ts +61 -0
- package/src/lib/query/index.ts +2 -0
- package/src/lib/query/query.types.ts +231 -0
- package/src/lib/query/queryManager.ts +11 -0
- package/src/lib/query/queryRunner.ts +110 -0
- package/src/lib/query/queryTagManager.ts +53 -0
- package/src/lib/store/dataDir/__tests__/dataDirManager.test.ts +15 -0
- package/src/lib/store/dataDir/dataDir.types.ts +38 -0
- package/src/lib/store/dataDir/dataDirManager.ts +121 -0
- package/src/lib/store/dataDir/index.ts +1 -0
- package/src/lib/store/dependency/dependency.types.ts +78 -0
- package/src/lib/store/dependency/dependencyFileHelper.ts +50 -0
- package/src/lib/store/dependency/dependencyManager.ts +82 -0
- package/src/lib/store/dependency/dependencyTagger.ts +105 -0
- package/src/lib/store/diff/diffManager.ts +122 -0
- package/src/lib/store/diff/diffManager.types.ts +51 -0
- package/src/lib/store/diff/index.ts +1 -0
- package/src/lib/store/dump/dumpManager.ts +235 -0
- package/src/lib/store/dump/dumpManager.types.ts +61 -0
- package/src/lib/store/dump/index.ts +1 -0
- package/src/lib/store/hook/hook.types.ts +232 -0
- package/src/lib/store/hook/hookManager.ts +180 -0
- package/src/lib/store/hook/index.ts +1 -0
- package/src/lib/store/include/__tests__/includeParser.test.ts +80 -0
- package/src/lib/store/include/includeParser.ts +54 -0
- package/src/lib/store/include/includeParser.types.ts +99 -0
- package/src/lib/store/include/index.ts +1 -0
- package/src/lib/store/include/parsers/__tests__/entityIncludeParser.test.ts +43 -0
- package/src/lib/store/include/parsers/configIncludeParser.ts +8 -0
- package/src/lib/store/include/parsers/customIncludeParser.ts +8 -0
- package/src/lib/store/include/parsers/entityIncludeParser.ts +15 -0
- package/src/lib/store/include/parsers/index.ts +5 -0
- package/src/lib/store/include/parsers/localeIncludeParser.ts +8 -0
- package/src/lib/store/include/parsers/queryIncludeParser.ts +51 -0
- package/src/lib/store/include/parsers/types/__tests__/aliasIncludeParser.test.ts +37 -0
- package/src/lib/store/include/parsers/types/__tests__/aliasWithoutTypeIncludeParser.test.ts +43 -0
- package/src/lib/store/include/parsers/types/aliasIncludeParser.ts +13 -0
- package/src/lib/store/include/parsers/types/aliasWithoutTypeIncludeParser.ts +22 -0
- package/src/lib/store/index.ts +1 -0
- package/src/lib/store/store.ts +105 -0
- package/src/lib/store/store.types.ts +251 -0
- package/src/lib/store/storeManager.ts +187 -0
- package/src/lib/store/workDir/__tests__/workDirHelper.test.ts +25 -0
- package/src/lib/store/workDir/index.ts +1 -0
- package/src/lib/store/workDir/storage/__tests__/getChangedLinesSince.test.ts +23 -0
- package/src/lib/store/workDir/storage/__tests__/getDataFromLogLine.test.ts +21 -0
- package/src/lib/store/workDir/storage/getChangedLinesSince.ts +47 -0
- package/src/lib/store/workDir/storage/getDataFromLogLine.ts +31 -0
- package/src/lib/store/workDir/storage/getLogFile.ts +11 -0
- package/src/lib/store/workDir/storage/index.ts +8 -0
- package/src/lib/store/workDir/workDir.types.ts +48 -0
- package/src/lib/store/workDir/workDirHelper.ts +59 -0
- package/src/lib/task/__tests__/taskRunner.test.ts +47 -0
- package/src/lib/task/index.ts +2 -0
- package/src/lib/task/task.types.ts +151 -0
- package/src/lib/task/taskManager.ts +11 -0
- package/src/lib/task/taskRunner.ts +79 -0
- package/src/lib/utils/array/__tests__/arrayUtils.test.ts +16 -0
- package/src/lib/utils/array/arrayUtils.ts +7 -0
- package/src/lib/utils/cache/__tests__/cache.test.ts +24 -0
- package/src/lib/utils/cache/cacheBinManager.ts +88 -0
- package/src/lib/utils/cache/index.ts +1 -0
- package/src/lib/utils/fs/__tests__/fixtures/file.json +3 -0
- package/src/lib/utils/fs/__tests__/fixtures/file.txt +3 -0
- package/src/lib/utils/fs/__tests__/fsUtils.test.ts +93 -0
- package/src/lib/utils/fs/fs.types.ts +21 -0
- package/src/lib/utils/fs/fsUtils.ts +141 -0
- package/src/lib/utils/fs/index.ts +1 -0
- package/src/lib/utils/logger/__tests__/logger.test.ts +12 -0
- package/src/lib/utils/logger/index.ts +1 -0
- package/src/lib/utils/logger/logger.ts +87 -0
- package/src/lib/utils/logger/logger.types.ts +41 -0
- package/src/lib/utils/module/__mocks__/dummyModule.query.js +4 -0
- package/src/lib/utils/module/__mocks__/dummyModule2.query.js +4 -0
- package/src/lib/utils/module/__tests__/dirBasedModuleGroupManager.test.ts +34 -0
- package/src/lib/utils/module/__tests__/moduleHandler.test.ts +100 -0
- package/src/lib/utils/module/dirBasedModuleGroupManager.ts +78 -0
- package/src/lib/utils/module/index.ts +2 -0
- package/src/lib/utils/module/module.types.ts +57 -0
- package/src/lib/utils/module/moduleManager.ts +144 -0
- package/src/lib/utils/object/__tests__/objectUtils.test.ts +62 -0
- package/src/lib/utils/object/index.ts +1 -0
- package/src/lib/utils/object/object.types.ts +74 -0
- package/src/lib/utils/object/objectUtils.ts +71 -0
- package/src/lib/utils/string/__tests__/stringUtils.test.ts +30 -0
- package/src/lib/utils/string/index.ts +1 -0
- package/src/lib/utils/string/string.types.ts +1 -0
- package/src/lib/utils/string/stringUtils.ts +61 -0
- package/src/lib/watcher/index.ts +1 -0
- package/src/lib/watcher/watcher.ts +66 -0
- 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
|
+
};
|