wallet-core/thirdparty/preact/config/codemod-const.js

40 lines
1.1 KiB
JavaScript

/* eslint no-console:0 */
/** Find constants (identified by ALL_CAPS_DECLARATIONS), and inline them globally.
* This is safe because Preact *only* uses global constants.
*/
export default (file, api) => {
let j = api.jscodeshift,
code = j(file.source),
constants = {},
found = 0;
code.find(j.VariableDeclaration)
.filter( decl => {
for (let i=decl.value.declarations.length; i--; ) {
let node = decl.value.declarations[i],
name = node.id && node.id.name,
init = node.init;
if (name && init && name.match(/^[A-Z0-9_$]+$/g)) {
if (init.type==='Literal') {
console.log(`Inlining constant: ${name}=${init.raw}`);
found++;
constants[name] = init;
// remove declaration
decl.value.declarations.splice(i, 1);
// if it's the last, we'll remove the whole statement
return !decl.value.declarations.length;
}
}
}
return false;
})
.remove();
code.find(j.Identifier)
.filter( path => path.value.name && constants.hasOwnProperty(path.value.name) )
.replaceWith( path => (found++, constants[path.value.name]) );
return found ? code.toSource({ quote: 'single' }) : null;
};