UNPKG

3.88 kBJavaScriptView Raw
1// Generated by LiveScript 1.6.0
2(function(){
3 var reject, special, tokenRegex;
4 reject = require('prelude-ls').reject;
5 function consumeOp(tokens, op){
6 if (tokens[0] === op) {
7 return tokens.shift();
8 } else {
9 throw new Error("Expected '" + op + "', but got '" + tokens[0] + "' instead in " + JSON.stringify(tokens) + ".");
10 }
11 }
12 function maybeConsumeOp(tokens, op){
13 if (tokens[0] === op) {
14 return tokens.shift();
15 }
16 }
17 function consumeList(tokens, arg$, hasDelimiters){
18 var open, close, result, untilTest;
19 open = arg$[0], close = arg$[1];
20 if (hasDelimiters) {
21 consumeOp(tokens, open);
22 }
23 result = [];
24 untilTest = "," + (hasDelimiters ? close : '');
25 while (tokens.length && (hasDelimiters && tokens[0] !== close)) {
26 result.push(consumeElement(tokens, untilTest));
27 maybeConsumeOp(tokens, ',');
28 }
29 if (hasDelimiters) {
30 consumeOp(tokens, close);
31 }
32 return result;
33 }
34 function consumeArray(tokens, hasDelimiters){
35 return consumeList(tokens, ['[', ']'], hasDelimiters);
36 }
37 function consumeTuple(tokens, hasDelimiters){
38 return consumeList(tokens, ['(', ')'], hasDelimiters);
39 }
40 function consumeFields(tokens, hasDelimiters){
41 var result, untilTest, key;
42 if (hasDelimiters) {
43 consumeOp(tokens, '{');
44 }
45 result = {};
46 untilTest = "," + (hasDelimiters ? '}' : '');
47 while (tokens.length && (!hasDelimiters || tokens[0] !== '}')) {
48 key = consumeValue(tokens, ':');
49 consumeOp(tokens, ':');
50 result[key] = consumeElement(tokens, untilTest);
51 maybeConsumeOp(tokens, ',');
52 }
53 if (hasDelimiters) {
54 consumeOp(tokens, '}');
55 }
56 return result;
57 }
58 function consumeValue(tokens, untilTest){
59 var out;
60 untilTest == null && (untilTest = '');
61 out = '';
62 while (tokens.length && -1 === untilTest.indexOf(tokens[0])) {
63 out += tokens.shift();
64 }
65 return out;
66 }
67 function consumeElement(tokens, untilTest){
68 switch (tokens[0]) {
69 case '[':
70 return consumeArray(tokens, true);
71 case '(':
72 return consumeTuple(tokens, true);
73 case '{':
74 return consumeFields(tokens, true);
75 default:
76 return consumeValue(tokens, untilTest);
77 }
78 }
79 function consumeTopLevel(tokens, types, options){
80 var ref$, type, structure, origTokens, result, finalResult, x$, y$;
81 ref$ = types[0], type = ref$.type, structure = ref$.structure;
82 origTokens = tokens.concat();
83 if (!options.explicit && types.length === 1 && ((!type && structure) || (type === 'Array' || type === 'Object'))) {
84 result = structure === 'array' || type === 'Array'
85 ? consumeArray(tokens, tokens[0] === '[')
86 : structure === 'tuple'
87 ? consumeTuple(tokens, tokens[0] === '(')
88 : consumeFields(tokens, tokens[0] === '{');
89 finalResult = tokens.length ? consumeElement(structure === 'array' || type === 'Array'
90 ? (x$ = origTokens, x$.unshift('['), x$.push(']'), x$)
91 : (y$ = origTokens, y$.unshift('('), y$.push(')'), y$)) : result;
92 } else {
93 finalResult = consumeElement(tokens);
94 }
95 return finalResult;
96 }
97 special = /\[\]\(\)}{:,/.source;
98 tokenRegex = RegExp('("(?:\\\\"|[^"])*")|(\'(?:\\\\\'|[^\'])*\')|(/(?:\\\\/|[^/])*/[a-zA-Z]*)|(#.*#)|([' + special + '])|([^\\s' + special + '](?:\\s*[^\\s' + special + ']+)*)|\\s*');
99 module.exports = function(types, string, options){
100 var tokens, node;
101 options == null && (options = {});
102 if (!options.explicit && types.length === 1 && types[0].type === 'String') {
103 return string;
104 }
105 tokens = reject(not$, string.split(tokenRegex));
106 node = consumeTopLevel(tokens, types, options);
107 if (!node) {
108 throw new Error("Error parsing '" + string + "'.");
109 }
110 return node;
111 };
112 function not$(x){ return !x; }
113}).call(this);