rip-lang 2.8.7 → 2.8.9
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/README.md +1 -1
- package/docs/GUIDE.md +14 -1
- package/docs/dist/rip.browser.js +7 -2
- package/docs/dist/rip.browser.min.js +3 -3
- package/docs/dist/rip.browser.min.js.br +0 -0
- package/package.json +1 -1
- package/src/compiler.js +4 -1
- package/src/lexer.js +5 -0
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-2.8.
|
|
12
|
+
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-2.8.8-blue.svg" alt="Version"></a>
|
|
13
13
|
<a href="#zero-dependencies"><img src="https://img.shields.io/badge/dependencies-ZERO-brightgreen.svg" alt="Dependencies"></a>
|
|
14
14
|
<a href="#"><img src="https://img.shields.io/badge/tests-1098%2F1098-brightgreen.svg" alt="Tests"></a>
|
|
15
15
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"></a>
|
package/docs/GUIDE.md
CHANGED
|
@@ -86,7 +86,7 @@ count := 0
|
|
|
86
86
|
logger ~> console.log count
|
|
87
87
|
|
|
88
88
|
logger.stop! # Pause reactions
|
|
89
|
-
logger.run! # Resume reactions
|
|
89
|
+
logger.run! # Resume reactions
|
|
90
90
|
logger.cancel! # Permanent disposal
|
|
91
91
|
```
|
|
92
92
|
|
|
@@ -443,10 +443,23 @@ status = active ? 'on' : 'off'
|
|
|
443
443
|
# CoffeeScript style
|
|
444
444
|
status = if active then 'on' else 'off'
|
|
445
445
|
|
|
446
|
+
# Works with property access, function calls, expressions
|
|
447
|
+
result = valid ? obj.field : null
|
|
448
|
+
output = ready ? compute() : fallback
|
|
449
|
+
value = x > 0 ? x + 1 : 0
|
|
450
|
+
|
|
446
451
|
# Nested
|
|
447
452
|
level = score > 90 ? 'A' : score > 80 ? 'B' : score > 70 ? 'C' : 'F'
|
|
448
453
|
```
|
|
449
454
|
|
|
455
|
+
**Note:** Subscript access in the true branch needs parentheses:
|
|
456
|
+
|
|
457
|
+
```coffee
|
|
458
|
+
# Wrap subscript in parens
|
|
459
|
+
item = found ? (arr[0]) : default
|
|
460
|
+
value = valid ? (data[key]) : null
|
|
461
|
+
```
|
|
462
|
+
|
|
450
463
|
**Why possible:** By using `??` for nullish, `?` became available for ternary.
|
|
451
464
|
|
|
452
465
|
## Otherwise Operator (`!?`)
|
package/docs/dist/rip.browser.js
CHANGED
|
@@ -339,6 +339,9 @@ ${code}`;
|
|
|
339
339
|
return sup.length + 3;
|
|
340
340
|
}
|
|
341
341
|
prev = this.prev();
|
|
342
|
+
if (colon && prev && prev[0] === "SPACE?") {
|
|
343
|
+
colon = null;
|
|
344
|
+
}
|
|
342
345
|
tag = colon || prev != null && ((ref5 = prev[0]) === "." || ref5 === "?." || ref5 === "::" || ref5 === "?::" || !prev.spaced && prev[0] === "@") ? "PROPERTY" : "IDENTIFIER";
|
|
343
346
|
tokenData = {};
|
|
344
347
|
if (tag === "IDENTIFIER" && (indexOf.call(JS_KEYWORDS, id) >= 0 || indexOf.call(RIP_KEYWORDS, id) >= 0) && !(this.exportSpecifierList && indexOf.call(RIP_KEYWORDS, id) >= 0)) {
|
|
@@ -5215,6 +5218,8 @@ ${this.indent()}}`;
|
|
|
5215
5218
|
if (Array.isArray(key2) && key2[0] === "dynamicKey") {
|
|
5216
5219
|
const expr = key2[1];
|
|
5217
5220
|
keyCode = `[${this.generate(expr, "value")}]`;
|
|
5221
|
+
} else if (Array.isArray(key2) && key2[0] === "str") {
|
|
5222
|
+
keyCode = `[${this.generate(key2, "value")}]`;
|
|
5218
5223
|
} else {
|
|
5219
5224
|
keyCode = this.generate(key2, "value");
|
|
5220
5225
|
}
|
|
@@ -7627,8 +7632,8 @@ function compileToJS(source, options = {}) {
|
|
|
7627
7632
|
return new Compiler(options).compileToJS(source);
|
|
7628
7633
|
}
|
|
7629
7634
|
// src/browser.js
|
|
7630
|
-
var VERSION = "2.8.
|
|
7631
|
-
var BUILD_DATE = "2026-02-
|
|
7635
|
+
var VERSION = "2.8.9";
|
|
7636
|
+
var BUILD_DATE = "2026-02-06@03:14:34GMT";
|
|
7632
7637
|
var dedent = (s) => {
|
|
7633
7638
|
const m = s.match(/^[ \t]*(?=\S)/gm);
|
|
7634
7639
|
const i = Math.min(...(m || []).map((x) => x.length));
|
|
@@ -2,7 +2,7 @@ var j1,R2,c2,F1,K1,A2,_2,l2,E2,V1,b1,n,y1,k,m,U2,$2,X2,Y2,F2,G2,M2,Z2,u1,J2,g1,v
|
|
|
2
2
|
`)[$],U=_,Y=$===E?X+1:A.length,F=A.slice(0,U).replace(/[^\s]/g," ")+x2("^",Y-U),G=typeof process<"u"&&process!==null&&process.stdout?.isTTY&&!process.env?.NODE_DISABLE_COLORS;if(this.colorful!=null?this.colorful:G){var Z=(M)=>`\x1B[1;31m${M}\x1B[0m`;A=A.slice(0,U)+Z(A.slice(U,Y))+A.slice(Y),F=Z(F)}return`${R}:${$+1}:${_+1}: error: ${this.message}
|
|
3
3
|
${A}
|
|
4
4
|
${F}`},a2=function($,_){var E=SyntaxError($);throw E.location=_,E.toString=n2,E.stack=E.toString(),E},o2=/(\\\\)|\\u\{([\da-fA-F]+)\}/g,t2=function($){var _=function(R){var A=R.toString(16);return`\\u${x2("0",4-A.length)}${A}`};if($<65536)return _($);var E=Math.floor(($-65536)/1024)+55296,X=($-65536)%1024+56320;return`${_(E)}${_(X)}`},e2=function($,{flags:_,error:E,delimiter:X=""}={}){var R=_!=null&&I.call(_,"u")<0;return $.replace(o2,function(A,U,Y,F){if(U)return U;var G=parseInt(Y,16);if(G>1114111)E("unicode code point escapes greater than \\u{10ffff} are not allowed",{offset:F+X.length,length:Y.length+4});if(!R)return A;return t2(G)})},m1=class ${constructor(){this.error=this.error.bind(this)}tokenize(_,E={}){var X,R,A,U;this.indent=0,this.baseIndent=0,this.overIndent=0,this.outdebt=0,this.indents=[],this.indentLiteral="",this.ends=[],this.tokens=[],this.seenFor=!1,this.seenImport=!1,this.seenExport=!1,this.importSpecifierList=!1,this.exportSpecifierList=!1,this.chunkLine=E.line||0,this.chunkColumn=E.column||0,this.chunkOffset=E.offset||0,this.locTweaks=E.locTweaks||{},_=this.clean(_),A=0;while(this.chunk=_.slice(A))if(X=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.regexToken()||this.jsToken()||this.literalToken(),[this.chunkLine,this.chunkColumn,this.chunkOffset]=this.getLineAndColumnFromChunk(X),A+=X,E.untilBalanced&&this.ends.length===0)return{tokens:this.tokens,index:A};if(this.closeIndentation(),R=this.ends.pop())this.error(`missing ${R.tag}`,((U=R.origin)!=null?U:R)[2]);if(E.rewrite===!1)return this.tokens;return new w2().rewrite(this.tokens)}clean(_){var E,X;if(X=0,_.charCodeAt(0)===R2)_=_.slice(1),this.locTweaks[0]=1,X+=1;if(h1.test(_)){if(_=`
|
|
5
|
-
${_}`,this.chunkLine--,(E=this.locTweaks)[0]==null)E[0]=0;this.locTweaks[0]-=1}return _.replace(/\r/g,(R,A)=>{return this.locTweaks[X+A]=1,""}).replace(f2,"")}identifierToken(){var _,E,X,R,A,U,Y,F,G,Z,M,D,Q,J,K,q,N,W,z,H,O,S,T,B,L,j,w,P,V,v;if(/^~[=>]/.test(this.chunk)||/^=!/.test(this.chunk))return 0;if(!(G=Z2.exec(this.chunk)))return 0;if([F,U,X]=G,Y=U.length,Z=void 0,U==="own"&&this.tag()==="FOR")return this.token("OWN",U),U.length;if(U==="from"&&this.tag()==="YIELD")return this.token("FROM",U),U.length;if(U==="as"&&this.seenImport){if(this.value()==="*")this.tokens[this.tokens.length-1][0]="IMPORT_ALL";else if(Q=this.value(!0),I.call(i,Q)>=0)M=this.prev(),[M[0],M[1]]=["IDENTIFIER",this.value(!0)];if((J=this.tag())==="DEFAULT"||J==="IMPORT_ALL"||J==="IDENTIFIER")return this.token("AS",U),U.length}if(U==="as"&&this.seenExport){if((W=this.tag())==="IDENTIFIER"||W==="DEFAULT")return this.token("AS",U),U.length;if(z=this.value(!0),I.call(i,z)>=0)return M=this.prev(),[M[0],M[1]]=["IDENTIFIER",this.value(!0)],this.token("AS",U),U.length}if(U==="default"&&this.seenExport&&((H=this.tag())==="EXPORT"||H==="AS"))return this.token("DEFAULT",U),U.length;if(U==="do"&&(j=/^(\s*super)(?!\(\))/.exec(this.chunk.slice(3))))return this.token("SUPER","super"),this.token("CALL_START","("),this.token("CALL_END",")"),[F,w]=j,w.length+3;if(M=this.prev(),P=X||M!=null&&((O=M[0])==="."||O==="?."||O==="::"||O==="?::"||!M.spaced&&M[0]==="@")?"PROPERTY":"IDENTIFIER",v={},P==="IDENTIFIER"&&(I.call(N1,U)>=0||I.call(i,U)>=0)&&!(this.exportSpecifierList&&I.call(i,U)>=0)){if(P=U.toUpperCase(),P==="WHEN"&&(S=this.tag(),I.call(W2,S)>=0))P="LEADING_WHEN";else if(P==="FOR")this.seenFor={endsLength:this.ends.length};else if(P==="UNLESS");else if(P==="IMPORT")this.seenImport=!0;else if(P==="EXPORT")this.seenExport=!0;else if(I.call(f1,P)>=0)P="UNARY";else if(I.call(I2,P)>=0){if(P!=="INSTANCEOF"&&this.seenFor)P="FOR"+P,this.seenFor=!1;else if(P="RELATION",this.value()==="!")Z=this.tokens.pop(),v.invert=(T=(B=Z.data)!=null?B.original:void 0)!=null?T:Z[1]}}else if(P==="IDENTIFIER"&&this.seenFor&&U==="from"&&g2(M))P="FORFROM",this.seenFor=!1;else if(P==="PROPERTY"&&M){if(M.spaced&&(L=M[0],I.call(F1,L)>=0)&&/^[gs]et$/.test(M[1])&&this.tokens.length>1&&((K=this.tokens[this.tokens.length-2][0])!=="."&&K!=="?."&&K!=="@"))this.error(`'${M[1]}' cannot be used as a keyword, or as a function call without parentheses`,M[2]);else if(M[0]==="."&&this.tokens.length>1&&(D=this.tokens[this.tokens.length-2])[0]==="UNARY"&&D[1]==="new")D[0]="NEW_TARGET";else if(M[0]==="."&&this.tokens.length>1&&(D=this.tokens[this.tokens.length-2])[0]==="IMPORT"&&D[1]==="import")this.seenImport=!1,D[0]="IMPORT_META";else if(this.tokens.length>2){if(D=this.tokens[this.tokens.length-2],((q=M[0])==="@"||q==="THIS")&&D&&D.spaced&&/^[gs]et$/.test(D[1])&&((N=this.tokens[this.tokens.length-3][0])!=="."&&N!=="?."&&N!=="@"))this.error(`'${D[1]}' cannot be used as a keyword, or as a function call without parentheses`,D[2])}}if(P==="IDENTIFIER"&&I.call(q1,U)>=0)this.error(`reserved word '${U}'`,{length:U.length});if(!(P==="PROPERTY"||this.exportSpecifierList||this.importSpecifierList)){if(U==="is"&&this.chunk.slice(Y,Y+4)===" not"){if(_=this.chunk.slice(Y+4).trim(),!_.match(/^(false|true)\s+(is|isnt|==|!=)/))U="isnt",Y+=4}if(I.call(c1,U)>=0)E=U,U=l1[U],v.original=E;P=function(){switch(U){case"!":return"UNARY";case"==":case"!=":return"COMPARE";case"true":case"false":return"BOOL";case"break":case"continue":case"debugger":return"STATEMENT";case"&&":case"||":return U;default:return P}}()}let C=Y;if(U.length>1&&U.endsWith("!"))v.await=!0,U=U.slice(0,-1);if(V=this.token(P,U,{length:C,data:v}),E)V.origin=[P,E,V[2]];if(Z)[V[2].first_line,V[2].first_column,V[2].range[0]]=[Z[2].first_line,Z[2].first_column,Z[2].range[0]];if(X)R=F.lastIndexOf(":"),A=this.token(":",":",{offset:R});if(X)return C+X.length;else return C}commentToken(_=this.chunk,{heregex:E,returnCommentTokens:X=!1,offsetInChunk:R=0}={}){var A,U,Y,F,G,Z,M,D,Q,J,K,q,N,W,z,H,O,S,T,B,L,j,w,P,V,v;if(!(T=_.match(_2)))return 0;if([Y,Q,D,J,S]=T,G=null,N=/^\s*\n+\s*#/.test(Y),D){if(B=U2.exec(D),B)this.error(`block comments cannot contain ${B[0]}`,{offset:3+B.index,length:B[0].length});_=_.replace(`###${D}###`,""),_=_.replace(/^\n+/,""),this.lineToken({chunk:_}),F=D,G=[{content:F,length:Y.length-Q.length-J.length,leadingWhitespace:Q}]}else z="",F=S.replace(/^(\n*)/,function(C){return z=C,""}),V="",M=!1,G=F.split(`
|
|
5
|
+
${_}`,this.chunkLine--,(E=this.locTweaks)[0]==null)E[0]=0;this.locTweaks[0]-=1}return _.replace(/\r/g,(R,A)=>{return this.locTweaks[X+A]=1,""}).replace(f2,"")}identifierToken(){var _,E,X,R,A,U,Y,F,G,Z,M,D,Q,J,K,q,N,W,z,H,O,S,T,B,L,j,w,P,V,v;if(/^~[=>]/.test(this.chunk)||/^=!/.test(this.chunk))return 0;if(!(G=Z2.exec(this.chunk)))return 0;if([F,U,X]=G,Y=U.length,Z=void 0,U==="own"&&this.tag()==="FOR")return this.token("OWN",U),U.length;if(U==="from"&&this.tag()==="YIELD")return this.token("FROM",U),U.length;if(U==="as"&&this.seenImport){if(this.value()==="*")this.tokens[this.tokens.length-1][0]="IMPORT_ALL";else if(Q=this.value(!0),I.call(i,Q)>=0)M=this.prev(),[M[0],M[1]]=["IDENTIFIER",this.value(!0)];if((J=this.tag())==="DEFAULT"||J==="IMPORT_ALL"||J==="IDENTIFIER")return this.token("AS",U),U.length}if(U==="as"&&this.seenExport){if((W=this.tag())==="IDENTIFIER"||W==="DEFAULT")return this.token("AS",U),U.length;if(z=this.value(!0),I.call(i,z)>=0)return M=this.prev(),[M[0],M[1]]=["IDENTIFIER",this.value(!0)],this.token("AS",U),U.length}if(U==="default"&&this.seenExport&&((H=this.tag())==="EXPORT"||H==="AS"))return this.token("DEFAULT",U),U.length;if(U==="do"&&(j=/^(\s*super)(?!\(\))/.exec(this.chunk.slice(3))))return this.token("SUPER","super"),this.token("CALL_START","("),this.token("CALL_END",")"),[F,w]=j,w.length+3;if(M=this.prev(),X&&M&&M[0]==="SPACE?")X=null;if(P=X||M!=null&&((O=M[0])==="."||O==="?."||O==="::"||O==="?::"||!M.spaced&&M[0]==="@")?"PROPERTY":"IDENTIFIER",v={},P==="IDENTIFIER"&&(I.call(N1,U)>=0||I.call(i,U)>=0)&&!(this.exportSpecifierList&&I.call(i,U)>=0)){if(P=U.toUpperCase(),P==="WHEN"&&(S=this.tag(),I.call(W2,S)>=0))P="LEADING_WHEN";else if(P==="FOR")this.seenFor={endsLength:this.ends.length};else if(P==="UNLESS");else if(P==="IMPORT")this.seenImport=!0;else if(P==="EXPORT")this.seenExport=!0;else if(I.call(f1,P)>=0)P="UNARY";else if(I.call(I2,P)>=0){if(P!=="INSTANCEOF"&&this.seenFor)P="FOR"+P,this.seenFor=!1;else if(P="RELATION",this.value()==="!")Z=this.tokens.pop(),v.invert=(T=(B=Z.data)!=null?B.original:void 0)!=null?T:Z[1]}}else if(P==="IDENTIFIER"&&this.seenFor&&U==="from"&&g2(M))P="FORFROM",this.seenFor=!1;else if(P==="PROPERTY"&&M){if(M.spaced&&(L=M[0],I.call(F1,L)>=0)&&/^[gs]et$/.test(M[1])&&this.tokens.length>1&&((K=this.tokens[this.tokens.length-2][0])!=="."&&K!=="?."&&K!=="@"))this.error(`'${M[1]}' cannot be used as a keyword, or as a function call without parentheses`,M[2]);else if(M[0]==="."&&this.tokens.length>1&&(D=this.tokens[this.tokens.length-2])[0]==="UNARY"&&D[1]==="new")D[0]="NEW_TARGET";else if(M[0]==="."&&this.tokens.length>1&&(D=this.tokens[this.tokens.length-2])[0]==="IMPORT"&&D[1]==="import")this.seenImport=!1,D[0]="IMPORT_META";else if(this.tokens.length>2){if(D=this.tokens[this.tokens.length-2],((q=M[0])==="@"||q==="THIS")&&D&&D.spaced&&/^[gs]et$/.test(D[1])&&((N=this.tokens[this.tokens.length-3][0])!=="."&&N!=="?."&&N!=="@"))this.error(`'${D[1]}' cannot be used as a keyword, or as a function call without parentheses`,D[2])}}if(P==="IDENTIFIER"&&I.call(q1,U)>=0)this.error(`reserved word '${U}'`,{length:U.length});if(!(P==="PROPERTY"||this.exportSpecifierList||this.importSpecifierList)){if(U==="is"&&this.chunk.slice(Y,Y+4)===" not"){if(_=this.chunk.slice(Y+4).trim(),!_.match(/^(false|true)\s+(is|isnt|==|!=)/))U="isnt",Y+=4}if(I.call(c1,U)>=0)E=U,U=l1[U],v.original=E;P=function(){switch(U){case"!":return"UNARY";case"==":case"!=":return"COMPARE";case"true":case"false":return"BOOL";case"break":case"continue":case"debugger":return"STATEMENT";case"&&":case"||":return U;default:return P}}()}let C=Y;if(U.length>1&&U.endsWith("!"))v.await=!0,U=U.slice(0,-1);if(V=this.token(P,U,{length:C,data:v}),E)V.origin=[P,E,V[2]];if(Z)[V[2].first_line,V[2].first_column,V[2].range[0]]=[Z[2].first_line,Z[2].first_column,Z[2].range[0]];if(X)R=F.lastIndexOf(":"),A=this.token(":",":",{offset:R});if(X)return C+X.length;else return C}commentToken(_=this.chunk,{heregex:E,returnCommentTokens:X=!1,offsetInChunk:R=0}={}){var A,U,Y,F,G,Z,M,D,Q,J,K,q,N,W,z,H,O,S,T,B,L,j,w,P,V,v;if(!(T=_.match(_2)))return 0;if([Y,Q,D,J,S]=T,G=null,N=/^\s*\n+\s*#/.test(Y),D){if(B=U2.exec(D),B)this.error(`block comments cannot contain ${B[0]}`,{offset:3+B.index,length:B[0].length});_=_.replace(`###${D}###`,""),_=_.replace(/^\n+/,""),this.lineToken({chunk:_}),F=D,G=[{content:F,length:Y.length-Q.length-J.length,leadingWhitespace:Q}]}else z="",F=S.replace(/^(\n*)/,function(C){return z=C,""}),V="",M=!1,G=F.split(`
|
|
6
6
|
`).map(function(C,l){var f,t;if(!(C.indexOf("#")>-1)){V+=`
|
|
7
7
|
${C}`;return}return t="",F=C.replace(/^([ |\t]*)#/,function(g,Z1){return t=Z1,""}),f={content:F,length:1+F.length,leadingWhitespace:`${!M?z:""}${V}${t}`,precededByBlankLine:!!V},M=!0,V="",f}).filter(function(C){return C});if(Z=function({leadingWhitespace:C,nonInitial:l}){var f=C.lastIndexOf(`
|
|
8
8
|
`);if(D!=null||!l){if(!(f>-1))return null}else if(f==null)f=-1;return C.length-1-f},U=function(){var C,l,f;f=[];for(K=C=0,l=G.length;C<l;K=++C){if({content:F,length:O,leadingWhitespace:H,precededByBlankLine:P}=G[K],j=K!==0,W=j?1:0,R+=W+H.length,q=Z({leadingWhitespace:H,nonInitial:j}),L=q==null||q===-1,A={content:F,here:D!=null,newLine:N||j,locationData:this.makeLocationData({offsetInChunk:R,length:O}),precededByBlankLine:P,indentSize:q,indented:!L&&q>this.indent,outdented:!L&&q<this.indent},E)A.heregex=!0;R+=O,f.push(A)}return f}.call(this),v=this.prev(),!v)U[0].newLine=!0,this.lineToken({chunk:this.chunk.slice(Y.length),offset:Y.length}),w=this.makeToken("JS","",{offset:Y.length,generated:!0}),w.comments=U,this.tokens.push(w),this.newlineToken(Y.length);else e1(U,v);if(X)return U;return Y.length}whitespaceToken(){var _,E,X;if(!((_=h1.exec(this.chunk))||(E=this.chunk.charAt(0)===`
|
|
@@ -96,7 +96,7 @@ ${J.map((K)=>this.indent()+K).join(`
|
|
|
96
96
|
${this.indent()}}`}else D+=`{ const ${Z} = ${M}[${G}]; ${this.generate(F,"statement")}; }`;else if(Y)D+=this.generateLoopBodyWithGuard(F,Y);else D+=this.generateLoopBody(F);return D}generateForFrom($,_,E,X){let R=Array.isArray(_[0])?_[0]:[_[0]],[A]=R,U=_[1],Y=_[2],F=_[3],G=_[4],Z=!1,M=[];if(Array.isArray(A)&&A[0]==="array"){let q=A.slice(1),N=q.findIndex((W)=>Array.isArray(W)&&W[0]==="..."||W==="...");if(N!==-1&&N<q.length-1){Z=!0;let W=q.slice(N+1),z=W.length,H=q.slice(0,N),O=q[N],S=Array.isArray(O)&&O[0]==="..."?O[1]:"_rest",T=H.map((w)=>{if(w===",")return"";if(typeof w==="string")return w;return this.generate(w,"value")}).join(", "),B=T?`${T}, ...${S}`:`...${S}`,L=W.map((w)=>{if(w===",")return"";if(typeof w==="string")return w;return this.generate(w,"value")}).join(", ");M.push(`[${B}] = _item`),M.push(`[${L}] = ${S}.splice(-${z})`),this.helpers.add("slice"),((w)=>{w.slice(1).forEach((P)=>{if(P===","||P==="...")return;if(typeof P==="string")this.programVars.add(P);else if(Array.isArray(P)&&P[0]==="..."){if(typeof P[1]==="string")this.programVars.add(P[1])}})})(A)}}let D=this.generate(U,"value"),Q=Y?"await ":"",J;if(Z)J="_item";else if(Array.isArray(A)&&(A[0]==="array"||A[0]==="object"))J=this.generateDestructuringPattern(A);else J=A;let K=`for ${Q}(const ${J} of ${D}) `;if(Z&&M.length>0){let q=this.unwrapBlock(G),N=this.withIndent(()=>[...M.map((W)=>this.indent()+W+";"),...this.formatStatements(q)]);K+=`{
|
|
97
97
|
${N.join(`
|
|
98
98
|
`)}
|
|
99
|
-
${this.indent()}}`}else if(F)K+=this.generateLoopBodyWithGuard(G,F);else K+=this.generateLoopBody(G);return K}generateWhile($,_,E,X){let R=_[0],A=_.length===3?_[1]:null,U=_[_.length-1],F=`while (${this.unwrap(this.generate(R,"value"))}) `;if(A)F+=this.generateLoopBodyWithGuard(U,A);else F+=this.generateLoopBody(U);return F}generateUntil($,_,E,X){let[R,A]=_,Y=`while (!(${this.unwrap(this.generate(R,"value"))})) `;return Y+=this.generateLoopBody(A),Y}generateRange($,_,E,X){if($==="..."){if(_.length===1){let[D]=_;return`...${this.generate(D,"value")}`}let[F,G]=_,Z=this.generate(F,"value"),M=this.generate(G,"value");return`((s, e) => Array.from({length: Math.max(0, Math.abs(e - s))}, (_, i) => s + (i * (s <= e ? 1 : -1))))(${Z}, ${M})`}let[R,A]=_,U=this.generate(R,"value"),Y=this.generate(A,"value");return`((s, e) => Array.from({length: Math.abs(e - s) + 1}, (_, i) => s + (i * (s <= e ? 1 : -1))))(${U}, ${Y})`}generateNot($,_,E,X){let[R]=_;if(typeof R==="string"||R instanceof String)return`!${this.generate(R,"value")}`;if(Array.isArray(R)){let U=R[0];if([".","?.","::","?::","[]","?[]","optindex","optcall"].includes(U))return`!${this.generate(R,"value")}`}let A=this.generate(R,"value");if(A.startsWith("("))return`!${A}`;return`(!${A})`}generateBitwiseNot($,_,E,X){let[R]=_;return`(~${this.generate(R,"value")})`}generateIncDec($,_,E,X){let[R,A]=_,U=this.generate(R,"value");if(A)return`(${U}${$})`;else return`(${$}${U})`}generateTypeof($,_,E,X){let[R]=_;return`typeof ${this.generate(R,"value")}`}generateDelete($,_,E,X){let[R]=_;return`(delete ${this.generate(R,"value")})`}generateInstanceof($,_,E,X){let[R,A]=_,U=X[0]?.invert,Y=`(${this.generate(R,"value")} instanceof ${this.generate(A,"value")})`;return U?`(!${Y})`:Y}generateIn($,_,E,X){let[R,A]=_,U=this.generate(R,"value"),Y=X[0]?.invert;if(Array.isArray(A)&&A[0]==="object"){let Z=this.generate(A,"value"),M=`(${U} in ${Z})`;return Y?`(!${M})`:M}let F=this.generate(A,"value"),G=`(Array.isArray(${F}) || typeof ${F} === 'string' ? ${F}.includes(${U}) : (${U} in ${F}))`;return Y?`(!${G})`:G}generateOf($,_,E,X){let[R,A]=_,U=this.generate(R,"value"),Y=this.generate(A,"value"),F=X[0]?.invert,G=`(${U} in ${Y})`;return F?`(!${G})`:G}generateRegexMatch($,_,E,X){let[R,A]=_;this.helpers.add("toSearchable"),this.programVars.add("_");let U=this.generate(A,"value"),F=U.includes("/m")?", true":"";return`(_ = toSearchable(${this.generate(R,"value")}${F}).match(${U}))`}generateNew($,_,E,X){let[R]=_;if(Array.isArray(R)&&(R[0]==="."||R[0]==="?.")){let[A,U,Y]=R;if(Array.isArray(U)&&!U[0].startsWith)return`(${this.generate(["new",U],"value")}).${Y}`;return`new ${this.generate(U,"value")}.${Y}`}if(Array.isArray(R)){let[A,...U]=R,Y=this.generate(A,"value"),F=U.map((G)=>this.unwrap(this.generate(G,"value"))).join(", ");return`new ${Y}(${F})`}return`new ${this.generate(R,"value")}()`}generateLogicalAnd($,_,E,X){let A=this.flattenBinaryChain(X).slice(1);if(A.length===0)return"true";if(A.length===1)return this.generate(A[0],"value");return`(${A.map((Y)=>this.generate(Y,"value")).join(" && ")})`}generateLogicalOr($,_,E,X){let A=this.flattenBinaryChain(X).slice(1);if(A.length===0)return"true";if(A.length===1)return this.generate(A[0],"value");return`(${A.map((Y)=>this.generate(Y,"value")).join(" || ")})`}generateArray($,_,E,X){let R=_.length>0&&_[_.length-1]===",",A=_.map((U)=>{if(U===",")return"";if(U==="...")return"";if(Array.isArray(U)&&U[0]==="...")return`...${this.generate(U[1],"value")}`;return this.generate(U,"value")}).join(", ");return R?`[${A},]`:`[${A}]`}generateObject($,_,E,X){if(_.length===1&&Array.isArray(_[0])&&Array.isArray(_[0][1])&&_[0][1][0]==="comprehension"){let[A,U]=_[0],[,Y,F,G]=U;return this.generate(["object-comprehension",A,Y,F,G],E)}return`{${_.map((A)=>{if(Array.isArray(A)&&A[0]==="...")return`...${this.generate(A[1],"value")}`;let[U,Y,F]=A,G;if(Array.isArray(U)&&U[0]==="dynamicKey"){let M=U[1];G=`[${this.generate(M,"value")}]`}else G=this.generate(U,"value");let Z=this.generate(Y,"value");if(F==="=")return`${G} = ${Z}`;else if(F===":")return`${G}: ${Z}`;else{if(G===Z&&!Array.isArray(U))return G;return`${G}: ${Z}`}}).join(", ")}}`}generateBlock($,_,E,X){if(E==="statement")return`{
|
|
99
|
+
${this.indent()}}`}else if(F)K+=this.generateLoopBodyWithGuard(G,F);else K+=this.generateLoopBody(G);return K}generateWhile($,_,E,X){let R=_[0],A=_.length===3?_[1]:null,U=_[_.length-1],F=`while (${this.unwrap(this.generate(R,"value"))}) `;if(A)F+=this.generateLoopBodyWithGuard(U,A);else F+=this.generateLoopBody(U);return F}generateUntil($,_,E,X){let[R,A]=_,Y=`while (!(${this.unwrap(this.generate(R,"value"))})) `;return Y+=this.generateLoopBody(A),Y}generateRange($,_,E,X){if($==="..."){if(_.length===1){let[D]=_;return`...${this.generate(D,"value")}`}let[F,G]=_,Z=this.generate(F,"value"),M=this.generate(G,"value");return`((s, e) => Array.from({length: Math.max(0, Math.abs(e - s))}, (_, i) => s + (i * (s <= e ? 1 : -1))))(${Z}, ${M})`}let[R,A]=_,U=this.generate(R,"value"),Y=this.generate(A,"value");return`((s, e) => Array.from({length: Math.abs(e - s) + 1}, (_, i) => s + (i * (s <= e ? 1 : -1))))(${U}, ${Y})`}generateNot($,_,E,X){let[R]=_;if(typeof R==="string"||R instanceof String)return`!${this.generate(R,"value")}`;if(Array.isArray(R)){let U=R[0];if([".","?.","::","?::","[]","?[]","optindex","optcall"].includes(U))return`!${this.generate(R,"value")}`}let A=this.generate(R,"value");if(A.startsWith("("))return`!${A}`;return`(!${A})`}generateBitwiseNot($,_,E,X){let[R]=_;return`(~${this.generate(R,"value")})`}generateIncDec($,_,E,X){let[R,A]=_,U=this.generate(R,"value");if(A)return`(${U}${$})`;else return`(${$}${U})`}generateTypeof($,_,E,X){let[R]=_;return`typeof ${this.generate(R,"value")}`}generateDelete($,_,E,X){let[R]=_;return`(delete ${this.generate(R,"value")})`}generateInstanceof($,_,E,X){let[R,A]=_,U=X[0]?.invert,Y=`(${this.generate(R,"value")} instanceof ${this.generate(A,"value")})`;return U?`(!${Y})`:Y}generateIn($,_,E,X){let[R,A]=_,U=this.generate(R,"value"),Y=X[0]?.invert;if(Array.isArray(A)&&A[0]==="object"){let Z=this.generate(A,"value"),M=`(${U} in ${Z})`;return Y?`(!${M})`:M}let F=this.generate(A,"value"),G=`(Array.isArray(${F}) || typeof ${F} === 'string' ? ${F}.includes(${U}) : (${U} in ${F}))`;return Y?`(!${G})`:G}generateOf($,_,E,X){let[R,A]=_,U=this.generate(R,"value"),Y=this.generate(A,"value"),F=X[0]?.invert,G=`(${U} in ${Y})`;return F?`(!${G})`:G}generateRegexMatch($,_,E,X){let[R,A]=_;this.helpers.add("toSearchable"),this.programVars.add("_");let U=this.generate(A,"value"),F=U.includes("/m")?", true":"";return`(_ = toSearchable(${this.generate(R,"value")}${F}).match(${U}))`}generateNew($,_,E,X){let[R]=_;if(Array.isArray(R)&&(R[0]==="."||R[0]==="?.")){let[A,U,Y]=R;if(Array.isArray(U)&&!U[0].startsWith)return`(${this.generate(["new",U],"value")}).${Y}`;return`new ${this.generate(U,"value")}.${Y}`}if(Array.isArray(R)){let[A,...U]=R,Y=this.generate(A,"value"),F=U.map((G)=>this.unwrap(this.generate(G,"value"))).join(", ");return`new ${Y}(${F})`}return`new ${this.generate(R,"value")}()`}generateLogicalAnd($,_,E,X){let A=this.flattenBinaryChain(X).slice(1);if(A.length===0)return"true";if(A.length===1)return this.generate(A[0],"value");return`(${A.map((Y)=>this.generate(Y,"value")).join(" && ")})`}generateLogicalOr($,_,E,X){let A=this.flattenBinaryChain(X).slice(1);if(A.length===0)return"true";if(A.length===1)return this.generate(A[0],"value");return`(${A.map((Y)=>this.generate(Y,"value")).join(" || ")})`}generateArray($,_,E,X){let R=_.length>0&&_[_.length-1]===",",A=_.map((U)=>{if(U===",")return"";if(U==="...")return"";if(Array.isArray(U)&&U[0]==="...")return`...${this.generate(U[1],"value")}`;return this.generate(U,"value")}).join(", ");return R?`[${A},]`:`[${A}]`}generateObject($,_,E,X){if(_.length===1&&Array.isArray(_[0])&&Array.isArray(_[0][1])&&_[0][1][0]==="comprehension"){let[A,U]=_[0],[,Y,F,G]=U;return this.generate(["object-comprehension",A,Y,F,G],E)}return`{${_.map((A)=>{if(Array.isArray(A)&&A[0]==="...")return`...${this.generate(A[1],"value")}`;let[U,Y,F]=A,G;if(Array.isArray(U)&&U[0]==="dynamicKey"){let M=U[1];G=`[${this.generate(M,"value")}]`}else if(Array.isArray(U)&&U[0]==="str")G=`[${this.generate(U,"value")}]`;else G=this.generate(U,"value");let Z=this.generate(Y,"value");if(F==="=")return`${G} = ${Z}`;else if(F===":")return`${G}: ${Z}`;else{if(G===Z&&!Array.isArray(U))return G;return`${G}: ${Z}`}}).join(", ")}}`}generateBlock($,_,E,X){if(E==="statement")return`{
|
|
100
100
|
${this.withIndent(()=>this.formatStatements(_)).join(`
|
|
101
101
|
`)}
|
|
102
102
|
${this.indent()}}`;if(_.length===0)return"undefined";if(_.length===1)return this.generate(_[0],E);let R=_[_.length-1];if(Array.isArray(R)&&["break","continue","return","throw"].includes(R[0])){let Y=_.map((F)=>this.addSemicolon(F,this.generate(F,"statement")));return`{
|
|
@@ -530,4 +530,4 @@ function __catchErrors(fn) {
|
|
|
530
530
|
`),X=E.findIndex((G)=>G==="__DATA__");if(X!==-1){let G=E.slice(X+1);_=G.length>0?G.join(`
|
|
531
531
|
`)+`
|
|
532
532
|
`:"",$=E.slice(0,X).join(`
|
|
533
|
-
`)}let A=new m1().tokenize($);if(this.options.showTokens)A.forEach((G)=>console.log(`${G[0].padEnd(12)} ${JSON.stringify(G[1])}`)),console.log();$1.lexer={tokens:A,pos:0,setInput:function(){},lex:function(){if(this.pos>=this.tokens.length)return 1;let G=this.tokens[this.pos++];return this.yytext=G[1],this.yylloc=G[2],G[0]}};let U;try{U=$1.parse($)}catch(G){if(/\?\s*\([^)]*\?[^)]*:[^)]*\)\s*:/.test($)||/\?\s+\w+\s+\?\s+/.test($))throw Error("Nested ternary operators are not supported. Use if/else statements instead.");throw G}if(this.options.showSExpr)console.log(o(U,0,!0)),console.log();let Y=new c({dataSection:_,skipReactiveRuntime:this.options.skipReactiveRuntime,reactiveVars:this.options.reactiveVars}),F=Y.compile(U);return{tokens:A,sexpr:U,code:F,data:_,reactiveVars:Y.reactiveVars}}compileToJS($){return this.compile($).code}compileToSExpr($){return this.compile($).sexpr}}function U3($,_={}){return new O1(_).compile($)}function S1($,_={}){return new O1(_).compileToJS($)}var Q3="2.8.
|
|
533
|
+
`)}let A=new m1().tokenize($);if(this.options.showTokens)A.forEach((G)=>console.log(`${G[0].padEnd(12)} ${JSON.stringify(G[1])}`)),console.log();$1.lexer={tokens:A,pos:0,setInput:function(){},lex:function(){if(this.pos>=this.tokens.length)return 1;let G=this.tokens[this.pos++];return this.yytext=G[1],this.yylloc=G[2],G[0]}};let U;try{U=$1.parse($)}catch(G){if(/\?\s*\([^)]*\?[^)]*:[^)]*\)\s*:/.test($)||/\?\s+\w+\s+\?\s+/.test($))throw Error("Nested ternary operators are not supported. Use if/else statements instead.");throw G}if(this.options.showSExpr)console.log(o(U,0,!0)),console.log();let Y=new c({dataSection:_,skipReactiveRuntime:this.options.skipReactiveRuntime,reactiveVars:this.options.reactiveVars}),F=Y.compile(U);return{tokens:A,sexpr:U,code:F,data:_,reactiveVars:Y.reactiveVars}}compileToJS($){return this.compile($).code}compileToSExpr($){return this.compile($).sexpr}}function U3($,_={}){return new O1(_).compile($)}function S1($,_={}){return new O1(_).compileToJS($)}var Q3="2.8.9",W3="2026-02-06@03:14:34GMT",$3=($)=>{let _=$.match(/^[ \t]*(?=\S)/gm),E=Math.min(...(_||[]).map((X)=>X.length));return $.replace(RegExp(`^[ ]{${E}}`,"gm"),"").trim()};async function k2(){let $=document.querySelectorAll('script[type="text/rip"]');for(let _ of $){if(_.hasAttribute("data-rip-processed"))continue;try{let E=$3(_.textContent),X=S1(E);(0,eval)(X),_.setAttribute("data-rip-processed","true")}catch(E){console.error("Error compiling Rip script:",E),console.error("Script content:",_.textContent)}}}if(typeof document<"u")if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",k2);else k2();function X3($){try{let E=S1($).replace(/^let\s+[^;]+;\s*\n\s*/m,"");E=E.replace(/^const\s+/gm,"var ");let X=(0,eval)(E);if(X!==void 0)globalThis._=X;return X}catch(_){console.error("Rip compilation error:",_.message);return}}if(typeof globalThis<"u")globalThis.rip=X3;export{X3 as rip,k2 as processRipScripts,$1 as parser,o as formatSExpr,S1 as compileToJS,U3 as compile,Q3 as VERSION,m1 as Lexer,O1 as Compiler,c as CodeGenerator,W3 as BUILD_DATE};
|
|
Binary file
|
package/package.json
CHANGED
package/src/compiler.js
CHANGED
|
@@ -2587,12 +2587,15 @@ export class CodeGenerator {
|
|
|
2587
2587
|
// All regular pairs now have format: [key, value, operator]
|
|
2588
2588
|
const [key, value, operator] = pair;
|
|
2589
2589
|
|
|
2590
|
-
// Check if key is dynamic: ["dynamicKey", expression]
|
|
2590
|
+
// Check if key is dynamic: ["dynamicKey", expression] or interpolated: ["str", ...]
|
|
2591
2591
|
let keyCode;
|
|
2592
2592
|
if (Array.isArray(key) && key[0] === 'dynamicKey') {
|
|
2593
2593
|
// Dynamic property key: [expr] syntax
|
|
2594
2594
|
const expr = key[1];
|
|
2595
2595
|
keyCode = `[${this.generate(expr, 'value')}]`;
|
|
2596
|
+
} else if (Array.isArray(key) && key[0] === 'str') {
|
|
2597
|
+
// Interpolated string as key: {"#{x}": v} → {[`${x}`]: v}
|
|
2598
|
+
keyCode = `[${this.generate(key, 'value')}]`;
|
|
2596
2599
|
} else {
|
|
2597
2600
|
// Regular key (string or identifier)
|
|
2598
2601
|
keyCode = this.generate(key, 'value');
|
package/src/lexer.js
CHANGED
|
@@ -328,6 +328,11 @@ export var Lexer = class Lexer {
|
|
|
328
328
|
return sup.length + 3;
|
|
329
329
|
}
|
|
330
330
|
prev = this.prev();
|
|
331
|
+
// Don't treat colon as property when in ternary context (after SPACE?)
|
|
332
|
+
// This allows `a ? b : c` to parse correctly instead of treating `b :` as property
|
|
333
|
+
if (colon && prev && prev[0] === 'SPACE?') {
|
|
334
|
+
colon = null;
|
|
335
|
+
}
|
|
331
336
|
tag = colon || (prev != null) && (((ref5 = prev[0]) === '.' || ref5 === '?.' || ref5 === '::' || ref5 === '?::') || !prev.spaced && prev[0] === '@') ? 'PROPERTY' : 'IDENTIFIER';
|
|
332
337
|
tokenData = {};
|
|
333
338
|
if (tag === 'IDENTIFIER' && (indexOf.call(JS_KEYWORDS, id) >= 0 || indexOf.call(RIP_KEYWORDS, id) >= 0) && !(this.exportSpecifierList && indexOf.call(RIP_KEYWORDS, id) >= 0)) {
|