Inplate is a command-line tool processing files with in-place template, currently it's using handlebars
for template rendering.
Prettier is applied if it's installed and there is configuration file in some upper directory.
npm install --save-dev inplate
inplate [options] [file-pattern]
--ignore
Ignore patterns used when globbing target files.--config
Config files torequire()
.--update
Update files.--assert
Assert that files are up-to-date, otherwise exit with non-zero code.--silent
Silence listed files and diffs.--template <template-path>
Path to file template.--data <module-path>
Module to load default template data.--comment-styles <styles>
One or more of#
,//
,/*
,{/*
,<!--
, comma-separated.
[file-pattern]
Glob pattern for target files, required if--config
is not specified.
inplate '**/Dockerfile' --update
Dockerfile.js
(template data module for Dockerfile
)
import Glob from 'glob';
export default {
data: {
packageFilePaths: pad(
Glob.sync('**/package.json', {
ignore: '**/node_modules/**',
}),
),
},
};
function pad(values) {
let maxLength = Math.max(...values.map(value => value.length));
return values.map(value => {
return {
value,
padding: value.padEnd(maxLength).slice(value.length),
};
});
}
Dockerfile
(before)
FROM node
# @inplate
# {{#each packageFilePaths}}
# COPY {{value}}{{padding}} /app/{{value}}
# {{/each}}
# @plate
# @end
Dockerfile
(after)
FROM node
# @inplate
# {{#each packageFilePaths}}
# COPY {{value}}{{padding}} /app/{{value}}
# {{/each}}
# @plate
COPY package.json /app/package.json
COPY packages/foo/package.json /app/packages/foo/package.json
COPY packages/bar/package.json /app/packages/bar/package.json
# @end
Take #
as an example, please pay attention to the @plate
comment for multiline template:
# @inplate {{template}}
[generated content]
# @end
# @inplate
# {{multiline}}
# {{template}}
# @plate
[generated content]
# @end
# @inplate-line {{template}}
[generated content]
Take /*
as an example:
/* @inplate {{template}} */
[generated content]
/* @end */
/*
@inplate
{{multiline}}
{{template}}
*/
[generated content]
/* @end */
/* @inplate-line {{template}} */
[generated content]
{
// @inplate "hello": {{json some}}
"hello": "inplate"
// @end
}
For standard JSON without comment support, you can instead utilize a
.hbs
template file. E.g., if the target file isawesome.json
, you can create aawesome.json.hbs
file with template content.
[table]
# @inplate {{toml key.to.data}}
hello = "inplate"
# @end
# @inplate {{yaml key.to.data}}
hello:
- inplate
# @end
Config file specified with option --config
.
If both --config
and [file-pattern]
are not specified, it will load default config file (inplate.config.js
/inplate.config.json
) if exists.
// Ignore patterns that passed to glob `ignore` option, optional.
export const ignore = '**/node_modules/**';
export default {
'<file-pattern>': {
// File-pattern level `ignore` option, optional.
ignore: undefined,
// Use file template, optional.
// If true, it will load template from file `${fileName}.tpl` or `${fileName}.hbs`.
// You can also specify a string as the template content directly.
// By specifying this option, it will skip comment parsing and update the whole file directly.
template: true,
// Template data, optional.
data: {},
// Comment styles, optional.
commentStyles: [
// Built-in comment style key.
'#',
// Or a custom one.
{
// Opening, required.
opening: '/*',
// Closing, optional. Behave as a block comment if specified.
closing: '*/',
// Decode template string, e.g.: `<` -> `<`.
decoder: raw => template;
// Encode content string.
encoder: raw => content;
}
]
},
// Or default options.
'<file-pattern>': true,
};
Template config module named after the target file (.js
/.json
). E.g., if the target file is Dockerfile
, this template config module can be named either Dockerfile.js
or Dockerfile.json
.
export default {
// Optional, see config file.
template: true,
// Optional, see config file.
data: {},
// Optional, see config file.
commentStyles: [],
};
You can register custom handlebars helpers in inplate config file or template config modules:
import {Handlebars} from 'inplate';
Handlebars.registerHelper('my-helper', items =>
items.map(item => `- ${item}\n`).join(''),
);
Please refer to Handlebars for more details.
MIT License.