@canmi/seam-react 0.4.4 → 0.4.10

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/README.md CHANGED
@@ -9,7 +9,7 @@ React bindings for SeamJS, providing hooks and components to consume server-inje
9
9
  | `defineRoutes` | Define client-side route configuration |
10
10
  | `useSeamData` | Access server-injected data from `SeamDataProvider` context |
11
11
  | `SeamDataProvider` | Context provider for server data |
12
- | `parseSeamData` | Parse JSON from `<script id="__SEAM_DATA__">` |
12
+ | `parseSeamData` | Parse JSON from `<script id="__data">` |
13
13
  | `buildSentinelData` | Build sentinel data for skeleton rendering |
14
14
  | `useSeamSubscription` | Hook for SSE subscriptions, returns `{ data, error, status }` |
15
15
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/define-routes.ts","../src/use-seam-data.ts","../src/sentinel.ts","../src/use-seam-subscription.ts","../src/use-seam-navigate.ts"],"mappings":";;;;;UAIiB,YAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,SAAA;EACf,SAAA;EACA,MAAA,GAAS,MAAA,SAAe,YAAA;AAAA;AAAA,UAGT,QAAA;EACf,IAAA;EACA,SAAA,GAAY,aAAA,CAAc,MAAA;EAC1B,MAAA,GAAS,aAAA;IAAgB,QAAA,EAAU,SAAA;EAAA;EACnC,QAAA,GAAW,QAAA;EACX,OAAA,GAAU,MAAA,SAAe,SAAA;EACzB,IAAA,GAAO,MAAA;EACP,QAAA;EACA,SAAA;AAAA;;;iBClBc,YAAA,CAAa,MAAA,EAAQ,QAAA,KAAa,QAAA;;;cCErC,gBAAA,EAA2C,KAAA,CAA3B,QAAA;AAAA,iBAEb,WAAA,oBAA+B,MAAA,kBAAA,CAAA,GAA4B,CAAA;AAAA,iBAO3D,aAAA,CAAc,MAAA,YAA2B,MAAA;;;;;;;;AFXzD;;;iBGMgB,iBAAA,CACd,GAAA,EAAK,MAAA,mBACL,MAAA,WACA,SAAA,GAAY,GAAA,WACX,MAAA;;;KCTS,kBAAA;AAAA,UAEK,yBAAA;EACf,IAAA,EAAM,CAAA;EACN,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,kBAAA;AAAA;AAAA,iBAGM,mBAAA,GAAA,CACd,OAAA,UACA,SAAA,UACA,KAAA,YACC,yBAAA,CAA0B,CAAA;;;cCThB,oBAAA,EAAmD,KAAA,CAA/B,QAAA,EAAA,GAAA;AAAA,iBAEjB,eAAA,CAAA,IAAoB,GAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/define-routes.ts","../src/use-seam-data.ts","../src/sentinel.ts","../src/use-seam-subscription.ts","../src/use-seam-navigate.ts"],"mappings":";;;;;UAIiB,YAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,SAAA;EACf,SAAA;EACA,MAAA,GAAS,MAAA,SAAe,YAAA;AAAA;AAAA,UAGT,QAAA;EACf,IAAA;EACA,SAAA,GAAY,aAAA,CAAc,MAAA;EAC1B,MAAA,GAAS,aAAA;IAAgB,QAAA,EAAU,SAAA;EAAA;EACnC,QAAA,GAAW,QAAA;EACX,OAAA,GAAU,MAAA,SAAe,SAAA;EACzB,IAAA,GAAO,MAAA;EACP,QAAA;EACA,SAAA;AAAA;;;iBClBc,YAAA,CAAa,MAAA,EAAQ,QAAA,KAAa,QAAA;;;cCErC,gBAAA,EAA2C,KAAA,CAA3B,QAAA;AAAA,iBAEb,WAAA,oBAA+B,MAAA,kBAAA,CAAA,GAA4B,CAAA;AAAA,iBAO3D,aAAA,CAAc,MAAA,YAAoB,MAAA;;;;;;;;AFXlD;;;iBGMgB,iBAAA,CACd,GAAA,EAAK,MAAA,mBACL,MAAA,WACA,SAAA,GAAY,GAAA,WACX,MAAA;;;KCTS,kBAAA;AAAA,UAEK,yBAAA;EACf,IAAA,EAAM,CAAA;EACN,KAAA,EAAO,eAAA;EACP,MAAA,EAAQ,kBAAA;AAAA;AAAA,iBAGM,mBAAA,GAAA,CACd,OAAA,UACA,SAAA,UACA,KAAA,YACC,yBAAA,CAA0B,CAAA;;;cCThB,oBAAA,EAAmD,KAAA,CAA/B,QAAA,EAAA,GAAA;AAAA,iBAEjB,eAAA,CAAA,IAAoB,GAAA"}
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ function useSeamData() {
15
15
  if (value === null || value === void 0) throw new Error("useSeamData must be used inside <SeamDataProvider>");
16
16
  return value;
17
17
  }
18
- function parseSeamData(dataId = "__SEAM_DATA__") {
18
+ function parseSeamData(dataId = "__data") {
19
19
  const el = document.getElementById(dataId);
20
20
  if (!el?.textContent) throw new Error(`${dataId} not found`);
21
21
  return JSON.parse(el.textContent);
@@ -55,7 +55,7 @@ function useSeamSubscription(baseUrl, procedure, input) {
55
55
  setData(null);
56
56
  setError(null);
57
57
  setStatus("connecting");
58
- const url = `${baseUrl.replace(/\/+$/, "")}/_seam/subscribe/${procedure}?${new URLSearchParams({ input: inputKey }).toString()}`;
58
+ const url = `${baseUrl.replace(/\/+$/, "")}/_seam/procedure/${procedure}?${new URLSearchParams({ input: inputKey }).toString()}`;
59
59
  const es = new EventSource(url);
60
60
  es.addEventListener("data", (e) => {
61
61
  try {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/define-routes.ts","../src/use-seam-data.ts","../src/sentinel.ts","../src/use-seam-subscription.ts","../src/use-seam-navigate.ts"],"sourcesContent":["/* packages/client/react/src/define-routes.ts */\n\nimport type { RouteDef } from \"./types.js\";\n\nexport function defineRoutes(routes: RouteDef[]): RouteDef[] {\n return routes;\n}\n","/* packages/client/react/src/use-seam-data.ts */\n\nimport { createContext, useContext } from \"react\";\n\nconst SeamDataContext = createContext<unknown>(null);\n\nexport const SeamDataProvider = SeamDataContext.Provider;\n\nexport function useSeamData<T extends object = Record<string, unknown>>(): T {\n const value = useContext(SeamDataContext);\n if (value === null || value === undefined)\n throw new Error(\"useSeamData must be used inside <SeamDataProvider>\");\n return value as T;\n}\n\nexport function parseSeamData(dataId = \"__SEAM_DATA__\"): Record<string, unknown> {\n const el = document.getElementById(dataId);\n if (!el?.textContent) throw new Error(`${dataId} not found`);\n return JSON.parse(el.textContent) as Record<string, unknown>;\n}\n","/* packages/client/react/src/sentinel.ts */\n\n/**\n * Replace every leaf value in `obj` with a sentinel string `%%SEAM:dotted.path%%`.\n * Nested objects are recursed; primitives and null become leaf sentinels.\n *\n * Arrays of objects (length > 0, first element is object) produce a 1-element\n * sentinel array where each leaf in the object template uses `$.` path prefix.\n * Arrays of primitives, empty arrays, and null remain leaf sentinels.\n */\nexport function buildSentinelData(\n obj: Record<string, unknown>,\n prefix = \"\",\n htmlPaths?: Set<string>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n result[key] = buildSentinelData(value as Record<string, unknown>, path, htmlPaths);\n } else if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === \"object\" &&\n value[0] !== null\n ) {\n // Array of objects: produce 1-element sentinel array with $.field paths\n result[key] = [\n buildSentinelData(value[0] as Record<string, unknown>, `${path}.$`, htmlPaths),\n ];\n } else {\n const suffix = htmlPaths?.has(path) ? \":html\" : \"\";\n result[key] = `%%SEAM:${path}${suffix}%%`;\n }\n }\n return result;\n}\n","/* packages/client/react/src/use-seam-subscription.ts */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { SeamClientError } from \"@canmi/seam-client\";\n\nexport type SubscriptionStatus = \"connecting\" | \"active\" | \"error\" | \"closed\";\n\nexport interface UseSeamSubscriptionResult<T> {\n data: T | null;\n error: SeamClientError | null;\n status: SubscriptionStatus;\n}\n\nexport function useSeamSubscription<T>(\n baseUrl: string,\n procedure: string,\n input: unknown,\n): UseSeamSubscriptionResult<T> {\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<SeamClientError | null>(null);\n const [status, setStatus] = useState<SubscriptionStatus>(\"connecting\");\n\n // Serialize input for stable dependency\n const inputKey = JSON.stringify(input);\n const inputRef = useRef(inputKey);\n inputRef.current = inputKey;\n\n useEffect(() => {\n setData(null);\n setError(null);\n setStatus(\"connecting\");\n\n const cleanBase = baseUrl.replace(/\\/+$/, \"\");\n const params = new URLSearchParams({ input: inputKey });\n const url = `${cleanBase}/_seam/subscribe/${procedure}?${params.toString()}`;\n const es = new EventSource(url);\n\n es.addEventListener(\"data\", (e) => {\n try {\n setData(JSON.parse(e.data as string) as T);\n setStatus(\"active\");\n } catch {\n setError(new SeamClientError(\"INTERNAL_ERROR\", \"Failed to parse SSE data\", 0));\n setStatus(\"error\");\n es.close();\n }\n });\n\n es.addEventListener(\"error\", (e) => {\n if (e instanceof MessageEvent) {\n try {\n const payload = JSON.parse(e.data as string) as { code?: string; message?: string };\n setError(\n new SeamClientError(\n \"INTERNAL_ERROR\",\n typeof payload.message === \"string\" ? payload.message : \"SSE error\",\n 0,\n ),\n );\n } catch {\n setError(new SeamClientError(\"INTERNAL_ERROR\", \"SSE error\", 0));\n }\n } else {\n setError(new SeamClientError(\"INTERNAL_ERROR\", \"SSE connection error\", 0));\n }\n setStatus(\"error\");\n es.close();\n });\n\n es.addEventListener(\"complete\", () => {\n setStatus(\"closed\");\n es.close();\n });\n\n return () => {\n es.close();\n };\n }, [baseUrl, procedure, inputKey]);\n\n return { data, error, status };\n}\n","/* packages/client/react/src/use-seam-navigate.ts */\n\nimport { createContext, useContext } from \"react\";\n\nconst SeamNavigateContext = createContext<(url: string) => void>((url) => {\n globalThis.location.href = url;\n});\n\nexport const SeamNavigateProvider = SeamNavigateContext.Provider;\n\nexport function useSeamNavigate(): (url: string) => void {\n return useContext(SeamNavigateContext);\n}\n"],"mappings":";;;;AAIA,SAAgB,aAAa,QAAgC;AAC3D,QAAO;;;;;ACDT,MAAM,kBAAkB,cAAuB,KAAK;AAEpD,MAAa,mBAAmB,gBAAgB;AAEhD,SAAgB,cAA6D;CAC3E,MAAM,QAAQ,WAAW,gBAAgB;AACzC,KAAI,UAAU,QAAQ,UAAU,OAC9B,OAAM,IAAI,MAAM,qDAAqD;AACvE,QAAO;;AAGT,SAAgB,cAAc,SAAS,iBAA0C;CAC/E,MAAM,KAAK,SAAS,eAAe,OAAO;AAC1C,KAAI,CAAC,IAAI,YAAa,OAAM,IAAI,MAAM,GAAG,OAAO,YAAY;AAC5D,QAAO,KAAK,MAAM,GAAG,YAAY;;;;;;;;;;;;;ACRnC,SAAgB,kBACd,KACA,SAAS,IACT,WACyB;CACzB,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,EAAE;EAC9C,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,QAAQ;AAC3C,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,CACtE,QAAO,OAAO,kBAAkB,OAAkC,MAAM,UAAU;WAElF,MAAM,QAAQ,MAAM,IACpB,MAAM,SAAS,KACf,OAAO,MAAM,OAAO,YACpB,MAAM,OAAO,KAGb,QAAO,OAAO,CACZ,kBAAkB,MAAM,IAA+B,GAAG,KAAK,KAAK,UAAU,CAC/E;MAGD,QAAO,OAAO,UAAU,OADT,WAAW,IAAI,KAAK,GAAG,UAAU,GACV;;AAG1C,QAAO;;;;;ACtBT,SAAgB,oBACd,SACA,WACA,OAC8B;CAC9B,MAAM,CAAC,MAAM,WAAW,SAAmB,KAAK;CAChD,MAAM,CAAC,OAAO,YAAY,SAAiC,KAAK;CAChE,MAAM,CAAC,QAAQ,aAAa,SAA6B,aAAa;CAGtE,MAAM,WAAW,KAAK,UAAU,MAAM;CACtC,MAAM,WAAW,OAAO,SAAS;AACjC,UAAS,UAAU;AAEnB,iBAAgB;AACd,UAAQ,KAAK;AACb,WAAS,KAAK;AACd,YAAU,aAAa;EAIvB,MAAM,MAAM,GAFM,QAAQ,QAAQ,QAAQ,GAAG,CAEpB,mBAAmB,UAAU,GADvC,IAAI,gBAAgB,EAAE,OAAO,UAAU,CAAC,CACS,UAAU;EAC1E,MAAM,KAAK,IAAI,YAAY,IAAI;AAE/B,KAAG,iBAAiB,SAAS,MAAM;AACjC,OAAI;AACF,YAAQ,KAAK,MAAM,EAAE,KAAe,CAAM;AAC1C,cAAU,SAAS;WACb;AACN,aAAS,IAAI,gBAAgB,kBAAkB,4BAA4B,EAAE,CAAC;AAC9E,cAAU,QAAQ;AAClB,OAAG,OAAO;;IAEZ;AAEF,KAAG,iBAAiB,UAAU,MAAM;AAClC,OAAI,aAAa,aACf,KAAI;IACF,MAAM,UAAU,KAAK,MAAM,EAAE,KAAe;AAC5C,aACE,IAAI,gBACF,kBACA,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU,aACxD,EACD,CACF;WACK;AACN,aAAS,IAAI,gBAAgB,kBAAkB,aAAa,EAAE,CAAC;;OAGjE,UAAS,IAAI,gBAAgB,kBAAkB,wBAAwB,EAAE,CAAC;AAE5E,aAAU,QAAQ;AAClB,MAAG,OAAO;IACV;AAEF,KAAG,iBAAiB,kBAAkB;AACpC,aAAU,SAAS;AACnB,MAAG,OAAO;IACV;AAEF,eAAa;AACX,MAAG,OAAO;;IAEX;EAAC;EAAS;EAAW;EAAS,CAAC;AAElC,QAAO;EAAE;EAAM;EAAO;EAAQ;;;;;AC3EhC,MAAM,sBAAsB,eAAsC,QAAQ;AACxE,YAAW,SAAS,OAAO;EAC3B;AAEF,MAAa,uBAAuB,oBAAoB;AAExD,SAAgB,kBAAyC;AACvD,QAAO,WAAW,oBAAoB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/define-routes.ts","../src/use-seam-data.ts","../src/sentinel.ts","../src/use-seam-subscription.ts","../src/use-seam-navigate.ts"],"sourcesContent":["/* src/client/react/src/define-routes.ts */\n\nimport type { RouteDef } from \"./types.js\";\n\nexport function defineRoutes(routes: RouteDef[]): RouteDef[] {\n return routes;\n}\n","/* src/client/react/src/use-seam-data.ts */\n\nimport { createContext, useContext } from \"react\";\n\nconst SeamDataContext = createContext<unknown>(null);\n\nexport const SeamDataProvider = SeamDataContext.Provider;\n\nexport function useSeamData<T extends object = Record<string, unknown>>(): T {\n const value = useContext(SeamDataContext);\n if (value === null || value === undefined)\n throw new Error(\"useSeamData must be used inside <SeamDataProvider>\");\n return value as T;\n}\n\nexport function parseSeamData(dataId = \"__data\"): Record<string, unknown> {\n const el = document.getElementById(dataId);\n if (!el?.textContent) throw new Error(`${dataId} not found`);\n return JSON.parse(el.textContent) as Record<string, unknown>;\n}\n","/* src/client/react/src/sentinel.ts */\n\n/**\n * Replace every leaf value in `obj` with a sentinel string `%%SEAM:dotted.path%%`.\n * Nested objects are recursed; primitives and null become leaf sentinels.\n *\n * Arrays of objects (length > 0, first element is object) produce a 1-element\n * sentinel array where each leaf in the object template uses `$.` path prefix.\n * Arrays of primitives, empty arrays, and null remain leaf sentinels.\n */\nexport function buildSentinelData(\n obj: Record<string, unknown>,\n prefix = \"\",\n htmlPaths?: Set<string>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n result[key] = buildSentinelData(value as Record<string, unknown>, path, htmlPaths);\n } else if (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === \"object\" &&\n value[0] !== null\n ) {\n // Array of objects: produce 1-element sentinel array with $.field paths\n result[key] = [\n buildSentinelData(value[0] as Record<string, unknown>, `${path}.$`, htmlPaths),\n ];\n } else {\n const suffix = htmlPaths?.has(path) ? \":html\" : \"\";\n result[key] = `%%SEAM:${path}${suffix}%%`;\n }\n }\n return result;\n}\n","/* src/client/react/src/use-seam-subscription.ts */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { SeamClientError } from \"@canmi/seam-client\";\n\nexport type SubscriptionStatus = \"connecting\" | \"active\" | \"error\" | \"closed\";\n\nexport interface UseSeamSubscriptionResult<T> {\n data: T | null;\n error: SeamClientError | null;\n status: SubscriptionStatus;\n}\n\nexport function useSeamSubscription<T>(\n baseUrl: string,\n procedure: string,\n input: unknown,\n): UseSeamSubscriptionResult<T> {\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<SeamClientError | null>(null);\n const [status, setStatus] = useState<SubscriptionStatus>(\"connecting\");\n\n // Serialize input for stable dependency\n const inputKey = JSON.stringify(input);\n const inputRef = useRef(inputKey);\n inputRef.current = inputKey;\n\n useEffect(() => {\n setData(null);\n setError(null);\n setStatus(\"connecting\");\n\n const cleanBase = baseUrl.replace(/\\/+$/, \"\");\n const params = new URLSearchParams({ input: inputKey });\n const url = `${cleanBase}/_seam/procedure/${procedure}?${params.toString()}`;\n const es = new EventSource(url);\n\n es.addEventListener(\"data\", (e) => {\n try {\n setData(JSON.parse(e.data as string) as T);\n setStatus(\"active\");\n } catch {\n setError(new SeamClientError(\"INTERNAL_ERROR\", \"Failed to parse SSE data\", 0));\n setStatus(\"error\");\n es.close();\n }\n });\n\n es.addEventListener(\"error\", (e) => {\n if (e instanceof MessageEvent) {\n try {\n const payload = JSON.parse(e.data as string) as { code?: string; message?: string };\n setError(\n new SeamClientError(\n \"INTERNAL_ERROR\",\n typeof payload.message === \"string\" ? payload.message : \"SSE error\",\n 0,\n ),\n );\n } catch {\n setError(new SeamClientError(\"INTERNAL_ERROR\", \"SSE error\", 0));\n }\n } else {\n setError(new SeamClientError(\"INTERNAL_ERROR\", \"SSE connection error\", 0));\n }\n setStatus(\"error\");\n es.close();\n });\n\n es.addEventListener(\"complete\", () => {\n setStatus(\"closed\");\n es.close();\n });\n\n return () => {\n es.close();\n };\n }, [baseUrl, procedure, inputKey]);\n\n return { data, error, status };\n}\n","/* src/client/react/src/use-seam-navigate.ts */\n\nimport { createContext, useContext } from \"react\";\n\nconst SeamNavigateContext = createContext<(url: string) => void>((url) => {\n globalThis.location.href = url;\n});\n\nexport const SeamNavigateProvider = SeamNavigateContext.Provider;\n\nexport function useSeamNavigate(): (url: string) => void {\n return useContext(SeamNavigateContext);\n}\n"],"mappings":";;;;AAIA,SAAgB,aAAa,QAAgC;AAC3D,QAAO;;;;;ACDT,MAAM,kBAAkB,cAAuB,KAAK;AAEpD,MAAa,mBAAmB,gBAAgB;AAEhD,SAAgB,cAA6D;CAC3E,MAAM,QAAQ,WAAW,gBAAgB;AACzC,KAAI,UAAU,QAAQ,UAAU,OAC9B,OAAM,IAAI,MAAM,qDAAqD;AACvE,QAAO;;AAGT,SAAgB,cAAc,SAAS,UAAmC;CACxE,MAAM,KAAK,SAAS,eAAe,OAAO;AAC1C,KAAI,CAAC,IAAI,YAAa,OAAM,IAAI,MAAM,GAAG,OAAO,YAAY;AAC5D,QAAO,KAAK,MAAM,GAAG,YAAY;;;;;;;;;;;;;ACRnC,SAAgB,kBACd,KACA,SAAS,IACT,WACyB;CACzB,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,EAAE;EAC9C,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,QAAQ;AAC3C,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,CACtE,QAAO,OAAO,kBAAkB,OAAkC,MAAM,UAAU;WAElF,MAAM,QAAQ,MAAM,IACpB,MAAM,SAAS,KACf,OAAO,MAAM,OAAO,YACpB,MAAM,OAAO,KAGb,QAAO,OAAO,CACZ,kBAAkB,MAAM,IAA+B,GAAG,KAAK,KAAK,UAAU,CAC/E;MAGD,QAAO,OAAO,UAAU,OADT,WAAW,IAAI,KAAK,GAAG,UAAU,GACV;;AAG1C,QAAO;;;;;ACtBT,SAAgB,oBACd,SACA,WACA,OAC8B;CAC9B,MAAM,CAAC,MAAM,WAAW,SAAmB,KAAK;CAChD,MAAM,CAAC,OAAO,YAAY,SAAiC,KAAK;CAChE,MAAM,CAAC,QAAQ,aAAa,SAA6B,aAAa;CAGtE,MAAM,WAAW,KAAK,UAAU,MAAM;CACtC,MAAM,WAAW,OAAO,SAAS;AACjC,UAAS,UAAU;AAEnB,iBAAgB;AACd,UAAQ,KAAK;AACb,WAAS,KAAK;AACd,YAAU,aAAa;EAIvB,MAAM,MAAM,GAFM,QAAQ,QAAQ,QAAQ,GAAG,CAEpB,mBAAmB,UAAU,GADvC,IAAI,gBAAgB,EAAE,OAAO,UAAU,CAAC,CACS,UAAU;EAC1E,MAAM,KAAK,IAAI,YAAY,IAAI;AAE/B,KAAG,iBAAiB,SAAS,MAAM;AACjC,OAAI;AACF,YAAQ,KAAK,MAAM,EAAE,KAAe,CAAM;AAC1C,cAAU,SAAS;WACb;AACN,aAAS,IAAI,gBAAgB,kBAAkB,4BAA4B,EAAE,CAAC;AAC9E,cAAU,QAAQ;AAClB,OAAG,OAAO;;IAEZ;AAEF,KAAG,iBAAiB,UAAU,MAAM;AAClC,OAAI,aAAa,aACf,KAAI;IACF,MAAM,UAAU,KAAK,MAAM,EAAE,KAAe;AAC5C,aACE,IAAI,gBACF,kBACA,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU,aACxD,EACD,CACF;WACK;AACN,aAAS,IAAI,gBAAgB,kBAAkB,aAAa,EAAE,CAAC;;OAGjE,UAAS,IAAI,gBAAgB,kBAAkB,wBAAwB,EAAE,CAAC;AAE5E,aAAU,QAAQ;AAClB,MAAG,OAAO;IACV;AAEF,KAAG,iBAAiB,kBAAkB;AACpC,aAAU,SAAS;AACnB,MAAG,OAAO;IACV;AAEF,eAAa;AACX,MAAG,OAAO;;IAEX;EAAC;EAAS;EAAW;EAAS,CAAC;AAElC,QAAO;EAAE;EAAM;EAAO;EAAQ;;;;;AC3EhC,MAAM,sBAAsB,eAAsC,QAAQ;AACxE,YAAW,SAAS,OAAO;EAC3B;AAEF,MAAa,uBAAuB,oBAAoB;AAExD,SAAgB,kBAAyC;AACvD,QAAO,WAAW,oBAAoB"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@canmi/seam-react",
3
- "version": "0.4.4",
3
+ "version": "0.4.10",
4
+ "license": "MIT",
4
5
  "files": [
5
6
  "dist",
6
7
  "scripts"
@@ -17,20 +18,20 @@
17
18
  "test": "vitest run"
18
19
  },
19
20
  "dependencies": {
20
- "@canmi/seam-client": "0.4.4",
21
- "esbuild": "^0.25.0"
21
+ "@canmi/seam-client": "0.4.10",
22
+ "esbuild": "^0.27.3"
22
23
  },
23
24
  "devDependencies": {
24
- "@canmi/seam-engine": "0.4.4",
25
- "@canmi/seam-i18n": "0.4.4",
26
- "@types/react": "^19.0.0",
27
- "@types/react-dom": "^19.0.0",
25
+ "@canmi/seam-engine": "0.4.10",
26
+ "@canmi/seam-i18n": "0.4.10",
27
+ "@types/react": "^19.2.14",
28
+ "@types/react-dom": "^19.2.3",
28
29
  "jsdom": "^28.1.0",
29
- "react": "^19.0.0",
30
- "react-dom": "^19.0.0",
31
- "tsdown": "^0.20.0",
32
- "typescript": "^5.7.0",
33
- "vitest": "^3.0.0"
30
+ "react": "^19.2.4",
31
+ "react-dom": "^19.2.4",
32
+ "tsdown": "^0.20.3",
33
+ "typescript": "^5.9.3",
34
+ "vitest": "^4.0.18"
34
35
  },
35
36
  "peerDependencies": {
36
37
  "react": "^18.0.0 || ^19.0.0",
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/build-skeletons.mjs */
1
+ /* src/client/react/scripts/build-skeletons.mjs */
2
2
 
3
3
  import { build } from "esbuild";
4
4
  import { readFileSync, mkdirSync, unlinkSync } from "node:fs";
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/mock-generator.mjs */
1
+ /* src/client/react/scripts/mock-generator.mjs */
2
2
 
3
3
  /**
4
4
  * Auto-generate deterministic mock data from JTD schema.
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/skeleton/cache.mjs */
1
+ /* src/client/react/scripts/skeleton/cache.mjs */
2
2
 
3
3
  import { build } from "esbuild";
4
4
  import { createHash } from "node:crypto";
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/skeleton/layout.mjs */
1
+ /* src/client/react/scripts/skeleton/layout.mjs */
2
2
 
3
3
  import { createElement } from "react";
4
4
  import { buildSentinelData } from "@canmi/seam-react";
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/skeleton/process.mjs */
1
+ /* src/client/react/scripts/skeleton/process.mjs */
2
2
 
3
3
  import { buildI18nValue, computeCacheKey, pathToSlug, readCache, writeCache } from "./cache.mjs";
4
4
  import { renderLayout } from "./layout.mjs";
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/skeleton/render.mjs */
1
+ /* src/client/react/scripts/skeleton/render.mjs */
2
2
 
3
3
  import { createElement } from "react";
4
4
  import { renderToString } from "react-dom/server";
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/skeleton/schema.mjs */
1
+ /* src/client/react/scripts/skeleton/schema.mjs */
2
2
 
3
3
  import { buildSentinelData } from "@canmi/seam-react";
4
4
  import {
@@ -1,4 +1,4 @@
1
- /* packages/client/react/scripts/variant-generator.mjs */
1
+ /* src/client/react/scripts/variant-generator.mjs */
2
2
 
3
3
  /**
4
4
  * Walk a JTD schema + mock data to discover all structural axes.