enhance(frontend): AiScriptのcode-splittingが正しく行われるように
This commit is contained in:
parent
96a165d729
commit
e67ff36e57
|
@ -3,14 +3,13 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { ref, defineAsyncComponent } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { Interpreter, Parser, utils, values } from '@syuilo/aiscript';
|
|
||||||
import { compareVersions } from 'compare-versions';
|
import { compareVersions } from 'compare-versions';
|
||||||
import { isSafeMode } from '@@/js/config.js';
|
import { isSafeMode } from '@@/js/config.js';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
|
import type { Parser, Interpreter, values } from '@syuilo/aiscript';
|
||||||
import type { FormWithDefault } from '@/utility/form.js';
|
import type { FormWithDefault } from '@/utility/form.js';
|
||||||
import { genId } from '@/utility/id.js';
|
import { genId } from '@/utility/id.js';
|
||||||
import { aiScriptReadline, createAiScriptEnv } from '@/aiscript/api.js';
|
|
||||||
import { store } from '@/store.js';
|
import { store } from '@/store.js';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { misskeyApi } from '@/utility/misskey-api.js';
|
import { misskeyApi } from '@/utility/misskey-api.js';
|
||||||
|
@ -39,7 +38,13 @@ export type AiScriptPluginMeta = {
|
||||||
config?: Record<string, any>;
|
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 {
|
export function isSupportedAiScriptVersion(version: string): boolean {
|
||||||
try {
|
try {
|
||||||
|
@ -54,6 +59,8 @@ export async function parsePluginMeta(code: string): Promise<AiScriptPluginMeta>
|
||||||
throw new Error('code is required');
|
throw new Error('code is required');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { Interpreter, utils } = await import('@syuilo/aiscript');
|
||||||
|
|
||||||
const lv = utils.getLangVersion(code);
|
const lv = utils.getLangVersion(code);
|
||||||
if (lv == null) {
|
if (lv == null) {
|
||||||
throw new Error('No language version annotation found');
|
throw new Error('No language version annotation found');
|
||||||
|
@ -63,6 +70,7 @@ export async function parsePluginMeta(code: string): Promise<AiScriptPluginMeta>
|
||||||
|
|
||||||
let ast;
|
let ast;
|
||||||
try {
|
try {
|
||||||
|
const parser = await getParser();
|
||||||
ast = parser.parse(code);
|
ast = parser.parse(code);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
throw new Error('Aiscript syntax error');
|
throw new Error('Aiscript syntax error');
|
||||||
|
@ -255,7 +263,10 @@ async function launchPlugin(id: Plugin['installId']): Promise<void> {
|
||||||
|
|
||||||
await authorizePlugin(plugin);
|
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,
|
plugin: plugin,
|
||||||
storageKey: 'plugins:' + plugin.installId,
|
storageKey: 'plugins:' + plugin.installId,
|
||||||
}), {
|
}), {
|
||||||
|
@ -280,6 +291,7 @@ async function launchPlugin(id: Plugin['installId']): Promise<void> {
|
||||||
|
|
||||||
pluginContexts.set(plugin.installId, aiscript);
|
pluginContexts.set(plugin.installId, aiscript);
|
||||||
|
|
||||||
|
const parser = await getParser();
|
||||||
aiscript.exec(parser.parse(plugin.src)).then(
|
aiscript.exec(parser.parse(plugin.src)).then(
|
||||||
() => {
|
() => {
|
||||||
console.info('Plugin installed:', plugin.name, 'v' + plugin.version);
|
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 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>();
|
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(k, utils.jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default));
|
config.set(k, utils.jsToVal(typeof opts.plugin.configData[k] !== 'undefined' ? opts.plugin.configData[k] : v.default));
|
||||||
|
|
Loading…
Reference in New Issue