UNPKG

@marko/compiler

Version:
137 lines (113 loc) 3.91 kB
"use strict";exports.__esModule = true;exports.importDefault = importDefault;exports.importNamed = importNamed;exports.importStar = importStar;exports.resolveRelativePath = resolveRelativePath;var _compiler = require("@marko/compiler"); var _modules = require("@marko/compiler/modules"); var _path = _interopRequireDefault(require("path")); var _relativeImportPath = require("relative-import-path");function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };} const IMPORTS_KEY = Symbol(); const FS_START = _path.default.sep === "/" ? _path.default.sep : /^(.*?:)/.exec(_modules.cwd)[1]; function resolveRelativePath(file, request) { if (request.startsWith(FS_START)) { request = (0, _relativeImportPath.relativeImportPath)(file.opts.filename, request); } if (file.markoOpts.optimize) { request = request.replace( /(^|\/node-modules\/)marko\/src\//, "$1marko/dist/" ); } return request; } function importDefault(file, request, nameHint) { const imports = getImports(file); request = resolveRelativePath(file, request); let importDeclaration = imports.get(request); if (!importDeclaration) { imports.set( request, importDeclaration = file.path.pushContainer( "body", _compiler.types.importDeclaration([], _compiler.types.stringLiteral(request)) )[0] ); } if (!nameHint) { return; } const specifiers = importDeclaration.get("specifiers"); const specifier = specifiers.find((specifier) => specifier.isImportDefaultSpecifier() ); if (!specifier) { const identifier = file.scope.generateUidIdentifier(nameHint); importDeclaration.pushContainer( "specifiers", _compiler.types.importDefaultSpecifier(identifier) ); return identifier; } return _compiler.types.identifier(specifier.node.local.name); } function importNamed(file, request, name, nameHint = name) { request = resolveRelativePath(file, request); const imports = getImports(file); let importDeclaration = imports.get(request); if (!importDeclaration) { imports.set( request, importDeclaration = file.path.pushContainer( "body", _compiler.types.importDeclaration([], _compiler.types.stringLiteral(request)) )[0] ); } const specifiers = importDeclaration.get("specifiers"); const specifier = specifiers.find( (specifier) => specifier.isImportSpecifier() && specifier.node.imported.name === name ); if (!specifier) { const identifier = file.scope.generateUidIdentifier(nameHint); importDeclaration.pushContainer( "specifiers", _compiler.types.importSpecifier(identifier, _compiler.types.identifier(name)) ); return identifier; } return _compiler.types.identifier(specifier.node.local.name); } function importStar(file, request, nameHint) { const imports = getImports(file); request = resolveRelativePath(file, request); let importDeclaration = imports.get(request); if (!importDeclaration) { imports.set( request, importDeclaration = file.path.pushContainer( "body", _compiler.types.importDeclaration([], _compiler.types.stringLiteral(request)) )[0] ); } if (!nameHint) { return; } const specifiers = importDeclaration.get("specifiers"); const specifier = specifiers.find((specifier) => specifier.isImportNamespaceSpecifier() ); if (!specifier) { const identifier = file.scope.generateUidIdentifier(nameHint); importDeclaration.pushContainer( "specifiers", _compiler.types.importNamespaceSpecifier(identifier) ); return identifier; } return _compiler.types.identifier(specifier.node.local.name); } function getImports(file) { let imports = file.metadata.marko[IMPORTS_KEY]; if (!imports) { imports = file.metadata.marko[IMPORTS_KEY] = new Map(); } return imports; }