@puzzmo/sdk 1.0.31 → 1.0.33

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.
Files changed (49) hide show
  1. package/dist/contracts.cjs +0 -0
  2. package/dist/contracts.d.ts +95 -0
  3. package/dist/contracts.d.ts.map +1 -0
  4. package/dist/contracts.js +0 -0
  5. package/dist/{createSimulator-xa9RclNq.js → createSimulator-Bo6J_KC_.js} +422 -296
  6. package/dist/createSimulator-Bo6J_KC_.js.map +1 -0
  7. package/dist/{createSimulator-GzKfEQWQ.cjs → createSimulator-EBKHk3L6.cjs} +55 -34
  8. package/dist/createSimulator-EBKHk3L6.cjs.map +1 -0
  9. package/dist/fonts.cjs +1 -1
  10. package/dist/fonts.cjs.map +1 -1
  11. package/dist/fonts.d.ts +13 -13
  12. package/dist/fonts.js +1 -1
  13. package/dist/fonts.js.map +1 -1
  14. package/dist/index.cjs +1 -1
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +100 -90
  19. package/dist/index.js.map +1 -1
  20. package/dist/plugins.d.ts +2 -0
  21. package/dist/plugins.d.ts.map +1 -0
  22. package/dist/plugins.spec.d.ts +2 -0
  23. package/dist/plugins.spec.d.ts.map +1 -0
  24. package/dist/sdk.d.ts +7 -2
  25. package/dist/sdk.d.ts.map +1 -1
  26. package/dist/simulator/createSimulator.d.ts.map +1 -1
  27. package/dist/simulator/index.cjs +1 -1
  28. package/dist/simulator/index.d.ts +1 -1
  29. package/dist/simulator/index.d.ts.map +1 -1
  30. package/dist/simulator/index.js +1 -1
  31. package/dist/simulator/standalone.cjs +1 -1
  32. package/dist/simulator/standalone.js +1 -1
  33. package/dist/simulator/state.d.ts +3 -1
  34. package/dist/simulator/state.d.ts.map +1 -1
  35. package/dist/simulator/types.d.ts +28 -1
  36. package/dist/simulator/types.d.ts.map +1 -1
  37. package/dist/simulator/views/HostView.d.ts +9 -0
  38. package/dist/simulator/views/HostView.d.ts.map +1 -0
  39. package/dist/simulator/views/index.d.ts +1 -0
  40. package/dist/simulator/views/index.d.ts.map +1 -1
  41. package/dist/types.d.ts +31 -2
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/vite.cjs.map +1 -1
  44. package/dist/vite.d.ts +19 -0
  45. package/dist/vite.d.ts.map +1 -1
  46. package/dist/vite.js.map +1 -1
  47. package/package.json +6 -1
  48. package/dist/createSimulator-GzKfEQWQ.cjs.map +0 -1
  49. package/dist/createSimulator-xa9RclNq.js.map +0 -1
@@ -1,5 +1,7 @@
1
- import type { ThumbnailConfig } from "../types";
1
+ import type { HostContext, ThumbnailConfig } from "../types";
2
2
  import type { SimulatorConfig, SimulatorState, TabName } from "./types";
3
+ export declare function persistHostContext(hostContext: HostContext[]): void;
4
+ export declare function clearHostContext(): void;
3
5
  export declare function createInitialState(config: SimulatorConfig, fixtureCategories: string[], validTabIds: string[]): SimulatorState;
4
6
  export declare function persistGameSettings(settings: Record<string, any>): void;
5
7
  export declare function clearGameSettings(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/simulator/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,eAAe,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAkEvE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,cAAc,CAsB9H;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAEvE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAEzD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,IAAI,CAM3E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC,eAAe,CAAC,GAAG,IAAI,CAMpF"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/simulator/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAS,eAAe,EAAE,MAAM,UAAU,CAAA;AAEnE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AA2BvE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAEnE;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAuDD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,cAAc,CAyB9H;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAEvE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAEzD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,IAAI,CAM3E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,CAAC,eAAe,CAAC,GAAG,IAAI,CAMpF"}
@@ -1,4 +1,4 @@
1
- import type { GameSettingsUIComponents, MessagesReceived, Theme, ThumbnailConfig } from "../types";
1
+ import type { GameSettingsUIComponents, HostContext, MessagesReceived, Theme, ThumbnailConfig } from "../types";
2
2
  /** Raw fixture strings keyed by path from Vite's import.meta.glob (eager, ?raw). Each value is the file's text. */
3
3
  export type FixtureImports = Record<string, string | {
4
4
  default?: string;
@@ -12,8 +12,31 @@ export interface SimulatorConfig {
12
12
  fixtures?: FixtureImports;
13
13
  /** Game slug for API features (e.g. "crossword", "ribbit") */
14
14
  slug?: string;
15
+ /**
16
+ * The `hostContext` array sent in READY_DATA, so host-context-dependent features (embed
17
+ * settings, sandbox mode, mobile layout, …) can be exercised locally. Defaults to a single
18
+ * desktop "app" context. The Host tab can override this at runtime (persisted per-browser,
19
+ * applied on restart).
20
+ */
21
+ hostContext?: HostContext[];
22
+ /**
23
+ * Extra named `hostContext` presets shown in the Host tab alongside the generic built-ins —
24
+ * how a game ships its own scenarios (e.g. crossword's partner-embed toolbar settings).
25
+ */
26
+ hostContextPresets?: HostContextPreset[];
27
+ /**
28
+ * Extra views (tabs) appended after the built-in ones. This is how a plugin ships its own
29
+ * host-side mock — e.g. a Sound view that lists `SENSORY_EVENT`s, or a Collab view that fakes
30
+ * a second player. Each view's `id` becomes its tab id, so keep them unique.
31
+ */
32
+ views?: SimulatorView[];
15
33
  }
16
34
  export type TabName = string;
35
+ /** A named `hostContext` scenario selectable in the Host tab. */
36
+ export interface HostContextPreset {
37
+ name: string;
38
+ context: HostContext[];
39
+ }
17
40
  export interface SimulatorState {
18
41
  isCollapsed: boolean;
19
42
  isPaused: boolean;
@@ -33,6 +56,10 @@ export interface SimulatorState {
33
56
  gameSettings: Record<string, any>;
34
57
  /** The settings UI description from the game's INITIALIZE_SETTINGS, null until received */
35
58
  settingsComponents: GameSettingsUIComponents[] | null;
59
+ /** The resolved `hostContext` sent in READY_DATA: Host-tab override > config > default app context */
60
+ hostContext: HostContext[];
61
+ /** True when the Host tab's persisted override (not the vite config) is providing `hostContext` */
62
+ hostContextIsOverridden: boolean;
36
63
  }
37
64
  export interface MessageLogEntry {
38
65
  type: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/simulator/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/simulator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/G,mHAAmH;AACnH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAE1E,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,yGAAyG;IACzG,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,EAAE,CAAA;IAC3B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACxC;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;CACxB;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAE5B,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,WAAW,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,mGAAmG;IACnG,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,GAAG,CAAA;IACnB,aAAa,EAAE,KAAK,CAAA;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAA;IAC/C,4FAA4F;IAC5F,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjC,2FAA2F;IAC3F,kBAAkB,EAAE,wBAAwB,EAAE,GAAG,IAAI,CAAA;IACrD,sGAAsG;IACtG,WAAW,EAAE,WAAW,EAAE,CAAA;IAC1B,mGAAmG;IACnG,uBAAuB,EAAE,OAAO,CAAA;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,GAAG,CAAA;IACT,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,GAAG,KAAK,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,EAAE,CAAC,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC,GAAG,IAAI,CAAA;IACjE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,gBAAgB,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAA;IAC7D,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,GAAG,KAAK,KAAK,IAAI,CAAA;IACtE,UAAU,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACxD,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IACjC,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,+EAA+E;IAC/E,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAChE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;IAC9C,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,EAAE,EAAE,OAAO,CAAA;IACX,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,MAAM,IAAI,MAAM,CAAA;IAChB,wCAAwC;IACxC,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACrC,qCAAqC;IACrC,UAAU,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC5C,yCAAyC;IACzC,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;CACrE"}
@@ -0,0 +1,9 @@
1
+ import type { HostContextPreset, SimulatorView } from "../types";
2
+ /**
3
+ * Host tab — edit the `hostContext` array the simulator sends in READY_DATA, so host-context
4
+ * dependent features (embed settings, sandbox mode, mobile layout, …) can be exercised locally.
5
+ * The bootstrap is only read at game boot, so applying a change persists it to localStorage and
6
+ * restarts (reloads) the page — the same flow as the Theme tab.
7
+ */
8
+ export declare function createHostView(gamePresets?: HostContextPreset[]): SimulatorView;
9
+ //# sourceMappingURL=HostView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HostView.d.ts","sourceRoot":"","sources":["../../../src/simulator/views/HostView.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,aAAa,EAAE,MAAM,UAAU,CAAA;AAclF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,WAAW,GAAE,iBAAiB,EAAO,GAAG,aAAa,CAyEnF"}
@@ -5,6 +5,7 @@ export { createDoneView } from "./DoneView";
5
5
  export { createCheckpointsView } from "./CheckpointsView";
6
6
  export { createThumbView, type ThumbViewExtended } from "./ThumbView";
7
7
  export { createThemeView } from "./ThemeView";
8
+ export { createHostView } from "./HostView";
8
9
  export { createAuthView } from "./AuthView";
9
10
  export { createFeaturesView, isAuthenticated } from "./FeaturesView";
10
11
  export { createKeyboardView } from "./KeyboardView";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/simulator/views/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/simulator/views/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/types.d.ts CHANGED
@@ -202,8 +202,37 @@ export type AppHostContext = {
202
202
  /** Which host is rendering the game; null = puzzmo.com on web. */
203
203
  host: null | string;
204
204
  };
205
- /** Subset of host-provided context the SDK surfaces to games. Extend as more variants are needed. */
206
- export type HostContext = AppHostContext;
205
+ /**
206
+ * The "embed" variant — the game is running inside a partner-page embed. Per-game settings live
207
+ * under the game's slug; their shape is owned by the game (hosts pass them through verbatim).
208
+ */
209
+ export type EmbedHostContext = {
210
+ type: "embed";
211
+ /** Hide the host-provided chrome around the game. */
212
+ noUI?: boolean;
213
+ /** The embed record driving this page, when known. */
214
+ embedID?: string;
215
+ /** Puzzle strings for bonus puzzles playable after the main puzzle. */
216
+ bonusPuzzles?: string[];
217
+ /** Game-specific embed settings keyed by game slug (e.g. `crossword: {...}`). */
218
+ [gameSlug: string]: unknown;
219
+ };
220
+ /** The "sandbox" variant — the game is hosted in a puzzle-editing sandbox (e.g. the workshop). */
221
+ export type SandboxHostContext = {
222
+ type: "sandbox";
223
+ /** Game-specific sandbox settings keyed by game slug (e.g. `crossword: { fill: true }`). */
224
+ [gameSlug: string]: unknown;
225
+ };
226
+ /** The "server-config" variant — infrastructure endpoints the host wants the game to use. */
227
+ export type ServerConfigHostContext = {
228
+ type: "server-config";
229
+ /** The URL of the multiplayer server */
230
+ multiplayerServerURL?: string;
231
+ /** The URL of the singleplayer server */
232
+ printServerURL?: string;
233
+ };
234
+ /** Host-provided context the SDK surfaces to games. Extend as more variants are needed. */
235
+ export type HostContext = AppHostContext | EmbedHostContext | SandboxHostContext | ServerConfigHostContext;
207
236
  export type AppBundle = {
208
237
  /** Renders a puzzle and optional state string into an SVG */
209
238
  renderThumbnail(puzzleStr: string, inputStr?: string, config?: ThumbnailConfig): string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/vite.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.cjs","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import type { Plugin, ResolvedConfig } from \"vite\"\nimport { build } from \"vite\"\nimport path from \"path\"\nimport fs from \"fs\"\n\nexport type PuzzmoSimulatorPluginOptions = {\n /** Whether to auto-start the game after READY (default: true) */\n autoStart?: boolean\n /** Initial collapsed state (default: true) */\n collapsed?: boolean\n /**\n * Glob pattern for fixture files, passed to import.meta.glob which is relative to the closest puzzmo.json. Defaults\n * to `\"/fixtures/puzzles/**\\/*.{json,toml}\"`. Fixtures are loaded as raw strings (any text format works — JSON,\n * TOML, or a custom format) and delivered to the game verbatim, so the game parses them itself. Pass false to disable.\n */\n fixturesGlob?: string | false\n}\n\nconst simulatorURL = \"/@puzzmo-simulator-init.js\"\nconst virtualID = \"virtual:puzzmo-simulator\"\n\n/** @internal */\nexport type GameInfo = {\n /** Directory containing the puzzmo.json */\n dir: string\n slug: string\n displayName: string\n /** Vite-root-relative path to app bundle entry, if it exists */\n appBundlePath: string | null\n}\n\n/**\n * Discover all games from puzzmo.json files under a root directory.\n *\n * @internal\n */\nexport function discoverGames(viteRoot: string): Map<string, GameInfo> {\n const games = new Map<string, GameInfo>()\n const candidates = findPuzzmoJsonDirs(viteRoot, 3)\n if (fs.existsSync(path.join(viteRoot, \"puzzmo.json\"))) {\n candidates.unshift(viteRoot)\n }\n for (const dir of candidates) {\n try {\n const data = JSON.parse(fs.readFileSync(path.join(dir, \"puzzmo.json\"), \"utf-8\"))\n if (!data?.game?.slug) continue\n const bundleEntry = resolveBundleEntry(dir, \"src/appBundle\")\n let appBundle: string | null = null\n if (bundleEntry) {\n const relative = path.relative(viteRoot, bundleEntry)\n appBundle = \"/\" + relative.split(path.sep).join(\"/\")\n }\n games.set(data.game.slug, { dir, slug: data.game.slug, displayName: data.game.displayName, appBundlePath: appBundle })\n } catch {\n // skip invalid files\n }\n }\n return games\n}\n\n/**\n * Resolve which game a request belongs to using the referer URL.\n *\n * @internal\n */\nexport function resolveGameFromReferer(referer: string | undefined, games: Map<string, GameInfo>, viteRoot: string): GameInfo | undefined {\n if (referer) {\n try {\n const refPath = new URL(referer).pathname\n for (const g of games.values()) {\n const relDir = \"/\" + path.relative(viteRoot, g.dir).split(path.sep).join(\"/\")\n if (refPath.startsWith(relDir + \"/\") || refPath === relDir) return g\n }\n } catch {\n // ignore malformed referer\n }\n }\n if (games.size === 1) return games.values().next().value\n return undefined\n}\n\n/**\n * Generate the virtual module code for the simulator.\n *\n * @internal\n */\nexport function generateSimulatorCode(options: PuzzmoSimulatorPluginOptions, game: GameInfo | undefined): string {\n const { fixturesGlob: fixturesOpt, ...config } = options\n const fixturesGlob = fixturesOpt === false ? null : (fixturesOpt ?? \"/fixtures/puzzles/**/*.{json,toml}\")\n\n const lines = [`import { createSimulator } from \"@puzzmo/sdk/simulator\"`]\n\n // Load fixtures as raw strings so any text format reaches the game verbatim; the game does its own parsing.\n if (fixturesGlob) {\n lines.push(`const fixtures = import.meta.glob(${JSON.stringify(fixturesGlob)}, { query: \"?raw\", import: \"default\", eager: true })`)\n }\n\n if (game?.appBundlePath) {\n lines.push(`import(${JSON.stringify(game.appBundlePath)}).then(m => {`)\n lines.push(` if (m.renderThumbnail) globalThis.renderThumbnail = m.renderThumbnail`)\n lines.push(`}).catch(() => {})`)\n }\n\n const simConfig = { ...config, ...(game?.slug ? { slug: game.slug } : {}) }\n const configEntries = Object.entries(simConfig).filter(([, v]) => v !== undefined)\n const configParts = configEntries.map(([k, v]) => `${k}: ${JSON.stringify(v)}`)\n if (fixturesGlob) configParts.push(\"fixtures\")\n\n lines.push(`createSimulator({ ${configParts.join(\", \")} })`)\n\n return lines.join(\"\\n\")\n}\n\n/** Vite plugin that injects the Puzzmo simulator in dev mode and handles OAuth callbacks. */\nexport function puzzmoSimulator(options: PuzzmoSimulatorPluginOptions = {}): Plugin {\n let games = new Map<string, GameInfo>()\n let viteRoot: string\n\n return {\n name: \"puzzmo-simulator\",\n apply: \"serve\",\n\n configResolved(config: ResolvedConfig) {\n viteRoot = config.root\n games = discoverGames(viteRoot)\n\n if (games.size === 0) {\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m\\x1b[2m no puzzmo.json files found\\x1b[22m`)\n } else {\n const names = [...games.values()].map((g) => `\\x1b[36m${g.slug}\\x1b[39m`)\n const label = games.size === 1 ? \"game\" : \"games\"\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m found ${games.size} ${label}: ${names.join(\"\\x1b[2m, \\x1b[22m\")}`)\n }\n },\n\n resolveId(id) {\n if (id === virtualID || id.startsWith(virtualID + \"?\")) return \"\\0\" + id\n },\n\n load(id) {\n if (!id.startsWith(\"\\0\" + virtualID)) return\n const params = new URLSearchParams(id.split(\"?\")[1] || \"\")\n const gameSlug = params.get(\"game\")\n const game = gameSlug ? games.get(gameSlug) : games.size === 1 ? games.values().next().value : undefined\n return generateSimulatorCode(options, game)\n },\n\n configureServer(server) {\n server.middlewares.use(\"/oauth/callback\", (_req, res) => {\n res.setHeader(\"Content-Type\", \"text/html\")\n res.end(`<!DOCTYPE html>\n<html><head><title>Puzzmo OAuth</title></head>\n<body><script>\nvar params = new URLSearchParams(window.location.search);\nvar returnUrl = sessionStorage.getItem(\"oauth_return_url\") || \"/\";\nvar url = new URL(returnUrl);\nparams.forEach(function(v, k) { url.searchParams.set(k, v); });\nwindow.location.href = url.toString();\n</script></body></html>`)\n })\n\n // Serve the simulator init module, resolving the game from the referer\n server.middlewares.use(async (req, res, next) => {\n if (req.url?.split(\"?\")[0] !== simulatorURL) return next()\n\n const game = resolveGameFromReferer(req.headers.referer, games, viteRoot)\n const moduleID = virtualID + (game ? `?game=${game.slug}` : \"\")\n const result = await server.transformRequest(moduleID)\n if (!result) return next()\n res.setHeader(\"Content-Type\", \"application/javascript\")\n res.end(result.code)\n })\n },\n\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n attrs: { type: \"module\", src: simulatorURL },\n injectTo: \"head\",\n },\n ]\n },\n }\n}\n\ntype BundlePluginOptions = {\n /** Entry file for the bundle */\n entry: string\n /** Output file name */\n outputFile: string\n}\n\nfunction createBundlePlugin(pluginName: string, defaults: BundlePluginOptions) {\n return (options: Partial<BundlePluginOptions> = {}): Plugin => {\n const { entry, outputFile } = { ...defaults, ...options }\n return {\n name: pluginName,\n apply: \"build\",\n async closeBundle() {\n // If the caller overrode `entry`, honor it as-is. Otherwise try `.js` first, then `.ts`.\n const resolvedEntry = options.entry\n ? path.isAbsolute(entry)\n ? entry\n : path.resolve(process.cwd(), entry)\n : (resolveBundleEntry(process.cwd(), stripBundleExt(entry)) ?? path.resolve(process.cwd(), entry))\n try {\n await build({\n configFile: false,\n logLevel: \"warn\",\n build: {\n lib: {\n entry: resolvedEntry,\n formats: [\"es\"],\n fileName: () => outputFile,\n },\n outDir: \"dist\",\n emptyOutDir: false,\n },\n })\n } catch (error) {\n console.error(`[${pluginName}] build failed:`, error)\n throw error\n }\n },\n }\n }\n}\n\n/** Strip the trailing extension from a default entry path so we can probe siblings. */\nconst stripBundleExt = (p: string) => p.replace(/\\.[jt]sx?$/i, \"\")\n\n/** Returns the absolute path to the first matching extension under `dir`, or null. */\nconst resolveBundleEntry = (dir: string, baseRelative: string): string | null => {\n for (const ext of [\".js\", \".ts\"]) {\n const candidate = path.join(dir, baseRelative + ext)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport type AppBundlePluginOptions = Partial<BundlePluginOptions>\n\n/**\n * Vite plugin that produces dist/app-bundle.js after the main build for app-level integrations.\n *\n * The bundle exports `renderThumbnail(puzzleStr, inputStr?, config?)` — a pure\n * SVG-string renderer used by the Puzzmo platform for puzzle previews.\n */\nexport const appBundlePlugin = createBundlePlugin(\"app-bundle\", { entry: \"src/appBundle.js\", outputFile: \"app-bundle.js\" })\n\nexport type EditorBundlePluginOptions = Partial<BundlePluginOptions>\n\n/** Vite plugin that produces dist/editor-bundle.js after the main build for editor-level integrations. */\nexport const editorBundlePlugin = createBundlePlugin(\"editor-bundle\", { entry: \"src/editorBundle.js\", outputFile: \"editor-bundle.js\" })\n\n/**\n * Recursively find directories containing puzzmo.json, up to `maxDepth` levels deep.\n *\n * @internal\n */\nexport const findPuzzmoJsonDirs = (root: string, maxDepth: number, depth = 0): string[] => {\n if (depth >= maxDepth) return []\n const results: string[] = []\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(root, { withFileTypes: true })\n } catch {\n return results\n }\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue\n const dir = path.join(root, entry.name)\n if (fs.existsSync(path.join(dir, \"puzzmo.json\"))) {\n results.push(dir)\n }\n results.push(...findPuzzmoJsonDirs(dir, maxDepth, depth + 1))\n }\n return results\n}\n"],"mappings":"yjCAuFU,eAAA,CArEJ,EAAe,6BACf,EAAY,2BAiBlB,SAAgB,EAAc,EAAyC,CACrE,IAAM,EAAQ,IAAI,IACZ,EAAa,EAAmB,EAAU,EAAE,CAC9C,EAAA,QAAG,WAAW,EAAA,QAAK,KAAK,EAAU,cAAc,CAAC,EACnD,EAAW,QAAQ,EAAS,CAE9B,IAAK,IAAM,KAAO,EAChB,GAAI,OACF,IAAM,EAAO,KAAK,MAAM,EAAA,QAAG,aAAa,EAAA,QAAK,KAAK,EAAK,cAAc,CAAE,QAAQ,CAAC,CAChF,GAAI,EAAA,KAAA,OAAA,EAAC,EAAM,OAAA,OAAA,EAAM,MAAM,SACvB,IAAM,EAAc,EAAmB,EAAK,gBAAgB,CACxD,EAA2B,KAC3B,IAEF,EAAY,IADK,EAAA,QAAK,SAAS,EAAU,EAAY,CAC1B,MAAM,EAAA,QAAK,IAAI,CAAC,KAAK,IAAI,EAEtD,EAAM,IAAI,EAAK,KAAK,KAAM,CAAE,MAAK,KAAM,EAAK,KAAK,KAAM,YAAa,EAAK,KAAK,YAAa,cAAe,EAAW,CAAC,SAChH,EAIV,OAAO,EAQT,SAAgB,EAAuB,EAA6B,EAA8B,EAAwC,CACxI,GAAI,EACF,GAAI,CACF,IAAM,EAAU,IAAI,IAAI,EAAQ,CAAC,SACjC,IAAK,IAAM,KAAK,EAAM,QAAQ,CAAE,CAC9B,IAAM,EAAS,IAAM,EAAA,QAAK,SAAS,EAAU,EAAE,IAAI,CAAC,MAAM,EAAA,QAAK,IAAI,CAAC,KAAK,IAAI,CAC7E,GAAI,EAAQ,WAAW,EAAS,IAAI,EAAI,IAAY,EAAQ,OAAO,WAE/D,EAIV,GAAI,EAAM,OAAS,EAAG,OAAO,EAAM,QAAQ,CAAC,MAAM,CAAC,MASrD,SAAgB,EAAsB,EAAuC,EAAoC,CAC/G,GAAM,CAAE,aAAc,GAAA,EAAgB,EAAA,EAAW,EAAA,EAAA,CAC3C,EAAe,IAAgB,GAAQ,KAAQ,GAAA,KAAe,qCAAf,EAE/C,EAAQ,CAAC,0DAA0D,CAGrE,GACF,EAAM,KAAK,qCAAqC,KAAK,UAAU,EAAa,CAAC,sDAAsD,CAGrI,GAAA,MAAI,EAAM,gBACR,EAAM,KAAK,UAAU,KAAK,UAAU,EAAK,cAAc,CAAC,eAAe,CACvE,EAAM,KAAK,0EAA0E,CACrF,EAAM,KAAK,qBAAqB,EAGlC,IAAM,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAiB,EAAA,CAAA,GAAA,MAAY,EAAM,KAAO,CAAE,KAAM,EAAK,KAAM,CAAG,EAAE,CAAG,CAErE,EADgB,OAAO,QAAQ,EAAU,CAAC,QAAQ,EAAG,KAAO,IAAM,IAAA,GAAU,CAChD,KAAK,CAAC,EAAG,KAAO,GAAG,EAAE,IAAI,KAAK,UAAU,EAAE,GAAG,CAK/E,OAJI,GAAc,EAAY,KAAK,WAAW,CAE9C,EAAM,KAAK,qBAAqB,EAAY,KAAK,KAAK,CAAC,KAAK,CAErD,EAAM,KAAK;EAAK,CAIzB,SAAgB,EAAgB,EAAwC,EAAE,CAAU,CAClF,IAAI,EAAQ,IAAI,IACZ,EAEJ,MAAO,CACL,KAAM,mBACN,MAAO,QAEP,eAAe,EAAwB,CAIrC,GAHA,EAAW,EAAO,KAClB,EAAQ,EAAc,EAAS,CAE3B,EAAM,OAAS,EACjB,EAAO,OAAO,KAAK,qFAAqF,KACnG,CACL,IAAM,EAAQ,CAAC,GAAG,EAAM,QAAQ,CAAC,CAAC,IAAK,GAAM,WAAW,EAAE,KAAK,UAAU,CACnE,EAAQ,EAAM,OAAS,EAAI,OAAS,QAC1C,EAAO,OAAO,KAAK,kDAAkD,EAAM,KAAK,GAAG,EAAM,IAAI,EAAM,KAAK,oBAAoB,GAAG,GAInI,UAAU,EAAI,CACZ,GAAI,IAAO,GAAa,EAAG,WAAW,EAAY,IAAI,CAAE,MAAO,KAAO,GAGxE,KAAK,EAAI,CACP,GAAI,CAAC,EAAG,WAAW,KAAO,EAAU,CAAE,OAEtC,IAAM,EADS,IAAI,gBAAgB,EAAG,MAAM,IAAI,CAAC,IAAM,GAAG,CAClC,IAAI,OAAO,CAEnC,OAAO,EAAsB,EADhB,EAAW,EAAM,IAAI,EAAS,CAAG,EAAM,OAAS,EAAI,EAAM,QAAQ,CAAC,MAAM,CAAC,MAAQ,IAAA,GACpD,EAG7C,gBAAgB,EAAQ,CACtB,EAAO,YAAY,IAAI,mBAAoB,EAAM,IAAQ,CACvD,EAAI,UAAU,eAAgB,YAAY,CAC1C,EAAI,IAAI;;;;;;;;0BAQS,EACjB,CAGF,EAAO,YAAY,IAAA,UAAA,qBAAW,EAAK,EAAK,EAAS,OAC/C,KAAA,EAAI,EAAI,MAAA,KAAA,IAAA,GAAA,EAAK,MAAM,IAAI,CAAC,MAAO,EAAc,OAAO,GAAM,CAE1D,IAAM,EAAO,EAAuB,EAAI,QAAQ,QAAS,EAAO,EAAS,CACnE,EAAW,GAAa,EAAO,SAAS,EAAK,OAAS,IACtD,EAAS,MAAM,EAAO,iBAAiB,EAAS,CACtD,GAAI,CAAC,EAAQ,OAAO,GAAM,CAC1B,EAAI,UAAU,eAAgB,yBAAyB,CACvD,EAAI,IAAI,EAAO,KAAK,mBARQ,EAAK,EAAK,EAAA,oCAStC,EAGJ,oBAAqB,CACnB,MAAO,CACL,CACE,IAAK,SACL,MAAO,CAAE,KAAM,SAAU,IAAK,EAAc,CAC5C,SAAU,OACX,CACF,EAEJ,CAUH,SAAS,EAAmB,EAAoB,EAA+B,CAC7E,OAAQ,EAAwC,EAAE,GAAa,CAC7D,GAAM,CAAE,QAAO,cAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAoB,EAAA,CAAa,EAAS,CACzD,MAAO,CACL,KAAM,EACN,MAAO,QACP,aAAM,uBAAc,OAElB,IAAM,EAAgB,EAAQ,MAC1B,EAAA,QAAK,WAAW,EAAM,CACpB,EACA,EAAA,QAAK,QAAQ,QAAQ,KAAK,CAAE,EAAM,EAAA,EACnC,EAAmB,QAAQ,KAAK,CAAE,EAAe,EAAM,CAAC,GAAA,KAAI,EAAA,QAAK,QAAQ,QAAQ,KAAK,CAAE,EAAM,CAAtC,EAC7D,GAAI,CACF,MAAA,EAAA,EAAA,OAAY,CACV,WAAY,GACZ,SAAU,OACV,MAAO,CACL,IAAK,CACH,MAAO,EACP,QAAS,CAAC,KAAK,CACf,aAAgB,EACjB,CACD,OAAQ,OACR,YAAa,GACd,CACF,CAAC,OACK,EAAO,CAEd,MADA,QAAQ,MAAM,IAAI,EAAW,iBAAkB,EAAM,CAC/C,QAGX,EAKL,IAAM,EAAkB,GAAc,EAAE,QAAQ,cAAe,GAAG,CAG5D,GAAsB,EAAa,IAAwC,CAC/E,IAAK,IAAM,IAAO,CAAC,MAAO,MAAM,CAAE,CAChC,IAAM,EAAY,EAAA,QAAK,KAAK,EAAK,EAAe,EAAI,CACpD,GAAI,EAAA,QAAG,WAAW,EAAU,CAAE,OAAO,EAEvC,OAAO,MAWT,MAAa,EAAkB,EAAmB,aAAc,CAAE,MAAO,mBAAoB,WAAY,gBAAiB,CAAC,CAK9G,EAAqB,EAAmB,gBAAiB,CAAE,MAAO,sBAAuB,WAAY,mBAAoB,CAAC,CAO1H,GAAsB,EAAc,EAAkB,EAAQ,IAAgB,CACzF,GAAI,GAAS,EAAU,MAAO,EAAE,CAChC,IAAM,EAAoB,EAAE,CACxB,EACJ,GAAI,CACF,EAAU,EAAA,QAAG,YAAY,EAAM,CAAE,cAAe,GAAM,CAAC,SACjD,CACN,OAAO,EAET,IAAK,IAAM,KAAS,EAAS,CAC3B,GAAI,CAAC,EAAM,aAAa,EAAI,EAAM,KAAK,WAAW,IAAI,EAAI,EAAM,OAAS,eAAgB,SACzF,IAAM,EAAM,EAAA,QAAK,KAAK,EAAM,EAAM,KAAK,CACnC,EAAA,QAAG,WAAW,EAAA,QAAK,KAAK,EAAK,cAAc,CAAC,EAC9C,EAAQ,KAAK,EAAI,CAEnB,EAAQ,KAAK,GAAG,EAAmB,EAAK,EAAU,EAAQ,EAAE,CAAC,CAE/D,OAAO"}
1
+ {"version":3,"file":"vite.cjs","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import type { Plugin, ResolvedConfig } from \"vite\"\nimport { build } from \"vite\"\nimport path from \"path\"\nimport fs from \"fs\"\nimport type { HostContext } from \"./types\"\nimport type { HostContextPreset } from \"./simulator/types\"\n\nexport type PuzzmoSimulatorPluginOptions = {\n /** Whether to auto-start the game after READY (default: true) */\n autoStart?: boolean\n /** Initial collapsed state (default: true) */\n collapsed?: boolean\n /**\n * Glob pattern for fixture files, passed to import.meta.glob which is relative to the closest puzzmo.json. Defaults\n * to `\"/fixtures/puzzles/**\\/*.{json,toml}\"`. Fixtures are loaded as raw strings (any text format works — JSON,\n * TOML, or a custom format) and delivered to the game verbatim, so the game parses them itself. Pass false to disable.\n */\n fixturesGlob?: string | false\n /**\n * The `hostContext` array the simulator sends in READY_DATA, so host-context-dependent features\n * (embed settings, sandbox mode, mobile layout, …) can be exercised locally. Must be\n * JSON-serializable. Defaults to a single desktop \"app\" context; the simulator's Host tab can\n * override it at runtime (persisted per-browser, applied on restart).\n *\n * @internal\n */\n hostContext?: HostContext[]\n /**\n * Extra named `hostContext` presets for the simulator's Host tab, alongside the generic\n * built-ins — how a game ships its own scenarios (e.g. crossword's partner-embed toolbar\n * settings). Must be JSON-serializable.\n *\n * @internal\n */\n hostContextPresets?: HostContextPreset[]\n}\n\nconst simulatorURL = \"/@puzzmo-simulator-init.js\"\nconst virtualID = \"virtual:puzzmo-simulator\"\n\n/** @internal */\nexport type GameInfo = {\n /** Directory containing the puzzmo.json */\n dir: string\n slug: string\n displayName: string\n /** Vite-root-relative path to app bundle entry, if it exists */\n appBundlePath: string | null\n}\n\n/**\n * Discover all games from puzzmo.json files under a root directory.\n *\n * @internal\n */\nexport function discoverGames(viteRoot: string): Map<string, GameInfo> {\n const games = new Map<string, GameInfo>()\n const candidates = findPuzzmoJsonDirs(viteRoot, 3)\n if (fs.existsSync(path.join(viteRoot, \"puzzmo.json\"))) {\n candidates.unshift(viteRoot)\n }\n for (const dir of candidates) {\n try {\n const data = JSON.parse(fs.readFileSync(path.join(dir, \"puzzmo.json\"), \"utf-8\"))\n if (!data?.game?.slug) continue\n const bundleEntry = resolveBundleEntry(dir, \"src/appBundle\")\n let appBundle: string | null = null\n if (bundleEntry) {\n const relative = path.relative(viteRoot, bundleEntry)\n appBundle = \"/\" + relative.split(path.sep).join(\"/\")\n }\n games.set(data.game.slug, { dir, slug: data.game.slug, displayName: data.game.displayName, appBundlePath: appBundle })\n } catch {\n // skip invalid files\n }\n }\n return games\n}\n\n/**\n * Resolve which game a request belongs to using the referer URL.\n *\n * @internal\n */\nexport function resolveGameFromReferer(referer: string | undefined, games: Map<string, GameInfo>, viteRoot: string): GameInfo | undefined {\n if (referer) {\n try {\n const refPath = new URL(referer).pathname\n for (const g of games.values()) {\n const relDir = \"/\" + path.relative(viteRoot, g.dir).split(path.sep).join(\"/\")\n if (refPath.startsWith(relDir + \"/\") || refPath === relDir) return g\n }\n } catch {\n // ignore malformed referer\n }\n }\n if (games.size === 1) return games.values().next().value\n return undefined\n}\n\n/**\n * Generate the virtual module code for the simulator.\n *\n * @internal\n */\nexport function generateSimulatorCode(options: PuzzmoSimulatorPluginOptions, game: GameInfo | undefined): string {\n const { fixturesGlob: fixturesOpt, ...config } = options\n const fixturesGlob = fixturesOpt === false ? null : (fixturesOpt ?? \"/fixtures/puzzles/**/*.{json,toml}\")\n\n const lines = [`import { createSimulator } from \"@puzzmo/sdk/simulator\"`]\n\n // Load fixtures as raw strings so any text format reaches the game verbatim; the game does its own parsing.\n if (fixturesGlob) {\n lines.push(`const fixtures = import.meta.glob(${JSON.stringify(fixturesGlob)}, { query: \"?raw\", import: \"default\", eager: true })`)\n }\n\n if (game?.appBundlePath) {\n lines.push(`import(${JSON.stringify(game.appBundlePath)}).then(m => {`)\n lines.push(` if (m.renderThumbnail) globalThis.renderThumbnail = m.renderThumbnail`)\n lines.push(`}).catch(() => {})`)\n }\n\n const simConfig = { ...config, ...(game?.slug ? { slug: game.slug } : {}) }\n const configEntries = Object.entries(simConfig).filter(([, v]) => v !== undefined)\n const configParts = configEntries.map(([k, v]) => `${k}: ${JSON.stringify(v)}`)\n if (fixturesGlob) configParts.push(\"fixtures\")\n\n lines.push(`createSimulator({ ${configParts.join(\", \")} })`)\n\n return lines.join(\"\\n\")\n}\n\n/** Vite plugin that injects the Puzzmo simulator in dev mode and handles OAuth callbacks. */\nexport function puzzmoSimulator(options: PuzzmoSimulatorPluginOptions = {}): Plugin {\n let games = new Map<string, GameInfo>()\n let viteRoot: string\n\n return {\n name: \"puzzmo-simulator\",\n apply: \"serve\",\n\n configResolved(config: ResolvedConfig) {\n viteRoot = config.root\n games = discoverGames(viteRoot)\n\n if (games.size === 0) {\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m\\x1b[2m no puzzmo.json files found\\x1b[22m`)\n } else {\n const names = [...games.values()].map((g) => `\\x1b[36m${g.slug}\\x1b[39m`)\n const label = games.size === 1 ? \"game\" : \"games\"\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m found ${games.size} ${label}: ${names.join(\"\\x1b[2m, \\x1b[22m\")}`)\n }\n },\n\n resolveId(id) {\n if (id === virtualID || id.startsWith(virtualID + \"?\")) return \"\\0\" + id\n },\n\n load(id) {\n if (!id.startsWith(\"\\0\" + virtualID)) return\n const params = new URLSearchParams(id.split(\"?\")[1] || \"\")\n const gameSlug = params.get(\"game\")\n const game = gameSlug ? games.get(gameSlug) : games.size === 1 ? games.values().next().value : undefined\n return generateSimulatorCode(options, game)\n },\n\n configureServer(server) {\n server.middlewares.use(\"/oauth/callback\", (_req, res) => {\n res.setHeader(\"Content-Type\", \"text/html\")\n res.end(`<!DOCTYPE html>\n<html><head><title>Puzzmo OAuth</title></head>\n<body><script>\nvar params = new URLSearchParams(window.location.search);\nvar returnUrl = sessionStorage.getItem(\"oauth_return_url\") || \"/\";\nvar url = new URL(returnUrl);\nparams.forEach(function(v, k) { url.searchParams.set(k, v); });\nwindow.location.href = url.toString();\n</script></body></html>`)\n })\n\n // Serve the simulator init module, resolving the game from the referer\n server.middlewares.use(async (req, res, next) => {\n if (req.url?.split(\"?\")[0] !== simulatorURL) return next()\n\n const game = resolveGameFromReferer(req.headers.referer, games, viteRoot)\n const moduleID = virtualID + (game ? `?game=${game.slug}` : \"\")\n const result = await server.transformRequest(moduleID)\n if (!result) return next()\n res.setHeader(\"Content-Type\", \"application/javascript\")\n res.end(result.code)\n })\n },\n\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n attrs: { type: \"module\", src: simulatorURL },\n injectTo: \"head\",\n },\n ]\n },\n }\n}\n\ntype BundlePluginOptions = {\n /** Entry file for the bundle */\n entry: string\n /** Output file name */\n outputFile: string\n}\n\nfunction createBundlePlugin(pluginName: string, defaults: BundlePluginOptions) {\n return (options: Partial<BundlePluginOptions> = {}): Plugin => {\n const { entry, outputFile } = { ...defaults, ...options }\n return {\n name: pluginName,\n apply: \"build\",\n async closeBundle() {\n // If the caller overrode `entry`, honor it as-is. Otherwise try `.js` first, then `.ts`.\n const resolvedEntry = options.entry\n ? path.isAbsolute(entry)\n ? entry\n : path.resolve(process.cwd(), entry)\n : (resolveBundleEntry(process.cwd(), stripBundleExt(entry)) ?? path.resolve(process.cwd(), entry))\n try {\n await build({\n configFile: false,\n logLevel: \"warn\",\n build: {\n lib: {\n entry: resolvedEntry,\n formats: [\"es\"],\n fileName: () => outputFile,\n },\n outDir: \"dist\",\n emptyOutDir: false,\n },\n })\n } catch (error) {\n console.error(`[${pluginName}] build failed:`, error)\n throw error\n }\n },\n }\n }\n}\n\n/** Strip the trailing extension from a default entry path so we can probe siblings. */\nconst stripBundleExt = (p: string) => p.replace(/\\.[jt]sx?$/i, \"\")\n\n/** Returns the absolute path to the first matching extension under `dir`, or null. */\nconst resolveBundleEntry = (dir: string, baseRelative: string): string | null => {\n for (const ext of [\".js\", \".ts\"]) {\n const candidate = path.join(dir, baseRelative + ext)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport type AppBundlePluginOptions = Partial<BundlePluginOptions>\n\n/**\n * Vite plugin that produces dist/app-bundle.js after the main build for app-level integrations.\n *\n * The bundle exports `renderThumbnail(puzzleStr, inputStr?, config?)` — a pure\n * SVG-string renderer used by the Puzzmo platform for puzzle previews.\n */\nexport const appBundlePlugin = createBundlePlugin(\"app-bundle\", { entry: \"src/appBundle.js\", outputFile: \"app-bundle.js\" })\n\nexport type EditorBundlePluginOptions = Partial<BundlePluginOptions>\n\n/** Vite plugin that produces dist/editor-bundle.js after the main build for editor-level integrations. */\nexport const editorBundlePlugin = createBundlePlugin(\"editor-bundle\", { entry: \"src/editorBundle.js\", outputFile: \"editor-bundle.js\" })\n\n/**\n * Recursively find directories containing puzzmo.json, up to `maxDepth` levels deep.\n *\n * @internal\n */\nexport const findPuzzmoJsonDirs = (root: string, maxDepth: number, depth = 0): string[] => {\n if (depth >= maxDepth) return []\n const results: string[] = []\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(root, { withFileTypes: true })\n } catch {\n return results\n }\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue\n const dir = path.join(root, entry.name)\n if (fs.existsSync(path.join(dir, \"puzzmo.json\"))) {\n results.push(dir)\n }\n results.push(...findPuzzmoJsonDirs(dir, maxDepth, depth + 1))\n }\n return results\n}\n"],"mappings":"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"}
package/dist/vite.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import type { Plugin } from "vite";
2
+ import type { HostContext } from "./types";
3
+ import type { HostContextPreset } from "./simulator/types";
2
4
  export type PuzzmoSimulatorPluginOptions = {
3
5
  /** Whether to auto-start the game after READY (default: true) */
4
6
  autoStart?: boolean;
@@ -10,6 +12,23 @@ export type PuzzmoSimulatorPluginOptions = {
10
12
  * TOML, or a custom format) and delivered to the game verbatim, so the game parses them itself. Pass false to disable.
11
13
  */
12
14
  fixturesGlob?: string | false;
15
+ /**
16
+ * The `hostContext` array the simulator sends in READY_DATA, so host-context-dependent features
17
+ * (embed settings, sandbox mode, mobile layout, …) can be exercised locally. Must be
18
+ * JSON-serializable. Defaults to a single desktop "app" context; the simulator's Host tab can
19
+ * override it at runtime (persisted per-browser, applied on restart).
20
+ *
21
+ * @internal
22
+ */
23
+ hostContext?: HostContext[];
24
+ /**
25
+ * Extra named `hostContext` presets for the simulator's Host tab, alongside the generic
26
+ * built-ins — how a game ships its own scenarios (e.g. crossword's partner-embed toolbar
27
+ * settings). Must be JSON-serializable.
28
+ *
29
+ * @internal
30
+ */
31
+ hostContextPresets?: HostContextPreset[];
13
32
  };
14
33
  /** @internal */
15
34
  export type GameInfo = {
@@ -1 +1 @@
1
- {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAA;AAKlD,MAAM,MAAM,4BAA4B,GAAG;IACzC,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAC9B,CAAA;AAKD,gBAAgB;AAChB,MAAM,MAAM,QAAQ,GAAG;IACrB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAsBrE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAcxI;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAyB/G;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,OAAO,GAAE,4BAAiC,GAAG,MAAM,CAsElF;AAED,KAAK,mBAAmB,GAAG;IACzB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAkDD,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,yDAA+F,CAAA;AAE3H,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAEpE,0GAA0G;AAC1G,eAAO,MAAM,kBAAkB,yDAAwG,CAAA;AAEvI;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,8DAkB9B,CAAA"}
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAA;AAIlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,MAAM,MAAM,4BAA4B,GAAG;IACzC,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC7B;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,WAAW,EAAE,CAAA;IAC3B;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAA;CACzC,CAAA;AAKD,gBAAgB;AAChB,MAAM,MAAM,QAAQ,GAAG;IACrB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAA;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAsBrE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAcxI;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAyB/G;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,OAAO,GAAE,4BAAiC,GAAG,MAAM,CAsElF;AAED,KAAK,mBAAmB,GAAG;IACzB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAkDD,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,yDAA+F,CAAA;AAE3H,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAEpE,0GAA0G;AAC1G,eAAO,MAAM,kBAAkB,yDAAwG,CAAA;AAEvI;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,8DAkB9B,CAAA"}
package/dist/vite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.js","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import type { Plugin, ResolvedConfig } from \"vite\"\nimport { build } from \"vite\"\nimport path from \"path\"\nimport fs from \"fs\"\n\nexport type PuzzmoSimulatorPluginOptions = {\n /** Whether to auto-start the game after READY (default: true) */\n autoStart?: boolean\n /** Initial collapsed state (default: true) */\n collapsed?: boolean\n /**\n * Glob pattern for fixture files, passed to import.meta.glob which is relative to the closest puzzmo.json. Defaults\n * to `\"/fixtures/puzzles/**\\/*.{json,toml}\"`. Fixtures are loaded as raw strings (any text format works — JSON,\n * TOML, or a custom format) and delivered to the game verbatim, so the game parses them itself. Pass false to disable.\n */\n fixturesGlob?: string | false\n}\n\nconst simulatorURL = \"/@puzzmo-simulator-init.js\"\nconst virtualID = \"virtual:puzzmo-simulator\"\n\n/** @internal */\nexport type GameInfo = {\n /** Directory containing the puzzmo.json */\n dir: string\n slug: string\n displayName: string\n /** Vite-root-relative path to app bundle entry, if it exists */\n appBundlePath: string | null\n}\n\n/**\n * Discover all games from puzzmo.json files under a root directory.\n *\n * @internal\n */\nexport function discoverGames(viteRoot: string): Map<string, GameInfo> {\n const games = new Map<string, GameInfo>()\n const candidates = findPuzzmoJsonDirs(viteRoot, 3)\n if (fs.existsSync(path.join(viteRoot, \"puzzmo.json\"))) {\n candidates.unshift(viteRoot)\n }\n for (const dir of candidates) {\n try {\n const data = JSON.parse(fs.readFileSync(path.join(dir, \"puzzmo.json\"), \"utf-8\"))\n if (!data?.game?.slug) continue\n const bundleEntry = resolveBundleEntry(dir, \"src/appBundle\")\n let appBundle: string | null = null\n if (bundleEntry) {\n const relative = path.relative(viteRoot, bundleEntry)\n appBundle = \"/\" + relative.split(path.sep).join(\"/\")\n }\n games.set(data.game.slug, { dir, slug: data.game.slug, displayName: data.game.displayName, appBundlePath: appBundle })\n } catch {\n // skip invalid files\n }\n }\n return games\n}\n\n/**\n * Resolve which game a request belongs to using the referer URL.\n *\n * @internal\n */\nexport function resolveGameFromReferer(referer: string | undefined, games: Map<string, GameInfo>, viteRoot: string): GameInfo | undefined {\n if (referer) {\n try {\n const refPath = new URL(referer).pathname\n for (const g of games.values()) {\n const relDir = \"/\" + path.relative(viteRoot, g.dir).split(path.sep).join(\"/\")\n if (refPath.startsWith(relDir + \"/\") || refPath === relDir) return g\n }\n } catch {\n // ignore malformed referer\n }\n }\n if (games.size === 1) return games.values().next().value\n return undefined\n}\n\n/**\n * Generate the virtual module code for the simulator.\n *\n * @internal\n */\nexport function generateSimulatorCode(options: PuzzmoSimulatorPluginOptions, game: GameInfo | undefined): string {\n const { fixturesGlob: fixturesOpt, ...config } = options\n const fixturesGlob = fixturesOpt === false ? null : (fixturesOpt ?? \"/fixtures/puzzles/**/*.{json,toml}\")\n\n const lines = [`import { createSimulator } from \"@puzzmo/sdk/simulator\"`]\n\n // Load fixtures as raw strings so any text format reaches the game verbatim; the game does its own parsing.\n if (fixturesGlob) {\n lines.push(`const fixtures = import.meta.glob(${JSON.stringify(fixturesGlob)}, { query: \"?raw\", import: \"default\", eager: true })`)\n }\n\n if (game?.appBundlePath) {\n lines.push(`import(${JSON.stringify(game.appBundlePath)}).then(m => {`)\n lines.push(` if (m.renderThumbnail) globalThis.renderThumbnail = m.renderThumbnail`)\n lines.push(`}).catch(() => {})`)\n }\n\n const simConfig = { ...config, ...(game?.slug ? { slug: game.slug } : {}) }\n const configEntries = Object.entries(simConfig).filter(([, v]) => v !== undefined)\n const configParts = configEntries.map(([k, v]) => `${k}: ${JSON.stringify(v)}`)\n if (fixturesGlob) configParts.push(\"fixtures\")\n\n lines.push(`createSimulator({ ${configParts.join(\", \")} })`)\n\n return lines.join(\"\\n\")\n}\n\n/** Vite plugin that injects the Puzzmo simulator in dev mode and handles OAuth callbacks. */\nexport function puzzmoSimulator(options: PuzzmoSimulatorPluginOptions = {}): Plugin {\n let games = new Map<string, GameInfo>()\n let viteRoot: string\n\n return {\n name: \"puzzmo-simulator\",\n apply: \"serve\",\n\n configResolved(config: ResolvedConfig) {\n viteRoot = config.root\n games = discoverGames(viteRoot)\n\n if (games.size === 0) {\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m\\x1b[2m no puzzmo.json files found\\x1b[22m`)\n } else {\n const names = [...games.values()].map((g) => `\\x1b[36m${g.slug}\\x1b[39m`)\n const label = games.size === 1 ? \"game\" : \"games\"\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m found ${games.size} ${label}: ${names.join(\"\\x1b[2m, \\x1b[22m\")}`)\n }\n },\n\n resolveId(id) {\n if (id === virtualID || id.startsWith(virtualID + \"?\")) return \"\\0\" + id\n },\n\n load(id) {\n if (!id.startsWith(\"\\0\" + virtualID)) return\n const params = new URLSearchParams(id.split(\"?\")[1] || \"\")\n const gameSlug = params.get(\"game\")\n const game = gameSlug ? games.get(gameSlug) : games.size === 1 ? games.values().next().value : undefined\n return generateSimulatorCode(options, game)\n },\n\n configureServer(server) {\n server.middlewares.use(\"/oauth/callback\", (_req, res) => {\n res.setHeader(\"Content-Type\", \"text/html\")\n res.end(`<!DOCTYPE html>\n<html><head><title>Puzzmo OAuth</title></head>\n<body><script>\nvar params = new URLSearchParams(window.location.search);\nvar returnUrl = sessionStorage.getItem(\"oauth_return_url\") || \"/\";\nvar url = new URL(returnUrl);\nparams.forEach(function(v, k) { url.searchParams.set(k, v); });\nwindow.location.href = url.toString();\n</script></body></html>`)\n })\n\n // Serve the simulator init module, resolving the game from the referer\n server.middlewares.use(async (req, res, next) => {\n if (req.url?.split(\"?\")[0] !== simulatorURL) return next()\n\n const game = resolveGameFromReferer(req.headers.referer, games, viteRoot)\n const moduleID = virtualID + (game ? `?game=${game.slug}` : \"\")\n const result = await server.transformRequest(moduleID)\n if (!result) return next()\n res.setHeader(\"Content-Type\", \"application/javascript\")\n res.end(result.code)\n })\n },\n\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n attrs: { type: \"module\", src: simulatorURL },\n injectTo: \"head\",\n },\n ]\n },\n }\n}\n\ntype BundlePluginOptions = {\n /** Entry file for the bundle */\n entry: string\n /** Output file name */\n outputFile: string\n}\n\nfunction createBundlePlugin(pluginName: string, defaults: BundlePluginOptions) {\n return (options: Partial<BundlePluginOptions> = {}): Plugin => {\n const { entry, outputFile } = { ...defaults, ...options }\n return {\n name: pluginName,\n apply: \"build\",\n async closeBundle() {\n // If the caller overrode `entry`, honor it as-is. Otherwise try `.js` first, then `.ts`.\n const resolvedEntry = options.entry\n ? path.isAbsolute(entry)\n ? entry\n : path.resolve(process.cwd(), entry)\n : (resolveBundleEntry(process.cwd(), stripBundleExt(entry)) ?? path.resolve(process.cwd(), entry))\n try {\n await build({\n configFile: false,\n logLevel: \"warn\",\n build: {\n lib: {\n entry: resolvedEntry,\n formats: [\"es\"],\n fileName: () => outputFile,\n },\n outDir: \"dist\",\n emptyOutDir: false,\n },\n })\n } catch (error) {\n console.error(`[${pluginName}] build failed:`, error)\n throw error\n }\n },\n }\n }\n}\n\n/** Strip the trailing extension from a default entry path so we can probe siblings. */\nconst stripBundleExt = (p: string) => p.replace(/\\.[jt]sx?$/i, \"\")\n\n/** Returns the absolute path to the first matching extension under `dir`, or null. */\nconst resolveBundleEntry = (dir: string, baseRelative: string): string | null => {\n for (const ext of [\".js\", \".ts\"]) {\n const candidate = path.join(dir, baseRelative + ext)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport type AppBundlePluginOptions = Partial<BundlePluginOptions>\n\n/**\n * Vite plugin that produces dist/app-bundle.js after the main build for app-level integrations.\n *\n * The bundle exports `renderThumbnail(puzzleStr, inputStr?, config?)` — a pure\n * SVG-string renderer used by the Puzzmo platform for puzzle previews.\n */\nexport const appBundlePlugin = createBundlePlugin(\"app-bundle\", { entry: \"src/appBundle.js\", outputFile: \"app-bundle.js\" })\n\nexport type EditorBundlePluginOptions = Partial<BundlePluginOptions>\n\n/** Vite plugin that produces dist/editor-bundle.js after the main build for editor-level integrations. */\nexport const editorBundlePlugin = createBundlePlugin(\"editor-bundle\", { entry: \"src/editorBundle.js\", outputFile: \"editor-bundle.js\" })\n\n/**\n * Recursively find directories containing puzzmo.json, up to `maxDepth` levels deep.\n *\n * @internal\n */\nexport const findPuzzmoJsonDirs = (root: string, maxDepth: number, depth = 0): string[] => {\n if (depth >= maxDepth) return []\n const results: string[] = []\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(root, { withFileTypes: true })\n } catch {\n return results\n }\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue\n const dir = path.join(root, entry.name)\n if (fs.existsSync(path.join(dir, \"puzzmo.json\"))) {\n results.push(dir)\n }\n results.push(...findPuzzmoJsonDirs(dir, maxDepth, depth + 1))\n }\n return results\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.js","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import type { Plugin, ResolvedConfig } from \"vite\"\nimport { build } from \"vite\"\nimport path from \"path\"\nimport fs from \"fs\"\nimport type { HostContext } from \"./types\"\nimport type { HostContextPreset } from \"./simulator/types\"\n\nexport type PuzzmoSimulatorPluginOptions = {\n /** Whether to auto-start the game after READY (default: true) */\n autoStart?: boolean\n /** Initial collapsed state (default: true) */\n collapsed?: boolean\n /**\n * Glob pattern for fixture files, passed to import.meta.glob which is relative to the closest puzzmo.json. Defaults\n * to `\"/fixtures/puzzles/**\\/*.{json,toml}\"`. Fixtures are loaded as raw strings (any text format works — JSON,\n * TOML, or a custom format) and delivered to the game verbatim, so the game parses them itself. Pass false to disable.\n */\n fixturesGlob?: string | false\n /**\n * The `hostContext` array the simulator sends in READY_DATA, so host-context-dependent features\n * (embed settings, sandbox mode, mobile layout, …) can be exercised locally. Must be\n * JSON-serializable. Defaults to a single desktop \"app\" context; the simulator's Host tab can\n * override it at runtime (persisted per-browser, applied on restart).\n *\n * @internal\n */\n hostContext?: HostContext[]\n /**\n * Extra named `hostContext` presets for the simulator's Host tab, alongside the generic\n * built-ins — how a game ships its own scenarios (e.g. crossword's partner-embed toolbar\n * settings). Must be JSON-serializable.\n *\n * @internal\n */\n hostContextPresets?: HostContextPreset[]\n}\n\nconst simulatorURL = \"/@puzzmo-simulator-init.js\"\nconst virtualID = \"virtual:puzzmo-simulator\"\n\n/** @internal */\nexport type GameInfo = {\n /** Directory containing the puzzmo.json */\n dir: string\n slug: string\n displayName: string\n /** Vite-root-relative path to app bundle entry, if it exists */\n appBundlePath: string | null\n}\n\n/**\n * Discover all games from puzzmo.json files under a root directory.\n *\n * @internal\n */\nexport function discoverGames(viteRoot: string): Map<string, GameInfo> {\n const games = new Map<string, GameInfo>()\n const candidates = findPuzzmoJsonDirs(viteRoot, 3)\n if (fs.existsSync(path.join(viteRoot, \"puzzmo.json\"))) {\n candidates.unshift(viteRoot)\n }\n for (const dir of candidates) {\n try {\n const data = JSON.parse(fs.readFileSync(path.join(dir, \"puzzmo.json\"), \"utf-8\"))\n if (!data?.game?.slug) continue\n const bundleEntry = resolveBundleEntry(dir, \"src/appBundle\")\n let appBundle: string | null = null\n if (bundleEntry) {\n const relative = path.relative(viteRoot, bundleEntry)\n appBundle = \"/\" + relative.split(path.sep).join(\"/\")\n }\n games.set(data.game.slug, { dir, slug: data.game.slug, displayName: data.game.displayName, appBundlePath: appBundle })\n } catch {\n // skip invalid files\n }\n }\n return games\n}\n\n/**\n * Resolve which game a request belongs to using the referer URL.\n *\n * @internal\n */\nexport function resolveGameFromReferer(referer: string | undefined, games: Map<string, GameInfo>, viteRoot: string): GameInfo | undefined {\n if (referer) {\n try {\n const refPath = new URL(referer).pathname\n for (const g of games.values()) {\n const relDir = \"/\" + path.relative(viteRoot, g.dir).split(path.sep).join(\"/\")\n if (refPath.startsWith(relDir + \"/\") || refPath === relDir) return g\n }\n } catch {\n // ignore malformed referer\n }\n }\n if (games.size === 1) return games.values().next().value\n return undefined\n}\n\n/**\n * Generate the virtual module code for the simulator.\n *\n * @internal\n */\nexport function generateSimulatorCode(options: PuzzmoSimulatorPluginOptions, game: GameInfo | undefined): string {\n const { fixturesGlob: fixturesOpt, ...config } = options\n const fixturesGlob = fixturesOpt === false ? null : (fixturesOpt ?? \"/fixtures/puzzles/**/*.{json,toml}\")\n\n const lines = [`import { createSimulator } from \"@puzzmo/sdk/simulator\"`]\n\n // Load fixtures as raw strings so any text format reaches the game verbatim; the game does its own parsing.\n if (fixturesGlob) {\n lines.push(`const fixtures = import.meta.glob(${JSON.stringify(fixturesGlob)}, { query: \"?raw\", import: \"default\", eager: true })`)\n }\n\n if (game?.appBundlePath) {\n lines.push(`import(${JSON.stringify(game.appBundlePath)}).then(m => {`)\n lines.push(` if (m.renderThumbnail) globalThis.renderThumbnail = m.renderThumbnail`)\n lines.push(`}).catch(() => {})`)\n }\n\n const simConfig = { ...config, ...(game?.slug ? { slug: game.slug } : {}) }\n const configEntries = Object.entries(simConfig).filter(([, v]) => v !== undefined)\n const configParts = configEntries.map(([k, v]) => `${k}: ${JSON.stringify(v)}`)\n if (fixturesGlob) configParts.push(\"fixtures\")\n\n lines.push(`createSimulator({ ${configParts.join(\", \")} })`)\n\n return lines.join(\"\\n\")\n}\n\n/** Vite plugin that injects the Puzzmo simulator in dev mode and handles OAuth callbacks. */\nexport function puzzmoSimulator(options: PuzzmoSimulatorPluginOptions = {}): Plugin {\n let games = new Map<string, GameInfo>()\n let viteRoot: string\n\n return {\n name: \"puzzmo-simulator\",\n apply: \"serve\",\n\n configResolved(config: ResolvedConfig) {\n viteRoot = config.root\n games = discoverGames(viteRoot)\n\n if (games.size === 0) {\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m\\x1b[2m no puzzmo.json files found\\x1b[22m`)\n } else {\n const names = [...games.values()].map((g) => `\\x1b[36m${g.slug}\\x1b[39m`)\n const label = games.size === 1 ? \"game\" : \"games\"\n config.logger.info(`\\x1b[33m\\x1b[1m PUZZMO \\x1b[22m\\x1b[39m found ${games.size} ${label}: ${names.join(\"\\x1b[2m, \\x1b[22m\")}`)\n }\n },\n\n resolveId(id) {\n if (id === virtualID || id.startsWith(virtualID + \"?\")) return \"\\0\" + id\n },\n\n load(id) {\n if (!id.startsWith(\"\\0\" + virtualID)) return\n const params = new URLSearchParams(id.split(\"?\")[1] || \"\")\n const gameSlug = params.get(\"game\")\n const game = gameSlug ? games.get(gameSlug) : games.size === 1 ? games.values().next().value : undefined\n return generateSimulatorCode(options, game)\n },\n\n configureServer(server) {\n server.middlewares.use(\"/oauth/callback\", (_req, res) => {\n res.setHeader(\"Content-Type\", \"text/html\")\n res.end(`<!DOCTYPE html>\n<html><head><title>Puzzmo OAuth</title></head>\n<body><script>\nvar params = new URLSearchParams(window.location.search);\nvar returnUrl = sessionStorage.getItem(\"oauth_return_url\") || \"/\";\nvar url = new URL(returnUrl);\nparams.forEach(function(v, k) { url.searchParams.set(k, v); });\nwindow.location.href = url.toString();\n</script></body></html>`)\n })\n\n // Serve the simulator init module, resolving the game from the referer\n server.middlewares.use(async (req, res, next) => {\n if (req.url?.split(\"?\")[0] !== simulatorURL) return next()\n\n const game = resolveGameFromReferer(req.headers.referer, games, viteRoot)\n const moduleID = virtualID + (game ? `?game=${game.slug}` : \"\")\n const result = await server.transformRequest(moduleID)\n if (!result) return next()\n res.setHeader(\"Content-Type\", \"application/javascript\")\n res.end(result.code)\n })\n },\n\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n attrs: { type: \"module\", src: simulatorURL },\n injectTo: \"head\",\n },\n ]\n },\n }\n}\n\ntype BundlePluginOptions = {\n /** Entry file for the bundle */\n entry: string\n /** Output file name */\n outputFile: string\n}\n\nfunction createBundlePlugin(pluginName: string, defaults: BundlePluginOptions) {\n return (options: Partial<BundlePluginOptions> = {}): Plugin => {\n const { entry, outputFile } = { ...defaults, ...options }\n return {\n name: pluginName,\n apply: \"build\",\n async closeBundle() {\n // If the caller overrode `entry`, honor it as-is. Otherwise try `.js` first, then `.ts`.\n const resolvedEntry = options.entry\n ? path.isAbsolute(entry)\n ? entry\n : path.resolve(process.cwd(), entry)\n : (resolveBundleEntry(process.cwd(), stripBundleExt(entry)) ?? path.resolve(process.cwd(), entry))\n try {\n await build({\n configFile: false,\n logLevel: \"warn\",\n build: {\n lib: {\n entry: resolvedEntry,\n formats: [\"es\"],\n fileName: () => outputFile,\n },\n outDir: \"dist\",\n emptyOutDir: false,\n },\n })\n } catch (error) {\n console.error(`[${pluginName}] build failed:`, error)\n throw error\n }\n },\n }\n }\n}\n\n/** Strip the trailing extension from a default entry path so we can probe siblings. */\nconst stripBundleExt = (p: string) => p.replace(/\\.[jt]sx?$/i, \"\")\n\n/** Returns the absolute path to the first matching extension under `dir`, or null. */\nconst resolveBundleEntry = (dir: string, baseRelative: string): string | null => {\n for (const ext of [\".js\", \".ts\"]) {\n const candidate = path.join(dir, baseRelative + ext)\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n}\n\nexport type AppBundlePluginOptions = Partial<BundlePluginOptions>\n\n/**\n * Vite plugin that produces dist/app-bundle.js after the main build for app-level integrations.\n *\n * The bundle exports `renderThumbnail(puzzleStr, inputStr?, config?)` — a pure\n * SVG-string renderer used by the Puzzmo platform for puzzle previews.\n */\nexport const appBundlePlugin = createBundlePlugin(\"app-bundle\", { entry: \"src/appBundle.js\", outputFile: \"app-bundle.js\" })\n\nexport type EditorBundlePluginOptions = Partial<BundlePluginOptions>\n\n/** Vite plugin that produces dist/editor-bundle.js after the main build for editor-level integrations. */\nexport const editorBundlePlugin = createBundlePlugin(\"editor-bundle\", { entry: \"src/editorBundle.js\", outputFile: \"editor-bundle.js\" })\n\n/**\n * Recursively find directories containing puzzmo.json, up to `maxDepth` levels deep.\n *\n * @internal\n */\nexport const findPuzzmoJsonDirs = (root: string, maxDepth: number, depth = 0): string[] => {\n if (depth >= maxDepth) return []\n const results: string[] = []\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(root, { withFileTypes: true })\n } catch {\n return results\n }\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue\n const dir = path.join(root, entry.name)\n if (fs.existsSync(path.join(dir, \"puzzmo.json\"))) {\n results.push(dir)\n }\n results.push(...findPuzzmoJsonDirs(dir, maxDepth, depth + 1))\n }\n return results\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@puzzmo/sdk",
3
- "version": "1.0.31",
3
+ "version": "1.0.33",
4
4
  "description": "Puzzmo runtime SDK for game developers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -12,6 +12,11 @@
12
12
  "import": "./dist/index.js",
13
13
  "require": "./dist/index.cjs"
14
14
  },
15
+ "./contracts": {
16
+ "types": "./dist/contracts.d.ts",
17
+ "import": "./dist/contracts.js",
18
+ "require": "./dist/contracts.cjs"
19
+ },
15
20
  "./inputs": {
16
21
  "types": "./dist/inputs/index.d.ts",
17
22
  "import": "./dist/inputs/index.js",