Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ A [feature-rich](https://livecodes.io/docs/features/), open-source, **client-sid
[![LiveCodes: npm version](https://img.shields.io/npm/v/livecodes)](https://www.npmjs.com/package/livecodes)
[![LiveCodes: npm downloads](https://img.shields.io/npm/dm/livecodes)](https://www.npmjs.com/package/livecodes)
[![LiveCodes: jsdelivr downloads](https://data.jsdelivr.com/v1/package/npm/livecodes/badge?style=rounded)](https://www.jsdelivr.com/package/npm/livecodes)
[![LiveCodes: languages](https://img.shields.io/badge/languages-118-blue)](https://livecodes.io/docs/languages/)
[![LiveCodes: languages](https://img.shields.io/badge/languages-119-blue)](https://livecodes.io/docs/languages/)
[![LiveCodes: docs](https://img.shields.io/badge/Documentation-575757?logo=gitbook&logoColor=white)](https://livecodes.io/docs/)
[![LiveCodes: llms.txt](https://img.shields.io/badge/llms.txt-575757?logo=googledocs&logoColor=white)](https://livecodes.io/docs/llms.txt)
[![LiveCodes: llms-full.txt](https://img.shields.io/badge/llms--full.txt-575757?logo=googledocs&logoColor=white)](https://livecodes.io/docs/llms-full.txt)
Expand Down
119 changes: 119 additions & 0 deletions docs/docs/languages/janet-wasm.mdx
Original file line number Diff line number Diff line change
@@ -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',
},
};

<LiveCodes config={janetConfig}></LiveCodes>

### 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:

<LiveCodes template="janet-wasm" params={{ activeEditor: 'markup' }} height="80vh"></LiveCodes>

## 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)
1 change: 1 addition & 0 deletions docs/src/components/LanguageSliders.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
Expand Down
1 change: 1 addition & 0 deletions docs/src/components/TemplateList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
Expand Down
48 changes: 48 additions & 0 deletions e2e/specs/starter.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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();

Expand Down
1 change: 1 addition & 0 deletions functions/vendors/templates.js
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions scripts/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
1 change: 1 addition & 0 deletions server/php/inc/starter-templates.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions src/livecodes/UI/command-menu-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ export const getCommandMenuActions = ({
'ocaml',
'nim',
'nim-wasm',
'janet-wasm',
'python',
'python-wasm',
'r',
Expand Down
Binary file added src/livecodes/assets/templates/janet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 33 additions & 0 deletions src/livecodes/html/language-info.html
Original file line number Diff line number Diff line change
Expand Up @@ -1130,6 +1130,39 @@ <h3 data-i18n="language-info:imba.name">Imba</h3>
<li><a href="https://imba.io/" target="_blank" rel="noopener">Official website</a></li>
</ul>
</section>
<section data-lang="janet-wasm">
<h3 data-i18n="language-info:janetWasm.name">Janet (Wasm)</h3>
<div data-i18n="language-info:janetWasm.desc" data-i18n-prop="innerHTML">
The <a href="https://janet-lang.org/" target="_blank" rel="noopener">Janet</a> interpreter
compiled to WebAssembly, running entirely in the browser. It supports standard input and real
exit codes.
</div>
<ul data-i18n="language-info:janetWasm.link" data-i18n-prop="innerHTML">
<li>
<a href="https://janet-lang.org/" target="_blank" rel="noopener">Janet official website</a>
</li>
<li>
<a href="https://janet-lang.org/docs/index.html" target="_blank" rel="noopener"
>Janet documentation</a
>
</li>
<li>
<a href="https://learnxinyminutes.com/janet/" target="_blank" rel="noopener"
>Learn X in Y minutes, where X=Janet</a
>
</li>
<li>
<a href="{{DOCS_BASE_URL}}languages/janet-wasm" target="_blank" rel="noopener"
>LiveCodes Documentation</a
>
</li>
<li>
<a href="?template=janet-wasm" class="button" target="_parent" data-template="janet-wasm"
>Load starter template</a
>
</li>
</ul>
</section>
<section data-lang="java">
<h3 data-i18n="language-info:java.name">Java</h3>
<div data-i18n="language-info:java.desc" data-i18n-prop="innerHTML">
Expand Down
9 changes: 9 additions & 0 deletions src/livecodes/i18n/locales/ar/language-info.lokalise.json
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
"janetWasm.desc": {
"translation": "مفسر <tag-1>Janet</tag-1> المُجمَّع إلى WebAssembly يعمل بالكامل داخل المتصفح. يدعم الإدخال القياسي ورموز الخروج الحقيقية."
},
"janetWasm.link": {
"translation": "<tag-1><tag-2>الموقع الرسمي لـ Janet</tag-2></tag-1> <tag-3> <tag-4>وثائق Janet</tag-4> </tag-3> <tag-5> <tag-6>تعلم X في Y دقيقة، حيث X = Janet</tag-6> </tag-5> <tag-7> <tag-8>وثائق LiveCodes</tag-8> </tag-7> <tag-9> <tag-10>تحميل قالب البدء</tag-10> </tag-9>"
},
"janetWasm.name": {
"translation": "Janet (Wasm)"
},
"java.desc": {
"translation": "JVM يعمل في المتصفح باستخدام DoppioJVM."
},
Expand Down
5 changes: 5 additions & 0 deletions src/livecodes/i18n/locales/ar/language-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>الموقع الرسمي</2></1>',
name: 'Imba',
},
janetWasm: {
desc: 'مفسر <1>Janet</1> المُجمَّع إلى WebAssembly يعمل بالكامل داخل المتصفح. يدعم الإدخال القياسي ورموز الخروج الحقيقية.',
link: '<1><2>الموقع الرسمي لـ Janet</2></1> <3> <4>وثائق Janet</4> </3> <5> <6>تعلم X في Y دقيقة، حيث X = Janet</6> </5> <7> <8>وثائق LiveCodes</8> </7> <9> <10>تحميل قالب البدء</10> </9>',
name: 'Janet (Wasm)',
},
java: {
desc: 'JVM يعمل في المتصفح باستخدام DoppioJVM.',
link: '<1> <2>موقع جافا الرسمي</2> </1> <3> <4> DoppioJVM</4> </3> <5> <6> تعلم X في دقائق Y، حيث X = جافا</6> </5> <7> <8>وثائق LiveCodes</8> </7> <9> <10> تحميل قالب البدء</10> </9>',
Expand Down
3 changes: 3 additions & 0 deletions src/livecodes/i18n/locales/ar/translation.lokalise.json
Original file line number Diff line number Diff line change
Expand Up @@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "قالب Imba"
},
"templates.starter.janet-wasm": {
"translation": "قالب Janet (Wasm)"
},
"templates.starter.java": {
"translation": "قالب Java"
},
Expand Down
1 change: 1 addition & 0 deletions src/livecodes/i18n/locales/ar/translation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'قالب Haskell (Wasm)',
heading: 'قوالب البداية',
imba: 'قالب Imba',
'janet-wasm': 'قالب Janet (Wasm)',
java: 'قالب Java',
javascript: 'قالب JavaScript',
jest: 'قالب Jest',
Expand Down
9 changes: 9 additions & 0 deletions src/livecodes/i18n/locales/bn/language-info.lokalise.json
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
"janetWasm.desc": {
"translation": "<tag-1>Janet</tag-1> ইন্টারপ্রেটার WebAssembly-তে কম্পাইল করা হয়েছে এবং এটি সম্পূর্ণভাবে ব্রাউজারে চলে। এটি স্ট্যান্ডার্ড ইনপুট এবং প্রকৃত এক্সিট কোড সমর্থন করে।"
},
"janetWasm.link": {
"translation": "<tag-1><tag-2>Janet অফিসিয়াল ওয়েবসাইট</tag-2></tag-1> <tag-3> <tag-4>Janet ডকুমেন্টেশন</tag-4> </tag-3> <tag-5> <tag-6>Y মিনিটে X শিখুন, যেখানে X=Janet</tag-6> </tag-5> <tag-7> <tag-8>লাইভকোড ডকুমেন্টেশন</tag-8> </tag-7> <tag-9> <tag-10>স্টার্টার টেমপ্লেট লোড করুন</tag-10> </tag-9>"
},
"janetWasm.name": {
"translation": "Janet (Wasm)"
},
"java.desc": {
"translation": "DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।"
},
Expand Down
5 changes: 5 additions & 0 deletions src/livecodes/i18n/locales/bn/language-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>অফিসিয়াল ওয়েবসাইট</2></1>',
name: 'Imba',
},
janetWasm: {
desc: '<1>Janet</1> ইন্টারপ্রেটার WebAssembly-তে কম্পাইল করা হয়েছে এবং এটি সম্পূর্ণভাবে ব্রাউজারে চলে। এটি স্ট্যান্ডার্ড ইনপুট এবং প্রকৃত এক্সিট কোড সমর্থন করে।',
link: '<1><2>Janet অফিসিয়াল ওয়েবসাইট</2></1> <3> <4>Janet ডকুমেন্টেশন</4> </3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=Janet</6> </5> <7> <8>লাইভকোড ডকুমেন্টেশন</8> </7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন</10> </9>',
name: 'Janet (Wasm)',
},
java: {
desc: 'DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।',
link: '<1> <2>Java অফিসিয়াল ওয়েবসাইট</2> </1> <3> <4>DoppioJVM</4> </3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=java</6> </5> <7> <8>LiveCodes ডকুমেন্টেশন</8> </7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন</10> </9>',
Expand Down
3 changes: 3 additions & 0 deletions src/livecodes/i18n/locales/bn/translation.lokalise.json
Original file line number Diff line number Diff line change
Expand Up @@ -2022,6 +2022,9 @@
"templates.starter.imba": {
"translation": "Imba স্টার্টার"
},
"templates.starter.janet-wasm": {
"translation": "Janet (Wasm) স্টার্টার"
},
"templates.starter.java": {
"translation": "Java স্টার্টার"
},
Expand Down
1 change: 1 addition & 0 deletions src/livecodes/i18n/locales/bn/translation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = {
'haskell-wasm': 'Haskell (Wasm) স্টার্টার',
heading: 'স্টার্টার টেমপ্লেট',
imba: 'Imba স্টার্টার',
'janet-wasm': 'Janet (Wasm) স্টার্টার',
java: 'Java স্টার্টার',
javascript: 'JavaScript স্টার্টার',
jest: 'Jest স্টার্টার',
Expand Down
9 changes: 9 additions & 0 deletions src/livecodes/i18n/locales/de/language-info.lokalise.json
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,15 @@
"imba.name": {
"translation": "Imba"
},
"janetWasm.desc": {
"translation": "Der <tag-1>Janet</tag-1>-Interpreter wird zu WebAssembly kompiliert und läuft vollständig im Browser. Er unterstützt Standardeingabe und echte Exit-Codes."
},
"janetWasm.link": {
"translation": "<tag-1><tag-2>Offizielle Janet-Website</tag-2></tag-1> <tag-3> <tag-4>Janet-Dokumentation</tag-4> </tag-3> <tag-5> <tag-6>Lerne X in Y Minuten, wobei X = Janet</tag-6> </tag-5> <tag-7> <tag-8>LiveCodes-Dokumentation</tag-8> </tag-7> <tag-9> <tag-10>Startervorlage laden</tag-10> </tag-9>"
},
"janetWasm.name": {
"translation": "Janet (Wasm)"
},
"java.desc": {
"translation": "JVM läuft im Browser mit DoppioJVM."
},
Expand Down
Loading
Loading