diff --git a/.agents/skills/livecodes/language-support/references/languages.md b/.agents/skills/livecodes/language-support/references/languages.md
index cf010809be..fc139398d9 100644
--- a/.agents/skills/livecodes/language-support/references/languages.md
+++ b/.agents/skills/livecodes/language-support/references/languages.md
@@ -151,6 +151,7 @@ Enabled via `processors` config:
| Swift (Wasm) | `swift-wasm`, `swift`, `wasm.swift` | Swift WASM |
| Zig (Wasm) | `zig-wasm`, `zig` | Zig WASM |
| V (Wasm) | `v-wasm`, `v`, `vlang`, `wasm.v`, `vsh` | V compiler in WASM |
+| Janet (Wasm) | `janet-wasm`, `janet`, `wasm.janet` | Janet interpreter (WASM) |
| Tcl | `tcl` | Tcl interpreter |
| WebAssembly | `wat`, `wast`, `wasm`, `webassembly` | WAT format |
| Assembly (Wasm) | `assembly-wasm`, `assembly`, `asm`, `asm-wasm`, `x86`, `x86-64`, `nasm`, `wasm.asm` | Keystone + Unicorn (WASM), x86-64 assembly |
diff --git a/README.md b/README.md
index b5c7177fe9..df5adff082 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ A [feature-rich](https://livecodes.io/docs/features/), open-source, **client-sid
[](https://www.npmjs.com/package/livecodes)
[](https://www.npmjs.com/package/livecodes)
[](https://www.jsdelivr.com/package/npm/livecodes)
-[](https://livecodes.io/docs/languages/)
+[](https://livecodes.io/docs/languages/)
[](https://livecodes.io/docs/)
[](https://livecodes.io/docs/llms.txt)
[](https://livecodes.io/docs/llms-full.txt)
diff --git a/docs/docs/languages/janet-wasm.mdx b/docs/docs/languages/janet-wasm.mdx
new file mode 100644
index 0000000000..da405c5c0c
--- /dev/null
+++ b/docs/docs/languages/janet-wasm.mdx
@@ -0,0 +1,119 @@
+# Janet (Wasm)
+
+[Janet](https://janet-lang.org/) is a lightweight, embeddable, Lisp-like (Clojure-like), dynamically
+typed programming language.
+
+In LiveCodes, Janet runs in the browser on the Janet interpreter compiled to WebAssembly, entirely
+client-side. No server is involved.
+
+## Usage
+
+Demo:
+
+import LiveCodes from '../../src/components/LiveCodes.tsx';
+
+export const janetConfig = {
+ activeEditor: 'script',
+ script: {
+ language: 'janet-wasm',
+ content: `(print "Hello, World!")`,
+ },
+ mode: 'simple',
+ editor: 'auto',
+ tools: {
+ status: 'full',
+ },
+};
+
+
+
+### Standard I/O
+
+The program runs on the [result page](../features/result.mdx). Anything it prints is captured and
+shown in the [console](../features/console.mdx). Standard input is passed by setting the
+`livecodes.janetWasm.input` property in JavaScript before the program runs. It is read in Janet with
+`(file/read stdin :all)` and friends; a program that never reads never notices it was there. To run
+again with new input, call `livecodes.janetWasm.run(input)`.
+
+### Communication with JavaScript
+
+A few helper properties and methods are available in the browser global `livecodes.janetWasm`
+object:
+
+- `livecodes.janetWasm.input`: the standard input passed to the program.
+- `livecodes.janetWasm.loaded`: a promise that resolves when the interpreter has downloaded and the
+ program has run once. It rejects if the runtime fails to load. Other helpers should be used after
+ it resolves.
+- `livecodes.janetWasm.output`: the program's output, standard output and standard error in the
+ order the program wrote them.
+- `livecodes.janetWasm.error`: the interpreter diagnostics, if the program failed.
+- `livecodes.janetWasm.exitCode`: the exit code of the program (`0` ok, `1` runtime error, `2`
+ compile error, `4` parse error).
+- `livecodes.janetWasm.run(input)`: runs the code again with new input, returning a promise that
+ resolves to `{ output, error, exitCode }`.
+
+Example:
+
+
+
+## Language Info
+
+### Name
+
+`janet-wasm`
+
+### Aliases / Extensions
+
+`janet`, `wasm.janet`
+
+### Editor
+
+`script`
+
+## Compiler
+
+The [Janet](https://janet-lang.org/) interpreter compiled to WebAssembly (built with Emscripten), packaged by
+[@live-codes/janet-wasm](https://www.npmjs.com/package/@live-codes/janet-wasm).
+
+### Version
+
+Janet 1.42.1.
+
+## Code Formatting
+
+Not currently supported.
+
+## Live Reload
+
+By default, new code changes are sent to the result page for re-evaluation without a full page
+reload, avoiding the need to reload the interpreter. This behavior can be disabled by adding the code
+comment `# __livecodes_reload__` to the Janet code, which forces a full page reload.
+
+This comment can be added in the [`hiddenContent` property of the editor](../configuration/configuration-object.mdx#markup) for embedded playgrounds.
+
+## Example Usage
+
+```janet
+(defn fib [n]
+ (if (< n 2)
+ n
+ (+ (fib (- n 1)) (fib (- n 2)))))
+
+(each n (range 10)
+ (prin (fib n) " "))
+(print)
+```
+
+Each run is independent: definitions from one run do not survive into the next.
+
+## Starter Template
+
+https://livecodes.io/?template=janet-wasm
+
+## Links
+
+- [Janet official website](https://janet-lang.org/)
+- [Janet documentation](https://janet-lang.org/docs/index.html)
+- [Learn X in Y minutes, where X=Janet](https://learnxinyminutes.com/janet/)
+- [Janet for Mortals](https://janet.guide/)
+- [@live-codes/janet-wasm](https://www.npmjs.com/package/@live-codes/janet-wasm)
diff --git a/docs/src/components/LanguageSliders.tsx b/docs/src/components/LanguageSliders.tsx
index 13dd3005a0..6116778a29 100644
--- a/docs/src/components/LanguageSliders.tsx
+++ b/docs/src/components/LanguageSliders.tsx
@@ -80,6 +80,7 @@ export default function Sliders() {
{ name: 'ocaml', title: 'OCaml' },
{ name: 'nim', title: 'Nim' },
{ name: 'nim-wasm', title: 'Nim (Wasm)' },
+ { name: 'janet-wasm', title: 'Janet (Wasm)' },
{ name: 'python', title: 'Python' },
{ name: 'python-wasm', title: 'Python (Wasm)' },
{ name: 'r', title: 'R' },
diff --git a/docs/src/components/TemplateList.tsx b/docs/src/components/TemplateList.tsx
index 2bf4915b38..9b7916baf7 100644
--- a/docs/src/components/TemplateList.tsx
+++ b/docs/src/components/TemplateList.tsx
@@ -39,6 +39,7 @@ const templates = [
{ name: 'ocaml', title: 'Ocaml Starter', thumbnail: 'ocaml.svg' },
{ name: 'nim', title: 'Nim Starter', thumbnail: 'nim.svg' },
{ name: 'nim-wasm', title: 'Nim (Wasm) Starter', thumbnail: 'nim.svg' },
+ { name: 'janet-wasm', title: 'Janet (Wasm) Starter', thumbnail: 'janet.png' },
{ name: 'python', title: 'Python Starter', thumbnail: 'python.svg' },
{ name: 'python-wasm', title: 'Python (Wasm) Starter', thumbnail: 'python.svg' },
{ name: 'r', title: 'R Starter', thumbnail: 'r.svg' },
diff --git a/e2e/specs/starter.spec.ts b/e2e/specs/starter.spec.ts
index 1cd4c3b6a5..e284e5bec9 100644
--- a/e2e/specs/starter.spec.ts
+++ b/e2e/specs/starter.spec.ts
@@ -534,6 +534,32 @@ test.describe('Starter Templates from UI', () => {
await expect(getResult().locator('h1')).toHaveText('Hello, Nim!');
await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.');
});
+ test('janet-wasm Starter', async ({ page, getTestUrl }) => {
+ // the interpreter (~0.9 MB) is downloaded on the first run
+ test.slow();
+
+ await page.goto(getTestUrl());
+
+ const { app, getResult, waitForResultUpdate } = await getLoadedApp(page);
+
+ await app.click('[aria-label="Project"]');
+ await app.click('text=New');
+ await app.click('text=Janet (Wasm) Starter');
+
+ await waitForEditorFocus(app);
+ await waitForResultUpdate();
+
+ // the counter stays disabled until the interpreter has loaded and run once
+ await expect(getResult().locator('#counter-button')).toBeEnabled({ timeout: 120_000 });
+
+ await getResult().click('text=Click me');
+ await getResult().click('text=Click me');
+ await getResult().click('text=Click me');
+
+ await expect(getResult().locator('h1')).toHaveText('Hello, Janet!');
+ await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.');
+ });
+
test('haskell Starter', async ({ page, getTestUrl }) => {
test.slow();
@@ -1320,6 +1346,28 @@ test.describe('Starter Templates from URL', () => {
await expect(getResult().locator('h1')).toHaveText('Hello, Nim!');
await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.');
});
+ test('janet-wasm Starter (in URL)', async ({ page, getTestUrl }) => {
+ // the interpreter (~0.9 MB) is downloaded on the first run
+ test.slow();
+
+ await page.goto(getTestUrl({ template: 'janet-wasm' }));
+
+ const { app, getResult, waitForResultUpdate } = await getLoadedApp(page);
+
+ await waitForEditorFocus(app);
+ await waitForResultUpdate();
+
+ // the counter stays disabled until the interpreter has loaded and run once
+ await expect(getResult().locator('#counter-button')).toBeEnabled({ timeout: 120_000 });
+
+ await getResult().click('text=Click me');
+ await getResult().click('text=Click me');
+ await getResult().click('text=Click me');
+
+ await expect(getResult().locator('h1')).toHaveText('Hello, Janet!');
+ await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.');
+ });
+
test('haskell Starter (in URL)', async ({ page, getTestUrl }) => {
test.slow();
diff --git a/functions/vendors/templates.js b/functions/vendors/templates.js
index 9f4eaad59f..739552b506 100644
--- a/functions/vendors/templates.js
+++ b/functions/vendors/templates.js
@@ -39,6 +39,7 @@ export const starterTemplates = {
"ocaml": "Ocaml Starter",
"nim": "Nim Starter",
"nim-wasm": "Nim (Wasm) Starter",
+ "janet-wasm": "Janet (Wasm) Starter",
"python": "Python Starter",
"python-wasm": "Python (Wasm) Starter",
"r": "R Starter",
diff --git a/scripts/build.js b/scripts/build.js
index 3764c3832f..60cf2fc2da 100644
--- a/scripts/build.js
+++ b/scripts/build.js
@@ -229,6 +229,7 @@ const iifeBuild = () =>
'languages/cpp/lang-cpp-script.ts',
'languages/clang-wasm/lang-clang-wasm-script.ts',
'languages/nim/lang-nim-wasm-script.ts',
+ 'languages/janet-wasm/lang-janet-wasm-script.ts',
'languages/fortran-wasm/lang-fortran-wasm-script.ts',
'languages/d-wasm/lang-d-wasm-script.ts',
'languages/cobol-wasm/lang-cobol-wasm-script.ts',
diff --git a/server/php/inc/starter-templates.json b/server/php/inc/starter-templates.json
index 068ab8c5fc..bc6c15a792 100644
--- a/server/php/inc/starter-templates.json
+++ b/server/php/inc/starter-templates.json
@@ -39,6 +39,7 @@
"ocaml": "Ocaml Starter",
"nim": "Nim Starter",
"nim-wasm": "Nim (Wasm) Starter",
+ "janet-wasm": "Janet (Wasm) Starter",
"python": "Python Starter",
"python-wasm": "Python (Wasm) Starter",
"r": "R Starter",
diff --git a/src/livecodes/UI/command-menu-actions.ts b/src/livecodes/UI/command-menu-actions.ts
index ca1c7e9bf9..544e84566e 100644
--- a/src/livecodes/UI/command-menu-actions.ts
+++ b/src/livecodes/UI/command-menu-actions.ts
@@ -295,6 +295,7 @@ export const getCommandMenuActions = ({
'ocaml',
'nim',
'nim-wasm',
+ 'janet-wasm',
'python',
'python-wasm',
'r',
diff --git a/src/livecodes/assets/templates/janet.png b/src/livecodes/assets/templates/janet.png
new file mode 100644
index 0000000000..ee9b99235d
Binary files /dev/null and b/src/livecodes/assets/templates/janet.png differ
diff --git a/src/livecodes/html/language-info.html b/src/livecodes/html/language-info.html
index cdaa58ed3d..e1fa33fbca 100644
--- a/src/livecodes/html/language-info.html
+++ b/src/livecodes/html/language-info.html
@@ -1130,6 +1130,39 @@
Imba
Official website
+
+ Janet (Wasm)
+
+ The
Janet interpreter
+ compiled to WebAssembly, running entirely in the browser. It supports standard input and real
+ exit codes.
+
+
+
Java
diff --git a/src/livecodes/i18n/locales/ar/language-info.lokalise.json b/src/livecodes/i18n/locales/ar/language-info.lokalise.json
index 7ed13a665c..ecacb9d946 100644
--- a/src/livecodes/i18n/locales/ar/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ar/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "مفسر
Janet المُجمَّع إلى WebAssembly يعمل بالكامل داخل المتصفح. يدعم الإدخال القياسي ورموز الخروج الحقيقية."
+ },
+ "janetWasm.link": {
+ "translation": "
الموقع الرسمي لـ Janet وثائق Janet تعلم X في Y دقيقة، حيث X = Janet وثائق LiveCodes تحميل قالب البدء "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM يعمل في المتصفح باستخدام DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/ar/language-info.ts b/src/livecodes/i18n/locales/ar/language-info.ts
index 9db3590f7d..6ad5552db2 100644
--- a/src/livecodes/i18n/locales/ar/language-info.ts
+++ b/src/livecodes/i18n/locales/ar/language-info.ts
@@ -219,6 +219,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>الموقع الرسمي2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'مفسر <1>Janet1> المُجمَّع إلى WebAssembly يعمل بالكامل داخل المتصفح. يدعم الإدخال القياسي ورموز الخروج الحقيقية.',
+ link: '<1><2>الموقع الرسمي لـ Janet2>1> <3> <4>وثائق Janet4> 3> <5> <6>تعلم X في Y دقيقة، حيث X = Janet6> 5> <7> <8>وثائق LiveCodes8> 7> <9> <10>تحميل قالب البدء10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM يعمل في المتصفح باستخدام DoppioJVM.',
link: '<1> <2>موقع جافا الرسمي2> 1> <3> <4> DoppioJVM4> 3> <5> <6> تعلم X في دقائق Y، حيث X = جافا6> 5> <7> <8>وثائق LiveCodes8> 7> <9> <10> تحميل قالب البدء10> 9>',
diff --git a/src/livecodes/i18n/locales/ar/translation.lokalise.json b/src/livecodes/i18n/locales/ar/translation.lokalise.json
index 1d95e3dc68..2f8a40d5e6 100644
--- a/src/livecodes/i18n/locales/ar/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ar/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "قالب Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "قالب Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "قالب Java"
},
diff --git a/src/livecodes/i18n/locales/ar/translation.ts b/src/livecodes/i18n/locales/ar/translation.ts
index 0b0c2cb55a..827b955a0a 100644
--- a/src/livecodes/i18n/locales/ar/translation.ts
+++ b/src/livecodes/i18n/locales/ar/translation.ts
@@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'قالب Haskell (Wasm)',
heading: 'قوالب البداية',
imba: 'قالب Imba',
+ 'janet-wasm': 'قالب Janet (Wasm)',
java: 'قالب Java',
javascript: 'قالب JavaScript',
jest: 'قالب Jest',
diff --git a/src/livecodes/i18n/locales/bn/language-info.lokalise.json b/src/livecodes/i18n/locales/bn/language-info.lokalise.json
index b0003018c9..c67b5a33c6 100644
--- a/src/livecodes/i18n/locales/bn/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/bn/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "
Janet ইন্টারপ্রেটার WebAssembly-তে কম্পাইল করা হয়েছে এবং এটি সম্পূর্ণভাবে ব্রাউজারে চলে। এটি স্ট্যান্ডার্ড ইনপুট এবং প্রকৃত এক্সিট কোড সমর্থন করে।"
+ },
+ "janetWasm.link": {
+ "translation": "
Janet অফিসিয়াল ওয়েবসাইট Janet ডকুমেন্টেশন Y মিনিটে X শিখুন, যেখানে X=Janet লাইভকোড ডকুমেন্টেশন স্টার্টার টেমপ্লেট লোড করুন "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।"
},
diff --git a/src/livecodes/i18n/locales/bn/language-info.ts b/src/livecodes/i18n/locales/bn/language-info.ts
index 80cd7b1ab3..4402c8a2ac 100644
--- a/src/livecodes/i18n/locales/bn/language-info.ts
+++ b/src/livecodes/i18n/locales/bn/language-info.ts
@@ -220,6 +220,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>অফিসিয়াল ওয়েবসাইট2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: '<1>Janet1> ইন্টারপ্রেটার WebAssembly-তে কম্পাইল করা হয়েছে এবং এটি সম্পূর্ণভাবে ব্রাউজারে চলে। এটি স্ট্যান্ডার্ড ইনপুট এবং প্রকৃত এক্সিট কোড সমর্থন করে।',
+ link: '<1><2>Janet অফিসিয়াল ওয়েবসাইট2>1> <3> <4>Janet ডকুমেন্টেশন4> 3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=Janet6> 5> <7> <8>লাইভকোড ডকুমেন্টেশন8> 7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।',
link: '<1> <2>Java অফিসিয়াল ওয়েবসাইট2> 1> <3> <4>DoppioJVM4> 3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=java6> 5> <7> <8>LiveCodes ডকুমেন্টেশন8> 7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন10> 9>',
diff --git a/src/livecodes/i18n/locales/bn/translation.lokalise.json b/src/livecodes/i18n/locales/bn/translation.lokalise.json
index b7b2d0ff7a..b6d7131662 100644
--- a/src/livecodes/i18n/locales/bn/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/bn/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba স্টার্টার"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet (Wasm) স্টার্টার"
+ },
"templates.starter.java": {
"translation": "Java স্টার্টার"
},
diff --git a/src/livecodes/i18n/locales/bn/translation.ts b/src/livecodes/i18n/locales/bn/translation.ts
index 95fe1623c2..6acfc6e34c 100644
--- a/src/livecodes/i18n/locales/bn/translation.ts
+++ b/src/livecodes/i18n/locales/bn/translation.ts
@@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm) স্টার্টার',
heading: 'স্টার্টার টেমপ্লেট',
imba: 'Imba স্টার্টার',
+ 'janet-wasm': 'Janet (Wasm) স্টার্টার',
java: 'Java স্টার্টার',
javascript: 'JavaScript স্টার্টার',
jest: 'Jest স্টার্টার',
diff --git a/src/livecodes/i18n/locales/de/language-info.lokalise.json b/src/livecodes/i18n/locales/de/language-info.lokalise.json
index 9cf76f4dfb..d0cf8bfaa0 100644
--- a/src/livecodes/i18n/locales/de/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/de/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "Der
Janet-Interpreter wird zu WebAssembly kompiliert und läuft vollständig im Browser. Er unterstützt Standardeingabe und echte Exit-Codes."
+ },
+ "janetWasm.link": {
+ "translation": "
Offizielle Janet-Website Janet-Dokumentation Lerne X in Y Minuten, wobei X = Janet LiveCodes-Dokumentation Startervorlage laden "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM läuft im Browser mit DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/de/language-info.ts b/src/livecodes/i18n/locales/de/language-info.ts
index ae295de461..6bf452354a 100644
--- a/src/livecodes/i18n/locales/de/language-info.ts
+++ b/src/livecodes/i18n/locales/de/language-info.ts
@@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Offizielle Website2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'Der <1>Janet1>-Interpreter wird zu WebAssembly kompiliert und läuft vollständig im Browser. Er unterstützt Standardeingabe und echte Exit-Codes.',
+ link: '<1><2>Offizielle Janet-Website2>1> <3> <4>Janet-Dokumentation4> 3> <5> <6>Lerne X in Y Minuten, wobei X = Janet6> 5> <7> <8>LiveCodes-Dokumentation8> 7> <9> <10>Startervorlage laden10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM läuft im Browser mit DoppioJVM.',
link: '<1> <2>Offizielle Java-Website2> 1> <3> <4> DoppioJVM4> 3> <5> <6> Lernen Sie X in Y Minuten, wobei X=java6> 5> <7> <8>LiveCodes Dokumentation8> 7> <9> <10> Laden Sie die Startvorlage10> 9>',
diff --git a/src/livecodes/i18n/locales/de/translation.lokalise.json b/src/livecodes/i18n/locales/de/translation.lokalise.json
index e731b522db..1ced5a1329 100644
--- a/src/livecodes/i18n/locales/de/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/de/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba-Starter"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet (Wasm)-Starter"
+ },
"templates.starter.java": {
"translation": "Java-Starter"
},
diff --git a/src/livecodes/i18n/locales/de/translation.ts b/src/livecodes/i18n/locales/de/translation.ts
index c624316dec..c9a63f7039 100644
--- a/src/livecodes/i18n/locales/de/translation.ts
+++ b/src/livecodes/i18n/locales/de/translation.ts
@@ -1015,6 +1015,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm)-Starter',
heading: 'Starter-Vorlagen',
imba: 'Imba-Starter',
+ 'janet-wasm': 'Janet (Wasm)-Starter',
java: 'Java-Starter',
javascript: 'JavaScript-Starter',
jest: 'Jest-Starter',
diff --git a/src/livecodes/i18n/locales/en/language-info.lokalise.json b/src/livecodes/i18n/locales/en/language-info.lokalise.json
index c0c2f4cc9f..4712dac76b 100644
--- a/src/livecodes/i18n/locales/en/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/en/language-info.lokalise.json
@@ -516,6 +516,18 @@
"notes": "",
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "notes": "###
###\n\n\n",
+ "translation": "The Janet interpreter compiled to WebAssembly, running entirely in the browser. It supports standard input and real exit codes."
+ },
+ "janetWasm.link": {
+ "notes": "### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n",
+ "translation": " Janet official website Janet documentation Learn X in Y minutes, where X=Janet LiveCodes Documentation Load starter template "
+ },
+ "janetWasm.name": {
+ "notes": "",
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"notes": "",
"translation": "JVM running in the browser using DoppioJVM."
diff --git a/src/livecodes/i18n/locales/en/language-info.ts b/src/livecodes/i18n/locales/en/language-info.ts
index 3d17c4a968..44e984bb7d 100644
--- a/src/livecodes/i18n/locales/en/language-info.ts
+++ b/src/livecodes/i18n/locales/en/language-info.ts
@@ -228,6 +228,11 @@ const languageInfo = {
link: '<1><2>Official website2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'The <1>Janet1> interpreter compiled to WebAssembly, running entirely in the browser. It supports standard input and real exit codes.',
+ link: '<1> <2>Janet official website2> 1> <3> <4>Janet documentation4> 3> <5> <6>Learn X in Y minutes, where X=Janet6> 5> <7> <8>LiveCodes Documentation8> 7> <9> <10>Load starter template10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM running in the browser using DoppioJVM.',
link: '<1> <2>Java official website2> 1> <3> <4>DoppioJVM4> 3> <5> <6>Learn X in Y minutes, where X=java6> 5> <7> <8>LiveCodes Documentation8> 7> <9> <10>Load starter template10> 9>',
diff --git a/src/livecodes/i18n/locales/en/translation.lokalise.json b/src/livecodes/i18n/locales/en/translation.lokalise.json
index d872d070f9..deeb09852c 100644
--- a/src/livecodes/i18n/locales/en/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/en/translation.lokalise.json
@@ -2696,6 +2696,10 @@
"notes": "",
"translation": "Imba Starter"
},
+ "templates.starter.janet-wasm": {
+ "notes": "",
+ "translation": "Janet (Wasm) Starter"
+ },
"templates.starter.java": {
"notes": "",
"translation": "Java Starter"
diff --git a/src/livecodes/i18n/locales/en/translation.ts b/src/livecodes/i18n/locales/en/translation.ts
index 9c5f207032..890397c767 100644
--- a/src/livecodes/i18n/locales/en/translation.ts
+++ b/src/livecodes/i18n/locales/en/translation.ts
@@ -1020,6 +1020,7 @@ const translation = {
'haskell-wasm': 'Haskell (Wasm) Starter',
heading: 'Starter Templates',
imba: 'Imba Starter',
+ 'janet-wasm': 'Janet (Wasm) Starter',
java: 'Java Starter',
javascript: 'JavaScript Starter',
jest: 'Jest Starter',
diff --git a/src/livecodes/i18n/locales/es/language-info.lokalise.json b/src/livecodes/i18n/locales/es/language-info.lokalise.json
index 68b852c42d..b6836edd42 100644
--- a/src/livecodes/i18n/locales/es/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/es/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "El intérprete de Janet se compila a WebAssembly y se ejecuta íntegramente en el navegador. Admite entrada estándar y códigos de salida reales."
+ },
+ "janetWasm.link": {
+ "translation": "Página web oficial de Janet Documentación de Janet Aprende X en Y minutos, donde X = Janet Documentación de LiveCodes Cargar plantilla de inicio "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM ejecutándose en el navegador utilizando DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/es/language-info.ts b/src/livecodes/i18n/locales/es/language-info.ts
index dc99f54d31..8939677802 100644
--- a/src/livecodes/i18n/locales/es/language-info.ts
+++ b/src/livecodes/i18n/locales/es/language-info.ts
@@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Sitio web oficial2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'El intérprete de <1>Janet1> se compila a WebAssembly y se ejecuta íntegramente en el navegador. Admite entrada estándar y códigos de salida reales.',
+ link: '<1><2>Página web oficial de Janet2>1> <3> <4>Documentación de Janet4> 3> <5> <6>Aprende X en Y minutos, donde X = Janet6> 5> <7> <8>Documentación de LiveCodes8> 7> <9> <10>Cargar plantilla de inicio10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM ejecutándose en el navegador utilizando DoppioJVM.',
link: '<1> <2>Sitio web oficial de Java2> 1> <3> <4> DoppioJVM4> 3> <5> <6> Aprenda X en Y minutos, donde X=java6> 5> <7> <8>Documentación de LiveCodes8> 7> <9> <10> Cargue la plantilla de inicio10> 9>',
diff --git a/src/livecodes/i18n/locales/es/translation.lokalise.json b/src/livecodes/i18n/locales/es/translation.lokalise.json
index fcca52e95f..6952ed5cbe 100644
--- a/src/livecodes/i18n/locales/es/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/es/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Inicio Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Inicio Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "Inicio Java"
},
diff --git a/src/livecodes/i18n/locales/es/translation.ts b/src/livecodes/i18n/locales/es/translation.ts
index a480c758d3..beb2e5a3de 100644
--- a/src/livecodes/i18n/locales/es/translation.ts
+++ b/src/livecodes/i18n/locales/es/translation.ts
@@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Inicio Haskell (Wasm)',
heading: 'Plantillas de Inicio',
imba: 'Inicio Imba',
+ 'janet-wasm': 'Inicio Janet (Wasm)',
java: 'Inicio Java',
javascript: 'Inicio JavaScript',
jest: 'Inicio Jest',
diff --git a/src/livecodes/i18n/locales/fa/language-info.lokalise.json b/src/livecodes/i18n/locales/fa/language-info.lokalise.json
index e48b2a39a5..ad65cc88a6 100644
--- a/src/livecodes/i18n/locales/fa/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/fa/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "مفسر Janet که به WebAssembly کامپایل شده و کاملاً در مرورگر اجرا میشود. از ورودی استاندارد و کدهای خروج واقعی پشتیبانی میکند."
+ },
+ "janetWasm.link": {
+ "translation": "وبسایت رسمی Janet اسناد Janet یادگیری X در Y دقیقه، که X=Janet مستندات LiveCodes بارگیری قالب شروع "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "اجرای JVM در مرورگر با استفاده از DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/fa/language-info.ts b/src/livecodes/i18n/locales/fa/language-info.ts
index 9fb2bf347b..7c7695ade0 100644
--- a/src/livecodes/i18n/locales/fa/language-info.ts
+++ b/src/livecodes/i18n/locales/fa/language-info.ts
@@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>وبسایت رسمی2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'مفسر <1>Janet1> که به WebAssembly کامپایل شده و کاملاً در مرورگر اجرا میشود. از ورودی استاندارد و کدهای خروج واقعی پشتیبانی میکند.',
+ link: '<1><2>وبسایت رسمی Janet2>1> <3> <4>اسناد Janet4> 3> <5> <6>یادگیری X در Y دقیقه، که X=Janet6> 5> <7> <8>مستندات LiveCodes8> 7> <9> <10>بارگیری قالب شروع10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'اجرای JVM در مرورگر با استفاده از DoppioJVM.',
link: '<1> <2>وبسایت رسمی جاوا2> 1> <3> <4>DoppioJVM4> 3> <5> <6>یادگیری X در Y دقیقه، جایی که X=java6> 5> <7> <8>مستندات LiveCodes8> 7> <9> <10>بارگذاری قالب شروع کننده10> 9>',
diff --git a/src/livecodes/i18n/locales/fa/translation.lokalise.json b/src/livecodes/i18n/locales/fa/translation.lokalise.json
index 1cce6702a1..9bc68e397b 100644
--- a/src/livecodes/i18n/locales/fa/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/fa/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "شروع کننده Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "شروع کننده Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "شروع کننده جاوا"
},
diff --git a/src/livecodes/i18n/locales/fa/translation.ts b/src/livecodes/i18n/locales/fa/translation.ts
index d94657414a..40ea1e79f9 100644
--- a/src/livecodes/i18n/locales/fa/translation.ts
+++ b/src/livecodes/i18n/locales/fa/translation.ts
@@ -1014,6 +1014,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'شروع کننده Haskell (Wasm)',
heading: 'قالبهای شروع کننده',
imba: 'شروع کننده Imba',
+ 'janet-wasm': 'شروع کننده Janet (Wasm)',
java: 'شروع کننده جاوا',
javascript: 'شروع کننده جاوااسکریپت',
jest: 'شروع کننده Jest',
diff --git a/src/livecodes/i18n/locales/fr/language-info.lokalise.json b/src/livecodes/i18n/locales/fr/language-info.lokalise.json
index b7f7ce4e04..c1ff8041eb 100644
--- a/src/livecodes/i18n/locales/fr/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/fr/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "L'interpréteur Janet compilé en WebAssembly s'exécute entièrement dans le navigateur. Il prend en charge l'entrée standard et les véritables codes de sortie."
+ },
+ "janetWasm.link": {
+ "translation": "Site officiel de Janet Documentation Janet Apprenez X en Y minutes, où X = Janet Documentation LiveCodes Charger un modèle de démarrage "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM fonctionnant dans le navigateur à l'aide de DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/fr/language-info.ts b/src/livecodes/i18n/locales/fr/language-info.ts
index 557f68c3a8..da4179e002 100644
--- a/src/livecodes/i18n/locales/fr/language-info.ts
+++ b/src/livecodes/i18n/locales/fr/language-info.ts
@@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Site officiel2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: "L'interpréteur <1>Janet1> compilé en WebAssembly s'exécute entièrement dans le navigateur. Il prend en charge l'entrée standard et les véritables codes de sortie.",
+ link: '<1><2>Site officiel de Janet2>1> <3> <4>Documentation Janet4> 3> <5> <6>Apprenez X en Y minutes, où X = Janet6> 5> <7> <8>Documentation LiveCodes8> 7> <9> <10>Charger un modèle de démarrage10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: "JVM fonctionnant dans le navigateur à l'aide de DoppioJVM.",
link: '<1> <2>Site officiel de Java2> 1> <3> <4> DoppioJVM4> 3> <5> <6> Apprendre X en Y minutes, où X=java6> 5> <7> <8>Documentation LiveCodes8> 7> <9> <10> Charger le modèle de démarrage10> 9>',
diff --git a/src/livecodes/i18n/locales/fr/translation.lokalise.json b/src/livecodes/i18n/locales/fr/translation.lokalise.json
index 37d59bf56a..b79bae534f 100644
--- a/src/livecodes/i18n/locales/fr/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/fr/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Démarrage Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Démarrage Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "Démarrage Java"
},
diff --git a/src/livecodes/i18n/locales/fr/translation.ts b/src/livecodes/i18n/locales/fr/translation.ts
index fc89cfbca4..215de327c3 100644
--- a/src/livecodes/i18n/locales/fr/translation.ts
+++ b/src/livecodes/i18n/locales/fr/translation.ts
@@ -1015,6 +1015,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Démarrage Haskell (Wasm)',
heading: 'Modèles de Démarrage',
imba: 'Démarrage Imba',
+ 'janet-wasm': 'Démarrage Janet (Wasm)',
java: 'Démarrage Java',
javascript: 'Démarrage JavaScript',
jest: 'Démarrage Jest',
diff --git a/src/livecodes/i18n/locales/hi/language-info.lokalise.json b/src/livecodes/i18n/locales/hi/language-info.lokalise.json
index dfea82b146..5486e11bcb 100644
--- a/src/livecodes/i18n/locales/hi/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/hi/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "Janet इंटरप्रेटर को वेबअसेंबली में संकलित किया जाता है और यह पूरी तरह से ब्राउज़र में चलता है। यह मानक इनपुट और वास्तविक निकास कोड का समर्थन करता है।"
+ },
+ "janetWasm.link": {
+ "translation": "Janet आधिकारिक वेबसाइट Janet दस्तावेज Y मिनट में X सीखें, जहाँ X=Janet लाइवकोड दस्तावेजीकरण स्टार्टर टेम्पलेट लोड करें "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "DoppioJVM का उपयोग करके ब्राउज़र में JVM चल रहा है।"
},
diff --git a/src/livecodes/i18n/locales/hi/language-info.ts b/src/livecodes/i18n/locales/hi/language-info.ts
index 0764c5d7da..6bc8749236 100644
--- a/src/livecodes/i18n/locales/hi/language-info.ts
+++ b/src/livecodes/i18n/locales/hi/language-info.ts
@@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>आधिकारिक वेबसाइट2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: '<1>Janet1> इंटरप्रेटर को वेबअसेंबली में संकलित किया जाता है और यह पूरी तरह से ब्राउज़र में चलता है। यह मानक इनपुट और वास्तविक निकास कोड का समर्थन करता है।',
+ link: '<1><2>Janet आधिकारिक वेबसाइट2>1> <3> <4>Janet दस्तावेज4> 3> <5> <6>Y मिनट में X सीखें, जहाँ X=Janet6> 5> <7> <8>लाइवकोड दस्तावेजीकरण8> 7> <9> <10>स्टार्टर टेम्पलेट लोड करें10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'DoppioJVM का उपयोग करके ब्राउज़र में JVM चल रहा है।',
link: '<1> <2>जावा आधिकारिक वेबसाइट2> 1> <3> <4>DoppioJVM4> 3> <5> <6>वाई मिनटों में एक्स सीखें, जहां एक्स=जावा6> 5> <7> <8>LiveCodes दस्तावेज़ीकरण8> 7> <9> <10>स्टार्टर टेम्पलेट लोड करें10> 9>',
diff --git a/src/livecodes/i18n/locales/hi/translation.lokalise.json b/src/livecodes/i18n/locales/hi/translation.lokalise.json
index dbda261870..fbc6ec10c2 100644
--- a/src/livecodes/i18n/locales/hi/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/hi/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba स्टार्टर"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet (Wasm) स्टार्टर"
+ },
"templates.starter.java": {
"translation": "Java स्टार्टर"
},
diff --git a/src/livecodes/i18n/locales/hi/translation.ts b/src/livecodes/i18n/locales/hi/translation.ts
index a022126adb..4727fb6fb3 100644
--- a/src/livecodes/i18n/locales/hi/translation.ts
+++ b/src/livecodes/i18n/locales/hi/translation.ts
@@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm) स्टार्टर',
heading: 'स्टार्टर टेम्पलेट्स',
imba: 'Imba स्टार्टर',
+ 'janet-wasm': 'Janet (Wasm) स्टार्टर',
java: 'Java स्टार्टर',
javascript: 'JavaScript स्टार्टर',
jest: 'Jest स्टार्टर',
diff --git a/src/livecodes/i18n/locales/hu/language-info.lokalise.json b/src/livecodes/i18n/locales/hu/language-info.lokalise.json
index 47d3b16a87..139778ef43 100644
--- a/src/livecodes/i18n/locales/hu/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/hu/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "A Janet értelmező WebAssembly-re van fordítva, és teljes egészében a böngészőben fut. Támogatja a szabványos bemenetet és a valódi kilépési kódokat."
+ },
+ "janetWasm.link": {
+ "translation": "Az Janet hivatalos weboldala Janet dokumentáció Tanulj meg X-et Y perc alatt, ahol X=Janet LiveCodes dokumentáció Kezdő sablon betöltése "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM fut a böngészőben a DoppioJVM használatával."
},
diff --git a/src/livecodes/i18n/locales/hu/language-info.ts b/src/livecodes/i18n/locales/hu/language-info.ts
index 83c1d7ba59..4b3b7083df 100644
--- a/src/livecodes/i18n/locales/hu/language-info.ts
+++ b/src/livecodes/i18n/locales/hu/language-info.ts
@@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Hivatalos weboldal2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'A <1>Janet1> értelmező WebAssembly-re van fordítva, és teljes egészében a böngészőben fut. Támogatja a szabványos bemenetet és a valódi kilépési kódokat.',
+ link: '<1><2>Az Janet hivatalos weboldala2>1> <3> <4>Janet dokumentáció4> 3> <5> <6>Tanulj meg X-et Y perc alatt, ahol X=Janet6> 5> <7> <8>LiveCodes dokumentáció8> 7> <9> <10>Kezdő sablon betöltése10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM fut a böngészőben a DoppioJVM használatával.',
link: '<1> <2>Java hivatalos weboldal2> 1> <3> <4>DoppioJVM4> 3> <5> <6>Tanulj X-et Y perc alatt, ahol X=java6> 5> <7> <8>LiveCodes dokumentáció8> 7> <9> <10>Kezdő sablon betöltése10> 9>',
diff --git a/src/livecodes/i18n/locales/hu/translation.lokalise.json b/src/livecodes/i18n/locales/hu/translation.lokalise.json
index d6723871d6..e66a9aa7be 100644
--- a/src/livecodes/i18n/locales/hu/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/hu/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba kezdő"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet (Wasm) kezdő"
+ },
"templates.starter.java": {
"translation": "Java kezdő"
},
diff --git a/src/livecodes/i18n/locales/hu/translation.ts b/src/livecodes/i18n/locales/hu/translation.ts
index 17652c3700..81de979a54 100644
--- a/src/livecodes/i18n/locales/hu/translation.ts
+++ b/src/livecodes/i18n/locales/hu/translation.ts
@@ -1014,6 +1014,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm) kezdő',
heading: 'Kezdő sablonok',
imba: 'Imba kezdő',
+ 'janet-wasm': 'Janet (Wasm) kezdő',
java: 'Java kezdő',
javascript: 'JavaScript kezdő',
jest: 'Jest kezdő',
diff --git a/src/livecodes/i18n/locales/id/language-info.lokalise.json b/src/livecodes/i18n/locales/id/language-info.lokalise.json
index 76e1aa8708..8f35ebb3a0 100644
--- a/src/livecodes/i18n/locales/id/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/id/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "Interpreter Janet dikompilasi ke WebAssembly dan dijalankan sepenuhnya di dalam browser. Ini mendukung input standar dan kode keluar nyata."
+ },
+ "janetWasm.link": {
+ "translation": "Situs web resmi Janet Dokumentasi Janet Belajar X dalam Y menit, di mana X = Janet Dokumentasi LiveCodes Muat templat awal "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM berjalan di browser menggunakan DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/id/language-info.ts b/src/livecodes/i18n/locales/id/language-info.ts
index 94b7005c42..e4100378b7 100644
--- a/src/livecodes/i18n/locales/id/language-info.ts
+++ b/src/livecodes/i18n/locales/id/language-info.ts
@@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Situs web resmi2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'Interpreter <1>Janet1> dikompilasi ke WebAssembly dan dijalankan sepenuhnya di dalam browser. Ini mendukung input standar dan kode keluar nyata.',
+ link: '<1><2>Situs web resmi Janet2>1> <3> <4>Dokumentasi Janet4> 3> <5> <6>Belajar X dalam Y menit, di mana X = Janet6> 5> <7> <8>Dokumentasi LiveCodes8> 7> <9> <10>Muat templat awal10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM berjalan di browser menggunakan DoppioJVM.',
link: '<1> <2>Situs web resmi Java2> 1> <3> <4>DoppioJVM4> 3> <5> <6>Pelajari X dalam Y menit, dengan X=java6> 5> <7> <8>Dokumentasi LiveCodes8> 7> <9> <10>Muat template pemula10> 9>',
diff --git a/src/livecodes/i18n/locales/id/translation.lokalise.json b/src/livecodes/i18n/locales/id/translation.lokalise.json
index 174adea164..58b18dbbf4 100644
--- a/src/livecodes/i18n/locales/id/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/id/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Pemula Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Pemula Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "Pemula Java"
},
diff --git a/src/livecodes/i18n/locales/id/translation.ts b/src/livecodes/i18n/locales/id/translation.ts
index 9537fca7e6..21e6e191c1 100644
--- a/src/livecodes/i18n/locales/id/translation.ts
+++ b/src/livecodes/i18n/locales/id/translation.ts
@@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Pemula Haskell (Wasm)',
heading: 'Template Pemula',
imba: 'Pemula Imba',
+ 'janet-wasm': 'Pemula Janet (Wasm)',
java: 'Pemula Java',
javascript: 'Pemula JavaScript',
jest: 'Pemula Jest',
diff --git a/src/livecodes/i18n/locales/it/language-info.lokalise.json b/src/livecodes/i18n/locales/it/language-info.lokalise.json
index 8094c8577c..91307a3c73 100644
--- a/src/livecodes/i18n/locales/it/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/it/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "L'interprete di Janet è compilato in WebAssembly ed eseguito interamente nel browser. Supporta input standard e codici di uscita reali."
+ },
+ "janetWasm.link": {
+ "translation": "Sito web ufficiale di Janet Documentazione di Janet Impara X in Y minuti, dove X = Janet Documentazione di LiveCodes Carica il modello di avvio "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM in esecuzione nel browser utilizzando DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/it/language-info.ts b/src/livecodes/i18n/locales/it/language-info.ts
index 3dc3f898d3..98b9294ea7 100644
--- a/src/livecodes/i18n/locales/it/language-info.ts
+++ b/src/livecodes/i18n/locales/it/language-info.ts
@@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Sito ufficiale2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: "L'interprete di <1>Janet1> è compilato in WebAssembly ed eseguito interamente nel browser. Supporta input standard e codici di uscita reali.",
+ link: '<1><2>Sito web ufficiale di Janet2>1> <3> <4>Documentazione di Janet4> 3> <5> <6>Impara X in Y minuti, dove X = Janet6> 5> <7> <8>Documentazione di LiveCodes8> 7> <9> <10>Carica il modello di avvio10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM in esecuzione nel browser utilizzando DoppioJVM.',
link: '<1> <2>Sito ufficiale di Java2> 1> <3> <4> DoppioJVM4> 3> <5> <6> Imparare X in Y minuti, dove X=java6> 5> <7> <8>Documentazione LiveCodes8> 7> <9> <10> Caricare il modello iniziale10> 9>',
diff --git a/src/livecodes/i18n/locales/it/translation.lokalise.json b/src/livecodes/i18n/locales/it/translation.lokalise.json
index f5afd03e95..ebcf14e187 100644
--- a/src/livecodes/i18n/locales/it/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/it/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Starter Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Starter Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "Starter Java"
},
diff --git a/src/livecodes/i18n/locales/it/translation.ts b/src/livecodes/i18n/locales/it/translation.ts
index 5093d4a29a..bb9606bf8b 100644
--- a/src/livecodes/i18n/locales/it/translation.ts
+++ b/src/livecodes/i18n/locales/it/translation.ts
@@ -1014,6 +1014,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Starter Haskell (Wasm)',
heading: 'Modelli di Partenza',
imba: 'Starter Imba',
+ 'janet-wasm': 'Starter Janet (Wasm)',
java: 'Starter Java',
javascript: 'Starter JavaScript',
jest: 'Starter Jest',
diff --git a/src/livecodes/i18n/locales/ja/language-info.lokalise.json b/src/livecodes/i18n/locales/ja/language-info.lokalise.json
index db15512843..133a486906 100644
--- a/src/livecodes/i18n/locales/ja/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ja/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "Janet インタプリタは WebAssembly にコンパイルされ、完全にブラウザ内で実行されます。標準入力と実際の終了コードをサポートします。"
+ },
+ "janetWasm.link": {
+ "translation": "Janet 公式サイト Janet ドキュメント 「Y分でXを学ぶ」(X=Janet) LiveCodes ドキュメント スターターテンプレートの読み込み "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "DoppioJVMを使ってブラウザで動作するJVM。"
},
diff --git a/src/livecodes/i18n/locales/ja/language-info.ts b/src/livecodes/i18n/locales/ja/language-info.ts
index 1c5364cebf..999218c62b 100644
--- a/src/livecodes/i18n/locales/ja/language-info.ts
+++ b/src/livecodes/i18n/locales/ja/language-info.ts
@@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>公式ウェブサイト2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: '<1>Janet1> インタプリタは WebAssembly にコンパイルされ、完全にブラウザ内で実行されます。標準入力と実際の終了コードをサポートします。',
+ link: '<1><2>Janet 公式サイト2>1> <3> <4>Janet ドキュメント4> 3> <5> <6>「Y分でXを学ぶ」(X=Janet)6> 5> <7> <8>LiveCodes ドキュメント8> 7> <9> <10>スターターテンプレートの読み込み10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'DoppioJVMを使ってブラウザで動作するJVM。',
link: '<1> <2>Java公式サイト2> 1> <3> <4>DoppioJVM4> 3> <5> <6>XをY分で学ぶ、X=Java6> 5> <7> <8>LiveCodes ドキュメント8> 7> <9> <10>スターターテンプレートのロード10> 9>',
diff --git a/src/livecodes/i18n/locales/ja/translation.lokalise.json b/src/livecodes/i18n/locales/ja/translation.lokalise.json
index 5f887c5989..2615fe58b2 100644
--- a/src/livecodes/i18n/locales/ja/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ja/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imbaスターター"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet(Wasm)スターター"
+ },
"templates.starter.java": {
"translation": "Javaスターター"
},
diff --git a/src/livecodes/i18n/locales/ja/translation.ts b/src/livecodes/i18n/locales/ja/translation.ts
index 571ff39811..36e8d5070f 100644
--- a/src/livecodes/i18n/locales/ja/translation.ts
+++ b/src/livecodes/i18n/locales/ja/translation.ts
@@ -1014,6 +1014,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm)スターター',
heading: 'スターターテンプレート',
imba: 'Imbaスターター',
+ 'janet-wasm': 'Janet(Wasm)スターター',
java: 'Javaスターター',
javascript: 'JavaScriptスターター',
jest: 'Jestスターター',
diff --git a/src/livecodes/i18n/locales/nl/language-info.lokalise.json b/src/livecodes/i18n/locales/nl/language-info.lokalise.json
index ed38c74f7c..74218096e5 100644
--- a/src/livecodes/i18n/locales/nl/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/nl/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "De Janet-interpreter wordt gecompileerd naar WebAssembly en draait volledig in de browser. Het ondersteunt standaardinvoer en echte exitcodes."
+ },
+ "janetWasm.link": {
+ "translation": "Officiële website van Janet Janet-documentatie Leer X in Y minuten, waarbij X = Janet LiveCodes-documentatie Startersjabloon laden "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM draaiend in de browser met DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/nl/language-info.ts b/src/livecodes/i18n/locales/nl/language-info.ts
index 3ede32cef6..b802800959 100644
--- a/src/livecodes/i18n/locales/nl/language-info.ts
+++ b/src/livecodes/i18n/locales/nl/language-info.ts
@@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Officiële website2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'De <1>Janet1>-interpreter wordt gecompileerd naar WebAssembly en draait volledig in de browser. Het ondersteunt standaardinvoer en echte exitcodes.',
+ link: '<1><2>Officiële website van Janet2>1> <3> <4>Janet-documentatie4> 3> <5> <6>Leer X in Y minuten, waarbij X = Janet6> 5> <7> <8>LiveCodes-documentatie8> 7> <9> <10>Startersjabloon laden10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM draaiend in de browser met DoppioJVM.',
link: '<1> <2>Java officiële website2> 1> <3> <4>DoppioJVM4> 3> <5> <6>Leer X in Y minuten, waarbij X=java6> 5> <7> <8>LiveCodes Documentatie8> 7> <9> <10>Startsjabloon laden10> 9>',
diff --git a/src/livecodes/i18n/locales/nl/translation.lokalise.json b/src/livecodes/i18n/locales/nl/translation.lokalise.json
index adcc4a3778..76b1e08323 100644
--- a/src/livecodes/i18n/locales/nl/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/nl/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba-starter"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet (Wasm)-starter"
+ },
"templates.starter.java": {
"translation": "Java-starter"
},
diff --git a/src/livecodes/i18n/locales/nl/translation.ts b/src/livecodes/i18n/locales/nl/translation.ts
index 8cd1fcf5d8..328feb3819 100644
--- a/src/livecodes/i18n/locales/nl/translation.ts
+++ b/src/livecodes/i18n/locales/nl/translation.ts
@@ -1014,6 +1014,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm)-starter',
heading: 'Startsjablonen',
imba: 'Imba-starter',
+ 'janet-wasm': 'Janet (Wasm)-starter',
java: 'Java-starter',
javascript: 'JavaScript-starter',
jest: 'Jest-starter',
diff --git a/src/livecodes/i18n/locales/pt/language-info.lokalise.json b/src/livecodes/i18n/locales/pt/language-info.lokalise.json
index cbba006288..1a1eabc06a 100644
--- a/src/livecodes/i18n/locales/pt/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/pt/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "O interpretador Janet é compilado para WebAssembly, sendo executado na íntegra no navegador. Ele suporta entrada padrão e códigos de saída reais."
+ },
+ "janetWasm.link": {
+ "translation": "Site oficial do Janet Documentação do Janet Aprenda X em Y minutos, onde X = Janet Documentação do LiveCodes Carregar modelo inicial "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM em execução no navegador usando DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/pt/language-info.ts b/src/livecodes/i18n/locales/pt/language-info.ts
index 1d2921ed6f..a769b646b8 100644
--- a/src/livecodes/i18n/locales/pt/language-info.ts
+++ b/src/livecodes/i18n/locales/pt/language-info.ts
@@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Site oficial2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'O interpretador <1>Janet1> é compilado para WebAssembly, sendo executado na íntegra no navegador. Ele suporta entrada padrão e códigos de saída reais.',
+ link: '<1><2>Site oficial do Janet2>1> <3> <4>Documentação do Janet4> 3> <5> <6>Aprenda X em Y minutos, onde X = Janet6> 5> <7> <8>Documentação do LiveCodes8> 7> <9> <10>Carregar modelo inicial10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM em execução no navegador usando DoppioJVM.',
link: '<1> <2>Sítio Web oficial de Java2> 1> <3> <4> DoppioJVM4> 3> <5> <6> Aprender X em Y minutos, onde X=java6> 5> <7> <8>Documentação do LiveCodes8> 7> <9> <10> Carregar modelo inicial10> 9>',
diff --git a/src/livecodes/i18n/locales/pt/translation.lokalise.json b/src/livecodes/i18n/locales/pt/translation.lokalise.json
index d1f70b68a9..34d5a0ddeb 100644
--- a/src/livecodes/i18n/locales/pt/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/pt/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Iniciante Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Iniciante Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "Iniciante Java"
},
diff --git a/src/livecodes/i18n/locales/pt/translation.ts b/src/livecodes/i18n/locales/pt/translation.ts
index ae36c8bf22..75179bf82f 100644
--- a/src/livecodes/i18n/locales/pt/translation.ts
+++ b/src/livecodes/i18n/locales/pt/translation.ts
@@ -1014,6 +1014,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Iniciante Haskell (Wasm)',
heading: 'Modelos Iniciantes',
imba: 'Iniciante Imba',
+ 'janet-wasm': 'Iniciante Janet (Wasm)',
java: 'Iniciante Java',
javascript: 'Iniciante JavaScript',
jest: 'Iniciante Jest',
diff --git a/src/livecodes/i18n/locales/ru/language-info.lokalise.json b/src/livecodes/i18n/locales/ru/language-info.lokalise.json
index 211d2269dc..dcbe3be84e 100644
--- a/src/livecodes/i18n/locales/ru/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ru/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "Интерпретатор Janet скомпилирован в WebAssembly и выполняется полностью в браузере. Поддерживает стандартный ввод и реальные коды выхода."
+ },
+ "janetWasm.link": {
+ "translation": "Официальный сайт Janet Документация по Janet «Изучите X за Y минут», где X = Janet Документация LiveCodes Загрузить стартовый шаблон "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "JVM, работающая в браузере с помощью DoppioJVM."
},
diff --git a/src/livecodes/i18n/locales/ru/language-info.ts b/src/livecodes/i18n/locales/ru/language-info.ts
index 210da01c91..b12e0d175f 100644
--- a/src/livecodes/i18n/locales/ru/language-info.ts
+++ b/src/livecodes/i18n/locales/ru/language-info.ts
@@ -223,6 +223,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Официальный сайт2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: 'Интерпретатор <1>Janet1> скомпилирован в WebAssembly и выполняется полностью в браузере. Поддерживает стандартный ввод и реальные коды выхода.',
+ link: '<1><2>Официальный сайт Janet2>1> <3> <4>Документация по Janet4> 3> <5> <6>«Изучите X за Y минут», где X = Janet6> 5> <7> <8>Документация LiveCodes8> 7> <9> <10>Загрузить стартовый шаблон10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'JVM, работающая в браузере с помощью DoppioJVM.',
link: '<1> <2>Официальный сайт Java2> 1> <3> <4> DoppioJVM4> 3> <5> <6> Узнай X за Y минут, где X=java6> 5> <7> <8>Документация LiveCodes8> 7> <9> <10> Загрузи стартовый шаблон10> 9>',
diff --git a/src/livecodes/i18n/locales/ru/translation.lokalise.json b/src/livecodes/i18n/locales/ru/translation.lokalise.json
index 8ad794a9c1..39febf5514 100644
--- a/src/livecodes/i18n/locales/ru/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ru/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Стартер Imba"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Стартер Janet (Wasm)"
+ },
"templates.starter.java": {
"translation": "Стартер Java"
},
diff --git a/src/livecodes/i18n/locales/ru/translation.ts b/src/livecodes/i18n/locales/ru/translation.ts
index d8cce61b19..d318c7a32e 100644
--- a/src/livecodes/i18n/locales/ru/translation.ts
+++ b/src/livecodes/i18n/locales/ru/translation.ts
@@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Стартер Haskell (Wasm)',
heading: 'Стартовые шаблоны',
imba: 'Стартер Imba',
+ 'janet-wasm': 'Стартер Janet (Wasm)',
java: 'Стартер Java',
javascript: 'Стартер JavaScript',
jest: 'Стартер Jest',
diff --git a/src/livecodes/i18n/locales/tr/language-info.lokalise.json b/src/livecodes/i18n/locales/tr/language-info.lokalise.json
index 639b33a252..9646b7f1b8 100644
--- a/src/livecodes/i18n/locales/tr/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/tr/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "Janet yorumlayıcısı WebAssembly'ye derlenir ve tamamen tarayıcı içinde çalışır. Standart girişi ve gerçek çıkış kodlarını destekler."
+ },
+ "janetWasm.link": {
+ "translation": "Janet resmi web sitesi Janet belgeleri Y dakikada X'i öğrenin, burada X=Janet LiveCodes Belgeleri Başlangıç şablonunu yükle "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "DoppioJVM kullanılarak tarayıcıda çalışan JVM."
},
diff --git a/src/livecodes/i18n/locales/tr/language-info.ts b/src/livecodes/i18n/locales/tr/language-info.ts
index 31ae1a1b82..1748d35742 100644
--- a/src/livecodes/i18n/locales/tr/language-info.ts
+++ b/src/livecodes/i18n/locales/tr/language-info.ts
@@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Resmi web sitesi2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: "<1>Janet1> yorumlayıcısı WebAssembly'ye derlenir ve tamamen tarayıcı içinde çalışır. Standart girişi ve gerçek çıkış kodlarını destekler.",
+ link: "<1><2>Janet resmi web sitesi2>1> <3> <4>Janet belgeleri4> 3> <5> <6>Y dakikada X'i öğrenin, burada X=Janet6> 5> <7> <8>LiveCodes Belgeleri8> 7> <9> <10>Başlangıç şablonunu yükle10> 9>",
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'DoppioJVM kullanılarak tarayıcıda çalışan JVM.',
link: '<1> <2>Java resmi web sitesi2> 1> <3> <4>DoppioJVM4> 3> <5> <6>Y Dakikada X Öğrenin, X=java6> 5> <7> <8>LiveCodes Dokümantasyonu8> 7> <9> <10>Başlangıç şablonunu yükle10> 9>',
diff --git a/src/livecodes/i18n/locales/tr/translation.lokalise.json b/src/livecodes/i18n/locales/tr/translation.lokalise.json
index f8cc07260f..0f4f4d838e 100644
--- a/src/livecodes/i18n/locales/tr/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/tr/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba Başlangıç"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet (Wasm) Başlangıç"
+ },
"templates.starter.java": {
"translation": "Java Başlangıç"
},
diff --git a/src/livecodes/i18n/locales/tr/translation.ts b/src/livecodes/i18n/locales/tr/translation.ts
index 292f4fe710..c7db42fc4f 100644
--- a/src/livecodes/i18n/locales/tr/translation.ts
+++ b/src/livecodes/i18n/locales/tr/translation.ts
@@ -1014,6 +1014,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm) Başlangıç',
heading: 'Başlangıç Şablonları',
imba: 'Imba Başlangıç',
+ 'janet-wasm': 'Janet (Wasm) Başlangıç',
java: 'Java Başlangıç',
javascript: 'JavaScript Başlangıç',
jest: 'Jest Başlangıç',
diff --git a/src/livecodes/i18n/locales/ur/language-info.lokalise.json b/src/livecodes/i18n/locales/ur/language-info.lokalise.json
index 4e3d1ec1e7..943ff62f7c 100644
--- a/src/livecodes/i18n/locales/ur/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ur/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "امبا"
},
+ "janetWasm.desc": {
+ "translation": "Janet انٹرپریٹر کو WebAssembly میں مرتب کیا گیا ہے جو مکمل طور پر براؤزر میں چلتا ہے۔ یہ معیاری ان پٹ اور حقیقی ایگزٹ کوڈز کی حمایت کرتا ہے۔"
+ },
+ "janetWasm.link": {
+ "translation": "Janet آفیشل ویب سائٹ Janet دستاویزات Y منٹ میں X سیکھیں، جہاں X=Janet LiveCodes دستاویزی لوڈ اسٹارٹر ٹیمپلیٹ "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "DoppioJVM کا استعمال کرتے ہوئے براؤزر میں JVM چل رہا ہے۔"
},
diff --git a/src/livecodes/i18n/locales/ur/language-info.ts b/src/livecodes/i18n/locales/ur/language-info.ts
index 5d3799f7fe..dc8a0a0075 100644
--- a/src/livecodes/i18n/locales/ur/language-info.ts
+++ b/src/livecodes/i18n/locales/ur/language-info.ts
@@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>سرکاری ویب سائٹ2>1>',
name: 'امبا',
},
+ janetWasm: {
+ desc: '<1>Janet1> انٹرپریٹر کو WebAssembly میں مرتب کیا گیا ہے جو مکمل طور پر براؤزر میں چلتا ہے۔ یہ معیاری ان پٹ اور حقیقی ایگزٹ کوڈز کی حمایت کرتا ہے۔',
+ link: '<1><2>Janet آفیشل ویب سائٹ2>1> <3> <4>Janet دستاویزات4> 3> <5> <6>Y منٹ میں X سیکھیں، جہاں X=Janet6> 5> <7> <8>LiveCodes دستاویزی8> 7> <9> <10>لوڈ اسٹارٹر ٹیمپلیٹ10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: 'DoppioJVM کا استعمال کرتے ہوئے براؤزر میں JVM چل رہا ہے۔',
link: '<1> <2>Java آفیشل ویب سائٹ2> 1> <3> <4>DoppioJVM4> 3> <5> <6>Y منٹ میں X سیکھیں، جہاں X=java6> 5> <7> <8>LiveCodes دستاویزات8> 7> <9> <10>ابتدائی سانچہ لوڈ کریں10> 9>',
diff --git a/src/livecodes/i18n/locales/ur/translation.lokalise.json b/src/livecodes/i18n/locales/ur/translation.lokalise.json
index 3eae8e410a..823e2d0ff6 100644
--- a/src/livecodes/i18n/locales/ur/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ur/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "امبا شروعاتی"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet (واسم) شروعاتی"
+ },
"templates.starter.java": {
"translation": "جاوا شروعاتی"
},
diff --git a/src/livecodes/i18n/locales/ur/translation.ts b/src/livecodes/i18n/locales/ur/translation.ts
index 12555e19db..987d390160 100644
--- a/src/livecodes/i18n/locales/ur/translation.ts
+++ b/src/livecodes/i18n/locales/ur/translation.ts
@@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'ہاسکل (واسم) شروعاتی',
heading: 'شروعاتی سانچے',
imba: 'امبا شروعاتی',
+ 'janet-wasm': 'Janet (واسم) شروعاتی',
java: 'جاوا شروعاتی',
javascript: 'جاوا اسکرپٹ شروعاتی',
jest: 'جیسٹ شروعاتی',
diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json
index 959c95c047..49c630ae7d 100644
--- a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json
@@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
+ "janetWasm.desc": {
+ "translation": "Janet 解释器编译为 WebAssembly,并在浏览器中完全运行。它支持标准输入和真实的退出代码。"
+ },
+ "janetWasm.link": {
+ "translation": "Janet 官方网站 Janet 文档 《Y分钟学会X》,其中X=Janet LiveCodes 文档 加载入门模板 "
+ },
+ "janetWasm.name": {
+ "translation": "Janet (Wasm)"
+ },
"java.desc": {
"translation": "使用 DoppioJVM 在浏览器中运行的 JVM。"
},
diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.ts b/src/livecodes/i18n/locales/zh-CN/language-info.ts
index bed3b61ab8..0d84bf7e95 100644
--- a/src/livecodes/i18n/locales/zh-CN/language-info.ts
+++ b/src/livecodes/i18n/locales/zh-CN/language-info.ts
@@ -217,6 +217,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>官方网站2>1>',
name: 'Imba',
},
+ janetWasm: {
+ desc: '<1>Janet1> 解释器编译为 WebAssembly,并在浏览器中完全运行。它支持标准输入和真实的退出代码。',
+ link: '<1><2>Janet 官方网站2>1> <3> <4>Janet 文档4> 3> <5> <6>《Y分钟学会X》,其中X=Janet6> 5> <7> <8>LiveCodes 文档8> 7> <9> <10>加载入门模板10> 9>',
+ name: 'Janet (Wasm)',
+ },
java: {
desc: '使用 DoppioJVM 在浏览器中运行的 JVM。',
link: '<1> <2>Java 官方网站2> 1> <3> <4>DoppioJVM4> 3> <5> <6>在 Y 分钟内学习 X,其中 X=java6> 5> <7> <8>LiveCodes 文档8> 7> <9> <10>加载启动模板10> 9>',
diff --git a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json
index b905a7d816..a839b5dfd5 100644
--- a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json
@@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba 启动模板"
},
+ "templates.starter.janet-wasm": {
+ "translation": "Janet(Wasm)启动模板"
+ },
"templates.starter.java": {
"translation": "Java 启动模板"
},
diff --git a/src/livecodes/i18n/locales/zh-CN/translation.ts b/src/livecodes/i18n/locales/zh-CN/translation.ts
index 9857c05d16..457f481eb3 100644
--- a/src/livecodes/i18n/locales/zh-CN/translation.ts
+++ b/src/livecodes/i18n/locales/zh-CN/translation.ts
@@ -1011,6 +1011,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm) 启动模板',
heading: '启动模板',
imba: 'Imba 启动模板',
+ 'janet-wasm': 'Janet(Wasm)启动模板',
java: 'Java 启动模板',
javascript: 'JavaScript 启动模板',
jest: 'Jest 启动模板',
diff --git a/src/livecodes/languages/janet-wasm/__tests__/lang-janet-wasm.spec.ts b/src/livecodes/languages/janet-wasm/__tests__/lang-janet-wasm.spec.ts
new file mode 100644
index 0000000000..57d3b3872e
--- /dev/null
+++ b/src/livecodes/languages/janet-wasm/__tests__/lang-janet-wasm.spec.ts
@@ -0,0 +1,21 @@
+import { janetWasm } from '../lang-janet-wasm';
+
+describe('Janet (Wasm) language spec', () => {
+ test('is registered as janet-wasm, with the wasm runner script', () => {
+ expect(janetWasm.name).toBe('janet-wasm');
+ expect(janetWasm.title).toBe('Janet (Wasm)');
+ expect(janetWasm.compiler).toMatchObject({
+ scriptType: 'text/janet-wasm',
+ compiledCodeLanguage: 'janet-wasm',
+ liveReload: true,
+ });
+ });
+
+ test('accepts the Janet extensions', () => {
+ expect(janetWasm.extensions).toEqual(expect.arrayContaining(['janet', 'wasm.janet']));
+ });
+
+ test('uses the script editor', () => {
+ expect(janetWasm.editor).toBe('script');
+ });
+});
diff --git a/src/livecodes/languages/janet-wasm/index.ts b/src/livecodes/languages/janet-wasm/index.ts
new file mode 100644
index 0000000000..375dce7a6a
--- /dev/null
+++ b/src/livecodes/languages/janet-wasm/index.ts
@@ -0,0 +1 @@
+export * from './lang-janet-wasm';
diff --git a/src/livecodes/languages/janet-wasm/lang-janet-wasm-script.ts b/src/livecodes/languages/janet-wasm/lang-janet-wasm-script.ts
new file mode 100644
index 0000000000..6d5de0f114
--- /dev/null
+++ b/src/livecodes/languages/janet-wasm/lang-janet-wasm-script.ts
@@ -0,0 +1,190 @@
+/* eslint-disable no-console */
+import { janetWasmBaseUrl } from '../../vendors';
+import { createLoadingReporter, runCompiler } from '../wasm-runtime';
+import { createWorkerRunner, type Runner } from '../worker-runner';
+
+// Janet runs on the Janet interpreter compiled to WebAssembly (@live-codes/janet-wasm), loaded from
+// its CDN build. The IIFE defines `self.janetWasm`, which the worker reaches with importScripts.
+//
+// The interpreter is a single instance - one stdout, one stdin, one environment - so it runs in a
+// worker of its own. A Janet program that never returns cannot be interrupted, so Stop discards the
+// worker rather than trying to stop the run inside it.
+const SCRIPT_TYPE = 'text/janet-wasm';
+
+interface RunResult {
+ input: string;
+ output: string | null;
+ error: string | null;
+ exitCode: number | null;
+}
+
+interface JanetWasmApi {
+ ready: boolean;
+ failed: boolean;
+ input: string;
+ output: string | null;
+ error: string | null;
+ exitCode: number | null;
+ loaded: Promise;
+ init: Promise | null;
+ runner: Runner | null;
+ run: (input?: string) => Promise;
+}
+
+declare const window: Window & {
+ livecodes: Record;
+};
+
+const getWorkerSrc = () => `
+importScripts(${JSON.stringify(janetWasmBaseUrl + 'dist/janet-wasm.global.js')});
+
+let interpreter = null;
+
+const getInterpreter = () => {
+ interpreter =
+ interpreter ||
+ self.janetWasm.createInterpreter({
+ // Absolute, because inside the worker a relative URL would resolve against the worker's own
+ // URL rather than the page. The interpreter loads its glue and wasm from here.
+ baseUrl: ${JSON.stringify(janetWasmBaseUrl + 'assets/janet/')},
+ });
+ return interpreter;
+};
+
+addEventListener('message', async (event) => {
+ const { id, code, input } = event.data;
+ try {
+ const result = await (await getInterpreter()).run(code, input);
+ postMessage({
+ id,
+ result: {
+ output: result.output,
+ // The interpreter's diagnostics as a list of lines, empty when the program ran.
+ errors: result.errors || [],
+ exitCode: result.exitCode,
+ },
+ });
+ } catch (error) {
+ postMessage({ id, error: String((error && error.message) || error) });
+ }
+});
+
+getInterpreter().then(
+ () => postMessage({ type: 'ready' }),
+ (error) => postMessage({ type: 'error', message: String((error && error.message) || error) }),
+);
+`;
+
+// A single run is normally quick; a long timeout guards against hangs (e.g. an infinite loop in the
+// user program) by killing and respawning the worker.
+const RUN_TIMEOUT_MS = 120000;
+
+/**
+ * Reads the program out of the result page.
+ *
+ * The result page writes the code inline as the `innerHTML` of a `
+`.trimStart(),
+ },
+ style: {
+ language: 'css',
+ content: `
+.container,
+.container button {
+ text-align: center;
+ font: 1em sans-serif;
+}
+.logo {
+ width: 150px;
+}
+`.trimStart(),
+ },
+ script: {
+ language: 'janet-wasm',
+ content: `
+# Read the counter from standard input; a blank or missing value counts as zero.
+(def raw (string/trim (or (file/read stdin :all) "")))
+(def n (or (scan-number raw) 0))
+(print "Janet")
+(print (inc n))
+`.trimStart(),
+ },
+};
diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts
index 50d2057a63..3d1a8a63c2 100644
--- a/src/livecodes/vendors.ts
+++ b/src/livecodes/vendors.ts
@@ -108,7 +108,7 @@ export const codeiumProviderUrl = /* @__PURE__ */ getUrl(
'@live-codes/monaco-codeium-provider@0.2.2/dist/index.js',
);
-export const codeMirrorBaseUrl = /* @__PURE__ */ getUrl('@live-codes/codemirror@0.4.4/build/');
+export const codeMirrorBaseUrl = /* @__PURE__ */ getUrl('@live-codes/codemirror@0.4.5/build/');
export const codemirrorMinimapUrl = /* @__PURE__ */ getUrl(
'@replit/codemirror-minimap@0.5.2/dist/index.js',
@@ -313,6 +313,8 @@ export const jsUntarUrl = /* @__PURE__ */ getUrl('js-untar@2.0.0/build/dist/unta
export const jsZipUrl = /* @__PURE__ */ getUrl('jszip@3.10.1/dist/jszip.js');
+export const janetWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/janet-wasm@0.1.0/');
+
export const juliaWasmBaseUrl = /* @__PURE__ */ getUrl('@chriskoch/julia-wasm@1.0.4');
export const keystoneJsUrl = /* @__PURE__ */ getUrl(
diff --git a/src/sdk/models.ts b/src/sdk/models.ts
index 139b6fb96c..73b6951463 100644
--- a/src/sdk/models.ts
+++ b/src/sdk/models.ts
@@ -321,6 +321,9 @@ export type Language =
| 'wasm.nim'
| 'nim-js'
| 'js.nim'
+ | 'janet'
+ | 'janet-wasm'
+ | 'wasm.janet'
| 'tcl'
| 'wat'
| 'wast'
@@ -497,6 +500,7 @@ export type TemplateName =
| 'ocaml'
| 'nim'
| 'nim-wasm'
+ | 'janet-wasm'
| 'python'
| 'python-wasm'
| 'r'
diff --git a/storybook/_stories/EmbedOptions/template.ts b/storybook/_stories/EmbedOptions/template.ts
index 6c61101a0f..d515bfb6a4 100644
--- a/storybook/_stories/EmbedOptions/template.ts
+++ b/storybook/_stories/EmbedOptions/template.ts
@@ -41,6 +41,7 @@ const storyDef: StoryDef = {
Ocaml: { props: { template: 'ocaml' } },
Nim: { props: { template: 'nim' } },
NimWasm: { props: { template: 'nim-wasm' } },
+ JanetWasm: { props: { template: 'janet-wasm' } },
Python: { props: { template: 'python' } },
PythonWasm: { props: { template: 'python-wasm' } },
R: { props: { template: 'r' } },
diff --git a/storybook/preact/stories/EmbedOptions/template.stories.ts b/storybook/preact/stories/EmbedOptions/template.stories.ts
index 51eecb58d4..529d6d0fca 100644
--- a/storybook/preact/stories/EmbedOptions/template.stories.ts
+++ b/storybook/preact/stories/EmbedOptions/template.stories.ts
@@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' });
ReScript.storyName = 'ReScript';
export const Reason = livecodesStory({ template: 'reason' });
export const Ocaml = livecodesStory({ template: 'ocaml' });
+export const Nim = livecodesStory({ template: 'nim' });
+export const NimWasm = livecodesStory({ template: 'nim-wasm' });
+export const JanetWasm = livecodesStory({ template: 'janet-wasm' });
export const Python = livecodesStory({ template: 'python' });
export const PythonWasm = livecodesStory({ template: 'python-wasm' });
export const R = livecodesStory({ template: 'r' });
@@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' });
export const CWasm = livecodesStory({ template: 'c-wasm' });
export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
-export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const CobolWasm = livecodesStory({ template: 'cobol-wasm' });
+CobolWasm.storyName = 'COBOL (Wasm)';
+export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
+FortranWasm.storyName = 'Fortran (Wasm)';
export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
export const Java = livecodesStory({ template: 'java' });
export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' });
+export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' });
+BlazorWasm.storyName = 'Blazor (Wasm)';
export const VbWasm = livecodesStory({ template: 'vb-wasm' });
export const FSharp = livecodesStory({ template: 'fsharp' });
export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' });
@@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' });
export const Fennel = livecodesStory({ template: 'fennel' });
export const Julia = livecodesStory({ template: 'julia' });
export const Tcl = livecodesStory({ template: 'tcl' });
+export const AdaWasm = livecodesStory({ template: 'ada-wasm' });
+export const Pascal = livecodesStory({ template: 'pascal' });
export const AssemblyScript = livecodesStory({ template: 'assemblyscript' });
AssemblyScript.storyName = 'AssemblyScript';
export const WebAssemblyText = livecodesStory({ template: 'wat' });
WebAssemblyText.storyName = 'WebAssembly Text';
+export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' });
+AssemblyWasm.storyName = 'Assembly (Wasm)';
export const SQL = livecodesStory({ template: 'sql' });
export const PostgreSQL = livecodesStory({ template: 'postgresql' });
export const Prolog = livecodesStory({ template: 'prolog' });
diff --git a/storybook/react/stories/EmbedOptions/template.stories.ts b/storybook/react/stories/EmbedOptions/template.stories.ts
index 51eecb58d4..529d6d0fca 100644
--- a/storybook/react/stories/EmbedOptions/template.stories.ts
+++ b/storybook/react/stories/EmbedOptions/template.stories.ts
@@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' });
ReScript.storyName = 'ReScript';
export const Reason = livecodesStory({ template: 'reason' });
export const Ocaml = livecodesStory({ template: 'ocaml' });
+export const Nim = livecodesStory({ template: 'nim' });
+export const NimWasm = livecodesStory({ template: 'nim-wasm' });
+export const JanetWasm = livecodesStory({ template: 'janet-wasm' });
export const Python = livecodesStory({ template: 'python' });
export const PythonWasm = livecodesStory({ template: 'python-wasm' });
export const R = livecodesStory({ template: 'r' });
@@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' });
export const CWasm = livecodesStory({ template: 'c-wasm' });
export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
-export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const CobolWasm = livecodesStory({ template: 'cobol-wasm' });
+CobolWasm.storyName = 'COBOL (Wasm)';
+export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
+FortranWasm.storyName = 'Fortran (Wasm)';
export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
export const Java = livecodesStory({ template: 'java' });
export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' });
+export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' });
+BlazorWasm.storyName = 'Blazor (Wasm)';
export const VbWasm = livecodesStory({ template: 'vb-wasm' });
export const FSharp = livecodesStory({ template: 'fsharp' });
export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' });
@@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' });
export const Fennel = livecodesStory({ template: 'fennel' });
export const Julia = livecodesStory({ template: 'julia' });
export const Tcl = livecodesStory({ template: 'tcl' });
+export const AdaWasm = livecodesStory({ template: 'ada-wasm' });
+export const Pascal = livecodesStory({ template: 'pascal' });
export const AssemblyScript = livecodesStory({ template: 'assemblyscript' });
AssemblyScript.storyName = 'AssemblyScript';
export const WebAssemblyText = livecodesStory({ template: 'wat' });
WebAssemblyText.storyName = 'WebAssembly Text';
+export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' });
+AssemblyWasm.storyName = 'Assembly (Wasm)';
export const SQL = livecodesStory({ template: 'sql' });
export const PostgreSQL = livecodesStory({ template: 'postgresql' });
export const Prolog = livecodesStory({ template: 'prolog' });
diff --git a/storybook/solid/stories/EmbedOptions/template.stories.ts b/storybook/solid/stories/EmbedOptions/template.stories.ts
index 51eecb58d4..529d6d0fca 100644
--- a/storybook/solid/stories/EmbedOptions/template.stories.ts
+++ b/storybook/solid/stories/EmbedOptions/template.stories.ts
@@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' });
ReScript.storyName = 'ReScript';
export const Reason = livecodesStory({ template: 'reason' });
export const Ocaml = livecodesStory({ template: 'ocaml' });
+export const Nim = livecodesStory({ template: 'nim' });
+export const NimWasm = livecodesStory({ template: 'nim-wasm' });
+export const JanetWasm = livecodesStory({ template: 'janet-wasm' });
export const Python = livecodesStory({ template: 'python' });
export const PythonWasm = livecodesStory({ template: 'python-wasm' });
export const R = livecodesStory({ template: 'r' });
@@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' });
export const CWasm = livecodesStory({ template: 'c-wasm' });
export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
-export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const CobolWasm = livecodesStory({ template: 'cobol-wasm' });
+CobolWasm.storyName = 'COBOL (Wasm)';
+export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
+FortranWasm.storyName = 'Fortran (Wasm)';
export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
export const Java = livecodesStory({ template: 'java' });
export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' });
+export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' });
+BlazorWasm.storyName = 'Blazor (Wasm)';
export const VbWasm = livecodesStory({ template: 'vb-wasm' });
export const FSharp = livecodesStory({ template: 'fsharp' });
export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' });
@@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' });
export const Fennel = livecodesStory({ template: 'fennel' });
export const Julia = livecodesStory({ template: 'julia' });
export const Tcl = livecodesStory({ template: 'tcl' });
+export const AdaWasm = livecodesStory({ template: 'ada-wasm' });
+export const Pascal = livecodesStory({ template: 'pascal' });
export const AssemblyScript = livecodesStory({ template: 'assemblyscript' });
AssemblyScript.storyName = 'AssemblyScript';
export const WebAssemblyText = livecodesStory({ template: 'wat' });
WebAssemblyText.storyName = 'WebAssembly Text';
+export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' });
+AssemblyWasm.storyName = 'Assembly (Wasm)';
export const SQL = livecodesStory({ template: 'sql' });
export const PostgreSQL = livecodesStory({ template: 'postgresql' });
export const Prolog = livecodesStory({ template: 'prolog' });
diff --git a/storybook/svelte/stories/EmbedOptions/template.stories.ts b/storybook/svelte/stories/EmbedOptions/template.stories.ts
index 51eecb58d4..529d6d0fca 100644
--- a/storybook/svelte/stories/EmbedOptions/template.stories.ts
+++ b/storybook/svelte/stories/EmbedOptions/template.stories.ts
@@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' });
ReScript.storyName = 'ReScript';
export const Reason = livecodesStory({ template: 'reason' });
export const Ocaml = livecodesStory({ template: 'ocaml' });
+export const Nim = livecodesStory({ template: 'nim' });
+export const NimWasm = livecodesStory({ template: 'nim-wasm' });
+export const JanetWasm = livecodesStory({ template: 'janet-wasm' });
export const Python = livecodesStory({ template: 'python' });
export const PythonWasm = livecodesStory({ template: 'python-wasm' });
export const R = livecodesStory({ template: 'r' });
@@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' });
export const CWasm = livecodesStory({ template: 'c-wasm' });
export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
-export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const CobolWasm = livecodesStory({ template: 'cobol-wasm' });
+CobolWasm.storyName = 'COBOL (Wasm)';
+export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
+FortranWasm.storyName = 'Fortran (Wasm)';
export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
export const Java = livecodesStory({ template: 'java' });
export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' });
+export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' });
+BlazorWasm.storyName = 'Blazor (Wasm)';
export const VbWasm = livecodesStory({ template: 'vb-wasm' });
export const FSharp = livecodesStory({ template: 'fsharp' });
export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' });
@@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' });
export const Fennel = livecodesStory({ template: 'fennel' });
export const Julia = livecodesStory({ template: 'julia' });
export const Tcl = livecodesStory({ template: 'tcl' });
+export const AdaWasm = livecodesStory({ template: 'ada-wasm' });
+export const Pascal = livecodesStory({ template: 'pascal' });
export const AssemblyScript = livecodesStory({ template: 'assemblyscript' });
AssemblyScript.storyName = 'AssemblyScript';
export const WebAssemblyText = livecodesStory({ template: 'wat' });
WebAssemblyText.storyName = 'WebAssembly Text';
+export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' });
+AssemblyWasm.storyName = 'Assembly (Wasm)';
export const SQL = livecodesStory({ template: 'sql' });
export const PostgreSQL = livecodesStory({ template: 'postgresql' });
export const Prolog = livecodesStory({ template: 'prolog' });
diff --git a/storybook/vue/stories/EmbedOptions/template.stories.ts b/storybook/vue/stories/EmbedOptions/template.stories.ts
index 51eecb58d4..529d6d0fca 100644
--- a/storybook/vue/stories/EmbedOptions/template.stories.ts
+++ b/storybook/vue/stories/EmbedOptions/template.stories.ts
@@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' });
ReScript.storyName = 'ReScript';
export const Reason = livecodesStory({ template: 'reason' });
export const Ocaml = livecodesStory({ template: 'ocaml' });
+export const Nim = livecodesStory({ template: 'nim' });
+export const NimWasm = livecodesStory({ template: 'nim-wasm' });
+export const JanetWasm = livecodesStory({ template: 'janet-wasm' });
export const Python = livecodesStory({ template: 'python' });
export const PythonWasm = livecodesStory({ template: 'python-wasm' });
export const R = livecodesStory({ template: 'r' });
@@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' });
export const CWasm = livecodesStory({ template: 'c-wasm' });
export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
-export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const CobolWasm = livecodesStory({ template: 'cobol-wasm' });
+CobolWasm.storyName = 'COBOL (Wasm)';
+export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
+FortranWasm.storyName = 'Fortran (Wasm)';
export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
export const Java = livecodesStory({ template: 'java' });
export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' });
+export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' });
+BlazorWasm.storyName = 'Blazor (Wasm)';
export const VbWasm = livecodesStory({ template: 'vb-wasm' });
export const FSharp = livecodesStory({ template: 'fsharp' });
export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' });
@@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' });
export const Fennel = livecodesStory({ template: 'fennel' });
export const Julia = livecodesStory({ template: 'julia' });
export const Tcl = livecodesStory({ template: 'tcl' });
+export const AdaWasm = livecodesStory({ template: 'ada-wasm' });
+export const Pascal = livecodesStory({ template: 'pascal' });
export const AssemblyScript = livecodesStory({ template: 'assemblyscript' });
AssemblyScript.storyName = 'AssemblyScript';
export const WebAssemblyText = livecodesStory({ template: 'wat' });
WebAssemblyText.storyName = 'WebAssembly Text';
+export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' });
+AssemblyWasm.storyName = 'Assembly (Wasm)';
export const SQL = livecodesStory({ template: 'sql' });
export const PostgreSQL = livecodesStory({ template: 'postgresql' });
export const Prolog = livecodesStory({ template: 'prolog' });
diff --git a/storybook/web-components/stories/EmbedOptions/template.stories.ts b/storybook/web-components/stories/EmbedOptions/template.stories.ts
index 51eecb58d4..529d6d0fca 100644
--- a/storybook/web-components/stories/EmbedOptions/template.stories.ts
+++ b/storybook/web-components/stories/EmbedOptions/template.stories.ts
@@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' });
ReScript.storyName = 'ReScript';
export const Reason = livecodesStory({ template: 'reason' });
export const Ocaml = livecodesStory({ template: 'ocaml' });
+export const Nim = livecodesStory({ template: 'nim' });
+export const NimWasm = livecodesStory({ template: 'nim-wasm' });
+export const JanetWasm = livecodesStory({ template: 'janet-wasm' });
export const Python = livecodesStory({ template: 'python' });
export const PythonWasm = livecodesStory({ template: 'python-wasm' });
export const R = livecodesStory({ template: 'r' });
@@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' });
export const CWasm = livecodesStory({ template: 'c-wasm' });
export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
-export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const CobolWasm = livecodesStory({ template: 'cobol-wasm' });
+CobolWasm.storyName = 'COBOL (Wasm)';
+export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
+FortranWasm.storyName = 'Fortran (Wasm)';
export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
export const Java = livecodesStory({ template: 'java' });
export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' });
+export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' });
+BlazorWasm.storyName = 'Blazor (Wasm)';
export const VbWasm = livecodesStory({ template: 'vb-wasm' });
export const FSharp = livecodesStory({ template: 'fsharp' });
export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' });
@@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' });
export const Fennel = livecodesStory({ template: 'fennel' });
export const Julia = livecodesStory({ template: 'julia' });
export const Tcl = livecodesStory({ template: 'tcl' });
+export const AdaWasm = livecodesStory({ template: 'ada-wasm' });
+export const Pascal = livecodesStory({ template: 'pascal' });
export const AssemblyScript = livecodesStory({ template: 'assemblyscript' });
AssemblyScript.storyName = 'AssemblyScript';
export const WebAssemblyText = livecodesStory({ template: 'wat' });
WebAssemblyText.storyName = 'WebAssembly Text';
+export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' });
+AssemblyWasm.storyName = 'Assembly (Wasm)';
export const SQL = livecodesStory({ template: 'sql' });
export const PostgreSQL = livecodesStory({ template: 'postgresql' });
export const Prolog = livecodesStory({ template: 'prolog' });
diff --git a/vendor-licenses.md b/vendor-licenses.md
index c6d56d4214..0cc46b5d6d 100644
--- a/vendor-licenses.md
+++ b/vendor-licenses.md
@@ -362,6 +362,10 @@ LFortran (Wasm): [BSD 3-Clause License](https://github.com/lfortran/lfortran/blo
V (Wasm): [MIT License](https://github.com/vlang/v/blob/master/LICENSE) (the V compiler and its standard library, compiled to WebAssembly by @live-codes/v-wasm; the Clang toolchain it links through is covered by LLVM / LLD below)
+@live-codes/janet-wasm: [MIT License](https://github.com/live-codes/browser-janet/blob/main/packages/janet-wasm/LICENSE)
+
+Janet (Wasm): [MIT License](https://github.com/janet-lang/janet/blob/master/LICENSE) (the Janet interpreter, compiled to WebAssembly by @live-codes/janet-wasm)
+
LLVM / LLD (Wasm): [Apache License 2.0 with LLVM-exception](https://github.com/llvm/llvm-project/blob/main/LICENSE.TXT)
@wasm-fmt/clang-format: [MIT License](https://github.com/wasm-fmt/clang-format/blob/6a84f2d980e5ff4145bd9178a49cd5146e48df78/LICENSE)