babel-plugin-client-only-require
Version:
Babel plugin to transpile require of certant extensions into client only conditionial require
159 lines (143 loc) • 7.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
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"); } }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.default = transformAssets;
var _path = require('path');
function transformAssets(_ref) {
var t = _ref.types;
return {
visitor: {
CallExpression: function CallExpression(path, _ref2) {
var file = _ref2.file,
opts = _ref2.opts;
var currentConfig = _extends({}, opts);
currentConfig.extensions = currentConfig.extensions || [];
var _path$node = path.node,
calleeName = _path$node.callee.name,
args = _path$node.arguments;
if (calleeName !== 'require' || !args.length || !t.isStringLiteral(args[0])) {
return;
}
if (currentConfig.extensions.find(function (ext) {
return args[0].value.endsWith(ext);
})) {
var _args = _slicedToArray(args, 1),
_args$ = _args[0],
filePath = _args$.value,
clientOnlyRequire = _args$.clientOnlyRequire;
if (clientOnlyRequire) {
return;
}
path.replaceWith(t.IfStatement({
"type": "UnaryExpression",
"operator": "!",
"prefix": true,
"argument": {
"type": "UnaryExpression",
"operator": "!",
"prefix": true,
"argument": {
"type": "LogicalExpression",
"left": {
"type": "LogicalExpression",
"left": {
"type": "BinaryExpression",
"left": {
"type": "UnaryExpression",
"operator": "typeof",
"prefix": true,
"argument": {
"type": "Identifier",
"name": "window"
},
"extra": {
"parenthesizedArgument": false
}
},
"operator": "!==",
"right": {
"type": "StringLiteral",
"extra": {
"rawValue": "undefined",
"raw": "'undefined'"
},
"value": "undefined"
}
},
"operator": "&&",
"right": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"start": 40,
"name": "window"
},
"property": {
"type": "Identifier",
"start": 47,
"end": 55,
"name": "document"
},
"computed": false
}
},
"operator": "&&",
"right": {
"type": "MemberExpression",
"object": {
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "window"
},
"property": {
"type": "Identifier",
"name": "document"
},
"computed": false
},
"property": {
"type": "Identifier",
"name": "createElement"
},
"computed": false
},
"extra": {
"parenthesized": true,
"parenStart": 6
}
},
"extra": {
"parenthesizedArgument": false
}
},
"extra": {
"parenthesizedArgument": false
}
}, {
"type": "BlockStatement",
"body": [{
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "require"
},
"arguments": [{
"type": "StringLiteral",
"value": filePath,
clientOnlyRequire: true
}]
}
}],
"directives": []
}));
}
}
}
};
}