Skip to content

Commit acd1963

Browse files
committed
Add lib folder
1 parent 7a0f5fa commit acd1963

File tree

4 files changed

+272
-1
lines changed

4 files changed

+272
-1
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
node_modules/*
22
!node_modules/cool-styles
3-
lib

lib/file-system-loader.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
8+
9+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
10+
11+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
12+
13+
var _indexJs = require('./index.js');
14+
15+
var _indexJs2 = _interopRequireDefault(_indexJs);
16+
17+
var _fs = require('fs');
18+
19+
var _fs2 = _interopRequireDefault(_fs);
20+
21+
var _path = require('path');
22+
23+
var _path2 = _interopRequireDefault(_path);
24+
25+
// Sorts dependencies in the following way:
26+
// AAA comes before AA and A
27+
// AB comes after AA and before A
28+
// All Bs come after all As
29+
// This ensures that the files are always returned in the following order:
30+
// - In the order they were required, except
31+
// - After all their dependencies
32+
var traceKeySorter = function traceKeySorter(a, b) {
33+
if (a.length < b.length) {
34+
return a < b.substring(0, a.length) ? -1 : 1;
35+
} else if (a.length > b.length) {
36+
return a.substring(0, b.length) <= b ? -1 : 1;
37+
} else {
38+
return a < b ? -1 : 1;
39+
}
40+
};
41+
42+
var FileSystemLoader = (function () {
43+
function FileSystemLoader(root, plugins) {
44+
_classCallCheck(this, FileSystemLoader);
45+
46+
this.root = root;
47+
this.sources = {};
48+
this.importNr = 0;
49+
this.core = new _indexJs2['default'](plugins);
50+
this.tokensByFile = {};
51+
}
52+
53+
_createClass(FileSystemLoader, [{
54+
key: 'fetch',
55+
value: function fetch(_newPath, relativeTo, _trace) {
56+
var _this = this;
57+
58+
var newPath = _newPath.replace(/^["']|["']$/g, ""),
59+
trace = _trace || String.fromCharCode(this.importNr++);
60+
return new Promise(function (resolve, reject) {
61+
var relativeDir = _path2['default'].dirname(relativeTo),
62+
rootRelativePath = _path2['default'].resolve(relativeDir, newPath),
63+
fileRelativePath = _path2['default'].resolve(_path2['default'].join(_this.root, relativeDir), newPath);
64+
65+
var tokens = _this.tokensByFile[fileRelativePath];
66+
if (tokens) {
67+
return resolve(tokens);
68+
}
69+
70+
_fs2['default'].readFile(fileRelativePath, "utf-8", function (err, source) {
71+
if (err) reject(err);
72+
_this.core.load(source, rootRelativePath, trace, _this.fetch.bind(_this)).then(function (_ref) {
73+
var injectableSource = _ref.injectableSource;
74+
var exportTokens = _ref.exportTokens;
75+
76+
_this.sources[trace] = injectableSource;
77+
_this.tokensByFile[fileRelativePath] = exportTokens;
78+
resolve(exportTokens);
79+
}, reject);
80+
});
81+
});
82+
}
83+
}, {
84+
key: 'finalSource',
85+
get: function get() {
86+
var _this2 = this;
87+
88+
return Object.keys(this.sources).sort(traceKeySorter).map(function (s) {
89+
return _this2.sources[s];
90+
}).join("");
91+
}
92+
}]);
93+
94+
return FileSystemLoader;
95+
})();
96+
97+
exports['default'] = FileSystemLoader;
98+
module.exports = exports['default'];

lib/index.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, '__esModule', {
4+
value: true
5+
});
6+
7+
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
8+
9+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
10+
11+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
12+
13+
var _postcss = require('postcss');
14+
15+
var _postcss2 = _interopRequireDefault(_postcss);
16+
17+
var _postcssModulesLocalByDefault = require('postcss-modules-local-by-default');
18+
19+
var _postcssModulesLocalByDefault2 = _interopRequireDefault(_postcssModulesLocalByDefault);
20+
21+
var _postcssModulesExtractImports = require('postcss-modules-extract-imports');
22+
23+
var _postcssModulesExtractImports2 = _interopRequireDefault(_postcssModulesExtractImports);
24+
25+
var _postcssModulesScope = require('postcss-modules-scope');
26+
27+
var _postcssModulesScope2 = _interopRequireDefault(_postcssModulesScope);
28+
29+
var _postcssModulesValues = require('postcss-modules-values');
30+
31+
var _postcssModulesValues2 = _interopRequireDefault(_postcssModulesValues);
32+
33+
var _parser = require('./parser');
34+
35+
var _parser2 = _interopRequireDefault(_parser);
36+
37+
var Core = (function () {
38+
function Core(plugins) {
39+
_classCallCheck(this, Core);
40+
41+
this.plugins = plugins || Core.defaultPlugins;
42+
}
43+
44+
// These four plugins are aliased under this package for simplicity.
45+
46+
_createClass(Core, [{
47+
key: 'load',
48+
value: function load(sourceString, sourcePath, trace, pathFetcher) {
49+
var parser = new _parser2['default'](pathFetcher, trace);
50+
51+
return (0, _postcss2['default'])(this.plugins.concat([parser.plugin])).process(sourceString, { from: "/" + sourcePath }).then(function (result) {
52+
return { injectableSource: result.css, exportTokens: parser.exportTokens };
53+
});
54+
}
55+
}]);
56+
57+
return Core;
58+
})();
59+
60+
exports['default'] = Core;
61+
Core.values = _postcssModulesValues2['default'];
62+
Core.localByDefault = _postcssModulesLocalByDefault2['default'];
63+
Core.extractImports = _postcssModulesExtractImports2['default'];
64+
Core.scope = _postcssModulesScope2['default'];
65+
66+
Core.defaultPlugins = [_postcssModulesValues2['default'], _postcssModulesLocalByDefault2['default'], _postcssModulesExtractImports2['default'], _postcssModulesScope2['default']];
67+
module.exports = exports['default'];

lib/parser.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
8+
9+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10+
11+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12+
13+
var _icssReplaceSymbols = require('icss-replace-symbols');
14+
15+
var _icssReplaceSymbols2 = _interopRequireDefault(_icssReplaceSymbols);
16+
17+
var importRegexp = /^:import\((.+)\)$/;
18+
19+
var Parser = (function () {
20+
function Parser(pathFetcher, trace) {
21+
_classCallCheck(this, Parser);
22+
23+
this.pathFetcher = pathFetcher;
24+
this.plugin = this.plugin.bind(this);
25+
this.exportTokens = {};
26+
this.translations = {};
27+
this.trace = trace;
28+
}
29+
30+
_createClass(Parser, [{
31+
key: "plugin",
32+
value: function plugin(css, result) {
33+
var _this = this;
34+
35+
return Promise.all(this.fetchAllImports(css)).then(function (_) {
36+
return _this.linkImportedSymbols(css);
37+
}).then(function (_) {
38+
return _this.extractExports(css);
39+
});
40+
}
41+
}, {
42+
key: "fetchAllImports",
43+
value: function fetchAllImports(css) {
44+
var _this2 = this;
45+
46+
var imports = [];
47+
css.each(function (node) {
48+
if (node.type == "rule" && node.selector.match(importRegexp)) {
49+
imports.push(_this2.fetchImport(node, css.source.input.from, imports.length));
50+
}
51+
});
52+
return imports;
53+
}
54+
}, {
55+
key: "linkImportedSymbols",
56+
value: function linkImportedSymbols(css) {
57+
(0, _icssReplaceSymbols2["default"])(css, this.translations);
58+
}
59+
}, {
60+
key: "extractExports",
61+
value: function extractExports(css) {
62+
var _this3 = this;
63+
64+
css.each(function (node) {
65+
if (node.type == "rule" && node.selector == ":export") _this3.handleExport(node);
66+
});
67+
}
68+
}, {
69+
key: "handleExport",
70+
value: function handleExport(exportNode) {
71+
var _this4 = this;
72+
73+
exportNode.each(function (decl) {
74+
if (decl.type == 'decl') {
75+
Object.keys(_this4.translations).forEach(function (translation) {
76+
decl.value = decl.value.replace(translation, _this4.translations[translation]);
77+
});
78+
_this4.exportTokens[decl.prop] = decl.value;
79+
}
80+
});
81+
exportNode.remove();
82+
}
83+
}, {
84+
key: "fetchImport",
85+
value: function fetchImport(importNode, relativeTo, depNr) {
86+
var _this5 = this;
87+
88+
var file = importNode.selector.match(importRegexp)[1],
89+
depTrace = this.trace + String.fromCharCode(depNr);
90+
return this.pathFetcher(file, relativeTo, depTrace).then(function (exports) {
91+
importNode.each(function (decl) {
92+
if (decl.type == 'decl') {
93+
_this5.translations[decl.prop] = exports[decl.value];
94+
}
95+
});
96+
importNode.remove();
97+
}, function (err) {
98+
return console.log(err);
99+
});
100+
}
101+
}]);
102+
103+
return Parser;
104+
})();
105+
106+
exports["default"] = Parser;
107+
module.exports = exports["default"];

0 commit comments

Comments
 (0)