Skip to content

Commit 8c4a464

Browse files
committed
Include all the built junk 'cus I'm not publishing
1 parent 2050608 commit 8c4a464

File tree

5 files changed

+259
-1
lines changed

5 files changed

+259
-1
lines changed

.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
node_modules
2-
lib
32
bundle.js
43
example*.css.d.ts

lib/cssModuleToInterface.js

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.generateGenericExportInterface = exports.generateNamedExports = exports.filenameToTypingsFilename = exports.filterReservedWordClasses = exports.filterNonWordClasses = undefined;
7+
8+
var _path = require('path');
9+
10+
var _path2 = _interopRequireDefault(_path);
11+
12+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13+
14+
var filenameToInterfaceName = function filenameToInterfaceName(filename) {
15+
return _path2.default.basename(filename).replace(/^(\w)/, function (_, c) {
16+
return 'I' + c.toUpperCase();
17+
}).replace(/\W+(\w)/g, function (_, c) {
18+
return c.toUpperCase();
19+
});
20+
};
21+
22+
var cssModuleToTypescriptInterfaceProperties = function cssModuleToTypescriptInterfaceProperties(cssModuleKeys) {
23+
var indent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ' ';
24+
25+
return cssModuleKeys.map(function (key) {
26+
return indent + '\'' + key + '\': string;';
27+
}).join('\n');
28+
};
29+
30+
var cssModuleToNamedExports = function cssModuleToNamedExports(cssModuleKeys) {
31+
return cssModuleKeys.map(function (key) {
32+
return 'export const ' + key + ': string;';
33+
}).join('\n');
34+
};
35+
36+
var allWordsRegexp = /^\w+$/i;
37+
var filterNonWordClasses = exports.filterNonWordClasses = function filterNonWordClasses(cssModuleKeys) {
38+
var filteredClassNames = cssModuleKeys.filter(function (classname) {
39+
return allWordsRegexp.test(classname);
40+
});
41+
if (filteredClassNames.length === cssModuleKeys.length) {
42+
return [filteredClassNames, []];
43+
}
44+
var nonWordClassNames = cssModuleKeys.filter(function (classname) {
45+
return !allWordsRegexp.test(classname);
46+
});
47+
return [filteredClassNames, nonWordClassNames];
48+
};
49+
50+
// Documented here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Reserved_keywords_as_of_ECMAScript_2015
51+
var reservedWords = ['break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'export', 'extends', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof', 'new', 'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void', 'while', 'with', 'yield'];
52+
var filterReservedWordClasses = exports.filterReservedWordClasses = function filterReservedWordClasses(cssModuleKeys) {
53+
var filteredClassNames = cssModuleKeys.filter(function (classname) {
54+
return reservedWords.indexOf(classname) === -1;
55+
});
56+
if (filteredClassNames.length === cssModuleKeys.length) {
57+
return [filteredClassNames, []];
58+
}
59+
var reservedWordClassNames = cssModuleKeys.filter(function (classname) {
60+
return reservedWords.indexOf(classname) !== -1;
61+
});
62+
return [filteredClassNames, reservedWordClassNames];
63+
};
64+
65+
var filenameToTypingsFilename = exports.filenameToTypingsFilename = function filenameToTypingsFilename(filename) {
66+
var dirName = _path2.default.dirname(filename);
67+
var baseName = _path2.default.basename(filename);
68+
return _path2.default.join(dirName, baseName + '.d.ts');
69+
};
70+
71+
var generateNamedExports = exports.generateNamedExports = function generateNamedExports(cssModuleKeys) {
72+
var namedExports = cssModuleToNamedExports(cssModuleKeys);
73+
return namedExports + '\n';
74+
};
75+
76+
var generateGenericExportInterface = exports.generateGenericExportInterface = function generateGenericExportInterface(cssModuleKeys, filename, indent) {
77+
var interfaceName = filenameToInterfaceName(filename);
78+
var interfaceProperties = cssModuleToTypescriptInterfaceProperties(cssModuleKeys, indent);
79+
return 'export interface ' + interfaceName + ' {\n' + interfaceProperties + '\n}\n\nexport const locals: ' + interfaceName + ';\n';
80+
};

lib/index.js

+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
'use strict';
2+
3+
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
4+
5+
var _cssLoader = require('css-loader');
6+
7+
var _cssLoader2 = _interopRequireDefault(_cssLoader);
8+
9+
var _locals = require('css-loader/locals');
10+
11+
var _locals2 = _interopRequireDefault(_locals);
12+
13+
var _loaderUtils = require('loader-utils');
14+
15+
var _loaderUtils2 = _interopRequireDefault(_loaderUtils);
16+
17+
require('colour');
18+
19+
var _cssModuleToInterface = require('./cssModuleToInterface');
20+
21+
var _persist = require('./persist');
22+
23+
var persist = _interopRequireWildcard(_persist);
24+
25+
var _logger = require('./logger');
26+
27+
var _logger2 = _interopRequireDefault(_logger);
28+
29+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
30+
31+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32+
33+
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
34+
35+
function delegateToCssLoader(ctx, input, callback) {
36+
ctx.async = function () {
37+
return callback;
38+
};
39+
_cssLoader2.default.call.apply(_cssLoader2.default, [ctx].concat(_toConsumableArray(input)));
40+
}
41+
42+
module.exports = function () {
43+
var _this = this;
44+
45+
for (var _len = arguments.length, input = Array(_len), _key = 0; _key < _len; _key++) {
46+
input[_key] = arguments[_key];
47+
}
48+
49+
if (this.cacheable) this.cacheable();
50+
51+
// mock async step 1 - css loader is async, we need to intercept this so we get async ourselves
52+
var callback = this.async();
53+
54+
var query = _loaderUtils2.default.parseQuery(this.query);
55+
var logger = (0, _logger2.default)(query.silent);
56+
57+
var moduleMode = query.modules || query.module;
58+
if (!moduleMode) {
59+
logger('warn', 'Typings for CSS-Modules: option `modules` is not active - skipping extraction work...'.red);
60+
return delegateToCssLoader(this, input, callback);
61+
}
62+
63+
// mock async step 2 - offer css loader a "fake" callback
64+
this.async = function () {
65+
return function (err, content) {
66+
if (err) {
67+
return callback(err);
68+
}
69+
var filename = _this.resourcePath;
70+
var cssModuleInterfaceFilename = (0, _cssModuleToInterface.filenameToTypingsFilename)(filename);
71+
72+
var keyRegex = /"([^\\"]+)":/g;
73+
var match = void 0;
74+
var cssModuleKeys = [];
75+
76+
while (match = keyRegex.exec(content)) {
77+
if (cssModuleKeys.indexOf(match[1]) < 0) {
78+
cssModuleKeys.push(match[1]);
79+
}
80+
}
81+
82+
var cssModuleDefinition = void 0;
83+
if (!query.namedExport) {
84+
cssModuleDefinition = (0, _cssModuleToInterface.generateGenericExportInterface)(cssModuleKeys, filename);
85+
} else {
86+
var _filterNonWordClasses = (0, _cssModuleToInterface.filterNonWordClasses)(cssModuleKeys),
87+
_filterNonWordClasses2 = _slicedToArray(_filterNonWordClasses, 2),
88+
cleanedDefinitions = _filterNonWordClasses2[0],
89+
skippedDefinitions = _filterNonWordClasses2[1];
90+
91+
if (skippedDefinitions.length > 0 && !query.camelCase) {
92+
logger('warn', ('Typings for CSS-Modules: option \'namedExport\' was set but \'camelCase\' for the css-loader not.\nThe following classes will not be available as named exports:\n' + skippedDefinitions.map(function (sd) {
93+
return ' - "' + sd + '"';
94+
}).join('\n').red + '\n').yellow);
95+
}
96+
97+
var _filterReservedWordCl = (0, _cssModuleToInterface.filterReservedWordClasses)(cleanedDefinitions),
98+
_filterReservedWordCl2 = _slicedToArray(_filterReservedWordCl, 2),
99+
nonReservedWordDefinitions = _filterReservedWordCl2[0],
100+
reservedWordDefinitions = _filterReservedWordCl2[1];
101+
102+
if (reservedWordDefinitions.length > 0) {
103+
logger('warn', ('Your css contains classes which are reserved words in JavaScript.\nConsequently the following classes will not be available as named exports:\n' + reservedWordDefinitions.map(function (rwd) {
104+
return ' - "' + rwd + '"';
105+
}).join('\n').red + '\nThese can be accessed using the object literal syntax; eg styles[\'delete\'] instead of styles.delete.\n').yellow);
106+
}
107+
108+
cssModuleDefinition = (0, _cssModuleToInterface.generateNamedExports)(nonReservedWordDefinitions);
109+
}
110+
if (cssModuleDefinition.trim() === '') {
111+
// Ensure empty CSS modules export something
112+
cssModuleDefinition = 'export {};\n';
113+
}
114+
if (query.banner) {
115+
// Prefix banner to CSS module
116+
cssModuleDefinition = query.banner + '\n' + cssModuleDefinition;
117+
}
118+
persist.writeToFileIfChanged(cssModuleInterfaceFilename, cssModuleDefinition, query);
119+
// mock async step 3 - make `async` return the actual callback again before calling the 'real' css-loader
120+
delegateToCssLoader(_this, input, callback);
121+
};
122+
};
123+
_locals2.default.call.apply(_locals2.default, [this].concat(input));
124+
};

lib/logger.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"use strict";
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
exports.default = function (silent) {
8+
if (silent) {
9+
return function () {};
10+
}
11+
return function (level) {
12+
var _console;
13+
14+
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
15+
args[_key - 1] = arguments[_key];
16+
}
17+
18+
return (_console = console)[level].apply(_console, args);
19+
};
20+
};

lib/persist.js

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
exports.writeToFileIfChanged = undefined;
7+
8+
var _gracefulFs = require('graceful-fs');
9+
10+
var _gracefulFs2 = _interopRequireDefault(_gracefulFs);
11+
12+
var _os = require('os');
13+
14+
var _os2 = _interopRequireDefault(_os);
15+
16+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17+
18+
var writeToFileIfChanged = exports.writeToFileIfChanged = function writeToFileIfChanged(filename, content, options) {
19+
if (_gracefulFs2.default.existsSync(filename)) {
20+
var currentInput = _gracefulFs2.default.readFileSync(filename, 'utf-8');
21+
22+
if (currentInput !== content) {
23+
writeFile(filename, content, options);
24+
}
25+
} else {
26+
writeFile(filename, content, options);
27+
}
28+
};
29+
30+
var writeFile = function writeFile(filename, content, options) {
31+
//Replace new lines with OS-specific new lines
32+
content = content.replace(/\n/g, options.EOL || _os2.default.EOL);
33+
34+
_gracefulFs2.default.writeFileSync(filename, content, 'utf8');
35+
};

0 commit comments

Comments
 (0)