@expo/metro-config 0.7.1 → 0.9.0

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.
Files changed (69) hide show
  1. package/build/ExpoMetroConfig.d.ts +16 -8
  2. package/build/ExpoMetroConfig.js +167 -107
  3. package/build/ExpoMetroConfig.js.map +1 -1
  4. package/build/customizeFrame.d.ts +10 -0
  5. package/build/customizeFrame.js +85 -0
  6. package/build/customizeFrame.js.map +1 -0
  7. package/build/env.d.ts +16 -0
  8. package/build/env.js +47 -0
  9. package/build/env.js.map +1 -0
  10. package/build/getModulesPaths.d.ts +1 -0
  11. package/build/getModulesPaths.js +12 -0
  12. package/build/getModulesPaths.js.map +1 -1
  13. package/build/getWatchFolders.js.map +1 -1
  14. package/build/rewriteRequestUrl.d.ts +1 -0
  15. package/build/rewriteRequestUrl.js +88 -0
  16. package/build/rewriteRequestUrl.js.map +1 -0
  17. package/build/serializer/environmentVariableSerializerPlugin.d.ts +11 -0
  18. package/build/serializer/environmentVariableSerializerPlugin.js +125 -0
  19. package/build/serializer/environmentVariableSerializerPlugin.js.map +1 -0
  20. package/build/serializer/getCssDeps.d.ts +31 -0
  21. package/build/serializer/getCssDeps.js +107 -0
  22. package/build/serializer/getCssDeps.js.map +1 -0
  23. package/build/serializer/serializerAssets.d.ts +7 -0
  24. package/build/serializer/serializerAssets.js +2 -0
  25. package/build/serializer/serializerAssets.js.map +1 -0
  26. package/build/serializer/withExpoSerializers.d.ts +9 -0
  27. package/build/serializer/withExpoSerializers.js +135 -0
  28. package/build/serializer/withExpoSerializers.js.map +1 -0
  29. package/build/transform-worker/css-modules.d.ts +20 -0
  30. package/build/transform-worker/css-modules.js +93 -0
  31. package/build/transform-worker/css-modules.js.map +1 -0
  32. package/build/transform-worker/css.d.ts +7 -0
  33. package/build/transform-worker/css.js +49 -0
  34. package/build/transform-worker/css.js.map +1 -0
  35. package/build/transform-worker/postcss.d.ts +17 -0
  36. package/build/transform-worker/postcss.js +253 -0
  37. package/build/transform-worker/postcss.js.map +1 -0
  38. package/build/transform-worker/sass.d.ts +9 -0
  39. package/build/transform-worker/sass.js +49 -0
  40. package/build/transform-worker/sass.js.map +1 -0
  41. package/build/transform-worker/transform-worker.d.ts +3 -0
  42. package/build/transform-worker/transform-worker.js +180 -0
  43. package/build/transform-worker/transform-worker.js.map +1 -0
  44. package/build/transform-worker/utils/require.d.ts +2 -0
  45. package/build/transform-worker/utils/require.js +38 -0
  46. package/build/transform-worker/utils/require.js.map +1 -0
  47. package/build/transformer/createExoticTransformer.js.map +1 -1
  48. package/build/transformer/createMatcher.js +1 -1
  49. package/build/transformer/createMatcher.js.map +1 -1
  50. package/build/transformer/createMultiRuleTransformer.js +2 -2
  51. package/build/transformer/createMultiRuleTransformer.js.map +1 -1
  52. package/build/transformer/generateFunctionMap.d.ts +3 -1
  53. package/build/transformer/generateFunctionMap.js +6 -6
  54. package/build/transformer/generateFunctionMap.js.map +1 -1
  55. package/build/transformer/getBabelConfig.js.map +1 -1
  56. package/build/transformer/getCacheKey.js.map +1 -1
  57. package/build/transformer/index.js.map +1 -1
  58. package/build/transformer/metro-expo-babel-transformer.js.map +1 -1
  59. package/build/transformer/metro-expo-exotic-babel-transformer.js.map +1 -1
  60. package/build/traveling/metro-config.d.ts +3 -0
  61. package/build/traveling/metro-config.js +25 -0
  62. package/build/traveling/metro-config.js.map +1 -0
  63. package/build/utils/hash.d.ts +1 -0
  64. package/build/utils/hash.js +18 -0
  65. package/build/utils/hash.js.map +1 -0
  66. package/package.json +9 -7
  67. package/build/importMetroFromProject.d.ts +0 -4
  68. package/build/importMetroFromProject.js +0 -40
  69. package/build/importMetroFromProject.js.map +0 -1
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "SerialAsset", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _serializerAssets().SerialAsset;
10
+ }
11
+ });
12
+ exports.createSerializerFromSerialProcessors = createSerializerFromSerialProcessors;
13
+ exports.withExpoSerializers = withExpoSerializers;
14
+ exports.withSerializerPlugins = withSerializerPlugins;
15
+ function _baseJSBundle() {
16
+ const data = _interopRequireDefault(require("metro/src/DeltaBundler/Serializers/baseJSBundle"));
17
+ _baseJSBundle = function () {
18
+ return data;
19
+ };
20
+ return data;
21
+ }
22
+ function _bundleToString() {
23
+ const data = _interopRequireDefault(require("metro/src/lib/bundleToString"));
24
+ _bundleToString = function () {
25
+ return data;
26
+ };
27
+ return data;
28
+ }
29
+ function _env() {
30
+ const data = require("../env");
31
+ _env = function () {
32
+ return data;
33
+ };
34
+ return data;
35
+ }
36
+ function _environmentVariableSerializerPlugin() {
37
+ const data = require("./environmentVariableSerializerPlugin");
38
+ _environmentVariableSerializerPlugin = function () {
39
+ return data;
40
+ };
41
+ return data;
42
+ }
43
+ function _getCssDeps() {
44
+ const data = require("./getCssDeps");
45
+ _getCssDeps = function () {
46
+ return data;
47
+ };
48
+ return data;
49
+ }
50
+ function _serializerAssets() {
51
+ const data = require("./serializerAssets");
52
+ _serializerAssets = function () {
53
+ return data;
54
+ };
55
+ return data;
56
+ }
57
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
58
+ /**
59
+ * Copyright © 2022 650 Industries.
60
+ *
61
+ * This source code is licensed under the MIT license found in the
62
+ * LICENSE file in the root directory of this source tree.
63
+ */
64
+
65
+ function withExpoSerializers(config) {
66
+ const processors = [];
67
+ if (!_env().env.EXPO_NO_CLIENT_ENV_VARS) {
68
+ processors.push(_environmentVariableSerializerPlugin().environmentVariableSerializerPlugin);
69
+ }
70
+ return withSerializerPlugins(config, processors);
71
+ }
72
+
73
+ // There can only be one custom serializer as the input doesn't match the output.
74
+ // Here we simply run
75
+ function withSerializerPlugins(config, processors) {
76
+ var _config$serializer;
77
+ const originalSerializer = (_config$serializer = config.serializer) === null || _config$serializer === void 0 ? void 0 : _config$serializer.customSerializer;
78
+ return {
79
+ ...config,
80
+ serializer: {
81
+ ...config.serializer,
82
+ customSerializer: createSerializerFromSerialProcessors(processors, originalSerializer)
83
+ }
84
+ };
85
+ }
86
+ function getDefaultSerializer(fallbackSerializer) {
87
+ const defaultSerializer = fallbackSerializer !== null && fallbackSerializer !== void 0 ? fallbackSerializer : async (...params) => {
88
+ const bundle = (0, _baseJSBundle().default)(...params);
89
+ const outputCode = (0, _bundleToString().default)(bundle).code;
90
+ return outputCode;
91
+ };
92
+ return async (...props) => {
93
+ const [,, graph, options] = props;
94
+ const jsCode = await defaultSerializer(...props);
95
+ if (!options.sourceUrl) {
96
+ return jsCode;
97
+ }
98
+ const url = new URL(options.sourceUrl, 'https://expo.dev');
99
+ if (url.searchParams.get('platform') !== 'web' || url.searchParams.get('serializer.output') !== 'static') {
100
+ // Default behavior if `serializer.output=static` is not present in the URL.
101
+ return jsCode;
102
+ }
103
+ const cssDeps = (0, _getCssDeps().getCssSerialAssets)(graph.dependencies, {
104
+ projectRoot: options.projectRoot,
105
+ processModuleFilter: options.processModuleFilter
106
+ });
107
+ let jsAsset;
108
+ if (jsCode) {
109
+ const stringContents = typeof jsCode === 'string' ? jsCode : jsCode.code;
110
+ jsAsset = {
111
+ filename: options.dev ? 'index.js' : `_expo/static/js/web/${(0, _getCssDeps().fileNameFromContents)({
112
+ filepath: url.pathname,
113
+ src: stringContents
114
+ })}.js`,
115
+ originFilename: 'index.js',
116
+ type: 'js',
117
+ metadata: {},
118
+ source: stringContents
119
+ };
120
+ }
121
+ return JSON.stringify([jsAsset, ...cssDeps]);
122
+ };
123
+ }
124
+ function createSerializerFromSerialProcessors(processors, originalSerializer) {
125
+ const finalSerializer = getDefaultSerializer(originalSerializer);
126
+ return (...props) => {
127
+ for (const processor of processors) {
128
+ if (processor) {
129
+ props = processor(...props);
130
+ }
131
+ }
132
+ return finalSerializer(...props);
133
+ };
134
+ }
135
+ //# sourceMappingURL=withExpoSerializers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withExpoSerializers.js","names":["_baseJSBundle","data","_interopRequireDefault","require","_bundleToString","_env","_environmentVariableSerializerPlugin","_getCssDeps","_serializerAssets","obj","__esModule","default","withExpoSerializers","config","processors","env","EXPO_NO_CLIENT_ENV_VARS","push","environmentVariableSerializerPlugin","withSerializerPlugins","_config$serializer","originalSerializer","serializer","customSerializer","createSerializerFromSerialProcessors","getDefaultSerializer","fallbackSerializer","defaultSerializer","params","bundle","baseJSBundle","outputCode","bundleToString","code","props","graph","options","jsCode","sourceUrl","url","URL","searchParams","get","cssDeps","getCssSerialAssets","dependencies","projectRoot","processModuleFilter","jsAsset","stringContents","filename","dev","fileNameFromContents","filepath","pathname","src","originFilename","type","metadata","source","JSON","stringify","finalSerializer","processor"],"sources":["../../src/serializer/withExpoSerializers.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { MixedOutput } from 'metro';\nimport { InputConfigT, SerializerConfigT } from 'metro-config';\nimport baseJSBundle from 'metro/src/DeltaBundler/Serializers/baseJSBundle';\nimport bundleToString from 'metro/src/lib/bundleToString';\n\nimport { env } from '../env';\nimport { environmentVariableSerializerPlugin } from './environmentVariableSerializerPlugin';\nimport { fileNameFromContents, getCssSerialAssets } from './getCssDeps';\nimport { SerialAsset } from './serializerAssets';\n\nexport type Serializer = NonNullable<SerializerConfigT['customSerializer']>;\n\nexport type SerializerParameters = Parameters<Serializer>;\n\n// A serializer that processes the input and returns a modified version.\n// Unlike a serializer, these can be chained together.\nexport type SerializerPlugin = (...props: SerializerParameters) => SerializerParameters;\n\nexport function withExpoSerializers(config: InputConfigT): InputConfigT {\n const processors: SerializerPlugin[] = [];\n if (!env.EXPO_NO_CLIENT_ENV_VARS) {\n processors.push(environmentVariableSerializerPlugin);\n }\n\n return withSerializerPlugins(config, processors);\n}\n\n// There can only be one custom serializer as the input doesn't match the output.\n// Here we simply run\nexport function withSerializerPlugins(\n config: InputConfigT,\n processors: SerializerPlugin[]\n): InputConfigT {\n const originalSerializer = config.serializer?.customSerializer;\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n customSerializer: createSerializerFromSerialProcessors(processors, originalSerializer),\n },\n };\n}\n\nfunction getDefaultSerializer(fallbackSerializer?: Serializer | null): Serializer {\n const defaultSerializer =\n fallbackSerializer ??\n (async (...params: SerializerParameters) => {\n const bundle = baseJSBundle(...params);\n const outputCode = bundleToString(bundle).code;\n return outputCode;\n });\n return async (\n ...props: SerializerParameters\n ): Promise<string | { code: string; map: string }> => {\n const [, , graph, options] = props;\n const jsCode = await defaultSerializer(...props);\n\n if (!options.sourceUrl) {\n return jsCode;\n }\n const url = new URL(options.sourceUrl, 'https://expo.dev');\n if (\n url.searchParams.get('platform') !== 'web' ||\n url.searchParams.get('serializer.output') !== 'static'\n ) {\n // Default behavior if `serializer.output=static` is not present in the URL.\n return jsCode;\n }\n\n const cssDeps = getCssSerialAssets<MixedOutput>(graph.dependencies, {\n projectRoot: options.projectRoot,\n processModuleFilter: options.processModuleFilter,\n });\n\n let jsAsset: SerialAsset | undefined;\n\n if (jsCode) {\n const stringContents = typeof jsCode === 'string' ? jsCode : jsCode.code;\n jsAsset = {\n filename: options.dev\n ? 'index.js'\n : `_expo/static/js/web/${fileNameFromContents({\n filepath: url.pathname,\n src: stringContents,\n })}.js`,\n originFilename: 'index.js',\n type: 'js',\n metadata: {},\n source: stringContents,\n };\n }\n\n return JSON.stringify([jsAsset, ...cssDeps]);\n };\n}\n\nexport function createSerializerFromSerialProcessors(\n processors: (SerializerPlugin | undefined)[],\n originalSerializer?: Serializer | null\n): Serializer {\n const finalSerializer = getDefaultSerializer(originalSerializer);\n return (...props: SerializerParameters): ReturnType<Serializer> => {\n for (const processor of processors) {\n if (processor) {\n props = processor(...props);\n }\n }\n\n return finalSerializer(...props);\n };\n}\n\nexport { SerialAsset };\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /// <reference types="node" />
2
+ export declare function transformCssModuleWeb(props: {
3
+ filename: string;
4
+ src: string;
5
+ options: {
6
+ projectRoot: string;
7
+ minify: boolean;
8
+ dev: boolean;
9
+ sourceMap: boolean;
10
+ };
11
+ }): Promise<{
12
+ output: string;
13
+ css: Buffer;
14
+ map: void | Buffer;
15
+ }>;
16
+ export declare function convertLightningCssToReactNativeWebStyleSheet(input: import('lightningcss').CSSModuleExports): {
17
+ styles: Record<string, any>;
18
+ variables: Record<string, string>;
19
+ };
20
+ export declare function matchCssModule(filePath: string): boolean;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.convertLightningCssToReactNativeWebStyleSheet = convertLightningCssToReactNativeWebStyleSheet;
7
+ exports.matchCssModule = matchCssModule;
8
+ exports.transformCssModuleWeb = transformCssModuleWeb;
9
+ function _css() {
10
+ const data = require("./css");
11
+ _css = function () {
12
+ return data;
13
+ };
14
+ return data;
15
+ }
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
+ const RNW_CSS_CLASS_ID = '_';
19
+ async function transformCssModuleWeb(props) {
20
+ const {
21
+ transform
22
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require('lightningcss')));
23
+
24
+ // TODO: Add bundling to resolve imports
25
+ // https://lightningcss.dev/bundling.html#bundling-order
26
+
27
+ const cssResults = transform({
28
+ filename: props.filename,
29
+ code: Buffer.from(props.src),
30
+ sourceMap: props.options.sourceMap,
31
+ cssModules: {
32
+ // Prevent renaming CSS variables to ensure
33
+ // variables created in global files are available.
34
+ dashedIdents: false
35
+ },
36
+ // cssModules: true,
37
+ projectRoot: props.options.projectRoot,
38
+ minify: props.options.minify
39
+ });
40
+ const codeAsString = cssResults.code.toString();
41
+ const {
42
+ styles,
43
+ variables
44
+ } = convertLightningCssToReactNativeWebStyleSheet(cssResults.exports);
45
+ let outputModule = `module.exports=Object.assign(${JSON.stringify(styles)},${JSON.stringify(variables)});`;
46
+ if (props.options.dev) {
47
+ const runtimeCss = (0, _css().wrapDevelopmentCSS)({
48
+ ...props,
49
+ src: codeAsString
50
+ });
51
+ outputModule += '\n' + runtimeCss;
52
+ }
53
+ return {
54
+ output: outputModule,
55
+ css: cssResults.code,
56
+ map: cssResults.map
57
+ };
58
+ }
59
+ function convertLightningCssToReactNativeWebStyleSheet(input) {
60
+ const styles = {};
61
+ const variables = {};
62
+ // e.g. { container: { name: 'ahs8IW_container', composes: [], isReferenced: false }, }
63
+ Object.entries(input).map(([key, value]) => {
64
+ // order matters here
65
+ let className = value.name;
66
+ if (value.composes.length) {
67
+ className += ' ' + value.composes.map(value => value.name).join(' ');
68
+ }
69
+
70
+ // CSS Variables will be `{string: string}`
71
+ if (key.startsWith('--')) {
72
+ variables[key] = className;
73
+ }
74
+ styles[key] = {
75
+ $$css: true,
76
+ [RNW_CSS_CLASS_ID]: className
77
+ };
78
+ return {
79
+ [key]: {
80
+ $$css: true,
81
+ [RNW_CSS_CLASS_ID]: className
82
+ }
83
+ };
84
+ });
85
+ return {
86
+ styles,
87
+ variables
88
+ };
89
+ }
90
+ function matchCssModule(filePath) {
91
+ return !!/\.module(\.(native|ios|android|web))?\.(css|s[ac]ss)$/.test(filePath);
92
+ }
93
+ //# sourceMappingURL=css-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-modules.js","names":["_css","data","require","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RNW_CSS_CLASS_ID","transformCssModuleWeb","props","transform","Promise","resolve","then","cssResults","filename","code","Buffer","from","src","sourceMap","options","cssModules","dashedIdents","projectRoot","minify","codeAsString","toString","styles","variables","convertLightningCssToReactNativeWebStyleSheet","exports","outputModule","JSON","stringify","dev","runtimeCss","wrapDevelopmentCSS","output","css","map","input","entries","value","className","name","composes","length","join","startsWith","$$css","matchCssModule","filePath","test"],"sources":["../../src/transform-worker/css-modules.ts"],"sourcesContent":["import { wrapDevelopmentCSS } from './css';\n\nconst RNW_CSS_CLASS_ID = '_';\n\nexport async function transformCssModuleWeb(props: {\n filename: string;\n src: string;\n options: { projectRoot: string; minify: boolean; dev: boolean; sourceMap: boolean };\n}) {\n const { transform } = await import('lightningcss');\n\n // TODO: Add bundling to resolve imports\n // https://lightningcss.dev/bundling.html#bundling-order\n\n const cssResults = transform({\n filename: props.filename,\n code: Buffer.from(props.src),\n sourceMap: props.options.sourceMap,\n cssModules: {\n // Prevent renaming CSS variables to ensure\n // variables created in global files are available.\n dashedIdents: false,\n },\n // cssModules: true,\n projectRoot: props.options.projectRoot,\n minify: props.options.minify,\n });\n const codeAsString = cssResults.code.toString();\n\n const { styles, variables } = convertLightningCssToReactNativeWebStyleSheet(cssResults.exports!);\n\n let outputModule = `module.exports=Object.assign(${JSON.stringify(styles)},${JSON.stringify(\n variables\n )});`;\n\n if (props.options.dev) {\n const runtimeCss = wrapDevelopmentCSS({\n ...props,\n src: codeAsString,\n });\n\n outputModule += '\\n' + runtimeCss;\n }\n\n return {\n output: outputModule,\n css: cssResults.code,\n map: cssResults.map,\n };\n}\n\nexport function convertLightningCssToReactNativeWebStyleSheet(\n input: import('lightningcss').CSSModuleExports\n) {\n const styles: Record<string, any> = {};\n const variables: Record<string, string> = {};\n // e.g. { container: { name: 'ahs8IW_container', composes: [], isReferenced: false }, }\n Object.entries(input).map(([key, value]) => {\n // order matters here\n let className = value.name;\n\n if (value.composes.length) {\n className += ' ' + value.composes.map((value) => value.name).join(' ');\n }\n\n // CSS Variables will be `{string: string}`\n if (key.startsWith('--')) {\n variables[key] = className;\n }\n\n styles[key] = { $$css: true, [RNW_CSS_CLASS_ID]: className };\n return {\n [key]: { $$css: true, [RNW_CSS_CLASS_ID]: className },\n };\n });\n\n return { styles, variables };\n}\n\nexport function matchCssModule(filePath: string): boolean {\n return !!/\\.module(\\.(native|ios|android|web))?\\.(css|s[ac]ss)$/.test(filePath);\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function pathToHtmlSafeName(path: string): string;
2
+ export declare function getHotReplaceTemplate(id: string): string;
3
+ export declare function wrapDevelopmentCSS(props: {
4
+ src: string;
5
+ filename: string;
6
+ }): string;
7
+ export declare function escapeBackticksAndOctals(str: string): string;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.escapeBackticksAndOctals = escapeBackticksAndOctals;
7
+ exports.getHotReplaceTemplate = getHotReplaceTemplate;
8
+ exports.pathToHtmlSafeName = pathToHtmlSafeName;
9
+ exports.wrapDevelopmentCSS = wrapDevelopmentCSS;
10
+ function pathToHtmlSafeName(path) {
11
+ return path.replace(/[^a-zA-Z0-9_]/g, '_');
12
+ }
13
+ function getHotReplaceTemplate(id) {
14
+ // In dev mode, we need to replace the style tag instead of appending it
15
+ // use the path as the expo-css-hmr attribute to find the style tag
16
+ // to replace.
17
+ const attr = JSON.stringify(pathToHtmlSafeName(id));
18
+ return `style.setAttribute('data-expo-css-hmr', ${attr});
19
+ const previousStyle = document.querySelector('[data-expo-css-hmr=${attr}]');
20
+ if (previousStyle) {
21
+ previousStyle.parentNode.removeChild(previousStyle);
22
+ }`;
23
+ }
24
+ function wrapDevelopmentCSS(props) {
25
+ const withBackTicksEscaped = escapeBackticksAndOctals(props.src);
26
+ return `(() => {
27
+ if (typeof document === 'undefined') {
28
+ return
29
+ }
30
+ const head = document.head || document.getElementsByTagName('head')[0];
31
+ const style = document.createElement('style');
32
+ ${getHotReplaceTemplate(props.filename)}
33
+ style.setAttribute('data-expo-loader', 'css');
34
+ head.appendChild(style);
35
+ const css = \`${withBackTicksEscaped}\`;
36
+ if (style.styleSheet){
37
+ style.styleSheet.cssText = css;
38
+ } else {
39
+ style.appendChild(document.createTextNode(css));
40
+ }
41
+ })();`;
42
+ }
43
+ function escapeBackticksAndOctals(str) {
44
+ if (typeof str !== 'string') {
45
+ return '';
46
+ }
47
+ return str.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/[\0-\7]/g, match => `\\0${match.charCodeAt(0).toString(8)}`);
48
+ }
49
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","names":["pathToHtmlSafeName","path","replace","getHotReplaceTemplate","id","attr","JSON","stringify","wrapDevelopmentCSS","props","withBackTicksEscaped","escapeBackticksAndOctals","src","filename","str","match","charCodeAt","toString"],"sources":["../../src/transform-worker/css.ts"],"sourcesContent":["export function pathToHtmlSafeName(path: string) {\n return path.replace(/[^a-zA-Z0-9_]/g, '_');\n}\n\nexport function getHotReplaceTemplate(id: string) {\n // In dev mode, we need to replace the style tag instead of appending it\n // use the path as the expo-css-hmr attribute to find the style tag\n // to replace.\n const attr = JSON.stringify(pathToHtmlSafeName(id));\n return `style.setAttribute('data-expo-css-hmr', ${attr});\n const previousStyle = document.querySelector('[data-expo-css-hmr=${attr}]');\n if (previousStyle) {\n previousStyle.parentNode.removeChild(previousStyle);\n }`;\n}\n\nexport function wrapDevelopmentCSS(props: { src: string; filename: string }) {\n const withBackTicksEscaped = escapeBackticksAndOctals(props.src);\n return `(() => {\n if (typeof document === 'undefined') {\n return\n }\n const head = document.head || document.getElementsByTagName('head')[0];\n const style = document.createElement('style');\n ${getHotReplaceTemplate(props.filename)}\n style.setAttribute('data-expo-loader', 'css');\n head.appendChild(style);\n const css = \\`${withBackTicksEscaped}\\`;\n if (style.styleSheet){\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n})();`;\n}\n\nexport function escapeBackticksAndOctals(str: string) {\n if (typeof str !== 'string') {\n return '';\n }\n\n return str\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/[\\0-\\7]/g, (match) => `\\\\0${match.charCodeAt(0).toString(8)}`);\n}\n"],"mappings":";;;;;;;;;AAAO,SAASA,kBAAkBA,CAACC,IAAY,EAAE;EAC/C,OAAOA,IAAI,CAACC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;AAC5C;AAEO,SAASC,qBAAqBA,CAACC,EAAU,EAAE;EAChD;EACA;EACA;EACA,MAAMC,IAAI,GAAGC,IAAI,CAACC,SAAS,CAACP,kBAAkB,CAACI,EAAE,CAAC,CAAC;EACnD,OAAQ,2CAA0CC,IAAK;AACzD,qEAAqEA,IAAK;AAC1E;AACA;AACA,IAAI;AACJ;AAEO,SAASG,kBAAkBA,CAACC,KAAwC,EAAE;EAC3E,MAAMC,oBAAoB,GAAGC,wBAAwB,CAACF,KAAK,CAACG,GAAG,CAAC;EAChE,OAAQ;AACV;AACA;AACA;AACA;AACA;AACA,IAAIT,qBAAqB,CAACM,KAAK,CAACI,QAAQ,CAAE;AAC1C;AACA;AACA,kBAAkBH,oBAAqB;AACvC;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AAEO,SAASC,wBAAwBA,CAACG,GAAW,EAAE;EACpD,IAAI,OAAOA,GAAG,KAAK,QAAQ,EAAE;IAC3B,OAAO,EAAE;EACX;EAEA,OAAOA,GAAG,CACPZ,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CACtBA,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CACpBA,OAAO,CAAC,UAAU,EAAGa,KAAK,IAAM,MAAKA,KAAK,CAACC,UAAU,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAAE,EAAC,CAAC;AAC5E"}
@@ -0,0 +1,17 @@
1
+ type PostCSSInputConfig = {
2
+ plugins?: any[];
3
+ from?: string;
4
+ to?: string;
5
+ syntax?: string;
6
+ map?: boolean;
7
+ parser?: string;
8
+ stringifier?: string;
9
+ };
10
+ export declare function transformPostCssModule(projectRoot: string, { src, filename }: {
11
+ src: string;
12
+ filename: string;
13
+ }): Promise<string>;
14
+ export declare function pluginFactory(): (plugins?: any) => Map<string, any>;
15
+ export declare function resolvePostcssConfig(projectRoot: string): PostCSSInputConfig | null;
16
+ export declare function getPostcssConfigHash(projectRoot: string): string | null;
17
+ export {};
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getPostcssConfigHash = getPostcssConfigHash;
7
+ exports.pluginFactory = pluginFactory;
8
+ exports.resolvePostcssConfig = resolvePostcssConfig;
9
+ exports.transformPostCssModule = transformPostCssModule;
10
+ function _jsonFile() {
11
+ const data = _interopRequireDefault(require("@expo/json-file"));
12
+ _jsonFile = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ function _fs() {
18
+ const data = _interopRequireDefault(require("fs"));
19
+ _fs = function () {
20
+ return data;
21
+ };
22
+ return data;
23
+ }
24
+ function _path() {
25
+ const data = _interopRequireDefault(require("path"));
26
+ _path = function () {
27
+ return data;
28
+ };
29
+ return data;
30
+ }
31
+ function _resolveFrom() {
32
+ const data = _interopRequireDefault(require("resolve-from"));
33
+ _resolveFrom = function () {
34
+ return data;
35
+ };
36
+ return data;
37
+ }
38
+ function _require() {
39
+ const data = require("./utils/require");
40
+ _require = function () {
41
+ return data;
42
+ };
43
+ return data;
44
+ }
45
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
46
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
48
+ const CONFIG_FILE_NAME = 'postcss.config';
49
+ const debug = require('debug')('expo:metro:transformer:postcss');
50
+ async function transformPostCssModule(projectRoot, {
51
+ src,
52
+ filename
53
+ }) {
54
+ const inputConfig = resolvePostcssConfig(projectRoot);
55
+ if (!inputConfig) {
56
+ return src;
57
+ }
58
+ return await processWithPostcssInputConfigAsync(projectRoot, {
59
+ inputConfig,
60
+ src,
61
+ filename
62
+ });
63
+ }
64
+ async function processWithPostcssInputConfigAsync(projectRoot, {
65
+ src,
66
+ filename,
67
+ inputConfig
68
+ }) {
69
+ const {
70
+ plugins,
71
+ processOptions
72
+ } = await parsePostcssConfigAsync(projectRoot, {
73
+ config: inputConfig,
74
+ resourcePath: filename
75
+ });
76
+ debug('options:', processOptions);
77
+ debug('plugins:', plugins);
78
+
79
+ // TODO: Surely this can be cached...
80
+ const postcss = await Promise.resolve().then(() => _interopRequireWildcard(require('postcss')));
81
+ const processor = postcss.default(plugins);
82
+ const {
83
+ content
84
+ } = await processor.process(src, processOptions);
85
+ return content;
86
+ }
87
+ async function parsePostcssConfigAsync(projectRoot, {
88
+ resourcePath: file,
89
+ config: {
90
+ plugins: inputPlugins,
91
+ map,
92
+ parser,
93
+ stringifier,
94
+ syntax,
95
+ ...config
96
+ } = {}
97
+ }) {
98
+ const factory = pluginFactory();
99
+ factory(inputPlugins);
100
+ // delete config.plugins;
101
+
102
+ const plugins = [...factory()].map(item => {
103
+ const [plugin, options] = item;
104
+ if (typeof plugin === 'string') {
105
+ return loadPlugin(projectRoot, plugin, options, file);
106
+ }
107
+ return plugin;
108
+ });
109
+ if (config.from) {
110
+ config.from = _path().default.resolve(projectRoot, config.from);
111
+ }
112
+ if (config.to) {
113
+ config.to = _path().default.resolve(projectRoot, config.to);
114
+ }
115
+ const processOptions = {
116
+ from: file,
117
+ to: file,
118
+ map: false
119
+ };
120
+ if (typeof parser === 'string') {
121
+ try {
122
+ var _resolveFrom$silent;
123
+ processOptions.parser = await (0, _require().tryRequireThenImport)((_resolveFrom$silent = _resolveFrom().default.silent(projectRoot, parser)) !== null && _resolveFrom$silent !== void 0 ? _resolveFrom$silent : parser);
124
+ } catch (error) {
125
+ if (error instanceof Error) {
126
+ throw new Error(`Loading PostCSS "${parser}" parser failed: ${error.message}\n\n(@${file})`);
127
+ }
128
+ throw error;
129
+ }
130
+ }
131
+ if (typeof stringifier === 'string') {
132
+ try {
133
+ var _resolveFrom$silent2;
134
+ processOptions.stringifier = await (0, _require().tryRequireThenImport)((_resolveFrom$silent2 = _resolveFrom().default.silent(projectRoot, stringifier)) !== null && _resolveFrom$silent2 !== void 0 ? _resolveFrom$silent2 : stringifier);
135
+ } catch (error) {
136
+ if (error instanceof Error) {
137
+ throw new Error(`Loading PostCSS "${stringifier}" stringifier failed: ${error.message}\n\n(@${file})`);
138
+ }
139
+ throw error;
140
+ }
141
+ }
142
+ if (typeof syntax === 'string') {
143
+ try {
144
+ var _resolveFrom$silent3;
145
+ processOptions.syntax = await (0, _require().tryRequireThenImport)((_resolveFrom$silent3 = _resolveFrom().default.silent(projectRoot, syntax)) !== null && _resolveFrom$silent3 !== void 0 ? _resolveFrom$silent3 : syntax);
146
+ } catch (error) {
147
+ throw new Error(`Loading PostCSS "${syntax}" syntax failed: ${error.message}\n\n(@${file})`);
148
+ }
149
+ }
150
+ if (map === true) {
151
+ // https://github.com/postcss/postcss/blob/master/docs/source-maps.md
152
+ processOptions.map = {
153
+ inline: true
154
+ };
155
+ }
156
+ return {
157
+ plugins,
158
+ processOptions
159
+ };
160
+ }
161
+ function loadPlugin(projectRoot, plugin, options, file) {
162
+ try {
163
+ debug('load plugin:', plugin);
164
+
165
+ // e.g. `tailwindcss`
166
+ let loadedPlugin = require((0, _resolveFrom().default)(projectRoot, plugin));
167
+ if (loadedPlugin.default) {
168
+ loadedPlugin = loadedPlugin.default;
169
+ }
170
+ if (!options || !Object.keys(options).length) {
171
+ return loadedPlugin;
172
+ }
173
+ return loadedPlugin(options);
174
+ } catch (error) {
175
+ if (error instanceof Error) {
176
+ throw new Error(`Loading PostCSS "${plugin}" plugin failed: ${error.message}\n\n(@${file})`);
177
+ }
178
+ throw error;
179
+ }
180
+ }
181
+ function pluginFactory() {
182
+ const listOfPlugins = new Map();
183
+ return plugins => {
184
+ if (typeof plugins === 'undefined') {
185
+ return listOfPlugins;
186
+ }
187
+ if (Array.isArray(plugins)) {
188
+ for (const plugin of plugins) {
189
+ if (Array.isArray(plugin)) {
190
+ const [name, options] = plugin;
191
+ if (typeof name !== 'string') {
192
+ throw new Error(`PostCSS plugin must be a string, but "${name}" was found. Please check your configuration.`);
193
+ }
194
+ listOfPlugins.set(name, options);
195
+ } else if (plugin && typeof plugin === 'function') {
196
+ listOfPlugins.set(plugin, undefined);
197
+ } else if (plugin && Object.keys(plugin).length === 1 && (typeof plugin[Object.keys(plugin)[0]] === 'object' || typeof plugin[Object.keys(plugin)[0]] === 'boolean') && plugin[Object.keys(plugin)[0]] !== null) {
198
+ const [name] = Object.keys(plugin);
199
+ const options = plugin[name];
200
+ if (options === false) {
201
+ listOfPlugins.delete(name);
202
+ } else {
203
+ listOfPlugins.set(name, options);
204
+ }
205
+ } else if (plugin) {
206
+ listOfPlugins.set(plugin, undefined);
207
+ }
208
+ }
209
+ } else {
210
+ const objectPlugins = Object.entries(plugins);
211
+ for (const [name, options] of objectPlugins) {
212
+ if (options === false) {
213
+ listOfPlugins.delete(name);
214
+ } else {
215
+ listOfPlugins.set(name, options);
216
+ }
217
+ }
218
+ }
219
+ return listOfPlugins;
220
+ };
221
+ }
222
+ function resolvePostcssConfig(projectRoot) {
223
+ // TODO: Maybe support platform-specific postcss config files in the future.
224
+ const jsConfigPath = _path().default.join(projectRoot, CONFIG_FILE_NAME + '.js');
225
+ if (_fs().default.existsSync(jsConfigPath)) {
226
+ debug('load file:', jsConfigPath);
227
+ return (0, _require().requireUncachedFile)(jsConfigPath);
228
+ }
229
+ const jsonConfigPath = _path().default.join(projectRoot, CONFIG_FILE_NAME + '.json');
230
+ if (_fs().default.existsSync(jsonConfigPath)) {
231
+ debug('load file:', jsonConfigPath);
232
+ return _jsonFile().default.read(jsonConfigPath, {
233
+ json5: true
234
+ });
235
+ }
236
+ return null;
237
+ }
238
+ function getPostcssConfigHash(projectRoot) {
239
+ // TODO: Maybe recurse plugins and add versions to the hash in the future.
240
+ const {
241
+ stableHash
242
+ } = require('metro-cache');
243
+ const jsConfigPath = _path().default.join(projectRoot, CONFIG_FILE_NAME + '.js');
244
+ if (_fs().default.existsSync(jsConfigPath)) {
245
+ return stableHash(_fs().default.readFileSync(jsConfigPath, 'utf8')).toString('hex');
246
+ }
247
+ const jsonConfigPath = _path().default.join(projectRoot, CONFIG_FILE_NAME + '.json');
248
+ if (_fs().default.existsSync(jsonConfigPath)) {
249
+ return stableHash(_fs().default.readFileSync(jsonConfigPath, 'utf8')).toString('hex');
250
+ }
251
+ return null;
252
+ }
253
+ //# sourceMappingURL=postcss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postcss.js","names":["_jsonFile","data","_interopRequireDefault","require","_fs","_path","_resolveFrom","_require","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","CONFIG_FILE_NAME","debug","transformPostCssModule","projectRoot","src","filename","inputConfig","resolvePostcssConfig","processWithPostcssInputConfigAsync","plugins","processOptions","parsePostcssConfigAsync","config","resourcePath","postcss","Promise","resolve","then","processor","content","process","file","inputPlugins","map","parser","stringifier","syntax","factory","pluginFactory","item","plugin","options","loadPlugin","from","path","to","_resolveFrom$silent","tryRequireThenImport","resolveFrom","silent","error","Error","message","_resolveFrom$silent2","_resolveFrom$silent3","inline","loadedPlugin","keys","length","listOfPlugins","Map","Array","isArray","name","undefined","delete","objectPlugins","entries","jsConfigPath","join","fs","existsSync","requireUncachedFile","jsonConfigPath","JsonFile","read","json5","getPostcssConfigHash","stableHash","readFileSync","toString"],"sources":["../../src/transform-worker/postcss.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n * Copyright JS Foundation and other contributors\n *\n * https://github.com/webpack-contrib/postcss-loader/\n */\nimport JsonFile from '@expo/json-file';\nimport fs from 'fs';\nimport path from 'path';\nimport type { AcceptedPlugin, ProcessOptions } from 'postcss';\nimport resolveFrom from 'resolve-from';\n\nimport { requireUncachedFile, tryRequireThenImport } from './utils/require';\n\ntype PostCSSInputConfig = {\n plugins?: any[];\n from?: string;\n to?: string;\n syntax?: string;\n map?: boolean;\n parser?: string;\n stringifier?: string;\n};\n\nconst CONFIG_FILE_NAME = 'postcss.config';\n\nconst debug = require('debug')('expo:metro:transformer:postcss');\n\nexport async function transformPostCssModule(\n projectRoot: string,\n { src, filename }: { src: string; filename: string }\n): Promise<string> {\n const inputConfig = resolvePostcssConfig(projectRoot);\n\n if (!inputConfig) {\n return src;\n }\n\n return await processWithPostcssInputConfigAsync(projectRoot, {\n inputConfig,\n src,\n filename,\n });\n}\n\nasync function processWithPostcssInputConfigAsync(\n projectRoot: string,\n { src, filename, inputConfig }: { src: string; filename: string; inputConfig: PostCSSInputConfig }\n) {\n const { plugins, processOptions } = await parsePostcssConfigAsync(projectRoot, {\n config: inputConfig,\n resourcePath: filename,\n });\n\n debug('options:', processOptions);\n debug('plugins:', plugins);\n\n // TODO: Surely this can be cached...\n const postcss = await import('postcss');\n const processor = postcss.default(plugins);\n const { content } = await processor.process(src, processOptions);\n\n return content;\n}\n\nasync function parsePostcssConfigAsync(\n projectRoot: string,\n {\n resourcePath: file,\n config: { plugins: inputPlugins, map, parser, stringifier, syntax, ...config } = {},\n }: {\n resourcePath: string;\n config: PostCSSInputConfig;\n }\n): Promise<{ plugins: AcceptedPlugin[]; processOptions: ProcessOptions }> {\n const factory = pluginFactory();\n\n factory(inputPlugins);\n // delete config.plugins;\n\n const plugins = [...factory()].map((item) => {\n const [plugin, options] = item;\n\n if (typeof plugin === 'string') {\n return loadPlugin(projectRoot, plugin, options, file);\n }\n\n return plugin;\n });\n\n if (config.from) {\n config.from = path.resolve(projectRoot, config.from);\n }\n\n if (config.to) {\n config.to = path.resolve(projectRoot, config.to);\n }\n\n const processOptions: Partial<ProcessOptions> = {\n from: file,\n to: file,\n map: false,\n };\n\n if (typeof parser === 'string') {\n try {\n processOptions.parser = await tryRequireThenImport(\n resolveFrom.silent(projectRoot, parser) ?? parser\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(\n `Loading PostCSS \"${parser}\" parser failed: ${error.message}\\n\\n(@${file})`\n );\n }\n throw error;\n }\n }\n\n if (typeof stringifier === 'string') {\n try {\n processOptions.stringifier = await tryRequireThenImport(\n resolveFrom.silent(projectRoot, stringifier) ?? stringifier\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(\n `Loading PostCSS \"${stringifier}\" stringifier failed: ${error.message}\\n\\n(@${file})`\n );\n }\n throw error;\n }\n }\n\n if (typeof syntax === 'string') {\n try {\n processOptions.syntax = await tryRequireThenImport(\n resolveFrom.silent(projectRoot, syntax) ?? syntax\n );\n } catch (error: any) {\n throw new Error(`Loading PostCSS \"${syntax}\" syntax failed: ${error.message}\\n\\n(@${file})`);\n }\n }\n\n if (map === true) {\n // https://github.com/postcss/postcss/blob/master/docs/source-maps.md\n processOptions.map = { inline: true };\n }\n\n return { plugins, processOptions };\n}\n\nfunction loadPlugin(projectRoot: string, plugin: string, options: unknown, file: string) {\n try {\n debug('load plugin:', plugin);\n\n // e.g. `tailwindcss`\n let loadedPlugin = require(resolveFrom(projectRoot, plugin));\n\n if (loadedPlugin.default) {\n loadedPlugin = loadedPlugin.default;\n }\n\n if (!options || !Object.keys(options).length) {\n return loadedPlugin;\n }\n\n return loadedPlugin(options);\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Loading PostCSS \"${plugin}\" plugin failed: ${error.message}\\n\\n(@${file})`);\n }\n throw error;\n }\n}\n\nexport function pluginFactory() {\n const listOfPlugins = new Map<string, any>();\n\n return (plugins?: any) => {\n if (typeof plugins === 'undefined') {\n return listOfPlugins;\n }\n\n if (Array.isArray(plugins)) {\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n const [name, options] = plugin;\n\n if (typeof name !== 'string') {\n throw new Error(\n `PostCSS plugin must be a string, but \"${name}\" was found. Please check your configuration.`\n );\n }\n\n listOfPlugins.set(name, options);\n } else if (plugin && typeof plugin === 'function') {\n listOfPlugins.set(plugin, undefined);\n } else if (\n plugin &&\n Object.keys(plugin).length === 1 &&\n (typeof plugin[Object.keys(plugin)[0]] === 'object' ||\n typeof plugin[Object.keys(plugin)[0]] === 'boolean') &&\n plugin[Object.keys(plugin)[0]] !== null\n ) {\n const [name] = Object.keys(plugin);\n const options = plugin[name];\n\n if (options === false) {\n listOfPlugins.delete(name);\n } else {\n listOfPlugins.set(name, options);\n }\n } else if (plugin) {\n listOfPlugins.set(plugin, undefined);\n }\n }\n } else {\n const objectPlugins = Object.entries(plugins);\n\n for (const [name, options] of objectPlugins) {\n if (options === false) {\n listOfPlugins.delete(name);\n } else {\n listOfPlugins.set(name, options);\n }\n }\n }\n\n return listOfPlugins;\n };\n}\n\nexport function resolvePostcssConfig(projectRoot: string): PostCSSInputConfig | null {\n // TODO: Maybe support platform-specific postcss config files in the future.\n const jsConfigPath = path.join(projectRoot, CONFIG_FILE_NAME + '.js');\n\n if (fs.existsSync(jsConfigPath)) {\n debug('load file:', jsConfigPath);\n return requireUncachedFile(jsConfigPath);\n }\n\n const jsonConfigPath = path.join(projectRoot, CONFIG_FILE_NAME + '.json');\n\n if (fs.existsSync(jsonConfigPath)) {\n debug('load file:', jsonConfigPath);\n return JsonFile.read(jsonConfigPath, { json5: true });\n }\n\n return null;\n}\n\nexport function getPostcssConfigHash(projectRoot: string): string | null {\n // TODO: Maybe recurse plugins and add versions to the hash in the future.\n const { stableHash } = require('metro-cache');\n\n const jsConfigPath = path.join(projectRoot, CONFIG_FILE_NAME + '.js');\n if (fs.existsSync(jsConfigPath)) {\n return stableHash(fs.readFileSync(jsConfigPath, 'utf8')).toString('hex');\n }\n\n const jsonConfigPath = path.join(projectRoot, CONFIG_FILE_NAME + '.json');\n if (fs.existsSync(jsonConfigPath)) {\n return stableHash(fs.readFileSync(jsonConfigPath, 'utf8')).toString('hex');\n }\n return null;\n}\n"],"mappings":";;;;;;;;;AAMA,SAAAA,UAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,SAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,IAAA;EAAA,MAAAH,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAC,GAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAI,MAAA;EAAA,MAAAJ,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAE,KAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAK,aAAA;EAAA,MAAAL,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAG,YAAA,YAAAA,CAAA;IAAA,OAAAL,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEA,SAAAM,SAAA;EAAA,MAAAN,IAAA,GAAAE,OAAA;EAAAI,QAAA,YAAAA,CAAA;IAAA,OAAAN,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAA4E,SAAAC,uBAAAM,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAAA,SAAAG,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAI,wBAAAR,GAAA,EAAAI,WAAA,SAAAA,WAAA,IAAAJ,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAS,KAAA,GAAAN,wBAAA,CAAAC,WAAA,OAAAK,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAV,GAAA,YAAAS,KAAA,CAAAE,GAAA,CAAAX,GAAA,SAAAY,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAjB,GAAA,QAAAiB,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAApB,GAAA,EAAAiB,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAhB,GAAA,EAAAiB,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAjB,GAAA,CAAAiB,GAAA,SAAAL,MAAA,CAAAV,OAAA,GAAAF,GAAA,MAAAS,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAtB,GAAA,EAAAY,MAAA,YAAAA,MAAA;AAY5E,MAAMW,gBAAgB,GAAG,gBAAgB;AAEzC,MAAMC,KAAK,GAAG7B,OAAO,CAAC,OAAO,CAAC,CAAC,gCAAgC,CAAC;AAEzD,eAAe8B,sBAAsBA,CAC1CC,WAAmB,EACnB;EAAEC,GAAG;EAAEC;AAA4C,CAAC,EACnC;EACjB,MAAMC,WAAW,GAAGC,oBAAoB,CAACJ,WAAW,CAAC;EAErD,IAAI,CAACG,WAAW,EAAE;IAChB,OAAOF,GAAG;EACZ;EAEA,OAAO,MAAMI,kCAAkC,CAACL,WAAW,EAAE;IAC3DG,WAAW;IACXF,GAAG;IACHC;EACF,CAAC,CAAC;AACJ;AAEA,eAAeG,kCAAkCA,CAC/CL,WAAmB,EACnB;EAAEC,GAAG;EAAEC,QAAQ;EAAEC;AAAgF,CAAC,EAClG;EACA,MAAM;IAAEG,OAAO;IAAEC;EAAe,CAAC,GAAG,MAAMC,uBAAuB,CAACR,WAAW,EAAE;IAC7ES,MAAM,EAAEN,WAAW;IACnBO,YAAY,EAAER;EAChB,CAAC,CAAC;EAEFJ,KAAK,CAAC,UAAU,EAAES,cAAc,CAAC;EACjCT,KAAK,CAAC,UAAU,EAAEQ,OAAO,CAAC;;EAE1B;EACA,MAAMK,OAAO,GAAG,MAAAC,OAAA,CAAAC,OAAA,GAAAC,IAAA,OAAAhC,uBAAA,CAAAb,OAAA,CAAa,SAAS,GAAC;EACvC,MAAM8C,SAAS,GAAGJ,OAAO,CAACnC,OAAO,CAAC8B,OAAO,CAAC;EAC1C,MAAM;IAAEU;EAAQ,CAAC,GAAG,MAAMD,SAAS,CAACE,OAAO,CAAChB,GAAG,EAAEM,cAAc,CAAC;EAEhE,OAAOS,OAAO;AAChB;AAEA,eAAeR,uBAAuBA,CACpCR,WAAmB,EACnB;EACEU,YAAY,EAAEQ,IAAI;EAClBT,MAAM,EAAE;IAAEH,OAAO,EAAEa,YAAY;IAAEC,GAAG;IAAEC,MAAM;IAAEC,WAAW;IAAEC,MAAM;IAAE,GAAGd;EAAO,CAAC,GAAG,CAAC;AAIpF,CAAC,EACuE;EACxE,MAAMe,OAAO,GAAGC,aAAa,EAAE;EAE/BD,OAAO,CAACL,YAAY,CAAC;EACrB;;EAEA,MAAMb,OAAO,GAAG,CAAC,GAAGkB,OAAO,EAAE,CAAC,CAACJ,GAAG,CAAEM,IAAI,IAAK;IAC3C,MAAM,CAACC,MAAM,EAAEC,OAAO,CAAC,GAAGF,IAAI;IAE9B,IAAI,OAAOC,MAAM,KAAK,QAAQ,EAAE;MAC9B,OAAOE,UAAU,CAAC7B,WAAW,EAAE2B,MAAM,EAAEC,OAAO,EAAEV,IAAI,CAAC;IACvD;IAEA,OAAOS,MAAM;EACf,CAAC,CAAC;EAEF,IAAIlB,MAAM,CAACqB,IAAI,EAAE;IACfrB,MAAM,CAACqB,IAAI,GAAGC,eAAI,CAAClB,OAAO,CAACb,WAAW,EAAES,MAAM,CAACqB,IAAI,CAAC;EACtD;EAEA,IAAIrB,MAAM,CAACuB,EAAE,EAAE;IACbvB,MAAM,CAACuB,EAAE,GAAGD,eAAI,CAAClB,OAAO,CAACb,WAAW,EAAES,MAAM,CAACuB,EAAE,CAAC;EAClD;EAEA,MAAMzB,cAAuC,GAAG;IAC9CuB,IAAI,EAAEZ,IAAI;IACVc,EAAE,EAAEd,IAAI;IACRE,GAAG,EAAE;EACP,CAAC;EAED,IAAI,OAAOC,MAAM,KAAK,QAAQ,EAAE;IAC9B,IAAI;MAAA,IAAAY,mBAAA;MACF1B,cAAc,CAACc,MAAM,GAAG,MAAM,IAAAa,+BAAoB,GAAAD,mBAAA,GAChDE,sBAAW,CAACC,MAAM,CAACpC,WAAW,EAAEqB,MAAM,CAAC,cAAAY,mBAAA,cAAAA,mBAAA,GAAIZ,MAAM,CAClD;IACH,CAAC,CAAC,OAAOgB,KAAc,EAAE;MACvB,IAAIA,KAAK,YAAYC,KAAK,EAAE;QAC1B,MAAM,IAAIA,KAAK,CACZ,oBAAmBjB,MAAO,oBAAmBgB,KAAK,CAACE,OAAQ,SAAQrB,IAAK,GAAE,CAC5E;MACH;MACA,MAAMmB,KAAK;IACb;EACF;EAEA,IAAI,OAAOf,WAAW,KAAK,QAAQ,EAAE;IACnC,IAAI;MAAA,IAAAkB,oBAAA;MACFjC,cAAc,CAACe,WAAW,GAAG,MAAM,IAAAY,+BAAoB,GAAAM,oBAAA,GACrDL,sBAAW,CAACC,MAAM,CAACpC,WAAW,EAAEsB,WAAW,CAAC,cAAAkB,oBAAA,cAAAA,oBAAA,GAAIlB,WAAW,CAC5D;IACH,CAAC,CAAC,OAAOe,KAAc,EAAE;MACvB,IAAIA,KAAK,YAAYC,KAAK,EAAE;QAC1B,MAAM,IAAIA,KAAK,CACZ,oBAAmBhB,WAAY,yBAAwBe,KAAK,CAACE,OAAQ,SAAQrB,IAAK,GAAE,CACtF;MACH;MACA,MAAMmB,KAAK;IACb;EACF;EAEA,IAAI,OAAOd,MAAM,KAAK,QAAQ,EAAE;IAC9B,IAAI;MAAA,IAAAkB,oBAAA;MACFlC,cAAc,CAACgB,MAAM,GAAG,MAAM,IAAAW,+BAAoB,GAAAO,oBAAA,GAChDN,sBAAW,CAACC,MAAM,CAACpC,WAAW,EAAEuB,MAAM,CAAC,cAAAkB,oBAAA,cAAAA,oBAAA,GAAIlB,MAAM,CAClD;IACH,CAAC,CAAC,OAAOc,KAAU,EAAE;MACnB,MAAM,IAAIC,KAAK,CAAE,oBAAmBf,MAAO,oBAAmBc,KAAK,CAACE,OAAQ,SAAQrB,IAAK,GAAE,CAAC;IAC9F;EACF;EAEA,IAAIE,GAAG,KAAK,IAAI,EAAE;IAChB;IACAb,cAAc,CAACa,GAAG,GAAG;MAAEsB,MAAM,EAAE;IAAK,CAAC;EACvC;EAEA,OAAO;IAAEpC,OAAO;IAAEC;EAAe,CAAC;AACpC;AAEA,SAASsB,UAAUA,CAAC7B,WAAmB,EAAE2B,MAAc,EAAEC,OAAgB,EAAEV,IAAY,EAAE;EACvF,IAAI;IACFpB,KAAK,CAAC,cAAc,EAAE6B,MAAM,CAAC;;IAE7B;IACA,IAAIgB,YAAY,GAAG1E,OAAO,CAAC,IAAAkE,sBAAW,EAACnC,WAAW,EAAE2B,MAAM,CAAC,CAAC;IAE5D,IAAIgB,YAAY,CAACnE,OAAO,EAAE;MACxBmE,YAAY,GAAGA,YAAY,CAACnE,OAAO;IACrC;IAEA,IAAI,CAACoD,OAAO,IAAI,CAACxC,MAAM,CAACwD,IAAI,CAAChB,OAAO,CAAC,CAACiB,MAAM,EAAE;MAC5C,OAAOF,YAAY;IACrB;IAEA,OAAOA,YAAY,CAACf,OAAO,CAAC;EAC9B,CAAC,CAAC,OAAOS,KAAc,EAAE;IACvB,IAAIA,KAAK,YAAYC,KAAK,EAAE;MAC1B,MAAM,IAAIA,KAAK,CAAE,oBAAmBX,MAAO,oBAAmBU,KAAK,CAACE,OAAQ,SAAQrB,IAAK,GAAE,CAAC;IAC9F;IACA,MAAMmB,KAAK;EACb;AACF;AAEO,SAASZ,aAAaA,CAAA,EAAG;EAC9B,MAAMqB,aAAa,GAAG,IAAIC,GAAG,EAAe;EAE5C,OAAQzC,OAAa,IAAK;IACxB,IAAI,OAAOA,OAAO,KAAK,WAAW,EAAE;MAClC,OAAOwC,aAAa;IACtB;IAEA,IAAIE,KAAK,CAACC,OAAO,CAAC3C,OAAO,CAAC,EAAE;MAC1B,KAAK,MAAMqB,MAAM,IAAIrB,OAAO,EAAE;QAC5B,IAAI0C,KAAK,CAACC,OAAO,CAACtB,MAAM,CAAC,EAAE;UACzB,MAAM,CAACuB,IAAI,EAAEtB,OAAO,CAAC,GAAGD,MAAM;UAE9B,IAAI,OAAOuB,IAAI,KAAK,QAAQ,EAAE;YAC5B,MAAM,IAAIZ,KAAK,CACZ,yCAAwCY,IAAK,+CAA8C,CAC7F;UACH;UAEAJ,aAAa,CAAClD,GAAG,CAACsD,IAAI,EAAEtB,OAAO,CAAC;QAClC,CAAC,MAAM,IAAID,MAAM,IAAI,OAAOA,MAAM,KAAK,UAAU,EAAE;UACjDmB,aAAa,CAAClD,GAAG,CAAC+B,MAAM,EAAEwB,SAAS,CAAC;QACtC,CAAC,MAAM,IACLxB,MAAM,IACNvC,MAAM,CAACwD,IAAI,CAACjB,MAAM,CAAC,CAACkB,MAAM,KAAK,CAAC,KAC/B,OAAOlB,MAAM,CAACvC,MAAM,CAACwD,IAAI,CAACjB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,IACjD,OAAOA,MAAM,CAACvC,MAAM,CAACwD,IAAI,CAACjB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IACtDA,MAAM,CAACvC,MAAM,CAACwD,IAAI,CAACjB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EACvC;UACA,MAAM,CAACuB,IAAI,CAAC,GAAG9D,MAAM,CAACwD,IAAI,CAACjB,MAAM,CAAC;UAClC,MAAMC,OAAO,GAAGD,MAAM,CAACuB,IAAI,CAAC;UAE5B,IAAItB,OAAO,KAAK,KAAK,EAAE;YACrBkB,aAAa,CAACM,MAAM,CAACF,IAAI,CAAC;UAC5B,CAAC,MAAM;YACLJ,aAAa,CAAClD,GAAG,CAACsD,IAAI,EAAEtB,OAAO,CAAC;UAClC;QACF,CAAC,MAAM,IAAID,MAAM,EAAE;UACjBmB,aAAa,CAAClD,GAAG,CAAC+B,MAAM,EAAEwB,SAAS,CAAC;QACtC;MACF;IACF,CAAC,MAAM;MACL,MAAME,aAAa,GAAGjE,MAAM,CAACkE,OAAO,CAAChD,OAAO,CAAC;MAE7C,KAAK,MAAM,CAAC4C,IAAI,EAAEtB,OAAO,CAAC,IAAIyB,aAAa,EAAE;QAC3C,IAAIzB,OAAO,KAAK,KAAK,EAAE;UACrBkB,aAAa,CAACM,MAAM,CAACF,IAAI,CAAC;QAC5B,CAAC,MAAM;UACLJ,aAAa,CAAClD,GAAG,CAACsD,IAAI,EAAEtB,OAAO,CAAC;QAClC;MACF;IACF;IAEA,OAAOkB,aAAa;EACtB,CAAC;AACH;AAEO,SAAS1C,oBAAoBA,CAACJ,WAAmB,EAA6B;EACnF;EACA,MAAMuD,YAAY,GAAGxB,eAAI,CAACyB,IAAI,CAACxD,WAAW,EAAEH,gBAAgB,GAAG,KAAK,CAAC;EAErE,IAAI4D,aAAE,CAACC,UAAU,CAACH,YAAY,CAAC,EAAE;IAC/BzD,KAAK,CAAC,YAAY,EAAEyD,YAAY,CAAC;IACjC,OAAO,IAAAI,8BAAmB,EAACJ,YAAY,CAAC;EAC1C;EAEA,MAAMK,cAAc,GAAG7B,eAAI,CAACyB,IAAI,CAACxD,WAAW,EAAEH,gBAAgB,GAAG,OAAO,CAAC;EAEzE,IAAI4D,aAAE,CAACC,UAAU,CAACE,cAAc,CAAC,EAAE;IACjC9D,KAAK,CAAC,YAAY,EAAE8D,cAAc,CAAC;IACnC,OAAOC,mBAAQ,CAACC,IAAI,CAACF,cAAc,EAAE;MAAEG,KAAK,EAAE;IAAK,CAAC,CAAC;EACvD;EAEA,OAAO,IAAI;AACb;AAEO,SAASC,oBAAoBA,CAAChE,WAAmB,EAAiB;EACvE;EACA,MAAM;IAAEiE;EAAW,CAAC,GAAGhG,OAAO,CAAC,aAAa,CAAC;EAE7C,MAAMsF,YAAY,GAAGxB,eAAI,CAACyB,IAAI,CAACxD,WAAW,EAAEH,gBAAgB,GAAG,KAAK,CAAC;EACrE,IAAI4D,aAAE,CAACC,UAAU,CAACH,YAAY,CAAC,EAAE;IAC/B,OAAOU,UAAU,CAACR,aAAE,CAACS,YAAY,CAACX,YAAY,EAAE,MAAM,CAAC,CAAC,CAACY,QAAQ,CAAC,KAAK,CAAC;EAC1E;EAEA,MAAMP,cAAc,GAAG7B,eAAI,CAACyB,IAAI,CAACxD,WAAW,EAAEH,gBAAgB,GAAG,OAAO,CAAC;EACzE,IAAI4D,aAAE,CAACC,UAAU,CAACE,cAAc,CAAC,EAAE;IACjC,OAAOK,UAAU,CAACR,aAAE,CAACS,YAAY,CAACN,cAAc,EAAE,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC,KAAK,CAAC;EAC5E;EACA,OAAO,IAAI;AACb"}