@angular/build 22.2.0-next.5 → 22.2.0-next.7
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/package.json +14 -13
- package/src/builders/application/build-action.js +48 -39
- package/src/builders/application/build-action.js.map +1 -1
- package/src/builders/application/chunk-optimizer.js +4 -1
- package/src/builders/application/chunk-optimizer.js.map +1 -1
- package/src/builders/application/execute-build.js +1 -1
- package/src/builders/application/execute-build.js.map +1 -1
- package/src/builders/application/execute-post-bundle.js +4 -7
- package/src/builders/application/execute-post-bundle.js.map +1 -1
- package/src/builders/application/i18n.js +8 -9
- package/src/builders/application/i18n.js.map +1 -1
- package/src/builders/application/index.js +2 -2
- package/src/builders/application/index.js.map +1 -1
- package/src/builders/application/options.js +5 -2
- 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/dev-server/options.d.ts +4 -1
- package/src/builders/dev-server/options.js +1 -0
- package/src/builders/dev-server/options.js.map +1 -1
- package/src/builders/dev-server/vite/index.js +4 -7
- package/src/builders/dev-server/vite/index.js.map +1 -1
- package/src/builders/dev-server/vite/server.js +2 -2
- 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/options.d.ts +1 -0
- package/src/builders/unit-test/options.js +2 -1
- package/src/builders/unit-test/options.js.map +1 -1
- package/src/builders/unit-test/runners/vitest/build-options.js +5 -6
- package/src/builders/unit-test/runners/vitest/build-options.js.map +1 -1
- package/src/builders/unit-test/runners/vitest/executor.js +4 -4
- package/src/builders/unit-test/runners/vitest/executor.js.map +1 -1
- package/src/builders/unit-test/runners/vitest/plugins.d.ts +3 -4
- package/src/builders/unit-test/runners/vitest/plugins.js +2 -0
- package/src/builders/unit-test/runners/vitest/plugins.js.map +1 -1
- package/src/builders/unit-test/schema.d.ts +10 -2
- package/src/builders/unit-test/schema.js.map +1 -1
- package/src/builders/unit-test/schema.json +7 -1
- package/src/private.d.ts +1 -2
- package/src/private.js +4 -5
- package/src/private.js.map +1 -1
- package/src/tools/angular/compilation/angular-compilation.d.ts +3 -8
- package/src/tools/angular/compilation/angular-compilation.js +2 -88
- package/src/tools/angular/compilation/angular-compilation.js.map +1 -1
- package/src/tools/angular/compilation/aot-compilation.d.ts +5 -5
- package/src/tools/angular/compilation/aot-compilation.js +8 -14
- package/src/tools/angular/compilation/aot-compilation.js.map +1 -1
- package/src/tools/angular/compilation/compiler-options.d.ts +24 -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/index.d.ts +1 -1
- 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 +5 -5
- package/src/tools/angular/compilation/jit-compilation.js +7 -16
- package/src/tools/angular/compilation/jit-compilation.js.map +1 -1
- package/src/tools/angular/compilation/parallel-compilation.d.ts +2 -7
- package/src/tools/angular/compilation/parallel-compilation.js +3 -29
- package/src/tools/angular/compilation/parallel-compilation.js.map +1 -1
- package/src/tools/angular/compilation/parallel-worker.d.ts +2 -2
- package/src/tools/angular/compilation/parallel-worker.js +3 -12
- 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 +115 -0
- package/src/tools/angular/compilation/typescript-compilation.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.js +76 -114
- package/src/tools/esbuild/angular/compiler-plugin.js.map +1 -1
- package/src/tools/esbuild/bundler-execution-result.d.ts +1 -0
- 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/cache.d.ts +17 -10
- package/src/tools/esbuild/cache.js +60 -47
- package/src/tools/esbuild/cache.js.map +1 -1
- package/src/tools/esbuild/i18n-inliner-worker.d.ts +47 -55
- package/src/tools/esbuild/i18n-inliner-worker.js +67 -98
- package/src/tools/esbuild/i18n-inliner-worker.js.map +1 -1
- package/src/tools/esbuild/i18n-inliner.d.ts +15 -11
- package/src/tools/esbuild/i18n-inliner.js +227 -122
- package/src/tools/esbuild/i18n-inliner.js.map +1 -1
- package/src/tools/esbuild/i18n-translation-encoder.d.ts +2 -1
- package/src/tools/esbuild/i18n-translation-encoder.js.map +1 -1
- package/src/tools/esbuild/i18n-translation-reader.d.ts +4 -3
- package/src/tools/esbuild/i18n-translation-reader.js.map +1 -1
- package/src/tools/esbuild/index-html-generator.js +1 -1
- package/src/tools/esbuild/index-html-generator.js.map +1 -1
- package/src/tools/esbuild/javascript-transformer-worker.js +8 -4
- package/src/tools/esbuild/javascript-transformer-worker.js.map +1 -1
- package/src/tools/esbuild/javascript-transformer.d.ts +18 -6
- package/src/tools/esbuild/javascript-transformer.js +104 -41
- package/src/tools/esbuild/javascript-transformer.js.map +1 -1
- package/src/tools/esbuild/lmdb-cache-store.js +1 -1
- package/src/tools/esbuild/lmdb-cache-store.js.map +1 -1
- package/src/tools/esbuild/persistent-load-result-cache.js +9 -31
- package/src/tools/esbuild/persistent-load-result-cache.js.map +1 -1
- package/src/tools/esbuild/sourcemap-ignorelist-plugin.js +109 -0
- package/src/tools/esbuild/sourcemap-ignorelist-plugin.js.map +1 -1
- package/src/tools/esbuild/sqlite-cache-store.d.ts +9 -1
- package/src/tools/esbuild/sqlite-cache-store.js +249 -63
- package/src/tools/esbuild/sqlite-cache-store.js.map +1 -1
- package/src/tools/esbuild/stylesheets/sass-language.d.ts +1 -0
- package/src/tools/esbuild/stylesheets/sass-language.js +68 -42
- package/src/tools/esbuild/stylesheets/sass-language.js.map +1 -1
- package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.d.ts +1 -1
- package/src/tools/esbuild/utils.d.ts +1 -1
- package/src/tools/esbuild/utils.js.map +1 -1
- package/src/tools/esbuild/watcher.js +26 -3
- package/src/tools/esbuild/watcher.js.map +1 -1
- package/src/tools/oxc/oxc-transform.js +76 -118
- package/src/tools/oxc/oxc-transform.js.map +1 -1
- 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/sass/rebasing-importer.d.ts +8 -14
- package/src/tools/sass/rebasing-importer.js +18 -24
- 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/utils/environment-options.d.ts +12 -0
- package/src/utils/environment-options.js +20 -12
- package/src/utils/environment-options.js.map +1 -1
- package/src/utils/i18n-options.d.ts +2 -1
- package/src/utils/i18n-options.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 +44 -189
- 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.d.ts +11 -1
- package/src/utils/normalize-cache.js +6 -3
- package/src/utils/normalize-cache.js.map +1 -1
- package/src/utils/purge-cache.js +24 -13
- package/src/utils/purge-cache.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/server-rendering/prerender.d.ts +2 -1
- package/src/utils/server-rendering/prerender.js +31 -18
- package/src/utils/server-rendering/prerender.js.map +1 -1
- package/src/utils/server-rendering/render-worker.d.ts +6 -4
- package/src/utils/server-rendering/render-worker.js +3 -1
- package/src/utils/server-rendering/render-worker.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/tools/angular/compilation/noop-compilation.d.ts +0 -15
- package/src/tools/angular/compilation/noop-compilation.js +0 -27
- package/src/tools/angular/compilation/noop-compilation.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
|
@@ -19,6 +19,87 @@ const IGNORE_LIST_ID = 'x_google_ignoreList';
|
|
|
19
19
|
* of a full source map if not present in the source map data.
|
|
20
20
|
*/
|
|
21
21
|
const NODE_MODULE_BYTES = Buffer.from('node_modules/', 'utf-8');
|
|
22
|
+
/**
|
|
23
|
+
* The UTF-8 bytes for the "sources" property key used to locate the sources array.
|
|
24
|
+
*/
|
|
25
|
+
const SOURCES_KEY_BYTES = Buffer.from('"sources"', 'utf-8');
|
|
26
|
+
/**
|
|
27
|
+
* The UTF-8 bytes for the ignore list identifier to check if already present.
|
|
28
|
+
*/
|
|
29
|
+
const IGNORE_LIST_BYTES = Buffer.from(`"${IGNORE_LIST_ID}"`, 'utf-8');
|
|
30
|
+
function extractSources(contents) {
|
|
31
|
+
const sourcesKeyIndex = contents.indexOf(SOURCES_KEY_BYTES);
|
|
32
|
+
if (sourcesKeyIndex === -1) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
// Find the ':' after "sources"
|
|
36
|
+
let colonIndex = sourcesKeyIndex + SOURCES_KEY_BYTES.length;
|
|
37
|
+
while (colonIndex < contents.length && contents[colonIndex] <= 0x20) {
|
|
38
|
+
colonIndex++;
|
|
39
|
+
}
|
|
40
|
+
if (contents[colonIndex] !== 0x3a /* : */) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
// Find the '[' for the array
|
|
44
|
+
let arrayStartIndex = colonIndex + 1;
|
|
45
|
+
while (arrayStartIndex < contents.length && contents[arrayStartIndex] <= 0x20) {
|
|
46
|
+
arrayStartIndex++;
|
|
47
|
+
}
|
|
48
|
+
if (contents[arrayStartIndex] !== 0x5b /* [ */) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
// Scan until matching ']'
|
|
52
|
+
let depth = 0;
|
|
53
|
+
let inString = false;
|
|
54
|
+
for (let i = arrayStartIndex; i < contents.length; i++) {
|
|
55
|
+
const byte = contents[i];
|
|
56
|
+
if (inString) {
|
|
57
|
+
if (byte === 0x5c /* \ */) {
|
|
58
|
+
i++; // skip escaped character
|
|
59
|
+
}
|
|
60
|
+
else if (byte === 0x22 /* " */) {
|
|
61
|
+
inString = false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (byte === 0x22 /* " */) {
|
|
65
|
+
inString = true;
|
|
66
|
+
}
|
|
67
|
+
else if (byte === 0x5b /* [ */) {
|
|
68
|
+
depth++;
|
|
69
|
+
}
|
|
70
|
+
else if (byte === 0x5d /* ] */) {
|
|
71
|
+
depth--;
|
|
72
|
+
if (depth === 0) {
|
|
73
|
+
try {
|
|
74
|
+
const slice = contents.toString('utf-8', arrayStartIndex, i + 1);
|
|
75
|
+
const parsed = JSON.parse(slice);
|
|
76
|
+
return Array.isArray(parsed) && parsed.every((s) => typeof s === 'string')
|
|
77
|
+
? parsed
|
|
78
|
+
: undefined;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
function updateSourcemapFast(contents, ignoreList) {
|
|
89
|
+
let braceIndex = 0;
|
|
90
|
+
while (braceIndex < contents.length && contents[braceIndex] <= 0x20) {
|
|
91
|
+
braceIndex++;
|
|
92
|
+
}
|
|
93
|
+
if (contents[braceIndex] !== 0x7b /* { */) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
const injection = Buffer.from(`"${IGNORE_LIST_ID}":${JSON.stringify(ignoreList)},`, 'utf-8');
|
|
97
|
+
return Buffer.concat([
|
|
98
|
+
contents.subarray(0, braceIndex + 1),
|
|
99
|
+
injection,
|
|
100
|
+
contents.subarray(braceIndex + 1),
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
22
103
|
/**
|
|
23
104
|
* Creates an esbuild plugin that updates generated sourcemaps to include the Chrome
|
|
24
105
|
* DevTools ignore list extension. All source files that originate from a node modules
|
|
@@ -49,7 +130,35 @@ function createSourcemapIgnorelistPlugin() {
|
|
|
49
130
|
if (!contents.includes(NODE_MODULE_BYTES)) {
|
|
50
131
|
continue;
|
|
51
132
|
}
|
|
133
|
+
let fastPathSuccess = false;
|
|
134
|
+
if (!contents.includes(IGNORE_LIST_BYTES)) {
|
|
135
|
+
const sources = extractSources(contents);
|
|
136
|
+
if (sources) {
|
|
137
|
+
const ignoreList = [];
|
|
138
|
+
for (let index = 0; index < sources.length; ++index) {
|
|
139
|
+
const location = sources[index].indexOf('node_modules/');
|
|
140
|
+
if (location === 0 || (location > 0 && sources[index][location - 1] === '/')) {
|
|
141
|
+
ignoreList.push(index);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (ignoreList.length === 0) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const updated = updateSourcemapFast(contents, ignoreList);
|
|
148
|
+
if (updated) {
|
|
149
|
+
file.contents = updated;
|
|
150
|
+
fastPathSuccess = true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (fastPathSuccess) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// Fallback to full JSON parse/stringify if fast scanning or splicing fails
|
|
52
158
|
const map = JSON.parse(contents.toString('utf-8'));
|
|
159
|
+
if (map[IGNORE_LIST_ID]) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
53
162
|
const ignoreList = [];
|
|
54
163
|
// Check and store the index of each source originating from a node modules directory
|
|
55
164
|
for (let index = 0; index < map.sources.length; ++index) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourcemap-ignorelist-plugin.js","sourceRoot":"","sources":["sourcemap-ignorelist-plugin.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"sourcemap-ignorelist-plugin.js","sourceRoot":"","sources":["sourcemap-ignorelist-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,20 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
8
|
import { Cache, PersistentCacheStore } from './cache';
|
|
9
|
+
/**
|
|
10
|
+
* A persistent cache store backed by SQLite.
|
|
11
|
+
*
|
|
12
|
+
* Values are persisted with the V8 structured clone serialization API instead of JSON. Cached
|
|
13
|
+
* values include binary data such as the `Uint8Array` output of the JavaScript transformer and
|
|
14
|
+
* the `contents` of an esbuild load result. A JSON round-trip converts those into plain objects
|
|
15
|
+
* (`{"0":105,"1":109,...}`), which breaks consumers on any build that reads them back from disk.
|
|
16
|
+
*/
|
|
9
17
|
export declare class SqliteCacheStore implements PersistentCacheStore<unknown> {
|
|
10
18
|
#private;
|
|
11
19
|
readonly cachePath: string;
|
|
12
20
|
private readonly maxPayloadSize;
|
|
13
21
|
private readonly ttlDays;
|
|
14
|
-
constructor(cachePath: string, maxPayloadSize?: number, ttlDays?: number);
|
|
22
|
+
constructor(cachePath: string, maxPayloadSize?: number, ttlDays?: number, busyTimeoutMs?: number);
|
|
15
23
|
get(key: string): Promise<any>;
|
|
16
24
|
has(key: string): boolean;
|
|
17
25
|
set(key: string, value: unknown): Promise<this>;
|
|
@@ -8,49 +8,167 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.SqliteCacheStore = void 0;
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
11
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");
|
|
12
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
|
+
*/
|
|
13
58
|
class SqliteCacheStore {
|
|
14
59
|
cachePath;
|
|
15
60
|
maxPayloadSize;
|
|
16
61
|
ttlDays;
|
|
17
62
|
#db;
|
|
63
|
+
#disabled = false;
|
|
18
64
|
#getStmt;
|
|
19
65
|
#hasStmt;
|
|
20
66
|
#setStmt;
|
|
21
67
|
#updateAccessedStmt;
|
|
22
68
|
#pendingAccessedKeys = new Set();
|
|
23
69
|
#flushTimeout;
|
|
24
|
-
|
|
70
|
+
#busyTimeoutMs;
|
|
71
|
+
constructor(cachePath, maxPayloadSize = 1024 * 1024 * 1024, ttlDays = 14, busyTimeoutMs = 5000) {
|
|
25
72
|
this.cachePath = cachePath;
|
|
26
73
|
this.maxPayloadSize = maxPayloadSize;
|
|
27
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
|
+
}
|
|
28
135
|
}
|
|
29
136
|
#ensureDb() {
|
|
137
|
+
if (this.#disabled) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
30
140
|
if (!this.#db) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
+
}
|
|
44
165
|
}
|
|
45
166
|
return this.#db;
|
|
46
167
|
}
|
|
47
168
|
#queueAccessUpdate(key) {
|
|
48
169
|
this.#pendingAccessedKeys.add(key);
|
|
49
|
-
if (this.#
|
|
50
|
-
this.#flushAccessUpdates();
|
|
51
|
-
}
|
|
52
|
-
else if (!this.#flushTimeout) {
|
|
53
|
-
this.#flushTimeout = setTimeout(() => this.#flushAccessUpdates(), 500);
|
|
170
|
+
if (!this.#flushTimeout) {
|
|
171
|
+
this.#flushTimeout = setTimeout(() => this.#flushAccessUpdates(), 1000);
|
|
54
172
|
this.#flushTimeout.unref?.();
|
|
55
173
|
}
|
|
56
174
|
}
|
|
@@ -59,19 +177,21 @@ class SqliteCacheStore {
|
|
|
59
177
|
clearTimeout(this.#flushTimeout);
|
|
60
178
|
this.#flushTimeout = undefined;
|
|
61
179
|
}
|
|
62
|
-
if (
|
|
180
|
+
if (this.#pendingAccessedKeys.size === 0) {
|
|
63
181
|
return;
|
|
64
182
|
}
|
|
65
183
|
try {
|
|
66
|
-
this.#db
|
|
67
|
-
|
|
68
|
-
this.#
|
|
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;');
|
|
69
190
|
}
|
|
70
|
-
this.#db.exec('COMMIT;');
|
|
71
191
|
}
|
|
72
192
|
catch {
|
|
73
193
|
try {
|
|
74
|
-
this.#db
|
|
194
|
+
this.#db?.exec('ROLLBACK;');
|
|
75
195
|
}
|
|
76
196
|
catch {
|
|
77
197
|
// Ignore rollback errors if transaction was not active
|
|
@@ -83,70 +203,136 @@ class SqliteCacheStore {
|
|
|
83
203
|
}
|
|
84
204
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
85
205
|
async get(key) {
|
|
86
|
-
this.#ensureDb()
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
+
}
|
|
95
234
|
}
|
|
96
235
|
}
|
|
236
|
+
catch {
|
|
237
|
+
// Treat query errors (e.g. disk read failures) as a cache miss.
|
|
238
|
+
}
|
|
97
239
|
return undefined;
|
|
98
240
|
}
|
|
99
241
|
has(key) {
|
|
100
|
-
this.#ensureDb()
|
|
101
|
-
|
|
242
|
+
if (!this.#ensureDb()) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
return !!this.#hasStmt?.get(key);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
102
251
|
}
|
|
103
252
|
async set(key, value) {
|
|
104
|
-
this.#ensureDb()
|
|
105
|
-
|
|
106
|
-
|
|
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
|
+
}
|
|
107
274
|
return this;
|
|
108
275
|
}
|
|
109
276
|
createCache(namespace) {
|
|
110
|
-
return new cache_1.Cache(this, namespace);
|
|
277
|
+
return new cache_1.Cache(new cache_1.NamespacedCacheStore(this, namespace));
|
|
111
278
|
}
|
|
112
279
|
close() {
|
|
280
|
+
this.#flushAccessUpdates();
|
|
113
281
|
if (this.#db) {
|
|
114
282
|
try {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
+
}
|
|
132
317
|
}
|
|
133
318
|
catch {
|
|
134
319
|
// Pruning errors should not block build success
|
|
135
320
|
}
|
|
136
321
|
finally {
|
|
137
|
-
if (this.#flushTimeout) {
|
|
138
|
-
clearTimeout(this.#flushTimeout);
|
|
139
|
-
this.#flushTimeout = undefined;
|
|
140
|
-
}
|
|
141
|
-
this.#pendingAccessedKeys.clear();
|
|
142
322
|
this.#getStmt = undefined;
|
|
143
323
|
this.#hasStmt = undefined;
|
|
144
324
|
this.#setStmt = undefined;
|
|
145
325
|
this.#updateAccessedStmt = undefined;
|
|
146
|
-
|
|
326
|
+
try {
|
|
327
|
+
this.#db.close();
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
// Failure to close should not block build success
|
|
331
|
+
}
|
|
147
332
|
this.#db = undefined;
|
|
148
333
|
}
|
|
149
334
|
}
|
|
335
|
+
this.#disabled = false;
|
|
150
336
|
}
|
|
151
337
|
}
|
|
152
338
|
exports.SqliteCacheStore = SqliteCacheStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-cache-store.js","sourceRoot":"","sources":["sqlite-cache-store.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,6CAA0D;AAC1D,
|
|
1
|
+
{"version":3,"file":"sqlite-cache-store.js","sourceRoot":"","sources":["sqlite-cache-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,6 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
8
|
import { StylesheetLanguage } from './stylesheet-plugin-factory';
|
|
9
|
+
export declare function resetSassWorkerPoolCaches(): void;
|
|
9
10
|
export declare function shutdownSassWorkerPool(): void;
|
|
10
11
|
export declare const SassStylesheetLanguage: Readonly<StylesheetLanguage>;
|