dep-0d2f9464.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. 'use strict';
  2. var path$3 = require('path');
  3. var resolve$2 = require('resolve');
  4. var fs$1 = require('fs');
  5. var index$1 = require('./dep-e36486f6.js');
  6. function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e['default'] : e; }
  7. var path__default = /*#__PURE__*/_interopDefaultLegacy(path$3);
  8. var resolve__default = /*#__PURE__*/_interopDefaultLegacy(resolve$2);
  9. var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs$1);
  10. var joinMedia$1 = function (parentMedia, childMedia) {
  11. if (!parentMedia.length && childMedia.length) return childMedia
  12. if (parentMedia.length && !childMedia.length) return parentMedia
  13. if (!parentMedia.length && !childMedia.length) return []
  14. const media = [];
  15. parentMedia.forEach(parentItem => {
  16. childMedia.forEach(childItem => {
  17. if (parentItem !== childItem) media.push(`${parentItem} and ${childItem}`);
  18. });
  19. });
  20. return media
  21. };
  22. // external tooling
  23. const resolve$1 = resolve__default;
  24. const moduleDirectories = ["web_modules", "node_modules"];
  25. function resolveModule(id, opts) {
  26. return new Promise((res, rej) => {
  27. resolve$1(id, opts, (err, path) => (err ? rej(err) : res(path)));
  28. })
  29. }
  30. var resolveId$1 = function (id, base, options) {
  31. const paths = options.path;
  32. const resolveOpts = {
  33. basedir: base,
  34. moduleDirectory: moduleDirectories.concat(options.addModulesDirectories),
  35. paths,
  36. extensions: [".css"],
  37. packageFilter: function processPackage(pkg) {
  38. if (pkg.style) pkg.main = pkg.style;
  39. else if (!pkg.main || !/\.css$/.test(pkg.main)) pkg.main = "index.css";
  40. return pkg
  41. },
  42. preserveSymlinks: false,
  43. };
  44. return resolveModule(`./${id}`, resolveOpts)
  45. .catch(() => resolveModule(id, resolveOpts))
  46. .catch(() => {
  47. if (paths.indexOf(base) === -1) paths.unshift(base);
  48. throw new Error(
  49. `Failed to find '${id}'
  50. in [
  51. ${paths.join(",\n ")}
  52. ]`
  53. )
  54. })
  55. };
  56. var readCache$1 = {exports: {}};
  57. var pify$2 = {exports: {}};
  58. var processFn = function (fn, P, opts) {
  59. return function () {
  60. var that = this;
  61. var args = new Array(arguments.length);
  62. for (var i = 0; i < arguments.length; i++) {
  63. args[i] = arguments[i];
  64. }
  65. return new P(function (resolve, reject) {
  66. args.push(function (err, result) {
  67. if (err) {
  68. reject(err);
  69. } else if (opts.multiArgs) {
  70. var results = new Array(arguments.length - 1);
  71. for (var i = 1; i < arguments.length; i++) {
  72. results[i - 1] = arguments[i];
  73. }
  74. resolve(results);
  75. } else {
  76. resolve(result);
  77. }
  78. });
  79. fn.apply(that, args);
  80. });
  81. };
  82. };
  83. var pify$1 = pify$2.exports = function (obj, P, opts) {
  84. if (typeof P !== 'function') {
  85. opts = P;
  86. P = Promise;
  87. }
  88. opts = opts || {};
  89. opts.exclude = opts.exclude || [/.+Sync$/];
  90. var filter = function (key) {
  91. var match = function (pattern) {
  92. return typeof pattern === 'string' ? key === pattern : pattern.test(key);
  93. };
  94. return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
  95. };
  96. var ret = typeof obj === 'function' ? function () {
  97. if (opts.excludeMain) {
  98. return obj.apply(this, arguments);
  99. }
  100. return processFn(obj, P, opts).apply(this, arguments);
  101. } : {};
  102. return Object.keys(obj).reduce(function (ret, key) {
  103. var x = obj[key];
  104. ret[key] = typeof x === 'function' && filter(key) ? processFn(x, P, opts) : x;
  105. return ret;
  106. }, ret);
  107. };
  108. pify$1.all = pify$1;
  109. var fs = fs__default;
  110. var path$2 = path__default;
  111. var pify = pify$2.exports;
  112. var stat = pify(fs.stat);
  113. var readFile = pify(fs.readFile);
  114. var resolve = path$2.resolve;
  115. var cache = Object.create(null);
  116. function convert(content, encoding) {
  117. if (Buffer.isEncoding(encoding)) {
  118. return content.toString(encoding);
  119. }
  120. return content;
  121. }
  122. readCache$1.exports = function (path, encoding) {
  123. path = resolve(path);
  124. return stat(path).then(function (stats) {
  125. var item = cache[path];
  126. if (item && item.mtime.getTime() === stats.mtime.getTime()) {
  127. return convert(item.content, encoding);
  128. }
  129. return readFile(path).then(function (data) {
  130. cache[path] = {
  131. mtime: stats.mtime,
  132. content: data
  133. };
  134. return convert(data, encoding);
  135. });
  136. }).catch(function (err) {
  137. cache[path] = null;
  138. return Promise.reject(err);
  139. });
  140. };
  141. readCache$1.exports.sync = function (path, encoding) {
  142. path = resolve(path);
  143. try {
  144. var stats = fs.statSync(path);
  145. var item = cache[path];
  146. if (item && item.mtime.getTime() === stats.mtime.getTime()) {
  147. return convert(item.content, encoding);
  148. }
  149. var data = fs.readFileSync(path);
  150. cache[path] = {
  151. mtime: stats.mtime,
  152. content: data
  153. };
  154. return convert(data, encoding);
  155. } catch (err) {
  156. cache[path] = null;
  157. throw err;
  158. }
  159. };
  160. readCache$1.exports.get = function (path, encoding) {
  161. path = resolve(path);
  162. if (cache[path]) {
  163. return convert(cache[path].content, encoding);
  164. }
  165. return null;
  166. };
  167. readCache$1.exports.clear = function () {
  168. cache = Object.create(null);
  169. };
  170. const readCache = readCache$1.exports;
  171. var loadContent$1 = filename => readCache(filename, "utf-8");
  172. // builtin tooling
  173. const path$1 = path__default;
  174. // placeholder tooling
  175. let sugarss;
  176. var processContent$1 = function processContent(
  177. result,
  178. content,
  179. filename,
  180. options,
  181. postcss
  182. ) {
  183. const { plugins } = options;
  184. const ext = path$1.extname(filename);
  185. const parserList = [];
  186. // SugarSS support:
  187. if (ext === ".sss") {
  188. if (!sugarss) {
  189. try {
  190. sugarss = eval('require')('sugarss');
  191. } catch {} // Ignore
  192. }
  193. if (sugarss)
  194. return runPostcss(postcss, content, filename, plugins, [sugarss])
  195. }
  196. // Syntax support:
  197. if (result.opts.syntax && result.opts.syntax.parse) {
  198. parserList.push(result.opts.syntax.parse);
  199. }
  200. // Parser support:
  201. if (result.opts.parser) parserList.push(result.opts.parser);
  202. // Try the default as a last resort:
  203. parserList.push(null);
  204. return runPostcss(postcss, content, filename, plugins, parserList)
  205. };
  206. function runPostcss(postcss, content, filename, plugins, parsers, index) {
  207. if (!index) index = 0;
  208. return postcss(plugins)
  209. .process(content, {
  210. from: filename,
  211. parser: parsers[index],
  212. })
  213. .catch(err => {
  214. // If there's an error, try the next parser
  215. index++;
  216. // If there are no parsers left, throw it
  217. if (index === parsers.length) throw err
  218. return runPostcss(postcss, content, filename, plugins, parsers, index)
  219. })
  220. }
  221. // external tooling
  222. const valueParser = index$1.lib;
  223. // extended tooling
  224. const { stringify } = valueParser;
  225. function split(params, start) {
  226. const list = [];
  227. const last = params.reduce((item, node, index) => {
  228. if (index < start) return ""
  229. if (node.type === "div" && node.value === ",") {
  230. list.push(item);
  231. return ""
  232. }
  233. return item + stringify(node)
  234. }, "");
  235. list.push(last);
  236. return list
  237. }
  238. var parseStatements$1 = function (result, styles) {
  239. const statements = [];
  240. let nodes = [];
  241. styles.each(node => {
  242. let stmt;
  243. if (node.type === "atrule") {
  244. if (node.name === "import") stmt = parseImport(result, node);
  245. else if (node.name === "media") stmt = parseMedia(result, node);
  246. else if (node.name === "charset") stmt = parseCharset(result, node);
  247. }
  248. if (stmt) {
  249. if (nodes.length) {
  250. statements.push({
  251. type: "nodes",
  252. nodes,
  253. media: [],
  254. });
  255. nodes = [];
  256. }
  257. statements.push(stmt);
  258. } else nodes.push(node);
  259. });
  260. if (nodes.length) {
  261. statements.push({
  262. type: "nodes",
  263. nodes,
  264. media: [],
  265. });
  266. }
  267. return statements
  268. };
  269. function parseMedia(result, atRule) {
  270. const params = valueParser(atRule.params).nodes;
  271. return {
  272. type: "media",
  273. node: atRule,
  274. media: split(params, 0),
  275. }
  276. }
  277. function parseCharset(result, atRule) {
  278. if (atRule.prev()) {
  279. return result.warn("@charset must precede all other statements", {
  280. node: atRule,
  281. })
  282. }
  283. return {
  284. type: "charset",
  285. node: atRule,
  286. media: [],
  287. }
  288. }
  289. function parseImport(result, atRule) {
  290. let prev = atRule.prev();
  291. if (prev) {
  292. do {
  293. if (
  294. prev.type !== "comment" &&
  295. (prev.type !== "atrule" ||
  296. (prev.name !== "import" && prev.name !== "charset"))
  297. ) {
  298. return result.warn(
  299. "@import must precede all other statements (besides @charset)",
  300. { node: atRule }
  301. )
  302. }
  303. prev = prev.prev();
  304. } while (prev)
  305. }
  306. if (atRule.nodes) {
  307. return result.warn(
  308. "It looks like you didn't end your @import statement correctly. " +
  309. "Child nodes are attached to it.",
  310. { node: atRule }
  311. )
  312. }
  313. const params = valueParser(atRule.params).nodes;
  314. const stmt = {
  315. type: "import",
  316. node: atRule,
  317. media: [],
  318. };
  319. // prettier-ignore
  320. if (
  321. !params.length ||
  322. (
  323. params[0].type !== "string" ||
  324. !params[0].value
  325. ) &&
  326. (
  327. params[0].type !== "function" ||
  328. params[0].value !== "url" ||
  329. !params[0].nodes.length ||
  330. !params[0].nodes[0].value
  331. )
  332. ) {
  333. return result.warn(`Unable to find uri in '${ atRule.toString() }'`, {
  334. node: atRule,
  335. })
  336. }
  337. if (params[0].type === "string") stmt.uri = params[0].value;
  338. else stmt.uri = params[0].nodes[0].value;
  339. stmt.fullUri = stringify(params[0]);
  340. if (params.length > 2) {
  341. if (params[1].type !== "space") {
  342. return result.warn("Invalid import media statement", { node: atRule })
  343. }
  344. stmt.media = split(params, 2);
  345. }
  346. return stmt
  347. }
  348. // builtin tooling
  349. const path = path__default;
  350. // internal tooling
  351. const joinMedia = joinMedia$1;
  352. const resolveId = resolveId$1;
  353. const loadContent = loadContent$1;
  354. const processContent = processContent$1;
  355. const parseStatements = parseStatements$1;
  356. function AtImport(options) {
  357. options = {
  358. root: process.cwd(),
  359. path: [],
  360. skipDuplicates: true,
  361. resolve: resolveId,
  362. load: loadContent,
  363. plugins: [],
  364. addModulesDirectories: [],
  365. ...options,
  366. };
  367. options.root = path.resolve(options.root);
  368. // convert string to an array of a single element
  369. if (typeof options.path === "string") options.path = [options.path];
  370. if (!Array.isArray(options.path)) options.path = [];
  371. options.path = options.path.map(p => path.resolve(options.root, p));
  372. return {
  373. postcssPlugin: "postcss-import",
  374. Once(styles, { result, atRule, postcss }) {
  375. const state = {
  376. importedFiles: {},
  377. hashFiles: {},
  378. };
  379. if (styles.source && styles.source.input && styles.source.input.file) {
  380. state.importedFiles[styles.source.input.file] = {};
  381. }
  382. if (options.plugins && !Array.isArray(options.plugins)) {
  383. throw new Error("plugins option must be an array")
  384. }
  385. return parseStyles(result, styles, options, state, []).then(bundle => {
  386. applyRaws(bundle);
  387. applyMedia(bundle);
  388. applyStyles(bundle, styles);
  389. })
  390. function applyRaws(bundle) {
  391. bundle.forEach((stmt, index) => {
  392. if (index === 0) return
  393. if (stmt.parent) {
  394. const { before } = stmt.parent.node.raws;
  395. if (stmt.type === "nodes") stmt.nodes[0].raws.before = before;
  396. else stmt.node.raws.before = before;
  397. } else if (stmt.type === "nodes") {
  398. stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || "\n";
  399. }
  400. });
  401. }
  402. function applyMedia(bundle) {
  403. bundle.forEach(stmt => {
  404. if (!stmt.media.length || stmt.type === "charset") return
  405. if (stmt.type === "import") {
  406. stmt.node.params = `${stmt.fullUri} ${stmt.media.join(", ")}`;
  407. } else if (stmt.type === "media")
  408. stmt.node.params = stmt.media.join(", ");
  409. else {
  410. const { nodes } = stmt;
  411. const { parent } = nodes[0];
  412. const mediaNode = atRule({
  413. name: "media",
  414. params: stmt.media.join(", "),
  415. source: parent.source,
  416. });
  417. parent.insertBefore(nodes[0], mediaNode);
  418. // remove nodes
  419. nodes.forEach(node => {
  420. node.parent = undefined;
  421. });
  422. // better output
  423. nodes[0].raws.before = nodes[0].raws.before || "\n";
  424. // wrap new rules with media query
  425. mediaNode.append(nodes);
  426. stmt.type = "media";
  427. stmt.node = mediaNode;
  428. delete stmt.nodes;
  429. }
  430. });
  431. }
  432. function applyStyles(bundle, styles) {
  433. styles.nodes = [];
  434. // Strip additional statements.
  435. bundle.forEach(stmt => {
  436. if (["charset", "import", "media"].includes(stmt.type)) {
  437. stmt.node.parent = undefined;
  438. styles.append(stmt.node);
  439. } else if (stmt.type === "nodes") {
  440. stmt.nodes.forEach(node => {
  441. node.parent = undefined;
  442. styles.append(node);
  443. });
  444. }
  445. });
  446. }
  447. function parseStyles(result, styles, options, state, media) {
  448. const statements = parseStatements(result, styles);
  449. return Promise.resolve(statements)
  450. .then(stmts => {
  451. // process each statement in series
  452. return stmts.reduce((promise, stmt) => {
  453. return promise.then(() => {
  454. stmt.media = joinMedia(media, stmt.media || []);
  455. // skip protocol base uri (protocol://url) or protocol-relative
  456. if (
  457. stmt.type !== "import" ||
  458. /^(?:[a-z]+:)?\/\//i.test(stmt.uri)
  459. ) {
  460. return
  461. }
  462. if (options.filter && !options.filter(stmt.uri)) {
  463. // rejected by filter
  464. return
  465. }
  466. return resolveImportId(result, stmt, options, state)
  467. })
  468. }, Promise.resolve())
  469. })
  470. .then(() => {
  471. let charset;
  472. const imports = [];
  473. const bundle = [];
  474. function handleCharset(stmt) {
  475. if (!charset) charset = stmt;
  476. // charsets aren't case-sensitive, so convert to lower case to compare
  477. else if (
  478. stmt.node.params.toLowerCase() !==
  479. charset.node.params.toLowerCase()
  480. ) {
  481. throw new Error(
  482. `Incompatable @charset statements:
  483. ${stmt.node.params} specified in ${stmt.node.source.input.file}
  484. ${charset.node.params} specified in ${charset.node.source.input.file}`
  485. )
  486. }
  487. }
  488. // squash statements and their children
  489. statements.forEach(stmt => {
  490. if (stmt.type === "charset") handleCharset(stmt);
  491. else if (stmt.type === "import") {
  492. if (stmt.children) {
  493. stmt.children.forEach((child, index) => {
  494. if (child.type === "import") imports.push(child);
  495. else if (child.type === "charset") handleCharset(child);
  496. else bundle.push(child);
  497. // For better output
  498. if (index === 0) child.parent = stmt;
  499. });
  500. } else imports.push(stmt);
  501. } else if (stmt.type === "media" || stmt.type === "nodes") {
  502. bundle.push(stmt);
  503. }
  504. });
  505. return charset
  506. ? [charset, ...imports.concat(bundle)]
  507. : imports.concat(bundle)
  508. })
  509. }
  510. function resolveImportId(result, stmt, options, state) {
  511. const atRule = stmt.node;
  512. let sourceFile;
  513. if (atRule.source && atRule.source.input && atRule.source.input.file) {
  514. sourceFile = atRule.source.input.file;
  515. }
  516. const base = sourceFile
  517. ? path.dirname(atRule.source.input.file)
  518. : options.root;
  519. return Promise.resolve(options.resolve(stmt.uri, base, options))
  520. .then(paths => {
  521. if (!Array.isArray(paths)) paths = [paths];
  522. // Ensure that each path is absolute:
  523. return Promise.all(
  524. paths.map(file => {
  525. return !path.isAbsolute(file)
  526. ? resolveId(file, base, options)
  527. : file
  528. })
  529. )
  530. })
  531. .then(resolved => {
  532. // Add dependency messages:
  533. resolved.forEach(file => {
  534. result.messages.push({
  535. type: "dependency",
  536. plugin: "postcss-import",
  537. file,
  538. parent: sourceFile,
  539. });
  540. });
  541. return Promise.all(
  542. resolved.map(file => {
  543. return loadImportContent(result, stmt, file, options, state)
  544. })
  545. )
  546. })
  547. .then(result => {
  548. // Merge loaded statements
  549. stmt.children = result.reduce((result, statements) => {
  550. return statements ? result.concat(statements) : result
  551. }, []);
  552. })
  553. }
  554. function loadImportContent(result, stmt, filename, options, state) {
  555. const atRule = stmt.node;
  556. const { media } = stmt;
  557. if (options.skipDuplicates) {
  558. // skip files already imported at the same scope
  559. if (
  560. state.importedFiles[filename] &&
  561. state.importedFiles[filename][media]
  562. ) {
  563. return
  564. }
  565. // save imported files to skip them next time
  566. if (!state.importedFiles[filename]) state.importedFiles[filename] = {};
  567. state.importedFiles[filename][media] = true;
  568. }
  569. return Promise.resolve(options.load(filename, options)).then(
  570. content => {
  571. if (content.trim() === "") {
  572. result.warn(`${filename} is empty`, { node: atRule });
  573. return
  574. }
  575. // skip previous imported files not containing @import rules
  576. if (state.hashFiles[content] && state.hashFiles[content][media])
  577. return
  578. return processContent(
  579. result,
  580. content,
  581. filename,
  582. options,
  583. postcss
  584. ).then(importedResult => {
  585. const styles = importedResult.root;
  586. result.messages = result.messages.concat(importedResult.messages);
  587. if (options.skipDuplicates) {
  588. const hasImport = styles.some(child => {
  589. return child.type === "atrule" && child.name === "import"
  590. });
  591. if (!hasImport) {
  592. // save hash files to skip them next time
  593. if (!state.hashFiles[content]) state.hashFiles[content] = {};
  594. state.hashFiles[content][media] = true;
  595. }
  596. }
  597. // recursion: import @import from imported file
  598. return parseStyles(result, styles, options, state, media)
  599. })
  600. }
  601. )
  602. }
  603. },
  604. }
  605. }
  606. AtImport.postcss = true;
  607. var postcssImport = AtImport;
  608. var index = /*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), postcssImport, {
  609. 'default': postcssImport
  610. });
  611. exports.index = index;
  612. //# sourceMappingURL=dep-0d2f9464.js.map