UNPKG

testbook

Version:
72 lines 2.94 kB
"use strict"; 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