fix: upgrade AiScript! There are braking changes in the AiScript syntax, so existing plugins must alse be upgraded Also, I didn't include the function that can call remote servers' API (which is present in the latest Misskey)

Co-authored-by: syuilo <syuilotan@yahoo.co.jp>
Co-authored-by: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com>
This commit is contained in:
naskya 2023-11-17 05:04:05 +09:00 committed by Kopper
parent 206d2f246e
commit bb4f4b4b00
17 changed files with 170 additions and 135 deletions

36
.pnp.cjs generated
View file

@ -3726,15 +3726,13 @@ const RAW_RUNTIME_STATE =
}]\ }]\
]],\ ]],\
["@syuilo/aiscript", [\ ["@syuilo/aiscript", [\
["npm:0.11.1", {\ ["npm:0.16.0", {\
"packageLocation": "./.yarn/cache/@syuilo-aiscript-npm-0.11.1-451b9d1a3f-4df4bb5a25.zip/node_modules/@syuilo/aiscript/",\ "packageLocation": "./.yarn/cache/@syuilo-aiscript-npm-0.16.0-078d966ef6-5c77fc596d.zip/node_modules/@syuilo/aiscript/",\
"packageDependencies": [\ "packageDependencies": [\
["@syuilo/aiscript", "npm:0.11.1"],\ ["@syuilo/aiscript", "npm:0.16.0"],\
["autobind-decorator", "npm:2.4.0"],\
["chalk", "npm:4.0.0"],\
["seedrandom", "npm:3.0.5"],\ ["seedrandom", "npm:3.0.5"],\
["stringz", "npm:2.1.0"],\ ["stringz", "npm:2.1.0"],\
["uuid", "npm:7.0.3"]\ ["uuid", "npm:9.0.1"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
@ -7154,7 +7152,6 @@ const RAW_RUNTIME_STATE =
["@swc/cli", "virtual:aa59773ac87791c4813d53447077fcf8a847d6de5a301d34dc31286584b1dbb26d30d3adb5b4c41c1e8aea04371e926fda05c09c6253647c432e11d872a304ba#npm:0.1.62"],\ ["@swc/cli", "virtual:aa59773ac87791c4813d53447077fcf8a847d6de5a301d34dc31286584b1dbb26d30d3adb5b4c41c1e8aea04371e926fda05c09c6253647c432e11d872a304ba#npm:0.1.62"],\
["@swc/core", "virtual:21a30884d94fbf67bcf4a1714713cc91d32809a34424c4ce678841dfdc63b58647c5e18570d56e36b3c762ee72f81c251599477127a715978fa6e1d8b9e5d952#npm:1.3.71"],\ ["@swc/core", "virtual:21a30884d94fbf67bcf4a1714713cc91d32809a34424c4ce678841dfdc63b58647c5e18570d56e36b3c762ee72f81c251599477127a715978fa6e1d8b9e5d952#npm:1.3.71"],\
["@swc/core-android-arm64", "npm:1.3.11"],\ ["@swc/core-android-arm64", "npm:1.3.11"],\
["@syuilo/aiscript", "npm:0.11.1"],\
["@types/adm-zip", "npm:0.5.0"],\ ["@types/adm-zip", "npm:0.5.0"],\
["@types/async-lock", "npm:1.4.0"],\ ["@types/async-lock", "npm:1.4.0"],\
["@types/bcryptjs", "npm:2.4.2"],\ ["@types/bcryptjs", "npm:2.4.2"],\
@ -8122,15 +8119,6 @@ const RAW_RUNTIME_STATE =
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\ }],\
["npm:4.0.0", {\
"packageLocation": "./.yarn/cache/chalk-npm-4.0.0-50e5418ea0-f8ae363f43.zip/node_modules/chalk/",\
"packageDependencies": [\
["chalk", "npm:4.0.0"],\
["ansi-styles", "npm:4.3.0"],\
["supports-color", "npm:7.2.0"]\
],\
"linkType": "HARD"\
}],\
["npm:4.1.2", {\ ["npm:4.1.2", {\
"packageLocation": "./.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-cb3f3e5949.zip/node_modules/chalk/",\ "packageLocation": "./.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-cb3f3e5949.zip/node_modules/chalk/",\
"packageDependencies": [\ "packageDependencies": [\
@ -8524,7 +8512,7 @@ const RAW_RUNTIME_STATE =
["@rollup/plugin-alias", "virtual:658502eb4296e93abedc18b6aa9b26978f434f08d98e21ebb0e725354b8bb54b62db9c4a1893e460c694ff7500ff5cbafa4457b0dfd26b5838868666c861e990#npm:5.1.0"],\ ["@rollup/plugin-alias", "virtual:658502eb4296e93abedc18b6aa9b26978f434f08d98e21ebb0e725354b8bb54b62db9c4a1893e460c694ff7500ff5cbafa4457b0dfd26b5838868666c861e990#npm:5.1.0"],\
["@rollup/plugin-json", "virtual:658502eb4296e93abedc18b6aa9b26978f434f08d98e21ebb0e725354b8bb54b62db9c4a1893e460c694ff7500ff5cbafa4457b0dfd26b5838868666c861e990#npm:6.0.1"],\ ["@rollup/plugin-json", "virtual:658502eb4296e93abedc18b6aa9b26978f434f08d98e21ebb0e725354b8bb54b62db9c4a1893e460c694ff7500ff5cbafa4457b0dfd26b5838868666c861e990#npm:6.0.1"],\
["@rollup/pluginutils", "virtual:658502eb4296e93abedc18b6aa9b26978f434f08d98e21ebb0e725354b8bb54b62db9c4a1893e460c694ff7500ff5cbafa4457b0dfd26b5838868666c861e990#npm:5.1.0"],\ ["@rollup/pluginutils", "virtual:658502eb4296e93abedc18b6aa9b26978f434f08d98e21ebb0e725354b8bb54b62db9c4a1893e460c694ff7500ff5cbafa4457b0dfd26b5838868666c861e990#npm:5.1.0"],\
["@syuilo/aiscript", "npm:0.11.1"],\ ["@syuilo/aiscript", "npm:0.16.0"],\
["@types/escape-regexp", "npm:0.0.1"],\ ["@types/escape-regexp", "npm:0.0.1"],\
["@types/glob", "npm:8.1.0"],\ ["@types/glob", "npm:8.1.0"],\
["@types/gulp", "npm:4.0.13"],\ ["@types/gulp", "npm:4.0.13"],\
@ -24627,13 +24615,6 @@ const RAW_RUNTIME_STATE =
}]\ }]\
]],\ ]],\
["uuid", [\ ["uuid", [\
["npm:7.0.3", {\
"packageLocation": "./.yarn/cache/uuid-npm-7.0.3-2b088bd924-b2a4d30ecd.zip/node_modules/uuid/",\
"packageDependencies": [\
["uuid", "npm:7.0.3"]\
],\
"linkType": "HARD"\
}],\
["npm:8.0.0", {\ ["npm:8.0.0", {\
"packageLocation": "./.yarn/cache/uuid-npm-8.0.0-591e3a2e23-5086c43bbe.zip/node_modules/uuid/",\ "packageLocation": "./.yarn/cache/uuid-npm-8.0.0-591e3a2e23-5086c43bbe.zip/node_modules/uuid/",\
"packageDependencies": [\ "packageDependencies": [\
@ -24654,6 +24635,13 @@ const RAW_RUNTIME_STATE =
["uuid", "npm:9.0.0"]\ ["uuid", "npm:9.0.0"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\
["npm:9.0.1", {\
"packageLocation": "./.yarn/cache/uuid-npm-9.0.1-39a8442bc6-9d0b6adb72.zip/node_modules/uuid/",\
"packageDependencies": [\
["uuid", "npm:9.0.1"]\
],\
"linkType": "HARD"\
}]\ }]\
]],\ ]],\
["v8-compile-cache-lib", [\ ["v8-compile-cache-lib", [\

Binary file not shown.

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9fb77fa49be7052b16c7a261da8f2a3ddaa933547c55760c8cde8e42403deac9
size 181843

BIN
.yarn/cache/chalk-npm-4.0.0-50e5418ea0-f8ae363f43.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/uuid-npm-7.0.3-2b088bd924-b2a4d30ecd.zip (Stored with Git LFS) vendored

Binary file not shown.

BIN
.yarn/cache/uuid-npm-9.0.1-39a8442bc6-9d0b6adb72.zip (Stored with Git LFS) vendored Normal file

Binary file not shown.

View file

@ -35,7 +35,6 @@
"@peertube/http-signature": "1.7.0", "@peertube/http-signature": "1.7.0",
"@redocly/openapi-core": "1.0.0-beta.131", "@redocly/openapi-core": "1.0.0-beta.131",
"@sinonjs/fake-timers": "9.1.2", "@sinonjs/fake-timers": "9.1.2",
"@syuilo/aiscript": "0.11.1",
"adm-zip": "^0.5.10", "adm-zip": "^0.5.10",
"ajv": "8.12.0", "ajv": "8.12.0",
"archiver": "5.3.1", "archiver": "5.3.1",

View file

@ -17,7 +17,7 @@
"@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-alias": "^5.1.0",
"@rollup/plugin-json": "^6.0.1", "@rollup/plugin-json": "^6.0.1",
"@rollup/pluginutils": "^5.1.0", "@rollup/pluginutils": "^5.1.0",
"@syuilo/aiscript": "0.11.1", "@syuilo/aiscript": "0.16.0",
"@types/escape-regexp": "0.0.1", "@types/escape-regexp": "0.0.1",
"@types/glob": "8.1.0", "@types/glob": "8.1.0",
"@types/gulp": "4.0.13", "@types/gulp": "4.0.13",

View file

@ -22,7 +22,7 @@ import {
onUnmounted, onUnmounted,
PropType, PropType,
} from "vue"; } from "vue";
import { parse } from "@syuilo/aiscript"; import { Parser } from "@syuilo/aiscript";
import XBlock from "./page.block.vue"; import XBlock from "./page.block.vue";
import { Hpml } from "@/scripts/hpml/evaluator"; import { Hpml } from "@/scripts/hpml/evaluator";
import { url } from "@/config"; import { url } from "@/config";
@ -47,12 +47,14 @@ export default defineComponent({
enableAiScript: !defaultStore.state.disablePagesScript, enableAiScript: !defaultStore.state.disablePagesScript,
}); });
const parser = new Parser();
onMounted(() => { onMounted(() => {
nextTick(() => { nextTick(() => {
if (props.page.script && hpml.aiscript) { if (props.page.script && hpml.aiscript) {
let ast; let ast;
try { try {
ast = parse(props.page.script); ast = parser.parse(props.page.script);
} catch (err) { } catch (err) {
console.error(err); console.error(err);
/*os.alert({ /*os.alert({

View file

@ -45,7 +45,7 @@ import "prismjs/components/prism-javascript";
import "prismjs/themes/prism-okaidia.css"; import "prismjs/themes/prism-okaidia.css";
import { PrismEditor } from "vue-prism-editor"; import { PrismEditor } from "vue-prism-editor";
import "vue-prism-editor/dist/prismeditor.min.css"; import "vue-prism-editor/dist/prismeditor.min.css";
import { AiScript, parse, utils } from "@syuilo/aiscript"; import { Interpreter, Parser, utils } from "@syuilo/aiscript";
import MkContainer from "@/components/MkContainer.vue"; import MkContainer from "@/components/MkContainer.vue";
import MkButton from "@/components/MkButton.vue"; import MkButton from "@/components/MkButton.vue";
import { createAiScriptEnv } from "@/scripts/aiscript/api"; import { createAiScriptEnv } from "@/scripts/aiscript/api";
@ -57,6 +57,8 @@ import { definePageMetadata } from "@/scripts/page-metadata";
const code = ref(""); const code = ref("");
const logs = ref<any[]>([]); const logs = ref<any[]>([]);
const parser = new Parser();
const saved = localStorage.getItem("scratchpad"); const saved = localStorage.getItem("scratchpad");
if (saved) { if (saved) {
code.value = saved; code.value = saved;
@ -68,7 +70,7 @@ watch(code, () => {
async function run() { async function run() {
logs.value = []; logs.value = [];
const aiscript = new AiScript( const aiscript = new Interpreter(
createAiScriptEnv({ createAiScriptEnv({
storageKey: "scratchpad", storageKey: "scratchpad",
token: $i?.token, token: $i?.token,
@ -111,11 +113,11 @@ async function run() {
let ast; let ast;
try { try {
ast = parse(code.value); ast = parser.parse(code.value);
} catch (error) { } catch (error) {
os.alert({ os.alert({
type: "error", type: "error",
text: "Syntax error :(", text: `Syntax error : ${error}`,
}); });
return; return;
} }

View file

@ -19,8 +19,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { defineAsyncComponent, nextTick, ref } from "vue"; import { defineAsyncComponent, nextTick, ref } from "vue";
import { AiScript, parse } from "@syuilo/aiscript"; import { Interpreter, Parser, utils } from "@syuilo/aiscript";
import { serialize } from "@syuilo/aiscript/built/serializer";
import { v4 as uuid } from "uuid"; import { v4 as uuid } from "uuid";
import FormTextarea from "@/components/form/textarea.vue"; import FormTextarea from "@/components/form/textarea.vue";
import FormButton from "@/components/MkButton.vue"; import FormButton from "@/components/MkButton.vue";
@ -30,10 +29,19 @@ import { ColdDeviceStorage } from "@/store";
import { unisonReload } from "@/scripts/unison-reload"; import { unisonReload } from "@/scripts/unison-reload";
import { i18n } from "@/i18n"; import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata"; import { definePageMetadata } from "@/scripts/page-metadata";
import { compareVersions } from "compare-versions";
const code = ref(null); const code = ref<string>();
function installPlugin({ id, meta, ast, token }) { function isSupportedVersion(version: string): boolean {
try {
return compareVersions(version, "0.12.0") >= 0;
} catch (err) {
return false;
}
}
function installPlugin({ id, meta, src, token }) {
ColdDeviceStorage.set( ColdDeviceStorage.set(
"plugins", "plugins",
ColdDeviceStorage.get("plugins").concat({ ColdDeviceStorage.get("plugins").concat({
@ -41,25 +49,46 @@ function installPlugin({ id, meta, ast, token }) {
id, id,
active: true, active: true,
configData: {}, configData: {},
token: token, src,
ast: ast, token,
}), }),
); );
} }
const parser = new Parser();
async function install() { async function install() {
let ast; if (code.value == null) return;
try {
ast = parse(code.value); const scriptVersion = utils.getLangVersion(code.value);
} catch (err) {
if (scriptVersion == null) {
os.alert({ os.alert({
type: "error", type: "error",
text: "Syntax error :(", text: "No language version annotation found :(",
});
return;
}
if (!isSupportedVersion(scriptVersion)) {
os.alert({
type: "error",
text: `aiscript version '${scriptVersion}' is not supported :(`,
}); });
return; return;
} }
const meta = AiScript.collectMetadata(ast); let ast;
try {
ast = parser.parse(code.value);
} catch (err) {
os.alert({
type: "error",
text: `Syntax error : ${err}`,
});
return;
}
const meta = Interpreter.collectMetadata(ast);
if (meta == null) { if (meta == null) {
os.alert({ os.alert({
type: "error", type: "error",
@ -82,7 +111,7 @@ async function install() {
if (name == null || version == null || author == null) { if (name == null || version == null || author == null) {
os.alert({ os.alert({
type: "error", type: "error",
text: "Required property not found :(", text: "Required property (name, version, author) not found :(",
}); });
return; return;
} }
@ -133,8 +162,8 @@ async function install() {
permissions, permissions,
config, config,
}, },
src: code.value,
token, token,
ast: serialize(ast),
}); });
os.success(); os.success();

View file

@ -1,6 +1,4 @@
import { AiScript, utils, values } from "@syuilo/aiscript"; import { Interpreter, Parser, utils, values } from "@syuilo/aiscript";
import { deserialize } from "@syuilo/aiscript/built/serializer";
import { jsToVal } from "@syuilo/aiscript/built/interpreter/util";
import { createAiScriptEnv } from "@/scripts/aiscript/api"; import { createAiScriptEnv } from "@/scripts/aiscript/api";
import { inputText } from "@/os"; import { inputText } from "@/os";
import { import {
@ -11,12 +9,13 @@ import {
userActions, userActions,
} from "@/store"; } from "@/store";
const pluginContexts = new Map<string, AiScript>(); const parser = new Parser();
const pluginContexts = new Map<string, Interpreter>();
export function install(plugin) { export function install(plugin) {
console.info("Plugin installed:", plugin.name, `v${plugin.version}`); console.info("Plugin installed:", plugin.name, `v${plugin.version}`);
const aiscript = new AiScript( const aiscript = new Interpreter(
createPluginEnv({ createPluginEnv({
plugin: plugin, plugin: plugin,
storageKey: `plugins:${plugin.id}`, storageKey: `plugins:${plugin.id}`,
@ -40,15 +39,15 @@ export function install(plugin) {
initPlugin({ plugin, aiscript }); initPlugin({ plugin, aiscript });
aiscript.exec(deserialize(plugin.ast)); aiscript.exec(parser.parse(plugin.src));
} }
function createPluginEnv(opts) { function createPluginEnv(opts) {
const config = new Map(); const config = new Map<string, values.Value>();
for (const [k, v] of Object.entries(opts.plugin.config || {})) { for (const [k, v] of Object.entries(opts.plugin.config ?? {})) {
config.set( config.set(
k, k,
jsToVal( utils.jsToVal(
typeof opts.plugin.configData[k] !== "undefined" typeof opts.plugin.configData[k] !== "undefined"
? opts.plugin.configData[k] ? opts.plugin.configData[k]
: v.default, : v.default,
@ -108,6 +107,9 @@ function createPluginEnv(opts) {
"Plugin:register_note_post_interruptor": values.FN_NATIVE(([handler]) => { "Plugin:register_note_post_interruptor": values.FN_NATIVE(([handler]) => {
registerNotePostInterruptor({ pluginId: opts.plugin.id, handler }); registerNotePostInterruptor({ pluginId: opts.plugin.id, handler });
}), }),
"Plugin:register_page_view_interruptor": values.FN_NATIVE(([handler]) => {
registerPageViewInterruptor({ pluginId: opts.plugin.id, handler });
}),
"Plugin:open_url": values.FN_NATIVE(([url]) => { "Plugin:open_url": values.FN_NATIVE(([url]) => {
window.open(url.value, "_blank"); window.open(url.value, "_blank");
}), }),
@ -123,10 +125,17 @@ function registerPostFormAction({ pluginId, title, handler }) {
postFormActions.push({ postFormActions.push({
title, title,
handler: (form, update) => { handler: (form, update) => {
pluginContexts.get(pluginId).execFn(handler, [ const pluginContext = pluginContexts.get(pluginId);
if (!pluginContext) {
return;
}
pluginContext.execFn(handler, [
utils.jsToVal(form), utils.jsToVal(form),
values.FN_NATIVE(([key, value]) => { values.FN_NATIVE(([key, value]) => {
update(key.value, value.value); if (!key || !value) {
return;
}
update(utils.valToJs(key), utils.valToJs(value));
}), }),
]); ]);
}, },
@ -137,7 +146,11 @@ function registerUserAction({ pluginId, title, handler }) {
userActions.push({ userActions.push({
title, title,
handler: (user) => { handler: (user) => {
pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(user)]); const pluginContext = pluginContexts.get(pluginId);
if (!pluginContext) {
return;
}
pluginContext.execFn(handler, [utils.jsToVal(user)]);
}, },
}); });
} }
@ -146,7 +159,11 @@ function registerNoteAction({ pluginId, title, handler }) {
noteActions.push({ noteActions.push({
title, title,
handler: (note) => { handler: (note) => {
pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)]); const pluginContext = pluginContexts.get(pluginId);
if (!pluginContext) {
return;
}
pluginContext.execFn(handler, [utils.jsToVal(user)]);
}, },
}); });
} }
@ -154,10 +171,12 @@ function registerNoteAction({ pluginId, title, handler }) {
function registerNoteViewInterruptor({ pluginId, handler }) { function registerNoteViewInterruptor({ pluginId, handler }) {
noteViewInterruptors.push({ noteViewInterruptors.push({
handler: async (note) => { handler: async (note) => {
const pluginContext = pluginContexts.get(pluginId);
if (!pluginContext) {
return;
}
return utils.valToJs( return utils.valToJs(
await pluginContexts await pluginContext.execFn(handler, [utils.jsToVal(note)]),
.get(pluginId)
.execFn(handler, [utils.jsToVal(note)]),
); );
}, },
}); });
@ -166,10 +185,26 @@ function registerNoteViewInterruptor({ pluginId, handler }) {
function registerNotePostInterruptor({ pluginId, handler }) { function registerNotePostInterruptor({ pluginId, handler }) {
notePostInterruptors.push({ notePostInterruptors.push({
handler: async (note) => { handler: async (note) => {
const pluginContext = pluginContexts.get(pluginId);
if (!pluginContext) {
return;
}
return utils.valToJs( return utils.valToJs(
await pluginContexts await pluginContext.execFn(handler, [utils.jsToVal(note)]),
.get(pluginId) );
.execFn(handler, [utils.jsToVal(note)]), },
});
}
function registerPageViewInterruptor({ pluginId, handler }): void {
pageViewInterruptors.push({
handler: async (page) => {
const pluginContext = pluginContexts.get(pluginId);
if (!pluginContext) {
return;
}
return utils.valToJs(
await pluginContext.execFn(handler, [utils.jsToVal(page)]),
); );
}, },
}); });

View file

@ -54,5 +54,8 @@ export function createAiScriptEnv(opts) {
), ),
); );
}), }),
"Mk:url": values.FN_NATIVE(() => {
return values.STR(window.location.href);
}),
}; };
} }

View file

@ -1,7 +1,7 @@
import autobind from "autobind-decorator"; import autobind from "autobind-decorator";
import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from "."; import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from ".";
import { version } from "@/config"; import { version } from "@/config";
import { AiScript, utils, values } from "@syuilo/aiscript"; import { Interpreter, utils, values } from "@syuilo/aiscript";
import { createAiScriptEnv } from "../aiscript/api"; import { createAiScriptEnv } from "../aiscript/api";
import { collectPageVars } from "../collect-page-vars"; import { collectPageVars } from "../collect-page-vars";
import { initHpmlLib, initAiLib } from "./lib"; import { initHpmlLib, initAiLib } from "./lib";
@ -16,7 +16,7 @@ export class Hpml {
private variables: Variable[]; private variables: Variable[];
private pageVars: PageVar[]; private pageVars: PageVar[];
private envVars: Record<keyof typeof envVarsDef, any>; private envVars: Record<keyof typeof envVarsDef, any>;
public aiscript?: AiScript; public aiscript?: Interpreter;
public pageVarUpdatedCallback?: values.VFn; public pageVarUpdatedCallback?: values.VFn;
public canvases: Record<string, HTMLCanvasElement> = {}; public canvases: Record<string, HTMLCanvasElement> = {};
public vars: Ref<Record<string, any>> = ref({}); public vars: Ref<Record<string, any>> = ref({});
@ -37,7 +37,7 @@ export class Hpml {
if (this.opts.enableAiScript) { if (this.opts.enableAiScript) {
this.aiscript = markRaw( this.aiscript = markRaw(
new AiScript( new Interpreter(
{ {
...createAiScriptEnv({ ...createAiScriptEnv({
storageKey: `pages:${this.page.id}`, storageKey: `pages:${this.page.id}`,

View file

@ -27,13 +27,13 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, onUnmounted, ref, watch } from "vue"; import { onMounted, onUnmounted, ref, watch } from "vue";
import { AiScript, parse, utils } from "@syuilo/aiscript"; import { Interpreter, Parser, utils } from "@syuilo/aiscript";
import type { Widget, WidgetComponentExpose } from "./widget";
import { import {
useWidgetPropsManager,
WidgetComponentEmits, WidgetComponentEmits,
WidgetComponentProps, WidgetComponentProps,
useWidgetPropsManager,
} from "./widget"; } from "./widget";
import type { WidgetComponentExpose } from "./widget";
import type { GetFormResultType } from "@/scripts/form"; import type { GetFormResultType } from "@/scripts/form";
import * as os from "@/os"; import * as os from "@/os";
import MkContainer from "@/components/MkContainer.vue"; import MkContainer from "@/components/MkContainer.vue";
@ -58,11 +58,8 @@ const widgetPropsDef = {
type WidgetProps = GetFormResultType<typeof widgetPropsDef>; type WidgetProps = GetFormResultType<typeof widgetPropsDef>;
// vueimporttype const props = defineProps<WidgetComponentProps<WidgetProps>>();
// const props = defineProps<WidgetComponentProps<WidgetProps>>(); const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
// const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
const props = defineProps<{ widget?: Widget<WidgetProps> }>();
const emit = defineEmits<{ (ev: "updateProps", props: WidgetProps) }>();
const { widgetProps, configure } = useWidgetPropsManager( const { widgetProps, configure } = useWidgetPropsManager(
name, name,
@ -79,9 +76,11 @@ const logs = ref<
}[] }[]
>([]); >([]);
const parser = new Parser();
const run = async () => { const run = async () => {
logs.value = []; logs.value = [];
const aiscript = new AiScript( const aiscript = new Interpreter(
createAiScriptEnv({ createAiScriptEnv({
storageKey: "widget", storageKey: "widget",
token: $i?.token, token: $i?.token,
@ -124,11 +123,11 @@ const run = async () => {
let ast; let ast;
try { try {
ast = parse(widgetProps.script); ast = parser.parse(widgetProps.script);
} catch (err) { } catch (err) {
os.alert({ os.alert({
type: "error", type: "error",
text: "Syntax error :(", text: `Syntax error : ${err}`,
}); });
return; return;
} }
@ -137,7 +136,7 @@ const run = async () => {
} catch (err) { } catch (err) {
os.alert({ os.alert({
type: "error", type: "error",
text: err, text: String(err),
}); });
} }
}; };

View file

@ -8,16 +8,16 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, onUnmounted, ref, watch } from "vue"; import { onMounted, onUnmounted, ref, watch } from "vue";
import { AiScript, parse, utils } from "@syuilo/aiscript"; import { Interpreter, Parser } from "@syuilo/aiscript";
import type { Widget, WidgetComponentExpose } from "./widget"; import { createAiScriptEnv } from "@/scripts/aiscript/api";
import { import {
useWidgetPropsManager,
WidgetComponentEmits, WidgetComponentEmits,
WidgetComponentProps, WidgetComponentProps,
useWidgetPropsManager,
} from "./widget"; } from "./widget";
import type { WidgetComponentExpose } from "./widget";
import type { GetFormResultType } from "@/scripts/form"; import type { GetFormResultType } from "@/scripts/form";
import * as os from "@/os"; import * as os from "@/os";
import { createAiScriptEnv } from "@/scripts/aiscript/api";
import { $i } from "@/account"; import { $i } from "@/account";
import MkButton from "@/components/MkButton.vue"; import MkButton from "@/components/MkButton.vue";
@ -41,11 +41,8 @@ const widgetPropsDef = {
type WidgetProps = GetFormResultType<typeof widgetPropsDef>; type WidgetProps = GetFormResultType<typeof widgetPropsDef>;
// vueimporttype const props = defineProps<WidgetComponentProps<WidgetProps>>();
// const props = defineProps<WidgetComponentProps<WidgetProps>>(); const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
// const emit = defineEmits<WidgetComponentEmits<WidgetProps>>();
const props = defineProps<{ widget?: Widget<WidgetProps> }>();
const emit = defineEmits<{ (ev: "updateProps", props: WidgetProps) }>();
const { widgetProps, configure } = useWidgetPropsManager( const { widgetProps, configure } = useWidgetPropsManager(
name, name,
@ -54,8 +51,10 @@ const { widgetProps, configure } = useWidgetPropsManager(
emit, emit,
); );
const parser = new Parser();
const run = async () => { const run = async () => {
const aiscript = new AiScript( const aiscript = new Interpreter(
createAiScriptEnv({ createAiScriptEnv({
storageKey: "widget", storageKey: "widget",
token: $i?.token, token: $i?.token,
@ -81,11 +80,11 @@ const run = async () => {
let ast; let ast;
try { try {
ast = parse(widgetProps.script); ast = parser.parse(widgetProps.script);
} catch (err) { } catch (err) {
os.alert({ os.alert({
type: "error", type: "error",
text: "Syntax error :(", text: `Syntax error: ${err}`,
}); });
return; return;
} }
@ -94,7 +93,7 @@ const run = async () => {
} catch (err) { } catch (err) {
os.alert({ os.alert({
type: "error", type: "error",
text: err, text: String(err),
}); });
} }
}; };
@ -105,8 +104,3 @@ defineExpose<WidgetComponentExpose>({
id: props.widget ? props.widget.id : null, id: props.widget ? props.widget.id : null,
}); });
</script> </script>
<style lang="scss" scoped>
.mkw-button {
}
</style>

View file

@ -2691,16 +2691,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@syuilo/aiscript@npm:0.11.1": "@syuilo/aiscript@npm:0.16.0":
version: 0.11.1 version: 0.16.0
resolution: "@syuilo/aiscript@npm:0.11.1" resolution: "@syuilo/aiscript@npm:0.16.0"
dependencies: dependencies:
autobind-decorator: "npm:2.4.0"
chalk: "npm:4.0.0"
seedrandom: "npm:3.0.5" seedrandom: "npm:3.0.5"
stringz: "npm:2.1.0" stringz: "npm:2.1.0"
uuid: "npm:7.0.3" uuid: "npm:9.0.1"
checksum: 10/4df4bb5a25e8334dbfecac5dfa047b7637821d31daa1ada6fb14d2f13e94be4655c3845f6f61643be327b682608456d22fc5557c23c6c68bc1cfb7c76b6970d6 checksum: 10/5c77fc596dcff0e7ac30ba33f2550430dc1d69bd33075811d7822efb6102bae4169f455c867eac5821bee88993941bc6003bd981ad64885b2e643cb4bc260d4a
languageName: node languageName: node
linkType: hard linkType: hard
@ -5463,7 +5461,6 @@ __metadata:
"@swc/cli": "npm:^0.1.62" "@swc/cli": "npm:^0.1.62"
"@swc/core": "npm:^1.3.68" "@swc/core": "npm:^1.3.68"
"@swc/core-android-arm64": "npm:1.3.11" "@swc/core-android-arm64": "npm:1.3.11"
"@syuilo/aiscript": "npm:0.11.1"
"@types/adm-zip": "npm:^0.5.0" "@types/adm-zip": "npm:^0.5.0"
"@types/async-lock": "npm:1.4.0" "@types/async-lock": "npm:1.4.0"
"@types/bcryptjs": "npm:2.4.2" "@types/bcryptjs": "npm:2.4.2"
@ -6339,16 +6336,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"chalk@npm:4.0.0":
version: 4.0.0
resolution: "chalk@npm:4.0.0"
dependencies:
ansi-styles: "npm:^4.1.0"
supports-color: "npm:^7.1.0"
checksum: 10/f8ae363f43826f0eea96f94dbf5c544ec3cda1422ec998040b82381702db54e2a056a724445f6295842790bb7a3cb352cf83c704a4fdfee2bfcd2a74ce7fea13
languageName: node
linkType: hard
"chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": "chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2":
version: 4.1.2 version: 4.1.2
resolution: "chalk@npm:4.1.2" resolution: "chalk@npm:4.1.2"
@ -6673,7 +6660,7 @@ __metadata:
"@rollup/plugin-alias": "npm:^5.1.0" "@rollup/plugin-alias": "npm:^5.1.0"
"@rollup/plugin-json": "npm:^6.0.1" "@rollup/plugin-json": "npm:^6.0.1"
"@rollup/pluginutils": "npm:^5.1.0" "@rollup/pluginutils": "npm:^5.1.0"
"@syuilo/aiscript": "npm:0.11.1" "@syuilo/aiscript": "npm:0.16.0"
"@types/escape-regexp": "npm:0.0.1" "@types/escape-regexp": "npm:0.0.1"
"@types/glob": "npm:8.1.0" "@types/glob": "npm:8.1.0"
"@types/gulp": "npm:4.0.13" "@types/gulp": "npm:4.0.13"
@ -20813,15 +20800,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"uuid@npm:7.0.3":
version: 7.0.3
resolution: "uuid@npm:7.0.3"
bin:
uuid: dist/bin/uuid
checksum: 10/b2a4d30ecd6581015175487426558aafd7f7b4013a2e30802c128cc28cad9abe46ecd36c02f7fbcde7908fd4672334818d56a441c0871963d6bd89d911bef2ea
languageName: node
linkType: hard
"uuid@npm:8.0.0": "uuid@npm:8.0.0":
version: 8.0.0 version: 8.0.0
resolution: "uuid@npm:8.0.0" resolution: "uuid@npm:8.0.0"
@ -20840,6 +20818,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"uuid@npm:9.0.1":
version: 9.0.1
resolution: "uuid@npm:9.0.1"
bin:
uuid: dist/bin/uuid
checksum: 10/9d0b6adb72b736e36f2b1b53da0d559125ba3e39d913b6072f6f033e0c87835b414f0836b45bcfaf2bdf698f92297fea1c3cc19b0b258bc182c9c43cc0fab9f2
languageName: node
linkType: hard
"uuid@npm:^8.3.0, uuid@npm:^8.3.2": "uuid@npm:^8.3.0, uuid@npm:^8.3.2":
version: 8.3.2 version: 8.3.2
resolution: "uuid@npm:8.3.2" resolution: "uuid@npm:8.3.2"