UNPKG

14.2 kBJavaScriptView Raw
1var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2 return new (P || (P = Promise))(function (resolve, reject) {
3 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
5 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
6 step((generator = generator.apply(thisArg, _arguments || [])).next());
7 });
8};
9Object.defineProperty(exports, "__esModule", { value: true });
10const fs = require("mz/fs");
11const os = require("os");
12const path = require("path");
13const Helpers = require("./helpers");
14const IMPORT_PATTERN = /@import ['"](.+)['"];/g;
15const COMMENTED_IMPORT_PATTERN = /\/\/@import '(.+)';/g;
16const FILE_EXTENSION = ".scss";
17class Bundle {
18 static Bundle(file) {
19 return __awaiter(this, void 0, void 0, function* () {
20 let content = yield fs.readFile(file, "utf-8");
21 return yield this.bundle(file, content);
22 });
23 }
24 static BundleAll(files) {
25 return __awaiter(this, void 0, void 0, function* () {
26 let resultsPromises = files.map(this.Bundle);
27 return yield Promise.all(resultsPromises);
28 });
29 }
30 static bundle(filePath, content, filesContents) {
31 return __awaiter(this, void 0, void 0, function* () {
32 if (filesContents == null) {
33 filesContents = {};
34 }
35 // Remove commented imports
36 content = content.replace(COMMENTED_IMPORT_PATTERN, "");
37 // Resolve path to work only with full paths
38 filePath = path.resolve(filePath);
39 let dirname = path.dirname(filePath);
40 if (filesContents[filePath] == null) {
41 filesContents[filePath] = content;
42 }
43 let importsPromises = Helpers.getAllMatches(content, IMPORT_PATTERN).map((match) => __awaiter(this, void 0, void 0, function* () {
44 let importName = match[1];
45 // Append extension if it's absent
46 if (importName.indexOf(FILE_EXTENSION) === -1) {
47 importName += FILE_EXTENSION;
48 }
49 let fullPath = path.resolve(dirname, importName);
50 let importData = {
51 importString: match[0],
52 path: importName,
53 fullPath: fullPath,
54 found: false
55 };
56 try {
57 yield fs.access(fullPath);
58 importData.found = true;
59 }
60 catch (error) {
61 let underscoredFilePath = path.join(dirname, `_${importName}`);
62 try {
63 yield fs.access(underscoredFilePath);
64 importData.fullPath = underscoredFilePath;
65 importData.found = true;
66 }
67 catch (underscoreErr) {
68 // Neither file, nor partial was found
69 }
70 }
71 return importData;
72 }));
73 let imports = yield Promise.all(importsPromises);
74 let allImports = [];
75 for (let imp of imports) {
76 // Push current import
77 allImports.push(imp);
78 let contentToReplace;
79 if (imp.found && filesContents[imp.fullPath] == null) {
80 let impContent = yield fs.readFile(imp.fullPath, "utf-8");
81 let bundledImport = yield this.bundle(imp.fullPath, impContent);
82 filesContents[imp.fullPath] = bundledImport.content;
83 allImports = allImports.concat(bundledImport.imports);
84 }
85 contentToReplace = filesContents[imp.fullPath];
86 if (contentToReplace == null) {
87 contentToReplace = `/*** IMPORTED FILE NOT FOUND ***/${os.EOL}${imp.importString}/*** --- ***/`;
88 }
89 content = content.replace(imp.importString, contentToReplace);
90 }
91 return {
92 content: content,
93 filePath: filePath,
94 imports: allImports
95 };
96 });
97 }
98}
99exports.Bundle = Bundle;
100//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2J1bmRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSw0QkFBNEI7QUFDNUIseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3QixxQ0FBcUM7QUFFckMsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUM7QUFDaEQsTUFBTSx3QkFBd0IsR0FBRyxzQkFBc0IsQ0FBQztBQUN4RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFtQi9CO0lBQ1csTUFBTSxDQUFPLE1BQU0sQ0FBQyxJQUFZOztZQUNuQyxJQUFJLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUM7S0FBQTtJQUVNLE1BQU0sQ0FBTyxTQUFTLENBQUMsS0FBZTs7WUFDekMsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxDQUFDO0tBQUE7SUFFTyxNQUFNLENBQU8sTUFBTSxDQUFDLFFBQWdCLEVBQUUsT0FBZSxFQUFFLGFBQTBCOztZQUNyRixFQUFFLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXhELDRDQUE0QztZQUM1QyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FB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RyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUUvQyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUMzQixnQkFBZ0IsR0FBRyxvQ0FBb0MsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsWUFBWSxlQUFlLENBQUM7Z0JBQ3BHLENBQUM7Z0JBRUQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFFRCxNQUFNLENBQUM7Z0JBQ0gsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixPQUFPLEVBQUUsVUFBVTthQUN0QixDQUFDO1FBQ04sQ0FBQztLQUFBO0NBQ0o7QUF6RkQsd0JBeUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm16L2ZzXCI7XHJcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XHJcblxyXG5pbXBvcnQgKiBhcyBIZWxwZXJzIGZyb20gXCIuL2hlbHBlcnNcIjtcclxuXHJcbmNvbnN0IElNUE9SVF9QQVRURVJOID0gL0BpbXBvcnQgWydcIl0oLispWydcIl07L2c7XHJcbmNvbnN0IENPTU1FTlRFRF9JTVBPUlRfUEFUVEVSTiA9IC9cXC9cXC9AaW1wb3J0ICcoLispJzsvZztcclxuY29uc3QgRklMRV9FWFRFTlNJT04gPSBcIi5zY3NzXCI7XHJcblxyXG5pbnRlcmZhY2UgRGljdGlvbmFyeSB7XHJcbiAgICBbaWQ6IHN0cmluZ106IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIEltcG9ydERhdGEge1xyXG4gICAgaW1wb3J0U3RyaW5nOiBzdHJpbmc7XHJcbiAgICBwYXRoOiBzdHJpbmc7XHJcbiAgICBmdWxsUGF0aDogc3RyaW5nO1xyXG4gICAgZm91bmQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmludGVyZmFjZSBCdW5kbGVSZXN1bHQge1xyXG4gICAgaW1wb3J0czogSW1wb3J0RGF0YVtdO1xyXG4gICAgZmlsZVBhdGg6IHN0cmluZztcclxuICAgIGNvbnRlbnQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEJ1bmRsZSB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIEJ1bmRsZShmaWxlOiBzdHJpbmcpOiBQcm9taXNlPEJ1bmRsZVJlc3VsdD4ge1xyXG4gICAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZSwgXCJ1dGYtOFwiKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5idW5kbGUoZmlsZSwgY29udGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBCdW5kbGVBbGwoZmlsZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxCdW5kbGVSZXN1bHRbXT4ge1xyXG4gICAgICAgIGxldCByZXN1bHRzUHJvbWlzZXMgPSBmaWxlcy5tYXAodGhpcy5CdW5kbGUpO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChyZXN1bHRzUHJvbWlzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGJ1bmRsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGVzQ29udGVudHM/OiBEaWN0aW9uYXJ5KTogUHJvbWlzZTxCdW5kbGVSZXN1bHQ+IHtcclxuICAgICAgICBpZiAoZmlsZXNDb250ZW50cyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZpbGVzQ29udGVudHMgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSBjb21tZW50ZWQgaW1wb3J0c1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoQ09NTUVOVEVEX0lNUE9SVF9QQVRURVJOLCBcIlwiKTtcclxuXHJcbiAgICAgICAgLy8gUmVzb2x2ZSBwYXRoIHRvIHdvcmsgb25seSB3aXRoIGZ1bGwgcGF0aHNcclxuICAgICAgICBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XHJcblxyXG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGVzQ29udGVudHNbZmlsZVBhdGhdID09IG51bGwpIHtcclxuICAgICAgICAgICAgZmlsZXNDb250ZW50c1tmaWxlUGF0aF0gPSBjb250ZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGltcG9ydHNQcm9taXNlcyA9IEhlbHBlcnMuZ2V0QWxsTWF0Y2hlcyhjb250ZW50LCBJTVBPUlRfUEFUVEVSTikubWFwKGFzeW5jIG1hdGNoID0+IHtcclxuICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBtYXRjaFsxXTtcclxuICAgICAgICAgICAgLy8gQXBwZW5kIGV4dGVuc2lvbiBpZiBpdCdzIGFic2VudFxyXG4gICAgICAgICAgICBpZiAoaW1wb3J0TmFtZS5pbmRleE9mKEZJTEVfRVhURU5TSU9OKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGltcG9ydE5hbWUgKz0gRklMRV9FWFRFTlNJT047XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGRpcm5hbWUsIGltcG9ydE5hbWUpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGltcG9ydERhdGE6IEltcG9ydERhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBpbXBvcnRTdHJpbmc6IG1hdGNoWzBdLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogaW1wb3J0TmFtZSxcclxuICAgICAgICAgICAgICAgIGZ1bGxQYXRoOiBmdWxsUGF0aCxcclxuICAgICAgICAgICAgICAgIGZvdW5kOiBmYWxzZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmdWxsUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpbXBvcnREYXRhLmZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bmRlcnNjb3JlZEZpbGVQYXRoID0gcGF0aC5qb2luKGRpcm5hbWUsIGBfJHtpbXBvcnROYW1lfWApO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModW5kZXJzY29yZWRGaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGF0YS5mdWxsUGF0aCA9IHVuZGVyc2NvcmVkRmlsZVBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGF0YS5mb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh1bmRlcnNjb3JlRXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTmVpdGhlciBmaWxlLCBub3IgcGFydGlhbCB3YXMgZm91bmRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydERhdGE7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBpbXBvcnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoaW1wb3J0c1Byb21pc2VzKTtcclxuICAgICAgICBsZXQgYWxsSW1wb3J0czogSW1wb3J0RGF0YVtdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaW1wIG9mIGltcG9ydHMpIHtcclxuICAgICAgICAgICAgLy8gUHVzaCBjdXJyZW50IGltcG9ydFxyXG4gICAgICAgICAgICBhbGxJbXBvcnRzLnB1c2goaW1wKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjb250ZW50VG9SZXBsYWNlO1xyXG4gICAgICAgICAgICBpZiAoaW1wLmZvdW5kICYmIGZpbGVzQ29udGVudHNbaW1wLmZ1bGxQYXRoXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1wQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGltcC5mdWxsUGF0aCwgXCJ1dGYtOFwiKTtcclxuICAgICAgICAgICAgICAgIGxldCBidW5kbGVkSW1wb3J0ID0gYXdhaXQgdGhpcy5idW5kbGUoaW1wLmZ1bGxQYXRoLCBpbXBDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIGZpbGVzQ29udGVudHNbaW1wLmZ1bGxQYXRoXSA9IGJ1bmRsZWRJbXBvcnQuY29udGVudDtcclxuICAgICAgICAgICAgICAgIGFsbEltcG9ydHMgPSBhbGxJbXBvcnRzLmNvbmNhdChidW5kbGVkSW1wb3J0LmltcG9ydHMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb250ZW50VG9SZXBsYWNlID0gZmlsZXNDb250ZW50c1tpbXAuZnVsbFBhdGhdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRlbnRUb1JlcGxhY2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudFRvUmVwbGFjZSA9IGAvKioqIElNUE9SVEVEIEZJTEUgTk9UIEZPVU5EICoqKi8ke29zLkVPTH0ke2ltcC5pbXBvcnRTdHJpbmd9LyoqKiAtLS0gKioqL2A7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoaW1wLmltcG9ydFN0cmluZywgY29udGVudFRvUmVwbGFjZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxyXG4gICAgICAgICAgICBmaWxlUGF0aDogZmlsZVBhdGgsXHJcbiAgICAgICAgICAgIGltcG9ydHM6IGFsbEltcG9ydHNcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
\No newline at end of file