jaml-ui 1.0.0 → 1.0.2
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/assets/{searchPoolWorker-DWobBIhl.js → searchPoolWorker-DHh9a5GD.js} +2 -2
- package/dist/assets/searchPoolWorker-DHh9a5GD.js.map +1 -0
- package/dist/chunks/{jamlSeeds-3ILzc_rj.js → jamlSeeds-CKHvpjhC.js} +1 -1
- package/dist/chunks/{jamlSeeds-3ILzc_rj.js.map → jamlSeeds-CKHvpjhC.js.map} +1 -1
- package/dist/chunks/{motelyItemFormats-CNrFzcCI.js → motelyItemFormats-Dyq1BINO.js} +275 -267
- package/dist/chunks/motelyItemFormats-Dyq1BINO.js.map +1 -0
- package/dist/chunks/{searchPoolWorker-tBaSbLZu.js → searchPoolWorker-DgRqVj_q.js} +2 -2
- package/dist/chunks/searchPoolWorker-DgRqVj_q.js.map +1 -0
- package/dist/chunks/{assets-Bb6wV80_.js → spriteMapper-C2mqQHLj.js} +2417 -2
- package/dist/chunks/spriteMapper-C2mqQHLj.js.map +1 -0
- package/dist/chunks/{ui-Dn8IIoV3.js → ui-LfKBGL5-.js} +675 -791
- package/dist/chunks/ui-LfKBGL5-.js.map +1 -0
- package/dist/core.js +7 -8
- package/dist/core.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1185 -1230
- package/dist/index.js.map +1 -1
- package/dist/lib/motely/runtime.d.ts +7 -0
- package/dist/motely.js +10 -11
- package/dist/motely.js.map +1 -1
- package/dist/ui/jimbo.css +1 -1
- package/dist/ui/jimboApp.d.ts +3 -6
- package/dist/ui/jimboBackground.d.ts +4 -8
- package/dist/ui/sprites.d.ts +2 -1
- package/dist/ui.d.ts +0 -2
- package/dist/ui.js +2 -3
- package/package.json +15 -39
- package/dist/assets/searchPoolWorker-DWobBIhl.js.map +0 -1
- package/dist/chunks/assets-Bb6wV80_.js.map +0 -1
- package/dist/chunks/motelyItemFormats-CNrFzcCI.js.map +0 -1
- package/dist/chunks/searchPoolWorker-tBaSbLZu.js.map +0 -1
- package/dist/chunks/spriteMapper-CajFGgUU.js +0 -2419
- package/dist/chunks/spriteMapper-CajFGgUU.js.map +0 -1
- package/dist/chunks/tokens-Qrhlekc4.js +0 -57
- package/dist/chunks/tokens-Qrhlekc4.js.map +0 -1
- package/dist/chunks/ui-Dn8IIoV3.js.map +0 -1
- package/dist/r3f/Card3D.d.ts +0 -25
- package/dist/r3f/JimboBillboard.d.ts +0 -10
- package/dist/r3f/JimboText3D.d.ts +0 -9
- package/dist/r3f.d.ts +0 -3
- package/dist/r3f.js +0 -235
- package/dist/r3f.js.map +0 -1
- package/dist/ui/JimboPanelSplitter.d.ts +0 -8
- package/dist/ui/showcase.d.ts +0 -38
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import { Motely } from 'motely-wasm';
|
|
1
2
|
export type MotelyRuntimeStatus = "idle" | "booting" | "ready" | "error";
|
|
3
|
+
type JimmolateProbe = typeof Motely.jimmolateProbe;
|
|
4
|
+
/** Swap the active Jimmolate predicate. Safe before or after boot. */
|
|
5
|
+
export declare function setJimmolateProbe(pred: JimmolateProbe): void;
|
|
6
|
+
/** Reset the probe to pass-through (the engine's default: every survivor matches). */
|
|
7
|
+
export declare function clearJimmolateProbe(): void;
|
|
2
8
|
export declare const MOTELY_BIN_PATH = "/motely-wasm/bin";
|
|
3
9
|
export declare function ensureMotelyReady(): Promise<void>;
|
|
10
|
+
export {};
|
package/dist/motely.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as a, r as o, t as s } from "./chunks/motelyItemFormats-CNrFzcCI.js";
|
|
2
|
+
import { b as e, d as t, h as n, r, t as i } from "./chunks/spriteMapper-C2mqQHLj.js";
|
|
3
|
+
import { i as a, n as o, t as s } from "./chunks/motelyItemFormats-Dyq1BINO.js";
|
|
5
4
|
import { useCallback as c, useEffect as ee, useState as l } from "react";
|
|
6
5
|
import u, { Motely as d, Motely as f, MotelyItemEdition as p, MotelyItemEnhancement as m, MotelyItemSeal as h, MotelyStandardcardRank as g, MotelyStandardcardSuit as _ } from "motely-wasm";
|
|
7
6
|
import { IFileMounter as te, PermissionMode as v } from "motely-wasm/bootsharp/file-system";
|
|
@@ -269,7 +268,7 @@ function $(e) {
|
|
|
269
268
|
return e instanceof Error ? e.message : String(e);
|
|
270
269
|
}
|
|
271
270
|
function de() {
|
|
272
|
-
let [e, t] = l("idle"), [n, r] = l(null), [i,
|
|
271
|
+
let [e, t] = l("idle"), [n, r] = l(null), [i, o] = l([]), [s, u] = l(null);
|
|
273
272
|
ee(() => {
|
|
274
273
|
let e = !1;
|
|
275
274
|
return Q().then(() => {
|
|
@@ -279,7 +278,7 @@ function de() {
|
|
|
279
278
|
};
|
|
280
279
|
}, []);
|
|
281
280
|
let d = Y !== null, p = c(() => {
|
|
282
|
-
n &&
|
|
281
|
+
n && o((e) => [...e]);
|
|
283
282
|
}, [n]);
|
|
284
283
|
return {
|
|
285
284
|
status: e,
|
|
@@ -293,7 +292,7 @@ function de() {
|
|
|
293
292
|
}
|
|
294
293
|
t("mounting"), u(null);
|
|
295
294
|
try {
|
|
296
|
-
await
|
|
295
|
+
await a();
|
|
297
296
|
let e = await f.pickRoot({
|
|
298
297
|
mode: v.ReadWrite,
|
|
299
298
|
id: "jaml-library"
|
|
@@ -302,26 +301,26 @@ function de() {
|
|
|
302
301
|
t("idle");
|
|
303
302
|
return;
|
|
304
303
|
}
|
|
305
|
-
r(await f.mountRoot(e, { mode: v.ReadWrite })),
|
|
304
|
+
r(await f.mountRoot(e, { mode: v.ReadWrite })), o([]), t("ready");
|
|
306
305
|
} catch (e) {
|
|
307
306
|
t("error"), u($(e));
|
|
308
307
|
}
|
|
309
308
|
}, []),
|
|
310
309
|
unmount: c(async () => {
|
|
311
|
-
n && (await
|
|
310
|
+
n && (await a(), await f.unmountRoot(n), r(null), o([]), t(d ? "idle" : "unsupported"));
|
|
312
311
|
}, [d, n]),
|
|
313
312
|
loadFile: c(async (e) => {
|
|
314
313
|
if (!n) throw Error("JAML library is not mounted.");
|
|
315
|
-
return await
|
|
314
|
+
return await a(), await f.readTextFile(n, e);
|
|
316
315
|
}, [n]),
|
|
317
316
|
saveFile: c(async (e, t) => {
|
|
318
317
|
if (!n) throw Error("JAML library is not mounted.");
|
|
319
|
-
await
|
|
318
|
+
await a(), await f.writeTextFile(n, e, t), o((t) => (t.includes(e) ? t : [...t, e]).sort((e, t) => e.localeCompare(t)));
|
|
320
319
|
}, [n]),
|
|
321
320
|
refresh: p
|
|
322
321
|
};
|
|
323
322
|
}
|
|
324
323
|
//#endregion
|
|
325
|
-
export {
|
|
324
|
+
export { o as MOTELY_BIN_PATH, d as Motely, u as bootsharp, L as decodeMotelyItem, ie as decodeMotelyItemName, R as decodeMotelyItemToJamlCard, a as ensureMotelyReady, H as getMotelySpriteByName, se as motelyBoosterPackDisplayName, ce as motelyBoosterPackDisplayNameFromKey, G as motelyBossDisplayName, K as motelyBossDisplayNameFromKey, B as motelyItemCacheSize, k as motelyItemCategory, re as motelyItemDisplayName, le as motelyItemDisplayNameFromKey, ue as motelyItemDisplayNameFromValue, M as motelyItemEditionName, P as motelyItemEnhancementName, A as motelyItemRenderCategory, N as motelyItemSealName, V as motelyItemToSprite, O as motelyItemTypeName, F as motelyStandardcardRankName, I as motelyStandardcardSuitName, ae as motelyTagDisplayName, oe as motelyTagDisplayNameFromKey, q as motelyVoucherDisplayName, J as motelyVoucherDisplayNameFromKey, D as resolveMotelyItemType, de as useJamlLibrary, z as warmMotelyItemCache };
|
|
326
325
|
|
|
327
326
|
//# sourceMappingURL=motely.js.map
|
package/dist/motely.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelyItemDecoder.ts","../src/decode/motelySprite.ts","../src/motelyDisplay.ts","../src/hooks/useJamlLibrary.ts"],"sourcesContent":["import { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./motelyItemFormats.js\";\nimport {\n MotelyItemEdition,\n MotelyItemSeal,\n MotelyItemEnhancement,\n MotelyStandardcardRank,\n MotelyStandardcardSuit,\n} from \"motely-wasm\";\n\ntype MotelyItemCategoryName = \"Standardcard\" | \"SpectralCard\" | \"TarotCard\" | \"PlanetCard\" | \"Joker\" | \"Invalid\";\n\nconst CATEGORY_MAP: Record<MotelyItemCategoryName, MotelyRenderableCategory> = {\n Standardcard: \"playing\",\n SpectralCard: \"spectral\",\n TarotCard: \"tarot\",\n PlanetCard: \"planet\",\n Joker: \"joker\",\n Invalid: \"unknown\",\n};\n\nconst EDITIONS: Record<MotelyItemEdition, string> = {\n [MotelyItemEdition.None]: \"Base\",\n [MotelyItemEdition.Foil]: \"Foil\",\n [MotelyItemEdition.Holographic]: \"Holographic\",\n [MotelyItemEdition.Polychrome]: \"Polychrome\",\n [MotelyItemEdition.Negative]: \"Negative\",\n};\n\nconst SEALS: Record<MotelyItemSeal, string> = {\n [MotelyItemSeal.None]: \"None\",\n [MotelyItemSeal.Gold]: \"Gold\",\n [MotelyItemSeal.Red]: \"Red\",\n [MotelyItemSeal.Blue]: \"Blue\",\n [MotelyItemSeal.Purple]: \"Purple\",\n};\n\nconst ENHANCEMENTS: Record<MotelyItemEnhancement, string> = {\n [MotelyItemEnhancement.None]: \"None\",\n [MotelyItemEnhancement.Bonus]: \"Bonus\",\n [MotelyItemEnhancement.Mult]: \"Mult\",\n [MotelyItemEnhancement.Wild]: \"Wild\",\n [MotelyItemEnhancement.Glass]: \"Glass\",\n [MotelyItemEnhancement.Steel]: \"Steel\",\n [MotelyItemEnhancement.Stone]: \"Stone\",\n [MotelyItemEnhancement.Gold]: \"Gold\",\n [MotelyItemEnhancement.Lucky]: \"Lucky\",\n};\n\nconst RANKS: Record<MotelyStandardcardRank, string> = {\n [MotelyStandardcardRank.Two]: \"2\",\n [MotelyStandardcardRank.Three]: \"3\",\n [MotelyStandardcardRank.Four]: \"4\",\n [MotelyStandardcardRank.Five]: \"5\",\n [MotelyStandardcardRank.Six]: \"6\",\n [MotelyStandardcardRank.Seven]: \"7\",\n [MotelyStandardcardRank.Eight]: \"8\",\n [MotelyStandardcardRank.Nine]: \"9\",\n [MotelyStandardcardRank.Ten]: \"10\",\n [MotelyStandardcardRank.Jack]: \"Jack\",\n [MotelyStandardcardRank.Queen]: \"Queen\",\n [MotelyStandardcardRank.King]: \"King\",\n [MotelyStandardcardRank.Ace]: \"Ace\",\n};\n\nconst SUITS: Record<MotelyStandardcardSuit, \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\"> = {\n [MotelyStandardcardSuit.Clubs]: \"Clubs\",\n [MotelyStandardcardSuit.Diamonds]: \"Diamonds\",\n [MotelyStandardcardSuit.Hearts]: \"Hearts\",\n [MotelyStandardcardSuit.Spades]: \"Spades\",\n};\n\n\nexport type CardCategory = \"joker\" | \"consumable\" | \"playing\" | \"spectral\" | \"tarot\" | \"planet\";\nexport type MotelyRenderableCategory = CardCategory | \"unknown\";\n\nexport type MotelyItemInput = number | MotelyRuntimeItem | null | undefined;\n\nexport interface MotelyRuntimeItem {\n type?: number;\n value?: number;\n edition?: number;\n seal?: number;\n enhancement?: number;\n suit?: number;\n rank?: number;\n}\n\nexport interface DecodedMotelyItem {\n itemType: number;\n enumKey: string;\n displayName: string;\n category: MotelyRenderableCategory;\n edition: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null;\n seal: \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null;\n enhancement: string | null;\n rank: string | null;\n suit: \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null;\n isEternal: boolean;\n isPerishable: boolean;\n isRental: boolean;\n}\n\n\nexport interface MotelyJamlCard {\n type: \"joker\" | \"consumable\" | \"playing\";\n card: {\n name: string;\n edition?: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n seal?: string;\n enhancements?: string[];\n rank?: string;\n suit?: string;\n isEternal?: boolean;\n isPerishable?: boolean;\n isRental?: boolean;\n scale?: number;\n };\n}\n\nfunction itemFormat(itemType: number) {\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE];\n}\n\nfunction spaceSplit(value: string): string {\n return value.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\");\n}\n\nfunction resolvePackedValue(input: MotelyItemInput): number | null {\n if (input == null) return null;\n if (typeof input === \"number\") return Number.isFinite(input) ? input : null;\n return input.value ?? input.type ?? null;\n}\n\nexport function resolveMotelyItemType(input: MotelyItemInput): number | null {\n const val = resolvePackedValue(input);\n return val !== null ? val & 0xffff : null;\n}\n\nexport function motelyItemTypeName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.enumName ?? `item#${itemType}`;\n}\n\nexport function motelyItemCategory(itemType: number): MotelyRenderableCategory {\n const category = itemFormat(itemType)?.category as MotelyItemCategoryName | undefined;\n return category ? CATEGORY_MAP[category] ?? \"unknown\" : \"unknown\";\n}\n\nexport function motelyItemRenderCategory(input: MotelyItemInput): MotelyRenderableCategory {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"unknown\";\n return motelyItemCategory(itemType);\n}\n\nexport function motelyItemDisplayName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.displayName ?? spaceSplit(motelyItemTypeName(input));\n}\n\nimport { Motely } from \"motely-wasm\";\n\nfunction isStickerSet(input: MotelyItemInput, bitOffset: number): boolean {\n const val = resolvePackedValue(input);\n if (val === null) return false;\n return (val & (1 << bitOffset)) !== 0;\n}\n\nexport function motelyItemEditionName(input: MotelyItemInput): \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemEdition(input) : input.edition;\n if (val == null || val === MotelyItemEdition.None) return null;\n return EDITIONS[val] as \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n}\n\nexport function motelyItemSealName(input: MotelyItemInput): \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemSeal(input) : input.seal;\n if (val == null || val === MotelyItemSeal.None) return null;\n return SEALS[val] as \"Gold\" | \"Red\" | \"Blue\" | \"Purple\";\n}\n\nexport function motelyItemEnhancementName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemEnhancement(input) : input.enhancement;\n if (val == null || val === MotelyItemEnhancement.None) return null;\n return ENHANCEMENTS[val] ?? null;\n}\n\n\nexport function motelyStandardcardRankName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? Motely.decodeStandardcardRank(input) : input.rank;\n if (val == null) return null;\n return RANKS[val] ?? null;\n}\n\nexport function motelyStandardcardSuitName(input: MotelyItemInput): \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? Motely.decodeStandardcardSuit(input) : input.suit;\n if (val == null) return null;\n return SUITS[val] ?? null;\n}\n\nexport function decodeMotelyItemName(input: MotelyItemInput): string {\n return motelyItemTypeName(input);\n}\n\nexport function decodeMotelyItem(input: MotelyItemInput): DecodedMotelyItem | null {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return null;\n\n const format = itemFormat(itemType);\n const enumKeyStr = format?.enumName ?? `Unknown_${itemType}`;\n const category = motelyItemCategory(itemType);\n const displayName = format?.displayName ?? spaceSplit(enumKeyStr);\n\n return {\n itemType,\n enumKey: enumKeyStr,\n displayName,\n category,\n edition: motelyItemEditionName(input),\n seal: motelyItemSealName(input),\n enhancement: motelyItemEnhancementName(input),\n rank: motelyStandardcardRankName(input),\n suit: motelyStandardcardSuitName(input),\n isEternal: typeof input === \"number\" ? Motely.isEternal(input) : isStickerSet(input, 30),\n isPerishable: typeof input === \"number\" ? Motely.isPerishable(input) : isStickerSet(input, 31),\n isRental: typeof input === \"number\" ? Motely.isRental(input) : isStickerSet(input, 29),\n };\n}\n\nexport function decodeMotelyItemToJamlCard(input: MotelyItemInput, scale?: number): MotelyJamlCard | null {\n const decoded = decodeMotelyItem(input);\n if (!decoded) return null;\n\n const type: \"joker\" | \"consumable\" | \"playing\" =\n decoded.category === \"joker\" ? \"joker\"\n : decoded.category === \"playing\" ? \"playing\"\n : \"consumable\";\n\n return {\n type,\n card: {\n name: decoded.displayName,\n edition: decoded.edition ?? undefined,\n seal: decoded.seal ?? undefined,\n enhancements: decoded.enhancement ? [decoded.enhancement] : undefined,\n rank: decoded.rank ?? undefined,\n suit: decoded.suit ?? undefined,\n isEternal: decoded.isEternal,\n isPerishable: decoded.isPerishable,\n isRental: decoded.isRental,\n scale,\n },\n };\n}\n\nexport function warmMotelyItemCache(): void { /* no-op */ }\nexport function motelyItemCacheSize(): number { return 0; }\n","import { decodeMotelyItem, type MotelyRenderableCategory } from \"./motelyItemDecoder.js\";\nimport { getSpriteData, SHEET_META } from \"../sprites/spriteMapper.js\";\nimport { RANK_MAP, SUIT_MAP } from \"../sprites/spriteData.js\";\nimport { resolveJamlAssetUrl } from \"../assets.js\";\n\nexport interface MotelySpriteData {\n atlasPath: string;\n gridCol: number;\n gridRow: number;\n gridCols: number;\n gridRows: number;\n displayName: string;\n category: MotelyRenderableCategory;\n}\n\n/**\n * Given a raw motely-wasm item value (which may be a bitpacked integer or raw MotelyItemType),\n * resolves it to a sprite atlas path and grid coordinates for rendering.\n */\nexport function motelyItemToSprite(rawValue: number): MotelySpriteData | null {\n const decoded = decodeMotelyItem(rawValue);\n if (!decoded) return null;\n\n if (decoded.category === \"playing\" && decoded.rank && decoded.suit) {\n const col = RANK_MAP[decoded.rank];\n const row = SUIT_MAP[decoded.suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: decoded.displayName,\n category: \"playing\"\n };\n }\n }\n\n const sprite = getSpriteData(decoded.displayName);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: decoded.displayName,\n category: decoded.category\n };\n}\n\n/**\n * Resolves a sprite by name and category without needing a Motely integer.\n */\nexport function getMotelySpriteByName(name: string, category: MotelyRenderableCategory = \"unknown\"): MotelySpriteData | null {\n if (category === \"playing\") {\n // Attempt to parse \"Rank of Suit\"\n const match = /^(.*?)\\s+of\\s+(.*?)$/i.exec(name);\n if (match) {\n const rank = match[1];\n const suit = match[2];\n const col = RANK_MAP[rank];\n const row = SUIT_MAP[suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: name,\n category: \"playing\"\n };\n }\n }\n }\n\n const sprite = getSpriteData(name);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: name,\n category\n };\n}\n","import { Motely } from \"motely-wasm\";\nimport { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./decode/motelyItemFormats.js\";\n\ntype RuntimeEnum = Record<string, string | number>;\ntype MotelyRuntimeEnums = typeof Motely & Record<string, RuntimeEnum>;\n\nconst MotelyEnums = Motely as MotelyRuntimeEnums;\n\nfunction runtimeEnumKey(\n enumObject: Record<string, unknown>,\n value: number,\n): string | null {\n const key = enumObject[String(value)];\n return typeof key === \"string\" && key.length > 0 ? key : null;\n}\n\nexport function motelyBossDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBossBlind, value & 0xff);\n return key ?? `boss#${value}`;\n}\n\nexport function motelyBossDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyVoucherDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyVoucher, value);\n return key ?? `voucher#${value}`;\n}\n\nexport function motelyVoucherDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyTagDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyTag, value);\n return key ?? `tag#${value}`;\n}\n\nexport function motelyTagDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyBoosterPackDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBoosterPack, value);\n return key ?? `pack#${value}`;\n}\n\nexport function motelyBoosterPackDisplayNameFromKey(key: string): string {\n return `${key} Pack`;\n}\n\nexport function motelyItemDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyItemDisplayNameFromValue(value: number): string {\n const itemType = value & 0xffff;\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE]?.displayName ?? `item#${value}`;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Motely } from \"motely-wasm\";\nimport { ensureMotelyReady } from \"../lib/motely/runtime.js\";\nimport { IFileMounter, PermissionMode } from \"motely-wasm/bootsharp/file-system\";\n\ntype FileSystemPackage = typeof import(\"@rewaffle/bootsharp-file-system\");\n\nlet fileSystemPackage: FileSystemPackage | null = null;\nlet fileSystemInitError: unknown = null;\nlet fileSystemInitPromise: Promise<void> | null = null;\n\nfunction initFileSystem(): Promise<void> {\n if (fileSystemInitPromise) return fileSystemInitPromise;\n fileSystemInitPromise = (async () => {\n try {\n fileSystemPackage = await import(\"@rewaffle/bootsharp-file-system\");\n fileSystemPackage.init(IFileMounter);\n } catch (error) {\n fileSystemInitError = error;\n }\n })();\n return fileSystemInitPromise;\n}\n\nexport type JamlLibraryStatus = \"idle\" | \"unsupported\" | \"mounting\" | \"ready\" | \"error\";\n\nexport interface UseJamlLibraryState {\n status: JamlLibraryStatus;\n rootId: string | null;\n files: string[];\n error: string | null;\n mount: () => Promise<void>;\n unmount: () => Promise<void>;\n loadFile: (uri: string) => Promise<string>;\n saveFile: (uri: string, content: string) => Promise<void>;\n refresh: () => void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n\nexport function useJamlLibrary(): UseJamlLibraryState {\n const [status, setStatus] = useState<JamlLibraryStatus>(\"idle\");\n const [rootId, setRootId] = useState<string | null>(null);\n const [files, setFiles] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n initFileSystem().then(() => {\n if (cancelled) return;\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n }\n });\n return () => { cancelled = true; };\n }, []);\n\n const isFileSystemReady = fileSystemPackage !== null;\n\n const refresh = useCallback(() => {\n if (!rootId) return;\n setFiles((prev) => [...prev]);\n }, [rootId]);\n\n const mount = useCallback(async () => {\n await initFileSystem();\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n return;\n }\n\n setStatus(\"mounting\");\n setError(null);\n\n try {\n await ensureMotelyReady();\n const pickedRoot = await Motely.pickRoot({ mode: PermissionMode.ReadWrite, id: \"jaml-library\" });\n if (!pickedRoot) {\n setStatus(\"idle\");\n return;\n }\n\n const mountedRoot = await Motely.mountRoot(pickedRoot, { mode: PermissionMode.ReadWrite });\n setRootId(mountedRoot);\n setFiles([]);\n setStatus(\"ready\");\n } catch (err) {\n setStatus(\"error\");\n setError(errorMessage(err));\n }\n }, []);\n\n const unmount = useCallback(async () => {\n if (!rootId) return;\n await ensureMotelyReady();\n await Motely.unmountRoot(rootId);\n setRootId(null);\n setFiles([]);\n setStatus(isFileSystemReady ? \"idle\" : \"unsupported\");\n }, [isFileSystemReady, rootId]);\n\n const loadFile = useCallback(async (uri: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n return await Motely.readTextFile(rootId, uri);\n }, [rootId]);\n\n const saveFile = useCallback(async (uri: string, content: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n await Motely.writeTextFile(rootId, uri, content);\n setFiles((prev) => (prev.includes(uri) ? prev : [...prev, uri]).sort((a, b) => a.localeCompare(b)));\n }, [rootId]);\n\n return { status, rootId, files, error, mount, unmount, loadFile, saveFile, refresh };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelyItemDecoder.ts","../src/decode/motelySprite.ts","../src/motelyDisplay.ts","../src/hooks/useJamlLibrary.ts"],"sourcesContent":["import { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./motelyItemFormats.js\";\nimport {\n MotelyItemEdition,\n MotelyItemSeal,\n MotelyItemEnhancement,\n MotelyStandardcardRank,\n MotelyStandardcardSuit,\n} from \"motely-wasm\";\n\ntype MotelyItemCategoryName = \"Standardcard\" | \"SpectralCard\" | \"TarotCard\" | \"PlanetCard\" | \"Joker\" | \"Invalid\";\n\nconst CATEGORY_MAP: Record<MotelyItemCategoryName, MotelyRenderableCategory> = {\n Standardcard: \"playing\",\n SpectralCard: \"spectral\",\n TarotCard: \"tarot\",\n PlanetCard: \"planet\",\n Joker: \"joker\",\n Invalid: \"unknown\",\n};\n\nconst EDITIONS: Record<MotelyItemEdition, string> = {\n [MotelyItemEdition.None]: \"Base\",\n [MotelyItemEdition.Foil]: \"Foil\",\n [MotelyItemEdition.Holographic]: \"Holographic\",\n [MotelyItemEdition.Polychrome]: \"Polychrome\",\n [MotelyItemEdition.Negative]: \"Negative\",\n};\n\nconst SEALS: Record<MotelyItemSeal, string> = {\n [MotelyItemSeal.None]: \"None\",\n [MotelyItemSeal.Gold]: \"Gold\",\n [MotelyItemSeal.Red]: \"Red\",\n [MotelyItemSeal.Blue]: \"Blue\",\n [MotelyItemSeal.Purple]: \"Purple\",\n};\n\nconst ENHANCEMENTS: Record<MotelyItemEnhancement, string> = {\n [MotelyItemEnhancement.None]: \"None\",\n [MotelyItemEnhancement.Bonus]: \"Bonus\",\n [MotelyItemEnhancement.Mult]: \"Mult\",\n [MotelyItemEnhancement.Wild]: \"Wild\",\n [MotelyItemEnhancement.Glass]: \"Glass\",\n [MotelyItemEnhancement.Steel]: \"Steel\",\n [MotelyItemEnhancement.Stone]: \"Stone\",\n [MotelyItemEnhancement.Gold]: \"Gold\",\n [MotelyItemEnhancement.Lucky]: \"Lucky\",\n};\n\nconst RANKS: Record<MotelyStandardcardRank, string> = {\n [MotelyStandardcardRank.Two]: \"2\",\n [MotelyStandardcardRank.Three]: \"3\",\n [MotelyStandardcardRank.Four]: \"4\",\n [MotelyStandardcardRank.Five]: \"5\",\n [MotelyStandardcardRank.Six]: \"6\",\n [MotelyStandardcardRank.Seven]: \"7\",\n [MotelyStandardcardRank.Eight]: \"8\",\n [MotelyStandardcardRank.Nine]: \"9\",\n [MotelyStandardcardRank.Ten]: \"10\",\n [MotelyStandardcardRank.Jack]: \"Jack\",\n [MotelyStandardcardRank.Queen]: \"Queen\",\n [MotelyStandardcardRank.King]: \"King\",\n [MotelyStandardcardRank.Ace]: \"Ace\",\n};\n\nconst SUITS: Record<MotelyStandardcardSuit, \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\"> = {\n [MotelyStandardcardSuit.Clubs]: \"Clubs\",\n [MotelyStandardcardSuit.Diamonds]: \"Diamonds\",\n [MotelyStandardcardSuit.Hearts]: \"Hearts\",\n [MotelyStandardcardSuit.Spades]: \"Spades\",\n};\n\n\nexport type CardCategory = \"joker\" | \"consumable\" | \"playing\" | \"spectral\" | \"tarot\" | \"planet\";\nexport type MotelyRenderableCategory = CardCategory | \"unknown\";\n\nexport type MotelyItemInput = number | MotelyRuntimeItem | null | undefined;\n\nexport interface MotelyRuntimeItem {\n type?: number;\n value?: number;\n edition?: number;\n seal?: number;\n enhancement?: number;\n suit?: number;\n rank?: number;\n}\n\nexport interface DecodedMotelyItem {\n itemType: number;\n enumKey: string;\n displayName: string;\n category: MotelyRenderableCategory;\n edition: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null;\n seal: \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null;\n enhancement: string | null;\n rank: string | null;\n suit: \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null;\n isEternal: boolean;\n isPerishable: boolean;\n isRental: boolean;\n}\n\n\nexport interface MotelyJamlCard {\n type: \"joker\" | \"consumable\" | \"playing\";\n card: {\n name: string;\n edition?: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n seal?: string;\n enhancements?: string[];\n rank?: string;\n suit?: string;\n isEternal?: boolean;\n isPerishable?: boolean;\n isRental?: boolean;\n scale?: number;\n };\n}\n\nfunction itemFormat(itemType: number) {\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE];\n}\n\nfunction spaceSplit(value: string): string {\n return value.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\");\n}\n\nfunction resolvePackedValue(input: MotelyItemInput): number | null {\n if (input == null) return null;\n if (typeof input === \"number\") return Number.isFinite(input) ? input : null;\n return input.value ?? input.type ?? null;\n}\n\nexport function resolveMotelyItemType(input: MotelyItemInput): number | null {\n const val = resolvePackedValue(input);\n return val !== null ? val & 0xffff : null;\n}\n\nexport function motelyItemTypeName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.enumName ?? `item#${itemType}`;\n}\n\nexport function motelyItemCategory(itemType: number): MotelyRenderableCategory {\n const category = itemFormat(itemType)?.category as MotelyItemCategoryName | undefined;\n return category ? CATEGORY_MAP[category] ?? \"unknown\" : \"unknown\";\n}\n\nexport function motelyItemRenderCategory(input: MotelyItemInput): MotelyRenderableCategory {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"unknown\";\n return motelyItemCategory(itemType);\n}\n\nexport function motelyItemDisplayName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.displayName ?? spaceSplit(motelyItemTypeName(input));\n}\n\nimport { Motely } from \"motely-wasm\";\n\nfunction isStickerSet(input: MotelyItemInput, bitOffset: number): boolean {\n const val = resolvePackedValue(input);\n if (val === null) return false;\n return (val & (1 << bitOffset)) !== 0;\n}\n\nexport function motelyItemEditionName(input: MotelyItemInput): \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemEdition(input) : input.edition;\n if (val == null || val === MotelyItemEdition.None) return null;\n return EDITIONS[val] as \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n}\n\nexport function motelyItemSealName(input: MotelyItemInput): \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemSeal(input) : input.seal;\n if (val == null || val === MotelyItemSeal.None) return null;\n return SEALS[val] as \"Gold\" | \"Red\" | \"Blue\" | \"Purple\";\n}\n\nexport function motelyItemEnhancementName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemEnhancement(input) : input.enhancement;\n if (val == null || val === MotelyItemEnhancement.None) return null;\n return ENHANCEMENTS[val] ?? null;\n}\n\n\nexport function motelyStandardcardRankName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? Motely.decodeStandardcardRank(input) : input.rank;\n if (val == null) return null;\n return RANKS[val] ?? null;\n}\n\nexport function motelyStandardcardSuitName(input: MotelyItemInput): \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? Motely.decodeStandardcardSuit(input) : input.suit;\n if (val == null) return null;\n return SUITS[val] ?? null;\n}\n\nexport function decodeMotelyItemName(input: MotelyItemInput): string {\n return motelyItemTypeName(input);\n}\n\nexport function decodeMotelyItem(input: MotelyItemInput): DecodedMotelyItem | null {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return null;\n\n const format = itemFormat(itemType);\n const enumKeyStr = format?.enumName ?? `Unknown_${itemType}`;\n const category = motelyItemCategory(itemType);\n const displayName = format?.displayName ?? spaceSplit(enumKeyStr);\n\n return {\n itemType,\n enumKey: enumKeyStr,\n displayName,\n category,\n edition: motelyItemEditionName(input),\n seal: motelyItemSealName(input),\n enhancement: motelyItemEnhancementName(input),\n rank: motelyStandardcardRankName(input),\n suit: motelyStandardcardSuitName(input),\n isEternal: typeof input === \"number\" ? Motely.isEternal(input) : isStickerSet(input, 30),\n isPerishable: typeof input === \"number\" ? Motely.isPerishable(input) : isStickerSet(input, 31),\n isRental: typeof input === \"number\" ? Motely.isRental(input) : isStickerSet(input, 29),\n };\n}\n\nexport function decodeMotelyItemToJamlCard(input: MotelyItemInput, scale?: number): MotelyJamlCard | null {\n const decoded = decodeMotelyItem(input);\n if (!decoded) return null;\n\n const type: \"joker\" | \"consumable\" | \"playing\" =\n decoded.category === \"joker\" ? \"joker\"\n : decoded.category === \"playing\" ? \"playing\"\n : \"consumable\";\n\n return {\n type,\n card: {\n name: decoded.displayName,\n edition: decoded.edition ?? undefined,\n seal: decoded.seal ?? undefined,\n enhancements: decoded.enhancement ? [decoded.enhancement] : undefined,\n rank: decoded.rank ?? undefined,\n suit: decoded.suit ?? undefined,\n isEternal: decoded.isEternal,\n isPerishable: decoded.isPerishable,\n isRental: decoded.isRental,\n scale,\n },\n };\n}\n\nexport function warmMotelyItemCache(): void { /* no-op */ }\nexport function motelyItemCacheSize(): number { return 0; }\n","import { decodeMotelyItem, type MotelyRenderableCategory } from \"./motelyItemDecoder.js\";\nimport { getSpriteData, SHEET_META } from \"../sprites/spriteMapper.js\";\nimport { RANK_MAP, SUIT_MAP } from \"../sprites/spriteData.js\";\nimport { resolveJamlAssetUrl } from \"../assets.js\";\n\nexport interface MotelySpriteData {\n atlasPath: string;\n gridCol: number;\n gridRow: number;\n gridCols: number;\n gridRows: number;\n displayName: string;\n category: MotelyRenderableCategory;\n}\n\n/**\n * Given a raw motely-wasm item value (which may be a bitpacked integer or raw MotelyItemType),\n * resolves it to a sprite atlas path and grid coordinates for rendering.\n */\nexport function motelyItemToSprite(rawValue: number): MotelySpriteData | null {\n const decoded = decodeMotelyItem(rawValue);\n if (!decoded) return null;\n\n if (decoded.category === \"playing\" && decoded.rank && decoded.suit) {\n const col = RANK_MAP[decoded.rank];\n const row = SUIT_MAP[decoded.suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: decoded.displayName,\n category: \"playing\"\n };\n }\n }\n\n const sprite = getSpriteData(decoded.displayName);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: decoded.displayName,\n category: decoded.category\n };\n}\n\n/**\n * Resolves a sprite by name and category without needing a Motely integer.\n */\nexport function getMotelySpriteByName(name: string, category: MotelyRenderableCategory = \"unknown\"): MotelySpriteData | null {\n if (category === \"playing\") {\n // Attempt to parse \"Rank of Suit\"\n const match = /^(.*?)\\s+of\\s+(.*?)$/i.exec(name);\n if (match) {\n const rank = match[1];\n const suit = match[2];\n const col = RANK_MAP[rank];\n const row = SUIT_MAP[suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: name,\n category: \"playing\"\n };\n }\n }\n }\n\n const sprite = getSpriteData(name);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: name,\n category\n };\n}\n","import { Motely } from \"motely-wasm\";\nimport { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./decode/motelyItemFormats.js\";\n\ntype RuntimeEnum = Record<string, string | number>;\ntype MotelyRuntimeEnums = typeof Motely & Record<string, RuntimeEnum>;\n\nconst MotelyEnums = Motely as MotelyRuntimeEnums;\n\nfunction runtimeEnumKey(\n enumObject: Record<string, unknown>,\n value: number,\n): string | null {\n const key = enumObject[String(value)];\n return typeof key === \"string\" && key.length > 0 ? key : null;\n}\n\nexport function motelyBossDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBossBlind, value & 0xff);\n return key ?? `boss#${value}`;\n}\n\nexport function motelyBossDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyVoucherDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyVoucher, value);\n return key ?? `voucher#${value}`;\n}\n\nexport function motelyVoucherDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyTagDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyTag, value);\n return key ?? `tag#${value}`;\n}\n\nexport function motelyTagDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyBoosterPackDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBoosterPack, value);\n return key ?? `pack#${value}`;\n}\n\nexport function motelyBoosterPackDisplayNameFromKey(key: string): string {\n return `${key} Pack`;\n}\n\nexport function motelyItemDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyItemDisplayNameFromValue(value: number): string {\n const itemType = value & 0xffff;\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE]?.displayName ?? `item#${value}`;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Motely } from \"motely-wasm\";\nimport { ensureMotelyReady } from \"../lib/motely/runtime.js\";\nimport { IFileMounter, PermissionMode } from \"motely-wasm/bootsharp/file-system\";\n\ntype FileSystemPackage = typeof import(\"@rewaffle/bootsharp-file-system\");\n\nlet fileSystemPackage: FileSystemPackage | null = null;\nlet fileSystemInitError: unknown = null;\nlet fileSystemInitPromise: Promise<void> | null = null;\n\nfunction initFileSystem(): Promise<void> {\n if (fileSystemInitPromise) return fileSystemInitPromise;\n fileSystemInitPromise = (async () => {\n try {\n fileSystemPackage = await import(\"@rewaffle/bootsharp-file-system\");\n fileSystemPackage.init(IFileMounter);\n } catch (error) {\n fileSystemInitError = error;\n }\n })();\n return fileSystemInitPromise;\n}\n\nexport type JamlLibraryStatus = \"idle\" | \"unsupported\" | \"mounting\" | \"ready\" | \"error\";\n\nexport interface UseJamlLibraryState {\n status: JamlLibraryStatus;\n rootId: string | null;\n files: string[];\n error: string | null;\n mount: () => Promise<void>;\n unmount: () => Promise<void>;\n loadFile: (uri: string) => Promise<string>;\n saveFile: (uri: string, content: string) => Promise<void>;\n refresh: () => void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n\nexport function useJamlLibrary(): UseJamlLibraryState {\n const [status, setStatus] = useState<JamlLibraryStatus>(\"idle\");\n const [rootId, setRootId] = useState<string | null>(null);\n const [files, setFiles] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n initFileSystem().then(() => {\n if (cancelled) return;\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n }\n });\n return () => { cancelled = true; };\n }, []);\n\n const isFileSystemReady = fileSystemPackage !== null;\n\n const refresh = useCallback(() => {\n if (!rootId) return;\n setFiles((prev) => [...prev]);\n }, [rootId]);\n\n const mount = useCallback(async () => {\n await initFileSystem();\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n return;\n }\n\n setStatus(\"mounting\");\n setError(null);\n\n try {\n await ensureMotelyReady();\n const pickedRoot = await Motely.pickRoot({ mode: PermissionMode.ReadWrite, id: \"jaml-library\" });\n if (!pickedRoot) {\n setStatus(\"idle\");\n return;\n }\n\n const mountedRoot = await Motely.mountRoot(pickedRoot, { mode: PermissionMode.ReadWrite });\n setRootId(mountedRoot);\n setFiles([]);\n setStatus(\"ready\");\n } catch (err) {\n setStatus(\"error\");\n setError(errorMessage(err));\n }\n }, []);\n\n const unmount = useCallback(async () => {\n if (!rootId) return;\n await ensureMotelyReady();\n await Motely.unmountRoot(rootId);\n setRootId(null);\n setFiles([]);\n setStatus(isFileSystemReady ? \"idle\" : \"unsupported\");\n }, [isFileSystemReady, rootId]);\n\n const loadFile = useCallback(async (uri: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n return await Motely.readTextFile(rootId, uri);\n }, [rootId]);\n\n const saveFile = useCallback(async (uri: string, content: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n await Motely.writeTextFile(rootId, uri, content);\n setFiles((prev) => (prev.includes(uri) ? prev : [...prev, uri]).sort((a, b) => a.localeCompare(b)));\n }, [rootId]);\n\n return { status, rootId, files, error, mount, unmount, loadFile, saveFile, refresh };\n}\n"],"mappings":"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"}
|