diff --git a/src/rules/ScriptEditor.vue b/src/rules/ScriptEditor.vue
index bc9dc34..811dbda 100644
--- a/src/rules/ScriptEditor.vue
+++ b/src/rules/ScriptEditor.vue
@@ -22,27 +22,41 @@ const loadScriptDefinitions = async () => {
}
try {
const definitions = await fetchScriptDefinitions();
- monaco.typescript.javascriptDefaults.addExtraLib(definitions, 'ts:rule-runner.d.ts');
+ monaco.typescript.javascriptDefaults.addExtraLib(definitions, 'file:///node_modules/@eveal/runtime/index.d.ts');
extraLibLoaded = true;
} catch {
// type definitions are optional — the editor still works without autocomplete
}
};
-const props = defineProps<{ ledgerRefs?: string[] }>();
+export interface ScriptEditorScope {
+ ledgers?: string[];
+ characters?: string[];
+ corporations?: string[];
+ walletDivisions?: string[];
+}
-let ledgersLib: monaco.IDisposable | undefined;
+const props = defineProps<{ scope?: ScriptEditorScope }>();
-const updateLedgerRefs = (refs: readonly string[]) => {
- ledgersLib?.dispose();
+let scopeLib: monaco.IDisposable | undefined;
+
+const declareInterface = (name: string, type: string, refs: readonly string[]) => {
const members = refs
.filter(ref => ref && ref !== 'system')
- .map(ref => ` readonly ${JSON.stringify(ref)}: Ledger;`)
+ .map(ref => ` readonly ${JSON.stringify(ref)}: ${type};`)
.join('\n');
- ledgersLib = monaco.typescript.javascriptDefaults.addExtraLib(
- `declare interface Ledgers {\n${members}\n}\n`,
- 'ts:rule-runner.ledgers.d.ts'
- );
+ return ` interface ${name} {\n${members}\n }\n`;
+};
+
+const updateScope = (scope: ScriptEditorScope) => {
+ scopeLib?.dispose();
+ const source = `declare module '@eveal/runtime' {\n${[
+ declareInterface('Ledgers', 'Ledger', scope.ledgers ?? []),
+ declareInterface('Characters', 'Character', scope.characters ?? []),
+ declareInterface('Corporations', 'Corporation', scope.corporations ?? []),
+ declareInterface('WalletDivisions', 'WalletDivision', scope.walletDivisions ?? []),
+ ].join('\n')}}\n`;
+ scopeLib = monaco.typescript.javascriptDefaults.addExtraLib(source, 'ts:rule-runner.scope.d.ts');
};
const model = defineModel
({default: ''});
@@ -51,7 +65,7 @@ let editor: monaco.editor.IStandaloneCodeEditor | undefined;
onMounted(async () => {
await loadScriptDefinitions();
- updateLedgerRefs(props.ledgerRefs ?? []);
+ updateScope(props.scope ?? {});
if (!container.value) {
return;
@@ -83,11 +97,11 @@ watch(model, value => {
}
});
-watch(() => props.ledgerRefs, refs => updateLedgerRefs(refs ?? []), {deep: true});
+watch(() => props.scope, scope => updateScope(scope ?? {}), {deep: true});
onBeforeUnmount(() => {
editor?.dispose();
- ledgersLib?.dispose();
+ scopeLib?.dispose();
});
diff --git a/src/rules/rules.ts b/src/rules/rules.ts
index e82b896..a46ba0a 100644
--- a/src/rules/rules.ts
+++ b/src/rules/rules.ts
@@ -1,10 +1,19 @@
import {ruleBookApi, ruleScriptApi} from "@/mammon";
-import {RuleBookResponse, UpdateRuleBookRequest} from "@/generated/mammon";
+import {RuleBookResponse, RuleScopeRequest, RuleScriptRequest, RuleScriptResponse, UpdateRuleBookRequest} from "@/generated/mammon";
import {isAxiosError} from "axios";
import {defineStore} from "pinia";
import {ref} from "vue";
export type RuleBook = RuleBookResponse;
+export type RuleScript = RuleScriptResponse;
+export type RuleScope = RuleScriptResponse['scope'];
+
+export const emptyScope = (): RuleScopeRequest => ({
+ ledgers: {},
+ characters: {},
+ corporations: {},
+ walletDivisions: {},
+});
export const useRuleBookStore = defineStore('rule-book', () => {
const ruleBook = ref(null);
@@ -19,7 +28,7 @@ export const useRuleBookStore = defineStore('rule-book', () => {
throw error;
});
- const update = (request: UpdateRuleBookRequest) => ruleBookApi.updateRuleBook(request)
+ const update = (scripts: RuleScriptRequest[]) => ruleBookApi.updateRuleBook({scripts} satisfies UpdateRuleBookRequest)
.then(response => ruleBook.value = response.data);
refresh();
@@ -28,4 +37,8 @@ export const useRuleBookStore = defineStore('rule-book', () => {
})
export const fetchScriptDefinitions = (): Promise =>
- ruleScriptApi.getScriptDefinitions({responseType: 'text'}).then(response => response.data);
\ No newline at end of file
+ ruleScriptApi.listScriptDefinitions()
+ .then(response => Promise.all(
+ response.data.map(name => ruleScriptApi.getScriptDefinition(name, {responseType: 'text'}).then(r => r.data))
+ ))
+ .then(definitions => definitions.join('\n'));