@futpib/parser 1.0.3 → 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 (262) 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 +89 -0
  20. package/build/bash.js +1 -0
  21. package/build/bashParser.d.ts +6 -0
  22. package/build/bashParser.js +335 -0
  23. package/build/bashParser.test.d.ts +1 -0
  24. package/build/bashParser.test.js +343 -0
  25. package/build/bashParserEdgeCases.test.d.ts +1 -0
  26. package/build/bashParserEdgeCases.test.js +117 -0
  27. package/build/dalvikBytecodeParser/addressConversion.d.ts +110 -0
  28. package/build/dalvikBytecodeParser/addressConversion.js +334 -0
  29. package/build/dalvikBytecodeParser/formatParsers.d.ts +7 -6
  30. package/build/dalvikBytecodeParser/formatParsers.js +13 -14
  31. package/build/dalvikBytecodeParser.d.ts +60 -31
  32. package/build/dalvikBytecodeParser.js +92 -35
  33. package/build/dalvikBytecodeParser.test-d.d.ts +1 -0
  34. package/build/dalvikBytecodeParser.test-d.js +268 -0
  35. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +9 -8
  36. package/build/dalvikBytecodeUnparser/formatUnparsers.js +13 -12
  37. package/build/dalvikBytecodeUnparser.d.ts +2 -2
  38. package/build/dalvikBytecodeUnparser.js +23 -23
  39. package/build/dalvikBytecodeUnparser.test.js +7 -7
  40. package/build/dalvikExecutable.d.ts +3 -3
  41. package/build/dalvikExecutable.test-d.d.ts +1 -0
  42. package/build/dalvikExecutable.test-d.js +59 -0
  43. package/build/dalvikExecutableParser/typedNumbers.d.ts +18 -0
  44. package/build/dalvikExecutableParser/typedNumbers.js +3 -0
  45. package/build/dalvikExecutableParser.d.ts +2 -1
  46. package/build/dalvikExecutableParser.js +96 -77
  47. package/build/dalvikExecutableParser.test.js +24 -3
  48. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +3 -0
  49. package/build/dalvikExecutableUnparser/poolScanners.d.ts +2 -2
  50. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +3 -3
  51. package/build/dalvikExecutableUnparser/sectionUnparsers.js +26 -11
  52. package/build/dalvikExecutableUnparser.d.ts +2 -2
  53. package/build/dalvikExecutableUnparser.test.js +2 -1
  54. package/build/disjunctionParser.d.ts +5 -3
  55. package/build/disjunctionParser.js +79 -17
  56. package/build/disjunctionParser.test-d.d.ts +1 -0
  57. package/build/disjunctionParser.test-d.js +72 -0
  58. package/build/elementSwitchParser.d.ts +4 -0
  59. package/build/{exactElementSwitchParser.js → elementSwitchParser.js} +3 -4
  60. package/build/elementSwitchParser.test-d.d.ts +1 -0
  61. package/build/elementSwitchParser.test-d.js +44 -0
  62. package/build/exactSequenceParser.d.ts +4 -2
  63. package/build/exactSequenceParser.test-d.d.ts +1 -0
  64. package/build/exactSequenceParser.test-d.js +36 -0
  65. package/build/fetchCid.js +2 -66
  66. package/build/index.d.ts +25 -2
  67. package/build/index.js +23 -1
  68. package/build/index.test.js +16 -1
  69. package/build/inputReader.d.ts +10 -0
  70. package/build/inputReader.js +36 -0
  71. package/build/java.d.ts +502 -0
  72. package/build/java.js +2 -0
  73. package/build/javaKeyStoreParser.js +14 -17
  74. package/build/javaParser.d.ts +51 -0
  75. package/build/javaParser.js +1538 -0
  76. package/build/javaParser.test.d.ts +1 -0
  77. package/build/javaParser.test.js +1287 -0
  78. package/build/javaScript.d.ts +35 -0
  79. package/build/javaScript.js +1 -0
  80. package/build/javaScriptParser.d.ts +9 -0
  81. package/build/javaScriptParser.js +34 -0
  82. package/build/javaScriptUnparser.d.ts +3 -0
  83. package/build/javaScriptUnparser.js +4 -0
  84. package/build/javaScriptUnparser.test.d.ts +1 -0
  85. package/build/javaScriptUnparser.test.js +24 -0
  86. package/build/javaUnparser.d.ts +2 -0
  87. package/build/javaUnparser.js +519 -0
  88. package/build/javaUnparser.test.d.ts +1 -0
  89. package/build/javaUnparser.test.js +24 -0
  90. package/build/javascript.d.ts +35 -0
  91. package/build/javascript.js +1 -0
  92. package/build/javascriptParser.d.ts +9 -0
  93. package/build/javascriptParser.js +34 -0
  94. package/build/javascriptUnparser.d.ts +3 -0
  95. package/build/javascriptUnparser.js +4 -0
  96. package/build/javascriptUnparser.test.d.ts +1 -0
  97. package/build/javascriptUnparser.test.js +24 -0
  98. package/build/jsonParser.js +2 -12
  99. package/build/lazyMessageError.d.ts +3 -0
  100. package/build/lookaheadParser.js +60 -3
  101. package/build/negativeLookaheadParser.js +70 -11
  102. package/build/nonEmptyArrayParser.js +72 -13
  103. package/build/objectParser.d.ts +12 -0
  104. package/build/objectParser.js +31 -0
  105. package/build/objectParser.test-d.d.ts +1 -0
  106. package/build/objectParser.test-d.js +112 -0
  107. package/build/objectParser.test.d.ts +1 -0
  108. package/build/objectParser.test.js +55 -0
  109. package/build/optionalParser.js +69 -10
  110. package/build/parser.d.ts +4 -0
  111. package/build/parser.js +3 -1
  112. package/build/parser.test.js +114 -1
  113. package/build/parserConsumedSequenceParser.js +66 -7
  114. package/build/parserContext.d.ts +6 -0
  115. package/build/parserContext.js +20 -11
  116. package/build/parserError.d.ts +119 -27
  117. package/build/parserError.js +16 -8
  118. package/build/regexpParser.d.ts +2 -0
  119. package/build/regexpParser.js +101 -0
  120. package/build/regexpParser.test.d.ts +1 -0
  121. package/build/regexpParser.test.js +114 -0
  122. package/build/regularExpression.d.ts +63 -0
  123. package/build/regularExpression.js +1 -0
  124. package/build/regularExpressionParser.d.ts +3 -0
  125. package/build/regularExpressionParser.js +600 -0
  126. package/build/regularExpressionParser.test.d.ts +1 -0
  127. package/build/regularExpressionParser.test.js +89 -0
  128. package/build/separatedArrayParser.js +73 -14
  129. package/build/separatedNonEmptyArrayParser.js +73 -14
  130. package/build/sliceBoundedParser.js +62 -5
  131. package/build/smaliParser.d.ts +7 -7
  132. package/build/smaliParser.js +185 -268
  133. package/build/smaliParser.test.js +58 -0
  134. package/build/stringEscapes.d.ts +5 -0
  135. package/build/stringEscapes.js +244 -0
  136. package/build/symbolicExpression.d.ts +29 -0
  137. package/build/symbolicExpression.js +1 -0
  138. package/build/symbolicExpressionParser.d.ts +4 -0
  139. package/build/symbolicExpressionParser.js +123 -0
  140. package/build/symbolicExpressionParser.test.d.ts +1 -0
  141. package/build/symbolicExpressionParser.test.js +289 -0
  142. package/build/terminatedArrayParser.js +113 -38
  143. package/build/terminatedArrayParser.test.js +4 -2
  144. package/build/tupleParser.d.ts +7 -15
  145. package/build/tupleParser.js +1 -0
  146. package/build/unionParser.d.ts +5 -3
  147. package/build/unionParser.js +7 -2
  148. package/build/unionParser.test-d.d.ts +1 -0
  149. package/build/unionParser.test-d.js +72 -0
  150. package/build/unionParser.test.js +10 -11
  151. package/build/zig.d.ts +280 -0
  152. package/build/zig.js +2 -0
  153. package/build/zigParser.d.ts +3 -0
  154. package/build/zigParser.js +1119 -0
  155. package/build/zigParser.test.d.ts +1 -0
  156. package/build/zigParser.test.js +1590 -0
  157. package/build/zigUnparser.d.ts +2 -0
  158. package/build/zigUnparser.js +460 -0
  159. package/build/zigUnparser.test.d.ts +1 -0
  160. package/build/zigUnparser.test.js +24 -0
  161. package/build/zipParser.js +19 -32
  162. package/build/zipUnparser.js +19 -7
  163. package/build/zipUnparser.test.js +1 -1
  164. package/node_modules-@types/s-expression/index.d.ts +5 -0
  165. package/package.json +25 -6
  166. package/src/androidPackageParser.ts +33 -60
  167. package/src/arbitraryDalvikBytecode.ts +39 -31
  168. package/src/arbitraryDalvikExecutable.ts +65 -20
  169. package/src/arbitraryJava.ts +804 -0
  170. package/src/arbitraryJavaScript.ts +410 -0
  171. package/src/arbitraryZig.ts +380 -0
  172. package/src/arrayParser.ts +1 -3
  173. package/src/backsmali.ts +35 -4
  174. package/src/bash.ts +127 -0
  175. package/src/bashParser.test.ts +590 -0
  176. package/src/bashParser.ts +498 -0
  177. package/src/dalvikBytecodeParser/addressConversion.ts +496 -0
  178. package/src/dalvikBytecodeParser/formatParsers.ts +19 -29
  179. package/src/dalvikBytecodeParser.test-d.ts +310 -0
  180. package/src/dalvikBytecodeParser.ts +194 -69
  181. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +27 -26
  182. package/src/dalvikBytecodeUnparser.test.ts +7 -7
  183. package/src/dalvikBytecodeUnparser.ts +31 -30
  184. package/src/dalvikExecutable.test-d.ts +132 -0
  185. package/src/dalvikExecutable.ts +3 -3
  186. package/src/dalvikExecutableParser/typedNumbers.ts +11 -0
  187. package/src/dalvikExecutableParser.test.ts +37 -3
  188. package/src/dalvikExecutableParser.test.ts.md +163 -2
  189. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  190. package/src/dalvikExecutableParser.ts +121 -139
  191. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +4 -0
  192. package/src/dalvikExecutableUnparser/poolScanners.ts +6 -6
  193. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +38 -14
  194. package/src/dalvikExecutableUnparser.test.ts +3 -2
  195. package/src/dalvikExecutableUnparser.ts +4 -4
  196. package/src/disjunctionParser.test-d.ts +105 -0
  197. package/src/disjunctionParser.ts +18 -15
  198. package/src/elementSwitchParser.test-d.ts +74 -0
  199. package/src/elementSwitchParser.ts +51 -0
  200. package/src/exactSequenceParser.test-d.ts +43 -0
  201. package/src/exactSequenceParser.ts +13 -8
  202. package/src/fetchCid.ts +2 -76
  203. package/src/index.test.ts +22 -1
  204. package/src/index.ts +119 -2
  205. package/src/inputReader.ts +53 -0
  206. package/src/java.ts +708 -0
  207. package/src/javaKeyStoreParser.ts +18 -32
  208. package/src/javaParser.test.ts +1592 -0
  209. package/src/javaParser.ts +2640 -0
  210. package/src/javaScript.ts +36 -0
  211. package/src/javaScriptParser.ts +57 -0
  212. package/src/javaScriptUnparser.test.ts +37 -0
  213. package/src/javaScriptUnparser.ts +7 -0
  214. package/src/javaUnparser.test.ts +37 -0
  215. package/src/javaUnparser.ts +640 -0
  216. package/src/jsonParser.ts +6 -27
  217. package/src/lookaheadParser.ts +2 -6
  218. package/src/negativeLookaheadParser.ts +1 -3
  219. package/src/nonEmptyArrayParser.ts +1 -3
  220. package/src/objectParser.test-d.ts +152 -0
  221. package/src/objectParser.test.ts +71 -0
  222. package/src/objectParser.ts +69 -0
  223. package/src/optionalParser.ts +1 -3
  224. package/src/parser.test.ts +151 -4
  225. package/src/parser.ts +11 -1
  226. package/src/parserConsumedSequenceParser.ts +2 -4
  227. package/src/parserContext.ts +26 -11
  228. package/src/parserError.ts +17 -3
  229. package/src/regexpParser.test.ts +264 -0
  230. package/src/regexpParser.ts +126 -0
  231. package/src/regularExpression.ts +24 -0
  232. package/src/regularExpressionParser.test.ts +102 -0
  233. package/src/regularExpressionParser.ts +920 -0
  234. package/src/separatedArrayParser.ts +1 -3
  235. package/src/separatedNonEmptyArrayParser.ts +1 -3
  236. package/src/sliceBoundedParser.test.ts +2 -2
  237. package/src/sliceBoundedParser.ts +15 -19
  238. package/src/smaliParser.test.ts +64 -0
  239. package/src/smaliParser.test.ts.md +12 -12
  240. package/src/smaliParser.test.ts.snap +0 -0
  241. package/src/smaliParser.ts +246 -534
  242. package/src/stringEscapes.ts +253 -0
  243. package/src/symbolicExpression.ts +17 -0
  244. package/src/symbolicExpressionParser.test.ts +466 -0
  245. package/src/symbolicExpressionParser.ts +190 -0
  246. package/src/terminatedArrayParser.test.ts +9 -6
  247. package/src/terminatedArrayParser.ts +25 -29
  248. package/src/tupleParser.ts +21 -18
  249. package/src/unionParser.test-d.ts +105 -0
  250. package/src/unionParser.test.ts +18 -17
  251. package/src/unionParser.ts +28 -16
  252. package/src/zig.ts +411 -0
  253. package/src/zigParser.test.ts +1693 -0
  254. package/src/zigParser.ts +1745 -0
  255. package/src/zigUnparser.test.ts +37 -0
  256. package/src/zigUnparser.ts +615 -0
  257. package/src/zipParser.ts +20 -56
  258. package/src/zipUnparser.test.ts +1 -1
  259. package/src/zipUnparser.ts +22 -7
  260. package/tsconfig.json +2 -2
  261. package/build/exactElementSwitchParser.d.ts +0 -3
  262. package/src/exactElementSwitchParser.ts +0 -41
@@ -0,0 +1,35 @@
1
+ import type * as estree from 'estree';
2
+ import { type StripMeta } from './javascriptParser.js';
3
+ export type JavaScriptProgram = StripMeta<estree.Program>;
4
+ export type JavaScriptStatement = StripMeta<estree.Statement>;
5
+ export type JavaScriptExpression = StripMeta<estree.Expression>;
6
+ export type JavaScriptIdentifier = StripMeta<estree.Identifier>;
7
+ export type JavaScriptLiteral = StripMeta<estree.Literal>;
8
+ export type JavaScriptBlockStatement = StripMeta<estree.BlockStatement>;
9
+ export type JavaScriptExpressionStatement = StripMeta<estree.ExpressionStatement>;
10
+ export type JavaScriptVariableDeclaration = StripMeta<estree.VariableDeclaration>;
11
+ export type JavaScriptVariableDeclarator = StripMeta<estree.VariableDeclarator>;
12
+ export type JavaScriptIfStatement = StripMeta<estree.IfStatement>;
13
+ export type JavaScriptWhileStatement = StripMeta<estree.WhileStatement>;
14
+ export type JavaScriptForStatement = StripMeta<estree.ForStatement>;
15
+ export type JavaScriptReturnStatement = StripMeta<estree.ReturnStatement>;
16
+ export type JavaScriptThrowStatement = StripMeta<estree.ThrowStatement>;
17
+ export type JavaScriptTryStatement = StripMeta<estree.TryStatement>;
18
+ export type JavaScriptCatchClause = StripMeta<estree.CatchClause>;
19
+ export type JavaScriptEmptyStatement = StripMeta<estree.EmptyStatement>;
20
+ export type JavaScriptFunctionDeclaration = StripMeta<estree.FunctionDeclaration>;
21
+ export type JavaScriptFunctionExpression = StripMeta<estree.FunctionExpression>;
22
+ export type JavaScriptArrowFunctionExpression = StripMeta<estree.ArrowFunctionExpression>;
23
+ export type JavaScriptBinaryExpression = StripMeta<estree.BinaryExpression>;
24
+ export type JavaScriptLogicalExpression = StripMeta<estree.LogicalExpression>;
25
+ export type JavaScriptUnaryExpression = StripMeta<estree.UnaryExpression>;
26
+ export type JavaScriptUpdateExpression = StripMeta<estree.UpdateExpression>;
27
+ export type JavaScriptAssignmentExpression = StripMeta<estree.AssignmentExpression>;
28
+ export type JavaScriptConditionalExpression = StripMeta<estree.ConditionalExpression>;
29
+ export type JavaScriptCallExpression = StripMeta<estree.SimpleCallExpression>;
30
+ export type JavaScriptNewExpression = StripMeta<estree.NewExpression>;
31
+ export type JavaScriptMemberExpression = StripMeta<estree.MemberExpression>;
32
+ export type JavaScriptArrayExpression = StripMeta<estree.ArrayExpression>;
33
+ export type JavaScriptObjectExpression = StripMeta<estree.ObjectExpression>;
34
+ export type JavaScriptProperty = StripMeta<estree.Property>;
35
+ export type JavaScriptThisExpression = StripMeta<estree.ThisExpression>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import type * as estree from 'estree';
2
+ import { type Parser } from './parser.js';
3
+ type PositionalFields = 'loc' | 'range' | 'start' | 'end' | 'leadingComments' | 'trailingComments' | 'comments' | 'innerComments';
4
+ export type StripMeta<T> = T extends Array<infer U> ? Array<StripMeta<U>> : T extends object ? {
5
+ [K in Exclude<keyof T, PositionalFields>]: StripMeta<T[K]>;
6
+ } : T;
7
+ export type JavaScriptProgram = StripMeta<estree.Program>;
8
+ export declare const javascriptProgramParser: Parser<JavaScriptProgram, string>;
9
+ export {};
@@ -0,0 +1,34 @@
1
+ import * as acorn from 'acorn';
2
+ import { promiseCompose } from './promiseCompose.js';
3
+ import { createRegExpParser } from './regexpParser.js';
4
+ function stripMeta(node) {
5
+ if (node === null || node === undefined) {
6
+ return node;
7
+ }
8
+ if (typeof node !== 'object') {
9
+ return node;
10
+ }
11
+ if (Array.isArray(node)) {
12
+ return node.map(element => stripMeta(element));
13
+ }
14
+ const result = {};
15
+ for (const [key, value] of Object.entries(node)) {
16
+ if (key === 'loc'
17
+ || key === 'range'
18
+ || key === 'start'
19
+ || key === 'end'
20
+ || key === 'raw'
21
+ || key === 'leadingComments'
22
+ || key === 'trailingComments'
23
+ || key === 'comments'
24
+ || key === 'innerComments') {
25
+ continue;
26
+ }
27
+ result[key] = stripMeta(value);
28
+ }
29
+ return result;
30
+ }
31
+ export const javascriptProgramParser = promiseCompose(createRegExpParser(/[\s\S]*/), match => {
32
+ const ast = acorn.parse(match[0], { ecmaVersion: 'latest', sourceType: 'script' });
33
+ return stripMeta(ast);
34
+ });
@@ -0,0 +1,3 @@
1
+ import { type Unparser } from './unparser.js';
2
+ import { type JavaScriptProgram } from './javascriptParser.js';
3
+ export declare const javascriptProgramUnparser: Unparser<JavaScriptProgram, string>;
@@ -0,0 +1,4 @@
1
+ import { generate } from 'astring';
2
+ export const javascriptProgramUnparser = async function* (program) {
3
+ yield generate(program);
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ import { testProp } from '@fast-check/ava';
2
+ import { arbitraryJavascriptProgram } from './arbitraryJavascript.js';
3
+ import { javascriptProgramUnparser } from './javascriptUnparser.js';
4
+ import { javascriptProgramParser } from './javascriptParser.js';
5
+ import { runParser } from './parser.js';
6
+ import { runUnparser } from './unparser.js';
7
+ import { stringParserInputCompanion } from './parserInputCompanion.js';
8
+ import { stringUnparserOutputCompanion } from './unparserOutputCompanion.js';
9
+ const seed = process.env.SEED ? Number(process.env.SEED) : undefined;
10
+ async function collectString(asyncIterable) {
11
+ let result = '';
12
+ for await (const chunk of asyncIterable) {
13
+ result += chunk;
14
+ }
15
+ return result;
16
+ }
17
+ testProp('javascript roundtrip', [arbitraryJavascriptProgram], async (t, program) => {
18
+ const source = await collectString(runUnparser(javascriptProgramUnparser, program, stringUnparserOutputCompanion));
19
+ const reparsed = await runParser(javascriptProgramParser, source, stringParserInputCompanion);
20
+ t.deepEqual(reparsed, program);
21
+ }, {
22
+ verbose: true,
23
+ seed,
24
+ });
@@ -11,6 +11,7 @@ import { createParserAccessorParser } from './parserAccessorParser.js';
11
11
  import { createElementParser } from './elementParser.js';
12
12
  import { parserCreatorCompose } from './parserCreatorCompose.js';
13
13
  import { createSeparatedArrayParser } from './separatedArrayParser.js';
14
+ import { createRegExpParser } from './regexpParser.js';
14
15
  const whitespaceParser = createArrayParser(createUnionParser([
15
16
  createExactSequenceParser(' '),
16
17
  createExactSequenceParser('\t'),
@@ -52,18 +53,7 @@ export const jsonStringParser = promiseCompose(createTupleParser([
52
53
  createExactSequenceParser('"'),
53
54
  promiseCompose(createTerminatedArrayParser(jsonStringCharacterParser, createExactSequenceParser('"')), ([characters]) => characters.join('')),
54
55
  ]), ([, string]) => string);
55
- export const jsonNumberParser = parserCreatorCompose(() => createArrayParser(parserCreatorCompose(() => elementParser, character => async (parserContext) => {
56
- parserContext.invariant((character === '-'
57
- || (character >= '0' && character <= '9')
58
- || character === '.'
59
- || character === 'e'
60
- || character === 'E'
61
- || character === '+'), 'Expected "-", "0" to "9", ".", "e", "E", "+", got "%s"', character);
62
- return character;
63
- })()), characters => async (parserContext) => {
64
- parserContext.invariant(characters.length > 0, 'Expected at least one character');
65
- return Number(characters.join(''));
66
- })();
56
+ export const jsonNumberParser = promiseCompose(createRegExpParser(/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/), match => Number(match[0]));
67
57
  const jsonTrueParser = promiseCompose(createExactSequenceParser('true'), () => true);
68
58
  setParserName(jsonTrueParser, 'jsonTrueParser');
69
59
  const jsonFalseParser = promiseCompose(createExactSequenceParser('false'), () => false);
@@ -14,6 +14,7 @@ export declare function createLazyMessageErrorClass(BaseError: typeof NoStackCap
14
14
  stack?: string;
15
15
  cause?: unknown;
16
16
  };
17
+ isError(error: unknown): error is Error;
17
18
  captureStackTrace(targetObject: object, constructorOpt?: Function): void;
18
19
  prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
19
20
  stackTraceLimit: number;
@@ -27,6 +28,7 @@ export declare const NormalLazyMessageError: {
27
28
  stack?: string;
28
29
  cause?: unknown;
29
30
  };
31
+ isError(error: unknown): error is Error;
30
32
  captureStackTrace(targetObject: object, constructorOpt?: Function): void;
31
33
  prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
32
34
  stackTraceLimit: number;
@@ -40,6 +42,7 @@ export declare const NoStackCaptureOverheadLazyMessageError: {
40
42
  stack?: string;
41
43
  cause?: unknown;
42
44
  };
45
+ isError(error: unknown): error is Error;
43
46
  captureStackTrace(targetObject: object, constructorOpt?: Function): void;
44
47
  prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
45
48
  stackTraceLimit: number;
@@ -1,12 +1,69 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
1
53
  import { getParserName, setParserName } from './parser.js';
2
54
  export const createLookaheadParser = (childParser) => {
3
55
  const lookaheadParser = async (parserContext) => {
4
- const childParserContext = parserContext.lookahead();
56
+ const env_1 = { stack: [], error: void 0, hasError: false };
5
57
  try {
6
- return await childParser(childParserContext);
58
+ const childParserContext = __addDisposableResource(env_1, parserContext.lookahead(), false);
59
+ return childParser(childParserContext);
60
+ }
61
+ catch (e_1) {
62
+ env_1.error = e_1;
63
+ env_1.hasError = true;
7
64
  }
8
65
  finally {
9
- childParserContext.dispose();
66
+ __disposeResources(env_1);
10
67
  }
11
68
  };
12
69
  setParserName(lookaheadParser, `(?=${getParserName(childParser)})`);
@@ -1,23 +1,82 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
1
53
  import { getParserName, setParserName } from './parser.js';
2
54
  import { isParserParsingFailedError } from './parserError.js';
3
55
  export const createNegativeLookaheadParser = (childParser) => {
4
56
  const negativeLookaheadParser = async (parserContext) => {
5
- const childParserContext = parserContext.lookahead();
6
- let childParserSuccess;
57
+ const env_1 = { stack: [], error: void 0, hasError: false };
7
58
  try {
8
- await childParser(childParserContext);
9
- childParserSuccess = true;
10
- }
11
- catch (error) {
12
- if (!isParserParsingFailedError(error)) {
13
- throw error;
59
+ const childParserContext = __addDisposableResource(env_1, parserContext.lookahead(), false);
60
+ let childParserSuccess;
61
+ try {
62
+ await childParser(childParserContext);
63
+ childParserSuccess = true;
14
64
  }
15
- childParserSuccess = false;
65
+ catch (error) {
66
+ if (!isParserParsingFailedError(error)) {
67
+ throw error;
68
+ }
69
+ childParserSuccess = false;
70
+ }
71
+ parserContext.invariant(!childParserSuccess, 'Negative lookahead assertion failed for child parser %s.', getParserName(childParser));
72
+ }
73
+ catch (e_1) {
74
+ env_1.error = e_1;
75
+ env_1.hasError = true;
16
76
  }
17
77
  finally {
18
- childParserContext.dispose();
78
+ __disposeResources(env_1);
19
79
  }
20
- parserContext.invariant(!childParserSuccess, 'Negative lookahead assertion failed for child parser %s.', getParserName(childParser));
21
80
  };
22
81
  setParserName(negativeLookaheadParser, `(?!${getParserName(childParser)})`);
23
82
  return negativeLookaheadParser;
@@ -1,27 +1,86 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
1
53
  import { getParserName, setParserName } from './parser.js';
2
54
  import { isParserParsingFailedError } from './parserError.js';
3
55
  export const createNonEmptyArrayParser = (elementParser) => {
4
56
  const nonEmptyArrayParser = async (parserContext) => {
5
57
  const elements = [];
6
58
  while (true) {
7
- const elementParserContext = parserContext.lookahead();
8
- const initialPosition = elementParserContext.position;
59
+ const env_1 = { stack: [], error: void 0, hasError: false };
9
60
  try {
10
- const element = await elementParser(elementParserContext);
11
- if (elementParserContext.position === initialPosition) {
12
- break;
61
+ const elementParserContext = __addDisposableResource(env_1, parserContext.lookahead(), false);
62
+ const initialPosition = elementParserContext.position;
63
+ try {
64
+ const element = await elementParser(elementParserContext);
65
+ if (elementParserContext.position === initialPosition) {
66
+ break;
67
+ }
68
+ elements.push(element);
69
+ elementParserContext.unlookahead();
13
70
  }
14
- elements.push(element);
15
- elementParserContext.unlookahead();
16
- }
17
- catch (error) {
18
- if (isParserParsingFailedError(error)) {
19
- break;
71
+ catch (error) {
72
+ if (isParserParsingFailedError(error)) {
73
+ break;
74
+ }
75
+ throw error;
20
76
  }
21
- throw error;
77
+ }
78
+ catch (e_1) {
79
+ env_1.error = e_1;
80
+ env_1.hasError = true;
22
81
  }
23
82
  finally {
24
- elementParserContext.dispose();
83
+ __disposeResources(env_1);
25
84
  }
26
85
  }
27
86
  parserContext.invariant(elements.length > 0, 'Expected elementParser (%s) to match at least once', getParserName(elementParser, 'anonymousNonEmptyArrayChild'));
@@ -0,0 +1,12 @@
1
+ import { type Parser, type ParserOutput, type ParserSequence } from './parser.js';
2
+ type ExtractParsers<T> = T[keyof T] & Parser<any, any, any>;
3
+ type InferSequenceFromParsers<T> = ParserSequence<ExtractParsers<T>>;
4
+ type ExtractOutputOrLiteral<P> = P extends Parser<any, any, any> ? ParserOutput<P> : P;
5
+ type OmitUnderscoreKeys<T> = {
6
+ [K in keyof T as K extends `_${string}` ? never : K]: T[K];
7
+ };
8
+ type ObjectParserOutput<Parsers extends Record<string, unknown>> = OmitUnderscoreKeys<{
9
+ [K in keyof Parsers]: ExtractOutputOrLiteral<Parsers[K]>;
10
+ }>;
11
+ export declare function createObjectParser<const Parsers extends Record<string, Parser<any, any, any> | unknown>>(parsers: Parsers): Parser<ObjectParserOutput<Parsers>, InferSequenceFromParsers<Parsers>>;
12
+ export {};
@@ -0,0 +1,31 @@
1
+ import { getParserName, setParserName } from './parser.js';
2
+ export function createObjectParser(parsers) {
3
+ const objectParser = async (parserContext) => {
4
+ const result = {};
5
+ for (const [key, parserOrLiteral] of Object.entries(parsers)) {
6
+ let value;
7
+ if (typeof parserOrLiteral === 'function') {
8
+ // It's a parser - execute it
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ value = await parserOrLiteral(parserContext);
11
+ }
12
+ else {
13
+ // It's a literal - use directly
14
+ value = parserOrLiteral;
15
+ }
16
+ if (!key.startsWith('_')) {
17
+ result[key] = value;
18
+ }
19
+ }
20
+ return result;
21
+ };
22
+ setParserName(objectParser, '{' + Object.keys(parsers).map(k => {
23
+ const v = parsers[k];
24
+ if (typeof v === 'function') {
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ return k.startsWith('_') ? k : getParserName(v, k);
27
+ }
28
+ return `${k}: ${JSON.stringify(v)}`;
29
+ }).join(', ') + '}');
30
+ return objectParser;
31
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ import { expectAssignable, expectNotAssignable, expectType } from 'tsd';
2
+ import { createObjectParser } from './objectParser.js';
3
+ import { createExactSequenceParser } from './exactSequenceParser.js';
4
+ import { createFixedLengthSequenceParser } from './fixedLengthSequenceParser.js';
5
+ // Test: parsers only - extracts output types
6
+ {
7
+ const parser = createObjectParser({
8
+ first: createFixedLengthSequenceParser(3),
9
+ second: createFixedLengthSequenceParser(3),
10
+ });
11
+ // Output should be assignable to and from expected type
12
+ expectAssignable(null);
13
+ expectAssignable(null);
14
+ }
15
+ // Test: literal types are preserved
16
+ {
17
+ const parser = createObjectParser({
18
+ type: 'block',
19
+ name: createFixedLengthSequenceParser(3),
20
+ });
21
+ // 'block' literal should be preserved
22
+ expectAssignable(null);
23
+ expectType(null);
24
+ }
25
+ // Test: underscore keys excluded from result type
26
+ {
27
+ const parser = createObjectParser({
28
+ first: createFixedLengthSequenceParser(3),
29
+ _sep: createExactSequenceParser(':'),
30
+ second: createFixedLengthSequenceParser(3),
31
+ });
32
+ // Should have first and second but not _sep
33
+ expectAssignable(null);
34
+ // _sep should NOT be a key in Output
35
+ expectNotAssignable(null);
36
+ }
37
+ // Test: mixed literals and parsers with underscore keys
38
+ {
39
+ const parser = createObjectParser({
40
+ type: 'assignment',
41
+ _open: createExactSequenceParser('('),
42
+ name: createFixedLengthSequenceParser(1),
43
+ _eq: createExactSequenceParser('='),
44
+ value: createFixedLengthSequenceParser(1),
45
+ _close: createExactSequenceParser(')'),
46
+ });
47
+ expectAssignable(null);
48
+ expectType(null);
49
+ // Underscore keys should not exist
50
+ expectNotAssignable(null);
51
+ expectNotAssignable(null);
52
+ expectNotAssignable(null);
53
+ }
54
+ // Test: number literal
55
+ {
56
+ const parser = createObjectParser({
57
+ code: 42,
58
+ data: createFixedLengthSequenceParser(2),
59
+ });
60
+ expectAssignable(null);
61
+ expectType(null);
62
+ }
63
+ // Test: all underscore keys results in empty object
64
+ {
65
+ const parser = createObjectParser({
66
+ _a: createExactSequenceParser('a'),
67
+ _b: createExactSequenceParser('b'),
68
+ });
69
+ // Should be assignable to empty object
70
+ // eslint-disable-next-line @typescript-eslint/ban-types
71
+ expectAssignable(null);
72
+ // Should NOT have _a or _b
73
+ expectNotAssignable(null);
74
+ expectNotAssignable(null);
75
+ }
76
+ // Test: boolean literal
77
+ {
78
+ const parser = createObjectParser({
79
+ enabled: true,
80
+ name: createFixedLengthSequenceParser(3),
81
+ });
82
+ expectAssignable(null);
83
+ expectType(null);
84
+ }
85
+ // Test: null literal
86
+ {
87
+ const parser = createObjectParser({
88
+ value: null,
89
+ name: createFixedLengthSequenceParser(3),
90
+ });
91
+ expectAssignable(null);
92
+ expectType(null);
93
+ }
94
+ // Test: underscore-prefixed parsers still contribute to sequence type inference
95
+ {
96
+ const parser = createObjectParser({
97
+ _prefix: createExactSequenceParser(Buffer.from([0x00])),
98
+ operation: 'nop',
99
+ });
100
+ // Parser should be assignable to Parser<{ operation: 'nop' }, Uint8Array>
101
+ expectAssignable(parser);
102
+ }
103
+ // Test: sequence type inferred from underscore parser when no other parsers present
104
+ {
105
+ const parser = createObjectParser({
106
+ _marker: createExactSequenceParser('test'),
107
+ type: 'marker',
108
+ value: 42,
109
+ });
110
+ // Should infer string sequence from _marker parser
111
+ expectAssignable(parser);
112
+ }
@@ -0,0 +1 @@
1
+ export {};