@master/css-compiler 0.0.0-site.1793659883.g69c9aebcf628
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 +466 -0
- package/dist/compiler.d.ts +42 -0
- package/dist/compiler.js +248 -0
- package/dist/contracts.d.ts +31 -0
- package/dist/contracts.js +13 -0
- package/dist/diagnostics/contracts.d.ts +119 -0
- package/dist/diagnostics/contracts.js +1 -0
- package/dist/diagnostics/design-system.d.ts +31 -0
- package/dist/diagnostics/design-system.js +75 -0
- package/dist/diagnostics/index.d.ts +28 -0
- package/dist/diagnostics/index.js +304 -0
- package/dist/diagnostics/project-comparison.d.ts +4 -0
- package/dist/diagnostics/project-comparison.js +8 -0
- package/dist/index.d.ts +95 -0
- package/dist/index.js +34 -0
- package/dist/node-compiler.d.ts +133 -0
- package/dist/node-compiler.js +417 -0
- package/dist/node-imports.d.ts +54 -0
- package/dist/node-imports.js +253 -0
- package/dist/node.d.ts +21 -0
- package/dist/node.js +47 -0
- package/dist/notices.d.ts +5 -0
- package/dist/notices.js +29 -0
- package/dist/prepared-graph-cache.d.ts +5 -0
- package/dist/prepared-graph-cache.js +31 -0
- package/dist/project/binding-project.d.ts +29 -0
- package/dist/project/binding-project.js +100 -0
- package/dist/project/entries.d.ts +7 -0
- package/dist/project/entries.js +30 -0
- package/dist/project/manifest-sync.d.ts +5 -0
- package/dist/project/manifest-sync.js +40 -0
- package/dist/project/manifest.d.ts +5 -0
- package/dist/project/manifest.js +49 -0
- package/dist/project/options.d.ts +43 -0
- package/dist/project/options.js +1 -0
- package/dist/pure-css-cache.d.ts +11 -0
- package/dist/pure-css-cache.js +39 -0
- package/dist/session.d.ts +19 -0
- package/dist/session.js +46 -0
- package/dist/stylesheet/browser.d.ts +32 -0
- package/dist/stylesheet/browser.js +71 -0
- package/dist/stylesheet/compiled-source.d.ts +11 -0
- package/dist/stylesheet/compiled-source.js +96 -0
- package/dist/stylesheet/composition-cache.d.ts +18 -0
- package/dist/stylesheet/composition-cache.js +79 -0
- package/dist/stylesheet/delivery.d.ts +103 -0
- package/dist/stylesheet/delivery.js +367 -0
- package/dist/stylesheet/directives.d.ts +31 -0
- package/dist/stylesheet/directives.js +105 -0
- package/dist/stylesheet/index-public.d.ts +3 -0
- package/dist/stylesheet/index-public.js +4 -0
- package/dist/stylesheet/index.d.ts +39 -0
- package/dist/stylesheet/index.js +501 -0
- package/dist/stylesheet/linked-stylesheet.d.ts +10 -0
- package/dist/stylesheet/linked-stylesheet.js +13 -0
- package/dist/stylesheet/output-map.d.ts +20 -0
- package/dist/stylesheet/output-map.js +222 -0
- package/dist/stylesheet/public.d.ts +171 -0
- package/dist/stylesheet/public.js +346 -0
- package/dist/stylesheet/reference-files.d.ts +6 -0
- package/dist/stylesheet/reference-files.js +13 -0
- package/dist/stylesheet/reference-origins.d.ts +4 -0
- package/dist/stylesheet/reference-origins.js +28 -0
- package/dist/stylesheet/render-core.d.ts +35 -0
- package/dist/stylesheet/render-core.js +28 -0
- package/dist/stylesheet/render-delivery.d.ts +4 -0
- package/dist/stylesheet/render-delivery.js +61 -0
- package/dist/stylesheet/render.d.ts +5 -0
- package/dist/stylesheet/render.js +31 -0
- package/dist/stylesheet/source-context.d.ts +8 -0
- package/dist/stylesheet/source-context.js +71 -0
- package/dist/stylesheet/source-map-url.d.ts +4 -0
- package/dist/stylesheet/source-map-url.js +11 -0
- package/dist/stylesheet/source.d.ts +3 -0
- package/dist/stylesheet/source.js +52 -0
- package/dist/stylesheet/types.d.ts +162 -0
- package/dist/stylesheet/types.js +1 -0
- package/dist/value-validation.d.ts +19 -0
- package/dist/value-validation.js +96 -0
- package/package.json +79 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { pureCSSCache } from "./pure-css-cache.js";
|
|
2
|
+
import { noticeDiagnostics } from "./notices.js";
|
|
3
|
+
import { isExpandableImportSource, prepareCSSImportGraph, resolveMasterCSSPackageEntryFile, resolveNodePackageCSS, resolveRelativeCSSFile, stylesheetResourceOwner } from "./node-imports.js";
|
|
4
|
+
import { compilePreparedGraph } from "./prepared-graph-cache.js";
|
|
5
|
+
import { emptyExtractionPolicy } from "./contracts.js";
|
|
6
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
7
|
+
import { extname, isAbsolute, resolve } from "node:path";
|
|
8
|
+
import { MASTER_CSS_DIAGNOSTIC_VERSION, MasterCSSError } from "@master/css-schema";
|
|
9
|
+
import { realpathSync } from "node:fs";
|
|
10
|
+
import { createCompilerBindingSessionSync } from "@master/css-binding/compiler/node";
|
|
11
|
+
// src/node-compiler.ts
|
|
12
|
+
/** @internal Node-only compiler and import-graph implementation. */
|
|
13
|
+
const MASTER_CSS_PACKAGE_ID = "@master/css";
|
|
14
|
+
function throwCompilerBindingError(error) {
|
|
15
|
+
if (error instanceof MasterCSSError) throw error;
|
|
16
|
+
throw new MasterCSSError({
|
|
17
|
+
code: "CSS_COMPILER_ERROR",
|
|
18
|
+
domain: "compiler",
|
|
19
|
+
message: error instanceof Error ? error.message : String(error)
|
|
20
|
+
}, { cause: error });
|
|
21
|
+
}
|
|
22
|
+
function callCompilerBinding(call) {
|
|
23
|
+
try {
|
|
24
|
+
return call();
|
|
25
|
+
} catch (error) {
|
|
26
|
+
throwCompilerBindingError(error);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function nativeCompiler() {
|
|
30
|
+
return createCompilerBindingSessionSync();
|
|
31
|
+
}
|
|
32
|
+
function inspectCSS(source) {
|
|
33
|
+
return callCompilerBinding(() => nativeCompiler().inspectCSS(source));
|
|
34
|
+
}
|
|
35
|
+
function resolveCSSImportGraph(file, options = {}) {
|
|
36
|
+
return resolveCSSImportGraphSource(file, void 0, options);
|
|
37
|
+
}
|
|
38
|
+
function resolveCSSImportGraphSource(file, source, options = {}) {
|
|
39
|
+
const entry = resolve(file);
|
|
40
|
+
const graph = prepareCSSImportGraph(file, source, options, analyzeCSSDependencies);
|
|
41
|
+
for (const [inputFile, inputSource] of Object.entries(graph.files)) options.onSource?.(inputFile, inputSource);
|
|
42
|
+
const result = callCompilerBinding(() => nativeCompiler().resolveCSSImportGraph(graph));
|
|
43
|
+
for (const reference of result.references || []) options.onReference?.(reference, reference.file || entry);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
function analyzeCSSDependencies(source) {
|
|
47
|
+
return pureCSSCache.run("dependencies", source, () => callCompilerBinding(() => nativeCompiler().analyzeCSSDependencies(source)));
|
|
48
|
+
}
|
|
49
|
+
function resolveMasterCSSPackageImportGraph(projectDir) {
|
|
50
|
+
const entry = resolveMasterCSSPackageEntryFile(MASTER_CSS_PACKAGE_ID, projectDir || process.cwd(), projectDir);
|
|
51
|
+
if (!entry) throw new Error(`Cannot resolve ${MASTER_CSS_PACKAGE_ID} CSS entry.`);
|
|
52
|
+
return resolveCSSImportGraph(entry, { projectDir });
|
|
53
|
+
}
|
|
54
|
+
function stripRequestSuffix(id) {
|
|
55
|
+
const searchStart = id.startsWith("//?/") || id.startsWith("\\\\?\\") ? 4 : 0;
|
|
56
|
+
const suffixIndex = id.slice(searchStart).search(/[?#]/);
|
|
57
|
+
return suffixIndex === -1 ? id : id.slice(0, searchStart + suffixIndex);
|
|
58
|
+
}
|
|
59
|
+
function stripWindowsExtendedPathPrefix(file) {
|
|
60
|
+
const match = /^[/\\]{2}\?[/\\](?:(UNC)[/\\])?/i.exec(file);
|
|
61
|
+
if (!match) return file;
|
|
62
|
+
const path = file.slice(match[0].length);
|
|
63
|
+
return match[1] ? `\\\\${path}` : path;
|
|
64
|
+
}
|
|
65
|
+
function stripRequest(id) {
|
|
66
|
+
return stripRequestSuffix(id);
|
|
67
|
+
}
|
|
68
|
+
function resolveComparablePath(file) {
|
|
69
|
+
const filename = resolve(file);
|
|
70
|
+
try {
|
|
71
|
+
return realpathSync(filename);
|
|
72
|
+
} catch {
|
|
73
|
+
return filename;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function isMasterCSSPackageStyleFile(id, projectDir) {
|
|
77
|
+
const filename = resolveComparablePath(stripRequest(id));
|
|
78
|
+
if (extname(filename) !== ".css") return false;
|
|
79
|
+
try {
|
|
80
|
+
return resolveMasterCSSPackageImportGraph(projectDir).dependencies.some((dependency) => {
|
|
81
|
+
return resolveComparablePath(dependency) === filename;
|
|
82
|
+
});
|
|
83
|
+
} catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function compileCSS(source, options = {}) {
|
|
88
|
+
const from = options.from || "master.css";
|
|
89
|
+
const bindingOptions = {
|
|
90
|
+
from,
|
|
91
|
+
resourceOwner: stylesheetResourceOwner(from),
|
|
92
|
+
preserveNativeCSS: options.preserveNativeCSS !== false,
|
|
93
|
+
pruneNativeCSS: options.pruneNativeCSS === true,
|
|
94
|
+
...options.preserveNativeSource === void 0 ? {} : { preserveNativeSource: options.preserveNativeSource },
|
|
95
|
+
...options.classes ? { classes: options.classes } : {}
|
|
96
|
+
};
|
|
97
|
+
const result = reviveBindingCompileResult(pureCSSCache.run("directives", [source, bindingOptions], () => callCompilerBinding(() => nativeCompiler().compileCSSDirectives(source, bindingOptions))));
|
|
98
|
+
for (const warning of result.warnings) options.onDiagnostic?.(compilerWarningDiagnostic(warning));
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
function reviveBindingCompileResult(result) {
|
|
102
|
+
result.extractionPolicy.blocklist = result.extractionPolicy.blocklist.map((entry) => {
|
|
103
|
+
if (entry && typeof entry === "object" && "source" in entry && typeof entry.source === "string") return new RegExp(entry.source, "flags" in entry && typeof entry.flags === "string" ? entry.flags : "");
|
|
104
|
+
return entry;
|
|
105
|
+
});
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
function compilerWarningDiagnostic(message) {
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
version: MASTER_CSS_DIAGNOSTIC_VERSION,
|
|
111
|
+
code: "COMPILER_WARNING",
|
|
112
|
+
domain: "compiler",
|
|
113
|
+
severity: "warning",
|
|
114
|
+
message
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function toWireExtractionPolicy(policy) {
|
|
118
|
+
return {
|
|
119
|
+
...emptyExtractionPolicy(),
|
|
120
|
+
...policy,
|
|
121
|
+
include: [...policy?.include || []],
|
|
122
|
+
exclude: [...policy?.exclude || []],
|
|
123
|
+
safelist: [...policy?.safelist || []],
|
|
124
|
+
blocklist: toWireBlocklist(policy?.blocklist)
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function toWireBlocklist(blocklist) {
|
|
128
|
+
return [...blocklist || []].map((entry) => entry instanceof RegExp ? {
|
|
129
|
+
source: entry.source,
|
|
130
|
+
flags: entry.flags
|
|
131
|
+
} : entry);
|
|
132
|
+
}
|
|
133
|
+
function filterCSSExtractionCandidates(candidates, blocklist = []) {
|
|
134
|
+
return [...nativeCompiler().filterCSSExtractionCandidates(candidates, toWireBlocklist(blocklist))];
|
|
135
|
+
}
|
|
136
|
+
function reviveExtractionPolicy(policy) {
|
|
137
|
+
policy.blocklist = policy.blocklist.map((entry) => {
|
|
138
|
+
if (entry && typeof entry === "object" && "source" in entry && typeof entry.source === "string") return new RegExp(entry.source, "flags" in entry && typeof entry.flags === "string" ? entry.flags : "");
|
|
139
|
+
return entry;
|
|
140
|
+
});
|
|
141
|
+
return policy;
|
|
142
|
+
}
|
|
143
|
+
function mergeCSSDirectiveExtractionPolicy(...policies) {
|
|
144
|
+
return reviveExtractionPolicy(callCompilerBinding(() => nativeCompiler().mergeCSSExtractionPolicies(policies.map(toWireExtractionPolicy))));
|
|
145
|
+
}
|
|
146
|
+
function createCSSDirectiveExtractionPolicy() {
|
|
147
|
+
return mergeCSSDirectiveExtractionPolicy();
|
|
148
|
+
}
|
|
149
|
+
function analyzeStandaloneDirectives(source) {
|
|
150
|
+
const result = callCompilerBinding(() => nativeCompiler().analyzeStandaloneDirectives(source));
|
|
151
|
+
result.extractionPolicy = reviveExtractionPolicy(result.extractionPolicy);
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
function findStandaloneCSSDirectiveStatements(source) {
|
|
155
|
+
return analyzeStandaloneDirectives(source).statements;
|
|
156
|
+
}
|
|
157
|
+
function collectStandaloneCSSDirectiveExtractionPolicy(source) {
|
|
158
|
+
return analyzeStandaloneDirectives(source).extractionPolicy;
|
|
159
|
+
}
|
|
160
|
+
function removeStandaloneCSSDirectives(source) {
|
|
161
|
+
return analyzeStandaloneDirectives(source).code;
|
|
162
|
+
}
|
|
163
|
+
function compileManifestInputWithBinding(input, baseManifest) {
|
|
164
|
+
return callCompilerBinding(() => nativeCompiler().compileManifestInput(input, baseManifest ? { baseManifest } : void 0)).manifest;
|
|
165
|
+
}
|
|
166
|
+
function lowerCSSDirectivesWithBinding(result, options) {
|
|
167
|
+
const lowered = callCompilerBinding(() => nativeCompiler().lowerCSSDirectives({
|
|
168
|
+
manifestInput: result.manifestInput,
|
|
169
|
+
definitionSources: result.definitionSources || [],
|
|
170
|
+
nativeOutput: result.nativeOutput,
|
|
171
|
+
styleDefinitions: result.styleDefinitions || [],
|
|
172
|
+
warnings: result.warnings
|
|
173
|
+
}, {
|
|
174
|
+
...options.baseManifest ? { baseManifest: options.baseManifest } : {},
|
|
175
|
+
...options.resolutionManifest ? { resolutionManifest: options.resolutionManifest } : {}
|
|
176
|
+
}, options.sourceText));
|
|
177
|
+
for (const warning of lowered.warnings) options.onDiagnostic?.(compilerWarningDiagnostic(warning));
|
|
178
|
+
noticeDiagnostics(lowered.notices, options.onDiagnostic);
|
|
179
|
+
return lowered;
|
|
180
|
+
}
|
|
181
|
+
function addUnique(target, values) {
|
|
182
|
+
if (!values) return;
|
|
183
|
+
for (const value of values) if (!target.includes(value)) target.push(value);
|
|
184
|
+
}
|
|
185
|
+
function resolveCSSReferenceFile(reference, options = {}) {
|
|
186
|
+
if (reference.resolvedFile) return reference.resolvedFile;
|
|
187
|
+
const fromFile = reference.file ? isAbsolute(reference.file) ? reference.file : resolve(options.root || "", reference.file) : resolve(options.root || process.cwd(), "master.css");
|
|
188
|
+
const packageFile = resolveMasterCSSPackageEntryFile(reference.source, fromFile, options.root);
|
|
189
|
+
if (packageFile) return packageFile;
|
|
190
|
+
const exportedCSS = resolveNodePackageCSS(reference.source, fromFile);
|
|
191
|
+
if (exportedCSS) return exportedCSS;
|
|
192
|
+
if (isExpandableImportSource(reference.source, fromFile)) return resolveRelativeCSSFile(reference.source, fromFile);
|
|
193
|
+
throw new Error(`@reference only supports relative CSS files or exported package CSS entries: ${reference.source}`);
|
|
194
|
+
}
|
|
195
|
+
function normalizeReferenceStack(stack) {
|
|
196
|
+
return (stack || []).map((file) => resolveComparablePath(file));
|
|
197
|
+
}
|
|
198
|
+
function resolveCSSReferenceContext(references, options = {}) {
|
|
199
|
+
const dependencies = [];
|
|
200
|
+
const warnings = [];
|
|
201
|
+
let manifest = options.baseManifest;
|
|
202
|
+
let hasReferences = false;
|
|
203
|
+
const definitionSources = [];
|
|
204
|
+
for (const reference of references || []) {
|
|
205
|
+
const referenceFile = resolveCSSReferenceFile(reference, options);
|
|
206
|
+
options.onDependency?.(referenceFile);
|
|
207
|
+
const comparableReferenceFile = resolveComparablePath(referenceFile);
|
|
208
|
+
if (normalizeReferenceStack(options.referenceStack).includes(comparableReferenceFile)) throw new Error(`Circular CSS reference: ${[...options.referenceStack || [], referenceFile].join(" -> ")}`);
|
|
209
|
+
const result = compileCSSManifestFileInternal(referenceFile, {
|
|
210
|
+
...options,
|
|
211
|
+
baseManifest: manifest,
|
|
212
|
+
preserveNativeCSS: false,
|
|
213
|
+
definitionsOnly: true,
|
|
214
|
+
referenceResources: options.resolveReferenceResources,
|
|
215
|
+
referenceStack: options.referenceStack
|
|
216
|
+
});
|
|
217
|
+
definitionSources.push(...result.definitionSources || []);
|
|
218
|
+
hasReferences = true;
|
|
219
|
+
manifest = result.manifest;
|
|
220
|
+
addUnique(dependencies, result.dependencies);
|
|
221
|
+
addUnique(warnings, result.warnings);
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
dependencies,
|
|
225
|
+
warnings,
|
|
226
|
+
definitionSources,
|
|
227
|
+
...hasReferences ? { manifest } : {}
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function toCompileCSSManifestResult(result, options = {}) {
|
|
231
|
+
const { manifestInput: _directiveManifestInput, ...directiveData } = result;
|
|
232
|
+
const referenceContext = resolveCSSReferenceContext(result.references, options);
|
|
233
|
+
const definitionSources = [...referenceContext.definitionSources, ...result.definitionSources || []];
|
|
234
|
+
const lowerResult = lowerCSSDirectivesWithBinding({
|
|
235
|
+
...result,
|
|
236
|
+
definitionSources
|
|
237
|
+
}, {
|
|
238
|
+
baseManifest: options.baseManifest,
|
|
239
|
+
resolutionManifest: referenceContext.manifest,
|
|
240
|
+
onDiagnostic: options.onDiagnostic,
|
|
241
|
+
sourceText: options.sourceText
|
|
242
|
+
});
|
|
243
|
+
const dependencies = [];
|
|
244
|
+
const warnings = [];
|
|
245
|
+
addUnique(dependencies, result.dependencies);
|
|
246
|
+
addUnique(dependencies, referenceContext.dependencies);
|
|
247
|
+
addUnique(warnings, referenceContext.warnings);
|
|
248
|
+
addUnique(warnings, lowerResult.warnings);
|
|
249
|
+
const generatedCSS = lowerResult.generatedCSS || "";
|
|
250
|
+
const css = lowerResult.css ?? [result.nativeCSS, generatedCSS].filter(Boolean).join("\n");
|
|
251
|
+
return {
|
|
252
|
+
...directiveData,
|
|
253
|
+
definitionSources: lowerResult.definitionSources,
|
|
254
|
+
notices: lowerResult.notices,
|
|
255
|
+
...lowerResult.css === void 0 ? {} : { outputMappings: lowerResult.outputMappings ?? [] },
|
|
256
|
+
dependencies,
|
|
257
|
+
manifest: lowerResult.manifest,
|
|
258
|
+
resolutionManifest: lowerResult.resolutionManifest,
|
|
259
|
+
warnings,
|
|
260
|
+
generatedCSS,
|
|
261
|
+
generatedMappings: lowerResult.generatedMappings,
|
|
262
|
+
css,
|
|
263
|
+
directives: result
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/** Compile original files independently before merging their manifest and native output. */
|
|
267
|
+
function compileCSSManifestGraph(graph, options = {}) {
|
|
268
|
+
const references = Object.entries(graph.files).flatMap(([file, source]) => {
|
|
269
|
+
const references = compileCSS(source, {
|
|
270
|
+
from: file,
|
|
271
|
+
preserveNativeCSS: false
|
|
272
|
+
}).references || [];
|
|
273
|
+
return options.mapReferences?.(file, source, references) ?? references;
|
|
274
|
+
});
|
|
275
|
+
const referenceContext = resolveCSSReferenceContext(references, options);
|
|
276
|
+
const resourceDependencies = [];
|
|
277
|
+
const resourceURLs = options.referenceResources ? Object.fromEntries(Object.entries(graph.files).map(([file, source]) => [file, Object.fromEntries(analyzeCSSDependencies(source).resources.flatMap(({ url }) => {
|
|
278
|
+
if (url.startsWith("/") || url.startsWith("#") || /^[a-z][a-z\d+.-]*:/i.test(url)) return [];
|
|
279
|
+
const resource = new URL(url, pathToFileURL(file));
|
|
280
|
+
const owner = fileURLToPath(resource);
|
|
281
|
+
resourceDependencies.push(owner);
|
|
282
|
+
options.onDependency?.(owner);
|
|
283
|
+
return [[url, resource.href]];
|
|
284
|
+
}))])) : void 0;
|
|
285
|
+
const compiled = callCompilerBinding(() => compilePreparedGraph(nativeCompiler(), {
|
|
286
|
+
graph,
|
|
287
|
+
...options.definitionsOnly ? { nativeStylesheets: [] } : {},
|
|
288
|
+
urls: Object.fromEntries(Object.keys(graph.files).map((file) => [file, pathToFileURL(file).href])),
|
|
289
|
+
baseManifest: options.baseManifest,
|
|
290
|
+
resolutionManifest: referenceContext.manifest,
|
|
291
|
+
definitionSources: referenceContext.definitionSources,
|
|
292
|
+
resourceURLs,
|
|
293
|
+
options: {
|
|
294
|
+
from: graph.entry,
|
|
295
|
+
preserveNativeCSS: options.preserveNativeCSS !== false,
|
|
296
|
+
pruneNativeCSS: options.pruneNativeCSS === true,
|
|
297
|
+
...options.preserveNativeSource === void 0 ? {} : { preserveNativeSource: options.preserveNativeSource },
|
|
298
|
+
...options.classes ? { classes: options.classes } : {}
|
|
299
|
+
},
|
|
300
|
+
inlineImports: true
|
|
301
|
+
}));
|
|
302
|
+
const directives = reviveBindingCompileResult(compiled.directives);
|
|
303
|
+
directives.references = references.length ? references : void 0;
|
|
304
|
+
const dependencies = [.../* @__PURE__ */ new Set([
|
|
305
|
+
...directives.dependencies,
|
|
306
|
+
...referenceContext.dependencies,
|
|
307
|
+
...resourceDependencies
|
|
308
|
+
])];
|
|
309
|
+
const warnings = [.../* @__PURE__ */ new Set([...directives.warnings, ...referenceContext.warnings])];
|
|
310
|
+
for (const warning of warnings) options.onDiagnostic?.(compilerWarningDiagnostic(warning));
|
|
311
|
+
noticeDiagnostics(directives.notices, options.onDiagnostic);
|
|
312
|
+
const entry = compiled.stylesheets.find((sheet) => sheet.id === compiled.entry);
|
|
313
|
+
return {
|
|
314
|
+
...directives,
|
|
315
|
+
dependencies,
|
|
316
|
+
warnings,
|
|
317
|
+
css: entry.css,
|
|
318
|
+
outputMappings: entry.outputMappings,
|
|
319
|
+
sourceTexts: graph.files,
|
|
320
|
+
manifest: compiled.manifest,
|
|
321
|
+
resolutionManifest: compiled.resolutionManifest,
|
|
322
|
+
directives,
|
|
323
|
+
stylesheets: compiled.stylesheets
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
function createManifestFromCSSResult(result, options = {}) {
|
|
327
|
+
return toCompileCSSManifestResult(result, options);
|
|
328
|
+
}
|
|
329
|
+
function compileCSSManifest(source, options = {}) {
|
|
330
|
+
const from = options.from ? stripRequest(options.from) : void 0;
|
|
331
|
+
const fromFile = from ? isAbsolute(from) ? from : resolve(options.root || "", from) : void 0;
|
|
332
|
+
return toCompileCSSManifestResult(compileCSS(source, {
|
|
333
|
+
...options,
|
|
334
|
+
...fromFile ? { from: fromFile } : {}
|
|
335
|
+
}), {
|
|
336
|
+
...options,
|
|
337
|
+
sourceText: source,
|
|
338
|
+
...fromFile ? {
|
|
339
|
+
from: fromFile,
|
|
340
|
+
referenceStack: [...options.referenceStack || [], fromFile]
|
|
341
|
+
} : {}
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
function compileCSSManifestFileInternal(file, options = {}) {
|
|
345
|
+
const absoluteFile = isAbsolute(file) ? file : resolve(options.root || "", file);
|
|
346
|
+
return compileCSSManifestGraph(prepareCSSImportGraph(absoluteFile, void 0, {
|
|
347
|
+
projectDir: options.root,
|
|
348
|
+
onDependency: options.onDependency
|
|
349
|
+
}, analyzeCSSDependencies), {
|
|
350
|
+
...options,
|
|
351
|
+
preserveNativeCSS: options.preserveNativeCSS ?? true,
|
|
352
|
+
from: absoluteFile,
|
|
353
|
+
referenceStack: [...options.referenceStack || [], absoluteFile]
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
function compileCSSManifestFile(file, options = {}) {
|
|
357
|
+
return compileCSSManifestFileInternal(file, options);
|
|
358
|
+
}
|
|
359
|
+
function compileProjectManifest(entries, options = {}) {
|
|
360
|
+
const dependencies = [];
|
|
361
|
+
let extractionPolicy = createCSSDirectiveExtractionPolicy();
|
|
362
|
+
const classNames = [];
|
|
363
|
+
const nativeClassNames = [];
|
|
364
|
+
const nativeCSS = [];
|
|
365
|
+
const css = [];
|
|
366
|
+
const generatedCSS = [];
|
|
367
|
+
const warnings = [];
|
|
368
|
+
let directives = {
|
|
369
|
+
manifestInput: {},
|
|
370
|
+
extractionPolicy: createCSSDirectiveExtractionPolicy(),
|
|
371
|
+
classNames: [],
|
|
372
|
+
nativeClassNames: [],
|
|
373
|
+
nativeCSS: "",
|
|
374
|
+
css: "",
|
|
375
|
+
generatedCSS: "",
|
|
376
|
+
warnings: [],
|
|
377
|
+
dependencies: []
|
|
378
|
+
};
|
|
379
|
+
let manifest = options.baseManifest;
|
|
380
|
+
for (const entry of entries) {
|
|
381
|
+
const manifestResult = compileCSSManifestFile(entry, {
|
|
382
|
+
...options,
|
|
383
|
+
baseManifest: manifest,
|
|
384
|
+
preserveNativeCSS: options.preserveNativeCSS ?? true
|
|
385
|
+
});
|
|
386
|
+
const result = manifestResult.directives;
|
|
387
|
+
directives = result;
|
|
388
|
+
extractionPolicy = mergeCSSDirectiveExtractionPolicy(extractionPolicy, result.extractionPolicy);
|
|
389
|
+
addUnique(dependencies, result.dependencies);
|
|
390
|
+
addUnique(classNames, result.classNames);
|
|
391
|
+
addUnique(nativeClassNames, result.nativeClassNames);
|
|
392
|
+
addUnique(warnings, result.warnings);
|
|
393
|
+
manifest = manifestResult.manifest;
|
|
394
|
+
addUnique(dependencies, manifestResult.dependencies);
|
|
395
|
+
addUnique(warnings, manifestResult.warnings);
|
|
396
|
+
const entryGeneratedCSS = manifestResult.generatedCSS || "";
|
|
397
|
+
if (result.nativeCSS) nativeCSS.push(result.nativeCSS);
|
|
398
|
+
if (entryGeneratedCSS) generatedCSS.push(entryGeneratedCSS);
|
|
399
|
+
if (manifestResult.css) css.push(manifestResult.css);
|
|
400
|
+
}
|
|
401
|
+
const resolvedManifest = manifest || compileManifestInputWithBinding({}, void 0);
|
|
402
|
+
return {
|
|
403
|
+
entries,
|
|
404
|
+
manifest: resolvedManifest,
|
|
405
|
+
resolutionManifest: resolvedManifest,
|
|
406
|
+
dependencies,
|
|
407
|
+
extractionPolicy,
|
|
408
|
+
classNames,
|
|
409
|
+
nativeClassNames,
|
|
410
|
+
nativeCSS: nativeCSS.join("\n"),
|
|
411
|
+
css: css.join("\n"),
|
|
412
|
+
generatedCSS: generatedCSS.join("\n"),
|
|
413
|
+
warnings,
|
|
414
|
+
directives
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
export { analyzeCSSDependencies, collectStandaloneCSSDirectiveExtractionPolicy, compileCSS, compileCSSManifest, compileCSSManifestFile, compileCSSManifestGraph, compileProjectManifest, createCSSDirectiveExtractionPolicy, createManifestFromCSSResult, filterCSSExtractionCandidates, findStandaloneCSSDirectiveStatements, inspectCSS, isMasterCSSPackageStyleFile, mergeCSSDirectiveExtractionPolicy, removeStandaloneCSSDirectives, resolveCSSImportGraph, resolveCSSImportGraphSource, resolveCSSReferenceFile, resolveMasterCSSPackageEntryFile, resolveMasterCSSPackageImportGraph, stripRequestSuffix, stripWindowsExtendedPathPrefix };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
interface PrepareCSSImportGraphOptions {
|
|
2
|
+
projectDir?: string;
|
|
3
|
+
expandPackageImports?: boolean;
|
|
4
|
+
onDependency?: (file: string) => void;
|
|
5
|
+
resolveNodePackageImports?: boolean;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
baseFile?: string;
|
|
8
|
+
sourceMap?: string;
|
|
9
|
+
}
|
|
10
|
+
type AnalyzeDependencies = (source: string) => {
|
|
11
|
+
imports: {
|
|
12
|
+
source: string;
|
|
13
|
+
}[];
|
|
14
|
+
};
|
|
15
|
+
/** Source supplied by a host loader; virtual IDs retain their null prefix. */
|
|
16
|
+
interface CSSImportSource {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly source: string;
|
|
19
|
+
/** Real source owner for relative imports, references, resource URLs and source patterns, if any. */
|
|
20
|
+
readonly baseFile?: string;
|
|
21
|
+
/** Serialized source map v3 for original reference origins in prepared CSS. */
|
|
22
|
+
readonly sourceMap?: string;
|
|
23
|
+
}
|
|
24
|
+
/** undefined uses Node fallback; null preserves an external import verbatim. */
|
|
25
|
+
type CSSImportFileResolver = (specifier: string, importer: string) => string | CSSImportSource | null | undefined | Promise<string | CSSImportSource | null | undefined>;
|
|
26
|
+
declare function normalizeStylesheetGraphID(id: string): string;
|
|
27
|
+
declare function isExpandableImportSource(source: string, fromFile: string): boolean;
|
|
28
|
+
declare function resolveRelativeCSSFile(source: string, fromFile: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Package file identity survives checkout, installation and publication paths:
|
|
31
|
+
* the nearest named package plus the package-relative path. Keyframe IDs hash
|
|
32
|
+
* this owner into delivered CSS, so absolute paths remain only without a name.
|
|
33
|
+
*/
|
|
34
|
+
declare function stylesheetResourceOwner(file: string): string;
|
|
35
|
+
declare function resolveMasterCSSPackageEntryFile(importSource: string, fromFile?: string, projectDir?: string): string | undefined;
|
|
36
|
+
interface PreparedCSSImportGraph {
|
|
37
|
+
resourceOwners?: Record<string, string>;
|
|
38
|
+
entry: string;
|
|
39
|
+
files: Record<string, string>;
|
|
40
|
+
edges: {
|
|
41
|
+
from: string;
|
|
42
|
+
specifier: string;
|
|
43
|
+
resolved: string;
|
|
44
|
+
}[];
|
|
45
|
+
/** Node package CSS keeps its native rules when a surrounding project is pruned. */
|
|
46
|
+
packageFiles?: string[];
|
|
47
|
+
baseFiles?: Record<string, string>;
|
|
48
|
+
sourceMaps?: Record<string, string>;
|
|
49
|
+
}
|
|
50
|
+
declare function resolveNodePackageCSS(importSource: string, fromFile: string): string | undefined;
|
|
51
|
+
declare function prepareCSSImportGraph(file: string, source: string | undefined, options: PrepareCSSImportGraphOptions, analyzeDependencies: AnalyzeDependencies): PreparedCSSImportGraph;
|
|
52
|
+
/** Async build-host file resolution, sharing Node fallback and Rust dependency analysis. */
|
|
53
|
+
declare function prepareCSSImportGraphWithResolver(file: string, source: string, options: PrepareCSSImportGraphOptions, analyzeDependencies: AnalyzeDependencies, resolveImport: CSSImportFileResolver): Promise<PreparedCSSImportGraph>;
|
|
54
|
+
export { CSSImportFileResolver, CSSImportSource, PrepareCSSImportGraphOptions, PreparedCSSImportGraph, isExpandableImportSource, normalizeStylesheetGraphID, prepareCSSImportGraph, prepareCSSImportGraphWithResolver, resolveMasterCSSPackageEntryFile, resolveNodePackageCSS, resolveRelativeCSSFile, stylesheetResourceOwner };
|