mca-json 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"snbt-parse.d.ts","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AA0OtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,YAoBrC"}
1
+ {"version":3,"file":"snbt-parse.d.ts","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AA4OtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,YAqBrC"}
@@ -16,6 +16,7 @@ const tokenParsers = [
16
16
  type: 'WHITESPACE',
17
17
  pattern: /^\s+/,
18
18
  callback: (_pos, _type, _snbtData, matches) => {
19
+ // Do not generate a token for whitespace.
19
20
  return matches[0].length;
20
21
  },
21
22
  },
@@ -96,8 +97,8 @@ const tokenParsers = [
96
97
  type: 'BYTE',
97
98
  pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),
98
99
  callback: (pos, type, snbtData, matches) => {
99
- snbtData.addToken(pos, type, matches[0].toLowerCase() === 'true' ? '1' : '0');
100
- return matches[0].length;
100
+ snbtData.addToken(pos, type, matches[1].toLowerCase() === 'true' ? '1' : '0');
101
+ return matches[1].length;
101
102
  },
102
103
  },
103
104
  {
@@ -182,9 +183,10 @@ const tokenParsers = [
182
183
  },
183
184
  ];
184
185
  // Creates a regular expression that will start at the beginning of the string
185
- // and conclude with an "end of token" marker at the end.
186
+ // and conclude with an "end of token" marker at the end. The lookahead will
187
+ // not capture the end of the token marker.
186
188
  function anchorPattern(pattern) {
187
- return new RegExp(`^${pattern}\s*(?:$|,|}|]|:)`);
189
+ return new RegExp(`^${pattern}\s*(?=$|,|}|]|:)`);
188
190
  }
189
191
  export function snbtParse(snbt) {
190
192
  const snbtData = new SnbtData();
@@ -194,6 +196,7 @@ export function snbtParse(snbt) {
194
196
  if (!increment) {
195
197
  throw new Error(`Unexpected token at position ${pos}`);
196
198
  }
199
+ debugLog(`Increment position by ${increment}`);
197
200
  pos += increment;
198
201
  }
199
202
  return snbtData;
@@ -1 +1 @@
1
- {"version":3,"file":"snbt-parse.js","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { SnbtData, SnbtTokenType } from './snbt-data';\n\nconst debugLog = debug('snbt:parse');\n\ninterface TokenParser {\n type: SnbtTokenType;\n pattern: RegExp;\n callback: (\n offset: number,\n type: SnbtTokenType,\n snbtData: SnbtData,\n match: RegExpMatchArray\n ) => number;\n}\n\nfunction testParsers(\n snbtData: SnbtData,\n str: string,\n tokenParsers: TokenParser[],\n pos: number\n) {\n for (const { type, pattern, callback } of tokenParsers) {\n const match = str.match(pattern);\n\n if (match) {\n debugLog(`Matched ${type} at position ${pos}: ${match[0]}`);\n\n return callback(pos, type, snbtData, match);\n }\n }\n\n return false;\n}\n\nconst tokenParsers: TokenParser[] = [\n {\n type: 'WHITESPACE',\n pattern: /^\\s+/,\n callback: (_pos, _type, _snbtData, matches) => {\n return matches[0].length;\n },\n },\n {\n type: 'COLON',\n pattern: /^:/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ':');\n\n return 1;\n },\n },\n {\n type: 'COMMA',\n pattern: /^,/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ',');\n\n return 1;\n },\n },\n {\n type: 'BYTE_ARRAY_START',\n pattern: /^\\[\\s*[bB]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'INT_ARRAY_START',\n pattern: /^\\[\\s*[iI]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'LONG_ARRAY_START',\n pattern: /^\\[\\s*[lL]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'COMPOUND_START',\n pattern: /^\\{/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '{');\n\n return 1;\n },\n },\n {\n type: 'COMPOUND_END',\n pattern: /^\\}/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '}');\n\n return 1;\n },\n },\n {\n type: 'LIST_START',\n pattern: /^\\[/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 1;\n },\n },\n {\n type: 'LIST_END',\n pattern: /^\\]/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ']');\n\n return 1;\n },\n },\n {\n // Byte - true / false converts to 1 / 0\n type: 'BYTE',\n pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(\n pos,\n type,\n matches[0].toLowerCase() === 'true' ? '1' : '0'\n );\n\n return matches[0].length;\n },\n },\n {\n // Byte - number with a suffix\n type: 'BYTE',\n pattern: anchorPattern('[-+]?[0-9]+[bB]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - there's another without the D later\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+[dD]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'FLOAT',\n pattern: anchorPattern('[-+]?[0-9.]+[fF]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'LONG',\n pattern: anchorPattern('[-+]?[0-9]+[lL]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'SHORT',\n pattern: anchorPattern('[-+]?[0-9]+[sS]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - this must come after other suffixed number types but before\n // Int's matcher\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Int - this must come after all other number types\n type: 'INT',\n pattern: anchorPattern('[-+]?[0-9]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // String - single or double quotes\n type: 'STRING',\n pattern: /^([\\\"'])(?:\\\\.|.)*?\\1/,\n callback: (pos, type, snbtData, matches) => {\n const chunk = JSON.parse(`\"${matches[0].slice(1, -1)}\"`);\n snbtData.addToken(pos, type, chunk);\n\n return matches[0].length;\n },\n },\n {\n // String - not quoted and all else failed\n type: 'STRING',\n pattern: anchorPattern('^[-0-9a-zA-Z_.+]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n];\n\n// Creates a regular expression that will start at the beginning of the string\n// and conclude with an \"end of token\" marker at the end.\nfunction anchorPattern(pattern: string) {\n return new RegExp(`^${pattern}\\s*(?:$|,|}|]|:)`);\n}\n\nexport function snbtParse(snbt: string) {\n const snbtData = new SnbtData();\n let pos = 0;\n\n while (pos < snbt.length) {\n const increment = testParsers(\n snbtData,\n snbt.slice(pos),\n tokenParsers,\n pos\n );\n\n if (!increment) {\n throw new Error(`Unexpected token at position ${pos}`);\n }\n\n pos += increment;\n }\n\n return snbtData;\n}\n"]}
1
+ {"version":3,"file":"snbt-parse.js","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAEtD,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;AAarC,SAAS,WAAW,CAChB,QAAkB,EAClB,GAAW,EACX,YAA2B,EAC3B,GAAW;IAEX,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,YAAY,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEjC,IAAI,KAAK,EAAE,CAAC;YACR,QAAQ,CAAC,WAAW,IAAI,gBAAgB,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAE5D,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,YAAY,GAAkB;IAChC;QACI,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;YAC1C,0CAA0C;YAC1C,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC9B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YAElC,OAAO,CAAC,CAAC;QACb,CAAC;KACJ;IACD;QACI,wCAAwC;QACxC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,aAAa,CAAC,yCAAyC,CAAC;QACjE,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CACb,GAAG,EACH,IAAI,EACJ,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAClD,CAAC;YAEF,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,8BAA8B;QAC9B,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC;QACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,+CAA+C;QAC/C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC;QAC1C,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,aAAa,CAAC,kBAAkB,CAAC;QAC1C,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC;QACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC;QACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,uEAAuE;QACvE,gBAAgB;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC;QACtC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,oDAAoD;QACpD,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC;QACrC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,mCAAmC;QACnC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACzD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAEpC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;IACD;QACI,0CAA0C;QAC1C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC;QAC3C,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,CAAC;KACJ;CACJ,CAAC;AAEF,8EAA8E;AAC9E,4EAA4E;AAC5E,2CAA2C;AAC3C,SAAS,aAAa,CAAC,OAAe;IAClC,OAAO,IAAI,MAAM,CAAC,IAAI,OAAO,kBAAkB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IAClC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,WAAW,CACzB,QAAQ,EACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EACf,YAAY,EACZ,GAAG,CACN,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,QAAQ,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;QAC/C,GAAG,IAAI,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC","sourcesContent":["import debug from 'debug';\nimport { SnbtData, SnbtTokenType } from './snbt-data';\n\nconst debugLog = debug('snbt:parse');\n\ninterface TokenParser {\n type: SnbtTokenType;\n pattern: RegExp;\n callback: (\n offset: number,\n type: SnbtTokenType,\n snbtData: SnbtData,\n match: RegExpMatchArray\n ) => number;\n}\n\nfunction testParsers(\n snbtData: SnbtData,\n str: string,\n tokenParsers: TokenParser[],\n pos: number\n) {\n for (const { type, pattern, callback } of tokenParsers) {\n const match = str.match(pattern);\n\n if (match) {\n debugLog(`Matched ${type} at position ${pos}: ${match[0]}`);\n\n return callback(pos, type, snbtData, match);\n }\n }\n\n return false;\n}\n\nconst tokenParsers: TokenParser[] = [\n {\n type: 'WHITESPACE',\n pattern: /^\\s+/,\n callback: (_pos, _type, _snbtData, matches) => {\n // Do not generate a token for whitespace.\n return matches[0].length;\n },\n },\n {\n type: 'COLON',\n pattern: /^:/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ':');\n\n return 1;\n },\n },\n {\n type: 'COMMA',\n pattern: /^,/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ',');\n\n return 1;\n },\n },\n {\n type: 'BYTE_ARRAY_START',\n pattern: /^\\[\\s*[bB]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'INT_ARRAY_START',\n pattern: /^\\[\\s*[iI]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'LONG_ARRAY_START',\n pattern: /^\\[\\s*[lL]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'COMPOUND_START',\n pattern: /^\\{/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '{');\n\n return 1;\n },\n },\n {\n type: 'COMPOUND_END',\n pattern: /^\\}/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '}');\n\n return 1;\n },\n },\n {\n type: 'LIST_START',\n pattern: /^\\[/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 1;\n },\n },\n {\n type: 'LIST_END',\n pattern: /^\\]/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ']');\n\n return 1;\n },\n },\n {\n // Byte - true / false converts to 1 / 0\n type: 'BYTE',\n pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(\n pos,\n type,\n matches[1].toLowerCase() === 'true' ? '1' : '0'\n );\n\n return matches[1].length;\n },\n },\n {\n // Byte - number with a suffix\n type: 'BYTE',\n pattern: anchorPattern('[-+]?[0-9]+[bB]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - there's another without the D later\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+[dD]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'FLOAT',\n pattern: anchorPattern('[-+]?[0-9.]+[fF]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'LONG',\n pattern: anchorPattern('[-+]?[0-9]+[lL]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'SHORT',\n pattern: anchorPattern('[-+]?[0-9]+[sS]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - this must come after other suffixed number types but before\n // Int's matcher\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Int - this must come after all other number types\n type: 'INT',\n pattern: anchorPattern('[-+]?[0-9]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // String - single or double quotes\n type: 'STRING',\n pattern: /^([\\\"'])(?:\\\\.|.)*?\\1/,\n callback: (pos, type, snbtData, matches) => {\n const chunk = JSON.parse(`\"${matches[0].slice(1, -1)}\"`);\n snbtData.addToken(pos, type, chunk);\n\n return matches[0].length;\n },\n },\n {\n // String - not quoted and all else failed\n type: 'STRING',\n pattern: anchorPattern('^[-0-9a-zA-Z_.+]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n];\n\n// Creates a regular expression that will start at the beginning of the string\n// and conclude with an \"end of token\" marker at the end. The lookahead will\n// not capture the end of the token marker.\nfunction anchorPattern(pattern: string) {\n return new RegExp(`^${pattern}\\s*(?=$|,|}|]|:)`);\n}\n\nexport function snbtParse(snbt: string) {\n const snbtData = new SnbtData();\n let pos = 0;\n\n while (pos < snbt.length) {\n const increment = testParsers(\n snbtData,\n snbt.slice(pos),\n tokenParsers,\n pos\n );\n\n if (!increment) {\n throw new Error(`Unexpected token at position ${pos}`);\n }\n\n debugLog(`Increment position by ${increment}`);\n pos += increment;\n }\n\n return snbtData;\n}\n"]}
@@ -75,6 +75,14 @@ function snbtToNbtCompound(_token, snbtData) {
75
75
  nbt.name = name;
76
76
  data.push(nbt);
77
77
  token = snbtData.token();
78
+ if (token && token.type === 'COMMA') {
79
+ try {
80
+ token = snbtData.token();
81
+ }
82
+ catch (err) {
83
+ throw new Error(`${err} - Unexpected end of SNBT data while looking for token after comma`);
84
+ }
85
+ }
78
86
  }
79
87
  return new NbtCompound(data);
80
88
  }
@@ -90,7 +98,8 @@ function snbtToNbtInt(token) {
90
98
  function snbtToNbtIntArray(_token, snbtData) {
91
99
  const ints = [];
92
100
  let token = snbtData.token();
93
- while (token && token.type === 'INT') {
101
+ // The fallback double parser can be used for integers too.
102
+ while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {
94
103
  ints.push(parseInt(token.content || ''));
95
104
  try {
96
105
  token = snbtData.token();
@@ -98,10 +107,11 @@ function snbtToNbtIntArray(_token, snbtData) {
98
107
  catch (err) {
99
108
  throw new Error(`${err} - Unexpected end of SNBT data while parsing int array`);
100
109
  }
101
- if (token.type !== 'COMMA') {
102
- throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);
110
+ // If we see a comma, we expect another number after it. If not, we
111
+ // expect the end of the array.
112
+ if (token.type === 'COMMA') {
113
+ token = snbtData.token();
103
114
  }
104
- token = snbtData.token();
105
115
  }
106
116
  return new NbtIntArray(ints);
107
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"snbt-to-nbt.js","sourceRoot":"","sources":["../../src/nbt/snbt-to-nbt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,MAAM,CAAC,MAAM,YAAY,GAErB;IACA,IAAI,EAAE,aAAa;IACnB,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,iBAAiB;IACjC,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE,cAAc;IACrB,GAAG,EAAE,YAAY;IACjB,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,aAAa;IACzB,IAAI,EAAE,aAAa;IACnB,gBAAgB,EAAE,kBAAkB;IACpC,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,eAAe;CAC1B,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,QAAkB;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB;IACnC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAiB,EAAE,QAAkB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,yDAAyD,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAiB,EAAE,QAAkB;IAC5D,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;QAC3B,IAAI,KAAK,CAAC;QAEV,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,wDAAwD,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB;IACrC,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACpC,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,KAAgB;IAClC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAiB,EAAE,QAAkB;IAC5D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,wDAAwD,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB,EAAE,QAAkB;IACxD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC;IAEV,IAAI,CAAC;QACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,gEAAgE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,GAAG,CAAC;QAER,IAAI,CAAC;YACD,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,+BAA+B,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEzB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC;gBACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,uEAAuE,CAAC,CAAC;YACnG,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,2CAA2C,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;IACL,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB;IACnC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAiB,EAAE,QAAkB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAErD,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,yDAAyD,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACpC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB;IACrC,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC","sourcesContent":["import { NbtBase } from '../nbt/nbt-base';\nimport { NbtByteArray } from '../nbt/nbt-byte-array';\nimport { NbtByte } from '../nbt/nbt-byte';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtDouble } from '../nbt/nbt-double';\nimport { NbtFloat } from '../nbt/nbt-float';\nimport { NbtIntArray } from '../nbt/nbt-int-array';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtShort } from '../nbt/nbt-short';\nimport { NbtString } from '../nbt/nbt-string';\nimport { SnbtData, SnbtToken } from './snbt-data';\n\nexport const fromSnbtData: {\n [key: string]: (token: SnbtToken, snbtData: SnbtData) => NbtBase<any>;\n} = {\n BYTE: snbtToNbtByte,\n BYTE_ARRAY_START: snbtToNbtByteArray,\n COMPOUND_START: snbtToNbtCompound,\n DOUBLE: snbtToNbtDouble,\n FLOAT: snbtToNbtFloat,\n INT: snbtToNbtInt,\n INT_ARRAY_START: snbtToNbtIntArray,\n LIST_START: snbtToNbtList,\n LONG: snbtToNbtLong,\n LONG_ARRAY_START: snbtToNbtLongArray,\n SHORT: snbtToNbtShort,\n STRING: snbtToNbtString,\n};\n\nexport function snbtToNbt(snbtData: SnbtData): NbtBase<any> {\n const token = snbtData.token();\n const processor = fromSnbtData[token.type];\n\n if (processor) {\n return processor(token, snbtData);\n }\n\n throw new Error(`Invalid, non-matching token ${snbtData.showToken(token)}`);\n}\n\nfunction snbtToNbtByte(token: SnbtToken): NbtByte {\n return new NbtByte(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtByteArray(_token: SnbtToken, snbtData: SnbtData): NbtByteArray {\n const bytes: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'BYTE') {\n bytes.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing byte array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtByteArray(bytes);\n}\n\nfunction snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {\n const data: NbtBase<any>[] = [];\n let token = snbtData.token();\n\n while (token && token.type !== 'COMPOUND_END') {\n if (token.type !== 'STRING') {\n throw new Error(`Expecting a string but found ${snbtData.showToken(token)}`);\n }\n\n const name = token.content;\n let colon;\n\n try {\n colon = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while looking for colon`);\n }\n\n if (colon.type !== 'COLON') {\n throw new Error(`Expecting a colon but found ${snbtData.showToken(colon)}`);\n }\n\n const nbt = snbtToNbt(snbtData);\n nbt.name = name;\n data.push(nbt);\n token = snbtData.token();\n }\n\n return new NbtCompound(data);\n}\n\nfunction snbtToNbtDouble(token: SnbtToken): NbtDouble {\n return new NbtDouble(parseFloat(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtFloat(token: SnbtToken): NbtFloat {\n return new NbtFloat(parseFloat(token.content || ''));\n}\n\nfunction snbtToNbtInt(token: SnbtToken): NbtInt {\n return new NbtInt(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {\n const ints: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'INT') {\n ints.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing int array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtIntArray(ints);\n}\n\nfunction snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {\n const list: NbtBase<any>[] = [];\n let token;\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing list at beginning`);\n }\n\n while (token.type !== 'LIST_END') {\n snbtData.step(-1);\n let nbt;\n\n try {\n nbt = snbtToNbt(snbtData);\n } catch (err) {\n throw new Error(`${err} - Error parsing list element`);\n }\n\n list.push(nbt);\n token = snbtData.token();\n\n if (token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while looking for comma or end of list`);\n }\n } else if (token.type !== 'LIST_END') {\n throw new Error(`Expecting a comma or list end but found ${snbtData.showToken(token)}`);\n }\n }\n\n if (!list.length) {\n throw new Error('Empty list not allowed in SNBT because the type cannot be inferred');\n }\n\n const firstType = list[0].type;\n\n for (let i = 1; i < list.length; i++) {\n if (list[i].type !== firstType) {\n throw new Error(`List contains mixed types: ${firstType} and ${list[i].type}`);\n }\n }\n\n return new NbtList(list, firstType);\n}\n\nfunction snbtToNbtLong(token: SnbtToken): NbtLong {\n return new NbtLong(BigInt(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtLongArray(_token: SnbtToken, snbtData: SnbtData): NbtLongArray {\n const longs: bigint[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'LONG') {\n longs.push(BigInt(token.content.slice(0, -1) || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing long array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtLongArray(longs);\n}\n\nfunction snbtToNbtShort(token: SnbtToken): NbtShort {\n return new NbtShort(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtString(token: SnbtToken): NbtString {\n return new NbtString(token.content);\n}\n"]}
1
+ {"version":3,"file":"snbt-to-nbt.js","sourceRoot":"","sources":["../../src/nbt/snbt-to-nbt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,MAAM,CAAC,MAAM,YAAY,GAErB;IACA,IAAI,EAAE,aAAa;IACnB,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,iBAAiB;IACjC,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE,cAAc;IACrB,GAAG,EAAE,YAAY;IACjB,eAAe,EAAE,iBAAiB;IAClC,UAAU,EAAE,aAAa;IACzB,IAAI,EAAE,aAAa;IACnB,gBAAgB,EAAE,kBAAkB;IACpC,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,eAAe;CAC1B,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,QAAkB;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB;IACnC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB,CACvB,MAAiB,EACjB,QAAkB;IAElB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACX,GAAG,GAAG,yDAAyD,CAClE,CAAC;QACN,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACX,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC7D,CAAC;QACN,CAAC;QAED,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAiB,EAAE,QAAkB;IAC5D,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACX,gCAAgC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC9D,CAAC;QACN,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;QAC3B,IAAI,KAAK,CAAC;QAEV,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACX,GAAG,GAAG,wDAAwD,CACjE,CAAC;QACN,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACX,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC7D,CAAC;QACN,CAAC;QAED,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEzB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACX,GAAG,GAAG,oEAAoE,CAC7E,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB;IACrC,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACpC,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,KAAgB;IAClC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAiB,EAAE,QAAkB;IAC5D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,2DAA2D;IAC3D,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACX,GAAG,GAAG,wDAAwD,CACjE,CAAC;QACN,CAAC;QAED,mEAAmE;QACnE,+BAA+B;QAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,MAAiB,EAAE,QAAkB;IACxD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC;IAEV,IAAI,CAAC;QACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACX,GAAG,GAAG,gEAAgE,CACzE,CAAC;IACN,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,GAAG,CAAC;QAER,IAAI,CAAC;YACD,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,+BAA+B,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEzB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC;gBACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACX,GAAG,GAAG,uEAAuE,CAChF,CAAC;YACN,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACX,2CAA2C,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;QACN,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACX,oEAAoE,CACvE,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACX,8BAA8B,SAAS,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAChE,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,KAAgB;IACnC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,kBAAkB,CACvB,MAAiB,EACjB,QAAkB;IAElB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAErD,IAAI,CAAC;YACD,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACX,GAAG,GAAG,yDAAyD,CAClE,CAAC;QACN,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACX,+BAA+B,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC7D,CAAC;QACN,CAAC;QAED,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACpC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB;IACrC,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC","sourcesContent":["import { NbtBase } from '../nbt/nbt-base';\nimport { NbtByteArray } from '../nbt/nbt-byte-array';\nimport { NbtByte } from '../nbt/nbt-byte';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtDouble } from '../nbt/nbt-double';\nimport { NbtFloat } from '../nbt/nbt-float';\nimport { NbtIntArray } from '../nbt/nbt-int-array';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtShort } from '../nbt/nbt-short';\nimport { NbtString } from '../nbt/nbt-string';\nimport { SnbtData, SnbtToken } from './snbt-data';\n\nexport const fromSnbtData: {\n [key: string]: (token: SnbtToken, snbtData: SnbtData) => NbtBase<any>;\n} = {\n BYTE: snbtToNbtByte,\n BYTE_ARRAY_START: snbtToNbtByteArray,\n COMPOUND_START: snbtToNbtCompound,\n DOUBLE: snbtToNbtDouble,\n FLOAT: snbtToNbtFloat,\n INT: snbtToNbtInt,\n INT_ARRAY_START: snbtToNbtIntArray,\n LIST_START: snbtToNbtList,\n LONG: snbtToNbtLong,\n LONG_ARRAY_START: snbtToNbtLongArray,\n SHORT: snbtToNbtShort,\n STRING: snbtToNbtString,\n};\n\nexport function snbtToNbt(snbtData: SnbtData): NbtBase<any> {\n const token = snbtData.token();\n const processor = fromSnbtData[token.type];\n\n if (processor) {\n return processor(token, snbtData);\n }\n\n throw new Error(`Invalid, non-matching token ${snbtData.showToken(token)}`);\n}\n\nfunction snbtToNbtByte(token: SnbtToken): NbtByte {\n return new NbtByte(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtByteArray(\n _token: SnbtToken,\n snbtData: SnbtData\n): NbtByteArray {\n const bytes: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'BYTE') {\n bytes.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing byte array`\n );\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(\n `Expecting a comma but found ${snbtData.showToken(token)}`\n );\n }\n\n token = snbtData.token();\n }\n\n return new NbtByteArray(bytes);\n}\n\nfunction snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {\n const data: NbtBase<any>[] = [];\n let token = snbtData.token();\n\n while (token && token.type !== 'COMPOUND_END') {\n if (token.type !== 'STRING') {\n throw new Error(\n `Expecting a string but found ${snbtData.showToken(token)}`\n );\n }\n\n const name = token.content;\n let colon;\n\n try {\n colon = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for colon`\n );\n }\n\n if (colon.type !== 'COLON') {\n throw new Error(\n `Expecting a colon but found ${snbtData.showToken(colon)}`\n );\n }\n\n const nbt = snbtToNbt(snbtData);\n nbt.name = name;\n data.push(nbt);\n token = snbtData.token();\n\n if (token && token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for token after comma`\n );\n }\n }\n }\n\n return new NbtCompound(data);\n}\n\nfunction snbtToNbtDouble(token: SnbtToken): NbtDouble {\n return new NbtDouble(parseFloat(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtFloat(token: SnbtToken): NbtFloat {\n return new NbtFloat(parseFloat(token.content || ''));\n}\n\nfunction snbtToNbtInt(token: SnbtToken): NbtInt {\n return new NbtInt(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {\n const ints: number[] = [];\n let token = snbtData.token();\n\n // The fallback double parser can be used for integers too.\n while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {\n ints.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing int array`\n );\n }\n\n // If we see a comma, we expect another number after it. If not, we\n // expect the end of the array.\n if (token.type === 'COMMA') {\n token = snbtData.token();\n }\n }\n\n return new NbtIntArray(ints);\n}\n\nfunction snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {\n const list: NbtBase<any>[] = [];\n let token;\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing list at beginning`\n );\n }\n\n while (token.type !== 'LIST_END') {\n snbtData.step(-1);\n let nbt;\n\n try {\n nbt = snbtToNbt(snbtData);\n } catch (err) {\n throw new Error(`${err} - Error parsing list element`);\n }\n\n list.push(nbt);\n token = snbtData.token();\n\n if (token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for comma or end of list`\n );\n }\n } else if (token.type !== 'LIST_END') {\n throw new Error(\n `Expecting a comma or list end but found ${snbtData.showToken(token)}`\n );\n }\n }\n\n if (!list.length) {\n throw new Error(\n 'Empty list not allowed in SNBT because the type cannot be inferred'\n );\n }\n\n const firstType = list[0].type;\n\n for (let i = 1; i < list.length; i++) {\n if (list[i].type !== firstType) {\n throw new Error(\n `List contains mixed types: ${firstType} and ${list[i].type}`\n );\n }\n }\n\n return new NbtList(list, firstType);\n}\n\nfunction snbtToNbtLong(token: SnbtToken): NbtLong {\n return new NbtLong(BigInt(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtLongArray(\n _token: SnbtToken,\n snbtData: SnbtData\n): NbtLongArray {\n const longs: bigint[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'LONG') {\n longs.push(BigInt(token.content.slice(0, -1) || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing long array`\n );\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(\n `Expecting a comma but found ${snbtData.showToken(token)}`\n );\n }\n\n token = snbtData.token();\n }\n\n return new NbtLongArray(longs);\n}\n\nfunction snbtToNbtShort(token: SnbtToken): NbtShort {\n return new NbtShort(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtString(token: SnbtToken): NbtString {\n return new NbtString(token.content);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mca-json",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Convert Minecraft MCA (Anvil files) and NBT into JSON and back, or modify directly in memory. Works on region files and player data.",
5
5
  "bin": {
6
6
  "mca-chunks": "dist/bin/mca-chunks.js",
@@ -38,6 +38,7 @@ const tokenParsers: TokenParser[] = [
38
38
  type: 'WHITESPACE',
39
39
  pattern: /^\s+/,
40
40
  callback: (_pos, _type, _snbtData, matches) => {
41
+ // Do not generate a token for whitespace.
41
42
  return matches[0].length;
42
43
  },
43
44
  },
@@ -130,10 +131,10 @@ const tokenParsers: TokenParser[] = [
130
131
  snbtData.addToken(
131
132
  pos,
132
133
  type,
133
- matches[0].toLowerCase() === 'true' ? '1' : '0'
134
+ matches[1].toLowerCase() === 'true' ? '1' : '0'
134
135
  );
135
136
 
136
- return matches[0].length;
137
+ return matches[1].length;
137
138
  },
138
139
  },
139
140
  {
@@ -228,9 +229,10 @@ const tokenParsers: TokenParser[] = [
228
229
  ];
229
230
 
230
231
  // Creates a regular expression that will start at the beginning of the string
231
- // and conclude with an "end of token" marker at the end.
232
+ // and conclude with an "end of token" marker at the end. The lookahead will
233
+ // not capture the end of the token marker.
232
234
  function anchorPattern(pattern: string) {
233
- return new RegExp(`^${pattern}\s*(?:$|,|}|]|:)`);
235
+ return new RegExp(`^${pattern}\s*(?=$|,|}|]|:)`);
234
236
  }
235
237
 
236
238
  export function snbtParse(snbt: string) {
@@ -249,6 +251,7 @@ export function snbtParse(snbt: string) {
249
251
  throw new Error(`Unexpected token at position ${pos}`);
250
252
  }
251
253
 
254
+ debugLog(`Increment position by ${increment}`);
252
255
  pos += increment;
253
256
  }
254
257
 
@@ -45,7 +45,10 @@ function snbtToNbtByte(token: SnbtToken): NbtByte {
45
45
  return new NbtByte(parseInt(token.content || ''));
46
46
  }
47
47
 
48
- function snbtToNbtByteArray(_token: SnbtToken, snbtData: SnbtData): NbtByteArray {
48
+ function snbtToNbtByteArray(
49
+ _token: SnbtToken,
50
+ snbtData: SnbtData
51
+ ): NbtByteArray {
49
52
  const bytes: number[] = [];
50
53
  let token = snbtData.token();
51
54
 
@@ -55,11 +58,15 @@ function snbtToNbtByteArray(_token: SnbtToken, snbtData: SnbtData): NbtByteArray
55
58
  try {
56
59
  token = snbtData.token();
57
60
  } catch (err) {
58
- throw new Error(`${err} - Unexpected end of SNBT data while parsing byte array`);
61
+ throw new Error(
62
+ `${err} - Unexpected end of SNBT data while parsing byte array`
63
+ );
59
64
  }
60
65
 
61
66
  if (token.type !== 'COMMA') {
62
- throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);
67
+ throw new Error(
68
+ `Expecting a comma but found ${snbtData.showToken(token)}`
69
+ );
63
70
  }
64
71
 
65
72
  token = snbtData.token();
@@ -74,7 +81,9 @@ function snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {
74
81
 
75
82
  while (token && token.type !== 'COMPOUND_END') {
76
83
  if (token.type !== 'STRING') {
77
- throw new Error(`Expecting a string but found ${snbtData.showToken(token)}`);
84
+ throw new Error(
85
+ `Expecting a string but found ${snbtData.showToken(token)}`
86
+ );
78
87
  }
79
88
 
80
89
  const name = token.content;
@@ -83,17 +92,31 @@ function snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {
83
92
  try {
84
93
  colon = snbtData.token();
85
94
  } catch (err) {
86
- throw new Error(`${err} - Unexpected end of SNBT data while looking for colon`);
95
+ throw new Error(
96
+ `${err} - Unexpected end of SNBT data while looking for colon`
97
+ );
87
98
  }
88
99
 
89
100
  if (colon.type !== 'COLON') {
90
- throw new Error(`Expecting a colon but found ${snbtData.showToken(colon)}`);
101
+ throw new Error(
102
+ `Expecting a colon but found ${snbtData.showToken(colon)}`
103
+ );
91
104
  }
92
105
 
93
106
  const nbt = snbtToNbt(snbtData);
94
107
  nbt.name = name;
95
108
  data.push(nbt);
96
109
  token = snbtData.token();
110
+
111
+ if (token && token.type === 'COMMA') {
112
+ try {
113
+ token = snbtData.token();
114
+ } catch (err) {
115
+ throw new Error(
116
+ `${err} - Unexpected end of SNBT data while looking for token after comma`
117
+ );
118
+ }
119
+ }
97
120
  }
98
121
 
99
122
  return new NbtCompound(data);
@@ -115,20 +138,23 @@ function snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {
115
138
  const ints: number[] = [];
116
139
  let token = snbtData.token();
117
140
 
118
- while (token && token.type === 'INT') {
141
+ // The fallback double parser can be used for integers too.
142
+ while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {
119
143
  ints.push(parseInt(token.content || ''));
120
144
 
121
145
  try {
122
146
  token = snbtData.token();
123
147
  } catch (err) {
124
- throw new Error(`${err} - Unexpected end of SNBT data while parsing int array`);
148
+ throw new Error(
149
+ `${err} - Unexpected end of SNBT data while parsing int array`
150
+ );
125
151
  }
126
152
 
127
- if (token.type !== 'COMMA') {
128
- throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);
153
+ // If we see a comma, we expect another number after it. If not, we
154
+ // expect the end of the array.
155
+ if (token.type === 'COMMA') {
156
+ token = snbtData.token();
129
157
  }
130
-
131
- token = snbtData.token();
132
158
  }
133
159
 
134
160
  return new NbtIntArray(ints);
@@ -141,7 +167,9 @@ function snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {
141
167
  try {
142
168
  token = snbtData.token();
143
169
  } catch (err) {
144
- throw new Error(`${err} - Unexpected end of SNBT data while parsing list at beginning`);
170
+ throw new Error(
171
+ `${err} - Unexpected end of SNBT data while parsing list at beginning`
172
+ );
145
173
  }
146
174
 
147
175
  while (token.type !== 'LIST_END') {
@@ -161,22 +189,30 @@ function snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {
161
189
  try {
162
190
  token = snbtData.token();
163
191
  } catch (err) {
164
- throw new Error(`${err} - Unexpected end of SNBT data while looking for comma or end of list`);
192
+ throw new Error(
193
+ `${err} - Unexpected end of SNBT data while looking for comma or end of list`
194
+ );
165
195
  }
166
196
  } else if (token.type !== 'LIST_END') {
167
- throw new Error(`Expecting a comma or list end but found ${snbtData.showToken(token)}`);
197
+ throw new Error(
198
+ `Expecting a comma or list end but found ${snbtData.showToken(token)}`
199
+ );
168
200
  }
169
201
  }
170
202
 
171
203
  if (!list.length) {
172
- throw new Error('Empty list not allowed in SNBT because the type cannot be inferred');
204
+ throw new Error(
205
+ 'Empty list not allowed in SNBT because the type cannot be inferred'
206
+ );
173
207
  }
174
208
 
175
209
  const firstType = list[0].type;
176
210
 
177
211
  for (let i = 1; i < list.length; i++) {
178
212
  if (list[i].type !== firstType) {
179
- throw new Error(`List contains mixed types: ${firstType} and ${list[i].type}`);
213
+ throw new Error(
214
+ `List contains mixed types: ${firstType} and ${list[i].type}`
215
+ );
180
216
  }
181
217
  }
182
218
 
@@ -187,7 +223,10 @@ function snbtToNbtLong(token: SnbtToken): NbtLong {
187
223
  return new NbtLong(BigInt(token.content.slice(0, -1) || ''));
188
224
  }
189
225
 
190
- function snbtToNbtLongArray(_token: SnbtToken, snbtData: SnbtData): NbtLongArray {
226
+ function snbtToNbtLongArray(
227
+ _token: SnbtToken,
228
+ snbtData: SnbtData
229
+ ): NbtLongArray {
191
230
  const longs: bigint[] = [];
192
231
  let token = snbtData.token();
193
232
 
@@ -197,11 +236,15 @@ function snbtToNbtLongArray(_token: SnbtToken, snbtData: SnbtData): NbtLongArray
197
236
  try {
198
237
  token = snbtData.token();
199
238
  } catch (err) {
200
- throw new Error(`${err} - Unexpected end of SNBT data while parsing long array`);
239
+ throw new Error(
240
+ `${err} - Unexpected end of SNBT data while parsing long array`
241
+ );
201
242
  }
202
243
 
203
244
  if (token.type !== 'COMMA') {
204
- throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);
245
+ throw new Error(
246
+ `Expecting a comma but found ${snbtData.showToken(token)}`
247
+ );
205
248
  }
206
249
 
207
250
  token = snbtData.token();