@cosmicdrift/kumiko-renderer 0.327.0 → 0.328.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 (257) hide show
  1. package/dist/app/action-form-shim.d.ts +14 -0
  2. package/{src/app/action-form-shim.ts → dist/app/action-form-shim.js} +26 -44
  3. package/dist/app/app-features-context.d.ts +8 -0
  4. package/dist/app/app-features-context.js +16 -0
  5. package/dist/app/column-renderers.d.ts +30 -0
  6. package/dist/app/column-renderers.js +34 -0
  7. package/dist/app/config-edit-shim.d.ts +11 -0
  8. package/{src/app/config-edit-shim.ts → dist/app/config-edit-shim.js} +12 -25
  9. package/dist/app/content-editors.d.ts +38 -0
  10. package/dist/app/content-editors.js +26 -0
  11. package/dist/app/content-preview.d.ts +11 -0
  12. package/dist/app/content-preview.js +30 -0
  13. package/dist/app/custom-screens.d.ts +11 -0
  14. package/dist/app/custom-screens.js +20 -0
  15. package/dist/app/dashboard-body.d.ts +16 -0
  16. package/dist/app/dashboard-body.js +11 -0
  17. package/dist/app/extension-form-submit.d.ts +32 -0
  18. package/dist/app/extension-form-submit.js +73 -0
  19. package/dist/app/extension-sections.d.ts +72 -0
  20. package/dist/app/extension-sections.js +34 -0
  21. package/dist/app/feature-schema.d.ts +4 -0
  22. package/{src/app/feature-schema.ts → dist/app/feature-schema.js} +12 -22
  23. package/dist/app/form-schema.d.ts +4 -0
  24. package/dist/app/form-schema.js +85 -0
  25. package/dist/app/kumiko-screen.d.ts +43 -0
  26. package/dist/app/kumiko-screen.js +2206 -0
  27. package/dist/app/layout-fields.d.ts +3 -0
  28. package/dist/app/layout-fields.js +20 -0
  29. package/dist/app/list-facets.d.ts +48 -0
  30. package/dist/app/list-facets.js +185 -0
  31. package/dist/app/nav.d.ts +61 -0
  32. package/dist/app/nav.js +139 -0
  33. package/dist/app/projection-detail-shim.d.ts +8 -0
  34. package/dist/app/projection-detail-shim.js +71 -0
  35. package/dist/app/projection-list-shim.d.ts +13 -0
  36. package/{src/app/projection-list-shim.ts → dist/app/projection-list-shim.js} +26 -38
  37. package/dist/app/qn.d.ts +7 -0
  38. package/{src/app/qn.ts → dist/app/qn.js} +9 -11
  39. package/dist/app/qualify-screen-id.d.ts +2 -0
  40. package/{src/app/qualify-screen-id.ts → dist/app/qualify-screen-id.js} +5 -6
  41. package/dist/app/reference-facet-bridge.d.ts +10 -0
  42. package/dist/app/reference-facet-bridge.js +22 -0
  43. package/dist/app/return-to.d.ts +31 -0
  44. package/dist/app/return-to.js +188 -0
  45. package/dist/app/row-actions.d.ts +77 -0
  46. package/dist/app/row-actions.js +416 -0
  47. package/dist/app/screen-access.d.ts +8 -0
  48. package/dist/app/screen-access.js +48 -0
  49. package/dist/app/secret-mint-body.d.ts +10 -0
  50. package/dist/app/secret-mint-body.js +140 -0
  51. package/dist/app/secrets-edit-body.d.ts +8 -0
  52. package/dist/app/secrets-edit-body.js +76 -0
  53. package/dist/app/use-embedded-screen.d.ts +6 -0
  54. package/dist/app/use-embedded-screen.js +19 -0
  55. package/dist/app/variable-chips.d.ts +7 -0
  56. package/dist/app/variable-chips.js +16 -0
  57. package/dist/app/write-failed-error.d.ts +6 -0
  58. package/dist/app/write-failed-error.js +21 -0
  59. package/dist/components/embedded-list-field.d.ts +10 -0
  60. package/dist/components/embedded-list-field.js +259 -0
  61. package/dist/components/grid-cell-for-field.d.ts +25 -0
  62. package/dist/components/grid-cell-for-field.js +31 -0
  63. package/dist/components/multi-select-checkboxes.d.ts +14 -0
  64. package/dist/components/multi-select-checkboxes.js +36 -0
  65. package/dist/components/reference-create-dialog.d.ts +13 -0
  66. package/dist/components/reference-create-dialog.js +46 -0
  67. package/dist/components/related-list-section.d.ts +25 -0
  68. package/dist/components/related-list-section.js +273 -0
  69. package/dist/components/render-edit-action-button.d.ts +22 -0
  70. package/dist/components/render-edit-action-button.js +43 -0
  71. package/dist/components/render-edit-logic.d.ts +6 -0
  72. package/dist/components/render-edit-logic.js +63 -0
  73. package/dist/components/render-edit-types.d.ts +209 -0
  74. package/dist/components/render-edit-types.js +1 -0
  75. package/dist/components/render-edit.d.ts +6 -0
  76. package/dist/components/render-edit.js +1169 -0
  77. package/dist/components/render-field.d.ts +38 -0
  78. package/dist/components/render-field.js +544 -0
  79. package/dist/components/render-list.d.ts +117 -0
  80. package/dist/components/render-list.js +232 -0
  81. package/dist/components/write-form-section.d.ts +17 -0
  82. package/dist/components/write-form-section.js +104 -0
  83. package/dist/context/dispatcher-context.d.ts +10 -0
  84. package/{src/context/dispatcher-context.tsx → dist/context/dispatcher-context.js} +16 -29
  85. package/dist/context/draft-storage-context.d.ts +12 -0
  86. package/dist/context/draft-storage-context.js +18 -0
  87. package/dist/context/user-roles-context.d.ts +7 -0
  88. package/{src/context/user-roles-context.tsx → dist/context/user-roles-context.js} +7 -15
  89. package/dist/format-when.d.ts +1 -0
  90. package/{src/format-when.ts → dist/format-when.js} +7 -7
  91. package/dist/hooks/reference-limits.d.ts +3 -0
  92. package/{src/hooks/reference-limits.ts → dist/hooks/reference-limits.js} +0 -1
  93. package/dist/hooks/use-ai-text.d.ts +52 -0
  94. package/dist/hooks/use-ai-text.js +90 -0
  95. package/dist/hooks/use-disclosure.d.ts +7 -0
  96. package/dist/hooks/use-disclosure.js +8 -0
  97. package/dist/hooks/use-form.d.ts +7 -0
  98. package/dist/hooks/use-form.js +36 -0
  99. package/dist/hooks/use-list-url-state.d.ts +43 -0
  100. package/dist/hooks/use-list-url-state.js +131 -0
  101. package/dist/hooks/use-mutation.d.ts +9 -0
  102. package/dist/hooks/use-mutation.js +37 -0
  103. package/dist/hooks/use-query.d.ts +14 -0
  104. package/dist/hooks/use-query.js +118 -0
  105. package/dist/hooks/use-reference-lookup.d.ts +14 -0
  106. package/dist/hooks/use-reference-lookup.js +63 -0
  107. package/dist/hooks/use-store.d.ts +3 -0
  108. package/dist/hooks/use-store.js +38 -0
  109. package/dist/hooks/use-stream-handler.d.ts +14 -0
  110. package/dist/hooks/use-stream-handler.js +93 -0
  111. package/dist/i18n-defaults.d.ts +2 -0
  112. package/dist/i18n-defaults.js +201 -0
  113. package/dist/i18n.d.ts +64 -0
  114. package/dist/i18n.js +166 -0
  115. package/dist/index.d.ts +77 -0
  116. package/dist/index.js +55 -0
  117. package/dist/inside-drawer.d.ts +2 -0
  118. package/dist/inside-drawer.js +9 -0
  119. package/dist/page-header-slot.d.ts +2 -0
  120. package/dist/page-header-slot.js +9 -0
  121. package/dist/primitives.d.ts +1351 -0
  122. package/dist/primitives.js +73 -0
  123. package/dist/screen-fills-height.d.ts +3 -0
  124. package/dist/screen-fills-height.js +3 -0
  125. package/dist/share-links.d.ts +4 -0
  126. package/dist/share-links.js +11 -0
  127. package/dist/sort-by-accessor.d.ts +5 -0
  128. package/dist/sort-by-accessor.js +16 -0
  129. package/dist/sse/live-events.d.ts +23 -0
  130. package/dist/sse/live-events.js +28 -0
  131. package/dist/tokens.d.ts +83 -0
  132. package/dist/tokens.js +80 -0
  133. package/package.json +16 -9
  134. package/src/changes.json +52 -0
  135. package/src/__tests__/error-i18n-defaults.test.ts +0 -82
  136. package/src/__tests__/format-when.test.ts +0 -12
  137. package/src/__tests__/i18n.test.tsx +0 -283
  138. package/src/__tests__/merge-search-params-into-initial.test.ts +0 -525
  139. package/src/__tests__/qn.test.ts +0 -83
  140. package/src/__tests__/share-links.test.ts +0 -26
  141. package/src/__tests__/sort-by-accessor.test.ts +0 -48
  142. package/src/__tests__/stringify-nav-params.test.ts +0 -33
  143. package/src/__tests__/use-list-url-state.test.tsx +0 -250
  144. package/src/app/__tests__/action-form-field-labels.test.tsx +0 -92
  145. package/src/app/__tests__/action-form-shim.test.ts +0 -137
  146. package/src/app/__tests__/build-list-query-payload.test.ts +0 -107
  147. package/src/app/__tests__/config-edit-shim.test.ts +0 -57
  148. package/src/app/__tests__/content-editors.test.tsx +0 -128
  149. package/src/app/__tests__/content-preview.test.tsx +0 -184
  150. package/src/app/__tests__/entity-edit-create-search-params.test.tsx +0 -236
  151. package/src/app/__tests__/entity-edit-jsonb-embedded-submit.test.tsx +0 -239
  152. package/src/app/__tests__/entity-list-create-singleton.test.tsx +0 -128
  153. package/src/app/__tests__/entity-list-row-action-entity-target.test.tsx +0 -424
  154. package/src/app/__tests__/entity-list-row-action-icon.test.tsx +0 -248
  155. package/src/app/__tests__/entity-list-row-action-kumiko-actions-view.test.tsx +0 -162
  156. package/src/app/__tests__/entity-list-row-action-refetch.test.tsx +0 -401
  157. package/src/app/__tests__/entity-list-screen-padding.test.tsx +0 -111
  158. package/src/app/__tests__/feature-schema.test.ts +0 -40
  159. package/src/app/__tests__/form-schema.test.ts +0 -247
  160. package/src/app/__tests__/list-daterange-facet.test.ts +0 -165
  161. package/src/app/__tests__/list-filter-facets.test.tsx +0 -521
  162. package/src/app/__tests__/nav.test.ts +0 -198
  163. package/src/app/__tests__/projection-detail-actions.test.tsx +0 -719
  164. package/src/app/__tests__/projection-detail-reference-field.test.tsx +0 -165
  165. package/src/app/__tests__/projection-detail-shim.test.ts +0 -188
  166. package/src/app/__tests__/projection-detail-singleton.test.tsx +0 -191
  167. package/src/app/__tests__/projection-list-bad-shape.test.tsx +0 -152
  168. package/src/app/__tests__/projection-list-reference-column.test.tsx +0 -219
  169. package/src/app/__tests__/projection-list-search-sort.test.tsx +0 -212
  170. package/src/app/__tests__/qualified-names.test.ts +0 -37
  171. package/src/app/__tests__/return-to.test.ts +0 -396
  172. package/src/app/__tests__/row-actions-navigate-tab.test.ts +0 -223
  173. package/src/app/__tests__/row-default-edit-action.test.tsx +0 -324
  174. package/src/app/__tests__/screen-access-allows.test.ts +0 -34
  175. package/src/app/__tests__/secret-mint-body.test.tsx +0 -404
  176. package/src/app/__tests__/variable-chips.test.tsx +0 -70
  177. package/src/app/app-features-context.tsx +0 -25
  178. package/src/app/column-renderers.tsx +0 -68
  179. package/src/app/content-editors.tsx +0 -85
  180. package/src/app/content-preview.tsx +0 -67
  181. package/src/app/custom-screens.tsx +0 -29
  182. package/src/app/dashboard-body.tsx +0 -33
  183. package/src/app/extension-form-submit.tsx +0 -123
  184. package/src/app/extension-sections.tsx +0 -111
  185. package/src/app/form-schema.ts +0 -91
  186. package/src/app/kumiko-screen.tsx +0 -3614
  187. package/src/app/layout-fields.ts +0 -31
  188. package/src/app/list-facets.ts +0 -259
  189. package/src/app/nav.tsx +0 -258
  190. package/src/app/projection-detail-shim.ts +0 -85
  191. package/src/app/reference-facet-bridge.tsx +0 -58
  192. package/src/app/return-to.tsx +0 -234
  193. package/src/app/row-actions.ts +0 -639
  194. package/src/app/screen-access.ts +0 -63
  195. package/src/app/secret-mint-body.tsx +0 -259
  196. package/src/app/secrets-edit-body.tsx +0 -194
  197. package/src/app/use-embedded-screen.ts +0 -27
  198. package/src/app/variable-chips.tsx +0 -39
  199. package/src/app/write-failed-error.ts +0 -27
  200. package/src/components/__tests__/embedded-list-field.test.tsx +0 -531
  201. package/src/components/__tests__/multi-select-checkboxes.test.tsx +0 -162
  202. package/src/components/__tests__/related-list-section-empty-state.test.tsx +0 -143
  203. package/src/components/__tests__/related-list-section.test.tsx +0 -1669
  204. package/src/components/__tests__/render-edit-action-button.test.tsx +0 -205
  205. package/src/components/__tests__/render-edit-hidden-section.test.tsx +0 -128
  206. package/src/components/__tests__/render-edit-logic.test.ts +0 -314
  207. package/src/components/__tests__/render-edit-screen-description.test.tsx +0 -152
  208. package/src/components/__tests__/render-edit-submit-actions.test.tsx +0 -460
  209. package/src/components/__tests__/render-field-app-locale.test.tsx +0 -142
  210. package/src/components/__tests__/render-field-enum-option.test.tsx +0 -99
  211. package/src/components/__tests__/render-field-icon-derivation.test.tsx +0 -119
  212. package/src/components/__tests__/render-field-json-format.test.tsx +0 -164
  213. package/src/components/__tests__/render-field-money-embedded-list-consistency.test.tsx +0 -212
  214. package/src/components/__tests__/render-field-money-roundtrip.test.tsx +0 -217
  215. package/src/components/__tests__/render-field-number-grouping.test.tsx +0 -76
  216. package/src/components/__tests__/render-field-number-unit.test.tsx +0 -227
  217. package/src/components/__tests__/render-field-password-format.test.tsx +0 -101
  218. package/src/components/__tests__/render-field-select-display.test.tsx +0 -134
  219. package/src/components/__tests__/render-field-unit-format.test.tsx +0 -107
  220. package/src/components/__tests__/render-field-unsupported-types.test.tsx +0 -195
  221. package/src/components/__tests__/render-list-toolbar-icon-only.test.tsx +0 -146
  222. package/src/components/__tests__/write-form-section.test.tsx +0 -375
  223. package/src/components/embedded-list-field.tsx +0 -354
  224. package/src/components/grid-cell-for-field.tsx +0 -60
  225. package/src/components/multi-select-checkboxes.tsx +0 -93
  226. package/src/components/reference-create-dialog.tsx +0 -91
  227. package/src/components/related-list-section.tsx +0 -467
  228. package/src/components/render-edit-action-button.tsx +0 -106
  229. package/src/components/render-edit-logic.ts +0 -85
  230. package/src/components/render-edit-types.ts +0 -216
  231. package/src/components/render-edit.tsx +0 -1700
  232. package/src/components/render-field.tsx +0 -942
  233. package/src/components/render-list.tsx +0 -561
  234. package/src/components/write-form-section.tsx +0 -199
  235. package/src/context/draft-storage-context.tsx +0 -39
  236. package/src/hooks/__tests__/use-ai-text.test.tsx +0 -177
  237. package/src/hooks/__tests__/use-disclosure.test.tsx +0 -25
  238. package/src/hooks/__tests__/use-form.test.tsx +0 -65
  239. package/src/hooks/__tests__/use-mutation.test.tsx +0 -77
  240. package/src/hooks/__tests__/use-stream-handler.test.tsx +0 -107
  241. package/src/hooks/use-ai-text.ts +0 -172
  242. package/src/hooks/use-disclosure.ts +0 -20
  243. package/src/hooks/use-form.ts +0 -78
  244. package/src/hooks/use-list-url-state.ts +0 -171
  245. package/src/hooks/use-mutation.ts +0 -61
  246. package/src/hooks/use-query.ts +0 -132
  247. package/src/hooks/use-reference-lookup.ts +0 -76
  248. package/src/hooks/use-store.ts +0 -48
  249. package/src/hooks/use-stream-handler.ts +0 -134
  250. package/src/i18n-defaults.ts +0 -220
  251. package/src/i18n.tsx +0 -286
  252. package/src/index.ts +0 -272
  253. package/src/primitives.tsx +0 -1446
  254. package/src/share-links.ts +0 -12
  255. package/src/sort-by-accessor.ts +0 -20
  256. package/src/sse/live-events.tsx +0 -56
  257. package/src/tokens.tsx +0 -170
@@ -1,198 +0,0 @@
1
- // nav Pure-Logik Tests (Phase 1, test-luecken-integration, Tier 1).
2
- //
3
- // parsePath/formatPath: plattform-neutrale URL-Grammatik mit zwei Modi
4
- // (mit/ohne Workspaces). Pure, kein DOM.
5
-
6
- import { describe, expect, test } from "bun:test";
7
- import type { ScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
8
- import type { FeatureSchema } from "../feature-schema";
9
- import { formatPath, hasDetailScreen, parsePath, resolveTarget } from "../nav";
10
-
11
- describe("parsePath — ohne Workspaces", () => {
12
- test("/<screenId>", () => {
13
- expect(parsePath("/task-list")).toEqual({ screenId: "task-list" });
14
- });
15
-
16
- test("/<screenId>/<entityId>", () => {
17
- expect(parsePath("/task-edit/abc-123")).toEqual({ screenId: "task-edit", entityId: "abc-123" });
18
- });
19
-
20
- test("Root und leerer Pfad → undefined", () => {
21
- expect(parsePath("/")).toBeUndefined();
22
- expect(parsePath("")).toBeUndefined();
23
- });
24
-
25
- test("überzählige Segmente werden ignoriert (kein Nesting)", () => {
26
- expect(parsePath("/a/b/c/d")).toEqual({ screenId: "a", entityId: "b" });
27
- });
28
- });
29
-
30
- describe("parsePath — mit Workspaces (hasWorkspaces=true)", () => {
31
- test("/<workspaceId>/<screenId>", () => {
32
- expect(parsePath("/admin/task-list", true)).toEqual({
33
- workspaceId: "admin",
34
- screenId: "task-list",
35
- });
36
- });
37
-
38
- test("/<workspaceId>/<screenId>/<entityId>", () => {
39
- expect(parsePath("/admin/task-edit/abc", true)).toEqual({
40
- workspaceId: "admin",
41
- screenId: "task-edit",
42
- entityId: "abc",
43
- });
44
- });
45
-
46
- test("Workspace-only /<workspaceId> → leerer screenId (Shell resolved Default)", () => {
47
- expect(parsePath("/admin", true)).toEqual({ workspaceId: "admin", screenId: "" });
48
- });
49
-
50
- test("Root / → undefined", () => {
51
- expect(parsePath("/", true)).toBeUndefined();
52
- });
53
- });
54
-
55
- describe("formatPath", () => {
56
- test("flach: /<screenId>", () => {
57
- expect(formatPath({ screenId: "task-list" })).toBe("/task-list");
58
- });
59
-
60
- test("mit entityId", () => {
61
- expect(formatPath({ screenId: "task-edit", entityId: "abc" })).toBe("/task-edit/abc");
62
- });
63
-
64
- test("mit workspaceId-Prefix", () => {
65
- expect(formatPath({ workspaceId: "admin", screenId: "task-list" })).toBe("/admin/task-list");
66
- });
67
-
68
- test("workspace + entity", () => {
69
- expect(formatPath({ workspaceId: "admin", screenId: "task-edit", entityId: "abc" })).toBe(
70
- "/admin/task-edit/abc",
71
- );
72
- });
73
- });
74
-
75
- describe("Roundtrip parsePath ↔ formatPath", () => {
76
- test("non-workspace", () => {
77
- const t = { screenId: "task-edit", entityId: "abc" };
78
- expect(parsePath(formatPath(t))).toEqual(t);
79
- });
80
-
81
- test("workspace", () => {
82
- const t = { workspaceId: "admin", screenId: "task-edit", entityId: "abc" };
83
- expect(parsePath(formatPath(t), true)).toEqual(t);
84
- });
85
- });
86
-
87
- // resolveTarget: ObjectTarget -> ScreenTarget lookup (fw#2163). Custom-Screen
88
- // detailFor is the main case in app repos (projectionDetail has no entity to
89
- // key off), so it gets its own scenario rather than piggy-backing on the
90
- // entityList one.
91
- function schemaWith(featureName: string, screens: readonly ScreenDefinition[]): FeatureSchema {
92
- return { featureName, entities: {}, screens };
93
- }
94
-
95
- const leaseDetailScreen: ScreenDefinition = {
96
- id: "lease-detail",
97
- type: "custom",
98
- renderer: { react: "stub" },
99
- detailFor: "lease",
100
- };
101
-
102
- const leaseListScreen: ScreenDefinition = {
103
- id: "lease-list",
104
- type: "entityList",
105
- entity: "lease",
106
- columns: ["name"],
107
- };
108
-
109
- const leaseEditScreen: ScreenDefinition = {
110
- id: "lease-edit",
111
- type: "entityEdit",
112
- entity: "lease",
113
- layout: { sections: [{ fields: ["name"] }] },
114
- };
115
-
116
- const leaseEditScreenAlt: ScreenDefinition = {
117
- id: "lease-edit-quick",
118
- type: "entityEdit",
119
- entity: "lease",
120
- layout: { sections: [{ fields: ["name"] }] },
121
- };
122
-
123
- describe("resolveTarget", () => {
124
- test("ScreenTarget passes through unchanged", () => {
125
- const target = { screenId: "task-edit", entityId: "abc" };
126
- expect(resolveTarget([], target)).toBe(target);
127
- });
128
-
129
- // Short screenId, not the qualified "property:screen:lease-detail" —
130
- // ScreenTarget.screenId round-trips through formatPath/parsePath as a
131
- // short id; RoutedScreen re-qualifies it itself (fw#2164 fix, previously
132
- // double-qualified and silently fell back to the app's default screen).
133
- test("ObjectTarget resolves via the matching custom detailFor screen", () => {
134
- const schema = schemaWith("property", [leaseDetailScreen]);
135
- expect(resolveTarget([schema], { entity: "lease", id: "l-1" })).toEqual({
136
- screenId: "lease-detail",
137
- entityId: "l-1",
138
- });
139
- });
140
-
141
- // solon's "property" entity has THREE entityEdit screens — "the" edit
142
- // screen for an entity isn't well-defined, so resolveTarget only ever
143
- // looks at detailFor. This pins that multiple same-entity entityEdit
144
- // screens don't confuse detail resolution (no first-match ambiguity).
145
- test("multiple screens on the same entity (list, two entityEdit forms, one detail) — only the detailFor screen resolves", () => {
146
- const schema = schemaWith("property", [
147
- leaseListScreen,
148
- leaseEditScreen,
149
- leaseEditScreenAlt,
150
- leaseDetailScreen,
151
- ]);
152
- expect(resolveTarget([schema], { entity: "lease", id: "l-1" })).toEqual({
153
- screenId: "lease-detail",
154
- entityId: "l-1",
155
- });
156
- });
157
-
158
- test("workspaceId carries through when set", () => {
159
- const schema = schemaWith("property", [leaseDetailScreen]);
160
- const resolved = resolveTarget([schema], { entity: "lease", id: "l-1", workspaceId: "admin" });
161
- expect(resolved).toEqual({
162
- workspaceId: "admin",
163
- screenId: "lease-detail",
164
- entityId: "l-1",
165
- });
166
- });
167
-
168
- test("workspaceId is omitted (not undefined) when not set", () => {
169
- const schema = schemaWith("property", [leaseDetailScreen]);
170
- const resolved = resolveTarget([schema], { entity: "lease", id: "l-1" });
171
- expect("workspaceId" in resolved).toBe(false);
172
- });
173
-
174
- test("unknown entity throws with the entity name in the message", () => {
175
- const schema = schemaWith("property", [leaseDetailScreen]);
176
- expect(() => resolveTarget([schema], { entity: "boat", id: "b-1" })).toThrow(/"boat"/);
177
- });
178
- });
179
-
180
- // hasDetailScreen: non-throwing existence check create-app's row-click
181
- // default (fw#2164) uses to pick between a detailFor screen and its other
182
- // fallbacks — resolveTarget's throw isn't usable there since not resolving
183
- // is the expected, non-error case for most entities.
184
- describe("hasDetailScreen", () => {
185
- test("true when a screen declares detailFor for the entity", () => {
186
- const schema = schemaWith("property", [leaseDetailScreen]);
187
- expect(hasDetailScreen([schema], "lease")).toBe(true);
188
- });
189
-
190
- test("false when no screen declares detailFor for the entity", () => {
191
- const schema = schemaWith("property", [leaseListScreen, leaseEditScreen]);
192
- expect(hasDetailScreen([schema], "lease")).toBe(false);
193
- });
194
-
195
- test("false for an empty feature list", () => {
196
- expect(hasDetailScreen([], "lease")).toBe(false);
197
- });
198
- });