{"version":3,"sources":["../src/index.ts"],"names":["path","stat","join","readFile","extname"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { BuildOptions, OnLoadOptions, OnResolveArgs, OnResolveResult, Plugin, PluginBuild } from 'esbuild';\nimport { readFile, stat } from 'node:fs/promises';\nimport { extname, join } from 'node:path';\n\nexport interface PluginOptions {\n  /**\n   * The [esbuild filter](https://esbuild.github.io/plugins/#filters) to\n   * apply for the filtering of files to parse with this plugin\n   *\n   * @default /.*​/\n   */\n  filter?: OnLoadOptions['filter'];\n  /**\n   * The [esbuild namespace](https://esbuild.github.io/plugins/#namespaces) to\n   * which the plugin should apply\n   *\n   * @default undefined\n   */\n  namespace?: OnLoadOptions['namespace'];\n  /**\n   * Whether the current build is for ESM or not.\n   *\n   * Accepts either a boolean value or a function that returns a boolean value.\n   * The function may also return a Promise which will be resolved first.\n   *\n   * In order to account for the cross-target capabilities of `tsup` the default is:\n   * @default build.initialOptions?.define?.TSUP_FORMAT === '\"esm\"'\n   *\n   */\n  esm?: boolean | ((initialOptions: BuildOptions) => Awaitable<boolean>);\n  /**\n   * The extension to apply for CJS code.\n   * @remark Make sure to **NOT** start with a leading `.`.\n   *\n   * @default 'cjs'\n   */\n  cjsExtension?: string | ((initialOptions: BuildOptions) => Awaitable<string>);\n  /**\n   * The extension to apply for ESM code.\n   * @remark Make sure to **NOT** start with a leading `.`.\n   *\n   * @default 'mjs'\n   */\n  esmExtension?: string | ((initialOptions: BuildOptions) => Awaitable<string>);\n}\n\nasync function isDirectory(cwd: string, path: string): Promise<boolean> {\n  return (\n    stat(join(cwd, path))\n      .then((result) => result.isDirectory())\n      // Catches the error for if path does not exist (code: ENOENT)\n      .catch(() => false)\n  );\n}\n\nasync function isFile(cwd: string, path: string): Promise<boolean> {\n  return (\n    stat(join(cwd, path))\n      .then((result) => !result.isDirectory())\n      // Catches the error for if path does not exist (code: ENOENT)\n      .catch(() => false)\n  );\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isFunction(input: unknown): input is Function {\n  return typeof input === 'function';\n}\n\nfunction getFilter(options: PluginOptions): RegExp {\n  if (!options.filter) {\n    return /.*/;\n  }\n\n  if (Object.prototype.toString.call(options.filter) !== '[object RegExp]') {\n    console.warn(\n      `Plugin \"esbuild-plugin-file-path-extensions\": Options.filter must be a RegExp object, but gets an '${typeof options.filter}' type. \\nThis request will match ANY file!`\n    );\n    return /.*/;\n  }\n\n  return options.filter ?? /.*/;\n}\n\nlet builtins: string[] | null = null;\n\nasync function isBuiltin(path: string): Promise<boolean> {\n  if (builtins === null) {\n    builtins = (await import('node:module')).builtinModules;\n  }\n\n  return !path.startsWith('.') && (path.startsWith('node:') || builtins.includes(path));\n}\n\nasync function isDefinedDependency(path: string): Promise<boolean> {\n  try {\n    const packageJsonPath = join(process.cwd(), 'package.json');\n    const packageJson = JSON.parse(await readFile(packageJsonPath, { encoding: 'utf-8' }));\n    const { dependencies = {}, devDependencies = {}, peerDependencies = {} } = packageJson;\n\n    const allDependencies = {\n      ...dependencies,\n      ...devDependencies,\n      ...peerDependencies\n    };\n\n    return Object.keys(allDependencies).some((dep) => {\n      const depParts = dep.split('/');\n      const pathParts = path.split('/');\n\n      return pathParts.slice(0, depParts.length).join('/') === dep;\n    });\n  } catch (error) {\n    return false;\n  }\n}\n\nasync function getIsEsm(build: PluginBuild, options: PluginOptions): Promise<boolean> {\n  // If explicitly set to CJS through tsup then we should always return false\n  if (build.initialOptions.define?.TSUP_FORMAT === '\"cjs\"') {\n    return false;\n  }\n\n  // Check if the option for the plugin was set or not\n  if (typeof options.esm === 'undefined') {\n    // If it was unset check if tsup set the format to ESM, or esbuild resolved it as esm\n    return build.initialOptions.define?.TSUP_FORMAT === '\"esm\"' || build.initialOptions.format === 'esm';\n  }\n\n  // Check if the option was set to a boolean or a function\n  if (typeof options.esm === 'boolean') {\n    return options.esm;\n  }\n\n  // If it was a function, call it and return the result\n  return isFunction(options.esm) ? options.esm(build.initialOptions) : options.esm;\n}\n\nasync function getEsmExtension(build: PluginBuild, options: PluginOptions): Promise<string> {\n  if (typeof options.esmExtension === 'undefined') {\n    return 'mjs';\n  }\n\n  if (typeof options.esmExtension === 'string') {\n    return options.esmExtension;\n  }\n\n  return isFunction(options.esmExtension) ? options.esmExtension(build.initialOptions) : options.esmExtension;\n}\n\nasync function getCjsExtension(build: PluginBuild, options: PluginOptions): Promise<string> {\n  if (typeof options.cjsExtension === 'undefined') {\n    return 'cjs';\n  }\n\n  if (typeof options.cjsExtension === 'string') {\n    return options.cjsExtension;\n  }\n\n  return isFunction(options.cjsExtension) ? options.cjsExtension(build.initialOptions) : options.cjsExtension;\n}\n\nfunction pathExtIsJsLikeExtension(path: string): boolean {\n  const ext = extname(path);\n\n  if (\n    // Regular extensions\n    ext === '.js' ||\n    ext === '.cjs' ||\n    ext === '.mjs' ||\n    // TypeScript extensions\n    ext === '.ts' ||\n    ext === '.cts' ||\n    ext === '.mts' ||\n    // JSX JavaScript extensions\n    ext === 'jsx' ||\n    ext === '.cjsx' ||\n    ext === '.mjsx' ||\n    // JSX TypeScript extensions\n    ext === '.tsx' ||\n    ext === '.ctsx' ||\n    ext === '.mtsx'\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\nasync function handleResolve(args: OnResolveArgs, build: PluginBuild, options: PluginOptions): Promise<OnResolveResult | undefined> {\n  if (args.kind === 'import-statement') {\n    const isEsm = await getIsEsm(build, options);\n    const esmExtension = await getEsmExtension(build, options);\n    const cjsExtension = await getCjsExtension(build, options);\n\n    if (typeof isEsm !== 'boolean') {\n      throw new TypeError(`isEsm must be a boolean, received ${typeof isEsm} (${isEsm})`);\n    }\n\n    if (typeof cjsExtension !== 'string') {\n      throw new TypeError(`cjsExtension must be a string, received ${typeof cjsExtension} (${cjsExtension})`);\n    }\n\n    if (typeof esmExtension !== 'string') {\n      throw new TypeError(`esmExtension must be a string, received ${typeof esmExtension} (${esmExtension})`);\n    }\n\n    if (args.importer) {\n      const pathAlreadyHasExt = pathExtIsJsLikeExtension(args.path);\n      const pathIsBuiltin = build.initialOptions.platform === 'node' && (await isBuiltin(args.path));\n      const pathIsDependency = build.initialOptions.platform === 'node' && (await isDefinedDependency(args.path));\n\n      if (!pathAlreadyHasExt && !pathIsBuiltin && !pathIsDependency) {\n        let { path } = args;\n\n        // If the import path refers to a directory it most likely actually refers to a\n        // `index.*` file in said directory due to Node's module resolution\n        if (await isDirectory(args.resolveDir, path)) {\n          // This uses `/` instead of `path.join` here because `join` removes potential \"./\" prefixes\n          path = `${path}/index`;\n        }\n        // If the import path exists as a file & doesn't have a js-like extension, it is probably\n        // a non-js asset import that should be left alone (for example: css or json files).\n        if (await isFile(args.resolveDir, path)) {\n          return {\n            path,\n            external: true,\n            namespace: options.namespace\n          };\n        }\n\n        return {\n          path: `${path}.${isEsm ? esmExtension : cjsExtension}`,\n          external: true,\n          namespace: options.namespace\n        };\n      }\n    }\n  }\n\n  return undefined;\n}\n\nexport const esbuildPluginFilePathExtensions = (\n  options: PluginOptions = {\n    filter: /.*/,\n    cjsExtension: 'cjs',\n    esmExtension: 'mjs'\n  }\n): Plugin => {\n  const filter = getFilter(options);\n  const { namespace } = options;\n\n  return {\n    name: 'esbuild-plugin-file-path-extensions',\n    setup(build) {\n      build.onResolve({ filter, namespace }, (args) => handleResolve(args, build, options));\n    }\n  };\n};\n\n/**\n * The [esbuild-plugin-file-path-extensions](https://github.com/favware/esbuild-plugin-file-path-extensions/#readme) version\n * that you are currently using.\n */\n// eslint-disable-next-line @typescript-eslint/no-inferrable-types\nexport const version: string = '2.1.4';\n\ntype Awaitable<T> = PromiseLike<T> | T;\n"]}