@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,231 @@
|
|
|
1
|
+
import { Store } from '@lib/store/store.types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A service to handle the execution of queries.
|
|
5
|
+
*
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export type QueryRunner = {
|
|
9
|
+
/**
|
|
10
|
+
* Runs a query and returns its results with metadata.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* It checks several validations before a query is run, and then it tries to get
|
|
14
|
+
* the query result from cache. If cache is empty, query is executed and saved
|
|
15
|
+
* into the cache.
|
|
16
|
+
*
|
|
17
|
+
* It logs an error and throws an exception if any problem occurs during the
|
|
18
|
+
* query execution.
|
|
19
|
+
*
|
|
20
|
+
* @param queryDefinition - An URL containing a query ID (filename without extension
|
|
21
|
+
* and suffix) of the query to be executed, plus and optional query string with arguments.
|
|
22
|
+
* @see {@link ModuleInfo#id | Definition of a module ID}
|
|
23
|
+
*
|
|
24
|
+
* @returns The result of the query as a JSON object with data and metadata keys,
|
|
25
|
+
* or an error response if some validation is not met.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* Here's a result example:
|
|
29
|
+
* ```
|
|
30
|
+
* {
|
|
31
|
+
* data: ['title 1', 'title 2'],
|
|
32
|
+
* metadata: {
|
|
33
|
+
* contentType: 'application/json',
|
|
34
|
+
* execTime: 2,
|
|
35
|
+
* cache: ['miss'|'hit'],
|
|
36
|
+
* num: 2,
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
|
|
41
|
+
* @throws
|
|
42
|
+
* Exception thrown if any problem occurs during the query execution.
|
|
43
|
+
*/
|
|
44
|
+
run(queryDefinition: string): QuerySuccessfulResponse | QueryErrorResponse;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Gets number of executed queries.
|
|
48
|
+
*
|
|
49
|
+
* @remarks
|
|
50
|
+
* A simple counter that stores the number of executed queries, of any type.
|
|
51
|
+
*
|
|
52
|
+
* @returns Number of executed queries.
|
|
53
|
+
*/
|
|
54
|
+
getCount(): number;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* An object with query arguments.
|
|
59
|
+
*
|
|
60
|
+
* @public
|
|
61
|
+
*/
|
|
62
|
+
export type QueryArgs = Record<string, any>;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* The result that a query returns after being executed.
|
|
66
|
+
*/
|
|
67
|
+
export type QueryModuleResult = {
|
|
68
|
+
/**
|
|
69
|
+
* A result, which can be of any kind (and array, an object, a string, etc)
|
|
70
|
+
*/
|
|
71
|
+
result: any;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Optional content type for the data available in "result"
|
|
75
|
+
*
|
|
76
|
+
* @remarks
|
|
77
|
+
* Data coming from the query can be anything (XML, a string, etc).
|
|
78
|
+
* This content type is added to the metadata section of the QueryResponse.
|
|
79
|
+
* @see {@link QuerySuccessfulResponse#metadata}.
|
|
80
|
+
*
|
|
81
|
+
* @defaultValue 'application/json'
|
|
82
|
+
*/
|
|
83
|
+
contentType?: string;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Optional flag that tells whether this result can be cached or not.
|
|
87
|
+
*/
|
|
88
|
+
cacheable?: boolean;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A list of tags to get this query invalidated.
|
|
92
|
+
*/
|
|
93
|
+
tags?: string[];
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Possible values for a cache get operation: miss or hit.
|
|
98
|
+
*
|
|
99
|
+
* @public
|
|
100
|
+
*/
|
|
101
|
+
export enum CacheStatus {
|
|
102
|
+
MISS,
|
|
103
|
+
HIT,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* A successful response returned after executing a query.
|
|
108
|
+
*
|
|
109
|
+
* @remarks
|
|
110
|
+
* It takes the results from a QueryModule#queryHandler, and wraps them into an
|
|
111
|
+
* structure with metadata. @see {@link QueryModule#default}
|
|
112
|
+
*
|
|
113
|
+
* @public
|
|
114
|
+
*/
|
|
115
|
+
export type QuerySuccessfulResponse = {
|
|
116
|
+
/**
|
|
117
|
+
* Data returned by the query. @see {@link QueryModule#default}
|
|
118
|
+
*/
|
|
119
|
+
data: any;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Query metadata
|
|
123
|
+
*/
|
|
124
|
+
metadata: {
|
|
125
|
+
/**
|
|
126
|
+
* Content type for the data available in "data"
|
|
127
|
+
*
|
|
128
|
+
* @remarks
|
|
129
|
+
* Even thought this structure is a JSON object, data coming from the
|
|
130
|
+
* query can be anything (XML, a string, etc). It must be specified so any
|
|
131
|
+
* consumer of this data knows what is being returned.
|
|
132
|
+
*/
|
|
133
|
+
contentType: string;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Execution time taken by the query, in milliseconds.
|
|
137
|
+
*/
|
|
138
|
+
execTimeMs: number;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Tells wether the query results comes from a miss or hit.
|
|
142
|
+
*/
|
|
143
|
+
cache: CacheStatus;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* A list of tags to get this query invalidated.
|
|
147
|
+
*/
|
|
148
|
+
tags?: string[];
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* A module that defines a query.
|
|
154
|
+
*/
|
|
155
|
+
export type QueryModule = {
|
|
156
|
+
/**
|
|
157
|
+
* The handler that executes a query.
|
|
158
|
+
*
|
|
159
|
+
* @remarks
|
|
160
|
+
* It receives the store and a set of arguments, executes the query
|
|
161
|
+
* and returns its results.
|
|
162
|
+
*
|
|
163
|
+
* @param options - An object with options for the query: store and args
|
|
164
|
+
*/
|
|
165
|
+
default(options: {
|
|
166
|
+
/**
|
|
167
|
+
* Store data to be used in the query
|
|
168
|
+
*/
|
|
169
|
+
store: Store;
|
|
170
|
+
args: QueryArgs;
|
|
171
|
+
}): QueryModuleResult;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* An error response returned after executing a query.
|
|
176
|
+
*
|
|
177
|
+
* @remarks
|
|
178
|
+
* It takes an string from QueryModule#queryHandler, and wraps them into an
|
|
179
|
+
* structure with metadata. @see {@link QueryModule#default}
|
|
180
|
+
*
|
|
181
|
+
* @public
|
|
182
|
+
*/
|
|
183
|
+
export type QueryErrorResponse = {
|
|
184
|
+
/**
|
|
185
|
+
* Error message from the query, usually coming from a failed validation.
|
|
186
|
+
*/
|
|
187
|
+
error: string;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Tells whether a query response is erroneous or not.
|
|
192
|
+
*
|
|
193
|
+
* @param queryResponse - A response (successful or erroneous) from the query handler.
|
|
194
|
+
* @returns True if queryResponse is erroneous.
|
|
195
|
+
*/
|
|
196
|
+
export const isQueryErrorResponse = (
|
|
197
|
+
queryResponse: QuerySuccessfulResponse | QueryErrorResponse,
|
|
198
|
+
): queryResponse is QueryErrorResponse =>
|
|
199
|
+
(queryResponse as QueryErrorResponse).error !== undefined;
|
|
200
|
+
|
|
201
|
+
export type QueryTagManager = {
|
|
202
|
+
/**
|
|
203
|
+
* Marks query items with any of the specified tags as invalid.
|
|
204
|
+
*
|
|
205
|
+
* @param tags - The list of tags for which to invalidate query items.
|
|
206
|
+
*/
|
|
207
|
+
invalidateTags(tags: string[]): void;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Resets the list of invalidated tags once consumed.
|
|
211
|
+
*/
|
|
212
|
+
resetInvalidatedTags(): void;
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Adds a list of query tags to a query, or removes it if tags are empty.
|
|
216
|
+
*
|
|
217
|
+
* @param queryDefinition - The string containing the query id and its arguments.
|
|
218
|
+
* @param tags - The list of tags for which to invalidate query items.
|
|
219
|
+
*/
|
|
220
|
+
setTagsToQuery(
|
|
221
|
+
queryDefinition: string,
|
|
222
|
+
tags: Set<string> | null | undefined,
|
|
223
|
+
): void;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Gets a list of filepaths which contain an invalidated query.
|
|
227
|
+
*
|
|
228
|
+
* @returns A list of filepaths which contain an invalidated query.
|
|
229
|
+
*/
|
|
230
|
+
getInvalidFilepaths(): string[];
|
|
231
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { dirBasedModuleGroupManager } from '@lib/utils/module';
|
|
2
|
+
import { QueryModule } from './query.types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A manager for queries stored in a user-land directory defined by configuration.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* It extends dirBasedModuleGroupManager, which manages groups of modules based
|
|
9
|
+
* on a directory: @see {@link dirBasedModuleGroupManager}
|
|
10
|
+
*/
|
|
11
|
+
export const queryManager = dirBasedModuleGroupManager<QueryModule>('query');
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import microtime from 'microtime';
|
|
2
|
+
import { config } from '@lib/config';
|
|
3
|
+
import { store } from '@lib/store';
|
|
4
|
+
import { logger } from '@lib/utils/logger';
|
|
5
|
+
import { cache } from '@lib/utils/cache';
|
|
6
|
+
import { parseURLSearchParams } from '@lib/utils/string';
|
|
7
|
+
import { dependencyTagger } from '@lib/store/dependency/dependencyTagger';
|
|
8
|
+
import { queryManager } from './queryManager';
|
|
9
|
+
import {
|
|
10
|
+
QueryModuleResult,
|
|
11
|
+
QueryRunner,
|
|
12
|
+
CacheStatus,
|
|
13
|
+
QueryErrorResponse,
|
|
14
|
+
QuerySuccessfulResponse,
|
|
15
|
+
QueryArgs,
|
|
16
|
+
} from './query.types';
|
|
17
|
+
|
|
18
|
+
let count = 0;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Creates a QueryErrorResponse object ready to be returned to clients.
|
|
22
|
+
*
|
|
23
|
+
* @param message - Error message
|
|
24
|
+
*
|
|
25
|
+
* @returns A JSON object with an error key
|
|
26
|
+
*
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
const createErrorResponse = (message: string): QueryErrorResponse => {
|
|
30
|
+
logger.error(message);
|
|
31
|
+
return { error: message };
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const queryRunner: QueryRunner = {
|
|
35
|
+
run: (queryDefinition): QuerySuccessfulResponse | QueryErrorResponse => {
|
|
36
|
+
if (!config.queryDir) {
|
|
37
|
+
return createErrorResponse('No query directory ("queryDir") configured');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const [queryId, queryArgsString] = queryDefinition.split('?');
|
|
41
|
+
const queryArgs: QueryArgs = queryArgsString
|
|
42
|
+
? parseURLSearchParams(queryArgsString)
|
|
43
|
+
: {};
|
|
44
|
+
|
|
45
|
+
if (!queryId) {
|
|
46
|
+
return createErrorResponse('No query ID received');
|
|
47
|
+
}
|
|
48
|
+
const queryModuleInfo = queryManager.getModuleGroupInfo().get(queryId);
|
|
49
|
+
if (!queryModuleInfo) {
|
|
50
|
+
return createErrorResponse(`Query module for ID ${queryId} not found`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
count += 1;
|
|
54
|
+
const startDate = microtime.now();
|
|
55
|
+
|
|
56
|
+
// Implement a query cache.
|
|
57
|
+
const cacheId = queryDefinition;
|
|
58
|
+
let isCacheMiss = false;
|
|
59
|
+
const queryCache = cache.bin<QueryModuleResult>('query');
|
|
60
|
+
let queryResult = queryCache.get(cacheId);
|
|
61
|
+
if (!queryResult) {
|
|
62
|
+
try {
|
|
63
|
+
const queryModule = queryModuleInfo.getModule();
|
|
64
|
+
const queryResponse = queryModule.default({
|
|
65
|
+
store,
|
|
66
|
+
args: queryArgs,
|
|
67
|
+
});
|
|
68
|
+
queryResult = {
|
|
69
|
+
result: queryResponse?.result,
|
|
70
|
+
contentType: queryResponse?.contentType || 'application/json',
|
|
71
|
+
};
|
|
72
|
+
isCacheMiss = true;
|
|
73
|
+
if (queryResponse?.cacheable !== false) {
|
|
74
|
+
queryCache.set(cacheId, queryResult);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Set tags for this query.
|
|
78
|
+
const queryTags =
|
|
79
|
+
queryResponse.tags && queryResponse.tags?.length > 0
|
|
80
|
+
? queryResponse.tags
|
|
81
|
+
: ['*'];
|
|
82
|
+
dependencyTagger.setDependency(queryDefinition, queryTags);
|
|
83
|
+
} catch (e) {
|
|
84
|
+
// Log error and rethrow.
|
|
85
|
+
logger.error(
|
|
86
|
+
`#${count} Query error: "${queryId}", args "${queryArgsString}": ${e}`,
|
|
87
|
+
);
|
|
88
|
+
throw e;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const execTimeMs = (microtime.now() - startDate) / 1000;
|
|
92
|
+
const response: QuerySuccessfulResponse = {
|
|
93
|
+
data: queryResult.result,
|
|
94
|
+
metadata: {
|
|
95
|
+
contentType: queryResult?.contentType || 'application/json',
|
|
96
|
+
execTimeMs,
|
|
97
|
+
cache: isCacheMiss ? CacheStatus.MISS : CacheStatus.HIT,
|
|
98
|
+
tags: queryResult.tags ? Array.from(queryResult.tags) : undefined,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/* logger.debug(
|
|
103
|
+
`#${count} Query "${queryId}" args "${argsString}" took ${execTimeMs} ms.`,
|
|
104
|
+
); */
|
|
105
|
+
|
|
106
|
+
return response;
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
getCount: (): number => count,
|
|
110
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { store } from '@lib/store/store';
|
|
2
|
+
import { Json } from '@lib/utils/object/object.types';
|
|
3
|
+
import { QueryTagManager } from './query.types';
|
|
4
|
+
|
|
5
|
+
const invalidatedTags = new Set<string>();
|
|
6
|
+
|
|
7
|
+
const tagsByQueryIndex = new Map<string, Set<string>>();
|
|
8
|
+
|
|
9
|
+
export const queryTagManager: QueryTagManager = {
|
|
10
|
+
invalidateTags: tags => {
|
|
11
|
+
tags.forEach(tag => {
|
|
12
|
+
invalidatedTags.add(tag);
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
resetInvalidatedTags: () => {
|
|
17
|
+
invalidatedTags.clear();
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
setTagsToQuery: (queryDefinition, tags) => {
|
|
21
|
+
if (tags) {
|
|
22
|
+
tagsByQueryIndex.set(queryDefinition, tags);
|
|
23
|
+
} else {
|
|
24
|
+
tagsByQueryIndex.delete(queryDefinition);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
getInvalidFilepaths: () => {
|
|
29
|
+
const invalidFilepaths = new Set<string>();
|
|
30
|
+
store.data.forEach((json: Json, relativeFilepath: string) => {
|
|
31
|
+
if (json?.metadata?.includes?.dynamic) {
|
|
32
|
+
Object.values(json.metadata.includes.dynamic).forEach(
|
|
33
|
+
queryDefinition => {
|
|
34
|
+
const tagsByQuery = tagsByQueryIndex.get(queryDefinition);
|
|
35
|
+
if (tagsByQuery) {
|
|
36
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
37
|
+
for (const invalidatedTag of invalidatedTags) {
|
|
38
|
+
if (tagsByQuery.has(invalidatedTag)) {
|
|
39
|
+
invalidFilepaths.add(relativeFilepath);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
invalidFilepaths.add(relativeFilepath);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
return Array.from(invalidFilepaths);
|
|
52
|
+
},
|
|
53
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { config } from '@lib/config';
|
|
4
|
+
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
config.dataDir = fs.realpathSync(path.resolve('src/__tests__/fixtures/data'));
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
describe('dataDirManager test', () => {
|
|
10
|
+
describe('loadDataDir', () => {
|
|
11
|
+
it(`Adds to store all files in datadir`, () => {
|
|
12
|
+
expect('1').toEqual('1');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ChangedFiles } from '../workDir/workDir.types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A manager for the data dir from Static Suite.
|
|
5
|
+
*/
|
|
6
|
+
export type DataDirManager = {
|
|
7
|
+
/**
|
|
8
|
+
* Loads all files inside the data directory into the store.
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
load(): void;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Updates the store with changed files since last sync.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* It's main difference with load() is that, instead of loading the whole store,
|
|
18
|
+
* update() checks if something has changed, not doing anything if nothing
|
|
19
|
+
* has changed. Thus, this method is way faster than load().
|
|
20
|
+
*
|
|
21
|
+
* @returns A group of changed files in Static Suite's data dir.
|
|
22
|
+
*/
|
|
23
|
+
update(): ChangedFiles;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get date of last modification of data directory.
|
|
27
|
+
*
|
|
28
|
+
* @remarks
|
|
29
|
+
* Metadata about when and how is the data directory updated is
|
|
30
|
+
* stored in the work directory. If that directory is not present or
|
|
31
|
+
* not initialized with proper data, it returns the sync date of the store.
|
|
32
|
+
* If the store is not yet loaded, it returns a date in the past,
|
|
33
|
+
* the Unix Epoch (00:00:00 UTC on 1 January 1970).
|
|
34
|
+
*
|
|
35
|
+
* @returns The date of last modification of data directory
|
|
36
|
+
*/
|
|
37
|
+
getModificationDate(): Date;
|
|
38
|
+
};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import microtime from 'microtime';
|
|
2
|
+
import { config } from '@lib/config';
|
|
3
|
+
import { store } from '@lib/store';
|
|
4
|
+
import { findFilesInDir } from '@lib/utils/fs';
|
|
5
|
+
import { logger } from '@lib/utils/logger';
|
|
6
|
+
import { workDirHelper } from '@lib/store/workDir';
|
|
7
|
+
import { cache } from '@lib/utils/cache';
|
|
8
|
+
import { storeManager } from '@lib/store/storeManager';
|
|
9
|
+
import { hookManager } from '@lib/store/hook';
|
|
10
|
+
import { queryManager } from '@lib/query';
|
|
11
|
+
import { taskManager } from '@lib/task';
|
|
12
|
+
import { DataDirManager } from './dataDir.types';
|
|
13
|
+
import { ChangedFiles } from '../workDir/workDir.types';
|
|
14
|
+
import { dependencyManager } from '../dependency/dependencyManager';
|
|
15
|
+
|
|
16
|
+
export const dataDirManager: DataDirManager = {
|
|
17
|
+
load: () => {
|
|
18
|
+
logger.info('Loading data dir...');
|
|
19
|
+
const startDate = Date.now();
|
|
20
|
+
|
|
21
|
+
// Reset store, just in case this load is called on an already loaded store.
|
|
22
|
+
storeManager.reset();
|
|
23
|
+
|
|
24
|
+
// Clear all caches.
|
|
25
|
+
cache.clear();
|
|
26
|
+
|
|
27
|
+
// Reset all managers.
|
|
28
|
+
hookManager.reset();
|
|
29
|
+
queryManager.reset();
|
|
30
|
+
taskManager.reset();
|
|
31
|
+
|
|
32
|
+
// Invoke "store load start" hook.
|
|
33
|
+
hookManager.invokeOnStoreLoadStart();
|
|
34
|
+
|
|
35
|
+
store.syncDate = dataDirManager.getModificationDate();
|
|
36
|
+
|
|
37
|
+
// Add all files, one by one.
|
|
38
|
+
const relativeFilePaths = findFilesInDir(config.dataDir);
|
|
39
|
+
const storeHydrationStartDate = Date.now();
|
|
40
|
+
relativeFilePaths.forEach(relativeFilePath => {
|
|
41
|
+
storeManager.add(relativeFilePath);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
logger.debug(
|
|
45
|
+
`Store map hydrated in ${Date.now() - storeHydrationStartDate}ms.`,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const includeParserStartDate = Date.now();
|
|
49
|
+
storeManager.parseIncludes();
|
|
50
|
+
logger.debug(
|
|
51
|
+
`Store include parser done in ${Date.now() - includeParserStartDate}ms.`,
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
// Invoke "store load done" hook.
|
|
55
|
+
hookManager.invokeOnStoreLoadDone();
|
|
56
|
+
|
|
57
|
+
logger.info(
|
|
58
|
+
`${relativeFilePaths.length} files loaded in ${
|
|
59
|
+
Date.now() - startDate
|
|
60
|
+
}ms.`,
|
|
61
|
+
);
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
update: () => {
|
|
65
|
+
const dataDirModificationDate = dataDirManager.getModificationDate();
|
|
66
|
+
|
|
67
|
+
let changedFiles: ChangedFiles = {
|
|
68
|
+
updated: [],
|
|
69
|
+
deleted: [],
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
if (store.syncDate) {
|
|
73
|
+
if (dataDirModificationDate > store.syncDate) {
|
|
74
|
+
// Save store.syncDate to a variable and set it ASAP to avoid two concurrent
|
|
75
|
+
// processes updating the data directory at the same time.
|
|
76
|
+
const storeLastSyncDate = store.syncDate;
|
|
77
|
+
store.syncDate = dataDirModificationDate;
|
|
78
|
+
const startDate = microtime.now();
|
|
79
|
+
logger.debug(
|
|
80
|
+
`Data dir outdated. Current data loaded at ${storeLastSyncDate.toISOString()} but last updated at ${dataDirModificationDate.toISOString()}`,
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// Before updating anything, track down which filepaths are invalidated with
|
|
84
|
+
// the current set of dependencies, before those dependencies change.
|
|
85
|
+
dependencyManager.trackInvalidatedFilepaths();
|
|
86
|
+
|
|
87
|
+
changedFiles = workDirHelper.getChangedFilesSince(storeLastSyncDate);
|
|
88
|
+
hookManager.invokeOnStoreChangeStart(changedFiles);
|
|
89
|
+
changedFiles.updated.forEach(file => {
|
|
90
|
+
storeManager.update(file);
|
|
91
|
+
const fileContent = store.data.get(file);
|
|
92
|
+
storeManager.parseSingleFileIncludes(file, fileContent);
|
|
93
|
+
});
|
|
94
|
+
changedFiles.deleted.forEach(file => {
|
|
95
|
+
storeManager.remove(file);
|
|
96
|
+
});
|
|
97
|
+
// Clear all store subsets and queries, since they are stale.
|
|
98
|
+
// In fact, the subset cache should be cleared only when files
|
|
99
|
+
// are added or deleted, but not when they are simply updated.
|
|
100
|
+
// Anyway, we currently do not have any means of distinguishing
|
|
101
|
+
// added files from updated ones, so we must clear the subset
|
|
102
|
+
// cache in all situations.
|
|
103
|
+
cache.bin('store-subset').clear();
|
|
104
|
+
cache.bin('query').clear();
|
|
105
|
+
hookManager.invokeOnStoreChangeDone(changedFiles);
|
|
106
|
+
const execTimeMs = (microtime.now() - startDate) / 1000;
|
|
107
|
+
logger.debug(`Data dir updated in ${execTimeMs}ms.`);
|
|
108
|
+
} else {
|
|
109
|
+
logger.debug(
|
|
110
|
+
`Data dir up to date. Current data loaded at ${store.syncDate.toISOString()} and last updated at ${dataDirModificationDate.toISOString()}`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
logger.debug(`Data dir not yet loaded, so it cannot be updated.`);
|
|
115
|
+
}
|
|
116
|
+
return changedFiles;
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
getModificationDate: (): Date =>
|
|
120
|
+
workDirHelper.getModificationDate() || store.syncDate || new Date(0),
|
|
121
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dataDirManager';
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service to define dependencies between data.
|
|
3
|
+
*/
|
|
4
|
+
export type DependencyTagger = {
|
|
5
|
+
/**
|
|
6
|
+
* Sets a dependency relationship between a tag that depends on another tags.
|
|
7
|
+
*
|
|
8
|
+
* @remarks It replaces any previous dependency relationship.
|
|
9
|
+
*
|
|
10
|
+
* @param tag - A tag to set a dependency for.
|
|
11
|
+
* @param dependsOnTags - An array of tags that depends on first parameter tag.
|
|
12
|
+
*/
|
|
13
|
+
setDependency(tag: string, dependsOnTags: string[]): void;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Adds a dependency relationship between a tag that depends on another tags.
|
|
17
|
+
*
|
|
18
|
+
* @remarks It adds data to any previous dependency relationship.
|
|
19
|
+
*
|
|
20
|
+
* @param tag - A tag to set a dependency for.
|
|
21
|
+
* @param dependsOnTags - An array of tags that depends on first parameter tag.
|
|
22
|
+
*/
|
|
23
|
+
addDependency(tag: string, dependsOnTags: string[]): void;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Deletes a dependency relationship between a tag that depends on another tags.
|
|
27
|
+
*
|
|
28
|
+
* @param tag - A tag to delete a dependency for.
|
|
29
|
+
* @param dependsOnTags - Optional array of tags that depends on first parameter
|
|
30
|
+
* tag. If not provided, it deletes all dependencies for tag.
|
|
31
|
+
*/
|
|
32
|
+
deleteDependency(tag: string, dependsOnTags?: string[]): void;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Marks dependency items with any of the specified tags as invalid.
|
|
36
|
+
*
|
|
37
|
+
* @param tags - The list of tags for which to invalidate dependency items.
|
|
38
|
+
*/
|
|
39
|
+
invalidateTags(tags: string[]): void;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Resets the list of invalidated tags once consumed.
|
|
43
|
+
*/
|
|
44
|
+
// resetInvalidatedTags(): void;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Manager that keeps control of dependencies between data.
|
|
49
|
+
*/
|
|
50
|
+
export type DependencyManager = {
|
|
51
|
+
/**
|
|
52
|
+
* Calculates and tracks down a list of filepaths which contain an invalidated tag.
|
|
53
|
+
*
|
|
54
|
+
* @remarks
|
|
55
|
+
* It calculates which filepaths have been invalidated, and stores them so they
|
|
56
|
+
* can be consumed later. This function should be called before the store is updated,
|
|
57
|
+
* before any dependency data changes, to avoid losing the set of invalidated filepaths
|
|
58
|
+
* between updates.
|
|
59
|
+
*/
|
|
60
|
+
trackInvalidatedFilepaths(): void;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Gets a list of filepaths which contain an invalidated tag.
|
|
64
|
+
*
|
|
65
|
+
* @remarks
|
|
66
|
+
* It uses the set of tracked down filepaths from
|
|
67
|
+
*
|
|
68
|
+
* @returns A list of filepaths which contain an invalidated tag.
|
|
69
|
+
*/
|
|
70
|
+
getInvalidatedFilepaths(): { updated: string[]; deleted: string[] };
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Resets the list of invalidated tags once consumed.
|
|
74
|
+
*/
|
|
75
|
+
reset(): void;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export type DependencyTree = Map<string, Set<string>>;
|