del-js-lang 0.0.1

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ivan Polushin
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # del-js
2
+
3
+ [![version](https://img.shields.io/npm/v/del-js-lang.svg)](https://www.npmjs.com/package/del-js-lang)
4
+ [![license](https://img.shields.io/github/license/polioan/zod-env)](https://opensource.org/licenses/MIT)
5
+ [![created by Ivan Polushin](https://img.shields.io/badge/created%20by-@polioan-4BBAAB.svg)](https://github.com/polioan)
6
+
7
+ Dumb expression language
8
+
9
+ ## Development
10
+
11
+ Respect:
12
+
13
+ - .editorconfig
14
+ - prettier
15
+ - eslint
16
+
17
+ ## Notes: what I am trying to achieve?
18
+
19
+ - Simple scripting language
20
+ - Language written in JavaScript/TypeScript, embeddable in JavaScript code
21
+ - Language that can work from CDN in HTML
22
+ - Alternative to eval
23
+ - Extendable language
24
+
25
+ ## References
26
+
27
+ - Lua PDF reference
28
+ - [https://github.com/polioan/flipper-js-kit/blob/main/types.d.ts](https://github.com/polioan/flipper-js-kit/blob/main/types.d.ts)
29
+ - [https://thomasjfrank.com/formulas/functions/ifs/](https://thomasjfrank.com/formulas/functions/ifs/)
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";var e="0.0.1";exports.DelJS=void 0,function(t){let n,r,u,a,l,i;t.version=e,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=t.ErrorKind||(t.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(r=t.ErrorCode||(t.ErrorCode={}));class s extends Error{code;kind;constructor({message:e,cause:t,code:r}){super(e,null==t?{}:{cause:t}),this.code=r,this.kind=(()=>{for(const e of Object.values(n))if(r.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}t.DelError=s,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(u=t.TokenType||(t.TokenType={}));class o{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new s({code:r.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(o.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new s({code:r.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:u.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new s({code:r.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:u.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();o.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:u.Comma,value:null}),this.advance()):(e.push({type:u.RParen,value:null}),this.advance()):(e.push({type:u.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:u.EOF,value:null}),e}}t.Tokenizer=o,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(a=t.NodeType||(t.NodeType={}));class c{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new s({code:r.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===u.String)return this.advance(),{type:a.String,value:e.value};if(e.type===u.Identifier){this.advance();const t={type:a.Identifier,value:e.value};if(this.match(u.LParen)){const e=this.parseArguments();return{type:a.Call,value:{callee:t,args:e}}}return t}throw new s({code:r.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(u.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(u.Comma)){this.expect(u.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new s({code:r.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new s({code:r.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(u.EOF),e}}t.Parser=c,function(e){e.String="string",e.Function="function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=t.ValueType||(t.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(i))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}t.Env=p;class v{evaluate(e,t){switch(e.type){case a.String:return{type:l.String,value:e.value};case a.Identifier:return t.get(e.value);case a.Call:return this.evaluateCall(e,t);default:throw new s({code:r.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let r={type:l.Nil,value:null};for(const t of e.value.args)r=this.evaluate(t,n);return r}evaluateFor(e,t){const[n,u,a,i]=e.value.args;if(null==n||null==u||null==a||null==i)throw new s({code:r.InterpreterInvalidFor,message:"Invalid for"});const o=new p(t);this.evaluate(n,o);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(u,o);if(!v.isTruthy(e))break;c=this.evaluate(i,o),this.evaluate(a,o)}return c}evaluateWhile(e,t){const[n,u]=e.value.args;if(null==n||null==u)throw new s({code:r.InterpreterInvalidWhile,message:"Invalid while"});const a=new p(t);let i={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,a);if(!v.isTruthy(e))break;i=this.evaluate(u,a)}return i}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new s({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new s({code:r.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new s({code:r.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const r=this.evaluate(e.value.args[n],t);if(v.isTruthy(r))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,u]=e.value.args;if(null==n||null==u)throw new s({code:r.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==a.String)throw new s({code:r.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const i={type:l.Reuse,value:u};return t.set(n.value,i),{type:l.Nil,value:null}}callReuse(e,t,n){const r=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,r)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new s({code:r.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if("WhileDo"===e.value.callee.value)return this.evaluateWhile(e,t);if("ForDo"===e.value.callee.value)return this.evaluateFor(e,t);if("Block"===e.value.callee.value)return this.evaluateBlock(e,t);if("Reuse"===e.value.callee.value)return this.evaluateReuse(e,t);if("Ifs"===e.value.callee.value)return this.evaluateIfs(e,t);const u=e.value.args.map(e=>this.evaluate(e,t));return n.value(u,t)}}t.Interpreter=v,t.evaluate=function(e,t){const n=new o(e).tokenize(),r=new c(n).parse(),u=p.globalEnv();for(const[e,n]of Object.entries(t??{}))u.set(e,n);return(new v).evaluate(r,u)},function(t){function n(e){if(null==e)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function u(e){if(e.type!==l.Number)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function a(e){if(e.type!==l.Boolean)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function i(e){if(e.type!==l.String)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function o(e){if(e.type!==l.Table)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e,t){return{type:l.Nil,value:null}}function p(e){if(!Number.isFinite(e))throw new s({code:r.InterpreterRuntime,message:"Invalid number"});return e}function h(e,t){const{value:r}=i(n(e[0])),u=Number(r);return{type:l.Number,value:p(u)}}function f(e,t){const{value:u}=i(n(e[0]));switch(u){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new s({code:r.InterpreterRuntime,message:"Invalid boolean"})}}function y(e,t){const{value:r}=i(n(e[0]));return{type:l.String,value:r}}function d(e,t){const n=e[0];if(null==n)return{type:l.String,value:"(nil)"};switch(n.type){case l.String:return{type:l.String,value:n.value};case l.Function:return{type:l.String,value:"(function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(n.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new s({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function g(e,t){const r=n(e[0]);return{type:l.String,value:r.type}}function m(e,t){return console.info(d(e).value),{type:l.Nil,value:null}}function b(e,t){return n(e[0])}function w(e,t){const n=e[0];if(null==n)return{type:l.Number,value:0};switch(n.type){case l.String:try{return{type:l.Number,value:h([n]).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:n.value};case l.Boolean:return{type:l.Number,value:Number(n.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new s({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function I(e,t){return{type:l.Boolean,value:v.isTruthy(e[0])}}function F(e,t){return{type:l.Nil,value:null}}function N(e,t){throw new s({code:r.Stop,message:"Stop"})}function S(e,t){const r=i(n(e[0])).value,u=n(e[1]);return t.set(r,{type:l.Function,value:(e,t)=>u}),{type:l.Nil,value:null}}function _(e,t){const r=i(n(e[0])).value,u=n(e[1]);let a=t.parent;for(;a;)a.values.has(r)&&a.set(r,{type:l.Function,value:(e,t)=>u}),a=a.parent;return{type:l.Nil,value:null}}function k(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value<=a.value}}function R(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value<a.value}}function x(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value>a.value}}function T(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value>=a.value}}function U(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value+a.value)}}function B(e,t){const r=a(n(e[0])),u=a(n(e[1]));return{type:l.Boolean,value:r.value&&u.value}}function E(e,t){const r=a(n(e[0])),u=a(n(e[1]));return{type:l.Boolean,value:r.value||u.value}}function A(e,t){const r=a(n(e[0]));return{type:l.Boolean,value:!r.value}}function P(e,t){const r=n(e[0]),u=n(e[1]);return{type:l.Boolean,value:r.type===u.type&&r.value===u.value}}function z(e,t){const r=n(e[0]),u=n(e[1]);return{type:l.Boolean,value:!(r.type===u.type&&r.value===u.value)}}function C(e,t){const a=u(n(e[0])),i=u(n(e[1]));if(0===i.value)throw new s({code:r.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:p(a.value%i.value)}}function O(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value**a.value)}}function D(e,t){const a=u(n(e[0])),i=u(n(e[1]));if(0===i.value)throw new s({code:r.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:p(a.value/i.value)}}function V(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value*a.value)}}function W(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value-a.value)}}function L(t,n){return{type:l.String,value:e}}function q(e,t){const n=e.map(e=>i(e).value);return{type:l.String,value:n.join("")}}function $(e,t){const{value:r}=i(n(e[0]));switch(r){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:r}}}function j(e,t){return{type:l.String,value:'"'}}function M(e,t){const{value:r}=o(n(e[0]));let u=0;for(const e of r.keys())"number"==typeof e&&Number.isInteger(e)&&e>=0&&u++;return{type:l.Number,value:p(u)}}function J(e,t){const u=n(e[0]);switch(u.type){case l.String:return{type:l.Number,value:u.value.length};case l.Function:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:M([u]).value};default:throw new s({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function K(e,t){return{type:l.Number,value:Math.random()}}function X(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value&a.value)}}function G(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value|a.value)}}function H(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value^a.value)}}function Q(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value<<(31&a.value))}}function Y(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value>>(31&a.value))}}function Z(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value>>>0>>>(31&a.value))}}function ee(e,t){const r=u(n(e[0])).value;return t.getArgs()[r]??{type:l.Nil,value:null}}function te(e,t){return{type:l.Table,value:new Map}}function ne(e,t){const u=o(n(e[0])),a=n(e[1]);if(a.type!==l.String&&a.type!==l.Number)throw new s({code:r.InterpreterRuntime,message:"Table key must be string or number"});return u.value.get(a.value)??{type:l.Nil,value:null}}function re(e,t){const u=o(n(e[0])),a=n(e[1]),i=n(e[2]);if(a.type!==l.String&&a.type!==l.Number)throw new s({code:r.InterpreterRuntime,message:"Table key must be string or number"});return u.value.set(a.value,i),{type:l.Nil,value:null}}t._assert=n,t._asNumberValue=u,t._asBooleanValue=a,t._asStringValue=i,t._asNilValue=function(e){if(e.type!==l.Nil)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},t._asFunctionValue=function(e){if(e.type!==l.Function)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},t._asReuseValue=function(e){if(e.type!==l.Reuse)throw new s({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},t._asTableValue=o,t._noop=c,t.nil={type:l.Function,value:c},t._assertValidNumber=p,t._number=h,t.number={type:l.Function,value:h},t._boolean=f,t.boolean={type:l.Function,value:f},t._string=y,t.string={type:l.Function,value:y},t.noop={type:l.Function,value:c},t.block={type:l.Function,value:c},t.forDo={type:l.Function,value:c},t.whileDo={type:l.Function,value:c},t.ifs={type:l.Function,value:c},t.reuse={type:l.Function,value:c},t._toString=d,t.toString={type:l.Function,value:d},t._type=g,t.type={type:l.Function,value:g},t._print=m,t.print={type:l.Function,value:m},t._id=b,t.id={type:l.Function,value:b},t._toNumber=w,t.toNumber={type:l.Function,value:w},t._toBoolean=I,t.toBoolean={type:l.Function,value:I},t._toNil=F,t.toNil={type:l.Function,value:F},t._stop=N,t.stop={type:l.Function,value:N},t._lets=S,t.lets={type:l.Function,value:S},t._env=_,t.env={type:l.Function,value:_},t._lte=k,t.lte={type:l.Function,value:k},t._lt=R,t.lt={type:l.Function,value:R},t._gt=x,t.gt={type:l.Function,value:x},t._gte=T,t.gte={type:l.Function,value:T},t._add=U,t.add={type:l.Function,value:U},t._and=B,t.and={type:l.Function,value:B},t._or=E,t.or={type:l.Function,value:E},t._not=A,t.not={type:l.Function,value:A},t._eq=P,t.eq={type:l.Function,value:P},t._neq=z,t.neq={type:l.Function,value:z},t._mod=C,t.mod={type:l.Function,value:C},t._power=O,t.power={type:l.Function,value:O},t._div=D,t.div={type:l.Function,value:D},t._mul=V,t.mul={type:l.Function,value:V},t._sub=W,t.sub={type:l.Function,value:W},t._version=L,t.version={type:l.Function,value:L},t._concat=q,t.concat={type:l.Function,value:q},t._escape=$,t.escape={type:l.Function,value:$},t._quote=j,t.quote={type:l.Function,value:j},t._lenArr=M,t.lenArr={type:l.Function,value:M},t._len=J,t.len={type:l.Function,value:J},t._random=K,t.random={type:l.Function,value:K},t._binAnd=X,t.binAnd={type:l.Function,value:X},t._binOr=G,t.binOr={type:l.Function,value:G},t._binXor=H,t.binXor={type:l.Function,value:H},t._binLeftShift=Q,t.binLeftShift={type:l.Function,value:Q},t._binRightShift=Y,t.binRightShift={type:l.Function,value:Y},t._binUnsignedRightShift=Z,t.binUnsignedRightShift={type:l.Function,value:Z},t._arg=ee,t.arg={type:l.Function,value:ee},t._table=te,t.table={type:l.Function,value:te},t._get=ne,t.get={type:l.Function,value:ne},t._set=re,t.set={type:l.Function,value:re}}(i=t.Std||(t.Std={}))}(exports.DelJS||(exports.DelJS={}));
@@ -0,0 +1,286 @@
1
+ declare namespace DelJS {
2
+ const version: string;
3
+ enum ErrorKind {
4
+ Tokenizer = "tokenizer",
5
+ Parser = "parser",
6
+ Interpreter = "interpreter",
7
+ Stop = "stop"
8
+ }
9
+ enum ErrorCode {
10
+ TokenizerInvalidPeek = "tokenizer-invalid-peek",
11
+ TokenizerUnexpectedCharacter = "tokenizer-unexpected-character",
12
+ TokenizerUnterminatedStringLiteral = "tokenizer-unterminated-string-literal",
13
+ ParserInvalidAdvance = "parser-invalid-advance",
14
+ ParserUnexpectedEndOfInput = "parser-unexpected-end-of-input",
15
+ ParserUnexpectedTokenInExpression = "parser-unexpected-token-in-expression",
16
+ ParserUnexpectedToken = "parser-unexpected-token",
17
+ InterpreterUnreachable = "interpreter-unreachable",
18
+ InterpreterCalledNotFunction = "interpreter-called-not-function",
19
+ InterpreterInvalidFor = "interpreter-invalid-for",
20
+ InterpreterInvalidWhile = "interpreter-invalid-while",
21
+ InterpreterInvalidIfs = "interpreter-invalid-ifs",
22
+ InterpreterInvalidReuse = "interpreter-invalid-reuse",
23
+ InterpreterRuntime = "interpreter-runtime",
24
+ Stop = "stop"
25
+ }
26
+ interface DelErrorOptions {
27
+ message: string;
28
+ cause?: unknown;
29
+ code: ErrorCode;
30
+ }
31
+ class DelError extends Error {
32
+ readonly code: ErrorCode;
33
+ readonly kind: ErrorKind;
34
+ constructor({ message, cause, code }: DelErrorOptions);
35
+ }
36
+ enum TokenType {
37
+ Identifier = "identifier",
38
+ String = "string",
39
+ Comma = "comma",
40
+ LParen = "lparen",
41
+ RParen = "rparen",
42
+ EOF = "eof"
43
+ }
44
+ interface TokenIdentifier {
45
+ type: TokenType.Identifier;
46
+ value: string;
47
+ }
48
+ interface TokenString {
49
+ type: TokenType.String;
50
+ value: string;
51
+ }
52
+ interface TokenComma {
53
+ type: TokenType.Comma;
54
+ value: null;
55
+ }
56
+ interface TokenLParen {
57
+ type: TokenType.LParen;
58
+ value: null;
59
+ }
60
+ interface TokenRParen {
61
+ type: TokenType.RParen;
62
+ value: null;
63
+ }
64
+ interface TokenEOF {
65
+ type: TokenType.EOF;
66
+ value: null;
67
+ }
68
+ type Token = TokenIdentifier | TokenString | TokenComma | TokenLParen | TokenRParen | TokenEOF;
69
+ class Tokenizer {
70
+ private readonly input;
71
+ private pos;
72
+ constructor(input: string);
73
+ static isWhitespace(ch: string): boolean;
74
+ private peek;
75
+ private advance;
76
+ private isEOF;
77
+ private readIdentifier;
78
+ private readString;
79
+ tokenize(): Token[];
80
+ }
81
+ enum NodeType {
82
+ Identifier = "identifier",
83
+ String = "string",
84
+ Call = "call"
85
+ }
86
+ interface NodeIdentifier {
87
+ type: NodeType.Identifier;
88
+ value: string;
89
+ }
90
+ interface NodeString {
91
+ type: NodeType.String;
92
+ value: string;
93
+ }
94
+ interface NodeCall {
95
+ type: NodeType.Call;
96
+ value: {
97
+ callee: NodeIdentifier;
98
+ args: Node[];
99
+ };
100
+ }
101
+ type Node = NodeIdentifier | NodeString | NodeCall;
102
+ class Parser {
103
+ private readonly tokens;
104
+ private pos;
105
+ constructor(tokens: readonly Token[]);
106
+ private parseExpression;
107
+ private parseArguments;
108
+ private match;
109
+ private peek;
110
+ private advance;
111
+ private expect;
112
+ parse(): Node;
113
+ }
114
+ enum ValueType {
115
+ String = "string",
116
+ Function = "function",
117
+ Nil = "nil",
118
+ Number = "number",
119
+ Boolean = "boolean",
120
+ Reuse = "reuse",
121
+ Table = "table"
122
+ }
123
+ interface ValueString {
124
+ type: ValueType.String;
125
+ value: string;
126
+ }
127
+ interface ValueFunction {
128
+ type: ValueType.Function;
129
+ value: (args: readonly Value[], env: Env) => Value;
130
+ }
131
+ interface ValueNil {
132
+ type: ValueType.Nil;
133
+ value: null;
134
+ }
135
+ interface ValueNumber {
136
+ type: ValueType.Number;
137
+ value: number;
138
+ }
139
+ interface ValueBoolean {
140
+ type: ValueType.Boolean;
141
+ value: boolean;
142
+ }
143
+ interface ValueReuse {
144
+ type: ValueType.Reuse;
145
+ value: Node;
146
+ }
147
+ interface ValueTable {
148
+ type: ValueType.Table;
149
+ value: Map<string | number, Value>;
150
+ }
151
+ type Value = ValueString | ValueFunction | ValueNil | ValueNumber | ValueBoolean | ValueReuse | ValueTable;
152
+ class Env {
153
+ readonly parent?: Env | undefined;
154
+ readonly args?: Value[] | undefined;
155
+ static globalEnv(): Env;
156
+ constructor(parent?: Env | undefined, args?: Value[] | undefined);
157
+ readonly values: Map<string, Value>;
158
+ has(name: string): boolean;
159
+ get(name: string): Value;
160
+ set(name: string, value: Value): void;
161
+ getArgs(): Value[];
162
+ }
163
+ class Interpreter {
164
+ evaluate(node: Node, env: Env): Value;
165
+ private evaluateBlock;
166
+ private evaluateFor;
167
+ private evaluateWhile;
168
+ static isTruthy(value?: Value): boolean;
169
+ private evaluateIfs;
170
+ private evaluateReuse;
171
+ private callReuse;
172
+ private evaluateCall;
173
+ }
174
+ function evaluate(input: string, overrideEnv?: Record<string, Value>): Value;
175
+ namespace Std {
176
+ function _assert<T>(value: T): NonNullable<T>;
177
+ function _asNumberValue(value: Value): ValueNumber;
178
+ function _asBooleanValue(value: Value): ValueBoolean;
179
+ function _asStringValue(value: Value): ValueString;
180
+ function _asNilValue(value: Value): ValueNil;
181
+ function _asFunctionValue(value: Value): ValueFunction;
182
+ function _asReuseValue(value: Value): ValueReuse;
183
+ function _asTableValue(value: Value): ValueTable;
184
+ function _noop(_args: readonly Value[], _env: Env): ValueNil;
185
+ const nil: ValueFunction;
186
+ function _assertValidNumber(value: number): number;
187
+ function _number(args: readonly Value[], _env: Env): ValueNumber;
188
+ const number: ValueFunction;
189
+ function _boolean(args: readonly Value[], _env: Env): ValueBoolean;
190
+ const boolean: ValueFunction;
191
+ function _string(args: readonly Value[], _env: Env): ValueString;
192
+ const string: ValueFunction;
193
+ const noop: ValueFunction;
194
+ const block: ValueFunction;
195
+ const forDo: ValueFunction;
196
+ const whileDo: ValueFunction;
197
+ const ifs: ValueFunction;
198
+ const reuse: ValueFunction;
199
+ function _toString(args: readonly Value[], _env: Env): ValueString;
200
+ const toString: ValueFunction;
201
+ function _type(args: readonly Value[], _env: Env): ValueString;
202
+ const type: ValueFunction;
203
+ function _print(args: readonly Value[], env: Env): ValueNil;
204
+ const print: ValueFunction;
205
+ function _id(args: readonly Value[], _env: Env): Value;
206
+ const id: ValueFunction;
207
+ function _toNumber(args: readonly Value[], env: Env): ValueNumber;
208
+ const toNumber: ValueFunction;
209
+ function _toBoolean(args: readonly Value[], _env: Env): ValueBoolean;
210
+ const toBoolean: ValueFunction;
211
+ function _toNil(_args: readonly Value[], _env: Env): ValueNil;
212
+ const toNil: ValueFunction;
213
+ function _stop(_args: readonly Value[], _env: Env): never;
214
+ const stop: ValueFunction;
215
+ function _lets(args: readonly Value[], env: Env): ValueNil;
216
+ const lets: ValueFunction;
217
+ function _env(args: readonly Value[], env: Env): ValueNil;
218
+ const env: ValueFunction;
219
+ function _lte(args: readonly Value[], _env: Env): ValueBoolean;
220
+ const lte: ValueFunction;
221
+ function _lt(args: readonly Value[], _env: Env): ValueBoolean;
222
+ const lt: ValueFunction;
223
+ function _gt(args: readonly Value[], _env: Env): ValueBoolean;
224
+ const gt: ValueFunction;
225
+ function _gte(args: readonly Value[], _env: Env): ValueBoolean;
226
+ const gte: ValueFunction;
227
+ function _add(args: readonly Value[], _env: Env): ValueNumber;
228
+ const add: ValueFunction;
229
+ function _and(args: readonly Value[], _env: Env): ValueBoolean;
230
+ const and: ValueFunction;
231
+ function _or(args: readonly Value[], _env: Env): ValueBoolean;
232
+ const or: ValueFunction;
233
+ function _not(args: readonly Value[], _env: Env): ValueBoolean;
234
+ const not: ValueFunction;
235
+ function _eq(args: readonly Value[], _env: Env): ValueBoolean;
236
+ const eq: ValueFunction;
237
+ function _neq(args: readonly Value[], _env: Env): ValueBoolean;
238
+ const neq: ValueFunction;
239
+ function _mod(args: readonly Value[], _env: Env): ValueNumber;
240
+ const mod: ValueFunction;
241
+ function _power(args: readonly Value[], _env: Env): ValueNumber;
242
+ const power: ValueFunction;
243
+ function _div(args: readonly Value[], _env: Env): ValueNumber;
244
+ const div: ValueFunction;
245
+ function _mul(args: readonly Value[], _env: Env): ValueNumber;
246
+ const mul: ValueFunction;
247
+ function _sub(args: readonly Value[], _env: Env): ValueNumber;
248
+ const sub: ValueFunction;
249
+ function _version(_args: readonly Value[], _env: Env): ValueString;
250
+ const version: ValueFunction;
251
+ function _concat(args: readonly Value[], _env: Env): ValueString;
252
+ const concat: ValueFunction;
253
+ function _escape(args: readonly Value[], _env: Env): ValueString;
254
+ const escape: ValueFunction;
255
+ function _quote(_args: readonly Value[], _env: Env): ValueString;
256
+ const quote: ValueFunction;
257
+ function _lenArr(args: readonly Value[], _env: Env): ValueNumber;
258
+ const lenArr: ValueFunction;
259
+ function _len(args: readonly Value[], env: Env): ValueNumber;
260
+ const len: ValueFunction;
261
+ function _random(_args: readonly Value[], _env: Env): ValueNumber;
262
+ const random: ValueFunction;
263
+ function _binAnd(args: readonly Value[], _env: Env): ValueNumber;
264
+ const binAnd: ValueFunction;
265
+ function _binOr(args: readonly Value[], _env: Env): ValueNumber;
266
+ const binOr: ValueFunction;
267
+ function _binXor(args: readonly Value[], _env: Env): ValueNumber;
268
+ const binXor: ValueFunction;
269
+ function _binLeftShift(args: readonly Value[], _env: Env): ValueNumber;
270
+ const binLeftShift: ValueFunction;
271
+ function _binRightShift(args: readonly Value[], _env: Env): ValueNumber;
272
+ const binRightShift: ValueFunction;
273
+ function _binUnsignedRightShift(args: readonly Value[], _env: Env): ValueNumber;
274
+ const binUnsignedRightShift: ValueFunction;
275
+ function _arg(args: readonly Value[], env: Env): Value;
276
+ const arg: ValueFunction;
277
+ function _table(_args: readonly Value[], _env: Env): ValueTable;
278
+ const table: ValueFunction;
279
+ function _get(args: readonly Value[], _env: Env): Value;
280
+ const get: ValueFunction;
281
+ function _set(args: readonly Value[], _env: Env): ValueNil;
282
+ const set: ValueFunction;
283
+ }
284
+ }
285
+
286
+ export { DelJS };
@@ -0,0 +1 @@
1
+ var DelJS=function(e){"use strict";var t="0.0.1";return e.default=void 0,function(e){let n,r,u,a,l,i;e.version=t,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=e.ErrorKind||(e.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(r=e.ErrorCode||(e.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:r}){super(e,null==t?{}:{cause:t}),this.code=r,this.kind=(()=>{for(const e of Object.values(n))if(r.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}e.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(u=e.TokenType||(e.TokenType={}));class s{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:r.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(s.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:r.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:u.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:r.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:u.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();s.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:u.Comma,value:null}),this.advance()):(e.push({type:u.RParen,value:null}),this.advance()):(e.push({type:u.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:u.EOF,value:null}),e}}e.Tokenizer=s,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(a=e.NodeType||(e.NodeType={}));class c{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:r.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===u.String)return this.advance(),{type:a.String,value:e.value};if(e.type===u.Identifier){this.advance();const t={type:a.Identifier,value:e.value};if(this.match(u.LParen)){const e=this.parseArguments();return{type:a.Call,value:{callee:t,args:e}}}return t}throw new o({code:r.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(u.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(u.Comma)){this.expect(u.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:r.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:r.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(u.EOF),e}}e.Parser=c,function(e){e.String="string",e.Function="function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=e.ValueType||(e.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(i))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}e.Env=p;class v{evaluate(e,t){switch(e.type){case a.String:return{type:l.String,value:e.value};case a.Identifier:return t.get(e.value);case a.Call:return this.evaluateCall(e,t);default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let r={type:l.Nil,value:null};for(const t of e.value.args)r=this.evaluate(t,n);return r}evaluateFor(e,t){const[n,u,a,i]=e.value.args;if(null==n||null==u||null==a||null==i)throw new o({code:r.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);this.evaluate(n,s);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(u,s);if(!v.isTruthy(e))break;c=this.evaluate(i,s),this.evaluate(a,s)}return c}evaluateWhile(e,t){const[n,u]=e.value.args;if(null==n||null==u)throw new o({code:r.InterpreterInvalidWhile,message:"Invalid while"});const a=new p(t);let i={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,a);if(!v.isTruthy(e))break;i=this.evaluate(u,a)}return i}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:r.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:r.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const r=this.evaluate(e.value.args[n],t);if(v.isTruthy(r))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,u]=e.value.args;if(null==n||null==u)throw new o({code:r.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==a.String)throw new o({code:r.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const i={type:l.Reuse,value:u};return t.set(n.value,i),{type:l.Nil,value:null}}callReuse(e,t,n){const r=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,r)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:r.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if("WhileDo"===e.value.callee.value)return this.evaluateWhile(e,t);if("ForDo"===e.value.callee.value)return this.evaluateFor(e,t);if("Block"===e.value.callee.value)return this.evaluateBlock(e,t);if("Reuse"===e.value.callee.value)return this.evaluateReuse(e,t);if("Ifs"===e.value.callee.value)return this.evaluateIfs(e,t);const u=e.value.args.map(e=>this.evaluate(e,t));return n.value(u,t)}}e.Interpreter=v,e.evaluate=function(e,t){const n=new s(e).tokenize(),r=new c(n).parse(),u=p.globalEnv();for(const[e,n]of Object.entries(t??{}))u.set(e,n);return(new v).evaluate(r,u)},function(e){function n(e){if(null==e)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function u(e){if(e.type!==l.Number)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function a(e){if(e.type!==l.Boolean)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function i(e){if(e.type!==l.String)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function s(e){if(e.type!==l.Table)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e,t){return{type:l.Nil,value:null}}function p(e){if(!Number.isFinite(e))throw new o({code:r.InterpreterRuntime,message:"Invalid number"});return e}function f(e,t){const{value:r}=i(n(e[0])),u=Number(r);return{type:l.Number,value:p(u)}}function h(e,t){const{value:u}=i(n(e[0]));switch(u){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:r.InterpreterRuntime,message:"Invalid boolean"})}}function y(e,t){const{value:r}=i(n(e[0]));return{type:l.String,value:r}}function d(e,t){const n=e[0];if(null==n)return{type:l.String,value:"(nil)"};switch(n.type){case l.String:return{type:l.String,value:n.value};case l.Function:return{type:l.String,value:"(function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(n.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function g(e,t){const r=n(e[0]);return{type:l.String,value:r.type}}function m(e,t){return console.info(d(e).value),{type:l.Nil,value:null}}function b(e,t){return n(e[0])}function w(e,t){const n=e[0];if(null==n)return{type:l.Number,value:0};switch(n.type){case l.String:try{return{type:l.Number,value:f([n]).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:n.value};case l.Boolean:return{type:l.Number,value:Number(n.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function I(e,t){return{type:l.Boolean,value:v.isTruthy(e[0])}}function F(e,t){return{type:l.Nil,value:null}}function N(e,t){throw new o({code:r.Stop,message:"Stop"})}function S(e,t){const r=i(n(e[0])).value,u=n(e[1]);return t.set(r,{type:l.Function,value:(e,t)=>u}),{type:l.Nil,value:null}}function _(e,t){const r=i(n(e[0])).value,u=n(e[1]);let a=t.parent;for(;a;)a.values.has(r)&&a.set(r,{type:l.Function,value:(e,t)=>u}),a=a.parent;return{type:l.Nil,value:null}}function k(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value<=a.value}}function R(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value<a.value}}function x(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value>a.value}}function T(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value>=a.value}}function U(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value+a.value)}}function B(e,t){const r=a(n(e[0])),u=a(n(e[1]));return{type:l.Boolean,value:r.value&&u.value}}function E(e,t){const r=a(n(e[0])),u=a(n(e[1]));return{type:l.Boolean,value:r.value||u.value}}function A(e,t){const r=a(n(e[0]));return{type:l.Boolean,value:!r.value}}function P(e,t){const r=n(e[0]),u=n(e[1]);return{type:l.Boolean,value:r.type===u.type&&r.value===u.value}}function z(e,t){const r=n(e[0]),u=n(e[1]);return{type:l.Boolean,value:!(r.type===u.type&&r.value===u.value)}}function C(e,t){const a=u(n(e[0])),i=u(n(e[1]));if(0===i.value)throw new o({code:r.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:p(a.value%i.value)}}function O(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value**a.value)}}function V(e,t){const a=u(n(e[0])),i=u(n(e[1]));if(0===i.value)throw new o({code:r.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:p(a.value/i.value)}}function W(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value*a.value)}}function D(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value-a.value)}}function L(e,n){return{type:l.String,value:t}}function q(e,t){const n=e.map(e=>i(e).value);return{type:l.String,value:n.join("")}}function $(e,t){const{value:r}=i(n(e[0]));switch(r){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:r}}}function j(e,t){return{type:l.String,value:'"'}}function M(e,t){const{value:r}=s(n(e[0]));let u=0;for(const e of r.keys())"number"==typeof e&&Number.isInteger(e)&&e>=0&&u++;return{type:l.Number,value:p(u)}}function K(e,t){const u=n(e[0]);switch(u.type){case l.String:return{type:l.Number,value:u.value.length};case l.Function:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:M([u]).value};default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function X(e,t){return{type:l.Number,value:Math.random()}}function J(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value&a.value)}}function G(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value|a.value)}}function H(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value^a.value)}}function Q(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value<<(31&a.value))}}function Y(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value>>(31&a.value))}}function Z(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value>>>0>>>(31&a.value))}}function ee(e,t){const r=u(n(e[0])).value;return t.getArgs()[r]??{type:l.Nil,value:null}}function te(e,t){return{type:l.Table,value:new Map}}function ne(e,t){const u=s(n(e[0])),a=n(e[1]);if(a.type!==l.String&&a.type!==l.Number)throw new o({code:r.InterpreterRuntime,message:"Table key must be string or number"});return u.value.get(a.value)??{type:l.Nil,value:null}}function re(e,t){const u=s(n(e[0])),a=n(e[1]),i=n(e[2]);if(a.type!==l.String&&a.type!==l.Number)throw new o({code:r.InterpreterRuntime,message:"Table key must be string or number"});return u.value.set(a.value,i),{type:l.Nil,value:null}}e._assert=n,e._asNumberValue=u,e._asBooleanValue=a,e._asStringValue=i,e._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},e._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},e._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},e._asTableValue=s,e._noop=c,e.nil={type:l.Function,value:c},e._assertValidNumber=p,e._number=f,e.number={type:l.Function,value:f},e._boolean=h,e.boolean={type:l.Function,value:h},e._string=y,e.string={type:l.Function,value:y},e.noop={type:l.Function,value:c},e.block={type:l.Function,value:c},e.forDo={type:l.Function,value:c},e.whileDo={type:l.Function,value:c},e.ifs={type:l.Function,value:c},e.reuse={type:l.Function,value:c},e._toString=d,e.toString={type:l.Function,value:d},e._type=g,e.type={type:l.Function,value:g},e._print=m,e.print={type:l.Function,value:m},e._id=b,e.id={type:l.Function,value:b},e._toNumber=w,e.toNumber={type:l.Function,value:w},e._toBoolean=I,e.toBoolean={type:l.Function,value:I},e._toNil=F,e.toNil={type:l.Function,value:F},e._stop=N,e.stop={type:l.Function,value:N},e._lets=S,e.lets={type:l.Function,value:S},e._env=_,e.env={type:l.Function,value:_},e._lte=k,e.lte={type:l.Function,value:k},e._lt=R,e.lt={type:l.Function,value:R},e._gt=x,e.gt={type:l.Function,value:x},e._gte=T,e.gte={type:l.Function,value:T},e._add=U,e.add={type:l.Function,value:U},e._and=B,e.and={type:l.Function,value:B},e._or=E,e.or={type:l.Function,value:E},e._not=A,e.not={type:l.Function,value:A},e._eq=P,e.eq={type:l.Function,value:P},e._neq=z,e.neq={type:l.Function,value:z},e._mod=C,e.mod={type:l.Function,value:C},e._power=O,e.power={type:l.Function,value:O},e._div=V,e.div={type:l.Function,value:V},e._mul=W,e.mul={type:l.Function,value:W},e._sub=D,e.sub={type:l.Function,value:D},e._version=L,e.version={type:l.Function,value:L},e._concat=q,e.concat={type:l.Function,value:q},e._escape=$,e.escape={type:l.Function,value:$},e._quote=j,e.quote={type:l.Function,value:j},e._lenArr=M,e.lenArr={type:l.Function,value:M},e._len=K,e.len={type:l.Function,value:K},e._random=X,e.random={type:l.Function,value:X},e._binAnd=J,e.binAnd={type:l.Function,value:J},e._binOr=G,e.binOr={type:l.Function,value:G},e._binXor=H,e.binXor={type:l.Function,value:H},e._binLeftShift=Q,e.binLeftShift={type:l.Function,value:Q},e._binRightShift=Y,e.binRightShift={type:l.Function,value:Y},e._binUnsignedRightShift=Z,e.binUnsignedRightShift={type:l.Function,value:Z},e._arg=ee,e.arg={type:l.Function,value:ee},e._table=te,e.table={type:l.Function,value:te},e._get=ne,e.get={type:l.Function,value:ne},e._set=re,e.set={type:l.Function,value:re}}(i=e.Std||(e.Std={}))}(e.default||(e.default={})),e.default}({});
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ var e,t="0.0.1";!function(e){let n,r,u,a,l,i;e.version=t,function(e){e.Tokenizer="tokenizer",e.Parser="parser",e.Interpreter="interpreter",e.Stop="stop"}(n=e.ErrorKind||(e.ErrorKind={})),function(e){e.TokenizerInvalidPeek="tokenizer-invalid-peek",e.TokenizerUnexpectedCharacter="tokenizer-unexpected-character",e.TokenizerUnterminatedStringLiteral="tokenizer-unterminated-string-literal",e.ParserInvalidAdvance="parser-invalid-advance",e.ParserUnexpectedEndOfInput="parser-unexpected-end-of-input",e.ParserUnexpectedTokenInExpression="parser-unexpected-token-in-expression",e.ParserUnexpectedToken="parser-unexpected-token",e.InterpreterUnreachable="interpreter-unreachable",e.InterpreterCalledNotFunction="interpreter-called-not-function",e.InterpreterInvalidFor="interpreter-invalid-for",e.InterpreterInvalidWhile="interpreter-invalid-while",e.InterpreterInvalidIfs="interpreter-invalid-ifs",e.InterpreterInvalidReuse="interpreter-invalid-reuse",e.InterpreterRuntime="interpreter-runtime",e.Stop="stop"}(r=e.ErrorCode||(e.ErrorCode={}));class o extends Error{code;kind;constructor({message:e,cause:t,code:r}){super(e,null==t?{}:{cause:t}),this.code=r,this.kind=(()=>{for(const e of Object.values(n))if(r.startsWith(e))return e;return n.Interpreter})(),this.name="DelError"}}e.DelError=o,function(e){e.Identifier="identifier",e.String="string",e.Comma="comma",e.LParen="lparen",e.RParen="rparen",e.EOF="eof"}(u=e.TokenType||(e.TokenType={}));class s{input;pos=0;constructor(e){this.input=e}static isWhitespace(e){return" "===e||"\n"===e||"\t"===e||"\r"===e}peek(){const e=this.input[this.pos];if(null==e)throw new o({code:r.TokenizerInvalidPeek,message:"Invalid peek"});return e}advance(){this.pos++}isEOF(){return this.pos>=this.input.length}readIdentifier(){let e="";for(;!this.isEOF();){const t=this.peek();if(s.isWhitespace(t)||"("===t||")"===t||'"'===t)break;e+=t,this.advance()}if(0===e.length)throw new o({code:r.TokenizerUnexpectedCharacter,message:`Unexpected character: ${this.peek()}`});return{type:u.Identifier,value:e}}readString(){this.advance();let e="";for(;!this.isEOF()&&'"'!==this.peek();){e+=this.peek(),this.advance()}if('"'!==this.peek())throw new o({code:r.TokenizerUnterminatedStringLiteral,message:"Unterminated string literal"});return this.advance(),{type:u.String,value:e}}tokenize(){const e=[];for(;!this.isEOF();){const t=this.peek();s.isWhitespace(t)?this.advance():'"'!==t?"("!==t?")"!==t?","!==t?e.push(this.readIdentifier()):(e.push({type:u.Comma,value:null}),this.advance()):(e.push({type:u.RParen,value:null}),this.advance()):(e.push({type:u.LParen,value:null}),this.advance()):e.push(this.readString())}return e.push({type:u.EOF,value:null}),e}}e.Tokenizer=s,function(e){e.Identifier="identifier",e.String="string",e.Call="call"}(a=e.NodeType||(e.NodeType={}));class c{tokens;pos=0;constructor(e){this.tokens=e}parseExpression(){const e=this.peek();if(null==e)throw new o({code:r.ParserUnexpectedEndOfInput,message:"Unexpected end of input"});if(e.type===u.String)return this.advance(),{type:a.String,value:e.value};if(e.type===u.Identifier){this.advance();const t={type:a.Identifier,value:e.value};if(this.match(u.LParen)){const e=this.parseArguments();return{type:a.Call,value:{callee:t,args:e}}}return t}throw new o({code:r.ParserUnexpectedTokenInExpression,message:`Unexpected token: ${e.type}`})}parseArguments(){const e=[];if(this.match(u.RParen))return e;for(;;)if(e.push(this.parseExpression()),!this.match(u.Comma)){this.expect(u.RParen);break}return e}match(e){return this.peek()?.type===e&&(this.advance(),!0)}peek(){return this.tokens[this.pos]}advance(){const e=this.tokens[this.pos++];if(null==e)throw new o({code:r.ParserInvalidAdvance,message:"Invalid advance"});return e}expect(e){const t=this.peek();if(t?.type!==e)throw new o({code:r.ParserUnexpectedToken,message:`Expected ${e}, got ${t?.type??"nothing"}`});return this.advance()}parse(){const e=this.parseExpression();return this.expect(u.EOF),e}}e.Parser=c,function(e){e.String="string",e.Function="function",e.Nil="nil",e.Number="number",e.Boolean="boolean",e.Reuse="reuse",e.Table="table"}(l=e.ValueType||(e.ValueType={}));class p{parent;args;static globalEnv(){const e=new p;for(const[t,n]of Object.entries(i))t.startsWith("_")||"function"==typeof n||e.set(t.charAt(0).toUpperCase()+t.slice(1),n);return e}constructor(e,t){this.parent=e,this.args=t}values=new Map;has(e){return!!this.values.has(e)||null!=this.parent&&this.parent.has(e)}get(e){return this.values.has(e)?this.values.get(e):null!=this.parent?this.parent.get(e):{type:l.Nil,value:null}}set(e,t){this.values.set(e,t)}getArgs(){return null!=this.args?this.args:null!=this.parent?this.parent.getArgs():[]}}e.Env=p;class v{evaluate(e,t){switch(e.type){case a.String:return{type:l.String,value:e.value};case a.Identifier:return t.get(e.value);case a.Call:return this.evaluateCall(e,t);default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! node.type"})}}evaluateBlock(e,t){const n=new p(t);let r={type:l.Nil,value:null};for(const t of e.value.args)r=this.evaluate(t,n);return r}evaluateFor(e,t){const[n,u,a,i]=e.value.args;if(null==n||null==u||null==a||null==i)throw new o({code:r.InterpreterInvalidFor,message:"Invalid for"});const s=new p(t);this.evaluate(n,s);let c={type:l.Nil,value:null};for(;;){const e=this.evaluate(u,s);if(!v.isTruthy(e))break;c=this.evaluate(i,s),this.evaluate(a,s)}return c}evaluateWhile(e,t){const[n,u]=e.value.args;if(null==n||null==u)throw new o({code:r.InterpreterInvalidWhile,message:"Invalid while"});const a=new p(t);let i={type:l.Nil,value:null};for(;;){const e=this.evaluate(n,a);if(!v.isTruthy(e))break;i=this.evaluate(u,a)}return i}static isTruthy(e){if(null==e)return!1;switch(e.type){case l.String:return Boolean(e.value);case l.Function:return!0;case l.Nil:return!1;case l.Number:return Boolean(e.value);case l.Boolean:return e.value;case l.Reuse:case l.Table:return!0;default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}evaluateIfs(e,t){if(e.value.args.length<3)throw new o({code:r.InterpreterInvalidIfs,message:"ifs expects at least 3 arguments"});if(e.value.args.length%2==0)throw new o({code:r.InterpreterInvalidIfs,message:"Ifs expects odd number of arguments"});for(let n=0;n<e.value.args.length-1;n+=2){const r=this.evaluate(e.value.args[n],t);if(v.isTruthy(r))return this.evaluate(e.value.args[n+1],t)}return this.evaluate(e.value.args.at(-1),t)}evaluateReuse(e,t){const[n,u]=e.value.args;if(null==n||null==u)throw new o({code:r.InterpreterInvalidReuse,message:"Invalid reuse"});if(n.type!==a.String)throw new o({code:r.InterpreterInvalidReuse,message:"Invalid reuse, name must be string"});const i={type:l.Reuse,value:u};return t.set(n.value,i),{type:l.Nil,value:null}}callReuse(e,t,n){const r=new p(n,t.map(e=>this.evaluate(e,n)));return this.evaluate(e.value,r)}evaluateCall(e,t){const n=t.get(e.value.callee.value);if(n.type===l.Reuse)return this.callReuse(n,e.value.args,t);if(n.type!==l.Function)throw new o({code:r.InterpreterCalledNotFunction,message:`${e.value.callee.value} is not a function`});if("WhileDo"===e.value.callee.value)return this.evaluateWhile(e,t);if("ForDo"===e.value.callee.value)return this.evaluateFor(e,t);if("Block"===e.value.callee.value)return this.evaluateBlock(e,t);if("Reuse"===e.value.callee.value)return this.evaluateReuse(e,t);if("Ifs"===e.value.callee.value)return this.evaluateIfs(e,t);const u=e.value.args.map(e=>this.evaluate(e,t));return n.value(u,t)}}e.Interpreter=v,e.evaluate=function(e,t){const n=new s(e).tokenize(),r=new c(n).parse(),u=p.globalEnv();for(const[e,n]of Object.entries(t??{}))u.set(e,n);return(new v).evaluate(r,u)},function(e){function n(e){if(null==e)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be defined!"});return e}function u(e){if(e.type!==l.Number)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be number!"});return e}function a(e){if(e.type!==l.Boolean)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be boolean!"});return e}function i(e){if(e.type!==l.String)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be string!"});return e}function s(e){if(e.type!==l.Table)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be table!"});return e}function c(e,t){return{type:l.Nil,value:null}}function p(e){if(!Number.isFinite(e))throw new o({code:r.InterpreterRuntime,message:"Invalid number"});return e}function h(e,t){const{value:r}=i(n(e[0])),u=Number(r);return{type:l.Number,value:p(u)}}function f(e,t){const{value:u}=i(n(e[0]));switch(u){case"true":return{type:l.Boolean,value:!0};case"false":return{type:l.Boolean,value:!1};default:throw new o({code:r.InterpreterRuntime,message:"Invalid boolean"})}}function y(e,t){const{value:r}=i(n(e[0]));return{type:l.String,value:r}}function d(e,t){const n=e[0];if(null==n)return{type:l.String,value:"(nil)"};switch(n.type){case l.String:return{type:l.String,value:n.value};case l.Function:return{type:l.String,value:"(function)"};case l.Nil:return{type:l.String,value:"(nil)"};case l.Number:case l.Boolean:return{type:l.String,value:String(n.value)};case l.Reuse:return{type:l.String,value:"(reuse)"};case l.Table:return{type:l.String,value:"(table)"};default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function g(e,t){const r=n(e[0]);return{type:l.String,value:r.type}}function m(e,t){return console.info(d(e).value),{type:l.Nil,value:null}}function b(e,t){return n(e[0])}function w(e,t){const n=e[0];if(null==n)return{type:l.Number,value:0};switch(n.type){case l.String:try{return{type:l.Number,value:h([n]).value}}catch{return{type:l.Number,value:0}}case l.Function:case l.Nil:return{type:l.Number,value:0};case l.Number:return{type:l.Number,value:n.value};case l.Boolean:return{type:l.Number,value:Number(n.value)};case l.Reuse:case l.Table:return{type:l.Number,value:0};default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function I(e,t){return{type:l.Boolean,value:v.isTruthy(e[0])}}function F(e,t){return{type:l.Nil,value:null}}function N(e,t){throw new o({code:r.Stop,message:"Stop"})}function _(e,t){const r=i(n(e[0])).value,u=n(e[1]);return t.set(r,{type:l.Function,value:(e,t)=>u}),{type:l.Nil,value:null}}function k(e,t){const r=i(n(e[0])).value,u=n(e[1]);let a=t.parent;for(;a;)a.values.has(r)&&a.set(r,{type:l.Function,value:(e,t)=>u}),a=a.parent;return{type:l.Nil,value:null}}function S(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value<=a.value}}function R(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value<a.value}}function x(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value>a.value}}function T(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Boolean,value:r.value>=a.value}}function U(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value+a.value)}}function B(e,t){const r=a(n(e[0])),u=a(n(e[1]));return{type:l.Boolean,value:r.value&&u.value}}function E(e,t){const r=a(n(e[0])),u=a(n(e[1]));return{type:l.Boolean,value:r.value||u.value}}function A(e,t){const r=a(n(e[0]));return{type:l.Boolean,value:!r.value}}function P(e,t){const r=n(e[0]),u=n(e[1]);return{type:l.Boolean,value:r.type===u.type&&r.value===u.value}}function z(e,t){const r=n(e[0]),u=n(e[1]);return{type:l.Boolean,value:!(r.type===u.type&&r.value===u.value)}}function C(e,t){const a=u(n(e[0])),i=u(n(e[1]));if(0===i.value)throw new o({code:r.InterpreterRuntime,message:"Mod by zero"});return{type:l.Number,value:p(a.value%i.value)}}function O(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value**a.value)}}function V(e,t){const a=u(n(e[0])),i=u(n(e[1]));if(0===i.value)throw new o({code:r.InterpreterRuntime,message:"Division by zero"});return{type:l.Number,value:p(a.value/i.value)}}function W(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value*a.value)}}function D(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value-a.value)}}function L(e,n){return{type:l.String,value:t}}function q(e,t){const n=e.map(e=>i(e).value);return{type:l.String,value:n.join("")}}function $(e,t){const{value:r}=i(n(e[0]));switch(r){case"n":return{type:l.String,value:"\n"};case"t":return{type:l.String,value:"\t"};case"r":return{type:l.String,value:"\r"};case"b":return{type:l.String,value:"\b"};case"f":return{type:l.String,value:"\f"};case"v":return{type:l.String,value:"\v"};default:return{type:l.String,value:r}}}function j(e,t){return{type:l.String,value:'"'}}function M(e,t){const{value:r}=s(n(e[0]));let u=0;for(const e of r.keys())"number"==typeof e&&Number.isInteger(e)&&e>=0&&u++;return{type:l.Number,value:p(u)}}function K(e,t){const u=n(e[0]);switch(u.type){case l.String:return{type:l.Number,value:u.value.length};case l.Function:case l.Nil:case l.Number:case l.Boolean:case l.Reuse:return{type:l.Number,value:0};case l.Table:return{type:l.Number,value:M([u]).value};default:throw new o({code:r.InterpreterUnreachable,message:"Unreachable! value.type"})}}function X(e,t){return{type:l.Number,value:Math.random()}}function G(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value&a.value)}}function H(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value|a.value)}}function J(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value^a.value)}}function Q(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value<<(31&a.value))}}function Y(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value>>(31&a.value))}}function Z(e,t){const r=u(n(e[0])),a=u(n(e[1]));return{type:l.Number,value:p(r.value>>>0>>>(31&a.value))}}function ee(e,t){const r=u(n(e[0])).value;return t.getArgs()[r]??{type:l.Nil,value:null}}function te(e,t){return{type:l.Table,value:new Map}}function ne(e,t){const u=s(n(e[0])),a=n(e[1]);if(a.type!==l.String&&a.type!==l.Number)throw new o({code:r.InterpreterRuntime,message:"Table key must be string or number"});return u.value.get(a.value)??{type:l.Nil,value:null}}function re(e,t){const u=s(n(e[0])),a=n(e[1]),i=n(e[2]);if(a.type!==l.String&&a.type!==l.Number)throw new o({code:r.InterpreterRuntime,message:"Table key must be string or number"});return u.value.set(a.value,i),{type:l.Nil,value:null}}e._assert=n,e._asNumberValue=u,e._asBooleanValue=a,e._asStringValue=i,e._asNilValue=function(e){if(e.type!==l.Nil)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be nil!"});return e},e._asFunctionValue=function(e){if(e.type!==l.Function)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be function!"});return e},e._asReuseValue=function(e){if(e.type!==l.Reuse)throw new o({code:r.InterpreterRuntime,message:"Assertion failed, value expected to be reuse!"});return e},e._asTableValue=s,e._noop=c,e.nil={type:l.Function,value:c},e._assertValidNumber=p,e._number=h,e.number={type:l.Function,value:h},e._boolean=f,e.boolean={type:l.Function,value:f},e._string=y,e.string={type:l.Function,value:y},e.noop={type:l.Function,value:c},e.block={type:l.Function,value:c},e.forDo={type:l.Function,value:c},e.whileDo={type:l.Function,value:c},e.ifs={type:l.Function,value:c},e.reuse={type:l.Function,value:c},e._toString=d,e.toString={type:l.Function,value:d},e._type=g,e.type={type:l.Function,value:g},e._print=m,e.print={type:l.Function,value:m},e._id=b,e.id={type:l.Function,value:b},e._toNumber=w,e.toNumber={type:l.Function,value:w},e._toBoolean=I,e.toBoolean={type:l.Function,value:I},e._toNil=F,e.toNil={type:l.Function,value:F},e._stop=N,e.stop={type:l.Function,value:N},e._lets=_,e.lets={type:l.Function,value:_},e._env=k,e.env={type:l.Function,value:k},e._lte=S,e.lte={type:l.Function,value:S},e._lt=R,e.lt={type:l.Function,value:R},e._gt=x,e.gt={type:l.Function,value:x},e._gte=T,e.gte={type:l.Function,value:T},e._add=U,e.add={type:l.Function,value:U},e._and=B,e.and={type:l.Function,value:B},e._or=E,e.or={type:l.Function,value:E},e._not=A,e.not={type:l.Function,value:A},e._eq=P,e.eq={type:l.Function,value:P},e._neq=z,e.neq={type:l.Function,value:z},e._mod=C,e.mod={type:l.Function,value:C},e._power=O,e.power={type:l.Function,value:O},e._div=V,e.div={type:l.Function,value:V},e._mul=W,e.mul={type:l.Function,value:W},e._sub=D,e.sub={type:l.Function,value:D},e._version=L,e.version={type:l.Function,value:L},e._concat=q,e.concat={type:l.Function,value:q},e._escape=$,e.escape={type:l.Function,value:$},e._quote=j,e.quote={type:l.Function,value:j},e._lenArr=M,e.lenArr={type:l.Function,value:M},e._len=K,e.len={type:l.Function,value:K},e._random=X,e.random={type:l.Function,value:X},e._binAnd=G,e.binAnd={type:l.Function,value:G},e._binOr=H,e.binOr={type:l.Function,value:H},e._binXor=J,e.binXor={type:l.Function,value:J},e._binLeftShift=Q,e.binLeftShift={type:l.Function,value:Q},e._binRightShift=Y,e.binRightShift={type:l.Function,value:Y},e._binUnsignedRightShift=Z,e.binUnsignedRightShift={type:l.Function,value:Z},e._arg=ee,e.arg={type:l.Function,value:ee},e._table=te,e.table={type:l.Function,value:te},e._get=ne,e.get={type:l.Function,value:ne},e._set=re,e.set={type:l.Function,value:re}}(i=e.Std||(e.Std={}))}(e||(e={}));export{e as DelJS};
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "del-js-lang",
3
+ "version": "0.0.1",
4
+ "author": {
5
+ "name": "Ivan Polushin",
6
+ "url": "https://t.me/polioan"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/polioan/del-js"
11
+ },
12
+ "homepage": "https://github.com/polioan/del-js#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/polioan/del-js/issues"
15
+ },
16
+ "funding": "https://boosty.to/polioan",
17
+ "keywords": [
18
+ "language"
19
+ ],
20
+ "description": "Dumb expression language",
21
+ "license": "MIT",
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "main": "dist/index.cjs",
26
+ "module": "dist/index.mjs",
27
+ "types": "dist/index.d.ts",
28
+ "files": [
29
+ "dist",
30
+ "package.json",
31
+ "LICENSE",
32
+ "README.md"
33
+ ],
34
+ "scripts": {
35
+ "prebuild": "rimraf dist",
36
+ "build": "cross-env NODE_ENV=production rollup --config rollup.config.mjs",
37
+ "format": "prettier --check .",
38
+ "lint": "eslint .",
39
+ "test:types": "tsc --noEmit",
40
+ "test:unit": "vitest",
41
+ "test": "npm run test:types && npm run test:unit",
42
+ "publish:dryrun": "npm publish --dry-run",
43
+ "check": "npm run build && npm run test && npm run lint && npm run format && npm run publish:dryrun"
44
+ },
45
+ "devDependencies": {
46
+ "@rollup/plugin-json": "^6.1.0",
47
+ "@rollup/plugin-replace": "^6.0.3",
48
+ "@rollup/plugin-terser": "^0.4.4",
49
+ "@rollup/plugin-typescript": "^12.3.0",
50
+ "@types/node": "^25.0.9",
51
+ "cross-env": "^10.1.0",
52
+ "eslint": "^9.39.2",
53
+ "eslint-config-polioan": "^2.0.1",
54
+ "prettier": "^3.5.2",
55
+ "prettier-plugin-jsdoc": "^1.3.2",
56
+ "rimraf": "^6.1.2",
57
+ "rollup": "^4.55.1",
58
+ "rollup-plugin-dts": "^6.3.0",
59
+ "tslib": "^2.8.1",
60
+ "tsx": "^4.21.0",
61
+ "typescript": "^5.9.3",
62
+ "vite": "^7.3.1",
63
+ "vitest": "^4.0.17"
64
+ }
65
+ }