"use strict"; const util = require("util"); const path = require("path"); const fs = require("fs"); const types = require("../packages/babel-types"); const readmePath = path.join( __dirname, "..", "packages", "babel-types", "README.md" ); const readmeSrc = fs.readFileSync(readmePath, "utf8"); const readme = [ readmeSrc.split("")[0].trim(), "", "", "", ]; const customTypes = { ClassMethod: { key: "if computed then `Expression` else `Identifier | Literal`", }, Identifier: { name: "`string`", }, MemberExpression: { property: "if computed then `Expression` else `Identifier`", }, ObjectMethod: { key: "if computed then `Expression` else `Identifier | Literal`", }, ObjectProperty: { key: "if computed then `Expression` else `Identifier | Literal`", }, }; function getType(validator) { if (validator.type) { return validator.type; } else if (validator.oneOfNodeTypes) { return validator.oneOfNodeTypes.join(" | "); } else if (validator.oneOfNodeOrValueTypes) { return validator.oneOfNodeOrValueTypes.join(" | "); } else if (validator.oneOf) { return validator.oneOf.map(val => util.inspect(val)).join(" | "); } else if (validator.chainOf) { if ( validator.chainOf.length === 2 && validator.chainOf[0].type === "array" && validator.chainOf[1].each ) { return "Array<" + getType(validator.chainOf[1].each) + ">"; } if ( validator.chainOf.length === 2 && validator.chainOf[0].type === "string" && validator.chainOf[1].oneOf ) { return validator.chainOf[1].oneOf .map(function(val) { return JSON.stringify(val); }) .join(" | "); } } const err = new Error("Unrecognised validator type"); err.code = "UNEXPECTED_VALIDATOR_TYPE"; err.validator = validator; throw err; } Object.keys(types.BUILDER_KEYS).sort().forEach(function(key) { readme.push("### " + key[0].toLowerCase() + key.substr(1)); readme.push("```javascript"); readme.push( "t." + key[0].toLowerCase() + key.substr(1) + "(" + types.BUILDER_KEYS[key].join(", ") + ")" ); readme.push("```"); readme.push(""); readme.push( "See also `t.is" + key + "(node, opts)` and `t.assert" + key + "(node, opts)`." ); readme.push(""); if (types.ALIAS_KEYS[key] && types.ALIAS_KEYS[key].length) { readme.push( "Aliases: " + types.ALIAS_KEYS[key] .map(function(key) { return "`" + key + "`"; }) .join(", ") ); readme.push(""); } Object.keys(types.NODE_FIELDS[key]) .sort(function(fieldA, fieldB) { const indexA = types.BUILDER_KEYS[key].indexOf(fieldA); const indexB = types.BUILDER_KEYS[key].indexOf(fieldB); if (indexA === indexB) return fieldA < fieldB ? -1 : 1; if (indexA === -1) return 1; if (indexB === -1) return -1; return indexA - indexB; }) .forEach(function(field) { const defaultValue = types.NODE_FIELDS[key][field].default; const fieldDescription = ["`" + field + "`"]; const validator = types.NODE_FIELDS[key][field].validate; if (customTypes[key] && customTypes[key][field]) { fieldDescription.push(customTypes[key][field]); } else if (validator) { try { fieldDescription.push(": `" + getType(validator) + "`"); } catch (ex) { if (ex.code === "UNEXPECTED_VALIDATOR_TYPE") { console.log("Unrecognised validator type for " + key + "." + field); console.dir(ex.validator, { depth: 10, colors: true }); } } } if (defaultValue !== null || types.NODE_FIELDS[key][field].optional) { fieldDescription.push( " (default: `" + util.inspect(defaultValue) + "`)" ); } else { fieldDescription.push(" (required)"); } readme.push(" - " + fieldDescription.join("")); }); readme.push(""); readme.push("---"); readme.push(""); }); readme.push( "", "", "", readmeSrc.split("")[1].trim() ); fs.writeFileSync(readmePath, readme.join("\n")); // console.log(readme.join('\n'));