{"version":3,"file":"esm/index.mjs","sources":["webpack://babel-plugin-transform-fs-promises/./src/index.ts"],"sourcesContent":["import type Babel from \"@babel/core\";\nimport type { PluginObj } from \"@babel/core\";\n\nfunction babelPluginTransformFsPromises(babel: typeof Babel) {\n    const { types: t } = babel;\n\n    const moduleNames = new Set([\"fs/promises\", \"node:fs/promises\"]);\n\n    const generateImportSourceStringLiteral = (source: string) => {\n        const moduleName = source.replace(/\\/promises$/, \"\").replace(/^node:/, \"\");\n        return t.stringLiteral(moduleName);\n    };\n\n    return {\n        name: \"transform-fs-promises\",\n        visitor: {\n            CallExpression(path) {\n                const { node } = path;\n\n                // 1. 处理 require('fs/promises') → require('fs').promises\n                if (\n                    // require('xxx')\n                    (t.isIdentifier(node.callee, { name: \"require\" }) ||\n                        // module.require('xxx')\n                        (t.isMemberExpression(node.callee) &&\n                            t.isIdentifier(node.callee.object, { name: \"module\" }) &&\n                            t.isIdentifier(node.callee.property, { name: \"require\" }))) &&\n                    node.arguments.length === 1 &&\n                    t.isStringLiteral(node.arguments[0]) &&\n                    moduleNames.has(node.arguments[0].value)\n                ) {\n                    path.replaceWith(\n                        t.memberExpression(\n                            t.callExpression(node.callee, [generateImportSourceStringLiteral(node.arguments[0].value)]),\n                            t.identifier(\"promises\"),\n                        ),\n                    );\n                }\n\n                // 2. 处理动态导入 await import('fs/promises') → await import('fs').then(m => m.promises)\n                if (\n                    (t.isImport(node.callee) || t.isIdentifier(node.callee, { name: \"import\" })) &&\n                    node.arguments.length === 1 &&\n                    t.isStringLiteral(node.arguments[0]) &&\n                    moduleNames.has(node.arguments[0].value)\n                ) {\n                    const internalIdentifier = path.scope.generateUidIdentifier(\"esModule\");\n\n                    path.replaceWith(\n                        t.callExpression(\n                            t.memberExpression(\n                                t.callExpression(t.identifier(\"import\"), [generateImportSourceStringLiteral(node.arguments[0].value)]),\n                                t.identifier(\"then\"),\n                            ),\n                            [\n                                t.arrowFunctionExpression(\n                                    [internalIdentifier],\n                                    t.memberExpression(internalIdentifier, t.identifier(\"promises\")),\n                                ),\n                            ],\n                        ),\n                    );\n                }\n            },\n\n            ImportDeclaration(path) {\n                const { node } = path;\n\n                // 1. 处理 import fs from 'fs/promises' → import { promises as fs } from 'fs'\n                if (moduleNames.has(node.source.value) && node.specifiers.length === 1 && t.isImportDefaultSpecifier(node.specifiers[0])) {\n                    const localName = node.specifiers[0].local.name;\n                    path.replaceWith(\n                        t.importDeclaration(\n                            [t.importSpecifier(t.identifier(localName), t.identifier(\"promises\"))],\n                            generateImportSourceStringLiteral(node.source.value),\n                        ),\n                    );\n                }\n\n                // 2. 处理 import { readFile, stat } from 'fs/promises' → import { promises: _promises } from 'fs';\\nconst { readFile, stat } = _promises;\n                if (moduleNames.has(node.source.value) && node.specifiers.some((spec) => t.isImportSpecifier(spec))) {\n                    const namesSpecifiers = node.specifiers.filter((spec) => t.isImportSpecifier(spec));\n\n                    const defaultSpec = node.specifiers.find((spec) => t.isImportDefaultSpecifier(spec));\n\n                    const localPromises = path.scope.generateUidIdentifier(\"promises\");\n\n                    path.replaceWithMultiple([\n                        t.importDeclaration(\n                            [defaultSpec, t.importSpecifier(localPromises, t.identifier(\"promises\"))].filter(Boolean),\n                            generateImportSourceStringLiteral(node.source.value),\n                        ),\n                        t.variableDeclaration(\"const\", [\n                            t.variableDeclarator(\n                                t.objectPattern(namesSpecifiers.map((spec) => t.objectProperty(spec.local, spec.imported, false, true))),\n                                localPromises,\n                            ),\n                        ]),\n                    ]);\n                }\n\n                // 3. 处理 import * as fs from 'fs/promises' → import { promises as fs } from 'fs'\n                if (\n                    moduleNames.has(node.source.value) &&\n                    node.specifiers.length === 1 &&\n                    t.isImportNamespaceSpecifier(node.specifiers[0])\n                ) {\n                    path.replaceWith(\n                        t.importDeclaration(\n                            [t.importSpecifier(node.specifiers[0].local, t.identifier(\"promises\"))],\n                            generateImportSourceStringLiteral(node.source.value),\n                        ),\n                    );\n                }\n            },\n            ExportAllDeclaration(path) {\n                const { node } = path;\n\n                // 1. 处理 export * from 'fs/promises' → export * from 'fs'\n                if (moduleNames.has(node.source.value)) {\n                    const localPromises = path.scope.generateUidIdentifier(\"promises\");\n\n                    path.replaceWithMultiple([\n                        t.importDeclaration(\n                            [t.importSpecifier(localPromises, t.identifier(\"promises\"))],\n                            generateImportSourceStringLiteral(node.source.value),\n                        ),\n                        t.exportDefaultDeclaration(localPromises),\n                    ]);\n                }\n            },\n\n            ExportNamedDeclaration(path) {\n                const { node } = path;\n\n                // 1. 处理 export { readFile } from 'fs/promises' → import { promises as _promises } from 'fs'\\nexport { readFile } from _promises;\n                if (moduleNames.has(node.source?.value) && node.specifiers.some((spec) => t.isExportSpecifier(spec))) {\n                    const namesSpecifiers = node.specifiers.filter((spec) => t.isExportSpecifier(spec));\n\n                    const defaultSpec = node.specifiers.find((spec) => t.isExportDefaultSpecifier(spec));\n\n                    const localPromises = path.scope.generateUidIdentifier(\"promises\");\n\n                    const specUidIdentifierMap = new Map<Babel.types.ExportSpecifier, Babel.types.Identifier>();\n\n                    path.replaceWithMultiple(\n                        [\n                            t.importDeclaration(\n                                [\n                                    defaultSpec ? t.importDefaultSpecifier(t.identifier(defaultSpec.exported.name)) : undefined,\n                                    t.importSpecifier(localPromises, t.identifier(\"promises\")),\n                                ].filter(Boolean),\n                                generateImportSourceStringLiteral(node.source.value),\n                            ),\n                            t.variableDeclaration(\"const\", [\n                                t.variableDeclarator(\n                                    t.objectPattern(\n                                        namesSpecifiers.map((spec) => {\n                                            const UidIdentifier = path.scope.generateUidIdentifier(spec.local.name);\n\n                                            specUidIdentifierMap.set(spec, UidIdentifier);\n\n                                            return t.objectProperty(spec.local, UidIdentifier, false, false);\n                                        }),\n                                    ),\n                                    localPromises,\n                                ),\n                            ]),\n                            t.exportNamedDeclaration(\n                                null,\n                                namesSpecifiers.map((spec) => t.exportSpecifier(specUidIdentifierMap.get(spec), spec.local)),\n                            ),\n                            defaultSpec ? defaultSpec : null,\n                        ].filter(Boolean),\n                    );\n                }\n            },\n        },\n    } satisfies PluginObj<Babel.PluginPass>;\n}\n\nexport { babelPluginTransformFsPromises };\nexport default babelPluginTransformFsPromises;\n"],"names":["babelPluginTransformFsPromises","babel","t","moduleNames","Set","generateImportSourceStringLiteral","source","moduleName","path","node","internalIdentifier","localName","spec","namesSpecifiers","defaultSpec","localPromises","Boolean","_node_source","specUidIdentifierMap","Map","undefined","UidIdentifier"],"mappings":"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"}