update deps
This commit is contained in:
12
node_modules/ejs/README.md
generated
vendored
12
node_modules/ejs/README.md
generated
vendored
@@ -4,7 +4,7 @@ Embedded JavaScript templates
|
||||
|
||||
[](https://travis-ci.org/mde/ejs)
|
||||
[](https://david-dm.org/mde/ejs?type=dev)
|
||||
[](https://snyk.io/test/npm/ejs)
|
||||
[](https://snyk.io/test/npm/ejs)
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -28,7 +28,7 @@ $ npm install ejs
|
||||
|
||||
## Example
|
||||
|
||||
```html
|
||||
```ejs
|
||||
<% if (user) { %>
|
||||
<h2><%= user.name %></h2>
|
||||
<% } %>
|
||||
@@ -73,6 +73,8 @@ Therefore, we do not recommend using this shortcut.
|
||||
- `strict` When set to `true`, generated function is in strict mode
|
||||
- `_with` Whether or not to use `with() {}` constructs. If `false`
|
||||
then the locals will be stored in the `locals` object. Set to `false` in strict mode.
|
||||
- `destructuredLocals` An array of local variables that are always destructured from
|
||||
the locals object, available even in strict mode.
|
||||
- `localsName` Name to use for the object storing local variables when not using
|
||||
`with` Defaults to `locals`
|
||||
- `rmWhitespace` Remove all safe-to-remove whitespace, including leading
|
||||
@@ -120,7 +122,7 @@ call unless you are using `renderFile()`.
|
||||
You'll likely want to use the raw output tag (`<%-`) with your include to avoid
|
||||
double-escaping the HTML output.
|
||||
|
||||
```html
|
||||
```ejs
|
||||
<ul>
|
||||
<% users.forEach(function(user){ %>
|
||||
<%- include('user/show', {user: user}) %>
|
||||
@@ -191,7 +193,7 @@ EJS does not specifically support blocks, but layouts can be implemented by
|
||||
including headers and footers, like so:
|
||||
|
||||
|
||||
```html
|
||||
```ejs
|
||||
<%- include('header') -%>
|
||||
<h1>
|
||||
Title
|
||||
@@ -244,6 +246,8 @@ Most of EJS will work as expected; however, there are a few things to note:
|
||||
}); // returns rendered string
|
||||
```
|
||||
|
||||
See the [examples folder](https://github.com/mde/ejs/tree/master/examples) for more details.
|
||||
|
||||
### IDE Integration with Syntax Highlighting
|
||||
|
||||
VSCode:Javascript EJS by *DigitalBrainstem*
|
||||
|
275
node_modules/ejs/ejs.js
generated
vendored
275
node_modules/ejs/ejs.js
generated
vendored
@@ -1,4 +1,4 @@
|
||||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
|
||||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
||||
/*
|
||||
* EJS Embedded JavaScript templates
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
@@ -51,6 +51,8 @@ var utils = require('./utils');
|
||||
|
||||
var scopeOptionWarned = false;
|
||||
var _VERSION_STRING = require('../package.json').version;
|
||||
var _DEFAULT_OPEN_DELIMITER = '<';
|
||||
var _DEFAULT_CLOSE_DELIMITER = '>';
|
||||
var _DEFAULT_DELIMITER = '%';
|
||||
var _DEFAULT_LOCALS_NAME = 'locals';
|
||||
var _NAME = 'ejs';
|
||||
@@ -136,9 +138,10 @@ function getIncludePath(path, options) {
|
||||
var includePath;
|
||||
var filePath;
|
||||
var views = options.views;
|
||||
var match = /^[A-Za-z]+:\\|^\//.exec(path);
|
||||
|
||||
// Abs path
|
||||
if (path.charAt(0) == '/') {
|
||||
if (match && match.length) {
|
||||
includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
|
||||
}
|
||||
// Relative paths
|
||||
@@ -488,6 +491,12 @@ exports.renderFile = function () {
|
||||
* @public
|
||||
*/
|
||||
|
||||
/**
|
||||
* EJS template class
|
||||
* @public
|
||||
*/
|
||||
exports.Template = Template;
|
||||
|
||||
exports.clearCache = function () {
|
||||
exports.cache.reset();
|
||||
};
|
||||
@@ -502,10 +511,12 @@ function Template(text, opts) {
|
||||
this.source = '';
|
||||
this.dependencies = [];
|
||||
options.client = opts.client || false;
|
||||
options.escapeFunction = opts.escape || utils.escapeXML;
|
||||
options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
|
||||
options.compileDebug = opts.compileDebug !== false;
|
||||
options.debug = !!opts.debug;
|
||||
options.filename = opts.filename;
|
||||
options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
|
||||
options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
|
||||
options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
|
||||
options.strict = opts.strict || false;
|
||||
options.context = opts.context;
|
||||
@@ -516,6 +527,8 @@ function Template(text, opts) {
|
||||
options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
|
||||
options.views = opts.views;
|
||||
options.async = opts.async;
|
||||
options.destructuredLocals = opts.destructuredLocals;
|
||||
options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;
|
||||
|
||||
if (options.strict) {
|
||||
options._with = false;
|
||||
@@ -541,7 +554,11 @@ Template.prototype = {
|
||||
createRegex: function () {
|
||||
var str = _REGEX_STRING;
|
||||
var delim = utils.escapeRegExpChars(this.opts.delimiter);
|
||||
str = str.replace(/%/g, delim);
|
||||
var open = utils.escapeRegExpChars(this.opts.openDelimiter);
|
||||
var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
|
||||
str = str.replace(/%/g, delim)
|
||||
.replace(/</g, open)
|
||||
.replace(/>/g, close);
|
||||
return new RegExp(str);
|
||||
},
|
||||
|
||||
@@ -552,19 +569,32 @@ Template.prototype = {
|
||||
var prepended = '';
|
||||
var appended = '';
|
||||
var escapeFn = opts.escapeFunction;
|
||||
var asyncCtor;
|
||||
var ctor;
|
||||
|
||||
if (!this.source) {
|
||||
this.generateSource();
|
||||
prepended += ' var __output = [], __append = __output.push.bind(__output);' + '\n';
|
||||
prepended +=
|
||||
' var __output = "";\n' +
|
||||
' function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
|
||||
if (opts.outputFunctionName) {
|
||||
prepended += ' var ' + opts.outputFunctionName + ' = __append;' + '\n';
|
||||
}
|
||||
if (opts.destructuredLocals && opts.destructuredLocals.length) {
|
||||
var destructuring = ' var __locals = (' + opts.localsName + ' || {}),\n';
|
||||
for (var i = 0; i < opts.destructuredLocals.length; i++) {
|
||||
var name = opts.destructuredLocals[i];
|
||||
if (i > 0) {
|
||||
destructuring += ',\n ';
|
||||
}
|
||||
destructuring += name + ' = __locals.' + name;
|
||||
}
|
||||
prepended += destructuring + ';\n';
|
||||
}
|
||||
if (opts._with !== false) {
|
||||
prepended += ' with (' + opts.localsName + ' || {}) {' + '\n';
|
||||
appended += ' }' + '\n';
|
||||
}
|
||||
appended += ' return __output.join("");' + '\n';
|
||||
appended += ' return __output;' + '\n';
|
||||
this.source = prepended + this.source + appended;
|
||||
}
|
||||
|
||||
@@ -596,13 +626,17 @@ Template.prototype = {
|
||||
if (opts.debug) {
|
||||
console.log(src);
|
||||
}
|
||||
if (opts.compileDebug && opts.filename) {
|
||||
src = src + '\n'
|
||||
+ '//# sourceURL=' + opts.filename + '\n';
|
||||
}
|
||||
|
||||
try {
|
||||
if (opts.async) {
|
||||
// Have to use generated function for this, since in envs without support,
|
||||
// it breaks in parsing
|
||||
try {
|
||||
asyncCtor = (new Function('return (async function(){}).constructor;'))();
|
||||
ctor = (new Function('return (async function(){}).constructor;'))();
|
||||
}
|
||||
catch(e) {
|
||||
if (e instanceof SyntaxError) {
|
||||
@@ -614,9 +648,9 @@ Template.prototype = {
|
||||
}
|
||||
}
|
||||
else {
|
||||
asyncCtor = Function;
|
||||
ctor = Function;
|
||||
}
|
||||
fn = new asyncCtor(opts.localsName + ', escapeFn, include, rethrow', src);
|
||||
fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
|
||||
}
|
||||
catch(e) {
|
||||
// istanbul ignore else
|
||||
@@ -627,23 +661,18 @@ Template.prototype = {
|
||||
e.message += ' while compiling ejs\n\n';
|
||||
e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
|
||||
e.message += 'https://github.com/RyanZim/EJS-Lint';
|
||||
if (!e.async) {
|
||||
if (!opts.async) {
|
||||
e.message += '\n';
|
||||
e.message += 'Or, if you meant to create an async function, pass async: true as an option.';
|
||||
e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (opts.client) {
|
||||
fn.dependencies = this.dependencies;
|
||||
return fn;
|
||||
}
|
||||
|
||||
// Return a callable function which will execute the function
|
||||
// created by the source-code, with the passed data as locals
|
||||
// Adds a local `include` function which allows full recursive include
|
||||
var returnedFn = function (data) {
|
||||
var returnedFn = opts.client ? fn : function anonymous(data) {
|
||||
var include = function (path, includeData) {
|
||||
var d = utils.shallowCopy({}, data);
|
||||
if (includeData) {
|
||||
@@ -654,6 +683,18 @@ Template.prototype = {
|
||||
return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
|
||||
};
|
||||
returnedFn.dependencies = this.dependencies;
|
||||
if (opts.filename && typeof Object.defineProperty === 'function') {
|
||||
var filename = opts.filename;
|
||||
var basename = path.basename(filename, path.extname(filename));
|
||||
try {
|
||||
Object.defineProperty(returnedFn, 'name', {
|
||||
value: basename,
|
||||
writable: false,
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
} catch (e) {/* ignore */}
|
||||
}
|
||||
return returnedFn;
|
||||
},
|
||||
|
||||
@@ -662,9 +703,9 @@ Template.prototype = {
|
||||
|
||||
if (opts.rmWhitespace) {
|
||||
// Have to use two separate replace here as `^` and `$` operators don't
|
||||
// work well with `\r`.
|
||||
// work well with `\r` and empty lines don't work well with the `m` flag.
|
||||
this.templateText =
|
||||
this.templateText.replace(/\r/g, '').replace(/^\s+|\s+$/gm, '');
|
||||
this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
|
||||
}
|
||||
|
||||
// Slurp spaces and tabs before <%_ and after _%>
|
||||
@@ -674,6 +715,8 @@ Template.prototype = {
|
||||
var self = this;
|
||||
var matches = this.parseTemplateText();
|
||||
var d = this.opts.delimiter;
|
||||
var o = this.opts.openDelimiter;
|
||||
var c = this.opts.closeDelimiter;
|
||||
|
||||
if (matches && matches.length) {
|
||||
matches.forEach(function (line, index) {
|
||||
@@ -685,20 +728,20 @@ Template.prototype = {
|
||||
var includeSrc;
|
||||
// If this is an opening tag, check for closing tags
|
||||
// FIXME: May end up with some false positives here
|
||||
// Better to store modes as k/v with '<' + delimiter as key
|
||||
// Better to store modes as k/v with openDelimiter + delimiter as key
|
||||
// Then this can simply check against the map
|
||||
if ( line.indexOf('<' + d) === 0 // If it is a tag
|
||||
&& line.indexOf('<' + d + d) !== 0) { // and is not escaped
|
||||
if ( line.indexOf(o + d) === 0 // If it is a tag
|
||||
&& line.indexOf(o + d + d) !== 0) { // and is not escaped
|
||||
closing = matches[index + 2];
|
||||
if (!(closing == d + '>' || closing == '-' + d + '>' || closing == '_' + d + '>')) {
|
||||
if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
|
||||
throw new Error('Could not find matching close tag for "' + line + '".');
|
||||
}
|
||||
}
|
||||
// HACK: backward-compat `include` preprocessor directives
|
||||
if ((include = line.match(/^\s*include\s+(\S+)/))) {
|
||||
if (opts.legacyInclude && (include = line.match(/^\s*include\s+(\S+)/))) {
|
||||
opening = matches[index - 1];
|
||||
// Must be in EVAL or RAW mode
|
||||
if (opening && (opening == '<' + d || opening == '<' + d + '-' || opening == '<' + d + '_')) {
|
||||
if (opening && (opening == o + d || opening == o + d + '-' || opening == o + d + '_')) {
|
||||
includeOpts = utils.shallowCopy({}, self.opts);
|
||||
includeObj = includeSource(include[1], includeOpts);
|
||||
if (self.opts.compileDebug) {
|
||||
@@ -766,11 +809,6 @@ Template.prototype = {
|
||||
line = line.replace(/^(?:\r\n|\r|\n)/, '');
|
||||
this.truncate = false;
|
||||
}
|
||||
else if (this.opts.rmWhitespace) {
|
||||
// rmWhitespace has already removed trailing spaces, just need
|
||||
// to remove linebreaks
|
||||
line = line.replace(/^\n/, '');
|
||||
}
|
||||
if (!line) {
|
||||
return line;
|
||||
}
|
||||
@@ -791,35 +829,37 @@ Template.prototype = {
|
||||
scanLine: function (line) {
|
||||
var self = this;
|
||||
var d = this.opts.delimiter;
|
||||
var o = this.opts.openDelimiter;
|
||||
var c = this.opts.closeDelimiter;
|
||||
var newLineCount = 0;
|
||||
|
||||
newLineCount = (line.split('\n').length - 1);
|
||||
|
||||
switch (line) {
|
||||
case '<' + d:
|
||||
case '<' + d + '_':
|
||||
case o + d:
|
||||
case o + d + '_':
|
||||
this.mode = Template.modes.EVAL;
|
||||
break;
|
||||
case '<' + d + '=':
|
||||
case o + d + '=':
|
||||
this.mode = Template.modes.ESCAPED;
|
||||
break;
|
||||
case '<' + d + '-':
|
||||
case o + d + '-':
|
||||
this.mode = Template.modes.RAW;
|
||||
break;
|
||||
case '<' + d + '#':
|
||||
case o + d + '#':
|
||||
this.mode = Template.modes.COMMENT;
|
||||
break;
|
||||
case '<' + d + d:
|
||||
case o + d + d:
|
||||
this.mode = Template.modes.LITERAL;
|
||||
this.source += ' ; __append("' + line.replace('<' + d + d, '<' + d) + '")' + '\n';
|
||||
this.source += ' ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
|
||||
break;
|
||||
case d + d + '>':
|
||||
case d + d + c:
|
||||
this.mode = Template.modes.LITERAL;
|
||||
this.source += ' ; __append("' + line.replace(d + d + '>', d + '>') + '")' + '\n';
|
||||
this.source += ' ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
|
||||
break;
|
||||
case d + '>':
|
||||
case '-' + d + '>':
|
||||
case '_' + d + '>':
|
||||
case d + c:
|
||||
case '-' + d + c:
|
||||
case '_' + d + c:
|
||||
if (this.mode == Template.modes.LITERAL) {
|
||||
this._addOutput(line);
|
||||
}
|
||||
@@ -903,6 +943,7 @@ exports.__express = exports.renderFile;
|
||||
/* istanbul ignore else */
|
||||
if (require.extensions) {
|
||||
require.extensions['.ejs'] = function (module, flnm) {
|
||||
console.log('Deprecated: this API will go away in EJS v2.8');
|
||||
var filename = flnm || /* istanbul ignore next */ module.filename;
|
||||
var options = {
|
||||
filename: filename,
|
||||
@@ -1100,6 +1141,9 @@ exports.cache = {
|
||||
get: function (key) {
|
||||
return this._data[key];
|
||||
},
|
||||
remove: function (key) {
|
||||
delete this._data[key];
|
||||
},
|
||||
reset: function () {
|
||||
this._data = {};
|
||||
}
|
||||
@@ -1109,6 +1153,9 @@ exports.cache = {
|
||||
|
||||
},{}],4:[function(require,module,exports){
|
||||
(function (process){
|
||||
// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
|
||||
// backported and transplited with Babel, with backwards-compat fixes
|
||||
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -1160,14 +1207,6 @@ function normalizeArray(parts, allowAboveRoot) {
|
||||
return parts;
|
||||
}
|
||||
|
||||
// Split a filename into [root, dir, basename, ext], unix version
|
||||
// 'root' is just a slash, or nothing.
|
||||
var splitPathRe =
|
||||
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
|
||||
var splitPath = function(filename) {
|
||||
return splitPathRe.exec(filename).slice(1);
|
||||
};
|
||||
|
||||
// path.resolve([from ...], to)
|
||||
// posix version
|
||||
exports.resolve = function() {
|
||||
@@ -1283,37 +1322,120 @@ exports.relative = function(from, to) {
|
||||
exports.sep = '/';
|
||||
exports.delimiter = ':';
|
||||
|
||||
exports.dirname = function(path) {
|
||||
var result = splitPath(path),
|
||||
root = result[0],
|
||||
dir = result[1];
|
||||
|
||||
if (!root && !dir) {
|
||||
// No dirname whatsoever
|
||||
return '.';
|
||||
exports.dirname = function (path) {
|
||||
if (typeof path !== 'string') path = path + '';
|
||||
if (path.length === 0) return '.';
|
||||
var code = path.charCodeAt(0);
|
||||
var hasRoot = code === 47 /*/*/;
|
||||
var end = -1;
|
||||
var matchedSlash = true;
|
||||
for (var i = path.length - 1; i >= 1; --i) {
|
||||
code = path.charCodeAt(i);
|
||||
if (code === 47 /*/*/) {
|
||||
if (!matchedSlash) {
|
||||
end = i;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// We saw the first non-path separator
|
||||
matchedSlash = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (dir) {
|
||||
// It has a dirname, strip trailing slash
|
||||
dir = dir.substr(0, dir.length - 1);
|
||||
if (end === -1) return hasRoot ? '/' : '.';
|
||||
if (hasRoot && end === 1) {
|
||||
// return '//';
|
||||
// Backwards-compat fix:
|
||||
return '/';
|
||||
}
|
||||
|
||||
return root + dir;
|
||||
return path.slice(0, end);
|
||||
};
|
||||
|
||||
function basename(path) {
|
||||
if (typeof path !== 'string') path = path + '';
|
||||
|
||||
exports.basename = function(path, ext) {
|
||||
var f = splitPath(path)[2];
|
||||
// TODO: make this comparison case-insensitive on windows?
|
||||
var start = 0;
|
||||
var end = -1;
|
||||
var matchedSlash = true;
|
||||
var i;
|
||||
|
||||
for (i = path.length - 1; i >= 0; --i) {
|
||||
if (path.charCodeAt(i) === 47 /*/*/) {
|
||||
// If we reached a path separator that was not part of a set of path
|
||||
// separators at the end of the string, stop now
|
||||
if (!matchedSlash) {
|
||||
start = i + 1;
|
||||
break;
|
||||
}
|
||||
} else if (end === -1) {
|
||||
// We saw the first non-path separator, mark this as the end of our
|
||||
// path component
|
||||
matchedSlash = false;
|
||||
end = i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (end === -1) return '';
|
||||
return path.slice(start, end);
|
||||
}
|
||||
|
||||
// Uses a mixed approach for backwards-compatibility, as ext behavior changed
|
||||
// in new Node.js versions, so only basename() above is backported here
|
||||
exports.basename = function (path, ext) {
|
||||
var f = basename(path);
|
||||
if (ext && f.substr(-1 * ext.length) === ext) {
|
||||
f = f.substr(0, f.length - ext.length);
|
||||
}
|
||||
return f;
|
||||
};
|
||||
|
||||
exports.extname = function (path) {
|
||||
if (typeof path !== 'string') path = path + '';
|
||||
var startDot = -1;
|
||||
var startPart = 0;
|
||||
var end = -1;
|
||||
var matchedSlash = true;
|
||||
// Track the state of characters (if any) we see before our first dot and
|
||||
// after any path separator we find
|
||||
var preDotState = 0;
|
||||
for (var i = path.length - 1; i >= 0; --i) {
|
||||
var code = path.charCodeAt(i);
|
||||
if (code === 47 /*/*/) {
|
||||
// If we reached a path separator that was not part of a set of path
|
||||
// separators at the end of the string, stop now
|
||||
if (!matchedSlash) {
|
||||
startPart = i + 1;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (end === -1) {
|
||||
// We saw the first non-path separator, mark this as the end of our
|
||||
// extension
|
||||
matchedSlash = false;
|
||||
end = i + 1;
|
||||
}
|
||||
if (code === 46 /*.*/) {
|
||||
// If this is our first dot, mark it as the start of our extension
|
||||
if (startDot === -1)
|
||||
startDot = i;
|
||||
else if (preDotState !== 1)
|
||||
preDotState = 1;
|
||||
} else if (startDot !== -1) {
|
||||
// We saw a non-dot and non-path separator before our dot, so we should
|
||||
// have a good chance at having a non-empty extension
|
||||
preDotState = -1;
|
||||
}
|
||||
}
|
||||
|
||||
exports.extname = function(path) {
|
||||
return splitPath(path)[3];
|
||||
if (startDot === -1 || end === -1 ||
|
||||
// We saw a non-dot character immediately before the dot
|
||||
preDotState === 0 ||
|
||||
// The (right-most) trimmed path component is exactly '..'
|
||||
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
||||
return '';
|
||||
}
|
||||
return path.slice(startDot, end);
|
||||
};
|
||||
|
||||
function filter (xs, f) {
|
||||
@@ -1530,11 +1652,8 @@ module.exports={
|
||||
"engine",
|
||||
"ejs"
|
||||
],
|
||||
"version": "2.6.0",
|
||||
"version": "2.7.4",
|
||||
"author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
|
||||
"contributors": [
|
||||
"Timothy Gu <timothygu99@gmail.com> (https://timothygu.github.io)"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"main": "./lib/ejs.js",
|
||||
"repository": {
|
||||
@@ -1548,8 +1667,7 @@ module.exports={
|
||||
"browserify": "^13.1.1",
|
||||
"eslint": "^4.14.0",
|
||||
"git-directory-deploy": "^1.5.1",
|
||||
"istanbul": "~0.4.3",
|
||||
"jake": "^8.0.16",
|
||||
"jake": "^10.3.1",
|
||||
"jsdoc": "^3.4.0",
|
||||
"lru-cache": "^4.0.1",
|
||||
"mocha": "^5.0.5",
|
||||
@@ -1559,11 +1677,8 @@ module.exports={
|
||||
"node": ">=0.10.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "jake test",
|
||||
"lint": "eslint \"**/*.js\" Jakefile",
|
||||
"coverage": "istanbul cover node_modules/mocha/bin/_mocha",
|
||||
"doc": "jake doc",
|
||||
"devdoc": "jake doc[dev]"
|
||||
"test": "mocha",
|
||||
"postinstall": "node ./postinstall.js"
|
||||
}
|
||||
}
|
||||
|
||||
|
2
node_modules/ejs/ejs.min.js
generated
vendored
2
node_modules/ejs/ejs.min.js
generated
vendored
File diff suppressed because one or more lines are too long
10
node_modules/ejs/Jakefile → node_modules/ejs/jakefile.js
generated
vendored
10
node_modules/ejs/Jakefile → node_modules/ejs/jakefile.js
generated
vendored
@@ -18,8 +18,8 @@ task('clean', ['clobber'], function () {
|
||||
});
|
||||
|
||||
desc('Lints the source code');
|
||||
task('lint', function () {
|
||||
exec('./node_modules/.bin/eslint "**/*.js" Jakefile');
|
||||
task('lint', ['clean'], function () {
|
||||
exec('./node_modules/.bin/eslint "**/*.js"');
|
||||
console.log('Linting completed.');
|
||||
});
|
||||
|
||||
@@ -33,6 +33,7 @@ task('minify', function () {
|
||||
console.log('Minification completed.');
|
||||
});
|
||||
|
||||
desc('Generates the EJS API docs');
|
||||
task('doc', function (dev) {
|
||||
jake.rmRf('out');
|
||||
var p = dev ? '-p' : '';
|
||||
@@ -40,6 +41,7 @@ task('doc', function (dev) {
|
||||
console.log('Documentation generated.');
|
||||
});
|
||||
|
||||
desc('Publishes the EJS API docs');
|
||||
task('docPublish', ['doc'], function () {
|
||||
fs.writeFileSync('out/CNAME', 'api.ejs.co');
|
||||
console.log('Pushing docs to gh-pages...');
|
||||
@@ -47,16 +49,18 @@ task('docPublish', ['doc'], function () {
|
||||
console.log('Docs published to gh-pages.');
|
||||
});
|
||||
|
||||
desc('Runs the EJS test suite');
|
||||
task('test', ['lint'], function () {
|
||||
exec('./node_modules/.bin/mocha');
|
||||
});
|
||||
|
||||
publishTask('ejs', ['build'], function () {
|
||||
this.packageFiles.include([
|
||||
'Jakefile',
|
||||
'jakefile.js',
|
||||
'README.md',
|
||||
'LICENSE',
|
||||
'package.json',
|
||||
'postinstall.js',
|
||||
'ejs.js',
|
||||
'ejs.min.js',
|
||||
'lib/**'
|
125
node_modules/ejs/lib/ejs.js
generated
vendored
125
node_modules/ejs/lib/ejs.js
generated
vendored
@@ -50,6 +50,8 @@ var utils = require('./utils');
|
||||
|
||||
var scopeOptionWarned = false;
|
||||
var _VERSION_STRING = require('../package.json').version;
|
||||
var _DEFAULT_OPEN_DELIMITER = '<';
|
||||
var _DEFAULT_CLOSE_DELIMITER = '>';
|
||||
var _DEFAULT_DELIMITER = '%';
|
||||
var _DEFAULT_LOCALS_NAME = 'locals';
|
||||
var _NAME = 'ejs';
|
||||
@@ -135,9 +137,10 @@ function getIncludePath(path, options) {
|
||||
var includePath;
|
||||
var filePath;
|
||||
var views = options.views;
|
||||
var match = /^[A-Za-z]+:\\|^\//.exec(path);
|
||||
|
||||
// Abs path
|
||||
if (path.charAt(0) == '/') {
|
||||
if (match && match.length) {
|
||||
includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true);
|
||||
}
|
||||
// Relative paths
|
||||
@@ -487,6 +490,12 @@ exports.renderFile = function () {
|
||||
* @public
|
||||
*/
|
||||
|
||||
/**
|
||||
* EJS template class
|
||||
* @public
|
||||
*/
|
||||
exports.Template = Template;
|
||||
|
||||
exports.clearCache = function () {
|
||||
exports.cache.reset();
|
||||
};
|
||||
@@ -501,10 +510,12 @@ function Template(text, opts) {
|
||||
this.source = '';
|
||||
this.dependencies = [];
|
||||
options.client = opts.client || false;
|
||||
options.escapeFunction = opts.escape || utils.escapeXML;
|
||||
options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
|
||||
options.compileDebug = opts.compileDebug !== false;
|
||||
options.debug = !!opts.debug;
|
||||
options.filename = opts.filename;
|
||||
options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
|
||||
options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
|
||||
options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
|
||||
options.strict = opts.strict || false;
|
||||
options.context = opts.context;
|
||||
@@ -515,6 +526,8 @@ function Template(text, opts) {
|
||||
options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
|
||||
options.views = opts.views;
|
||||
options.async = opts.async;
|
||||
options.destructuredLocals = opts.destructuredLocals;
|
||||
options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;
|
||||
|
||||
if (options.strict) {
|
||||
options._with = false;
|
||||
@@ -540,7 +553,11 @@ Template.prototype = {
|
||||
createRegex: function () {
|
||||
var str = _REGEX_STRING;
|
||||
var delim = utils.escapeRegExpChars(this.opts.delimiter);
|
||||
str = str.replace(/%/g, delim);
|
||||
var open = utils.escapeRegExpChars(this.opts.openDelimiter);
|
||||
var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
|
||||
str = str.replace(/%/g, delim)
|
||||
.replace(/</g, open)
|
||||
.replace(/>/g, close);
|
||||
return new RegExp(str);
|
||||
},
|
||||
|
||||
@@ -551,19 +568,32 @@ Template.prototype = {
|
||||
var prepended = '';
|
||||
var appended = '';
|
||||
var escapeFn = opts.escapeFunction;
|
||||
var asyncCtor;
|
||||
var ctor;
|
||||
|
||||
if (!this.source) {
|
||||
this.generateSource();
|
||||
prepended += ' var __output = [], __append = __output.push.bind(__output);' + '\n';
|
||||
prepended +=
|
||||
' var __output = "";\n' +
|
||||
' function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
|
||||
if (opts.outputFunctionName) {
|
||||
prepended += ' var ' + opts.outputFunctionName + ' = __append;' + '\n';
|
||||
}
|
||||
if (opts.destructuredLocals && opts.destructuredLocals.length) {
|
||||
var destructuring = ' var __locals = (' + opts.localsName + ' || {}),\n';
|
||||
for (var i = 0; i < opts.destructuredLocals.length; i++) {
|
||||
var name = opts.destructuredLocals[i];
|
||||
if (i > 0) {
|
||||
destructuring += ',\n ';
|
||||
}
|
||||
destructuring += name + ' = __locals.' + name;
|
||||
}
|
||||
prepended += destructuring + ';\n';
|
||||
}
|
||||
if (opts._with !== false) {
|
||||
prepended += ' with (' + opts.localsName + ' || {}) {' + '\n';
|
||||
appended += ' }' + '\n';
|
||||
}
|
||||
appended += ' return __output.join("");' + '\n';
|
||||
appended += ' return __output;' + '\n';
|
||||
this.source = prepended + this.source + appended;
|
||||
}
|
||||
|
||||
@@ -595,13 +625,17 @@ Template.prototype = {
|
||||
if (opts.debug) {
|
||||
console.log(src);
|
||||
}
|
||||
if (opts.compileDebug && opts.filename) {
|
||||
src = src + '\n'
|
||||
+ '//# sourceURL=' + opts.filename + '\n';
|
||||
}
|
||||
|
||||
try {
|
||||
if (opts.async) {
|
||||
// Have to use generated function for this, since in envs without support,
|
||||
// it breaks in parsing
|
||||
try {
|
||||
asyncCtor = (new Function('return (async function(){}).constructor;'))();
|
||||
ctor = (new Function('return (async function(){}).constructor;'))();
|
||||
}
|
||||
catch(e) {
|
||||
if (e instanceof SyntaxError) {
|
||||
@@ -613,9 +647,9 @@ Template.prototype = {
|
||||
}
|
||||
}
|
||||
else {
|
||||
asyncCtor = Function;
|
||||
ctor = Function;
|
||||
}
|
||||
fn = new asyncCtor(opts.localsName + ', escapeFn, include, rethrow', src);
|
||||
fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
|
||||
}
|
||||
catch(e) {
|
||||
// istanbul ignore else
|
||||
@@ -626,23 +660,18 @@ Template.prototype = {
|
||||
e.message += ' while compiling ejs\n\n';
|
||||
e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
|
||||
e.message += 'https://github.com/RyanZim/EJS-Lint';
|
||||
if (!e.async) {
|
||||
if (!opts.async) {
|
||||
e.message += '\n';
|
||||
e.message += 'Or, if you meant to create an async function, pass async: true as an option.';
|
||||
e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
|
||||
if (opts.client) {
|
||||
fn.dependencies = this.dependencies;
|
||||
return fn;
|
||||
}
|
||||
|
||||
// Return a callable function which will execute the function
|
||||
// created by the source-code, with the passed data as locals
|
||||
// Adds a local `include` function which allows full recursive include
|
||||
var returnedFn = function (data) {
|
||||
var returnedFn = opts.client ? fn : function anonymous(data) {
|
||||
var include = function (path, includeData) {
|
||||
var d = utils.shallowCopy({}, data);
|
||||
if (includeData) {
|
||||
@@ -653,6 +682,18 @@ Template.prototype = {
|
||||
return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
|
||||
};
|
||||
returnedFn.dependencies = this.dependencies;
|
||||
if (opts.filename && typeof Object.defineProperty === 'function') {
|
||||
var filename = opts.filename;
|
||||
var basename = path.basename(filename, path.extname(filename));
|
||||
try {
|
||||
Object.defineProperty(returnedFn, 'name', {
|
||||
value: basename,
|
||||
writable: false,
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
} catch (e) {/* ignore */}
|
||||
}
|
||||
return returnedFn;
|
||||
},
|
||||
|
||||
@@ -661,9 +702,9 @@ Template.prototype = {
|
||||
|
||||
if (opts.rmWhitespace) {
|
||||
// Have to use two separate replace here as `^` and `$` operators don't
|
||||
// work well with `\r`.
|
||||
// work well with `\r` and empty lines don't work well with the `m` flag.
|
||||
this.templateText =
|
||||
this.templateText.replace(/\r/g, '').replace(/^\s+|\s+$/gm, '');
|
||||
this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
|
||||
}
|
||||
|
||||
// Slurp spaces and tabs before <%_ and after _%>
|
||||
@@ -673,6 +714,8 @@ Template.prototype = {
|
||||
var self = this;
|
||||
var matches = this.parseTemplateText();
|
||||
var d = this.opts.delimiter;
|
||||
var o = this.opts.openDelimiter;
|
||||
var c = this.opts.closeDelimiter;
|
||||
|
||||
if (matches && matches.length) {
|
||||
matches.forEach(function (line, index) {
|
||||
@@ -684,20 +727,20 @@ Template.prototype = {
|
||||
var includeSrc;
|
||||
// If this is an opening tag, check for closing tags
|
||||
// FIXME: May end up with some false positives here
|
||||
// Better to store modes as k/v with '<' + delimiter as key
|
||||
// Better to store modes as k/v with openDelimiter + delimiter as key
|
||||
// Then this can simply check against the map
|
||||
if ( line.indexOf('<' + d) === 0 // If it is a tag
|
||||
&& line.indexOf('<' + d + d) !== 0) { // and is not escaped
|
||||
if ( line.indexOf(o + d) === 0 // If it is a tag
|
||||
&& line.indexOf(o + d + d) !== 0) { // and is not escaped
|
||||
closing = matches[index + 2];
|
||||
if (!(closing == d + '>' || closing == '-' + d + '>' || closing == '_' + d + '>')) {
|
||||
if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
|
||||
throw new Error('Could not find matching close tag for "' + line + '".');
|
||||
}
|
||||
}
|
||||
// HACK: backward-compat `include` preprocessor directives
|
||||
if ((include = line.match(/^\s*include\s+(\S+)/))) {
|
||||
if (opts.legacyInclude && (include = line.match(/^\s*include\s+(\S+)/))) {
|
||||
opening = matches[index - 1];
|
||||
// Must be in EVAL or RAW mode
|
||||
if (opening && (opening == '<' + d || opening == '<' + d + '-' || opening == '<' + d + '_')) {
|
||||
if (opening && (opening == o + d || opening == o + d + '-' || opening == o + d + '_')) {
|
||||
includeOpts = utils.shallowCopy({}, self.opts);
|
||||
includeObj = includeSource(include[1], includeOpts);
|
||||
if (self.opts.compileDebug) {
|
||||
@@ -765,11 +808,6 @@ Template.prototype = {
|
||||
line = line.replace(/^(?:\r\n|\r|\n)/, '');
|
||||
this.truncate = false;
|
||||
}
|
||||
else if (this.opts.rmWhitespace) {
|
||||
// rmWhitespace has already removed trailing spaces, just need
|
||||
// to remove linebreaks
|
||||
line = line.replace(/^\n/, '');
|
||||
}
|
||||
if (!line) {
|
||||
return line;
|
||||
}
|
||||
@@ -790,35 +828,37 @@ Template.prototype = {
|
||||
scanLine: function (line) {
|
||||
var self = this;
|
||||
var d = this.opts.delimiter;
|
||||
var o = this.opts.openDelimiter;
|
||||
var c = this.opts.closeDelimiter;
|
||||
var newLineCount = 0;
|
||||
|
||||
newLineCount = (line.split('\n').length - 1);
|
||||
|
||||
switch (line) {
|
||||
case '<' + d:
|
||||
case '<' + d + '_':
|
||||
case o + d:
|
||||
case o + d + '_':
|
||||
this.mode = Template.modes.EVAL;
|
||||
break;
|
||||
case '<' + d + '=':
|
||||
case o + d + '=':
|
||||
this.mode = Template.modes.ESCAPED;
|
||||
break;
|
||||
case '<' + d + '-':
|
||||
case o + d + '-':
|
||||
this.mode = Template.modes.RAW;
|
||||
break;
|
||||
case '<' + d + '#':
|
||||
case o + d + '#':
|
||||
this.mode = Template.modes.COMMENT;
|
||||
break;
|
||||
case '<' + d + d:
|
||||
case o + d + d:
|
||||
this.mode = Template.modes.LITERAL;
|
||||
this.source += ' ; __append("' + line.replace('<' + d + d, '<' + d) + '")' + '\n';
|
||||
this.source += ' ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
|
||||
break;
|
||||
case d + d + '>':
|
||||
case d + d + c:
|
||||
this.mode = Template.modes.LITERAL;
|
||||
this.source += ' ; __append("' + line.replace(d + d + '>', d + '>') + '")' + '\n';
|
||||
this.source += ' ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
|
||||
break;
|
||||
case d + '>':
|
||||
case '-' + d + '>':
|
||||
case '_' + d + '>':
|
||||
case d + c:
|
||||
case '-' + d + c:
|
||||
case '_' + d + c:
|
||||
if (this.mode == Template.modes.LITERAL) {
|
||||
this._addOutput(line);
|
||||
}
|
||||
@@ -902,6 +942,7 @@ exports.__express = exports.renderFile;
|
||||
/* istanbul ignore else */
|
||||
if (require.extensions) {
|
||||
require.extensions['.ejs'] = function (module, flnm) {
|
||||
console.log('Deprecated: this API will go away in EJS v2.8');
|
||||
var filename = flnm || /* istanbul ignore next */ module.filename;
|
||||
var options = {
|
||||
filename: filename,
|
||||
|
3
node_modules/ejs/lib/utils.js
generated
vendored
3
node_modules/ejs/lib/utils.js
generated
vendored
@@ -158,6 +158,9 @@ exports.cache = {
|
||||
get: function (key) {
|
||||
return this._data[key];
|
||||
},
|
||||
remove: function (key) {
|
||||
delete this._data[key];
|
||||
},
|
||||
reset: function () {
|
||||
this._data = {};
|
||||
}
|
||||
|
42
node_modules/ejs/package.json
generated
vendored
42
node_modules/ejs/package.json
generated
vendored
@@ -1,27 +1,28 @@
|
||||
{
|
||||
"_from": "ejs@^2.6.1",
|
||||
"_id": "ejs@2.6.1",
|
||||
"_from": "ejs@2.7.4",
|
||||
"_id": "ejs@2.7.4",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
|
||||
"_integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
|
||||
"_location": "/ejs",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "range",
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "ejs@^2.6.1",
|
||||
"raw": "ejs@2.7.4",
|
||||
"name": "ejs",
|
||||
"escapedName": "ejs",
|
||||
"rawSpec": "^2.6.1",
|
||||
"rawSpec": "2.7.4",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "^2.6.1"
|
||||
"fetchSpec": "2.7.4"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#USER",
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
|
||||
"_shasum": "498ec0d495655abc6f23cd61868d926464071aa0",
|
||||
"_spec": "ejs@^2.6.1",
|
||||
"_where": "F:\\projects\\vanillajs-seed",
|
||||
"_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
|
||||
"_shasum": "48661287573dcc53e366c7a1ae52c3a120eec9ba",
|
||||
"_spec": "ejs@2.7.4",
|
||||
"_where": "/home/s2/Code/vanillajs-seed",
|
||||
"author": {
|
||||
"name": "Matthew Eernisse",
|
||||
"email": "mde@fleegix.org",
|
||||
@@ -31,13 +32,6 @@
|
||||
"url": "https://github.com/mde/ejs/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Timothy Gu",
|
||||
"email": "timothygu99@gmail.com",
|
||||
"url": "https://timothygu.github.io"
|
||||
}
|
||||
],
|
||||
"dependencies": {},
|
||||
"deprecated": false,
|
||||
"description": "Embedded JavaScript templates",
|
||||
@@ -45,8 +39,7 @@
|
||||
"browserify": "^13.1.1",
|
||||
"eslint": "^4.14.0",
|
||||
"git-directory-deploy": "^1.5.1",
|
||||
"istanbul": "~0.4.3",
|
||||
"jake": "^8.0.16",
|
||||
"jake": "^10.3.1",
|
||||
"jsdoc": "^3.4.0",
|
||||
"lru-cache": "^4.0.1",
|
||||
"mocha": "^5.0.5",
|
||||
@@ -69,11 +62,8 @@
|
||||
"url": "git://github.com/mde/ejs.git"
|
||||
},
|
||||
"scripts": {
|
||||
"coverage": "istanbul cover node_modules/mocha/bin/_mocha",
|
||||
"devdoc": "jake doc[dev]",
|
||||
"doc": "jake doc",
|
||||
"lint": "eslint \"**/*.js\" Jakefile",
|
||||
"test": "jake test"
|
||||
"postinstall": "node ./postinstall.js",
|
||||
"test": "mocha"
|
||||
},
|
||||
"version": "2.6.1"
|
||||
"version": "2.7.4"
|
||||
}
|
||||
|
17
node_modules/ejs/postinstall.js
generated
vendored
Executable file
17
node_modules/ejs/postinstall.js
generated
vendored
Executable file
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
function isTrue(value) {
|
||||
return !!value && value !== '0' && value !== 'false';
|
||||
}
|
||||
|
||||
let envDisable = isTrue(process.env.DISABLE_OPENCOLLECTIVE) || isTrue(process.env.CI);
|
||||
let logLevel = process.env.npm_config_loglevel;
|
||||
let logLevelDisplay = ['silent', 'error', 'warn'].indexOf(logLevel) > -1;
|
||||
|
||||
if (!envDisable && !logLevelDisplay) {
|
||||
console.log('Thank you for installing \u001b[35mEJS\u001b[0m: built with the \u001b[32mJake\u001b[0m JavaScript build tool (\u001b[32mhttps://jakejs.com/\u001b[0m)\n');
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user