@expo/metro-config 0.12.0 → 0.13.1

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.
@@ -65,7 +65,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
65
65
  * LICENSE file in the root directory of this source tree.
66
66
  */
67
67
  // A fork of the upstream babel-transformer that uses Expo-specific babel defaults
68
- // and adds support for web and Node.js environments via `metroTarget` on the Babel caller.
68
+ // and adds support for web and Node.js environments via `isServer` on the Babel caller.
69
69
 
70
70
  // @ts-expect-error
71
71
 
@@ -243,8 +243,7 @@ const transform = ({
243
243
  platform: options.platform,
244
244
  // Empower the babel preset to know the env it's bundling for.
245
245
  // Metro automatically updates the cache to account for the custom transform options.
246
- // client | node | undefined
247
- metroTarget: (_options$customTransf = options.customTransformOptions) === null || _options$customTransf === void 0 ? void 0 : _options$customTransf.environment
246
+ isServer: ((_options$customTransf = options.customTransformOptions) === null || _options$customTransf === void 0 ? void 0 : _options$customTransf.environment) === 'node'
248
247
  },
249
248
  ast: true,
250
249
  // NOTE(EvanBacon): We split the parse/transform steps up to accommodate
@@ -1 +1 @@
1
- {"version":3,"file":"babel-transformer.js","names":["_inlineRequires","data","_interopRequireDefault","require","_hmr","_nodeAssert","_nodeCrypto","_nodeFs","_nodePath","_resolveFrom","_babelCore","obj","__esModule","default","cacheKeyParts","fs","readFileSync","__filename","version","isTypeScriptSource","fileName","endsWith","isTSXSource","babelPresetExpo","getBabelPresetExpo","projectRoot","_resolveFrom$silent","undefined","resolveFrom","silent","getBabelRC","babelRC","_getBabelRC","extendsBabelConfigPath","options","plugins","extends","projectBabelRCPath","path","resolve","existsSync","experimentalImportSupport","presetOptions","platformOptions","unstable_transformProfile","withDevTools","disableImportExportTransform","dev","enableBabelRuntime","presets","web","native","buildBabelConfig","filename","extraConfig","babelrc","enableBabelRCLookup","code","cwd","highlightCode","config","extraPlugins","inlineRequires","push","inlineRequiresPlugin","concat","withExtraPlugins","hot","mayContainEditableReactComponents","includes","hmrConfig","makeHMRConfig","transform","src","_getBabelPresetExpo","OLD_BABEL_ENV","process","env","BABEL_ENV","_options$customTransf","babelConfig","sourceType","caller","name","bundler","platform","metroTarget","customTransformOptions","environment","ast","cloneInputAst","sourceAst","hermesParser","parseSync","parse","babel","result","transformFromAstSync","assert","metadata","getCacheKey","key","crypto","createHash","forEach","part","update","digest","babelTransformer","module","exports"],"sources":["../src/babel-transformer.ts"],"sourcesContent":["/**\n * Copyright (c) 650 Industries (Expo). All rights reserved.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\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 */\n// A fork of the upstream babel-transformer that uses Expo-specific babel defaults\n// and adds support for web and Node.js environments via `metroTarget` on the Babel caller.\n\n// @ts-expect-error\nimport inlineRequiresPlugin from 'babel-preset-fbjs/plugins/inline-requires';\nimport type { BabelTransformer, BabelTransformerArgs } from 'metro-babel-transformer';\n// @ts-expect-error\nimport makeHMRConfig from 'metro-react-native-babel-preset/src/configs/hmr';\nimport assert from 'node:assert';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport resolveFrom from 'resolve-from';\n\nimport {\n parseSync,\n type PluginItem,\n type TransformOptions,\n transformFromAstSync,\n} from './babel-core';\n\nconst cacheKeyParts = [\n fs.readFileSync(__filename),\n require('babel-preset-fbjs/package.json').version,\n];\n\n// TS detection conditions copied from metro-react-native-babel-preset\nfunction isTypeScriptSource(fileName: string): boolean {\n return !!fileName && fileName.endsWith('.ts');\n}\n\nfunction isTSXSource(fileName: string): boolean {\n return !!fileName && fileName.endsWith('.tsx');\n}\n\nlet babelPresetExpo: string | null | undefined = null;\n\nfunction getBabelPresetExpo(projectRoot: string): string | null {\n if (babelPresetExpo !== undefined) {\n return babelPresetExpo;\n }\n\n babelPresetExpo = resolveFrom.silent(projectRoot, 'babel-preset-expo') ?? null;\n return babelPresetExpo;\n}\n\n/**\n * Return a memoized function that checks for the existence of a\n * project level .babelrc file, and if it doesn't exist, reads the\n * default RN babelrc file and uses that.\n */\nconst getBabelRC = (function () {\n let babelRC: TransformOptions | null /*: ?BabelCoreOptions */ = null;\n\n /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's\n * LTI update could not be added via codemod */\n return function _getBabelRC({\n projectRoot,\n extendsBabelConfigPath,\n ...options\n }: BabelTransformerArgs['options']) {\n if (babelRC != null) {\n return babelRC;\n }\n\n babelRC = {\n plugins: [],\n extends: extendsBabelConfigPath,\n };\n\n if (extendsBabelConfigPath) {\n return babelRC;\n }\n\n // Let's look for a babel config file in the project root.\n let projectBabelRCPath;\n\n // .babelrc\n if (projectRoot) {\n projectBabelRCPath = path.resolve(projectRoot, '.babelrc');\n }\n\n if (projectBabelRCPath) {\n // .babelrc.js\n if (!fs.existsSync(projectBabelRCPath)) {\n projectBabelRCPath = path.resolve(projectRoot, '.babelrc.js');\n }\n\n // babel.config.js\n if (!fs.existsSync(projectBabelRCPath)) {\n projectBabelRCPath = path.resolve(projectRoot, 'babel.config.js');\n }\n\n // If we found a babel config file, extend our config off of it\n // otherwise the default config will be used\n if (fs.existsSync(projectBabelRCPath)) {\n babelRC.extends = projectBabelRCPath;\n }\n }\n\n // If a babel config file doesn't exist in the project then\n // the default preset for react-native will be used instead.\n if (!babelRC.extends) {\n const { experimentalImportSupport, ...presetOptions } = options;\n\n // Convert the options into the format expected by the Expo preset.\n const platformOptions = {\n // @ts-expect-error: This is how Metro works by default\n unstable_transformProfile: presetOptions.unstable_transformProfile,\n // @ts-expect-error: This is how Metro works by default\n withDevTools: presetOptions.withDevTools,\n disableImportExportTransform: experimentalImportSupport,\n dev: presetOptions.dev,\n enableBabelRuntime: presetOptions.enableBabelRuntime,\n };\n\n babelRC.presets = [\n [\n // NOTE(EvanBacon): Here we use the Expo babel wrapper instead of the default react-native preset.\n require('babel-preset-expo'),\n {\n web: platformOptions,\n native: platformOptions,\n // lazyImports: presetOptions.lazyImportExportTransform,\n },\n ],\n ];\n }\n\n return babelRC;\n };\n})();\n\n/**\n * Given a filename and options, build a Babel\n * config object with the appropriate plugins.\n */\nfunction buildBabelConfig(\n filename: string,\n options: BabelTransformerArgs['options'],\n plugins: PluginItem[] = []\n): TransformOptions {\n const babelRC = getBabelRC(options);\n\n const extraConfig: TransformOptions = {\n babelrc: typeof options.enableBabelRCLookup === 'boolean' ? options.enableBabelRCLookup : true,\n code: false,\n cwd: options.projectRoot,\n filename,\n highlightCode: true,\n };\n\n let config: TransformOptions = {\n ...babelRC,\n ...extraConfig,\n };\n\n // Add extra plugins\n const extraPlugins = [];\n\n if (options.inlineRequires) {\n extraPlugins.push(inlineRequiresPlugin);\n }\n\n config.plugins = extraPlugins.concat(config.plugins, plugins);\n\n const withExtraPlugins = config.plugins;\n\n if (options.dev && options.hot) {\n // Note: this intentionally doesn't include the path separator because\n // I'm not sure which one it should use on Windows, and false positives\n // are unlikely anyway. If you later decide to include the separator,\n // don't forget that the string usually *starts* with \"node_modules\" so\n // the first one often won't be there.\n const mayContainEditableReactComponents = !filename.includes('node_modules');\n\n if (mayContainEditableReactComponents) {\n const hmrConfig = makeHMRConfig();\n hmrConfig.plugins = withExtraPlugins.concat(hmrConfig.plugins);\n config = { ...config, ...hmrConfig };\n }\n }\n\n return {\n ...babelRC,\n ...config,\n };\n}\n\nconst transform: BabelTransformer['transform'] = ({\n filename,\n options,\n src,\n plugins,\n}: BabelTransformerArgs): ReturnType<BabelTransformer['transform']> => {\n const OLD_BABEL_ENV = process.env.BABEL_ENV;\n process.env.BABEL_ENV = options.dev ? 'development' : process.env.BABEL_ENV || 'production';\n\n // Ensure the default babel preset is Expo.\n options.extendsBabelConfigPath = getBabelPresetExpo(options.projectRoot) ?? undefined;\n\n try {\n const babelConfig: TransformOptions = {\n // ES modules require sourceType='module' but OSS may not always want that\n sourceType: 'unambiguous',\n ...buildBabelConfig(filename, options, plugins),\n caller: {\n name: 'metro',\n // @ts-expect-error: Custom values passed to the caller.\n bundler: 'metro',\n platform: options.platform,\n // Empower the babel preset to know the env it's bundling for.\n // Metro automatically updates the cache to account for the custom transform options.\n // client | node | undefined\n metroTarget: options.customTransformOptions?.environment,\n },\n ast: true,\n\n // NOTE(EvanBacon): We split the parse/transform steps up to accommodate\n // Hermes parsing, but this defaults to cloning the AST which increases\n // the transformation time by a fair amount.\n // You get this behavior by default when using Babel's `transform` method directly.\n cloneInputAst: false,\n };\n const sourceAst =\n isTypeScriptSource(filename) || isTSXSource(filename) || !options.hermesParser\n ? parseSync(src, babelConfig)\n : require('hermes-parser').parse(src, {\n babel: true,\n sourceType: babelConfig.sourceType,\n });\n\n const result = transformFromAstSync(sourceAst, src, babelConfig);\n\n // The result from `transformFromAstSync` can be null (if the file is ignored)\n if (!result) {\n // BabelTransformer specifies that the `ast` can never be null but\n // the function returns here. Discovered when typing `BabelNode`.\n return { ast: null };\n }\n\n assert(result.ast);\n return { ast: result.ast, metadata: result.metadata };\n } finally {\n if (OLD_BABEL_ENV) {\n process.env.BABEL_ENV = OLD_BABEL_ENV;\n }\n }\n};\n\nfunction getCacheKey() {\n const key = crypto.createHash('md5');\n cacheKeyParts.forEach((part) => key.update(part));\n return key.digest('hex');\n}\n\nconst babelTransformer: BabelTransformer = {\n transform,\n getCacheKey,\n};\n\nmodule.exports = babelTransformer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"babel-transformer.js","names":["_inlineRequires","data","_interopRequireDefault","require","_hmr","_nodeAssert","_nodeCrypto","_nodeFs","_nodePath","_resolveFrom","_babelCore","obj","__esModule","default","cacheKeyParts","fs","readFileSync","__filename","version","isTypeScriptSource","fileName","endsWith","isTSXSource","babelPresetExpo","getBabelPresetExpo","projectRoot","_resolveFrom$silent","undefined","resolveFrom","silent","getBabelRC","babelRC","_getBabelRC","extendsBabelConfigPath","options","plugins","extends","projectBabelRCPath","path","resolve","existsSync","experimentalImportSupport","presetOptions","platformOptions","unstable_transformProfile","withDevTools","disableImportExportTransform","dev","enableBabelRuntime","presets","web","native","buildBabelConfig","filename","extraConfig","babelrc","enableBabelRCLookup","code","cwd","highlightCode","config","extraPlugins","inlineRequires","push","inlineRequiresPlugin","concat","withExtraPlugins","hot","mayContainEditableReactComponents","includes","hmrConfig","makeHMRConfig","transform","src","_getBabelPresetExpo","OLD_BABEL_ENV","process","env","BABEL_ENV","_options$customTransf","babelConfig","sourceType","caller","name","bundler","platform","isServer","customTransformOptions","environment","ast","cloneInputAst","sourceAst","hermesParser","parseSync","parse","babel","result","transformFromAstSync","assert","metadata","getCacheKey","key","crypto","createHash","forEach","part","update","digest","babelTransformer","module","exports"],"sources":["../src/babel-transformer.ts"],"sourcesContent":["/**\n * Copyright (c) 650 Industries (Expo). All rights reserved.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\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 */\n// A fork of the upstream babel-transformer that uses Expo-specific babel defaults\n// and adds support for web and Node.js environments via `isServer` on the Babel caller.\n\n// @ts-expect-error\nimport inlineRequiresPlugin from 'babel-preset-fbjs/plugins/inline-requires';\nimport type { BabelTransformer, BabelTransformerArgs } from 'metro-babel-transformer';\n// @ts-expect-error\nimport makeHMRConfig from 'metro-react-native-babel-preset/src/configs/hmr';\nimport assert from 'node:assert';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport resolveFrom from 'resolve-from';\n\nimport {\n parseSync,\n type PluginItem,\n type TransformOptions,\n transformFromAstSync,\n} from './babel-core';\n\nconst cacheKeyParts = [\n fs.readFileSync(__filename),\n require('babel-preset-fbjs/package.json').version,\n];\n\n// TS detection conditions copied from metro-react-native-babel-preset\nfunction isTypeScriptSource(fileName: string): boolean {\n return !!fileName && fileName.endsWith('.ts');\n}\n\nfunction isTSXSource(fileName: string): boolean {\n return !!fileName && fileName.endsWith('.tsx');\n}\n\nlet babelPresetExpo: string | null | undefined = null;\n\nfunction getBabelPresetExpo(projectRoot: string): string | null {\n if (babelPresetExpo !== undefined) {\n return babelPresetExpo;\n }\n\n babelPresetExpo = resolveFrom.silent(projectRoot, 'babel-preset-expo') ?? null;\n return babelPresetExpo;\n}\n\n/**\n * Return a memoized function that checks for the existence of a\n * project level .babelrc file, and if it doesn't exist, reads the\n * default RN babelrc file and uses that.\n */\nconst getBabelRC = (function () {\n let babelRC: TransformOptions | null /*: ?BabelCoreOptions */ = null;\n\n /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's\n * LTI update could not be added via codemod */\n return function _getBabelRC({\n projectRoot,\n extendsBabelConfigPath,\n ...options\n }: BabelTransformerArgs['options']) {\n if (babelRC != null) {\n return babelRC;\n }\n\n babelRC = {\n plugins: [],\n extends: extendsBabelConfigPath,\n };\n\n if (extendsBabelConfigPath) {\n return babelRC;\n }\n\n // Let's look for a babel config file in the project root.\n let projectBabelRCPath;\n\n // .babelrc\n if (projectRoot) {\n projectBabelRCPath = path.resolve(projectRoot, '.babelrc');\n }\n\n if (projectBabelRCPath) {\n // .babelrc.js\n if (!fs.existsSync(projectBabelRCPath)) {\n projectBabelRCPath = path.resolve(projectRoot, '.babelrc.js');\n }\n\n // babel.config.js\n if (!fs.existsSync(projectBabelRCPath)) {\n projectBabelRCPath = path.resolve(projectRoot, 'babel.config.js');\n }\n\n // If we found a babel config file, extend our config off of it\n // otherwise the default config will be used\n if (fs.existsSync(projectBabelRCPath)) {\n babelRC.extends = projectBabelRCPath;\n }\n }\n\n // If a babel config file doesn't exist in the project then\n // the default preset for react-native will be used instead.\n if (!babelRC.extends) {\n const { experimentalImportSupport, ...presetOptions } = options;\n\n // Convert the options into the format expected by the Expo preset.\n const platformOptions = {\n // @ts-expect-error: This is how Metro works by default\n unstable_transformProfile: presetOptions.unstable_transformProfile,\n // @ts-expect-error: This is how Metro works by default\n withDevTools: presetOptions.withDevTools,\n disableImportExportTransform: experimentalImportSupport,\n dev: presetOptions.dev,\n enableBabelRuntime: presetOptions.enableBabelRuntime,\n };\n\n babelRC.presets = [\n [\n // NOTE(EvanBacon): Here we use the Expo babel wrapper instead of the default react-native preset.\n require('babel-preset-expo'),\n {\n web: platformOptions,\n native: platformOptions,\n // lazyImports: presetOptions.lazyImportExportTransform,\n },\n ],\n ];\n }\n\n return babelRC;\n };\n})();\n\n/**\n * Given a filename and options, build a Babel\n * config object with the appropriate plugins.\n */\nfunction buildBabelConfig(\n filename: string,\n options: BabelTransformerArgs['options'],\n plugins: PluginItem[] = []\n): TransformOptions {\n const babelRC = getBabelRC(options);\n\n const extraConfig: TransformOptions = {\n babelrc: typeof options.enableBabelRCLookup === 'boolean' ? options.enableBabelRCLookup : true,\n code: false,\n cwd: options.projectRoot,\n filename,\n highlightCode: true,\n };\n\n let config: TransformOptions = {\n ...babelRC,\n ...extraConfig,\n };\n\n // Add extra plugins\n const extraPlugins = [];\n\n if (options.inlineRequires) {\n extraPlugins.push(inlineRequiresPlugin);\n }\n\n config.plugins = extraPlugins.concat(config.plugins, plugins);\n\n const withExtraPlugins = config.plugins;\n\n if (options.dev && options.hot) {\n // Note: this intentionally doesn't include the path separator because\n // I'm not sure which one it should use on Windows, and false positives\n // are unlikely anyway. If you later decide to include the separator,\n // don't forget that the string usually *starts* with \"node_modules\" so\n // the first one often won't be there.\n const mayContainEditableReactComponents = !filename.includes('node_modules');\n\n if (mayContainEditableReactComponents) {\n const hmrConfig = makeHMRConfig();\n hmrConfig.plugins = withExtraPlugins.concat(hmrConfig.plugins);\n config = { ...config, ...hmrConfig };\n }\n }\n\n return {\n ...babelRC,\n ...config,\n };\n}\n\nconst transform: BabelTransformer['transform'] = ({\n filename,\n options,\n src,\n plugins,\n}: BabelTransformerArgs): ReturnType<BabelTransformer['transform']> => {\n const OLD_BABEL_ENV = process.env.BABEL_ENV;\n process.env.BABEL_ENV = options.dev ? 'development' : process.env.BABEL_ENV || 'production';\n\n // Ensure the default babel preset is Expo.\n options.extendsBabelConfigPath = getBabelPresetExpo(options.projectRoot) ?? undefined;\n\n try {\n const babelConfig: TransformOptions = {\n // ES modules require sourceType='module' but OSS may not always want that\n sourceType: 'unambiguous',\n ...buildBabelConfig(filename, options, plugins),\n caller: {\n name: 'metro',\n // @ts-expect-error: Custom values passed to the caller.\n bundler: 'metro',\n platform: options.platform,\n // Empower the babel preset to know the env it's bundling for.\n // Metro automatically updates the cache to account for the custom transform options.\n isServer: options.customTransformOptions?.environment === 'node',\n },\n ast: true,\n\n // NOTE(EvanBacon): We split the parse/transform steps up to accommodate\n // Hermes parsing, but this defaults to cloning the AST which increases\n // the transformation time by a fair amount.\n // You get this behavior by default when using Babel's `transform` method directly.\n cloneInputAst: false,\n };\n const sourceAst =\n isTypeScriptSource(filename) || isTSXSource(filename) || !options.hermesParser\n ? parseSync(src, babelConfig)\n : require('hermes-parser').parse(src, {\n babel: true,\n sourceType: babelConfig.sourceType,\n });\n\n const result = transformFromAstSync(sourceAst, src, babelConfig);\n\n // The result from `transformFromAstSync` can be null (if the file is ignored)\n if (!result) {\n // BabelTransformer specifies that the `ast` can never be null but\n // the function returns here. Discovered when typing `BabelNode`.\n return { ast: null };\n }\n\n assert(result.ast);\n return { ast: result.ast, metadata: result.metadata };\n } finally {\n if (OLD_BABEL_ENV) {\n process.env.BABEL_ENV = OLD_BABEL_ENV;\n }\n }\n};\n\nfunction getCacheKey() {\n const key = crypto.createHash('md5');\n cacheKeyParts.forEach((part) => key.update(part));\n return key.digest('hex');\n}\n\nconst babelTransformer: BabelTransformer = {\n transform,\n getCacheKey,\n};\n\nmodule.exports = babelTransformer;\n"],"mappings":"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"}
@@ -36,8 +36,10 @@ const INTERNAL_CALLSITES_REGEX = new RegExp(['/Libraries/Renderer/implementation
36
36
  `\\[native code\\]`,
37
37
  // Hide react-dom (web)
38
38
  'node_modules/react-dom/.+\\.js$',
39
+ // Hide node.js evaluation code
40
+ 'node_modules/require-from-string/.+\\.js$',
39
41
  // Block expo's metro-runtime
40
- '@expo/metro-runtime/build/.+\\.js$',
42
+ '@expo/metro-runtime/.+\\.ts',
41
43
  // Block upstream metro-runtime
42
44
  '/metro-runtime/.+\\.js$'].join('|'));
43
45
  exports.INTERNAL_CALLSITES_REGEX = INTERNAL_CALLSITES_REGEX;
@@ -1 +1 @@
1
- {"version":3,"file":"customizeFrame.js","names":["_url","data","require","INTERNAL_CALLSITES_REGEX","RegExp","join","exports","isUrl","value","URL","getDefaultCustomizeFrame","frame","file","lineNumber","column","collapse","Boolean","test","_frame$file","methodName","match"],"sources":["../src/customizeFrame.ts"],"sourcesContent":["// Copyright 2023-present 650 Industries (Expo). All rights reserved.\nimport { SymbolicatorConfigT } from 'metro-config';\nimport { URL } from 'url';\n\ntype CustomizeFrameFunc = SymbolicatorConfigT['customizeFrame'];\n\n// Import only the types here, the values will be imported from the project, at runtime.\nexport const INTERNAL_CALLSITES_REGEX = new RegExp(\n [\n '/Libraries/Renderer/implementations/.+\\\\.js$',\n '/Libraries/BatchedBridge/MessageQueue\\\\.js$',\n '/Libraries/YellowBox/.+\\\\.js$',\n '/Libraries/LogBox/.+\\\\.js$',\n '/Libraries/Core/Timers/.+\\\\.js$',\n 'node_modules/react-devtools-core/.+\\\\.js$',\n 'node_modules/react-refresh/.+\\\\.js$',\n 'node_modules/scheduler/.+\\\\.js$',\n // Metro replaces `require()` with a different method,\n // we want to omit this method from the stack trace.\n // This is akin to most React tooling.\n '/metro/.*/polyfills/require.js$',\n // Hide frames related to a fast refresh.\n '/metro/.*/lib/bundle-modules/.+\\\\.js$',\n 'node_modules/react-native/Libraries/Utilities/HMRClient.js$',\n 'node_modules/eventemitter3/index.js',\n 'node_modules/event-target-shim/dist/.+\\\\.js$',\n // Improve errors thrown by invariant (ex: `Invariant Violation: \"main\" has not been registered`).\n 'node_modules/invariant/.+\\\\.js$',\n // Remove babel runtime additions\n 'node_modules/regenerator-runtime/.+\\\\.js$',\n // Remove react native setImmediate ponyfill\n 'node_modules/promise/setimmediate/.+\\\\.js$',\n // Babel helpers that implement language features\n 'node_modules/@babel/runtime/.+\\\\.js$',\n // Hide Hermes internal bytecode\n '/InternalBytecode/InternalBytecode\\\\.js$',\n // Block native code invocations\n `\\\\[native code\\\\]`,\n // Hide react-dom (web)\n 'node_modules/react-dom/.+\\\\.js$',\n // Block expo's metro-runtime\n '@expo/metro-runtime/build/.+\\\\.js$',\n // Block upstream metro-runtime\n '/metro-runtime/.+\\\\.js$',\n ].join('|')\n);\n\nfunction isUrl(value: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * The default frame processor. This is used to modify the stack traces.\n * This method attempts to collapse all frames that aren't relevant to\n * the user by default.\n */\nexport function getDefaultCustomizeFrame(): CustomizeFrameFunc {\n return (frame: Parameters<CustomizeFrameFunc>[0]) => {\n if (frame.file && isUrl(frame.file)) {\n return {\n ...frame,\n // HACK: This prevents Metro from attempting to read the invalid file URL it sent us.\n lineNumber: null,\n column: null,\n // This prevents the invalid frame from being shown by default.\n collapse: true,\n };\n }\n let collapse = Boolean(frame.file && INTERNAL_CALLSITES_REGEX.test(frame.file));\n\n if (!collapse) {\n // This represents the first frame of the stacktrace.\n // Often this looks like: `__r(0);`.\n // The URL will also be unactionable in the app and therefore not very useful to the developer.\n if (\n frame.column === 3 &&\n frame.methodName === 'global code' &&\n frame.file?.match(/^https?:\\/\\//g)\n ) {\n collapse = true;\n }\n }\n\n return { ...(frame || {}), collapse };\n };\n}\n"],"mappings":";;;;;;;AAEA,SAAAA,KAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,IAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAFA;;AAMA;AACO,MAAME,wBAAwB,GAAG,IAAIC,MAAM,CAChD,CACE,8CAA8C,EAC9C,6CAA6C,EAC7C,+BAA+B,EAC/B,4BAA4B,EAC5B,iCAAiC,EACjC,2CAA2C,EAC3C,qCAAqC,EACrC,iCAAiC;AACjC;AACA;AACA;AACA,iCAAiC;AACjC;AACA,uCAAuC,EACvC,6DAA6D,EAC7D,qCAAqC,EACrC,8CAA8C;AAC9C;AACA,iCAAiC;AACjC;AACA,2CAA2C;AAC3C;AACA,4CAA4C;AAC5C;AACA,sCAAsC;AACtC;AACA,0CAA0C;AAC1C;AACC,mBAAkB;AACnB;AACA,iCAAiC;AACjC;AACA,oCAAoC;AACpC;AACA,yBAAyB,CAC1B,CAACC,IAAI,CAAC,GAAG,CAAC,CACZ;AAACC,OAAA,CAAAH,wBAAA,GAAAA,wBAAA;AAEF,SAASI,KAAKA,CAACC,KAAa,EAAW;EACrC,IAAI;IACF;IACA,KAAIC,UAAG,EAACD,KAAK,CAAC;IACd,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,wBAAwBA,CAAA,EAAuB;EAC7D,OAAQC,KAAwC,IAAK;IACnD,IAAIA,KAAK,CAACC,IAAI,IAAIL,KAAK,CAACI,KAAK,CAACC,IAAI,CAAC,EAAE;MACnC,OAAO;QACL,GAAGD,KAAK;QACR;QACAE,UAAU,EAAE,IAAI;QAChBC,MAAM,EAAE,IAAI;QACZ;QACAC,QAAQ,EAAE;MACZ,CAAC;IACH;IACA,IAAIA,QAAQ,GAAGC,OAAO,CAACL,KAAK,CAACC,IAAI,IAAIT,wBAAwB,CAACc,IAAI,CAACN,KAAK,CAACC,IAAI,CAAC,CAAC;IAE/E,IAAI,CAACG,QAAQ,EAAE;MAAA,IAAAG,WAAA;MACb;MACA;MACA;MACA,IACEP,KAAK,CAACG,MAAM,KAAK,CAAC,IAClBH,KAAK,CAACQ,UAAU,KAAK,aAAa,KAAAD,WAAA,GAClCP,KAAK,CAACC,IAAI,cAAAM,WAAA,eAAVA,WAAA,CAAYE,KAAK,CAAC,eAAe,CAAC,EAClC;QACAL,QAAQ,GAAG,IAAI;MACjB;IACF;IAEA,OAAO;MAAE,IAAIJ,KAAK,IAAI,CAAC,CAAC,CAAC;MAAEI;IAAS,CAAC;EACvC,CAAC;AACH"}
1
+ {"version":3,"file":"customizeFrame.js","names":["_url","data","require","INTERNAL_CALLSITES_REGEX","RegExp","join","exports","isUrl","value","URL","getDefaultCustomizeFrame","frame","file","lineNumber","column","collapse","Boolean","test","_frame$file","methodName","match"],"sources":["../src/customizeFrame.ts"],"sourcesContent":["// Copyright 2023-present 650 Industries (Expo). All rights reserved.\nimport { SymbolicatorConfigT } from 'metro-config';\nimport { URL } from 'url';\n\ntype CustomizeFrameFunc = SymbolicatorConfigT['customizeFrame'];\n\n// Import only the types here, the values will be imported from the project, at runtime.\nexport const INTERNAL_CALLSITES_REGEX = new RegExp(\n [\n '/Libraries/Renderer/implementations/.+\\\\.js$',\n '/Libraries/BatchedBridge/MessageQueue\\\\.js$',\n '/Libraries/YellowBox/.+\\\\.js$',\n '/Libraries/LogBox/.+\\\\.js$',\n '/Libraries/Core/Timers/.+\\\\.js$',\n 'node_modules/react-devtools-core/.+\\\\.js$',\n 'node_modules/react-refresh/.+\\\\.js$',\n 'node_modules/scheduler/.+\\\\.js$',\n // Metro replaces `require()` with a different method,\n // we want to omit this method from the stack trace.\n // This is akin to most React tooling.\n '/metro/.*/polyfills/require.js$',\n // Hide frames related to a fast refresh.\n '/metro/.*/lib/bundle-modules/.+\\\\.js$',\n 'node_modules/react-native/Libraries/Utilities/HMRClient.js$',\n 'node_modules/eventemitter3/index.js',\n 'node_modules/event-target-shim/dist/.+\\\\.js$',\n // Improve errors thrown by invariant (ex: `Invariant Violation: \"main\" has not been registered`).\n 'node_modules/invariant/.+\\\\.js$',\n // Remove babel runtime additions\n 'node_modules/regenerator-runtime/.+\\\\.js$',\n // Remove react native setImmediate ponyfill\n 'node_modules/promise/setimmediate/.+\\\\.js$',\n // Babel helpers that implement language features\n 'node_modules/@babel/runtime/.+\\\\.js$',\n // Hide Hermes internal bytecode\n '/InternalBytecode/InternalBytecode\\\\.js$',\n // Block native code invocations\n `\\\\[native code\\\\]`,\n // Hide react-dom (web)\n 'node_modules/react-dom/.+\\\\.js$',\n // Hide node.js evaluation code\n 'node_modules/require-from-string/.+\\\\.js$',\n // Block expo's metro-runtime\n '@expo/metro-runtime/.+\\\\.ts',\n // Block upstream metro-runtime\n '/metro-runtime/.+\\\\.js$',\n ].join('|')\n);\n\nfunction isUrl(value: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * The default frame processor. This is used to modify the stack traces.\n * This method attempts to collapse all frames that aren't relevant to\n * the user by default.\n */\nexport function getDefaultCustomizeFrame(): CustomizeFrameFunc {\n return (frame: Parameters<CustomizeFrameFunc>[0]) => {\n if (frame.file && isUrl(frame.file)) {\n return {\n ...frame,\n // HACK: This prevents Metro from attempting to read the invalid file URL it sent us.\n lineNumber: null,\n column: null,\n // This prevents the invalid frame from being shown by default.\n collapse: true,\n };\n }\n let collapse = Boolean(frame.file && INTERNAL_CALLSITES_REGEX.test(frame.file));\n\n if (!collapse) {\n // This represents the first frame of the stacktrace.\n // Often this looks like: `__r(0);`.\n // The URL will also be unactionable in the app and therefore not very useful to the developer.\n if (\n frame.column === 3 &&\n frame.methodName === 'global code' &&\n frame.file?.match(/^https?:\\/\\//g)\n ) {\n collapse = true;\n }\n }\n\n return { ...(frame || {}), collapse };\n };\n}\n"],"mappings":";;;;;;;AAEA,SAAAA,KAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,IAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAFA;;AAMA;AACO,MAAME,wBAAwB,GAAG,IAAIC,MAAM,CAChD,CACE,8CAA8C,EAC9C,6CAA6C,EAC7C,+BAA+B,EAC/B,4BAA4B,EAC5B,iCAAiC,EACjC,2CAA2C,EAC3C,qCAAqC,EACrC,iCAAiC;AACjC;AACA;AACA;AACA,iCAAiC;AACjC;AACA,uCAAuC,EACvC,6DAA6D,EAC7D,qCAAqC,EACrC,8CAA8C;AAC9C;AACA,iCAAiC;AACjC;AACA,2CAA2C;AAC3C;AACA,4CAA4C;AAC5C;AACA,sCAAsC;AACtC;AACA,0CAA0C;AAC1C;AACC,mBAAkB;AACnB;AACA,iCAAiC;AACjC;AACA,2CAA2C;AAC3C;AACA,6BAA6B;AAC7B;AACA,yBAAyB,CAC1B,CAACC,IAAI,CAAC,GAAG,CAAC,CACZ;AAACC,OAAA,CAAAH,wBAAA,GAAAA,wBAAA;AAEF,SAASI,KAAKA,CAACC,KAAa,EAAW;EACrC,IAAI;IACF;IACA,KAAIC,UAAG,EAACD,KAAK,CAAC;IACd,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,wBAAwBA,CAAA,EAAuB;EAC7D,OAAQC,KAAwC,IAAK;IACnD,IAAIA,KAAK,CAACC,IAAI,IAAIL,KAAK,CAACI,KAAK,CAACC,IAAI,CAAC,EAAE;MACnC,OAAO;QACL,GAAGD,KAAK;QACR;QACAE,UAAU,EAAE,IAAI;QAChBC,MAAM,EAAE,IAAI;QACZ;QACAC,QAAQ,EAAE;MACZ,CAAC;IACH;IACA,IAAIA,QAAQ,GAAGC,OAAO,CAACL,KAAK,CAACC,IAAI,IAAIT,wBAAwB,CAACc,IAAI,CAACN,KAAK,CAACC,IAAI,CAAC,CAAC;IAE/E,IAAI,CAACG,QAAQ,EAAE;MAAA,IAAAG,WAAA;MACb;MACA;MACA;MACA,IACEP,KAAK,CAACG,MAAM,KAAK,CAAC,IAClBH,KAAK,CAACQ,UAAU,KAAK,aAAa,KAAAD,WAAA,GAClCP,KAAK,CAACC,IAAI,cAAAM,WAAA,eAAVA,WAAA,CAAYE,KAAK,CAAC,eAAe,CAAC,EAClC;QACAL,QAAQ,GAAG,IAAI;MACjB;IACF;IAEA,OAAO;MAAE,IAAIJ,KAAK,IAAI,CAAC,CAAC,CAAC;MAAEI;IAAS,CAAC;EACvC,CAAC;AACH"}
@@ -8,4 +8,6 @@ import { ReadOnlyGraph, MixedOutput, Module, SerializerOptions } from 'metro';
8
8
  import { SerializerParameters } from './withExpoSerializers';
9
9
  export declare function replaceEnvironmentVariables(code: string, env: Record<string, string | undefined>): string;
10
10
  export declare function getTransformEnvironment(url: string): string | null;
11
+ /** Strips the process.env polyfill in server environments to allow for accessing environment variables off the global. */
12
+ export declare function serverPreludeSerializerPlugin(entryPoint: string, preModules: readonly Module<MixedOutput>[], graph: ReadOnlyGraph, options: SerializerOptions): SerializerParameters;
11
13
  export declare function environmentVariableSerializerPlugin(entryPoint: string, preModules: readonly Module<MixedOutput>[], graph: ReadOnlyGraph, options: SerializerOptions): SerializerParameters;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.environmentVariableSerializerPlugin = environmentVariableSerializerPlugin;
7
7
  exports.getTransformEnvironment = getTransformEnvironment;
8
8
  exports.replaceEnvironmentVariables = replaceEnvironmentVariables;
9
+ exports.serverPreludeSerializerPlugin = serverPreludeSerializerPlugin;
9
10
  function _CountingSet() {
10
11
  const data = _interopRequireDefault(require("metro/src/lib/CountingSet"));
11
12
  _CountingSet = function () {
@@ -60,6 +61,18 @@ function getAllExpoPublicEnvVars() {
60
61
  }
61
62
  return env;
62
63
  }
64
+
65
+ /** Strips the process.env polyfill in server environments to allow for accessing environment variables off the global. */
66
+ function serverPreludeSerializerPlugin(entryPoint, preModules, graph, options) {
67
+ if (options.sourceUrl && getTransformEnvironment(options.sourceUrl) === 'node') {
68
+ const prelude = preModules.find(module => module.path === '__prelude__');
69
+ if (prelude) {
70
+ debug('Stripping environment variable polyfill in server environment.');
71
+ prelude.output[0].data.code = prelude.output[0].data.code.replace(/process=this\.process\|\|{},/, '').replace(/process\.env=process\.env\|\|{};process\.env\.NODE_ENV=process\.env\.NODE_ENV\|\|"\w+";/, '');
72
+ }
73
+ }
74
+ return [entryPoint, preModules, graph, options];
75
+ }
63
76
  function environmentVariableSerializerPlugin(entryPoint, preModules, graph, options) {
64
77
  // Skip replacement in Node.js environments.
65
78
  if (options.sourceUrl && getTransformEnvironment(options.sourceUrl) === 'node') {
@@ -1 +1 @@
1
- {"version":3,"file":"environmentVariableSerializerPlugin.js","names":["_CountingSet","data","_interopRequireDefault","require","_countLines","obj","__esModule","default","debug","replaceEnvironmentVariables","code","env","replace","match","_env$name","name","test","value","JSON","stringify","getTransformEnvironment","url","getAllExpoPublicEnvVars","key","process","startsWith","environmentVariableSerializerPlugin","entryPoint","preModules","graph","options","sourceUrl","dev","str","Object","keys","map","join","firstModule","restModules","getEnvPrelude","dependencies","values","path","index","output","contents","lineCount","countLines","Map","getSource","Buffer","from","inverseDependencies","CountingSet","type"],"sources":["../../src/serializer/environmentVariableSerializerPlugin.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 { ReadOnlyGraph, MixedOutput, Module, SerializerOptions } from 'metro';\nimport CountingSet from 'metro/src/lib/CountingSet';\nimport countLines from 'metro/src/lib/countLines';\n\nimport { SerializerParameters } from './withExpoSerializers';\n\nconst debug = require('debug')('expo:metro-config:serializer:env-var') as typeof console.log;\n\nexport function replaceEnvironmentVariables(\n code: string,\n env: Record<string, string | undefined>\n): string {\n // match and replace env variables that aren't NODE_ENV or JEST_WORKER_ID\n // return code.match(/process\\.env\\.(EXPO_PUBLIC_[A-Z_]+)/g);\n return code.replace(/process\\.env\\.([a-zA-Z0-9_]+)/gm, (match) => {\n const name = match.replace('process.env.', '');\n if (\n // Must start with EXPO_PUBLIC_ to be replaced\n !/^EXPO_PUBLIC_/.test(name)\n ) {\n return match;\n }\n\n const value = JSON.stringify(env[name] ?? '');\n debug(`Inlining environment variable \"${match}\" with ${value}`);\n return value;\n });\n}\n\nexport function getTransformEnvironment(url: string): string | null {\n const match = url.match(/[&?]transform\\.environment=([^&]+)/);\n return match ? match[1] : null;\n}\n\nfunction getAllExpoPublicEnvVars() {\n // Create an object containing all environment variables that start with EXPO_PUBLIC_\n const env = {};\n for (const key in process.env) {\n if (key.startsWith('EXPO_PUBLIC_')) {\n // @ts-ignore\n env[key] = process.env[key];\n }\n }\n return env;\n}\n\nexport function environmentVariableSerializerPlugin(\n entryPoint: string,\n preModules: readonly Module<MixedOutput>[],\n graph: ReadOnlyGraph,\n options: SerializerOptions\n): SerializerParameters {\n // Skip replacement in Node.js environments.\n if (options.sourceUrl && getTransformEnvironment(options.sourceUrl) === 'node') {\n debug('Skipping environment variable inlining in Node.js environment.');\n return [entryPoint, preModules, graph, options];\n }\n\n // Adds about 5ms on a blank Expo Router app.\n // TODO: We can probably cache the results.\n\n // In development, we need to add the process.env object to ensure it\n // persists between Fast Refresh updates.\n if (options.dev) {\n // Set the process.env object to the current environment variables object\n // ensuring they aren't iterable, settable, or enumerable.\n const str = `process.env=Object.defineProperties(process.env, {${Object.keys(\n getAllExpoPublicEnvVars()\n )\n .map((key) => `${JSON.stringify(key)}: { value: ${JSON.stringify(process.env[key])} }`)\n .join(',')}});`;\n\n const [firstModule, ...restModules] = preModules;\n // const envCode = `var process=this.process||{};${str}`;\n // process.env\n return [\n entryPoint,\n [\n // First module defines the process.env object.\n firstModule,\n // Second module modifies the process.env object.\n getEnvPrelude(str),\n // Now we add the rest\n ...restModules,\n ],\n graph,\n options,\n ];\n }\n\n // In production, inline all process.env variables to ensure they cannot be iterated and read arbitrarily.\n for (const value of graph.dependencies.values()) {\n // Skip node_modules, the feature is a bit too sensitive to allow in arbitrary code.\n if (/node_modules/.test(value.path)) {\n continue;\n }\n\n for (const index in value.output) {\n // TODO: This probably breaks source maps.\n const code = replaceEnvironmentVariables(value.output[index].data.code, process.env);\n value.output[index].data.code = code;\n }\n }\n return [entryPoint, preModules, graph, options];\n}\n\nfunction getEnvPrelude(contents: string): Module<MixedOutput> {\n const code = '// HMR env vars from Expo CLI (dev-only)\\n' + contents;\n const name = '__env__';\n const lineCount = countLines(code);\n\n return {\n dependencies: new Map(),\n getSource: (): Buffer => Buffer.from(code),\n inverseDependencies: new CountingSet(),\n path: name,\n output: [\n {\n type: 'js/script/virtual',\n data: {\n code,\n // @ts-expect-error: typed incorrectly upstream\n lineCount,\n map: [],\n },\n },\n ],\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"environmentVariableSerializerPlugin.js","names":["_CountingSet","data","_interopRequireDefault","require","_countLines","obj","__esModule","default","debug","replaceEnvironmentVariables","code","env","replace","match","_env$name","name","test","value","JSON","stringify","getTransformEnvironment","url","getAllExpoPublicEnvVars","key","process","startsWith","serverPreludeSerializerPlugin","entryPoint","preModules","graph","options","sourceUrl","prelude","find","module","path","output","environmentVariableSerializerPlugin","dev","str","Object","keys","map","join","firstModule","restModules","getEnvPrelude","dependencies","values","index","contents","lineCount","countLines","Map","getSource","Buffer","from","inverseDependencies","CountingSet","type"],"sources":["../../src/serializer/environmentVariableSerializerPlugin.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 { ReadOnlyGraph, MixedOutput, Module, SerializerOptions } from 'metro';\nimport CountingSet from 'metro/src/lib/CountingSet';\nimport countLines from 'metro/src/lib/countLines';\n\nimport { SerializerParameters } from './withExpoSerializers';\n\nconst debug = require('debug')('expo:metro-config:serializer:env-var') as typeof console.log;\n\nexport function replaceEnvironmentVariables(\n code: string,\n env: Record<string, string | undefined>\n): string {\n // match and replace env variables that aren't NODE_ENV or JEST_WORKER_ID\n // return code.match(/process\\.env\\.(EXPO_PUBLIC_[A-Z_]+)/g);\n return code.replace(/process\\.env\\.([a-zA-Z0-9_]+)/gm, (match) => {\n const name = match.replace('process.env.', '');\n if (\n // Must start with EXPO_PUBLIC_ to be replaced\n !/^EXPO_PUBLIC_/.test(name)\n ) {\n return match;\n }\n\n const value = JSON.stringify(env[name] ?? '');\n debug(`Inlining environment variable \"${match}\" with ${value}`);\n return value;\n });\n}\n\nexport function getTransformEnvironment(url: string): string | null {\n const match = url.match(/[&?]transform\\.environment=([^&]+)/);\n return match ? match[1] : null;\n}\n\nfunction getAllExpoPublicEnvVars() {\n // Create an object containing all environment variables that start with EXPO_PUBLIC_\n const env = {};\n for (const key in process.env) {\n if (key.startsWith('EXPO_PUBLIC_')) {\n // @ts-ignore\n env[key] = process.env[key];\n }\n }\n return env;\n}\n\n/** Strips the process.env polyfill in server environments to allow for accessing environment variables off the global. */\nexport function serverPreludeSerializerPlugin(\n entryPoint: string,\n preModules: readonly Module<MixedOutput>[],\n graph: ReadOnlyGraph,\n options: SerializerOptions\n): SerializerParameters {\n if (options.sourceUrl && getTransformEnvironment(options.sourceUrl) === 'node') {\n const prelude = preModules.find((module) => module.path === '__prelude__');\n if (prelude) {\n debug('Stripping environment variable polyfill in server environment.');\n prelude.output[0].data.code = prelude.output[0].data.code\n .replace(/process=this\\.process\\|\\|{},/, '')\n .replace(\n /process\\.env=process\\.env\\|\\|{};process\\.env\\.NODE_ENV=process\\.env\\.NODE_ENV\\|\\|\"\\w+\";/,\n ''\n );\n }\n }\n return [entryPoint, preModules, graph, options];\n}\n\nexport function environmentVariableSerializerPlugin(\n entryPoint: string,\n preModules: readonly Module<MixedOutput>[],\n graph: ReadOnlyGraph,\n options: SerializerOptions\n): SerializerParameters {\n // Skip replacement in Node.js environments.\n if (options.sourceUrl && getTransformEnvironment(options.sourceUrl) === 'node') {\n debug('Skipping environment variable inlining in Node.js environment.');\n return [entryPoint, preModules, graph, options];\n }\n\n // Adds about 5ms on a blank Expo Router app.\n // TODO: We can probably cache the results.\n\n // In development, we need to add the process.env object to ensure it\n // persists between Fast Refresh updates.\n if (options.dev) {\n // Set the process.env object to the current environment variables object\n // ensuring they aren't iterable, settable, or enumerable.\n const str = `process.env=Object.defineProperties(process.env, {${Object.keys(\n getAllExpoPublicEnvVars()\n )\n .map((key) => `${JSON.stringify(key)}: { value: ${JSON.stringify(process.env[key])} }`)\n .join(',')}});`;\n\n const [firstModule, ...restModules] = preModules;\n // const envCode = `var process=this.process||{};${str}`;\n // process.env\n return [\n entryPoint,\n [\n // First module defines the process.env object.\n firstModule,\n // Second module modifies the process.env object.\n getEnvPrelude(str),\n // Now we add the rest\n ...restModules,\n ],\n graph,\n options,\n ];\n }\n\n // In production, inline all process.env variables to ensure they cannot be iterated and read arbitrarily.\n for (const value of graph.dependencies.values()) {\n // Skip node_modules, the feature is a bit too sensitive to allow in arbitrary code.\n if (/node_modules/.test(value.path)) {\n continue;\n }\n\n for (const index in value.output) {\n // TODO: This probably breaks source maps.\n const code = replaceEnvironmentVariables(value.output[index].data.code, process.env);\n value.output[index].data.code = code;\n }\n }\n return [entryPoint, preModules, graph, options];\n}\n\nfunction getEnvPrelude(contents: string): Module<MixedOutput> {\n const code = '// HMR env vars from Expo CLI (dev-only)\\n' + contents;\n const name = '__env__';\n const lineCount = countLines(code);\n\n return {\n dependencies: new Map(),\n getSource: (): Buffer => Buffer.from(code),\n inverseDependencies: new CountingSet(),\n path: name,\n output: [\n {\n type: 'js/script/virtual',\n data: {\n code,\n // @ts-expect-error: typed incorrectly upstream\n lineCount,\n map: [],\n },\n },\n ],\n };\n}\n"],"mappings":"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"}
@@ -21,7 +21,7 @@ export type JSModule = Module<{
21
21
  };
22
22
  type: 'js/module';
23
23
  }>;
24
- export declare function filterJsModules(dependencies: ReadOnlyDependencies, { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>): JSModule[];
24
+ export declare function filterJsModules(dependencies: ReadOnlyDependencies, type: 'js/script' | 'js/module' | 'js/module/asset', { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>): JSModule[];
25
25
  export declare function getCssSerialAssets<T extends any>(dependencies: ReadOnlyDependencies<T>, { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>): SerialAsset[];
26
26
  export declare function fileNameFromContents({ filepath, src }: {
27
27
  filepath: string;
@@ -38,13 +38,13 @@ function _hash() {
38
38
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
39
  // s = static
40
40
  const STATIC_EXPORT_DIRECTORY = '_expo/static/css';
41
- function filterJsModules(dependencies, {
41
+ function filterJsModules(dependencies, type, {
42
42
  processModuleFilter,
43
43
  projectRoot
44
44
  }) {
45
45
  const assets = [];
46
46
  for (const module of dependencies.values()) {
47
- if ((0, _js().isJsModule)(module) && processModuleFilter(module) && (0, _js().getJsOutput)(module).type === 'js/module' && _path().default.relative(projectRoot, module.path) !== 'package.json') {
47
+ if ((0, _js().isJsModule)(module) && processModuleFilter(module) && (0, _js().getJsOutput)(module).type === type && _path().default.relative(projectRoot, module.path) !== 'package.json') {
48
48
  assets.push(module);
49
49
  }
50
50
  }
@@ -55,7 +55,7 @@ function getCssSerialAssets(dependencies, {
55
55
  projectRoot
56
56
  }) {
57
57
  const assets = [];
58
- for (const module of filterJsModules(dependencies, {
58
+ for (const module of filterJsModules(dependencies, 'js/module', {
59
59
  processModuleFilter,
60
60
  projectRoot
61
61
  })) {
@@ -100,7 +100,9 @@ function fileNameFromContents({
100
100
  filepath,
101
101
  src
102
102
  }) {
103
- return getFileName(filepath) + '-' + (0, _hash().hashString)(filepath + src);
103
+ // Decode if the path is encoded from the Metro dev server, then normalize paths for Windows support.
104
+ const decoded = decodeURIComponent(filepath).replace(/\\/g, '/');
105
+ return getFileName(decoded) + '-' + (0, _hash().hashString)(decoded + src);
104
106
  }
105
107
  function getFileName(module) {
106
108
  return _path().default.basename(module).replace(/\.[^.]+$/, '');
@@ -1 +1 @@
1
- {"version":3,"file":"getCssDeps.js","names":["_js","data","require","_path","_interopRequireDefault","_css","_hash","obj","__esModule","default","STATIC_EXPORT_DIRECTORY","filterJsModules","dependencies","processModuleFilter","projectRoot","assets","module","values","isJsModule","getJsOutput","type","path","relative","push","getCssSerialAssets","cssMetadata","getCssMetadata","contents","code","originFilename","filename","join","fileNameFromContents","filepath","src","source","metadata","hmrId","pathToHtmlSafeName","_module$output$","output","css","Error","JSON","stringify","getFileName","hashString","basename","replace"],"sources":["../../src/serializer/getCssDeps.ts"],"sourcesContent":["import type { Module } from 'metro';\nimport { getJsOutput, isJsModule } from 'metro/src/DeltaBundler/Serializers/helpers/js';\nimport path from 'path';\n\nimport { SerialAsset } from './serializerAssets';\nimport { pathToHtmlSafeName } from '../transform-worker/css';\nimport { hashString } from '../utils/hash';\n\nexport type ReadOnlyDependencies<T = any> = ReadonlyMap<string, Module<T>>;\n\ntype Options = {\n processModuleFilter: (modules: Module) => boolean;\n assetPlugins: readonly string[];\n platform?: string | null;\n projectRoot: string;\n publicPath: string;\n};\n\ntype MetroModuleCSSMetadata = {\n code: string;\n lineCount: number;\n map: any[];\n};\n\n// s = static\nconst STATIC_EXPORT_DIRECTORY = '_expo/static/css';\n\nexport type JSModule = Module<{\n data: {\n code: string;\n map: unknown;\n lineCount: number;\n css?: {\n code: string;\n map: unknown;\n lineCount: number;\n };\n };\n type: 'js/module';\n}>;\n\nexport function filterJsModules(\n dependencies: ReadOnlyDependencies,\n { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>\n) {\n const assets: JSModule[] = [];\n\n for (const module of dependencies.values()) {\n if (\n isJsModule(module) &&\n processModuleFilter(module) &&\n getJsOutput(module).type === 'js/module' &&\n path.relative(projectRoot, module.path) !== 'package.json'\n ) {\n assets.push(module as JSModule);\n }\n }\n return assets;\n}\n\nexport function getCssSerialAssets<T extends any>(\n dependencies: ReadOnlyDependencies<T>,\n { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>\n): SerialAsset[] {\n const assets: SerialAsset[] = [];\n\n for (const module of filterJsModules(dependencies, { processModuleFilter, projectRoot })) {\n const cssMetadata = getCssMetadata(module);\n if (cssMetadata) {\n const contents = cssMetadata.code;\n const originFilename = path.relative(projectRoot, module.path);\n\n const filename = path.join(\n // Consistent location\n STATIC_EXPORT_DIRECTORY,\n // Hashed file contents + name for caching\n fileNameFromContents({\n // Stable filename for hashing in CI.\n filepath: originFilename,\n src: contents,\n }) + '.css'\n );\n assets.push({\n type: 'css',\n originFilename,\n filename,\n source: contents,\n metadata: {\n hmrId: pathToHtmlSafeName(originFilename),\n },\n });\n }\n }\n\n return assets;\n}\n\nfunction getCssMetadata(module: JSModule): MetroModuleCSSMetadata | null {\n const data = module.output[0]?.data;\n if (data && typeof data === 'object' && 'css' in data) {\n if (typeof data.css !== 'object' || !('code' in (data as any).css)) {\n throw new Error(\n `Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`\n );\n }\n return data.css as MetroModuleCSSMetadata;\n }\n return null;\n}\n\nexport function fileNameFromContents({ filepath, src }: { filepath: string; src: string }): string {\n return getFileName(filepath) + '-' + hashString(filepath + src);\n}\n\nexport function getFileName(module: string) {\n return path.basename(module).replace(/\\.[^.]+$/, '');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"getCssDeps.js","names":["_js","data","require","_path","_interopRequireDefault","_css","_hash","obj","__esModule","default","STATIC_EXPORT_DIRECTORY","filterJsModules","dependencies","type","processModuleFilter","projectRoot","assets","module","values","isJsModule","getJsOutput","path","relative","push","getCssSerialAssets","cssMetadata","getCssMetadata","contents","code","originFilename","filename","join","fileNameFromContents","filepath","src","source","metadata","hmrId","pathToHtmlSafeName","_module$output$","output","css","Error","JSON","stringify","decoded","decodeURIComponent","replace","getFileName","hashString","basename"],"sources":["../../src/serializer/getCssDeps.ts"],"sourcesContent":["import type { Module } from 'metro';\nimport { getJsOutput, isJsModule } from 'metro/src/DeltaBundler/Serializers/helpers/js';\nimport path from 'path';\n\nimport { SerialAsset } from './serializerAssets';\nimport { pathToHtmlSafeName } from '../transform-worker/css';\nimport { hashString } from '../utils/hash';\n\nexport type ReadOnlyDependencies<T = any> = ReadonlyMap<string, Module<T>>;\n\ntype Options = {\n processModuleFilter: (modules: Module) => boolean;\n assetPlugins: readonly string[];\n platform?: string | null;\n projectRoot: string;\n publicPath: string;\n};\n\ntype MetroModuleCSSMetadata = {\n code: string;\n lineCount: number;\n map: any[];\n};\n\n// s = static\nconst STATIC_EXPORT_DIRECTORY = '_expo/static/css';\n\nexport type JSModule = Module<{\n data: {\n code: string;\n map: unknown;\n lineCount: number;\n css?: {\n code: string;\n map: unknown;\n lineCount: number;\n };\n };\n type: 'js/module';\n}>;\n\nexport function filterJsModules(\n dependencies: ReadOnlyDependencies,\n type: 'js/script' | 'js/module' | 'js/module/asset',\n { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>\n) {\n const assets: JSModule[] = [];\n\n for (const module of dependencies.values()) {\n if (\n isJsModule(module) &&\n processModuleFilter(module) &&\n getJsOutput(module).type === type &&\n path.relative(projectRoot, module.path) !== 'package.json'\n ) {\n assets.push(module as JSModule);\n }\n }\n return assets;\n}\n\nexport function getCssSerialAssets<T extends any>(\n dependencies: ReadOnlyDependencies<T>,\n { processModuleFilter, projectRoot }: Pick<Options, 'projectRoot' | 'processModuleFilter'>\n): SerialAsset[] {\n const assets: SerialAsset[] = [];\n\n for (const module of filterJsModules(dependencies, 'js/module', {\n processModuleFilter,\n projectRoot,\n })) {\n const cssMetadata = getCssMetadata(module);\n if (cssMetadata) {\n const contents = cssMetadata.code;\n const originFilename = path.relative(projectRoot, module.path);\n\n const filename = path.join(\n // Consistent location\n STATIC_EXPORT_DIRECTORY,\n // Hashed file contents + name for caching\n fileNameFromContents({\n // Stable filename for hashing in CI.\n filepath: originFilename,\n src: contents,\n }) + '.css'\n );\n assets.push({\n type: 'css',\n originFilename,\n filename,\n source: contents,\n metadata: {\n hmrId: pathToHtmlSafeName(originFilename),\n },\n });\n }\n }\n\n return assets;\n}\n\nfunction getCssMetadata(module: JSModule): MetroModuleCSSMetadata | null {\n const data = module.output[0]?.data;\n if (data && typeof data === 'object' && 'css' in data) {\n if (typeof data.css !== 'object' || !('code' in (data as any).css)) {\n throw new Error(\n `Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`\n );\n }\n return data.css as MetroModuleCSSMetadata;\n }\n return null;\n}\n\nexport function fileNameFromContents({ filepath, src }: { filepath: string; src: string }): string {\n // Decode if the path is encoded from the Metro dev server, then normalize paths for Windows support.\n const decoded = decodeURIComponent(filepath).replace(/\\\\/g, '/');\n return getFileName(decoded) + '-' + hashString(decoded + src);\n}\n\nexport function getFileName(module: string) {\n return path.basename(module).replace(/\\.[^.]+$/, '');\n}\n"],"mappings":"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"}
@@ -87,6 +87,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
87
87
 
88
88
  function withExpoSerializers(config) {
89
89
  const processors = [];
90
+ processors.push(_environmentVariableSerializerPlugin().serverPreludeSerializerPlugin);
90
91
  if (!_env().env.EXPO_NO_CLIENT_ENV_VARS) {
91
92
  processors.push(_environmentVariableSerializerPlugin().environmentVariableSerializerPlugin);
92
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"withExpoSerializers.js","names":["_jscSafeUrl","data","require","_baseJSBundle","_interopRequireDefault","_sourceMapString","_bundleToString","_path","_environmentVariableSerializerPlugin","_getCssDeps","_serializerAssets","_env","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","entryPoint","preModules","graph","options","jsCode","sourceUrl","isJscSafeUrl","toNormalUrl","url","URL","searchParams","get","includeSourceMaps","cssDeps","getCssSerialAssets","dependencies","projectRoot","processModuleFilter","jsAssets","stringContents","jsFilename","fileNameFromContents","filepath","pathname","src","filename","dev","originFilename","type","metadata","source","sourceMapUrl","sourceMap","serializeToSourceMap","map","parsed","JSON","parse","sources","value","startsWith","_options$serverRoot","path","relative","serverRoot","stringify","getSortedModules","createModuleId","modules","values","module","sort","a","b","prepend","sourceMapString","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 { isJscSafeUrl, toNormalUrl } from 'jsc-safe-url';\nimport { Module, MixedOutput } from 'metro';\nimport baseJSBundle from 'metro/src/DeltaBundler/Serializers/baseJSBundle';\n// @ts-expect-error\nimport sourceMapString from 'metro/src/DeltaBundler/Serializers/sourceMapString';\nimport bundleToString from 'metro/src/lib/bundleToString';\nimport { InputConfigT, SerializerConfigT } from 'metro-config';\nimport path from 'path';\n\nimport { environmentVariableSerializerPlugin } from './environmentVariableSerializerPlugin';\nimport { fileNameFromContents, getCssSerialAssets } from './getCssDeps';\nimport { SerialAsset } from './serializerAssets';\nimport { env } from '../env';\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 [entryPoint, preModules, graph, options] = props;\n\n const jsCode = await defaultSerializer(entryPoint, preModules, graph, options);\n\n if (!options.sourceUrl) {\n return jsCode;\n }\n const sourceUrl = isJscSafeUrl(options.sourceUrl)\n ? toNormalUrl(options.sourceUrl)\n : options.sourceUrl;\n const url = new URL(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 includeSourceMaps = url.searchParams.get('serializer.map') === 'true';\n\n const cssDeps = getCssSerialAssets<MixedOutput>(graph.dependencies, {\n projectRoot: options.projectRoot,\n processModuleFilter: options.processModuleFilter,\n });\n\n const jsAssets: SerialAsset[] = [];\n\n if (jsCode) {\n const stringContents = typeof jsCode === 'string' ? jsCode : jsCode.code;\n const jsFilename = fileNameFromContents({\n filepath: url.pathname,\n src: stringContents,\n });\n jsAssets.push({\n filename: options.dev ? 'index.js' : `_expo/static/js/web/${jsFilename}.js`,\n originFilename: 'index.js',\n type: 'js',\n metadata: {},\n source: stringContents,\n });\n\n if (\n // Only include the source map if the `options.sourceMapUrl` option is provided and we are exporting a static build.\n includeSourceMaps &&\n options.sourceMapUrl\n ) {\n const sourceMap = typeof jsCode === 'string' ? serializeToSourceMap(...props) : jsCode.map;\n\n // Make all paths relative to the server root to prevent the entire user filesystem from being exposed.\n const parsed = JSON.parse(sourceMap);\n // TODO: Maybe we can do this earlier.\n parsed.sources = parsed.sources.map(\n // TODO: Maybe basePath support\n (value: string) => {\n if (value.startsWith('/')) {\n return '/' + path.relative(options.serverRoot ?? options.projectRoot, value);\n }\n // Prevent `__prelude__` from being relative.\n return value;\n }\n );\n\n jsAssets.push({\n filename: options.dev ? 'index.map' : `_expo/static/js/web/${jsFilename}.js.map`,\n originFilename: 'index.map',\n type: 'map',\n metadata: {},\n source: JSON.stringify(parsed),\n });\n }\n }\n\n return JSON.stringify([...jsAssets, ...cssDeps]);\n };\n}\n\nfunction getSortedModules(\n graph: SerializerParameters[2],\n {\n createModuleId,\n }: {\n createModuleId: (path: string) => number;\n }\n): readonly Module<any>[] {\n const modules = [...graph.dependencies.values()];\n // Assign IDs to modules in a consistent order\n for (const module of modules) {\n createModuleId(module.path);\n }\n // Sort by IDs\n return modules.sort(\n (a: Module<any>, b: Module<any>) => createModuleId(a.path) - createModuleId(b.path)\n );\n}\n\nfunction serializeToSourceMap(...props: SerializerParameters): string {\n const [, prepend, graph, options] = props;\n\n const modules = [\n ...prepend,\n ...getSortedModules(graph, {\n createModuleId: options.createModuleId,\n }),\n ];\n\n return sourceMapString(modules, {\n ...options,\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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"}
1
+ {"version":3,"file":"withExpoSerializers.js","names":["_jscSafeUrl","data","require","_baseJSBundle","_interopRequireDefault","_sourceMapString","_bundleToString","_path","_environmentVariableSerializerPlugin","_getCssDeps","_serializerAssets","_env","obj","__esModule","default","withExpoSerializers","config","processors","push","serverPreludeSerializerPlugin","env","EXPO_NO_CLIENT_ENV_VARS","environmentVariableSerializerPlugin","withSerializerPlugins","_config$serializer","originalSerializer","serializer","customSerializer","createSerializerFromSerialProcessors","getDefaultSerializer","fallbackSerializer","defaultSerializer","params","bundle","baseJSBundle","outputCode","bundleToString","code","props","entryPoint","preModules","graph","options","jsCode","sourceUrl","isJscSafeUrl","toNormalUrl","url","URL","searchParams","get","includeSourceMaps","cssDeps","getCssSerialAssets","dependencies","projectRoot","processModuleFilter","jsAssets","stringContents","jsFilename","fileNameFromContents","filepath","pathname","src","filename","dev","originFilename","type","metadata","source","sourceMapUrl","sourceMap","serializeToSourceMap","map","parsed","JSON","parse","sources","value","startsWith","_options$serverRoot","path","relative","serverRoot","stringify","getSortedModules","createModuleId","modules","values","module","sort","a","b","prepend","sourceMapString","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 { isJscSafeUrl, toNormalUrl } from 'jsc-safe-url';\nimport { Module, MixedOutput } from 'metro';\nimport baseJSBundle from 'metro/src/DeltaBundler/Serializers/baseJSBundle';\n// @ts-expect-error\nimport sourceMapString from 'metro/src/DeltaBundler/Serializers/sourceMapString';\nimport bundleToString from 'metro/src/lib/bundleToString';\nimport { InputConfigT, SerializerConfigT } from 'metro-config';\nimport path from 'path';\n\nimport {\n serverPreludeSerializerPlugin,\n environmentVariableSerializerPlugin,\n} from './environmentVariableSerializerPlugin';\nimport { fileNameFromContents, getCssSerialAssets } from './getCssDeps';\nimport { SerialAsset } from './serializerAssets';\nimport { env } from '../env';\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 processors.push(serverPreludeSerializerPlugin);\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 [entryPoint, preModules, graph, options] = props;\n\n const jsCode = await defaultSerializer(entryPoint, preModules, graph, options);\n\n if (!options.sourceUrl) {\n return jsCode;\n }\n const sourceUrl = isJscSafeUrl(options.sourceUrl)\n ? toNormalUrl(options.sourceUrl)\n : options.sourceUrl;\n const url = new URL(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 includeSourceMaps = url.searchParams.get('serializer.map') === 'true';\n\n const cssDeps = getCssSerialAssets<MixedOutput>(graph.dependencies, {\n projectRoot: options.projectRoot,\n processModuleFilter: options.processModuleFilter,\n });\n\n const jsAssets: SerialAsset[] = [];\n\n if (jsCode) {\n const stringContents = typeof jsCode === 'string' ? jsCode : jsCode.code;\n const jsFilename = fileNameFromContents({\n filepath: url.pathname,\n src: stringContents,\n });\n jsAssets.push({\n filename: options.dev ? 'index.js' : `_expo/static/js/web/${jsFilename}.js`,\n originFilename: 'index.js',\n type: 'js',\n metadata: {},\n source: stringContents,\n });\n\n if (\n // Only include the source map if the `options.sourceMapUrl` option is provided and we are exporting a static build.\n includeSourceMaps &&\n options.sourceMapUrl\n ) {\n const sourceMap = typeof jsCode === 'string' ? serializeToSourceMap(...props) : jsCode.map;\n\n // Make all paths relative to the server root to prevent the entire user filesystem from being exposed.\n const parsed = JSON.parse(sourceMap);\n // TODO: Maybe we can do this earlier.\n parsed.sources = parsed.sources.map(\n // TODO: Maybe basePath support\n (value: string) => {\n if (value.startsWith('/')) {\n return '/' + path.relative(options.serverRoot ?? options.projectRoot, value);\n }\n // Prevent `__prelude__` from being relative.\n return value;\n }\n );\n\n jsAssets.push({\n filename: options.dev ? 'index.map' : `_expo/static/js/web/${jsFilename}.js.map`,\n originFilename: 'index.map',\n type: 'map',\n metadata: {},\n source: JSON.stringify(parsed),\n });\n }\n }\n\n return JSON.stringify([...jsAssets, ...cssDeps]);\n };\n}\n\nfunction getSortedModules(\n graph: SerializerParameters[2],\n {\n createModuleId,\n }: {\n createModuleId: (path: string) => number;\n }\n): readonly Module<any>[] {\n const modules = [...graph.dependencies.values()];\n // Assign IDs to modules in a consistent order\n for (const module of modules) {\n createModuleId(module.path);\n }\n // Sort by IDs\n return modules.sort(\n (a: Module<any>, b: Module<any>) => createModuleId(a.path) - createModuleId(b.path)\n );\n}\n\nfunction serializeToSourceMap(...props: SerializerParameters): string {\n const [, prepend, graph, options] = props;\n\n const modules = [\n ...prepend,\n ...getSortedModules(graph, {\n createModuleId: options.createModuleId,\n }),\n ];\n\n return sourceMapString(modules, {\n ...options,\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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"}
@@ -50,15 +50,21 @@ async function transform(config, projectRoot, filename, data, options) {
50
50
  if (!isCss) {
51
51
  var _options$customTransf;
52
52
  const environment = (_options$customTransf = options.customTransformOptions) === null || _options$customTransf === void 0 ? void 0 : _options$customTransf.environment;
53
- if (environment === 'client' &&
53
+ if (environment !== 'node' && (
54
54
  // TODO: Ensure this works with windows.
55
- // TODO: Add +api files.
56
- filename.match(new RegExp(`^app/\\+html(\\.${options.platform})?\\.([tj]sx?|[cm]js)?$`))) {
57
- // Remove the server-only +html file from the bundle when bundling for a client environment.
55
+ filename.match(new RegExp(`^app/\\+html(\\.${options.platform})?\\.([tj]sx?|[cm]js)?$`)) ||
56
+ // Strip +api files.
57
+ filename.match(/\+api(\.(native|ios|android|web))?\.[tj]sx?$/))) {
58
+ // Remove the server-only +html file and API Routes from the bundle when bundling for a client environment.
58
59
  return _metroTransformWorker().default.transform(config, projectRoot, filename, !options.minify ? Buffer.from(
59
60
  // Use a string so this notice is visible in the bundle if the user is
60
61
  // looking for it.
61
- '"> The server-only +html file was removed from the client JS bundle by Expo CLI."') : Buffer.from(''), options);
62
+ '"> The server-only file was removed from the client JS bundle by Expo CLI."') : Buffer.from(''), options);
63
+ }
64
+ if (environment !== 'node' && !filename.match(/\/node_modules\//) && filename.match(/\+api(\.(native|ios|android|web))?\.[tj]sx?$/)) {
65
+ // Clear the contents of +api files when bundling for the client.
66
+ // This ensures that the client doesn't accidentally use the server-only +api files.
67
+ return _metroTransformWorker().default.transform(config, projectRoot, filename, Buffer.from(''), options);
62
68
  }
63
69
  return _metroTransformWorker().default.transform(config, projectRoot, filename, data, options);
64
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transform-worker.js","names":["_metroTransformWorker","data","_interopRequireDefault","require","_css","_cssModules","_postcss","_sass","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","countLines","transform","config","projectRoot","filename","options","_jsModuleResults$outp2","isCss","type","test","_options$customTransf","environment","customTransformOptions","match","RegExp","platform","worker","minify","Buffer","from","code","matchCssModule","toString","transformPostCssModule","src","syntax","matchSass","compileSass","_jsModuleResults$outp","results","transformCssModuleWeb","dev","sourceMap","jsModuleResults","output","cssCode","css","lineCount","map","functionMap","dependencies","Promise","resolve","then","cssResults","cssModules","wrapDevelopmentCSS","module","exports"],"sources":["../../src/transform-worker/transform-worker.ts"],"sourcesContent":["/**\n * Copyright 2023-present 650 Industries (Expo). All rights reserved.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\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 { FBSourceFunctionMap, MetroSourceMapSegmentTuple } from 'metro-source-map';\nimport worker, {\n JsTransformerConfig,\n JsTransformOptions,\n TransformResponse,\n} from 'metro-transform-worker';\n\nimport { wrapDevelopmentCSS } from './css';\nimport { matchCssModule, transformCssModuleWeb } from './css-modules';\nimport { transformPostCssModule } from './postcss';\nimport { compileSass, matchSass } from './sass';\n\nconst countLines = require('metro/src/lib/countLines') as (string: string) => number;\n\ntype JSFileType = 'js/script' | 'js/module' | 'js/module/asset';\n\ntype JsOutput = {\n data: {\n code: string;\n lineCount: number;\n map: MetroSourceMapSegmentTuple[];\n functionMap: FBSourceFunctionMap | null;\n };\n type: JSFileType;\n};\n\nexport async function transform(\n config: JsTransformerConfig,\n projectRoot: string,\n filename: string,\n data: Buffer,\n options: JsTransformOptions\n): Promise<TransformResponse> {\n const isCss = options.type !== 'asset' && /\\.(s?css|sass)$/.test(filename);\n // If the file is not CSS, then use the default behavior.\n if (!isCss) {\n const environment = options.customTransformOptions?.environment;\n\n if (\n environment === 'client' &&\n // TODO: Ensure this works with windows.\n // TODO: Add +api files.\n filename.match(new RegExp(`^app/\\\\+html(\\\\.${options.platform})?\\\\.([tj]sx?|[cm]js)?$`))\n ) {\n // Remove the server-only +html file from the bundle when bundling for a client environment.\n return worker.transform(\n config,\n projectRoot,\n filename,\n !options.minify\n ? Buffer.from(\n // Use a string so this notice is visible in the bundle if the user is\n // looking for it.\n '\"> The server-only +html file was removed from the client JS bundle by Expo CLI.\"'\n )\n : Buffer.from(''),\n options\n );\n }\n\n return worker.transform(config, projectRoot, filename, data, options);\n }\n\n // If the platform is not web, then return an empty module.\n if (options.platform !== 'web') {\n const code = matchCssModule(filename) ? 'module.exports={ unstable_styles: {} };' : '';\n return worker.transform(\n config,\n projectRoot,\n filename,\n // TODO: Native CSS Modules\n Buffer.from(code),\n options\n );\n }\n\n let code = data.toString('utf8');\n\n // Apply postcss transforms\n code = await transformPostCssModule(projectRoot, {\n src: code,\n filename,\n });\n\n // TODO: When native has CSS support, this will need to move higher up.\n const syntax = matchSass(filename);\n if (syntax) {\n code = compileSass(projectRoot, { filename, src: code }, { syntax }).src;\n }\n\n // If the file is a CSS Module, then transform it to a JS module\n // in development and a static CSS file in production.\n if (matchCssModule(filename)) {\n const results = await transformCssModuleWeb({\n filename,\n src: code,\n options: {\n projectRoot,\n dev: options.dev,\n minify: options.minify,\n sourceMap: false,\n },\n });\n\n const jsModuleResults = await worker.transform(\n config,\n projectRoot,\n filename,\n Buffer.from(results.output),\n options\n );\n\n const cssCode = results.css.toString();\n const output: JsOutput[] = [\n {\n type: 'js/module',\n data: {\n // @ts-expect-error\n ...jsModuleResults.output[0]?.data,\n\n // Append additional css metadata for static extraction.\n css: {\n code: cssCode,\n lineCount: countLines(cssCode),\n map: [],\n functionMap: null,\n },\n },\n },\n ];\n\n return {\n dependencies: jsModuleResults.dependencies,\n output,\n };\n }\n\n // Global CSS:\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,\n code: Buffer.from(code),\n sourceMap: false,\n cssModules: false,\n projectRoot,\n minify: options.minify,\n });\n\n // TODO: Warnings:\n // cssResults.warnings.forEach((warning) => {\n // });\n\n // Create a mock JS module that exports an empty object,\n // this ensures Metro dependency graph is correct.\n const jsModuleResults = await worker.transform(\n config,\n projectRoot,\n filename,\n options.dev ? Buffer.from(wrapDevelopmentCSS({ src: code, filename })) : Buffer.from(''),\n options\n );\n\n const cssCode = cssResults.code.toString();\n\n // In production, we export the CSS as a string and use a special type to prevent\n // it from being included in the JS bundle. We'll extract the CSS like an asset later\n // and append it to the HTML bundle.\n const output: JsOutput[] = [\n {\n type: 'js/module',\n data: {\n // @ts-expect-error\n ...jsModuleResults.output[0]?.data,\n\n // Append additional css metadata for static extraction.\n css: {\n code: cssCode,\n lineCount: countLines(cssCode),\n map: [],\n functionMap: null,\n },\n },\n },\n ];\n\n return {\n dependencies: jsModuleResults.dependencies,\n output,\n };\n}\n\n/**\n * A custom Metro transformer that adds support for processing Expo-specific bundler features.\n * - Global CSS files on web.\n * - CSS Modules on web.\n * - TODO: Tailwind CSS on web.\n */\nmodule.exports = {\n // Use defaults for everything that's not custom.\n ...worker,\n transform,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transform-worker.js","names":["_metroTransformWorker","data","_interopRequireDefault","require","_css","_cssModules","_postcss","_sass","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","_interopRequireWildcard","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","countLines","transform","config","projectRoot","filename","options","_jsModuleResults$outp2","isCss","type","test","_options$customTransf","environment","customTransformOptions","match","RegExp","platform","worker","minify","Buffer","from","code","matchCssModule","toString","transformPostCssModule","src","syntax","matchSass","compileSass","_jsModuleResults$outp","results","transformCssModuleWeb","dev","sourceMap","jsModuleResults","output","cssCode","css","lineCount","map","functionMap","dependencies","Promise","resolve","then","cssResults","cssModules","wrapDevelopmentCSS","module","exports"],"sources":["../../src/transform-worker/transform-worker.ts"],"sourcesContent":["/**\n * Copyright 2023-present 650 Industries (Expo). All rights reserved.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\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 { FBSourceFunctionMap, MetroSourceMapSegmentTuple } from 'metro-source-map';\nimport worker, {\n JsTransformerConfig,\n JsTransformOptions,\n TransformResponse,\n} from 'metro-transform-worker';\n\nimport { wrapDevelopmentCSS } from './css';\nimport { matchCssModule, transformCssModuleWeb } from './css-modules';\nimport { transformPostCssModule } from './postcss';\nimport { compileSass, matchSass } from './sass';\n\nconst countLines = require('metro/src/lib/countLines') as (string: string) => number;\n\ntype JSFileType = 'js/script' | 'js/module' | 'js/module/asset';\n\ntype JsOutput = {\n data: {\n code: string;\n lineCount: number;\n map: MetroSourceMapSegmentTuple[];\n functionMap: FBSourceFunctionMap | null;\n };\n type: JSFileType;\n};\n\nexport async function transform(\n config: JsTransformerConfig,\n projectRoot: string,\n filename: string,\n data: Buffer,\n options: JsTransformOptions\n): Promise<TransformResponse> {\n const isCss = options.type !== 'asset' && /\\.(s?css|sass)$/.test(filename);\n // If the file is not CSS, then use the default behavior.\n if (!isCss) {\n const environment = options.customTransformOptions?.environment;\n\n if (\n environment !== 'node' &&\n // TODO: Ensure this works with windows.\n (filename.match(new RegExp(`^app/\\\\+html(\\\\.${options.platform})?\\\\.([tj]sx?|[cm]js)?$`)) ||\n // Strip +api files.\n filename.match(/\\+api(\\.(native|ios|android|web))?\\.[tj]sx?$/))\n ) {\n // Remove the server-only +html file and API Routes from the bundle when bundling for a client environment.\n return worker.transform(\n config,\n projectRoot,\n filename,\n !options.minify\n ? Buffer.from(\n // Use a string so this notice is visible in the bundle if the user is\n // looking for it.\n '\"> The server-only file was removed from the client JS bundle by Expo CLI.\"'\n )\n : Buffer.from(''),\n options\n );\n }\n\n if (\n environment !== 'node' &&\n !filename.match(/\\/node_modules\\//) &&\n filename.match(/\\+api(\\.(native|ios|android|web))?\\.[tj]sx?$/)\n ) {\n // Clear the contents of +api files when bundling for the client.\n // This ensures that the client doesn't accidentally use the server-only +api files.\n return worker.transform(config, projectRoot, filename, Buffer.from(''), options);\n }\n\n return worker.transform(config, projectRoot, filename, data, options);\n }\n\n // If the platform is not web, then return an empty module.\n if (options.platform !== 'web') {\n const code = matchCssModule(filename) ? 'module.exports={ unstable_styles: {} };' : '';\n return worker.transform(\n config,\n projectRoot,\n filename,\n // TODO: Native CSS Modules\n Buffer.from(code),\n options\n );\n }\n\n let code = data.toString('utf8');\n\n // Apply postcss transforms\n code = await transformPostCssModule(projectRoot, {\n src: code,\n filename,\n });\n\n // TODO: When native has CSS support, this will need to move higher up.\n const syntax = matchSass(filename);\n if (syntax) {\n code = compileSass(projectRoot, { filename, src: code }, { syntax }).src;\n }\n\n // If the file is a CSS Module, then transform it to a JS module\n // in development and a static CSS file in production.\n if (matchCssModule(filename)) {\n const results = await transformCssModuleWeb({\n filename,\n src: code,\n options: {\n projectRoot,\n dev: options.dev,\n minify: options.minify,\n sourceMap: false,\n },\n });\n\n const jsModuleResults = await worker.transform(\n config,\n projectRoot,\n filename,\n Buffer.from(results.output),\n options\n );\n\n const cssCode = results.css.toString();\n const output: JsOutput[] = [\n {\n type: 'js/module',\n data: {\n // @ts-expect-error\n ...jsModuleResults.output[0]?.data,\n\n // Append additional css metadata for static extraction.\n css: {\n code: cssCode,\n lineCount: countLines(cssCode),\n map: [],\n functionMap: null,\n },\n },\n },\n ];\n\n return {\n dependencies: jsModuleResults.dependencies,\n output,\n };\n }\n\n // Global CSS:\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,\n code: Buffer.from(code),\n sourceMap: false,\n cssModules: false,\n projectRoot,\n minify: options.minify,\n });\n\n // TODO: Warnings:\n // cssResults.warnings.forEach((warning) => {\n // });\n\n // Create a mock JS module that exports an empty object,\n // this ensures Metro dependency graph is correct.\n const jsModuleResults = await worker.transform(\n config,\n projectRoot,\n filename,\n options.dev ? Buffer.from(wrapDevelopmentCSS({ src: code, filename })) : Buffer.from(''),\n options\n );\n\n const cssCode = cssResults.code.toString();\n\n // In production, we export the CSS as a string and use a special type to prevent\n // it from being included in the JS bundle. We'll extract the CSS like an asset later\n // and append it to the HTML bundle.\n const output: JsOutput[] = [\n {\n type: 'js/module',\n data: {\n // @ts-expect-error\n ...jsModuleResults.output[0]?.data,\n\n // Append additional css metadata for static extraction.\n css: {\n code: cssCode,\n lineCount: countLines(cssCode),\n map: [],\n functionMap: null,\n },\n },\n },\n ];\n\n return {\n dependencies: jsModuleResults.dependencies,\n output,\n };\n}\n\n/**\n * A custom Metro transformer that adds support for processing Expo-specific bundler features.\n * - Global CSS files on web.\n * - CSS Modules on web.\n * - TODO: Tailwind CSS on web.\n */\nmodule.exports = {\n // Use defaults for everything that's not custom.\n ...worker,\n transform,\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/metro-config",
3
- "version": "0.12.0",
3
+ "version": "0.13.1",
4
4
  "description": "A Metro config for running React Native projects with the Metro bundler",
5
5
  "main": "build/ExpoMetroConfig.js",
6
6
  "scripts": {
@@ -56,5 +56,5 @@
56
56
  "publishConfig": {
57
57
  "access": "public"
58
58
  },
59
- "gitHead": "79607a7325f47aa17c36d266100d09a4ff2cc544"
59
+ "gitHead": "ff40b4b373ce2944d1541f70969db65e3e5c1999"
60
60
  }