siphon-cli
Version:
Simple bundler for web applications. 📦🔧🧡
182 lines (181 loc) • 8.18 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
var fs_1 = require("fs");
var path_1 = require("path");
var __1 = require("..");
var types_1 = require("../../../../types");
var utils_1 = require("../../../../utils");
var creator_1 = require("../traverser/helpers/creator");
var utils_2 = require("./utils");
var ezra = utils_2.bundler_utils.prototype;
ezra.createJSAsset = function (filename) {
var _a;
var _this = this;
var content = (0, fs_1.readFileSync)(filename, "utf-8");
var ast = __1.default.parse(content, {
sourceFile: filename,
parseJSX: this.options.allowJSX,
});
var dependencies = [];
__1.default.traverse(ast, {
Identifier: function (node) {
if (!_this.globalIdentifierMap.has(node.name))
_this.globalIdentifierMap.set(node.name, true);
},
JSXElement: function () {
if (!_this.hasJSX)
_this.hasJSX = true;
},
});
var ezraModule = this.ModuleIdentifierNode(filename.toString());
var fullSourceExports = [];
var redefinitions = [];
var moduleImports = new Map();
var moduleExports = new Map();
__1.default.traverse(ast, {
ImportDeclaration: function (node) {
var dependencyPath = _this.getDependencyPath(node, filename);
var imported = _this.ModuleIdentifierNode(dependencyPath);
var dependency = {
id: imported.name,
path: dependencyPath,
extension: (0, path_1.extname)(dependencyPath),
};
var assignDec = new types_1.VariableDeclaration(node.loc.start);
assignDec.kind = "const";
var assignDeclarator = new types_1.VariableDeclarator(0);
var placeholder = _this.uniqueIdentifier("module");
var importedInit = (0, creator_1.callExpression)(imported, []);
assignDeclarator.id = placeholder;
assignDeclarator.init = importedInit;
assignDec.declarations.push(assignDeclarator);
var declaration2 = new types_1.VariableDeclaration(0);
declaration2.kind = "const";
if (node.specifiers.length === 0) {
if (utils_1.JSFiles[(0, path_1.extname)(dependencyPath).slice(1)] === true)
__1.default.parse((0, fs_1.readFileSync)(dependencyPath, "utf-8"), {
sourceFile: dependencyPath,
parseJSX: _this.options.allowJSX,
}).body.forEach(function (child) {
child.loc.start = node.loc.start;
fullSourceExports.push(child);
});
else
dependencies.push(dependency);
return new types_1.EmptyNode(0);
}
else
for (var _i = 0, _a = node.specifiers; _i < _a.length; _i++) {
var specifier = _a[_i];
var declarator = new types_1.VariableDeclarator(0);
declarator.id = (0, creator_1.newIdentifier)(specifier.local.name);
if (specifier instanceof types_1.ImportDefaultSpecifier) {
declarator.init = (0, creator_1.memberExpression)(placeholder, (0, creator_1.newIdentifier)("default"));
}
else if (specifier instanceof types_1.ImportSpecifier) {
declarator.init = (0, creator_1.memberExpression)(placeholder, (0, creator_1.newIdentifier)(specifier.imported.name));
}
else if (specifier instanceof types_1.ImportNamespaceSpecifier) {
declarator.init = placeholder;
}
declaration2.declarations.push(declarator);
}
redefinitions.push(assignDec);
dependencies.push(dependency);
return declaration2;
},
ExportNamedDeclaration: function (node, path) {
if (node.declaration) {
if (node.declaration instanceof types_1.FunctionDeclaration ||
node.declaration instanceof types_1.ClassDeclaration) {
moduleExports.set(node.declaration.id, node.declaration.id);
}
else if (node.declaration instanceof types_1.VariableDeclaration) {
node.declaration.declarations.forEach(function (declaration) {
moduleExports.set(declaration.id, declaration.id);
});
}
return node.declaration;
}
else if (node.specifiers) {
for (var _i = 0, _a = node.specifiers; _i < _a.length; _i++) {
var specifier = _a[_i];
moduleExports.set(specifier.local, specifier.exported);
}
return new types_1.EmptyNode(0);
}
},
ExportDefaultDeclaration: function (node, path) {
moduleExports.set(node.declaration, (0, creator_1.newIdentifier)("default"));
return new types_1.EmptyNode(0);
},
ThisExpression: function (node, path) {
if (path.scope.level === 0)
return (0, creator_1.newIdentifier)("globalThis");
},
});
(_a = ast.body).splice.apply(_a, __spreadArray([0,
0], redefinitions
.concat(fullSourceExports)
.sort(function (a, b) { return a.loc.start - b.loc.start; }), false));
moduleExports.forEach(function (value, key) {
ast.push((0, creator_1.expressionStatement)((0, creator_1.assignmentExpression)((0, creator_1.memberExpression)(ezraModule, (0, creator_1.newIdentifier)(value.name)), "=", key)));
});
return {
id: ezraModule.name,
dependencies: dependencies,
filename: filename,
module: this.prepareModule(ast, (0, creator_1.newIdentifier)(ezraModule.name)),
};
};
ezra.createCSSAsset = function (filename) {
var ezraModule = this.ModuleIdentifierNode(filename.toString());
this.stylesheets.push(filename);
return {
dependencies: [],
filename: filename,
id: ezraModule.name,
module: this.prepareModule(new types_1.Program(0), ezraModule),
};
};
ezra.createImageAsset = function (filename) {
var ezraModule = this.ModuleIdentifierNode(filename.toString());
var address = this.generateNewImage(filename);
if (this.options.storeImagesSeparately)
address = "./img/".concat(address);
else
address = "./".concat(address);
var defaultExport = "".concat(ezraModule.name, ".default = \"").concat(address, "\"");
return {
id: ezraModule.name,
filename: filename,
module: this.prepareModule(__1.default.parse(defaultExport), ezraModule),
dependencies: [],
};
};
ezra.createUnknownAsset = function (filename) {
filename = filename.toString();
var ezraModule = this.ModuleIdentifierNode(filename);
var defaultExport;
if ((0, path_1.extname)(filename) === ".json") {
defaultExport = "".concat(ezraModule.name, ".default = ").concat((0, fs_1.readFileSync)(filename, "utf-8"));
}
else {
defaultExport = "".concat(ezraModule.name, ".default = \"").concat((0, utils_1.stringifytoBase64)(filename), "\"");
}
return {
id: ezraModule.name,
filename: filename,
dependencies: [],
module: this.prepareModule(__1.default.parse(defaultExport), ezraModule),
};
};