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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"}