Refactor @babel/types to be 100% ES-module (#6741)

This generates the dynamic functions at buildtime and also
splits the package into smaller files to avoid dependency circles.
This commit is contained in:
Daniel Tschinder
2017-12-02 12:20:10 +01:00
committed by GitHub
parent 95fe785354
commit 8270903ba2
84 changed files with 4689 additions and 1579 deletions

View File

@@ -0,0 +1,31 @@
"use strict";
const fs = require("fs");
const path = require("path");
const generateBuilders = require("./generators/generateBuilders");
const generateValidators = require("./generators/generateValidators");
const generateAsserts = require("./generators/generateAsserts");
const generateConstants = require("./generators/generateConstants");
const format = require("./utils/formatCode");
const baseDir = path.join(__dirname, "../src");
function writeFile(content, location) {
const file = path.join(baseDir, location);
try {
fs.mkdirSync(path.dirname(file));
} catch (error) {
if (error.code !== "EEXIST") {
throw error;
}
}
fs.writeFileSync(file, format(content, file));
}
console.log("Generating @babel/types dynamic functions");
writeFile(generateBuilders(), "builders/generated/index.js");
writeFile(generateValidators(), "validators/generated/index.js");
writeFile(generateAsserts(), "asserts/generated/index.js");
writeFile(generateConstants(), "constants/generated/index.js");

View File

@@ -0,0 +1,43 @@
"use strict";
const definitions = require("../../lib/definitions");
function addAssertHelper(type) {
return `export function assert${type}(node: Object, opts?: Object = {}): void {
assert("${type}", node, opts) }
`;
}
module.exports = function generateAsserts() {
let output = `// @flow
/*
* This file is auto-generated! Do not modify it directly.
* To re-generate run 'make build'
*/
import is from "../../validators/is";
function assert(type: string, node: Object, opts?: Object): void {
if (!is(type, node, opts)) {
throw new Error(
\`Expected type "\${type}" with option \${JSON.stringify(opts)}\`,
);
}
}\n\n`;
Object.keys(definitions.VISITOR_KEYS).forEach(type => {
output += addAssertHelper(type);
});
Object.keys(definitions.FLIPPED_ALIAS_KEYS).forEach(type => {
output += addAssertHelper(type);
});
Object.keys(definitions.DEPRECATED_KEYS).forEach(type => {
const newType = definitions.DEPRECATED_KEYS[type];
output += `export function assert${type}(node: Object, opts: Object): void {
console.trace("The node type ${type} has been renamed to ${newType}");
assert("${type}", node, opts);
}\n`;
});
return output;
};

View File

@@ -0,0 +1,28 @@
"use strict";
const definitions = require("../../lib/definitions");
const lowerFirst = require("../utils/lowerFirst");
module.exports = function generateBuilders() {
let output = `// @flow
/*
* This file is auto-generated! Do not modify it directly.
* To re-generate run 'make build'
*/
import builder from "../builder";\n\n`;
Object.keys(definitions.BUILDER_KEYS).forEach(type => {
output += `export function ${type}(...args: Array<any>): Object { return builder("${type}", ...args); }
export { ${type} as ${lowerFirst(type)} };\n`;
});
Object.keys(definitions.DEPRECATED_KEYS).forEach(type => {
const newType = definitions.DEPRECATED_KEYS[type];
output += `export function ${type}(...args: Array<any>): Object {
console.trace("The node type ${type} has been renamed to ${newType}");
return ${type}("${type}", ...args);
}
export { ${type} as ${lowerFirst(type)} };\n`;
});
return output;
};

View File

@@ -0,0 +1,17 @@
"use strict";
const definitions = require("../../lib/definitions");
module.exports = function generateConstants() {
let output = `// @flow
/*
* This file is auto-generated! Do not modify it directly.
* To re-generate run 'make build'
*/
import { FLIPPED_ALIAS_KEYS } from "../../definitions";\n\n`;
Object.keys(definitions.FLIPPED_ALIAS_KEYS).forEach(type => {
output += `export const ${type.toUpperCase()}_TYPES = FLIPPED_ALIAS_KEYS["${type}"];\n`;
});
return output;
};

View File

@@ -0,0 +1,35 @@
"use strict";
const definitions = require("../../lib/definitions");
function addIsHelper(type) {
return `export function is${type}(node: Object, opts?: Object): boolean {
return is("${type}", node, opts) }
`;
}
module.exports = function generateValidators() {
let output = `// @flow
/*
* This file is auto-generated! Do not modify it directly.
* To re-generate run 'make build'
*/
import is from "../is";\n\n`;
Object.keys(definitions.VISITOR_KEYS).forEach(type => {
output += addIsHelper(type);
});
Object.keys(definitions.FLIPPED_ALIAS_KEYS).forEach(type => {
output += addIsHelper(type);
});
Object.keys(definitions.DEPRECATED_KEYS).forEach(type => {
const newType = definitions.DEPRECATED_KEYS[type];
output += `export function is${type}(node: Object, opts: Object): boolean {
console.trace("The node type ${type} has been renamed to ${newType}");
return is("${type}", node, opts);
}\n`;
});
return output;
};

View File

@@ -0,0 +1,9 @@
"use strict";
const prettier = require("prettier");
module.exports = function formatCode(code, filename) {
filename = filename || __filename;
const prettierConfig = prettier.resolveConfig.sync(filename);
return prettier.format(code, prettierConfig);
};

View File

@@ -0,0 +1,4 @@
"use strict";
module.exports = function lowerFirst(string) {
return string[0].toLowerCase() + string.slice(1);
};