
Research
/Security News
Contagious Interview Campaign Escalates With 67 Malicious npm Packages and New Malware Loader
North Korean threat actors deploy 67 malicious npm packages using the newly discovered XORIndex malware loader.
template-file
Advanced tools
๐ Replace {{ variables }} in all your files
Use variables to replace template strings in any type of file. This is both a runnable command-line application and JavaScript/TypeScript module.
โจ Some helpful features:
dataFile
argument, whatever object the JS exports is used for replacement.template-file <dataFile> <sourceGlob> <destination>
โน๏ธ TIP: Remember to place quotes around your arguments (if they contain asterisks, question marks, etc.) to keep your shell from expanding globs before template-file
gets to consume them.
Just handle one file:
template-file data.json template.txt build/
Compile all .abc
files in src/
to build/
:
template-file stuff.json 'src/**/*.abc' build/
Compile all HTML files in src/
to dist/
using the exported result of a JavaScript module:
template-file retrieveData.js 'src/**/*.html' './dist'
This uses templates similar to mustache templates, but there are some differences.
Anything between {{
and }}
can be replaced with a value. Spacing doesn't matter.
const template = '{{ location.name }} is {{adjective}}.';
const data = {
location: { name: 'Nashville' },
adjective: 'cool'
};
render(template, data); //ยป 'Nashville is cool.'
To render a list of items, you can use {{#example}}
and {{/example}}
. Empty lists and falsy values aren't rendered:
const template = `
<h3>Friend List:</h3>
<ul>
{{#friends}}
<li>{{name}}</li>
{{/friends}}
</ul>
`;
const data = {
friends: [{ name: 'Amanda' }, { name: 'Bryson' }, { name: 'Josh' }]
};
render(template, data);
// <h3>Friend List:</h3>
// <ul>
// <li>Amanda</li>
// <li>Bryson</li>
// <li>Josh</li>
// </ul>
If you have an array of primitive values instead of objects, you can use {{ this }}
to refer to the current value:
const template = `
### Foods I Like
{{#foods}}
- {{ this }}
{{/foods}}
`;
const data = {
foods: ['steak', 'eggs', 'avocado']
};
render(template, data);
// ### Foods I Like
//
// - steak
// - eggs
// - avocado
If a replacement is a function, it is called with no arguments:
const template = `Hello, {{name}}`;
const data = {
name: () => 'Charles'
};
render(template, data); //ยป Hello, Charles
In addition to the CLI, this module exports several helpers to programmatically render templates.
Example:
import { render, renderFile } from 'template-file';
const data = {
location: { name: 'Nashville' },
adjective: 'cool'
};
// Replace variables in string
render('{{ location.name }} is {{ adjective }}.', data); //ยป 'Nashville is cool.'
// Replace variables in a file (same as above, but from a file)
const string = await renderFile('/path/to/file', data);
console.log(renderedString);
render
Type:
function render(template: string, data: Data): string;
Replaces values from data
and returns the rendered string.
import { render } from 'template-file';
const data = {
location: { name: 'Nashville' },
adjective: 'cool'
};
render('{{ location.name }} is {{ adjective }}.', data); //ยป 'Nashville is cool.'
renderFile
Type:
function renderFile(filepath: string, data: Data): Promise<string>;
Reads a file replaces values from data
, and returns the rendered string.
import { renderFile } from 'template-file';
// example.html:
// <h1>Welcome back, {{ sites.github.username }}!</h1>
const data = {
name: 'Blake',
sites: {
github: {
username: 'blakek'
}
}
};
renderFile('./example.html', data); //ยป '<h1>Welcome back, blakek!</h1>'
renderGlob
Type: (note, this may change in a future major version release)
function renderGlob(
sourceGlob: string,
data: Data,
onFileCallback: (filename: string, contents: string) => void
): Promise<void>;
Finds files matching a glob pattern, reads those files, replaces values from data
, and calls a function for each file. Note, no string is returned from the function; values are handled through callbacks for each file.
import { renderGlob } from 'template-file';
// ./templates/profile.html:
// <h1>Welcome back, {{ name }}!</h1>
// ./templates/sign-in.html:
// <p>Currently signed in as <em>{{ sites.github.username }}<em>.</p>
const data = {
name: 'Blake',
sites: {
github: {
username: 'blakek'
}
}
};
const files = [];
renderGlob('./templates/*.html', data, (filename, contents) => {
files.push({ filename, contents });
});
console.log(files);
// [
// {
// contents: '<h1>Welcome back, Blake!</h1>',
// filename: './templates/profile.html'
// },
// {
// contents: '<p>Currently signed in as <em>blakek<em>.</p>',
// filename: './templates/sign-in.html'
// }
// ]
renderToFolder
Type:
function renderToFolder(
sourceGlob: string,
destination: string,
data: Data
): Promise<void>;
import { renderToFolder } from 'template-file';
const data = {
name: 'Blake',
sites: {
github: {
username: 'blakek'
}
}
};
renderToFolder('./templates/*.html', './dist/', data);
Finds files matching a glob pattern, reads those files, replaces values from data
, and writes a file with the same name to destination
.
Version 5 renamed some functions to be simpler:
renderString
was renamed render
renderTemplateFile
was renamed renderFile
renderGlob
and renderToFolder
were in v4 but were undocumented. The API for renderGlob
may change in the future, depending on usage.Versions < 4 could not lookup properties with a dot in the name. This should be possible since version 4. For example, this was not possible before v4.0.0:
import { render } from 'template-file';
const data = { 'with.dot': 'yep' };
render('Does this work? {{with.dot}}', data);
With either Yarn or npm installed, run one of the following:
Task | with Yarn | with npm |
---|---|---|
Add this to a project | yarn add template-file | npm install --save template-file |
Install this as a development dependency | yarn add --dev template-file | npm install --save-dev template-file |
Install this globally | yarn global add template-file | npm install --global template-file |
MIT
FAQs
๐ Replace {{ variables }} in all your files
The npm package template-file receives a total of 12,695 weekly downloads. As such, template-file popularity was classified as popular.
We found that template-file demonstrated a not healthy version release cadence and project activity because the last version was released a year ago.ย It has 7 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
North Korean threat actors deploy 67 malicious npm packages using the newly discovered XORIndex malware loader.
Security News
Meet Socket at Black Hat & DEF CON 2025 for 1:1s, insider security talks at Allegiant Stadium, and a private dinner with top minds in software supply chain security.
Security News
CAI is a new open source AI framework that automates penetration testing tasks like scanning and exploitation up to 3,600ร faster than humans.