{"version":3,"sources":["../ui/src/constants/forbidden-routes.ts","../ui/src/constants/injection-zones.ts","../src/node/actions/build.ts","../src/node/utils/create-cache-dir.ts","../src/node/utils/copy-filter.ts","../src/node/utils/create-entry.ts","../src/node/utils/logger.ts","../src/node/utils/normalize-path.ts","../src/node/utils/validate-extensions.ts","../src/node/utils/get-client-env.ts","../src/node/utils/watch-local-admin-folder.ts","../src/node/webpack/get-custom-webpack-config.ts","../src/node/utils/validate-args.ts","../src/node/webpack/get-webpack-config.ts","../src/node/constants.ts","../src/node/webpack/webpack-aliases.ts","../src/node/webpack/with-custom-webpack-config.ts","../src/node/actions/clean.ts","../src/node/actions/develop.ts"],"sourcesContent":["export const forbiddenRoutes = [\n  \"/products\",\n  \"/products/:id\",\n  \"/product-categories\",\n  \"/product-categories\",\n  \"/orders\",\n  \"/orders/:id\",\n  \"/customers\",\n  \"/customers/:id\",\n  \"/customers/groups\",\n  \"/customers/groups/:id\",\n  \"/discounts\",\n  \"/discounts/new\",\n  \"/discounts/:id\",\n  \"/gift-cards\",\n  \"/gift-cards/:id\",\n  \"/gift-cards/manage\",\n  \"/pricing\",\n  \"/pricing/new\",\n  \"/pricing/:id\",\n  \"/inventory\",\n  \"/collections\",\n  \"/collections/:id\",\n  \"/draft-orders\",\n  \"/draft-orders/:id\",\n  \"/login\",\n  \"/sales-channels\",\n  \"/publishable-api-keys\",\n  \"/oauth\",\n  \"/oauth/:app_name\",\n] as const\n\nexport const isSettingsRoute = (route: string) => {\n  return route.startsWith(\"/settings\")\n}\n\nexport const isForbiddenRoute = (route: any): boolean => {\n  if (isSettingsRoute(route)) {\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `The route \"${route}\" is a settings route. Please register the extension in the \"settings\" directory instead.`\n      )\n    }\n\n    return true\n  }\n\n  if (forbiddenRoutes.includes(route)) {\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `The route \"${route}\" is a forbidden route. We do not currently support overriding default routes.`\n      )\n    }\n\n    return true\n  }\n\n  return false\n}\n","export const injectionZones = [\n  // Order injection zones\n  \"order.details.before\",\n  \"order.details.after\",\n  \"order.list.before\",\n  \"order.list.after\",\n  // Draft order injection zones\n  \"draft_order.list.before\",\n  \"draft_order.list.after\",\n  \"draft_order.details.before\",\n  \"draft_order.details.after\",\n  // Customer injection zones\n  \"customer.details.before\",\n  \"customer.details.after\",\n  \"customer.list.before\",\n  \"customer.list.after\",\n  // Customer group injection zones\n  \"customer_group.details.before\",\n  \"customer_group.details.after\",\n  \"customer_group.list.before\",\n  \"customer_group.list.after\",\n  // Product injection zones\n  \"product.details.before\",\n  \"product.details.after\",\n  \"product.list.before\",\n  \"product.list.after\",\n  // Product collection injection zones\n  \"product_collection.details.before\",\n  \"product_collection.details.after\",\n  \"product_collection.list.before\",\n  \"product_collection.list.after\",\n  // Price list injection zones\n  \"price_list.details.before\",\n  \"price_list.details.after\",\n  \"price_list.list.before\",\n  \"price_list.list.after\",\n  // Discount injection zones\n  \"discount.details.before\",\n  \"discount.details.after\",\n  \"discount.list.before\",\n  \"discount.list.after\",\n  // Gift card injection zones\n  \"gift_card.details.before\",\n  \"gift_card.details.after\",\n  \"gift_card.list.before\",\n  \"gift_card.list.after\",\n  \"custom_gift_card.before\",\n  \"custom_gift_card.after\",\n  // Login\n  \"login.before\",\n  \"login.after\",\n] as const\n","import path from \"node:path\"\nimport webpack, { WebpackError } from \"webpack\"\nimport { BuildArgs } from \"../types\"\nimport { logger } from \"../utils\"\nimport { createCacheDir } from \"../utils/create-cache-dir\"\nimport { getCustomWebpackConfig } from \"../webpack\"\n\n/**\n * Builds the admin UI.\n */\nexport async function build({\n  appDir,\n  buildDir,\n  plugins,\n  options,\n  reporting = \"fancy\",\n}: BuildArgs) {\n  if (!process.env.PLUGIN_ADMIN_UI_SKIP_CACHE) {\n    await createCacheDir({ appDir, plugins })\n  }\n\n  const cacheDir = path.resolve(appDir, \".cache\")\n  const entry = path.resolve(cacheDir, \"admin\", \"src\", \"main.tsx\")\n  const dest = path.resolve(appDir, buildDir)\n  const env = \"production\"\n\n  const config = await getCustomWebpackConfig(appDir, {\n    entry,\n    dest,\n    cacheDir,\n    env,\n    options,\n    reporting,\n  })\n\n  const compiler = webpack(config)\n\n  return new Promise((resolve, reject) => {\n    compiler.run((err: WebpackError, stats) => {\n      if (err) {\n        if (err.details) {\n          logger.error(err.details)\n        }\n\n        reject(err)\n      }\n\n      const info = stats.toJson()\n\n      if (stats.hasErrors()) {\n        logger.error(JSON.stringify(info.errors))\n      }\n\n      return resolve({\n        stats,\n        warnings: info.warnings,\n      })\n    })\n  })\n}\n","import fse from \"fs-extra\"\nimport path from \"node:path\"\nimport { copyFilter } from \"./copy-filter\"\nimport { createEntry } from \"./create-entry\"\nimport { logger } from \"./logger\"\n\nasync function copyAdmin(dest: string) {\n  if (process.env.PLUGIN_ADMIN_UI_SKIP_CACHE) {\n    return true\n  }\n\n  const adminDir = path.resolve(__dirname, \"..\", \"ui\")\n  const destDir = path.resolve(dest, \"admin\")\n\n  try {\n    await fse.copy(adminDir, destDir, {\n      filter: copyFilter,\n    })\n  } catch (err) {\n    logger.panic(\n      `Could not copy the admin UI to ${destDir}. See the error below for details:`,\n      {\n        error: err,\n      }\n    )\n  }\n}\n\ntype CreateCacheDirArgs = {\n  appDir: string\n  plugins?: string[]\n}\n\nasync function createCacheDir({ appDir, plugins }: CreateCacheDirArgs) {\n  const cacheDir = path.resolve(appDir, \".cache\")\n\n  await copyAdmin(cacheDir)\n\n  await createEntry({\n    appDir,\n    dest: cacheDir,\n    plugins,\n  })\n\n  return {\n    cacheDir,\n  }\n}\n\nexport { createCacheDir }\n","import fse from \"fs-extra\"\n\n/**\n * Filter function to exclude test files and folders, as well as webpack configurations from being copied to the cache folder.\n */\nexport function copyFilter(src: string) {\n  if (fse.lstatSync(src).isDirectory() && src.includes(\"__test__\")) {\n    return false\n  }\n\n  if (fse.lstatSync(src).isFile()) {\n    if (\n      src.includes(\".test\") ||\n      src.includes(\".spec\") ||\n      src.includes(\"webpack.config\")\n    ) {\n      return false\n    }\n  }\n\n  return true\n}\n","import fse from \"fs-extra\"\nimport path from \"node:path\"\nimport dedent from \"ts-dedent\"\nimport { copyFilter } from \"./copy-filter\"\nimport { logger } from \"./logger\"\nimport { normalizePath } from \"./normalize-path\"\nimport {\n  findAllValidRoutes,\n  findAllValidSettings,\n  findAllValidWidgets,\n} from \"./validate-extensions\"\n\nconst FILE_EXT_REGEX = /\\.[^/.]+$/\n\nasync function copyLocalExtensions(src: string, dest: string) {\n  if (process.env.PLUGIN_ADMIN_UI_SKIP_CACHE) {\n    return true\n  }\n\n  try {\n    await fse.copy(src, dest, {\n      filter: copyFilter,\n    })\n  } catch (err) {\n    logger.error(\n      `Could not copy local extensions to cache folder. See the error below for details:`,\n      {\n        error: err,\n      }\n    )\n\n    return false\n  }\n\n  return true\n}\n\n/**\n * Creates an entry file for any local extensions, if they exist.\n */\nasync function createLocalExtensionsEntry(appDir: string, dest: string) {\n  const localAdminDir = path.resolve(appDir, \"src\", \"admin\")\n\n  const localAdminDirExists = await fse.pathExists(localAdminDir)\n\n  if (!localAdminDirExists) {\n    return false\n  }\n\n  const copied = await copyLocalExtensions(\n    localAdminDir,\n    path.resolve(dest, \"admin\", \"src\", \"extensions\")\n  )\n\n  if (!copied) {\n    logger.error(\n      \"Could not copy local extensions to cache folder. See above error for details. The error must be fixed before any local extensions can be injected.\"\n    )\n    return false\n  }\n\n  const [localWidgets, localRoutes, localSettings] = await Promise.all([\n    findAllValidWidgets(\n      path.resolve(dest, \"admin\", \"src\", \"extensions\", \"widgets\")\n    ),\n    findAllValidRoutes(\n      path.resolve(dest, \"admin\", \"src\", \"extensions\", \"routes\")\n    ),\n    findAllValidSettings(\n      path.resolve(dest, \"admin\", \"src\", \"extensions\", \"settings\")\n    ),\n  ])\n\n  const widgetsArray = localWidgets.map((file, index) => {\n    const relativePath = normalizePath(\n      path\n        .relative(path.resolve(dest, \"admin\", \"src\", \"extensions\"), file)\n        .replace(FILE_EXT_REGEX, \"\")\n    )\n\n    return {\n      importStatement: `import Widget${index}, { config as widgetConfig${index} } from \"./${relativePath}\"`,\n      extension: `{ Component: Widget${index}, config: { ...widgetConfig${index}, type: \"widget\" } }`,\n    }\n  })\n\n  const routesArray = localRoutes.map((route, index) => {\n    const relativePath = normalizePath(\n      path\n        .relative(path.resolve(dest, \"admin\", \"src\", \"extensions\"), route.file)\n        .replace(FILE_EXT_REGEX, \"\")\n    )\n\n    const importStatement = route.hasConfig\n      ? `import Page${index}, { config as routeConfig${index} } from \"./${relativePath}\"`\n      : `import Page${index} from \"./${relativePath}\"`\n\n    const extension = route.hasConfig\n      ? `{ Component: Page${index}, config: { ...routeConfig${index}, type: \"route\",  path: \"${route.path}\" } }`\n      : `{ Component: Page${index}, config: { path: \"${route.path}\", type: \"route\" } }`\n\n    return {\n      importStatement,\n      extension,\n    }\n  })\n\n  const settingsArray = localSettings.map((setting, index) => {\n    const relativePath = normalizePath(\n      path\n        .relative(\n          path.resolve(dest, \"admin\", \"src\", \"extensions\"),\n          setting.file\n        )\n        .replace(FILE_EXT_REGEX, \"\")\n    )\n\n    return {\n      importStatement: `import Setting${index}, { config as settingConfig${index} } from \"./${relativePath}\"`,\n      extension: `{ Component: Setting${index}, config: { ...settingConfig${index}, path: \"${setting.path}\", type: \"setting\" } }`,\n    }\n  })\n\n  const extensionsArray = [...widgetsArray, ...routesArray, ...settingsArray]\n\n  const extensionsEntry = dedent`\n    ${extensionsArray.map((extension) => extension.importStatement).join(\"\\n\")}\n\n    const LocalEntry = {\n      identifier: \"local\",\n      extensions: [\n        ${extensionsArray.map((extension) => extension.extension).join(\",\\n\")}\n      ],\n    }\n\n    export default LocalEntry\n  `\n\n  try {\n    await fse.outputFile(\n      path.resolve(dest, \"admin\", \"src\", \"extensions\", \"_local-entry.ts\"),\n      extensionsEntry\n    )\n  } catch (err) {\n    logger.panic(\n      `Failed to write the entry file for the local extensions. See the error below for details:`,\n      {\n        error: err,\n      }\n    )\n  }\n\n  return true\n}\n\nfunction findPluginsWithExtensions(plugins: string[]) {\n  const pluginsWithExtensions: string[] = []\n\n  for (const plugin of plugins) {\n    try {\n      const pluginDir = path.dirname(\n        require.resolve(`${plugin}/package.json`, {\n          paths: [process.cwd()],\n        })\n      )\n      const entrypoint = path.resolve(\n        pluginDir,\n        \"dist\",\n        \"admin\",\n        \"_virtual_entry.js\"\n      )\n\n      if (fse.existsSync(entrypoint)) {\n        pluginsWithExtensions.push(entrypoint)\n      }\n    } catch (_err) {\n      logger.warn(\n        `There was an error while attempting to load extensions from the plugin: ${plugin}. Are you sure it is installed?`\n      )\n      // no plugin found - noop\n    }\n  }\n\n  return pluginsWithExtensions\n}\n\nasync function writeTailwindContentFile(dest: string, plugins: string[]) {\n  const tailwindContent = dedent`\n    const path = require(\"path\")\n\n    const devPath = path.join(__dirname, \"..\", \"..\", \"src/admin/**/*.{js,jsx,ts,tsx}\")\n\n    module.exports = {\n      content: [\n        devPath,\n        ${plugins\n          .map((plugin) => {\n            const tailwindContentPath = normalizePath(\n              path.relative(\n                path.resolve(dest, \"admin\"),\n                path.dirname(path.join(plugin, \"..\", \"..\"))\n              )\n            )\n\n            return `\"${tailwindContentPath}/dist/admin/**/*.{js,jsx,ts,tsx}\"`\n          })\n          .join(\",\\n\")}\n      ],\n    }\n  \n  `\n\n  try {\n    await fse.outputFile(\n      path.resolve(dest, \"admin\", \"tailwind.content.js\"),\n      tailwindContent\n    )\n  } catch (err) {\n    logger.warn(\n      `Failed to write the Tailwind content file to ${dest}. The admin UI will remain functional, but CSS classes applied to extensions from plugins might not have the correct styles`\n    )\n  }\n}\n\nasync function createMainExtensionsEntry(\n  dest: string,\n  plugins: string[],\n  hasLocalExtensions: boolean\n) {\n  if (!plugins.length && !hasLocalExtensions) {\n    // We still want to generate the entry file, even if there are no extensions\n    // to load, so that the admin UI can be built without errors\n    const emptyEntry = dedent`\n      const extensions = []\n\n      export default extensions\n    `\n\n    try {\n      await fse.outputFile(\n        path.resolve(dest, \"admin\", \"src\", \"extensions\", \"_main-entry.ts\"),\n        emptyEntry\n      )\n    } catch (err) {\n      logger.panic(\n        `Failed to write the entry file for the main extensions. See the error below for details:`,\n        {\n          error: err,\n        }\n      )\n    }\n\n    return\n  }\n\n  const pluginsArray = plugins.map((plugin) => {\n    const relativePath = normalizePath(\n      path\n        .relative(path.resolve(dest, \"admin\", \"src\", \"extensions\"), plugin)\n        .replace(FILE_EXT_REGEX, \"\")\n    )\n\n    return relativePath\n  })\n\n  const extensionsArray = [\n    ...pluginsArray.map((plugin, index) => {\n      const importStatement = `import Plugin${index} from \"${plugin}\"`\n\n      return {\n        importStatement,\n        extension: `Plugin${index}`,\n      }\n    }),\n    ...(hasLocalExtensions\n      ? [\n          {\n            importStatement: `import LocalEntry from \"./_local-entry\"`,\n            extension: `LocalEntry`,\n          },\n        ]\n      : []),\n  ]\n\n  const extensionsEntry = dedent`\n      ${extensionsArray\n        .map((extension) => extension.importStatement)\n        .join(\"\\n\")}\n\n      const extensions = [\n        ${extensionsArray.map((extension) => extension.extension).join(\",\\n\")}\n      ]\n\n      export default extensions\n    `\n\n  try {\n    await fse.outputFile(\n      path.resolve(dest, \"admin\", \"src\", \"extensions\", \"_main-entry.ts\"),\n      extensionsEntry\n    )\n  } catch (err) {\n    logger.panic(\n      `Failed to write the extensions entry file. See the error below for details:`,\n      {\n        error: err,\n      }\n    )\n  }\n}\n\ntype CreateEntryArgs = {\n  appDir: string\n  dest: string\n  plugins?: string[]\n}\n\nexport async function createEntry({ appDir, dest, plugins }: CreateEntryArgs) {\n  const hasLocalExtensions = await createLocalExtensionsEntry(appDir, dest)\n\n  const adminPlugins = findPluginsWithExtensions(plugins)\n\n  await createMainExtensionsEntry(dest, adminPlugins, hasLocalExtensions)\n  await writeTailwindContentFile(dest, adminPlugins)\n}\n","import colors from \"picocolors\"\nimport readline from \"readline\"\n\nconst prefix = \"[@medusajs/admin]\"\n\ntype LogType = \"error\" | \"warn\" | \"info\"\n\ninterface LogOptions {\n  clearScreen?: boolean\n}\n\ninterface LogErrorOptions extends LogOptions {\n  error?: Error | null\n}\n\ninterface Logger {\n  info(msg: string, options?: LogOptions): void\n  warn(msg: string, options?: LogOptions): void\n  error(msg: string, options?: LogErrorOptions): void\n  panic(msg: string, options?: LogErrorOptions): void\n}\n\nfunction clearScreen() {\n  const repeatCount = process.stdout.rows - 2\n  const blank = repeatCount > 0 ? \"\\n\".repeat(repeatCount) : \"\"\n  console.log(blank)\n  readline.cursorTo(process.stdout, 0, 0)\n  readline.clearScreenDown(process.stdout)\n}\n\nconst canClearScreen = process.stdout.isTTY && !process.env.CI\nconst clear = canClearScreen\n  ? clearScreen\n  : () => {\n      // noop\n    }\n\nfunction createLogger(): Logger {\n  const output = (type: LogType, msg: string, options?: LogErrorOptions) => {\n    const method = type === \"info\" ? \"log\" : type\n    const format = () => {\n      const tag =\n        type === \"info\"\n          ? colors.cyan(colors.bold(prefix))\n          : type === \"warn\"\n          ? colors.yellow(colors.bold(prefix))\n          : colors.red(colors.bold(prefix))\n      return `${colors.dim(new Date().toLocaleTimeString())} ${tag} ${msg}`\n    }\n\n    if (options?.clearScreen) {\n      clear()\n    }\n\n    console[method](format())\n\n    if (options?.error) {\n      console.error(options.error)\n    }\n  }\n\n  return {\n    info: (msg, options) => output(\"info\", msg, options),\n    warn: (msg, options) => output(\"warn\", msg, options),\n    error: (msg, options) => output(\"error\", msg, options),\n    panic: (msg, options) => {\n      output(\"error\", msg, options)\n      output(\"error\", \"Exiting process\", {})\n      process.exit(1)\n    },\n  }\n}\n\nexport const logger = createLogger()\n","export function normalizePath(path: string): string {\n  const isWindows = process.platform === \"win32\"\n  const separator = isWindows ? \"\\\\\" : \"/\"\n  const regex = new RegExp(`\\\\${separator}`, \"g\")\n  return path.replace(regex, \"/\")\n}\n","import { parse, ParseResult, ParserOptions } from \"@babel/parser\"\nimport traverse, { NodePath } from \"@babel/traverse\"\nimport type {\n  ExportDefaultDeclaration,\n  ExportNamedDeclaration,\n  ObjectExpression,\n  ObjectMethod,\n  ObjectProperty,\n  SpreadElement,\n} from \"@babel/types\"\nimport fse from \"fs-extra\"\nimport path from \"path\"\nimport { forbiddenRoutes, InjectionZone, injectionZones } from \"../../client\"\nimport { logger } from \"./logger\"\nimport { normalizePath } from \"./normalize-path\"\n\nfunction isValidInjectionZone(zone: any): zone is InjectionZone {\n  return injectionZones.includes(zone)\n}\n\n/**\n * Validates that the widget config export is valid.\n * In order to be valid it must have a `zone` property that is either a `InjectionZone` or a `InjectionZone` array.\n */\nfunction validateWidgetConfigExport(\n  properties: (ObjectMethod | ObjectProperty | SpreadElement)[]\n): boolean {\n  const zoneProperty = properties.find(\n    (p) =>\n      p.type === \"ObjectProperty\" &&\n      p.key.type === \"Identifier\" &&\n      p.key.name === \"zone\"\n  ) as ObjectProperty | undefined\n\n  if (!zoneProperty) {\n    return false\n  }\n\n  let zoneIsValid = false\n\n  if (zoneProperty.value.type === \"StringLiteral\") {\n    zoneIsValid = isValidInjectionZone(zoneProperty.value.value)\n  } else if (zoneProperty.value.type === \"ArrayExpression\") {\n    zoneIsValid = zoneProperty.value.elements.every(\n      (zone) =>\n        zone.type === \"StringLiteral\" && isValidInjectionZone(zone.value)\n    )\n  }\n\n  return zoneIsValid\n}\n\nfunction validateRouteConfigExport(\n  properties: (ObjectMethod | ObjectProperty | SpreadElement)[]\n): boolean {\n  const linkProperty = properties.find(\n    (p) =>\n      p.type === \"ObjectProperty\" &&\n      p.key.type === \"Identifier\" &&\n      p.key.name === \"link\"\n  ) as ObjectProperty | undefined\n\n  // Link property is optional for routes\n  if (!linkProperty) {\n    return true\n  }\n\n  const linkValue = linkProperty.value as ObjectExpression\n\n  let labelIsValid = false\n\n  // Check that the linkProperty is an object and has a `label` property that is a string\n  if (\n    linkValue.properties.some(\n      (p) =>\n        p.type === \"ObjectProperty\" &&\n        p.key.type === \"Identifier\" &&\n        p.key.name === \"label\" &&\n        p.value.type === \"StringLiteral\"\n    )\n  ) {\n    labelIsValid = true\n  }\n\n  return labelIsValid\n}\n\nfunction validateSettingConfigExport(\n  properties: (ObjectMethod | ObjectProperty | SpreadElement)[]\n): boolean {\n  const cardProperty = properties.find(\n    (p) =>\n      p.type === \"ObjectProperty\" &&\n      p.key.type === \"Identifier\" &&\n      p.key.name === \"card\"\n  ) as ObjectProperty | undefined\n\n  // Link property is required for settings\n  if (!cardProperty) {\n    return false\n  }\n\n  const cardValue = cardProperty.value as ObjectExpression\n\n  let hasLabel = false\n  let hasDescription = false\n\n  if (\n    cardValue.properties.some(\n      (p) =>\n        p.type === \"ObjectProperty\" &&\n        p.key.type === \"Identifier\" &&\n        p.key.name === \"label\" &&\n        p.value.type === \"StringLiteral\"\n    )\n  ) {\n    hasLabel = true\n  }\n\n  if (\n    cardValue.properties.some(\n      (p) =>\n        p.type === \"ObjectProperty\" &&\n        p.key.type === \"Identifier\" &&\n        p.key.name === \"description\" &&\n        p.value.type === \"StringLiteral\"\n    )\n  ) {\n    hasDescription = true\n  }\n\n  return hasLabel && hasDescription\n}\n\nfunction validateConfigExport(\n  path: NodePath<ExportNamedDeclaration>,\n  type: \"widget\" | \"route\" | \"setting\"\n) {\n  let hasValidConfigExport = false\n\n  const declaration = path.node.declaration\n  if (declaration && declaration.type === \"VariableDeclaration\") {\n    const configDeclaration = declaration.declarations.find(\n      (d) =>\n        d.type === \"VariableDeclarator\" &&\n        d.id.type === \"Identifier\" &&\n        d.id.name === \"config\"\n    )\n\n    if (\n      configDeclaration &&\n      configDeclaration.init.type === \"ObjectExpression\"\n    ) {\n      const properties = configDeclaration.init.properties\n\n      if (type === \"widget\") {\n        hasValidConfigExport = validateWidgetConfigExport(properties)\n      }\n\n      if (type === \"route\") {\n        hasValidConfigExport = validateRouteConfigExport(properties)\n      }\n\n      if (type === \"setting\") {\n        hasValidConfigExport = validateSettingConfigExport(properties)\n      }\n    } else {\n      hasValidConfigExport = false\n    }\n  }\n\n  return hasValidConfigExport\n}\n\n/**\n * Validates that the default export of a file is a valid React component.\n * This is determined by checking if the default export is a function declaration\n * with a return statement that returns a JSX element or fragment.\n */\nfunction validateDefaultExport(\n  path: NodePath<ExportDefaultDeclaration>,\n  ast: ParseResult<any>\n) {\n  let hasComponentExport = false\n\n  const declaration = path.node.declaration\n  if (\n    declaration &&\n    (declaration.type === \"Identifier\" ||\n      declaration.type === \"FunctionDeclaration\")\n  ) {\n    const exportName =\n      declaration.type === \"Identifier\"\n        ? declaration.name\n        : declaration.id && declaration.id.name\n\n    if (exportName) {\n      try {\n        traverse(ast, {\n          VariableDeclarator({ node, scope }) {\n            let isDefaultExport = false\n\n            if (node.id.type === \"Identifier\" && node.id.name === exportName) {\n              isDefaultExport = true\n            }\n\n            if (!isDefaultExport) {\n              return\n            }\n\n            traverse(\n              node,\n              {\n                ReturnStatement(path) {\n                  if (\n                    path.node.argument?.type === \"JSXElement\" ||\n                    path.node.argument?.type === \"JSXFragment\"\n                  ) {\n                    hasComponentExport = true\n                  }\n                },\n              },\n              scope\n            )\n          },\n        })\n      } catch (e) {\n        logger.error(\n          `There was an error while validating the default export of ${path}. The following error must be resolved before continuing:`,\n          {\n            error: e,\n          }\n        )\n        return false\n      }\n    }\n  }\n\n  return hasComponentExport\n}\n\n/**\n * Validates that a widget file has a valid default export and a valid config export.\n *\n */\nasync function validateWidget(file: string) {\n  const content = await fse.readFile(file, \"utf-8\")\n\n  const parserOptions: ParserOptions = {\n    sourceType: \"module\",\n    plugins: [\"jsx\"],\n  }\n\n  if (file.endsWith(\".ts\") || file.endsWith(\".tsx\")) {\n    parserOptions.plugins.push(\"typescript\")\n  }\n\n  let ast: ParseResult<any>\n\n  try {\n    ast = parse(content, parserOptions)\n  } catch (e) {\n    logger.error(\n      `An error occurred while parsing the Widget \"${file}\", and the Widget cannot be injected. The following error must be resolved before continuing:`,\n      {\n        error: e,\n      }\n    )\n    return false\n  }\n\n  let hasConfigExport = false\n  let hasComponentExport = false\n\n  try {\n    traverse(ast, {\n      ExportDefaultDeclaration: (path) => {\n        hasComponentExport = validateDefaultExport(path, ast)\n      },\n      ExportNamedDeclaration: (path) => {\n        hasConfigExport = validateConfigExport(path, \"widget\")\n      },\n    })\n  } catch (e) {\n    logger.error(\n      `An error occurred while validating the Widget \"${file}\". The following error must be resolved before continuing:`,\n      {\n        error: e,\n      }\n    )\n    return false\n  }\n\n  if (hasConfigExport && !hasComponentExport) {\n    if (!hasComponentExport) {\n      logger.error(\n        `The default export in the Widget \"${file}\" is invalid and the widget will not be injected. Please make sure that the default export is a valid React component.`\n      )\n    }\n  }\n\n  if (!hasConfigExport && hasComponentExport) {\n    logger.error(\n      `The Widget config export in \"${file}\" is invalid and the Widget cannot be injected. Please ensure that the config is valid.`\n    )\n  }\n\n  return hasConfigExport && hasComponentExport\n}\n\n/**\n * This function takes a file path and converts it to a URL path.\n * It converts the file path to a URL path by replacing any\n * square brackets with colons, and then removing the \"page.[jt]s\" suffix.\n */\nfunction createPath(filePath: string): string {\n  const normalizedPath = normalizePath(filePath)\n\n  const regex = /\\[(.*?)\\]/g\n  const strippedPath = normalizedPath.replace(regex, \":$1\")\n\n  const url = strippedPath.replace(/\\/page\\.[jt]sx?$/i, \"\")\n\n  return url\n}\n\nfunction isForbiddenRoute(path: any): boolean {\n  return forbiddenRoutes.includes(path)\n}\n\nfunction validatePath(\n  path: string,\n  origin: string\n): {\n  valid: boolean\n  error: string\n} {\n  if (isForbiddenRoute(path)) {\n    return {\n      error: `A route from ${origin} is using a forbidden path: ${path}.`,\n      valid: false,\n    }\n  }\n\n  const specialChars = [\"/\", \":\", \"-\"]\n\n  for (let i = 0; i < path.length; i++) {\n    const currentChar = path[i]\n\n    if (\n      !specialChars.includes(currentChar) &&\n      !/^[a-z0-9]$/i.test(currentChar)\n    ) {\n      return {\n        error: `A route from ${origin} is using an invalid path: ${path}. Only alphanumeric characters, \"/\", \":\", and \"-\" are allowed.`,\n        valid: false,\n      }\n    }\n\n    if (currentChar === \":\" && (i === 0 || path[i - 1] !== \"/\")) {\n      return {\n        error: `A route from ${origin} is using an invalid path: ${path}. All dynamic segments must be preceded by a \"/\".`,\n        valid: false,\n      }\n    }\n  }\n\n  return {\n    valid: true,\n    error: \"\",\n  }\n}\n\n/**\n * Validates that a file is a valid route.\n * This is determined by checking if the file exports a valid React component\n * as the default export, and a optional route config as a named export.\n * If the file is not a valid route, `null` is returned.\n * If the file is a valid route, a `ValidRouteResult` is returned.\n */\nasync function validateRoute(\n  file: string,\n  basePath: string\n): Promise<{\n  path: string\n  hasConfig: boolean\n  file: string\n} | null> {\n  const cleanPath = createPath(file.replace(basePath, \"\"))\n\n  const { valid, error } = validatePath(cleanPath, file)\n\n  if (!valid) {\n    logger.error(\n      `The path ${cleanPath} for the UI Route \"${file}\" is invalid and the route cannot be injected. The following error must be fixed before the route can be injected: ${error}`\n    )\n\n    return null\n  }\n\n  const content = await fse.readFile(file, \"utf-8\")\n\n  let hasComponentExport = false\n  let hasConfigExport = false\n\n  const parserOptions: ParserOptions = {\n    sourceType: \"module\",\n    plugins: [\"jsx\"],\n  }\n\n  if (file.endsWith(\".ts\") || file.endsWith(\".tsx\")) {\n    parserOptions.plugins.push(\"typescript\")\n  }\n\n  let ast: ParseResult<any>\n\n  try {\n    ast = parse(content, parserOptions)\n  } catch (e) {\n    logger.error(\n      `An error occurred while parsing the UI Route \"${file}\", and the UI Route cannot be injected. The following error must be resolved before continuing:`,\n      {\n        error: e,\n      }\n    )\n    return null\n  }\n\n  try {\n    traverse(ast, {\n      ExportDefaultDeclaration: (path) => {\n        hasComponentExport = validateDefaultExport(path, ast)\n      },\n      ExportNamedDeclaration: (path) => {\n        hasConfigExport = validateConfigExport(path, \"route\")\n      },\n    })\n  } catch (e) {\n    logger.error(\n      `An error occurred while validating the UI Route \"${file}\", and the UI Route cannot be injected. The following error must be resolved before continuing:`,\n      {\n        error: e,\n      }\n    )\n    return null\n  }\n\n  if (!hasComponentExport) {\n    logger.error(\n      `The default export in the UI Route \"${file}\" is invalid and the route cannot be injected. Please make sure that the default export is a valid React component.`\n    )\n\n    return null\n  }\n\n  return {\n    path: cleanPath,\n    hasConfig: hasConfigExport,\n    file,\n  }\n}\n\nasync function validateSetting(file: string, basePath: string) {\n  const cleanPath = createPath(file.replace(basePath, \"\"))\n\n  const { valid, error } = validatePath(cleanPath, file)\n\n  if (!valid) {\n    logger.error(\n      `The path ${cleanPath} for the Setting \"${file}\" is invalid and the setting cannot be injected. The following error must be fixed before the Setting can be injected: ${error}`\n    )\n\n    return null\n  }\n\n  const content = await fse.readFile(file, \"utf-8\")\n\n  let hasComponentExport = false\n  let hasConfigExport = false\n\n  const parserOptions: ParserOptions = {\n    sourceType: \"module\",\n    plugins: [\"jsx\"],\n  }\n\n  if (file.endsWith(\".ts\") || file.endsWith(\".tsx\")) {\n    parserOptions.plugins.push(\"typescript\")\n  }\n\n  let ast: ParseResult<any>\n\n  try {\n    ast = parse(content, parserOptions)\n  } catch (e) {\n    logger.error(\n      `\n      An error occured while parsing the Setting \"${file}\". The following error must be resolved before continuing:\n      `,\n      {\n        error: e,\n      }\n    )\n\n    return null\n  }\n\n  try {\n    traverse(ast, {\n      ExportDefaultDeclaration: (path) => {\n        hasComponentExport = validateDefaultExport(path, ast)\n      },\n      ExportNamedDeclaration: (path) => {\n        hasConfigExport = validateConfigExport(path, \"setting\")\n      },\n    })\n  } catch (e) {\n    logger.error(\n      `\n      An error occured while validating the Setting \"${file}\". The following error must be resolved before continuing:`,\n      {\n        error: e,\n      }\n    )\n    return null\n  }\n\n  if (!hasComponentExport) {\n    logger.error(\n      `The default export in the Setting \"${file}\" is invalid and the page will not be injected. Please make sure that the default export is a valid React component.`\n    )\n\n    return null\n  }\n\n  if (!hasConfigExport) {\n    logger.error(\n      `The named export \"config\" in the Setting \"${file}\" is invalid or missing and the settings page will not be injected. Please make sure that the file exports a valid config.`\n    )\n\n    return null\n  }\n\n  return {\n    path: cleanPath,\n    file,\n  }\n}\n\nasync function findAllValidSettings(dir: string) {\n  const settingsFiles: string[] = []\n\n  const dirExists = await fse.pathExists(dir)\n\n  if (!dirExists) {\n    return []\n  }\n\n  const paths = await fse.readdir(dir)\n\n  let hasSubDirs = false\n\n  // We only check the first level of directories for settings files\n  for (const pa of paths) {\n    const filePath = path.join(dir, pa)\n    const fileStat = await fse.stat(filePath)\n\n    if (fileStat.isDirectory()) {\n      const files = await fse.readdir(filePath)\n\n      for (const file of files) {\n        const filePath = path.join(dir, pa, file)\n        const fileStat = await fse.stat(filePath)\n\n        if (fileStat.isFile() && /^(.*\\/)?page\\.[jt]sx?$/i.test(file)) {\n          settingsFiles.push(filePath)\n          break\n        } else if (fileStat.isDirectory()) {\n          hasSubDirs = true\n        }\n      }\n    }\n  }\n\n  if (hasSubDirs) {\n    logger.warn(\n      `The directory ${dir} contains subdirectories. Settings do not support nested routes, only UI Routes support nested paths.`\n    )\n  }\n\n  const validSettingsFiles = await Promise.all(\n    settingsFiles.map(async (file) => validateSetting(file, dir))\n  )\n\n  return validSettingsFiles.filter((file) => file !== null)\n}\n\n/**\n * Scans a directory for valid widgets.\n * A valid widget is a file that exports a valid widget config and a valid React component.\n */\nasync function findAllValidWidgets(dir: string) {\n  const jsxAndTsxFiles: string[] = []\n\n  const dirExists = await fse.pathExists(dir)\n\n  if (!dirExists) {\n    return []\n  }\n\n  async function traverseDirectory(currentPath: string) {\n    const files = await fse.readdir(currentPath)\n\n    for (const file of files) {\n      const filePath = path.join(currentPath, file)\n      const fileStat = await fse.stat(filePath)\n\n      if (fileStat.isDirectory()) {\n        await traverseDirectory(filePath)\n      } else if (fileStat.isFile() && /\\.(js|jsx|ts|tsx)$/i.test(file)) {\n        jsxAndTsxFiles.push(filePath)\n      }\n    }\n  }\n\n  await traverseDirectory(dir)\n\n  const promises = jsxAndTsxFiles.map((file) => {\n    const isValid = validateWidget(file)\n\n    return isValid ? file : null\n  })\n\n  const validFiles = await Promise.all(promises)\n\n  return validFiles.filter((file) => file !== null)\n}\n\n/**\n * Scans a directory for valid routes.\n * A valid route is a file that exports a optional route config and a valid React component.\n */\nasync function findAllValidRoutes(dir: string) {\n  const pageFiles: string[] = []\n\n  const dirExists = await fse.pathExists(dir)\n\n  if (!dirExists) {\n    return []\n  }\n\n  async function traverseDirectory(currentPath: string) {\n    const files = await fse.readdir(currentPath)\n\n    for (const file of files) {\n      const filePath = path.join(currentPath, file)\n      const fileStat = await fse.stat(filePath)\n\n      if (fileStat.isDirectory()) {\n        await traverseDirectory(filePath)\n      } else if (fileStat.isFile() && /^(.*\\/)?page\\.[jt]sx?$/i.test(file)) {\n        pageFiles.push(filePath)\n      }\n    }\n  }\n\n  await traverseDirectory(dir)\n\n  const promises = pageFiles.map(async (file) => {\n    return validateRoute(file, dir)\n  })\n\n  const validFiles = await Promise.all(promises)\n\n  return validFiles.filter((file) => file !== null)\n}\n\nexport {\n  createPath,\n  validateWidget,\n  validateRoute,\n  validateSetting,\n  findAllValidSettings,\n  findAllValidWidgets,\n  findAllValidRoutes,\n}\n","import dotenv from \"dotenv\"\nimport fse from \"fs-extra\"\nimport path from \"node:path\"\n\nconst MEDUSA_ADMIN = /^MEDUSA_ADMIN_/i\n\nlet ENV_FILE_NAME = \"\"\nswitch (process.env.NODE_ENV) {\n  case \"production\":\n    ENV_FILE_NAME = \".env.production\"\n    break\n  case \"staging\":\n    ENV_FILE_NAME = \".env.staging\"\n    break\n  case \"test\":\n    ENV_FILE_NAME = \".env.test\"\n    break\n  case \"development\":\n  default:\n    ENV_FILE_NAME = \".env\"\n    break\n}\n\nif (fse.existsSync(ENV_FILE_NAME)) {\n  dotenv.config({ path: path.resolve(process.cwd(), ENV_FILE_NAME) })\n} else if (ENV_FILE_NAME !== \".env\") {\n  // Fall back to .env if the specified file does not exist\n  dotenv.config({ path: path.resolve(process.cwd(), \".env\") })\n}\n\ntype GetClientEnvArgs = {\n  path?: string\n  env?: string\n  backend?: string\n}\n\nexport const getClientEnv = (args: GetClientEnvArgs) => {\n  const raw = Object.keys(process.env)\n    .filter((key) => MEDUSA_ADMIN.test(key))\n    .reduce(\n      (acc, current) => {\n        acc[current] = process.env[current]\n\n        return acc\n      },\n      {\n        ADMIN_PATH: args.path || \"/\",\n        NODE_ENV: args.env || \"development\",\n        MEDUSA_BACKEND_URL: args.backend || process.env.MEDUSA_BACKEND_URL,\n      }\n    )\n\n  const stringified = {\n    \"process.env\": Object.keys(raw).reduce((env, key) => {\n      env[key] = JSON.stringify(raw[key])\n      return env\n    }, {}),\n  }\n\n  return stringified\n}\n","import chokidar from \"chokidar\"\nimport fse from \"fs-extra\"\nimport path from \"node:path\"\nimport { createEntry } from \"./create-entry\"\nimport { logger } from \"./logger\"\n\n/**\n * Watches the local admin directory for changes and updates the extensions cache directory accordingly.\n */\nexport async function watchLocalAdminFolder(\n  appDir: string,\n  cacheDir: string,\n  plugins: string[]\n) {\n  const adminDir = path.resolve(appDir, \"src\", \"admin\")\n\n  const watcher = chokidar.watch(adminDir, {\n    ignored: /(^|[/\\\\])\\../,\n    ignoreInitial: true,\n  })\n\n  watcher.on(\"all\", async (event, file) => {\n    if (event === \"unlinkDir\" || event === \"unlink\") {\n      removeUnlinkedFile(file, appDir, cacheDir)\n    }\n\n    await createEntry({\n      appDir,\n      dest: cacheDir,\n      plugins,\n    })\n\n    logger.info(\"Extensions cache directory was re-initialized\")\n  })\n\n  process\n    .on(\"SIGINT\", async () => {\n      await watcher.close()\n    })\n    .on(\"SIGTERM\", async () => {\n      await watcher.close()\n    })\n}\n\nfunction removeUnlinkedFile(file: string, appDir: string, cacheDir: string) {\n  const srcDir = path.resolve(appDir, \"src\", \"admin\")\n  const relativePath = path.relative(srcDir, file)\n\n  const destDir = path.resolve(cacheDir, \"admin\", \"src\", \"extensions\")\n  const fileToDelete = path.resolve(destDir, relativePath)\n\n  try {\n    fse.removeSync(fileToDelete)\n  } catch (error) {\n    logger.error(`An error occurred while removing ${fileToDelete}: ${error}`)\n  }\n}\n","import fse from \"fs-extra\"\nimport path from \"node:path\"\nimport webpack from \"webpack\"\nimport { CustomWebpackConfigArgs } from \"../types\"\nimport { logger } from \"../utils\"\nimport { validateArgs } from \"../utils/validate-args\"\nimport { getWebpackConfig } from \"./get-webpack-config\"\nimport { withCustomWebpackConfig } from \"./with-custom-webpack-config\"\n\nexport async function getCustomWebpackConfig(\n  appDir: string,\n  args: CustomWebpackConfigArgs\n) {\n  validateArgs(args)\n\n  let config = getWebpackConfig(args)\n\n  const adminConfigPath = path.join(appDir, \"src\", \"admin\", \"webpack.config.js\")\n\n  const pathExists = await fse.pathExists(adminConfigPath)\n\n  if (pathExists) {\n    let webpackAdminConfig: ReturnType<typeof withCustomWebpackConfig>\n\n    try {\n      webpackAdminConfig = require(adminConfigPath)\n    } catch (e) {\n      logger.panic(\n        `An error occured while trying to load your custom Webpack config. See the error below for details:`,\n        {\n          error: e,\n        }\n      )\n    }\n\n    if (typeof webpackAdminConfig === \"function\") {\n      if (args.devServer) {\n        config.devServer = args.devServer\n      }\n\n      config = webpackAdminConfig(config, webpack)\n\n      if (!config) {\n        logger.panic(\n          \"Nothing was returned from your custom webpack configuration\"\n        )\n      }\n    }\n  }\n\n  return config\n}\n","import { CustomWebpackConfigArgs } from \"../types\"\nimport { logger } from \"./logger\"\n\nfunction validateArgs(args: CustomWebpackConfigArgs) {\n  const { options } = args\n\n  if (options.path) {\n    if (!options.path.startsWith(\"/\")) {\n      logger.panic(\n        \"'path' in the options of `@medusajs/admin` must start with a '/'\"\n      )\n    }\n\n    if (options.path !== \"/\" && options.path.endsWith(\"/\")) {\n      logger.panic(\n        \"'path' in the options of `@medusajs/admin` cannot end with a '/'\"\n      )\n    }\n\n    if (typeof options.path !== \"string\") {\n      logger.panic(\n        \"'path' in the options of `@medusajs/admin` must be a string\"\n      )\n    }\n  }\n}\n\nexport { validateArgs }\n","import ReactRefreshPlugin from \"@pmmmwh/react-refresh-webpack-plugin\"\nimport CopyPlugin from \"copy-webpack-plugin\"\nimport HtmlWebpackPlugin from \"html-webpack-plugin\"\nimport MiniCssExtractPlugin from \"mini-css-extract-plugin\"\nimport path from \"node:path\"\nimport { SwcMinifyWebpackPlugin } from \"swc-minify-webpack-plugin\"\nimport type { Configuration } from \"webpack\"\nimport webpack from \"webpack\"\nimport WebpackBar from \"webpackbar\"\nimport { WebpackConfigArgs } from \"../types\"\nimport { getClientEnv } from \"../utils\"\nimport { webpackAliases } from \"./webpack-aliases\"\n\nfunction formatPublicPath(path?: string) {\n  if (!path) {\n    return \"/app/\"\n  }\n\n  if (path === \"/\") {\n    return path\n  }\n\n  return path.endsWith(\"/\") ? path : `${path}/`\n}\n\nexport function getWebpackConfig({\n  entry,\n  dest,\n  cacheDir,\n  env,\n  options,\n  template,\n  publicFolder,\n  reporting = \"fancy\",\n}: WebpackConfigArgs): Configuration {\n  const isProd = env === \"production\"\n\n  const envVars = getClientEnv({\n    env,\n    backend: options?.backend,\n    path: options?.path,\n  })\n\n  const publicPath = formatPublicPath(options?.path)\n\n  const webpackPlugins = isProd\n    ? [\n        new MiniCssExtractPlugin({\n          filename: \"[name].[chunkhash].css\",\n          chunkFilename: \"[name].[chunkhash].css\",\n        }),\n        new WebpackBar({\n          basic: reporting === \"minimal\",\n          fancy: reporting === \"fancy\",\n        }),\n      ]\n    : [new MiniCssExtractPlugin(), new ReactRefreshPlugin()]\n\n  return {\n    mode: env,\n    devtool: isProd ? false : \"inline-source-map\",\n    entry: [entry],\n    output: {\n      path: dest,\n      filename: isProd ? \"[name].[contenthash:8].js\" : \"[name].bundle.js\",\n      chunkFilename: isProd\n        ? \"[name].[contenthash:8].chunk.js\"\n        : \"[name].chunk.js\",\n    },\n    optimization: {\n      minimize: true,\n      minimizer: [new SwcMinifyWebpackPlugin()],\n      moduleIds: \"deterministic\",\n      runtimeChunk: true,\n    },\n    module: {\n      rules: [\n        {\n          test: /\\.tsx?$/,\n          exclude: /node_modules/,\n          include: [cacheDir],\n          use: {\n            loader: \"swc-loader\",\n            options: {\n              jsc: {\n                parser: {\n                  syntax: \"typescript\", // Use TypeScript syntax for parsing\n                  jsx: true, // Enable JSX parsing\n                },\n                transform: {\n                  react: {\n                    runtime: \"automatic\",\n                    development: !isProd,\n                    refresh: !isProd,\n                  },\n                },\n              },\n            },\n          },\n        },\n        {\n          test: /\\.jsx?$/,\n          exclude: /node_modules/,\n          include: [cacheDir],\n          use: {\n            loader: \"swc-loader\",\n            options: {\n              jsc: {\n                parser: {\n                  syntax: \"ecmascript\", // Use Ecmascript syntax for parsing\n                  jsx: true, // Enable JSX parsing\n                },\n                transform: {\n                  react: {\n                    runtime: \"automatic\",\n                  },\n                },\n              },\n            },\n          },\n        },\n        {\n          test: /\\.css$/,\n          use: [MiniCssExtractPlugin.loader, \"css-loader\", \"postcss-loader\"],\n        },\n        {\n          test: /\\.svg$/,\n          oneOf: [\n            {\n              type: \"asset/resource\",\n              resourceQuery: /url/,\n            },\n            {\n              type: \"asset/inline\",\n              resourceQuery: /base64/,\n            },\n            {\n              issuer: /\\.[jt]sx?$/,\n              use: [\"@svgr/webpack\"],\n            },\n          ],\n          generator: {\n            filename: `images/${isProd ? \"[name]-[hash][ext]\" : \"[name][ext]\"}`,\n          },\n        },\n        {\n          test: /\\.(eot|otf|ttf|woff|woff2)$/,\n          type: \"asset/resource\",\n        },\n        {\n          test: /\\.m?jsx?$/,\n          resolve: {\n            fullySpecified: false,\n          },\n        },\n      ],\n    },\n    resolve: {\n      alias: webpackAliases,\n      symlinks: false,\n      extensions: [\".js\", \".jsx\", \".ts\", \".tsx\"],\n      mainFields: [\"browser\", \"module\", \"main\"],\n      modules: [\"node_modules\", path.resolve(__dirname, \"..\", \"node_modules\")],\n      fallback: {\n        readline: false,\n        path: false,\n      },\n    },\n    plugins: [\n      new HtmlWebpackPlugin({\n        inject: true,\n        template: template || path.resolve(__dirname, \"..\", \"ui\", \"index.html\"),\n        publicPath: publicPath,\n      }),\n\n      new webpack.DefinePlugin(envVars),\n\n      new CopyPlugin({\n        patterns: [\n          {\n            from: publicFolder || path.resolve(__dirname, \"..\", \"ui\", \"public\"),\n            to: path.resolve(dest, \"public\"),\n          },\n        ],\n      }),\n\n      ...webpackPlugins,\n    ].filter(Boolean),\n    stats: isProd ? \"errors-only\" : \"errors-warnings\",\n  }\n}\n","export const ALIASED_PACKAGES = [\n  \"react\",\n  \"react-dom\",\n  \"react-router-dom\",\n  \"react-dnd\",\n  \"react-dnd-html5-backend\",\n  \"react-select\",\n  \"react-helmet-async\",\n  \"@tanstack/react-query\",\n  \"@tanstack/react-table\",\n  \"@emotion/react\",\n  \"medusa-react\",\n  \"@medusajs/ui\",\n  \"@medusajs/icons\",\n  \"@medusajs/ui-preset\",\n] as const\n","import { ALIASED_PACKAGES } from \"../constants\"\n\n/**\n * Ensure that the admin-ui uses the same version of these packages as the project.\n */\nexport const webpackAliases = ALIASED_PACKAGES.reduce((acc, pkg) => {\n  acc[`${pkg}$`] = require.resolve(pkg)\n  return acc\n}, {})\n","import webpack, { type Configuration } from \"webpack\"\n\n/**\n * Helper function to create a custom webpack config that can be used to\n * extend the default webpack config used to build the admin UI.\n */\nexport function withCustomWebpackConfig(\n  callback: (\n    config: Configuration,\n    webpackInstance: typeof webpack\n  ) => Configuration\n) {\n  return (config: Configuration, webpackInstance: typeof webpack) => {\n    return callback(config, webpackInstance)\n  }\n}\n","import fse from \"fs-extra\"\nimport path from \"node:path\"\n\ntype CleanArgs = {\n  appDir: string\n  outDir: string\n}\n\n/**\n * Cleans the build directory and cache directory.\n */\nexport async function clean({ appDir, outDir }: CleanArgs) {\n  const cacheDir = path.resolve(appDir, \".cache\", \"admin\")\n  const buildDir = path.resolve(appDir, outDir)\n\n  await fse.remove(buildDir)\n  await fse.remove(cacheDir)\n}\n","import path from \"node:path\"\nimport openBrowser from \"react-dev-utils/openBrowser\"\nimport webpack from \"webpack\"\nimport WebpackDevDerver, {\n  Configuration as DevServerConfiguration,\n} from \"webpack-dev-server\"\n\nimport { DevelopArgs } from \"../types\"\nimport { logger, watchLocalAdminFolder } from \"../utils\"\nimport { createCacheDir } from \"../utils/create-cache-dir\"\nimport { getCustomWebpackConfig } from \"../webpack\"\n\n/**\n * Starts a development server for the admin UI.\n */\nexport async function develop({\n  appDir,\n  buildDir,\n  plugins,\n  options = {\n    path: \"/\",\n    backend: \"http://localhost:9000\",\n    develop: {\n      open: true,\n      port: 7001,\n      host: \"localhost\",\n      logLevel: \"error\",\n      stats: \"normal\",\n      allowedHosts: \"auto\",\n    },\n  },\n}: DevelopArgs) {\n  const { cacheDir } = await createCacheDir({\n    appDir,\n    plugins,\n  })\n\n  const entry = path.resolve(cacheDir, \"admin\", \"src\", \"main.tsx\")\n  const dest = path.resolve(appDir, buildDir)\n  const env = \"development\"\n\n  const config = await getCustomWebpackConfig(appDir, {\n    entry,\n    dest,\n    cacheDir,\n    env,\n    options,\n  })\n\n  const compiler = webpack({\n    ...config,\n    infrastructureLogging: { level: options.develop.logLevel },\n    stats: options.develop.stats === \"normal\" ? \"errors-only\" : undefined,\n  })\n\n  const devServerArgs: DevServerConfiguration = {\n    port: options.develop.port,\n    host: options.develop.host,\n    client: {\n      logging: \"none\",\n      overlay: {\n        errors: true,\n        warnings: false,\n      },\n      webSocketURL: options.develop.webSocketURL\n        ? options.develop.webSocketURL\n        : `ws://${options.develop.host}:${options.develop.port}/ws`,\n    },\n    open: false,\n    onListening: options.develop.open\n      ? function (devServer) {\n          if (!devServer) {\n            logger.warn(\"Failed to open browser.\")\n          }\n\n          openBrowser(\n            `http://${options.develop.host}:${options.develop.port}${\n              options.path ? options.path : \"\"\n            }`\n          )\n        }\n      : undefined,\n    devMiddleware: {\n      publicPath: options.path,\n      stats: options.develop.stats === \"normal\" ? false : undefined,\n    },\n    historyApiFallback: {\n      index: options.path,\n      disableDotRule: true,\n    },\n    hot: true,\n    allowedHosts: options.develop.allowedHosts\n      ? options.develop.allowedHosts\n      : \"auto\",\n  }\n\n  const server = new WebpackDevDerver(devServerArgs, compiler)\n\n  const runServer = async () => {\n    logger.info(\n      `Started development server on http://${options.develop.host}:${\n        options.develop.port\n      }${options.path ? options.path : \"\"}`\n    )\n\n    await server.start()\n  }\n\n  await runServer()\n\n  await watchLocalAdminFolder(appDir, cacheDir, plugins)\n}\n"],"mappings":"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","names":["forbiddenRoutes","injectionZones","path","webpack","fse","path","fse","copyFilter","src","fse","lstatSync","isDirectory","includes","isFile","fse","path","dedent","colors","readline","prefix","clearScreen","repeatCount","process","stdout","rows","blank","repeat","console","log","readline","cursorTo","clearScreenDown","canClearScreen","isTTY","env","CI","clear","createLogger","output","__name","type","msg","options","method","format","tag","colors","cyan","bold","yellow","red","dim","Date","toLocaleTimeString","error","info","warn","panic","exit","logger","normalizePath","path","separator","process","platform","regex","RegExp","replace","parse","traverse","fse","path","isValidInjectionZone","zone","injectionZones","includes","validateWidgetConfigExport","properties","zoneProperty","find","p","type","key","name","zoneIsValid","value","elements","every","validateRouteConfigExport","linkProperty","linkValue","labelIsValid","some","validateSettingConfigExport","cardProperty","cardValue","hasLabel","hasDescription","validateConfigExport","path","hasValidConfigExport","declaration","node","configDeclaration","declarations","d","id","init","validateDefaultExport","ast","hasComponentExport","exportName","traverse","VariableDeclarator","scope","isDefaultExport","ReturnStatement","_a","_b","argument","e","logger","error","validateWidget","file","content","fse","readFile","parserOptions","sourceType","plugins","endsWith","push","parse","hasConfigExport","ExportDefaultDeclaration","ExportNamedDeclaration","createPath","filePath","normalizedPath","normalizePath","regex","replace","isForbiddenRoute","forbiddenRoutes","validatePath","origin","valid","specialChars","i","length","currentChar","test","validateRoute","basePath","cleanPath","hasConfig","validateSetting","findAllValidSettings","dir","settingsFiles","pathExists","paths","readdir","hasSubDirs","pa","join","stat","isDirectory","files","fileStat","isFile","warn","Promise","all","map","filter","findAllValidWidgets","jsxAndTsxFiles","traverseDirectory","currentPath","promises","findAllValidRoutes","pageFiles","FILE_EXT_REGEX","copyLocalExtensions","src","dest","process","env","PLUGIN_ADMIN_UI_SKIP_CACHE","fse","copy","filter","copyFilter","err","logger","error","createLocalExtensionsEntry","appDir","localAdminDir","path","resolve","pathExists","localWidgets","localRoutes","localSettings","Promise","all","findAllValidWidgets","findAllValidRoutes","findAllValidSettings","widgetsArray","map","file","index","relativePath","normalizePath","relative","replace","importStatement","extension","routesArray","route","hasConfig","settingsArray","setting","extensionsArray","extensionsEntry","dedent","join","outputFile","panic","findPluginsWithExtensions","plugins","pluginsWithExtensions","plugin","pluginDir","dirname","require","paths","cwd","entrypoint","existsSync","push","warn","writeTailwindContentFile","tailwindContent","createMainExtensionsEntry","hasLocalExtensions","length","emptyEntry","createEntry","adminPlugins","copyAdmin","dest","process","env","PLUGIN_ADMIN_UI_SKIP_CACHE","adminDir","path","resolve","__dirname","destDir","fse","copy","filter","copyFilter","err","logger","panic","error","createCacheDir","appDir","plugins","cacheDir","createEntry","dotenv","fse","path","MEDUSA_ADMIN","ENV_FILE_NAME","process","env","NODE_ENV","fse","existsSync","dotenv","config","path","resolve","cwd","getClientEnv","__name","args","raw","Object","keys","filter","key","test","reduce","acc","current","ADMIN_PATH","MEDUSA_BACKEND_URL","backend","JSON","stringify","chokidar","fse","path","watchLocalAdminFolder","appDir","cacheDir","plugins","adminDir","path","resolve","watcher","chokidar","watch","ignored","ignoreInitial","on","event","file","removeUnlinkedFile","createEntry","dest","logger","info","process","close","srcDir","relativePath","relative","destDir","fileToDelete","fse","removeSync","error","fse","path","webpack","validateArgs","args","options","path","startsWith","logger","panic","endsWith","ReactRefreshPlugin","CopyPlugin","HtmlWebpackPlugin","MiniCssExtractPlugin","path","SwcMinifyWebpackPlugin","webpack","WebpackBar","ALIASED_PACKAGES","webpackAliases","ALIASED_PACKAGES","reduce","acc","pkg","require","resolve","formatPublicPath","path","endsWith","getWebpackConfig","entry","dest","cacheDir","env","options","template","publicFolder","reporting","isProd","envVars","getClientEnv","backend","publicPath","webpackPlugins","MiniCssExtractPlugin","filename","chunkFilename","WebpackBar","basic","fancy","ReactRefreshPlugin","mode","devtool","output","optimization","minimize","minimizer","SwcMinifyWebpackPlugin","moduleIds","runtimeChunk","module","rules","test","exclude","include","use","loader","jsc","parser","syntax","jsx","transform","react","runtime","development","refresh","oneOf","type","resourceQuery","issuer","generator","resolve","fullySpecified","alias","webpackAliases","symlinks","extensions","mainFields","modules","__dirname","fallback","readline","plugins","HtmlWebpackPlugin","inject","webpack","DefinePlugin","CopyPlugin","patterns","from","to","filter","Boolean","stats","getCustomWebpackConfig","appDir","args","validateArgs","config","getWebpackConfig","adminConfigPath","path","join","fse","pathExists","webpackAdminConfig","require","e","logger","panic","error","devServer","webpack","withCustomWebpackConfig","callback","config","webpackInstance","build","appDir","buildDir","plugins","options","reporting","process","env","PLUGIN_ADMIN_UI_SKIP_CACHE","createCacheDir","cacheDir","path","resolve","entry","dest","config","getCustomWebpackConfig","compiler","webpack","Promise","reject","run","err","stats","details","logger","error","info","toJson","hasErrors","JSON","stringify","errors","warnings","fse","path","clean","appDir","outDir","cacheDir","path","resolve","buildDir","fse","remove","path","openBrowser","webpack","WebpackDevDerver","develop","appDir","buildDir","plugins","options","path","backend","open","port","host","logLevel","stats","allowedHosts","cacheDir","createCacheDir","entry","resolve","dest","config","getCustomWebpackConfig","env","compiler","webpack","infrastructureLogging","level","undefined","devServerArgs","client","logging","overlay","errors","warnings","webSocketURL","onListening","devServer","logger","warn","openBrowser","devMiddleware","publicPath","historyApiFallback","index","disableDotRule","hot","server","WebpackDevDerver","__name","info","start","runServer","watchLocalAdminFolder"]}