es.json.raw-json.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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. var $SyntaxError = SyntaxError;
  11. var parse = getBuiltIn('JSON', 'parse');
  12. var create = getBuiltIn('Object', 'create');
  13. var freeze = getBuiltIn('Object', 'freeze');
  14. var at = uncurryThis(''.charAt);
  15. var ERROR_MESSAGE = 'Unacceptable as raw JSON';
  16. var isWhitespace = function (it) {
  17. return it === ' ' || it === '\t' || it === '\n' || it === '\r';
  18. };
  19. // `JSON.rawJSON` method
  20. // https://tc39.es/proposal-json-parse-with-source/#sec-json.rawjson
  21. // https://github.com/tc39/proposal-json-parse-with-source
  22. $({ target: 'JSON', stat: true, forced: !NATIVE_RAW_JSON }, {
  23. rawJSON: function rawJSON(text) {
  24. var jsonString = toString(text);
  25. if (jsonString === '' || isWhitespace(at(jsonString, 0)) || isWhitespace(at(jsonString, jsonString.length - 1))) {
  26. throw new $SyntaxError(ERROR_MESSAGE);
  27. }
  28. var parsed = parse(jsonString);
  29. if (typeof parsed == 'object' && parsed !== null) throw new $SyntaxError(ERROR_MESSAGE);
  30. var obj = create(null);
  31. setInternalState(obj, { type: 'RawJSON' });
  32. createProperty(obj, 'rawJSON', jsonString);
  33. return FREEZING ? freeze(obj) : obj;
  34. }
  35. });