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 inplateinplate [options] [file-pattern]--ignoreIgnore patterns used when globbing target files.--configConfig files torequire().--updateUpdate files.--assertAssert that files are up-to-date, otherwise exit with non-zero code.--silentSilence 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--configis not specified.
inplate '**/Dockerfile' --updateDockerfile.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
# @endDockerfile (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
# @endTake # 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
.hbstemplate file. E.g., if the target file isawesome.json, you can create aawesome.json.hbsfile with template content.
[table]
# @inplate {{toml key.to.data}}
hello = "inplate"
# @end# @inplate {{yaml key.to.data}}
hello:
- inplate
# @endConfig 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.