@contractspec/lib.example-shared-ui 6.0.16 → 6.0.18

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 (86) hide show
  1. package/.turbo/turbo-build.log +81 -81
  2. package/CHANGELOG.md +32 -0
  3. package/dist/EvolutionDashboard.js +1 -803
  4. package/dist/EvolutionSidebar.js +1 -531
  5. package/dist/LocalDataIndicator.js +1 -62
  6. package/dist/MarkdownView.js +1 -207
  7. package/dist/OverlayContextProvider.js +1 -202
  8. package/dist/PersonalizationInsights.js +1 -455
  9. package/dist/SaveToStudioButton.js +1 -73
  10. package/dist/SpecDrivenTemplateShell.js +1 -197
  11. package/dist/SpecEditorPanel.js +17 -358
  12. package/dist/TemplateShell.js +1 -189
  13. package/dist/browser/EvolutionDashboard.js +1 -803
  14. package/dist/browser/EvolutionSidebar.js +1 -531
  15. package/dist/browser/LocalDataIndicator.js +1 -62
  16. package/dist/browser/MarkdownView.js +1 -207
  17. package/dist/browser/OverlayContextProvider.js +1 -202
  18. package/dist/browser/PersonalizationInsights.js +1 -455
  19. package/dist/browser/SaveToStudioButton.js +1 -73
  20. package/dist/browser/SpecDrivenTemplateShell.js +1 -197
  21. package/dist/browser/SpecEditorPanel.js +17 -358
  22. package/dist/browser/TemplateShell.js +1 -189
  23. package/dist/browser/bundles/ExampleTemplateBundle.js +1 -85
  24. package/dist/browser/bundles/index.js +1 -85
  25. package/dist/browser/hooks/index.js +40 -1145
  26. package/dist/browser/hooks/useBehaviorTracking.js +1 -157
  27. package/dist/browser/hooks/useEvolution.js +1 -260
  28. package/dist/browser/hooks/useRegistryTemplates.js +1 -31
  29. package/dist/browser/hooks/useSpecContent.js +17 -218
  30. package/dist/browser/hooks/useWorkflowComposer.js +24 -483
  31. package/dist/browser/index.js +40 -3110
  32. package/dist/browser/lib/component-registry.js +1 -42
  33. package/dist/browser/lib/runtime-context.js +1 -15
  34. package/dist/browser/markdown/formatPresentationName.js +1 -9
  35. package/dist/browser/markdown/useMarkdownPresentation.js +1 -65
  36. package/dist/browser/utils/fetchPresentationData.js +1 -15
  37. package/dist/browser/utils/generateSpecFromTemplate.js +16 -62
  38. package/dist/browser/utils/index.js +16 -76
  39. package/dist/bundles/ExampleTemplateBundle.js +1 -85
  40. package/dist/bundles/index.js +1 -85
  41. package/dist/hooks/index.js +40 -1145
  42. package/dist/hooks/useBehaviorTracking.js +1 -157
  43. package/dist/hooks/useEvolution.js +1 -260
  44. package/dist/hooks/useRegistryTemplates.js +1 -31
  45. package/dist/hooks/useSpecContent.js +17 -218
  46. package/dist/hooks/useWorkflowComposer.js +24 -483
  47. package/dist/index.js +40 -3110
  48. package/dist/lib/component-registry.js +1 -42
  49. package/dist/lib/runtime-context.d.ts +2 -1
  50. package/dist/lib/runtime-context.js +1 -15
  51. package/dist/lib/singletons.test.d.ts +1 -0
  52. package/dist/markdown/formatPresentationName.js +1 -9
  53. package/dist/markdown/useMarkdownPresentation.js +1 -65
  54. package/dist/node/EvolutionDashboard.js +1 -803
  55. package/dist/node/EvolutionSidebar.js +1 -531
  56. package/dist/node/LocalDataIndicator.js +1 -62
  57. package/dist/node/MarkdownView.js +1 -207
  58. package/dist/node/OverlayContextProvider.js +1 -202
  59. package/dist/node/PersonalizationInsights.js +1 -455
  60. package/dist/node/SaveToStudioButton.js +1 -73
  61. package/dist/node/SpecDrivenTemplateShell.js +1 -197
  62. package/dist/node/SpecEditorPanel.js +17 -358
  63. package/dist/node/TemplateShell.js +1 -189
  64. package/dist/node/bundles/ExampleTemplateBundle.js +1 -85
  65. package/dist/node/bundles/index.js +1 -85
  66. package/dist/node/hooks/index.js +40 -1145
  67. package/dist/node/hooks/useBehaviorTracking.js +1 -157
  68. package/dist/node/hooks/useEvolution.js +1 -260
  69. package/dist/node/hooks/useRegistryTemplates.js +1 -31
  70. package/dist/node/hooks/useSpecContent.js +17 -218
  71. package/dist/node/hooks/useWorkflowComposer.js +24 -483
  72. package/dist/node/index.js +40 -3110
  73. package/dist/node/lib/component-registry.js +1 -42
  74. package/dist/node/lib/runtime-context.js +1 -15
  75. package/dist/node/markdown/formatPresentationName.js +1 -9
  76. package/dist/node/markdown/useMarkdownPresentation.js +1 -65
  77. package/dist/node/utils/fetchPresentationData.js +1 -15
  78. package/dist/node/utils/generateSpecFromTemplate.js +16 -62
  79. package/dist/node/utils/index.js +16 -76
  80. package/dist/utils/fetchPresentationData.js +1 -15
  81. package/dist/utils/generateSpecFromTemplate.js +16 -62
  82. package/dist/utils/index.js +16 -76
  83. package/package.json +14 -14
  84. package/src/lib/component-registry.tsx +16 -1
  85. package/src/lib/runtime-context.tsx +17 -3
  86. package/src/lib/singletons.test.ts +51 -0
@@ -1,30 +1,6 @@
1
1
  // @bun
2
- // src/utils/generateSpecFromTemplate.ts
3
- function generateSpecFromTemplate(template) {
4
- const templateId = template?.id ?? "unknown";
5
- if (!template) {
6
- return generateDefaultSpec(templateId);
7
- }
8
- switch (templateId) {
9
- case "crm-pipeline":
10
- return generateCrmPipelineSpec(template.schema.contracts);
11
- case "saas-boilerplate":
12
- return generateSaasBoilerplateSpec(template.schema.contracts);
13
- case "agent-console":
14
- return generateAgentConsoleSpec(template.schema.contracts);
15
- case "todos-app":
16
- return generateTodosSpec(template.schema.contracts);
17
- case "messaging-app":
18
- return generateMessagingSpec(template.schema.contracts);
19
- case "recipe-app-i18n":
20
- return generateRecipeSpec(template.schema.contracts);
21
- default:
22
- return generateDefaultSpec(templateId);
23
- }
24
- }
25
- function generateCrmPipelineSpec(contracts) {
26
- return `// CRM Pipeline Specs
27
- // Contracts: ${contracts.join(", ")}
2
+ function G(x){let b=x?.id??"unknown";if(!x)return j(b);switch(b){case"crm-pipeline":return q(x.schema.contracts);case"saas-boilerplate":return v(x.schema.contracts);case"agent-console":return y(x.schema.contracts);case"todos-app":return z(x.schema.contracts);case"messaging-app":return E(x.schema.contracts);case"recipe-app-i18n":return F(x.schema.contracts);default:return j(b)}}function q(x){return`// CRM Pipeline Specs
3
+ // Contracts: ${x.join(", ")}
28
4
 
29
5
  contractSpec("crm.deal.updateStage.v1", {
30
6
  goal: "Move a deal to a different pipeline stage",
@@ -93,11 +69,8 @@ contractSpec("crm.contact.list.v1", {
93
69
  hasMore: "boolean"
94
70
  }
95
71
  }
96
- });`;
97
- }
98
- function generateSaasBoilerplateSpec(contracts) {
99
- return `// SaaS Boilerplate Specs
100
- // Contracts: ${contracts.join(", ")}
72
+ });`}function v(x){return`// SaaS Boilerplate Specs
73
+ // Contracts: ${x.join(", ")}
101
74
 
102
75
  contractSpec("saas.project.create.v1", {
103
76
  goal: "Create a new project in an organization",
@@ -160,11 +133,8 @@ contractSpec("saas.settings.update.v1", {
160
133
  }
161
134
  },
162
135
  events: ["settings.updated"]
163
- });`;
164
- }
165
- function generateAgentConsoleSpec(contracts) {
166
- return `// Agent Console Specs
167
- // Contracts: ${contracts.join(", ")}
136
+ });`}function y(x){return`// Agent Console Specs
137
+ // Contracts: ${x.join(", ")}
168
138
 
169
139
  contractSpec("agent.run.execute.v1", {
170
140
  goal: "Execute an agent run with specified tools",
@@ -230,11 +200,8 @@ contractSpec("agent.agent.create.v1", {
230
200
  }
231
201
  },
232
202
  events: ["agent.created"]
233
- });`;
234
- }
235
- function generateTodosSpec(contracts) {
236
- return `// To-dos App Specs
237
- // Contracts: ${contracts.join(", ")}
203
+ });`}function z(x){return`// To-dos App Specs
204
+ // Contracts: ${x.join(", ")}
238
205
 
239
206
  contractSpec("tasks.board.v1", {
240
207
  goal: "Assign and approve craft work",
@@ -293,11 +260,8 @@ contractSpec("tasks.complete.v1", {
293
260
  }
294
261
  },
295
262
  events: ["task.completed"]
296
- });`;
297
- }
298
- function generateMessagingSpec(contracts) {
299
- return `// Messaging App Specs
300
- // Contracts: ${contracts.join(", ")}
263
+ });`}function E(x){return`// Messaging App Specs
264
+ // Contracts: ${x.join(", ")}
301
265
 
302
266
  contractSpec("messaging.send.v1", {
303
267
  goal: "Deliver intent-rich updates",
@@ -350,11 +314,8 @@ contractSpec("messaging.read.v1", {
350
314
  }
351
315
  },
352
316
  events: ["message.read"]
353
- });`;
354
- }
355
- function generateRecipeSpec(contracts) {
356
- return `// Recipe App (i18n) Specs
357
- // Contracts: ${contracts.join(", ")}
317
+ });`}function F(x){return`// Recipe App (i18n) Specs
318
+ // Contracts: ${x.join(", ")}
358
319
 
359
320
  contractSpec("recipes.lookup.v1", {
360
321
  goal: "Serve bilingual rituals",
@@ -401,13 +362,10 @@ contractSpec("recipes.favorite.toggle.v1", {
401
362
  }
402
363
  },
403
364
  events: ["recipe.favorited", "recipe.unfavorited"]
404
- });`;
405
- }
406
- function generateDefaultSpec(templateId) {
407
- return `// ${templateId} Specs
365
+ });`}function j(x){return`// ${x} Specs
408
366
 
409
- contractSpec("${templateId}.main.v1", {
410
- goal: "Main operation for ${templateId}",
367
+ contractSpec("${x}.main.v1", {
368
+ goal: "Main operation for ${x}",
411
369
  transport: { gql: { query: "main" } },
412
370
  io: {
413
371
  input: {
@@ -417,22 +375,4 @@ contractSpec("${templateId}.main.v1", {
417
375
  result: "unknown"
418
376
  }
419
377
  }
420
- });`;
421
- }
422
-
423
- // src/utils/fetchPresentationData.ts
424
- async function fetchPresentationData(_presentationName, _templateId) {
425
- throw new Error("fetchPresentationData is deprecated. Use fetchData from TemplateRuntimeContext.");
426
- }
427
- function hasPresentationDataFetcher(_presentationName) {
428
- return false;
429
- }
430
- function getRegisteredPresentationFetchers() {
431
- return [];
432
- }
433
- export {
434
- hasPresentationDataFetcher,
435
- getRegisteredPresentationFetchers,
436
- generateSpecFromTemplate,
437
- fetchPresentationData
438
- };
378
+ });`}async function J(x,b){throw Error("fetchPresentationData is deprecated. Use fetchData from TemplateRuntimeContext.")}function K(x){return!1}function L(){return[]}export{K as hasPresentationDataFetcher,L as getRegisteredPresentationFetchers,G as generateSpecFromTemplate,J as fetchPresentationData};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/lib.example-shared-ui",
3
- "version": "6.0.16",
3
+ "version": "6.0.18",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -209,8 +209,8 @@
209
209
  "dev": "contractspec-bun-build dev",
210
210
  "clean": "rimraf dist .turbo",
211
211
  "lint": "bun lint:fix",
212
- "lint:fix": "biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .",
213
- "lint:check": "biome check .",
212
+ "lint:fix": "node ../../../scripts/biome.cjs check --write --unsafe --only=nursery/useSortedClasses . && node ../../../scripts/biome.cjs check --write .",
213
+ "lint:check": "node ../../../scripts/biome.cjs check .",
214
214
  "test": "bun test --pass-with-no-tests",
215
215
  "prebuild": "contractspec-bun-build prebuild",
216
216
  "typecheck": "tsc --noEmit"
@@ -423,7 +423,7 @@
423
423
  }
424
424
  },
425
425
  "peerDependencies": {
426
- "@contractspec/lib.surface-runtime": "0.5.16"
426
+ "@contractspec/lib.surface-runtime": "0.5.18"
427
427
  },
428
428
  "peerDependenciesMeta": {
429
429
  "@contractspec/lib.surface-runtime": {
@@ -431,26 +431,26 @@
431
431
  }
432
432
  },
433
433
  "dependencies": {
434
- "@apollo/client": "^4.1.6",
435
- "@contractspec/lib.contracts-spec": "5.0.4",
436
- "@contractspec/lib.design-system": "3.8.9",
437
- "@contractspec/lib.ui-kit-web": "3.9.8",
438
- "@tanstack/react-query": "^5.95.2",
434
+ "@apollo/client": "^4.1.7",
435
+ "@contractspec/lib.contracts-spec": "5.2.0",
436
+ "@contractspec/lib.design-system": "3.8.11",
437
+ "@contractspec/lib.ui-kit-web": "3.9.10",
438
+ "@tanstack/react-query": "^5.97.0",
439
439
  "framer-motion": "^12.38.0",
440
- "lucide-react": "^1.6.0",
440
+ "lucide-react": "^1.8.0",
441
441
  "react": "19.2.0",
442
442
  "react-dom": "19.2.0",
443
- "@contractspec/lib.presentation-runtime-core": "3.9.4"
443
+ "@contractspec/lib.presentation-runtime-core": "3.9.6"
444
444
  },
445
445
  "optionalDependencies": {
446
- "@contractspec/lib.surface-runtime": "0.5.16"
446
+ "@contractspec/lib.surface-runtime": "0.5.18"
447
447
  },
448
448
  "devDependencies": {
449
- "@contractspec/tool.typescript": "3.7.12",
449
+ "@contractspec/tool.typescript": "3.7.13",
450
450
  "@types/react": "^19.2.14",
451
451
  "@types/react-dom": "^19.2.2",
452
452
  "typescript": "^5.9.3",
453
- "@contractspec/tool.bun": "3.7.12"
453
+ "@contractspec/tool.bun": "3.7.14"
454
454
  },
455
455
  "types": "./dist/index.d.ts"
456
456
  }
@@ -36,7 +36,22 @@ export class TemplateComponentRegistry {
36
36
  }
37
37
  }
38
38
 
39
- export const templateComponentRegistry = new TemplateComponentRegistry();
39
+ const TEMPLATE_COMPONENT_REGISTRY_KEY = Symbol.for(
40
+ '@contractspec/lib.example-shared-ui/template-component-registry'
41
+ );
42
+
43
+ type TemplateComponentRegistryStore = typeof globalThis & {
44
+ [TEMPLATE_COMPONENT_REGISTRY_KEY]?: TemplateComponentRegistry;
45
+ };
46
+
47
+ function getTemplateComponentRegistrySingleton() {
48
+ const store = globalThis as TemplateComponentRegistryStore;
49
+ store[TEMPLATE_COMPONENT_REGISTRY_KEY] ??= new TemplateComponentRegistry();
50
+ return store[TEMPLATE_COMPONENT_REGISTRY_KEY];
51
+ }
52
+
53
+ export const templateComponentRegistry =
54
+ getTemplateComponentRegistrySingleton();
40
55
 
41
56
  export function registerTemplateComponents(
42
57
  templateId: TemplateId,
@@ -2,7 +2,7 @@
2
2
 
3
3
  import type { ApolloClient } from '@apollo/client';
4
4
  import type { TransformEngine } from '@contractspec/lib.presentation-runtime-core/transform-engine';
5
- import { createContext, useContext } from 'react';
5
+ import { type Context, createContext, useContext } from 'react';
6
6
  import type {
7
7
  TemplateDefinition,
8
8
  TemplateId,
@@ -32,8 +32,22 @@ export interface TemplateRuntimeContextValue<
32
32
  resolvePresentation?: (presentationName: string) => unknown;
33
33
  }
34
34
 
35
- export const TemplateRuntimeContext =
36
- createContext<TemplateRuntimeContextValue | null>(null);
35
+ const TEMPLATE_RUNTIME_CONTEXT_KEY = Symbol.for(
36
+ '@contractspec/lib.example-shared-ui/template-runtime-context'
37
+ );
38
+
39
+ type TemplateRuntimeContextStore = typeof globalThis & {
40
+ [TEMPLATE_RUNTIME_CONTEXT_KEY]?: Context<TemplateRuntimeContextValue | null>;
41
+ };
42
+
43
+ function getTemplateRuntimeContextSingleton() {
44
+ const store = globalThis as TemplateRuntimeContextStore;
45
+ store[TEMPLATE_RUNTIME_CONTEXT_KEY] ??=
46
+ createContext<TemplateRuntimeContextValue | null>(null);
47
+ return store[TEMPLATE_RUNTIME_CONTEXT_KEY];
48
+ }
49
+
50
+ export const TemplateRuntimeContext = getTemplateRuntimeContextSingleton();
37
51
 
38
52
  export function useTemplateRuntime<
39
53
  THandlers = GenericTemplateHandlers,
@@ -0,0 +1,51 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import {
3
+ registerTemplateComponents,
4
+ templateComponentRegistry,
5
+ } from './component-registry';
6
+ import { TemplateRuntimeContext } from './runtime-context';
7
+
8
+ const TEMPLATE_RUNTIME_CONTEXT_KEY = Symbol.for(
9
+ '@contractspec/lib.example-shared-ui/template-runtime-context'
10
+ );
11
+ const TEMPLATE_COMPONENT_REGISTRY_KEY = Symbol.for(
12
+ '@contractspec/lib.example-shared-ui/template-component-registry'
13
+ );
14
+
15
+ const DummyComponent = () => null;
16
+
17
+ describe('@contractspec/lib.example-shared-ui singletons', () => {
18
+ test('stores TemplateRuntimeContext on globalThis and reuses it', async () => {
19
+ const runtimeContextStore = globalThis as Record<PropertyKey, unknown>;
20
+ const runtimeContextModule = await import('./runtime-context');
21
+
22
+ expect(runtimeContextStore[TEMPLATE_RUNTIME_CONTEXT_KEY]).toBe(
23
+ TemplateRuntimeContext
24
+ );
25
+ expect(runtimeContextModule.TemplateRuntimeContext).toBe(
26
+ TemplateRuntimeContext
27
+ );
28
+ });
29
+
30
+ test('stores TemplateComponentRegistry on globalThis and reuses registrations', async () => {
31
+ const registryStore = globalThis as Record<PropertyKey, unknown>;
32
+ const registryModule = await import('./component-registry');
33
+ const templateId = `singleton-test-${Date.now()}`;
34
+ const registration = {
35
+ list: DummyComponent,
36
+ detail: DummyComponent,
37
+ };
38
+
39
+ registerTemplateComponents(templateId, registration);
40
+
41
+ expect(registryStore[TEMPLATE_COMPONENT_REGISTRY_KEY]).toBe(
42
+ templateComponentRegistry
43
+ );
44
+ expect(registryModule.templateComponentRegistry).toBe(
45
+ templateComponentRegistry
46
+ );
47
+ expect(registryModule.templateComponentRegistry.get(templateId)).toBe(
48
+ registration
49
+ );
50
+ });
51
+ });