This repository was archived by the owner on Oct 30, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 70
Expand file tree
/
Copy pathcssModuleToInterface.js
More file actions
100 lines (90 loc) · 2.71 KB
/
cssModuleToInterface.js
File metadata and controls
100 lines (90 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import path from 'path';
const filenameToInterfaceName = (filename) => {
return path.basename(filename)
.replace(/^(\w)/, (_, c) => 'I' + c.toUpperCase())
.replace(/\W+(\w)/g, (_, c) => c.toUpperCase());
};
const cssModuleToTypescriptInterfaceProperties = (cssModuleKeys, isSingleQuote = true , indent = ' ') => {
const quote = isSingleQuote ? "'": '"';
return cssModuleKeys
.map((key) => `${indent}${quote}${key}${quote}: string;`)
.join('\n');
};
const cssModuleToNamedExports = (cssModuleKeys) => {
return cssModuleKeys
.map((key) => `export const ${key}: string;`)
.join('\n');
};
const allWordsRegexp = /^\w+$/i;
export const filterNonWordClasses = (cssModuleKeys) => {
const filteredClassNames = cssModuleKeys.filter(classname => allWordsRegexp.test(classname));
if (filteredClassNames.length === cssModuleKeys.length) {
return [filteredClassNames, [],];
}
const nonWordClassNames = cssModuleKeys.filter(classname => !allWordsRegexp.test(classname));
return [filteredClassNames, nonWordClassNames,];
};
// Documented here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Reserved_keywords_as_of_ECMAScript_2015
const 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'
];
export const filterReservedWordClasses = (cssModuleKeys) => {
const filteredClassNames = cssModuleKeys.filter(classname => reservedWords.indexOf(classname) === -1);
if (filteredClassNames.length === cssModuleKeys.length) {
return [filteredClassNames, [],];
}
const reservedWordClassNames = cssModuleKeys.filter(classname => reservedWords.indexOf(classname) !== -1);
return [filteredClassNames, reservedWordClassNames,];
};
export const filenameToTypingsFilename = (filename) => {
const dirName = path.dirname(filename);
const baseName = path.basename(filename);
return path.join(dirName, `${baseName}.d.ts`);
};
export const generateNamedExports = (cssModuleKeys) => {
const namedExports = cssModuleToNamedExports(cssModuleKeys);
return (`${namedExports}
`);
};
export const generateGenericExportInterface = (cssModuleKeys, filename, isSingleQuote, indent) => {
const interfaceName = filenameToInterfaceName(filename);
const interfaceProperties = cssModuleToTypescriptInterfaceProperties(cssModuleKeys, isSingleQuote, indent);
return (
`export interface ${interfaceName} {
${interfaceProperties}
}
export const locals: ${interfaceName};
`);
};