babel/scripts/generate-babel-types-docs.js

160 lines
4.4 KiB
JavaScript

"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("<!-- begin generated section -->")[0].trim(),
"",
"<!-- begin generated section -->",
"",
];
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(
"",
"<!-- end generated section -->",
"",
readmeSrc.split("<!-- end generated section -->")[1].trim()
);
fs.writeFileSync(readmePath, readme.join("\n"));
// console.log(readme.join('\n'));