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:
31
packages/babel-types/scripts/generateTypeHelpers.js
Normal file
31
packages/babel-types/scripts/generateTypeHelpers.js
Normal 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");
|
||||
43
packages/babel-types/scripts/generators/generateAsserts.js
Normal file
43
packages/babel-types/scripts/generators/generateAsserts.js
Normal 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;
|
||||
};
|
||||
28
packages/babel-types/scripts/generators/generateBuilders.js
Normal file
28
packages/babel-types/scripts/generators/generateBuilders.js
Normal 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;
|
||||
};
|
||||
17
packages/babel-types/scripts/generators/generateConstants.js
Normal file
17
packages/babel-types/scripts/generators/generateConstants.js
Normal 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;
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
9
packages/babel-types/scripts/utils/formatCode.js
Normal file
9
packages/babel-types/scripts/utils/formatCode.js
Normal 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);
|
||||
};
|
||||
4
packages/babel-types/scripts/utils/lowerFirst.js
Normal file
4
packages/babel-types/scripts/utils/lowerFirst.js
Normal file
@@ -0,0 +1,4 @@
|
||||
"use strict";
|
||||
module.exports = function lowerFirst(string) {
|
||||
return string[0].toLowerCase() + string.slice(1);
|
||||
};
|
||||
Reference in New Issue
Block a user