Skip to content

vilicvane/inplate

Repository files navigation

NPM version Repository package.json version MIT License Discord

Inplate

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.

Installation

npm install --save-dev inplate

Usage

inplate [options] [file-pattern]

Options

  • --ignore Ignore patterns used when globbing target files.
  • --config Config files to require().
  • --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.

Arguments

  • [file-pattern] Glob pattern for target files, required if --config is not specified.

Example

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

Syntax

Single-line comment

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]

Block comment

Take /* as an example:

/* @inplate {{template}} */
[generated content]
/* @end */

/*
  @inplate
  {{multiline}}
  {{template}}
*/
[generated content]
/* @end */

/* @inplate-line {{template}} */
[generated content]

Handlebars helpers

json

{{json key.to.data}}
{
  // @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 is awesome.json, you can create a awesome.json.hbs file with template content.

toml

{{toml key.to.data}}
[table]
# @inplate {{toml key.to.data}}
hello = "inplate"
# @end

yaml

{{yaml key.to.data}}
# @inplate {{yaml key.to.data}}
hello:
  - inplate
# @end

Config files

Inplate config file

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.: `&lt;` -> `<`.
        decoder: raw => template;
        // Encode content string.
        encoder: raw => content;
      }
    ]
  },
  // Or default options.
  '<file-pattern>': true,
};

Template config module

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: [],
};

Custom handlebars helpers

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.

License

MIT License.

About

A command-line tool processing files with in-place template.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published