jaml-ui 0.22.3 → 0.22.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/JamlCurator.d.ts +3 -3
- package/dist/components/JamlCurator.js +2 -2
- package/dist/hooks/searchWorkerCode.d.ts +1 -1
- package/dist/hooks/searchWorkerCode.js +13 -16
- package/dist/hooks/useAnalyzer.d.ts +2 -12
- package/dist/hooks/useAnalyzer.js +14 -14
- package/dist/hooks/useSearch.js +1 -86
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/lib/hooks/useSeedAnalyzer.d.ts +2 -6
- package/dist/lib/hooks/useSeedAnalyzer.js +4 -4
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Motely } from "motely-wasm";
|
|
2
2
|
export interface JamlCuratorProps {
|
|
3
|
-
|
|
3
|
+
motely: typeof Motely | null;
|
|
4
4
|
}
|
|
5
|
-
export declare function JamlCurator({
|
|
5
|
+
export declare function JamlCurator({ motely }: JamlCuratorProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -11,11 +11,11 @@ import { useSearch } from "../hooks/useSearch.js";
|
|
|
11
11
|
import { useAnalyzer } from "../hooks/useAnalyzer.js";
|
|
12
12
|
import { JamlSpeedometer } from "./JamlSpeedometer.js";
|
|
13
13
|
const C = JimboColorOption;
|
|
14
|
-
export function JamlCurator({
|
|
14
|
+
export function JamlCurator({ motely }) {
|
|
15
15
|
// Use map editor by default to generate JAML
|
|
16
16
|
const [jamlText, setJamlText] = useState("");
|
|
17
17
|
const search = useSearch();
|
|
18
|
-
const analyzer = useAnalyzer(
|
|
18
|
+
const analyzer = useAnalyzer(motely);
|
|
19
19
|
// Search results pagination
|
|
20
20
|
const [resultIndex, setResultIndex] = useState(0);
|
|
21
21
|
const isSearching = search.status === "running";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SEARCH_WORKER_CODE = "\nlet MotelyWasm = null;\nlet MotelyWasmEvents = null;\nlet
|
|
1
|
+
export declare const SEARCH_WORKER_CODE = "\nlet MotelyWasm = null;\nlet MotelyWasmEvents = null;\nlet activeSearch = null;\n\nself.addEventListener('message', async function(e) {\n const msg = e.data;\n\n if (msg.type === 'init') {\n try {\n const mod = await import(msg.url);\n await mod.default.boot();\n const motely = mod.Motely;\n MotelyWasm = motely.MotelyWasm;\n MotelyWasmEvents = motely.MotelyWasmEvents;\n self.postMessage({ type: 'ready' });\n } catch (err) {\n self.postMessage({ type: 'error', message: String(err) });\n }\n return;\n }\n\n if (msg.type === 'start') {\n if (!MotelyWasm) { self.postMessage({ type: 'error', message: 'Not initialized' }); return; }\n const validation = MotelyWasm.validateJaml(msg.jaml);\n if (validation !== 'valid') { self.postMessage({ type: 'error', message: validation }); return; }\n\n function cleanup() {\n MotelyWasmEvents.notifyResult = () => {};\n MotelyWasmEvents.notifyProgress = () => {};\n MotelyWasmEvents.notifyComplete = () => {};\n activeSearch = null;\n }\n\n MotelyWasmEvents.notifyResult = function(seed, score, tallyColumns) {\n self.postMessage({ type: 'result', seed, score, tallyColumns: Array.from(tallyColumns) });\n };\n MotelyWasmEvents.notifyProgress = function(searched, matching) {\n self.postMessage({ type: 'progress', searched: searched.toString(), matching: matching.toString() });\n };\n MotelyWasmEvents.notifyComplete = function(status, searched, matched) {\n cleanup();\n self.postMessage({ type: 'complete', status, searched: searched.toString(), matched: matched.toString() });\n };\n\n try {\n const mode = msg.mode || 'random';\n if (mode === 'random') {\n activeSearch = MotelyWasm.startRandomSearch(msg.jaml, msg.count);\n } else if (mode === 'aesthetic') {\n activeSearch = MotelyWasm.startAestheticSearch(msg.jaml, msg.aesthetic);\n } else if (mode === 'seedList') {\n activeSearch = MotelyWasm.startSeedListSearch(msg.jaml, msg.seeds);\n } else if (mode === 'keyword') {\n activeSearch = MotelyWasm.startKeywordSearch(msg.jaml, msg.keywords, msg.padding || '');\n } else if (mode === 'sequential') {\n activeSearch = MotelyWasm.startSequentialSearch(msg.jaml, msg.batchCharCount, BigInt(msg.startBatch), BigInt(msg.endBatch));\n } else {\n self.postMessage({ type: 'error', message: 'Unknown search mode: ' + mode });\n cleanup();\n return;\n }\n } catch (err) {\n cleanup();\n self.postMessage({ type: 'error', message: String(err) });\n }\n return;\n }\n\n if (msg.type === 'stop') {\n if (activeSearch) { activeSearch.cancel(); activeSearch = null; }\n self.postMessage({ type: 'cancelled' });\n }\n\n if (msg.type === 'get_tally_labels') {\n if (!MotelyWasm) { self.postMessage({ type: 'error', message: 'Not initialized' }); return; }\n try {\n const labels = MotelyWasm.getTallyLabels(msg.jaml);\n self.postMessage({ type: 'tally_labels', labels: Array.from(labels) });\n } catch (err) {\n self.postMessage({ type: 'error', message: String(err) });\n }\n }\n});\n";
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export const SEARCH_WORKER_CODE = `
|
|
2
2
|
let MotelyWasm = null;
|
|
3
3
|
let MotelyWasmEvents = null;
|
|
4
|
-
let Filters = null;
|
|
5
4
|
let activeSearch = null;
|
|
6
5
|
|
|
7
6
|
self.addEventListener('message', async function(e) {
|
|
@@ -11,9 +10,9 @@ self.addEventListener('message', async function(e) {
|
|
|
11
10
|
try {
|
|
12
11
|
const mod = await import(msg.url);
|
|
13
12
|
await mod.default.boot();
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
const motely = mod.Motely;
|
|
14
|
+
MotelyWasm = motely.MotelyWasm;
|
|
15
|
+
MotelyWasmEvents = motely.MotelyWasmEvents;
|
|
17
16
|
self.postMessage({ type: 'ready' });
|
|
18
17
|
} catch (err) {
|
|
19
18
|
self.postMessage({ type: 'error', message: String(err) });
|
|
@@ -26,28 +25,26 @@ self.addEventListener('message', async function(e) {
|
|
|
26
25
|
const validation = MotelyWasm.validateJaml(msg.jaml);
|
|
27
26
|
if (validation !== 'valid') { self.postMessage({ type: 'error', message: validation }); return; }
|
|
28
27
|
|
|
29
|
-
let rId, pId, cId;
|
|
30
28
|
function cleanup() {
|
|
31
|
-
MotelyWasmEvents.
|
|
32
|
-
MotelyWasmEvents.
|
|
33
|
-
MotelyWasmEvents.
|
|
29
|
+
MotelyWasmEvents.notifyResult = () => {};
|
|
30
|
+
MotelyWasmEvents.notifyProgress = () => {};
|
|
31
|
+
MotelyWasmEvents.notifyComplete = () => {};
|
|
34
32
|
activeSearch = null;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
|
-
|
|
35
|
+
MotelyWasmEvents.notifyResult = function(seed, score, tallyColumns) {
|
|
38
36
|
self.postMessage({ type: 'result', seed, score, tallyColumns: Array.from(tallyColumns) });
|
|
39
|
-
}
|
|
40
|
-
|
|
37
|
+
};
|
|
38
|
+
MotelyWasmEvents.notifyProgress = function(searched, matching) {
|
|
41
39
|
self.postMessage({ type: 'progress', searched: searched.toString(), matching: matching.toString() });
|
|
42
|
-
}
|
|
43
|
-
|
|
40
|
+
};
|
|
41
|
+
MotelyWasmEvents.notifyComplete = function(status, searched, matched) {
|
|
44
42
|
cleanup();
|
|
45
43
|
self.postMessage({ type: 'complete', status, searched: searched.toString(), matched: matched.toString() });
|
|
46
|
-
}
|
|
44
|
+
};
|
|
47
45
|
|
|
48
46
|
try {
|
|
49
47
|
const mode = msg.mode || 'random';
|
|
50
|
-
|
|
51
48
|
if (mode === 'random') {
|
|
52
49
|
activeSearch = MotelyWasm.startRandomSearch(msg.jaml, msg.count);
|
|
53
50
|
} else if (mode === 'aesthetic') {
|
|
@@ -79,7 +76,7 @@ self.addEventListener('message', async function(e) {
|
|
|
79
76
|
if (!MotelyWasm) { self.postMessage({ type: 'error', message: 'Not initialized' }); return; }
|
|
80
77
|
try {
|
|
81
78
|
const labels = MotelyWasm.getTallyLabels(msg.jaml);
|
|
82
|
-
self.postMessage({ type: 'tally_labels', labels });
|
|
79
|
+
self.postMessage({ type: 'tally_labels', labels: Array.from(labels) });
|
|
83
80
|
} catch (err) {
|
|
84
81
|
self.postMessage({ type: 'error', message: String(err) });
|
|
85
82
|
}
|
|
@@ -1,20 +1,10 @@
|
|
|
1
|
-
import { Motely } from "motely-wasm";
|
|
1
|
+
import { type Motely } from "motely-wasm";
|
|
2
2
|
import type { AnalyzerAnteView } from "../components/AnalyzerExplorer.js";
|
|
3
3
|
export type AnalyzerStatus = "idle" | "running" | "done" | "error";
|
|
4
4
|
export type MotelyJsRunState = {
|
|
5
5
|
voucherBitfield: number;
|
|
6
6
|
bossBitfield: number;
|
|
7
7
|
};
|
|
8
|
-
/**
|
|
9
|
-
* Runtime handle for motely-wasm. Consumers boot motely-wasm once and pass
|
|
10
|
-
* `{ MotelyWasm, Motely }` to hooks that need it. This keeps jaml-ui free of
|
|
11
|
-
* static motely-wasm imports so consumer bundlers don't pull the 12MB engine
|
|
12
|
-
* into their main bundle.
|
|
13
|
-
*/
|
|
14
|
-
export interface MotelyRuntime {
|
|
15
|
-
MotelyWasm: typeof Motely.MotelyWasm;
|
|
16
|
-
Motely: typeof Motely;
|
|
17
|
-
}
|
|
18
8
|
export interface AnalyzerLive {
|
|
19
9
|
ctx: ReturnType<typeof Motely.MotelyWasm.createSearchContext>;
|
|
20
10
|
Motely: typeof Motely;
|
|
@@ -24,7 +14,7 @@ export interface AnalyzerLive {
|
|
|
24
14
|
deck: string;
|
|
25
15
|
stake: string;
|
|
26
16
|
}
|
|
27
|
-
export declare function useAnalyzer(
|
|
17
|
+
export declare function useAnalyzer(motely: typeof Motely | null): {
|
|
28
18
|
antes: AnalyzerAnteView[];
|
|
29
19
|
status: AnalyzerStatus;
|
|
30
20
|
error: string | null;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { useState, useCallback } from "react";
|
|
3
3
|
import { extractVisualJamlItems } from "../utils/jamlMapPreview.js";
|
|
4
4
|
import { motelyItemDisplayNameFromValue } from "../motelyDisplay.js";
|
|
5
|
-
export function useAnalyzer(
|
|
5
|
+
export function useAnalyzer(motely) {
|
|
6
6
|
const [antes, setAntes] = useState([]);
|
|
7
7
|
const [status, setStatus] = useState("idle");
|
|
8
8
|
const [error, setError] = useState(null);
|
|
@@ -10,12 +10,12 @@ export function useAnalyzer(runtime) {
|
|
|
10
10
|
const [tallyColumns, setTallyColumns] = useState([]);
|
|
11
11
|
const [tallyLabels, setTallyLabels] = useState([]);
|
|
12
12
|
const analyze = useCallback(async (seed, deck, stake, jaml) => {
|
|
13
|
-
if (!
|
|
14
|
-
setError("motely-wasm
|
|
13
|
+
if (!motely) {
|
|
14
|
+
setError("motely-wasm not ready");
|
|
15
15
|
setStatus("error");
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
|
-
const
|
|
18
|
+
const MotelyWasm = motely.MotelyWasm;
|
|
19
19
|
setAntes([]);
|
|
20
20
|
setLive(null);
|
|
21
21
|
setTallyColumns([]);
|
|
@@ -23,8 +23,8 @@ export function useAnalyzer(runtime) {
|
|
|
23
23
|
setStatus("running");
|
|
24
24
|
setError(null);
|
|
25
25
|
try {
|
|
26
|
-
const deckEnum =
|
|
27
|
-
const stakeEnum =
|
|
26
|
+
const deckEnum = motely.MotelyDeck[deck] ?? motely.MotelyDeck.Red;
|
|
27
|
+
const stakeEnum = motely.MotelyStake[stake] ?? motely.MotelyStake.White;
|
|
28
28
|
const desiredNames = new Set();
|
|
29
29
|
if (jaml) {
|
|
30
30
|
const groups = extractVisualJamlItems(jaml);
|
|
@@ -41,10 +41,10 @@ export function useAnalyzer(runtime) {
|
|
|
41
41
|
const runStates = {};
|
|
42
42
|
for (let ante = 1; ante <= 39; ante++) {
|
|
43
43
|
const bossResult = ctx.getNextBossForAnte(bossStream, ante, runState);
|
|
44
|
-
const bossName =
|
|
44
|
+
const bossName = motely.MotelyBossBlind[bossResult.boss] ?? `Unknown(${bossResult.boss})`;
|
|
45
45
|
runState = bossResult.runState;
|
|
46
46
|
const voucherResult = ctx.getAnteFirstVoucher(ante, runState);
|
|
47
|
-
const voucherName =
|
|
47
|
+
const voucherName = motely.MotelyVoucher[voucherResult.voucher] ?? `Unknown(${voucherResult.voucher})`;
|
|
48
48
|
runState = voucherResult.runState;
|
|
49
49
|
runStates[ante] = { ...runState };
|
|
50
50
|
const tagStream = ctx.createTagStream(ante);
|
|
@@ -54,9 +54,9 @@ export function useAnalyzer(runtime) {
|
|
|
54
54
|
const packs = [];
|
|
55
55
|
for (let p = 0; p < 2; p++) {
|
|
56
56
|
const packResult = ctx.getNextBoosterPack(packStream);
|
|
57
|
-
packs.push(
|
|
57
|
+
packs.push(motely.MotelyBoosterPack[packResult.pack] ?? `Unknown(${packResult.pack})`);
|
|
58
58
|
}
|
|
59
|
-
const shopStream = ctx.createShopItemStream(ante, runState,
|
|
59
|
+
const shopStream = ctx.createShopItemStream(ante, runState, motely.MotelyShopStreamFlags.Default, motely.MotelyJokerStreamFlags.Default);
|
|
60
60
|
const shop = [];
|
|
61
61
|
for (let i = 0; i < 4; i++) {
|
|
62
62
|
const itemResult = ctx.getNextShopItem(shopStream);
|
|
@@ -68,21 +68,21 @@ export function useAnalyzer(runtime) {
|
|
|
68
68
|
ante,
|
|
69
69
|
boss: bossName,
|
|
70
70
|
voucher: voucherName,
|
|
71
|
-
smallBlindTag:
|
|
72
|
-
bigBlindTag:
|
|
71
|
+
smallBlindTag: motely.MotelyTag[tag1.tag] ?? `Unknown(${tag1.tag})`,
|
|
72
|
+
bigBlindTag: motely.MotelyTag[tag2.tag] ?? `Unknown(${tag2.tag})`,
|
|
73
73
|
packs,
|
|
74
74
|
shop,
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
setAntes(results);
|
|
78
|
-
setLive({ ctx, Motely, runStates, desiredNames, seed, deck, stake });
|
|
78
|
+
setLive({ ctx, Motely: motely, runStates, desiredNames, seed, deck, stake });
|
|
79
79
|
setStatus("done");
|
|
80
80
|
}
|
|
81
81
|
catch (e) {
|
|
82
82
|
setError(e instanceof Error ? e.message : String(e));
|
|
83
83
|
setStatus("error");
|
|
84
84
|
}
|
|
85
|
-
}, [
|
|
85
|
+
}, [motely]);
|
|
86
86
|
const clearError = useCallback(() => {
|
|
87
87
|
setError(null);
|
|
88
88
|
setStatus((s) => (s === "error" ? "idle" : s));
|
package/dist/hooks/useSearch.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useState, useCallback, useRef, useEffect } from "react";
|
|
3
|
+
import { SEARCH_WORKER_CODE } from "./searchWorkerCode.js";
|
|
3
4
|
const INITIAL_STATE = {
|
|
4
5
|
results: [],
|
|
5
6
|
totalSearched: 0n,
|
|
@@ -9,92 +10,6 @@ const INITIAL_STATE = {
|
|
|
9
10
|
seedsPerSecond: 0,
|
|
10
11
|
tallyLabels: [],
|
|
11
12
|
};
|
|
12
|
-
const SEARCH_WORKER_CODE = `
|
|
13
|
-
let MotelyWasm = null;
|
|
14
|
-
let MotelyWasmEvents = null;
|
|
15
|
-
let activeSearch = null;
|
|
16
|
-
|
|
17
|
-
self.addEventListener('message', async function(e) {
|
|
18
|
-
const msg = e.data;
|
|
19
|
-
|
|
20
|
-
if (msg.type === 'init') {
|
|
21
|
-
try {
|
|
22
|
-
const mod = await import(msg.url);
|
|
23
|
-
await mod.default.boot();
|
|
24
|
-
const motely = mod.Motely;
|
|
25
|
-
MotelyWasm = motely.MotelyWasm;
|
|
26
|
-
MotelyWasmEvents = motely.MotelyWasmEvents;
|
|
27
|
-
self.postMessage({ type: 'ready' });
|
|
28
|
-
} catch (err) {
|
|
29
|
-
self.postMessage({ type: 'error', message: String(err) });
|
|
30
|
-
}
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (msg.type === 'start') {
|
|
35
|
-
if (!MotelyWasm) { self.postMessage({ type: 'error', message: 'Not initialized' }); return; }
|
|
36
|
-
const validation = MotelyWasm.validateJaml(msg.jaml);
|
|
37
|
-
if (validation !== 'valid') { self.postMessage({ type: 'error', message: validation }); return; }
|
|
38
|
-
|
|
39
|
-
function cleanup() {
|
|
40
|
-
MotelyWasmEvents.notifyResult = () => {};
|
|
41
|
-
MotelyWasmEvents.notifyProgress = () => {};
|
|
42
|
-
MotelyWasmEvents.notifyComplete = () => {};
|
|
43
|
-
activeSearch = null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
MotelyWasmEvents.notifyResult = function(seed, score, tallyColumns) {
|
|
47
|
-
self.postMessage({ type: 'result', seed, score, tallyColumns: Array.from(tallyColumns) });
|
|
48
|
-
};
|
|
49
|
-
MotelyWasmEvents.notifyProgress = function(searched, matching) {
|
|
50
|
-
self.postMessage({ type: 'progress', searched: searched.toString(), matching: matching.toString() });
|
|
51
|
-
};
|
|
52
|
-
MotelyWasmEvents.notifyComplete = function(status, searched, matched) {
|
|
53
|
-
cleanup();
|
|
54
|
-
self.postMessage({ type: 'complete', status, searched: searched.toString(), matched: matched.toString() });
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
const mode = msg.mode || 'random';
|
|
59
|
-
|
|
60
|
-
if (mode === 'random') {
|
|
61
|
-
activeSearch = MotelyWasm.startRandomSearch(msg.jaml, msg.count);
|
|
62
|
-
} else if (mode === 'aesthetic') {
|
|
63
|
-
activeSearch = MotelyWasm.startAestheticSearch(msg.jaml, msg.aesthetic);
|
|
64
|
-
} else if (mode === 'seedList') {
|
|
65
|
-
activeSearch = MotelyWasm.startSeedListSearch(msg.jaml, msg.seeds);
|
|
66
|
-
} else if (mode === 'keyword') {
|
|
67
|
-
activeSearch = MotelyWasm.startKeywordSearch(msg.jaml, msg.keywords, msg.padding || '');
|
|
68
|
-
} else if (mode === 'sequential') {
|
|
69
|
-
activeSearch = MotelyWasm.startSequentialSearch(msg.jaml, msg.batchCharCount, BigInt(msg.startBatch), BigInt(msg.endBatch));
|
|
70
|
-
} else {
|
|
71
|
-
self.postMessage({ type: 'error', message: 'Unknown search mode: ' + mode });
|
|
72
|
-
cleanup();
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
} catch (err) {
|
|
76
|
-
cleanup();
|
|
77
|
-
self.postMessage({ type: 'error', message: String(err) });
|
|
78
|
-
}
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (msg.type === 'stop') {
|
|
83
|
-
if (activeSearch) { activeSearch.cancel(); activeSearch = null; }
|
|
84
|
-
self.postMessage({ type: 'cancelled' });
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (msg.type === 'get_tally_labels') {
|
|
88
|
-
if (!MotelyWasm) { self.postMessage({ type: 'error', message: 'Not initialized' }); return; }
|
|
89
|
-
try {
|
|
90
|
-
const labels = MotelyWasm.getTallyLabels(msg.jaml);
|
|
91
|
-
self.postMessage({ type: 'tally_labels', labels: Array.from(labels) });
|
|
92
|
-
} catch (err) {
|
|
93
|
-
self.postMessage({ type: 'error', message: String(err) });
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
`;
|
|
98
13
|
function createWorker() {
|
|
99
14
|
const blob = new Blob([SEARCH_WORKER_CODE], { type: "application/javascript" });
|
|
100
15
|
return new Worker(URL.createObjectURL(blob), { type: "module" });
|
package/dist/index.d.ts
CHANGED
|
@@ -21,7 +21,8 @@ export { Showcase, type ShowcaseFilter, type ShowcaseLiveStats, type ShowcasePro
|
|
|
21
21
|
export { extractVisualJamlItems, type JamlPreviewGroups, type JamlPreviewItem, type JamlPreviewSection, type JamlPreviewVisualType, } from "./utils/jamlMapPreview.js";
|
|
22
22
|
export { useMotelyStream, type StreamItem, type StreamState } from "./hooks/useShopStream.js";
|
|
23
23
|
export { useSearch, type SearchResult, type SearchStatus, type UseSearchState, } from "./hooks/useSearch.js";
|
|
24
|
-
export { useAnalyzer, type AnalyzerStatus, type AnalyzerLive, type MotelyJsRunState,
|
|
24
|
+
export { useAnalyzer, type AnalyzerStatus, type AnalyzerLive, type MotelyJsRunState, } from "./hooks/useAnalyzer.js";
|
|
25
|
+
export { SEARCH_WORKER_CODE } from "./hooks/searchWorkerCode.js";
|
|
25
26
|
export { setMotelyEnums as setMotelyDisplayEnums } from "./motelyDisplay.js";
|
|
26
27
|
export { setMotelyEnums as setMotelyDecoderEnums } from "./decode/motelyItemDecoder.js";
|
|
27
28
|
export { JamlAestheticSelector, type JamlAestheticSelectorProps, type JamlAestheticOption, } from "./components/JamlAestheticSelector.js";
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,7 @@ export { extractVisualJamlItems, } from "./utils/jamlMapPreview.js";
|
|
|
23
23
|
export { useMotelyStream } from "./hooks/useShopStream.js";
|
|
24
24
|
export { useSearch, } from "./hooks/useSearch.js";
|
|
25
25
|
export { useAnalyzer, } from "./hooks/useAnalyzer.js";
|
|
26
|
+
export { SEARCH_WORKER_CODE } from "./hooks/searchWorkerCode.js";
|
|
26
27
|
// Setter pattern for motely-wasm runtime enums. Consumers boot motely-wasm
|
|
27
28
|
// and call setMotelyEnums(Motely) once after boot so display/decoder helpers
|
|
28
29
|
// can resolve enum keys without statically importing motely-wasm.
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import { Motely } from "motely-wasm";
|
|
2
|
-
export
|
|
3
|
-
MotelyWasm: typeof Motely.MotelyWasm;
|
|
4
|
-
Motely: typeof Motely;
|
|
5
|
-
}
|
|
6
|
-
export declare function useSeedAnalyzer(runtime: MotelyRuntime | null, seed: string | null): {
|
|
1
|
+
import { type Motely } from "motely-wasm";
|
|
2
|
+
export declare function useSeedAnalyzer(motely: typeof Motely | null, seed: string | null): {
|
|
7
3
|
data: Motely.Analysis.MotelyLegacyTextAnalyzer | null | undefined;
|
|
8
4
|
loading: boolean;
|
|
9
5
|
error: string | null;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useState, useEffect } from "react";
|
|
3
|
-
export function useSeedAnalyzer(
|
|
3
|
+
export function useSeedAnalyzer(motely, seed) {
|
|
4
4
|
const [data, setData] = useState(null);
|
|
5
5
|
const [loading, setLoading] = useState(false);
|
|
6
6
|
const [error, setError] = useState(null);
|
|
7
7
|
useEffect(() => {
|
|
8
|
-
if (!seed || seed === "LOCKED" || !
|
|
8
|
+
if (!seed || seed === "LOCKED" || !motely) {
|
|
9
9
|
setData(null);
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
@@ -15,7 +15,7 @@ export function useSeedAnalyzer(runtime, seed) {
|
|
|
15
15
|
setError(null);
|
|
16
16
|
try {
|
|
17
17
|
const jaml = `version: 1\nconfig:\n deck: Erratic\n stake: White\n`;
|
|
18
|
-
const rawResult =
|
|
18
|
+
const rawResult = motely.MotelyWasm.analyzeJamlSeeds(jaml, [seed]);
|
|
19
19
|
if (abortController.signal.aborted)
|
|
20
20
|
return;
|
|
21
21
|
if (rawResult && rawResult.seeds.length > 0) {
|
|
@@ -39,6 +39,6 @@ export function useSeedAnalyzer(runtime, seed) {
|
|
|
39
39
|
};
|
|
40
40
|
runAnalysis();
|
|
41
41
|
return () => abortController.abort();
|
|
42
|
-
}, [
|
|
42
|
+
}, [motely, seed]);
|
|
43
43
|
return { data, loading, error };
|
|
44
44
|
}
|