1 | "use strict";
|
2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3 | if (k2 === undefined) k2 = k;
|
4 | var desc = Object.getOwnPropertyDescriptor(m, k);
|
5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6 | desc = { enumerable: true, get: function() { return m[k]; } };
|
7 | }
|
8 | Object.defineProperty(o, k2, desc);
|
9 | }) : (function(o, m, k, k2) {
|
10 | if (k2 === undefined) k2 = k;
|
11 | o[k2] = m[k];
|
12 | }));
|
13 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14 | Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15 | }) : function(o, v) {
|
16 | o["default"] = v;
|
17 | });
|
18 | var __importStar = (this && this.__importStar) || function (mod) {
|
19 | if (mod && mod.__esModule) return mod;
|
20 | var result = {};
|
21 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22 | __setModuleDefault(result, mod);
|
23 | return result;
|
24 | };
|
25 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
26 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
27 | };
|
28 | Object.defineProperty(exports, "__esModule", { value: true });
|
29 | exports.augmentProgramWithVersioning = exports.cacheCompilerHost = void 0;
|
30 | const convert_source_map_1 = __importDefault(require("convert-source-map"));
|
31 | const crypto_1 = require("crypto");
|
32 | const node_assert_1 = __importDefault(require("node:assert"));
|
33 | const path = __importStar(require("path"));
|
34 | const typescript_1 = __importDefault(require("typescript"));
|
35 | const node_1 = require("../graph/node");
|
36 | const nodes_1 = require("../ng-package/nodes");
|
37 | const path_1 = require("../utils/path");
|
38 | function cacheCompilerHost(graph, entryPoint, compilerOptions, moduleResolutionCache, stylesheetProcessor, inlineStyleLanguage, sourcesFileCache = entryPoint.cache.sourcesFileCache) {
|
39 | const compilerHost = typescript_1.default.createIncrementalCompilerHost(compilerOptions);
|
40 |
|
41 |
|
42 |
|
43 | if (typescript_1.default.JSDocParsingMode) {
|
44 | compilerHost.jsDocParsingMode = typescript_1.default.JSDocParsingMode.ParseForTypeErrors;
|
45 | }
|
46 | const getNode = (fileName) => {
|
47 | const nodeUri = (0, nodes_1.fileUrl)((0, path_1.ensureUnixPath)(fileName));
|
48 | let node = graph.get(nodeUri);
|
49 | if (!node) {
|
50 | node = new node_1.Node(nodeUri);
|
51 | graph.put(node);
|
52 | }
|
53 | return node;
|
54 | };
|
55 | const addDependee = (fileName) => {
|
56 | const node = getNode(fileName);
|
57 | entryPoint.dependsOn(node);
|
58 | };
|
59 | const { flatModuleFile, destinationPath, entryFile } = entryPoint.data.entryPoint;
|
60 | const flatModuleFileDtsFilename = `${flatModuleFile}.d.ts`;
|
61 | const flatModuleFileDtsPath = (0, path_1.ensureUnixPath)(path.join(destinationPath, flatModuleFileDtsFilename));
|
62 | const hasIndexEntryFile = path.basename(entryFile.toLowerCase()) === 'index.ts';
|
63 | return {
|
64 | ...compilerHost,
|
65 |
|
66 | fileExists: (fileName) => {
|
67 | const cache = sourcesFileCache.getOrCreate(fileName);
|
68 | if (cache.exists === undefined) {
|
69 | cache.exists = compilerHost.fileExists.call(this, fileName);
|
70 | }
|
71 | return cache.exists;
|
72 | },
|
73 | getSourceFile: (fileName, languageVersion) => {
|
74 | addDependee(fileName);
|
75 | const cache = sourcesFileCache.getOrCreate(fileName);
|
76 | if (!cache.sourceFile) {
|
77 | cache.sourceFile = compilerHost.getSourceFile.call(this, fileName, languageVersion);
|
78 | }
|
79 | return cache.sourceFile;
|
80 | },
|
81 | writeFile: (fileName, data, writeByteOrderMark, onError, sourceFiles) => {
|
82 | var _a, _b, _c;
|
83 | if (fileName.includes('.ngtypecheck.')) {
|
84 | return;
|
85 | }
|
86 | if (!(sourceFiles === null || sourceFiles === void 0 ? void 0 : sourceFiles.length) && fileName.endsWith('.tsbuildinfo')) {
|
87 |
|
88 | compilerHost.writeFile.call(this, fileName, data, writeByteOrderMark, onError, sourceFiles);
|
89 | return;
|
90 | }
|
91 | (0, node_assert_1.default)((sourceFiles === null || sourceFiles === void 0 ? void 0 : sourceFiles.length) === 1, 'Invalid TypeScript program emit for ' + fileName);
|
92 | const outputCache = entryPoint.cache.outputCache;
|
93 | if (fileName.endsWith('.d.ts')) {
|
94 | if (fileName === flatModuleFileDtsPath) {
|
95 | if (hasIndexEntryFile) {
|
96 |
|
97 |
|
98 | return;
|
99 | }
|
100 | else {
|
101 |
|
102 |
|
103 | fileName = fileName.replace(flatModuleFileDtsFilename, 'index.d.ts');
|
104 | }
|
105 | }
|
106 | sourceFiles.forEach(source => {
|
107 | const cache = sourcesFileCache.getOrCreate(source.fileName);
|
108 | if (!cache.declarationFileName) {
|
109 | cache.declarationFileName = (0, path_1.ensureUnixPath)(fileName);
|
110 | }
|
111 | });
|
112 | if (((_a = outputCache.get(fileName)) === null || _a === void 0 ? void 0 : _a.content) === data) {
|
113 |
|
114 | return;
|
115 | }
|
116 | outputCache.set(fileName, {
|
117 | content: data,
|
118 | });
|
119 | }
|
120 | else {
|
121 | fileName = fileName.replace(/\.js(\.map)?$/, '.mjs$1');
|
122 | if (((_b = outputCache.get(fileName)) === null || _b === void 0 ? void 0 : _b.content) === data) {
|
123 | return;
|
124 | }
|
125 |
|
126 | let map = undefined;
|
127 | const version = (0, crypto_1.createHash)('sha256').update(data).digest('hex');
|
128 | if (fileName.endsWith('.mjs')) {
|
129 | if (((_c = outputCache.get(fileName)) === null || _c === void 0 ? void 0 : _c.version) === version) {
|
130 |
|
131 | return;
|
132 | }
|
133 | map = convert_source_map_1.default.fromComment(data).toJSON();
|
134 | }
|
135 | outputCache.set(fileName, {
|
136 | content: data,
|
137 | version,
|
138 | map,
|
139 | });
|
140 | }
|
141 | compilerHost.writeFile.call(this, fileName, data, writeByteOrderMark, onError, sourceFiles);
|
142 | },
|
143 | readFile: (fileName) => {
|
144 | addDependee(fileName);
|
145 | const cache = sourcesFileCache.getOrCreate(fileName);
|
146 | if (cache.content === undefined) {
|
147 | cache.content = compilerHost.readFile.call(this, fileName);
|
148 | }
|
149 | return cache.content;
|
150 | },
|
151 | resolveModuleNames: (moduleNames, containingFile) => {
|
152 | return moduleNames.map(moduleName => {
|
153 | const { resolvedModule } = typescript_1.default.resolveModuleName(moduleName, (0, path_1.ensureUnixPath)(containingFile), compilerOptions, compilerHost, moduleResolutionCache);
|
154 | return resolvedModule;
|
155 | });
|
156 | },
|
157 | resourceNameToFileName: (resourceName, containingFilePath) => {
|
158 | const resourcePath = path.resolve(path.dirname(containingFilePath), resourceName);
|
159 | const containingNode = getNode(containingFilePath);
|
160 | const resourceNode = getNode(resourcePath);
|
161 | containingNode.dependsOn(resourceNode);
|
162 | return resourcePath;
|
163 | },
|
164 | readResource: async (fileName) => {
|
165 | addDependee(fileName);
|
166 | const cache = sourcesFileCache.getOrCreate(fileName);
|
167 | if (cache.content === undefined) {
|
168 | if (!compilerHost.fileExists(fileName)) {
|
169 | throw new Error(`Cannot read file ${fileName}.`);
|
170 | }
|
171 | if (/(?:html?|svg)$/.test(path.extname(fileName))) {
|
172 |
|
173 | cache.content = compilerHost.readFile.call(this, fileName);
|
174 | }
|
175 | else {
|
176 |
|
177 | cache.content = await stylesheetProcessor.process({
|
178 | filePath: fileName,
|
179 | content: compilerHost.readFile.call(this, fileName),
|
180 | });
|
181 | }
|
182 | cache.exists = true;
|
183 | }
|
184 | return cache.content;
|
185 | },
|
186 | transformResource: async (data, context) => {
|
187 | if (context.resourceFile || context.type !== 'style') {
|
188 | return null;
|
189 | }
|
190 | if (inlineStyleLanguage) {
|
191 | const key = (0, crypto_1.createHash)('sha1').update(data).digest('hex');
|
192 | const fileName = `${context.containingFile}-${key}.${inlineStyleLanguage}`;
|
193 | const cache = sourcesFileCache.getOrCreate(fileName);
|
194 | if (cache.content === undefined) {
|
195 | cache.content = await stylesheetProcessor.process({
|
196 | filePath: fileName,
|
197 | content: data,
|
198 | });
|
199 | const virtualFileNode = getNode(fileName);
|
200 | const containingFileNode = getNode(context.containingFile);
|
201 | virtualFileNode.dependsOn(containingFileNode);
|
202 | }
|
203 | cache.exists = true;
|
204 | return { content: cache.content };
|
205 | }
|
206 | return null;
|
207 | },
|
208 | };
|
209 | }
|
210 | exports.cacheCompilerHost = cacheCompilerHost;
|
211 | function augmentProgramWithVersioning(program) {
|
212 | const baseGetSourceFiles = program.getSourceFiles;
|
213 | program.getSourceFiles = function (...parameters) {
|
214 | const files = baseGetSourceFiles(...parameters);
|
215 | for (const file of files) {
|
216 | if (file.version === undefined) {
|
217 | file.version = (0, crypto_1.createHash)('sha256').update(file.text).digest('hex');
|
218 | }
|
219 | }
|
220 | return files;
|
221 | };
|
222 | }
|
223 | exports.augmentProgramWithVersioning = augmentProgramWithVersioning;
|
224 |
|
\ | No newline at end of file |