summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-08-08 21:50:05 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-08-08 21:50:05 +0900
commite67ff36e57ea1dcb5ee64a732b328c1ba764198e (patch)
tree22d950ffa812183399af7572ad5078c3c319b2ae
parentBump version to 2025.8.0-alpha.6 (diff)
downloadmisskey-e67ff36e57ea1dcb5ee64a732b328c1ba764198e.tar.gz
misskey-e67ff36e57ea1dcb5ee64a732b328c1ba764198e.tar.bz2
misskey-e67ff36e57ea1dcb5ee64a732b328c1ba764198e.zip
enhance(frontend): AiScriptのcode-splittingが正しく行われるように
-rw-r--r--packages/frontend/src/plugin.ts27
1 files changed, 21 insertions, 6 deletions
diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts
index d47c6cd0e5..632c913ad7 100644
--- a/packages/frontend/src/plugin.ts
+++ b/packages/frontend/src/plugin.ts
@@ -3,14 +3,13 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { ref, defineAsyncComponent } from 'vue';
-import { Interpreter, Parser, utils, values } from '@syuilo/aiscript';
+import { ref } from 'vue';
import { compareVersions } from 'compare-versions';
import { isSafeMode } from '@@/js/config.js';
import * as Misskey from 'misskey-js';
+import type { Parser, Interpreter, values } from '@syuilo/aiscript';
import type { FormWithDefault } from '@/utility/form.js';
import { genId } from '@/utility/id.js';
-import { aiScriptReadline, createAiScriptEnv } from '@/aiscript/api.js';
import { store } from '@/store.js';
import * as os from '@/os.js';
import { misskeyApi } from '@/utility/misskey-api.js';
@@ -39,7 +38,13 @@ export type AiScriptPluginMeta = {
config?: Record<string, any>;
};
-const parser = new Parser();
+let _parser: Parser | null = null;
+
+async function getParser(): Promise<Parser> {
+ const { Parser } = await import('@syuilo/aiscript');
+ _parser ??= new Parser();
+ return _parser;
+}
export function isSupportedAiScriptVersion(version: string): boolean {
try {
@@ -54,6 +59,8 @@ export async function parsePluginMeta(code: string): Promise<AiScriptPluginMeta>
throw new Error('code is required');
}
+ const { Interpreter, utils } = await import('@syuilo/aiscript');
+
const lv = utils.getLangVersion(code);
if (lv == null) {
throw new Error('No language version annotation found');
@@ -63,6 +70,7 @@ export async function parsePluginMeta(code: string): Promise<AiScriptPluginMeta>
let ast;
try {
+ const parser = await getParser();
ast = parser.parse(code);
} catch (err) {
throw new Error('Aiscript syntax error');
@@ -255,7 +263,10 @@ async function launchPlugin(id: Plugin['installId']): Promise<void> {
await authorizePlugin(plugin);
- const aiscript = new Interpreter(createPluginEnv({
+ const { Interpreter, utils } = await import('@syuilo/aiscript');
+ const { aiScriptReadline } = await import('@/aiscript/api.js');
+
+ const aiscript = new Interpreter(await createPluginEnv({
plugin: plugin,
storageKey: 'plugins:' + plugin.installId,
}), {
@@ -280,6 +291,7 @@ async function launchPlugin(id: Plugin['installId']): Promise<void> {
pluginContexts.set(plugin.installId, aiscript);
+ const parser = await getParser();
aiscript.exec(parser.parse(plugin.src)).then(
() => {
console.info('Plugin installed:', plugin.name, 'v' + plugin.version);
@@ -336,9 +348,12 @@ export function changePluginActive(plugin: Plugin, active: boolean) {
}
}
-function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record<string, values.Value> {
+async function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Promise<Record<string, values.Value>> {
const id = opts.plugin.installId;
+ const { utils, values } = await import('@syuilo/aiscript');
+ const { createAiScriptEnv } = await import('@/aiscript/api.js');
+
const config = new Map<string, values.Value>();
for (const [k, v] of Object.entries(opts.plugin.config ?? {})) {
config.set(k, utils.jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default));