@marko/compiler
Version:
Marko template to JS compiler.
137 lines (113 loc) • 3.91 kB
JavaScript
;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;
}