oak-cli/config/babel-plugin/oakPath.js

49 lines
2.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
const { relative, resolve } = require('path');
const t = require('@babel/types');
const { assert } = require('console');
function isOakNamespaceIdentifier(node, name) {
if (t.isJSXNamespacedName(node) && t.isJSXIdentifier(node.namespace) && node.namespace.name === 'oak'
&& t.isJSXIdentifier(node.name) && node.name.name === name) {
return true;
}
return false;
}
const Regex =
/([\\/]*[a-zA-Z0-9_-\w\W]|[\\/]*[a-zA-Z0-9_-\w\W]:)*[\\/](lib|src|es)[\\/](pages|components|namespaces)+[\\/]/;
module.exports = (babel) => {
return {
visitor: {
Identifier(path, state) {
const { cwd, filename } = state;
const resolvePath = resolve(cwd, filename).replace(/\\/g, '/');
const { node, parent } = path;
if (node.name === 'OakComponent' && /pages[\w|\W]+index\.(ts|js)$/.test(resolvePath)) {
const regexStr = resolvePath.replace(Regex, '/');
const relativePath = regexStr.slice(0, regexStr.length - 9);
assert(t.isCallExpression(parent));
const { arguments } = parent;
assert(arguments.length === 1 && t.isObjectExpression(arguments[0]));
const { properties } = arguments[0];
const pathProperty = properties.find(
ele => t.isObjectProperty(ele) && t.isIdentifier(ele.key) && ele.key.name === 'path'
);
// console.log(filename, 'oakPath');
if (pathProperty) {
// react-native的编译器会走两次这里会被命中
// console.warn(`${resolvePath}页面的OakPage中还是定义了path可以删除掉了`);
pathProperty.value = t.stringLiteral(relativePath);
}
else {
properties.unshift(
t.objectProperty(t.identifier('path'), t.stringLiteral(relativePath))
);
}
}
},
},
};
};