@xmachines/play-router 1.0.0-beta.1

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 (141) hide show
  1. package/.oxfmtrc.json +3 -0
  2. package/.oxlintrc.json +3 -0
  3. package/README.md +436 -0
  4. package/coverage/base.css +224 -0
  5. package/coverage/block-navigation.js +87 -0
  6. package/coverage/build-tree.ts.html +316 -0
  7. package/coverage/connect-router.ts.html +505 -0
  8. package/coverage/coverage-summary.json +15 -0
  9. package/coverage/crawl-machine.ts.html +385 -0
  10. package/coverage/create-browser-history.ts.html +556 -0
  11. package/coverage/create-route-map.ts.html +400 -0
  12. package/coverage/create-router.ts.html +328 -0
  13. package/coverage/extract-route.ts.html +322 -0
  14. package/coverage/extract-routes.ts.html +286 -0
  15. package/coverage/favicon.png +0 -0
  16. package/coverage/index.html +296 -0
  17. package/coverage/index.ts.html +610 -0
  18. package/coverage/prettify.css +1 -0
  19. package/coverage/prettify.js +2 -0
  20. package/coverage/query.ts.html +307 -0
  21. package/coverage/router-bridge-base.ts.html +919 -0
  22. package/coverage/sort-arrow-sprite.png +0 -0
  23. package/coverage/sorter.js +210 -0
  24. package/coverage/types.ts.html +787 -0
  25. package/coverage/validate-routes.ts.html +319 -0
  26. package/dist/build-tree.d.ts +13 -0
  27. package/dist/build-tree.d.ts.map +1 -0
  28. package/dist/build-tree.js +67 -0
  29. package/dist/build-tree.js.map +1 -0
  30. package/dist/connect-router.d.ts +56 -0
  31. package/dist/connect-router.d.ts.map +1 -0
  32. package/dist/connect-router.js +119 -0
  33. package/dist/connect-router.js.map +1 -0
  34. package/dist/crawl-machine.d.ts +74 -0
  35. package/dist/crawl-machine.d.ts.map +1 -0
  36. package/dist/crawl-machine.js +95 -0
  37. package/dist/crawl-machine.js.map +1 -0
  38. package/dist/create-browser-history.d.ts +68 -0
  39. package/dist/create-browser-history.d.ts.map +1 -0
  40. package/dist/create-browser-history.js +94 -0
  41. package/dist/create-browser-history.js.map +1 -0
  42. package/dist/create-route-map.d.ts +46 -0
  43. package/dist/create-route-map.d.ts.map +1 -0
  44. package/dist/create-route-map.js +73 -0
  45. package/dist/create-route-map.js.map +1 -0
  46. package/dist/create-router.d.ts +73 -0
  47. package/dist/create-router.d.ts.map +1 -0
  48. package/dist/create-router.js +63 -0
  49. package/dist/create-router.js.map +1 -0
  50. package/dist/extract-route.d.ts +25 -0
  51. package/dist/extract-route.d.ts.map +1 -0
  52. package/dist/extract-route.js +63 -0
  53. package/dist/extract-route.js.map +1 -0
  54. package/dist/extract-routes.d.ts +41 -0
  55. package/dist/extract-routes.d.ts.map +1 -0
  56. package/dist/extract-routes.js +61 -0
  57. package/dist/extract-routes.js.map +1 -0
  58. package/dist/index.d.ts +56 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +141 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/query.d.ts +52 -0
  63. package/dist/query.d.ts.map +1 -0
  64. package/dist/query.js +69 -0
  65. package/dist/query.js.map +1 -0
  66. package/dist/router-bridge-base.d.ts +150 -0
  67. package/dist/router-bridge-base.d.ts.map +1 -0
  68. package/dist/router-bridge-base.js +240 -0
  69. package/dist/router-bridge-base.js.map +1 -0
  70. package/dist/types.d.ts +228 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +2 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/validate-routes.d.ts +39 -0
  75. package/dist/validate-routes.d.ts.map +1 -0
  76. package/dist/validate-routes.js +65 -0
  77. package/dist/validate-routes.js.map +1 -0
  78. package/examples/demo/README.md +127 -0
  79. package/examples/demo/index.html +41 -0
  80. package/examples/demo/package.json +27 -0
  81. package/examples/demo/src/main.ts +28 -0
  82. package/examples/demo/src/router.ts +37 -0
  83. package/examples/demo/src/shell.ts +316 -0
  84. package/examples/demo/test/browser/auth-flow.browser.test.ts +60 -0
  85. package/examples/demo/test/browser/startup.browser.test.ts +37 -0
  86. package/examples/demo/test/library-pattern.test.ts +51 -0
  87. package/examples/demo/tsconfig.json +17 -0
  88. package/examples/demo/vite.config.ts +7 -0
  89. package/examples/demo/vitest.browser.config.ts +20 -0
  90. package/examples/demo/vitest.config.ts +9 -0
  91. package/examples/shared/dist/auth-machine.d.ts +20 -0
  92. package/examples/shared/dist/auth-machine.d.ts.map +1 -0
  93. package/examples/shared/dist/auth-machine.js +212 -0
  94. package/examples/shared/dist/auth-machine.js.map +1 -0
  95. package/examples/shared/dist/catalog.d.ts +85 -0
  96. package/examples/shared/dist/catalog.d.ts.map +1 -0
  97. package/examples/shared/dist/catalog.js +86 -0
  98. package/examples/shared/dist/catalog.js.map +1 -0
  99. package/examples/shared/dist/index.d.ts +4 -0
  100. package/examples/shared/dist/index.d.ts.map +1 -0
  101. package/examples/shared/dist/index.js +3 -0
  102. package/examples/shared/dist/index.js.map +1 -0
  103. package/examples/shared/package.json +37 -0
  104. package/examples/shared/src/auth-machine.ts +234 -0
  105. package/examples/shared/src/catalog.ts +95 -0
  106. package/examples/shared/src/index.css +3 -0
  107. package/examples/shared/src/index.ts +3 -0
  108. package/examples/shared/src/styles/layout.css +413 -0
  109. package/examples/shared/src/styles/reset.css +42 -0
  110. package/examples/shared/src/styles/tokens.css +183 -0
  111. package/examples/shared/tsconfig.json +14 -0
  112. package/examples/shared/tsconfig.tsbuildinfo +1 -0
  113. package/package.json +44 -0
  114. package/src/build-tree.ts +77 -0
  115. package/src/connect-router.ts +142 -0
  116. package/src/crawl-machine.ts +100 -0
  117. package/src/create-browser-history.ts +157 -0
  118. package/src/create-route-map.ts +105 -0
  119. package/src/create-router.ts +87 -0
  120. package/src/extract-route.ts +79 -0
  121. package/src/extract-routes.ts +67 -0
  122. package/src/index.ts +175 -0
  123. package/src/query.ts +74 -0
  124. package/src/router-bridge-base.ts +279 -0
  125. package/src/types.ts +234 -0
  126. package/src/validate-routes.ts +76 -0
  127. package/test/connect-route-map.test.ts +320 -0
  128. package/test/crawl-extract.test.js +473 -0
  129. package/test/create-browser-history.test.ts +123 -0
  130. package/test/create-router.test.ts +23 -0
  131. package/test/extract-routes.test.ts +80 -0
  132. package/test/find-route-by-path-patterns.test.ts +69 -0
  133. package/test/integration.test.js +438 -0
  134. package/test/query.test.ts +56 -0
  135. package/test/router-bridge-base-edge.test.ts +165 -0
  136. package/test/router-bridge-base.test.ts +119 -0
  137. package/test/tree-query.test.js +692 -0
  138. package/test/validation.test.js +158 -0
  139. package/tsconfig.json +14 -0
  140. package/tsconfig.tsbuildinfo +1 -0
  141. package/vitest.config.ts +35 -0
@@ -0,0 +1,51 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { readFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+
9
+ describe("Vanilla demo library pattern", () => {
10
+ const mainSource = readFileSync(join(__dirname, "../src/main.ts"), "utf-8");
11
+ const routerSource = readFileSync(join(__dirname, "../src/router.ts"), "utf-8");
12
+ const shellSource = readFileSync(join(__dirname, "../src/shell.ts"), "utf-8");
13
+ const demoReadme = readFileSync(join(__dirname, "../README.md"), "utf-8");
14
+ const packageReadme = readFileSync(join(__dirname, "../../../README.md"), "utf-8");
15
+ const apiReadme = readFileSync(
16
+ join(__dirname, "../../../../../docs/api/@xmachines/play-router-demo/README.md"),
17
+ "utf-8",
18
+ );
19
+
20
+ it("uses shared machine and catalog from play-router-shared", () => {
21
+ expect(mainSource).toMatch(
22
+ /import.*authMachine,\s*catalog.*@xmachines\/play-router-shared/,
23
+ );
24
+ expect(mainSource).toMatch(/definePlayer\s*\(/);
25
+ expect(mainSource).toMatch(/machine:\s*authMachine/);
26
+ expect(mainSource).toMatch(/catalog/);
27
+ });
28
+
29
+ it("uses play-router helpers for infrastructure wiring", () => {
30
+ expect(routerSource).toMatch(/extractMachineRoutes/);
31
+ expect(routerSource).toMatch(/createRouteMap/);
32
+ expect(routerSource).toMatch(/createBrowserHistory/);
33
+ expect(routerSource).toMatch(/createRouter/);
34
+ expect(routerSource).toMatch(/connectRouter/);
35
+ });
36
+
37
+ it("keeps shell reactive and actor-driven", () => {
38
+ expect(shellSource).toMatch(/Signal\.subtle\.Watcher/);
39
+ expect(shellSource).toMatch(/actor\.send\(\{\s*type:\s*"play\.route"/);
40
+ expect(shellSource).toMatch(/actor\.send\(\{\s*type:\s*"auth\.login"/);
41
+ expect(shellSource).toMatch(/actor\.send\(\{\s*type:\s*"auth\.logout"/);
42
+ });
43
+
44
+ it("documents shell terminology consistently", () => {
45
+ expect(demoReadme).toMatch(/src\/shell\.ts/);
46
+ expect(apiReadme).toMatch(/src\/shell\.ts/);
47
+ expect(demoReadme).not.toMatch(/src\/ui\.ts/);
48
+ expect(apiReadme).not.toMatch(/src\/ui\.ts/);
49
+ expect(packageReadme).toMatch(/play-router/i);
50
+ });
51
+ });
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "@xmachines/shared/tsconfig",
3
+ "compilerOptions": {
4
+ "composite": true,
5
+ "rootDir": "./src",
6
+ "outDir": "./dist",
7
+ "lib": ["ES2022", "DOM"]
8
+ },
9
+ "references": [
10
+ { "path": "../.." },
11
+ { "path": "../../../play" },
12
+ { "path": "../../../play-catalog" },
13
+ { "path": "../../../play-signals" },
14
+ { "path": "../../../play-xstate" }
15
+ ],
16
+ "include": ["src/**/*"]
17
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "vite";
2
+ import { xmAliases } from "@xmachines/shared/vite-aliases";
3
+
4
+ export default defineConfig({
5
+ resolve: { alias: xmAliases(import.meta.url) },
6
+ server: { port: 5174 },
7
+ });
@@ -0,0 +1,20 @@
1
+ import { defineConfig } from "vitest/config";
2
+ import { playwright } from "@vitest/browser-playwright";
3
+ import { xmAliases } from "@xmachines/shared/vite-aliases";
4
+
5
+ export default defineConfig({
6
+ resolve: { alias: xmAliases(import.meta.url) },
7
+ test: {
8
+ name: "vanilla-router-demo-browser",
9
+ setupFiles: ["../../../shared/config/vitest.setup.ts"],
10
+ include: ["test/browser/**/*.browser.test.ts"],
11
+ exclude: ["node_modules/**"],
12
+ fileParallelism: false,
13
+ browser: {
14
+ enabled: true,
15
+ provider: playwright(),
16
+ headless: true,
17
+ instances: [{ browser: "chromium" }],
18
+ },
19
+ },
20
+ });
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ include: ["test/**/*.test.ts"],
6
+ exclude: ["test/browser/**"],
7
+ passWithNoTests: true,
8
+ },
9
+ });
@@ -0,0 +1,20 @@
1
+ import type { PlayRouteEvent } from "@xmachines/play-router";
2
+ export interface AuthContext {
3
+ isAuthenticated: boolean;
4
+ username: string | null;
5
+ routeParams: Record<string, string>;
6
+ queryParams: Record<string, string>;
7
+ }
8
+ export type AuthEvents = PlayRouteEvent | {
9
+ type: "auth.login";
10
+ username: string;
11
+ } | {
12
+ type: "auth.register";
13
+ username: string;
14
+ email: string;
15
+ password: string;
16
+ } | {
17
+ type: "auth.logout";
18
+ };
19
+ export declare const authMachine: import("xstate").StateMachine<import("xstate").MachineContext, import("xstate").AnyEventObject, Record<string, import("xstate").AnyActorRef>, import("xstate").ProvidedActor, import("xstate").ParameterizedObject, import("xstate").ParameterizedObject, string, import("xstate").StateValue, string, unknown, import("xstate").NonReducibleUnknown, import("xstate").EventObject, import("xstate").MetaObject, any>;
20
+ //# sourceMappingURL=auth-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-machine.d.ts","sourceRoot":"","sources":["../src/auth-machine.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,MAAM,WAAW,WAAW;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAID,MAAM,MAAM,UAAU,GACnB,cAAc,GACd;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAsM3B,eAAO,MAAM,WAAW,uZAA2D,CAAC"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Unified Authentication State Machine
3
+ *
4
+ * Shared across ALL demo applications (Vanilla, React, Vue, SolidJS, TanStack Solid, React Router)
5
+ *
6
+ * States:
7
+ * - home: Public landing page (/)
8
+ * - about: Public information page (/about)
9
+ * - contact: Public contact page (/contact)
10
+ * - login: Login form (/login)
11
+ * - dashboard: Protected authenticated home (/dashboard)
12
+ * - profile: Protected user profile (/profile/:username)
13
+ *
14
+ * Events:
15
+ * - auth.login: Login with username only (no password)
16
+ * - auth.logout: Logout and return to home
17
+ * - play.route: Navigation events from router
18
+ */
19
+ import { createMachine, assign } from "xstate";
20
+ import { formatPlayRouteTransitions } from "@xmachines/play-xstate";
21
+ const machineConfig = {
22
+ id: "auth",
23
+ initial: "home",
24
+ types: {
25
+ context: {},
26
+ events: {},
27
+ input: {},
28
+ },
29
+ context: ({ input }) => ({
30
+ isAuthenticated: input?.isAuthenticated ?? false,
31
+ username: input?.username ?? null,
32
+ routeParams: input?.routeParams ?? {},
33
+ queryParams: input?.queryParams ?? {},
34
+ }),
35
+ // ROOT-LEVEL EVENT HANDLERS
36
+ // These can be triggered from any state
37
+ on: {
38
+ "auth.login": {
39
+ target: ".dashboard",
40
+ actions: assign({
41
+ isAuthenticated: true,
42
+ username: ({ event }) => event.username,
43
+ }),
44
+ },
45
+ "auth.register": {
46
+ target: ".dashboard",
47
+ actions: assign({
48
+ isAuthenticated: true,
49
+ username: ({ event }) => event.username,
50
+ }),
51
+ },
52
+ },
53
+ states: {
54
+ // PUBLIC ROUTES
55
+ home: {
56
+ id: "home",
57
+ meta: {
58
+ route: "/",
59
+ view: {
60
+ component: "Home",
61
+ props: { title: "Welcome Home" },
62
+ },
63
+ },
64
+ on: {
65
+ "auth.logout": {
66
+ actions: assign({
67
+ isAuthenticated: false,
68
+ username: null,
69
+ }),
70
+ },
71
+ },
72
+ },
73
+ about: {
74
+ id: "about",
75
+ meta: {
76
+ route: "/about",
77
+ view: {
78
+ component: "About",
79
+ props: { title: "About Us" },
80
+ },
81
+ },
82
+ on: {
83
+ "auth.logout": {
84
+ target: "home",
85
+ actions: assign({
86
+ isAuthenticated: false,
87
+ username: null,
88
+ }),
89
+ },
90
+ },
91
+ },
92
+ contact: {
93
+ id: "contact",
94
+ meta: {
95
+ route: "/contact",
96
+ view: {
97
+ component: "Contact",
98
+ props: { title: "Contact Us" },
99
+ },
100
+ },
101
+ on: {
102
+ "auth.logout": {
103
+ target: "home",
104
+ actions: assign({
105
+ isAuthenticated: false,
106
+ username: null,
107
+ }),
108
+ },
109
+ },
110
+ },
111
+ login: {
112
+ id: "login",
113
+ meta: {
114
+ route: "/login",
115
+ view: {
116
+ component: "Login",
117
+ props: { title: "Please Log In" },
118
+ },
119
+ },
120
+ },
121
+ register: {
122
+ id: "register",
123
+ meta: {
124
+ route: "/register",
125
+ view: {
126
+ component: "Register",
127
+ props: { title: "Create Account" },
128
+ },
129
+ },
130
+ },
131
+ // PROTECTED ROUTES
132
+ dashboard: {
133
+ id: "dashboard",
134
+ meta: {
135
+ route: "/dashboard",
136
+ view: {
137
+ component: "Dashboard",
138
+ props: ({ context }) => ({
139
+ welcome: true,
140
+ username: context.username || "Guest",
141
+ }),
142
+ },
143
+ },
144
+ on: {
145
+ "auth.logout": {
146
+ target: "home",
147
+ actions: assign({
148
+ isAuthenticated: false,
149
+ username: null,
150
+ }),
151
+ },
152
+ },
153
+ always: {
154
+ guard: ({ context }) => !context.isAuthenticated,
155
+ target: "login",
156
+ },
157
+ },
158
+ profile: {
159
+ id: "profile",
160
+ meta: {
161
+ route: "/profile/:username",
162
+ view: {
163
+ component: "Profile",
164
+ props: ({ context }) => ({
165
+ username: context.routeParams.username || context.username || "Guest",
166
+ }),
167
+ },
168
+ },
169
+ on: {
170
+ "auth.logout": {
171
+ target: "home",
172
+ actions: assign({
173
+ isAuthenticated: false,
174
+ username: null,
175
+ }),
176
+ },
177
+ },
178
+ always: {
179
+ guard: ({ context }) => !context.isAuthenticated,
180
+ target: "login",
181
+ },
182
+ },
183
+ settings: {
184
+ id: "settings",
185
+ meta: {
186
+ route: "/settings/:section?",
187
+ view: {
188
+ component: "Settings",
189
+ props: ({ context }) => ({
190
+ section: context.routeParams.section,
191
+ username: context.username || "Guest",
192
+ }),
193
+ },
194
+ },
195
+ on: {
196
+ "auth.logout": {
197
+ target: "home",
198
+ actions: assign({
199
+ isAuthenticated: false,
200
+ username: null,
201
+ }),
202
+ },
203
+ },
204
+ always: {
205
+ guard: ({ context }) => !context.isAuthenticated,
206
+ target: "login",
207
+ },
208
+ },
209
+ },
210
+ };
211
+ export const authMachine = createMachine(formatPlayRouteTransitions(machineConfig));
212
+ //# sourceMappingURL=auth-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-machine.js","sourceRoot":"","sources":["../src/auth-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Component Catalog - Type-Safe UI Schema
3
+ *
4
+ * Defines component prop schemas using Zod for runtime validation.
5
+ * Used by definePlayer() for build-time type checking.
6
+ *
7
+ * Framework-agnostic: No framework imports — catalog is pure business logic.
8
+ * Shared across all demo applications.
9
+ */
10
+ import { z } from "zod";
11
+ /**
12
+ * Type-safe component catalog with Zod schemas
13
+ *
14
+ * defineCatalog() accepts record of component names to Zod schemas.
15
+ * Props are inferred by PlayRenderer for type-safe component rendering.
16
+ */
17
+ export declare const catalog: {
18
+ /**
19
+ * Home component
20
+ * Public landing page
21
+ */
22
+ Home: z.ZodObject<{
23
+ title: z.ZodString;
24
+ }, z.core.$strip>;
25
+ /**
26
+ * About component
27
+ * Public information page
28
+ */
29
+ About: z.ZodObject<{
30
+ title: z.ZodString;
31
+ }, z.core.$strip>;
32
+ /**
33
+ * Contact component
34
+ * Public contact page
35
+ */
36
+ Contact: z.ZodObject<{
37
+ title: z.ZodString;
38
+ }, z.core.$strip>;
39
+ /**
40
+ * Login component
41
+ * Login form page
42
+ */
43
+ Login: z.ZodObject<{
44
+ title: z.ZodString;
45
+ }, z.core.$strip>;
46
+ /**
47
+ * Dashboard component
48
+ * Protected dashboard page
49
+ */
50
+ Dashboard: z.ZodObject<{
51
+ welcome: z.ZodBoolean;
52
+ username: z.ZodString;
53
+ }, z.core.$strip>;
54
+ /**
55
+ * Profile component
56
+ * Protected user profile with username parameter
57
+ */
58
+ Profile: z.ZodObject<{
59
+ username: z.ZodString;
60
+ }, z.core.$strip>;
61
+ /**
62
+ * Settings component
63
+ * Protected settings page with optional section parameter
64
+ */
65
+ Settings: z.ZodObject<{
66
+ section: z.ZodOptional<z.ZodString>;
67
+ username: z.ZodString;
68
+ }, z.core.$strip>;
69
+ /**
70
+ * Register component
71
+ * Auth-only registration form
72
+ */
73
+ Register: z.ZodObject<{
74
+ title: z.ZodString;
75
+ }, z.core.$strip>;
76
+ /**
77
+ * Navigation component
78
+ * Displays all available routes categorized by access level
79
+ */
80
+ Navigation: z.ZodObject<{
81
+ isAuthenticated: z.ZodBoolean;
82
+ currentPath: z.ZodString;
83
+ }, z.core.$strip>;
84
+ };
85
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;GAKG;AACH,eAAO,MAAM,OAAO;IACnB;;;OAGG;;;;IAKH;;;OAGG;;;;IAKH;;;OAGG;;;;IAKH;;;OAGG;;;;IAKH;;;OAGG;;;;;IAMH;;;OAGG;;;;IAKH;;;OAGG;;;;;IAMH;;;OAGG;;;;IAKH;;;OAGG;;;;;CAKF,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Component Catalog - Type-Safe UI Schema
3
+ *
4
+ * Defines component prop schemas using Zod for runtime validation.
5
+ * Used by definePlayer() for build-time type checking.
6
+ *
7
+ * Framework-agnostic: No framework imports — catalog is pure business logic.
8
+ * Shared across all demo applications.
9
+ */
10
+ import { z } from "zod";
11
+ import { defineCatalog } from "@xmachines/play-catalog";
12
+ /**
13
+ * Type-safe component catalog with Zod schemas
14
+ *
15
+ * defineCatalog() accepts record of component names to Zod schemas.
16
+ * Props are inferred by PlayRenderer for type-safe component rendering.
17
+ */
18
+ export const catalog = defineCatalog({
19
+ /**
20
+ * Home component
21
+ * Public landing page
22
+ */
23
+ Home: z.object({
24
+ title: z.string(),
25
+ }),
26
+ /**
27
+ * About component
28
+ * Public information page
29
+ */
30
+ About: z.object({
31
+ title: z.string(),
32
+ }),
33
+ /**
34
+ * Contact component
35
+ * Public contact page
36
+ */
37
+ Contact: z.object({
38
+ title: z.string(),
39
+ }),
40
+ /**
41
+ * Login component
42
+ * Login form page
43
+ */
44
+ Login: z.object({
45
+ title: z.string(),
46
+ }),
47
+ /**
48
+ * Dashboard component
49
+ * Protected dashboard page
50
+ */
51
+ Dashboard: z.object({
52
+ welcome: z.boolean(),
53
+ username: z.string(),
54
+ }),
55
+ /**
56
+ * Profile component
57
+ * Protected user profile with username parameter
58
+ */
59
+ Profile: z.object({
60
+ username: z.string(),
61
+ }),
62
+ /**
63
+ * Settings component
64
+ * Protected settings page with optional section parameter
65
+ */
66
+ Settings: z.object({
67
+ section: z.string().optional(),
68
+ username: z.string(),
69
+ }),
70
+ /**
71
+ * Register component
72
+ * Auth-only registration form
73
+ */
74
+ Register: z.object({
75
+ title: z.string(),
76
+ }),
77
+ /**
78
+ * Navigation component
79
+ * Displays all available routes categorized by access level
80
+ */
81
+ Navigation: z.object({
82
+ isAuthenticated: z.boolean(),
83
+ currentPath: z.string(),
84
+ }),
85
+ });
86
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;IACpC;;;OAGG;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC;IAEF;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC;IAEF;;;OAGG;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC;IAEF;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC;IAEF;;;OAGG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;IAEF;;;OAGG;IACH,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;IAEF;;;OAGG;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;IAEF;;;OAGG;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC;IAEF;;;OAGG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;QAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { authMachine } from "./auth-machine.js";
2
+ export type { AuthEvents, AuthContext } from "./auth-machine.js";
3
+ export { catalog } from "./catalog.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { authMachine } from "./auth-machine.js";
2
+ export { catalog } from "./catalog.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@xmachines/play-router-shared",
3
+ "version": "1.0.0-beta.1",
4
+ "private": true,
5
+ "description": "Shared auth machine and catalog for @xmachines router adapter demos.",
6
+ "keywords": [
7
+ "auth",
8
+ "examples",
9
+ "xmachines"
10
+ ],
11
+ "license": "MIT",
12
+ "type": "module",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ },
18
+ "./index.css": "./src/index.css"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc --build",
22
+ "clean": "rm -rf dist *.tsbuildinfo"
23
+ },
24
+ "dependencies": {
25
+ "@xmachines/play-catalog": "1.0.0-beta.1",
26
+ "@xmachines/play-router": "1.0.0-beta.1",
27
+ "@xmachines/play-xstate": "1.0.0-beta.1"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^25.4.0",
31
+ "typescript": "^5.7.0",
32
+ "xstate": "^5.28.0"
33
+ },
34
+ "peerDependencies": {
35
+ "xstate": "^5.28.0"
36
+ }
37
+ }