@futpib/parser 1.0.4 → 1.0.6

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.
Files changed (250) hide show
  1. package/.claude/settings.local.json +24 -0
  2. package/.github/workflows/main.yml +1 -0
  3. package/build/androidPackageParser.js +30 -32
  4. package/build/arbitraryDalvikBytecode.d.ts +3 -3
  5. package/build/arbitraryDalvikBytecode.js +33 -27
  6. package/build/arbitraryDalvikExecutable.js +55 -17
  7. package/build/arbitraryJava.d.ts +31 -0
  8. package/build/arbitraryJava.js +532 -0
  9. package/build/arbitraryJavaScript.d.ts +3 -0
  10. package/build/arbitraryJavaScript.js +263 -0
  11. package/build/arbitraryJavascript.d.ts +3 -0
  12. package/build/arbitraryJavascript.js +263 -0
  13. package/build/arbitraryZig.d.ts +3 -0
  14. package/build/arbitraryZig.js +240 -0
  15. package/build/arbitraryZipStream.d.ts +1 -1
  16. package/build/arrayParser.js +72 -13
  17. package/build/backsmali.d.ts +4 -3
  18. package/build/backsmali.js +26 -6
  19. package/build/bash.d.ts +6 -1
  20. package/build/bashParser.js +131 -90
  21. package/build/bashParser.test.js +162 -0
  22. package/build/bashParserEdgeCases.test.d.ts +1 -0
  23. package/build/bashParserEdgeCases.test.js +117 -0
  24. package/build/dalvikBytecodeParser/addressConversion.d.ts +110 -0
  25. package/build/dalvikBytecodeParser/addressConversion.js +334 -0
  26. package/build/dalvikBytecodeParser/formatParsers.d.ts +7 -6
  27. package/build/dalvikBytecodeParser/formatParsers.js +13 -14
  28. package/build/dalvikBytecodeParser.d.ts +60 -31
  29. package/build/dalvikBytecodeParser.js +92 -35
  30. package/build/dalvikBytecodeParser.test-d.d.ts +1 -0
  31. package/build/dalvikBytecodeParser.test-d.js +268 -0
  32. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +9 -8
  33. package/build/dalvikBytecodeUnparser/formatUnparsers.js +13 -12
  34. package/build/dalvikBytecodeUnparser.d.ts +2 -2
  35. package/build/dalvikBytecodeUnparser.js +23 -23
  36. package/build/dalvikBytecodeUnparser.test.js +7 -7
  37. package/build/dalvikExecutable.d.ts +3 -3
  38. package/build/dalvikExecutable.test-d.d.ts +1 -0
  39. package/build/dalvikExecutable.test-d.js +59 -0
  40. package/build/dalvikExecutableParser/typedNumbers.d.ts +18 -0
  41. package/build/dalvikExecutableParser/typedNumbers.js +3 -0
  42. package/build/dalvikExecutableParser.d.ts +2 -1
  43. package/build/dalvikExecutableParser.js +96 -77
  44. package/build/dalvikExecutableParser.test.js +24 -3
  45. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +3 -0
  46. package/build/dalvikExecutableUnparser/poolScanners.d.ts +2 -2
  47. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +3 -3
  48. package/build/dalvikExecutableUnparser/sectionUnparsers.js +26 -11
  49. package/build/dalvikExecutableUnparser.d.ts +2 -2
  50. package/build/dalvikExecutableUnparser.test.js +2 -1
  51. package/build/disjunctionParser.d.ts +5 -3
  52. package/build/disjunctionParser.js +79 -17
  53. package/build/disjunctionParser.test-d.d.ts +1 -0
  54. package/build/disjunctionParser.test-d.js +72 -0
  55. package/build/elementSwitchParser.d.ts +4 -0
  56. package/build/{exactElementSwitchParser.js → elementSwitchParser.js} +3 -4
  57. package/build/elementSwitchParser.test-d.d.ts +1 -0
  58. package/build/elementSwitchParser.test-d.js +44 -0
  59. package/build/exactSequenceParser.d.ts +4 -2
  60. package/build/exactSequenceParser.test-d.d.ts +1 -0
  61. package/build/exactSequenceParser.test-d.js +36 -0
  62. package/build/fetchCid.js +2 -66
  63. package/build/index.d.ts +3 -2
  64. package/build/index.js +2 -1
  65. package/build/index.test.js +16 -1
  66. package/build/inputReader.d.ts +10 -0
  67. package/build/inputReader.js +36 -0
  68. package/build/java.d.ts +502 -0
  69. package/build/java.js +2 -0
  70. package/build/javaKeyStoreParser.js +14 -17
  71. package/build/javaParser.d.ts +51 -0
  72. package/build/javaParser.js +1538 -0
  73. package/build/javaParser.test.d.ts +1 -0
  74. package/build/javaParser.test.js +1287 -0
  75. package/build/javaScript.d.ts +35 -0
  76. package/build/javaScript.js +1 -0
  77. package/build/javaScriptParser.d.ts +9 -0
  78. package/build/javaScriptParser.js +34 -0
  79. package/build/javaScriptUnparser.d.ts +3 -0
  80. package/build/javaScriptUnparser.js +4 -0
  81. package/build/javaScriptUnparser.test.d.ts +1 -0
  82. package/build/javaScriptUnparser.test.js +24 -0
  83. package/build/javaUnparser.d.ts +2 -0
  84. package/build/javaUnparser.js +519 -0
  85. package/build/javaUnparser.test.d.ts +1 -0
  86. package/build/javaUnparser.test.js +24 -0
  87. package/build/javascript.d.ts +35 -0
  88. package/build/javascript.js +1 -0
  89. package/build/javascriptParser.d.ts +9 -0
  90. package/build/javascriptParser.js +34 -0
  91. package/build/javascriptUnparser.d.ts +3 -0
  92. package/build/javascriptUnparser.js +4 -0
  93. package/build/javascriptUnparser.test.d.ts +1 -0
  94. package/build/javascriptUnparser.test.js +24 -0
  95. package/build/jsonParser.js +2 -12
  96. package/build/lazyMessageError.d.ts +3 -0
  97. package/build/lookaheadParser.js +60 -3
  98. package/build/negativeLookaheadParser.js +70 -11
  99. package/build/nonEmptyArrayParser.js +72 -13
  100. package/build/objectParser.d.ts +12 -0
  101. package/build/objectParser.js +31 -0
  102. package/build/objectParser.test-d.d.ts +1 -0
  103. package/build/objectParser.test-d.js +112 -0
  104. package/build/objectParser.test.d.ts +1 -0
  105. package/build/objectParser.test.js +55 -0
  106. package/build/optionalParser.js +69 -10
  107. package/build/parser.d.ts +4 -0
  108. package/build/parser.js +3 -1
  109. package/build/parser.test.js +114 -1
  110. package/build/parserConsumedSequenceParser.js +66 -7
  111. package/build/parserContext.d.ts +6 -0
  112. package/build/parserContext.js +20 -11
  113. package/build/parserError.d.ts +119 -27
  114. package/build/parserError.js +16 -8
  115. package/build/regexpParser.js +33 -3
  116. package/build/regexpParser.test.js +31 -0
  117. package/build/regularExpressionParser.js +35 -15
  118. package/build/separatedArrayParser.js +73 -14
  119. package/build/separatedNonEmptyArrayParser.js +73 -14
  120. package/build/sliceBoundedParser.js +62 -5
  121. package/build/smaliParser.d.ts +7 -7
  122. package/build/smaliParser.js +185 -268
  123. package/build/smaliParser.test.js +58 -0
  124. package/build/stringEscapes.d.ts +5 -0
  125. package/build/stringEscapes.js +244 -0
  126. package/build/symbolicExpression.d.ts +29 -0
  127. package/build/symbolicExpression.js +1 -0
  128. package/build/symbolicExpressionParser.d.ts +4 -0
  129. package/build/symbolicExpressionParser.js +123 -0
  130. package/build/symbolicExpressionParser.test.d.ts +1 -0
  131. package/build/symbolicExpressionParser.test.js +289 -0
  132. package/build/terminatedArrayParser.js +113 -38
  133. package/build/terminatedArrayParser.test.js +4 -2
  134. package/build/tupleParser.d.ts +7 -15
  135. package/build/tupleParser.js +1 -0
  136. package/build/unionParser.d.ts +5 -3
  137. package/build/unionParser.js +7 -2
  138. package/build/unionParser.test-d.d.ts +1 -0
  139. package/build/unionParser.test-d.js +72 -0
  140. package/build/unionParser.test.js +10 -11
  141. package/build/zig.d.ts +280 -0
  142. package/build/zig.js +2 -0
  143. package/build/zigParser.d.ts +3 -0
  144. package/build/zigParser.js +1119 -0
  145. package/build/zigParser.test.d.ts +1 -0
  146. package/build/zigParser.test.js +1590 -0
  147. package/build/zigUnparser.d.ts +2 -0
  148. package/build/zigUnparser.js +460 -0
  149. package/build/zigUnparser.test.d.ts +1 -0
  150. package/build/zigUnparser.test.js +24 -0
  151. package/build/zipParser.js +19 -32
  152. package/build/zipUnparser.js +19 -7
  153. package/build/zipUnparser.test.js +1 -1
  154. package/node_modules-@types/s-expression/index.d.ts +5 -0
  155. package/package.json +24 -6
  156. package/src/androidPackageParser.ts +33 -60
  157. package/src/arbitraryDalvikBytecode.ts +39 -31
  158. package/src/arbitraryDalvikExecutable.ts +65 -20
  159. package/src/arbitraryJava.ts +804 -0
  160. package/src/arbitraryJavaScript.ts +410 -0
  161. package/src/arbitraryZig.ts +380 -0
  162. package/src/arrayParser.ts +1 -3
  163. package/src/backsmali.ts +35 -4
  164. package/src/bash.ts +8 -1
  165. package/src/bashParser.test.ts +258 -0
  166. package/src/bashParser.ts +180 -143
  167. package/src/dalvikBytecodeParser/addressConversion.ts +496 -0
  168. package/src/dalvikBytecodeParser/formatParsers.ts +19 -29
  169. package/src/dalvikBytecodeParser.test-d.ts +310 -0
  170. package/src/dalvikBytecodeParser.ts +194 -69
  171. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +27 -26
  172. package/src/dalvikBytecodeUnparser.test.ts +7 -7
  173. package/src/dalvikBytecodeUnparser.ts +31 -30
  174. package/src/dalvikExecutable.test-d.ts +132 -0
  175. package/src/dalvikExecutable.ts +3 -3
  176. package/src/dalvikExecutableParser/typedNumbers.ts +11 -0
  177. package/src/dalvikExecutableParser.test.ts +37 -3
  178. package/src/dalvikExecutableParser.test.ts.md +163 -2
  179. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  180. package/src/dalvikExecutableParser.ts +121 -139
  181. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +4 -0
  182. package/src/dalvikExecutableUnparser/poolScanners.ts +6 -6
  183. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +38 -14
  184. package/src/dalvikExecutableUnparser.test.ts +3 -2
  185. package/src/dalvikExecutableUnparser.ts +4 -4
  186. package/src/disjunctionParser.test-d.ts +105 -0
  187. package/src/disjunctionParser.ts +18 -15
  188. package/src/elementSwitchParser.test-d.ts +74 -0
  189. package/src/elementSwitchParser.ts +51 -0
  190. package/src/exactSequenceParser.test-d.ts +43 -0
  191. package/src/exactSequenceParser.ts +13 -8
  192. package/src/fetchCid.ts +2 -76
  193. package/src/index.test.ts +22 -1
  194. package/src/index.ts +7 -1
  195. package/src/inputReader.ts +53 -0
  196. package/src/java.ts +708 -0
  197. package/src/javaKeyStoreParser.ts +18 -32
  198. package/src/javaParser.test.ts +1592 -0
  199. package/src/javaParser.ts +2640 -0
  200. package/src/javaScript.ts +36 -0
  201. package/src/javaScriptParser.ts +57 -0
  202. package/src/javaScriptUnparser.test.ts +37 -0
  203. package/src/javaScriptUnparser.ts +7 -0
  204. package/src/javaUnparser.test.ts +37 -0
  205. package/src/javaUnparser.ts +640 -0
  206. package/src/jsonParser.ts +6 -27
  207. package/src/lookaheadParser.ts +2 -6
  208. package/src/negativeLookaheadParser.ts +1 -3
  209. package/src/nonEmptyArrayParser.ts +1 -3
  210. package/src/objectParser.test-d.ts +152 -0
  211. package/src/objectParser.test.ts +71 -0
  212. package/src/objectParser.ts +69 -0
  213. package/src/optionalParser.ts +1 -3
  214. package/src/parser.test.ts +151 -4
  215. package/src/parser.ts +11 -1
  216. package/src/parserConsumedSequenceParser.ts +2 -4
  217. package/src/parserContext.ts +26 -11
  218. package/src/parserError.ts +17 -3
  219. package/src/regexpParser.test.ts +78 -0
  220. package/src/regexpParser.ts +35 -3
  221. package/src/regularExpressionParser.ts +36 -37
  222. package/src/separatedArrayParser.ts +1 -3
  223. package/src/separatedNonEmptyArrayParser.ts +1 -3
  224. package/src/sliceBoundedParser.test.ts +2 -2
  225. package/src/sliceBoundedParser.ts +15 -19
  226. package/src/smaliParser.test.ts +64 -0
  227. package/src/smaliParser.test.ts.md +12 -12
  228. package/src/smaliParser.test.ts.snap +0 -0
  229. package/src/smaliParser.ts +246 -534
  230. package/src/stringEscapes.ts +253 -0
  231. package/src/symbolicExpression.ts +17 -0
  232. package/src/symbolicExpressionParser.test.ts +466 -0
  233. package/src/symbolicExpressionParser.ts +190 -0
  234. package/src/terminatedArrayParser.test.ts +9 -6
  235. package/src/terminatedArrayParser.ts +25 -29
  236. package/src/tupleParser.ts +21 -18
  237. package/src/unionParser.test-d.ts +105 -0
  238. package/src/unionParser.test.ts +18 -17
  239. package/src/unionParser.ts +28 -16
  240. package/src/zig.ts +411 -0
  241. package/src/zigParser.test.ts +1693 -0
  242. package/src/zigParser.ts +1745 -0
  243. package/src/zigUnparser.test.ts +37 -0
  244. package/src/zigUnparser.ts +615 -0
  245. package/src/zipParser.ts +20 -56
  246. package/src/zipUnparser.test.ts +1 -1
  247. package/src/zipUnparser.ts +22 -7
  248. package/tsconfig.json +2 -2
  249. package/build/exactElementSwitchParser.d.ts +0 -3
  250. package/src/exactElementSwitchParser.ts +0 -41
@@ -166,6 +166,79 @@ test('double quoted string with variable', async t => {
166
166
  }
167
167
  });
168
168
 
169
+ test('double quoted string with trailing dollar', async t => {
170
+ const result = await runParser(
171
+ bashScriptParser,
172
+ 'echo "hello$"',
173
+ stringParserInputCompanion,
174
+ );
175
+
176
+ const cmd = result.entries[0].pipeline.commands[0];
177
+ if (cmd.type === 'simple') {
178
+ t.deepEqual(cmd.args[0], {
179
+ parts: [{
180
+ type: 'doubleQuoted',
181
+ parts: [
182
+ { type: 'literal', value: 'hello' },
183
+ { type: 'literal', value: '$' },
184
+ ],
185
+ }],
186
+ });
187
+ }
188
+ });
189
+
190
+ test('double quoted string with only dollar', async t => {
191
+ const result = await runParser(
192
+ bashScriptParser,
193
+ 'echo "$"',
194
+ stringParserInputCompanion,
195
+ );
196
+
197
+ const cmd = result.entries[0].pipeline.commands[0];
198
+ if (cmd.type === 'simple') {
199
+ t.deepEqual(cmd.args[0], {
200
+ parts: [{
201
+ type: 'doubleQuoted',
202
+ parts: [
203
+ { type: 'literal', value: '$' },
204
+ ],
205
+ }],
206
+ });
207
+ }
208
+ });
209
+
210
+ test('grep with dollar anchor in double quotes', async t => {
211
+ const result = await runParser(
212
+ bashScriptParser,
213
+ 'grep "\\.ts$"',
214
+ stringParserInputCompanion,
215
+ );
216
+
217
+ const cmd = result.entries[0].pipeline.commands[0];
218
+ if (cmd.type === 'simple') {
219
+ t.deepEqual(cmd.args[0], {
220
+ parts: [{
221
+ type: 'doubleQuoted',
222
+ parts: [
223
+ { type: 'literal', value: '\\' },
224
+ { type: 'literal', value: '.ts' },
225
+ { type: 'literal', value: '$' },
226
+ ],
227
+ }],
228
+ });
229
+ }
230
+ });
231
+
232
+ test('pipeline with dollar anchor in double quoted grep pattern', async t => {
233
+ const result = await runParser(
234
+ bashScriptParser,
235
+ 'ls -la /home | grep "\\.ts$" | grep -v "\\.test\\.ts"',
236
+ stringParserInputCompanion,
237
+ );
238
+
239
+ t.is(result.entries[0].pipeline.commands.length, 3);
240
+ });
241
+
169
242
  test('simple variable', async t => {
170
243
  const result = await runParser(
171
244
  bashScriptParser,
@@ -318,6 +391,191 @@ test('[[ treated as command name', async t => {
318
391
  }
319
392
  });
320
393
 
394
+ // Braced variable expansion: ${VAR}
395
+ test('braced variable expansion', async t => {
396
+ const result = await runParser(
397
+ bashScriptParser,
398
+ 'echo ${HOME}',
399
+ stringParserInputCompanion,
400
+ );
401
+
402
+ const cmd = result.entries[0].pipeline.commands[0];
403
+ if (cmd.type === 'simple') {
404
+ t.is(cmd.args[0].parts[0].type, 'variableBraced');
405
+ }
406
+ });
407
+
408
+ // Braced variable with default: ${VAR:-default}
409
+ test('braced variable with default value', async t => {
410
+ const result = await runParser(
411
+ bashScriptParser,
412
+ 'echo ${VAR:-default}',
413
+ stringParserInputCompanion,
414
+ );
415
+
416
+ const cmd = result.entries[0].pipeline.commands[0];
417
+ if (cmd.type === 'simple') {
418
+ t.is(cmd.args[0].parts[0].type, 'variableBraced');
419
+ }
420
+ });
421
+
422
+ // Arithmetic expansion: $((1+2))
423
+ test('arithmetic expansion', async t => {
424
+ const result = await runParser(
425
+ bashScriptParser,
426
+ 'echo $((1+2))',
427
+ stringParserInputCompanion,
428
+ );
429
+
430
+ const cmd = result.entries[0].pipeline.commands[0];
431
+ if (cmd.type === 'simple') {
432
+ t.is(cmd.args[0].parts[0].type, 'arithmeticExpansion');
433
+ }
434
+ });
435
+
436
+ // Bare $ at end of unquoted word
437
+ test('bare dollar at end of unquoted word', async t => {
438
+ const result = await runParser(
439
+ bashScriptParser,
440
+ 'echo foo$',
441
+ stringParserInputCompanion,
442
+ );
443
+
444
+ const cmd = result.entries[0].pipeline.commands[0];
445
+ if (cmd.type === 'simple') {
446
+ t.deepEqual(cmd.args[0], {
447
+ parts: [
448
+ { type: 'literal', value: 'foo' },
449
+ { type: 'literal', value: '$' },
450
+ ],
451
+ });
452
+ }
453
+ });
454
+
455
+ // Bare $ as its own unquoted word
456
+ test('bare dollar as standalone unquoted word', async t => {
457
+ const result = await runParser(
458
+ bashScriptParser,
459
+ 'echo $',
460
+ stringParserInputCompanion,
461
+ );
462
+
463
+ const cmd = result.entries[0].pipeline.commands[0];
464
+ if (cmd.type === 'simple') {
465
+ t.deepEqual(cmd.args[0], {
466
+ parts: [
467
+ { type: 'literal', value: '$' },
468
+ ],
469
+ });
470
+ }
471
+ });
472
+
473
+ // Comment after command
474
+ test('comment after command', async t => {
475
+ const result = await runParser(
476
+ bashScriptParser,
477
+ 'echo hello # this is a comment',
478
+ stringParserInputCompanion,
479
+ );
480
+
481
+ const cmd = result.entries[0].pipeline.commands[0];
482
+ if (cmd.type === 'simple') {
483
+ t.is(cmd.args.length, 1);
484
+ t.deepEqual(cmd.args[0], {
485
+ parts: [{ type: 'literal', value: 'hello' }],
486
+ });
487
+ }
488
+ });
489
+
490
+ // ANSI-C quoting: $'...'
491
+ test('ansi-c quoting', async t => {
492
+ const result = await runParser(
493
+ bashScriptParser,
494
+ "echo $'hello\\nworld'",
495
+ stringParserInputCompanion,
496
+ );
497
+
498
+ const cmd = result.entries[0].pipeline.commands[0];
499
+ if (cmd.type === 'simple') {
500
+ t.is(cmd.args.length, 1);
501
+ }
502
+ });
503
+
504
+ // Braced variable in double quotes: "${VAR}"
505
+ test('braced variable in double quotes', async t => {
506
+ const result = await runParser(
507
+ bashScriptParser,
508
+ 'echo "${HOME}"',
509
+ stringParserInputCompanion,
510
+ );
511
+
512
+ const cmd = result.entries[0].pipeline.commands[0];
513
+ if (cmd.type === 'simple') {
514
+ const dq = cmd.args[0].parts[0];
515
+ if (dq.type === 'doubleQuoted') {
516
+ t.is(dq.parts[0].type, 'variableBraced');
517
+ }
518
+ }
519
+ });
520
+
521
+ // Arithmetic expansion in double quotes
522
+ test('arithmetic expansion in double quotes', async t => {
523
+ const result = await runParser(
524
+ bashScriptParser,
525
+ 'echo "$((1+2))"',
526
+ stringParserInputCompanion,
527
+ );
528
+
529
+ const cmd = result.entries[0].pipeline.commands[0];
530
+ if (cmd.type === 'simple') {
531
+ const dq = cmd.args[0].parts[0];
532
+ if (dq.type === 'doubleQuoted') {
533
+ t.is(dq.parts[0].type, 'arithmeticExpansion');
534
+ }
535
+ }
536
+ });
537
+
538
+ // Process substitution: <(cmd)
539
+ test('process substitution input', async t => {
540
+ const result = await runParser(
541
+ bashScriptParser,
542
+ 'diff <(sort file1) <(sort file2)',
543
+ stringParserInputCompanion,
544
+ );
545
+
546
+ t.truthy(result);
547
+ });
548
+
549
+ // Line continuation (backslash-newline)
550
+ test('line continuation', async t => {
551
+ const result = await runParser(
552
+ bashScriptParser,
553
+ 'echo hello \\\nworld',
554
+ stringParserInputCompanion,
555
+ );
556
+
557
+ const cmd = result.entries[0].pipeline.commands[0];
558
+ if (cmd.type === 'simple') {
559
+ t.is(cmd.args.length, 2);
560
+ }
561
+ });
562
+
563
+ // Hash in middle of unquoted word is literal, not a comment
564
+ test('hash in middle of unquoted word', async t => {
565
+ const result = await runParser(
566
+ bashScriptParser,
567
+ 'echo foo#bar',
568
+ stringParserInputCompanion,
569
+ );
570
+
571
+ const cmd = result.entries[0].pipeline.commands[0];
572
+ if (cmd.type === 'simple') {
573
+ t.deepEqual(cmd.args[0], {
574
+ parts: [{ type: 'literal', value: 'foo#bar' }],
575
+ });
576
+ }
577
+ });
578
+
321
579
  test('if treated as command name', async t => {
322
580
  const result = await runParser(
323
581
  bashScriptParser,