From 2385e919f26fbb80c4d83cddb2194d5e37750fa8 Mon Sep 17 00:00:00 2001 From: uzmoi Date: Sun, 5 Jan 2025 22:25:40 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=92=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=8B?= =?UTF-8?q?UI=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/pages/Playground.vue | 45 ++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/.vitepress/pages/Playground.vue b/.vitepress/pages/Playground.vue index 012f52b..96678cb 100644 --- a/.vitepress/pages/Playground.vue +++ b/.vitepress/pages/Playground.vue @@ -2,8 +2,14 @@
-
Playground (v{{ AISCRIPT_VERSION }})
-
+
Playground (v{{ version }})
+
+ +
@@ -102,6 +108,11 @@ const fizzbuzz = `for (let i, 100) { \t\telse i }`; +const latestVersion = '0.19.0'; +const versions = [AISCRIPT_VERSION, '0.19.0', '0.18.0', '0.17.0', '0.16.0', '0.15.0', '0.14.1']; + +const version = ref(latestVersion); + const resultTab = ref<'output' | 'ast' | 'metadata'>('output'); //#region Editor @@ -309,7 +320,7 @@ function clearLog() { //#region Permalink with hash type HashData = { code: string; - // TODO: バージョン情報(マルチバージョン対応の際に必要。なければ最新にフォールバック) + version: string; }; const hash = ref(inBrowser ? window.location.hash.slice(1) || localStorage.getItem('ais:playground') : null); const hashData = computed(() => { @@ -334,11 +345,20 @@ onMounted(async () => { await init(); initAiScriptEnv(); - if (hashData.value != null && hashData.value.code != null) { - code.value = hashData.value.code; + if (hashData.value != null) { + if (hashData.value.code != null) { + code.value = hashData.value.code; + } + if (hashData.value.version != null) { + version.value = hashData.value.version; + } } - watch([code], () => { - updateHash({ code: code.value }); + + watch([code, version], () => { + updateHash({ + code: code.value, + version: version.value, + }); }, { immediate: true }); watch(code, async (newCode) => { @@ -629,6 +649,17 @@ onUnmounted(() => { background-color: var(--vp-button-brand-hover-bg); } +.playgroundSelect { + background-color: var(--vp-button-alt-bg); + transition: background-color 0.25s; + padding: 3px 16px; + border-radius: 8px; +} + +.playgroundSelect:hover { + background-color: var(--vp-button-alt-hover-bg); +} + @media (max-width: 768px) { .playgroundEditorScroller, .playgroundEditorTextarea { From 4b816e6614407d6e87b219c87adafa2ab7981ca0 Mon Sep 17 00:00:00 2001 From: uzmoi Date: Sun, 5 Jan 2025 23:02:14 +0900 Subject: [PATCH 2/9] =?UTF-8?q?runner=E3=82=92=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=81=AB=E5=88=87=E3=82=8A=E5=87=BA=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/pages/Playground.vue | 91 +++++++++++---------------------- .vitepress/scripts/runner.ts | 79 ++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 60 deletions(-) create mode 100644 .vitepress/scripts/runner.ts diff --git a/.vitepress/pages/Playground.vue b/.vitepress/pages/Playground.vue index 96678cb..3005e35 100644 --- a/.vitepress/pages/Playground.vue +++ b/.vitepress/pages/Playground.vue @@ -89,7 +89,7 @@ diff --git a/.vitepress/scripts/runner.ts b/.vitepress/scripts/runner.ts new file mode 100644 index 0000000..303a551 --- /dev/null +++ b/.vitepress/scripts/runner.ts @@ -0,0 +1,79 @@ +import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from '@syuilo/aiscript'; + +export type ParseResult = + | { + ok: true; + ast: unknown; + metadata: Map; + } + | { + ok: false; + error: Error | null; + }; + +export class Runner { + version = AISCRIPT_VERSION; + + private print: (text: string) => void; + constructor({ print }: { + print(text: string): void; + }) { + this.print = print; + } + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type, params) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.AiScriptSyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.AiScriptTypeError) { + return 'TypeError'; + } + if (error instanceof errors.AiScriptRuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.AiScriptIndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + if (error instanceof errors.AiScriptUserError) { + return 'UserError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} From 00caf1eb2f4cee9a651bc34177262cf121b86b22 Mon Sep 17 00:00:00 2001 From: uzmoi Date: Mon, 6 Jan 2025 23:35:36 +0900 Subject: [PATCH 3/9] add versions --- .vitepress/scripts/runner.ts | 67 +++------------------ .vitepress/scripts/versions/0.14.1.ts | 59 ++++++++++++++++++ .vitepress/scripts/versions/0.15.0.ts | 59 ++++++++++++++++++ .vitepress/scripts/versions/0.16.0.ts | 59 ++++++++++++++++++ .vitepress/scripts/versions/0.17.0.ts | 59 ++++++++++++++++++ .vitepress/scripts/versions/0.18.0.ts | 62 +++++++++++++++++++ .vitepress/scripts/versions/0.19.0.ts | 62 +++++++++++++++++++ .vitepress/scripts/versions/dev.ts | 62 +++++++++++++++++++ .vitepress/scripts/versions/index.ts | 17 ++++++ package.json | 6 ++ pnpm-lock.yaml | 86 +++++++++++++++++++++++++++ 11 files changed, 538 insertions(+), 60 deletions(-) create mode 100644 .vitepress/scripts/versions/0.14.1.ts create mode 100644 .vitepress/scripts/versions/0.15.0.ts create mode 100644 .vitepress/scripts/versions/0.16.0.ts create mode 100644 .vitepress/scripts/versions/0.17.0.ts create mode 100644 .vitepress/scripts/versions/0.18.0.ts create mode 100644 .vitepress/scripts/versions/0.19.0.ts create mode 100644 .vitepress/scripts/versions/dev.ts create mode 100644 .vitepress/scripts/versions/index.ts diff --git a/.vitepress/scripts/runner.ts b/.vitepress/scripts/runner.ts index 303a551..cd8c8a5 100644 --- a/.vitepress/scripts/runner.ts +++ b/.vitepress/scripts/runner.ts @@ -1,5 +1,3 @@ -import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from '@syuilo/aiscript'; - export type ParseResult = | { ok: true; @@ -11,69 +9,18 @@ export type ParseResult = error: Error | null; }; -export class Runner { - version = AISCRIPT_VERSION; +export abstract class Runner { + abstract version: string; - private print: (text: string) => void; + protected print: (text: string) => void; constructor({ print }: { print(text: string): void; }) { this.print = print; } - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } - } - - private interpreter = new Interpreter({}, { - out: (value) => { - this.print( - value.type === 'num' ? value.value.toString() - : value.type === 'str' ? `"${value.value}"` - : JSON.stringify(utils.valToJs(value), null, 2) ?? '', - ); - }, - log: (type, params) => { - if (type === 'end' && params.val != null && 'type' in params.val) { - this.print(utils.valToString(params.val, true)); - } - }, - }); - async exec(node: unknown): Promise { - await this.interpreter.exec(node as Ast.Node[]); - } - getErrorName(error: unknown): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } - if (error instanceof errors.AiScriptSyntaxError) { - return 'SyntaxError'; - } - if (error instanceof errors.AiScriptTypeError) { - return 'TypeError'; - } - if (error instanceof errors.AiScriptRuntimeError) { - return 'RuntimeError'; - } - if (error instanceof errors.AiScriptIndexOutOfRangeError) { - return 'IndexOutOfRangeError'; - } - if (error instanceof errors.AiScriptUserError) { - return 'UserError'; - } - return 'AiScriptError'; - } - dispose() { - this.interpreter.abort(); - } + abstract parse(code: string): ParseResult; + abstract exec(node: unknown): Promise; + abstract getErrorName(error: unknown): string | undefined; + abstract dispose(): void; } diff --git a/.vitepress/scripts/versions/0.14.1.ts b/.vitepress/scripts/versions/0.14.1.ts new file mode 100644 index 0000000..dfad2d0 --- /dev/null +++ b/.vitepress/scripts/versions/0.14.1.ts @@ -0,0 +1,59 @@ +import { Parser, Interpreter, utils, errors, type Ast, values } from 'aiscript0_14'; +import { type ParseResult, Runner } from '../runner'; + +export default class extends Runner { + version = '0.14.1'; + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value: values.Value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type: string, params: { val?: values.Value }) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.SyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.TypeError) { + return 'TypeError'; + } + if (error instanceof errors.RuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.IndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} diff --git a/.vitepress/scripts/versions/0.15.0.ts b/.vitepress/scripts/versions/0.15.0.ts new file mode 100644 index 0000000..953130b --- /dev/null +++ b/.vitepress/scripts/versions/0.15.0.ts @@ -0,0 +1,59 @@ +import { Parser, Interpreter, values, utils, errors, type Ast } from 'aiscript0_15'; +import { type ParseResult, Runner } from '../runner'; + +export default class extends Runner { + version = '0.15.0'; + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value: values.Value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type: string, params: { val?: values.Value }) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.SyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.TypeError) { + return 'TypeError'; + } + if (error instanceof errors.RuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.IndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} diff --git a/.vitepress/scripts/versions/0.16.0.ts b/.vitepress/scripts/versions/0.16.0.ts new file mode 100644 index 0000000..d2b1373 --- /dev/null +++ b/.vitepress/scripts/versions/0.16.0.ts @@ -0,0 +1,59 @@ +import { Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_16/index.js'; +import { type ParseResult, Runner } from '../runner'; + +export default class extends Runner { + version = '0.16.0'; + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type, params) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.AiScriptSyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.AiScriptTypeError) { + return 'TypeError'; + } + if (error instanceof errors.AiScriptRuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.AiScriptIndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} diff --git a/.vitepress/scripts/versions/0.17.0.ts b/.vitepress/scripts/versions/0.17.0.ts new file mode 100644 index 0000000..84b2360 --- /dev/null +++ b/.vitepress/scripts/versions/0.17.0.ts @@ -0,0 +1,59 @@ +import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_17'; +import { type ParseResult, Runner } from '../runner'; + +export default class extends Runner { + version = AISCRIPT_VERSION; + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type, params) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.AiScriptSyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.AiScriptTypeError) { + return 'TypeError'; + } + if (error instanceof errors.AiScriptRuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.AiScriptIndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} diff --git a/.vitepress/scripts/versions/0.18.0.ts b/.vitepress/scripts/versions/0.18.0.ts new file mode 100644 index 0000000..bbcc582 --- /dev/null +++ b/.vitepress/scripts/versions/0.18.0.ts @@ -0,0 +1,62 @@ +import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_18'; +import { type ParseResult, Runner } from '../runner'; + +export default class extends Runner { + version = AISCRIPT_VERSION; + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type, params) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.AiScriptSyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.AiScriptTypeError) { + return 'TypeError'; + } + if (error instanceof errors.AiScriptRuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.AiScriptIndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + if (error instanceof errors.AiScriptUserError) { + return 'UserError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} diff --git a/.vitepress/scripts/versions/0.19.0.ts b/.vitepress/scripts/versions/0.19.0.ts new file mode 100644 index 0000000..8c7a5f8 --- /dev/null +++ b/.vitepress/scripts/versions/0.19.0.ts @@ -0,0 +1,62 @@ +import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_19'; +import { type ParseResult, Runner } from '../runner'; + +export default class extends Runner { + version = AISCRIPT_VERSION; + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type, params) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.AiScriptSyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.AiScriptTypeError) { + return 'TypeError'; + } + if (error instanceof errors.AiScriptRuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.AiScriptIndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + if (error instanceof errors.AiScriptUserError) { + return 'UserError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} diff --git a/.vitepress/scripts/versions/dev.ts b/.vitepress/scripts/versions/dev.ts new file mode 100644 index 0000000..9b8e277 --- /dev/null +++ b/.vitepress/scripts/versions/dev.ts @@ -0,0 +1,62 @@ +import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from '@syuilo/aiscript'; +import { type ParseResult, Runner } from '../runner'; + +export default class extends Runner { + version = AISCRIPT_VERSION; + + parse(code: string): ParseResult { + try { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast) ?? new Map(); + + return { ok: true, ast, metadata }; + } catch (error) { + if (error instanceof errors.AiScriptError) { + return { ok: false, error }; + } + return { ok: false, error: null }; + } + } + + private interpreter = new Interpreter({}, { + out: (value) => { + this.print( + value.type === 'num' ? value.value.toString() + : value.type === 'str' ? `"${value.value}"` + : JSON.stringify(utils.valToJs(value), null, 2) ?? '', + ); + }, + log: (type, params) => { + if (type === 'end' && params.val != null && 'type' in params.val) { + this.print(utils.valToString(params.val, true)); + } + }, + }); + async exec(node: unknown): Promise { + await this.interpreter.exec(node as Ast.Node[]); + } + getErrorName(error: unknown): string | undefined { + if (!(error instanceof errors.AiScriptError)) { + return; + } + if (error instanceof errors.AiScriptSyntaxError) { + return 'SyntaxError'; + } + if (error instanceof errors.AiScriptTypeError) { + return 'TypeError'; + } + if (error instanceof errors.AiScriptRuntimeError) { + return 'RuntimeError'; + } + if (error instanceof errors.AiScriptIndexOutOfRangeError) { + return 'IndexOutOfRangeError'; + } + if (error instanceof errors.AiScriptUserError) { + return 'UserError'; + } + return 'AiScriptError'; + } + dispose() { + this.interpreter.abort(); + } +} diff --git a/.vitepress/scripts/versions/index.ts b/.vitepress/scripts/versions/index.ts new file mode 100644 index 0000000..402f846 --- /dev/null +++ b/.vitepress/scripts/versions/index.ts @@ -0,0 +1,17 @@ +import { Runner } from '../runner'; + +interface VersionModule { + default: new (...args: ConstructorParameters) => Runner; +} + +export const versionModules = new Map Promise>([ + ['dev', () => import('./dev')], + ['0.19.0', () => import('./0.19.0')], + ['0.18.0', () => import('./0.18.0')], + ['0.17.0', () => import('./0.17.0')], + ['0.16.0', () => import('./0.16.0')], + ['0.15.0', () => import('./0.15.0')], + ['0.14.1', () => import('./0.14.1')], +]); + +export const latestVersion = [...versionModules.keys()][1]!; diff --git a/package.json b/package.json index 449971d..aaecdae 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,12 @@ "packageManager": "pnpm@9.14.3", "devDependencies": { "@syuilo/aiscript": "dev", + "aiscript0_19": "npm:@syuilo/aiscript@0.19.0", + "aiscript0_18": "npm:@syuilo/aiscript@0.18.0", + "aiscript0_17": "npm:@syuilo/aiscript@0.17.0", + "aiscript0_16": "npm:@syuilo/aiscript@0.16.0", + "aiscript0_15": "npm:@syuilo/aiscript@0.15.0", + "aiscript0_14": "npm:@syuilo/aiscript@0.14.1", "aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.15", "lz-string": "^1.5.0", "markdown-it-mathjax3": "^4.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d77907..a66c14d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,24 @@ importers: aiscript-vscode: specifier: github:aiscript-dev/aiscript-vscode#v0.1.15 version: https://codeload.github.com/aiscript-dev/aiscript-vscode/tar.gz/c3cde89e79a41d93540cf8a48cd619c3f2dcb1b7 + aiscript0_14: + specifier: npm:@syuilo/aiscript@0.14.1 + version: '@syuilo/aiscript@0.14.1' + aiscript0_15: + specifier: npm:@syuilo/aiscript@0.15.0 + version: '@syuilo/aiscript@0.15.0' + aiscript0_16: + specifier: npm:@syuilo/aiscript@0.16.0 + version: '@syuilo/aiscript@0.16.0' + aiscript0_17: + specifier: npm:@syuilo/aiscript@0.17.0 + version: '@syuilo/aiscript@0.17.0' + aiscript0_18: + specifier: npm:@syuilo/aiscript@0.18.0 + version: '@syuilo/aiscript@0.18.0' + aiscript0_19: + specifier: npm:@syuilo/aiscript@0.19.0 + version: '@syuilo/aiscript@0.19.0' lz-string: specifier: ^1.5.0 version: 1.5.0 @@ -562,6 +580,24 @@ packages: '@shikijs/vscode-textmate@9.3.1': resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} + '@syuilo/aiscript@0.14.1': + resolution: {integrity: sha512-zyX+QWdE/PtEjem+15uPd1J43JIOfaRziGrkwUx+BU/dB9yJADkbwzH9ZkVr2Jzi56TYE4p3Xs5y2Kp+Z6/34A==} + + '@syuilo/aiscript@0.15.0': + resolution: {integrity: sha512-vauMbqacuHufE4W7bAm5BDWlci3mWg1ZaerPNHKBMrRXDjEfvBkBGZNXKSWvi+zmhiYAbWyozPIlV6byttYpCw==} + + '@syuilo/aiscript@0.16.0': + resolution: {integrity: sha512-CXvoWOq6kmOSUQtKv0IEf7Ebfkk5PO1LxAgLqgRRPgssPvDvINCXu/gFNXKdapkFMkmX+Gj8qjemKR1vnUS4ZA==} + + '@syuilo/aiscript@0.17.0': + resolution: {integrity: sha512-3JtQ1rWJHMxQ3153zLCXMUOwrOgjPPYGBl0dPHhR0ohm4tn7okMQRugxMCT0t3YxByemb9FfiM6TUjd0tEGxdA==} + + '@syuilo/aiscript@0.18.0': + resolution: {integrity: sha512-/iY9Vv4LLjtW/KUzId1QwXC4BlpIEPCMcoT7dyRhYdyxtwhS3Hx4b/4j1HYP+n3Pq9XKyW5zvkY72/+DNu4g6Q==} + + '@syuilo/aiscript@0.19.0': + resolution: {integrity: sha512-ZWG4s1m6RrFjE7NeIMaxFz769YO1jW5ReTrOROrEO4IHheOrjxxJ/Ffe2TUNqX9/XxDloMwfWplKhfSzx8LGMA==} + '@syuilo/aiscript@1.0.0-dev.20241226': resolution: {integrity: sha512-pRX7Mmu2RDWHFaSI6emW0coCq6IAXxYX9Z6E2DNfgpc/UZFzVeIeSRt7WI3cfKWOgNyIumr77TCG0hMXeksycA==} @@ -700,6 +736,10 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + autobind-decorator@2.4.0: + resolution: {integrity: sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw==} + engines: {node: '>=8.10', npm: '>=6.4.1'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1037,6 +1077,10 @@ packages: resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} hasBin: true + uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -1586,6 +1630,44 @@ snapshots: '@shikijs/vscode-textmate@9.3.1': {} + '@syuilo/aiscript@0.14.1': + dependencies: + autobind-decorator: 2.4.0 + seedrandom: 3.0.5 + stringz: 2.1.0 + uuid: 9.0.0 + + '@syuilo/aiscript@0.15.0': + dependencies: + autobind-decorator: 2.4.0 + seedrandom: 3.0.5 + stringz: 2.1.0 + uuid: 9.0.0 + + '@syuilo/aiscript@0.16.0': + dependencies: + seedrandom: 3.0.5 + stringz: 2.1.0 + uuid: 9.0.1 + + '@syuilo/aiscript@0.17.0': + dependencies: + seedrandom: 3.0.5 + stringz: 2.1.0 + uuid: 9.0.1 + + '@syuilo/aiscript@0.18.0': + dependencies: + seedrandom: 3.0.5 + stringz: 2.1.0 + uuid: 9.0.1 + + '@syuilo/aiscript@0.19.0': + dependencies: + seedrandom: 3.0.5 + stringz: 2.1.0 + uuid: 9.0.1 + '@syuilo/aiscript@1.0.0-dev.20241226': dependencies: seedrandom: 3.0.5 @@ -1747,6 +1829,8 @@ snapshots: ansi-colors@4.1.3: {} + autobind-decorator@2.4.0: {} + balanced-match@1.0.2: {} birpc@0.2.19: {} @@ -2170,6 +2254,8 @@ snapshots: uuid@11.0.3: {} + uuid@9.0.0: {} + uuid@9.0.1: {} valid-data-url@3.0.1: {} From 45d1f0aa3019379f60e62091189f23686e37d060 Mon Sep 17 00:00:00 2001 From: uzmoi Date: Tue, 7 Jan 2025 00:05:35 +0900 Subject: [PATCH 4/9] =?UTF-8?q?runner=E3=81=AE=E5=88=87=E3=82=8A=E6=9B=BF?= =?UTF-8?q?=E3=81=88=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/pages/Playground.vue | 47 +++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/.vitepress/pages/Playground.vue b/.vitepress/pages/Playground.vue index 3005e35..a4d7dbd 100644 --- a/.vitepress/pages/Playground.vue +++ b/.vitepress/pages/Playground.vue @@ -2,10 +2,10 @@
-
Playground (v{{ version }})
+
Playground (v{{ runner?.version ?? "???" }})
@@ -89,7 +89,6 @@ From 92d595b4ff974c1a83fa636746cc7384c3997b87 Mon Sep 17 00:00:00 2001 From: uzmoi Date: Tue, 7 Jan 2025 00:18:21 +0900 Subject: [PATCH 5/9] refactor --- .vitepress/pages/Playground.vue | 27 +++++++++++++-------------- .vitepress/scripts/runner.ts | 16 +++------------- .vitepress/scripts/versions/0.14.1.ts | 23 +++++++++-------------- .vitepress/scripts/versions/0.15.0.ts | 23 +++++++++-------------- .vitepress/scripts/versions/0.16.0.ts | 23 +++++++++-------------- .vitepress/scripts/versions/0.17.0.ts | 23 +++++++++-------------- .vitepress/scripts/versions/0.18.0.ts | 23 +++++++++-------------- .vitepress/scripts/versions/0.19.0.ts | 23 +++++++++-------------- .vitepress/scripts/versions/dev.ts | 26 +++++++++----------------- 9 files changed, 79 insertions(+), 128 deletions(-) diff --git a/.vitepress/pages/Playground.vue b/.vitepress/pages/Playground.vue index a4d7dbd..c2ef417 100644 --- a/.vitepress/pages/Playground.vue +++ b/.vitepress/pages/Playground.vue @@ -200,16 +200,15 @@ function parse() { if (runner.value == null) { ast.value = null; } else { - const result = runner.value.parse(code.value); - logs.value = []; - - if (result.ok) { - ast.value = result.ast; - metadata.value = result.metadata?.get(null) ?? null; - } else { - if (result.error != null) { + try { + const [ast_, metadata_] = runner.value.parse(code.value); + logs.value = []; + ast.value = ast_; + metadata.value = metadata_?.get(null) ?? null; + } catch (err) { + if (runner.value.isAiScriptError(err)) { logs.value = [{ - text: `[SyntaxError] ${result.error.name}: ${result.error.message}`, + text: `[SyntaxError] ${err.name}: ${err.message}`, type: 'error', }]; isSyntaxError.value = true; @@ -253,16 +252,16 @@ async function run() { top: logEl.value.scrollHeight, }); } - } catch (error) { - const errorName = runner.value.getErrorName(error); - if (errorName == null) { + } catch (err) { + if (runner.value.isAiScriptError(err)) { + const errorName = runner.value.getErrorName(err); logs.value.push({ - text: `[Error] ${error}`, + text: `[${errorName}] ${err.name}: ${err.message}`, type: 'error', }); } else { logs.value.push({ - text: `[${errorName}] ${error.name}: ${error.message}`, + text: `[Error] ${err}`, type: 'error', }); } diff --git a/.vitepress/scripts/runner.ts b/.vitepress/scripts/runner.ts index cd8c8a5..04bec34 100644 --- a/.vitepress/scripts/runner.ts +++ b/.vitepress/scripts/runner.ts @@ -1,14 +1,3 @@ -export type ParseResult = - | { - ok: true; - ast: unknown; - metadata: Map; - } - | { - ok: false; - error: Error | null; - }; - export abstract class Runner { abstract version: string; @@ -19,8 +8,9 @@ export abstract class Runner { this.print = print; } - abstract parse(code: string): ParseResult; + abstract parse(code: string): readonly [unknown, Map | undefined]; abstract exec(node: unknown): Promise; - abstract getErrorName(error: unknown): string | undefined; + abstract isAiScriptError(error: unknown): error is Error; + abstract getErrorName(error: Error): string | undefined; abstract dispose(): void; } diff --git a/.vitepress/scripts/versions/0.14.1.ts b/.vitepress/scripts/versions/0.14.1.ts index dfad2d0..ee961c6 100644 --- a/.vitepress/scripts/versions/0.14.1.ts +++ b/.vitepress/scripts/versions/0.14.1.ts @@ -1,21 +1,13 @@ import { Parser, Interpreter, utils, errors, type Ast, values } from 'aiscript0_14'; -import { type ParseResult, Runner } from '../runner'; +import { Runner } from '../runner'; export default class extends Runner { version = '0.14.1'; - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } + parse(code: string) { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast); + return [ast, metadata] as const; } private interpreter = new Interpreter({}, { @@ -35,7 +27,10 @@ export default class extends Runner { async exec(node: unknown): Promise { await this.interpreter.exec(node as Ast.Node[]); } - getErrorName(error: unknown): string | undefined { + isAiScriptError(error: unknown): error is errors.AiScriptError { + return error instanceof errors.AiScriptError; + } + getErrorName(error: errors.AiScriptError): string | undefined { if (!(error instanceof errors.AiScriptError)) { return; } diff --git a/.vitepress/scripts/versions/0.15.0.ts b/.vitepress/scripts/versions/0.15.0.ts index 953130b..f3c5d7f 100644 --- a/.vitepress/scripts/versions/0.15.0.ts +++ b/.vitepress/scripts/versions/0.15.0.ts @@ -1,21 +1,13 @@ import { Parser, Interpreter, values, utils, errors, type Ast } from 'aiscript0_15'; -import { type ParseResult, Runner } from '../runner'; +import { Runner } from '../runner'; export default class extends Runner { version = '0.15.0'; - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } + parse(code: string) { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast); + return [ast, metadata] as const; } private interpreter = new Interpreter({}, { @@ -35,7 +27,10 @@ export default class extends Runner { async exec(node: unknown): Promise { await this.interpreter.exec(node as Ast.Node[]); } - getErrorName(error: unknown): string | undefined { + isAiScriptError(error: unknown): error is errors.AiScriptError { + return error instanceof errors.AiScriptError; + } + getErrorName(error: errors.AiScriptError): string | undefined { if (!(error instanceof errors.AiScriptError)) { return; } diff --git a/.vitepress/scripts/versions/0.16.0.ts b/.vitepress/scripts/versions/0.16.0.ts index d2b1373..cf8175c 100644 --- a/.vitepress/scripts/versions/0.16.0.ts +++ b/.vitepress/scripts/versions/0.16.0.ts @@ -1,21 +1,13 @@ import { Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_16/index.js'; -import { type ParseResult, Runner } from '../runner'; +import { Runner } from '../runner'; export default class extends Runner { version = '0.16.0'; - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } + parse(code: string) { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast); + return [ast, metadata] as const; } private interpreter = new Interpreter({}, { @@ -35,7 +27,10 @@ export default class extends Runner { async exec(node: unknown): Promise { await this.interpreter.exec(node as Ast.Node[]); } - getErrorName(error: unknown): string | undefined { + isAiScriptError(error: unknown): error is errors.AiScriptError { + return error instanceof errors.AiScriptError; + } + getErrorName(error: errors.AiScriptError): string | undefined { if (!(error instanceof errors.AiScriptError)) { return; } diff --git a/.vitepress/scripts/versions/0.17.0.ts b/.vitepress/scripts/versions/0.17.0.ts index 84b2360..7b1733e 100644 --- a/.vitepress/scripts/versions/0.17.0.ts +++ b/.vitepress/scripts/versions/0.17.0.ts @@ -1,21 +1,13 @@ import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_17'; -import { type ParseResult, Runner } from '../runner'; +import { Runner } from '../runner'; export default class extends Runner { version = AISCRIPT_VERSION; - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } + parse(code: string) { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast); + return [ast, metadata] as const; } private interpreter = new Interpreter({}, { @@ -35,7 +27,10 @@ export default class extends Runner { async exec(node: unknown): Promise { await this.interpreter.exec(node as Ast.Node[]); } - getErrorName(error: unknown): string | undefined { + isAiScriptError(error: unknown): error is errors.AiScriptError { + return error instanceof errors.AiScriptError; + } + getErrorName(error: errors.AiScriptError): string | undefined { if (!(error instanceof errors.AiScriptError)) { return; } diff --git a/.vitepress/scripts/versions/0.18.0.ts b/.vitepress/scripts/versions/0.18.0.ts index bbcc582..360d4cc 100644 --- a/.vitepress/scripts/versions/0.18.0.ts +++ b/.vitepress/scripts/versions/0.18.0.ts @@ -1,21 +1,13 @@ import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_18'; -import { type ParseResult, Runner } from '../runner'; +import { Runner } from '../runner'; export default class extends Runner { version = AISCRIPT_VERSION; - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } + parse(code: string) { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast); + return [ast, metadata] as const; } private interpreter = new Interpreter({}, { @@ -35,7 +27,10 @@ export default class extends Runner { async exec(node: unknown): Promise { await this.interpreter.exec(node as Ast.Node[]); } - getErrorName(error: unknown): string | undefined { + isAiScriptError(error: unknown): error is errors.AiScriptError { + return error instanceof errors.AiScriptError; + } + getErrorName(error: errors.AiScriptError): string | undefined { if (!(error instanceof errors.AiScriptError)) { return; } diff --git a/.vitepress/scripts/versions/0.19.0.ts b/.vitepress/scripts/versions/0.19.0.ts index 8c7a5f8..3e77787 100644 --- a/.vitepress/scripts/versions/0.19.0.ts +++ b/.vitepress/scripts/versions/0.19.0.ts @@ -1,21 +1,13 @@ import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from 'aiscript0_19'; -import { type ParseResult, Runner } from '../runner'; +import { Runner } from '../runner'; export default class extends Runner { version = AISCRIPT_VERSION; - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } + parse(code: string) { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast); + return [ast, metadata] as const; } private interpreter = new Interpreter({}, { @@ -35,7 +27,10 @@ export default class extends Runner { async exec(node: unknown): Promise { await this.interpreter.exec(node as Ast.Node[]); } - getErrorName(error: unknown): string | undefined { + isAiScriptError(error: unknown): error is errors.AiScriptError { + return error instanceof errors.AiScriptError; + } + getErrorName(error: errors.AiScriptError): string | undefined { if (!(error instanceof errors.AiScriptError)) { return; } diff --git a/.vitepress/scripts/versions/dev.ts b/.vitepress/scripts/versions/dev.ts index 9b8e277..db42275 100644 --- a/.vitepress/scripts/versions/dev.ts +++ b/.vitepress/scripts/versions/dev.ts @@ -1,21 +1,13 @@ import { AISCRIPT_VERSION, Parser, Interpreter, utils, errors, type Ast } from '@syuilo/aiscript'; -import { type ParseResult, Runner } from '../runner'; +import { Runner } from '../runner'; export default class extends Runner { version = AISCRIPT_VERSION; - parse(code: string): ParseResult { - try { - const ast = Parser.parse(code); - const metadata = Interpreter.collectMetadata(ast) ?? new Map(); - - return { ok: true, ast, metadata }; - } catch (error) { - if (error instanceof errors.AiScriptError) { - return { ok: false, error }; - } - return { ok: false, error: null }; - } + parse(code: string) { + const ast = Parser.parse(code); + const metadata = Interpreter.collectMetadata(ast); + return [ast, metadata] as const; } private interpreter = new Interpreter({}, { @@ -35,10 +27,10 @@ export default class extends Runner { async exec(node: unknown): Promise { await this.interpreter.exec(node as Ast.Node[]); } - getErrorName(error: unknown): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } + isAiScriptError(error: unknown): error is errors.AiScriptError { + return error instanceof errors.AiScriptError; + } + getErrorName(error: errors.AiScriptError): string | undefined { if (error instanceof errors.AiScriptSyntaxError) { return 'SyntaxError'; } From 91b904447068fb56fce5b845def01fc185320b5c Mon Sep 17 00:00:00 2001 From: uzmoi Date: Tue, 7 Jan 2025 00:42:11 +0900 Subject: [PATCH 6/9] fix type --- .vitepress/pages/Playground.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/pages/Playground.vue b/.vitepress/pages/Playground.vue index c2ef417..feb6672 100644 --- a/.vitepress/pages/Playground.vue +++ b/.vitepress/pages/Playground.vue @@ -290,7 +290,7 @@ function clearLog() { //#region Permalink with hash type HashData = { code: string; - version: string; + version?: string; }; const hash = ref(inBrowser ? window.location.hash.slice(1) || localStorage.getItem('ais:playground') : null); const hashData = computed(() => { From 1aedb8e1c2ca8bceab2dcc1000cff246f37d9422 Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Tue, 7 Jan 2025 13:44:32 +0900 Subject: [PATCH 7/9] tweak design --- .vitepress/pages/Playground.vue | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/.vitepress/pages/Playground.vue b/.vitepress/pages/Playground.vue index feb6672..41a5a19 100644 --- a/.vitepress/pages/Playground.vue +++ b/.vitepress/pages/Playground.vue @@ -109,8 +109,6 @@ const fizzbuzz = `for (let i, 100) { \t\telse i }`; -const version = ref(latestVersion); - const resultTab = ref<'output' | 'ast' | 'metadata'>('output'); //#region Editor @@ -175,9 +173,11 @@ function replaceWithFizzbuzz() { //#endregion //#region Runner -let RunnerConstructor: new (_: { print(text: string): void; }) => Runner; +let RunnerConstructor: new (...args: ConstructorParameters) => Runner; const runner = ref(); +const version = ref(latestVersion); + const isRunning = ref(false); const logs = ref<{ @@ -324,6 +324,8 @@ onMounted(async () => { } watch(version, async () => { + editorLoading.value = true; + const import_ = versionModules.get(version.value); if (import_ == null) return; @@ -331,6 +333,8 @@ onMounted(async () => { RunnerConstructor = module.default; initAiScriptEnv(); + + editorLoading.value = false; }, { immediate: true }); watch([code, version], () => { @@ -417,8 +421,10 @@ onUnmounted(() => { .playgroundHeaderInner { margin: 0 auto; - padding: 0.5em 36px; + padding: 0 36px; + min-height: 40px; display: flex; + align-items: center; } .playgroundOptions { @@ -629,8 +635,15 @@ onUnmounted(() => { .playgroundSelect { background-color: var(--vp-button-alt-bg); transition: background-color 0.25s; - padding: 3px 16px; + padding: 3px 36px 3px 16px; border-radius: 8px; + font-family: var(--vp-font-family-base); + font-size: 80%; + + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right .75rem center; + background-size: 16px 12px; } .playgroundSelect:hover { @@ -644,7 +657,7 @@ onUnmounted(() => { } .playgroundHeaderInner { - padding: 0.5em 24px; + padding: 0 24px; } .playgroundResultActionsLeft { From ddfb653d7e076bb89ccc83ef9b31225ac9408a4f Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Tue, 7 Jan 2025 13:50:33 +0900 Subject: [PATCH 8/9] tweak design --- .vitepress/pages/Playground.vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.vitepress/pages/Playground.vue b/.vitepress/pages/Playground.vue index 41a5a19..2e82ba5 100644 --- a/.vitepress/pages/Playground.vue +++ b/.vitepress/pages/Playground.vue @@ -639,13 +639,17 @@ onUnmounted(() => { border-radius: 8px; font-family: var(--vp-font-family-base); font-size: 80%; - + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); background-repeat: no-repeat; - background-position: right .75rem center; + background-position: right .75em center; background-size: 16px 12px; } +:global(html.dark) .playgroundSelect { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23fffff5db' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} + .playgroundSelect:hover { background-color: var(--vp-button-alt-hover-bg); } From 21d37f5c1d6eca8ba52fda909c76b2587ec4c277 Mon Sep 17 00:00:00 2001 From: uzmoi Date: Wed, 8 Jan 2025 00:44:57 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E3=82=AC?= =?UTF-8?q?=E3=83=BC=E3=83=89=E7=AF=80=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/scripts/versions/0.14.1.ts | 3 --- .vitepress/scripts/versions/0.15.0.ts | 3 --- .vitepress/scripts/versions/0.16.0.ts | 3 --- .vitepress/scripts/versions/0.17.0.ts | 3 --- .vitepress/scripts/versions/0.18.0.ts | 3 --- .vitepress/scripts/versions/0.19.0.ts | 3 --- 6 files changed, 18 deletions(-) diff --git a/.vitepress/scripts/versions/0.14.1.ts b/.vitepress/scripts/versions/0.14.1.ts index ee961c6..b36d23e 100644 --- a/.vitepress/scripts/versions/0.14.1.ts +++ b/.vitepress/scripts/versions/0.14.1.ts @@ -31,9 +31,6 @@ export default class extends Runner { return error instanceof errors.AiScriptError; } getErrorName(error: errors.AiScriptError): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } if (error instanceof errors.SyntaxError) { return 'SyntaxError'; } diff --git a/.vitepress/scripts/versions/0.15.0.ts b/.vitepress/scripts/versions/0.15.0.ts index f3c5d7f..5ed56e2 100644 --- a/.vitepress/scripts/versions/0.15.0.ts +++ b/.vitepress/scripts/versions/0.15.0.ts @@ -31,9 +31,6 @@ export default class extends Runner { return error instanceof errors.AiScriptError; } getErrorName(error: errors.AiScriptError): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } if (error instanceof errors.SyntaxError) { return 'SyntaxError'; } diff --git a/.vitepress/scripts/versions/0.16.0.ts b/.vitepress/scripts/versions/0.16.0.ts index cf8175c..52b4468 100644 --- a/.vitepress/scripts/versions/0.16.0.ts +++ b/.vitepress/scripts/versions/0.16.0.ts @@ -31,9 +31,6 @@ export default class extends Runner { return error instanceof errors.AiScriptError; } getErrorName(error: errors.AiScriptError): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } if (error instanceof errors.AiScriptSyntaxError) { return 'SyntaxError'; } diff --git a/.vitepress/scripts/versions/0.17.0.ts b/.vitepress/scripts/versions/0.17.0.ts index 7b1733e..98b6d43 100644 --- a/.vitepress/scripts/versions/0.17.0.ts +++ b/.vitepress/scripts/versions/0.17.0.ts @@ -31,9 +31,6 @@ export default class extends Runner { return error instanceof errors.AiScriptError; } getErrorName(error: errors.AiScriptError): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } if (error instanceof errors.AiScriptSyntaxError) { return 'SyntaxError'; } diff --git a/.vitepress/scripts/versions/0.18.0.ts b/.vitepress/scripts/versions/0.18.0.ts index 360d4cc..496e3d0 100644 --- a/.vitepress/scripts/versions/0.18.0.ts +++ b/.vitepress/scripts/versions/0.18.0.ts @@ -31,9 +31,6 @@ export default class extends Runner { return error instanceof errors.AiScriptError; } getErrorName(error: errors.AiScriptError): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } if (error instanceof errors.AiScriptSyntaxError) { return 'SyntaxError'; } diff --git a/.vitepress/scripts/versions/0.19.0.ts b/.vitepress/scripts/versions/0.19.0.ts index 3e77787..5bc94a6 100644 --- a/.vitepress/scripts/versions/0.19.0.ts +++ b/.vitepress/scripts/versions/0.19.0.ts @@ -31,9 +31,6 @@ export default class extends Runner { return error instanceof errors.AiScriptError; } getErrorName(error: errors.AiScriptError): string | undefined { - if (!(error instanceof errors.AiScriptError)) { - return; - } if (error instanceof errors.AiScriptSyntaxError) { return 'SyntaxError'; }