aboutsummaryrefslogtreecommitdiff
path: root/node_modules/json5
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/json5
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
node_modules
Diffstat (limited to 'node_modules/json5')
-rw-r--r--node_modules/json5/CHANGELOG.md169
-rw-r--r--node_modules/json5/LICENSE.md21
-rw-r--r--node_modules/json5/README.md286
-rwxr-xr-xnode_modules/json5/lib/cli.js41
-rw-r--r--node_modules/json5/lib/json5.js770
-rw-r--r--node_modules/json5/lib/require.js18
-rw-r--r--node_modules/json5/package.json38
7 files changed, 1343 insertions, 0 deletions
diff --git a/node_modules/json5/CHANGELOG.md b/node_modules/json5/CHANGELOG.md
new file mode 100644
index 000000000..6db820cbc
--- /dev/null
+++ b/node_modules/json5/CHANGELOG.md
@@ -0,0 +1,169 @@
+### v0.5.1 [[code][c0.5.1], [diff][d0.5.1]]
+
+[c0.5.1]: https://github.com/aseemk/json5/tree/v0.5.1
+[d0.5.1]: https://github.com/aseemk/json5/compare/v0.5.0...v0.5.1
+
+This release includes a minor fix for indentations when stringifying empty
+arrays.
+
+- Fix: Indents no longer appear in empty arrays when stringified. ([#134])
+
+
+### v0.5.0 [[code][c0.5.0], [diff][d0.5.0]]
+
+[c0.5.0]: https://github.com/aseemk/json5/tree/v0.5.0
+[d0.5.0]: https://github.com/aseemk/json5/compare/v0.4.0...v0.5.0
+
+This release includes major internal changes and public API enhancements.
+
+- **Major:** JSON5 officially supports Node.js v4 LTS and v5. Support for
+ Node.js v0.6 and v0.8 have been dropped, while support for v0.10 and v0.12
+ remain.
+
+- Fix: YUI Compressor no longer fails when compressing json5.js. ([#97])
+
+- New: `parse` and the CLI provide line and column numbers when displaying error
+ messages. ([#101]; awesome work by [@amb26].)
+
+
+### v0.4.0 [[code][c0.4.0], [diff][d0.4.0]]
+
+[c0.4.0]: https://github.com/aseemk/json5/tree/v0.4.0
+[d0.4.0]: https://github.com/aseemk/json5/compare/v0.2.0...v0.4.0
+
+Note that v0.3.0 was tagged, but never published to npm, so this v0.4.0
+changelog entry includes v0.3.0 features.
+
+This is a massive release that adds `stringify` support, among other things.
+
+- **Major:** `JSON5.stringify()` now exists!
+ This method is analogous to the native `JSON.stringify()`;
+ it just avoids quoting keys where possible.
+ See the [usage documentation](./README.md#usage) for more.
+ ([#32]; huge thanks and props [@aeisenberg]!)
+
+- New: `NaN` and `-NaN` are now allowed number literals.
+ ([#30]; thanks [@rowanhill].)
+
+- New: Duplicate object keys are now allowed; the last value is used.
+ This is the same behavior as JSON. ([#57]; thanks [@jordanbtucker].)
+
+- Fix: Properly handle various whitespace and newline cases now.
+ E.g. JSON5 now properly supports escaped CR and CRLF newlines in strings,
+ and JSON5 now accepts the same whitespace as JSON (stricter than ES5).
+ ([#58], [#60], and [#63]; thanks [@jordanbtucker].)
+
+- New: Negative hexadecimal numbers (e.g. `-0xC8`) are allowed again.
+ (They were disallowed in v0.2.0; see below.)
+ It turns out they *are* valid in ES5, so JSON5 supports them now too.
+ ([#36]; thanks [@jordanbtucker]!)
+
+
+### v0.2.0 [[code][c0.2.0], [diff][d0.2.0]]
+
+[c0.2.0]: https://github.com/aseemk/json5/tree/v0.2.0
+[d0.2.0]: https://github.com/aseemk/json5/compare/v0.1.0...v0.2.0
+
+This release fixes some bugs and adds some more utility features to help you
+express data more easily:
+
+- **Breaking:** Negative hexadecimal numbers (e.g. `-0xC8`) are rejected now.
+ While V8 (e.g. Chrome and Node) supported them, it turns out they're invalid
+ in ES5. This has been [fixed in V8][v8-hex-fix] (and by extension, Chrome
+ and Node), so JSON5 officially rejects them now, too. ([#36])
+
+- New: Trailing decimal points in decimal numbers are allowed again.
+ (They were disallowed in v0.1.0; see below.)
+ They're allowed by ES5, and differentiating between integers and floats may
+ make sense on some platforms. ([#16]; thanks [@Midar].)
+
+- New: `Infinity` and `-Infinity` are now allowed number literals.
+ ([#30]; thanks [@pepkin88].)
+
+- New: Plus signs (`+`) in front of numbers are now allowed, since it can
+ be helpful in some contexts to explicitly mark numbers as positive.
+ (E.g. when a property represents changes or deltas.)
+
+- Fix: unescaped newlines in strings are rejected now.
+ ([#24]; thanks [@Midar].)
+
+
+### v0.1.0 [[code][c0.1.0], [diff][d0.1.0]]
+
+[c0.1.0]: https://github.com/aseemk/json5/tree/v0.1.0
+[d0.1.0]: https://github.com/aseemk/json5/compare/v0.0.1...v0.1.0
+
+This release tightens JSON5 support and adds helpful utility features:
+
+- New: Support hexadecimal numbers. (Thanks [@MaxNanasy].)
+
+- Fix: Reject octal numbers properly now. Previously, they were accepted but
+ improperly parsed as base-10 numbers. (Thanks [@MaxNanasy].)
+
+- **Breaking:** Reject "noctal" numbers now (base-10 numbers that begin with a
+ leading zero). These are disallowed by both JSON5 and JSON, as well as by
+ ES5's strict mode. (Thanks [@MaxNanasy].)
+
+- New: Support leading decimal points in decimal numbers.
+ (Thanks [@MaxNanasy].)
+
+- **Breaking:** Reject trailing decimal points in decimal numbers now. These
+ are disallowed by both JSON5 and JSON. (Thanks [@MaxNanasy].)
+
+- **Breaking:** Reject omitted elements in arrays now. These are disallowed by
+ both JSON5 and JSON.
+
+- Fix: Throw proper `SyntaxError` instances on errors now.
+
+- New: Add Node.js `require()` hook. Register via `json5/lib/require`.
+
+- New: Add Node.js `json5` executable to compile JSON5 files to JSON.
+
+
+### v0.0.1 [[code][c0.0.1], [diff][d0.0.1]]
+
+[c0.0.1]: https://github.com/aseemk/json5/tree/v0.0.1
+[d0.0.1]: https://github.com/aseemk/json5/compare/v0.0.0...v0.0.1
+
+This was the first implementation of this JSON5 parser.
+
+- Support unquoted object keys, including reserved words. Unicode characters
+ and escape sequences sequences aren't yet supported.
+
+- Support single-quoted strings.
+
+- Support multi-line strings.
+
+- Support trailing commas in arrays and objects.
+
+- Support comments, both inline and block.
+
+
+### v0.0.0 [[code](https://github.com/aseemk/json5/tree/v0.0.0)]
+
+Let's consider this to be Douglas Crockford's original [json_parse.js] — a
+parser for the regular JSON format.
+
+
+[json_parse.js]: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js
+[v8-hex-fix]: http://code.google.com/p/v8/issues/detail?id=2240
+
+[@MaxNanasy]: https://github.com/MaxNanasy
+[@Midar]: https://github.com/Midar
+[@pepkin88]: https://github.com/pepkin88
+[@rowanhill]: https://github.com/rowanhill
+[@aeisenberg]: https://github.com/aeisenberg
+[@jordanbtucker]: https://github.com/jordanbtucker
+[@amb26]: https://github.com/amb26
+
+[#16]: https://github.com/aseemk/json5/issues/16
+[#24]: https://github.com/aseemk/json5/issues/24
+[#30]: https://github.com/aseemk/json5/issues/30
+[#32]: https://github.com/aseemk/json5/issues/32
+[#36]: https://github.com/aseemk/json5/issues/36
+[#57]: https://github.com/aseemk/json5/issues/57
+[#58]: https://github.com/aseemk/json5/pull/58
+[#60]: https://github.com/aseemk/json5/pull/60
+[#63]: https://github.com/aseemk/json5/pull/63
+[#97]: https://github.com/aseemk/json5/pull/97
+[#101]: https://github.com/aseemk/json5/pull/101
diff --git a/node_modules/json5/LICENSE.md b/node_modules/json5/LICENSE.md
new file mode 100644
index 000000000..861df26e6
--- /dev/null
+++ b/node_modules/json5/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2012-2016 Aseem Kishore, and [others](https://github.com/aseemk/json5/contributors).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/json5/README.md b/node_modules/json5/README.md
new file mode 100644
index 000000000..a42851484
--- /dev/null
+++ b/node_modules/json5/README.md
@@ -0,0 +1,286 @@
+# JSON5 – Modern JSON
+
+[![Build Status](https://travis-ci.org/json5/json5.svg)](https://travis-ci.org/json5/json5)
+
+JSON is an excellent data format, but we think it can be better.
+
+**JSON5 is a proposed extension to JSON** that aims to make it easier for
+*humans to write and maintain* by hand. It does this by adding some minimal
+syntax features directly from ECMAScript 5.
+
+JSON5 remains a **strict subset of JavaScript**, adds **no new data types**,
+and **works with all existing JSON content**.
+
+JSON5 is *not* an official successor to JSON, and JSON5 content may *not*
+work with existing JSON parsers. For this reason, JSON5 files use a new .json5
+extension. *(TODO: new MIME type needed too.)*
+
+The code here is a **reference JavaScript implementation** for both Node.js
+and all browsers. It’s based directly off of Douglas Crockford’s own [JSON
+implementation][json_parse.js], and it’s both robust and secure.
+
+
+## Why
+
+JSON isn’t the friendliest to *write*. Keys need to be quoted, objects and
+arrays can’t have trailing commas, and comments aren’t allowed — even though
+none of these are the case with regular JavaScript today.
+
+That was fine when JSON’s goal was to be a great data format, but JSON’s usage
+has expanded beyond *machines*. JSON is now used for writing [configs][ex1],
+[manifests][ex2], even [tests][ex3] — all by *humans*.
+
+[ex1]: http://plovr.com/docs.html
+[ex2]: https://www.npmjs.org/doc/files/package.json.html
+[ex3]: http://code.google.com/p/fuzztester/wiki/JSONFileFormat
+
+There are other formats that are human-friendlier, like YAML, but changing
+from JSON to a completely different format is undesirable in many cases.
+JSON5’s aim is to remain close to JSON and JavaScript.
+
+
+## Features
+
+The following is the exact list of additions to JSON’s syntax introduced by
+JSON5. **All of these are optional**, and **all of these come from ES5**.
+
+### Objects
+
+- Object keys can be unquoted if they’re valid [identifiers][mdn_variables].
+ Yes, even reserved keywords (like `default`) are valid unquoted keys in ES5
+ [[§11.1.5](http://es5.github.com/#x11.1.5), [§7.6](http://es5.github.com/#x7.6)].
+ ([More info](https://mathiasbynens.be/notes/javascript-identifiers))
+
+ *(TODO: Unicode characters and escape sequences aren’t yet supported in this
+ implementation.)*
+
+- Object keys can also be single-quoted.
+
+- Objects can have trailing commas.
+
+[mdn_variables]: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Variables
+
+### Arrays
+
+- Arrays can have trailing commas.
+
+### Strings
+
+- Strings can be single-quoted.
+
+- Strings can be split across multiple lines; just prefix each newline with a
+ backslash. [ES5 [§7.8.4](http://es5.github.com/#x7.8.4)]
+
+### Numbers
+
+- Numbers can be hexadecimal (base 16).
+
+- Numbers can begin or end with a (leading or trailing) decimal point.
+
+- Numbers can include `Infinity`, `-Infinity`, `NaN`, and `-NaN`.
+
+- Numbers can begin with an explicit plus sign.
+
+### Comments
+
+- Both inline (single-line) and block (multi-line) comments are allowed.
+
+
+## Example
+
+The following is a contrived example, but it illustrates most of the features:
+
+```js
+{
+ foo: 'bar',
+ while: true,
+
+ this: 'is a \
+multi-line string',
+
+ // this is an inline comment
+ here: 'is another', // inline comment
+
+ /* this is a block comment
+ that continues on another line */
+
+ hex: 0xDEADbeef,
+ half: .5,
+ delta: +10,
+ to: Infinity, // and beyond!
+
+ finally: 'a trailing comma',
+ oh: [
+ "we shouldn't forget",
+ 'arrays can have',
+ 'trailing commas too',
+ ],
+}
+```
+
+This implementation’s own [package.json5](package.json5) is more realistic:
+
+```js
+// This file is written in JSON5 syntax, naturally, but npm needs a regular
+// JSON file, so compile via `npm run build`. Be sure to keep both in sync!
+
+{
+ name: 'json5',
+ version: '0.5.0',
+ description: 'JSON for the ES5 era.',
+ keywords: ['json', 'es5'],
+ author: 'Aseem Kishore <aseem.kishore@gmail.com>',
+ contributors: [
+ // TODO: Should we remove this section in favor of GitHub's list?
+ // https://github.com/aseemk/json5/contributors
+ 'Max Nanasy <max.nanasy@gmail.com>',
+ 'Andrew Eisenberg <andrew@eisenberg.as>',
+ 'Jordan Tucker <jordanbtucker@gmail.com>',
+ ],
+ main: 'lib/json5.js',
+ bin: 'lib/cli.js',
+ files: ["lib/"],
+ dependencies: {},
+ devDependencies: {
+ gulp: "^3.9.1",
+ 'gulp-jshint': "^2.0.0",
+ jshint: "^2.9.1",
+ 'jshint-stylish': "^2.1.0",
+ mocha: "^2.4.5"
+ },
+ scripts: {
+ build: 'node ./lib/cli.js -c package.json5',
+ test: 'mocha --ui exports --reporter spec',
+ // TODO: Would it be better to define these in a mocha.opts file?
+ },
+ homepage: 'http://json5.org/',
+ license: 'MIT',
+ repository: {
+ type: 'git',
+ url: 'https://github.com/aseemk/json5.git',
+ },
+}
+```
+
+
+## Community
+
+Join the [Google Group](http://groups.google.com/group/json5) if you’re
+interested in JSON5 news, updates, and general discussion.
+Don’t worry, it’s very low-traffic.
+
+The [GitHub wiki](https://github.com/aseemk/json5/wiki) is a good place to track
+JSON5 support and usage. Contribute freely there!
+
+[GitHub Issues](https://github.com/aseemk/json5/issues) is the place to
+formally propose feature requests and report bugs. Questions and general
+feedback are better directed at the Google Group.
+
+
+## Usage
+
+This JavaScript implementation of JSON5 simply provides a `JSON5` object just
+like the native ES5 `JSON` object.
+
+To use from Node:
+
+```sh
+npm install json5
+```
+
+```js
+var JSON5 = require('json5');
+```
+
+To use in the browser (adds the `JSON5` object to the global namespace):
+
+```html
+<script src="json5.js"></script>
+```
+
+Then in both cases, you can simply replace native `JSON` calls with `JSON5`:
+
+```js
+var obj = JSON5.parse('{unquoted:"key",trailing:"comma",}');
+var str = JSON5.stringify(obj);
+```
+
+`JSON5.parse` supports all of the JSON5 features listed above (*TODO: except
+Unicode*), as well as the native [`reviver` argument][json-parse].
+
+[json-parse]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
+
+`JSON5.stringify` mainly avoids quoting keys where possible, but we hope to
+keep expanding it in the future (e.g. to also output trailing commas).
+It supports the native [`replacer` and `space` arguments][json-stringify],
+as well. *(TODO: Any implemented `toJSON` methods aren’t used today.)*
+
+[json-stringify]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
+
+
+### Extras
+
+If you’re running this on Node, you can also register a JSON5 `require()` hook
+to let you `require()` `.json5` files just like you can `.json` files:
+
+```js
+require('json5/lib/require');
+require('./path/to/foo'); // tries foo.json5 after foo.js, foo.json, etc.
+require('./path/to/bar.json5');
+```
+
+This module also provides a `json5` executable (requires Node) for converting
+JSON5 files to JSON:
+
+```sh
+json5 -c path/to/foo.json5 # generates path/to/foo.json
+```
+
+
+## Development
+
+```sh
+git clone git://github.com/aseemk/json5.git
+cd json5
+npm install
+npm test
+```
+
+As the `package.json5` file states, be sure to run `npm run build` on changes
+to `package.json5`, since npm requires `package.json`.
+
+Feel free to [file issues](https://github.com/aseemk/json5/issues) and submit
+[pull requests](https://github.com/aseemk/json5/pulls) — contributions are
+welcome. If you do submit a pull request, please be sure to add or update the
+tests, and ensure that `npm test` continues to pass.
+
+
+## License
+
+MIT. See [LICENSE.md](./LICENSE.md) for details.
+
+
+## Credits
+
+[Michael Bolin](http://bolinfest.com/) independently arrived at and published
+some of these same ideas with awesome explanations and detail.
+Recommended reading:
+[Suggested Improvements to JSON](http://bolinfest.com/essays/json.html)
+
+[Douglas Crockford](http://www.crockford.com/) of course designed and built
+JSON, but his state machine diagrams on the [JSON website](http://json.org/),
+as cheesy as it may sound, gave me motivation and confidence that building a
+new parser to implement these ideas this was within my reach!
+This code is also modeled directly off of Doug’s open-source [json_parse.js][]
+parser. I’m super grateful for that clean and well-documented code.
+
+[json_parse.js]: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js
+
+[Max Nanasy](https://github.com/MaxNanasy) has been an early and prolific
+supporter, contributing multiple patches and ideas. Thanks Max!
+
+[Andrew Eisenberg](https://github.com/aeisenberg) has contributed the
+`stringify` method.
+
+[Jordan Tucker](https://github.com/jordanbtucker) has aligned JSON5 more closely
+with ES5 and is actively maintaining this project.
diff --git a/node_modules/json5/lib/cli.js b/node_modules/json5/lib/cli.js
new file mode 100755
index 000000000..9b72f6d19
--- /dev/null
+++ b/node_modules/json5/lib/cli.js
@@ -0,0 +1,41 @@
+#!/usr/bin/env node
+
+// cli.js
+// JSON5 command-line interface.
+//
+// This is pretty minimal for now; just supports compiling files via `-c`.
+// TODO More useful functionality, like output path, watch, etc.?
+
+var FS = require('fs');
+var JSON5 = require('./json5');
+var Path = require('path');
+
+var USAGE = [
+ 'Usage: json5 -c path/to/file.json5 ...',
+ 'Compiles JSON5 files into sibling JSON files with the same basenames.',
+].join('\n');
+
+// if valid, args look like [node, json5, -c, file1, file2, ...]
+var args = process.argv;
+
+if (args.length < 4 || args[2] !== '-c') {
+ console.error(USAGE);
+ process.exit(1);
+}
+
+var cwd = process.cwd();
+var files = args.slice(3);
+
+// iterate over each file and convert JSON5 files to JSON:
+files.forEach(function (file) {
+ var path = Path.resolve(cwd, file);
+ var basename = Path.basename(path, '.json5');
+ var dirname = Path.dirname(path);
+
+ var json5 = FS.readFileSync(path, 'utf8');
+ var obj = JSON5.parse(json5);
+ var json = JSON.stringify(obj, null, 4); // 4 spaces; TODO configurable?
+
+ path = Path.join(dirname, basename + '.json');
+ FS.writeFileSync(path, json, 'utf8');
+});
diff --git a/node_modules/json5/lib/json5.js b/node_modules/json5/lib/json5.js
new file mode 100644
index 000000000..4a4590d0c
--- /dev/null
+++ b/node_modules/json5/lib/json5.js
@@ -0,0 +1,770 @@
+// json5.js
+// Modern JSON. See README.md for details.
+//
+// This file is based directly off of Douglas Crockford's json_parse.js:
+// https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js
+
+var JSON5 = (typeof exports === 'object' ? exports : {});
+
+JSON5.parse = (function () {
+ "use strict";
+
+// This is a function that can parse a JSON5 text, producing a JavaScript
+// data structure. It is a simple, recursive descent parser. It does not use
+// eval or regular expressions, so it can be used as a model for implementing
+// a JSON5 parser in other languages.
+
+// We are defining the function inside of another function to avoid creating
+// global variables.
+
+ var at, // The index of the current character
+ lineNumber, // The current line number
+ columnNumber, // The current column number
+ ch, // The current character
+ escapee = {
+ "'": "'",
+ '"': '"',
+ '\\': '\\',
+ '/': '/',
+ '\n': '', // Replace escaped newlines in strings w/ empty string
+ b: '\b',
+ f: '\f',
+ n: '\n',
+ r: '\r',
+ t: '\t'
+ },
+ ws = [
+ ' ',
+ '\t',
+ '\r',
+ '\n',
+ '\v',
+ '\f',
+ '\xA0',
+ '\uFEFF'
+ ],
+ text,
+
+ renderChar = function (chr) {
+ return chr === '' ? 'EOF' : "'" + chr + "'";
+ },
+
+ error = function (m) {
+
+// Call error when something is wrong.
+
+ var error = new SyntaxError();
+ // beginning of message suffix to agree with that provided by Gecko - see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
+ error.message = m + " at line " + lineNumber + " column " + columnNumber + " of the JSON5 data. Still to read: " + JSON.stringify(text.substring(at - 1, at + 19));
+ error.at = at;
+ // These two property names have been chosen to agree with the ones in Gecko, the only popular
+ // environment which seems to supply this info on JSON.parse
+ error.lineNumber = lineNumber;
+ error.columnNumber = columnNumber;
+ throw error;
+ },
+
+ next = function (c) {
+
+// If a c parameter is provided, verify that it matches the current character.
+
+ if (c && c !== ch) {
+ error("Expected " + renderChar(c) + " instead of " + renderChar(ch));
+ }
+
+// Get the next character. When there are no more characters,
+// return the empty string.
+
+ ch = text.charAt(at);
+ at++;
+ columnNumber++;
+ if (ch === '\n' || ch === '\r' && peek() !== '\n') {
+ lineNumber++;
+ columnNumber = 0;
+ }
+ return ch;
+ },
+
+ peek = function () {
+
+// Get the next character without consuming it or
+// assigning it to the ch varaible.
+
+ return text.charAt(at);
+ },
+
+ identifier = function () {
+
+// Parse an identifier. Normally, reserved words are disallowed here, but we
+// only use this for unquoted object keys, where reserved words are allowed,
+// so we don't check for those here. References:
+// - http://es5.github.com/#x7.6
+// - https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Variables
+// - http://docstore.mik.ua/orelly/webprog/jscript/ch02_07.htm
+// TODO Identifiers can have Unicode "letters" in them; add support for those.
+
+ var key = ch;
+
+ // Identifiers must start with a letter, _ or $.
+ if ((ch !== '_' && ch !== '$') &&
+ (ch < 'a' || ch > 'z') &&
+ (ch < 'A' || ch > 'Z')) {
+ error("Bad identifier as unquoted key");
+ }
+
+ // Subsequent characters can contain digits.
+ while (next() && (
+ ch === '_' || ch === '$' ||
+ (ch >= 'a' && ch <= 'z') ||
+ (ch >= 'A' && ch <= 'Z') ||
+ (ch >= '0' && ch <= '9'))) {
+ key += ch;
+ }
+
+ return key;
+ },
+
+ number = function () {
+
+// Parse a number value.
+
+ var number,
+ sign = '',
+ string = '',
+ base = 10;
+
+ if (ch === '-' || ch === '+') {
+ sign = ch;
+ next(ch);
+ }
+
+ // support for Infinity (could tweak to allow other words):
+ if (ch === 'I') {
+ number = word();
+ if (typeof number !== 'number' || isNaN(number)) {
+ error('Unexpected word for number');
+ }
+ return (sign === '-') ? -number : number;
+ }
+
+ // support for NaN
+ if (ch === 'N' ) {
+ number = word();
+ if (!isNaN(number)) {
+ error('expected word to be NaN');
+ }
+ // ignore sign as -NaN also is NaN
+ return number;
+ }
+
+ if (ch === '0') {
+ string += ch;
+ next();
+ if (ch === 'x' || ch === 'X') {
+ string += ch;
+ next();
+ base = 16;
+ } else if (ch >= '0' && ch <= '9') {
+ error('Octal literal');
+ }
+ }
+
+ switch (base) {
+ case 10:
+ while (ch >= '0' && ch <= '9' ) {
+ string += ch;
+ next();
+ }
+ if (ch === '.') {
+ string += '.';
+ while (next() && ch >= '0' && ch <= '9') {
+ string += ch;
+ }
+ }
+ if (ch === 'e' || ch === 'E') {
+ string += ch;
+ next();
+ if (ch === '-' || ch === '+') {
+ string += ch;
+ next();
+ }
+ while (ch >= '0' && ch <= '9') {
+ string += ch;
+ next();
+ }
+ }
+ break;
+ case 16:
+ while (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {
+ string += ch;
+ next();
+ }
+ break;
+ }
+
+ if(sign === '-') {
+ number = -string;
+ } else {
+ number = +string;
+ }
+
+ if (!isFinite(number)) {
+ error("Bad number");
+ } else {
+ return number;
+ }
+ },
+
+ string = function () {
+
+// Parse a string value.
+
+ var hex,
+ i,
+ string = '',
+ delim, // double quote or single quote
+ uffff;
+
+// When parsing for string values, we must look for ' or " and \ characters.
+
+ if (ch === '"' || ch === "'") {
+ delim = ch;
+ while (next()) {
+ if (ch === delim) {
+ next();
+ return string;
+ } else if (ch === '\\') {
+ next();
+ if (ch === 'u') {
+ uffff = 0;
+ for (i = 0; i < 4; i += 1) {
+ hex = parseInt(next(), 16);
+ if (!isFinite(hex)) {
+ break;
+ }
+ uffff = uffff * 16 + hex;
+ }
+ string += String.fromCharCode(uffff);
+ } else if (ch === '\r') {
+ if (peek() === '\n') {
+ next();
+ }
+ } else if (typeof escapee[ch] === 'string') {
+ string += escapee[ch];
+ } else {
+ break;
+ }
+ } else if (ch === '\n') {
+ // unescaped newlines are invalid; see:
+ // https://github.com/aseemk/json5/issues/24
+ // TODO this feels special-cased; are there other
+ // invalid unescaped chars?
+ break;
+ } else {
+ string += ch;
+ }
+ }
+ }
+ error("Bad string");
+ },
+
+ inlineComment = function () {
+
+// Skip an inline comment, assuming this is one. The current character should
+// be the second / character in the // pair that begins this inline comment.
+// To finish the inline comment, we look for a newline or the end of the text.
+
+ if (ch !== '/') {
+ error("Not an inline comment");
+ }
+
+ do {
+ next();
+ if (ch === '\n' || ch === '\r') {
+ next();
+ return;
+ }
+ } while (ch);
+ },
+
+ blockComment = function () {
+
+// Skip a block comment, assuming this is one. The current character should be
+// the * character in the /* pair that begins this block comment.
+// To finish the block comment, we look for an ending */ pair of characters,
+// but we also watch for the end of text before the comment is terminated.
+
+ if (ch !== '*') {
+ error("Not a block comment");
+ }
+
+ do {
+ next();
+ while (ch === '*') {
+ next('*');
+ if (ch === '/') {
+ next('/');
+ return;
+ }
+ }
+ } while (ch);
+
+ error("Unterminated block comment");
+ },
+
+ comment = function () {
+
+// Skip a comment, whether inline or block-level, assuming this is one.
+// Comments always begin with a / character.
+
+ if (ch !== '/') {
+ error("Not a comment");
+ }
+
+ next('/');
+
+ if (ch === '/') {
+ inlineComment();
+ } else if (ch === '*') {
+ blockComment();
+ } else {
+ error("Unrecognized comment");
+ }
+ },
+
+ white = function () {
+
+// Skip whitespace and comments.
+// Note that we're detecting comments by only a single / character.
+// This works since regular expressions are not valid JSON(5), but this will
+// break if there are other valid values that begin with a / character!
+
+ while (ch) {
+ if (ch === '/') {
+ comment();
+ } else if (ws.indexOf(ch) >= 0) {
+ next();
+ } else {
+ return;
+ }
+ }
+ },
+
+ word = function () {
+
+// true, false, or null.
+
+ switch (ch) {
+ case 't':
+ next('t');
+ next('r');
+ next('u');
+ next('e');
+ return true;
+ case 'f':
+ next('f');
+ next('a');
+ next('l');
+ next('s');
+ next('e');
+ return false;
+ case 'n':
+ next('n');
+ next('u');
+ next('l');
+ next('l');
+ return null;
+ case 'I':
+ next('I');
+ next('n');
+ next('f');
+ next('i');
+ next('n');
+ next('i');
+ next('t');
+ next('y');
+ return Infinity;
+ case 'N':
+ next( 'N' );
+ next( 'a' );
+ next( 'N' );
+ return NaN;
+ }
+ error("Unexpected " + renderChar(ch));
+ },
+
+ value, // Place holder for the value function.
+
+ array = function () {
+
+// Parse an array value.
+
+ var array = [];
+
+ if (ch === '[') {
+ next('[');
+ white();
+ while (ch) {
+ if (ch === ']') {
+ next(']');
+ return array; // Potentially empty array
+ }
+ // ES5 allows omitting elements in arrays, e.g. [,] and
+ // [,null]. We don't allow this in JSON5.
+ if (ch === ',') {
+ error("Missing array element");
+ } else {
+ array.push(value());
+ }
+ white();
+ // If there's no comma after this value, this needs to
+ // be the end of the array.
+ if (ch !== ',') {
+ next(']');
+ return array;
+ }
+ next(',');
+ white();
+ }
+ }
+ error("Bad array");
+ },
+
+ object = function () {
+
+// Parse an object value.
+
+ var key,
+ object = {};
+
+ if (ch === '{') {
+ next('{');
+ white();
+ while (ch) {
+ if (ch === '}') {
+ next('}');
+ return object; // Potentially empty object
+ }
+
+ // Keys can be unquoted. If they are, they need to be
+ // valid JS identifiers.
+ if (ch === '"' || ch === "'") {
+ key = string();
+ } else {
+ key = identifier();
+ }
+
+ white();
+ next(':');
+ object[key] = value();
+ white();
+ // If there's no comma after this pair, this needs to be
+ // the end of the object.
+ if (ch !== ',') {
+ next('}');
+ return object;
+ }
+ next(',');
+ white();
+ }
+ }
+ error("Bad object");
+ };
+
+ value = function () {
+
+// Parse a JSON value. It could be an object, an array, a string, a number,
+// or a word.
+
+ white();
+ switch (ch) {
+ case '{':
+ return object();
+ case '[':
+ return array();
+ case '"':
+ case "'":
+ return string();
+ case '-':
+ case '+':
+ case '.':
+ return number();
+ default:
+ return ch >= '0' && ch <= '9' ? number() : word();
+ }
+ };
+
+// Return the json_parse function. It will have access to all of the above
+// functions and variables.
+
+ return function (source, reviver) {
+ var result;
+
+ text = String(source);
+ at = 0;
+ lineNumber = 1;
+ columnNumber = 1;
+ ch = ' ';
+ result = value();
+ white();
+ if (ch) {
+ error("Syntax error");
+ }
+
+// If there is a reviver function, we recursively walk the new structure,
+// passing each name/value pair to the reviver function for possible
+// transformation, starting with a temporary root object that holds the result
+// in an empty key. If there is not a reviver function, we simply return the
+// result.
+
+ return typeof reviver === 'function' ? (function walk(holder, key) {
+ var k, v, value = holder[key];
+ if (value && typeof value === 'object') {
+ for (k in value) {
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
+ v = walk(value, k);
+ if (v !== undefined) {
+ value[k] = v;
+ } else {
+ delete value[k];
+ }
+ }
+ }
+ }
+ return reviver.call(holder, key, value);
+ }({'': result}, '')) : result;
+ };
+}());
+
+// JSON5 stringify will not quote keys where appropriate
+JSON5.stringify = function (obj, replacer, space) {
+ if (replacer && (typeof(replacer) !== "function" && !isArray(replacer))) {
+ throw new Error('Replacer must be a function or an array');
+ }
+ var getReplacedValueOrUndefined = function(holder, key, isTopLevel) {
+ var value = holder[key];
+
+ // Replace the value with its toJSON value first, if possible
+ if (value && value.toJSON && typeof value.toJSON === "function") {
+ value = value.toJSON();
+ }
+
+ // If the user-supplied replacer if a function, call it. If it's an array, check objects' string keys for
+ // presence in the array (removing the key/value pair from the resulting JSON if the key is missing).
+ if (typeof(replacer) === "function") {
+ return replacer.call(holder, key, value);
+ } else if(replacer) {
+ if (isTopLevel || isArray(holder) || replacer.indexOf(key) >= 0) {
+ return value;
+ } else {
+ return undefined;
+ }
+ } else {
+ return value;
+ }
+ };
+
+ function isWordChar(c) {
+ return (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ c === '_' || c === '$';
+ }
+
+ function isWordStart(c) {
+ return (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ c === '_' || c === '$';
+ }
+
+ function isWord(key) {
+ if (typeof key !== 'string') {
+ return false;
+ }
+ if (!isWordStart(key[0])) {
+ return false;
+ }
+ var i = 1, length = key.length;
+ while (i < length) {
+ if (!isWordChar(key[i])) {
+ return false;
+ }
+ i++;
+ }
+ return true;
+ }
+
+ // export for use in tests
+ JSON5.isWord = isWord;
+
+ // polyfills
+ function isArray(obj) {
+ if (Array.isArray) {
+ return Array.isArray(obj);
+ } else {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+ }
+ }
+
+ function isDate(obj) {
+ return Object.prototype.toString.call(obj) === '[object Date]';
+ }
+
+ var objStack = [];
+ function checkForCircular(obj) {
+ for (var i = 0; i < objStack.length; i++) {
+ if (objStack[i] === obj) {
+ throw new TypeError("Converting circular structure to JSON");
+ }
+ }
+ }
+
+ function makeIndent(str, num, noNewLine) {
+ if (!str) {
+ return "";
+ }
+ // indentation no more than 10 chars
+ if (str.length > 10) {
+ str = str.substring(0, 10);
+ }
+
+ var indent = noNewLine ? "" : "\n";
+ for (var i = 0; i < num; i++) {
+ indent += str;
+ }
+
+ return indent;
+ }
+
+ var indentStr;
+ if (space) {
+ if (typeof space === "string") {
+ indentStr = space;
+ } else if (typeof space === "number" && space >= 0) {
+ indentStr = makeIndent(" ", space, true);
+ } else {
+ // ignore space parameter
+ }
+ }
+
+ // Copied from Crokford's implementation of JSON
+ // See https://github.com/douglascrockford/JSON-js/blob/e39db4b7e6249f04a195e7dd0840e610cc9e941e/json2.js#L195
+ // Begin
+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
+ meta = { // table of character substitutions
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ };
+ function escapeString(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+ escapable.lastIndex = 0;
+ return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
+ var c = meta[a];
+ return typeof c === 'string' ?
+ c :
+ '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ }) + '"' : '"' + string + '"';
+ }
+ // End
+
+ function internalStringify(holder, key, isTopLevel) {
+ var buffer, res;
+
+ // Replace the value, if necessary
+ var obj_part = getReplacedValueOrUndefined(holder, key, isTopLevel);
+
+ if (obj_part && !isDate(obj_part)) {
+ // unbox objects
+ // don't unbox dates, since will turn it into number
+ obj_part = obj_part.valueOf();
+ }
+ switch(typeof obj_part) {
+ case "boolean":
+ return obj_part.toString();
+
+ case "number":
+ if (isNaN(obj_part) || !isFinite(obj_part)) {
+ return "null";
+ }
+ return obj_part.toString();
+
+ case "string":
+ return escapeString(obj_part.toString());
+
+ case "object":
+ if (obj_part === null) {
+ return "null";
+ } else if (isArray(obj_part)) {
+ checkForCircular(obj_part);
+ buffer = "[";
+ objStack.push(obj_part);
+
+ for (var i = 0; i < obj_part.length; i++) {
+ res = internalStringify(obj_part, i, false);
+ buffer += makeIndent(indentStr, objStack.length);
+ if (res === null || typeof res === "undefined") {
+ buffer += "null";
+ } else {
+ buffer += res;
+ }
+ if (i < obj_part.length-1) {
+ buffer += ",";
+ } else if (indentStr) {
+ buffer += "\n";
+ }
+ }
+ objStack.pop();
+ if (obj_part.length) {
+ buffer += makeIndent(indentStr, objStack.length, true)
+ }
+ buffer += "]";
+ } else {
+ checkForCircular(obj_part);
+ buffer = "{";
+ var nonEmpty = false;
+ objStack.push(obj_part);
+ for (var prop in obj_part) {
+ if (obj_part.hasOwnProperty(prop)) {
+ var value = internalStringify(obj_part, prop, false);
+ isTopLevel = false;
+ if (typeof value !== "undefined" && value !== null) {
+ buffer += makeIndent(indentStr, objStack.length);
+ nonEmpty = true;
+ key = isWord(prop) ? prop : escapeString(prop);
+ buffer += key + ":" + (indentStr ? ' ' : '') + value + ",";
+ }
+ }
+ }
+ objStack.pop();
+ if (nonEmpty) {
+ buffer = buffer.substring(0, buffer.length-1) + makeIndent(indentStr, objStack.length) + "}";
+ } else {
+ buffer = '{}';
+ }
+ }
+ return buffer;
+ default:
+ // functions and undefined should be ignored
+ return undefined;
+ }
+ }
+
+ // special case...when undefined is used inside of
+ // a compound object/array, return null.
+ // but when top-level, return undefined
+ var topLevelHolder = {"":obj};
+ if (obj === undefined) {
+ return getReplacedValueOrUndefined(topLevelHolder, '', true);
+ }
+ return internalStringify(topLevelHolder, '', true);
+};
diff --git a/node_modules/json5/lib/require.js b/node_modules/json5/lib/require.js
new file mode 100644
index 000000000..73e56fe92
--- /dev/null
+++ b/node_modules/json5/lib/require.js
@@ -0,0 +1,18 @@
+// require.js
+// Node.js only: adds a require() hook for .json5 files, just like the native
+// hook for .json files.
+//
+// Usage:
+// require('json5/require');
+// require('./foo'); // will check foo.json5 after foo.js, foo.json, etc.
+// require('./bar.json5');
+
+var FS = require('fs');
+var JSON5 = require('./json5');
+
+// Modeled off of (v0.6.18 link; check latest too):
+// https://github.com/joyent/node/blob/v0.6.18/lib/module.js#L468-L472
+require.extensions['.json5'] = function (module, filename) {
+ var content = FS.readFileSync(filename, 'utf8');
+ module.exports = JSON5.parse(content);
+};
diff --git a/node_modules/json5/package.json b/node_modules/json5/package.json
new file mode 100644
index 000000000..44059b492
--- /dev/null
+++ b/node_modules/json5/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "json5",
+ "version": "0.5.1",
+ "description": "JSON for the ES5 era.",
+ "keywords": [
+ "json",
+ "es5"
+ ],
+ "author": "Aseem Kishore <aseem.kishore@gmail.com>",
+ "contributors": [
+ "Max Nanasy <max.nanasy@gmail.com>",
+ "Andrew Eisenberg <andrew@eisenberg.as>",
+ "Jordan Tucker <jordanbtucker@gmail.com>"
+ ],
+ "main": "lib/json5.js",
+ "bin": "lib/cli.js",
+ "files": [
+ "lib/"
+ ],
+ "dependencies": {},
+ "devDependencies": {
+ "gulp": "^3.9.1",
+ "gulp-jshint": "^2.0.1",
+ "jshint": "^2.9.3",
+ "jshint-stylish": "^2.2.1",
+ "mocha": "^3.1.0"
+ },
+ "scripts": {
+ "build": "node ./lib/cli.js -c package.json5",
+ "test": "mocha --ui exports --reporter spec"
+ },
+ "homepage": "http://json5.org/",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/aseemk/json5.git"
+ }
+} \ No newline at end of file