rip-lang 3.13.16 → 3.13.18

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/CHANGELOG.md CHANGED
@@ -7,6 +7,110 @@ All notable changes to Rip will be documented in this file.
7
7
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
8
8
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
+ ## [3.13.16] - 2026-02-25
11
+
12
+ ### Breaking — Merge `@rip-lang/api` into `@rip-lang/server`
13
+
14
+ - **One package for framework + server** — `@rip-lang/api` no longer exists. All imports change from `'@rip-lang/api'` to `'@rip-lang/server'` and `'@rip-lang/api/middleware'` to `'@rip-lang/server/middleware'`. The default export (`.`) is `api.rip` (the web framework), `./middleware` is `middleware.rip`, and `./server` is `server.rip` (the process manager).
15
+ - **`packages/api/` deleted** — Files moved to `packages/server/` (api.rip, middleware.rip, tests/).
16
+
17
+ ### CLI — `rip serve` Subcommand
18
+
19
+ - **`rip serve`** — New subcommand that resolves `@rip-lang/server/server` lazily and passes all args through. One tool to compile, run, and serve. Clear error message if `@rip-lang/server` isn't installed.
20
+ - **File watching on by default** — `*.rip` files are watched automatically. `--watch=<glob>` to customize, `--static` to disable everything. The `-w`/`--watch` bare flags are removed.
21
+ - **Removed `-w`/`--web` browser REPL** — The `rip -w` flag for launching a browser playground is removed.
22
+ - **CLI cleanup** — Removed dead `startREPL` import, eliminated `__filename`, deduplicated `loaderPath`, removed narrating comments. 308 → 218 lines.
23
+
24
+ ### Compiler — Fix Postfix `if` with `@method` Calls in Value Context
25
+
26
+ - **Bug fix** — `@method arg1, arg2 if condition` in value context (e.g., inside `->`) silently dropped the method call, compiling to just `condition ? arg2 : undefined` instead of `condition ? this.method(arg1, arg2) : undefined`. The issue was in `unwrapBlock` treating call expressions with array operators (like `['.', 'this', 'x']`) as lists of statements. Fixed by checking if `body[0]` is an s-expression operator. Added 2 regression tests (1,257 total).
27
+
28
+ ### Server — Bundle Caching + Brotli Compression
29
+
30
+ - **Memory-cached bundle** — The component bundle JSON is built once per worker lifetime and served from memory. No more glob scan + file reads on every `/bundle` request.
31
+ - **Brotli compression** — Bundle is pre-compressed with `zlib.brotliCompressSync` at cache time. When the browser sends `Accept-Encoding: br`, the pre-compressed version is served (~5KB instead of ~65KB).
32
+ - **Client-side ETag caching** — The `launch()` function in `app.rip` stores the bundle ETag and data in `sessionStorage`. On subsequent page loads, it sends `If-None-Match` manually (browser `fetch()` doesn't do this automatically). Server returns 304 when content unchanged — zero bytes on the wire.
33
+ - **Deterministic ETags** — Glob scan results are sorted before JSON serialization, ensuring identical hashes across requests.
34
+ - **`Cache-Control: no-cache` on `send()`** — Makes caching explicit for subresources served via `@send`.
35
+
36
+ ### Server — `@cache` Helper
37
+
38
+ - **Sinatra-style cache duration** — `@cache '1 day'` sets `Cache-Control: public, max-age=86400`. Supports seconds, minutes, hours, days, weeks, years, or raw numbers. `@send` respects pre-set `Cache-Control` instead of always overriding to `no-cache`.
39
+
40
+ ### Server — `Rip-No-Log` Header
41
+
42
+ - **App-controlled log suppression** — Set `@header 'Rip-No-Log', '1'` in a `before` filter to suppress the server's access log for specific routes (e.g., `/favicon.png`, `/ping`). The header is stripped from the response before reaching the browser.
43
+
44
+ ### Server — Watch Improvements
45
+
46
+ - **Filter non-existent watch dirs** — The `serve` middleware filters directories with `existsSync` before registering them with the file watcher, preventing `ENOENT` errors for missing `css/` directories.
47
+ - **Cleaner watch error format** — `rip-server: watch skipped (ENOENT): app/css` with relative paths.
48
+
49
+ ### Server — Setup Fix
50
+
51
+ - **`proc.unref()` for spawned processes** — The `startDb` function in `demos/streamline/api/db.rip` now unrefs the spawned `rip-db` child process so the setup subprocess can exit cleanly. Without this, `rip serve` would hang after setup because the child kept the parent alive.
52
+
53
+ ### Standard Library (added in 3.11.x)
54
+
55
+ - **13 global helpers** — `abort`, `assert`, `exit`, `kind`, `noop`, `p`, `pp`, `raise`, `rand`, `sleep`, `todo`, `warn`, `zip`. All use `??=` (overridable). Injected via `globalThis` in compiled output, CLI REPL, and browser REPL.
56
+
57
+ ### Postfix `!?` Operator (added in 3.11.x)
58
+
59
+ - **Defined check** — `val!?` compiles to `val !== undefined` (true if not undefined). Distinct from `val?` which checks `val != null` (not null and not undefined).
60
+
61
+ ### Rip Loader
62
+
63
+ - **Rewrite `@rip-lang/*` imports to absolute paths** — The rip-loader now rewrites `@rip-lang/*` import specifiers to absolute filesystem paths via `import.meta.resolve`. This is necessary because Bun's worker threads ignore `NODE_PATH` and `onResolve` doesn't fire for imports in compiled source.
64
+
65
+ ### Swarm (`@rip-lang/swarm`)
66
+
67
+ - **Worker error delivery** — Don't exit before error message arrives at the main thread.
68
+ - **Startup failure detection** — Exit handler detects worker startup failures.
69
+ - **Pre-flight module check** — Validates worker module exists before spawning.
70
+ - **Quiet mode** — `-q`/`--quiet` flag suppresses progress output.
71
+ - **Derive rip-loader path from swarm's own location** — Uses `import.meta.url` instead of `require.resolve` (which fails from directories without `node_modules`).
72
+
73
+ ### UI Framework
74
+
75
+ - **Auto-detect hot reload under `rip serve`** — `watch: true` is automatically enabled when `SOCKET_PREFIX` env var is present.
76
+ - **Brotli + ETag caching for `rip.min.js`** — Pre-compressed `.br` file served with ETag; 304 on reload.
77
+ - **Auto-launch for server-backed apps** — `data-launch` attribute on script tag triggers `launch()` with bundle URL.
78
+ - **Component remount on route param change** — Same route with different params now correctly remounts.
79
+ - **CSS hot-swap** — `.css` file changes trigger style reload without full page refresh.
80
+ - **Fix fragment removal** — Components with multiple root elements now clean up all nodes.
81
+
82
+ ### VS Code Extension
83
+
84
+ - **v0.5.5** — Fix hover overshoot, source map interpolation.
85
+ - **v0.5.3** — Hover support for component declarations.
86
+ - **v0.5.2** — Type hover for all declarations.
87
+
88
+ ### Type System
89
+
90
+ - **Generic return types** — `def foo():: Promise<User>` now emits correct `.d.ts`.
91
+
92
+ ### Documentation
93
+
94
+ - **All `@rip-lang/api` references updated** — AGENTS.md, README.md, RIP-LANG.md, RIP-INTERNALS.md, all package READMEs, all demo files.
95
+ - **Server README** — Merged 901 lines of web framework documentation (validators, routing, middleware, context, file serving, error handling, utility functions, Hono migration guide) from the deleted api README.
96
+ - **Version numbers and test counts updated** across all documentation.
97
+
98
+ ### Packages Published
99
+
100
+ | Package | Version |
101
+ |---------|---------|
102
+ | `rip-lang` | 3.13.16 |
103
+ | `@rip-lang/server` | 1.3.7 |
104
+ | `@rip-lang/db` | 1.3.14 |
105
+ | `@rip-lang/grid` | 0.2.9 |
106
+ | `@rip-lang/csv` | 1.3.5 |
107
+ | `@rip-lang/http` | 1.1.7 |
108
+ | `@rip-lang/print` | 1.1.8 |
109
+ | `@rip-lang/x12` | 0.2.7 |
110
+ | `@rip-lang/schema` | 0.3.7 |
111
+ | `@rip-lang/swarm` | 1.2.17 |
112
+ | `@rip-lang/all` | 3.13.26 |
113
+
10
114
  ## [3.10.12] - 2026-02-20
11
115
 
12
116
  ### Compiler — Fix Variable Scoping in Effect Blocks
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-3.13.16-blue.svg" alt="Version"></a>
12
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-3.13.18-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-1%2C255%2F1%2C255-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/dist/rip.js CHANGED
@@ -7615,8 +7615,11 @@ ${this.indent()}}`;
7615
7615
  return [body];
7616
7616
  if (body[0] === "block")
7617
7617
  return body.slice(1);
7618
- if (Array.isArray(body[0]))
7618
+ if (Array.isArray(body[0])) {
7619
+ if (typeof body[0][0] === "string")
7620
+ return [body];
7619
7621
  return body;
7622
+ }
7620
7623
  return [body];
7621
7624
  }
7622
7625
  indent() {
@@ -8352,8 +8355,8 @@ globalThis.zip ??= (...a) => a[0].map((_, i) => a.map(b => b[i]));
8352
8355
  return new CodeGenerator({}).getComponentRuntime();
8353
8356
  }
8354
8357
  // src/browser.js
8355
- var VERSION = "3.13.15";
8356
- var BUILD_DATE = "2026-02-25@06:33:14GMT";
8358
+ var VERSION = "3.13.17";
8359
+ var BUILD_DATE = "2026-02-25@08:50:22GMT";
8357
8360
  if (typeof globalThis !== "undefined") {
8358
8361
  if (!globalThis.__rip)
8359
8362
  new Function(getReactiveRuntime())();
@@ -282,7 +282,7 @@ ${this.indent()}}`}return`{ if (${this.generate(W,"value")}) ${this.generate($,"
282
282
  `;this.indentLevel--,U+=this.indent()+"}"}if(W){if(U+=` else {
283
283
  `,this.indentLevel++,_==="value")U+=this.indent()+`return ${this.extractExpression(W)};
284
284
  `;else for(let u of this.unwrapBlock(W))U+=this.indent()+this.generate(u,"statement")+`;
285
- `;this.indentLevel--,U+=this.indent()+"}"}return _==="value"?`(() => { ${U} })()`:U}extractExpression($){let W=this.unwrapBlock($);return W.length>0?this.generate(W[W.length-1],"value"):"undefined"}unwrapBlock($){if(!Array.isArray($))return[$];if($[0]==="block")return $.slice(1);if(Array.isArray($[0]))return $;return[$]}indent(){return this.indentString.repeat(this.indentLevel)}needsSemicolon($,W){if(!W||W.endsWith(";"))return!1;if(!W.endsWith("}"))return!0;let _=Array.isArray($)?$[0]:null;return!["def","class","if","for-in","for-of","for-as","while","loop","switch","try"].includes(_)}addSemicolon($,W){return W+(this.needsSemicolon($,W)?";":"")}formatStatements($,W="statement"){return $.map((_)=>this.indent()+this.addSemicolon(_,this.generate(_,W)))}wrapForCondition($){if(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test($))return $;if($.startsWith("(")&&$.endsWith(")"))return $;return`(${$})`}hasExplicitControlFlow($){if(!Array.isArray($))return!1;let W=$[0];if(W==="return"||W==="throw"||W==="break"||W==="continue")return!0;if(W==="block")return $.slice(1).some((_)=>Array.isArray(_)&&["return","throw","break","continue"].includes(_[0]));if(W==="switch"){let[,,_]=$;return _?.some((U)=>{return this.unwrapBlock(U[2]).some((f)=>Array.isArray(f)&&["return","throw","break","continue"].includes(f[0]))})}if(W==="if"){let[,,_,U]=$;return this.branchHasControlFlow(_)&&U&&this.branchHasControlFlow(U)}return!1}branchHasControlFlow($){if(!Array.isArray($))return!1;let W=this.unwrapBlock($);if(W.length===0)return!1;let _=W[W.length-1];return Array.isArray(_)&&["return","throw","break","continue"].includes(_[0])}withIndent($){this.indentLevel++;let W=$();return this.indentLevel--,W}is($,W,_){if(!Array.isArray($))return null;if((S($[0])??$[0])!==W)return null;let U=$.slice(1);if(_!=null&&U.length!==_)return null;return U}unwrap($){if(typeof $!=="string")return $;while($.startsWith("(")&&$.endsWith(")")){let W=0,_=0,U=!0,u=!1;for(let f=0;f<$.length;f++){if($[f]==="(")W++;if($[f]===")")W--;if($[f]==="["||$[f]==="{")_++;if($[f]==="]"||$[f]==="}")_--;if($[f]===","&&W===1&&_===0)u=!0;if(W===0&&f<$.length-1){U=!1;break}}if(u)U=!1;if(U)$=$.slice(1,-1);else break}return $}unwrapLogical($){if(typeof $!=="string")return $;while($.startsWith("(")&&$.endsWith(")")){let W=0,_=1/0;for(let U=1;U<$.length-1;U++){if($[U]==="(")W++;if($[U]===")")W--;_=Math.min(_,W)}if(_>=0)$=$.slice(1,-1);else break}return $}unwrapIfBranch($){if(Array.isArray($)&&$.length===1&&(!Array.isArray($[0])||$[0][0]!=="block"))return $[0];return $}flattenBinaryChain($){if(!Array.isArray($)||$.length<3)return $;let[W,..._]=$;if(W!=="&&"&&W!=="||")return $;let U=[],u=(f)=>{if(Array.isArray(f)&&f[0]===W)for(let F=1;F<f.length;F++)u(f[F]);else U.push(f)};for(let f of _)u(f);return[W,...U]}hasStatementInBranch($){if(!Array.isArray($))return!1;let W=$[0];if(W==="return"||W==="throw"||W==="break"||W==="continue")return!0;if(W==="block")return $.slice(1).some((_)=>this.hasStatementInBranch(_));return!1}hasNestedMultiStatement($){if(!Array.isArray($))return!1;if($[0]==="if"){let[W,_,U,...u]=$;return this.is(U,"block")&&U.length>2||u.some((f)=>this.hasNestedMultiStatement(f))}return!1}buildTernaryChain($){if($.length===0)return"undefined";if($.length===1)return this.extractExpression(this.unwrapIfBranch($[0]));let W=$[0];if(this.is(W,"if")){let[_,U,u,...f]=W,F=this.extractExpression(this.unwrapIfBranch(u)),Y=this.buildTernaryChain([...f,...$.slice(1)]);return`(${this.generate(U,"value")} ? ${F} : ${Y})`}return this.extractExpression(this.unwrapIfBranch(W))}collectVarsFromArray($,W){$.slice(1).forEach((_)=>{if(_===","||_==="...")return;if(typeof _==="string"){W.add(_);return}if(Array.isArray(_)){if(_[0]==="..."&&typeof _[1]==="string")W.add(_[1]);else if(_[0]==="array")this.collectVarsFromArray(_,W);else if(_[0]==="object")this.collectVarsFromObject(_,W)}})}collectVarsFromObject($,W){$.slice(1).forEach((_)=>{if(!Array.isArray(_))return;if(_[0]==="..."&&typeof _[1]==="string"){W.add(_[1]);return}if(_.length>=2){let[U,u,f]=_;if(f==="="){if(typeof U==="string")W.add(U)}else if(typeof u==="string")W.add(u);else if(Array.isArray(u)){if(u[0]==="array")this.collectVarsFromArray(u,W);else if(u[0]==="object")this.collectVarsFromObject(u,W)}}})}extractStringContent($){let W=S($).slice(1,-1),_=V($,"indent");if(_)W=W.replace(new RegExp(`\\n${_}`,"g"),`
285
+ `;this.indentLevel--,U+=this.indent()+"}"}return _==="value"?`(() => { ${U} })()`:U}extractExpression($){let W=this.unwrapBlock($);return W.length>0?this.generate(W[W.length-1],"value"):"undefined"}unwrapBlock($){if(!Array.isArray($))return[$];if($[0]==="block")return $.slice(1);if(Array.isArray($[0])){if(typeof $[0][0]==="string")return[$];return $}return[$]}indent(){return this.indentString.repeat(this.indentLevel)}needsSemicolon($,W){if(!W||W.endsWith(";"))return!1;if(!W.endsWith("}"))return!0;let _=Array.isArray($)?$[0]:null;return!["def","class","if","for-in","for-of","for-as","while","loop","switch","try"].includes(_)}addSemicolon($,W){return W+(this.needsSemicolon($,W)?";":"")}formatStatements($,W="statement"){return $.map((_)=>this.indent()+this.addSemicolon(_,this.generate(_,W)))}wrapForCondition($){if(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test($))return $;if($.startsWith("(")&&$.endsWith(")"))return $;return`(${$})`}hasExplicitControlFlow($){if(!Array.isArray($))return!1;let W=$[0];if(W==="return"||W==="throw"||W==="break"||W==="continue")return!0;if(W==="block")return $.slice(1).some((_)=>Array.isArray(_)&&["return","throw","break","continue"].includes(_[0]));if(W==="switch"){let[,,_]=$;return _?.some((U)=>{return this.unwrapBlock(U[2]).some((f)=>Array.isArray(f)&&["return","throw","break","continue"].includes(f[0]))})}if(W==="if"){let[,,_,U]=$;return this.branchHasControlFlow(_)&&U&&this.branchHasControlFlow(U)}return!1}branchHasControlFlow($){if(!Array.isArray($))return!1;let W=this.unwrapBlock($);if(W.length===0)return!1;let _=W[W.length-1];return Array.isArray(_)&&["return","throw","break","continue"].includes(_[0])}withIndent($){this.indentLevel++;let W=$();return this.indentLevel--,W}is($,W,_){if(!Array.isArray($))return null;if((S($[0])??$[0])!==W)return null;let U=$.slice(1);if(_!=null&&U.length!==_)return null;return U}unwrap($){if(typeof $!=="string")return $;while($.startsWith("(")&&$.endsWith(")")){let W=0,_=0,U=!0,u=!1;for(let f=0;f<$.length;f++){if($[f]==="(")W++;if($[f]===")")W--;if($[f]==="["||$[f]==="{")_++;if($[f]==="]"||$[f]==="}")_--;if($[f]===","&&W===1&&_===0)u=!0;if(W===0&&f<$.length-1){U=!1;break}}if(u)U=!1;if(U)$=$.slice(1,-1);else break}return $}unwrapLogical($){if(typeof $!=="string")return $;while($.startsWith("(")&&$.endsWith(")")){let W=0,_=1/0;for(let U=1;U<$.length-1;U++){if($[U]==="(")W++;if($[U]===")")W--;_=Math.min(_,W)}if(_>=0)$=$.slice(1,-1);else break}return $}unwrapIfBranch($){if(Array.isArray($)&&$.length===1&&(!Array.isArray($[0])||$[0][0]!=="block"))return $[0];return $}flattenBinaryChain($){if(!Array.isArray($)||$.length<3)return $;let[W,..._]=$;if(W!=="&&"&&W!=="||")return $;let U=[],u=(f)=>{if(Array.isArray(f)&&f[0]===W)for(let F=1;F<f.length;F++)u(f[F]);else U.push(f)};for(let f of _)u(f);return[W,...U]}hasStatementInBranch($){if(!Array.isArray($))return!1;let W=$[0];if(W==="return"||W==="throw"||W==="break"||W==="continue")return!0;if(W==="block")return $.slice(1).some((_)=>this.hasStatementInBranch(_));return!1}hasNestedMultiStatement($){if(!Array.isArray($))return!1;if($[0]==="if"){let[W,_,U,...u]=$;return this.is(U,"block")&&U.length>2||u.some((f)=>this.hasNestedMultiStatement(f))}return!1}buildTernaryChain($){if($.length===0)return"undefined";if($.length===1)return this.extractExpression(this.unwrapIfBranch($[0]));let W=$[0];if(this.is(W,"if")){let[_,U,u,...f]=W,F=this.extractExpression(this.unwrapIfBranch(u)),Y=this.buildTernaryChain([...f,...$.slice(1)]);return`(${this.generate(U,"value")} ? ${F} : ${Y})`}return this.extractExpression(this.unwrapIfBranch(W))}collectVarsFromArray($,W){$.slice(1).forEach((_)=>{if(_===","||_==="...")return;if(typeof _==="string"){W.add(_);return}if(Array.isArray(_)){if(_[0]==="..."&&typeof _[1]==="string")W.add(_[1]);else if(_[0]==="array")this.collectVarsFromArray(_,W);else if(_[0]==="object")this.collectVarsFromObject(_,W)}})}collectVarsFromObject($,W){$.slice(1).forEach((_)=>{if(!Array.isArray(_))return;if(_[0]==="..."&&typeof _[1]==="string"){W.add(_[1]);return}if(_.length>=2){let[U,u,f]=_;if(f==="="){if(typeof U==="string")W.add(U)}else if(typeof u==="string")W.add(u);else if(Array.isArray(u)){if(u[0]==="array")this.collectVarsFromArray(u,W);else if(u[0]==="object")this.collectVarsFromObject(u,W)}}})}extractStringContent($){let W=S($).slice(1,-1),_=V($,"indent");if(_)W=W.replace(new RegExp(`\\n${_}`,"g"),`
286
286
  `);if(V($,"initialChunk")&&W.startsWith(`
287
287
  `))W=W.slice(1);if(V($,"finalChunk")&&W.endsWith(`
288
288
  `))W=W.slice(0,-1);return W}processHeregex($){let W="",_=!1,U=0,u=()=>{let f=0,F=U-1;while(F>=0&&$[F]==="\\")f++,F--;return f%2===1};while(U<$.length){let f=$[U];if(f==="["&&!u()){_=!0,W+=f,U++;continue}if(f==="]"&&_&&!u()){_=!1,W+=f,U++;continue}if(_){W+=f,U++;continue}if(/\s/.test(f)){U++;continue}if(f==="#"){if(u()){W+=f,U++;continue}let F=U-1;while(F>=0&&$[F]==="\\")F--;if(F<U-1){W+=f,U++;continue}while(U<$.length&&$[U]!==`
@@ -534,7 +534,7 @@ globalThis.sleep ??= (ms) => new Promise(r => setTimeout(r, ms));
534
534
  globalThis.todo ??= (msg) => { throw new Error(msg || "Not implemented"); };
535
535
  globalThis.warn ??= console.warn;
536
536
  globalThis.zip ??= (...a) => a[0].map((_, i) => a.map(b => b[i]));
537
- `}function A1(){return new C({}).getReactiveRuntime()}function Z1(){return new C({}).getComponentRuntime()}var H2="3.13.15",z2="2026-02-25@06:33:14GMT";if(typeof globalThis<"u"){if(!globalThis.__rip)Function(A1())();if(!globalThis.__ripComponent)Function(Z1())()}var g3=($)=>{let W=$.match(/^[ \t]*(?=\S)/gm),_=Math.min(...(W||[]).map((U)=>U.length));return $.replace(RegExp(`^[ ]{${_}}`,"gm"),"").trim()};async function O2(){let $=[],W=document.querySelector('script[src$="rip.min.js"], script[src$="rip.js"]'),_=W?.getAttribute("data-src");if(_){for(let u of _.trim().split(/\s+/))if(u)$.push({url:u})}for(let u of document.querySelectorAll('script[type="text/rip"]'))if(u.src)$.push({url:u.src});else{let f=g3(u.textContent);if(f)$.push({code:f})}if($.length>0){await Promise.all($.map(async(F)=>{if(!F.url)return;try{let Y=await fetch(F.url);if(!Y.ok){console.error(`Rip: failed to fetch ${F.url} (${Y.status})`);return}F.code=await Y.text()}catch(Y){console.error(`Rip: failed to fetch ${F.url}:`,Y.message)}}));let u={skipRuntimes:!0,skipExports:!0},f=[];for(let F of $){if(!F.code)continue;try{f.push(n(F.code,u))}catch(Y){console.error("Rip compile error:",Y.message)}}if(f.length>0){let F=f.join(`
537
+ `}function A1(){return new C({}).getReactiveRuntime()}function Z1(){return new C({}).getComponentRuntime()}var H2="3.13.17",z2="2026-02-25@08:50:22GMT";if(typeof globalThis<"u"){if(!globalThis.__rip)Function(A1())();if(!globalThis.__ripComponent)Function(Z1())()}var g3=($)=>{let W=$.match(/^[ \t]*(?=\S)/gm),_=Math.min(...(W||[]).map((U)=>U.length));return $.replace(RegExp(`^[ ]{${_}}`,"gm"),"").trim()};async function O2(){let $=[],W=document.querySelector('script[src$="rip.min.js"], script[src$="rip.js"]'),_=W?.getAttribute("data-src");if(_){for(let u of _.trim().split(/\s+/))if(u)$.push({url:u})}for(let u of document.querySelectorAll('script[type="text/rip"]'))if(u.src)$.push({url:u.src});else{let f=g3(u.textContent);if(f)$.push({code:f})}if($.length>0){await Promise.all($.map(async(F)=>{if(!F.url)return;try{let Y=await fetch(F.url);if(!Y.ok){console.error(`Rip: failed to fetch ${F.url} (${Y.status})`);return}F.code=await Y.text()}catch(Y){console.error(`Rip: failed to fetch ${F.url}:`,Y.message)}}));let u={skipRuntimes:!0,skipExports:!0},f=[];for(let F of $){if(!F.code)continue;try{f.push(n(F.code,u))}catch(Y){console.error("Rip compile error:",Y.message)}}if(f.length>0){let F=f.join(`
538
538
  `),Y=W?.getAttribute("data-mount");if(Y){let A=W.getAttribute("data-target")||"body";F+=`
539
539
  ${Y}.mount(${JSON.stringify(A)});`}try{await(0,eval)(`(async()=>{
540
540
  ${F}
Binary file
package/docs/index.html CHANGED
@@ -378,10 +378,6 @@
378
378
  border-radius: 5px !important;
379
379
  }
380
380
 
381
- .monaco-editor .deprecated {
382
- text-decoration: none !important;
383
- }
384
-
385
381
  /* Welcome message */
386
382
  .welcome {
387
383
  color: #858585;
@@ -848,6 +844,10 @@
848
844
  monaco.languages.setMonarchTokensProvider 'rip', window.ripMonarch
849
845
  monaco.languages.setLanguageConfiguration 'rip', window.ripLanguageConfig
850
846
 
847
+ # Disable TypeScript suggestion diagnostics (prevents deprecated strikethrough on e.g. `name`)
848
+ monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions
849
+ noSuggestionDiagnostics: true
850
+
851
851
  # ====================================================================
852
852
  # Restore Persisted State
853
853
  # ====================================================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rip-lang",
3
- "version": "3.13.16",
3
+ "version": "3.13.18",
4
4
  "description": "A modern language that compiles to JavaScript",
5
5
  "type": "module",
6
6
  "main": "src/compiler.js",