testbook
Version:
72 lines • 2.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTsPropTypes = exports.inferPropTypes = void 0;
const ts_morph_1 = require("ts-morph");
const valueMap = {
"an array": "array",
"a ReactNode": "React.ReactNode",
"a single ReactElement": "React.ReactElement",
"a single ReactElement type": "React.ComponentType",
};
const parsePropTypeMessage = (message, defaultType) => {
let result;
if (!message) {
return defaultType;
}
const primitivePattern = /expected `?([a-zA-Z ]+)/g;
if (message.message.match(primitivePattern)) {
const r = primitivePattern.exec(message.message);
result = r ? r[1] : null;
}
const oneOfPattern = /expected one of (\[.*])/g;
if (message.message.match(oneOfPattern)) {
const r = oneOfPattern.exec(message.message);
result = r ? `oneOf:${r[1]}` : null;
}
const instanceOfPattern = /expected instance of `(.*)`/g;
if (message.message.match(instanceOfPattern)) {
const r = instanceOfPattern.exec(message.message);
result = r ? `instanceOf:${r[1]}` : null;
}
return valueMap[result] || result;
};
const inferPropTypes = (propTypes) => Object.keys(propTypes).reduce((prev, curr) => (Object.assign(Object.assign({}, prev), { [curr]: [
parsePropTypeMessage(propTypes[curr]({ [curr]: {} }, curr, null, null, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"), "object"),
propTypes[curr]({ [curr]: undefined }, curr, null, null, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED") !== null,
] })), {});
exports.inferPropTypes = inferPropTypes;
const getNodeParameters = (node) => {
if (ts_morph_1.Node.isVariableDeclaration(node) &&
ts_morph_1.Node.isArrowFunction(node.getInitializer())) {
return node.getInitializer().getParameters();
}
if (ts_morph_1.Node.isFunctionDeclaration(node)) {
return node.getParameters();
}
if (ts_morph_1.Node.isClassDeclaration(node)) {
return node.getHeritageClauses()[0].getTypeNodes()[0].getTypeArguments();
}
return [];
};
const getTsPropTypes = (modulePath, exportName, tsConfigFilePath) => {
const [node] = new ts_morph_1.Project({
tsConfigFilePath,
})
.getSourceFileOrThrow(modulePath)
.getExportedDeclarations()
.get(exportName);
const nodeParameters = getNodeParameters(node);
if (!nodeParameters.length) {
return Promise.resolve({});
}
const [firstParam] = nodeParameters;
return Promise.resolve(firstParam
.getType()
.getProperties()
.reduce((prev, curr) => (Object.assign(Object.assign({}, prev), { [curr.getName()]: [
curr.getValueDeclaration().getType().getText(),
!curr.getValueDeclaration().getType().isNullable(),
] })), {}));
};
exports.getTsPropTypes = getTsPropTypes;
//# sourceMappingURL=propTypes.js.map