Run code-generating scripts with one command and as files change
If customization is desired, you may add a codegentool
field to your package.json
. By default,
any JS/TS modules in the ./generators
directory will be run.
{
"codegentool": {
"generators": ["./generators/*.ts"]
}
}
Generators can be uncompiled TypeScript, no problem. Every generator needs to export a default function which will be called with Codegentool's runtime API.
import { defineGenerator } from 'codegentool'
export default defineGenerator(({ scan }) => {
const files = await scan('src/**/*.ts')
// ...
})
pnpm install -D codegentool@npm:@alloc/codegentool
Run your project's configured generators:
pnpm codegentool
Rerun them as files change:
pnpm codegentool -w
The runtime API is passed to each generator function. As of now, it's only for filesystem operations, so that Codegentool can watch for changes.
Alias to fast-glob
package with
file-watching support.
Note: In watch mode, changes to files matching the glob will trigger a rerun even though they shouldn't.
Alias to fs.readFileSync
with file-watching support.
Alias to fs.writeFileSync
but it won't write if nothing changed.
Create or update a .env
file with the given data. Pass null
to unset a key.
Alias to dedent
package.
Alias to serialize-javascript
package.
Given a module path, parse the module and return the AST. Both JSX and TypeScript are supported with no extra configuration.
We use meriyah
for parsing.
Given a string of code, parse it and return the AST. Both JSX and TypeScript are supported with no extra configuration.
Similar to import()
but returns null instead of rejecting when a module is not found. Also has an optional basedir
argument for resolution. Finally, the default basedir
is the directory of the bundled generator (which defaults to somewhere in node_modules/.cache/codegentool
). Relative imports are resolved as if the import was executed from the generator's source path.