40 lines
1.1 KiB
JavaScript
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;
|
||
|
};
|