Skip to content

Commit caad8f8

Browse files
committed
Deprecate auto-prefixing of modifiers. This functionality is not needed anymore thanks to the babel-plugin-react-native-dynamic-stylename-to-style which supports multi-classes on RN. Do only pure classnames functionality by default and change the algo from clsx to classcat.
1 parent 05afedb commit caad8f8

File tree

3 files changed

+101
-10
lines changed

3 files changed

+101
-10
lines changed

classcat.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
exports.c = function c (name, modifiers) {
2+
return cc(modifiers || '')
3+
}
4+
5+
// classcat 4.0.2
6+
// https://github.com/jorgebucaran/classcat
7+
8+
var isArray = Array.isArray || function(arg) {
9+
return Object.prototype.toString.call(arg) === '[object Array]';
10+
}
11+
12+
function cc(names) {
13+
var i
14+
var len
15+
var tmp = typeof names
16+
var out = ""
17+
18+
if (tmp === "string" || tmp === "number") return names || ""
19+
20+
if (isArray(names) && names.length > 0) {
21+
for (i = 0, len = names.length; i < len; i++) {
22+
if ((tmp = cc(names[i])) !== "") out += (out && " ") + tmp
23+
}
24+
} else {
25+
for (i in names) {
26+
if (names.hasOwnProperty(i) && names[i]) out += (out && " ") + i
27+
}
28+
}
29+
30+
return out
31+
}

index.js

+68-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
1-
var DEFAULT_CLASSNAMES_FUNCTION = 'babel-plugin-react-pug-classnames/classnames'
1+
var DEFAULT_CLASSNAMES_FUNCTION = 'babel-plugin-react-pug-classnames/classcat'
2+
var LEGACY_CLASSNAMES_FUNCTION = 'babel-plugin-react-pug-classnames/prefixedClassnames'
3+
4+
// DEPRECATED.
5+
// Legacy classnames prefixing is enabled by default for now.
6+
// In later versions it will be turned off by default and then removed completely.
7+
// If you need to provide some kind of BEM-like prefixing or another type
8+
// of classnames functionality -- specify the classnamesFunction in options
9+
// which must be a module name with the following code:
10+
// exports.c = function (name, modifiers) { ... }
11+
var DEFAULT_SUPPORT_LEGACY = true
212

313
function isTargetAttr (attribute, classAttribute) {
414
if (!classAttribute) classAttribute = 'className'
@@ -10,19 +20,42 @@ function isGoodNameForNestedComponent (name) {
1020
}
1121

1222
module.exports = (babel) => {
23+
var reqName
24+
var hasTransformedClassName
1325
var t = babel.types
1426

15-
function generateRequireExpression (elementName, expression, classnamesFunction) {
16-
var require = t.callExpression(t.identifier('require'), [
17-
t.stringLiteral(classnamesFunction || DEFAULT_CLASSNAMES_FUNCTION)
18-
])
27+
function isRequire(node) {
28+
return (
29+
node &&
30+
node.declarations &&
31+
node.declarations[0] &&
32+
node.declarations[0].init &&
33+
node.declarations[0].init.callee &&
34+
node.declarations[0].init.callee.name === "require"
35+
);
36+
}
37+
38+
function generateRequireExpression (elementName, expression, opts) {
1939
var callExpression = t.callExpression(
20-
require,
40+
reqName,
2141
[t.stringLiteral(elementName), expression]
2242
)
2343
return callExpression
2444
}
2545

46+
function generateRequire(name, opts) {
47+
var legacy = opts.legacy == null ? DEFAULT_SUPPORT_LEGACY : opts.legacy
48+
var classnamesFn = opts.classnamesFunction || (
49+
legacy ? LEGACY_CLASSNAMES_FUNCTION : DEFAULT_CLASSNAMES_FUNCTION
50+
)
51+
var require = t.callExpression(t.identifier('require'), [
52+
t.stringLiteral(classnamesFn)
53+
])
54+
var cFn = t.memberExpression(require, t.identifier('c'));
55+
var d = t.variableDeclarator(name, cFn);
56+
return t.variableDeclaration("var", [d]);
57+
}
58+
2659
function processClass (JSXOpeningElement, opts) {
2760
var name = JSXOpeningElement.node.name.name
2861
var property = null
@@ -69,7 +102,8 @@ module.exports = (babel) => {
69102
elementName = classes[0]
70103
// Process only if the styleName value is an object or array
71104
if (t.isObjectExpression(expr.right) || t.isArrayExpression(expr.right)) {
72-
expr.right = generateRequireExpression(elementName, expr.right, opts.classnamesFunction)
105+
hasTransformedClassName = true
106+
expr.right = generateRequireExpression(elementName, expr.right, opts)
73107
}
74108
}
75109
} else if (t.isArrayExpression(JSXAttribute.node.value.expression)) {
@@ -90,7 +124,8 @@ module.exports = (babel) => {
90124
if (classes[0]) {
91125
elementName = classes[0]
92126
// Process only if the styleName value is an object or array
93-
expr = generateRequireExpression(elementName, expr, opts.requireFunction)
127+
hasTransformedClassName = true
128+
expr = generateRequireExpression(elementName, expr, opts)
94129
}
95130

96131
var plus = t.binaryExpression('+', t.stringLiteral(classes.join(' ') + ' '), expr)
@@ -112,7 +147,32 @@ module.exports = (babel) => {
112147
}
113148

114149
return {
150+
post() {
151+
reqName = null;
152+
hasTransformedClassName = null;
153+
},
115154
visitor: {
155+
Program: {
156+
enter(path, state) {
157+
reqName = path.scope.generateUidIdentifier(
158+
"classnames"
159+
);
160+
},
161+
exit(path, state) {
162+
if (!hasTransformedClassName) {
163+
return;
164+
}
165+
166+
const lastImportOrRequire = path
167+
.get("body")
168+
.filter(p => p.isImportDeclaration() || isRequire(p.node))
169+
.pop();
170+
171+
if (lastImportOrRequire) {
172+
lastImportOrRequire.insertAfter(generateRequire(reqName, state.opts));
173+
}
174+
}
175+
},
116176
JSXElement (JSXElement, params) {
117177
JSXElement.traverse({
118178
JSXOpeningElement (JSXOpeningElement) {

classnames.js prefixedClassnames.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
module.exports = function c () {
1+
exports.c = function c () {
22
var name = arguments[0]
33
var modifiers = Array.prototype.slice.call(arguments, 1)
4-
modifiers = processModifiers(name, modifiers)
4+
modifiers = processModifiers(name, modifiers).concat(modifiers)
55
return clsx.apply(undefined, modifiers)
66
}
77

0 commit comments

Comments
 (0)