dep-53dc1ef4.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957
  1. import require$$0 from 'path';
  2. import resolve$2 from 'resolve';
  3. import require$$0__default from 'fs';
  4. import { l as lib } from './dep-c423598f.js';
  5. import { fileURLToPath as __cjs_fileURLToPath } from 'node:url';
  6. import { dirname as __cjs_dirname } from 'node:path';
  7. import { createRequire as __cjs_createRequire } from 'node:module';
  8. const __filename = __cjs_fileURLToPath(import.meta.url);
  9. const __dirname = __cjs_dirname(__filename);
  10. const require = __cjs_createRequire(import.meta.url);
  11. const __require = require;
  12. function _mergeNamespaces(n, m) {
  13. for (var i = 0; i < m.length; i++) {
  14. var e = m[i];
  15. if (typeof e !== 'string' && !Array.isArray(e)) { for (var k in e) {
  16. if (k !== 'default' && !(k in n)) {
  17. n[k] = e[k];
  18. }
  19. } }
  20. }
  21. return n;
  22. }
  23. const startsWithKeywordRegexp = /^(all|not|only|print|screen)/i;
  24. var joinMedia$1 = function (parentMedia, childMedia) {
  25. if (!parentMedia.length && childMedia.length) return childMedia
  26. if (parentMedia.length && !childMedia.length) return parentMedia
  27. if (!parentMedia.length && !childMedia.length) return []
  28. const media = [];
  29. parentMedia.forEach(parentItem => {
  30. const parentItemStartsWithKeyword = startsWithKeywordRegexp.test(parentItem);
  31. childMedia.forEach(childItem => {
  32. const childItemStartsWithKeyword = startsWithKeywordRegexp.test(childItem);
  33. if (parentItem !== childItem) {
  34. if (childItemStartsWithKeyword && !parentItemStartsWithKeyword) {
  35. media.push(`${childItem} and ${parentItem}`);
  36. } else {
  37. media.push(`${parentItem} and ${childItem}`);
  38. }
  39. }
  40. });
  41. });
  42. return media
  43. };
  44. var joinLayer$1 = function (parentLayer, childLayer) {
  45. if (!parentLayer.length && childLayer.length) return childLayer
  46. if (parentLayer.length && !childLayer.length) return parentLayer
  47. if (!parentLayer.length && !childLayer.length) return []
  48. return parentLayer.concat(childLayer)
  49. };
  50. // external tooling
  51. const resolve$1 = resolve$2;
  52. const moduleDirectories = ["web_modules", "node_modules"];
  53. function resolveModule(id, opts) {
  54. return new Promise((res, rej) => {
  55. resolve$1(id, opts, (err, path) => (err ? rej(err) : res(path)));
  56. })
  57. }
  58. var resolveId$1 = function (id, base, options) {
  59. const paths = options.path;
  60. const resolveOpts = {
  61. basedir: base,
  62. moduleDirectory: moduleDirectories.concat(options.addModulesDirectories),
  63. paths,
  64. extensions: [".css"],
  65. packageFilter: function processPackage(pkg) {
  66. if (pkg.style) pkg.main = pkg.style;
  67. else if (!pkg.main || !/\.css$/.test(pkg.main)) pkg.main = "index.css";
  68. return pkg
  69. },
  70. preserveSymlinks: false,
  71. };
  72. return resolveModule(`./${id}`, resolveOpts)
  73. .catch(() => resolveModule(id, resolveOpts))
  74. .catch(() => {
  75. if (paths.indexOf(base) === -1) paths.unshift(base);
  76. throw new Error(
  77. `Failed to find '${id}'
  78. in [
  79. ${paths.join(",\n ")}
  80. ]`
  81. )
  82. })
  83. };
  84. var readCacheExports = {};
  85. var readCache$1 = {
  86. get exports(){ return readCacheExports; },
  87. set exports(v){ readCacheExports = v; },
  88. };
  89. var pifyExports = {};
  90. var pify$2 = {
  91. get exports(){ return pifyExports; },
  92. set exports(v){ pifyExports = v; },
  93. };
  94. var processFn = function (fn, P, opts) {
  95. return function () {
  96. var that = this;
  97. var args = new Array(arguments.length);
  98. for (var i = 0; i < arguments.length; i++) {
  99. args[i] = arguments[i];
  100. }
  101. return new P(function (resolve, reject) {
  102. args.push(function (err, result) {
  103. if (err) {
  104. reject(err);
  105. } else if (opts.multiArgs) {
  106. var results = new Array(arguments.length - 1);
  107. for (var i = 1; i < arguments.length; i++) {
  108. results[i - 1] = arguments[i];
  109. }
  110. resolve(results);
  111. } else {
  112. resolve(result);
  113. }
  114. });
  115. fn.apply(that, args);
  116. });
  117. };
  118. };
  119. var pify$1 = pify$2.exports = function (obj, P, opts) {
  120. if (typeof P !== 'function') {
  121. opts = P;
  122. P = Promise;
  123. }
  124. opts = opts || {};
  125. opts.exclude = opts.exclude || [/.+Sync$/];
  126. var filter = function (key) {
  127. var match = function (pattern) {
  128. return typeof pattern === 'string' ? key === pattern : pattern.test(key);
  129. };
  130. return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
  131. };
  132. var ret = typeof obj === 'function' ? function () {
  133. if (opts.excludeMain) {
  134. return obj.apply(this, arguments);
  135. }
  136. return processFn(obj, P, opts).apply(this, arguments);
  137. } : {};
  138. return Object.keys(obj).reduce(function (ret, key) {
  139. var x = obj[key];
  140. ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x;
  141. return ret;
  142. }, ret);
  143. };
  144. pify$1.all = pify$1;
  145. var fs = require$$0__default;
  146. var path$2 = require$$0;
  147. var pify = pifyExports;
  148. var stat = pify(fs.stat);
  149. var readFile = pify(fs.readFile);
  150. var resolve = path$2.resolve;
  151. var cache = Object.create(null);
  152. function convert(content, encoding) {
  153. if (Buffer.isEncoding(encoding)) {
  154. return content.toString(encoding);
  155. }
  156. return content;
  157. }
  158. readCache$1.exports = function (path, encoding) {
  159. path = resolve(path);
  160. return stat(path).then(function (stats) {
  161. var item = cache[path];
  162. if (item && item.mtime.getTime() === stats.mtime.getTime()) {
  163. return convert(item.content, encoding);
  164. }
  165. return readFile(path).then(function (data) {
  166. cache[path] = {
  167. mtime: stats.mtime,
  168. content: data
  169. };
  170. return convert(data, encoding);
  171. });
  172. }).catch(function (err) {
  173. cache[path] = null;
  174. return Promise.reject(err);
  175. });
  176. };
  177. readCacheExports.sync = function (path, encoding) {
  178. path = resolve(path);
  179. try {
  180. var stats = fs.statSync(path);
  181. var item = cache[path];
  182. if (item && item.mtime.getTime() === stats.mtime.getTime()) {
  183. return convert(item.content, encoding);
  184. }
  185. var data = fs.readFileSync(path);
  186. cache[path] = {
  187. mtime: stats.mtime,
  188. content: data
  189. };
  190. return convert(data, encoding);
  191. } catch (err) {
  192. cache[path] = null;
  193. throw err;
  194. }
  195. };
  196. readCacheExports.get = function (path, encoding) {
  197. path = resolve(path);
  198. if (cache[path]) {
  199. return convert(cache[path].content, encoding);
  200. }
  201. return null;
  202. };
  203. readCacheExports.clear = function () {
  204. cache = Object.create(null);
  205. };
  206. const dataURLRegexp = /^data:text\/css;base64,/i;
  207. function isValid(url) {
  208. return dataURLRegexp.test(url)
  209. }
  210. function contents(url) {
  211. // "data:text/css;base64,".length === 21
  212. return Buffer.from(url.slice(21), "base64").toString()
  213. }
  214. var dataUrl = {
  215. isValid,
  216. contents,
  217. };
  218. const readCache = readCacheExports;
  219. const dataURL$1 = dataUrl;
  220. var loadContent$1 = filename => {
  221. if (dataURL$1.isValid(filename)) {
  222. return dataURL$1.contents(filename)
  223. }
  224. return readCache(filename, "utf-8")
  225. };
  226. // builtin tooling
  227. const path$1 = require$$0;
  228. // placeholder tooling
  229. let sugarss;
  230. var processContent$1 = function processContent(
  231. result,
  232. content,
  233. filename,
  234. options,
  235. postcss
  236. ) {
  237. const { plugins } = options;
  238. const ext = path$1.extname(filename);
  239. const parserList = [];
  240. // SugarSS support:
  241. if (ext === ".sss") {
  242. if (!sugarss) {
  243. try {
  244. sugarss = __require('sugarss');
  245. } catch {} // Ignore
  246. }
  247. if (sugarss)
  248. return runPostcss(postcss, content, filename, plugins, [sugarss])
  249. }
  250. // Syntax support:
  251. if (result.opts.syntax?.parse) {
  252. parserList.push(result.opts.syntax.parse);
  253. }
  254. // Parser support:
  255. if (result.opts.parser) parserList.push(result.opts.parser);
  256. // Try the default as a last resort:
  257. parserList.push(null);
  258. return runPostcss(postcss, content, filename, plugins, parserList)
  259. };
  260. function runPostcss(postcss, content, filename, plugins, parsers, index) {
  261. if (!index) index = 0;
  262. return postcss(plugins)
  263. .process(content, {
  264. from: filename,
  265. parser: parsers[index],
  266. })
  267. .catch(err => {
  268. // If there's an error, try the next parser
  269. index++;
  270. // If there are no parsers left, throw it
  271. if (index === parsers.length) throw err
  272. return runPostcss(postcss, content, filename, plugins, parsers, index)
  273. })
  274. }
  275. // external tooling
  276. const valueParser = lib;
  277. // extended tooling
  278. const { stringify } = valueParser;
  279. function split(params, start) {
  280. const list = [];
  281. const last = params.reduce((item, node, index) => {
  282. if (index < start) return ""
  283. if (node.type === "div" && node.value === ",") {
  284. list.push(item);
  285. return ""
  286. }
  287. return item + stringify(node)
  288. }, "");
  289. list.push(last);
  290. return list
  291. }
  292. var parseStatements$1 = function (result, styles) {
  293. const statements = [];
  294. let nodes = [];
  295. styles.each(node => {
  296. let stmt;
  297. if (node.type === "atrule") {
  298. if (node.name === "import") stmt = parseImport(result, node);
  299. else if (node.name === "media") stmt = parseMedia(result, node);
  300. else if (node.name === "charset") stmt = parseCharset(result, node);
  301. }
  302. if (stmt) {
  303. if (nodes.length) {
  304. statements.push({
  305. type: "nodes",
  306. nodes,
  307. media: [],
  308. layer: [],
  309. });
  310. nodes = [];
  311. }
  312. statements.push(stmt);
  313. } else nodes.push(node);
  314. });
  315. if (nodes.length) {
  316. statements.push({
  317. type: "nodes",
  318. nodes,
  319. media: [],
  320. layer: [],
  321. });
  322. }
  323. return statements
  324. };
  325. function parseMedia(result, atRule) {
  326. const params = valueParser(atRule.params).nodes;
  327. return {
  328. type: "media",
  329. node: atRule,
  330. media: split(params, 0),
  331. layer: [],
  332. }
  333. }
  334. function parseCharset(result, atRule) {
  335. if (atRule.prev()) {
  336. return result.warn("@charset must precede all other statements", {
  337. node: atRule,
  338. })
  339. }
  340. return {
  341. type: "charset",
  342. node: atRule,
  343. media: [],
  344. layer: [],
  345. }
  346. }
  347. function parseImport(result, atRule) {
  348. let prev = atRule.prev();
  349. if (prev) {
  350. do {
  351. if (
  352. prev.type !== "comment" &&
  353. (prev.type !== "atrule" ||
  354. (prev.name !== "import" &&
  355. prev.name !== "charset" &&
  356. !(prev.name === "layer" && !prev.nodes)))
  357. ) {
  358. return result.warn(
  359. "@import must precede all other statements (besides @charset or empty @layer)",
  360. { node: atRule }
  361. )
  362. }
  363. prev = prev.prev();
  364. } while (prev)
  365. }
  366. if (atRule.nodes) {
  367. return result.warn(
  368. "It looks like you didn't end your @import statement correctly. " +
  369. "Child nodes are attached to it.",
  370. { node: atRule }
  371. )
  372. }
  373. const params = valueParser(atRule.params).nodes;
  374. const stmt = {
  375. type: "import",
  376. node: atRule,
  377. media: [],
  378. layer: [],
  379. };
  380. // prettier-ignore
  381. if (
  382. !params.length ||
  383. (
  384. params[0].type !== "string" ||
  385. !params[0].value
  386. ) &&
  387. (
  388. params[0].type !== "function" ||
  389. params[0].value !== "url" ||
  390. !params[0].nodes.length ||
  391. !params[0].nodes[0].value
  392. )
  393. ) {
  394. return result.warn(`Unable to find uri in '${ atRule.toString() }'`, {
  395. node: atRule,
  396. })
  397. }
  398. if (params[0].type === "string") stmt.uri = params[0].value;
  399. else stmt.uri = params[0].nodes[0].value;
  400. stmt.fullUri = stringify(params[0]);
  401. let remainder = params;
  402. if (remainder.length > 2) {
  403. if (
  404. (remainder[2].type === "word" || remainder[2].type === "function") &&
  405. remainder[2].value === "layer"
  406. ) {
  407. if (remainder[1].type !== "space") {
  408. return result.warn("Invalid import layer statement", { node: atRule })
  409. }
  410. if (remainder[2].nodes) {
  411. stmt.layer = [stringify(remainder[2].nodes)];
  412. } else {
  413. stmt.layer = [""];
  414. }
  415. remainder = remainder.slice(2);
  416. }
  417. }
  418. if (remainder.length > 2) {
  419. if (remainder[1].type !== "space") {
  420. return result.warn("Invalid import media statement", { node: atRule })
  421. }
  422. stmt.media = split(remainder, 2);
  423. }
  424. return stmt
  425. }
  426. var assignLayerNames$1 = function (layer, node, state, options) {
  427. layer.forEach((layerPart, i) => {
  428. if (layerPart.trim() === "") {
  429. if (options.nameLayer) {
  430. layer[i] = options
  431. .nameLayer(state.anonymousLayerCounter++, state.rootFilename)
  432. .toString();
  433. } else {
  434. throw node.error(
  435. `When using anonymous layers in @import you must also set the "nameLayer" plugin option`
  436. )
  437. }
  438. }
  439. });
  440. };
  441. // builtin tooling
  442. const path = require$$0;
  443. // internal tooling
  444. const joinMedia = joinMedia$1;
  445. const joinLayer = joinLayer$1;
  446. const resolveId = resolveId$1;
  447. const loadContent = loadContent$1;
  448. const processContent = processContent$1;
  449. const parseStatements = parseStatements$1;
  450. const assignLayerNames = assignLayerNames$1;
  451. const dataURL = dataUrl;
  452. function AtImport(options) {
  453. options = {
  454. root: process.cwd(),
  455. path: [],
  456. skipDuplicates: true,
  457. resolve: resolveId,
  458. load: loadContent,
  459. plugins: [],
  460. addModulesDirectories: [],
  461. nameLayer: null,
  462. ...options,
  463. };
  464. options.root = path.resolve(options.root);
  465. // convert string to an array of a single element
  466. if (typeof options.path === "string") options.path = [options.path];
  467. if (!Array.isArray(options.path)) options.path = [];
  468. options.path = options.path.map(p => path.resolve(options.root, p));
  469. return {
  470. postcssPlugin: "postcss-import",
  471. Once(styles, { result, atRule, postcss }) {
  472. const state = {
  473. importedFiles: {},
  474. hashFiles: {},
  475. rootFilename: null,
  476. anonymousLayerCounter: 0,
  477. };
  478. if (styles.source?.input?.file) {
  479. state.rootFilename = styles.source.input.file;
  480. state.importedFiles[styles.source.input.file] = {};
  481. }
  482. if (options.plugins && !Array.isArray(options.plugins)) {
  483. throw new Error("plugins option must be an array")
  484. }
  485. if (options.nameLayer && typeof options.nameLayer !== "function") {
  486. throw new Error("nameLayer option must be a function")
  487. }
  488. return parseStyles(result, styles, options, state, [], []).then(
  489. bundle => {
  490. applyRaws(bundle);
  491. applyMedia(bundle);
  492. applyStyles(bundle, styles);
  493. }
  494. )
  495. function applyRaws(bundle) {
  496. bundle.forEach((stmt, index) => {
  497. if (index === 0) return
  498. if (stmt.parent) {
  499. const { before } = stmt.parent.node.raws;
  500. if (stmt.type === "nodes") stmt.nodes[0].raws.before = before;
  501. else stmt.node.raws.before = before;
  502. } else if (stmt.type === "nodes") {
  503. stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || "\n";
  504. }
  505. });
  506. }
  507. function applyMedia(bundle) {
  508. bundle.forEach(stmt => {
  509. if (
  510. (!stmt.media.length && !stmt.layer.length) ||
  511. stmt.type === "charset"
  512. ) {
  513. return
  514. }
  515. if (stmt.layer.length > 1) {
  516. assignLayerNames(stmt.layer, stmt.node, state, options);
  517. }
  518. if (stmt.type === "import") {
  519. const parts = [stmt.fullUri];
  520. const media = stmt.media.join(", ");
  521. if (stmt.layer.length) {
  522. const layerName = stmt.layer.join(".");
  523. let layerParams = "layer";
  524. if (layerName) {
  525. layerParams = `layer(${layerName})`;
  526. }
  527. parts.push(layerParams);
  528. }
  529. if (media) {
  530. parts.push(media);
  531. }
  532. stmt.node.params = parts.join(" ");
  533. } else if (stmt.type === "media") {
  534. if (stmt.layer.length) {
  535. const layerNode = atRule({
  536. name: "layer",
  537. params: stmt.layer.join("."),
  538. source: stmt.node.source,
  539. });
  540. if (stmt.parentMedia?.length) {
  541. const mediaNode = atRule({
  542. name: "media",
  543. params: stmt.parentMedia.join(", "),
  544. source: stmt.node.source,
  545. });
  546. mediaNode.append(layerNode);
  547. layerNode.append(stmt.node);
  548. stmt.node = mediaNode;
  549. } else {
  550. layerNode.append(stmt.node);
  551. stmt.node = layerNode;
  552. }
  553. } else {
  554. stmt.node.params = stmt.media.join(", ");
  555. }
  556. } else {
  557. const { nodes } = stmt;
  558. const { parent } = nodes[0];
  559. let outerAtRule;
  560. let innerAtRule;
  561. if (stmt.media.length && stmt.layer.length) {
  562. const mediaNode = atRule({
  563. name: "media",
  564. params: stmt.media.join(", "),
  565. source: parent.source,
  566. });
  567. const layerNode = atRule({
  568. name: "layer",
  569. params: stmt.layer.join("."),
  570. source: parent.source,
  571. });
  572. mediaNode.append(layerNode);
  573. innerAtRule = layerNode;
  574. outerAtRule = mediaNode;
  575. } else if (stmt.media.length) {
  576. const mediaNode = atRule({
  577. name: "media",
  578. params: stmt.media.join(", "),
  579. source: parent.source,
  580. });
  581. innerAtRule = mediaNode;
  582. outerAtRule = mediaNode;
  583. } else if (stmt.layer.length) {
  584. const layerNode = atRule({
  585. name: "layer",
  586. params: stmt.layer.join("."),
  587. source: parent.source,
  588. });
  589. innerAtRule = layerNode;
  590. outerAtRule = layerNode;
  591. }
  592. parent.insertBefore(nodes[0], outerAtRule);
  593. // remove nodes
  594. nodes.forEach(node => {
  595. node.parent = undefined;
  596. });
  597. // better output
  598. nodes[0].raws.before = nodes[0].raws.before || "\n";
  599. // wrap new rules with media query and/or layer at rule
  600. innerAtRule.append(nodes);
  601. stmt.type = "media";
  602. stmt.node = outerAtRule;
  603. delete stmt.nodes;
  604. }
  605. });
  606. }
  607. function applyStyles(bundle, styles) {
  608. styles.nodes = [];
  609. // Strip additional statements.
  610. bundle.forEach(stmt => {
  611. if (["charset", "import", "media"].includes(stmt.type)) {
  612. stmt.node.parent = undefined;
  613. styles.append(stmt.node);
  614. } else if (stmt.type === "nodes") {
  615. stmt.nodes.forEach(node => {
  616. node.parent = undefined;
  617. styles.append(node);
  618. });
  619. }
  620. });
  621. }
  622. function parseStyles(result, styles, options, state, media, layer) {
  623. const statements = parseStatements(result, styles);
  624. return Promise.resolve(statements)
  625. .then(stmts => {
  626. // process each statement in series
  627. return stmts.reduce((promise, stmt) => {
  628. return promise.then(() => {
  629. stmt.media = joinMedia(media, stmt.media || []);
  630. stmt.parentMedia = media;
  631. stmt.layer = joinLayer(layer, stmt.layer || []);
  632. // skip protocol base uri (protocol://url) or protocol-relative
  633. if (
  634. stmt.type !== "import" ||
  635. /^(?:[a-z]+:)?\/\//i.test(stmt.uri)
  636. ) {
  637. return
  638. }
  639. if (options.filter && !options.filter(stmt.uri)) {
  640. // rejected by filter
  641. return
  642. }
  643. return resolveImportId(result, stmt, options, state)
  644. })
  645. }, Promise.resolve())
  646. })
  647. .then(() => {
  648. let charset;
  649. const imports = [];
  650. const bundle = [];
  651. function handleCharset(stmt) {
  652. if (!charset) charset = stmt;
  653. // charsets aren't case-sensitive, so convert to lower case to compare
  654. else if (
  655. stmt.node.params.toLowerCase() !==
  656. charset.node.params.toLowerCase()
  657. ) {
  658. throw new Error(
  659. `Incompatable @charset statements:
  660. ${stmt.node.params} specified in ${stmt.node.source.input.file}
  661. ${charset.node.params} specified in ${charset.node.source.input.file}`
  662. )
  663. }
  664. }
  665. // squash statements and their children
  666. statements.forEach(stmt => {
  667. if (stmt.type === "charset") handleCharset(stmt);
  668. else if (stmt.type === "import") {
  669. if (stmt.children) {
  670. stmt.children.forEach((child, index) => {
  671. if (child.type === "import") imports.push(child);
  672. else if (child.type === "charset") handleCharset(child);
  673. else bundle.push(child);
  674. // For better output
  675. if (index === 0) child.parent = stmt;
  676. });
  677. } else imports.push(stmt);
  678. } else if (stmt.type === "media" || stmt.type === "nodes") {
  679. bundle.push(stmt);
  680. }
  681. });
  682. return charset
  683. ? [charset, ...imports.concat(bundle)]
  684. : imports.concat(bundle)
  685. })
  686. }
  687. function resolveImportId(result, stmt, options, state) {
  688. if (dataURL.isValid(stmt.uri)) {
  689. return loadImportContent(result, stmt, stmt.uri, options, state).then(
  690. result => {
  691. stmt.children = result;
  692. }
  693. )
  694. }
  695. const atRule = stmt.node;
  696. let sourceFile;
  697. if (atRule.source?.input?.file) {
  698. sourceFile = atRule.source.input.file;
  699. }
  700. const base = sourceFile
  701. ? path.dirname(atRule.source.input.file)
  702. : options.root;
  703. return Promise.resolve(options.resolve(stmt.uri, base, options))
  704. .then(paths => {
  705. if (!Array.isArray(paths)) paths = [paths];
  706. // Ensure that each path is absolute:
  707. return Promise.all(
  708. paths.map(file => {
  709. return !path.isAbsolute(file)
  710. ? resolveId(file, base, options)
  711. : file
  712. })
  713. )
  714. })
  715. .then(resolved => {
  716. // Add dependency messages:
  717. resolved.forEach(file => {
  718. result.messages.push({
  719. type: "dependency",
  720. plugin: "postcss-import",
  721. file,
  722. parent: sourceFile,
  723. });
  724. });
  725. return Promise.all(
  726. resolved.map(file => {
  727. return loadImportContent(result, stmt, file, options, state)
  728. })
  729. )
  730. })
  731. .then(result => {
  732. // Merge loaded statements
  733. stmt.children = result.reduce((result, statements) => {
  734. return statements ? result.concat(statements) : result
  735. }, []);
  736. })
  737. }
  738. function loadImportContent(result, stmt, filename, options, state) {
  739. const atRule = stmt.node;
  740. const { media, layer } = stmt;
  741. assignLayerNames(layer, atRule, state, options);
  742. if (options.skipDuplicates) {
  743. // skip files already imported at the same scope
  744. if (state.importedFiles[filename]?.[media]?.[layer]) {
  745. return
  746. }
  747. // save imported files to skip them next time
  748. if (!state.importedFiles[filename]) {
  749. state.importedFiles[filename] = {};
  750. }
  751. if (!state.importedFiles[filename][media]) {
  752. state.importedFiles[filename][media] = {};
  753. }
  754. state.importedFiles[filename][media][layer] = true;
  755. }
  756. return Promise.resolve(options.load(filename, options)).then(
  757. content => {
  758. if (content.trim() === "") {
  759. result.warn(`${filename} is empty`, { node: atRule });
  760. return
  761. }
  762. // skip previous imported files not containing @import rules
  763. if (state.hashFiles[content]?.[media]?.[layer]) {
  764. return
  765. }
  766. return processContent(
  767. result,
  768. content,
  769. filename,
  770. options,
  771. postcss
  772. ).then(importedResult => {
  773. const styles = importedResult.root;
  774. result.messages = result.messages.concat(importedResult.messages);
  775. if (options.skipDuplicates) {
  776. const hasImport = styles.some(child => {
  777. return child.type === "atrule" && child.name === "import"
  778. });
  779. if (!hasImport) {
  780. // save hash files to skip them next time
  781. if (!state.hashFiles[content]) {
  782. state.hashFiles[content] = {};
  783. }
  784. if (!state.hashFiles[content][media]) {
  785. state.hashFiles[content][media] = {};
  786. }
  787. state.hashFiles[content][media][layer] = true;
  788. }
  789. }
  790. // recursion: import @import from imported file
  791. return parseStyles(result, styles, options, state, media, layer)
  792. })
  793. }
  794. )
  795. }
  796. },
  797. }
  798. }
  799. AtImport.postcss = true;
  800. var postcssImport = AtImport;
  801. var index = /*#__PURE__*/_mergeNamespaces({
  802. __proto__: null,
  803. default: postcssImport
  804. }, [postcssImport]);
  805. export { index as i };