diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..98a761d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[{package.json,*.yml}] +indent_style = space +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..391f0a4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto +*.js text eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..97519af --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - '6' + - '4' diff --git a/index.js b/index.js new file mode 100644 index 0000000..501fca5 --- /dev/null +++ b/index.js @@ -0,0 +1,22 @@ +'use strict'; +module.exports = (tpl, data) => { + if (typeof tpl !== 'string') { + throw new TypeError(`Expected a string in the first argument, got ${typeof tpl}`); + } + + if (typeof data !== 'object') { + throw new TypeError(`Expected an Object/Array in the second argument, got ${typeof data}`); + } + + const re = /{(.*?)}/g; + + return tpl.replace(re, (_, key) => { + let ret = data; + + for (const prop of key.split('.')) { + ret = ret ? ret[prop] : ''; + } + + return ret || ''; + }); +}; diff --git a/license b/license new file mode 100644 index 0000000..654d0bf --- /dev/null +++ b/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/package.json b/package.json new file mode 100644 index 0000000..762f0ff --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "pupa", + "version": "0.0.0", + "description": "Simple micro templating", + "license": "MIT", + "repository": "sindresorhus/pupa", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=4" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "string", + "formatting", + "template", + "object", + "format", + "interpolate", + "interpolation", + "templating", + "str", + "obj", + "tpl", + "expand", + "simple", + "replace", + "placeholders", + "values", + "fmt", + "transform", + "micro" + ], + "devDependencies": { + "ava": "*", + "xo": "*" + }, + "xo": { + "esnext": true + } +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..1255e8d --- /dev/null +++ b/readme.md @@ -0,0 +1,59 @@ +# pupa [![Build Status](https://travis-ci.org/sindresorhus/pupa.svg?branch=master)](https://travis-ci.org/sindresorhus/pupa) + +> Simple micro templating + +Useful when all you need is to fill in some placeholders. + + +## Install + +``` +$ npm install --save pupa +``` + + +## Usage + +```js +const pupa = require('pupa'); + +pupa('The mobile number of {name} is {phone.mobile}', { + name: 'Sindre', + phone: { + mobile: '609 24 363' + } +}); +//=> 'The mobile number of Sindre is 609 24 363' + +pupa('I like {0} and {1}', ['🦄', '🐮']); +//=> 'I like 🦄 and 🐮' +``` + + +## API + +### pupa(template, data) + +#### template + +Type: `string` + +Text with placeholders for `data` properties. + +#### data + +Type: `Object` `Array` + +Data to interpolate into `template`. + + +## FAQ + +### What about template literals? + +Template literals expand on creation. This module expands the template on execution, which can be useful if either or both template and data are lazily created or user-supplied. + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/test.js b/test.js new file mode 100644 index 0000000..e393889 --- /dev/null +++ b/test.js @@ -0,0 +1,22 @@ +import test from 'ava'; +import m from './'; + +test(t => { + t.is(m('{foo}', {foo: '!'}), '!'); + t.is(m('{foo}', {foo: 10}), '10'); + t.is(m('{foo}{foo}', {foo: '!'}), '!!'); + t.is(m('{foo}{bar}{foo}', {foo: '!', bar: '#'}), '!#!'); + t.is(m('yo {foo} lol {bar} sup', {foo: '🦄', bar: '🌈'}), 'yo 🦄 lol 🌈 sup'); + + t.is(m('{foo}{deeply.nested.value}', { + foo: '!', + deeply: { + nested: { + value: '#' + } + } + }), '!#'); + + t.is(m('{0}{1}', ['!', '#']), '!#'); +}); +