"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _helperPluginUtils = require("@babel/helper-plugin-utils"); var _pluginTransformDestructuring = require("@babel/plugin-transform-destructuring"); var _core = require("@babel/core"); function isAnonymousFunctionDefinition(node) { return _core.types.isArrowFunctionExpression(node) || (_core.types.isFunctionExpression(node) || _core.types.isClassExpression(node)) && !node.id; } function emitSetFunctionNameCall(state, expression, name) { return _core.types.callExpression(state.addHelper("setFunctionName"), [expression, _core.types.stringLiteral(name)]); } var _default = exports.default = (0, _helperPluginUtils.declare)(api => { api.assertVersion("^7.23.9 || >8.0.0-alpha <8.0.0-beta"); const TOP_LEVEL_USING = new Map(); function isUsingDeclaration(node) { if (!_core.types.isVariableDeclaration(node)) return false; return node.kind === "using" || node.kind === "await using" || TOP_LEVEL_USING.has(node); } const transformUsingDeclarationsVisitor = { ForOfStatement(path) { const { left } = path.node; if (!isUsingDeclaration(left)) return; const { id } = left.declarations[0]; const tmpId = path.scope.generateUidIdentifierBasedOnNode(id); left.declarations[0].id = tmpId; left.kind = "const"; path.ensureBlock(); (0, _pluginTransformDestructuring.unshiftForXStatementBody)(path, [_core.types.variableDeclaration("using", [_core.types.variableDeclarator(id, _core.types.cloneNode(tmpId))])]); }, "BlockStatement|StaticBlock"(path, state) { let ctx = null; let needsAwait = false; const scope = path.scope; for (const node of path.node.body) { if (!isUsingDeclaration(node)) continue; ctx != null ? ctx : ctx = scope.generateUidIdentifier("usingCtx"); const isAwaitUsing = node.kind === "await using" || TOP_LEVEL_USING.get(node) === 1; needsAwait || (needsAwait = isAwaitUsing); if (!TOP_LEVEL_USING.delete(node)) { node.kind = "const"; } for (const decl of node.declarations) { const currentInit = decl.init; decl.init = _core.types.callExpression(_core.types.memberExpression(_core.types.cloneNode(ctx), isAwaitUsing ? _core.types.identifier("a") : _core.types.identifier("u")), [isAnonymousFunctionDefinition(currentInit) && _core.types.isIdentifier(decl.id) ? emitSetFunctionNameCall(state, currentInit, decl.id.name) : currentInit]); } } if (!ctx) return; const disposeCall = _core.types.callExpression(_core.types.memberExpression(_core.types.cloneNode(ctx), _core.types.identifier("d")), []); const replacement = _core.template.statement.ast` try { var ${_core.types.cloneNode(ctx)} = ${state.addHelper("usingCtx")}(); ${path.node.body} } catch (_) { ${_core.types.cloneNode(ctx)}.e = _; } finally { ${needsAwait ? _core.types.awaitExpression(disposeCall) : disposeCall} } `; _core.types.inherits(replacement, path.node); const { parentPath } = path; if (parentPath.isFunction() || parentPath.isTryStatement() || parentPath.isCatchClause()) { path.replaceWith(_core.types.blockStatement([replacement])); } else if (path.isStaticBlock()) { path.node.body = [replacement]; } else { path.replaceWith(replacement); } } }; const transformUsingDeclarationsVisitorSkipFn = _core.traverse.visitors.merge([transformUsingDeclarationsVisitor, { Function(path) { path.skip(); } }]); return { name: "transform-explicit-resource-management", manipulateOptions: (_, p) => p.plugins.push("explicitResourceManagement"), visitor: _core.traverse.visitors.merge([transformUsingDeclarationsVisitor, { Program(path) { TOP_LEVEL_USING.clear(); if (path.node.sourceType !== "module") return; if (!path.node.body.some(isUsingDeclaration)) return; const innerBlockBody = []; for (const stmt of path.get("body")) { if (stmt.isFunctionDeclaration() || stmt.isImportDeclaration()) { continue; } let node = stmt.node; let shouldRemove = true; if (stmt.isExportDefaultDeclaration()) { let { declaration } = stmt.node; let varId; if (_core.types.isClassDeclaration(declaration)) { varId = declaration.id; declaration.id = _core.types.cloneNode(varId); declaration = _core.types.toExpression(declaration); } else if (!_core.types.isExpression(declaration)) { continue; } varId != null ? varId : varId = path.scope.generateUidIdentifier("_default"); innerBlockBody.push(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(varId, declaration)])); stmt.replaceWith(_core.types.exportNamedDeclaration(null, [_core.types.exportSpecifier(_core.types.cloneNode(varId), _core.types.identifier("default"))])); continue; } if (stmt.isExportNamedDeclaration()) { node = stmt.node.declaration; if (!node || _core.types.isFunction(node)) continue; stmt.replaceWith(_core.types.exportNamedDeclaration(null, Object.keys(_core.types.getOuterBindingIdentifiers(node, false)).map(id => _core.types.exportSpecifier(_core.types.identifier(id), _core.types.identifier(id))))); shouldRemove = false; } else if (stmt.isExportDeclaration()) { continue; } if (_core.types.isClassDeclaration(node)) { const { id } = node; node.id = _core.types.cloneNode(id); innerBlockBody.push(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(id, _core.types.toExpression(node))])); } else if (_core.types.isVariableDeclaration(node)) { if (node.kind === "using") { TOP_LEVEL_USING.set(stmt.node, 0); } else if (node.kind === "await using") { TOP_LEVEL_USING.set(stmt.node, 1); } node.kind = "var"; innerBlockBody.push(node); } else { innerBlockBody.push(stmt.node); } if (shouldRemove) stmt.remove(); } path.pushContainer("body", _core.types.blockStatement(innerBlockBody)); }, Function(path, state) { if (path.node.async) { path.traverse(transformUsingDeclarationsVisitorSkipFn, state); } } }]) }; }); //# sourceMappingURL=index.js.map