| 1 | 'use strict';
|
|---|
| 2 | var $ = require('../internals/export');
|
|---|
| 3 | var FREEZING = require('../internals/freezing');
|
|---|
| 4 | var NATIVE_RAW_JSON = require('../internals/native-raw-json');
|
|---|
| 5 | var getBuiltIn = require('../internals/get-built-in');
|
|---|
| 6 | var uncurryThis = require('../internals/function-uncurry-this');
|
|---|
| 7 | var toString = require('../internals/to-string');
|
|---|
| 8 | var createProperty = require('../internals/create-property');
|
|---|
| 9 | var setInternalState = require('../internals/internal-state').set;
|
|---|
| 10 |
|
|---|
| 11 | var $SyntaxError = SyntaxError;
|
|---|
| 12 | var parse = getBuiltIn('JSON', 'parse');
|
|---|
| 13 | var create = getBuiltIn('Object', 'create');
|
|---|
| 14 | var freeze = getBuiltIn('Object', 'freeze');
|
|---|
| 15 | var at = uncurryThis(''.charAt);
|
|---|
| 16 |
|
|---|
| 17 | var ERROR_MESSAGE = 'Unacceptable as raw JSON';
|
|---|
| 18 |
|
|---|
| 19 | var isWhitespace = function (it) {
|
|---|
| 20 | return it === ' ' || it === '\t' || it === '\n' || it === '\r';
|
|---|
| 21 | };
|
|---|
| 22 |
|
|---|
| 23 | // `JSON.rawJSON` method
|
|---|
| 24 | // https://tc39.es/proposal-json-parse-with-source/#sec-json.rawjson
|
|---|
| 25 | // https://github.com/tc39/proposal-json-parse-with-source
|
|---|
| 26 | $({ target: 'JSON', stat: true, forced: !NATIVE_RAW_JSON }, {
|
|---|
| 27 | rawJSON: function rawJSON(text) {
|
|---|
| 28 | var jsonString = toString(text);
|
|---|
| 29 | if (jsonString === '' || isWhitespace(at(jsonString, 0)) || isWhitespace(at(jsonString, jsonString.length - 1))) {
|
|---|
| 30 | throw new $SyntaxError(ERROR_MESSAGE);
|
|---|
| 31 | }
|
|---|
| 32 | var parsed = parse(jsonString);
|
|---|
| 33 | if (typeof parsed == 'object' && parsed !== null) throw new $SyntaxError(ERROR_MESSAGE);
|
|---|
| 34 | var obj = create(null);
|
|---|
| 35 | setInternalState(obj, { type: 'RawJSON' });
|
|---|
| 36 | createProperty(obj, 'rawJSON', jsonString);
|
|---|
| 37 | return FREEZING ? freeze(obj) : obj;
|
|---|
| 38 | }
|
|---|
| 39 | });
|
|---|