simplex-lang 0.3.0 → 1.0.0

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 (51) hide show
  1. package/README.md +529 -12
  2. package/build/parser/index.js +1161 -479
  3. package/build/parser/index.js.map +1 -1
  4. package/build/src/compiler.d.ts +26 -18
  5. package/build/src/compiler.js +197 -463
  6. package/build/src/compiler.js.map +1 -1
  7. package/build/src/constants.d.ts +25 -0
  8. package/build/src/constants.js +29 -0
  9. package/build/src/constants.js.map +1 -0
  10. package/build/src/error-mapping.d.ts +31 -0
  11. package/build/src/error-mapping.js +72 -0
  12. package/build/src/error-mapping.js.map +1 -0
  13. package/build/src/errors.d.ts +8 -5
  14. package/build/src/errors.js +8 -10
  15. package/build/src/errors.js.map +1 -1
  16. package/build/src/index.d.ts +1 -0
  17. package/build/src/index.js +1 -0
  18. package/build/src/index.js.map +1 -1
  19. package/build/src/simplex-tree.d.ts +25 -3
  20. package/build/src/simplex.peggy +120 -3
  21. package/build/src/tools/index.d.ts +17 -7
  22. package/build/src/tools/index.js +81 -17
  23. package/build/src/tools/index.js.map +1 -1
  24. package/build/src/version.js +1 -1
  25. package/build/src/visitors.d.ts +15 -0
  26. package/build/src/visitors.js +330 -0
  27. package/build/src/visitors.js.map +1 -0
  28. package/package.json +6 -5
  29. package/parser/index.js +1161 -479
  30. package/parser/index.js.map +1 -1
  31. package/src/compiler.ts +308 -610
  32. package/src/constants.ts +30 -0
  33. package/src/error-mapping.ts +112 -0
  34. package/src/errors.ts +8 -12
  35. package/src/index.ts +1 -0
  36. package/src/simplex-tree.ts +30 -2
  37. package/src/simplex.peggy +120 -3
  38. package/src/tools/index.ts +107 -22
  39. package/src/visitors.ts +491 -0
  40. package/build/src/tools/cast.d.ts +0 -2
  41. package/build/src/tools/cast.js +0 -20
  42. package/build/src/tools/cast.js.map +0 -1
  43. package/build/src/tools/ensure.d.ts +0 -3
  44. package/build/src/tools/ensure.js +0 -30
  45. package/build/src/tools/ensure.js.map +0 -1
  46. package/build/src/tools/guards.d.ts +0 -2
  47. package/build/src/tools/guards.js +0 -24
  48. package/build/src/tools/guards.js.map +0 -1
  49. package/src/tools/cast.ts +0 -26
  50. package/src/tools/ensure.ts +0 -41
  51. package/src/tools/guards.ts +0 -34
@@ -1,25 +1,9 @@
1
- export * from './cast.js';
2
- export * from './ensure.js';
3
- export * from './guards.js';
1
+ import { UnexpectedTypeError } from '../errors.js';
4
2
  /**
5
3
  * Alias for `Object.prototype.toString`
6
4
  */
7
5
  // eslint-disable-next-line @typescript-eslint/unbound-method
8
6
  export const objToStringAlias = Object.prototype.toString;
9
- /**
10
- * Converts instances of Number, String and Boolean to primitives
11
- */
12
- export function unbox(val) {
13
- if (typeof val !== 'object' || val === null)
14
- return val;
15
- const objConstructor = val.constructor;
16
- if (objConstructor === Number ||
17
- objConstructor === String ||
18
- objConstructor === Boolean) {
19
- return val.valueOf();
20
- }
21
- return val;
22
- }
23
7
  /**
24
8
  * The method is needed to obtain the most specific readable data type.
25
9
  *
@@ -45,4 +29,84 @@ export function typeOf(val) {
45
29
  }
46
30
  return type;
47
31
  }
32
+ // --- Guards ---
33
+ /** Check if value is a plain object (not Array, Map, etc.). */
34
+ export function isObject(val) {
35
+ return objToStringAlias.call(val) === '[object Object]';
36
+ }
37
+ // Boxed primitives (new String, etc.) are intentionally not handled — they
38
+ // cannot originate from SimplEx expressions and are not worth the overhead.
39
+ export function isSimpleValue(val) {
40
+ const type = typeof val;
41
+ if (type === 'string' ||
42
+ type === 'number' ||
43
+ type === 'boolean' ||
44
+ type === 'bigint') {
45
+ return true;
46
+ }
47
+ if (val == null)
48
+ return true;
49
+ return false;
50
+ }
51
+ // --- Cast ---
52
+ /** Coerce any value to boolean (standard JS truthiness). */
53
+ export function castToBoolean(val) {
54
+ // Boxed primitives (new String, etc.) are intentionally not handled — see isSimpleValue comment.
55
+ return Boolean(val);
56
+ }
57
+ /** Coerce value to string; objects use Object.prototype.toString. */
58
+ export function castToString(val) {
59
+ const type = typeof val;
60
+ // Boxed primitives (new String, etc.) are intentionally not handled — see isSimpleValue comment.
61
+ if (type === 'string')
62
+ return val;
63
+ if (val == null ||
64
+ type === 'number' ||
65
+ type === 'boolean' ||
66
+ type === 'bigint') {
67
+ return String(val);
68
+ }
69
+ return objToStringAlias.call(val);
70
+ }
71
+ // --- Ensure ---
72
+ /** Validate that value is a finite number or bigint; throw UnexpectedTypeError otherwise. */
73
+ export function ensureNumber(val) {
74
+ if (typeof val === 'number' && Number.isFinite(val)) {
75
+ return val;
76
+ }
77
+ if (typeof val === 'bigint') {
78
+ return val;
79
+ }
80
+ // Boxed primitives (new Number, etc.) are intentionally not handled — see isSimpleValue comment.
81
+ throw new UnexpectedTypeError(['number', 'bigint'], val);
82
+ }
83
+ /** Validate that value is a function; throw UnexpectedTypeError otherwise. */
84
+ export function ensureFunction(val) {
85
+ if (typeof val === 'function')
86
+ return val;
87
+ throw new UnexpectedTypeError(['function'], val);
88
+ }
89
+ /** Validate that value is a plain object; throw UnexpectedTypeError otherwise. */
90
+ export function ensureObject(val) {
91
+ if (isObject(val))
92
+ return val;
93
+ throw new UnexpectedTypeError(['object'], val);
94
+ }
95
+ /** Validate that value is an array; throw UnexpectedTypeError otherwise. */
96
+ export function ensureArray(val) {
97
+ if (Array.isArray(val))
98
+ return val;
99
+ throw new UnexpectedTypeError(['Array'], val);
100
+ }
101
+ /** Validate that value is comparable (<, >, <=, >=); must be number, bigint, or string. */
102
+ export function ensureRelationalComparable(val) {
103
+ // Boxed primitives (new String, etc.) are intentionally not handled — see isSimpleValue comment.
104
+ const type = typeof val;
105
+ if ((type === 'number' && Number.isNaN(val) === false) ||
106
+ type === 'string' ||
107
+ type === 'bigint') {
108
+ return val;
109
+ }
110
+ throw new UnexpectedTypeError(['number', 'bigint', 'string'], val);
111
+ }
48
112
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAE3B;;GAEG;AACH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAA;AAEzD;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAA;IAEvD,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,CAAA;IAEtC,IACE,cAAc,KAAK,MAAM;QACzB,cAAc,KAAK,MAAM;QACzB,cAAc,KAAK,OAAO,EAC1B,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,GAAY;IACjC,MAAM,IAAI,GAAG,OAAO,GAAG,CAAA;IAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAA;aACpC,IAAI,GAAG,KAAK,MAAM,CAAC,iBAAiB;YAAE,OAAO,WAAW,CAAA;aACxD,IAAI,GAAG,KAAK,MAAM,CAAC,iBAAiB;YAAE,OAAO,UAAU,CAAA;;YACvD,OAAO,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export const version = '0.3.0';
1
+ export const version = '1.0.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,15 @@
1
+ import { ExpressionStatement, Location } from './simplex-tree.js';
2
+ export interface SourceLocation {
3
+ len: number;
4
+ location: Location;
5
+ }
6
+ export interface VisitResult {
7
+ code: string;
8
+ offsets: SourceLocation[];
9
+ }
10
+ export interface TraverseContext {
11
+ expression: string;
12
+ insidePipe: boolean;
13
+ }
14
+ /** Walk the AST and produce generated JS code with source location offsets. */
15
+ export declare function traverse(tree: ExpressionStatement, expression: string): VisitResult;
@@ -0,0 +1,330 @@
1
+ import { CompileError } from './errors.js';
2
+ import { TOPIC_TOKEN, GEN } from './constants.js';
3
+ const codePart = (codePart, ownerNode) => ({
4
+ code: codePart,
5
+ offsets: [{ len: codePart.length, location: ownerNode.location }]
6
+ });
7
+ const combineVisitResults = (parts) => {
8
+ return parts.reduce((res, it) => {
9
+ return {
10
+ code: res.code + it.code,
11
+ offsets: res.offsets.concat(it.offsets)
12
+ };
13
+ });
14
+ };
15
+ /** Build a comma-separated list of VisitResult[] segments. */
16
+ const commaSeparated = (items, commaNode) => {
17
+ if (items.length === 0)
18
+ return [];
19
+ return items.flatMap((item, i) => i < items.length - 1 ? [...item, codePart(',', commaNode)] : item);
20
+ };
21
+ /** Wrap visited args as `fnName(arg1, arg2, ...)`. */
22
+ const wrapCall = (fnName, node, ...args) => [
23
+ codePart(`${fnName}(`, node),
24
+ ...commaSeparated(args, node),
25
+ codePart(')', node)
26
+ ];
27
+ /** Wrap visited args as `registry["op"](arg1, arg2, ...)`. */
28
+ const wrapOp = (registry, operator, node, ...args) => [
29
+ codePart(`${registry}["${operator}"](`, node),
30
+ ...commaSeparated(args, node),
31
+ codePart(')', node)
32
+ ];
33
+ /** Wrap visit results as a thunk: `()=>(...)`. */
34
+ const thunk = (node, parts) => [codePart('()=>(', node), ...parts, codePart(')', node)];
35
+ // --- AST Visitors ---
36
+ const visitors = {
37
+ Literal: node => {
38
+ const parts = [codePart(JSON.stringify(node.value), node)];
39
+ return parts;
40
+ },
41
+ Identifier: node => {
42
+ const parts = [
43
+ codePart(`${GEN.get}(${GEN.scope},${JSON.stringify(node.name)})`, node)
44
+ ];
45
+ return parts;
46
+ },
47
+ UnaryExpression: (node, visit) => wrapOp(GEN.uop, node.operator, node, visit(node.argument)),
48
+ BinaryExpression: (node, visit) => wrapOp(GEN.bop, node.operator, node, visit(node.left), visit(node.right)),
49
+ LogicalExpression: (node, visit) => wrapOp(GEN.lop, node.operator, node, thunk(node, visit(node.left)), thunk(node, visit(node.right))),
50
+ ConditionalExpression: (node, visit) => {
51
+ const parts = [
52
+ codePart(`(${GEN.bool}(`, node),
53
+ ...visit(node.test),
54
+ codePart(')?', node),
55
+ ...visit(node.consequent),
56
+ codePart(':', node),
57
+ ...(node.alternate !== null
58
+ ? visit(node.alternate)
59
+ : [codePart('undefined', node)]),
60
+ codePart(')', node)
61
+ ];
62
+ return parts;
63
+ },
64
+ ObjectExpression: (node, visit, context) => {
65
+ const items = node.properties.map(p => {
66
+ if (p.type === 'SpreadElement') {
67
+ return [
68
+ codePart(`...${GEN.ensObj}(`, p),
69
+ ...visit(p.argument),
70
+ codePart(')', p)
71
+ ];
72
+ }
73
+ let keyParts;
74
+ if (p.computed) {
75
+ keyParts = [codePart('[', p), ...visit(p.key), codePart(']', p)];
76
+ }
77
+ else if (p.key.type === 'Identifier') {
78
+ keyParts = [codePart(p.key.name, p)];
79
+ }
80
+ else if (p.key.type === 'Literal') {
81
+ // JSON.stringify(Infinity) returns "null", producing wrong key
82
+ if (typeof p.key.value === 'number' && !Number.isFinite(p.key.value)) {
83
+ throw new CompileError(`Invalid object key: ${p.key.value}`, context.expression, p.key.location);
84
+ }
85
+ keyParts = [codePart(JSON.stringify(p.key.value), p)];
86
+ }
87
+ else {
88
+ // Unreachable: grammar restricts keys to Identifier and Literal
89
+ throw new CompileError(`Unsupported object key type: ${p.key.type}`, context.expression, p.key.location);
90
+ }
91
+ return [...keyParts, codePart(':', node), ...visit(p.value)];
92
+ });
93
+ return [
94
+ codePart('{', node),
95
+ ...commaSeparated(items, node),
96
+ codePart('}', node)
97
+ ];
98
+ },
99
+ ArrayExpression: (node, visit) => {
100
+ const items = node.elements.map(el => {
101
+ if (el === null)
102
+ return [];
103
+ if (el.type === 'SpreadElement') {
104
+ return [
105
+ codePart(`...${GEN.ensArr}(`, el),
106
+ ...visit(el.argument),
107
+ codePart(')', el)
108
+ ];
109
+ }
110
+ return visit(el);
111
+ });
112
+ return [
113
+ codePart('[', node),
114
+ ...commaSeparated(items, node),
115
+ codePart(']', node)
116
+ ];
117
+ },
118
+ NonNullAssertExpression: (node, visit) => wrapCall(GEN.nna, node, visit(node.expression)),
119
+ MemberExpression: (node, visit) => {
120
+ const { computed, object, property } = node;
121
+ // TODO Pass computed to prop?
122
+ const propertyPart = computed
123
+ ? visit(property)
124
+ : [codePart(JSON.stringify(property.name), property)];
125
+ const extension = !computed && node.extension === true;
126
+ return wrapCall(GEN.prop, node, visit(object), propertyPart, [
127
+ codePart(String(extension), node)
128
+ ]);
129
+ },
130
+ CallExpression: (node, visit) => {
131
+ if (node.arguments.length > 0) {
132
+ const items = node.arguments.map((arg, index) => arg.type === 'CurryPlaceholder'
133
+ ? [codePart(`a${index}`, arg)]
134
+ : visit(arg));
135
+ const curriedArgs = node.arguments.flatMap((arg, index) => arg.type === 'CurryPlaceholder' ? [`a${index}`] : []);
136
+ // call({{callee}},[{{arguments}}])
137
+ let parts = [
138
+ codePart(`${GEN.call}(`, node),
139
+ ...visit(node.callee),
140
+ codePart(',[', node),
141
+ ...commaSeparated(items, node),
142
+ codePart('])', node)
143
+ ];
144
+ if (curriedArgs.length > 0) {
145
+ parts = [
146
+ codePart(`(${GEN.scope}=>(${curriedArgs.join()})=>`, node),
147
+ ...parts,
148
+ codePart(`)(${GEN.scope})`, node)
149
+ ];
150
+ }
151
+ return parts;
152
+ }
153
+ else {
154
+ const parts = [
155
+ codePart(`${GEN.call}(`, node),
156
+ ...visit(node.callee),
157
+ codePart(',null)', node)
158
+ ];
159
+ return parts;
160
+ }
161
+ },
162
+ NullishCoalescingExpression: (node, visit) => {
163
+ const parts = [
164
+ codePart('(', node),
165
+ ...visit(node.left),
166
+ codePart('??', node),
167
+ ...visit(node.right),
168
+ codePart(')', node)
169
+ ];
170
+ return parts;
171
+ },
172
+ PipeSequence: (node, visit, context) => {
173
+ const headCode = visit(node.head);
174
+ const prevInsidePipe = context.insidePipe;
175
+ context.insidePipe = true;
176
+ const items = node.tail.map(t => {
177
+ const opt = t.operator === '|?';
178
+ const fwd = t.operator === '|>';
179
+ return [
180
+ codePart(`{opt:${opt},fwd:${fwd},next:(${GEN.scope}=>topic=>{${GEN.scope}=[["${TOPIC_TOKEN}"],[topic],${GEN.scope}];return `, t.expression),
181
+ ...visit(t.expression),
182
+ codePart(`})(${GEN.scope})}`, t.expression)
183
+ ];
184
+ });
185
+ context.insidePipe = prevInsidePipe;
186
+ return [
187
+ codePart(`${GEN.pipe}(`, node),
188
+ ...headCode,
189
+ codePart(',[', node),
190
+ ...commaSeparated(items, node),
191
+ codePart('])', node)
192
+ ];
193
+ },
194
+ TopicReference: (node, _visit, context) => {
195
+ if (!context.insidePipe) {
196
+ throw new CompileError(`Topic reference "${TOPIC_TOKEN}" is unbound; it must be inside a pipe body`, context.expression, node.location);
197
+ }
198
+ const parts = [
199
+ codePart(`${GEN.get}(${GEN.scope},"${TOPIC_TOKEN}")`, node)
200
+ ];
201
+ return parts;
202
+ },
203
+ LambdaExpression: (node, visit) => {
204
+ // Lambda with parameters
205
+ if (node.params.length > 0) {
206
+ const paramsNames = node.params.map(p => p.name);
207
+ const fnParams = Array.from({ length: paramsNames.length }, (_, index) => `p${index}`);
208
+ const fnParamsList = fnParams.join();
209
+ const fnParamsNamesList = paramsNames.map(p => JSON.stringify(p)).join();
210
+ const parts = [
211
+ codePart(`((${GEN.scope},params)=>function(${fnParamsList}){${GEN.scope}=[params,[${fnParamsList}],${GEN.scope}];return `, node),
212
+ ...visit(node.expression),
213
+ codePart(`})(${GEN.scope},[${fnParamsNamesList}])`, node)
214
+ ];
215
+ return parts;
216
+ }
217
+ // Lambda without parameters
218
+ else {
219
+ // (() => {{code}})
220
+ const parts = [
221
+ codePart(`(()=>`, node),
222
+ ...visit(node.expression),
223
+ codePart(`)`, node)
224
+ ];
225
+ return parts;
226
+ }
227
+ },
228
+ TemplateLiteral: (node, visit) => {
229
+ const { quasis, expressions, tag } = node;
230
+ // --- Tagged template literal ---
231
+ if (tag !== null) {
232
+ const quasisItems = quasis.map(q => [codePart(JSON.stringify(q.value), q)]);
233
+ const quasisArray = [
234
+ codePart('[', node),
235
+ ...commaSeparated(quasisItems, node),
236
+ codePart(']', node)
237
+ ];
238
+ const allArgs = [quasisArray, ...expressions.map(e => visit(e))];
239
+ return [
240
+ codePart(`${GEN.call}(`, node),
241
+ ...visit(tag),
242
+ codePart(',[', node),
243
+ ...commaSeparated(allArgs, node),
244
+ codePart('])', node)
245
+ ];
246
+ }
247
+ // No interpolations → emit as plain string literal
248
+ if (expressions.length === 0) {
249
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
250
+ return [codePart(JSON.stringify(quasis[0].value), node)];
251
+ }
252
+ const parts = [codePart('(', node)];
253
+ for (let i = 0; i < quasis.length; i++) {
254
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
255
+ const quasi = quasis[i];
256
+ const expr = expressions[i];
257
+ // Add "+" between parts (skip before the first part)
258
+ if (i > 0) {
259
+ parts.push(codePart('+', node));
260
+ }
261
+ // Emit the static string part
262
+ if (quasi.value !== '' || expr == null) {
263
+ parts.push(codePart(JSON.stringify(quasi.value), quasi));
264
+ if (expr != null) {
265
+ parts.push(codePart('+', node));
266
+ }
267
+ }
268
+ // Emit the interpolated expression wrapped in castToString
269
+ if (expr != null) {
270
+ parts.push(codePart(`${GEN.str}(`, node));
271
+ parts.push(...visit(expr));
272
+ parts.push(codePart(')', node));
273
+ }
274
+ }
275
+ parts.push(codePart(')', node));
276
+ return parts;
277
+ },
278
+ LetExpression: (node, visit, context) => {
279
+ const declarationsNamesSet = new Set();
280
+ for (const d of node.declarations) {
281
+ if (declarationsNamesSet.has(d.id.name)) {
282
+ throw new CompileError(`"${d.id.name}" name defined inside let expression was repeated`, context.expression, d.id.location);
283
+ }
284
+ declarationsNamesSet.add(d.id.name);
285
+ }
286
+ // (scope=> {
287
+ // var _varNames = [];
288
+ // var _varValues = [];
289
+ // scope = [_varNames, _varValues, scope];
290
+ // // a = {{init}}
291
+ // _varNames.push("a");
292
+ // _varValues.push({{init}});
293
+ // // {{expression}}
294
+ // return {{expression}}
295
+ // })(scope)
296
+ const parts = [
297
+ codePart(`(${GEN.scope}=>{var ${GEN._varNames}=[];var ${GEN._varValues}=[];${GEN.scope}=[${GEN._varNames},${GEN._varValues},${GEN.scope}];`, node),
298
+ ...node.declarations.flatMap(d => [
299
+ codePart(`${GEN._varValues}.push(`, d),
300
+ ...visit(d.init),
301
+ codePart(`);`, d),
302
+ codePart(`${GEN._varNames}.push(`, d),
303
+ codePart(JSON.stringify(d.id.name), d.id),
304
+ codePart(`);`, d)
305
+ ]),
306
+ codePart(`return `, node),
307
+ ...visit(node.expression),
308
+ codePart(`})(${GEN.scope})`, node)
309
+ ];
310
+ return parts;
311
+ }
312
+ };
313
+ // --- Traverse ---
314
+ const visit = (node, _parentNode, context) => {
315
+ const nodeTypeVisitor = visitors[node.type];
316
+ if (nodeTypeVisitor === undefined) {
317
+ throw new Error(`No handler for node type - ${node.type}`);
318
+ }
319
+ const innerVisit = (childNode) => {
320
+ return visit(childNode, node, context);
321
+ };
322
+ // @ts-expect-error skip node is never
323
+ return nodeTypeVisitor(node, innerVisit, context);
324
+ };
325
+ /** Walk the AST and produce generated JS code with source location offsets. */
326
+ export function traverse(tree, expression) {
327
+ const context = { expression, insidePipe: false };
328
+ return combineVisitResults(visit(tree.expression, null, context));
329
+ }
330
+ //# sourceMappingURL=visitors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitors.js","sourceRoot":"","sources":["../../src/visitors.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simplex-lang",
3
- "version": "0.3.0",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "description": "SimplEx - simple expression language",
6
6
  "files": [
@@ -39,6 +39,7 @@
39
39
  "coverage": "c8 node -r dotenv/config --test \"build/test/**/*.test.js\" --enable-source-maps",
40
40
  "coverage:report": "c8 report --reporter=json-summary",
41
41
  "test": "npm run build && npm run coverage && npm run coverage:report",
42
+ "test:playground": "cd playground && npm test",
42
43
  "posttest": "node scripts/coverage-badge.js",
43
44
  "version": "npm run pick-version && auto-changelog -p && git add CHANGELOG.md",
44
45
  "release": "np"
@@ -71,13 +72,13 @@
71
72
  "@types/node": "^22.13.4",
72
73
  "auto-changelog": "^2.5.0",
73
74
  "awesome-code-frame": "^1.1.0",
74
- "c8": "^10.1.3",
75
+ "c8": "^11.0.0",
75
76
  "dotenv": "^16.4.7",
76
- "eslint": "^9.20.1",
77
- "eslint-plugin-n": "^17.15.1",
77
+ "eslint": "^9.39.4",
78
+ "eslint-plugin-n": "^17.24.0",
78
79
  "peggy": "^4.2.0",
79
80
  "prettier": "^3.5.1",
80
81
  "typescript": "^5.7.3",
81
- "typescript-eslint": "^8.24.1"
82
+ "typescript-eslint": "^8.57.1"
82
83
  }
83
84
  }