1{"version":3,"file":"transform-worker.js","names":["countLines","require","transform","config","projectRoot","filename","data","options","isCss","type","endsWith","worker","platform","code","matchCssModule","Buffer","from","toString","results","transformCssModuleWeb","src","dev","minify","sourceMap","output","jsModuleResults","cssCode","css","lineCount","map","functionMap","dependencies","wrapDevelopmentCSS","cssResults","cssModules","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';\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' && filename.endsWith('.css');\n // If the file is not CSS, then use the default behavior.\n if (!isCss) {\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={};' : '';\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 const code = data.toString('utf8');\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 if (options.dev) {\n // Dev has the CSS appended to the JS file.\n return worker.transform(config, projectRoot, filename, Buffer.from(results.output), options);\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 if (options.dev) {\n return worker.transform(\n config,\n projectRoot,\n filename,\n // In development, we use a JS file that appends a style tag to the\n // document. This is necessary because we need to replace the style tag\n // when the CSS changes.\n // NOTE: We may change this to better support static rendering in the future.\n Buffer.from(wrapDevelopmentCSS({ src: code, filename })),\n options\n );\n }\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 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 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 type: 'js/module',\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\n transform,\n};\n"],"mappings":"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"}