{"version":3,"file":"external.mjs","names":[],"sources":["../../../../src/modules/bundler/plugins/external.ts"],"sourcesContent":["import type { Plugin, ResolveIdResult } from \"rolldown\";\n\nimport * as Path from \"node:path\";\n\nimport { fdir } from \"fdir\";\n\nconst isThisViteVirtualModule = (id: string): boolean =>\n    id.startsWith(\"/@\") || id.startsWith(\"virtual:\") || id.startsWith(\"\\0\");\n\nconst isThisPath = (id: string): boolean =>\n    id.startsWith(\".\") || id.startsWith(\"/\");\n\ntype GetIncludeExcludeOptions = {\n    include: readonly string[];\n    exclude: readonly string[];\n};\n\ntype PathsAndPackages = {\n    paths: readonly string[];\n    packages: readonly string[];\n};\n\ntype GetIncludeExcludeResult = {\n    include: PathsAndPackages;\n    exclude: PathsAndPackages;\n};\n\nconst managePackagesAndPaths = (\n    packagesOrPaths: readonly string[],\n): PathsAndPackages => {\n    const paths: string[] = [];\n    const packages: string[] = [];\n\n    for (const packageOrPath of packagesOrPaths) {\n        const isPath: boolean = isThisPath(packageOrPath);\n\n        if (!isPath) {\n            packages.push(packageOrPath);\n            continue;\n        }\n\n        const foundPaths: string[] = new fdir()\n            .withFullPaths()\n            .crawl(packageOrPath)\n            .sync();\n\n        paths.push(...foundPaths);\n    }\n\n    return {\n        paths,\n        packages,\n    };\n};\n\nconst getIncludeAndExclude = (\n    options: GetIncludeExcludeOptions,\n): GetIncludeExcludeResult => {\n    const include: PathsAndPackages = managePackagesAndPaths(options.include);\n    const exclude: PathsAndPackages = managePackagesAndPaths(options.exclude);\n\n    return {\n        include,\n        exclude,\n    };\n};\n\nconst isPackage = (id: string): boolean => /^[^./]/.test(id);\n\nconst isJsFile = (id: string): boolean => {\n    // check if the file have extension\n    const hasExtension: boolean = Path.extname(id) !== \"\";\n\n    // treat file without extension as js\n    if (!hasExtension) return true;\n\n    return (\n        id.endsWith(\".ts\") ||\n        id.endsWith(\".tsx\") ||\n        id.endsWith(\".js\") ||\n        id.endsWith(\".jsx\") ||\n        id.endsWith(\".cjs\") ||\n        id.endsWith(\".mjs\") ||\n        id.endsWith(\".cts\") ||\n        id.endsWith(\".mts\")\n    );\n};\n\ntype ExternalResolverOptions = {\n    packageName: string;\n    file: string;\n    exclude: readonly string[];\n    include: readonly string[];\n};\n\nconst externalResolver = (options: ExternalResolverOptions): Plugin => {\n    const normalizeTarget: string = Path.resolve(options.file);\n    const { exclude, include } = getIncludeAndExclude(options);\n\n    return {\n        name: \"@ammolite/transpiler/external-resolver\",\n        resolveId: (id: string): ResolveIdResult => {\n            const normalizeSource: string = Path.resolve(id);\n\n            /**\n             * Check if the source is the same as the target\n             *\n             * This is to avoid the following error on Windows:\n             *\n             * [UNRESOLVED_ENTRY] Error: Entry module \"src/app.tsx\" cannot be external.\n             */\n            if (normalizeSource === normalizeTarget) {\n                return void 0;\n            }\n\n            // CSS-in-JS package\n            if (id === options.packageName) {\n                return {\n                    id,\n                    external: true,\n                };\n            }\n\n            // vite virtual modules\n            if (isThisViteVirtualModule(id)) {\n                return {\n                    id,\n                    external: true,\n                };\n            }\n\n            // path\n            if (isThisPath(id)) {\n                if (exclude.paths.includes(id)) {\n                    return {\n                        id,\n                        external: true,\n                    };\n                }\n\n                if (include.paths.includes(id)) {\n                    return void 0;\n                }\n            }\n\n            // package\n            else {\n                for (const pkg of exclude.packages) {\n                    if (id.startsWith(pkg)) {\n                        return {\n                            id,\n                            external: true,\n                        };\n                    }\n                }\n\n                for (const pkg of include.packages) {\n                    if (id.startsWith(pkg)) {\n                        return void 0;\n                    }\n                }\n            }\n\n            // exclude packages\n            if (isPackage(id)) {\n                return {\n                    id,\n                    external: true,\n                };\n            }\n\n            // bundle JS files\n            if (isJsFile(id)) {\n                return void 0;\n            }\n\n            // unknown file\n            return {\n                id,\n                external: true,\n            };\n        },\n    };\n};\n\nexport type { ExternalResolverOptions };\nexport { externalResolver };\n"],"mappings":";;;AAMA,MAAM,2BAA2B,OAC7B,GAAG,WAAW,IAAI,KAAK,GAAG,WAAW,UAAU,KAAK,GAAG,WAAW,IAAI;AAE1E,MAAM,cAAc,OAChB,GAAG,WAAW,GAAG,KAAK,GAAG,WAAW,GAAG;AAiB3C,MAAM,0BACF,oBACmB;CACnB,MAAM,QAAkB,CAAC;CACzB,MAAM,WAAqB,CAAC;CAE5B,KAAK,MAAM,iBAAiB,iBAAiB;EAGzC,IAAI,CAFoB,WAAW,aAEzB,GAAG;GACT,SAAS,KAAK,aAAa;GAC3B;EACJ;EAEA,MAAM,aAAuB,IAAI,KAAK,CAAC,CAClC,cAAc,CAAC,CACf,MAAM,aAAa,CAAC,CACpB,KAAK;EAEV,MAAM,KAAK,GAAG,UAAU;CAC5B;CAEA,OAAO;EACH;EACA;CACJ;AACJ;AAEA,MAAM,wBACF,YAC0B;CAI1B,OAAO;EACH,SAJ8B,uBAAuB,QAAQ,OAIvD;EACN,SAJ8B,uBAAuB,QAAQ,OAIvD;CACV;AACJ;AAEA,MAAM,aAAa,OAAwB,SAAS,KAAK,EAAE;AAE3D,MAAM,YAAY,OAAwB;CAKtC,IAAI,EAH0B,KAAK,QAAQ,EAAE,MAAM,KAGhC,OAAO;CAE1B,OACI,GAAG,SAAS,KAAK,KACjB,GAAG,SAAS,MAAM,KAClB,GAAG,SAAS,KAAK,KACjB,GAAG,SAAS,MAAM,KAClB,GAAG,SAAS,MAAM,KAClB,GAAG,SAAS,MAAM,KAClB,GAAG,SAAS,MAAM,KAClB,GAAG,SAAS,MAAM;AAE1B;AASA,MAAM,oBAAoB,YAA6C;CACnE,MAAM,kBAA0B,KAAK,QAAQ,QAAQ,IAAI;CACzD,MAAM,EAAE,SAAS,YAAY,qBAAqB,OAAO;CAEzD,OAAO;EACH,MAAM;EACN,YAAY,OAAgC;;;;;;;;GAUxC,IATgC,KAAK,QAAQ,EAS3B,MAAM,iBACpB;GAIJ,IAAI,OAAO,QAAQ,aACf,OAAO;IACH;IACA,UAAU;GACd;GAIJ,IAAI,wBAAwB,EAAE,GAC1B,OAAO;IACH;IACA,UAAU;GACd;GAIJ,IAAI,WAAW,EAAE,GAAG;IAChB,IAAI,QAAQ,MAAM,SAAS,EAAE,GACzB,OAAO;KACH;KACA,UAAU;IACd;IAGJ,IAAI,QAAQ,MAAM,SAAS,EAAE,GACzB;GAER,OAGK;IACD,KAAK,MAAM,OAAO,QAAQ,UACtB,IAAI,GAAG,WAAW,GAAG,GACjB,OAAO;KACH;KACA,UAAU;IACd;IAIR,KAAK,MAAM,OAAO,QAAQ,UACtB,IAAI,GAAG,WAAW,GAAG,GACjB;GAGZ;GAGA,IAAI,UAAU,EAAE,GACZ,OAAO;IACH;IACA,UAAU;GACd;GAIJ,IAAI,SAAS,EAAE,GACX;GAIJ,OAAO;IACH;IACA,UAAU;GACd;EACJ;CACJ;AACJ"}