index.js.map 18.2 KB
{"version":3,"names":["version","split","reduce","v","x","versionKey","createClassFeaturePlugin","name","feature","loose","manipulateOptions","api","assumption","inherits","setPublicClassFields","privateFieldsAsProperties","constantSuper","noDocumentAll","explicit","undefined","push","length","console","warn","join","pre","file","enableFeature","get","set","visitor","Class","path","shouldTransform","isClassDeclaration","assertFieldTransformed","isLoose","constructor","isDecorated","hasDecorators","node","props","elements","computedPaths","privateNames","Set","body","isClassProperty","isClassMethod","computed","isPrivate","key","id","getName","setName","isClassPrivateMethod","kind","has","buildCodeFrameError","add","isProperty","isStaticBlock","innerBinding","ref","isClassExpression","nameFunction","scope","generateUidIdentifier","t","cloneNode","privateNamesMap","buildPrivateNamesMap","privateNamesNodes","buildPrivateNamesNodes","transformPrivateNamesUsage","keysNodes","staticNodes","instanceNodes","pureStaticNodes","wrapClass","buildDecoratedClass","extractComputedKeys","buildFieldsInitNodes","superClass","injectInitialization","referenceVisitor","state","prop","static","traverse","wrappedPath","insertBefore","insertAfter","find","parent","isStatement","isDeclaration","ExportDefaultDeclaration","decl","splitExportDeclaration","type"],"sources":["../src/index.ts"],"sourcesContent":["import { types as t } from \"@babel/core\";\nimport type { PluginAPI, PluginObject } from \"@babel/core\";\nimport type { NodePath } from \"@babel/traverse\";\nimport nameFunction from \"@babel/helper-function-name\";\nimport splitExportDeclaration from \"@babel/helper-split-export-declaration\";\nimport {\n  buildPrivateNamesNodes,\n  buildPrivateNamesMap,\n  transformPrivateNamesUsage,\n  buildFieldsInitNodes,\n} from \"./fields\";\nimport type { PropPath } from \"./fields\";\nimport { buildDecoratedClass, hasDecorators } from \"./decorators\";\nimport { injectInitialization, extractComputedKeys } from \"./misc\";\nimport { enableFeature, FEATURES, isLoose, shouldTransform } from \"./features\";\nimport { assertFieldTransformed } from \"./typescript\";\n\nexport { FEATURES, enableFeature, injectInitialization };\n\ndeclare const PACKAGE_JSON: { name: string; version: string };\n\n// Note: Versions are represented as an integer. e.g. 7.1.5 is represented\n//       as 70000100005. This method is easier than using a semver-parsing\n//       package, but it breaks if we release x.y.z where x, y or z are\n//       greater than 99_999.\nconst version = PACKAGE_JSON.version\n  .split(\".\")\n  .reduce((v, x) => v * 1e5 + +x, 0);\nconst versionKey = \"@babel/plugin-class-features/version\";\n\ninterface Options {\n  name: string;\n  feature: number;\n  loose?: boolean;\n  inherits?: PluginObject[\"inherits\"];\n  manipulateOptions?: PluginObject[\"manipulateOptions\"];\n  api?: PluginAPI;\n}\n\nexport function createClassFeaturePlugin({\n  name,\n  feature,\n  loose,\n  manipulateOptions,\n  // @ts-ignore(Babel 7 vs Babel 8) TODO(Babel 8): Remove the default value\n  api = { assumption: () => void 0 },\n  inherits,\n}: Options): PluginObject {\n  const setPublicClassFields = api.assumption(\"setPublicClassFields\");\n  const privateFieldsAsProperties = api.assumption(\"privateFieldsAsProperties\");\n  const constantSuper = api.assumption(\"constantSuper\");\n  const noDocumentAll = api.assumption(\"noDocumentAll\");\n\n  if (loose === true) {\n    const explicit = [];\n\n    if (setPublicClassFields !== undefined) {\n      explicit.push(`\"setPublicClassFields\"`);\n    }\n    if (privateFieldsAsProperties !== undefined) {\n      explicit.push(`\"privateFieldsAsProperties\"`);\n    }\n    if (explicit.length !== 0) {\n      console.warn(\n        `[${name}]: You are using the \"loose: true\" option and you are` +\n          ` explicitly setting a value for the ${explicit.join(\" and \")}` +\n          ` assumption${explicit.length > 1 ? \"s\" : \"\"}. The \"loose\" option` +\n          ` can cause incompatibilities with the other class features` +\n          ` plugins, so it's recommended that you replace it with the` +\n          ` following top-level option:\\n` +\n          `\\t\"assumptions\": {\\n` +\n          `\\t\\t\"setPublicClassFields\": true,\\n` +\n          `\\t\\t\"privateFieldsAsProperties\": true\\n` +\n          `\\t}`,\n      );\n    }\n  }\n\n  return {\n    name,\n    manipulateOptions,\n    inherits,\n\n    pre(file) {\n      enableFeature(file, feature, loose);\n\n      if (!file.get(versionKey) || file.get(versionKey) < version) {\n        file.set(versionKey, version);\n      }\n    },\n\n    visitor: {\n      Class(path, { file }) {\n        if (file.get(versionKey) !== version) return;\n\n        if (!shouldTransform(path, file)) return;\n\n        if (path.isClassDeclaration()) assertFieldTransformed(path);\n\n        const loose = isLoose(file, feature);\n\n        let constructor: NodePath<t.ClassMethod>;\n        const isDecorated = hasDecorators(path.node);\n        const props: PropPath[] = [];\n        const elements = [];\n        const computedPaths: NodePath<t.ClassProperty | t.ClassMethod>[] = [];\n        const privateNames = new Set<string>();\n        const body = path.get(\"body\");\n\n        for (const path of body.get(\"body\")) {\n          if (\n            // check path.node.computed is enough, but ts will complain\n            (path.isClassProperty() || path.isClassMethod()) &&\n            path.node.computed\n          ) {\n            computedPaths.push(path);\n          }\n\n          if (path.isPrivate()) {\n            const { name } = path.node.key.id;\n            const getName = `get ${name}`;\n            const setName = `set ${name}`;\n\n            if (path.isClassPrivateMethod()) {\n              if (path.node.kind === \"get\") {\n                if (\n                  privateNames.has(getName) ||\n                  (privateNames.has(name) && !privateNames.has(setName))\n                ) {\n                  throw path.buildCodeFrameError(\"Duplicate private field\");\n                }\n                privateNames.add(getName).add(name);\n              } else if (path.node.kind === \"set\") {\n                if (\n                  privateNames.has(setName) ||\n                  (privateNames.has(name) && !privateNames.has(getName))\n                ) {\n                  throw path.buildCodeFrameError(\"Duplicate private field\");\n                }\n                privateNames.add(setName).add(name);\n              }\n            } else {\n              if (\n                (privateNames.has(name) &&\n                  !privateNames.has(getName) &&\n                  !privateNames.has(setName)) ||\n                (privateNames.has(name) &&\n                  (privateNames.has(getName) || privateNames.has(setName)))\n              ) {\n                throw path.buildCodeFrameError(\"Duplicate private field\");\n              }\n\n              privateNames.add(name);\n            }\n          }\n\n          if (path.isClassMethod({ kind: \"constructor\" })) {\n            constructor = path;\n          } else {\n            elements.push(path);\n            if (\n              path.isProperty() ||\n              path.isPrivate() ||\n              path.isStaticBlock?.()\n            ) {\n              props.push(path as PropPath);\n            }\n          }\n        }\n\n        if (process.env.BABEL_8_BREAKING) {\n          if (!props.length) return;\n        } else {\n          if (!props.length && !isDecorated) return;\n        }\n\n        const innerBinding = path.node.id;\n        let ref: t.Identifier;\n        if (!innerBinding || path.isClassExpression()) {\n          nameFunction(path);\n          ref = path.scope.generateUidIdentifier(\"class\");\n        } else {\n          ref = t.cloneNode(path.node.id);\n        }\n\n        // NODE: These three functions don't support decorators yet,\n        //       but verifyUsedFeatures throws if there are both\n        //       decorators and private fields.\n        const privateNamesMap = buildPrivateNamesMap(props);\n        const privateNamesNodes = buildPrivateNamesNodes(\n          privateNamesMap,\n          (privateFieldsAsProperties ?? loose) as boolean,\n          file,\n        );\n\n        transformPrivateNamesUsage(\n          ref,\n          path,\n          privateNamesMap,\n          {\n            privateFieldsAsProperties: privateFieldsAsProperties ?? loose,\n            noDocumentAll,\n            innerBinding,\n          },\n          file,\n        );\n\n        let keysNodes: t.Statement[],\n          staticNodes: t.Statement[],\n          instanceNodes: t.Statement[],\n          pureStaticNodes: t.FunctionDeclaration[],\n          wrapClass: (path: NodePath<t.Class>) => NodePath;\n\n        if (!process.env.BABEL_8_BREAKING) {\n          if (isDecorated) {\n            staticNodes = pureStaticNodes = keysNodes = [];\n            ({ instanceNodes, wrapClass } = buildDecoratedClass(\n              ref,\n              path,\n              elements,\n              file,\n            ));\n          } else {\n            keysNodes = extractComputedKeys(path, computedPaths, file);\n            ({ staticNodes, pureStaticNodes, instanceNodes, wrapClass } =\n              buildFieldsInitNodes(\n                ref,\n                path.node.superClass,\n                props,\n                privateNamesMap,\n                file,\n                (setPublicClassFields ?? loose) as boolean,\n                (privateFieldsAsProperties ?? loose) as boolean,\n                (constantSuper ?? loose) as boolean,\n                innerBinding,\n              ));\n          }\n        } else {\n          keysNodes = extractComputedKeys(path, computedPaths, file);\n          ({ staticNodes, pureStaticNodes, instanceNodes, wrapClass } =\n            buildFieldsInitNodes(\n              ref,\n              path.node.superClass,\n              props,\n              privateNamesMap,\n              file,\n              (setPublicClassFields ?? loose) as boolean,\n              (privateFieldsAsProperties ?? loose) as boolean,\n              (constantSuper ?? loose) as boolean,\n              innerBinding,\n            ));\n        }\n\n        if (instanceNodes.length > 0) {\n          injectInitialization(\n            path,\n            constructor,\n            instanceNodes,\n            (referenceVisitor, state) => {\n              if (!process.env.BABEL_8_BREAKING) {\n                if (isDecorated) return;\n              }\n              for (const prop of props) {\n                // @ts-expect-error: TS doesn't infer that prop.node is not a StaticBlock\n                if (t.isStaticBlock?.(prop.node) || prop.node.static) continue;\n                prop.traverse(referenceVisitor, state);\n              }\n            },\n          );\n        }\n\n        // rename to make ts happy\n        const wrappedPath = wrapClass(path);\n        wrappedPath.insertBefore([...privateNamesNodes, ...keysNodes]);\n        if (staticNodes.length > 0) {\n          wrappedPath.insertAfter(staticNodes);\n        }\n        if (pureStaticNodes.length > 0) {\n          wrappedPath\n            .find(parent => parent.isStatement() || parent.isDeclaration())\n            .insertAfter(pureStaticNodes);\n        }\n      },\n\n      ExportDefaultDeclaration(path, { file }) {\n        if (!process.env.BABEL_8_BREAKING) {\n          if (file.get(versionKey) !== version) return;\n\n          const decl = path.get(\"declaration\");\n\n          if (decl.isClassDeclaration() && hasDecorators(decl.node)) {\n            if (decl.node.id) {\n              // export default class Foo {}\n              //   -->\n              // class Foo {} export { Foo as default }\n              splitExportDeclaration(path);\n            } else {\n              // @ts-expect-error Anonymous class declarations can be\n              // transformed as if they were expressions\n              decl.node.type = \"ClassExpression\";\n            }\n          }\n        }\n      },\n    },\n  };\n}\n"],"mappings":"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"}