Skip to content

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

License

Notifications You must be signed in to change notification settings

vilicvane/inplate

Repository files navigation

NPM Package CI

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

yarn add --dev inplate
# or
npm install --save-dev inplate

Usage

inplate [options] [file-pattern]

Options

  • --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)

const Glob = require('glob');

module.exports = {
  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]

Config files

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.

module.exports = {
  '<file-pattern>': {
    // 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 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.

module.exports = {
  // Optional, see config file.
  template: true,
  // Optional, see config file.
  data: {},
  // Optional, see config file.
  commentStyles: [],
};

License

MIT License.

About

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

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published