UNPKG

@storm-stack/core

Version:

A build toolkit and runtime used by Storm Software in TypeScript applications

1 lines 8.82 kB
{"version":3,"sources":["../../src/lib/babel/plugins/module-resolver.ts"],"names":["resolveModulePath","nodePath","state","isStringLiteral","node","sourcePath","value","resolvedPath","context","vfs","resolvePath","replaceWith","stringLiteral","replace","TRANSFORM_FUNCTIONS","matchesPattern","calleePath","pattern","isMemberExpression","isIdentifier","includes","name","split","importVisitors","CallExpression","__name","moduleResolverVisited","has","get","some","isImportCall","add","ModuleResolverPlugin","declare","builder","api","Set","manipulateOptions","opts","filename","pre","visitor","Program","enter","programPath","traverse","exit","post","clear"],"mappings":"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","file":"chunk-ZC2JNV4B.cjs","sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Storm Stack\n\n This code was released as part of the Storm Stack project. Storm Stack\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/storm-stack.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/storm-stack\n Documentation: https://docs.stormsoftware.com/projects/storm-stack\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { NodePath, PluginAPI, PluginPass } from \"@babel/core\";\nimport { declare } from \"@babel/helper-plugin-utils\";\nimport * as t from \"@babel/types\";\nimport { BabelPluginOptions } from \"../../../types/babel\";\nimport { Context } from \"../../../types/context\";\nimport { isImportCall } from \"../module\";\n\ntype ModuleResolverPluginPass = PluginPass<BabelPluginOptions> & {\n context: Context;\n moduleResolverVisited: Set<any>;\n api: PluginAPI;\n};\n\nfunction resolveModulePath(\n nodePath: NodePath<t.StringLiteral>,\n state: ModuleResolverPluginPass\n) {\n if (!t.isStringLiteral(nodePath.node)) {\n return;\n }\n\n const sourcePath = nodePath.node.value;\n // const currentFile = state.file.opts.filename;\n\n const resolvedPath = state.context?.vfs.resolvePath(sourcePath);\n if (resolvedPath) {\n nodePath.replaceWith(\n t.stringLiteral(\n // Remove the file extension if it exists\n resolvedPath.replace(/\\.(?:ts|mts|cts)x?$/, \"\")\n )\n );\n }\n}\n\nconst TRANSFORM_FUNCTIONS = [\n \"require\",\n \"require.resolve\",\n \"System.import\",\n\n // Jest methods\n \"jest.genMockFromModule\",\n \"jest.mock\",\n \"jest.unmock\",\n \"jest.doMock\",\n // eslint-disable-next-line @cspell/spellchecker\n \"jest.dontMock\",\n \"jest.setMock\",\n \"jest.requireActual\",\n \"jest.requireMock\",\n\n // Older Jest methods\n \"require.requireActual\",\n \"require.requireMock\"\n];\n\nfunction matchesPattern(\n state: ModuleResolverPluginPass,\n calleePath: NodePath,\n pattern: string\n) {\n const { node } = calleePath;\n\n if (t.isMemberExpression(node)) {\n return calleePath.matchesPattern(pattern);\n }\n\n if (!t.isIdentifier(node) || pattern.includes(\".\")) {\n return false;\n }\n\n const name = pattern.split(\".\")[0];\n\n return node.name === name;\n}\n\nconst importVisitors = {\n CallExpression: (\n nodePath: NodePath<t.CallExpression>,\n state: ModuleResolverPluginPass\n ) => {\n if (state.moduleResolverVisited.has(nodePath)) {\n return;\n }\n\n const calleePath = nodePath.get(\"callee\");\n\n if (\n TRANSFORM_FUNCTIONS.some(pattern =>\n matchesPattern(state, calleePath, pattern)\n ) ||\n isImportCall(nodePath)\n ) {\n state.moduleResolverVisited.add(nodePath);\n resolveModulePath(\n nodePath.get(\"arguments.0\") as NodePath<t.StringLiteral>,\n state\n );\n }\n },\n // eslint-disable-next-line ts/naming-convention\n \"ImportDeclaration|ExportDeclaration|ExportAllDeclaration\": (\n nodePath: NodePath<\n t.ImportDeclaration | t.ExportDeclaration | t.ExportAllDeclaration\n >,\n state: ModuleResolverPluginPass\n ) => {\n if (state.moduleResolverVisited.has(nodePath)) {\n return;\n }\n\n state.moduleResolverVisited.add(nodePath);\n resolveModulePath(nodePath.get(\"source\"), state);\n }\n};\n\nexport function ModuleResolverPlugin(context: Context) {\n return declare(function builder(api: PluginAPI) {\n let moduleResolverVisited = new Set();\n\n return {\n name: \"storm-stack:module-resolver\",\n manipulateOptions(opts) {\n opts.filename ??= \"unknown\";\n },\n\n pre() {\n // We need to keep track of all handled nodes so we do not try to transform them twice,\n // because we run before (enter) and after (exit) all nodes are handled\n moduleResolverVisited = new Set();\n },\n\n visitor: {\n Program: {\n enter(\n programPath: NodePath<t.Program>,\n state: PluginPass<BabelPluginOptions>\n ) {\n programPath.traverse(importVisitors, {\n ...state,\n context,\n moduleResolverVisited,\n api\n } as ModuleResolverPluginPass);\n },\n exit(programPath, state) {\n programPath.traverse(importVisitors, {\n ...state,\n context,\n moduleResolverVisited,\n api\n } as ModuleResolverPluginPass);\n }\n }\n },\n\n post() {\n moduleResolverVisited.clear();\n }\n };\n });\n}\n"]}