inital
This commit is contained in:
26
node_modules/nunjucks/LICENSE
generated
vendored
Normal file
26
node_modules/nunjucks/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
Copyright (c) 2012-2015, James Long
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
58
node_modules/nunjucks/README.md
generated
vendored
Normal file
58
node_modules/nunjucks/README.md
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
# Nunjucks
|
||||
|
||||
[![NPM Version][npm-image]][npm-url]
|
||||
[![NPM Downloads][downloads-image]][downloads-url]
|
||||
[![Linux Build][github-actions-image]][github-actions-url]
|
||||
[![Windows Build][appveyor-image]][appveyor-url]
|
||||
[![Test Codecov][codecov-image]][codecov-url]
|
||||
|
||||
[Nunjucks](https://mozilla.github.io/nunjucks/) is a full featured
|
||||
templating engine for javascript. It is heavily inspired by
|
||||
[jinja2](http://jinja.pocoo.org/). View the docs
|
||||
[here](https://mozilla.github.io/nunjucks/).
|
||||
|
||||
## Installation
|
||||
|
||||
`npm install nunjucks`
|
||||
|
||||
To use the file watcher built-in to Nunjucks, Chokidar must be installed separately.
|
||||
|
||||
`npm install nunjucks chokidar`
|
||||
|
||||
(View the [CHANGELOG](https://github.com/mozilla/nunjucks/releases))
|
||||
|
||||
## Documentation
|
||||
|
||||
See [here](https://mozilla.github.io/nunjucks/).
|
||||
|
||||
## Browser Support
|
||||
|
||||
Supported in all modern browsers. For IE8 support, use [es5-shim](https://github.com/es-shims/es5-shim).
|
||||
|
||||
## Tests
|
||||
|
||||
Run the tests with `npm test`.
|
||||
|
||||
Watch `master` branch's [tests running in the browser](https://mozilla.github.io/nunjucks/files/tests/browser/).
|
||||
|
||||
## Mailing List
|
||||
|
||||
Join our mailing list and get help with and issues you have:
|
||||
https://groups.google.com/forum/?fromgroups#!forum/nunjucks
|
||||
|
||||
## Want to help?
|
||||
|
||||
Contributions are always welcome! Before you submit an issue or pull request, please read our [contribution guidelines](CONTRIBUTING.md).
|
||||
|
||||
[Contributors](https://github.com/mozilla/nunjucks/graphs/contributors)
|
||||
|
||||
[npm-image]: https://img.shields.io/npm/v/nunjucks.svg
|
||||
[npm-url]: https://npmjs.org/package/nunjucks
|
||||
[downloads-image]: https://img.shields.io/npm/dm/nunjucks.svg
|
||||
[downloads-url]: https://npmjs.org/package/nunjucks
|
||||
[github-actions-image]: https://img.shields.io/github/workflow/status/mozilla/nunjucks/Tests/master.svg?label=linux
|
||||
[github-actions-url]: https://github.com/mozilla/nunjucks/actions
|
||||
[appveyor-image]: https://img.shields.io/appveyor/ci/fdintino/nunjucks/master.svg?label=windows
|
||||
[appveyor-url]: https://ci.appveyor.com/project/fdintino/nunjucks
|
||||
[codecov-image]: https://img.shields.io/codecov/c/gh/mozilla/nunjucks.svg
|
||||
[codecov-url]: https://codecov.io/gh/mozilla/nunjucks/branch/master
|
58
node_modules/nunjucks/bin/precompile
generated
vendored
Executable file
58
node_modules/nunjucks/bin/precompile
generated
vendored
Executable file
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env node
|
||||
var {program} = require('commander');
|
||||
var precompile = require('../src/precompile').precompile;
|
||||
var Environment = require('../src/environment').Environment;
|
||||
var lib = require('../src/lib');
|
||||
|
||||
var cmdpath = null;
|
||||
|
||||
program
|
||||
.storeOptionsAsProperties(false)
|
||||
.passCommandToAction(false);
|
||||
|
||||
program
|
||||
.name('precompile')
|
||||
.usage('[-f|--force] [-a|--filters <filters>] [-n|--name <name>] [-i|--include <regex>] [-x|--exclude <regex>] [-w|--wrapper <wrapper>] <path>')
|
||||
.arguments('<path>')
|
||||
.helpOption('-?, -h, --help', 'Display this help message')
|
||||
.option('-f, --force', 'Force compilation to continue on error')
|
||||
.option('-a, --filters <filters>', 'Give the compiler a comma-delimited list of asynchronous filters, required for correctly generating code')
|
||||
.option('-n, --name <name>', 'Specify the template name when compiling a single file')
|
||||
.option('-i, --include <regex>', 'Include a file or folder which match the regex but would otherwise be excluded. You can use this flag multiple times', concat, ['\\.html$', '\\.jinja$'])
|
||||
.option('-x, --exclude <regex>', 'Exclude a file or folder which match the regex but would otherwise be included. You can use this flag multiple times', concat, [])
|
||||
.option('-w, --wrapper <wrapper>', 'Load a external plugin to change the output format of the precompiled templates (for example, "-w custom" will load a module named "nunjucks-custom")')
|
||||
.action(function (path) {
|
||||
cmdpath = path;
|
||||
})
|
||||
.parse(process.argv);
|
||||
|
||||
function concat(value, previous) {
|
||||
return previous.concat(value);
|
||||
}
|
||||
|
||||
if (cmdpath == null) {
|
||||
program.outputHelp();
|
||||
console.error('\nerror: no path given');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
var env = new Environment([]);
|
||||
|
||||
const opts = program.opts();
|
||||
|
||||
lib.each([].concat(opts.filters).join(',').split(','), function (name) {
|
||||
env.addFilter(name.trim(), function () {}, true);
|
||||
});
|
||||
|
||||
if (opts.wrapper) {
|
||||
opts.wrapper = require('nunjucks-' + opts.wrapper).wrapper;
|
||||
}
|
||||
|
||||
console.log(precompile(cmdpath, {
|
||||
env : env,
|
||||
force : opts.force,
|
||||
name : opts.name,
|
||||
wrapper: opts.wrapper,
|
||||
include : [].concat(opts.include),
|
||||
exclude : [].concat(opts.exclude)
|
||||
}));
|
5
node_modules/nunjucks/bin/precompile.cmd
generated
vendored
Normal file
5
node_modules/nunjucks/bin/precompile.cmd
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
@IF EXIST "%~dp0\node.exe" (
|
||||
"%~dp0\node.exe" "%~dp0\precompile" %*
|
||||
) ELSE (
|
||||
node "%~dp0\precompile" %*
|
||||
)
|
3709
node_modules/nunjucks/browser/nunjucks-slim.js
generated
vendored
Normal file
3709
node_modules/nunjucks/browser/nunjucks-slim.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
node_modules/nunjucks/browser/nunjucks-slim.js.map
generated
vendored
Normal file
1
node_modules/nunjucks/browser/nunjucks-slim.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
3
node_modules/nunjucks/browser/nunjucks-slim.min.js
generated
vendored
Normal file
3
node_modules/nunjucks/browser/nunjucks-slim.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
node_modules/nunjucks/browser/nunjucks-slim.min.js.map
generated
vendored
Normal file
1
node_modules/nunjucks/browser/nunjucks-slim.min.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
7021
node_modules/nunjucks/browser/nunjucks.js
generated
vendored
Normal file
7021
node_modules/nunjucks/browser/nunjucks.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
node_modules/nunjucks/browser/nunjucks.js.map
generated
vendored
Normal file
1
node_modules/nunjucks/browser/nunjucks.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
3
node_modules/nunjucks/browser/nunjucks.min.js
generated
vendored
Normal file
3
node_modules/nunjucks/browser/nunjucks.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
node_modules/nunjucks/browser/nunjucks.min.js.map
generated
vendored
Normal file
1
node_modules/nunjucks/browser/nunjucks.min.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
82
node_modules/nunjucks/index.js
generated
vendored
Normal file
82
node_modules/nunjucks/index.js
generated
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
'use strict';
|
||||
|
||||
var lib = require('./src/lib');
|
||||
var _require = require('./src/environment'),
|
||||
Environment = _require.Environment,
|
||||
Template = _require.Template;
|
||||
var Loader = require('./src/loader');
|
||||
var loaders = require('./src/loaders');
|
||||
var precompile = require('./src/precompile');
|
||||
var compiler = require('./src/compiler');
|
||||
var parser = require('./src/parser');
|
||||
var lexer = require('./src/lexer');
|
||||
var runtime = require('./src/runtime');
|
||||
var nodes = require('./src/nodes');
|
||||
var installJinjaCompat = require('./src/jinja-compat');
|
||||
|
||||
// A single instance of an environment, since this is so commonly used
|
||||
var e;
|
||||
function configure(templatesPath, opts) {
|
||||
opts = opts || {};
|
||||
if (lib.isObject(templatesPath)) {
|
||||
opts = templatesPath;
|
||||
templatesPath = null;
|
||||
}
|
||||
var TemplateLoader;
|
||||
if (loaders.FileSystemLoader) {
|
||||
TemplateLoader = new loaders.FileSystemLoader(templatesPath, {
|
||||
watch: opts.watch,
|
||||
noCache: opts.noCache
|
||||
});
|
||||
} else if (loaders.WebLoader) {
|
||||
TemplateLoader = new loaders.WebLoader(templatesPath, {
|
||||
useCache: opts.web && opts.web.useCache,
|
||||
async: opts.web && opts.web.async
|
||||
});
|
||||
}
|
||||
e = new Environment(TemplateLoader, opts);
|
||||
if (opts && opts.express) {
|
||||
e.express(opts.express);
|
||||
}
|
||||
return e;
|
||||
}
|
||||
module.exports = {
|
||||
Environment: Environment,
|
||||
Template: Template,
|
||||
Loader: Loader,
|
||||
FileSystemLoader: loaders.FileSystemLoader,
|
||||
NodeResolveLoader: loaders.NodeResolveLoader,
|
||||
PrecompiledLoader: loaders.PrecompiledLoader,
|
||||
WebLoader: loaders.WebLoader,
|
||||
compiler: compiler,
|
||||
parser: parser,
|
||||
lexer: lexer,
|
||||
runtime: runtime,
|
||||
lib: lib,
|
||||
nodes: nodes,
|
||||
installJinjaCompat: installJinjaCompat,
|
||||
configure: configure,
|
||||
reset: function reset() {
|
||||
e = undefined;
|
||||
},
|
||||
compile: function compile(src, env, path, eagerCompile) {
|
||||
if (!e) {
|
||||
configure();
|
||||
}
|
||||
return new Template(src, env, path, eagerCompile);
|
||||
},
|
||||
render: function render(name, ctx, cb) {
|
||||
if (!e) {
|
||||
configure();
|
||||
}
|
||||
return e.render(name, ctx, cb);
|
||||
},
|
||||
renderString: function renderString(src, ctx, cb) {
|
||||
if (!e) {
|
||||
configure();
|
||||
}
|
||||
return e.renderString(src, ctx, cb);
|
||||
},
|
||||
precompile: precompile ? precompile.precompile : undefined,
|
||||
precompileString: precompile ? precompile.precompileString : undefined
|
||||
};
|
385
node_modules/nunjucks/node_modules/commander/CHANGELOG.md
generated
vendored
Normal file
385
node_modules/nunjucks/node_modules/commander/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,385 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). (Format adopted after v3.0.0.)
|
||||
|
||||
<!-- markdownlint-disable MD024 -->
|
||||
|
||||
## [5.1.0] (2020-04-25)
|
||||
|
||||
### Added
|
||||
|
||||
- support for multiple command aliases, the first of which is shown in the auto-generated help ([#531], [#1236])
|
||||
- configuration support in `addCommand()` for `hidden` and `isDefault` ([#1232])
|
||||
|
||||
### Fixed
|
||||
|
||||
- omit masked help flags from the displayed help ([#645], [#1247])
|
||||
- remove old short help flag when change help flags using `helpOption` ([#1248])
|
||||
|
||||
### Changed
|
||||
|
||||
- remove use of `arguments` to improve auto-generated help in editors ([#1235])
|
||||
- rename `.command()` configuration `noHelp` to `hidden` (but not remove old support) ([#1232])
|
||||
- improvements to documentation
|
||||
- update dependencies
|
||||
- update tested versions of node
|
||||
- eliminate lint errors in TypeScript ([#1208])
|
||||
|
||||
## [5.0.0] (2020-03-14)
|
||||
|
||||
### Added
|
||||
|
||||
* support for nested commands with action-handlers ([#1] [#764] [#1149])
|
||||
* `.addCommand()` for adding a separately configured command ([#764] [#1149])
|
||||
* allow a non-executable to be set as the default command ([#742] [#1149])
|
||||
* implicit help command when there are subcommands (previously only if executables) ([#1149])
|
||||
* customise implicit help command with `.addHelpCommand()` ([#1149])
|
||||
* display error message for unknown subcommand, by default ([#432] [#1088] [#1149])
|
||||
* display help for missing subcommand, by default ([#1088] [#1149])
|
||||
* combined short options as single argument may include boolean flags and value flag and value (e.g. `-a -b -p 80` can be written as `-abp80`) ([#1145])
|
||||
* `.parseOption()` includes short flag and long flag expansions ([#1145])
|
||||
* `.helpInformation()` returns help text as a string, previously a private routine ([#1169])
|
||||
* `.parse()` implicitly uses `process.argv` if arguments not specified ([#1172])
|
||||
* optionally specify where `.parse()` arguments "from", if not following node conventions ([#512] [#1172])
|
||||
* suggest help option along with unknown command error ([#1179])
|
||||
* TypeScript definition for `commands` property of `Command` ([#1184])
|
||||
* export `program` property ([#1195])
|
||||
* `createCommand` factory method to simplify subclassing ([#1191])
|
||||
|
||||
### Fixed
|
||||
|
||||
* preserve argument order in subcommands ([#508] [#962] [#1138])
|
||||
* do not emit `command:*` for executable subcommands ([#809] [#1149])
|
||||
* action handler called whether or not there are non-option arguments ([#1062] [#1149])
|
||||
* combining option short flag and value in single argument now works for subcommands ([#1145])
|
||||
* only add implicit help command when it will not conflict with other uses of argument ([#1153] [#1149])
|
||||
* implicit help command works with command aliases ([#948] [#1149])
|
||||
* options are validated whether or not there is an action handler ([#1149])
|
||||
|
||||
### Changed
|
||||
|
||||
* *Breaking* `.args` contains command arguments with just recognised options removed ([#1032] [#1138])
|
||||
* *Breaking* display error if required argument for command is missing ([#995] [#1149])
|
||||
* tighten TypeScript definition of custom option processing function passed to `.option()` ([#1119])
|
||||
* *Breaking* `.allowUnknownOption()` ([#802] [#1138])
|
||||
* unknown options included in arguments passed to command action handler
|
||||
* unknown options included in `.args`
|
||||
* only recognised option short flags and long flags are expanded (e.g. `-ab` or `--foo=bar`) ([#1145])
|
||||
* *Breaking* `.parseOptions()` ([#1138])
|
||||
* `args` in returned result renamed `operands` and does not include anything after first unknown option
|
||||
* `unknown` in returned result has arguments after first unknown option including operands, not just options and values
|
||||
* *Breaking* `.on('command:*', callback)` and other command events passed (changed) results from `.parseOptions`, i.e. operands and unknown ([#1138])
|
||||
* refactor Option from prototype to class ([#1133])
|
||||
* refactor Command from prototype to class ([#1159])
|
||||
* changes to error handling ([#1165])
|
||||
* throw for author error, not just display message
|
||||
* preflight for variadic error
|
||||
* add tips to missing subcommand executable
|
||||
* TypeScript fluent return types changed to be more subclass friendly, return `this` rather than `Command` ([#1180])
|
||||
* `.parseAsync` returns `Promise<this>` to be consistent with `.parse()` ([#1180])
|
||||
* update dependencies
|
||||
|
||||
### Removed
|
||||
|
||||
* removed EventEmitter from TypeScript definition for Command, eliminating implicit peer dependency on `@types/node` ([#1146])
|
||||
* removed private function `normalize` (the functionality has been integrated into `parseOptions`) ([#1145])
|
||||
* `parseExpectedArgs` is now private ([#1149])
|
||||
|
||||
### Migration Tips
|
||||
|
||||
If you use `.on('command:*')` or more complicated tests to detect an unrecognised subcommand, you may be able to delete the code and rely on the default behaviour.
|
||||
|
||||
If you use `program.args` or more complicated tests to detect a missing subcommand, you may be able to delete the code and rely on the default behaviour.
|
||||
|
||||
If you use `.command('*')` to add a default command, you may be be able to switch to `isDefault:true` with a named command.
|
||||
|
||||
## [5.0.0-4] (2020-03-03)
|
||||
|
||||
(Released in 5.0.0)
|
||||
|
||||
## [5.0.0-3] (2020-02-20)
|
||||
|
||||
(Released in 5.0.0)
|
||||
|
||||
## [5.0.0-2] (2020-02-10)
|
||||
|
||||
(Released in 5.0.0)
|
||||
|
||||
## [5.0.0-1] (2020-02-08)
|
||||
|
||||
(Released in 5.0.0)
|
||||
|
||||
## [5.0.0-0] (2020-02-02)
|
||||
|
||||
(Released in 5.0.0)
|
||||
|
||||
## [4.1.1] (2020-02-02)
|
||||
|
||||
### Fixed
|
||||
|
||||
* TypeScript definition for `.action()` should include Promise for async ([#1157])
|
||||
|
||||
## [4.1.0] (2020-01-06)
|
||||
|
||||
### Added
|
||||
|
||||
* two routines to change how option values are handled, and eliminate name clashes with command properties ([#933] [#1102])
|
||||
* see storeOptionsAsProperties and passCommandToAction in README
|
||||
* `.parseAsync` to use instead of `.parse` if supply async action handlers ([#806] [#1118])
|
||||
|
||||
### Fixed
|
||||
|
||||
* Remove trailing blanks from wrapped help text ([#1096])
|
||||
|
||||
### Changed
|
||||
|
||||
* update dependencies
|
||||
* extend security coverage for Commander 2.x to 2020-02-03
|
||||
* improvements to README
|
||||
* improvements to TypeScript definition documentation
|
||||
* move old versions out of main CHANGELOG
|
||||
* removed explicit use of `ts-node` in tests
|
||||
|
||||
## [4.0.1] (2019-11-12)
|
||||
|
||||
### Fixed
|
||||
|
||||
* display help when requested, even if there are missing required options ([#1091])
|
||||
|
||||
## [4.0.0] (2019-11-02)
|
||||
|
||||
### Added
|
||||
|
||||
* automatically wrap and indent help descriptions for options and commands ([#1051])
|
||||
* `.exitOverride()` allows override of calls to `process.exit` for additional error handling and to keep program running ([#1040])
|
||||
* support for declaring required options with `.requiredOptions()` ([#1071])
|
||||
* GitHub Actions support ([#1027])
|
||||
* translation links in README
|
||||
|
||||
### Changed
|
||||
|
||||
* dev: switch tests from Sinon+Should to Jest with major rewrite of tests ([#1035])
|
||||
* call default subcommand even when there are unknown options ([#1047])
|
||||
* *Breaking* Commander is only officially supported on Node 8 and above, and requires Node 6 ([#1053])
|
||||
|
||||
### Fixed
|
||||
|
||||
* *Breaking* keep command object out of program.args when action handler called ([#1048])
|
||||
* also, action handler now passed array of unknown arguments
|
||||
* complain about unknown options when program argument supplied and action handler ([#1049])
|
||||
* this changes parameters to `command:*` event to include unknown arguments
|
||||
* removed deprecated `customFds` option from call to `child_process.spawn` ([#1052])
|
||||
* rework TypeScript declarations to bring all types into imported namespace ([#1081])
|
||||
|
||||
### Migration Tips
|
||||
|
||||
#### Testing for no arguments
|
||||
|
||||
If you were previously using code like:
|
||||
|
||||
```js
|
||||
if (!program.args.length) ...
|
||||
```
|
||||
|
||||
a partial replacement is:
|
||||
|
||||
```js
|
||||
if (program.rawArgs.length < 3) ...
|
||||
```
|
||||
|
||||
## [4.0.0-1] Prerelease (2019-10-08)
|
||||
|
||||
(Released in 4.0.0)
|
||||
|
||||
## [4.0.0-0] Prerelease (2019-10-01)
|
||||
|
||||
(Released in 4.0.0)
|
||||
|
||||
## [2.20.1] (2019-09-29)
|
||||
|
||||
### Fixed
|
||||
|
||||
* Improve tracking of executable subcommands.
|
||||
|
||||
### Changed
|
||||
|
||||
* update development dependencies
|
||||
|
||||
## [3.0.2] (2019-09-27)
|
||||
|
||||
### Fixed
|
||||
|
||||
* Improve tracking of executable subcommands.
|
||||
|
||||
### Changed
|
||||
|
||||
* update development dependencies
|
||||
|
||||
## [3.0.1] (2019-08-30)
|
||||
|
||||
### Added
|
||||
|
||||
* .name and .usage to README ([#1010])
|
||||
* Table of Contents to README ([#1010])
|
||||
* TypeScript definition for `executableFile` in CommandOptions ([#1028])
|
||||
|
||||
### Changed
|
||||
|
||||
* consistently use `const` rather than `var` in README ([#1026])
|
||||
|
||||
### Fixed
|
||||
|
||||
* help for sub commands with custom executableFile ([#1018])
|
||||
|
||||
## [3.0.0] / 2019-08-08
|
||||
|
||||
* Add option to specify executable file name ([#999])
|
||||
* e.g. `.command('clone', 'clone description', { executableFile: 'myClone' })`
|
||||
* Change docs for `.command` to contrast action handler vs git-style executable. ([#938] [#990])
|
||||
* **Breaking** Change TypeScript to use overloaded function for `.command`. ([#938] [#990])
|
||||
* Change to use straight quotes around strings in error messages (like 'this' instead of `this') ([#915])
|
||||
* Add TypeScript "reference types" for node ([#974])
|
||||
* Add support for hyphen as an option argument in subcommands ([#697])
|
||||
* Add support for a short option flag and its value to be concatenated for action handler subcommands ([#599])
|
||||
* e.g. `-p 80` can also be supplied as `-p80`
|
||||
* Add executable arguments to spawn in win32, for git-style executables ([#611])
|
||||
* e.g. `node --harmony myCommand.js clone`
|
||||
* Add parent command as prefix of subcommand in help ([#980])
|
||||
* Add optional custom description to `.version` ([#963])
|
||||
* e.g. `program.version('0.0.1', '-v, --vers', 'output the current version')`
|
||||
* Add `.helpOption(flags, description)` routine to customise help flags and description ([#963])
|
||||
* e.g. `.helpOption('-e, --HELP', 'read more information')`
|
||||
* Fix behavior of --no-* options ([#795])
|
||||
* can now define both `--foo` and `--no-foo`
|
||||
* **Breaking** custom event listeners: `--no-foo` on cli now emits `option:no-foo` (previously `option:foo`)
|
||||
* **Breaking** default value: defining `--no-foo` after defining `--foo` leaves the default value unchanged (previously set it to false)
|
||||
* allow boolean default value, such as from environment ([#987])
|
||||
* Increment inspector port for spawned subcommands ([#991])
|
||||
* e.g. `node --inspect myCommand.js clone`
|
||||
|
||||
### Migration Tips
|
||||
|
||||
The custom event for a negated option like `--no-foo` is `option:no-foo` (previously `option:foo`).
|
||||
|
||||
```js
|
||||
program
|
||||
.option('--no-foo')
|
||||
.on('option:no-foo', () => {
|
||||
console.log('removing foo');
|
||||
});
|
||||
```
|
||||
|
||||
When using TypeScript, adding a command does not allow an explicit `undefined` for an unwanted executable description (e.g
|
||||
for a command with an action handler).
|
||||
|
||||
```js
|
||||
program
|
||||
.command('action1', undefined, { noHelp: true }) // No longer valid
|
||||
.command('action2', { noHelp: true }) // Correct
|
||||
```
|
||||
|
||||
## 3.0.0-0 Prerelease / 2019-07-28
|
||||
|
||||
(Released as 3.0.0)
|
||||
|
||||
## Older versions
|
||||
|
||||
* [2.x](./changelogs/CHANGELOG-2.md)
|
||||
* [1.x](./changelogs/CHANGELOG-1.md)
|
||||
* [0.x](./changelogs/CHANGELOG-0.md)
|
||||
|
||||
[#1]: https://github.com/tj/commander.js/issues/1
|
||||
[#432]: https://github.com/tj/commander.js/issues/432
|
||||
[#508]: https://github.com/tj/commander.js/issues/508
|
||||
[#512]: https://github.com/tj/commander.js/issues/512
|
||||
[#531]: https://github.com/tj/commander.js/issues/531
|
||||
[#599]: https://github.com/tj/commander.js/issues/599
|
||||
[#611]: https://github.com/tj/commander.js/issues/611
|
||||
[#645]: https://github.com/tj/commander.js/issues/645
|
||||
[#697]: https://github.com/tj/commander.js/issues/697
|
||||
[#742]: https://github.com/tj/commander.js/issues/742
|
||||
[#764]: https://github.com/tj/commander.js/issues/764
|
||||
[#795]: https://github.com/tj/commander.js/issues/795
|
||||
[#802]: https://github.com/tj/commander.js/issues/802
|
||||
[#806]: https://github.com/tj/commander.js/issues/806
|
||||
[#809]: https://github.com/tj/commander.js/issues/809
|
||||
[#915]: https://github.com/tj/commander.js/issues/915
|
||||
[#938]: https://github.com/tj/commander.js/issues/938
|
||||
[#948]: https://github.com/tj/commander.js/issues/948
|
||||
[#962]: https://github.com/tj/commander.js/issues/962
|
||||
[#963]: https://github.com/tj/commander.js/issues/963
|
||||
[#974]: https://github.com/tj/commander.js/issues/974
|
||||
[#980]: https://github.com/tj/commander.js/issues/980
|
||||
[#987]: https://github.com/tj/commander.js/issues/987
|
||||
[#990]: https://github.com/tj/commander.js/issues/990
|
||||
[#991]: https://github.com/tj/commander.js/issues/991
|
||||
[#993]: https://github.com/tj/commander.js/issues/993
|
||||
[#995]: https://github.com/tj/commander.js/issues/995
|
||||
[#999]: https://github.com/tj/commander.js/issues/999
|
||||
[#1010]: https://github.com/tj/commander.js/pull/1010
|
||||
[#1018]: https://github.com/tj/commander.js/pull/1018
|
||||
[#1026]: https://github.com/tj/commander.js/pull/1026
|
||||
[#1027]: https://github.com/tj/commander.js/pull/1027
|
||||
[#1028]: https://github.com/tj/commander.js/pull/1028
|
||||
[#1032]: https://github.com/tj/commander.js/issues/1032
|
||||
[#1035]: https://github.com/tj/commander.js/pull/1035
|
||||
[#1040]: https://github.com/tj/commander.js/pull/1040
|
||||
[#1047]: https://github.com/tj/commander.js/pull/1047
|
||||
[#1048]: https://github.com/tj/commander.js/pull/1048
|
||||
[#1049]: https://github.com/tj/commander.js/pull/1049
|
||||
[#1051]: https://github.com/tj/commander.js/pull/1051
|
||||
[#1052]: https://github.com/tj/commander.js/pull/1052
|
||||
[#1053]: https://github.com/tj/commander.js/pull/1053
|
||||
[#1062]: https://github.com/tj/commander.js/pull/1062
|
||||
[#1071]: https://github.com/tj/commander.js/pull/1071
|
||||
[#1081]: https://github.com/tj/commander.js/pull/1081
|
||||
[#1088]: https://github.com/tj/commander.js/issues/1088
|
||||
[#1091]: https://github.com/tj/commander.js/pull/1091
|
||||
[#1096]: https://github.com/tj/commander.js/pull/1096
|
||||
[#1102]: https://github.com/tj/commander.js/pull/1102
|
||||
[#1118]: https://github.com/tj/commander.js/pull/1118
|
||||
[#1119]: https://github.com/tj/commander.js/pull/1119
|
||||
[#1133]: https://github.com/tj/commander.js/pull/1133
|
||||
[#1138]: https://github.com/tj/commander.js/pull/1138
|
||||
[#1145]: https://github.com/tj/commander.js/pull/1145
|
||||
[#1146]: https://github.com/tj/commander.js/pull/1146
|
||||
[#1149]: https://github.com/tj/commander.js/pull/1149
|
||||
[#1153]: https://github.com/tj/commander.js/issues/1153
|
||||
[#1157]: https://github.com/tj/commander.js/pull/1157
|
||||
[#1159]: https://github.com/tj/commander.js/pull/1159
|
||||
[#1165]: https://github.com/tj/commander.js/pull/1165
|
||||
[#1169]: https://github.com/tj/commander.js/pull/1169
|
||||
[#1172]: https://github.com/tj/commander.js/pull/1172
|
||||
[#1179]: https://github.com/tj/commander.js/pull/1179
|
||||
[#1180]: https://github.com/tj/commander.js/pull/1180
|
||||
[#1184]: https://github.com/tj/commander.js/pull/1184
|
||||
[#1191]: https://github.com/tj/commander.js/pull/1191
|
||||
[#1195]: https://github.com/tj/commander.js/pull/1195
|
||||
[#1208]: https://github.com/tj/commander.js/pull/1208
|
||||
[#1232]: https://github.com/tj/commander.js/pull/1232
|
||||
[#1235]: https://github.com/tj/commander.js/pull/1235
|
||||
[#1236]: https://github.com/tj/commander.js/pull/1236
|
||||
[#1247]: https://github.com/tj/commander.js/pull/1247
|
||||
[#1248]: https://github.com/tj/commander.js/pull/1248
|
||||
|
||||
[Unreleased]: https://github.com/tj/commander.js/compare/master...develop
|
||||
[5.1.0]: https://github.com/tj/commander.js/compare/v5.0.0..v5.1.0
|
||||
[5.0.0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0
|
||||
[5.0.0-4]: https://github.com/tj/commander.js/compare/v5.0.0-3..v5.0.0-4
|
||||
[5.0.0-3]: https://github.com/tj/commander.js/compare/v5.0.0-2..v5.0.0-3
|
||||
[5.0.0-2]: https://github.com/tj/commander.js/compare/v5.0.0-1..v5.0.0-2
|
||||
[5.0.0-1]: https://github.com/tj/commander.js/compare/v5.0.0-0..v5.0.0-1
|
||||
[5.0.0-0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0-0
|
||||
[4.1.1]: https://github.com/tj/commander.js/compare/v4.1.0..v4.1.1
|
||||
[4.1.0]: https://github.com/tj/commander.js/compare/v4.0.1..v4.1.0
|
||||
[4.0.1]: https://github.com/tj/commander.js/compare/v4.0.0..v4.0.1
|
||||
[4.0.0]: https://github.com/tj/commander.js/compare/v3.0.2..v4.0.0
|
||||
[4.0.0-1]: https://github.com/tj/commander.js/compare/v4.0.0-0..v4.0.0-1
|
||||
[4.0.0-0]: https://github.com/tj/commander.js/compare/v3.0.2...v4.0.0-0
|
||||
[3.0.2]: https://github.com/tj/commander.js/compare/v3.0.1...v3.0.2
|
||||
[3.0.1]: https://github.com/tj/commander.js/compare/v3.0.0...v3.0.1
|
||||
[3.0.0]: https://github.com/tj/commander.js/compare/v2.20.1...v3.0.0
|
||||
[2.20.1]: https://github.com/tj/commander.js/compare/v2.20.0...v2.20.1
|
22
node_modules/nunjucks/node_modules/commander/LICENSE
generated
vendored
Normal file
22
node_modules/nunjucks/node_modules/commander/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
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.
|
737
node_modules/nunjucks/node_modules/commander/Readme.md
generated
vendored
Normal file
737
node_modules/nunjucks/node_modules/commander/Readme.md
generated
vendored
Normal file
@@ -0,0 +1,737 @@
|
||||
# Commander.js
|
||||
|
||||
[](http://travis-ci.org/tj/commander.js)
|
||||
[](https://www.npmjs.org/package/commander)
|
||||
[](https://npmcharts.com/compare/commander?minimal=true)
|
||||
[](https://packagephobia.now.sh/result?p=commander)
|
||||
|
||||
The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander).
|
||||
|
||||
Read this in other languages: English | [简体中文](./Readme_zh-CN.md)
|
||||
|
||||
- [Commander.js](#commanderjs)
|
||||
- [Installation](#installation)
|
||||
- [Declaring _program_ variable](#declaring-program-variable)
|
||||
- [Options](#options)
|
||||
- [Common option types, boolean and value](#common-option-types-boolean-and-value)
|
||||
- [Default option value](#default-option-value)
|
||||
- [Other option types, negatable boolean and flag|value](#other-option-types-negatable-boolean-and-flagvalue)
|
||||
- [Custom option processing](#custom-option-processing)
|
||||
- [Required option](#required-option)
|
||||
- [Version option](#version-option)
|
||||
- [Commands](#commands)
|
||||
- [Specify the argument syntax](#specify-the-argument-syntax)
|
||||
- [Action handler (sub)commands](#action-handler-subcommands)
|
||||
- [Stand-alone executable (sub)commands](#stand-alone-executable-subcommands)
|
||||
- [Automated help](#automated-help)
|
||||
- [Custom help](#custom-help)
|
||||
- [.usage and .name](#usage-and-name)
|
||||
- [.help(cb)](#helpcb)
|
||||
- [.outputHelp(cb)](#outputhelpcb)
|
||||
- [.helpInformation()](#helpinformation)
|
||||
- [.helpOption(flags, description)](#helpoptionflags-description)
|
||||
- [.addHelpCommand()](#addhelpcommand)
|
||||
- [Custom event listeners](#custom-event-listeners)
|
||||
- [Bits and pieces](#bits-and-pieces)
|
||||
- [.parse() and .parseAsync()](#parse-and-parseasync)
|
||||
- [Avoiding option name clashes](#avoiding-option-name-clashes)
|
||||
- [TypeScript](#typescript)
|
||||
- [createCommand()](#createcommand)
|
||||
- [Node options such as `--harmony`](#node-options-such-as---harmony)
|
||||
- [Debugging stand-alone executable subcommands](#debugging-stand-alone-executable-subcommands)
|
||||
- [Override exit handling](#override-exit-handling)
|
||||
- [Examples](#examples)
|
||||
- [License](#license)
|
||||
- [Support](#support)
|
||||
- [Commander for enterprise](#commander-for-enterprise)
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
npm install commander
|
||||
```
|
||||
|
||||
## Declaring _program_ variable
|
||||
|
||||
Commander exports a global object which is convenient for quick programs.
|
||||
This is used in the examples in this README for brevity.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
program.version('0.0.1');
|
||||
```
|
||||
|
||||
For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use.
|
||||
|
||||
```js
|
||||
const { Command } = require('commander');
|
||||
const program = new Command();
|
||||
program.version('0.0.1');
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|').
|
||||
|
||||
The options can be accessed as properties on the Command object. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. See also optional new behaviour to [avoid name clashes](#avoiding-option-name-clashes).
|
||||
|
||||
Multiple short flags may optionally be combined in a single argument following the dash: boolean flags, the last flag may take a value, and the value.
|
||||
For example `-a -b -p 80` may be written as `-ab -p80` or even `-abp80`.
|
||||
|
||||
You can use `--` to indicate the end of the options, and any remaining arguments will be used without being interpreted.
|
||||
This is particularly useful for passing options through to another
|
||||
command, like: `do -- git --version`.
|
||||
|
||||
Options on the command line are not positional, and can be specified before or after other command arguments.
|
||||
|
||||
### Common option types, boolean and value
|
||||
|
||||
The two most used option types are a boolean flag, and an option which takes a value (declared using angle brackets). Both are `undefined` unless specified on command line.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.option('-d, --debug', 'output extra debugging')
|
||||
.option('-s, --small', 'small pizza size')
|
||||
.option('-p, --pizza-type <type>', 'flavour of pizza');
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
if (program.debug) console.log(program.opts());
|
||||
console.log('pizza details:');
|
||||
if (program.small) console.log('- small pizza size');
|
||||
if (program.pizzaType) console.log(`- ${program.pizzaType}`);
|
||||
```
|
||||
|
||||
```bash
|
||||
$ pizza-options -d
|
||||
{ debug: true, small: undefined, pizzaType: undefined }
|
||||
pizza details:
|
||||
$ pizza-options -p
|
||||
error: option '-p, --pizza-type <type>' argument missing
|
||||
$ pizza-options -ds -p vegetarian
|
||||
{ debug: true, small: true, pizzaType: 'vegetarian' }
|
||||
pizza details:
|
||||
- small pizza size
|
||||
- vegetarian
|
||||
$ pizza-options --pizza-type=cheese
|
||||
pizza details:
|
||||
- cheese
|
||||
```
|
||||
|
||||
`program.parse(arguments)` processes the arguments, leaving any args not consumed by the program options in the `program.args` array.
|
||||
|
||||
### Default option value
|
||||
|
||||
You can specify a default value for an option which takes a value.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.option('-c, --cheese <type>', 'add the specified type of cheese', 'blue');
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
console.log(`cheese: ${program.cheese}`);
|
||||
```
|
||||
|
||||
```bash
|
||||
$ pizza-options
|
||||
cheese: blue
|
||||
$ pizza-options --cheese stilton
|
||||
cheese: stilton
|
||||
```
|
||||
|
||||
### Other option types, negatable boolean and flag|value
|
||||
|
||||
You can specify a boolean option long name with a leading `no-` to set the option value to false when used.
|
||||
Defined alone this also makes the option true by default.
|
||||
|
||||
If you define `--foo` first, adding `--no-foo` does not change the default value from what it would
|
||||
otherwise be. You can specify a default boolean value for a boolean flag and it can be overridden on command line.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.option('--no-sauce', 'Remove sauce')
|
||||
.option('--cheese <flavour>', 'cheese flavour', 'mozzarella')
|
||||
.option('--no-cheese', 'plain with no cheese')
|
||||
.parse(process.argv);
|
||||
|
||||
const sauceStr = program.sauce ? 'sauce' : 'no sauce';
|
||||
const cheeseStr = (program.cheese === false) ? 'no cheese' : `${program.cheese} cheese`;
|
||||
console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`);
|
||||
```
|
||||
|
||||
```bash
|
||||
$ pizza-options
|
||||
You ordered a pizza with sauce and mozzarella cheese
|
||||
$ pizza-options --sauce
|
||||
error: unknown option '--sauce'
|
||||
$ pizza-options --cheese=blue
|
||||
You ordered a pizza with sauce and blue cheese
|
||||
$ pizza-options --no-sauce --no-cheese
|
||||
You ordered a pizza with no sauce and no cheese
|
||||
```
|
||||
|
||||
You can specify an option which functions as a flag but may also take a value (declared using square brackets).
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.option('-c, --cheese [type]', 'Add cheese with optional type');
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
if (program.cheese === undefined) console.log('no cheese');
|
||||
else if (program.cheese === true) console.log('add cheese');
|
||||
else console.log(`add cheese type ${program.cheese}`);
|
||||
```
|
||||
|
||||
```bash
|
||||
$ pizza-options
|
||||
no cheese
|
||||
$ pizza-options --cheese
|
||||
add cheese
|
||||
$ pizza-options --cheese mozzarella
|
||||
add cheese type mozzarella
|
||||
```
|
||||
|
||||
### Custom option processing
|
||||
|
||||
You may specify a function to do custom processing of option values. The callback function receives two parameters, the user specified value and the
|
||||
previous value for the option. It returns the new value for the option.
|
||||
|
||||
This allows you to coerce the option value to the desired type, or accumulate values, or do entirely custom processing.
|
||||
|
||||
You can optionally specify the default/starting value for the option after the function.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
function myParseInt(value, dummyPrevious) {
|
||||
// parseInt takes a string and an optional radix
|
||||
return parseInt(value);
|
||||
}
|
||||
|
||||
function increaseVerbosity(dummyValue, previous) {
|
||||
return previous + 1;
|
||||
}
|
||||
|
||||
function collect(value, previous) {
|
||||
return previous.concat([value]);
|
||||
}
|
||||
|
||||
function commaSeparatedList(value, dummyPrevious) {
|
||||
return value.split(',');
|
||||
}
|
||||
|
||||
program
|
||||
.option('-f, --float <number>', 'float argument', parseFloat)
|
||||
.option('-i, --integer <number>', 'integer argument', myParseInt)
|
||||
.option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0)
|
||||
.option('-c, --collect <value>', 'repeatable value', collect, [])
|
||||
.option('-l, --list <items>', 'comma separated list', commaSeparatedList)
|
||||
;
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
if (program.float !== undefined) console.log(`float: ${program.float}`);
|
||||
if (program.integer !== undefined) console.log(`integer: ${program.integer}`);
|
||||
if (program.verbose > 0) console.log(`verbosity: ${program.verbose}`);
|
||||
if (program.collect.length > 0) console.log(program.collect);
|
||||
if (program.list !== undefined) console.log(program.list);
|
||||
```
|
||||
|
||||
```bash
|
||||
$ custom -f 1e2
|
||||
float: 100
|
||||
$ custom --integer 2
|
||||
integer: 2
|
||||
$ custom -v -v -v
|
||||
verbose: 3
|
||||
$ custom -c a -c b -c c
|
||||
[ 'a', 'b', 'c' ]
|
||||
$ custom --list x,y,z
|
||||
[ 'x', 'y', 'z' ]
|
||||
```
|
||||
|
||||
### Required option
|
||||
|
||||
You may specify a required (mandatory) option using `.requiredOption`. The option must have a value after parsing, usually specified on the command line, or perhaps from a default value (say from environment). The method is otherwise the same as `.option` in format, taking flags and description, and optional default value or custom processing.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.requiredOption('-c, --cheese <type>', 'pizza must have cheese');
|
||||
|
||||
program.parse(process.argv);
|
||||
```
|
||||
|
||||
```bash
|
||||
$ pizza
|
||||
error: required option '-c, --cheese <type>' not specified
|
||||
```
|
||||
|
||||
### Version option
|
||||
|
||||
The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits.
|
||||
|
||||
```js
|
||||
program.version('0.0.1');
|
||||
```
|
||||
|
||||
```bash
|
||||
$ ./examples/pizza -V
|
||||
0.0.1
|
||||
```
|
||||
|
||||
You may change the flags and description by passing additional parameters to the `version` method, using
|
||||
the same syntax for flags as the `option` method. The version flags can be named anything, but a long name is required.
|
||||
|
||||
```js
|
||||
program.version('0.0.1', '-v, --vers', 'output the current version');
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
You can specify (sub)commands using `.command()` or `.addCommand()`. There are two ways these can be implemented: using an action handler attached to the command, or as a stand-alone executable file (described in more detail later). The subcommands may be nested ([example](./examples/nestedCommands.js)).
|
||||
|
||||
In the first parameter to `.command()` you specify the command name and any command arguments. The arguments may be `<required>` or `[optional]`, and the last argument may also be `variadic...`.
|
||||
|
||||
You can use `.addCommand()` to add an already configured subcommand to the program.
|
||||
|
||||
For example:
|
||||
|
||||
```js
|
||||
// Command implemented using action handler (description is supplied separately to `.command`)
|
||||
// Returns new command for configuring.
|
||||
program
|
||||
.command('clone <source> [destination]')
|
||||
.description('clone a repository into a newly created directory')
|
||||
.action((source, destination) => {
|
||||
console.log('clone command called');
|
||||
});
|
||||
|
||||
// Command implemented using stand-alone executable file (description is second parameter to `.command`)
|
||||
// Returns `this` for adding more commands.
|
||||
program
|
||||
.command('start <service>', 'start named service')
|
||||
.command('stop [service]', 'stop named service, or all if no name supplied');
|
||||
|
||||
// Command prepared separately.
|
||||
// Returns `this` for adding more commands.
|
||||
program
|
||||
.addCommand(build.makeBuildCommand());
|
||||
```
|
||||
|
||||
Configuration options can be passed with the call to `.command()` and `.addCommand()`. Specifying `true` for `opts.hidden` will remove the command from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified ([example](./examples/defaultCommand.js)).
|
||||
|
||||
### Specify the argument syntax
|
||||
|
||||
You use `.arguments` to specify the arguments for the top-level command, and for subcommands they are usually included in the `.command` call. Angled brackets (e.g. `<required>`) indicate required input. Square brackets (e.g. `[optional]`) indicate optional input.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.version('0.1.0')
|
||||
.arguments('<cmd> [env]')
|
||||
.action(function (cmd, env) {
|
||||
cmdValue = cmd;
|
||||
envValue = env;
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
if (typeof cmdValue === 'undefined') {
|
||||
console.error('no command given!');
|
||||
process.exit(1);
|
||||
}
|
||||
console.log('command:', cmdValue);
|
||||
console.log('environment:', envValue || "no environment given");
|
||||
```
|
||||
|
||||
The last argument of a command can be variadic, and only the last argument. To make an argument variadic you
|
||||
append `...` to the argument name. For example:
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.version('0.1.0')
|
||||
.command('rmdir <dir> [otherDirs...]')
|
||||
.action(function (dir, otherDirs) {
|
||||
console.log('rmdir %s', dir);
|
||||
if (otherDirs) {
|
||||
otherDirs.forEach(function (oDir) {
|
||||
console.log('rmdir %s', oDir);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
```
|
||||
|
||||
The variadic argument is passed to the action handler as an array.
|
||||
|
||||
### Action handler (sub)commands
|
||||
|
||||
You can add options to a command that uses an action handler.
|
||||
The action handler gets passed a parameter for each argument you declared, and one additional argument which is the
|
||||
command object itself. This command argument has the values for the command-specific options added as properties.
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.command('rm <dir>')
|
||||
.option('-r, --recursive', 'Remove recursively')
|
||||
.action(function (dir, cmdObj) {
|
||||
console.log('remove ' + dir + (cmdObj.recursive ? ' recursively' : ''))
|
||||
})
|
||||
|
||||
program.parse(process.argv)
|
||||
```
|
||||
|
||||
You may supply an `async` action handler, in which case you call `.parseAsync` rather than `.parse`.
|
||||
|
||||
```js
|
||||
async function run() { /* code goes here */ }
|
||||
|
||||
async function main() {
|
||||
program
|
||||
.command('run')
|
||||
.action(run);
|
||||
await program.parseAsync(process.argv);
|
||||
}
|
||||
```
|
||||
|
||||
A command's options on the command line are validated when the command is used. Any unknown options will be reported as an error.
|
||||
|
||||
### Stand-alone executable (sub)commands
|
||||
|
||||
When `.command()` is invoked with a description argument, this tells Commander that you're going to use stand-alone executables for subcommands.
|
||||
Commander will search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-subcommand`, like `pm-install`, `pm-search`.
|
||||
You can specify a custom name with the `executableFile` configuration option.
|
||||
|
||||
You handle the options for an executable (sub)command in the executable, and don't declare them at the top-level.
|
||||
|
||||
```js
|
||||
// file: ./examples/pm
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.version('0.1.0')
|
||||
.command('install [name]', 'install one or more packages')
|
||||
.command('search [query]', 'search with optional query')
|
||||
.command('update', 'update installed packages', {executableFile: 'myUpdateSubCommand'})
|
||||
.command('list', 'list packages installed', {isDefault: true})
|
||||
.parse(process.argv);
|
||||
```
|
||||
|
||||
If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
|
||||
|
||||
## Automated help
|
||||
|
||||
The help information is auto-generated based on the information commander already knows about your program. The default
|
||||
help option is `-h,--help`. ([example](./examples/pizza))
|
||||
|
||||
```bash
|
||||
$ node ./examples/pizza --help
|
||||
Usage: pizza [options]
|
||||
|
||||
An application for pizzas ordering
|
||||
|
||||
Options:
|
||||
-V, --version output the version number
|
||||
-p, --peppers Add peppers
|
||||
-c, --cheese <type> Add the specified type of cheese (default: "marble")
|
||||
-C, --no-cheese You do not want any cheese
|
||||
-h, --help display help for command
|
||||
```
|
||||
|
||||
A `help` command is added by default if your command has subcommands. It can be used alone, or with a subcommand name to show
|
||||
further help for the subcommand. These are effectively the same if the `shell` program has implicit help:
|
||||
|
||||
```bash
|
||||
shell help
|
||||
shell --help
|
||||
|
||||
shell help spawn
|
||||
shell spawn --help
|
||||
```
|
||||
|
||||
### Custom help
|
||||
|
||||
You can display extra information by listening for "--help". ([example](./examples/custom-help))
|
||||
|
||||
```js
|
||||
program
|
||||
.option('-f, --foo', 'enable some foo');
|
||||
|
||||
// must be before .parse()
|
||||
program.on('--help', () => {
|
||||
console.log('');
|
||||
console.log('Example call:');
|
||||
console.log(' $ custom-help --help');
|
||||
});
|
||||
```
|
||||
|
||||
Yields the following help output:
|
||||
|
||||
```Text
|
||||
Usage: custom-help [options]
|
||||
|
||||
Options:
|
||||
-f, --foo enable some foo
|
||||
-h, --help display help for command
|
||||
|
||||
Example call:
|
||||
$ custom-help --help
|
||||
```
|
||||
|
||||
### .usage and .name
|
||||
|
||||
These allow you to customise the usage description in the first line of the help. The name is otherwise
|
||||
deduced from the (full) program arguments. Given:
|
||||
|
||||
```js
|
||||
program
|
||||
.name("my-command")
|
||||
.usage("[global options] command")
|
||||
```
|
||||
|
||||
The help will start with:
|
||||
|
||||
```Text
|
||||
Usage: my-command [global options] command
|
||||
```
|
||||
|
||||
### .help(cb)
|
||||
|
||||
Output help information and exit immediately. Optional callback cb allows post-processing of help text before it is displayed.
|
||||
|
||||
### .outputHelp(cb)
|
||||
|
||||
Output help information without exiting.
|
||||
Optional callback cb allows post-processing of help text before it is displayed.
|
||||
|
||||
### .helpInformation()
|
||||
|
||||
Get the command help information as a string for processing or displaying yourself. (The text does not include the custom help
|
||||
from `--help` listeners.)
|
||||
|
||||
### .helpOption(flags, description)
|
||||
|
||||
Override the default help flags and description.
|
||||
|
||||
```js
|
||||
program
|
||||
.helpOption('-e, --HELP', 'read more information');
|
||||
```
|
||||
|
||||
### .addHelpCommand()
|
||||
|
||||
You can explicitly turn on or off the implicit help command with `.addHelpCommand()` and `.addHelpCommand(false)`.
|
||||
|
||||
You can both turn on and customise the help command by supplying the name and description:
|
||||
|
||||
```js
|
||||
program.addHelpCommand('assist [command]', 'show assistance');
|
||||
```
|
||||
|
||||
## Custom event listeners
|
||||
|
||||
You can execute custom actions by listening to command and option events.
|
||||
|
||||
```js
|
||||
program.on('option:verbose', function () {
|
||||
process.env.VERBOSE = this.verbose;
|
||||
});
|
||||
|
||||
program.on('command:*', function (operands) {
|
||||
console.error(`error: unknown command '${operands[0]}'`);
|
||||
const availableCommands = program.commands.map(cmd => cmd.name());
|
||||
mySuggestBestMatch(operands[0], availableCommands);
|
||||
process.exitCode = 1;
|
||||
});
|
||||
```
|
||||
|
||||
## Bits and pieces
|
||||
|
||||
### .parse() and .parseAsync()
|
||||
|
||||
The first argument to `.parse` is the array of strings to parse. You may omit the parameter to implicitly use `process.argv`.
|
||||
|
||||
If the arguments follow different conventions than node you can pass a `from` option in the second parameter:
|
||||
|
||||
- 'node': default, `argv[0]` is the application and `argv[1]` is the script being run, with user parameters after that
|
||||
- 'electron': `argv[1]` varies depending on whether the electron application is packaged
|
||||
- 'user': all of the arguments from the user
|
||||
|
||||
For example:
|
||||
|
||||
```js
|
||||
program.parse(process.argv); // Explicit, node conventions
|
||||
program.parse(); // Implicit, and auto-detect electron
|
||||
program.parse(['-f', 'filename'], { from: 'user' });
|
||||
```
|
||||
|
||||
### Avoiding option name clashes
|
||||
|
||||
The original and default behaviour is that the option values are stored
|
||||
as properties on the program, and the action handler is passed a
|
||||
command object with the options values stored as properties.
|
||||
This is very convenient to code, but the downside is possible clashes with
|
||||
existing properties of Command.
|
||||
|
||||
There are two new routines to change the behaviour, and the default behaviour may change in the future:
|
||||
|
||||
- `storeOptionsAsProperties`: whether to store option values as properties on command object, or store separately (specify false) and access using `.opts()`
|
||||
- `passCommandToAction`: whether to pass command to action handler,
|
||||
or just the options (specify false)
|
||||
|
||||
([example](./examples/storeOptionsAsProperties-action.js))
|
||||
|
||||
```js
|
||||
program
|
||||
.storeOptionsAsProperties(false)
|
||||
.passCommandToAction(false);
|
||||
|
||||
program
|
||||
.name('my-program-name')
|
||||
.option('-n,--name <name>');
|
||||
|
||||
program
|
||||
.command('show')
|
||||
.option('-a,--action <action>')
|
||||
.action((options) => {
|
||||
console.log(options.action);
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
const programOptions = program.opts();
|
||||
console.log(programOptions.name);
|
||||
```
|
||||
|
||||
### TypeScript
|
||||
|
||||
The Commander package includes its TypeScript Definition file.
|
||||
|
||||
If you use `ts-node` and stand-alone executable subcommands written as `.ts` files, you need to call your program through node to get the subcommands called correctly. e.g.
|
||||
|
||||
```bash
|
||||
node -r ts-node/register pm.ts
|
||||
```
|
||||
|
||||
### createCommand()
|
||||
|
||||
This factory function creates a new command. It is exported and may be used instead of using `new`, like:
|
||||
|
||||
```js
|
||||
const { createCommand } = require('commander');
|
||||
const program = createCommand();
|
||||
```
|
||||
|
||||
`createCommand` is also a method of the Command object, and creates a new command rather than a subcommand. This gets used internally
|
||||
when creating subcommands using `.command()`, and you may override it to
|
||||
customise the new subcommand (examples using [subclass](./examples/custom-command-class.js) and [function](./examples/custom-command-function.js)).
|
||||
|
||||
### Node options such as `--harmony`
|
||||
|
||||
You can enable `--harmony` option in two ways:
|
||||
|
||||
- Use `#! /usr/bin/env node --harmony` in the subcommands scripts. (Note Windows does not support this pattern.)
|
||||
- Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning subcommand process.
|
||||
|
||||
### Debugging stand-alone executable subcommands
|
||||
|
||||
An executable subcommand is launched as a separate child process.
|
||||
|
||||
If you are using the node inspector for [debugging](https://nodejs.org/en/docs/guides/debugging-getting-started/) executable subcommands using `node --inspect` et al,
|
||||
the inspector port is incremented by 1 for the spawned subcommand.
|
||||
|
||||
If you are using VSCode to debug executable subcommands you need to set the `"autoAttachChildProcesses": true` flag in your launch.json configuration.
|
||||
|
||||
### Override exit handling
|
||||
|
||||
By default Commander calls `process.exit` when it detects errors, or after displaying the help or version. You can override
|
||||
this behaviour and optionally supply a callback. The default override throws a `CommanderError`.
|
||||
|
||||
The override callback is passed a `CommanderError` with properties `exitCode` number, `code` string, and `message`. The default override behaviour is to throw the error, except for async handling of executable subcommand completion which carries on. The normal display of error messages or version or help
|
||||
is not affected by the override which is called after the display.
|
||||
|
||||
``` js
|
||||
program.exitOverride();
|
||||
|
||||
try {
|
||||
program.parse(process.argv);
|
||||
} catch (err) {
|
||||
// custom processing...
|
||||
}
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
```js
|
||||
const { program } = require('commander');
|
||||
|
||||
program
|
||||
.version('0.1.0')
|
||||
.option('-C, --chdir <path>', 'change the working directory')
|
||||
.option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
|
||||
.option('-T, --no-tests', 'ignore test hook');
|
||||
|
||||
program
|
||||
.command('setup [env]')
|
||||
.description('run setup commands for all envs')
|
||||
.option("-s, --setup_mode [mode]", "Which setup mode to use")
|
||||
.action(function(env, options){
|
||||
const mode = options.setup_mode || "normal";
|
||||
env = env || 'all';
|
||||
console.log('setup for %s env(s) with %s mode', env, mode);
|
||||
});
|
||||
|
||||
program
|
||||
.command('exec <cmd>')
|
||||
.alias('ex')
|
||||
.description('execute the given remote cmd')
|
||||
.option("-e, --exec_mode <mode>", "Which exec mode to use")
|
||||
.action(function(cmd, options){
|
||||
console.log('exec "%s" using %s mode', cmd, options.exec_mode);
|
||||
}).on('--help', function() {
|
||||
console.log('');
|
||||
console.log('Examples:');
|
||||
console.log('');
|
||||
console.log(' $ deploy exec sequential');
|
||||
console.log(' $ deploy exec async');
|
||||
});
|
||||
|
||||
program.parse(process.argv);
|
||||
```
|
||||
|
||||
More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
|
||||
|
||||
## License
|
||||
|
||||
[MIT](https://github.com/tj/commander.js/blob/master/LICENSE)
|
||||
|
||||
## Support
|
||||
|
||||
Commander 5.x is fully supported on Long Term Support versions of Node, and is likely to work with Node 6 but not tested.
|
||||
(For versions of Node below Node 6, use Commander 3.x or 2.x.)
|
||||
|
||||
The main forum for free and community support is the project [Issues](https://github.com/tj/commander.js/issues) on GitHub.
|
||||
|
||||
### Commander for enterprise
|
||||
|
||||
Available as part of the Tidelift Subscription
|
||||
|
||||
The maintainers of Commander and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-commander?utm_source=npm-commander&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
|
1756
node_modules/nunjucks/node_modules/commander/index.js
generated
vendored
Normal file
1756
node_modules/nunjucks/node_modules/commander/index.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
48
node_modules/nunjucks/node_modules/commander/package.json
generated
vendored
Normal file
48
node_modules/nunjucks/node_modules/commander/package.json
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "commander",
|
||||
"version": "5.1.0",
|
||||
"description": "the complete solution for node.js command-line programs",
|
||||
"keywords": [
|
||||
"commander",
|
||||
"command",
|
||||
"option",
|
||||
"parser",
|
||||
"cli",
|
||||
"argument",
|
||||
"args",
|
||||
"argv"
|
||||
],
|
||||
"author": "TJ Holowaychuk <tj@vision-media.ca>",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tj/commander.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint index.js \"tests/**/*.js\"",
|
||||
"typescript-lint": "eslint typings/*.ts",
|
||||
"test": "jest && npm run test-typings",
|
||||
"test-typings": "tsc -p tsconfig.json"
|
||||
},
|
||||
"main": "index",
|
||||
"files": [
|
||||
"index.js",
|
||||
"typings/index.d.ts"
|
||||
],
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^25.2.1",
|
||||
"@types/node": "^12.12.36",
|
||||
"@typescript-eslint/eslint-plugin": "^2.29.0",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-standard-with-typescript": "^15.0.1",
|
||||
"eslint-plugin-jest": "^23.8.2",
|
||||
"jest": "^25.4.0",
|
||||
"standard": "^14.3.3",
|
||||
"typescript": "^3.7.5"
|
||||
},
|
||||
"typings": "typings/index.d.ts",
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
}
|
386
node_modules/nunjucks/node_modules/commander/typings/index.d.ts
generated
vendored
Normal file
386
node_modules/nunjucks/node_modules/commander/typings/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,386 @@
|
||||
// Type definitions for commander
|
||||
// Original definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
|
||||
|
||||
declare namespace commander {
|
||||
|
||||
interface CommanderError extends Error {
|
||||
code: string;
|
||||
exitCode: number;
|
||||
message: string;
|
||||
nestedError?: string;
|
||||
}
|
||||
type CommanderErrorConstructor = new (exitCode: number, code: string, message: string) => CommanderError;
|
||||
|
||||
interface Option {
|
||||
flags: string;
|
||||
required: boolean; // A value must be supplied when the option is specified.
|
||||
optional: boolean; // A value is optional when the option is specified.
|
||||
mandatory: boolean; // The option must have a value after parsing, which usually means it must be specified on command line.
|
||||
bool: boolean;
|
||||
short?: string;
|
||||
long: string;
|
||||
description: string;
|
||||
}
|
||||
type OptionConstructor = new (flags: string, description?: string) => Option;
|
||||
|
||||
interface ParseOptions {
|
||||
from: 'node' | 'electron' | 'user';
|
||||
}
|
||||
|
||||
interface Command {
|
||||
[key: string]: any; // options as properties
|
||||
|
||||
args: string[];
|
||||
|
||||
commands: Command[];
|
||||
|
||||
/**
|
||||
* Set the program version to `str`.
|
||||
*
|
||||
* This method auto-registers the "-V, --version" flag
|
||||
* which will print the version number when passed.
|
||||
*
|
||||
* You can optionally supply the flags and description to override the defaults.
|
||||
*/
|
||||
version(str: string, flags?: string, description?: string): this;
|
||||
|
||||
/**
|
||||
* Define a command, implemented using an action handler.
|
||||
*
|
||||
* @remarks
|
||||
* The command description is supplied using `.description`, not as a parameter to `.command`.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* program
|
||||
* .command('clone <source> [destination]')
|
||||
* .description('clone a repository into a newly created directory')
|
||||
* .action((source, destination) => {
|
||||
* console.log('clone command called');
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @param nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
|
||||
* @param opts - configuration options
|
||||
* @returns new command
|
||||
*/
|
||||
command(nameAndArgs: string, opts?: CommandOptions): ReturnType<this['createCommand']>;
|
||||
/**
|
||||
* Define a command, implemented in a separate executable file.
|
||||
*
|
||||
* @remarks
|
||||
* The command description is supplied as the second parameter to `.command`.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* program
|
||||
* .command('start <service>', 'start named service')
|
||||
* .command('stop [service]', 'stop named serice, or all if no name supplied');
|
||||
* ```
|
||||
*
|
||||
* @param nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
|
||||
* @param description - description of executable command
|
||||
* @param opts - configuration options
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
command(nameAndArgs: string, description: string, opts?: commander.ExecutableCommandOptions): this;
|
||||
|
||||
/**
|
||||
* Factory routine to create a new unattached command.
|
||||
*
|
||||
* See .command() for creating an attached subcommand, which uses this routine to
|
||||
* create the command. You can override createCommand to customise subcommands.
|
||||
*/
|
||||
createCommand(name?: string): Command;
|
||||
|
||||
/**
|
||||
* Add a prepared subcommand.
|
||||
*
|
||||
* See .command() for creating an attached subcommand which inherits settings from its parent.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
addCommand(cmd: Command, opts?: CommandOptions): this;
|
||||
|
||||
/**
|
||||
* Define argument syntax for command.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
arguments(desc: string): this;
|
||||
|
||||
/**
|
||||
* Register callback to use as replacement for calling process.exit.
|
||||
*/
|
||||
exitOverride(callback?: (err: CommanderError) => never|void): this;
|
||||
|
||||
/**
|
||||
* Register callback `fn` for the command.
|
||||
*
|
||||
* @example
|
||||
* program
|
||||
* .command('help')
|
||||
* .description('display verbose help')
|
||||
* .action(function() {
|
||||
* // output help here
|
||||
* });
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
action(fn: (...args: any[]) => void | Promise<void>): this;
|
||||
|
||||
/**
|
||||
* Define option with `flags`, `description` and optional
|
||||
* coercion `fn`.
|
||||
*
|
||||
* The `flags` string should contain both the short and long flags,
|
||||
* separated by comma, a pipe or space. The following are all valid
|
||||
* all will output this way when `--help` is used.
|
||||
*
|
||||
* "-p, --pepper"
|
||||
* "-p|--pepper"
|
||||
* "-p --pepper"
|
||||
*
|
||||
* @example
|
||||
* // simple boolean defaulting to false
|
||||
* program.option('-p, --pepper', 'add pepper');
|
||||
*
|
||||
* --pepper
|
||||
* program.pepper
|
||||
* // => Boolean
|
||||
*
|
||||
* // simple boolean defaulting to true
|
||||
* program.option('-C, --no-cheese', 'remove cheese');
|
||||
*
|
||||
* program.cheese
|
||||
* // => true
|
||||
*
|
||||
* --no-cheese
|
||||
* program.cheese
|
||||
* // => false
|
||||
*
|
||||
* // required argument
|
||||
* program.option('-C, --chdir <path>', 'change the working directory');
|
||||
*
|
||||
* --chdir /tmp
|
||||
* program.chdir
|
||||
* // => "/tmp"
|
||||
*
|
||||
* // optional argument
|
||||
* program.option('-c, --cheese [type]', 'add cheese [marble]');
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
option(flags: string, description?: string, defaultValue?: string | boolean): this;
|
||||
option(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean): this;
|
||||
option<T>(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
|
||||
/**
|
||||
* Define a required option, which must have a value after parsing. This usually means
|
||||
* the option must be specified on the command line. (Otherwise the same as .option().)
|
||||
*
|
||||
* The `flags` string should contain both the short and long flags, separated by comma, a pipe or space.
|
||||
*/
|
||||
requiredOption(flags: string, description?: string, defaultValue?: string | boolean): this;
|
||||
requiredOption(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean): this;
|
||||
requiredOption<T>(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
|
||||
/**
|
||||
* Whether to store option values as properties on command object,
|
||||
* or store separately (specify false). In both cases the option values can be accessed using .opts().
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
storeOptionsAsProperties(value?: boolean): this;
|
||||
|
||||
/**
|
||||
* Whether to pass command to action handler,
|
||||
* or just the options (specify false).
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
passCommandToAction(value?: boolean): this;
|
||||
|
||||
/**
|
||||
* Allow unknown options on the command line.
|
||||
*
|
||||
* @param [arg] if `true` or omitted, no error will be thrown for unknown options.
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
allowUnknownOption(arg?: boolean): this;
|
||||
|
||||
/**
|
||||
* Parse `argv`, setting options and invoking commands when defined.
|
||||
*
|
||||
* The default expectation is that the arguments are from node and have the application as argv[0]
|
||||
* and the script being run in argv[1], with user parameters after that.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* program.parse(process.argv);
|
||||
* program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions
|
||||
* program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
parse(argv?: string[], options?: ParseOptions): this;
|
||||
|
||||
/**
|
||||
* Parse `argv`, setting options and invoking commands when defined.
|
||||
*
|
||||
* Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
|
||||
*
|
||||
* The default expectation is that the arguments are from node and have the application as argv[0]
|
||||
* and the script being run in argv[1], with user parameters after that.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* program.parseAsync(process.argv);
|
||||
* program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions
|
||||
* program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
*
|
||||
* @returns Promise
|
||||
*/
|
||||
parseAsync(argv?: string[], options?: ParseOptions): Promise<this>;
|
||||
|
||||
/**
|
||||
* Parse options from `argv` removing known options,
|
||||
* and return argv split into operands and unknown arguments.
|
||||
*
|
||||
* @example
|
||||
* argv => operands, unknown
|
||||
* --known kkk op => [op], []
|
||||
* op --known kkk => [op], []
|
||||
* sub --unknown uuu op => [sub], [--unknown uuu op]
|
||||
* sub -- --unknown uuu op => [sub --unknown uuu op], []
|
||||
*/
|
||||
parseOptions(argv: string[]): commander.ParseOptionsResult;
|
||||
|
||||
/**
|
||||
* Return an object containing options as key-value pairs
|
||||
*/
|
||||
opts(): { [key: string]: any };
|
||||
|
||||
/**
|
||||
* Set the description.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
description(str: string, argsDescription?: {[argName: string]: string}): this;
|
||||
/**
|
||||
* Get the description.
|
||||
*/
|
||||
description(): string;
|
||||
|
||||
/**
|
||||
* Set an alias for the command.
|
||||
*
|
||||
* You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
alias(alias: string): this;
|
||||
/**
|
||||
* Get alias for the command.
|
||||
*/
|
||||
alias(): string;
|
||||
|
||||
/**
|
||||
* Set aliases for the command.
|
||||
*
|
||||
* Only the first alias is shown in the auto-generated help.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
aliases(aliases: string[]): this;
|
||||
/**
|
||||
* Get aliases for the command.
|
||||
*/
|
||||
aliases(): string[];
|
||||
|
||||
/**
|
||||
* Set the command usage.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
usage(str: string): this;
|
||||
/**
|
||||
* Get the command usage.
|
||||
*/
|
||||
usage(): string;
|
||||
|
||||
/**
|
||||
* Set the name of the command.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
name(str: string): this;
|
||||
/**
|
||||
* Get the name of the command.
|
||||
*/
|
||||
name(): string;
|
||||
|
||||
/**
|
||||
* Output help information for this command.
|
||||
*
|
||||
* When listener(s) are available for the helpLongFlag
|
||||
* those callbacks are invoked.
|
||||
*/
|
||||
outputHelp(cb?: (str: string) => string): void;
|
||||
|
||||
/**
|
||||
* Return command help documentation.
|
||||
*/
|
||||
helpInformation(): string;
|
||||
|
||||
/**
|
||||
* You can pass in flags and a description to override the help
|
||||
* flags and help description for your command.
|
||||
*/
|
||||
helpOption(flags?: string, description?: string): this;
|
||||
|
||||
/**
|
||||
* Output help information and exit.
|
||||
*/
|
||||
help(cb?: (str: string) => string): never;
|
||||
|
||||
/**
|
||||
* Add a listener (callback) for when events occur. (Implemented using EventEmitter.)
|
||||
*
|
||||
* @example
|
||||
* program
|
||||
* .on('--help', () -> {
|
||||
* console.log('See web site for more information.');
|
||||
* });
|
||||
*/
|
||||
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
}
|
||||
type CommandConstructor = new (name?: string) => Command;
|
||||
|
||||
interface CommandOptions {
|
||||
noHelp?: boolean; // old name for hidden
|
||||
hidden?: boolean;
|
||||
isDefault?: boolean;
|
||||
}
|
||||
interface ExecutableCommandOptions extends CommandOptions {
|
||||
executableFile?: string;
|
||||
}
|
||||
|
||||
interface ParseOptionsResult {
|
||||
operands: string[];
|
||||
unknown: string[];
|
||||
}
|
||||
|
||||
interface CommanderStatic extends Command {
|
||||
program: Command;
|
||||
Command: CommandConstructor;
|
||||
Option: OptionConstructor;
|
||||
CommanderError: CommanderErrorConstructor;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Declaring namespace AND global
|
||||
// eslint-disable-next-line no-redeclare
|
||||
declare const commander: commander.CommanderStatic;
|
||||
export = commander;
|
112
node_modules/nunjucks/package.json
generated
vendored
Normal file
112
node_modules/nunjucks/package.json
generated
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"name": "nunjucks",
|
||||
"description": "A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)",
|
||||
"version": "3.2.4",
|
||||
"author": "James Long <longster@gmail.com>",
|
||||
"dependencies": {
|
||||
"a-sync-waterfall": "^1.0.0",
|
||||
"asap": "^2.0.3",
|
||||
"commander": "^5.1.0"
|
||||
},
|
||||
"browser": "./browser/nunjucks.js",
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.0.0-beta.38",
|
||||
"@babel/core": "^7.0.0-beta.38",
|
||||
"@babel/preset-env": "^7.0.0-beta.38",
|
||||
"@babel/register": "^7.0.0-beta.38",
|
||||
"babel-loader": "^8.0.0-beta.0",
|
||||
"babel-plugin-istanbul": "^4.1.5",
|
||||
"babel-plugin-module-resolver": "3.0.0-beta.5",
|
||||
"connect": "^3.6.5",
|
||||
"core-js": "^2.5.3",
|
||||
"cross-env": "^5.1.3",
|
||||
"eslint": "^4.13.0",
|
||||
"eslint-config-airbnb-base": "^12.1.0",
|
||||
"eslint-plugin-import": "^2.8.0",
|
||||
"expect.js": "*",
|
||||
"express": "4.x",
|
||||
"fs-extra": "^5.0.0",
|
||||
"get-port": "^3.2.0",
|
||||
"mocha": "< 8.x",
|
||||
"mocha-phantomjs-core": "^2.1.2",
|
||||
"mocha-phantomjs-istanbul": "0.0.2",
|
||||
"module-alias": "^2.0.3",
|
||||
"node-libs-browser": "^0.7.0",
|
||||
"nyc": "^11.4.1",
|
||||
"phantomjs-prebuilt": "^2.1.16",
|
||||
"serve-static": "^1.13.1",
|
||||
"supertest": "*",
|
||||
"uglify-js": "^2.8.29",
|
||||
"uglifyjs-webpack-plugin": "^1.1.6",
|
||||
"webpack": "^3.10.0"
|
||||
},
|
||||
"buildDependencies": {
|
||||
"@babel/cli": "^7.0.0-beta.38",
|
||||
"@babel/core": "^7.0.0-beta.38",
|
||||
"@babel/preset-env": "^7.0.0-beta.38",
|
||||
"@babel/register": "^7.0.0-beta.38",
|
||||
"babel-loader": "^8.0.0-beta.0",
|
||||
"babel-plugin-istanbul": "^4.1.5",
|
||||
"babel-plugin-module-resolver": "3.0.0-beta.5",
|
||||
"core-js": "^2.5.3",
|
||||
"module-alias": "^2.0.3",
|
||||
"node-libs-browser": "^0.7.0",
|
||||
"uglify-js": "^2.8.29",
|
||||
"uglifyjs-webpack-plugin": "^1.1.6",
|
||||
"webpack": "^3.10.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"chokidar": "^3.3.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"chokidar": {
|
||||
"optional": true
|
||||
}
|
||||
},
|
||||
"_moduleAliases": {
|
||||
"babel-register": "@babel/register"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6.9.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build:transpile": "babel nunjucks --out-dir .",
|
||||
"build:bundle": "node scripts/bundle.js",
|
||||
"build": "npm run build:transpile && npm run build:bundle",
|
||||
"codecov": "codecov",
|
||||
"mocha": "mocha -R spec tests",
|
||||
"lint": "eslint nunjucks scripts tests",
|
||||
"prepare": "npm run build",
|
||||
"test:instrument": "cross-env NODE_ENV=test scripts/bundle.js",
|
||||
"test:runner": "cross-env NODE_ENV=test NODE_PATH=tests/test-node-pkgs scripts/testrunner.js",
|
||||
"test": "npm run lint && npm run test:instrument && npm run test:runner"
|
||||
},
|
||||
"bin": {
|
||||
"nunjucks-precompile": "./bin/precompile"
|
||||
},
|
||||
"main": "index.js",
|
||||
"files": [
|
||||
"bin/**",
|
||||
"browser/**",
|
||||
"src/**"
|
||||
],
|
||||
"nyc": {
|
||||
"require": [
|
||||
"babel-register"
|
||||
],
|
||||
"sourceMap": false,
|
||||
"instrument": false
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mozilla/nunjucks.git"
|
||||
},
|
||||
"keywords": [
|
||||
"template",
|
||||
"templating"
|
||||
],
|
||||
"license": "BSD-2-Clause",
|
||||
"bugs": {
|
||||
"url": "https://github.com/mozilla/nunjucks/issues"
|
||||
}
|
||||
}
|
1027
node_modules/nunjucks/src/compiler.js
generated
vendored
Normal file
1027
node_modules/nunjucks/src/compiler.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
548
node_modules/nunjucks/src/environment.js
generated
vendored
Normal file
548
node_modules/nunjucks/src/environment.js
generated
vendored
Normal file
@@ -0,0 +1,548 @@
|
||||
'use strict';
|
||||
|
||||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
var asap = require('asap');
|
||||
var _waterfall = require('a-sync-waterfall');
|
||||
var lib = require('./lib');
|
||||
var compiler = require('./compiler');
|
||||
var filters = require('./filters');
|
||||
var _require = require('./loaders'),
|
||||
FileSystemLoader = _require.FileSystemLoader,
|
||||
WebLoader = _require.WebLoader,
|
||||
PrecompiledLoader = _require.PrecompiledLoader;
|
||||
var tests = require('./tests');
|
||||
var globals = require('./globals');
|
||||
var _require2 = require('./object'),
|
||||
Obj = _require2.Obj,
|
||||
EmitterObj = _require2.EmitterObj;
|
||||
var globalRuntime = require('./runtime');
|
||||
var handleError = globalRuntime.handleError,
|
||||
Frame = globalRuntime.Frame;
|
||||
var expressApp = require('./express-app');
|
||||
|
||||
// If the user is using the async API, *always* call it
|
||||
// asynchronously even if the template was synchronous.
|
||||
function callbackAsap(cb, err, res) {
|
||||
asap(function () {
|
||||
cb(err, res);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* A no-op template, for use with {% include ignore missing %}
|
||||
*/
|
||||
var noopTmplSrc = {
|
||||
type: 'code',
|
||||
obj: {
|
||||
root: function root(env, context, frame, runtime, cb) {
|
||||
try {
|
||||
cb(null, '');
|
||||
} catch (e) {
|
||||
cb(handleError(e, null, null));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
var Environment = /*#__PURE__*/function (_EmitterObj) {
|
||||
_inheritsLoose(Environment, _EmitterObj);
|
||||
function Environment() {
|
||||
return _EmitterObj.apply(this, arguments) || this;
|
||||
}
|
||||
var _proto = Environment.prototype;
|
||||
_proto.init = function init(loaders, opts) {
|
||||
var _this = this;
|
||||
// The dev flag determines the trace that'll be shown on errors.
|
||||
// If set to true, returns the full trace from the error point,
|
||||
// otherwise will return trace starting from Template.render
|
||||
// (the full trace from within nunjucks may confuse developers using
|
||||
// the library)
|
||||
// defaults to false
|
||||
opts = this.opts = opts || {};
|
||||
this.opts.dev = !!opts.dev;
|
||||
|
||||
// The autoescape flag sets global autoescaping. If true,
|
||||
// every string variable will be escaped by default.
|
||||
// If false, strings can be manually escaped using the `escape` filter.
|
||||
// defaults to true
|
||||
this.opts.autoescape = opts.autoescape != null ? opts.autoescape : true;
|
||||
|
||||
// If true, this will make the system throw errors if trying
|
||||
// to output a null or undefined value
|
||||
this.opts.throwOnUndefined = !!opts.throwOnUndefined;
|
||||
this.opts.trimBlocks = !!opts.trimBlocks;
|
||||
this.opts.lstripBlocks = !!opts.lstripBlocks;
|
||||
this.loaders = [];
|
||||
if (!loaders) {
|
||||
// The filesystem loader is only available server-side
|
||||
if (FileSystemLoader) {
|
||||
this.loaders = [new FileSystemLoader('views')];
|
||||
} else if (WebLoader) {
|
||||
this.loaders = [new WebLoader('/views')];
|
||||
}
|
||||
} else {
|
||||
this.loaders = lib.isArray(loaders) ? loaders : [loaders];
|
||||
}
|
||||
|
||||
// It's easy to use precompiled templates: just include them
|
||||
// before you configure nunjucks and this will automatically
|
||||
// pick it up and use it
|
||||
if (typeof window !== 'undefined' && window.nunjucksPrecompiled) {
|
||||
this.loaders.unshift(new PrecompiledLoader(window.nunjucksPrecompiled));
|
||||
}
|
||||
this._initLoaders();
|
||||
this.globals = globals();
|
||||
this.filters = {};
|
||||
this.tests = {};
|
||||
this.asyncFilters = [];
|
||||
this.extensions = {};
|
||||
this.extensionsList = [];
|
||||
lib._entries(filters).forEach(function (_ref) {
|
||||
var name = _ref[0],
|
||||
filter = _ref[1];
|
||||
return _this.addFilter(name, filter);
|
||||
});
|
||||
lib._entries(tests).forEach(function (_ref2) {
|
||||
var name = _ref2[0],
|
||||
test = _ref2[1];
|
||||
return _this.addTest(name, test);
|
||||
});
|
||||
};
|
||||
_proto._initLoaders = function _initLoaders() {
|
||||
var _this2 = this;
|
||||
this.loaders.forEach(function (loader) {
|
||||
// Caching and cache busting
|
||||
loader.cache = {};
|
||||
if (typeof loader.on === 'function') {
|
||||
loader.on('update', function (name, fullname) {
|
||||
loader.cache[name] = null;
|
||||
_this2.emit('update', name, fullname, loader);
|
||||
});
|
||||
loader.on('load', function (name, source) {
|
||||
_this2.emit('load', name, source, loader);
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
_proto.invalidateCache = function invalidateCache() {
|
||||
this.loaders.forEach(function (loader) {
|
||||
loader.cache = {};
|
||||
});
|
||||
};
|
||||
_proto.addExtension = function addExtension(name, extension) {
|
||||
extension.__name = name;
|
||||
this.extensions[name] = extension;
|
||||
this.extensionsList.push(extension);
|
||||
return this;
|
||||
};
|
||||
_proto.removeExtension = function removeExtension(name) {
|
||||
var extension = this.getExtension(name);
|
||||
if (!extension) {
|
||||
return;
|
||||
}
|
||||
this.extensionsList = lib.without(this.extensionsList, extension);
|
||||
delete this.extensions[name];
|
||||
};
|
||||
_proto.getExtension = function getExtension(name) {
|
||||
return this.extensions[name];
|
||||
};
|
||||
_proto.hasExtension = function hasExtension(name) {
|
||||
return !!this.extensions[name];
|
||||
};
|
||||
_proto.addGlobal = function addGlobal(name, value) {
|
||||
this.globals[name] = value;
|
||||
return this;
|
||||
};
|
||||
_proto.getGlobal = function getGlobal(name) {
|
||||
if (typeof this.globals[name] === 'undefined') {
|
||||
throw new Error('global not found: ' + name);
|
||||
}
|
||||
return this.globals[name];
|
||||
};
|
||||
_proto.addFilter = function addFilter(name, func, async) {
|
||||
var wrapped = func;
|
||||
if (async) {
|
||||
this.asyncFilters.push(name);
|
||||
}
|
||||
this.filters[name] = wrapped;
|
||||
return this;
|
||||
};
|
||||
_proto.getFilter = function getFilter(name) {
|
||||
if (!this.filters[name]) {
|
||||
throw new Error('filter not found: ' + name);
|
||||
}
|
||||
return this.filters[name];
|
||||
};
|
||||
_proto.addTest = function addTest(name, func) {
|
||||
this.tests[name] = func;
|
||||
return this;
|
||||
};
|
||||
_proto.getTest = function getTest(name) {
|
||||
if (!this.tests[name]) {
|
||||
throw new Error('test not found: ' + name);
|
||||
}
|
||||
return this.tests[name];
|
||||
};
|
||||
_proto.resolveTemplate = function resolveTemplate(loader, parentName, filename) {
|
||||
var isRelative = loader.isRelative && parentName ? loader.isRelative(filename) : false;
|
||||
return isRelative && loader.resolve ? loader.resolve(parentName, filename) : filename;
|
||||
};
|
||||
_proto.getTemplate = function getTemplate(name, eagerCompile, parentName, ignoreMissing, cb) {
|
||||
var _this3 = this;
|
||||
var that = this;
|
||||
var tmpl = null;
|
||||
if (name && name.raw) {
|
||||
// this fixes autoescape for templates referenced in symbols
|
||||
name = name.raw;
|
||||
}
|
||||
if (lib.isFunction(parentName)) {
|
||||
cb = parentName;
|
||||
parentName = null;
|
||||
eagerCompile = eagerCompile || false;
|
||||
}
|
||||
if (lib.isFunction(eagerCompile)) {
|
||||
cb = eagerCompile;
|
||||
eagerCompile = false;
|
||||
}
|
||||
if (name instanceof Template) {
|
||||
tmpl = name;
|
||||
} else if (typeof name !== 'string') {
|
||||
throw new Error('template names must be a string: ' + name);
|
||||
} else {
|
||||
for (var i = 0; i < this.loaders.length; i++) {
|
||||
var loader = this.loaders[i];
|
||||
tmpl = loader.cache[this.resolveTemplate(loader, parentName, name)];
|
||||
if (tmpl) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tmpl) {
|
||||
if (eagerCompile) {
|
||||
tmpl.compile();
|
||||
}
|
||||
if (cb) {
|
||||
cb(null, tmpl);
|
||||
return undefined;
|
||||
} else {
|
||||
return tmpl;
|
||||
}
|
||||
}
|
||||
var syncResult;
|
||||
var createTemplate = function createTemplate(err, info) {
|
||||
if (!info && !err && !ignoreMissing) {
|
||||
err = new Error('template not found: ' + name);
|
||||
}
|
||||
if (err) {
|
||||
if (cb) {
|
||||
cb(err);
|
||||
return;
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
var newTmpl;
|
||||
if (!info) {
|
||||
newTmpl = new Template(noopTmplSrc, _this3, '', eagerCompile);
|
||||
} else {
|
||||
newTmpl = new Template(info.src, _this3, info.path, eagerCompile);
|
||||
if (!info.noCache) {
|
||||
info.loader.cache[name] = newTmpl;
|
||||
}
|
||||
}
|
||||
if (cb) {
|
||||
cb(null, newTmpl);
|
||||
} else {
|
||||
syncResult = newTmpl;
|
||||
}
|
||||
};
|
||||
lib.asyncIter(this.loaders, function (loader, i, next, done) {
|
||||
function handle(err, src) {
|
||||
if (err) {
|
||||
done(err);
|
||||
} else if (src) {
|
||||
src.loader = loader;
|
||||
done(null, src);
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
// Resolve name relative to parentName
|
||||
name = that.resolveTemplate(loader, parentName, name);
|
||||
if (loader.async) {
|
||||
loader.getSource(name, handle);
|
||||
} else {
|
||||
handle(null, loader.getSource(name));
|
||||
}
|
||||
}, createTemplate);
|
||||
return syncResult;
|
||||
};
|
||||
_proto.express = function express(app) {
|
||||
return expressApp(this, app);
|
||||
};
|
||||
_proto.render = function render(name, ctx, cb) {
|
||||
if (lib.isFunction(ctx)) {
|
||||
cb = ctx;
|
||||
ctx = null;
|
||||
}
|
||||
|
||||
// We support a synchronous API to make it easier to migrate
|
||||
// existing code to async. This works because if you don't do
|
||||
// anything async work, the whole thing is actually run
|
||||
// synchronously.
|
||||
var syncResult = null;
|
||||
this.getTemplate(name, function (err, tmpl) {
|
||||
if (err && cb) {
|
||||
callbackAsap(cb, err);
|
||||
} else if (err) {
|
||||
throw err;
|
||||
} else {
|
||||
syncResult = tmpl.render(ctx, cb);
|
||||
}
|
||||
});
|
||||
return syncResult;
|
||||
};
|
||||
_proto.renderString = function renderString(src, ctx, opts, cb) {
|
||||
if (lib.isFunction(opts)) {
|
||||
cb = opts;
|
||||
opts = {};
|
||||
}
|
||||
opts = opts || {};
|
||||
var tmpl = new Template(src, this, opts.path);
|
||||
return tmpl.render(ctx, cb);
|
||||
};
|
||||
_proto.waterfall = function waterfall(tasks, callback, forceAsync) {
|
||||
return _waterfall(tasks, callback, forceAsync);
|
||||
};
|
||||
return Environment;
|
||||
}(EmitterObj);
|
||||
var Context = /*#__PURE__*/function (_Obj) {
|
||||
_inheritsLoose(Context, _Obj);
|
||||
function Context() {
|
||||
return _Obj.apply(this, arguments) || this;
|
||||
}
|
||||
var _proto2 = Context.prototype;
|
||||
_proto2.init = function init(ctx, blocks, env) {
|
||||
var _this4 = this;
|
||||
// Has to be tied to an environment so we can tap into its globals.
|
||||
this.env = env || new Environment();
|
||||
|
||||
// Make a duplicate of ctx
|
||||
this.ctx = lib.extend({}, ctx);
|
||||
this.blocks = {};
|
||||
this.exported = [];
|
||||
lib.keys(blocks).forEach(function (name) {
|
||||
_this4.addBlock(name, blocks[name]);
|
||||
});
|
||||
};
|
||||
_proto2.lookup = function lookup(name) {
|
||||
// This is one of the most called functions, so optimize for
|
||||
// the typical case where the name isn't in the globals
|
||||
if (name in this.env.globals && !(name in this.ctx)) {
|
||||
return this.env.globals[name];
|
||||
} else {
|
||||
return this.ctx[name];
|
||||
}
|
||||
};
|
||||
_proto2.setVariable = function setVariable(name, val) {
|
||||
this.ctx[name] = val;
|
||||
};
|
||||
_proto2.getVariables = function getVariables() {
|
||||
return this.ctx;
|
||||
};
|
||||
_proto2.addBlock = function addBlock(name, block) {
|
||||
this.blocks[name] = this.blocks[name] || [];
|
||||
this.blocks[name].push(block);
|
||||
return this;
|
||||
};
|
||||
_proto2.getBlock = function getBlock(name) {
|
||||
if (!this.blocks[name]) {
|
||||
throw new Error('unknown block "' + name + '"');
|
||||
}
|
||||
return this.blocks[name][0];
|
||||
};
|
||||
_proto2.getSuper = function getSuper(env, name, block, frame, runtime, cb) {
|
||||
var idx = lib.indexOf(this.blocks[name] || [], block);
|
||||
var blk = this.blocks[name][idx + 1];
|
||||
var context = this;
|
||||
if (idx === -1 || !blk) {
|
||||
throw new Error('no super block available for "' + name + '"');
|
||||
}
|
||||
blk(env, context, frame, runtime, cb);
|
||||
};
|
||||
_proto2.addExport = function addExport(name) {
|
||||
this.exported.push(name);
|
||||
};
|
||||
_proto2.getExported = function getExported() {
|
||||
var _this5 = this;
|
||||
var exported = {};
|
||||
this.exported.forEach(function (name) {
|
||||
exported[name] = _this5.ctx[name];
|
||||
});
|
||||
return exported;
|
||||
};
|
||||
return Context;
|
||||
}(Obj);
|
||||
var Template = /*#__PURE__*/function (_Obj2) {
|
||||
_inheritsLoose(Template, _Obj2);
|
||||
function Template() {
|
||||
return _Obj2.apply(this, arguments) || this;
|
||||
}
|
||||
var _proto3 = Template.prototype;
|
||||
_proto3.init = function init(src, env, path, eagerCompile) {
|
||||
this.env = env || new Environment();
|
||||
if (lib.isObject(src)) {
|
||||
switch (src.type) {
|
||||
case 'code':
|
||||
this.tmplProps = src.obj;
|
||||
break;
|
||||
case 'string':
|
||||
this.tmplStr = src.obj;
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unexpected template object type " + src.type + "; expected 'code', or 'string'");
|
||||
}
|
||||
} else if (lib.isString(src)) {
|
||||
this.tmplStr = src;
|
||||
} else {
|
||||
throw new Error('src must be a string or an object describing the source');
|
||||
}
|
||||
this.path = path;
|
||||
if (eagerCompile) {
|
||||
try {
|
||||
this._compile();
|
||||
} catch (err) {
|
||||
throw lib._prettifyError(this.path, this.env.opts.dev, err);
|
||||
}
|
||||
} else {
|
||||
this.compiled = false;
|
||||
}
|
||||
};
|
||||
_proto3.render = function render(ctx, parentFrame, cb) {
|
||||
var _this6 = this;
|
||||
if (typeof ctx === 'function') {
|
||||
cb = ctx;
|
||||
ctx = {};
|
||||
} else if (typeof parentFrame === 'function') {
|
||||
cb = parentFrame;
|
||||
parentFrame = null;
|
||||
}
|
||||
|
||||
// If there is a parent frame, we are being called from internal
|
||||
// code of another template, and the internal system
|
||||
// depends on the sync/async nature of the parent template
|
||||
// to be inherited, so force an async callback
|
||||
var forceAsync = !parentFrame;
|
||||
|
||||
// Catch compile errors for async rendering
|
||||
try {
|
||||
this.compile();
|
||||
} catch (e) {
|
||||
var err = lib._prettifyError(this.path, this.env.opts.dev, e);
|
||||
if (cb) {
|
||||
return callbackAsap(cb, err);
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
var context = new Context(ctx || {}, this.blocks, this.env);
|
||||
var frame = parentFrame ? parentFrame.push(true) : new Frame();
|
||||
frame.topLevel = true;
|
||||
var syncResult = null;
|
||||
var didError = false;
|
||||
this.rootRenderFunc(this.env, context, frame, globalRuntime, function (err, res) {
|
||||
// TODO: this is actually a bug in the compiled template (because waterfall
|
||||
// tasks are both not passing errors up the chain of callbacks AND are not
|
||||
// causing a return from the top-most render function). But fixing that
|
||||
// will require a more substantial change to the compiler.
|
||||
if (didError && cb && typeof res !== 'undefined') {
|
||||
// prevent multiple calls to cb
|
||||
return;
|
||||
}
|
||||
if (err) {
|
||||
err = lib._prettifyError(_this6.path, _this6.env.opts.dev, err);
|
||||
didError = true;
|
||||
}
|
||||
if (cb) {
|
||||
if (forceAsync) {
|
||||
callbackAsap(cb, err, res);
|
||||
} else {
|
||||
cb(err, res);
|
||||
}
|
||||
} else {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
syncResult = res;
|
||||
}
|
||||
});
|
||||
return syncResult;
|
||||
};
|
||||
_proto3.getExported = function getExported(ctx, parentFrame, cb) {
|
||||
// eslint-disable-line consistent-return
|
||||
if (typeof ctx === 'function') {
|
||||
cb = ctx;
|
||||
ctx = {};
|
||||
}
|
||||
if (typeof parentFrame === 'function') {
|
||||
cb = parentFrame;
|
||||
parentFrame = null;
|
||||
}
|
||||
|
||||
// Catch compile errors for async rendering
|
||||
try {
|
||||
this.compile();
|
||||
} catch (e) {
|
||||
if (cb) {
|
||||
return cb(e);
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
var frame = parentFrame ? parentFrame.push() : new Frame();
|
||||
frame.topLevel = true;
|
||||
|
||||
// Run the rootRenderFunc to populate the context with exported vars
|
||||
var context = new Context(ctx || {}, this.blocks, this.env);
|
||||
this.rootRenderFunc(this.env, context, frame, globalRuntime, function (err) {
|
||||
if (err) {
|
||||
cb(err, null);
|
||||
} else {
|
||||
cb(null, context.getExported());
|
||||
}
|
||||
});
|
||||
};
|
||||
_proto3.compile = function compile() {
|
||||
if (!this.compiled) {
|
||||
this._compile();
|
||||
}
|
||||
};
|
||||
_proto3._compile = function _compile() {
|
||||
var props;
|
||||
if (this.tmplProps) {
|
||||
props = this.tmplProps;
|
||||
} else {
|
||||
var source = compiler.compile(this.tmplStr, this.env.asyncFilters, this.env.extensionsList, this.path, this.env.opts);
|
||||
var func = new Function(source); // eslint-disable-line no-new-func
|
||||
props = func();
|
||||
}
|
||||
this.blocks = this._getBlocks(props);
|
||||
this.rootRenderFunc = props.root;
|
||||
this.compiled = true;
|
||||
};
|
||||
_proto3._getBlocks = function _getBlocks(props) {
|
||||
var blocks = {};
|
||||
lib.keys(props).forEach(function (k) {
|
||||
if (k.slice(0, 2) === 'b_') {
|
||||
blocks[k.slice(2)] = props[k];
|
||||
}
|
||||
});
|
||||
return blocks;
|
||||
};
|
||||
return Template;
|
||||
}(Obj);
|
||||
module.exports = {
|
||||
Environment: Environment,
|
||||
Template: Template
|
||||
};
|
23
node_modules/nunjucks/src/express-app.js
generated
vendored
Normal file
23
node_modules/nunjucks/src/express-app.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
"use strict";
|
||||
|
||||
var path = require('path');
|
||||
module.exports = function express(env, app) {
|
||||
function NunjucksView(name, opts) {
|
||||
this.name = name;
|
||||
this.path = name;
|
||||
this.defaultEngine = opts.defaultEngine;
|
||||
this.ext = path.extname(name);
|
||||
if (!this.ext && !this.defaultEngine) {
|
||||
throw new Error('No default engine was specified and no extension was provided.');
|
||||
}
|
||||
if (!this.ext) {
|
||||
this.name += this.ext = (this.defaultEngine[0] !== '.' ? '.' : '') + this.defaultEngine;
|
||||
}
|
||||
}
|
||||
NunjucksView.prototype.render = function render(opts, cb) {
|
||||
env.render(this.name, opts, cb);
|
||||
};
|
||||
app.set('view', NunjucksView);
|
||||
app.set('nunjucksEnv', env);
|
||||
return env;
|
||||
};
|
546
node_modules/nunjucks/src/filters.js
generated
vendored
Normal file
546
node_modules/nunjucks/src/filters.js
generated
vendored
Normal file
@@ -0,0 +1,546 @@
|
||||
'use strict';
|
||||
|
||||
var lib = require('./lib');
|
||||
var r = require('./runtime');
|
||||
var _exports = module.exports = {};
|
||||
function normalize(value, defaultValue) {
|
||||
if (value === null || value === undefined || value === false) {
|
||||
return defaultValue;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
_exports.abs = Math.abs;
|
||||
function isNaN(num) {
|
||||
return num !== num; // eslint-disable-line no-self-compare
|
||||
}
|
||||
|
||||
function batch(arr, linecount, fillWith) {
|
||||
var i;
|
||||
var res = [];
|
||||
var tmp = [];
|
||||
for (i = 0; i < arr.length; i++) {
|
||||
if (i % linecount === 0 && tmp.length) {
|
||||
res.push(tmp);
|
||||
tmp = [];
|
||||
}
|
||||
tmp.push(arr[i]);
|
||||
}
|
||||
if (tmp.length) {
|
||||
if (fillWith) {
|
||||
for (i = tmp.length; i < linecount; i++) {
|
||||
tmp.push(fillWith);
|
||||
}
|
||||
}
|
||||
res.push(tmp);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
_exports.batch = batch;
|
||||
function capitalize(str) {
|
||||
str = normalize(str, '');
|
||||
var ret = str.toLowerCase();
|
||||
return r.copySafeness(str, ret.charAt(0).toUpperCase() + ret.slice(1));
|
||||
}
|
||||
_exports.capitalize = capitalize;
|
||||
function center(str, width) {
|
||||
str = normalize(str, '');
|
||||
width = width || 80;
|
||||
if (str.length >= width) {
|
||||
return str;
|
||||
}
|
||||
var spaces = width - str.length;
|
||||
var pre = lib.repeat(' ', spaces / 2 - spaces % 2);
|
||||
var post = lib.repeat(' ', spaces / 2);
|
||||
return r.copySafeness(str, pre + str + post);
|
||||
}
|
||||
_exports.center = center;
|
||||
function default_(val, def, bool) {
|
||||
if (bool) {
|
||||
return val || def;
|
||||
} else {
|
||||
return val !== undefined ? val : def;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: it is confusing to export something called 'default'
|
||||
_exports['default'] = default_; // eslint-disable-line dot-notation
|
||||
|
||||
function dictsort(val, caseSensitive, by) {
|
||||
if (!lib.isObject(val)) {
|
||||
throw new lib.TemplateError('dictsort filter: val must be an object');
|
||||
}
|
||||
var array = [];
|
||||
// deliberately include properties from the object's prototype
|
||||
for (var k in val) {
|
||||
// eslint-disable-line guard-for-in, no-restricted-syntax
|
||||
array.push([k, val[k]]);
|
||||
}
|
||||
var si;
|
||||
if (by === undefined || by === 'key') {
|
||||
si = 0;
|
||||
} else if (by === 'value') {
|
||||
si = 1;
|
||||
} else {
|
||||
throw new lib.TemplateError('dictsort filter: You can only sort by either key or value');
|
||||
}
|
||||
array.sort(function (t1, t2) {
|
||||
var a = t1[si];
|
||||
var b = t2[si];
|
||||
if (!caseSensitive) {
|
||||
if (lib.isString(a)) {
|
||||
a = a.toUpperCase();
|
||||
}
|
||||
if (lib.isString(b)) {
|
||||
b = b.toUpperCase();
|
||||
}
|
||||
}
|
||||
return a > b ? 1 : a === b ? 0 : -1; // eslint-disable-line no-nested-ternary
|
||||
});
|
||||
|
||||
return array;
|
||||
}
|
||||
_exports.dictsort = dictsort;
|
||||
function dump(obj, spaces) {
|
||||
return JSON.stringify(obj, null, spaces);
|
||||
}
|
||||
_exports.dump = dump;
|
||||
function escape(str) {
|
||||
if (str instanceof r.SafeString) {
|
||||
return str;
|
||||
}
|
||||
str = str === null || str === undefined ? '' : str;
|
||||
return r.markSafe(lib.escape(str.toString()));
|
||||
}
|
||||
_exports.escape = escape;
|
||||
function safe(str) {
|
||||
if (str instanceof r.SafeString) {
|
||||
return str;
|
||||
}
|
||||
str = str === null || str === undefined ? '' : str;
|
||||
return r.markSafe(str.toString());
|
||||
}
|
||||
_exports.safe = safe;
|
||||
function first(arr) {
|
||||
return arr[0];
|
||||
}
|
||||
_exports.first = first;
|
||||
function forceescape(str) {
|
||||
str = str === null || str === undefined ? '' : str;
|
||||
return r.markSafe(lib.escape(str.toString()));
|
||||
}
|
||||
_exports.forceescape = forceescape;
|
||||
function groupby(arr, attr) {
|
||||
return lib.groupBy(arr, attr, this.env.opts.throwOnUndefined);
|
||||
}
|
||||
_exports.groupby = groupby;
|
||||
function indent(str, width, indentfirst) {
|
||||
str = normalize(str, '');
|
||||
if (str === '') {
|
||||
return '';
|
||||
}
|
||||
width = width || 4;
|
||||
// let res = '';
|
||||
var lines = str.split('\n');
|
||||
var sp = lib.repeat(' ', width);
|
||||
var res = lines.map(function (l, i) {
|
||||
return i === 0 && !indentfirst ? l : "" + sp + l;
|
||||
}).join('\n');
|
||||
return r.copySafeness(str, res);
|
||||
}
|
||||
_exports.indent = indent;
|
||||
function join(arr, del, attr) {
|
||||
del = del || '';
|
||||
if (attr) {
|
||||
arr = lib.map(arr, function (v) {
|
||||
return v[attr];
|
||||
});
|
||||
}
|
||||
return arr.join(del);
|
||||
}
|
||||
_exports.join = join;
|
||||
function last(arr) {
|
||||
return arr[arr.length - 1];
|
||||
}
|
||||
_exports.last = last;
|
||||
function lengthFilter(val) {
|
||||
var value = normalize(val, '');
|
||||
if (value !== undefined) {
|
||||
if (typeof Map === 'function' && value instanceof Map || typeof Set === 'function' && value instanceof Set) {
|
||||
// ECMAScript 2015 Maps and Sets
|
||||
return value.size;
|
||||
}
|
||||
if (lib.isObject(value) && !(value instanceof r.SafeString)) {
|
||||
// Objects (besides SafeStrings), non-primative Arrays
|
||||
return lib.keys(value).length;
|
||||
}
|
||||
return value.length;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
_exports.length = lengthFilter;
|
||||
function list(val) {
|
||||
if (lib.isString(val)) {
|
||||
return val.split('');
|
||||
} else if (lib.isObject(val)) {
|
||||
return lib._entries(val || {}).map(function (_ref) {
|
||||
var key = _ref[0],
|
||||
value = _ref[1];
|
||||
return {
|
||||
key: key,
|
||||
value: value
|
||||
};
|
||||
});
|
||||
} else if (lib.isArray(val)) {
|
||||
return val;
|
||||
} else {
|
||||
throw new lib.TemplateError('list filter: type not iterable');
|
||||
}
|
||||
}
|
||||
_exports.list = list;
|
||||
function lower(str) {
|
||||
str = normalize(str, '');
|
||||
return str.toLowerCase();
|
||||
}
|
||||
_exports.lower = lower;
|
||||
function nl2br(str) {
|
||||
if (str === null || str === undefined) {
|
||||
return '';
|
||||
}
|
||||
return r.copySafeness(str, str.replace(/\r\n|\n/g, '<br />\n'));
|
||||
}
|
||||
_exports.nl2br = nl2br;
|
||||
function random(arr) {
|
||||
return arr[Math.floor(Math.random() * arr.length)];
|
||||
}
|
||||
_exports.random = random;
|
||||
|
||||
/**
|
||||
* Construct select or reject filter
|
||||
*
|
||||
* @param {boolean} expectedTestResult
|
||||
* @returns {function(array, string, *): array}
|
||||
*/
|
||||
function getSelectOrReject(expectedTestResult) {
|
||||
function filter(arr, testName, secondArg) {
|
||||
if (testName === void 0) {
|
||||
testName = 'truthy';
|
||||
}
|
||||
var context = this;
|
||||
var test = context.env.getTest(testName);
|
||||
return lib.toArray(arr).filter(function examineTestResult(item) {
|
||||
return test.call(context, item, secondArg) === expectedTestResult;
|
||||
});
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
_exports.reject = getSelectOrReject(false);
|
||||
function rejectattr(arr, attr) {
|
||||
return arr.filter(function (item) {
|
||||
return !item[attr];
|
||||
});
|
||||
}
|
||||
_exports.rejectattr = rejectattr;
|
||||
_exports.select = getSelectOrReject(true);
|
||||
function selectattr(arr, attr) {
|
||||
return arr.filter(function (item) {
|
||||
return !!item[attr];
|
||||
});
|
||||
}
|
||||
_exports.selectattr = selectattr;
|
||||
function replace(str, old, new_, maxCount) {
|
||||
var originalStr = str;
|
||||
if (old instanceof RegExp) {
|
||||
return str.replace(old, new_);
|
||||
}
|
||||
if (typeof maxCount === 'undefined') {
|
||||
maxCount = -1;
|
||||
}
|
||||
var res = ''; // Output
|
||||
|
||||
// Cast Numbers in the search term to string
|
||||
if (typeof old === 'number') {
|
||||
old = '' + old;
|
||||
} else if (typeof old !== 'string') {
|
||||
// If it is something other than number or string,
|
||||
// return the original string
|
||||
return str;
|
||||
}
|
||||
|
||||
// Cast numbers in the replacement to string
|
||||
if (typeof str === 'number') {
|
||||
str = '' + str;
|
||||
}
|
||||
|
||||
// If by now, we don't have a string, throw it back
|
||||
if (typeof str !== 'string' && !(str instanceof r.SafeString)) {
|
||||
return str;
|
||||
}
|
||||
|
||||
// ShortCircuits
|
||||
if (old === '') {
|
||||
// Mimic the python behaviour: empty string is replaced
|
||||
// by replacement e.g. "abc"|replace("", ".") -> .a.b.c.
|
||||
res = new_ + str.split('').join(new_) + new_;
|
||||
return r.copySafeness(str, res);
|
||||
}
|
||||
var nextIndex = str.indexOf(old);
|
||||
// if # of replacements to perform is 0, or the string to does
|
||||
// not contain the old value, return the string
|
||||
if (maxCount === 0 || nextIndex === -1) {
|
||||
return str;
|
||||
}
|
||||
var pos = 0;
|
||||
var count = 0; // # of replacements made
|
||||
|
||||
while (nextIndex > -1 && (maxCount === -1 || count < maxCount)) {
|
||||
// Grab the next chunk of src string and add it with the
|
||||
// replacement, to the result
|
||||
res += str.substring(pos, nextIndex) + new_;
|
||||
// Increment our pointer in the src string
|
||||
pos = nextIndex + old.length;
|
||||
count++;
|
||||
// See if there are any more replacements to be made
|
||||
nextIndex = str.indexOf(old, pos);
|
||||
}
|
||||
|
||||
// We've either reached the end, or done the max # of
|
||||
// replacements, tack on any remaining string
|
||||
if (pos < str.length) {
|
||||
res += str.substring(pos);
|
||||
}
|
||||
return r.copySafeness(originalStr, res);
|
||||
}
|
||||
_exports.replace = replace;
|
||||
function reverse(val) {
|
||||
var arr;
|
||||
if (lib.isString(val)) {
|
||||
arr = list(val);
|
||||
} else {
|
||||
// Copy it
|
||||
arr = lib.map(val, function (v) {
|
||||
return v;
|
||||
});
|
||||
}
|
||||
arr.reverse();
|
||||
if (lib.isString(val)) {
|
||||
return r.copySafeness(val, arr.join(''));
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
_exports.reverse = reverse;
|
||||
function round(val, precision, method) {
|
||||
precision = precision || 0;
|
||||
var factor = Math.pow(10, precision);
|
||||
var rounder;
|
||||
if (method === 'ceil') {
|
||||
rounder = Math.ceil;
|
||||
} else if (method === 'floor') {
|
||||
rounder = Math.floor;
|
||||
} else {
|
||||
rounder = Math.round;
|
||||
}
|
||||
return rounder(val * factor) / factor;
|
||||
}
|
||||
_exports.round = round;
|
||||
function slice(arr, slices, fillWith) {
|
||||
var sliceLength = Math.floor(arr.length / slices);
|
||||
var extra = arr.length % slices;
|
||||
var res = [];
|
||||
var offset = 0;
|
||||
for (var i = 0; i < slices; i++) {
|
||||
var start = offset + i * sliceLength;
|
||||
if (i < extra) {
|
||||
offset++;
|
||||
}
|
||||
var end = offset + (i + 1) * sliceLength;
|
||||
var currSlice = arr.slice(start, end);
|
||||
if (fillWith && i >= extra) {
|
||||
currSlice.push(fillWith);
|
||||
}
|
||||
res.push(currSlice);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
_exports.slice = slice;
|
||||
function sum(arr, attr, start) {
|
||||
if (start === void 0) {
|
||||
start = 0;
|
||||
}
|
||||
if (attr) {
|
||||
arr = lib.map(arr, function (v) {
|
||||
return v[attr];
|
||||
});
|
||||
}
|
||||
return start + arr.reduce(function (a, b) {
|
||||
return a + b;
|
||||
}, 0);
|
||||
}
|
||||
_exports.sum = sum;
|
||||
_exports.sort = r.makeMacro(['value', 'reverse', 'case_sensitive', 'attribute'], [], function sortFilter(arr, reversed, caseSens, attr) {
|
||||
var _this = this;
|
||||
// Copy it
|
||||
var array = lib.map(arr, function (v) {
|
||||
return v;
|
||||
});
|
||||
var getAttribute = lib.getAttrGetter(attr);
|
||||
array.sort(function (a, b) {
|
||||
var x = attr ? getAttribute(a) : a;
|
||||
var y = attr ? getAttribute(b) : b;
|
||||
if (_this.env.opts.throwOnUndefined && attr && (x === undefined || y === undefined)) {
|
||||
throw new TypeError("sort: attribute \"" + attr + "\" resolved to undefined");
|
||||
}
|
||||
if (!caseSens && lib.isString(x) && lib.isString(y)) {
|
||||
x = x.toLowerCase();
|
||||
y = y.toLowerCase();
|
||||
}
|
||||
if (x < y) {
|
||||
return reversed ? 1 : -1;
|
||||
} else if (x > y) {
|
||||
return reversed ? -1 : 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
return array;
|
||||
});
|
||||
function string(obj) {
|
||||
return r.copySafeness(obj, obj);
|
||||
}
|
||||
_exports.string = string;
|
||||
function striptags(input, preserveLinebreaks) {
|
||||
input = normalize(input, '');
|
||||
var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>|<!--[\s\S]*?-->/gi;
|
||||
var trimmedInput = trim(input.replace(tags, ''));
|
||||
var res = '';
|
||||
if (preserveLinebreaks) {
|
||||
res = trimmedInput.replace(/^ +| +$/gm, '') // remove leading and trailing spaces
|
||||
.replace(/ +/g, ' ') // squash adjacent spaces
|
||||
.replace(/(\r\n)/g, '\n') // normalize linebreaks (CRLF -> LF)
|
||||
.replace(/\n\n\n+/g, '\n\n'); // squash abnormal adjacent linebreaks
|
||||
} else {
|
||||
res = trimmedInput.replace(/\s+/gi, ' ');
|
||||
}
|
||||
return r.copySafeness(input, res);
|
||||
}
|
||||
_exports.striptags = striptags;
|
||||
function title(str) {
|
||||
str = normalize(str, '');
|
||||
var words = str.split(' ').map(function (word) {
|
||||
return capitalize(word);
|
||||
});
|
||||
return r.copySafeness(str, words.join(' '));
|
||||
}
|
||||
_exports.title = title;
|
||||
function trim(str) {
|
||||
return r.copySafeness(str, str.replace(/^\s*|\s*$/g, ''));
|
||||
}
|
||||
_exports.trim = trim;
|
||||
function truncate(input, length, killwords, end) {
|
||||
var orig = input;
|
||||
input = normalize(input, '');
|
||||
length = length || 255;
|
||||
if (input.length <= length) {
|
||||
return input;
|
||||
}
|
||||
if (killwords) {
|
||||
input = input.substring(0, length);
|
||||
} else {
|
||||
var idx = input.lastIndexOf(' ', length);
|
||||
if (idx === -1) {
|
||||
idx = length;
|
||||
}
|
||||
input = input.substring(0, idx);
|
||||
}
|
||||
input += end !== undefined && end !== null ? end : '...';
|
||||
return r.copySafeness(orig, input);
|
||||
}
|
||||
_exports.truncate = truncate;
|
||||
function upper(str) {
|
||||
str = normalize(str, '');
|
||||
return str.toUpperCase();
|
||||
}
|
||||
_exports.upper = upper;
|
||||
function urlencode(obj) {
|
||||
var enc = encodeURIComponent;
|
||||
if (lib.isString(obj)) {
|
||||
return enc(obj);
|
||||
} else {
|
||||
var keyvals = lib.isArray(obj) ? obj : lib._entries(obj);
|
||||
return keyvals.map(function (_ref2) {
|
||||
var k = _ref2[0],
|
||||
v = _ref2[1];
|
||||
return enc(k) + "=" + enc(v);
|
||||
}).join('&');
|
||||
}
|
||||
}
|
||||
_exports.urlencode = urlencode;
|
||||
|
||||
// For the jinja regexp, see
|
||||
// https://github.com/mitsuhiko/jinja2/blob/f15b814dcba6aa12bc74d1f7d0c881d55f7126be/jinja2/utils.py#L20-L23
|
||||
var puncRe = /^(?:\(|<|<)?(.*?)(?:\.|,|\)|\n|>)?$/;
|
||||
// from http://blog.gerv.net/2011/05/html5_email_address_regexp/
|
||||
var emailRe = /^[\w.!#$%&'*+\-\/=?\^`{|}~]+@[a-z\d\-]+(\.[a-z\d\-]+)+$/i;
|
||||
var httpHttpsRe = /^https?:\/\/.*$/;
|
||||
var wwwRe = /^www\./;
|
||||
var tldRe = /\.(?:org|net|com)(?:\:|\/|$)/;
|
||||
function urlize(str, length, nofollow) {
|
||||
if (isNaN(length)) {
|
||||
length = Infinity;
|
||||
}
|
||||
var noFollowAttr = nofollow === true ? ' rel="nofollow"' : '';
|
||||
var words = str.split(/(\s+)/).filter(function (word) {
|
||||
// If the word has no length, bail. This can happen for str with
|
||||
// trailing whitespace.
|
||||
return word && word.length;
|
||||
}).map(function (word) {
|
||||
var matches = word.match(puncRe);
|
||||
var possibleUrl = matches ? matches[1] : word;
|
||||
var shortUrl = possibleUrl.substr(0, length);
|
||||
|
||||
// url that starts with http or https
|
||||
if (httpHttpsRe.test(possibleUrl)) {
|
||||
return "<a href=\"" + possibleUrl + "\"" + noFollowAttr + ">" + shortUrl + "</a>";
|
||||
}
|
||||
|
||||
// url that starts with www.
|
||||
if (wwwRe.test(possibleUrl)) {
|
||||
return "<a href=\"http://" + possibleUrl + "\"" + noFollowAttr + ">" + shortUrl + "</a>";
|
||||
}
|
||||
|
||||
// an email address of the form username@domain.tld
|
||||
if (emailRe.test(possibleUrl)) {
|
||||
return "<a href=\"mailto:" + possibleUrl + "\">" + possibleUrl + "</a>";
|
||||
}
|
||||
|
||||
// url that ends in .com, .org or .net that is not an email address
|
||||
if (tldRe.test(possibleUrl)) {
|
||||
return "<a href=\"http://" + possibleUrl + "\"" + noFollowAttr + ">" + shortUrl + "</a>";
|
||||
}
|
||||
return word;
|
||||
});
|
||||
return words.join('');
|
||||
}
|
||||
_exports.urlize = urlize;
|
||||
function wordcount(str) {
|
||||
str = normalize(str, '');
|
||||
var words = str ? str.match(/\w+/g) : null;
|
||||
return words ? words.length : null;
|
||||
}
|
||||
_exports.wordcount = wordcount;
|
||||
function float(val, def) {
|
||||
var res = parseFloat(val);
|
||||
return isNaN(res) ? def : res;
|
||||
}
|
||||
_exports.float = float;
|
||||
var intFilter = r.makeMacro(['value', 'default', 'base'], [], function doInt(value, defaultValue, base) {
|
||||
if (base === void 0) {
|
||||
base = 10;
|
||||
}
|
||||
var res = parseInt(value, base);
|
||||
return isNaN(res) ? defaultValue : res;
|
||||
});
|
||||
_exports.int = intFilter;
|
||||
|
||||
// Aliases
|
||||
_exports.d = _exports.default;
|
||||
_exports.e = _exports.escape;
|
65
node_modules/nunjucks/src/globals.js
generated
vendored
Normal file
65
node_modules/nunjucks/src/globals.js
generated
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
'use strict';
|
||||
|
||||
function _cycler(items) {
|
||||
var index = -1;
|
||||
return {
|
||||
current: null,
|
||||
reset: function reset() {
|
||||
index = -1;
|
||||
this.current = null;
|
||||
},
|
||||
next: function next() {
|
||||
index++;
|
||||
if (index >= items.length) {
|
||||
index = 0;
|
||||
}
|
||||
this.current = items[index];
|
||||
return this.current;
|
||||
}
|
||||
};
|
||||
}
|
||||
function _joiner(sep) {
|
||||
sep = sep || ',';
|
||||
var first = true;
|
||||
return function () {
|
||||
var val = first ? '' : sep;
|
||||
first = false;
|
||||
return val;
|
||||
};
|
||||
}
|
||||
|
||||
// Making this a function instead so it returns a new object
|
||||
// each time it's called. That way, if something like an environment
|
||||
// uses it, they will each have their own copy.
|
||||
function globals() {
|
||||
return {
|
||||
range: function range(start, stop, step) {
|
||||
if (typeof stop === 'undefined') {
|
||||
stop = start;
|
||||
start = 0;
|
||||
step = 1;
|
||||
} else if (!step) {
|
||||
step = 1;
|
||||
}
|
||||
var arr = [];
|
||||
if (step > 0) {
|
||||
for (var i = start; i < stop; i += step) {
|
||||
arr.push(i);
|
||||
}
|
||||
} else {
|
||||
for (var _i = start; _i > stop; _i += step) {
|
||||
// eslint-disable-line for-direction
|
||||
arr.push(_i);
|
||||
}
|
||||
}
|
||||
return arr;
|
||||
},
|
||||
cycler: function cycler() {
|
||||
return _cycler(Array.prototype.slice.call(arguments));
|
||||
},
|
||||
joiner: function joiner(sep) {
|
||||
return _joiner(sep);
|
||||
}
|
||||
};
|
||||
}
|
||||
module.exports = globals;
|
293
node_modules/nunjucks/src/jinja-compat.js
generated
vendored
Normal file
293
node_modules/nunjucks/src/jinja-compat.js
generated
vendored
Normal file
@@ -0,0 +1,293 @@
|
||||
"use strict";
|
||||
|
||||
function installCompat() {
|
||||
'use strict';
|
||||
|
||||
/* eslint-disable camelcase */
|
||||
|
||||
// This must be called like `nunjucks.installCompat` so that `this`
|
||||
// references the nunjucks instance
|
||||
var runtime = this.runtime;
|
||||
var lib = this.lib;
|
||||
// Handle slim case where these 'modules' are excluded from the built source
|
||||
var Compiler = this.compiler.Compiler;
|
||||
var Parser = this.parser.Parser;
|
||||
var nodes = this.nodes;
|
||||
var lexer = this.lexer;
|
||||
var orig_contextOrFrameLookup = runtime.contextOrFrameLookup;
|
||||
var orig_memberLookup = runtime.memberLookup;
|
||||
var orig_Compiler_assertType;
|
||||
var orig_Parser_parseAggregate;
|
||||
if (Compiler) {
|
||||
orig_Compiler_assertType = Compiler.prototype.assertType;
|
||||
}
|
||||
if (Parser) {
|
||||
orig_Parser_parseAggregate = Parser.prototype.parseAggregate;
|
||||
}
|
||||
function uninstall() {
|
||||
runtime.contextOrFrameLookup = orig_contextOrFrameLookup;
|
||||
runtime.memberLookup = orig_memberLookup;
|
||||
if (Compiler) {
|
||||
Compiler.prototype.assertType = orig_Compiler_assertType;
|
||||
}
|
||||
if (Parser) {
|
||||
Parser.prototype.parseAggregate = orig_Parser_parseAggregate;
|
||||
}
|
||||
}
|
||||
runtime.contextOrFrameLookup = function contextOrFrameLookup(context, frame, key) {
|
||||
var val = orig_contextOrFrameLookup.apply(this, arguments);
|
||||
if (val !== undefined) {
|
||||
return val;
|
||||
}
|
||||
switch (key) {
|
||||
case 'True':
|
||||
return true;
|
||||
case 'False':
|
||||
return false;
|
||||
case 'None':
|
||||
return null;
|
||||
default:
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
function getTokensState(tokens) {
|
||||
return {
|
||||
index: tokens.index,
|
||||
lineno: tokens.lineno,
|
||||
colno: tokens.colno
|
||||
};
|
||||
}
|
||||
if (process.env.BUILD_TYPE !== 'SLIM' && nodes && Compiler && Parser) {
|
||||
// i.e., not slim mode
|
||||
var Slice = nodes.Node.extend('Slice', {
|
||||
fields: ['start', 'stop', 'step'],
|
||||
init: function init(lineno, colno, start, stop, step) {
|
||||
start = start || new nodes.Literal(lineno, colno, null);
|
||||
stop = stop || new nodes.Literal(lineno, colno, null);
|
||||
step = step || new nodes.Literal(lineno, colno, 1);
|
||||
this.parent(lineno, colno, start, stop, step);
|
||||
}
|
||||
});
|
||||
Compiler.prototype.assertType = function assertType(node) {
|
||||
if (node instanceof Slice) {
|
||||
return;
|
||||
}
|
||||
orig_Compiler_assertType.apply(this, arguments);
|
||||
};
|
||||
Compiler.prototype.compileSlice = function compileSlice(node, frame) {
|
||||
this._emit('(');
|
||||
this._compileExpression(node.start, frame);
|
||||
this._emit('),(');
|
||||
this._compileExpression(node.stop, frame);
|
||||
this._emit('),(');
|
||||
this._compileExpression(node.step, frame);
|
||||
this._emit(')');
|
||||
};
|
||||
Parser.prototype.parseAggregate = function parseAggregate() {
|
||||
var _this = this;
|
||||
var origState = getTokensState(this.tokens);
|
||||
// Set back one accounting for opening bracket/parens
|
||||
origState.colno--;
|
||||
origState.index--;
|
||||
try {
|
||||
return orig_Parser_parseAggregate.apply(this);
|
||||
} catch (e) {
|
||||
var errState = getTokensState(this.tokens);
|
||||
var rethrow = function rethrow() {
|
||||
lib._assign(_this.tokens, errState);
|
||||
return e;
|
||||
};
|
||||
|
||||
// Reset to state before original parseAggregate called
|
||||
lib._assign(this.tokens, origState);
|
||||
this.peeked = false;
|
||||
var tok = this.peekToken();
|
||||
if (tok.type !== lexer.TOKEN_LEFT_BRACKET) {
|
||||
throw rethrow();
|
||||
} else {
|
||||
this.nextToken();
|
||||
}
|
||||
var node = new Slice(tok.lineno, tok.colno);
|
||||
|
||||
// If we don't encounter a colon while parsing, this is not a slice,
|
||||
// so re-raise the original exception.
|
||||
var isSlice = false;
|
||||
for (var i = 0; i <= node.fields.length; i++) {
|
||||
if (this.skip(lexer.TOKEN_RIGHT_BRACKET)) {
|
||||
break;
|
||||
}
|
||||
if (i === node.fields.length) {
|
||||
if (isSlice) {
|
||||
this.fail('parseSlice: too many slice components', tok.lineno, tok.colno);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (this.skip(lexer.TOKEN_COLON)) {
|
||||
isSlice = true;
|
||||
} else {
|
||||
var field = node.fields[i];
|
||||
node[field] = this.parseExpression();
|
||||
isSlice = this.skip(lexer.TOKEN_COLON) || isSlice;
|
||||
}
|
||||
}
|
||||
if (!isSlice) {
|
||||
throw rethrow();
|
||||
}
|
||||
return new nodes.Array(tok.lineno, tok.colno, [node]);
|
||||
}
|
||||
};
|
||||
}
|
||||
function sliceLookup(obj, start, stop, step) {
|
||||
obj = obj || [];
|
||||
if (start === null) {
|
||||
start = step < 0 ? obj.length - 1 : 0;
|
||||
}
|
||||
if (stop === null) {
|
||||
stop = step < 0 ? -1 : obj.length;
|
||||
} else if (stop < 0) {
|
||||
stop += obj.length;
|
||||
}
|
||||
if (start < 0) {
|
||||
start += obj.length;
|
||||
}
|
||||
var results = [];
|
||||
for (var i = start;; i += step) {
|
||||
if (i < 0 || i > obj.length) {
|
||||
break;
|
||||
}
|
||||
if (step > 0 && i >= stop) {
|
||||
break;
|
||||
}
|
||||
if (step < 0 && i <= stop) {
|
||||
break;
|
||||
}
|
||||
results.push(runtime.memberLookup(obj, i));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
function hasOwnProp(obj, key) {
|
||||
return Object.prototype.hasOwnProperty.call(obj, key);
|
||||
}
|
||||
var ARRAY_MEMBERS = {
|
||||
pop: function pop(index) {
|
||||
if (index === undefined) {
|
||||
return this.pop();
|
||||
}
|
||||
if (index >= this.length || index < 0) {
|
||||
throw new Error('KeyError');
|
||||
}
|
||||
return this.splice(index, 1);
|
||||
},
|
||||
append: function append(element) {
|
||||
return this.push(element);
|
||||
},
|
||||
remove: function remove(element) {
|
||||
for (var i = 0; i < this.length; i++) {
|
||||
if (this[i] === element) {
|
||||
return this.splice(i, 1);
|
||||
}
|
||||
}
|
||||
throw new Error('ValueError');
|
||||
},
|
||||
count: function count(element) {
|
||||
var count = 0;
|
||||
for (var i = 0; i < this.length; i++) {
|
||||
if (this[i] === element) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
},
|
||||
index: function index(element) {
|
||||
var i;
|
||||
if ((i = this.indexOf(element)) === -1) {
|
||||
throw new Error('ValueError');
|
||||
}
|
||||
return i;
|
||||
},
|
||||
find: function find(element) {
|
||||
return this.indexOf(element);
|
||||
},
|
||||
insert: function insert(index, elem) {
|
||||
return this.splice(index, 0, elem);
|
||||
}
|
||||
};
|
||||
var OBJECT_MEMBERS = {
|
||||
items: function items() {
|
||||
return lib._entries(this);
|
||||
},
|
||||
values: function values() {
|
||||
return lib._values(this);
|
||||
},
|
||||
keys: function keys() {
|
||||
return lib.keys(this);
|
||||
},
|
||||
get: function get(key, def) {
|
||||
var output = this[key];
|
||||
if (output === undefined) {
|
||||
output = def;
|
||||
}
|
||||
return output;
|
||||
},
|
||||
has_key: function has_key(key) {
|
||||
return hasOwnProp(this, key);
|
||||
},
|
||||
pop: function pop(key, def) {
|
||||
var output = this[key];
|
||||
if (output === undefined && def !== undefined) {
|
||||
output = def;
|
||||
} else if (output === undefined) {
|
||||
throw new Error('KeyError');
|
||||
} else {
|
||||
delete this[key];
|
||||
}
|
||||
return output;
|
||||
},
|
||||
popitem: function popitem() {
|
||||
var keys = lib.keys(this);
|
||||
if (!keys.length) {
|
||||
throw new Error('KeyError');
|
||||
}
|
||||
var k = keys[0];
|
||||
var val = this[k];
|
||||
delete this[k];
|
||||
return [k, val];
|
||||
},
|
||||
setdefault: function setdefault(key, def) {
|
||||
if (def === void 0) {
|
||||
def = null;
|
||||
}
|
||||
if (!(key in this)) {
|
||||
this[key] = def;
|
||||
}
|
||||
return this[key];
|
||||
},
|
||||
update: function update(kwargs) {
|
||||
lib._assign(this, kwargs);
|
||||
return null; // Always returns None
|
||||
}
|
||||
};
|
||||
|
||||
OBJECT_MEMBERS.iteritems = OBJECT_MEMBERS.items;
|
||||
OBJECT_MEMBERS.itervalues = OBJECT_MEMBERS.values;
|
||||
OBJECT_MEMBERS.iterkeys = OBJECT_MEMBERS.keys;
|
||||
runtime.memberLookup = function memberLookup(obj, val, autoescape) {
|
||||
if (arguments.length === 4) {
|
||||
return sliceLookup.apply(this, arguments);
|
||||
}
|
||||
obj = obj || {};
|
||||
|
||||
// If the object is an object, return any of the methods that Python would
|
||||
// otherwise provide.
|
||||
if (lib.isArray(obj) && hasOwnProp(ARRAY_MEMBERS, val)) {
|
||||
return ARRAY_MEMBERS[val].bind(obj);
|
||||
}
|
||||
if (lib.isObject(obj) && hasOwnProp(OBJECT_MEMBERS, val)) {
|
||||
return OBJECT_MEMBERS[val].bind(obj);
|
||||
}
|
||||
return orig_memberLookup.apply(this, arguments);
|
||||
};
|
||||
return uninstall;
|
||||
}
|
||||
module.exports = installCompat;
|
474
node_modules/nunjucks/src/lexer.js
generated
vendored
Normal file
474
node_modules/nunjucks/src/lexer.js
generated
vendored
Normal file
@@ -0,0 +1,474 @@
|
||||
'use strict';
|
||||
|
||||
var lib = require('./lib');
|
||||
var whitespaceChars = " \n\t\r\xA0";
|
||||
var delimChars = '()[]{}%*-+~/#,:|.<>=!';
|
||||
var intChars = '0123456789';
|
||||
var BLOCK_START = '{%';
|
||||
var BLOCK_END = '%}';
|
||||
var VARIABLE_START = '{{';
|
||||
var VARIABLE_END = '}}';
|
||||
var COMMENT_START = '{#';
|
||||
var COMMENT_END = '#}';
|
||||
var TOKEN_STRING = 'string';
|
||||
var TOKEN_WHITESPACE = 'whitespace';
|
||||
var TOKEN_DATA = 'data';
|
||||
var TOKEN_BLOCK_START = 'block-start';
|
||||
var TOKEN_BLOCK_END = 'block-end';
|
||||
var TOKEN_VARIABLE_START = 'variable-start';
|
||||
var TOKEN_VARIABLE_END = 'variable-end';
|
||||
var TOKEN_COMMENT = 'comment';
|
||||
var TOKEN_LEFT_PAREN = 'left-paren';
|
||||
var TOKEN_RIGHT_PAREN = 'right-paren';
|
||||
var TOKEN_LEFT_BRACKET = 'left-bracket';
|
||||
var TOKEN_RIGHT_BRACKET = 'right-bracket';
|
||||
var TOKEN_LEFT_CURLY = 'left-curly';
|
||||
var TOKEN_RIGHT_CURLY = 'right-curly';
|
||||
var TOKEN_OPERATOR = 'operator';
|
||||
var TOKEN_COMMA = 'comma';
|
||||
var TOKEN_COLON = 'colon';
|
||||
var TOKEN_TILDE = 'tilde';
|
||||
var TOKEN_PIPE = 'pipe';
|
||||
var TOKEN_INT = 'int';
|
||||
var TOKEN_FLOAT = 'float';
|
||||
var TOKEN_BOOLEAN = 'boolean';
|
||||
var TOKEN_NONE = 'none';
|
||||
var TOKEN_SYMBOL = 'symbol';
|
||||
var TOKEN_SPECIAL = 'special';
|
||||
var TOKEN_REGEX = 'regex';
|
||||
function token(type, value, lineno, colno) {
|
||||
return {
|
||||
type: type,
|
||||
value: value,
|
||||
lineno: lineno,
|
||||
colno: colno
|
||||
};
|
||||
}
|
||||
var Tokenizer = /*#__PURE__*/function () {
|
||||
function Tokenizer(str, opts) {
|
||||
this.str = str;
|
||||
this.index = 0;
|
||||
this.len = str.length;
|
||||
this.lineno = 0;
|
||||
this.colno = 0;
|
||||
this.in_code = false;
|
||||
opts = opts || {};
|
||||
var tags = opts.tags || {};
|
||||
this.tags = {
|
||||
BLOCK_START: tags.blockStart || BLOCK_START,
|
||||
BLOCK_END: tags.blockEnd || BLOCK_END,
|
||||
VARIABLE_START: tags.variableStart || VARIABLE_START,
|
||||
VARIABLE_END: tags.variableEnd || VARIABLE_END,
|
||||
COMMENT_START: tags.commentStart || COMMENT_START,
|
||||
COMMENT_END: tags.commentEnd || COMMENT_END
|
||||
};
|
||||
this.trimBlocks = !!opts.trimBlocks;
|
||||
this.lstripBlocks = !!opts.lstripBlocks;
|
||||
}
|
||||
var _proto = Tokenizer.prototype;
|
||||
_proto.nextToken = function nextToken() {
|
||||
var lineno = this.lineno;
|
||||
var colno = this.colno;
|
||||
var tok;
|
||||
if (this.in_code) {
|
||||
// Otherwise, if we are in a block parse it as code
|
||||
var cur = this.current();
|
||||
if (this.isFinished()) {
|
||||
// We have nothing else to parse
|
||||
return null;
|
||||
} else if (cur === '"' || cur === '\'') {
|
||||
// We've hit a string
|
||||
return token(TOKEN_STRING, this._parseString(cur), lineno, colno);
|
||||
} else if (tok = this._extract(whitespaceChars)) {
|
||||
// We hit some whitespace
|
||||
return token(TOKEN_WHITESPACE, tok, lineno, colno);
|
||||
} else if ((tok = this._extractString(this.tags.BLOCK_END)) || (tok = this._extractString('-' + this.tags.BLOCK_END))) {
|
||||
// Special check for the block end tag
|
||||
//
|
||||
// It is a requirement that start and end tags are composed of
|
||||
// delimiter characters (%{}[] etc), and our code always
|
||||
// breaks on delimiters so we can assume the token parsing
|
||||
// doesn't consume these elsewhere
|
||||
this.in_code = false;
|
||||
if (this.trimBlocks) {
|
||||
cur = this.current();
|
||||
if (cur === '\n') {
|
||||
// Skip newline
|
||||
this.forward();
|
||||
} else if (cur === '\r') {
|
||||
// Skip CRLF newline
|
||||
this.forward();
|
||||
cur = this.current();
|
||||
if (cur === '\n') {
|
||||
this.forward();
|
||||
} else {
|
||||
// Was not a CRLF, so go back
|
||||
this.back();
|
||||
}
|
||||
}
|
||||
}
|
||||
return token(TOKEN_BLOCK_END, tok, lineno, colno);
|
||||
} else if ((tok = this._extractString(this.tags.VARIABLE_END)) || (tok = this._extractString('-' + this.tags.VARIABLE_END))) {
|
||||
// Special check for variable end tag (see above)
|
||||
this.in_code = false;
|
||||
return token(TOKEN_VARIABLE_END, tok, lineno, colno);
|
||||
} else if (cur === 'r' && this.str.charAt(this.index + 1) === '/') {
|
||||
// Skip past 'r/'.
|
||||
this.forwardN(2);
|
||||
|
||||
// Extract until the end of the regex -- / ends it, \/ does not.
|
||||
var regexBody = '';
|
||||
while (!this.isFinished()) {
|
||||
if (this.current() === '/' && this.previous() !== '\\') {
|
||||
this.forward();
|
||||
break;
|
||||
} else {
|
||||
regexBody += this.current();
|
||||
this.forward();
|
||||
}
|
||||
}
|
||||
|
||||
// Check for flags.
|
||||
// The possible flags are according to https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp)
|
||||
var POSSIBLE_FLAGS = ['g', 'i', 'm', 'y'];
|
||||
var regexFlags = '';
|
||||
while (!this.isFinished()) {
|
||||
var isCurrentAFlag = POSSIBLE_FLAGS.indexOf(this.current()) !== -1;
|
||||
if (isCurrentAFlag) {
|
||||
regexFlags += this.current();
|
||||
this.forward();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return token(TOKEN_REGEX, {
|
||||
body: regexBody,
|
||||
flags: regexFlags
|
||||
}, lineno, colno);
|
||||
} else if (delimChars.indexOf(cur) !== -1) {
|
||||
// We've hit a delimiter (a special char like a bracket)
|
||||
this.forward();
|
||||
var complexOps = ['==', '===', '!=', '!==', '<=', '>=', '//', '**'];
|
||||
var curComplex = cur + this.current();
|
||||
var type;
|
||||
if (lib.indexOf(complexOps, curComplex) !== -1) {
|
||||
this.forward();
|
||||
cur = curComplex;
|
||||
|
||||
// See if this is a strict equality/inequality comparator
|
||||
if (lib.indexOf(complexOps, curComplex + this.current()) !== -1) {
|
||||
cur = curComplex + this.current();
|
||||
this.forward();
|
||||
}
|
||||
}
|
||||
switch (cur) {
|
||||
case '(':
|
||||
type = TOKEN_LEFT_PAREN;
|
||||
break;
|
||||
case ')':
|
||||
type = TOKEN_RIGHT_PAREN;
|
||||
break;
|
||||
case '[':
|
||||
type = TOKEN_LEFT_BRACKET;
|
||||
break;
|
||||
case ']':
|
||||
type = TOKEN_RIGHT_BRACKET;
|
||||
break;
|
||||
case '{':
|
||||
type = TOKEN_LEFT_CURLY;
|
||||
break;
|
||||
case '}':
|
||||
type = TOKEN_RIGHT_CURLY;
|
||||
break;
|
||||
case ',':
|
||||
type = TOKEN_COMMA;
|
||||
break;
|
||||
case ':':
|
||||
type = TOKEN_COLON;
|
||||
break;
|
||||
case '~':
|
||||
type = TOKEN_TILDE;
|
||||
break;
|
||||
case '|':
|
||||
type = TOKEN_PIPE;
|
||||
break;
|
||||
default:
|
||||
type = TOKEN_OPERATOR;
|
||||
}
|
||||
return token(type, cur, lineno, colno);
|
||||
} else {
|
||||
// We are not at whitespace or a delimiter, so extract the
|
||||
// text and parse it
|
||||
tok = this._extractUntil(whitespaceChars + delimChars);
|
||||
if (tok.match(/^[-+]?[0-9]+$/)) {
|
||||
if (this.current() === '.') {
|
||||
this.forward();
|
||||
var dec = this._extract(intChars);
|
||||
return token(TOKEN_FLOAT, tok + '.' + dec, lineno, colno);
|
||||
} else {
|
||||
return token(TOKEN_INT, tok, lineno, colno);
|
||||
}
|
||||
} else if (tok.match(/^(true|false)$/)) {
|
||||
return token(TOKEN_BOOLEAN, tok, lineno, colno);
|
||||
} else if (tok === 'none') {
|
||||
return token(TOKEN_NONE, tok, lineno, colno);
|
||||
/*
|
||||
* Added to make the test `null is null` evaluate truthily.
|
||||
* Otherwise, Nunjucks will look up null in the context and
|
||||
* return `undefined`, which is not what we want. This *may* have
|
||||
* consequences is someone is using null in their templates as a
|
||||
* variable.
|
||||
*/
|
||||
} else if (tok === 'null') {
|
||||
return token(TOKEN_NONE, tok, lineno, colno);
|
||||
} else if (tok) {
|
||||
return token(TOKEN_SYMBOL, tok, lineno, colno);
|
||||
} else {
|
||||
throw new Error('Unexpected value while parsing: ' + tok);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Parse out the template text, breaking on tag
|
||||
// delimiters because we need to look for block/variable start
|
||||
// tags (don't use the full delimChars for optimization)
|
||||
var beginChars = this.tags.BLOCK_START.charAt(0) + this.tags.VARIABLE_START.charAt(0) + this.tags.COMMENT_START.charAt(0) + this.tags.COMMENT_END.charAt(0);
|
||||
if (this.isFinished()) {
|
||||
return null;
|
||||
} else if ((tok = this._extractString(this.tags.BLOCK_START + '-')) || (tok = this._extractString(this.tags.BLOCK_START))) {
|
||||
this.in_code = true;
|
||||
return token(TOKEN_BLOCK_START, tok, lineno, colno);
|
||||
} else if ((tok = this._extractString(this.tags.VARIABLE_START + '-')) || (tok = this._extractString(this.tags.VARIABLE_START))) {
|
||||
this.in_code = true;
|
||||
return token(TOKEN_VARIABLE_START, tok, lineno, colno);
|
||||
} else {
|
||||
tok = '';
|
||||
var data;
|
||||
var inComment = false;
|
||||
if (this._matches(this.tags.COMMENT_START)) {
|
||||
inComment = true;
|
||||
tok = this._extractString(this.tags.COMMENT_START);
|
||||
}
|
||||
|
||||
// Continually consume text, breaking on the tag delimiter
|
||||
// characters and checking to see if it's a start tag.
|
||||
//
|
||||
// We could hit the end of the template in the middle of
|
||||
// our looping, so check for the null return value from
|
||||
// _extractUntil
|
||||
while ((data = this._extractUntil(beginChars)) !== null) {
|
||||
tok += data;
|
||||
if ((this._matches(this.tags.BLOCK_START) || this._matches(this.tags.VARIABLE_START) || this._matches(this.tags.COMMENT_START)) && !inComment) {
|
||||
if (this.lstripBlocks && this._matches(this.tags.BLOCK_START) && this.colno > 0 && this.colno <= tok.length) {
|
||||
var lastLine = tok.slice(-this.colno);
|
||||
if (/^\s+$/.test(lastLine)) {
|
||||
// Remove block leading whitespace from beginning of the string
|
||||
tok = tok.slice(0, -this.colno);
|
||||
if (!tok.length) {
|
||||
// All data removed, collapse to avoid unnecessary nodes
|
||||
// by returning next token (block start)
|
||||
return this.nextToken();
|
||||
}
|
||||
}
|
||||
}
|
||||
// If it is a start tag, stop looping
|
||||
break;
|
||||
} else if (this._matches(this.tags.COMMENT_END)) {
|
||||
if (!inComment) {
|
||||
throw new Error('unexpected end of comment');
|
||||
}
|
||||
tok += this._extractString(this.tags.COMMENT_END);
|
||||
break;
|
||||
} else {
|
||||
// It does not match any tag, so add the character and
|
||||
// carry on
|
||||
tok += this.current();
|
||||
this.forward();
|
||||
}
|
||||
}
|
||||
if (data === null && inComment) {
|
||||
throw new Error('expected end of comment, got end of file');
|
||||
}
|
||||
return token(inComment ? TOKEN_COMMENT : TOKEN_DATA, tok, lineno, colno);
|
||||
}
|
||||
}
|
||||
};
|
||||
_proto._parseString = function _parseString(delimiter) {
|
||||
this.forward();
|
||||
var str = '';
|
||||
while (!this.isFinished() && this.current() !== delimiter) {
|
||||
var cur = this.current();
|
||||
if (cur === '\\') {
|
||||
this.forward();
|
||||
switch (this.current()) {
|
||||
case 'n':
|
||||
str += '\n';
|
||||
break;
|
||||
case 't':
|
||||
str += '\t';
|
||||
break;
|
||||
case 'r':
|
||||
str += '\r';
|
||||
break;
|
||||
default:
|
||||
str += this.current();
|
||||
}
|
||||
this.forward();
|
||||
} else {
|
||||
str += cur;
|
||||
this.forward();
|
||||
}
|
||||
}
|
||||
this.forward();
|
||||
return str;
|
||||
};
|
||||
_proto._matches = function _matches(str) {
|
||||
if (this.index + str.length > this.len) {
|
||||
return null;
|
||||
}
|
||||
var m = this.str.slice(this.index, this.index + str.length);
|
||||
return m === str;
|
||||
};
|
||||
_proto._extractString = function _extractString(str) {
|
||||
if (this._matches(str)) {
|
||||
this.forwardN(str.length);
|
||||
return str;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
_proto._extractUntil = function _extractUntil(charString) {
|
||||
// Extract all non-matching chars, with the default matching set
|
||||
// to everything
|
||||
return this._extractMatching(true, charString || '');
|
||||
};
|
||||
_proto._extract = function _extract(charString) {
|
||||
// Extract all matching chars (no default, so charString must be
|
||||
// explicit)
|
||||
return this._extractMatching(false, charString);
|
||||
};
|
||||
_proto._extractMatching = function _extractMatching(breakOnMatch, charString) {
|
||||
// Pull out characters until a breaking char is hit.
|
||||
// If breakOnMatch is false, a non-matching char stops it.
|
||||
// If breakOnMatch is true, a matching char stops it.
|
||||
|
||||
if (this.isFinished()) {
|
||||
return null;
|
||||
}
|
||||
var first = charString.indexOf(this.current());
|
||||
|
||||
// Only proceed if the first character doesn't meet our condition
|
||||
if (breakOnMatch && first === -1 || !breakOnMatch && first !== -1) {
|
||||
var t = this.current();
|
||||
this.forward();
|
||||
|
||||
// And pull out all the chars one at a time until we hit a
|
||||
// breaking char
|
||||
var idx = charString.indexOf(this.current());
|
||||
while ((breakOnMatch && idx === -1 || !breakOnMatch && idx !== -1) && !this.isFinished()) {
|
||||
t += this.current();
|
||||
this.forward();
|
||||
idx = charString.indexOf(this.current());
|
||||
}
|
||||
return t;
|
||||
}
|
||||
return '';
|
||||
};
|
||||
_proto._extractRegex = function _extractRegex(regex) {
|
||||
var matches = this.currentStr().match(regex);
|
||||
if (!matches) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Move forward whatever was matched
|
||||
this.forwardN(matches[0].length);
|
||||
return matches;
|
||||
};
|
||||
_proto.isFinished = function isFinished() {
|
||||
return this.index >= this.len;
|
||||
};
|
||||
_proto.forwardN = function forwardN(n) {
|
||||
for (var i = 0; i < n; i++) {
|
||||
this.forward();
|
||||
}
|
||||
};
|
||||
_proto.forward = function forward() {
|
||||
this.index++;
|
||||
if (this.previous() === '\n') {
|
||||
this.lineno++;
|
||||
this.colno = 0;
|
||||
} else {
|
||||
this.colno++;
|
||||
}
|
||||
};
|
||||
_proto.backN = function backN(n) {
|
||||
for (var i = 0; i < n; i++) {
|
||||
this.back();
|
||||
}
|
||||
};
|
||||
_proto.back = function back() {
|
||||
this.index--;
|
||||
if (this.current() === '\n') {
|
||||
this.lineno--;
|
||||
var idx = this.src.lastIndexOf('\n', this.index - 1);
|
||||
if (idx === -1) {
|
||||
this.colno = this.index;
|
||||
} else {
|
||||
this.colno = this.index - idx;
|
||||
}
|
||||
} else {
|
||||
this.colno--;
|
||||
}
|
||||
}
|
||||
|
||||
// current returns current character
|
||||
;
|
||||
_proto.current = function current() {
|
||||
if (!this.isFinished()) {
|
||||
return this.str.charAt(this.index);
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
// currentStr returns what's left of the unparsed string
|
||||
;
|
||||
_proto.currentStr = function currentStr() {
|
||||
if (!this.isFinished()) {
|
||||
return this.str.substr(this.index);
|
||||
}
|
||||
return '';
|
||||
};
|
||||
_proto.previous = function previous() {
|
||||
return this.str.charAt(this.index - 1);
|
||||
};
|
||||
return Tokenizer;
|
||||
}();
|
||||
module.exports = {
|
||||
lex: function lex(src, opts) {
|
||||
return new Tokenizer(src, opts);
|
||||
},
|
||||
TOKEN_STRING: TOKEN_STRING,
|
||||
TOKEN_WHITESPACE: TOKEN_WHITESPACE,
|
||||
TOKEN_DATA: TOKEN_DATA,
|
||||
TOKEN_BLOCK_START: TOKEN_BLOCK_START,
|
||||
TOKEN_BLOCK_END: TOKEN_BLOCK_END,
|
||||
TOKEN_VARIABLE_START: TOKEN_VARIABLE_START,
|
||||
TOKEN_VARIABLE_END: TOKEN_VARIABLE_END,
|
||||
TOKEN_COMMENT: TOKEN_COMMENT,
|
||||
TOKEN_LEFT_PAREN: TOKEN_LEFT_PAREN,
|
||||
TOKEN_RIGHT_PAREN: TOKEN_RIGHT_PAREN,
|
||||
TOKEN_LEFT_BRACKET: TOKEN_LEFT_BRACKET,
|
||||
TOKEN_RIGHT_BRACKET: TOKEN_RIGHT_BRACKET,
|
||||
TOKEN_LEFT_CURLY: TOKEN_LEFT_CURLY,
|
||||
TOKEN_RIGHT_CURLY: TOKEN_RIGHT_CURLY,
|
||||
TOKEN_OPERATOR: TOKEN_OPERATOR,
|
||||
TOKEN_COMMA: TOKEN_COMMA,
|
||||
TOKEN_COLON: TOKEN_COLON,
|
||||
TOKEN_TILDE: TOKEN_TILDE,
|
||||
TOKEN_PIPE: TOKEN_PIPE,
|
||||
TOKEN_INT: TOKEN_INT,
|
||||
TOKEN_FLOAT: TOKEN_FLOAT,
|
||||
TOKEN_BOOLEAN: TOKEN_BOOLEAN,
|
||||
TOKEN_NONE: TOKEN_NONE,
|
||||
TOKEN_SYMBOL: TOKEN_SYMBOL,
|
||||
TOKEN_SPECIAL: TOKEN_SPECIAL,
|
||||
TOKEN_REGEX: TOKEN_REGEX
|
||||
};
|
325
node_modules/nunjucks/src/lib.js
generated
vendored
Normal file
325
node_modules/nunjucks/src/lib.js
generated
vendored
Normal file
@@ -0,0 +1,325 @@
|
||||
'use strict';
|
||||
|
||||
var ArrayProto = Array.prototype;
|
||||
var ObjProto = Object.prototype;
|
||||
var escapeMap = {
|
||||
'&': '&',
|
||||
'"': '"',
|
||||
'\'': ''',
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'\\': '\'
|
||||
};
|
||||
var escapeRegex = /[&"'<>\\]/g;
|
||||
var _exports = module.exports = {};
|
||||
function hasOwnProp(obj, k) {
|
||||
return ObjProto.hasOwnProperty.call(obj, k);
|
||||
}
|
||||
_exports.hasOwnProp = hasOwnProp;
|
||||
function lookupEscape(ch) {
|
||||
return escapeMap[ch];
|
||||
}
|
||||
function _prettifyError(path, withInternals, err) {
|
||||
if (!err.Update) {
|
||||
// not one of ours, cast it
|
||||
err = new _exports.TemplateError(err);
|
||||
}
|
||||
err.Update(path);
|
||||
|
||||
// Unless they marked the dev flag, show them a trace from here
|
||||
if (!withInternals) {
|
||||
var old = err;
|
||||
err = new Error(old.message);
|
||||
err.name = old.name;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
_exports._prettifyError = _prettifyError;
|
||||
function TemplateError(message, lineno, colno) {
|
||||
var err;
|
||||
var cause;
|
||||
if (message instanceof Error) {
|
||||
cause = message;
|
||||
message = cause.name + ": " + cause.message;
|
||||
}
|
||||
if (Object.setPrototypeOf) {
|
||||
err = new Error(message);
|
||||
Object.setPrototypeOf(err, TemplateError.prototype);
|
||||
} else {
|
||||
err = this;
|
||||
Object.defineProperty(err, 'message', {
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
value: message
|
||||
});
|
||||
}
|
||||
Object.defineProperty(err, 'name', {
|
||||
value: 'Template render error'
|
||||
});
|
||||
if (Error.captureStackTrace) {
|
||||
Error.captureStackTrace(err, this.constructor);
|
||||
}
|
||||
var getStack;
|
||||
if (cause) {
|
||||
var stackDescriptor = Object.getOwnPropertyDescriptor(cause, 'stack');
|
||||
getStack = stackDescriptor && (stackDescriptor.get || function () {
|
||||
return stackDescriptor.value;
|
||||
});
|
||||
if (!getStack) {
|
||||
getStack = function getStack() {
|
||||
return cause.stack;
|
||||
};
|
||||
}
|
||||
} else {
|
||||
var stack = new Error(message).stack;
|
||||
getStack = function getStack() {
|
||||
return stack;
|
||||
};
|
||||
}
|
||||
Object.defineProperty(err, 'stack', {
|
||||
get: function get() {
|
||||
return getStack.call(err);
|
||||
}
|
||||
});
|
||||
Object.defineProperty(err, 'cause', {
|
||||
value: cause
|
||||
});
|
||||
err.lineno = lineno;
|
||||
err.colno = colno;
|
||||
err.firstUpdate = true;
|
||||
err.Update = function Update(path) {
|
||||
var msg = '(' + (path || 'unknown path') + ')';
|
||||
|
||||
// only show lineno + colno next to path of template
|
||||
// where error occurred
|
||||
if (this.firstUpdate) {
|
||||
if (this.lineno && this.colno) {
|
||||
msg += " [Line " + this.lineno + ", Column " + this.colno + "]";
|
||||
} else if (this.lineno) {
|
||||
msg += " [Line " + this.lineno + "]";
|
||||
}
|
||||
}
|
||||
msg += '\n ';
|
||||
if (this.firstUpdate) {
|
||||
msg += ' ';
|
||||
}
|
||||
this.message = msg + (this.message || '');
|
||||
this.firstUpdate = false;
|
||||
return this;
|
||||
};
|
||||
return err;
|
||||
}
|
||||
if (Object.setPrototypeOf) {
|
||||
Object.setPrototypeOf(TemplateError.prototype, Error.prototype);
|
||||
} else {
|
||||
TemplateError.prototype = Object.create(Error.prototype, {
|
||||
constructor: {
|
||||
value: TemplateError
|
||||
}
|
||||
});
|
||||
}
|
||||
_exports.TemplateError = TemplateError;
|
||||
function escape(val) {
|
||||
return val.replace(escapeRegex, lookupEscape);
|
||||
}
|
||||
_exports.escape = escape;
|
||||
function isFunction(obj) {
|
||||
return ObjProto.toString.call(obj) === '[object Function]';
|
||||
}
|
||||
_exports.isFunction = isFunction;
|
||||
function isArray(obj) {
|
||||
return ObjProto.toString.call(obj) === '[object Array]';
|
||||
}
|
||||
_exports.isArray = isArray;
|
||||
function isString(obj) {
|
||||
return ObjProto.toString.call(obj) === '[object String]';
|
||||
}
|
||||
_exports.isString = isString;
|
||||
function isObject(obj) {
|
||||
return ObjProto.toString.call(obj) === '[object Object]';
|
||||
}
|
||||
_exports.isObject = isObject;
|
||||
|
||||
/**
|
||||
* @param {string|number} attr
|
||||
* @returns {(string|number)[]}
|
||||
* @private
|
||||
*/
|
||||
function _prepareAttributeParts(attr) {
|
||||
if (!attr) {
|
||||
return [];
|
||||
}
|
||||
if (typeof attr === 'string') {
|
||||
return attr.split('.');
|
||||
}
|
||||
return [attr];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} attribute Attribute value. Dots allowed.
|
||||
* @returns {function(Object): *}
|
||||
*/
|
||||
function getAttrGetter(attribute) {
|
||||
var parts = _prepareAttributeParts(attribute);
|
||||
return function attrGetter(item) {
|
||||
var _item = item;
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
var part = parts[i];
|
||||
|
||||
// If item is not an object, and we still got parts to handle, it means
|
||||
// that something goes wrong. Just roll out to undefined in that case.
|
||||
if (hasOwnProp(_item, part)) {
|
||||
_item = _item[part];
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
return _item;
|
||||
};
|
||||
}
|
||||
_exports.getAttrGetter = getAttrGetter;
|
||||
function groupBy(obj, val, throwOnUndefined) {
|
||||
var result = {};
|
||||
var iterator = isFunction(val) ? val : getAttrGetter(val);
|
||||
for (var i = 0; i < obj.length; i++) {
|
||||
var value = obj[i];
|
||||
var key = iterator(value, i);
|
||||
if (key === undefined && throwOnUndefined === true) {
|
||||
throw new TypeError("groupby: attribute \"" + val + "\" resolved to undefined");
|
||||
}
|
||||
(result[key] || (result[key] = [])).push(value);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
_exports.groupBy = groupBy;
|
||||
function toArray(obj) {
|
||||
return Array.prototype.slice.call(obj);
|
||||
}
|
||||
_exports.toArray = toArray;
|
||||
function without(array) {
|
||||
var result = [];
|
||||
if (!array) {
|
||||
return result;
|
||||
}
|
||||
var length = array.length;
|
||||
var contains = toArray(arguments).slice(1);
|
||||
var index = -1;
|
||||
while (++index < length) {
|
||||
if (indexOf(contains, array[index]) === -1) {
|
||||
result.push(array[index]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
_exports.without = without;
|
||||
function repeat(char_, n) {
|
||||
var str = '';
|
||||
for (var i = 0; i < n; i++) {
|
||||
str += char_;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
_exports.repeat = repeat;
|
||||
function each(obj, func, context) {
|
||||
if (obj == null) {
|
||||
return;
|
||||
}
|
||||
if (ArrayProto.forEach && obj.forEach === ArrayProto.forEach) {
|
||||
obj.forEach(func, context);
|
||||
} else if (obj.length === +obj.length) {
|
||||
for (var i = 0, l = obj.length; i < l; i++) {
|
||||
func.call(context, obj[i], i, obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
_exports.each = each;
|
||||
function map(obj, func) {
|
||||
var results = [];
|
||||
if (obj == null) {
|
||||
return results;
|
||||
}
|
||||
if (ArrayProto.map && obj.map === ArrayProto.map) {
|
||||
return obj.map(func);
|
||||
}
|
||||
for (var i = 0; i < obj.length; i++) {
|
||||
results[results.length] = func(obj[i], i);
|
||||
}
|
||||
if (obj.length === +obj.length) {
|
||||
results.length = obj.length;
|
||||
}
|
||||
return results;
|
||||
}
|
||||
_exports.map = map;
|
||||
function asyncIter(arr, iter, cb) {
|
||||
var i = -1;
|
||||
function next() {
|
||||
i++;
|
||||
if (i < arr.length) {
|
||||
iter(arr[i], i, next, cb);
|
||||
} else {
|
||||
cb();
|
||||
}
|
||||
}
|
||||
next();
|
||||
}
|
||||
_exports.asyncIter = asyncIter;
|
||||
function asyncFor(obj, iter, cb) {
|
||||
var keys = keys_(obj || {});
|
||||
var len = keys.length;
|
||||
var i = -1;
|
||||
function next() {
|
||||
i++;
|
||||
var k = keys[i];
|
||||
if (i < len) {
|
||||
iter(k, obj[k], i, len, next);
|
||||
} else {
|
||||
cb();
|
||||
}
|
||||
}
|
||||
next();
|
||||
}
|
||||
_exports.asyncFor = asyncFor;
|
||||
function indexOf(arr, searchElement, fromIndex) {
|
||||
return Array.prototype.indexOf.call(arr || [], searchElement, fromIndex);
|
||||
}
|
||||
_exports.indexOf = indexOf;
|
||||
function keys_(obj) {
|
||||
/* eslint-disable no-restricted-syntax */
|
||||
var arr = [];
|
||||
for (var k in obj) {
|
||||
if (hasOwnProp(obj, k)) {
|
||||
arr.push(k);
|
||||
}
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
_exports.keys = keys_;
|
||||
function _entries(obj) {
|
||||
return keys_(obj).map(function (k) {
|
||||
return [k, obj[k]];
|
||||
});
|
||||
}
|
||||
_exports._entries = _entries;
|
||||
function _values(obj) {
|
||||
return keys_(obj).map(function (k) {
|
||||
return obj[k];
|
||||
});
|
||||
}
|
||||
_exports._values = _values;
|
||||
function extend(obj1, obj2) {
|
||||
obj1 = obj1 || {};
|
||||
keys_(obj2).forEach(function (k) {
|
||||
obj1[k] = obj2[k];
|
||||
});
|
||||
return obj1;
|
||||
}
|
||||
_exports._assign = _exports.extend = extend;
|
||||
function inOperator(key, val) {
|
||||
if (isArray(val) || isString(val)) {
|
||||
return val.indexOf(key) !== -1;
|
||||
} else if (isObject(val)) {
|
||||
return key in val;
|
||||
}
|
||||
throw new Error('Cannot use "in" operator to search for "' + key + '" in unexpected types.');
|
||||
}
|
||||
_exports.inOperator = inOperator;
|
21
node_modules/nunjucks/src/loader.js
generated
vendored
Normal file
21
node_modules/nunjucks/src/loader.js
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
'use strict';
|
||||
|
||||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
var path = require('path');
|
||||
var _require = require('./object'),
|
||||
EmitterObj = _require.EmitterObj;
|
||||
module.exports = /*#__PURE__*/function (_EmitterObj) {
|
||||
_inheritsLoose(Loader, _EmitterObj);
|
||||
function Loader() {
|
||||
return _EmitterObj.apply(this, arguments) || this;
|
||||
}
|
||||
var _proto = Loader.prototype;
|
||||
_proto.resolve = function resolve(from, to) {
|
||||
return path.resolve(path.dirname(from), to);
|
||||
};
|
||||
_proto.isRelative = function isRelative(filename) {
|
||||
return filename.indexOf('./') === 0 || filename.indexOf('../') === 0;
|
||||
};
|
||||
return Loader;
|
||||
}(EmitterObj);
|
5
node_modules/nunjucks/src/loaders.js
generated
vendored
Normal file
5
node_modules/nunjucks/src/loaders.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
// This file will automatically be rewired to web-loader.js when
|
||||
// building for the browser
|
||||
module.exports = require('./node-loaders');
|
139
node_modules/nunjucks/src/node-loaders.js
generated
vendored
Normal file
139
node_modules/nunjucks/src/node-loaders.js
generated
vendored
Normal file
@@ -0,0 +1,139 @@
|
||||
/* eslint-disable no-console */
|
||||
|
||||
'use strict';
|
||||
|
||||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var Loader = require('./loader');
|
||||
var _require = require('./precompiled-loader.js'),
|
||||
PrecompiledLoader = _require.PrecompiledLoader;
|
||||
var chokidar;
|
||||
var FileSystemLoader = /*#__PURE__*/function (_Loader) {
|
||||
_inheritsLoose(FileSystemLoader, _Loader);
|
||||
function FileSystemLoader(searchPaths, opts) {
|
||||
var _this;
|
||||
_this = _Loader.call(this) || this;
|
||||
if (typeof opts === 'boolean') {
|
||||
console.log('[nunjucks] Warning: you passed a boolean as the second ' + 'argument to FileSystemLoader, but it now takes an options ' + 'object. See http://mozilla.github.io/nunjucks/api.html#filesystemloader');
|
||||
}
|
||||
opts = opts || {};
|
||||
_this.pathsToNames = {};
|
||||
_this.noCache = !!opts.noCache;
|
||||
if (searchPaths) {
|
||||
searchPaths = Array.isArray(searchPaths) ? searchPaths : [searchPaths];
|
||||
// For windows, convert to forward slashes
|
||||
_this.searchPaths = searchPaths.map(path.normalize);
|
||||
} else {
|
||||
_this.searchPaths = ['.'];
|
||||
}
|
||||
if (opts.watch) {
|
||||
// Watch all the templates in the paths and fire an event when
|
||||
// they change
|
||||
try {
|
||||
chokidar = require('chokidar'); // eslint-disable-line global-require
|
||||
} catch (e) {
|
||||
throw new Error('watch requires chokidar to be installed');
|
||||
}
|
||||
var paths = _this.searchPaths.filter(fs.existsSync);
|
||||
var watcher = chokidar.watch(paths);
|
||||
watcher.on('all', function (event, fullname) {
|
||||
fullname = path.resolve(fullname);
|
||||
if (event === 'change' && fullname in _this.pathsToNames) {
|
||||
_this.emit('update', _this.pathsToNames[fullname], fullname);
|
||||
}
|
||||
});
|
||||
watcher.on('error', function (error) {
|
||||
console.log('Watcher error: ' + error);
|
||||
});
|
||||
}
|
||||
return _this;
|
||||
}
|
||||
var _proto = FileSystemLoader.prototype;
|
||||
_proto.getSource = function getSource(name) {
|
||||
var fullpath = null;
|
||||
var paths = this.searchPaths;
|
||||
for (var i = 0; i < paths.length; i++) {
|
||||
var basePath = path.resolve(paths[i]);
|
||||
var p = path.resolve(paths[i], name);
|
||||
|
||||
// Only allow the current directory and anything
|
||||
// underneath it to be searched
|
||||
if (p.indexOf(basePath) === 0 && fs.existsSync(p)) {
|
||||
fullpath = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!fullpath) {
|
||||
return null;
|
||||
}
|
||||
this.pathsToNames[fullpath] = name;
|
||||
var source = {
|
||||
src: fs.readFileSync(fullpath, 'utf-8'),
|
||||
path: fullpath,
|
||||
noCache: this.noCache
|
||||
};
|
||||
this.emit('load', name, source);
|
||||
return source;
|
||||
};
|
||||
return FileSystemLoader;
|
||||
}(Loader);
|
||||
var NodeResolveLoader = /*#__PURE__*/function (_Loader2) {
|
||||
_inheritsLoose(NodeResolveLoader, _Loader2);
|
||||
function NodeResolveLoader(opts) {
|
||||
var _this2;
|
||||
_this2 = _Loader2.call(this) || this;
|
||||
opts = opts || {};
|
||||
_this2.pathsToNames = {};
|
||||
_this2.noCache = !!opts.noCache;
|
||||
if (opts.watch) {
|
||||
try {
|
||||
chokidar = require('chokidar'); // eslint-disable-line global-require
|
||||
} catch (e) {
|
||||
throw new Error('watch requires chokidar to be installed');
|
||||
}
|
||||
_this2.watcher = chokidar.watch();
|
||||
_this2.watcher.on('change', function (fullname) {
|
||||
_this2.emit('update', _this2.pathsToNames[fullname], fullname);
|
||||
});
|
||||
_this2.watcher.on('error', function (error) {
|
||||
console.log('Watcher error: ' + error);
|
||||
});
|
||||
_this2.on('load', function (name, source) {
|
||||
_this2.watcher.add(source.path);
|
||||
});
|
||||
}
|
||||
return _this2;
|
||||
}
|
||||
var _proto2 = NodeResolveLoader.prototype;
|
||||
_proto2.getSource = function getSource(name) {
|
||||
// Don't allow file-system traversal
|
||||
if (/^\.?\.?(\/|\\)/.test(name)) {
|
||||
return null;
|
||||
}
|
||||
if (/^[A-Z]:/.test(name)) {
|
||||
return null;
|
||||
}
|
||||
var fullpath;
|
||||
try {
|
||||
fullpath = require.resolve(name);
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
this.pathsToNames[fullpath] = name;
|
||||
var source = {
|
||||
src: fs.readFileSync(fullpath, 'utf-8'),
|
||||
path: fullpath,
|
||||
noCache: this.noCache
|
||||
};
|
||||
this.emit('load', name, source);
|
||||
return source;
|
||||
};
|
||||
return NodeResolveLoader;
|
||||
}(Loader);
|
||||
module.exports = {
|
||||
FileSystemLoader: FileSystemLoader,
|
||||
PrecompiledLoader: PrecompiledLoader,
|
||||
NodeResolveLoader: NodeResolveLoader
|
||||
};
|
350
node_modules/nunjucks/src/nodes.js
generated
vendored
Normal file
350
node_modules/nunjucks/src/nodes.js
generated
vendored
Normal file
@@ -0,0 +1,350 @@
|
||||
'use strict';
|
||||
|
||||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
||||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
var _require = require('./object'),
|
||||
Obj = _require.Obj;
|
||||
function traverseAndCheck(obj, type, results) {
|
||||
if (obj instanceof type) {
|
||||
results.push(obj);
|
||||
}
|
||||
if (obj instanceof Node) {
|
||||
obj.findAll(type, results);
|
||||
}
|
||||
}
|
||||
var Node = /*#__PURE__*/function (_Obj) {
|
||||
_inheritsLoose(Node, _Obj);
|
||||
function Node() {
|
||||
return _Obj.apply(this, arguments) || this;
|
||||
}
|
||||
var _proto = Node.prototype;
|
||||
_proto.init = function init(lineno, colno) {
|
||||
var _arguments = arguments,
|
||||
_this = this;
|
||||
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
||||
args[_key - 2] = arguments[_key];
|
||||
}
|
||||
this.lineno = lineno;
|
||||
this.colno = colno;
|
||||
this.fields.forEach(function (field, i) {
|
||||
// The first two args are line/col numbers, so offset by 2
|
||||
var val = _arguments[i + 2];
|
||||
|
||||
// Fields should never be undefined, but null. It makes
|
||||
// testing easier to normalize values.
|
||||
if (val === undefined) {
|
||||
val = null;
|
||||
}
|
||||
_this[field] = val;
|
||||
});
|
||||
};
|
||||
_proto.findAll = function findAll(type, results) {
|
||||
var _this2 = this;
|
||||
results = results || [];
|
||||
if (this instanceof NodeList) {
|
||||
this.children.forEach(function (child) {
|
||||
return traverseAndCheck(child, type, results);
|
||||
});
|
||||
} else {
|
||||
this.fields.forEach(function (field) {
|
||||
return traverseAndCheck(_this2[field], type, results);
|
||||
});
|
||||
}
|
||||
return results;
|
||||
};
|
||||
_proto.iterFields = function iterFields(func) {
|
||||
var _this3 = this;
|
||||
this.fields.forEach(function (field) {
|
||||
func(_this3[field], field);
|
||||
});
|
||||
};
|
||||
return Node;
|
||||
}(Obj); // Abstract nodes
|
||||
var Value = /*#__PURE__*/function (_Node) {
|
||||
_inheritsLoose(Value, _Node);
|
||||
function Value() {
|
||||
return _Node.apply(this, arguments) || this;
|
||||
}
|
||||
_createClass(Value, [{
|
||||
key: "typename",
|
||||
get: function get() {
|
||||
return 'Value';
|
||||
}
|
||||
}, {
|
||||
key: "fields",
|
||||
get: function get() {
|
||||
return ['value'];
|
||||
}
|
||||
}]);
|
||||
return Value;
|
||||
}(Node); // Concrete nodes
|
||||
var NodeList = /*#__PURE__*/function (_Node2) {
|
||||
_inheritsLoose(NodeList, _Node2);
|
||||
function NodeList() {
|
||||
return _Node2.apply(this, arguments) || this;
|
||||
}
|
||||
var _proto2 = NodeList.prototype;
|
||||
_proto2.init = function init(lineno, colno, nodes) {
|
||||
_Node2.prototype.init.call(this, lineno, colno, nodes || []);
|
||||
};
|
||||
_proto2.addChild = function addChild(node) {
|
||||
this.children.push(node);
|
||||
};
|
||||
_createClass(NodeList, [{
|
||||
key: "typename",
|
||||
get: function get() {
|
||||
return 'NodeList';
|
||||
}
|
||||
}, {
|
||||
key: "fields",
|
||||
get: function get() {
|
||||
return ['children'];
|
||||
}
|
||||
}]);
|
||||
return NodeList;
|
||||
}(Node);
|
||||
var Root = NodeList.extend('Root');
|
||||
var Literal = Value.extend('Literal');
|
||||
var _Symbol = Value.extend('Symbol');
|
||||
var Group = NodeList.extend('Group');
|
||||
var ArrayNode = NodeList.extend('Array');
|
||||
var Pair = Node.extend('Pair', {
|
||||
fields: ['key', 'value']
|
||||
});
|
||||
var Dict = NodeList.extend('Dict');
|
||||
var LookupVal = Node.extend('LookupVal', {
|
||||
fields: ['target', 'val']
|
||||
});
|
||||
var If = Node.extend('If', {
|
||||
fields: ['cond', 'body', 'else_']
|
||||
});
|
||||
var IfAsync = If.extend('IfAsync');
|
||||
var InlineIf = Node.extend('InlineIf', {
|
||||
fields: ['cond', 'body', 'else_']
|
||||
});
|
||||
var For = Node.extend('For', {
|
||||
fields: ['arr', 'name', 'body', 'else_']
|
||||
});
|
||||
var AsyncEach = For.extend('AsyncEach');
|
||||
var AsyncAll = For.extend('AsyncAll');
|
||||
var Macro = Node.extend('Macro', {
|
||||
fields: ['name', 'args', 'body']
|
||||
});
|
||||
var Caller = Macro.extend('Caller');
|
||||
var Import = Node.extend('Import', {
|
||||
fields: ['template', 'target', 'withContext']
|
||||
});
|
||||
var FromImport = /*#__PURE__*/function (_Node3) {
|
||||
_inheritsLoose(FromImport, _Node3);
|
||||
function FromImport() {
|
||||
return _Node3.apply(this, arguments) || this;
|
||||
}
|
||||
var _proto3 = FromImport.prototype;
|
||||
_proto3.init = function init(lineno, colno, template, names, withContext) {
|
||||
_Node3.prototype.init.call(this, lineno, colno, template, names || new NodeList(), withContext);
|
||||
};
|
||||
_createClass(FromImport, [{
|
||||
key: "typename",
|
||||
get: function get() {
|
||||
return 'FromImport';
|
||||
}
|
||||
}, {
|
||||
key: "fields",
|
||||
get: function get() {
|
||||
return ['template', 'names', 'withContext'];
|
||||
}
|
||||
}]);
|
||||
return FromImport;
|
||||
}(Node);
|
||||
var FunCall = Node.extend('FunCall', {
|
||||
fields: ['name', 'args']
|
||||
});
|
||||
var Filter = FunCall.extend('Filter');
|
||||
var FilterAsync = Filter.extend('FilterAsync', {
|
||||
fields: ['name', 'args', 'symbol']
|
||||
});
|
||||
var KeywordArgs = Dict.extend('KeywordArgs');
|
||||
var Block = Node.extend('Block', {
|
||||
fields: ['name', 'body']
|
||||
});
|
||||
var Super = Node.extend('Super', {
|
||||
fields: ['blockName', 'symbol']
|
||||
});
|
||||
var TemplateRef = Node.extend('TemplateRef', {
|
||||
fields: ['template']
|
||||
});
|
||||
var Extends = TemplateRef.extend('Extends');
|
||||
var Include = Node.extend('Include', {
|
||||
fields: ['template', 'ignoreMissing']
|
||||
});
|
||||
var Set = Node.extend('Set', {
|
||||
fields: ['targets', 'value']
|
||||
});
|
||||
var Switch = Node.extend('Switch', {
|
||||
fields: ['expr', 'cases', 'default']
|
||||
});
|
||||
var Case = Node.extend('Case', {
|
||||
fields: ['cond', 'body']
|
||||
});
|
||||
var Output = NodeList.extend('Output');
|
||||
var Capture = Node.extend('Capture', {
|
||||
fields: ['body']
|
||||
});
|
||||
var TemplateData = Literal.extend('TemplateData');
|
||||
var UnaryOp = Node.extend('UnaryOp', {
|
||||
fields: ['target']
|
||||
});
|
||||
var BinOp = Node.extend('BinOp', {
|
||||
fields: ['left', 'right']
|
||||
});
|
||||
var In = BinOp.extend('In');
|
||||
var Is = BinOp.extend('Is');
|
||||
var Or = BinOp.extend('Or');
|
||||
var And = BinOp.extend('And');
|
||||
var Not = UnaryOp.extend('Not');
|
||||
var Add = BinOp.extend('Add');
|
||||
var Concat = BinOp.extend('Concat');
|
||||
var Sub = BinOp.extend('Sub');
|
||||
var Mul = BinOp.extend('Mul');
|
||||
var Div = BinOp.extend('Div');
|
||||
var FloorDiv = BinOp.extend('FloorDiv');
|
||||
var Mod = BinOp.extend('Mod');
|
||||
var Pow = BinOp.extend('Pow');
|
||||
var Neg = UnaryOp.extend('Neg');
|
||||
var Pos = UnaryOp.extend('Pos');
|
||||
var Compare = Node.extend('Compare', {
|
||||
fields: ['expr', 'ops']
|
||||
});
|
||||
var CompareOperand = Node.extend('CompareOperand', {
|
||||
fields: ['expr', 'type']
|
||||
});
|
||||
var CallExtension = Node.extend('CallExtension', {
|
||||
init: function init(ext, prop, args, contentArgs) {
|
||||
this.parent();
|
||||
this.extName = ext.__name || ext;
|
||||
this.prop = prop;
|
||||
this.args = args || new NodeList();
|
||||
this.contentArgs = contentArgs || [];
|
||||
this.autoescape = ext.autoescape;
|
||||
},
|
||||
fields: ['extName', 'prop', 'args', 'contentArgs']
|
||||
});
|
||||
var CallExtensionAsync = CallExtension.extend('CallExtensionAsync');
|
||||
|
||||
// This is hacky, but this is just a debugging function anyway
|
||||
function print(str, indent, inline) {
|
||||
var lines = str.split('\n');
|
||||
lines.forEach(function (line, i) {
|
||||
if (line && (inline && i > 0 || !inline)) {
|
||||
process.stdout.write(' '.repeat(indent));
|
||||
}
|
||||
var nl = i === lines.length - 1 ? '' : '\n';
|
||||
process.stdout.write("" + line + nl);
|
||||
});
|
||||
}
|
||||
|
||||
// Print the AST in a nicely formatted tree format for debuggin
|
||||
function printNodes(node, indent) {
|
||||
indent = indent || 0;
|
||||
print(node.typename + ': ', indent);
|
||||
if (node instanceof NodeList) {
|
||||
print('\n');
|
||||
node.children.forEach(function (n) {
|
||||
printNodes(n, indent + 2);
|
||||
});
|
||||
} else if (node instanceof CallExtension) {
|
||||
print(node.extName + "." + node.prop + "\n");
|
||||
if (node.args) {
|
||||
printNodes(node.args, indent + 2);
|
||||
}
|
||||
if (node.contentArgs) {
|
||||
node.contentArgs.forEach(function (n) {
|
||||
printNodes(n, indent + 2);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
var nodes = [];
|
||||
var props = null;
|
||||
node.iterFields(function (val, fieldName) {
|
||||
if (val instanceof Node) {
|
||||
nodes.push([fieldName, val]);
|
||||
} else {
|
||||
props = props || {};
|
||||
props[fieldName] = val;
|
||||
}
|
||||
});
|
||||
if (props) {
|
||||
print(JSON.stringify(props, null, 2) + '\n', null, true);
|
||||
} else {
|
||||
print('\n');
|
||||
}
|
||||
nodes.forEach(function (_ref) {
|
||||
var fieldName = _ref[0],
|
||||
n = _ref[1];
|
||||
print("[" + fieldName + "] =>", indent + 2);
|
||||
printNodes(n, indent + 4);
|
||||
});
|
||||
}
|
||||
}
|
||||
module.exports = {
|
||||
Node: Node,
|
||||
Root: Root,
|
||||
NodeList: NodeList,
|
||||
Value: Value,
|
||||
Literal: Literal,
|
||||
Symbol: _Symbol,
|
||||
Group: Group,
|
||||
Array: ArrayNode,
|
||||
Pair: Pair,
|
||||
Dict: Dict,
|
||||
Output: Output,
|
||||
Capture: Capture,
|
||||
TemplateData: TemplateData,
|
||||
If: If,
|
||||
IfAsync: IfAsync,
|
||||
InlineIf: InlineIf,
|
||||
For: For,
|
||||
AsyncEach: AsyncEach,
|
||||
AsyncAll: AsyncAll,
|
||||
Macro: Macro,
|
||||
Caller: Caller,
|
||||
Import: Import,
|
||||
FromImport: FromImport,
|
||||
FunCall: FunCall,
|
||||
Filter: Filter,
|
||||
FilterAsync: FilterAsync,
|
||||
KeywordArgs: KeywordArgs,
|
||||
Block: Block,
|
||||
Super: Super,
|
||||
Extends: Extends,
|
||||
Include: Include,
|
||||
Set: Set,
|
||||
Switch: Switch,
|
||||
Case: Case,
|
||||
LookupVal: LookupVal,
|
||||
BinOp: BinOp,
|
||||
In: In,
|
||||
Is: Is,
|
||||
Or: Or,
|
||||
And: And,
|
||||
Not: Not,
|
||||
Add: Add,
|
||||
Concat: Concat,
|
||||
Sub: Sub,
|
||||
Mul: Mul,
|
||||
Div: Div,
|
||||
FloorDiv: FloorDiv,
|
||||
Mod: Mod,
|
||||
Pow: Pow,
|
||||
Neg: Neg,
|
||||
Pos: Pos,
|
||||
Compare: Compare,
|
||||
CompareOperand: CompareOperand,
|
||||
CallExtension: CallExtension,
|
||||
CallExtensionAsync: CallExtensionAsync,
|
||||
printNodes: printNodes
|
||||
};
|
100
node_modules/nunjucks/src/object.js
generated
vendored
Normal file
100
node_modules/nunjucks/src/object.js
generated
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
'use strict';
|
||||
|
||||
// A simple class system, more documentation to come
|
||||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
||||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
||||
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
||||
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
||||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
var EventEmitter = require('events');
|
||||
var lib = require('./lib');
|
||||
function parentWrap(parent, prop) {
|
||||
if (typeof parent !== 'function' || typeof prop !== 'function') {
|
||||
return prop;
|
||||
}
|
||||
return function wrap() {
|
||||
// Save the current parent method
|
||||
var tmp = this.parent;
|
||||
|
||||
// Set parent to the previous method, call, and restore
|
||||
this.parent = parent;
|
||||
var res = prop.apply(this, arguments);
|
||||
this.parent = tmp;
|
||||
return res;
|
||||
};
|
||||
}
|
||||
function extendClass(cls, name, props) {
|
||||
props = props || {};
|
||||
lib.keys(props).forEach(function (k) {
|
||||
props[k] = parentWrap(cls.prototype[k], props[k]);
|
||||
});
|
||||
var subclass = /*#__PURE__*/function (_cls) {
|
||||
_inheritsLoose(subclass, _cls);
|
||||
function subclass() {
|
||||
return _cls.apply(this, arguments) || this;
|
||||
}
|
||||
_createClass(subclass, [{
|
||||
key: "typename",
|
||||
get: function get() {
|
||||
return name;
|
||||
}
|
||||
}]);
|
||||
return subclass;
|
||||
}(cls);
|
||||
lib._assign(subclass.prototype, props);
|
||||
return subclass;
|
||||
}
|
||||
var Obj = /*#__PURE__*/function () {
|
||||
function Obj() {
|
||||
// Unfortunately necessary for backwards compatibility
|
||||
this.init.apply(this, arguments);
|
||||
}
|
||||
var _proto = Obj.prototype;
|
||||
_proto.init = function init() {};
|
||||
Obj.extend = function extend(name, props) {
|
||||
if (typeof name === 'object') {
|
||||
props = name;
|
||||
name = 'anonymous';
|
||||
}
|
||||
return extendClass(this, name, props);
|
||||
};
|
||||
_createClass(Obj, [{
|
||||
key: "typename",
|
||||
get: function get() {
|
||||
return this.constructor.name;
|
||||
}
|
||||
}]);
|
||||
return Obj;
|
||||
}();
|
||||
var EmitterObj = /*#__PURE__*/function (_EventEmitter) {
|
||||
_inheritsLoose(EmitterObj, _EventEmitter);
|
||||
function EmitterObj() {
|
||||
var _this2;
|
||||
var _this;
|
||||
_this = _EventEmitter.call(this) || this;
|
||||
// Unfortunately necessary for backwards compatibility
|
||||
(_this2 = _this).init.apply(_this2, arguments);
|
||||
return _this;
|
||||
}
|
||||
var _proto2 = EmitterObj.prototype;
|
||||
_proto2.init = function init() {};
|
||||
EmitterObj.extend = function extend(name, props) {
|
||||
if (typeof name === 'object') {
|
||||
props = name;
|
||||
name = 'anonymous';
|
||||
}
|
||||
return extendClass(this, name, props);
|
||||
};
|
||||
_createClass(EmitterObj, [{
|
||||
key: "typename",
|
||||
get: function get() {
|
||||
return this.constructor.name;
|
||||
}
|
||||
}]);
|
||||
return EmitterObj;
|
||||
}(EventEmitter);
|
||||
module.exports = {
|
||||
Obj: Obj,
|
||||
EmitterObj: EmitterObj
|
||||
};
|
1028
node_modules/nunjucks/src/parser.js
generated
vendored
Normal file
1028
node_modules/nunjucks/src/parser.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
17
node_modules/nunjucks/src/precompile-global.js
generated
vendored
Normal file
17
node_modules/nunjucks/src/precompile-global.js
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
'use strict';
|
||||
|
||||
function precompileGlobal(templates, opts) {
|
||||
var out = '';
|
||||
opts = opts || {};
|
||||
for (var i = 0; i < templates.length; i++) {
|
||||
var name = JSON.stringify(templates[i].name);
|
||||
var template = templates[i].template;
|
||||
out += '(function() {' + '(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})' + '[' + name + '] = (function() {\n' + template + '\n})();\n';
|
||||
if (opts.asFunction) {
|
||||
out += 'return function(ctx, cb) { return nunjucks.render(' + name + ', ctx, cb); }\n';
|
||||
}
|
||||
out += '})();\n';
|
||||
}
|
||||
return out;
|
||||
}
|
||||
module.exports = precompileGlobal;
|
108
node_modules/nunjucks/src/precompile.js
generated
vendored
Normal file
108
node_modules/nunjucks/src/precompile.js
generated
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var _require = require('./lib'),
|
||||
_prettifyError = _require._prettifyError;
|
||||
var compiler = require('./compiler');
|
||||
var _require2 = require('./environment'),
|
||||
Environment = _require2.Environment;
|
||||
var precompileGlobal = require('./precompile-global');
|
||||
function match(filename, patterns) {
|
||||
if (!Array.isArray(patterns)) {
|
||||
return false;
|
||||
}
|
||||
return patterns.some(function (pattern) {
|
||||
return filename.match(pattern);
|
||||
});
|
||||
}
|
||||
function precompileString(str, opts) {
|
||||
opts = opts || {};
|
||||
opts.isString = true;
|
||||
var env = opts.env || new Environment([]);
|
||||
var wrapper = opts.wrapper || precompileGlobal;
|
||||
if (!opts.name) {
|
||||
throw new Error('the "name" option is required when compiling a string');
|
||||
}
|
||||
return wrapper([_precompile(str, opts.name, env)], opts);
|
||||
}
|
||||
function precompile(input, opts) {
|
||||
// The following options are available:
|
||||
//
|
||||
// * name: name of the template (auto-generated when compiling a directory)
|
||||
// * isString: input is a string, not a file path
|
||||
// * asFunction: generate a callable function
|
||||
// * force: keep compiling on error
|
||||
// * env: the Environment to use (gets extensions and async filters from it)
|
||||
// * include: which file/folders to include (folders are auto-included, files are auto-excluded)
|
||||
// * exclude: which file/folders to exclude (folders are auto-included, files are auto-excluded)
|
||||
// * wrapper: function(templates, opts) {...}
|
||||
// Customize the output format to store the compiled template.
|
||||
// By default, templates are stored in a global variable used by the runtime.
|
||||
// A custom loader will be necessary to load your custom wrapper.
|
||||
|
||||
opts = opts || {};
|
||||
var env = opts.env || new Environment([]);
|
||||
var wrapper = opts.wrapper || precompileGlobal;
|
||||
if (opts.isString) {
|
||||
return precompileString(input, opts);
|
||||
}
|
||||
var pathStats = fs.existsSync(input) && fs.statSync(input);
|
||||
var precompiled = [];
|
||||
var templates = [];
|
||||
function addTemplates(dir) {
|
||||
fs.readdirSync(dir).forEach(function (file) {
|
||||
var filepath = path.join(dir, file);
|
||||
var subpath = filepath.substr(path.join(input, '/').length);
|
||||
var stat = fs.statSync(filepath);
|
||||
if (stat && stat.isDirectory()) {
|
||||
subpath += '/';
|
||||
if (!match(subpath, opts.exclude)) {
|
||||
addTemplates(filepath);
|
||||
}
|
||||
} else if (match(subpath, opts.include)) {
|
||||
templates.push(filepath);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (pathStats.isFile()) {
|
||||
precompiled.push(_precompile(fs.readFileSync(input, 'utf-8'), opts.name || input, env));
|
||||
} else if (pathStats.isDirectory()) {
|
||||
addTemplates(input);
|
||||
for (var i = 0; i < templates.length; i++) {
|
||||
var name = templates[i].replace(path.join(input, '/'), '');
|
||||
try {
|
||||
precompiled.push(_precompile(fs.readFileSync(templates[i], 'utf-8'), name, env));
|
||||
} catch (e) {
|
||||
if (opts.force) {
|
||||
// Don't stop generating the output if we're
|
||||
// forcing compilation.
|
||||
console.error(e); // eslint-disable-line no-console
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return wrapper(precompiled, opts);
|
||||
}
|
||||
function _precompile(str, name, env) {
|
||||
env = env || new Environment([]);
|
||||
var asyncFilters = env.asyncFilters;
|
||||
var extensions = env.extensionsList;
|
||||
var template;
|
||||
name = name.replace(/\\/g, '/');
|
||||
try {
|
||||
template = compiler.compile(str, asyncFilters, extensions, name, env.opts);
|
||||
} catch (err) {
|
||||
throw _prettifyError(name, false, err);
|
||||
}
|
||||
return {
|
||||
name: name,
|
||||
template: template
|
||||
};
|
||||
}
|
||||
module.exports = {
|
||||
precompile: precompile,
|
||||
precompileString: precompileString
|
||||
};
|
31
node_modules/nunjucks/src/precompiled-loader.js
generated
vendored
Normal file
31
node_modules/nunjucks/src/precompiled-loader.js
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
'use strict';
|
||||
|
||||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
var Loader = require('./loader');
|
||||
var PrecompiledLoader = /*#__PURE__*/function (_Loader) {
|
||||
_inheritsLoose(PrecompiledLoader, _Loader);
|
||||
function PrecompiledLoader(compiledTemplates) {
|
||||
var _this;
|
||||
_this = _Loader.call(this) || this;
|
||||
_this.precompiled = compiledTemplates || {};
|
||||
return _this;
|
||||
}
|
||||
var _proto = PrecompiledLoader.prototype;
|
||||
_proto.getSource = function getSource(name) {
|
||||
if (this.precompiled[name]) {
|
||||
return {
|
||||
src: {
|
||||
type: 'code',
|
||||
obj: this.precompiled[name]
|
||||
},
|
||||
path: name
|
||||
};
|
||||
}
|
||||
return null;
|
||||
};
|
||||
return PrecompiledLoader;
|
||||
}(Loader);
|
||||
module.exports = {
|
||||
PrecompiledLoader: PrecompiledLoader
|
||||
};
|
333
node_modules/nunjucks/src/runtime.js
generated
vendored
Normal file
333
node_modules/nunjucks/src/runtime.js
generated
vendored
Normal file
@@ -0,0 +1,333 @@
|
||||
'use strict';
|
||||
|
||||
var lib = require('./lib');
|
||||
var arrayFrom = Array.from;
|
||||
var supportsIterators = typeof Symbol === 'function' && Symbol.iterator && typeof arrayFrom === 'function';
|
||||
|
||||
// Frames keep track of scoping both at compile-time and run-time so
|
||||
// we know how to access variables. Block tags can introduce special
|
||||
// variables, for example.
|
||||
var Frame = /*#__PURE__*/function () {
|
||||
function Frame(parent, isolateWrites) {
|
||||
this.variables = Object.create(null);
|
||||
this.parent = parent;
|
||||
this.topLevel = false;
|
||||
// if this is true, writes (set) should never propagate upwards past
|
||||
// this frame to its parent (though reads may).
|
||||
this.isolateWrites = isolateWrites;
|
||||
}
|
||||
var _proto = Frame.prototype;
|
||||
_proto.set = function set(name, val, resolveUp) {
|
||||
// Allow variables with dots by automatically creating the
|
||||
// nested structure
|
||||
var parts = name.split('.');
|
||||
var obj = this.variables;
|
||||
var frame = this;
|
||||
if (resolveUp) {
|
||||
if (frame = this.resolve(parts[0], true)) {
|
||||
frame.set(name, val);
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < parts.length - 1; i++) {
|
||||
var id = parts[i];
|
||||
if (!obj[id]) {
|
||||
obj[id] = {};
|
||||
}
|
||||
obj = obj[id];
|
||||
}
|
||||
obj[parts[parts.length - 1]] = val;
|
||||
};
|
||||
_proto.get = function get(name) {
|
||||
var val = this.variables[name];
|
||||
if (val !== undefined) {
|
||||
return val;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
_proto.lookup = function lookup(name) {
|
||||
var p = this.parent;
|
||||
var val = this.variables[name];
|
||||
if (val !== undefined) {
|
||||
return val;
|
||||
}
|
||||
return p && p.lookup(name);
|
||||
};
|
||||
_proto.resolve = function resolve(name, forWrite) {
|
||||
var p = forWrite && this.isolateWrites ? undefined : this.parent;
|
||||
var val = this.variables[name];
|
||||
if (val !== undefined) {
|
||||
return this;
|
||||
}
|
||||
return p && p.resolve(name);
|
||||
};
|
||||
_proto.push = function push(isolateWrites) {
|
||||
return new Frame(this, isolateWrites);
|
||||
};
|
||||
_proto.pop = function pop() {
|
||||
return this.parent;
|
||||
};
|
||||
return Frame;
|
||||
}();
|
||||
function makeMacro(argNames, kwargNames, func) {
|
||||
return function macro() {
|
||||
for (var _len = arguments.length, macroArgs = new Array(_len), _key = 0; _key < _len; _key++) {
|
||||
macroArgs[_key] = arguments[_key];
|
||||
}
|
||||
var argCount = numArgs(macroArgs);
|
||||
var args;
|
||||
var kwargs = getKeywordArgs(macroArgs);
|
||||
if (argCount > argNames.length) {
|
||||
args = macroArgs.slice(0, argNames.length);
|
||||
|
||||
// Positional arguments that should be passed in as
|
||||
// keyword arguments (essentially default values)
|
||||
macroArgs.slice(args.length, argCount).forEach(function (val, i) {
|
||||
if (i < kwargNames.length) {
|
||||
kwargs[kwargNames[i]] = val;
|
||||
}
|
||||
});
|
||||
args.push(kwargs);
|
||||
} else if (argCount < argNames.length) {
|
||||
args = macroArgs.slice(0, argCount);
|
||||
for (var i = argCount; i < argNames.length; i++) {
|
||||
var arg = argNames[i];
|
||||
|
||||
// Keyword arguments that should be passed as
|
||||
// positional arguments, i.e. the caller explicitly
|
||||
// used the name of a positional arg
|
||||
args.push(kwargs[arg]);
|
||||
delete kwargs[arg];
|
||||
}
|
||||
args.push(kwargs);
|
||||
} else {
|
||||
args = macroArgs;
|
||||
}
|
||||
return func.apply(this, args);
|
||||
};
|
||||
}
|
||||
function makeKeywordArgs(obj) {
|
||||
obj.__keywords = true;
|
||||
return obj;
|
||||
}
|
||||
function isKeywordArgs(obj) {
|
||||
return obj && Object.prototype.hasOwnProperty.call(obj, '__keywords');
|
||||
}
|
||||
function getKeywordArgs(args) {
|
||||
var len = args.length;
|
||||
if (len) {
|
||||
var lastArg = args[len - 1];
|
||||
if (isKeywordArgs(lastArg)) {
|
||||
return lastArg;
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
function numArgs(args) {
|
||||
var len = args.length;
|
||||
if (len === 0) {
|
||||
return 0;
|
||||
}
|
||||
var lastArg = args[len - 1];
|
||||
if (isKeywordArgs(lastArg)) {
|
||||
return len - 1;
|
||||
} else {
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
// A SafeString object indicates that the string should not be
|
||||
// autoescaped. This happens magically because autoescaping only
|
||||
// occurs on primitive string objects.
|
||||
function SafeString(val) {
|
||||
if (typeof val !== 'string') {
|
||||
return val;
|
||||
}
|
||||
this.val = val;
|
||||
this.length = val.length;
|
||||
}
|
||||
SafeString.prototype = Object.create(String.prototype, {
|
||||
length: {
|
||||
writable: true,
|
||||
configurable: true,
|
||||
value: 0
|
||||
}
|
||||
});
|
||||
SafeString.prototype.valueOf = function valueOf() {
|
||||
return this.val;
|
||||
};
|
||||
SafeString.prototype.toString = function toString() {
|
||||
return this.val;
|
||||
};
|
||||
function copySafeness(dest, target) {
|
||||
if (dest instanceof SafeString) {
|
||||
return new SafeString(target);
|
||||
}
|
||||
return target.toString();
|
||||
}
|
||||
function markSafe(val) {
|
||||
var type = typeof val;
|
||||
if (type === 'string') {
|
||||
return new SafeString(val);
|
||||
} else if (type !== 'function') {
|
||||
return val;
|
||||
} else {
|
||||
return function wrapSafe(args) {
|
||||
var ret = val.apply(this, arguments);
|
||||
if (typeof ret === 'string') {
|
||||
return new SafeString(ret);
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
}
|
||||
}
|
||||
function suppressValue(val, autoescape) {
|
||||
val = val !== undefined && val !== null ? val : '';
|
||||
if (autoescape && !(val instanceof SafeString)) {
|
||||
val = lib.escape(val.toString());
|
||||
}
|
||||
return val;
|
||||
}
|
||||
function ensureDefined(val, lineno, colno) {
|
||||
if (val === null || val === undefined) {
|
||||
throw new lib.TemplateError('attempted to output null or undefined value', lineno + 1, colno + 1);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
function memberLookup(obj, val) {
|
||||
if (obj === undefined || obj === null) {
|
||||
return undefined;
|
||||
}
|
||||
if (typeof obj[val] === 'function') {
|
||||
return function () {
|
||||
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
||||
args[_key2] = arguments[_key2];
|
||||
}
|
||||
return obj[val].apply(obj, args);
|
||||
};
|
||||
}
|
||||
return obj[val];
|
||||
}
|
||||
function callWrap(obj, name, context, args) {
|
||||
if (!obj) {
|
||||
throw new Error('Unable to call `' + name + '`, which is undefined or falsey');
|
||||
} else if (typeof obj !== 'function') {
|
||||
throw new Error('Unable to call `' + name + '`, which is not a function');
|
||||
}
|
||||
return obj.apply(context, args);
|
||||
}
|
||||
function contextOrFrameLookup(context, frame, name) {
|
||||
var val = frame.lookup(name);
|
||||
return val !== undefined ? val : context.lookup(name);
|
||||
}
|
||||
function handleError(error, lineno, colno) {
|
||||
if (error.lineno) {
|
||||
return error;
|
||||
} else {
|
||||
return new lib.TemplateError(error, lineno, colno);
|
||||
}
|
||||
}
|
||||
function asyncEach(arr, dimen, iter, cb) {
|
||||
if (lib.isArray(arr)) {
|
||||
var len = arr.length;
|
||||
lib.asyncIter(arr, function iterCallback(item, i, next) {
|
||||
switch (dimen) {
|
||||
case 1:
|
||||
iter(item, i, len, next);
|
||||
break;
|
||||
case 2:
|
||||
iter(item[0], item[1], i, len, next);
|
||||
break;
|
||||
case 3:
|
||||
iter(item[0], item[1], item[2], i, len, next);
|
||||
break;
|
||||
default:
|
||||
item.push(i, len, next);
|
||||
iter.apply(this, item);
|
||||
}
|
||||
}, cb);
|
||||
} else {
|
||||
lib.asyncFor(arr, function iterCallback(key, val, i, len, next) {
|
||||
iter(key, val, i, len, next);
|
||||
}, cb);
|
||||
}
|
||||
}
|
||||
function asyncAll(arr, dimen, func, cb) {
|
||||
var finished = 0;
|
||||
var len;
|
||||
var outputArr;
|
||||
function done(i, output) {
|
||||
finished++;
|
||||
outputArr[i] = output;
|
||||
if (finished === len) {
|
||||
cb(null, outputArr.join(''));
|
||||
}
|
||||
}
|
||||
if (lib.isArray(arr)) {
|
||||
len = arr.length;
|
||||
outputArr = new Array(len);
|
||||
if (len === 0) {
|
||||
cb(null, '');
|
||||
} else {
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
var item = arr[i];
|
||||
switch (dimen) {
|
||||
case 1:
|
||||
func(item, i, len, done);
|
||||
break;
|
||||
case 2:
|
||||
func(item[0], item[1], i, len, done);
|
||||
break;
|
||||
case 3:
|
||||
func(item[0], item[1], item[2], i, len, done);
|
||||
break;
|
||||
default:
|
||||
item.push(i, len, done);
|
||||
func.apply(this, item);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var keys = lib.keys(arr || {});
|
||||
len = keys.length;
|
||||
outputArr = new Array(len);
|
||||
if (len === 0) {
|
||||
cb(null, '');
|
||||
} else {
|
||||
for (var _i = 0; _i < keys.length; _i++) {
|
||||
var k = keys[_i];
|
||||
func(k, arr[k], _i, len, done);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function fromIterator(arr) {
|
||||
if (typeof arr !== 'object' || arr === null || lib.isArray(arr)) {
|
||||
return arr;
|
||||
} else if (supportsIterators && Symbol.iterator in arr) {
|
||||
return arrayFrom(arr);
|
||||
} else {
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
module.exports = {
|
||||
Frame: Frame,
|
||||
makeMacro: makeMacro,
|
||||
makeKeywordArgs: makeKeywordArgs,
|
||||
numArgs: numArgs,
|
||||
suppressValue: suppressValue,
|
||||
ensureDefined: ensureDefined,
|
||||
memberLookup: memberLookup,
|
||||
contextOrFrameLookup: contextOrFrameLookup,
|
||||
callWrap: callWrap,
|
||||
handleError: handleError,
|
||||
isArray: lib.isArray,
|
||||
keys: lib.keys,
|
||||
SafeString: SafeString,
|
||||
copySafeness: copySafeness,
|
||||
markSafe: markSafe,
|
||||
asyncEach: asyncEach,
|
||||
asyncAll: asyncAll,
|
||||
inOperator: lib.inOperator,
|
||||
fromIterator: fromIterator
|
||||
};
|
265
node_modules/nunjucks/src/tests.js
generated
vendored
Normal file
265
node_modules/nunjucks/src/tests.js
generated
vendored
Normal file
@@ -0,0 +1,265 @@
|
||||
'use strict';
|
||||
|
||||
var SafeString = require('./runtime').SafeString;
|
||||
|
||||
/**
|
||||
* Returns `true` if the object is a function, otherwise `false`.
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function callable(value) {
|
||||
return typeof value === 'function';
|
||||
}
|
||||
exports.callable = callable;
|
||||
|
||||
/**
|
||||
* Returns `true` if the object is strictly not `undefined`.
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function defined(value) {
|
||||
return value !== undefined;
|
||||
}
|
||||
exports.defined = defined;
|
||||
|
||||
/**
|
||||
* Returns `true` if the operand (one) is divisble by the test's argument
|
||||
* (two).
|
||||
* @param { number } one
|
||||
* @param { number } two
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function divisibleby(one, two) {
|
||||
return one % two === 0;
|
||||
}
|
||||
exports.divisibleby = divisibleby;
|
||||
|
||||
/**
|
||||
* Returns true if the string has been escaped (i.e., is a SafeString).
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function escaped(value) {
|
||||
return value instanceof SafeString;
|
||||
}
|
||||
exports.escaped = escaped;
|
||||
|
||||
/**
|
||||
* Returns `true` if the arguments are strictly equal.
|
||||
* @param { any } one
|
||||
* @param { any } two
|
||||
*/
|
||||
function equalto(one, two) {
|
||||
return one === two;
|
||||
}
|
||||
exports.equalto = equalto;
|
||||
|
||||
// Aliases
|
||||
exports.eq = exports.equalto;
|
||||
exports.sameas = exports.equalto;
|
||||
|
||||
/**
|
||||
* Returns `true` if the value is evenly divisible by 2.
|
||||
* @param { number } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function even(value) {
|
||||
return value % 2 === 0;
|
||||
}
|
||||
exports.even = even;
|
||||
|
||||
/**
|
||||
* Returns `true` if the value is falsy - if I recall correctly, '', 0, false,
|
||||
* undefined, NaN or null. I don't know if we should stick to the default JS
|
||||
* behavior or attempt to replicate what Python believes should be falsy (i.e.,
|
||||
* empty arrays, empty dicts, not 0...).
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function falsy(value) {
|
||||
return !value;
|
||||
}
|
||||
exports.falsy = falsy;
|
||||
|
||||
/**
|
||||
* Returns `true` if the operand (one) is greater or equal to the test's
|
||||
* argument (two).
|
||||
* @param { number } one
|
||||
* @param { number } two
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function ge(one, two) {
|
||||
return one >= two;
|
||||
}
|
||||
exports.ge = ge;
|
||||
|
||||
/**
|
||||
* Returns `true` if the operand (one) is greater than the test's argument
|
||||
* (two).
|
||||
* @param { number } one
|
||||
* @param { number } two
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function greaterthan(one, two) {
|
||||
return one > two;
|
||||
}
|
||||
exports.greaterthan = greaterthan;
|
||||
|
||||
// alias
|
||||
exports.gt = exports.greaterthan;
|
||||
|
||||
/**
|
||||
* Returns `true` if the operand (one) is less than or equal to the test's
|
||||
* argument (two).
|
||||
* @param { number } one
|
||||
* @param { number } two
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function le(one, two) {
|
||||
return one <= two;
|
||||
}
|
||||
exports.le = le;
|
||||
|
||||
/**
|
||||
* Returns `true` if the operand (one) is less than the test's passed argument
|
||||
* (two).
|
||||
* @param { number } one
|
||||
* @param { number } two
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function lessthan(one, two) {
|
||||
return one < two;
|
||||
}
|
||||
exports.lessthan = lessthan;
|
||||
|
||||
// alias
|
||||
exports.lt = exports.lessthan;
|
||||
|
||||
/**
|
||||
* Returns `true` if the string is lowercased.
|
||||
* @param { string } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function lower(value) {
|
||||
return value.toLowerCase() === value;
|
||||
}
|
||||
exports.lower = lower;
|
||||
|
||||
/**
|
||||
* Returns `true` if the operand (one) is less than or equal to the test's
|
||||
* argument (two).
|
||||
* @param { number } one
|
||||
* @param { number } two
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function ne(one, two) {
|
||||
return one !== two;
|
||||
}
|
||||
exports.ne = ne;
|
||||
|
||||
/**
|
||||
* Returns true if the value is strictly equal to `null`.
|
||||
* @param { any }
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function nullTest(value) {
|
||||
return value === null;
|
||||
}
|
||||
exports.null = nullTest;
|
||||
|
||||
/**
|
||||
* Returns true if value is a number.
|
||||
* @param { any }
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function number(value) {
|
||||
return typeof value === 'number';
|
||||
}
|
||||
exports.number = number;
|
||||
|
||||
/**
|
||||
* Returns `true` if the value is *not* evenly divisible by 2.
|
||||
* @param { number } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function odd(value) {
|
||||
return value % 2 === 1;
|
||||
}
|
||||
exports.odd = odd;
|
||||
|
||||
/**
|
||||
* Returns `true` if the value is a string, `false` if not.
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function string(value) {
|
||||
return typeof value === 'string';
|
||||
}
|
||||
exports.string = string;
|
||||
|
||||
/**
|
||||
* Returns `true` if the value is not in the list of things considered falsy:
|
||||
* '', null, undefined, 0, NaN and false.
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function truthy(value) {
|
||||
return !!value;
|
||||
}
|
||||
exports.truthy = truthy;
|
||||
|
||||
/**
|
||||
* Returns `true` if the value is undefined.
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function undefinedTest(value) {
|
||||
return value === undefined;
|
||||
}
|
||||
exports.undefined = undefinedTest;
|
||||
|
||||
/**
|
||||
* Returns `true` if the string is uppercased.
|
||||
* @param { string } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function upper(value) {
|
||||
return value.toUpperCase() === value;
|
||||
}
|
||||
exports.upper = upper;
|
||||
|
||||
/**
|
||||
* If ES6 features are available, returns `true` if the value implements the
|
||||
* `Symbol.iterator` method. If not, it's a string or Array.
|
||||
*
|
||||
* Could potentially cause issues if a browser exists that has Set and Map but
|
||||
* not Symbol.
|
||||
*
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function iterable(value) {
|
||||
if (typeof Symbol !== 'undefined') {
|
||||
return !!value[Symbol.iterator];
|
||||
} else {
|
||||
return Array.isArray(value) || typeof value === 'string';
|
||||
}
|
||||
}
|
||||
exports.iterable = iterable;
|
||||
|
||||
/**
|
||||
* If ES6 features are available, returns `true` if the value is an object hash
|
||||
* or an ES6 Map. Otherwise just return if it's an object hash.
|
||||
* @param { any } value
|
||||
* @returns { boolean }
|
||||
*/
|
||||
function mapping(value) {
|
||||
// only maps and object hashes
|
||||
var bool = value !== null && value !== undefined && typeof value === 'object' && !Array.isArray(value);
|
||||
if (Set) {
|
||||
return bool && !(value instanceof Set);
|
||||
} else {
|
||||
return bool;
|
||||
}
|
||||
}
|
||||
exports.mapping = mapping;
|
166
node_modules/nunjucks/src/transformer.js
generated
vendored
Normal file
166
node_modules/nunjucks/src/transformer.js
generated
vendored
Normal file
@@ -0,0 +1,166 @@
|
||||
'use strict';
|
||||
|
||||
var nodes = require('./nodes');
|
||||
var lib = require('./lib');
|
||||
var sym = 0;
|
||||
function gensym() {
|
||||
return 'hole_' + sym++;
|
||||
}
|
||||
|
||||
// copy-on-write version of map
|
||||
function mapCOW(arr, func) {
|
||||
var res = null;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
var item = func(arr[i]);
|
||||
if (item !== arr[i]) {
|
||||
if (!res) {
|
||||
res = arr.slice();
|
||||
}
|
||||
res[i] = item;
|
||||
}
|
||||
}
|
||||
return res || arr;
|
||||
}
|
||||
function walk(ast, func, depthFirst) {
|
||||
if (!(ast instanceof nodes.Node)) {
|
||||
return ast;
|
||||
}
|
||||
if (!depthFirst) {
|
||||
var astT = func(ast);
|
||||
if (astT && astT !== ast) {
|
||||
return astT;
|
||||
}
|
||||
}
|
||||
if (ast instanceof nodes.NodeList) {
|
||||
var children = mapCOW(ast.children, function (node) {
|
||||
return walk(node, func, depthFirst);
|
||||
});
|
||||
if (children !== ast.children) {
|
||||
ast = new nodes[ast.typename](ast.lineno, ast.colno, children);
|
||||
}
|
||||
} else if (ast instanceof nodes.CallExtension) {
|
||||
var args = walk(ast.args, func, depthFirst);
|
||||
var contentArgs = mapCOW(ast.contentArgs, function (node) {
|
||||
return walk(node, func, depthFirst);
|
||||
});
|
||||
if (args !== ast.args || contentArgs !== ast.contentArgs) {
|
||||
ast = new nodes[ast.typename](ast.extName, ast.prop, args, contentArgs);
|
||||
}
|
||||
} else {
|
||||
var props = ast.fields.map(function (field) {
|
||||
return ast[field];
|
||||
});
|
||||
var propsT = mapCOW(props, function (prop) {
|
||||
return walk(prop, func, depthFirst);
|
||||
});
|
||||
if (propsT !== props) {
|
||||
ast = new nodes[ast.typename](ast.lineno, ast.colno);
|
||||
propsT.forEach(function (prop, i) {
|
||||
ast[ast.fields[i]] = prop;
|
||||
});
|
||||
}
|
||||
}
|
||||
return depthFirst ? func(ast) || ast : ast;
|
||||
}
|
||||
function depthWalk(ast, func) {
|
||||
return walk(ast, func, true);
|
||||
}
|
||||
function _liftFilters(node, asyncFilters, prop) {
|
||||
var children = [];
|
||||
var walked = depthWalk(prop ? node[prop] : node, function (descNode) {
|
||||
var symbol;
|
||||
if (descNode instanceof nodes.Block) {
|
||||
return descNode;
|
||||
} else if (descNode instanceof nodes.Filter && lib.indexOf(asyncFilters, descNode.name.value) !== -1 || descNode instanceof nodes.CallExtensionAsync) {
|
||||
symbol = new nodes.Symbol(descNode.lineno, descNode.colno, gensym());
|
||||
children.push(new nodes.FilterAsync(descNode.lineno, descNode.colno, descNode.name, descNode.args, symbol));
|
||||
}
|
||||
return symbol;
|
||||
});
|
||||
if (prop) {
|
||||
node[prop] = walked;
|
||||
} else {
|
||||
node = walked;
|
||||
}
|
||||
if (children.length) {
|
||||
children.push(node);
|
||||
return new nodes.NodeList(node.lineno, node.colno, children);
|
||||
} else {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
function liftFilters(ast, asyncFilters) {
|
||||
return depthWalk(ast, function (node) {
|
||||
if (node instanceof nodes.Output) {
|
||||
return _liftFilters(node, asyncFilters);
|
||||
} else if (node instanceof nodes.Set) {
|
||||
return _liftFilters(node, asyncFilters, 'value');
|
||||
} else if (node instanceof nodes.For) {
|
||||
return _liftFilters(node, asyncFilters, 'arr');
|
||||
} else if (node instanceof nodes.If) {
|
||||
return _liftFilters(node, asyncFilters, 'cond');
|
||||
} else if (node instanceof nodes.CallExtension) {
|
||||
return _liftFilters(node, asyncFilters, 'args');
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
}
|
||||
function liftSuper(ast) {
|
||||
return walk(ast, function (blockNode) {
|
||||
if (!(blockNode instanceof nodes.Block)) {
|
||||
return;
|
||||
}
|
||||
var hasSuper = false;
|
||||
var symbol = gensym();
|
||||
blockNode.body = walk(blockNode.body, function (node) {
|
||||
// eslint-disable-line consistent-return
|
||||
if (node instanceof nodes.FunCall && node.name.value === 'super') {
|
||||
hasSuper = true;
|
||||
return new nodes.Symbol(node.lineno, node.colno, symbol);
|
||||
}
|
||||
});
|
||||
if (hasSuper) {
|
||||
blockNode.body.children.unshift(new nodes.Super(0, 0, blockNode.name, new nodes.Symbol(0, 0, symbol)));
|
||||
}
|
||||
});
|
||||
}
|
||||
function convertStatements(ast) {
|
||||
return depthWalk(ast, function (node) {
|
||||
if (!(node instanceof nodes.If) && !(node instanceof nodes.For)) {
|
||||
return undefined;
|
||||
}
|
||||
var async = false;
|
||||
walk(node, function (child) {
|
||||
if (child instanceof nodes.FilterAsync || child instanceof nodes.IfAsync || child instanceof nodes.AsyncEach || child instanceof nodes.AsyncAll || child instanceof nodes.CallExtensionAsync) {
|
||||
async = true;
|
||||
// Stop iterating by returning the node
|
||||
return child;
|
||||
}
|
||||
return undefined;
|
||||
});
|
||||
if (async) {
|
||||
if (node instanceof nodes.If) {
|
||||
return new nodes.IfAsync(node.lineno, node.colno, node.cond, node.body, node.else_);
|
||||
} else if (node instanceof nodes.For && !(node instanceof nodes.AsyncAll)) {
|
||||
return new nodes.AsyncEach(node.lineno, node.colno, node.arr, node.name, node.body, node.else_);
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
});
|
||||
}
|
||||
function cps(ast, asyncFilters) {
|
||||
return convertStatements(liftSuper(liftFilters(ast, asyncFilters)));
|
||||
}
|
||||
function transform(ast, asyncFilters) {
|
||||
return cps(ast, asyncFilters || []);
|
||||
}
|
||||
|
||||
// var parser = require('./parser');
|
||||
// var src = 'hello {% foo %}{% endfoo %} end';
|
||||
// var ast = transform(parser.parse(src, [new FooExtension()]), ['bar']);
|
||||
// nodes.printNodes(ast);
|
||||
|
||||
module.exports = {
|
||||
transform: transform
|
||||
};
|
94
node_modules/nunjucks/src/web-loaders.js
generated
vendored
Normal file
94
node_modules/nunjucks/src/web-loaders.js
generated
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
'use strict';
|
||||
|
||||
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
||||
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
||||
var Loader = require('./loader');
|
||||
var _require = require('./precompiled-loader.js'),
|
||||
PrecompiledLoader = _require.PrecompiledLoader;
|
||||
var WebLoader = /*#__PURE__*/function (_Loader) {
|
||||
_inheritsLoose(WebLoader, _Loader);
|
||||
function WebLoader(baseURL, opts) {
|
||||
var _this;
|
||||
_this = _Loader.call(this) || this;
|
||||
_this.baseURL = baseURL || '.';
|
||||
opts = opts || {};
|
||||
|
||||
// By default, the cache is turned off because there's no way
|
||||
// to "watch" templates over HTTP, so they are re-downloaded
|
||||
// and compiled each time. (Remember, PRECOMPILE YOUR
|
||||
// TEMPLATES in production!)
|
||||
_this.useCache = !!opts.useCache;
|
||||
|
||||
// We default `async` to false so that the simple synchronous
|
||||
// API can be used when you aren't doing anything async in
|
||||
// your templates (which is most of the time). This performs a
|
||||
// sync ajax request, but that's ok because it should *only*
|
||||
// happen in development. PRECOMPILE YOUR TEMPLATES.
|
||||
_this.async = !!opts.async;
|
||||
return _this;
|
||||
}
|
||||
var _proto = WebLoader.prototype;
|
||||
_proto.resolve = function resolve(from, to) {
|
||||
throw new Error('relative templates not support in the browser yet');
|
||||
};
|
||||
_proto.getSource = function getSource(name, cb) {
|
||||
var _this2 = this;
|
||||
var useCache = this.useCache;
|
||||
var result;
|
||||
this.fetch(this.baseURL + '/' + name, function (err, src) {
|
||||
if (err) {
|
||||
if (cb) {
|
||||
cb(err.content);
|
||||
} else if (err.status === 404) {
|
||||
result = null;
|
||||
} else {
|
||||
throw err.content;
|
||||
}
|
||||
} else {
|
||||
result = {
|
||||
src: src,
|
||||
path: name,
|
||||
noCache: !useCache
|
||||
};
|
||||
_this2.emit('load', name, result);
|
||||
if (cb) {
|
||||
cb(null, result);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// if this WebLoader isn't running asynchronously, the
|
||||
// fetch above would actually run sync and we'll have a
|
||||
// result here
|
||||
return result;
|
||||
};
|
||||
_proto.fetch = function fetch(url, cb) {
|
||||
// Only in the browser please
|
||||
if (typeof window === 'undefined') {
|
||||
throw new Error('WebLoader can only by used in a browser');
|
||||
}
|
||||
var ajax = new XMLHttpRequest();
|
||||
var loading = true;
|
||||
ajax.onreadystatechange = function () {
|
||||
if (ajax.readyState === 4 && loading) {
|
||||
loading = false;
|
||||
if (ajax.status === 0 || ajax.status === 200) {
|
||||
cb(null, ajax.responseText);
|
||||
} else {
|
||||
cb({
|
||||
status: ajax.status,
|
||||
content: ajax.responseText
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
url += (url.indexOf('?') === -1 ? '?' : '&') + 's=' + new Date().getTime();
|
||||
ajax.open('GET', url, this.async);
|
||||
ajax.send();
|
||||
};
|
||||
return WebLoader;
|
||||
}(Loader);
|
||||
module.exports = {
|
||||
WebLoader: WebLoader,
|
||||
PrecompiledLoader: PrecompiledLoader
|
||||
};
|
Reference in New Issue
Block a user