@depup/angular__build 22.1.8-depup.4 → 22.2.0-depup.0
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/README.md +9 -14
- package/builders.json +1 -1
- package/changes.json +13 -33
- package/package.json +31 -50
- package/src/builders/application/build-action.js +63 -92
- package/src/builders/application/build-action.js.map +1 -1
- package/src/builders/application/chunk-optimizer.d.ts +2 -2
- package/src/builders/application/chunk-optimizer.js +5 -5
- package/src/builders/application/chunk-optimizer.js.map +1 -1
- package/src/builders/application/execute-build.js +26 -19
- package/src/builders/application/execute-build.js.map +1 -1
- package/src/builders/application/execute-post-bundle.d.ts +2 -2
- package/src/builders/application/execute-post-bundle.js +5 -5
- package/src/builders/application/execute-post-bundle.js.map +1 -1
- package/src/builders/application/i18n.d.ts +3 -1
- package/src/builders/application/i18n.js +48 -13
- package/src/builders/application/i18n.js.map +1 -1
- package/src/{tools/esbuild → builders/application}/index-html-generator.d.ts +2 -2
- package/src/{tools/esbuild → builders/application}/index-html-generator.js +2 -2
- package/src/builders/application/index-html-generator.js.map +1 -0
- package/src/builders/application/index.js +2 -2
- package/src/builders/application/index.js.map +1 -1
- package/src/builders/application/options.d.ts +5 -0
- package/src/builders/application/options.js +8 -26
- package/src/builders/application/options.js.map +1 -1
- package/src/builders/application/results.d.ts +3 -2
- package/src/builders/application/schema.d.ts +2 -1
- package/src/builders/application/schema.js.map +1 -1
- package/src/builders/application/schema.json +1 -2
- package/src/builders/application/setup-bundling.js +3 -1
- package/src/builders/application/setup-bundling.js.map +1 -1
- package/src/builders/dev-server/internal.d.ts +1 -1
- package/src/builders/dev-server/internal.js +1 -1
- package/src/builders/dev-server/internal.js.map +1 -1
- package/src/builders/dev-server/vite/index.js +5 -8
- package/src/builders/dev-server/vite/index.js.map +1 -1
- package/src/builders/dev-server/vite/server.js +2 -0
- package/src/builders/dev-server/vite/server.js.map +1 -1
- package/src/builders/dev-server/vite/utils.d.ts +1 -1
- package/src/builders/dev-server/vite/utils.js +9 -4
- package/src/builders/dev-server/vite/utils.js.map +1 -1
- package/src/builders/extract-i18n/application-extraction.js +6 -5
- package/src/builders/extract-i18n/application-extraction.js.map +1 -1
- package/src/builders/karma/application_builder.js +1 -1
- package/src/builders/karma/application_builder.js.map +1 -1
- package/src/builders/karma/assets-middleware.d.ts +2 -2
- package/src/builders/karma/assets-middleware.js +5 -2
- package/src/builders/karma/assets-middleware.js.map +1 -1
- package/src/builders/karma/progress-reporter.js +7 -5
- package/src/builders/karma/progress-reporter.js.map +1 -1
- package/src/builders/karma/utils.d.ts +2 -1
- package/src/builders/karma/utils.js +2 -2
- package/src/builders/karma/utils.js.map +1 -1
- package/src/builders/unit-test/builder.js +1 -1
- package/src/builders/unit-test/runners/vitest/build-options.js +9 -3
- package/src/builders/unit-test/runners/vitest/build-options.js.map +1 -1
- package/src/builders/unit-test/runners/vitest/executor.js +5 -4
- package/src/builders/unit-test/runners/vitest/executor.js.map +1 -1
- package/src/builders/unit-test/runners/vitest/plugins.d.ts +4 -4
- package/src/builders/unit-test/runners/vitest/plugins.js +9 -2
- package/src/builders/unit-test/runners/vitest/plugins.js.map +1 -1
- package/src/builders/unit-test/schema.d.ts +3 -2
- package/src/builders/unit-test/schema.js.map +1 -1
- package/src/builders/unit-test/schema.json +3 -2
- package/src/builders/unit-test/test-discovery.js +3 -2
- package/src/builders/unit-test/test-discovery.js.map +1 -1
- package/src/private.d.ts +3 -5
- package/src/private.js +6 -9
- package/src/private.js.map +1 -1
- package/src/tools/angular/angular-host.d.ts +1 -2
- package/src/tools/angular/angular-host.js +6 -6
- package/src/tools/angular/angular-host.js.map +1 -1
- package/src/tools/angular/compilation/angular-compilation.d.ts +24 -16
- package/src/tools/angular/compilation/angular-compilation.js +4 -80
- package/src/tools/angular/compilation/angular-compilation.js.map +1 -1
- package/src/tools/angular/compilation/aot-compilation.d.ts +6 -12
- package/src/tools/angular/compilation/aot-compilation.js +23 -20
- package/src/tools/angular/compilation/aot-compilation.js.map +1 -1
- package/src/tools/angular/compilation/compiler-options.d.ts +25 -0
- package/src/tools/angular/compilation/compiler-options.js +135 -0
- package/src/tools/angular/compilation/compiler-options.js.map +1 -0
- package/src/tools/angular/compilation/factory.d.ts +5 -3
- package/src/tools/angular/compilation/factory.js +10 -5
- package/src/tools/angular/compilation/factory.js.map +1 -1
- package/src/tools/angular/compilation/index.d.ts +3 -3
- package/src/tools/angular/compilation/index.js +1 -3
- package/src/tools/angular/compilation/index.js.map +1 -1
- package/src/tools/angular/compilation/jit-compilation.d.ts +6 -9
- package/src/tools/angular/compilation/jit-compilation.js +10 -16
- package/src/tools/angular/compilation/jit-compilation.js.map +1 -1
- package/src/tools/angular/compilation/parallel-compilation.d.ts +3 -14
- package/src/tools/angular/compilation/parallel-compilation.js +40 -42
- package/src/tools/angular/compilation/parallel-compilation.js.map +1 -1
- package/src/tools/angular/compilation/parallel-worker.d.ts +5 -17
- package/src/tools/angular/compilation/parallel-worker.js +89 -68
- package/src/tools/angular/compilation/parallel-worker.js.map +1 -1
- package/src/tools/angular/compilation/typescript-compilation.d.ts +31 -0
- package/src/tools/angular/compilation/typescript-compilation.js +125 -0
- package/src/tools/angular/compilation/typescript-compilation.js.map +1 -0
- package/src/tools/angular/linker/oxc-ast-host.d.ts +33 -0
- package/src/tools/angular/linker/oxc-ast-host.js +234 -0
- package/src/tools/angular/linker/oxc-ast-host.js.map +1 -0
- package/src/tools/angular/linker/oxc-linker.d.ts +22 -0
- package/src/tools/angular/linker/oxc-linker.js +75 -0
- package/src/tools/angular/linker/oxc-linker.js.map +1 -0
- package/src/tools/angular/linker/string-ast-factory.d.ts +86 -0
- package/src/tools/angular/linker/string-ast-factory.js +234 -0
- package/src/tools/angular/linker/string-ast-factory.js.map +1 -0
- package/src/tools/esbuild/angular/compilation-state.d.ts +23 -3
- package/src/tools/esbuild/angular/compilation-state.js +51 -13
- package/src/tools/esbuild/angular/compilation-state.js.map +1 -1
- package/src/tools/esbuild/angular/compiler-plugin.d.ts +1 -0
- package/src/tools/esbuild/angular/compiler-plugin.js +126 -139
- package/src/tools/esbuild/angular/compiler-plugin.js.map +1 -1
- package/src/tools/esbuild/angular/component-stylesheets.d.ts +3 -3
- package/src/tools/esbuild/angular/component-stylesheets.js +52 -22
- package/src/tools/esbuild/angular/component-stylesheets.js.map +1 -1
- package/src/tools/esbuild/angular/source-file-cache.d.ts +1 -2
- package/src/tools/esbuild/angular/source-file-cache.js +1 -11
- package/src/tools/esbuild/angular/source-file-cache.js.map +1 -1
- package/src/tools/esbuild/application-code-bundle.js +7 -14
- package/src/tools/esbuild/application-code-bundle.js.map +1 -1
- package/src/tools/esbuild/budget-stats.js +3 -3
- package/src/tools/esbuild/budget-stats.js.map +1 -1
- package/src/tools/esbuild/bundler-context.d.ts +23 -7
- package/src/tools/esbuild/bundler-context.js +112 -43
- package/src/tools/esbuild/bundler-context.js.map +1 -1
- package/src/tools/esbuild/bundler-execution-result.d.ts +2 -1
- package/src/tools/esbuild/bundler-execution-result.js +2 -2
- package/src/tools/esbuild/bundler-execution-result.js.map +1 -1
- package/src/tools/esbuild/bundler-files.js +3 -5
- package/src/tools/esbuild/bundler-files.js.map +1 -1
- package/src/tools/esbuild/compiler-plugin-options.js +2 -1
- package/src/tools/esbuild/compiler-plugin-options.js.map +1 -1
- package/src/tools/esbuild/i18n-locale-plugin.d.ts +1 -8
- package/src/tools/esbuild/i18n-locale-plugin.js +33 -114
- package/src/tools/esbuild/i18n-locale-plugin.js.map +1 -1
- package/src/tools/esbuild/license-extractor.d.ts +1 -1
- package/src/tools/esbuild/license-extractor.js +89 -86
- package/src/tools/esbuild/license-extractor.js.map +1 -1
- package/src/tools/esbuild/load-result-cache.d.ts +2 -1
- package/src/tools/esbuild/load-result-cache.js +28 -13
- package/src/tools/esbuild/load-result-cache.js.map +1 -1
- package/src/tools/esbuild/persistent-load-result-cache.d.ts +87 -0
- package/src/tools/esbuild/persistent-load-result-cache.js +229 -0
- package/src/tools/esbuild/persistent-load-result-cache.js.map +1 -0
- package/src/tools/esbuild/stylesheets/bundle-options.d.ts +1 -0
- package/src/tools/esbuild/stylesheets/bundle-options.js +1 -1
- package/src/tools/esbuild/stylesheets/bundle-options.js.map +1 -1
- package/src/tools/esbuild/stylesheets/css-resource-plugin.d.ts +3 -1
- package/src/tools/esbuild/stylesheets/css-resource-plugin.js +4 -2
- package/src/tools/esbuild/stylesheets/css-resource-plugin.js.map +1 -1
- package/src/tools/esbuild/stylesheets/sass-language.d.ts +9 -0
- package/src/tools/esbuild/stylesheets/sass-language.js +109 -50
- package/src/tools/esbuild/stylesheets/sass-language.js.map +1 -1
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.d.ts +35 -0
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.js +64 -0
- package/src/tools/esbuild/stylesheets/stylesheet-cache-key.js.map +1 -0
- package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.d.ts +1 -1
- package/src/tools/esbuild/utils.d.ts +3 -3
- package/src/tools/esbuild/utils.js +9 -6
- package/src/tools/esbuild/utils.js.map +1 -1
- package/src/tools/i18n/i18n-inliner-worker.d.ts +126 -0
- package/src/tools/i18n/i18n-inliner-worker.js +363 -0
- package/src/tools/i18n/i18n-inliner-worker.js.map +1 -0
- package/src/tools/i18n/i18n-inliner.d.ts +97 -0
- package/src/tools/i18n/i18n-inliner.js +500 -0
- package/src/tools/i18n/i18n-inliner.js.map +1 -0
- package/src/tools/i18n/i18n-translation-encoder.d.ts +21 -0
- package/src/tools/i18n/i18n-translation-encoder.js +92 -0
- package/src/tools/i18n/i18n-translation-encoder.js.map +1 -0
- package/src/tools/i18n/i18n-translation-reader.d.ts +41 -0
- package/src/tools/i18n/i18n-translation-reader.js +164 -0
- package/src/tools/i18n/i18n-translation-reader.js.map +1 -0
- package/src/tools/i18n/index.d.ts +11 -0
- package/src/tools/i18n/index.js +28 -0
- package/src/tools/i18n/index.js.map +1 -0
- package/src/tools/i18n/locale-data.d.ts +47 -0
- package/src/tools/i18n/locale-data.js +108 -0
- package/src/tools/i18n/locale-data.js.map +1 -0
- package/src/tools/javascript-transformer/index.d.ts +8 -0
- package/src/tools/javascript-transformer/index.js +25 -0
- package/src/tools/javascript-transformer/index.js.map +1 -0
- package/src/tools/{esbuild → javascript-transformer}/javascript-transformer-worker.d.ts +0 -4
- package/src/tools/javascript-transformer/javascript-transformer-worker.js +231 -0
- package/src/tools/javascript-transformer/javascript-transformer-worker.js.map +1 -0
- package/src/tools/{esbuild → javascript-transformer}/javascript-transformer.d.ts +26 -9
- package/src/tools/javascript-transformer/javascript-transformer.js +294 -0
- package/src/tools/javascript-transformer/javascript-transformer.js.map +1 -0
- package/src/tools/{babel/plugins → oxc}/oxc-transform.d.ts +5 -2
- package/src/tools/{babel/plugins → oxc}/oxc-transform.js +105 -138
- package/src/tools/oxc/oxc-transform.js.map +1 -0
- package/src/tools/oxc/traversal.d.ts +32 -0
- package/src/tools/oxc/traversal.js +299 -0
- package/src/tools/oxc/traversal.js.map +1 -0
- package/src/tools/oxc/types.d.ts +20 -0
- package/src/tools/sass/rebasing-importer.d.ts +12 -18
- package/src/tools/sass/rebasing-importer.js +23 -26
- package/src/tools/sass/rebasing-importer.js.map +1 -1
- package/src/tools/sass/sass-service.d.ts +15 -38
- package/src/tools/sass/sass-service.js +132 -187
- package/src/tools/sass/sass-service.js.map +1 -1
- package/src/tools/vite/middlewares/assets-middleware.js +3 -3
- package/src/tools/vite/middlewares/assets-middleware.js.map +1 -1
- package/src/tools/vite/utils.d.ts +1 -1
- package/src/{tools/esbuild → utils/cache}/cache.d.ts +25 -8
- package/src/{tools/esbuild → utils/cache}/cache.js +72 -41
- package/src/utils/cache/cache.js.map +1 -0
- package/src/utils/cache/index.d.ts +8 -0
- package/src/utils/cache/index.js +25 -0
- package/src/utils/cache/index.js.map +1 -0
- package/src/{tools/esbuild → utils/cache}/lmdb-cache-store.js +1 -1
- package/src/{tools/esbuild → utils/cache}/lmdb-cache-store.js.map +1 -1
- package/src/{tools/esbuild → utils/cache}/sqlite-cache-store.d.ts +1 -1
- package/src/utils/cache/sqlite-cache-store.js +339 -0
- package/src/utils/cache/sqlite-cache-store.js.map +1 -0
- package/src/utils/concurrency.d.ts +30 -0
- package/src/utils/concurrency.js +81 -0
- package/src/utils/concurrency.js.map +1 -0
- package/src/utils/environment-options.d.ts +34 -0
- package/src/utils/environment-options.js +42 -12
- package/src/utils/environment-options.js.map +1 -1
- package/src/utils/hash.d.ts +24 -0
- package/src/utils/hash.js +94 -0
- package/src/utils/hash.js.map +1 -0
- package/src/utils/i18n-options.d.ts +3 -1
- package/src/utils/i18n-options.js.map +1 -1
- package/src/utils/index-file/auto-csp.d.ts +8 -0
- package/src/utils/index-file/auto-csp.js +30 -3
- package/src/utils/index-file/auto-csp.js.map +1 -1
- package/src/utils/index-file/index-html-generator.d.ts +1 -1
- package/src/utils/index-file/index-html-generator.js +9 -13
- package/src/utils/index-file/index-html-generator.js.map +1 -1
- package/src/utils/index-file/inline-critical-css.d.ts +16 -18
- package/src/utils/index-file/inline-critical-css.js +78 -179
- package/src/utils/index-file/inline-critical-css.js.map +1 -1
- package/src/utils/index-file/nonce.d.ts +2 -0
- package/src/utils/index-file/nonce.js +1 -0
- package/src/utils/index-file/nonce.js.map +1 -1
- package/src/utils/normalize-cache.js +1 -1
- package/src/utils/postcss-configuration.d.ts +6 -0
- package/src/utils/postcss-configuration.js +23 -0
- package/src/utils/postcss-configuration.js.map +1 -1
- package/src/{tools/esbuild → utils}/profiling.js +1 -1
- package/src/{tools/esbuild → utils}/profiling.js.map +1 -1
- package/src/utils/server-rendering/manifest.d.ts +2 -2
- package/src/utils/server-rendering/manifest.js +53 -4
- package/src/utils/server-rendering/manifest.js.map +1 -1
- package/src/utils/source-map.d.ts +26 -2
- package/src/utils/source-map.js +151 -53
- package/src/utils/source-map.js.map +1 -1
- package/src/utils/test-files.d.ts +2 -2
- package/src/utils/test-files.js +3 -3
- package/src/utils/test-files.js.map +1 -1
- package/src/utils/watcher.d.ts +61 -0
- package/src/utils/watcher.js +642 -0
- package/src/utils/watcher.js.map +1 -0
- package/src/tools/angular/compilation/noop-compilation.d.ts +0 -20
- package/src/tools/angular/compilation/noop-compilation.js +0 -27
- package/src/tools/angular/compilation/noop-compilation.js.map +0 -1
- package/src/tools/babel/plugins/add-code-coverage.d.ts +0 -14
- package/src/tools/babel/plugins/add-code-coverage.js +0 -44
- package/src/tools/babel/plugins/add-code-coverage.js.map +0 -1
- package/src/tools/babel/plugins/adjust-static-class-members.d.ts +0 -25
- package/src/tools/babel/plugins/adjust-static-class-members.js +0 -349
- package/src/tools/babel/plugins/adjust-static-class-members.js.map +0 -1
- package/src/tools/babel/plugins/adjust-typescript-enums.d.ts +0 -21
- package/src/tools/babel/plugins/adjust-typescript-enums.js +0 -113
- package/src/tools/babel/plugins/adjust-typescript-enums.js.map +0 -1
- package/src/tools/babel/plugins/elide-angular-metadata.d.ts +0 -23
- package/src/tools/babel/plugins/elide-angular-metadata.js +0 -110
- package/src/tools/babel/plugins/elide-angular-metadata.js.map +0 -1
- package/src/tools/babel/plugins/index.d.ts +0 -11
- package/src/tools/babel/plugins/index.js +0 -22
- package/src/tools/babel/plugins/index.js.map +0 -1
- package/src/tools/babel/plugins/oxc-transform.js.map +0 -1
- package/src/tools/babel/plugins/pure-toplevel-functions.d.ts +0 -13
- package/src/tools/babel/plugins/pure-toplevel-functions.js +0 -128
- package/src/tools/babel/plugins/pure-toplevel-functions.js.map +0 -1
- package/src/tools/babel/plugins/types.d.ts +0 -20
- package/src/tools/babel/typings.d.ts +0 -21
- package/src/tools/esbuild/cache.js.map +0 -1
- package/src/tools/esbuild/i18n-inliner-worker.d.ts +0 -81
- package/src/tools/esbuild/i18n-inliner-worker.js +0 -255
- package/src/tools/esbuild/i18n-inliner-worker.js.map +0 -1
- package/src/tools/esbuild/i18n-inliner.d.ts +0 -58
- package/src/tools/esbuild/i18n-inliner.js +0 -265
- package/src/tools/esbuild/i18n-inliner.js.map +0 -1
- package/src/tools/esbuild/index-html-generator.js.map +0 -1
- package/src/tools/esbuild/javascript-transformer-worker.js +0 -192
- package/src/tools/esbuild/javascript-transformer-worker.js.map +0 -1
- package/src/tools/esbuild/javascript-transformer.js +0 -197
- package/src/tools/esbuild/javascript-transformer.js.map +0 -1
- package/src/tools/esbuild/sqlite-cache-store.js +0 -165
- package/src/tools/esbuild/sqlite-cache-store.js.map +0 -1
- package/src/tools/esbuild/watcher.d.ts +0 -25
- package/src/tools/esbuild/watcher.js +0 -119
- package/src/tools/esbuild/watcher.js.map +0 -1
- package/src/tools/sass/worker.d.ts +0 -63
- package/src/tools/sass/worker.js +0 -202
- package/src/tools/sass/worker.js.map +0 -1
- /package/src/tools/{esbuild/angular → angular/compilation}/diagnostics.d.ts +0 -0
- /package/src/tools/{esbuild/angular → angular/compilation}/diagnostics.js +0 -0
- /package/src/tools/{esbuild/angular → angular/compilation}/diagnostics.js.map +0 -0
- /package/src/{tools/esbuild → utils/cache}/lmdb-cache-store.d.ts +0 -0
- /package/src/{tools/esbuild → utils}/profiling.d.ts +0 -0
|
@@ -40,14 +40,43 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
40
40
|
};
|
|
41
41
|
})();
|
|
42
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.MemoryCache = exports.Cache = void 0;
|
|
43
|
+
exports.MemoryCache = exports.Cache = exports.NamespacedCacheStore = void 0;
|
|
44
44
|
exports.createPersistentCacheStore = createPersistentCacheStore;
|
|
45
45
|
/**
|
|
46
46
|
* @fileoverview
|
|
47
47
|
* Provides infrastructure for common caching functionality within the build system.
|
|
48
48
|
*/
|
|
49
|
-
const environment_options_1 = require("
|
|
50
|
-
const error_1 = require("
|
|
49
|
+
const environment_options_1 = require("../environment-options");
|
|
50
|
+
const error_1 = require("../error");
|
|
51
|
+
/**
|
|
52
|
+
* A backing data store wrapper that namespaces all keys using length-prefix framing.
|
|
53
|
+
* Prevents key collisions between namespaces regardless of characters (such as colons)
|
|
54
|
+
* in the namespace or key.
|
|
55
|
+
*/
|
|
56
|
+
class NamespacedCacheStore {
|
|
57
|
+
store;
|
|
58
|
+
namespace;
|
|
59
|
+
#prefix;
|
|
60
|
+
constructor(store, namespace) {
|
|
61
|
+
this.store = store;
|
|
62
|
+
this.namespace = namespace;
|
|
63
|
+
this.#prefix = `${namespace.length}:${namespace}:`;
|
|
64
|
+
}
|
|
65
|
+
get(key) {
|
|
66
|
+
return this.store.get(this.#prefix + key);
|
|
67
|
+
}
|
|
68
|
+
has(key) {
|
|
69
|
+
return this.store.has(this.#prefix + key);
|
|
70
|
+
}
|
|
71
|
+
set(key, value) {
|
|
72
|
+
const result = this.store.set(this.#prefix + key, value);
|
|
73
|
+
if (result instanceof Promise) {
|
|
74
|
+
return result.then(() => this);
|
|
75
|
+
}
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.NamespacedCacheStore = NamespacedCacheStore;
|
|
51
80
|
/**
|
|
52
81
|
* A cache object that allows accessing and storing key/value pairs in
|
|
53
82
|
* an underlying CacheStore. This class is the primary method for consumers
|
|
@@ -55,16 +84,14 @@ const error_1 = require("../../utils/error");
|
|
|
55
84
|
*/
|
|
56
85
|
class Cache {
|
|
57
86
|
store;
|
|
58
|
-
namespace;
|
|
59
87
|
// In-flight creator promises to deduplicate concurrent requests for the same key.
|
|
60
88
|
#requests = new Map();
|
|
61
89
|
// Track how many writes occurred for a key to detect mutations during await gaps.
|
|
62
90
|
#writeCounts = new Map();
|
|
63
91
|
// Count the number of active, pending getOrCreate operations per key to avoid memory leaks.
|
|
64
92
|
#pendingGets = new Map();
|
|
65
|
-
constructor(store
|
|
93
|
+
constructor(store) {
|
|
66
94
|
this.store = store;
|
|
67
|
-
this.namespace = namespace;
|
|
68
95
|
}
|
|
69
96
|
#incrementWrite(key) {
|
|
70
97
|
// Only track write counts if there is a pending getOrCreate operation active for the key.
|
|
@@ -73,17 +100,6 @@ class Cache {
|
|
|
73
100
|
this.#writeCounts.set(key, (this.#writeCounts.get(key) || 0) + 1);
|
|
74
101
|
}
|
|
75
102
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Prefixes a key with the cache namespace if present.
|
|
78
|
-
* @param key A key string to prefix.
|
|
79
|
-
* @returns A prefixed key if a namespace is present. Otherwise the provided key.
|
|
80
|
-
*/
|
|
81
|
-
withNamespace(key) {
|
|
82
|
-
if (this.namespace) {
|
|
83
|
-
return `${this.namespace}:${key}`;
|
|
84
|
-
}
|
|
85
|
-
return key;
|
|
86
|
-
}
|
|
87
103
|
/**
|
|
88
104
|
* Gets the value associated with a provided key if available.
|
|
89
105
|
* Otherwise, creates a value using the factory creator function, puts the value
|
|
@@ -93,22 +109,21 @@ class Cache {
|
|
|
93
109
|
* @returns A value associated with the provided key.
|
|
94
110
|
*/
|
|
95
111
|
async getOrCreate(key, creator) {
|
|
96
|
-
const namespacedKey = this.withNamespace(key);
|
|
97
112
|
// 1. If another call is already running the creator for this key, share its promise.
|
|
98
|
-
let activeRequest = this.#requests.get(
|
|
113
|
+
let activeRequest = this.#requests.get(key);
|
|
99
114
|
if (activeRequest !== undefined) {
|
|
100
115
|
return activeRequest;
|
|
101
116
|
}
|
|
102
117
|
// Increment pending gets count to enable write-tracking for this key.
|
|
103
|
-
const currentPending = this.#pendingGets.get(
|
|
104
|
-
this.#pendingGets.set(
|
|
118
|
+
const currentPending = this.#pendingGets.get(key) || 0;
|
|
119
|
+
this.#pendingGets.set(key, currentPending + 1);
|
|
105
120
|
try {
|
|
106
|
-
const startWriteCount = this.#writeCounts.get(
|
|
121
|
+
const startWriteCount = this.#writeCounts.get(key) || 0;
|
|
107
122
|
// 2. Query the backing store. Since store.get can be async, we yield to the event loop.
|
|
108
|
-
const value = await this.store.get(
|
|
123
|
+
const value = await this.store.get(key);
|
|
109
124
|
// If a write (e.g. put) occurred during the store.get await gap, we must abort
|
|
110
125
|
// the current execution and restart to ensure we return the newly written value.
|
|
111
|
-
if ((this.#writeCounts.get(
|
|
126
|
+
if ((this.#writeCounts.get(key) || 0) !== startWriteCount) {
|
|
112
127
|
return this.getOrCreate(key, creator);
|
|
113
128
|
}
|
|
114
129
|
if (value !== undefined) {
|
|
@@ -116,7 +131,7 @@ class Cache {
|
|
|
116
131
|
}
|
|
117
132
|
// 3. Recheck active request after the await gap in case another concurrent call
|
|
118
133
|
// initiated a creator during the store.get wait.
|
|
119
|
-
activeRequest = this.#requests.get(
|
|
134
|
+
activeRequest = this.#requests.get(key);
|
|
120
135
|
if (activeRequest !== undefined) {
|
|
121
136
|
return activeRequest;
|
|
122
137
|
}
|
|
@@ -124,31 +139,31 @@ class Cache {
|
|
|
124
139
|
activeRequest = Promise.resolve(creator()).then(async (newValue) => {
|
|
125
140
|
// Ensure this request is still the active one before writing back to the store
|
|
126
141
|
// (prevents overwriting newer data if put() was called before resolution).
|
|
127
|
-
if (this.#requests.get(
|
|
128
|
-
this.#incrementWrite(
|
|
129
|
-
await this.store.set(
|
|
130
|
-
this.#requests.delete(
|
|
142
|
+
if (this.#requests.get(key) === activeRequest) {
|
|
143
|
+
this.#incrementWrite(key);
|
|
144
|
+
await this.store.set(key, newValue);
|
|
145
|
+
this.#requests.delete(key);
|
|
131
146
|
}
|
|
132
147
|
return newValue;
|
|
133
148
|
}, (error) => {
|
|
134
149
|
// Clean up the active request if the creator fails.
|
|
135
|
-
if (this.#requests.get(
|
|
136
|
-
this.#requests.delete(
|
|
150
|
+
if (this.#requests.get(key) === activeRequest) {
|
|
151
|
+
this.#requests.delete(key);
|
|
137
152
|
}
|
|
138
153
|
throw error;
|
|
139
154
|
});
|
|
140
|
-
this.#requests.set(
|
|
155
|
+
this.#requests.set(key, activeRequest);
|
|
141
156
|
return activeRequest;
|
|
142
157
|
}
|
|
143
158
|
finally {
|
|
144
159
|
// Clean up write counts and pending gets once all concurrent gets for this key finish.
|
|
145
|
-
const current = this.#pendingGets.get(
|
|
160
|
+
const current = this.#pendingGets.get(key) || 0;
|
|
146
161
|
if (current <= 1) {
|
|
147
|
-
this.#pendingGets.delete(
|
|
148
|
-
this.#writeCounts.delete(
|
|
162
|
+
this.#pendingGets.delete(key);
|
|
163
|
+
this.#writeCounts.delete(key);
|
|
149
164
|
}
|
|
150
165
|
else {
|
|
151
|
-
this.#pendingGets.set(
|
|
166
|
+
this.#pendingGets.set(key, current - 1);
|
|
152
167
|
}
|
|
153
168
|
}
|
|
154
169
|
}
|
|
@@ -158,7 +173,7 @@ class Cache {
|
|
|
158
173
|
* @returns A value associated with the provided key if present. Otherwise, `undefined`.
|
|
159
174
|
*/
|
|
160
175
|
async get(key) {
|
|
161
|
-
const value = await this.store.get(
|
|
176
|
+
const value = await this.store.get(key);
|
|
162
177
|
return value;
|
|
163
178
|
}
|
|
164
179
|
/**
|
|
@@ -168,10 +183,17 @@ class Cache {
|
|
|
168
183
|
* @param value A value to put in the cache.
|
|
169
184
|
*/
|
|
170
185
|
async put(key, value) {
|
|
171
|
-
|
|
172
|
-
this.#
|
|
173
|
-
this
|
|
174
|
-
|
|
186
|
+
this.#requests.delete(key);
|
|
187
|
+
this.#incrementWrite(key);
|
|
188
|
+
await this.store.set(key, value);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Clears internal state for a specific key (requests, write counts, and pending gets).
|
|
192
|
+
*/
|
|
193
|
+
deleteInternal(key) {
|
|
194
|
+
this.#requests.delete(key);
|
|
195
|
+
this.#writeCounts.delete(key);
|
|
196
|
+
this.#pendingGets.delete(key);
|
|
175
197
|
}
|
|
176
198
|
/**
|
|
177
199
|
* Clears the base class internal state (requests, write counts, and pending gets).
|
|
@@ -190,6 +212,15 @@ class MemoryCache extends Cache {
|
|
|
190
212
|
constructor() {
|
|
191
213
|
super(new Map());
|
|
192
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Removes the specified key from the cache instance.
|
|
217
|
+
* @param key The key to remove.
|
|
218
|
+
* @returns True if an element in the Map existed and has been removed, or false if the element does not exist.
|
|
219
|
+
*/
|
|
220
|
+
delete(key) {
|
|
221
|
+
this.deleteInternal(key);
|
|
222
|
+
return this.store.delete(key);
|
|
223
|
+
}
|
|
193
224
|
/**
|
|
194
225
|
* Removes all entries from the cache instance.
|
|
195
226
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
__exportStar(require("./cache"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,0CAAwB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lmdb-cache-store.js","sourceRoot":"","sources":["lmdb-cache-store.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,+BAA0C;AAC1C,
|
|
1
|
+
{"version":3,"file":"lmdb-cache-store.js","sourceRoot":"","sources":["lmdb-cache-store.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,+BAA0C;AAC1C,mCAA4E;AAE5E,MAAa,cAAc;IAIJ;IAHZ,aAAa,CAAC;IACvB,GAAG,CAA2B;IAE9B,YAAqB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;QACpC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,GAAG,KAAK,IAAA,WAAI,EAAC;YAChB,IAAI,EAAE,IAAI,CAAC,aAAa;YACxB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAc;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAEzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAc,SAAiB;QACxC,OAAO,IAAI,aAAK,CAAI,IAAI,4BAAoB,CAAI,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;CACF;AA/CD,wCA+CC"}
|
|
@@ -19,7 +19,7 @@ export declare class SqliteCacheStore implements PersistentCacheStore<unknown> {
|
|
|
19
19
|
readonly cachePath: string;
|
|
20
20
|
private readonly maxPayloadSize;
|
|
21
21
|
private readonly ttlDays;
|
|
22
|
-
constructor(cachePath: string, maxPayloadSize?: number, ttlDays?: number);
|
|
22
|
+
constructor(cachePath: string, maxPayloadSize?: number, ttlDays?: number, busyTimeoutMs?: number);
|
|
23
23
|
get(key: string): Promise<any>;
|
|
24
24
|
has(key: string): boolean;
|
|
25
25
|
set(key: string, value: unknown): Promise<this>;
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SqliteCacheStore = void 0;
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
const node_sqlite_1 = require("node:sqlite");
|
|
14
|
+
const node_util_1 = require("node:util");
|
|
15
|
+
const node_v8_1 = require("node:v8");
|
|
16
|
+
const node_zlib_1 = require("node:zlib");
|
|
17
|
+
const cache_1 = require("./cache");
|
|
18
|
+
const deflateRawAsync = (0, node_util_1.promisify)(node_zlib_1.deflateRaw);
|
|
19
|
+
/**
|
|
20
|
+
* Minimum payload size (in bytes) required to attempt compression.
|
|
21
|
+
* Smaller payloads generally do not achieve meaningful compression ratios, while larger payloads
|
|
22
|
+
* (such as transformed JavaScript modules from node_modules) achieve 70-80% size reduction
|
|
23
|
+
* and drastically reduce SQLite overflow pages.
|
|
24
|
+
*/
|
|
25
|
+
const COMPRESSION_THRESHOLD = 32 * 1024; // 32 KB
|
|
26
|
+
/**
|
|
27
|
+
* Storage format discriminator values for cache table entries.
|
|
28
|
+
*/
|
|
29
|
+
var CacheFormat;
|
|
30
|
+
(function (CacheFormat) {
|
|
31
|
+
CacheFormat[CacheFormat["V8"] = 0] = "V8";
|
|
32
|
+
CacheFormat[CacheFormat["V8Compressed"] = 1] = "V8Compressed";
|
|
33
|
+
CacheFormat[CacheFormat["RawBinary"] = 2] = "RawBinary";
|
|
34
|
+
CacheFormat[CacheFormat["RawBinaryCompressed"] = 3] = "RawBinaryCompressed";
|
|
35
|
+
})(CacheFormat || (CacheFormat = {}));
|
|
36
|
+
/**
|
|
37
|
+
* Common SQLite primary result codes.
|
|
38
|
+
* @see https://www.sqlite.org/rescode.html
|
|
39
|
+
*/
|
|
40
|
+
var SqliteResultCode;
|
|
41
|
+
(function (SqliteResultCode) {
|
|
42
|
+
SqliteResultCode[SqliteResultCode["Busy"] = 5] = "Busy";
|
|
43
|
+
SqliteResultCode[SqliteResultCode["Locked"] = 6] = "Locked";
|
|
44
|
+
})(SqliteResultCode || (SqliteResultCode = {}));
|
|
45
|
+
function isSqliteError(error) {
|
|
46
|
+
return (error instanceof Error &&
|
|
47
|
+
('errcode' in error ||
|
|
48
|
+
('code' in error && error.code === 'ERR_SQLITE_ERROR')));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A persistent cache store backed by SQLite.
|
|
52
|
+
*
|
|
53
|
+
* Values are persisted with the V8 structured clone serialization API instead of JSON. Cached
|
|
54
|
+
* values include binary data such as the `Uint8Array` output of the JavaScript transformer and
|
|
55
|
+
* the `contents` of an esbuild load result. A JSON round-trip converts those into plain objects
|
|
56
|
+
* (`{"0":105,"1":109,...}`), which breaks consumers on any build that reads them back from disk.
|
|
57
|
+
*/
|
|
58
|
+
class SqliteCacheStore {
|
|
59
|
+
cachePath;
|
|
60
|
+
maxPayloadSize;
|
|
61
|
+
ttlDays;
|
|
62
|
+
#db;
|
|
63
|
+
#disabled = false;
|
|
64
|
+
#getStmt;
|
|
65
|
+
#hasStmt;
|
|
66
|
+
#setStmt;
|
|
67
|
+
#updateAccessedStmt;
|
|
68
|
+
#pendingAccessedKeys = new Set();
|
|
69
|
+
#flushTimeout;
|
|
70
|
+
#busyTimeoutMs;
|
|
71
|
+
constructor(cachePath, maxPayloadSize = 1024 * 1024 * 1024, ttlDays = 14, busyTimeoutMs = 5000) {
|
|
72
|
+
this.cachePath = cachePath;
|
|
73
|
+
this.maxPayloadSize = maxPayloadSize;
|
|
74
|
+
this.ttlDays = ttlDays;
|
|
75
|
+
this.#busyTimeoutMs =
|
|
76
|
+
Number.isSafeInteger(busyTimeoutMs) && busyTimeoutMs >= 0 ? busyTimeoutMs : 5000;
|
|
77
|
+
}
|
|
78
|
+
#openDatabase() {
|
|
79
|
+
let db;
|
|
80
|
+
try {
|
|
81
|
+
if (this.cachePath === ':memory:') {
|
|
82
|
+
db = new node_sqlite_1.DatabaseSync(this.cachePath);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Optimistically attempt to open the database file first to avoid directory creation
|
|
86
|
+
// syscalls on warm builds where the parent directory already exists.
|
|
87
|
+
try {
|
|
88
|
+
db = new node_sqlite_1.DatabaseSync(this.cachePath);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(this.cachePath), { recursive: true });
|
|
92
|
+
db = new node_sqlite_1.DatabaseSync(this.cachePath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Optimize SQLite for cache usage
|
|
96
|
+
db.exec(`PRAGMA busy_timeout = ${this.#busyTimeoutMs};`);
|
|
97
|
+
db.exec('PRAGMA auto_vacuum = FULL;');
|
|
98
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
99
|
+
db.exec('PRAGMA synchronous = NORMAL;');
|
|
100
|
+
db.exec('PRAGMA temp_store = MEMORY;');
|
|
101
|
+
db.exec('PRAGMA mmap_size = 268435456;');
|
|
102
|
+
db.exec('CREATE TABLE IF NOT EXISTS cache (' +
|
|
103
|
+
'key TEXT PRIMARY KEY, ' +
|
|
104
|
+
'value BLOB, ' +
|
|
105
|
+
'format INTEGER NOT NULL DEFAULT 0, ' +
|
|
106
|
+
'last_accessed INTEGER NOT NULL' +
|
|
107
|
+
') WITHOUT ROWID;');
|
|
108
|
+
try {
|
|
109
|
+
db.exec('ALTER TABLE cache ADD COLUMN format INTEGER NOT NULL DEFAULT 0;');
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Ignore error if format column already exists
|
|
113
|
+
}
|
|
114
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_cache_accessed ON cache (last_accessed DESC, key DESC);');
|
|
115
|
+
this.#getStmt = db.prepare('SELECT value, format FROM cache WHERE key = ?');
|
|
116
|
+
this.#hasStmt = db.prepare('SELECT 1 FROM cache WHERE key = ?');
|
|
117
|
+
this.#setStmt = db.prepare('INSERT OR REPLACE INTO cache (key, value, format, last_accessed) VALUES (?, ?, ?, unixepoch())');
|
|
118
|
+
this.#updateAccessedStmt = db.prepare('UPDATE cache SET last_accessed = unixepoch() WHERE key = ?');
|
|
119
|
+
this.#db = db;
|
|
120
|
+
return db;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
try {
|
|
124
|
+
db?.close();
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Ignore close error on corrupted handle
|
|
128
|
+
}
|
|
129
|
+
this.#getStmt = undefined;
|
|
130
|
+
this.#hasStmt = undefined;
|
|
131
|
+
this.#setStmt = undefined;
|
|
132
|
+
this.#updateAccessedStmt = undefined;
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
#ensureDb() {
|
|
137
|
+
if (this.#disabled) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
if (!this.#db) {
|
|
141
|
+
try {
|
|
142
|
+
return this.#openDatabase();
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
// If the database is locked by another active process,
|
|
146
|
+
// do not attempt to delete the database files as that could corrupt the active process's database.
|
|
147
|
+
const isBusy = isSqliteError(error) &&
|
|
148
|
+
(error.errcode === SqliteResultCode.Busy || error.errcode === SqliteResultCode.Locked);
|
|
149
|
+
// Attempt to recover from database corruption by deleting the corrupted files and recreating
|
|
150
|
+
if (!isBusy && this.cachePath !== ':memory:') {
|
|
151
|
+
try {
|
|
152
|
+
(0, node_fs_1.rmSync)(this.cachePath, { force: true });
|
|
153
|
+
(0, node_fs_1.rmSync)(this.cachePath + '-wal', { force: true });
|
|
154
|
+
(0, node_fs_1.rmSync)(this.cachePath + '-shm', { force: true });
|
|
155
|
+
(0, node_fs_1.rmSync)(this.cachePath + '-journal', { force: true });
|
|
156
|
+
return this.#openDatabase();
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// If recovery fails (e.g. read-only filesystem or permission denied), disable caching
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
this.#disabled = true;
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return this.#db;
|
|
167
|
+
}
|
|
168
|
+
#queueAccessUpdate(key) {
|
|
169
|
+
this.#pendingAccessedKeys.add(key);
|
|
170
|
+
if (!this.#flushTimeout) {
|
|
171
|
+
this.#flushTimeout = setTimeout(() => this.#flushAccessUpdates(), 1000);
|
|
172
|
+
this.#flushTimeout.unref?.();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
#flushAccessUpdates() {
|
|
176
|
+
if (this.#flushTimeout) {
|
|
177
|
+
clearTimeout(this.#flushTimeout);
|
|
178
|
+
this.#flushTimeout = undefined;
|
|
179
|
+
}
|
|
180
|
+
if (this.#pendingAccessedKeys.size === 0) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
if (this.#db && this.#updateAccessedStmt) {
|
|
185
|
+
this.#db.exec('BEGIN IMMEDIATE TRANSACTION;');
|
|
186
|
+
for (const key of this.#pendingAccessedKeys) {
|
|
187
|
+
this.#updateAccessedStmt.run(key);
|
|
188
|
+
}
|
|
189
|
+
this.#db.exec('COMMIT;');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
try {
|
|
194
|
+
this.#db?.exec('ROLLBACK;');
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Ignore rollback errors if transaction was not active
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
this.#pendingAccessedKeys.clear();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
205
|
+
async get(key) {
|
|
206
|
+
if (!this.#ensureDb()) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
// SQLite column types are dynamic, so the stored value is only known at runtime.
|
|
211
|
+
const row = this.#getStmt?.get(key);
|
|
212
|
+
if (row) {
|
|
213
|
+
this.#queueAccessUpdate(key);
|
|
214
|
+
if (row.value instanceof Uint8Array) {
|
|
215
|
+
try {
|
|
216
|
+
switch (row.format) {
|
|
217
|
+
case CacheFormat.RawBinary:
|
|
218
|
+
return row.value;
|
|
219
|
+
case CacheFormat.RawBinaryCompressed: {
|
|
220
|
+
const decompressed = (0, node_zlib_1.inflateRawSync)(row.value);
|
|
221
|
+
return new Uint8Array(decompressed.buffer, decompressed.byteOffset, decompressed.byteLength);
|
|
222
|
+
}
|
|
223
|
+
case CacheFormat.V8Compressed:
|
|
224
|
+
return (0, node_v8_1.deserialize)((0, node_zlib_1.inflateRawSync)(row.value));
|
|
225
|
+
case CacheFormat.V8:
|
|
226
|
+
default:
|
|
227
|
+
return (0, node_v8_1.deserialize)(row.value);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Treat corrupt or unparseable cached payloads as a cache miss.
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Treat query errors (e.g. disk read failures) as a cache miss.
|
|
238
|
+
}
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
241
|
+
has(key) {
|
|
242
|
+
if (!this.#ensureDb()) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
return !!this.#hasStmt?.get(key);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async set(key, value) {
|
|
253
|
+
if (!this.#ensureDb()) {
|
|
254
|
+
return this;
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
this.#pendingAccessedKeys.delete(key);
|
|
258
|
+
const isBinary = value instanceof Uint8Array;
|
|
259
|
+
const data = isBinary ? value : (0, node_v8_1.serialize)(value);
|
|
260
|
+
let format = isBinary ? CacheFormat.RawBinary : CacheFormat.V8;
|
|
261
|
+
let payload = data;
|
|
262
|
+
if (data.byteLength >= COMPRESSION_THRESHOLD) {
|
|
263
|
+
const compressed = await deflateRawAsync(data, { level: 1 });
|
|
264
|
+
if (compressed.byteLength < data.byteLength) {
|
|
265
|
+
payload = compressed;
|
|
266
|
+
format = isBinary ? CacheFormat.RawBinaryCompressed : CacheFormat.V8Compressed;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
this.#setStmt?.run(key, payload, format);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// Writing to cache is non-fatal and should not fail the build.
|
|
273
|
+
}
|
|
274
|
+
return this;
|
|
275
|
+
}
|
|
276
|
+
createCache(namespace) {
|
|
277
|
+
return new cache_1.Cache(new cache_1.NamespacedCacheStore(this, namespace));
|
|
278
|
+
}
|
|
279
|
+
close() {
|
|
280
|
+
this.#flushAccessUpdates();
|
|
281
|
+
if (this.#db) {
|
|
282
|
+
try {
|
|
283
|
+
this.#db.exec('BEGIN IMMEDIATE TRANSACTION;');
|
|
284
|
+
try {
|
|
285
|
+
// 1. Delete items older than N days
|
|
286
|
+
this.#db
|
|
287
|
+
.prepare("DELETE FROM cache WHERE last_accessed < unixepoch('now', ?);")
|
|
288
|
+
.run(`-${this.ttlDays} days`);
|
|
289
|
+
// 2. Prune oldest items if payload exceeds maxPayloadSize
|
|
290
|
+
// Skip the expensive window aggregate query if total database size is below maxPayloadSize
|
|
291
|
+
const sizeResult = this.#db
|
|
292
|
+
.prepare('SELECT (page_count - freelist_count) * page_size AS total_size ' +
|
|
293
|
+
'FROM pragma_page_count(), pragma_freelist_count(), pragma_page_size();')
|
|
294
|
+
.get();
|
|
295
|
+
if ((sizeResult?.total_size ?? 0) > this.maxPayloadSize) {
|
|
296
|
+
this.#db
|
|
297
|
+
.prepare(`DELETE FROM cache WHERE key IN (
|
|
298
|
+
SELECT key FROM (
|
|
299
|
+
SELECT key,
|
|
300
|
+
sum(length(key) + length(value)) OVER (ORDER BY last_accessed DESC, key DESC) as running_size
|
|
301
|
+
FROM cache
|
|
302
|
+
) WHERE running_size > ?
|
|
303
|
+
);`)
|
|
304
|
+
.run(this.maxPayloadSize);
|
|
305
|
+
}
|
|
306
|
+
this.#db.exec('COMMIT;');
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
try {
|
|
310
|
+
this.#db.exec('ROLLBACK;');
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
// Ignore rollback errors if transaction was not active
|
|
314
|
+
}
|
|
315
|
+
throw error;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// Pruning errors should not block build success
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
this.#getStmt = undefined;
|
|
323
|
+
this.#hasStmt = undefined;
|
|
324
|
+
this.#setStmt = undefined;
|
|
325
|
+
this.#updateAccessedStmt = undefined;
|
|
326
|
+
try {
|
|
327
|
+
this.#db.close();
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
// Failure to close should not block build success
|
|
331
|
+
}
|
|
332
|
+
this.#db = undefined;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
this.#disabled = false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
exports.SqliteCacheStore = SqliteCacheStore;
|
|
339
|
+
//# sourceMappingURL=sqlite-cache-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-cache-store.js","sourceRoot":"","sources":["sqlite-cache-store.ts"],"names":[],"mappings":"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"}
|