code-red
npm install code-redExperimental toolkit for writing x-to-JavaScript compilers. It is used in Svelte.
The code-red package exposes three core functions — b, x and print.
b and x take a template literal and return an ESTree program body, or a single node:
``js
import { b, x } from 'code-red';
const expression = xi + j;
assert.equal(expression.type, 'AssignmentExpression');
assert.equal(expression.operator, '+');
assert.equal(expression.left.name, 'i');
assert.equal(expression.right.name, 'j');
const body = b
const i = 1;
const j = 2;
const k = i + j;;
assert.equal(body.length, 3);
assert.equal(body[0].type, 'VariableDeclaration');
`
Expressions in template literals correspond to replacement nodes — so you could express the above like so:
`jsi
const i = x;j
const j = x;${i} + ${j}
const expression = x;
const body = b
const ${i} = 1;
const ${j} = 2;
const k = ${expression};;`
The print function takes a node and turns it into a {code, map} object:
`js
const add = x
function add(${i}, ${j}) {
return ${expression};
};
print(add).code;
/*
function add(i, j) {
return i + j;
}
*/
i.name = 'foo';
j.name = 'bar';
print(add).code;
/*
function add(foo, bar) {
return foo + bar;
}
*/
`
So that you can use globals in your code. In Svelte, we use this to insert utility functions.
`js@foo(bar)
// input
import { x } from 'code-red';
x
// output
FOO(bar)
`
So that you can insert variables in your code without worrying if they clash with existing variable names.
bar used in user code and in inserted code gets a $1 suffix:
`js
// input
import { x } from 'code-red';
x
function foo(#bar) {
return #bar * bar;
};
// output
function foo(bar$1) {
return bar$1 * bar;
}
`
Without conflicts, no $1 suffix:
`jsconst foo = #bar => #bar * 2
// input
import { b } from 'code-red';
b;
// output
const foo = bar => bar * 2;
`
TODO add an optimiser that e.g. collapses consecutive identical if blocks
TODO add a code-red/compiler` module that replaces template literals with the nodes they evaluate to, so that there's nothing to parse at runtime.
TODO support source mappings for inserted nodes with location information.