aontu 0.29.0 → 0.30.2

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 (270) hide show
  1. package/dist/aontu.d.ts +17 -13
  2. package/dist/aontu.js +145 -60
  3. package/dist/aontu.js.map +1 -1
  4. package/dist/ctx.d.ts +51 -0
  5. package/dist/ctx.js +105 -0
  6. package/dist/ctx.js.map +1 -0
  7. package/dist/err.d.ts +12 -0
  8. package/dist/err.js +123 -0
  9. package/dist/err.js.map +1 -0
  10. package/dist/hints.d.ts +8 -0
  11. package/dist/hints.js +84 -0
  12. package/dist/hints.js.map +1 -0
  13. package/dist/lang.d.ts +11 -0
  14. package/dist/lang.js +569 -0
  15. package/dist/lang.js.map +1 -0
  16. package/dist/site.d.ts +12 -0
  17. package/dist/site.js +27 -0
  18. package/dist/site.js.map +1 -0
  19. package/dist/tsconfig.tsbuildinfo +1 -0
  20. package/dist/type.d.ts +32 -0
  21. package/dist/type.js +16 -0
  22. package/dist/type.js.map +1 -0
  23. package/dist/unify.d.ts +14 -0
  24. package/dist/unify.js +156 -0
  25. package/dist/unify.js.map +1 -0
  26. package/dist/utility.d.ts +14 -0
  27. package/dist/utility.js +122 -0
  28. package/dist/utility.js.map +1 -0
  29. package/dist/val/BagVal.d.ts +10 -0
  30. package/dist/val/BagVal.js +15 -0
  31. package/dist/val/BagVal.js.map +1 -0
  32. package/dist/val/BooleanVal.d.ts +9 -0
  33. package/dist/val/BooleanVal.js +16 -0
  34. package/dist/val/BooleanVal.js.map +1 -0
  35. package/dist/val/CloseFuncVal.d.ts +11 -0
  36. package/dist/val/CloseFuncVal.js +32 -0
  37. package/dist/val/CloseFuncVal.js.map +1 -0
  38. package/dist/val/ConjunctVal.d.ts +14 -0
  39. package/dist/val/ConjunctVal.js +187 -0
  40. package/dist/val/ConjunctVal.js.map +1 -0
  41. package/dist/val/CopyFuncVal.d.ts +13 -0
  42. package/dist/val/CopyFuncVal.js +35 -0
  43. package/dist/val/CopyFuncVal.js.map +1 -0
  44. package/dist/val/DisjunctVal.d.ts +19 -0
  45. package/dist/val/DisjunctVal.js +194 -0
  46. package/dist/val/DisjunctVal.js.map +1 -0
  47. package/dist/val/FeatureVal.d.ts +10 -0
  48. package/dist/val/FeatureVal.js +29 -0
  49. package/dist/val/FeatureVal.js.map +1 -0
  50. package/dist/val/FuncBaseVal.d.ts +15 -0
  51. package/dist/val/FuncBaseVal.js +127 -0
  52. package/dist/val/FuncBaseVal.js.map +1 -0
  53. package/dist/val/HideFuncVal.d.ts +12 -0
  54. package/dist/val/HideFuncVal.js +48 -0
  55. package/dist/val/HideFuncVal.js.map +1 -0
  56. package/dist/val/IntegerVal.d.ts +9 -0
  57. package/dist/val/IntegerVal.js +46 -0
  58. package/dist/val/IntegerVal.js.map +1 -0
  59. package/dist/val/JunctionVal.d.ts +12 -0
  60. package/dist/val/JunctionVal.js +31 -0
  61. package/dist/val/JunctionVal.js.map +1 -0
  62. package/dist/val/KeyFuncVal.d.ts +12 -0
  63. package/dist/val/KeyFuncVal.js +34 -0
  64. package/dist/val/KeyFuncVal.js.map +1 -0
  65. package/dist/val/ListVal.d.ts +17 -0
  66. package/dist/val/ListVal.js +186 -0
  67. package/dist/val/ListVal.js.map +1 -0
  68. package/dist/val/LowerFuncVal.d.ts +12 -0
  69. package/dist/val/LowerFuncVal.js +40 -0
  70. package/dist/val/LowerFuncVal.js.map +1 -0
  71. package/dist/val/MapVal.d.ts +16 -0
  72. package/dist/val/MapVal.js +211 -0
  73. package/dist/val/MapVal.js.map +1 -0
  74. package/dist/val/MoveFuncVal.d.ts +11 -0
  75. package/dist/val/MoveFuncVal.js +41 -0
  76. package/dist/val/MoveFuncVal.js.map +1 -0
  77. package/dist/val/NilVal.d.ts +25 -0
  78. package/dist/{lib/val/Nil.js → val/NilVal.js} +38 -30
  79. package/dist/val/NilVal.js.map +1 -0
  80. package/dist/val/NullVal.d.ts +9 -0
  81. package/dist/val/NullVal.js +18 -0
  82. package/dist/val/NullVal.js.map +1 -0
  83. package/dist/val/NumberVal.d.ts +9 -0
  84. package/dist/val/NumberVal.js +44 -0
  85. package/dist/val/NumberVal.js.map +1 -0
  86. package/dist/val/OpBaseVal.d.ts +18 -0
  87. package/dist/val/OpBaseVal.js +152 -0
  88. package/dist/val/OpBaseVal.js.map +1 -0
  89. package/dist/val/OpenFuncVal.d.ts +11 -0
  90. package/dist/val/OpenFuncVal.js +30 -0
  91. package/dist/val/OpenFuncVal.js.map +1 -0
  92. package/dist/val/PathFuncVal.d.ts +13 -0
  93. package/dist/val/PathFuncVal.js +42 -0
  94. package/dist/val/PathFuncVal.js.map +1 -0
  95. package/dist/val/PlusOpVal.d.ts +16 -0
  96. package/dist/val/PlusOpVal.js +59 -0
  97. package/dist/val/PlusOpVal.js.map +1 -0
  98. package/dist/val/PrefFuncVal.d.ts +11 -0
  99. package/dist/val/PrefFuncVal.js +39 -0
  100. package/dist/val/PrefFuncVal.js.map +1 -0
  101. package/dist/val/PrefVal.d.ts +15 -0
  102. package/dist/val/PrefVal.js +104 -0
  103. package/dist/val/PrefVal.js.map +1 -0
  104. package/dist/val/RefVal.d.ts +22 -0
  105. package/dist/val/RefVal.js +276 -0
  106. package/dist/val/RefVal.js.map +1 -0
  107. package/dist/val/ScalarKindVal.d.ts +16 -0
  108. package/dist/val/ScalarKindVal.js +76 -0
  109. package/dist/val/ScalarKindVal.js.map +1 -0
  110. package/dist/val/ScalarVal.d.ts +16 -0
  111. package/dist/val/ScalarVal.js +61 -0
  112. package/dist/val/ScalarVal.js.map +1 -0
  113. package/dist/val/StringVal.d.ts +10 -0
  114. package/dist/val/StringVal.js +19 -0
  115. package/dist/val/StringVal.js.map +1 -0
  116. package/dist/val/SuperFuncVal.d.ts +11 -0
  117. package/dist/val/SuperFuncVal.js +22 -0
  118. package/dist/val/SuperFuncVal.js.map +1 -0
  119. package/dist/val/TopVal.d.ts +16 -0
  120. package/dist/val/TopVal.js +38 -0
  121. package/dist/val/TopVal.js.map +1 -0
  122. package/dist/val/TypeFuncVal.d.ts +12 -0
  123. package/dist/val/TypeFuncVal.js +35 -0
  124. package/dist/val/TypeFuncVal.js.map +1 -0
  125. package/dist/val/UpperFuncVal.d.ts +12 -0
  126. package/dist/val/UpperFuncVal.js +40 -0
  127. package/dist/val/UpperFuncVal.js.map +1 -0
  128. package/dist/val/Val.d.ts +89 -0
  129. package/dist/val/Val.js +186 -0
  130. package/dist/val/Val.js.map +1 -0
  131. package/dist/val/VarVal.d.ts +13 -0
  132. package/dist/val/VarVal.js +109 -0
  133. package/dist/val/VarVal.js.map +1 -0
  134. package/dist/val/top.d.ts +2 -0
  135. package/dist/val/top.js +10 -0
  136. package/dist/val/top.js.map +1 -0
  137. package/dist/val/valutil.d.ts +2 -0
  138. package/dist/val/valutil.js +30 -0
  139. package/dist/val/valutil.js.map +1 -0
  140. package/package.json +20 -38
  141. package/src/aontu.ts +218 -0
  142. package/src/ctx.ts +201 -0
  143. package/src/err.ts +172 -0
  144. package/src/hints.ts +119 -0
  145. package/src/lang.ts +782 -0
  146. package/src/site.ts +34 -0
  147. package/src/tsconfig.json +16 -0
  148. package/src/type.ts +72 -0
  149. package/src/unify.ts +225 -0
  150. package/src/utility.ts +179 -0
  151. package/src/val/BagVal.ts +33 -0
  152. package/src/val/BooleanVal.ts +32 -0
  153. package/src/val/CloseFuncVal.ts +61 -0
  154. package/src/val/ConjunctVal.ts +285 -0
  155. package/src/val/CopyFuncVal.ts +69 -0
  156. package/src/val/DisjunctVal.ts +288 -0
  157. package/src/val/FeatureVal.ts +56 -0
  158. package/src/val/FuncBaseVal.ts +198 -0
  159. package/src/val/HideFuncVal.ts +85 -0
  160. package/src/val/IntegerVal.ts +75 -0
  161. package/src/val/JunctionVal.ts +54 -0
  162. package/src/val/KeyFuncVal.ts +67 -0
  163. package/src/val/ListVal.ts +286 -0
  164. package/src/val/LowerFuncVal.ts +73 -0
  165. package/src/val/MapVal.ts +316 -0
  166. package/src/val/MoveFuncVal.ts +79 -0
  167. package/{lib/val/Nil.ts → src/val/NilVal.ts} +49 -37
  168. package/src/val/NullVal.ts +38 -0
  169. package/src/val/NumberVal.ts +75 -0
  170. package/src/val/OpBaseVal.ts +231 -0
  171. package/src/val/OpenFuncVal.ts +60 -0
  172. package/src/val/PathFuncVal.ts +75 -0
  173. package/src/val/PlusOpVal.ts +92 -0
  174. package/src/val/PrefFuncVal.ts +73 -0
  175. package/src/val/PrefVal.ts +159 -0
  176. package/src/val/RefVal.ts +384 -0
  177. package/src/val/ScalarKindVal.ts +125 -0
  178. package/src/val/ScalarVal.ts +105 -0
  179. package/src/val/StringVal.ts +37 -0
  180. package/src/val/SuperFuncVal.ts +46 -0
  181. package/src/val/TopVal.ts +69 -0
  182. package/src/val/TypeFuncVal.ts +69 -0
  183. package/src/val/UpperFuncVal.ts +72 -0
  184. package/src/val/Val.ts +294 -0
  185. package/src/val/VarVal.ts +171 -0
  186. package/src/val/top.ts +12 -0
  187. package/src/val/valutil.ts +31 -0
  188. package/aontu.ts +0 -92
  189. package/dist/lib/err.d.ts +0 -4
  190. package/dist/lib/err.js +0 -61
  191. package/dist/lib/err.js.map +0 -1
  192. package/dist/lib/lang.d.ts +0 -15
  193. package/dist/lib/lang.js +0 -409
  194. package/dist/lib/lang.js.map +0 -1
  195. package/dist/lib/op/disjunct.d.ts +0 -3
  196. package/dist/lib/op/disjunct.js +0 -28
  197. package/dist/lib/op/disjunct.js.map +0 -1
  198. package/dist/lib/op/op.d.ts +0 -6
  199. package/dist/lib/op/op.js +0 -9
  200. package/dist/lib/op/op.js.map +0 -1
  201. package/dist/lib/op/unite.d.ts +0 -3
  202. package/dist/lib/op/unite.js +0 -100
  203. package/dist/lib/op/unite.js.map +0 -1
  204. package/dist/lib/type.d.ts +0 -49
  205. package/dist/lib/type.js +0 -7
  206. package/dist/lib/type.js.map +0 -1
  207. package/dist/lib/unify.d.ts +0 -38
  208. package/dist/lib/unify.js +0 -67
  209. package/dist/lib/unify.js.map +0 -1
  210. package/dist/lib/utility.d.ts +0 -3
  211. package/dist/lib/utility.js +0 -16
  212. package/dist/lib/utility.js.map +0 -1
  213. package/dist/lib/val/ConjunctVal.d.ts +0 -17
  214. package/dist/lib/val/ConjunctVal.js +0 -171
  215. package/dist/lib/val/ConjunctVal.js.map +0 -1
  216. package/dist/lib/val/DisjunctVal.d.ts +0 -17
  217. package/dist/lib/val/DisjunctVal.js +0 -95
  218. package/dist/lib/val/DisjunctVal.js.map +0 -1
  219. package/dist/lib/val/ListVal.d.ts +0 -18
  220. package/dist/lib/val/ListVal.js +0 -120
  221. package/dist/lib/val/ListVal.js.map +0 -1
  222. package/dist/lib/val/MapVal.d.ts +0 -18
  223. package/dist/lib/val/MapVal.js +0 -117
  224. package/dist/lib/val/MapVal.js.map +0 -1
  225. package/dist/lib/val/Nil.d.ts +0 -22
  226. package/dist/lib/val/Nil.js.map +0 -1
  227. package/dist/lib/val/NullVal.d.ts +0 -15
  228. package/dist/lib/val/NullVal.js +0 -38
  229. package/dist/lib/val/NullVal.js.map +0 -1
  230. package/dist/lib/val/OpVal.d.ts +0 -17
  231. package/dist/lib/val/OpVal.js +0 -89
  232. package/dist/lib/val/OpVal.js.map +0 -1
  233. package/dist/lib/val/PlusVal.d.ts +0 -12
  234. package/dist/lib/val/PlusVal.js +0 -32
  235. package/dist/lib/val/PlusVal.js.map +0 -1
  236. package/dist/lib/val/PrefVal.d.ts +0 -17
  237. package/dist/lib/val/PrefVal.js +0 -87
  238. package/dist/lib/val/PrefVal.js.map +0 -1
  239. package/dist/lib/val/RefVal.d.ts +0 -22
  240. package/dist/lib/val/RefVal.js +0 -247
  241. package/dist/lib/val/RefVal.js.map +0 -1
  242. package/dist/lib/val/ValBase.d.ts +0 -26
  243. package/dist/lib/val/ValBase.js +0 -77
  244. package/dist/lib/val/ValBase.js.map +0 -1
  245. package/dist/lib/val/VarVal.d.ts +0 -15
  246. package/dist/lib/val/VarVal.js +0 -84
  247. package/dist/lib/val/VarVal.js.map +0 -1
  248. package/dist/lib/val.d.ts +0 -81
  249. package/dist/lib/val.js +0 -191
  250. package/dist/lib/val.js.map +0 -1
  251. package/lib/err.ts +0 -83
  252. package/lib/lang.ts +0 -585
  253. package/lib/op/disjunct.ts +0 -51
  254. package/lib/op/op.ts +0 -18
  255. package/lib/op/unite.ts +0 -143
  256. package/lib/type.ts +0 -95
  257. package/lib/unify.ts +0 -128
  258. package/lib/utility.ts +0 -24
  259. package/lib/val/ConjunctVal.ts +0 -265
  260. package/lib/val/DisjunctVal.ts +0 -160
  261. package/lib/val/ListVal.ts +0 -196
  262. package/lib/val/MapVal.ts +0 -181
  263. package/lib/val/NullVal.ts +0 -72
  264. package/lib/val/OpVal.ts +0 -159
  265. package/lib/val/PlusVal.ts +0 -76
  266. package/lib/val/PrefVal.ts +0 -154
  267. package/lib/val/RefVal.ts +0 -362
  268. package/lib/val/ValBase.ts +0 -109
  269. package/lib/val/VarVal.ts +0 -157
  270. package/lib/val.ts +0 -327
package/src/lang.ts ADDED
@@ -0,0 +1,782 @@
1
+ /* Copyright (c) 2021-2025 Richard Rodger, MIT License */
2
+
3
+
4
+ // import { performance } from 'node:perf_hooks'
5
+
6
+ import {
7
+ Jsonic,
8
+ Plugin,
9
+ Rule,
10
+ RuleSpec,
11
+ Context as JsonicContext,
12
+ JsonicError,
13
+ } from 'jsonic'
14
+
15
+
16
+ import { Debug } from 'jsonic/debug'
17
+
18
+ import {
19
+ MultiSource
20
+ } from '@jsonic/multisource'
21
+
22
+ import {
23
+ makeFileResolver
24
+ } from '@jsonic/multisource/resolver/file'
25
+
26
+ import {
27
+ makePkgResolver
28
+ } from '@jsonic/multisource/resolver/pkg'
29
+
30
+ import {
31
+ makeMemResolver
32
+ } from '@jsonic/multisource/resolver/mem'
33
+
34
+ import {
35
+ Expr,
36
+ Op,
37
+ } from '@jsonic/expr'
38
+
39
+ import {
40
+ Path
41
+ } from '@jsonic/path'
42
+
43
+ import type {
44
+ Val,
45
+ AontuOptions,
46
+ } from './type'
47
+
48
+ import {
49
+ SPREAD,
50
+ DEFAULT_OPTS,
51
+ } from './type'
52
+
53
+ import {
54
+ Site
55
+ } from './site'
56
+
57
+ import {
58
+ top
59
+ } from './val/top'
60
+
61
+
62
+
63
+ import { ScalarKindVal, Integer } from './val/ScalarKindVal'
64
+
65
+
66
+ import { BooleanVal } from './val/BooleanVal'
67
+ import { ConjunctVal } from './val/ConjunctVal'
68
+ import { DisjunctVal } from './val/DisjunctVal'
69
+ import { IntegerVal } from './val/IntegerVal'
70
+ import { ListVal } from './val/ListVal'
71
+ import { MapVal } from './val/MapVal'
72
+ import { NilVal } from './val/NilVal'
73
+ import { NullVal } from './val/NullVal'
74
+ import { NumberVal } from './val/NumberVal'
75
+ import { PrefVal } from './val/PrefVal'
76
+ import { RefVal } from './val/RefVal'
77
+ import { StringVal } from './val/StringVal'
78
+ import { VarVal } from './val/VarVal'
79
+ import { PlusOpVal } from './val/PlusOpVal'
80
+ import { UpperFuncVal } from './val/UpperFuncVal'
81
+ import { LowerFuncVal } from './val/LowerFuncVal'
82
+ import { CopyFuncVal } from './val/CopyFuncVal'
83
+ import { KeyFuncVal } from './val/KeyFuncVal'
84
+ import { TypeFuncVal } from './val/TypeFuncVal'
85
+ import { HideFuncVal } from './val/HideFuncVal'
86
+ import { MoveFuncVal } from './val/MoveFuncVal'
87
+ import { PathFuncVal } from './val/PathFuncVal'
88
+ import { PrefFuncVal } from './val/PrefFuncVal'
89
+ import { CloseFuncVal } from './val/CloseFuncVal'
90
+ import { OpenFuncVal } from './val/OpenFuncVal'
91
+ import { SuperFuncVal } from './val/SuperFuncVal'
92
+
93
+
94
+ let AontuJsonic: Plugin = function AontuLang(jsonic: Jsonic) {
95
+
96
+ jsonic.use(Path)
97
+
98
+ // TODO: refactor Val constructor
99
+ // let addsite = (v: Val, p: string[]) => (v.path = [...(p || [])], v)
100
+ let addsite = (v: Val, r: Rule, ctx: JsonicContext) => {
101
+
102
+ v.site.row = null == r.o0 ? -1 : r.o0.rI
103
+ v.site.col = null == r.o0 ? -1 : r.o0.cI
104
+ v.site.url = ctx.meta.multisource ? ctx.meta.multisource.path : ''
105
+ v.path = r.k ? [...(r.k.path || [])] : []
106
+
107
+ return v
108
+ }
109
+
110
+
111
+ jsonic.options({
112
+ hint: {
113
+ unknown: `
114
+ Since the error is unknown, this is probably a bug. Please consider
115
+ posting a github issue - thanks!
116
+
117
+ Code: {code}, Details:
118
+ {details}`,
119
+
120
+ unexpected: `
121
+ The character(s) {src} were not expected at this point as they do not
122
+ match the expected syntax. Use the # character to comment out lines to
123
+ help isolate the syntax error.`,
124
+
125
+ },
126
+ errmsg: {
127
+ name: 'aontu',
128
+ suffix: false,
129
+ },
130
+ fixed: {
131
+ token: {
132
+ '#QM': '?'
133
+ },
134
+ },
135
+ value: {
136
+ def: {
137
+ // NOTE: specify with functions as jsonic/deep will
138
+ // remove class prototype as options are assumed plain
139
+ // (except for functions).
140
+ // TODO: jsonic should be able to pass context into these
141
+ 'string': {
142
+ val: (r: Rule, ctx: JsonicContext) =>
143
+ addsite(new ScalarKindVal({ peg: String }), r, ctx)
144
+ },
145
+ 'number': {
146
+ val: (r: Rule, ctx: JsonicContext) =>
147
+ addsite(new ScalarKindVal({ peg: Number }), r, ctx)
148
+ },
149
+ 'integer': {
150
+ val: (r: Rule, ctx: JsonicContext) =>
151
+ addsite(new ScalarKindVal({ peg: Integer }), r, ctx)
152
+ },
153
+ 'boolean': {
154
+ val: (r: Rule, ctx: JsonicContext) =>
155
+ addsite(new ScalarKindVal({ peg: Boolean }), r, ctx)
156
+ },
157
+ 'nil': {
158
+ val: (r: Rule, ctx: JsonicContext) =>
159
+ addsite(new NilVal({ why: 'literal_nil' }), r, ctx)
160
+ },
161
+
162
+ // TODO: FIX: need a TOP instance to hold path
163
+ 'top': { val: () => top() },
164
+ }
165
+ },
166
+
167
+ map: {
168
+ merge: (prev: any, curr: any, _r: Rule, ctx: JsonicContext) => {
169
+ let pval = (prev as Val)
170
+ let cval = (curr as Val)
171
+
172
+ if (pval?.isVal && cval?.isVal) {
173
+
174
+ // TODO: test multi element conjuncts work
175
+ if (pval.isConjunct && cval.isConjunct) {
176
+ (pval as ConjunctVal).append(cval)
177
+ return pval
178
+ }
179
+ else if (pval.isConjunct) {
180
+ (pval as ConjunctVal).append(cval)
181
+ return pval
182
+ }
183
+ else {
184
+ return addsite(new ConjunctVal({ peg: [pval, cval] }), prev, ctx)
185
+ }
186
+ }
187
+
188
+ // Handle defered conjuncts, where MapVal does not yet
189
+ // exist, by creating ConjunctVal later.
190
+ else {
191
+ prev.___merge = (prev.___merge || [])
192
+ prev.___merge.push(curr)
193
+ return prev
194
+ }
195
+ }
196
+ }
197
+ })
198
+
199
+
200
+ const funcMap: Record<string, any> = {
201
+ upper: UpperFuncVal,
202
+ lower: LowerFuncVal,
203
+ copy: CopyFuncVal,
204
+ key: KeyFuncVal,
205
+ type: TypeFuncVal,
206
+ hide: HideFuncVal,
207
+ move: MoveFuncVal,
208
+ path: PathFuncVal,
209
+ pref: PrefFuncVal,
210
+ close: CloseFuncVal,
211
+ open: OpenFuncVal,
212
+ super: SuperFuncVal,
213
+ }
214
+
215
+
216
+ let opmap: any = {
217
+ 'conjunct-infix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) =>
218
+ addsite(new ConjunctVal({ peg: terms }), r, ctx),
219
+
220
+ 'disjunct-infix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) =>
221
+ addsite(new DisjunctVal({ peg: terms }), r, ctx),
222
+
223
+ 'dot-prefix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) => {
224
+ return addsite(new RefVal({ peg: terms, prefix: true }), r, ctx)
225
+ },
226
+
227
+ 'dot-infix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) => {
228
+ // // console.log('DOT-INFIX-OP', terms)
229
+ return addsite(new RefVal({ peg: terms }), r, ctx)
230
+ },
231
+
232
+ 'star-prefix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) =>
233
+ addsite(new PrefVal({ peg: terms[0] }), r, ctx),
234
+
235
+ 'dollar-prefix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) => {
236
+ // $.a.b absolute path
237
+ if (terms[0] instanceof RefVal) {
238
+ terms[0].absolute = true
239
+ return terms[0]
240
+ }
241
+ return addsite(new VarVal({ peg: terms[0] }), r, ctx)
242
+ },
243
+
244
+ 'plus-infix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) => {
245
+ return addsite(new PlusOpVal({ peg: [terms[0], terms[1]] }), r, ctx)
246
+ },
247
+
248
+ 'negative-prefix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) => {
249
+ let val = terms[0]
250
+ val.peg = -1 * val.peg
251
+ return addsite(val, r, ctx)
252
+ },
253
+
254
+ 'positive-prefix': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) => {
255
+ let val = terms[0]
256
+ return addsite(val, r, ctx)
257
+ },
258
+
259
+ 'func-paren': (r: Rule, ctx: JsonicContext, _op: Op, terms: any) => {
260
+ let val = terms[1]
261
+ const fname = terms[0]
262
+ if ('' !== fname) {
263
+ const funcval = funcMap[fname]
264
+ const args = terms.slice(1)
265
+ val = null == funcval ?
266
+ new NilVal({ why: 'unknown_function' }) :
267
+ new funcval({
268
+ peg: args
269
+ })
270
+ }
271
+ const out = addsite(val, r, ctx)
272
+ return out
273
+ },
274
+ }
275
+
276
+
277
+ jsonic
278
+ .use(Expr, {
279
+ op: {
280
+ // disjunct < conjunct: c & b | a -> (c & b) | a
281
+ 'conjunct': {
282
+ infix: true, src: '&', left: 16_000_000, right: 17_000_000
283
+ },
284
+
285
+ 'disjunct': {
286
+ infix: true, src: '|', left: 14_000_000, right: 15_000_000
287
+ },
288
+
289
+ 'plus-infix': {
290
+ src: '+',
291
+ infix: true,
292
+ left: 20_000_000,
293
+ right: 21_000_000,
294
+ },
295
+
296
+ 'dollar-prefix': {
297
+ src: '$',
298
+ prefix: true,
299
+ right: 31_000_000,
300
+ },
301
+
302
+ 'dot-infix': {
303
+ src: '.',
304
+ infix: true,
305
+ left: 25_000_000,
306
+ right: 24_000_000,
307
+ },
308
+
309
+ 'dot-prefix': {
310
+ src: '.',
311
+ prefix: true,
312
+ right: 24_000_000,
313
+ },
314
+
315
+ 'star': {
316
+ src: '*',
317
+ prefix: true,
318
+ right: 24_000_000,
319
+ },
320
+
321
+ 'func': {
322
+ paren: true,
323
+ preval: {
324
+ active: true,
325
+ // allow: ['floor'], //Object.keys(funcMap)
326
+ },
327
+ osrc: '(',
328
+ csrc: ')',
329
+ },
330
+
331
+ plain: null,
332
+ addition: null,
333
+ subtraction: null,
334
+ multiplication: null,
335
+ division: null,
336
+ remainder: null,
337
+ },
338
+ evaluate: (r: Rule, ctx: JsonicContext, op: Op, terms: any) => {
339
+ // // console.log('EVAL-START', r.u)
340
+
341
+ if (
342
+ 'func-paren' === op.name
343
+ // && !r.parent.prev?.u?.paren_preval
344
+ && !r.u?.paren_preval
345
+ ) {
346
+ // terms = [new StringVal({ peg: '' }), ...terms]
347
+ terms = ['', ...terms]
348
+ }
349
+
350
+
351
+ let val: Val = opmap[op.name](r, ctx, op, terms)
352
+
353
+ // // console.log('EVAL', terms, '->', val)
354
+
355
+ return val
356
+ }
357
+ })
358
+
359
+
360
+ const CJ = jsonic.token['#E&']
361
+ const CL = jsonic.token.CL
362
+ const ST = jsonic.token.ST
363
+ const TX = jsonic.token.TX
364
+ const NR = jsonic.token.NR
365
+
366
+ const QM = jsonic.token.QM
367
+
368
+ const OPTKEY = [TX, ST, NR]
369
+
370
+
371
+ jsonic.rule('val', (rs: RuleSpec) => {
372
+
373
+ rs
374
+ .open([
375
+ { s: [CJ, CL], p: 'map', b: 2, n: { pk: 1 }, g: 'spread' },
376
+
377
+ {
378
+ s: [OPTKEY, QM],
379
+ c: (r) => 0 == r.d,
380
+ p: 'map',
381
+ b: 2,
382
+ g: 'pair,jsonic,top,aontu-optional',
383
+ },
384
+
385
+ {
386
+ s: [OPTKEY, QM],
387
+ p: 'map',
388
+ b: 2,
389
+ n: { pk: 1 },
390
+ g: 'pair,jsonic,top,dive,aontu-optional',
391
+ },
392
+
393
+ ])
394
+
395
+ .bc((r: Rule, ctx: JsonicContext) => {
396
+
397
+ let valnode: Val = r.node
398
+ let valtype = typeof valnode
399
+
400
+ if ('string' === valtype) {
401
+ valnode = addsite(new StringVal({ peg: r.node }), r, ctx)
402
+ }
403
+ else if ('number' === valtype) {
404
+ // 1.0 in source is *not* an integer
405
+ if (Number.isInteger(r.node) && !r.o0.src.includes('.')) {
406
+ valnode = addsite(new IntegerVal({ peg: r.node, src: r.o0.src }), r, ctx)
407
+ }
408
+ else {
409
+ valnode = addsite(new NumberVal({ peg: r.node, src: r.o0.src }), r, ctx)
410
+ }
411
+ }
412
+ else if ('boolean' === valtype) {
413
+ valnode = addsite(new BooleanVal({ peg: r.node }), r, ctx)
414
+ }
415
+ else if (null === valnode) {
416
+ valnode = addsite(new NullVal({ peg: r.node }), r, ctx)
417
+ }
418
+
419
+ if (null != valnode && 'object' === typeof valnode && valnode.site) {
420
+ let st = r.o0
421
+ valnode.site.row = st.rI
422
+ valnode.site.col = st.cI
423
+ valnode.site.url = ctx.meta.multisource && ctx.meta.multisource.path
424
+ }
425
+ // else { ERROR? }
426
+
427
+ r.node = valnode
428
+
429
+ return undefined
430
+ })
431
+
432
+ .close([{ s: [CJ, CL], b: 2, g: 'spread,json,more' }])
433
+
434
+ return rs
435
+ })
436
+
437
+
438
+ jsonic.rule('map', (rs: RuleSpec) => {
439
+ rs
440
+ .open([
441
+ { s: [CJ, CL], p: 'pair', b: 2, g: 'spread' },
442
+
443
+ { s: [OPTKEY, QM], p: 'pair', b: 2, g: 'pair,list,val,imp,jsonic,aontu-optional' },
444
+ ])
445
+
446
+ .bc((r: Rule, ctx: JsonicContext) => {
447
+ const optionalKeys = r.u.aontu_optional_keys ?? []
448
+
449
+ let mo = r.node
450
+
451
+ // Handle defered conjuncts, e.g. `{x:1 @"foo"}`
452
+ if (mo.___merge) {
453
+ let mop = { ...mo }
454
+ delete mop.___merge
455
+
456
+ // TODO: needs addpath?
457
+ let mopv = new MapVal({ peg: mop })
458
+ mopv.optionalKeys = optionalKeys
459
+
460
+ r.node =
461
+ addsite(new ConjunctVal({ peg: [mopv, ...mo.___merge] }), r, ctx)
462
+ }
463
+ else {
464
+ r.node = addsite(new MapVal({ peg: mo }), r, ctx)
465
+ r.node.optionalKeys = optionalKeys
466
+ }
467
+
468
+ return undefined
469
+ })
470
+
471
+ .close([{ s: [CJ, CL], b: 2, g: 'spread,json,more' }])
472
+
473
+ return rs
474
+ })
475
+
476
+
477
+
478
+ jsonic.rule('list', (rs: RuleSpec) => {
479
+ rs
480
+ // .open([{ s: [CJ, CL], p: 'pair', b: 2, g: 'spread' }])
481
+
482
+ .bc((r: Rule, ctx: JsonicContext) => {
483
+ const optionalKeys = r.u.aontu_optional_keys ?? []
484
+
485
+ let ao = r.node
486
+
487
+ if (ao.___merge) {
488
+ let aop = [...ao]
489
+ delete (aop as any).___merge
490
+
491
+ // TODO: needs addpath?
492
+ let aopv = new ListVal({ peg: aop })
493
+ aopv.optionalKeys = optionalKeys
494
+
495
+ r.node =
496
+ addsite(new ConjunctVal({ peg: [aopv, ...ao.___merge] }), r, ctx)
497
+ }
498
+ else {
499
+ r.node = addsite(new ListVal({ peg: ao }), r, ctx)
500
+ r.node.optionalKeys = optionalKeys
501
+ }
502
+
503
+ return undefined
504
+ })
505
+
506
+ // .close([{ s: [CJ, CL], b: 2, g: 'spread,json,more' }])
507
+
508
+ return rs
509
+ })
510
+
511
+
512
+ // TODO: copied from jsonic grammar
513
+ // jsonic should provide a way to export this
514
+ const pairkey = (r: Rule) => {
515
+ // Get key string value from first matching token of `Open` state.
516
+ const key_token = r.o0
517
+ const key =
518
+ ST === key_token.tin || TX === key_token.tin
519
+ ? key_token.val // Was text
520
+ : key_token.src // Was number, use original text
521
+
522
+ r.u.key = key
523
+ }
524
+
525
+
526
+ jsonic.rule('pair', (rs: RuleSpec) => {
527
+ rs
528
+ .open([
529
+ {
530
+ s: [CJ, CL], p: 'val',
531
+ u: { spread: true },
532
+ g: 'spread'
533
+ },
534
+
535
+ {
536
+ s: [OPTKEY, QM], b: 1, r: 'pair', u: { aontu_optional: true },
537
+ g: 'aontu-optional-key'
538
+ },
539
+
540
+ {
541
+ s: [QM, CL],
542
+ c: (r) => r.prev.u.aontu_optional,
543
+ p: 'val',
544
+ u: { pair: true },
545
+ a: (r) => {
546
+ pairkey(r.prev)
547
+ r.u.key = r.prev.u.key
548
+
549
+ r.parent.u.aontu_optional_keys = (r.parent.u.aontu_optional_keys || [])
550
+ r.parent.u.aontu_optional_keys.push('' + r.u.key)
551
+ },
552
+ g: 'aontu-optional-pair'
553
+ }
554
+ ])
555
+
556
+ // NOTE: manually adjust path - @jsonic/path ignores as not pair:true
557
+ .ao((r) => {
558
+ if (0 < r.d && r.u.spread) {
559
+ r.child.k.path = [...r.k.path, '&']
560
+ r.child.k.key = '&'
561
+ }
562
+ })
563
+
564
+ .bc((rule: Rule) => {
565
+ // TRAVERSE PARENTS TO GET PATH
566
+
567
+ if (rule.u.spread) {
568
+ rule.node[SPREAD] =
569
+ (rule.node[SPREAD] || { o: rule.o0.src, v: [] })
570
+
571
+ rule.node[SPREAD].v.push(rule.child.node)
572
+ }
573
+
574
+ return undefined
575
+ })
576
+
577
+ .close([
578
+ { s: [CJ, CL], c: (r) => r.lte('dmap', 1), r: 'pair', b: 2, g: 'spread,json,pair' },
579
+ { s: [CJ, CL], b: 2, g: 'spread,json,more' }
580
+ ])
581
+
582
+
583
+ return rs
584
+ })
585
+
586
+
587
+ jsonic.rule('elem', (rs: RuleSpec) => {
588
+ rs
589
+ .open([
590
+ {
591
+ s: [CJ, CL],
592
+ p: 'val',
593
+ n: { pk: 1, dmap: 1 },
594
+ u: { spread: true, done: true, list: true },
595
+ g: 'spread'
596
+ },
597
+
598
+ {
599
+ s: [OPTKEY, QM], b: 1, r: 'elem', u: { aontu_optional: true },
600
+ g: 'aontu-optional-key-elem'
601
+ },
602
+
603
+ {
604
+ s: [QM, CL],
605
+ c: (r) => r.prev.u.aontu_optional,
606
+ p: 'val',
607
+ u: { spread: true, done: true, list: true, pair: true },
608
+ a: (r) => {
609
+ pairkey(r.prev)
610
+ r.u.key = r.prev.u.key
611
+
612
+ r.parent.u.aontu_optional_keys = (r.parent.u.aontu_optional_keys || [])
613
+ r.parent.u.aontu_optional_keys.push('' + r.u.key)
614
+ },
615
+ g: 'aontu-optional-elem'
616
+ }
617
+ ])
618
+
619
+
620
+ .bc((rule: Rule) => {
621
+ // TRAVERSE PARENTS TO GET PATH
622
+
623
+ if (rule.u.spread) {
624
+ rule.node[SPREAD] =
625
+ (rule.node[SPREAD] || { o: rule.o0.src, v: [] })
626
+ rule.node[SPREAD].v.push(rule.child.node)
627
+ }
628
+
629
+ return undefined
630
+ })
631
+
632
+ .close([{ s: [CJ, CL], r: 'elem', b: 2, g: 'spread,json,more' }])
633
+
634
+ return rs
635
+ })
636
+
637
+ }
638
+
639
+
640
+
641
+ function makeModelResolver(options: any) {
642
+ const useRequire = options.require || require
643
+
644
+ let memResolver = makeMemResolver({
645
+ ...(options.resolver?.mem || {})
646
+ })
647
+
648
+ // TODO: make this consistent with other resolvers
649
+ let fileResolver = makeFileResolver((spec: any) => {
650
+ return 'string' === typeof spec ? spec : spec?.peg
651
+ })
652
+
653
+ let pkgResolver = makePkgResolver({
654
+ require: useRequire,
655
+ ...(options.resolver?.pkg || {})
656
+ })
657
+
658
+ return function ModelResolver(
659
+ spec: any,
660
+ popts: any,
661
+ rule: Rule,
662
+ ctx: JsonicContext,
663
+ jsonic: Jsonic
664
+ ) {
665
+
666
+ let path = 'string' === typeof spec ? spec : spec?.peg
667
+ let search: any = []
668
+ let res = memResolver(path, popts, rule, ctx, jsonic)
669
+ res.path = path
670
+ if (res.found) {
671
+ return res
672
+ }
673
+
674
+ search = search.concat(res.search)
675
+
676
+ res = fileResolver(path, popts, rule, ctx, jsonic)
677
+ res.path = path
678
+ if (res.found) {
679
+ return res
680
+ }
681
+
682
+ search = search.concat(res.search)
683
+
684
+ res = pkgResolver(path, popts, rule, ctx, jsonic)
685
+ res.path = path
686
+ if (res.found) {
687
+ return res
688
+ }
689
+
690
+ res.search = search.concat(res.search)
691
+ return res
692
+ }
693
+ }
694
+
695
+
696
+ class Lang {
697
+ jsonic: Jsonic
698
+ opts: AontuOptions
699
+ idcount: number | undefined
700
+
701
+
702
+ constructor(options?: Partial<AontuOptions>) {
703
+ // const start = performance.now()
704
+
705
+ this.opts = Object.assign(DEFAULT_OPTS(), options) as AontuOptions
706
+
707
+ const modelResolver = makeModelResolver(this.opts)
708
+
709
+ this.jsonic = Jsonic.make()
710
+
711
+ if (this.opts.debug) {
712
+ this.jsonic.use(Debug, {
713
+ trace: this.opts.trace
714
+ })
715
+ }
716
+
717
+ this.jsonic
718
+ .use(AontuJsonic)
719
+ .use(MultiSource, {
720
+ // resolver: options?.resolver || includeFileResolver
721
+ resolver: options?.resolver || modelResolver
722
+ })
723
+
724
+ // if (false === (global as any).aontu_warm) {
725
+ // (global as any).aontu.time.langctor.push(performance.now() - start)
726
+ // }
727
+ }
728
+
729
+
730
+ parse(src: string, opts?: Partial<AontuOptions>): Val {
731
+ // const start = performance.now()
732
+
733
+ // JSONIC-UPDATE - check meta
734
+ let jm: any = {
735
+ fs: opts?.fs,
736
+ fileName: opts?.path ?? this.opts.path,
737
+ multisource: {
738
+ path: opts?.path ?? this.opts.path,
739
+ deps: (opts && opts.deps) || undefined
740
+ }
741
+ }
742
+
743
+ if (null != opts?.idcount) {
744
+ this.idcount = opts.idcount
745
+ }
746
+
747
+ // Pass through Jsonic debug log value
748
+ if (opts && null != opts.log && Number.isInteger(opts.log)) {
749
+ jm.log = opts.log
750
+ }
751
+
752
+ // jm.log = -1
753
+
754
+ let val: Val
755
+
756
+ try {
757
+ val = this.jsonic(src, jm)
758
+ }
759
+ catch (e: any) {
760
+ if (e instanceof JsonicError || 'JsonicError' === e.constructor.name) {
761
+ val = new NilVal({
762
+ why: 'parse',
763
+ err: new NilVal({
764
+ why: 'syntax',
765
+ msg: e.message,
766
+ err: e,
767
+ })
768
+ })
769
+ }
770
+ else {
771
+ throw e
772
+ }
773
+ }
774
+
775
+ return val
776
+ }
777
+ }
778
+
779
+ export {
780
+ Lang,
781
+ Site,
782
+ }