canopycms 0.0.0 → 0.0.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.
- package/package.json +2 -3
- package/dist/__integration__/fixtures/content-seeds.d.ts +0 -43
- package/dist/__integration__/fixtures/content-seeds.d.ts.map +0 -1
- package/dist/__integration__/fixtures/content-seeds.js +0 -99
- package/dist/__integration__/fixtures/content-seeds.js.map +0 -1
- package/dist/__integration__/fixtures/schemas.d.ts +0 -12
- package/dist/__integration__/fixtures/schemas.d.ts.map +0 -1
- package/dist/__integration__/fixtures/schemas.js +0 -65
- package/dist/__integration__/fixtures/schemas.js.map +0 -1
- package/dist/__integration__/test-utils/api-client.d.ts +0 -123
- package/dist/__integration__/test-utils/api-client.d.ts.map +0 -1
- package/dist/__integration__/test-utils/api-client.js +0 -118
- package/dist/__integration__/test-utils/api-client.js.map +0 -1
- package/dist/__integration__/test-utils/multi-user.d.ts +0 -25
- package/dist/__integration__/test-utils/multi-user.d.ts.map +0 -1
- package/dist/__integration__/test-utils/multi-user.js +0 -105
- package/dist/__integration__/test-utils/multi-user.js.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.d.ts +0 -25
- package/dist/__integration__/test-utils/test-workspace.d.ts.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.js +0 -102
- package/dist/__integration__/test-utils/test-workspace.js.map +0 -1
- package/dist/editor/BranchManager.stories.d.ts +0 -8
- package/dist/editor/BranchManager.stories.d.ts.map +0 -1
- package/dist/editor/BranchManager.stories.js +0 -74
- package/dist/editor/BranchManager.stories.js.map +0 -1
- package/dist/editor/CanopyEditor.stories.d.ts +0 -7
- package/dist/editor/CanopyEditor.stories.d.ts.map +0 -1
- package/dist/editor/CanopyEditor.stories.js +0 -99
- package/dist/editor/CanopyEditor.stories.js.map +0 -1
- package/dist/editor/CommentsPanel.stories.d.ts +0 -10
- package/dist/editor/CommentsPanel.stories.d.ts.map +0 -1
- package/dist/editor/CommentsPanel.stories.js +0 -175
- package/dist/editor/CommentsPanel.stories.js.map +0 -1
- package/dist/editor/Editor.stories.d.ts +0 -7
- package/dist/editor/Editor.stories.d.ts.map +0 -1
- package/dist/editor/Editor.stories.js +0 -95
- package/dist/editor/Editor.stories.js.map +0 -1
- package/dist/editor/EditorPanes.stories.d.ts +0 -7
- package/dist/editor/EditorPanes.stories.d.ts.map +0 -1
- package/dist/editor/EditorPanes.stories.js +0 -116
- package/dist/editor/EditorPanes.stories.js.map +0 -1
- package/dist/editor/EntryNavigator.stories.d.ts +0 -8
- package/dist/editor/EntryNavigator.stories.d.ts.map +0 -1
- package/dist/editor/EntryNavigator.stories.js +0 -42
- package/dist/editor/EntryNavigator.stories.js.map +0 -1
- package/dist/editor/FormRenderer.stories.d.ts +0 -7
- package/dist/editor/FormRenderer.stories.d.ts.map +0 -1
- package/dist/editor/FormRenderer.stories.js +0 -115
- package/dist/editor/FormRenderer.stories.js.map +0 -1
- package/dist/editor/GroupManager.stories.d.ts +0 -19
- package/dist/editor/GroupManager.stories.d.ts.map +0 -1
- package/dist/editor/GroupManager.stories.js +0 -265
- package/dist/editor/GroupManager.stories.js.map +0 -1
- package/dist/editor/PermissionManager.stories.d.ts +0 -20
- package/dist/editor/PermissionManager.stories.d.ts.map +0 -1
- package/dist/editor/PermissionManager.stories.js +0 -506
- package/dist/editor/PermissionManager.stories.js.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.d.ts +0 -10
- package/dist/editor/comments/FieldWrapper.stories.d.ts.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.js +0 -173
- package/dist/editor/comments/FieldWrapper.stories.js.map +0 -1
- package/dist/editor/fields/BlockField.stories.d.ts +0 -7
- package/dist/editor/fields/BlockField.stories.d.ts.map +0 -1
- package/dist/editor/fields/BlockField.stories.js +0 -50
- package/dist/editor/fields/BlockField.stories.js.map +0 -1
- package/dist/editor/fields/fields.stories.d.ts +0 -8
- package/dist/editor/fields/fields.stories.d.ts.map +0 -1
- package/dist/editor/fields/fields.stories.js +0 -34
- package/dist/editor/fields/fields.stories.js.map +0 -1
- package/dist/test-utils/api-test-helpers.d.ts +0 -238
- package/dist/test-utils/api-test-helpers.d.ts.map +0 -1
- package/dist/test-utils/api-test-helpers.js +0 -347
- package/dist/test-utils/api-test-helpers.js.map +0 -1
- package/dist/test-utils/console-spy.d.ts +0 -56
- package/dist/test-utils/console-spy.d.ts.map +0 -1
- package/dist/test-utils/console-spy.js +0 -81
- package/dist/test-utils/console-spy.js.map +0 -1
- package/dist/test-utils/git-helpers.d.ts +0 -21
- package/dist/test-utils/git-helpers.d.ts.map +0 -1
- package/dist/test-utils/git-helpers.js +0 -23
- package/dist/test-utils/git-helpers.js.map +0 -1
- package/dist/test-utils/index.d.ts +0 -5
- package/dist/test-utils/index.d.ts.map +0 -1
- package/dist/test-utils/index.js +0 -4
- package/dist/test-utils/index.js.map +0 -1
- package/src/__integration__/errors/invalid-content.test.ts +0 -238
- package/src/__integration__/errors/permission-denied.test.ts +0 -220
- package/src/__integration__/fixtures/content-seeds.ts +0 -105
- package/src/__integration__/fixtures/schemas.ts +0 -67
- package/src/__integration__/initialization/prod-sim-init.test.ts +0 -139
- package/src/__integration__/permissions/path-permissions.test.ts +0 -314
- package/src/__integration__/permissions/role-permissions.test.ts +0 -354
- package/src/__integration__/permissions/settings-branch-isolation.test.ts +0 -317
- package/src/__integration__/settings/groups-api.test.ts +0 -403
- package/src/__integration__/test-utils/api-client.ts +0 -167
- package/src/__integration__/test-utils/multi-user.ts +0 -129
- package/src/__integration__/test-utils/test-workspace.ts +0 -130
- package/src/__integration__/user/user-context.test.ts +0 -174
- package/src/__integration__/validation/input-validation.test.ts +0 -166
- package/src/__integration__/workflows/api-editing-workflow.test.ts +0 -244
- package/src/__integration__/workflows/conflict-resolution.test.ts +0 -259
- package/src/__integration__/workflows/editing-workflow.test.ts +0 -205
- package/src/__integration__/workflows/review-workflow.test.ts +0 -260
- package/src/ai/__tests__/build.integration.test.ts +0 -224
- package/src/ai/__tests__/generate.integration.test.ts +0 -495
- package/src/ai/__tests__/handler.integration.test.ts +0 -212
- package/src/ai/__tests__/json-to-markdown.test.ts +0 -553
- package/src/ai/generate.ts +0 -410
- package/src/ai/handler.ts +0 -123
- package/src/ai/index.ts +0 -26
- package/src/ai/json-to-markdown.ts +0 -424
- package/src/ai/resolve-branch.ts +0 -34
- package/src/ai/types.ts +0 -160
- package/src/api/AGENTS.md +0 -81
- package/src/api/__test__/mock-client.ts +0 -404
- package/src/api/assets.test.ts +0 -140
- package/src/api/assets.ts +0 -154
- package/src/api/branch-merge.test.ts +0 -163
- package/src/api/branch-merge.ts +0 -113
- package/src/api/branch-review.test.ts +0 -297
- package/src/api/branch-review.ts +0 -136
- package/src/api/branch-status.test.ts +0 -85
- package/src/api/branch-status.ts +0 -153
- package/src/api/branch-withdraw.test.ts +0 -146
- package/src/api/branch-withdraw.ts +0 -81
- package/src/api/branch-workflow.integration.test.ts +0 -578
- package/src/api/branch.test.ts +0 -620
- package/src/api/branch.ts +0 -492
- package/src/api/client.test.ts +0 -349
- package/src/api/client.ts +0 -506
- package/src/api/comments.test.ts +0 -285
- package/src/api/comments.ts +0 -210
- package/src/api/content.test.ts +0 -345
- package/src/api/content.ts +0 -454
- package/src/api/entries.test.ts +0 -1339
- package/src/api/entries.ts +0 -650
- package/src/api/github-sync.ts +0 -144
- package/src/api/groups.test.ts +0 -1013
- package/src/api/groups.ts +0 -375
- package/src/api/guards.test.ts +0 -533
- package/src/api/guards.ts +0 -271
- package/src/api/index.ts +0 -87
- package/src/api/permissions.test.ts +0 -766
- package/src/api/permissions.ts +0 -334
- package/src/api/reference-options.ts +0 -118
- package/src/api/resolve-references.ts +0 -107
- package/src/api/route-builder.ts +0 -289
- package/src/api/schema.test.ts +0 -840
- package/src/api/schema.ts +0 -936
- package/src/api/security.test.ts +0 -233
- package/src/api/settings-helpers.ts +0 -84
- package/src/api/types.ts +0 -40
- package/src/api/user.test.ts +0 -127
- package/src/api/user.ts +0 -42
- package/src/api/validators.test.ts +0 -275
- package/src/api/validators.ts +0 -176
- package/src/asset-store.test.ts +0 -37
- package/src/asset-store.ts +0 -110
- package/src/auth/cache.ts +0 -7
- package/src/auth/caching-auth-plugin.test.ts +0 -154
- package/src/auth/caching-auth-plugin.ts +0 -109
- package/src/auth/context-helpers.ts +0 -75
- package/src/auth/file-based-auth-cache.test.ts +0 -257
- package/src/auth/file-based-auth-cache.ts +0 -279
- package/src/auth/index.ts +0 -12
- package/src/auth/plugin.ts +0 -51
- package/src/auth/types.ts +0 -38
- package/src/authorization/__tests__/branch.test.ts +0 -260
- package/src/authorization/__tests__/content.test.ts +0 -142
- package/src/authorization/__tests__/path.test.ts +0 -133
- package/src/authorization/__tests__/permissions-loader.test.ts +0 -200
- package/src/authorization/branch.ts +0 -94
- package/src/authorization/content.ts +0 -93
- package/src/authorization/groups/index.ts +0 -11
- package/src/authorization/groups/loader.ts +0 -127
- package/src/authorization/groups/schema.ts +0 -48
- package/src/authorization/helpers.ts +0 -48
- package/src/authorization/index.ts +0 -84
- package/src/authorization/path.ts +0 -112
- package/src/authorization/permissions/index.ts +0 -11
- package/src/authorization/permissions/loader.ts +0 -116
- package/src/authorization/permissions/schema.ts +0 -66
- package/src/authorization/test-utils.ts +0 -15
- package/src/authorization/types.ts +0 -66
- package/src/authorization/validation.test.ts +0 -100
- package/src/authorization/validation.ts +0 -62
- package/src/branch-metadata.test.ts +0 -168
- package/src/branch-metadata.ts +0 -166
- package/src/branch-registry.test.ts +0 -248
- package/src/branch-registry.ts +0 -152
- package/src/branch-schema-cache.test.ts +0 -275
- package/src/branch-schema-cache.ts +0 -189
- package/src/branch-workspace.test.ts +0 -183
- package/src/branch-workspace.ts +0 -124
- package/src/build/generate-ai-content.ts +0 -78
- package/src/build/index.ts +0 -8
- package/src/build-mode.ts +0 -27
- package/src/cli/generate-ai-content.ts +0 -100
- package/src/cli/init.test.ts +0 -240
- package/src/cli/templates/Dockerfile.cms.template +0 -19
- package/src/cli/templates/canopy.ts.template +0 -55
- package/src/cli/templates/canopycms.config.ts.template +0 -11
- package/src/cli/templates/deploy-cms.yml.template +0 -27
- package/src/cli/templates/edit-page.tsx.template +0 -32
- package/src/cli/templates/route.ts.template +0 -12
- package/src/cli/templates/schemas.ts.template +0 -16
- package/src/cli/templates.ts +0 -47
- package/src/client.ts +0 -12
- package/src/comment-store.test.ts +0 -442
- package/src/comment-store.ts +0 -301
- package/src/config/__tests__/config.test.ts +0 -513
- package/src/config/flatten.ts +0 -174
- package/src/config/helpers.ts +0 -167
- package/src/config/index.ts +0 -86
- package/src/config/schemas/collection.ts +0 -67
- package/src/config/schemas/config.ts +0 -77
- package/src/config/schemas/field.ts +0 -108
- package/src/config/schemas/media.ts +0 -27
- package/src/config/schemas/permissions.ts +0 -21
- package/src/config/types.ts +0 -321
- package/src/config/validation.ts +0 -70
- package/src/config-test.ts +0 -65
- package/src/config.ts +0 -11
- package/src/content-id-index.test.ts +0 -512
- package/src/content-id-index.ts +0 -479
- package/src/content-reader.test.ts +0 -478
- package/src/content-reader.ts +0 -214
- package/src/content-store.test.ts +0 -1126
- package/src/content-store.ts +0 -793
- package/src/context.ts +0 -111
- package/src/editor/BranchManager.stories.tsx +0 -80
- package/src/editor/BranchManager.test.tsx +0 -324
- package/src/editor/BranchManager.tsx +0 -461
- package/src/editor/CanopyEditor.stories.tsx +0 -128
- package/src/editor/CanopyEditor.test.tsx +0 -81
- package/src/editor/CanopyEditor.tsx +0 -73
- package/src/editor/CanopyEditorPage.test.tsx +0 -59
- package/src/editor/CanopyEditorPage.tsx +0 -25
- package/src/editor/CommentsPanel.stories.tsx +0 -184
- package/src/editor/CommentsPanel.tsx +0 -338
- package/src/editor/Editor.integration.test.tsx +0 -227
- package/src/editor/Editor.stories.tsx +0 -119
- package/src/editor/Editor.tsx +0 -1221
- package/src/editor/EditorPanes.stories.tsx +0 -256
- package/src/editor/EditorPanes.test.tsx +0 -77
- package/src/editor/EditorPanes.tsx +0 -180
- package/src/editor/EntryNavigator.stories.tsx +0 -65
- package/src/editor/EntryNavigator.test.tsx +0 -598
- package/src/editor/EntryNavigator.tsx +0 -665
- package/src/editor/FormRenderer.stories.tsx +0 -212
- package/src/editor/FormRenderer.test.tsx +0 -194
- package/src/editor/FormRenderer.tsx +0 -432
- package/src/editor/GroupManager.stories.tsx +0 -301
- package/src/editor/GroupManager.test.tsx +0 -682
- package/src/editor/GroupManager.tsx +0 -9
- package/src/editor/PermissionManager.stories.tsx +0 -539
- package/src/editor/PermissionManager.test.tsx +0 -864
- package/src/editor/PermissionManager.tsx +0 -12
- package/src/editor/canopy-path.test.ts +0 -23
- package/src/editor/canopy-path.ts +0 -52
- package/src/editor/client-reference-resolver.ts +0 -118
- package/src/editor/comments/BranchComments.tsx +0 -93
- package/src/editor/comments/EntryComments.tsx +0 -94
- package/src/editor/comments/FieldWrapper.stories.tsx +0 -210
- package/src/editor/comments/FieldWrapper.tsx +0 -129
- package/src/editor/comments/InlineCommentThread.test.tsx +0 -384
- package/src/editor/comments/InlineCommentThread.tsx +0 -246
- package/src/editor/comments/ThreadCarousel.test.tsx +0 -393
- package/src/editor/comments/ThreadCarousel.tsx +0 -525
- package/src/editor/components/ConfirmDeleteModal.tsx +0 -49
- package/src/editor/components/EditorContext.tsx +0 -49
- package/src/editor/components/EditorFooter.tsx +0 -47
- package/src/editor/components/EditorHeader.tsx +0 -492
- package/src/editor/components/EditorSidebar.tsx +0 -193
- package/src/editor/components/EntryCreateModal.tsx +0 -193
- package/src/editor/components/RenameEntryModal.tsx +0 -152
- package/src/editor/components/UserBadge.test.tsx +0 -274
- package/src/editor/components/UserBadge.tsx +0 -240
- package/src/editor/components/index.ts +0 -6
- package/src/editor/context/ApiClientContext.tsx +0 -56
- package/src/editor/context/EditorStateContext.tsx +0 -221
- package/src/editor/context/index.ts +0 -40
- package/src/editor/editor-config.test.ts +0 -385
- package/src/editor/editor-config.ts +0 -94
- package/src/editor/editor-utils.test.ts +0 -772
- package/src/editor/editor-utils.ts +0 -303
- package/src/editor/env.ts +0 -4
- package/src/editor/fields/BlockField.stories.tsx +0 -79
- package/src/editor/fields/BlockField.tsx +0 -267
- package/src/editor/fields/CodeField.tsx +0 -41
- package/src/editor/fields/MarkdownField.tsx +0 -205
- package/src/editor/fields/ObjectField.tsx +0 -71
- package/src/editor/fields/ReferenceField.tsx +0 -138
- package/src/editor/fields/SelectField.tsx +0 -76
- package/src/editor/fields/TextField.tsx +0 -35
- package/src/editor/fields/ToggleField.tsx +0 -37
- package/src/editor/fields/fields.stories.tsx +0 -40
- package/src/editor/group-manager/ExternalGroupsTab.tsx +0 -114
- package/src/editor/group-manager/GroupCard.tsx +0 -102
- package/src/editor/group-manager/GroupForm.tsx +0 -66
- package/src/editor/group-manager/InternalGroupsTab.tsx +0 -147
- package/src/editor/group-manager/MemberList.tsx +0 -184
- package/src/editor/group-manager/hooks/useExternalGroupSearch.ts +0 -63
- package/src/editor/group-manager/hooks/useGroupState.ts +0 -134
- package/src/editor/group-manager/hooks/useUserSearch.ts +0 -84
- package/src/editor/group-manager/index.tsx +0 -210
- package/src/editor/group-manager/types.ts +0 -28
- package/src/editor/hooks/README.md +0 -26
- package/src/editor/hooks/__test__/test-utils.tsx +0 -183
- package/src/editor/hooks/index.ts +0 -23
- package/src/editor/hooks/useBranchActions.test.tsx +0 -267
- package/src/editor/hooks/useBranchActions.tsx +0 -121
- package/src/editor/hooks/useBranchManager.test.tsx +0 -391
- package/src/editor/hooks/useBranchManager.tsx +0 -326
- package/src/editor/hooks/useCommentSystem.test.ts +0 -615
- package/src/editor/hooks/useCommentSystem.ts +0 -347
- package/src/editor/hooks/useDraftManager.test.ts +0 -375
- package/src/editor/hooks/useDraftManager.ts +0 -259
- package/src/editor/hooks/useEditorLayout.test.ts +0 -147
- package/src/editor/hooks/useEditorLayout.ts +0 -67
- package/src/editor/hooks/useEntryManager.test.ts +0 -588
- package/src/editor/hooks/useEntryManager.ts +0 -387
- package/src/editor/hooks/useGroupManager.test.ts +0 -277
- package/src/editor/hooks/useGroupManager.ts +0 -139
- package/src/editor/hooks/usePermissionManager.test.ts +0 -211
- package/src/editor/hooks/usePermissionManager.ts +0 -113
- package/src/editor/hooks/useReferenceResolution.ts +0 -248
- package/src/editor/hooks/useSchemaManager.test.ts +0 -370
- package/src/editor/hooks/useSchemaManager.ts +0 -310
- package/src/editor/hooks/useUserContext.tsx +0 -57
- package/src/editor/hooks/useUserMetadata.test.ts +0 -191
- package/src/editor/hooks/useUserMetadata.ts +0 -71
- package/src/editor/permission-manager/GroupSelector.tsx +0 -73
- package/src/editor/permission-manager/PermissionEditor.tsx +0 -321
- package/src/editor/permission-manager/PermissionLevelBadge.tsx +0 -53
- package/src/editor/permission-manager/PermissionTree.tsx +0 -237
- package/src/editor/permission-manager/UserSelector.tsx +0 -95
- package/src/editor/permission-manager/constants.tsx +0 -18
- package/src/editor/permission-manager/hooks/useGroupsAndUsers.ts +0 -153
- package/src/editor/permission-manager/hooks/usePermissionTree.ts +0 -200
- package/src/editor/permission-manager/index.tsx +0 -294
- package/src/editor/permission-manager/types.ts +0 -58
- package/src/editor/permission-manager/utils.ts +0 -179
- package/src/editor/preview-bridge.test.tsx +0 -50
- package/src/editor/preview-bridge.tsx +0 -294
- package/src/editor/schema-editor/CollectionEditor.test.tsx +0 -238
- package/src/editor/schema-editor/CollectionEditor.tsx +0 -520
- package/src/editor/schema-editor/EntryTypeEditor.test.tsx +0 -215
- package/src/editor/schema-editor/EntryTypeEditor.tsx +0 -367
- package/src/editor/schema-editor/index.ts +0 -19
- package/src/editor/setup-test-dom.ts +0 -10
- package/src/editor/test-setup.ts +0 -33
- package/src/editor/theme.tsx +0 -119
- package/src/editor/utils/env.ts +0 -39
- package/src/entry-schema-registry.test.ts +0 -281
- package/src/entry-schema-registry.ts +0 -121
- package/src/entry-schema.ts +0 -84
- package/src/git-manager.test.ts +0 -552
- package/src/git-manager.ts +0 -667
- package/src/github-service.test.ts +0 -312
- package/src/github-service.ts +0 -295
- package/src/http/handler.test.ts +0 -275
- package/src/http/handler.ts +0 -280
- package/src/http/index.ts +0 -11
- package/src/http/router.ts +0 -164
- package/src/http/types.ts +0 -44
- package/src/id.test.ts +0 -48
- package/src/id.ts +0 -22
- package/src/index.ts +0 -26
- package/src/operating-mode/__tests__/strategies.test.ts +0 -511
- package/src/operating-mode/client-safe-strategy.ts +0 -184
- package/src/operating-mode/client-unsafe-strategy.ts +0 -303
- package/src/operating-mode/client.ts +0 -13
- package/src/operating-mode/index.ts +0 -34
- package/src/operating-mode/types.ts +0 -186
- package/src/paths/__tests__/branch.test.ts +0 -53
- package/src/paths/__tests__/normalize.test.ts +0 -141
- package/src/paths/__tests__/resolve.test.ts +0 -207
- package/src/paths/__tests__/validation.test.ts +0 -61
- package/src/paths/branch.ts +0 -115
- package/src/paths/index.ts +0 -73
- package/src/paths/normalize-server.ts +0 -40
- package/src/paths/normalize.ts +0 -107
- package/src/paths/resolve.ts +0 -61
- package/src/paths/test-utils.ts +0 -37
- package/src/paths/types.ts +0 -68
- package/src/paths/validation.test.ts +0 -480
- package/src/paths/validation.ts +0 -391
- package/src/reference-resolver.test.ts +0 -107
- package/src/reference-resolver.ts +0 -157
- package/src/schema/index.ts +0 -29
- package/src/schema/meta-loader.ts +0 -366
- package/src/schema/resolver.ts +0 -83
- package/src/schema/schema-store-types.ts +0 -56
- package/src/schema/schema-store.test.ts +0 -816
- package/src/schema/schema-store.ts +0 -795
- package/src/schema/types.ts +0 -33
- package/src/schema-meta-loader.test.ts +0 -447
- package/src/server.ts +0 -15
- package/src/services.test.ts +0 -559
- package/src/services.ts +0 -373
- package/src/settings-branch-utils.ts +0 -53
- package/src/settings-workspace.ts +0 -156
- package/src/task-queue/README.md +0 -144
- package/src/task-queue/index.ts +0 -14
- package/src/task-queue/task-queue.test.ts +0 -524
- package/src/task-queue/task-queue.ts +0 -514
- package/src/task-queue/types.ts +0 -41
- package/src/test-utils/api-test-helpers.ts +0 -445
- package/src/test-utils/console-spy.test.ts +0 -14
- package/src/test-utils/console-spy.ts +0 -125
- package/src/test-utils/git-helpers.ts +0 -31
- package/src/test-utils/index.ts +0 -4
- package/src/types.ts +0 -54
- package/src/user.ts +0 -118
- package/src/utils/debug.test.ts +0 -114
- package/src/utils/debug.ts +0 -127
- package/src/utils/error.test.ts +0 -92
- package/src/utils/error.ts +0 -83
- package/src/utils/format.ts +0 -12
- package/src/validation/__tests__/field-traversal.test.ts +0 -263
- package/src/validation/deletion-checker.ts +0 -234
- package/src/validation/field-traversal.ts +0 -146
- package/src/validation/reference-validator.ts +0 -168
- package/src/worker/cms-worker-rebase.test.ts +0 -473
- package/src/worker/cms-worker.ts +0 -777
- package/src/worker/integration.test.ts +0 -289
- package/src/worker/task-queue-config.ts +0 -25
- package/src/worker/task-queue.test.ts +0 -452
- package/src/worker/task-queue.ts +0 -58
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { Avatar, Badge, Tooltip, Group, Text, Skeleton, ActionIcon } from '@mantine/core'
|
|
2
|
-
import { IconUserOff, IconX } from '@tabler/icons-react'
|
|
3
|
-
import type { UserSearchResult } from '../../auth/types'
|
|
4
|
-
import type { CanopyUserId } from '../../types'
|
|
5
|
-
import { useUserMetadata } from '../hooks/useUserMetadata'
|
|
6
|
-
|
|
7
|
-
export interface UserBadgeProps {
|
|
8
|
-
/** User ID to display */
|
|
9
|
-
userId: CanopyUserId
|
|
10
|
-
|
|
11
|
-
/** Function to fetch user metadata by ID */
|
|
12
|
-
getUserMetadata: (userId: string) => Promise<UserSearchResult | null>
|
|
13
|
-
|
|
14
|
-
/** Display mode */
|
|
15
|
-
variant?: 'avatar-only' | 'avatar-name' | 'full'
|
|
16
|
-
|
|
17
|
-
/** Show email tooltip on hover (default: true) */
|
|
18
|
-
showEmailTooltip?: boolean
|
|
19
|
-
|
|
20
|
-
/** Optional removal button */
|
|
21
|
-
onRemove?: (userId: CanopyUserId) => void
|
|
22
|
-
|
|
23
|
-
/** Color theme (for Badge wrapper) */
|
|
24
|
-
color?: string
|
|
25
|
-
|
|
26
|
-
/** Size (affects avatar and text size) */
|
|
27
|
-
size?: 'xs' | 'sm' | 'md' | 'lg'
|
|
28
|
-
|
|
29
|
-
/** Badge variant (when using Badge wrapper) */
|
|
30
|
-
badgeVariant?: 'filled' | 'light' | 'outline'
|
|
31
|
-
|
|
32
|
-
/** Always show Badge wrapper (even without onRemove) */
|
|
33
|
-
showBadge?: boolean
|
|
34
|
-
|
|
35
|
-
/** Loading state override */
|
|
36
|
-
loading?: boolean
|
|
37
|
-
|
|
38
|
-
/** Cached user data to avoid fetching (e.g., from search results) */
|
|
39
|
-
cachedUser?: UserSearchResult
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export const UserBadge: React.FC<UserBadgeProps> = ({
|
|
43
|
-
userId,
|
|
44
|
-
getUserMetadata,
|
|
45
|
-
variant = 'avatar-name',
|
|
46
|
-
showEmailTooltip = true,
|
|
47
|
-
onRemove,
|
|
48
|
-
color,
|
|
49
|
-
size = 'sm',
|
|
50
|
-
badgeVariant = 'filled',
|
|
51
|
-
showBadge = false,
|
|
52
|
-
loading: loadingOverride,
|
|
53
|
-
cachedUser,
|
|
54
|
-
}) => {
|
|
55
|
-
const { userMetadata, isLoading, error } = useUserMetadata(userId, getUserMetadata, cachedUser)
|
|
56
|
-
|
|
57
|
-
const loading = loadingOverride ?? isLoading
|
|
58
|
-
|
|
59
|
-
// Avatar size mapping
|
|
60
|
-
const avatarSize = {
|
|
61
|
-
xs: 16,
|
|
62
|
-
sm: 20,
|
|
63
|
-
md: 24,
|
|
64
|
-
lg: 32,
|
|
65
|
-
}[size]
|
|
66
|
-
|
|
67
|
-
// Text size mapping
|
|
68
|
-
const textSize = {
|
|
69
|
-
xs: 'xs',
|
|
70
|
-
sm: 'sm',
|
|
71
|
-
md: 'sm',
|
|
72
|
-
lg: 'md',
|
|
73
|
-
}[size] as 'xs' | 'sm' | 'md'
|
|
74
|
-
|
|
75
|
-
// Loading state
|
|
76
|
-
if (loading) {
|
|
77
|
-
return (
|
|
78
|
-
<Group gap={4}>
|
|
79
|
-
<Skeleton circle height={avatarSize} width={avatarSize} />
|
|
80
|
-
{variant !== 'avatar-only' && <Skeleton height={12} width={60} />}
|
|
81
|
-
</Group>
|
|
82
|
-
)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Error or missing user - fallback to userId
|
|
86
|
-
if (error || !userMetadata) {
|
|
87
|
-
const content = (
|
|
88
|
-
<Group gap={4}>
|
|
89
|
-
<Avatar size={avatarSize} color="gray" />
|
|
90
|
-
{variant !== 'avatar-only' && (
|
|
91
|
-
<Text size={textSize} c="dimmed">
|
|
92
|
-
{userId}
|
|
93
|
-
</Text>
|
|
94
|
-
)}
|
|
95
|
-
</Group>
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
return showEmailTooltip ? (
|
|
99
|
-
<Tooltip label={error ? 'Error loading user' : 'User not found'}>{content}</Tooltip>
|
|
100
|
-
) : (
|
|
101
|
-
content
|
|
102
|
-
)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Generate initials from name
|
|
106
|
-
const getInitials = (name: string): string => {
|
|
107
|
-
const parts = name.trim().split(/\s+/)
|
|
108
|
-
if (parts.length === 1) return parts[0].charAt(0).toUpperCase()
|
|
109
|
-
return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase()
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Render avatar
|
|
113
|
-
const renderAvatar = () => {
|
|
114
|
-
// Special case: anonymous user
|
|
115
|
-
if (userId === 'anonymous') {
|
|
116
|
-
return (
|
|
117
|
-
<Avatar size={avatarSize} color="orange">
|
|
118
|
-
<IconUserOff size={avatarSize * 0.6} />
|
|
119
|
-
</Avatar>
|
|
120
|
-
)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// When inside Badge wrapper with filled/light variant, use white background for visibility
|
|
124
|
-
// For outline badges or no badge, use the passed color
|
|
125
|
-
let avatarColor = color || 'blue'
|
|
126
|
-
let avatarStyles: React.CSSProperties = {}
|
|
127
|
-
|
|
128
|
-
if (onRemove || showBadge) {
|
|
129
|
-
if (badgeVariant === 'filled') {
|
|
130
|
-
// Filled badges: white background with dark text for maximum contrast
|
|
131
|
-
avatarStyles = {
|
|
132
|
-
backgroundColor: 'white',
|
|
133
|
-
color: 'var(--mantine-color-dark-6)',
|
|
134
|
-
}
|
|
135
|
-
} else if (badgeVariant === 'light') {
|
|
136
|
-
// Light badges: use dark avatar for contrast
|
|
137
|
-
avatarColor = 'dark'
|
|
138
|
-
}
|
|
139
|
-
// outline badges: keep the passed color
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return (
|
|
143
|
-
<Avatar
|
|
144
|
-
src={userMetadata.avatarUrl}
|
|
145
|
-
size={avatarSize}
|
|
146
|
-
color={avatarColor}
|
|
147
|
-
style={avatarStyles}
|
|
148
|
-
>
|
|
149
|
-
{!userMetadata.avatarUrl && getInitials(userMetadata.name)}
|
|
150
|
-
</Avatar>
|
|
151
|
-
)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Render content based on variant
|
|
155
|
-
const renderContent = () => {
|
|
156
|
-
const avatar = renderAvatar()
|
|
157
|
-
|
|
158
|
-
switch (variant) {
|
|
159
|
-
case 'avatar-only':
|
|
160
|
-
return avatar
|
|
161
|
-
|
|
162
|
-
case 'full':
|
|
163
|
-
return (
|
|
164
|
-
<Group gap={4}>
|
|
165
|
-
{avatar}
|
|
166
|
-
<div>
|
|
167
|
-
<Text size={textSize} fw={500}>
|
|
168
|
-
{userMetadata.name}
|
|
169
|
-
</Text>
|
|
170
|
-
<Text size="xs" c="dimmed">
|
|
171
|
-
{userMetadata.email}
|
|
172
|
-
</Text>
|
|
173
|
-
</div>
|
|
174
|
-
</Group>
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
case 'avatar-name':
|
|
178
|
-
default:
|
|
179
|
-
return (
|
|
180
|
-
<Group gap={4}>
|
|
181
|
-
{avatar}
|
|
182
|
-
<Text size={textSize} fw={500}>
|
|
183
|
-
{userId === 'anonymous' ? 'Anonymous (Public)' : userMetadata.name}
|
|
184
|
-
</Text>
|
|
185
|
-
</Group>
|
|
186
|
-
)
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
const content = renderContent()
|
|
191
|
-
|
|
192
|
-
// If onRemove or showBadge, wrap the content in a Badge
|
|
193
|
-
if (onRemove || showBadge) {
|
|
194
|
-
const badgeContent = (
|
|
195
|
-
<Badge
|
|
196
|
-
variant={badgeVariant}
|
|
197
|
-
color={color}
|
|
198
|
-
pr={onRemove ? 3 : 8}
|
|
199
|
-
pl={4}
|
|
200
|
-
rightSection={
|
|
201
|
-
onRemove ? (
|
|
202
|
-
<ActionIcon
|
|
203
|
-
size="xs"
|
|
204
|
-
radius="xl"
|
|
205
|
-
variant="transparent"
|
|
206
|
-
onClick={() => onRemove(userId)}
|
|
207
|
-
aria-label="Remove user"
|
|
208
|
-
style={{ color: 'white' }}
|
|
209
|
-
>
|
|
210
|
-
<IconX size={12} stroke={2.5} />
|
|
211
|
-
</ActionIcon>
|
|
212
|
-
) : undefined
|
|
213
|
-
}
|
|
214
|
-
styles={{
|
|
215
|
-
label: {
|
|
216
|
-
textTransform: 'none',
|
|
217
|
-
display: 'flex',
|
|
218
|
-
alignItems: 'center',
|
|
219
|
-
gap: '4px',
|
|
220
|
-
},
|
|
221
|
-
}}
|
|
222
|
-
>
|
|
223
|
-
{content}
|
|
224
|
-
</Badge>
|
|
225
|
-
)
|
|
226
|
-
|
|
227
|
-
return showEmailTooltip && variant !== 'full' ? (
|
|
228
|
-
<Tooltip label={userMetadata.email}>{badgeContent}</Tooltip>
|
|
229
|
-
) : (
|
|
230
|
-
badgeContent
|
|
231
|
-
)
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// No badge wrapper - just wrap with tooltip if needed
|
|
235
|
-
return showEmailTooltip && variant !== 'full' ? (
|
|
236
|
-
<Tooltip label={userMetadata.email}>{content}</Tooltip>
|
|
237
|
-
) : (
|
|
238
|
-
content
|
|
239
|
-
)
|
|
240
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* API Client Context
|
|
5
|
-
*
|
|
6
|
-
* Provides dependency injection for the API client via context-based pattern
|
|
7
|
-
* pattern that was duplicated across 6 hooks. This enables:
|
|
8
|
-
* - Clean testing via provider (no more resetApiClient() hacks)
|
|
9
|
-
* - Explicit dependency
|
|
10
|
-
* - No global mutable state
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import React, { createContext, useContext, useMemo } from 'react'
|
|
14
|
-
import { createApiClient } from '../../api'
|
|
15
|
-
|
|
16
|
-
export type ApiClient = ReturnType<typeof createApiClient>
|
|
17
|
-
|
|
18
|
-
const ApiClientContext = createContext<ApiClient | null>(null)
|
|
19
|
-
|
|
20
|
-
export interface ApiClientProviderProps {
|
|
21
|
-
children: React.ReactNode
|
|
22
|
-
/** Optional custom client for testing */
|
|
23
|
-
client?: ApiClient
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Provider that creates and provides the API client.
|
|
28
|
-
* Use the client prop to inject a mock client for testing.
|
|
29
|
-
*/
|
|
30
|
-
export function ApiClientProvider({ children, client }: ApiClientProviderProps) {
|
|
31
|
-
const apiClient = useMemo(() => {
|
|
32
|
-
return client ?? createApiClient()
|
|
33
|
-
}, [client])
|
|
34
|
-
|
|
35
|
-
return <ApiClientContext.Provider value={apiClient}>{children}</ApiClientContext.Provider>
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Hook to access the API client.
|
|
40
|
-
* Must be used within an ApiClientProvider.
|
|
41
|
-
*/
|
|
42
|
-
export function useApiClient(): ApiClient {
|
|
43
|
-
const client = useContext(ApiClientContext)
|
|
44
|
-
if (!client) {
|
|
45
|
-
throw new Error('useApiClient must be used within an ApiClientProvider')
|
|
46
|
-
}
|
|
47
|
-
return client
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Hook that returns the API client or null if not in a provider.
|
|
52
|
-
* Useful for conditional usage or graceful degradation.
|
|
53
|
-
*/
|
|
54
|
-
export function useOptionalApiClient(): ApiClient | null {
|
|
55
|
-
return useContext(ApiClientContext)
|
|
56
|
-
}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Editor State Context
|
|
5
|
-
*
|
|
6
|
-
* Consolidates editor-wide state that was previously scattered across
|
|
7
|
-
* the Editor component. This reduces prop drilling and makes state
|
|
8
|
-
* management more explicit.
|
|
9
|
-
*
|
|
10
|
-
* Manages:
|
|
11
|
-
* - Loading states (branches, entries, comments)
|
|
12
|
-
* - Modal/drawer open states
|
|
13
|
-
* - Preview data and loading state
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import React, { createContext, useContext, useCallback, useState, useMemo } from 'react'
|
|
17
|
-
import type { FormValue } from '../FormRenderer'
|
|
18
|
-
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// Types
|
|
21
|
-
// ============================================================================
|
|
22
|
-
|
|
23
|
-
export interface LoadingState {
|
|
24
|
-
branches: boolean
|
|
25
|
-
entries: boolean
|
|
26
|
-
comments: boolean
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface ModalState {
|
|
30
|
-
navigator: boolean
|
|
31
|
-
branchManager: boolean
|
|
32
|
-
groupManager: boolean
|
|
33
|
-
permissionManager: boolean
|
|
34
|
-
commentsPanel: boolean
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface PreviewState {
|
|
38
|
-
data: FormValue
|
|
39
|
-
loading: FormValue
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface EditorState {
|
|
43
|
-
loading: LoadingState
|
|
44
|
-
modals: ModalState
|
|
45
|
-
preview: PreviewState
|
|
46
|
-
/** True if any resource is loading */
|
|
47
|
-
busy: boolean
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface EditorStateActions {
|
|
51
|
-
setLoading: (key: keyof LoadingState, value: boolean) => void
|
|
52
|
-
openModal: (key: keyof ModalState) => void
|
|
53
|
-
closeModal: (key: keyof ModalState) => void
|
|
54
|
-
toggleModal: (key: keyof ModalState) => void
|
|
55
|
-
setPreviewData: (data: FormValue) => void
|
|
56
|
-
setPreviewLoading: (loading: FormValue) => void
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface EditorStateContextValue {
|
|
60
|
-
state: EditorState
|
|
61
|
-
actions: EditorStateActions
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// ============================================================================
|
|
65
|
-
// Context
|
|
66
|
-
// ============================================================================
|
|
67
|
-
|
|
68
|
-
const EditorStateContext = createContext<EditorStateContextValue | null>(null)
|
|
69
|
-
|
|
70
|
-
// ============================================================================
|
|
71
|
-
// Provider
|
|
72
|
-
// ============================================================================
|
|
73
|
-
|
|
74
|
-
export interface EditorStateProviderProps {
|
|
75
|
-
children: React.ReactNode
|
|
76
|
-
/** Initial modal states (useful for deep linking) */
|
|
77
|
-
initialModals?: Partial<ModalState>
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export function EditorStateProvider({ children, initialModals }: EditorStateProviderProps) {
|
|
81
|
-
// Loading states
|
|
82
|
-
const [loading, setLoadingState] = useState<LoadingState>({
|
|
83
|
-
branches: false,
|
|
84
|
-
entries: false,
|
|
85
|
-
comments: false,
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
// Modal states
|
|
89
|
-
const [modals, setModals] = useState<ModalState>({
|
|
90
|
-
navigator: false,
|
|
91
|
-
branchManager: false,
|
|
92
|
-
groupManager: false,
|
|
93
|
-
permissionManager: false,
|
|
94
|
-
commentsPanel: false,
|
|
95
|
-
...initialModals,
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
// Preview states
|
|
99
|
-
const [previewData, setPreviewDataState] = useState<FormValue>({})
|
|
100
|
-
const [previewLoading, setPreviewLoadingState] = useState<FormValue>({})
|
|
101
|
-
|
|
102
|
-
// Computed busy state
|
|
103
|
-
const busy = loading.branches || loading.entries || loading.comments
|
|
104
|
-
|
|
105
|
-
// Actions
|
|
106
|
-
const setLoading = useCallback((key: keyof LoadingState, value: boolean) => {
|
|
107
|
-
setLoadingState((prev) => ({ ...prev, [key]: value }))
|
|
108
|
-
}, [])
|
|
109
|
-
|
|
110
|
-
const openModal = useCallback((key: keyof ModalState) => {
|
|
111
|
-
setModals((prev) => ({ ...prev, [key]: true }))
|
|
112
|
-
}, [])
|
|
113
|
-
|
|
114
|
-
const closeModal = useCallback((key: keyof ModalState) => {
|
|
115
|
-
setModals((prev) => ({ ...prev, [key]: false }))
|
|
116
|
-
}, [])
|
|
117
|
-
|
|
118
|
-
const toggleModal = useCallback((key: keyof ModalState) => {
|
|
119
|
-
setModals((prev) => ({ ...prev, [key]: !prev[key] }))
|
|
120
|
-
}, [])
|
|
121
|
-
|
|
122
|
-
const setPreviewData = useCallback((data: FormValue) => {
|
|
123
|
-
setPreviewDataState(data)
|
|
124
|
-
}, [])
|
|
125
|
-
|
|
126
|
-
const setPreviewLoading = useCallback((loading: FormValue) => {
|
|
127
|
-
setPreviewLoadingState(loading)
|
|
128
|
-
}, [])
|
|
129
|
-
|
|
130
|
-
// Memoize context value
|
|
131
|
-
const value = useMemo<EditorStateContextValue>(
|
|
132
|
-
() => ({
|
|
133
|
-
state: {
|
|
134
|
-
loading,
|
|
135
|
-
modals,
|
|
136
|
-
preview: {
|
|
137
|
-
data: previewData,
|
|
138
|
-
loading: previewLoading,
|
|
139
|
-
},
|
|
140
|
-
busy,
|
|
141
|
-
},
|
|
142
|
-
actions: {
|
|
143
|
-
setLoading,
|
|
144
|
-
openModal,
|
|
145
|
-
closeModal,
|
|
146
|
-
toggleModal,
|
|
147
|
-
setPreviewData,
|
|
148
|
-
setPreviewLoading,
|
|
149
|
-
},
|
|
150
|
-
}),
|
|
151
|
-
[
|
|
152
|
-
loading,
|
|
153
|
-
modals,
|
|
154
|
-
previewData,
|
|
155
|
-
previewLoading,
|
|
156
|
-
busy,
|
|
157
|
-
setLoading,
|
|
158
|
-
openModal,
|
|
159
|
-
closeModal,
|
|
160
|
-
toggleModal,
|
|
161
|
-
setPreviewData,
|
|
162
|
-
setPreviewLoading,
|
|
163
|
-
],
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
return <EditorStateContext.Provider value={value}>{children}</EditorStateContext.Provider>
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// ============================================================================
|
|
170
|
-
// Hooks
|
|
171
|
-
// ============================================================================
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Access the full editor state context.
|
|
175
|
-
* Must be used within an EditorStateProvider.
|
|
176
|
-
*/
|
|
177
|
-
export function useEditorState(): EditorStateContextValue {
|
|
178
|
-
const context = useContext(EditorStateContext)
|
|
179
|
-
if (!context) {
|
|
180
|
-
throw new Error('useEditorState must be used within an EditorStateProvider')
|
|
181
|
-
}
|
|
182
|
-
return context
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Convenience hook for loading states only.
|
|
187
|
-
*/
|
|
188
|
-
export function useEditorLoading() {
|
|
189
|
-
const { state, actions } = useEditorState()
|
|
190
|
-
return {
|
|
191
|
-
...state.loading,
|
|
192
|
-
busy: state.busy,
|
|
193
|
-
setLoading: actions.setLoading,
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Convenience hook for modal states only.
|
|
199
|
-
*/
|
|
200
|
-
export function useEditorModals() {
|
|
201
|
-
const { state, actions } = useEditorState()
|
|
202
|
-
return {
|
|
203
|
-
...state.modals,
|
|
204
|
-
openModal: actions.openModal,
|
|
205
|
-
closeModal: actions.closeModal,
|
|
206
|
-
toggleModal: actions.toggleModal,
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Convenience hook for preview state only.
|
|
212
|
-
*/
|
|
213
|
-
export function useEditorPreview() {
|
|
214
|
-
const { state, actions } = useEditorState()
|
|
215
|
-
return {
|
|
216
|
-
data: state.preview.data,
|
|
217
|
-
loading: state.preview.loading,
|
|
218
|
-
setData: actions.setPreviewData,
|
|
219
|
-
setLoading: actions.setPreviewLoading,
|
|
220
|
-
}
|
|
221
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Editor Context Providers
|
|
3
|
-
*
|
|
4
|
-
* These contexts consolidate editor-wide state and dependencies:
|
|
5
|
-
*
|
|
6
|
-
* - ApiClientContext: Dependency injection for API client (context-based pattern)
|
|
7
|
-
* - EditorStateContext: Loading states, modal states, preview data
|
|
8
|
-
*
|
|
9
|
-
* Usage:
|
|
10
|
-
* ```tsx
|
|
11
|
-
* <ApiClientProvider>
|
|
12
|
-
* <EditorStateProvider>
|
|
13
|
-
* <Editor />
|
|
14
|
-
* </EditorStateProvider>
|
|
15
|
-
* </ApiClientProvider>
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
export {
|
|
20
|
-
ApiClientProvider,
|
|
21
|
-
useApiClient,
|
|
22
|
-
useOptionalApiClient,
|
|
23
|
-
type ApiClient,
|
|
24
|
-
type ApiClientProviderProps,
|
|
25
|
-
} from './ApiClientContext'
|
|
26
|
-
|
|
27
|
-
export {
|
|
28
|
-
EditorStateProvider,
|
|
29
|
-
useEditorState,
|
|
30
|
-
useEditorLoading,
|
|
31
|
-
useEditorModals,
|
|
32
|
-
useEditorPreview,
|
|
33
|
-
type EditorState,
|
|
34
|
-
type EditorStateActions,
|
|
35
|
-
type EditorStateContextValue,
|
|
36
|
-
type EditorStateProviderProps,
|
|
37
|
-
type LoadingState,
|
|
38
|
-
type ModalState,
|
|
39
|
-
type PreviewState,
|
|
40
|
-
} from './EditorStateContext'
|