| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | "use strict";Object.defineProperty(exports, "__esModule", {  value: true});exports.validateUsage = validateUsage;var _core = require("@babel/core");function validateUsage(path, state, tdzEnabled) {  const dynamicTDZNames = [];  for (const name of Object.keys(path.getBindingIdentifiers())) {    const binding = path.scope.getBinding(name);    if (!binding) continue;    if (tdzEnabled) {      if (injectTDZChecks(binding, state)) dynamicTDZNames.push(name);    }    if (path.node.kind === "const") {      disallowConstantViolations(name, binding, state);    }  }  return dynamicTDZNames;}function disallowConstantViolations(name, binding, state) {  for (const violation of binding.constantViolations) {    const readOnlyError = state.addHelper("readOnlyError");    const throwNode = _core.types.callExpression(readOnlyError, [_core.types.stringLiteral(name)]);    if (violation.isAssignmentExpression()) {      const {        operator,        left,        right      } = violation.node;      if (operator === "=") {        const exprs = [right];        exprs.push(throwNode);        violation.replaceWith(_core.types.sequenceExpression(exprs));      } else if (["&&=", "||=", "??="].includes(operator)) {        violation.replaceWith(_core.types.logicalExpression(operator.slice(0, -1), left, _core.types.sequenceExpression([right, throwNode])));      } else {        violation.replaceWith(_core.types.sequenceExpression([_core.types.binaryExpression(operator.slice(0, -1), left, right), throwNode]));      }    } else if (violation.isUpdateExpression()) {      violation.replaceWith(_core.types.sequenceExpression([_core.types.unaryExpression("+", violation.get("argument").node), throwNode]));    } else if (violation.isForXStatement()) {      violation.ensureBlock();      violation.get("left").replaceWith(_core.types.variableDeclaration("var", [_core.types.variableDeclarator(violation.scope.generateUidIdentifier(name))]));      violation.node.body.body.unshift(_core.types.expressionStatement(throwNode));    }  }}function getTDZStatus(refPath, bindingPath) {  const executionStatus = bindingPath._guessExecutionStatusRelativeTo(refPath);  if (executionStatus === "before") {    return "outside";  } else if (executionStatus === "after") {    return "inside";  } else {    return "maybe";  }}const skipTDZChecks = new WeakSet();function buildTDZAssert(status, node, state) {  if (status === "maybe") {    const clone = _core.types.cloneNode(node);    skipTDZChecks.add(clone);    return _core.types.callExpression(state.addHelper("temporalRef"), [clone, _core.types.stringLiteral(node.name)]);  } else {    return _core.types.callExpression(state.addHelper("tdz"), [_core.types.stringLiteral(node.name)]);  }}function getTDZReplacement(path, state, id = path.node) {  var _path$scope$getBindin;  if (skipTDZChecks.has(id)) return;  skipTDZChecks.add(id);  const bindingPath = (_path$scope$getBindin = path.scope.getBinding(id.name)) == null ? void 0 : _path$scope$getBindin.path;  if (!bindingPath || bindingPath.isFunctionDeclaration()) return;  const status = getTDZStatus(path, bindingPath);  if (status === "outside") return;  if (status === "maybe") {    bindingPath.parent._tdzThis = true;  }  return {    status,    node: buildTDZAssert(status, id, state)  };}function injectTDZChecks(binding, state) {  const allUsages = new Set(binding.referencePaths);  binding.constantViolations.forEach(allUsages.add, allUsages);  let dynamicTdz = false;  for (const path of binding.constantViolations) {    const {      node    } = path;    if (skipTDZChecks.has(node)) continue;    skipTDZChecks.add(node);    if (path.isUpdateExpression()) {      const arg = path.get("argument");      const replacement = getTDZReplacement(path, state, arg.node);      if (!replacement) continue;      if (replacement.status === "maybe") {        dynamicTdz = true;        path.insertBefore(replacement.node);      } else {        path.replaceWith(replacement.node);      }    } else if (path.isAssignmentExpression()) {      const nodes = [];      const ids = path.getBindingIdentifiers();      for (const name of Object.keys(ids)) {        const replacement = getTDZReplacement(path, state, ids[name]);        if (replacement) {          nodes.push(_core.types.expressionStatement(replacement.node));          if (replacement.status === "inside") break;          if (replacement.status === "maybe") dynamicTdz = true;        }      }      if (nodes.length > 0) path.insertBefore(nodes);    }  }  for (const path of binding.referencePaths) {    if (path.parentPath.isUpdateExpression()) continue;    if (path.parentPath.isFor({      left: path.node    })) continue;    const replacement = getTDZReplacement(path, state);    if (!replacement) continue;    if (replacement.status === "maybe") dynamicTdz = true;    path.replaceWith(replacement.node);  }  return dynamicTdz;}//# sourceMappingURL=validation.js.map
 |