diff --git a/app/app.json b/app/app.json index 600dbd53ec..8d0077d05e 100644 --- a/app/app.json +++ b/app/app.json @@ -13,6 +13,7 @@ "electron-context-menu": "^0.4.0", "electron-squirrel-startup": "^1.0.0", "httpsnippet": "git@github.com:gschier/httpsnippet.git#39d2fb0449f33711e5cc71a4d42b0e5b808426b4", + "json-lint": "^0.1.0", "jsonpath-plus": "^0.15.0", "nedb": "^1.8.0", "node-localstorage": "^1.3.0", diff --git a/app/lib/__tests__/render.test.js b/app/lib/__tests__/render.test.js index 144744ccc5..f30a413011 100644 --- a/app/lib/__tests__/render.test.js +++ b/app/lib/__tests__/render.test.js @@ -9,6 +9,16 @@ describe('render()', () => { expect(rendered).toBe('Hello World!'); }); + it('renders custom tag: uuid', () => { + const rendered = render.render('Hello {% uuid %}!'); + expect(rendered).toBe('Hello b5c2f089-2c0c-46b6-a6f1-8d5b86cbc603!'); + }); + + it('renders custom tag: timestamp', () => { + const rendered = render.render('Hello {% timestamp %}!'); + expect(rendered).toMatch(/Hello \d{13}!/); + }); + it('fails on invalid template', () => { const fn = () => render.render('Hello {{ msg }!', {msg: 'World'}); expect(fn).toThrowError('expected variable end'); diff --git a/app/lib/export/curl.js b/app/lib/export/curl.js index 0e85b32252..608cc61aab 100644 --- a/app/lib/export/curl.js +++ b/app/lib/export/curl.js @@ -1,11 +1,5 @@ 'use strict'; -import render from '../render'; -import * as querystring from '../querystring'; -import * as db from '../../database'; -import {DEBOUNCE_MILLIS, METHOD_GET} from '../constants'; -import {getRenderedRequest} from '../render'; - const FLAGS = [ 'cacert', 'capath', 'E', 'cert', 'cert-type', 'ciphers', 'K', 'config', 'connect-timeout', 'C', 'continue-at', 'b', diff --git a/app/lib/render.js b/app/lib/render.js index dbb69fe5d3..d5597af430 100644 --- a/app/lib/render.js +++ b/app/lib/render.js @@ -1,16 +1,59 @@ import nunjucks from 'nunjucks'; import traverse from 'traverse'; +import uuid from 'node-uuid'; import * as db from '../database'; import {TYPE_WORKSPACE} from '../database/index'; import {getBasicAuthHeader, hasAuthHeader, setDefaultProtocol} from './util'; -nunjucks.configure({ +const nunjucksEnvironment = nunjucks.configure({ autoescape: false }); +class NoArgsExtension { + parse (parser, nodes, lexer) { + const args = parser.parseSignature(null, true); + parser.skip(lexer.TOKEN_BLOCK_END); + return new nodes.CallExtension(this, 'run', args); + } +} + +class ArgsExtension { + parse (parser, nodes, lexer) { + const tok = parser.nextToken(); + const args = parser.parseSignature(null, true); + parser.advanceAfterBlockEnd(tok.value); + return new nodes.CallExtension(this, 'run', args); + } +} + +class TimestampExtension extends NoArgsExtension { + constructor () { + super(); + this.tags = ['timestamp']; + } + + run (context) { + return Date.now(); + } +} + +class UuidExtension extends NoArgsExtension { + constructor () { + super(); + this.tags = ['uuid']; + } + + run (context) { + return uuid.v4(); + } +} + +nunjucksEnvironment.addExtension('uuid', new UuidExtension()); +nunjucksEnvironment.addExtension('timestamp', new TimestampExtension()); + export function render (template, context = {}) { try { - return nunjucks.renderString(template, context); + return nunjucksEnvironment.renderString(template, context); } catch (e) { throw new Error(e.message.replace(/\(unknown path\)\s*/, '')); } diff --git a/package.json b/package.json index bdedf2849b..d4f697b870 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,6 @@ "httpsnippet": "git@github.com:gschier/httpsnippet.git#39d2fb0449f33711e5cc71a4d42b0e5b808426b4", "json-lint": "^0.1.0", "jsonpath-plus": "^0.15.0", - "jsonschema": "^1.1.0", "mousetrap": "^1.6.0", "nedb": "^1.8.0", "node-localstorage": "^1.3.0", @@ -82,7 +81,8 @@ "tough-cookie": "^2.3.1", "traverse": "^0.6.6", "xml2js": "^0.4.17", - "xml2js-xpath": "^0.7.0" + "xml2js-xpath": "^0.7.0", + "node-uuid": "latest" }, "devDependencies": { "babel-cli": "^6.11.4",