|
|
import { P as getDefaultExportFromCjs } from './dep-Bid9ssRr.js'; import require$$0 from 'path'; import { l as lib } from './dep-3RmXg9uo.js';
import { createRequire as __cjs_createRequire } from 'node:module';
const __require = __cjs_createRequire(import.meta.url); function _mergeNamespaces(n, m) { for (var i = 0; i < m.length; i++) { var e = m[i]; if (typeof e !== 'string' && !Array.isArray(e)) { for (var k in e) { if (k !== 'default' && !(k in n)) { n[k] = e[k]; } } } } return n; }
var formatImportPrelude$2 = function formatImportPrelude(layer, media, supports) { const parts = [];
if (typeof layer !== "undefined") { let layerParams = "layer"; if (layer) { layerParams = `layer(${layer})`; }
parts.push(layerParams); }
if (typeof supports !== "undefined") { parts.push(`supports(${supports})`); }
if (typeof media !== "undefined") { parts.push(media); }
return parts.join(" ") };
const formatImportPrelude$1 = formatImportPrelude$2;
// Base64 encode an import with conditions
// The order of conditions is important and is interleaved with cascade layer declarations
// Each group of conditions and cascade layers needs to be interpreted in order
// To achieve this we create a list of base64 encoded imports, where each import contains a stylesheet with another import.
// Each import can define a single group of conditions and a single cascade layer.
var base64EncodedImport = function base64EncodedConditionalImport(prelude, conditions) { conditions.reverse(); const first = conditions.pop(); let params = `${prelude} ${formatImportPrelude$1( first.layer, first.media, first.supports, )}`;
for (const condition of conditions) { params = `'data:text/css;base64,${Buffer.from(`@import ${params}`).toString( "base64", )}' ${formatImportPrelude$1( condition.layer, condition.media, condition.supports, )}`;
}
return params };
const base64EncodedConditionalImport = base64EncodedImport;
var applyConditions$1 = function applyConditions(bundle, atRule) { bundle.forEach(stmt => { if ( stmt.type === "charset" || stmt.type === "warning" || !stmt.conditions?.length ) { return }
if (stmt.type === "import") { stmt.node.params = base64EncodedConditionalImport( stmt.fullUri, stmt.conditions, ); return }
const { nodes } = stmt; const { parent } = nodes[0];
const atRules = [];
// Convert conditions to at-rules
for (const condition of stmt.conditions) { if (typeof condition.media !== "undefined") { const mediaNode = atRule({ name: "media", params: condition.media, source: parent.source, });
atRules.push(mediaNode); }
if (typeof condition.supports !== "undefined") { const supportsNode = atRule({ name: "supports", params: `(${condition.supports})`, source: parent.source, });
atRules.push(supportsNode); }
if (typeof condition.layer !== "undefined") { const layerNode = atRule({ name: "layer", params: condition.layer, source: parent.source, });
atRules.push(layerNode); } }
// Add nodes to AST
const outerAtRule = atRules.shift(); const innerAtRule = atRules.reduce((previous, next) => { previous.append(next); return next }, outerAtRule);
parent.insertBefore(nodes[0], outerAtRule);
// remove nodes
nodes.forEach(node => { node.parent = undefined; });
// better output
nodes[0].raws.before = nodes[0].raws.before || "\n";
// wrap new rules with media query and/or layer at rule
innerAtRule.append(nodes);
stmt.type = "nodes"; stmt.nodes = [outerAtRule]; delete stmt.node; }); };
var applyRaws$1 = function applyRaws(bundle) { bundle.forEach((stmt, index) => { if (index === 0) return
if (stmt.parent) { const { before } = stmt.parent.node.raws; if (stmt.type === "nodes") stmt.nodes[0].raws.before = before; else stmt.node.raws.before = before; } else if (stmt.type === "nodes") { stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || "\n"; } }); };
var applyStyles$1 = function applyStyles(bundle, styles) { styles.nodes = [];
// Strip additional statements.
bundle.forEach(stmt => { if (["charset", "import"].includes(stmt.type)) { stmt.node.parent = undefined; styles.append(stmt.node); } else if (stmt.type === "nodes") { stmt.nodes.forEach(node => { node.parent = undefined; styles.append(node); }); } }); };
const anyDataURLRegexp = /^data:text\/css(?:;(base64|plain))?,/i; const base64DataURLRegexp = /^data:text\/css;base64,/i; const plainDataURLRegexp = /^data:text\/css;plain,/i;
function isValid(url) { return anyDataURLRegexp.test(url) }
function contents(url) { if (base64DataURLRegexp.test(url)) { // "data:text/css;base64,".length === 21
return Buffer.from(url.slice(21), "base64").toString() }
if (plainDataURLRegexp.test(url)) { // "data:text/css;plain,".length === 20
return decodeURIComponent(url.slice(20)) }
// "data:text/css,".length === 14
return decodeURIComponent(url.slice(14)) }
var dataUrl = { isValid, contents, };
// external tooling
const valueParser = lib;
// extended tooling
const { stringify } = valueParser;
var parseStatements$1 = function parseStatements(result, styles, conditions, from) { const statements = []; let nodes = [];
styles.each(node => { let stmt; if (node.type === "atrule") { if (node.name === "import") stmt = parseImport(result, node, conditions, from); else if (node.name === "charset") stmt = parseCharset(result, node, conditions, from); }
if (stmt) { if (nodes.length) { statements.push({ type: "nodes", nodes, conditions: [...conditions], from, }); nodes = []; } statements.push(stmt); } else nodes.push(node); });
if (nodes.length) { statements.push({ type: "nodes", nodes, conditions: [...conditions], from, }); }
return statements };
function parseCharset(result, atRule, conditions, from) { if (atRule.prev()) { return result.warn("@charset must precede all other statements", { node: atRule, }) } return { type: "charset", node: atRule, conditions: [...conditions], from, } }
function parseImport(result, atRule, conditions, from) { let prev = atRule.prev();
// `@import` statements may follow other `@import` statements.
if (prev) { do { if ( prev.type === "comment" || (prev.type === "atrule" && prev.name === "import") ) { prev = prev.prev(); continue }
break } while (prev) }
// All `@import` statements may be preceded by `@charset` or `@layer` statements.
// But the `@import` statements must be consecutive.
if (prev) { do { if ( prev.type === "comment" || (prev.type === "atrule" && (prev.name === "charset" || (prev.name === "layer" && !prev.nodes))) ) { prev = prev.prev(); continue }
return result.warn( "@import must precede all other statements (besides @charset or empty @layer)", { node: atRule }, ) } while (prev) }
if (atRule.nodes) { return result.warn( "It looks like you didn't end your @import statement correctly. " + "Child nodes are attached to it.", { node: atRule }, ) }
const params = valueParser(atRule.params).nodes; const stmt = { type: "import", uri: "", fullUri: "", node: atRule, conditions: [...conditions], from, };
let layer; let media; let supports;
for (let i = 0; i < params.length; i++) { const node = params[i];
if (node.type === "space" || node.type === "comment") continue
if (node.type === "string") { if (stmt.uri) { return result.warn(`Multiple url's in '${atRule.toString()}'`, { node: atRule, }) }
if (!node.value) { return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule, }) }
stmt.uri = node.value; stmt.fullUri = stringify(node); continue }
if (node.type === "function" && /^url$/i.test(node.value)) { if (stmt.uri) { return result.warn(`Multiple url's in '${atRule.toString()}'`, { node: atRule, }) }
if (!node.nodes?.[0]?.value) { return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule, }) }
stmt.uri = node.nodes[0].value; stmt.fullUri = stringify(node); continue }
if (!stmt.uri) { return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule, }) }
if ( (node.type === "word" || node.type === "function") && /^layer$/i.test(node.value) ) { if (typeof layer !== "undefined") { return result.warn(`Multiple layers in '${atRule.toString()}'`, { node: atRule, }) }
if (typeof supports !== "undefined") { return result.warn( `layers must be defined before support conditions in '${atRule.toString()}'`, { node: atRule, }, ) }
if (node.nodes) { layer = stringify(node.nodes); } else { layer = ""; }
continue }
if (node.type === "function" && /^supports$/i.test(node.value)) { if (typeof supports !== "undefined") { return result.warn( `Multiple support conditions in '${atRule.toString()}'`, { node: atRule, }, ) }
supports = stringify(node.nodes);
continue }
media = stringify(params.slice(i)); break }
if (!stmt.uri) { return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule, }) }
if ( typeof media !== "undefined" || typeof layer !== "undefined" || typeof supports !== "undefined" ) { stmt.conditions.push({ layer, media, supports, }); }
return stmt }
// builtin tooling
const path$2 = require$$0;
// placeholder tooling
let sugarss;
var processContent$1 = function processContent( result, content, filename, options, postcss, ) { const { plugins } = options; const ext = path$2.extname(filename);
const parserList = [];
// SugarSS support:
if (ext === ".sss") { if (!sugarss) { /* c8 ignore next 3 */ try { sugarss = __require('sugarss'); } catch {} // Ignore
} if (sugarss) return runPostcss(postcss, content, filename, plugins, [sugarss]) }
// Syntax support:
if (result.opts.syntax?.parse) { parserList.push(result.opts.syntax.parse); }
// Parser support:
if (result.opts.parser) parserList.push(result.opts.parser); // Try the default as a last resort:
parserList.push(null);
return runPostcss(postcss, content, filename, plugins, parserList) };
function runPostcss(postcss, content, filename, plugins, parsers, index) { if (!index) index = 0; return postcss(plugins) .process(content, { from: filename, parser: parsers[index], }) .catch(err => { // If there's an error, try the next parser
index++; // If there are no parsers left, throw it
if (index === parsers.length) throw err return runPostcss(postcss, content, filename, plugins, parsers, index) }) }
const path$1 = require$$0;
const dataURL = dataUrl; const parseStatements = parseStatements$1; const processContent = processContent$1; const resolveId$1 = (id) => id; const formatImportPrelude = formatImportPrelude$2;
async function parseStyles$1( result, styles, options, state, conditions, from, postcss, ) { const statements = parseStatements(result, styles, conditions, from);
for (const stmt of statements) { if (stmt.type !== "import" || !isProcessableURL(stmt.uri)) { continue }
if (options.filter && !options.filter(stmt.uri)) { // rejected by filter
continue }
await resolveImportId(result, stmt, options, state, postcss); }
let charset; const imports = []; const bundle = [];
function handleCharset(stmt) { if (!charset) charset = stmt; // charsets aren't case-sensitive, so convert to lower case to compare
else if ( stmt.node.params.toLowerCase() !== charset.node.params.toLowerCase() ) { throw stmt.node.error( `Incompatible @charset statements:
${stmt.node.params} specified in ${stmt.node.source.input.file} ${charset.node.params} specified in ${charset.node.source.input.file}`,
) } }
// squash statements and their children
statements.forEach(stmt => { if (stmt.type === "charset") handleCharset(stmt); else if (stmt.type === "import") { if (stmt.children) { stmt.children.forEach((child, index) => { if (child.type === "import") imports.push(child); else if (child.type === "charset") handleCharset(child); else bundle.push(child); // For better output
if (index === 0) child.parent = stmt; }); } else imports.push(stmt); } else if (stmt.type === "nodes") { bundle.push(stmt); } });
return charset ? [charset, ...imports.concat(bundle)] : imports.concat(bundle) }
async function resolveImportId(result, stmt, options, state, postcss) { if (dataURL.isValid(stmt.uri)) { // eslint-disable-next-line require-atomic-updates
stmt.children = await loadImportContent( result, stmt, stmt.uri, options, state, postcss, );
return } else if (dataURL.isValid(stmt.from.slice(-1))) { // Data urls can't be used as a base url to resolve imports.
throw stmt.node.error( `Unable to import '${stmt.uri}' from a stylesheet that is embedded in a data url`, ) }
const atRule = stmt.node; let sourceFile; if (atRule.source?.input?.file) { sourceFile = atRule.source.input.file; } const base = sourceFile ? path$1.dirname(atRule.source.input.file) : options.root;
const paths = [await options.resolve(stmt.uri, base, options, atRule)].flat();
// Ensure that each path is absolute:
const resolved = await Promise.all( paths.map(file => { return !path$1.isAbsolute(file) ? resolveId$1(file) : file }), );
// Add dependency messages:
resolved.forEach(file => { result.messages.push({ type: "dependency", plugin: "postcss-import", file, parent: sourceFile, }); });
const importedContent = await Promise.all( resolved.map(file => { return loadImportContent(result, stmt, file, options, state, postcss) }), );
// Merge loaded statements
// eslint-disable-next-line require-atomic-updates
stmt.children = importedContent.flat().filter(x => !!x); }
async function loadImportContent( result, stmt, filename, options, state, postcss, ) { const atRule = stmt.node; const { conditions, from } = stmt; const stmtDuplicateCheckKey = conditions .map(condition => formatImportPrelude(condition.layer, condition.media, condition.supports), ) .join(":");
if (options.skipDuplicates) { // skip files already imported at the same scope
if (state.importedFiles[filename]?.[stmtDuplicateCheckKey]) { return }
// save imported files to skip them next time
if (!state.importedFiles[filename]) { state.importedFiles[filename] = {}; } state.importedFiles[filename][stmtDuplicateCheckKey] = true; }
if (from.includes(filename)) { return }
const content = await options.load(filename, options);
if (content.trim() === "" && options.warnOnEmpty) { result.warn(`${filename} is empty`, { node: atRule }); return }
// skip previous imported files not containing @import rules
if ( options.skipDuplicates && state.hashFiles[content]?.[stmtDuplicateCheckKey] ) { return }
const importedResult = await processContent( result, content, filename, options, postcss, );
const styles = importedResult.root; result.messages = result.messages.concat(importedResult.messages);
if (options.skipDuplicates) { const hasImport = styles.some(child => { return child.type === "atrule" && child.name === "import" }); if (!hasImport) { // save hash files to skip them next time
if (!state.hashFiles[content]) { state.hashFiles[content] = {}; }
state.hashFiles[content][stmtDuplicateCheckKey] = true; } }
// recursion: import @import from imported file
return parseStyles$1( result, styles, options, state, conditions, [...from, filename], postcss, ) }
function isProcessableURL(uri) { // skip protocol base uri (protocol://url) or protocol-relative
if (/^(?:[a-z]+:)?\/\//i.test(uri)) { return false }
// check for fragment or query
try { // needs a base to parse properly
const url = new URL(uri, "https://example.com"); if (url.search) { return false } } catch {} // Ignore
return true }
var parseStyles_1 = parseStyles$1;
// builtin tooling
const path = require$$0;
// internal tooling
const applyConditions = applyConditions$1; const applyRaws = applyRaws$1; const applyStyles = applyStyles$1; const loadContent = () => ""; const parseStyles = parseStyles_1; const resolveId = (id) => id;
function AtImport(options) { options = { root: process.cwd(), path: [], skipDuplicates: true, resolve: resolveId, load: loadContent, plugins: [], addModulesDirectories: [], warnOnEmpty: true, ...options, };
options.root = path.resolve(options.root);
// convert string to an array of a single element
if (typeof options.path === "string") options.path = [options.path];
if (!Array.isArray(options.path)) options.path = [];
options.path = options.path.map(p => path.resolve(options.root, p));
return { postcssPlugin: "postcss-import", async Once(styles, { result, atRule, postcss }) { const state = { importedFiles: {}, hashFiles: {}, };
if (styles.source?.input?.file) { state.importedFiles[styles.source.input.file] = {}; }
if (options.plugins && !Array.isArray(options.plugins)) { throw new Error("plugins option must be an array") }
const bundle = await parseStyles( result, styles, options, state, [], [], postcss, );
applyRaws(bundle); applyConditions(bundle, atRule); applyStyles(bundle, styles); }, } }
AtImport.postcss = true;
var postcssImport = AtImport;
var index = /*@__PURE__*/getDefaultExportFromCjs(postcssImport);
var index$1 = /*#__PURE__*/_mergeNamespaces({ __proto__: null, default: index }, [postcssImport]);
export { index$1 as i };
|