canopycms 0.0.0 → 0.0.2
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/dist/auth/plugin.d.ts +8 -0
- package/dist/auth/plugin.d.ts.map +1 -1
- package/dist/build-mode.d.ts +15 -5
- package/dist/build-mode.d.ts.map +1 -1
- package/dist/build-mode.js +18 -8
- package/dist/build-mode.js.map +1 -1
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +37 -36
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/template-files/ai-config.ts.template +21 -0
- package/dist/cli/template-files/ai-route.ts.template +10 -0
- package/dist/cli/template-files/canopy.ts.template +24 -0
- package/dist/cli/templates.d.ts +5 -1
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +9 -2
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/schemas/config.d.ts +4 -0
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +2 -0
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config/types.d.ts +5 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/content-reader.js +2 -2
- package/dist/content-reader.js.map +1 -1
- package/dist/context.js +5 -5
- package/dist/context.js.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.js +15 -18
- package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
- package/dist/operating-mode/types.d.ts +8 -0
- package/dist/operating-mode/types.d.ts.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/package.json +5 -4
- package/src/cli/init.ts +43 -38
- 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/canopy.ts.template +0 -55
- 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
- /package/{src/cli/templates → dist/cli/template-files}/Dockerfile.cms.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/canopycms.config.ts.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/deploy-cms.yml.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/edit-page.tsx.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/route.ts.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/schemas.ts.template +0 -0
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* PermissionManager - Re-export from permission-manager module.
|
|
5
|
-
*
|
|
6
|
-
* This file maintains backward compatibility for imports.
|
|
7
|
-
* The actual implementation is in ./permission-manager/
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
export { PermissionManager, usePermissionTree, useGroupsAndUsers } from './permission-manager'
|
|
11
|
-
|
|
12
|
-
export type { PermissionManagerProps, ContentNode, TreeNode } from './permission-manager'
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
|
|
3
|
-
import { formatCanopyPath, normalizeCanopyPath, parseCanopyPath } from './canopy-path'
|
|
4
|
-
|
|
5
|
-
describe('canopy path helpers', () => {
|
|
6
|
-
it('formats segments with bracketed arrays', () => {
|
|
7
|
-
expect(formatCanopyPath(['blocks', 0, 'title'])).toBe('blocks[0].title')
|
|
8
|
-
expect(formatCanopyPath(['features', 3])).toBe('features[3]')
|
|
9
|
-
expect(formatCanopyPath([0, 'title'])).toBe('[0].title')
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
it('parses dotted or bracketed input into segments', () => {
|
|
13
|
-
expect(parseCanopyPath('blocks[1].cta.text')).toEqual(['blocks', 1, 'cta', 'text'])
|
|
14
|
-
expect(parseCanopyPath('blocks.2.title')).toEqual(['blocks', 2, 'title'])
|
|
15
|
-
expect(parseCanopyPath('[0].title')).toEqual([0, 'title'])
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('normalizes mixed input to canonical string', () => {
|
|
19
|
-
expect(normalizeCanopyPath('blocks.0.title')).toBe('blocks[0].title')
|
|
20
|
-
expect(normalizeCanopyPath(['blocks', 0, 'title'])).toBe('blocks[0].title')
|
|
21
|
-
expect(normalizeCanopyPath('blocks[0].title')).toBe('blocks[0].title')
|
|
22
|
-
})
|
|
23
|
-
})
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
export type CanopyPathSegment = string | number
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Convert a list of path segments into the canonical CanopyCMS path string.
|
|
5
|
-
* Arrays are rendered with bracket notation (e.g., blocks[0].title).
|
|
6
|
-
*/
|
|
7
|
-
export const formatCanopyPath = (segments: CanopyPathSegment[]): string => {
|
|
8
|
-
return segments.reduce<string>((acc, segment, index) => {
|
|
9
|
-
if (typeof segment === 'number') {
|
|
10
|
-
return `${acc}[${segment}]`
|
|
11
|
-
}
|
|
12
|
-
const prefix = index === 0 ? '' : '.'
|
|
13
|
-
return `${acc}${prefix}${segment}`
|
|
14
|
-
}, '')
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Parse a CanopyCMS path string into segments. Supports bracketed array
|
|
19
|
-
* indices and dotted segments (e.g., blocks.0.title or blocks[0].title).
|
|
20
|
-
*/
|
|
21
|
-
export const parseCanopyPath = (path: string): CanopyPathSegment[] => {
|
|
22
|
-
const segments: CanopyPathSegment[] = []
|
|
23
|
-
const matcher = /([^[.\]]+)|\[(\d+)\]/g
|
|
24
|
-
let match: RegExpExecArray | null
|
|
25
|
-
|
|
26
|
-
while ((match = matcher.exec(path)) !== null) {
|
|
27
|
-
if (match[1]) {
|
|
28
|
-
const raw = match[1]
|
|
29
|
-
// Allow dotted numeric segments (e.g., blocks.0.title)
|
|
30
|
-
if (/^\d+$/.test(raw)) {
|
|
31
|
-
segments.push(Number(raw))
|
|
32
|
-
} else {
|
|
33
|
-
segments.push(raw)
|
|
34
|
-
}
|
|
35
|
-
} else if (match[2]) {
|
|
36
|
-
segments.push(Number(match[2]))
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return segments
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Normalize any supported path input (string or segments) into the
|
|
45
|
-
* canonical bracketed representation.
|
|
46
|
-
*/
|
|
47
|
-
export const normalizeCanopyPath = (input: string | CanopyPathSegment[]): string => {
|
|
48
|
-
if (Array.isArray(input)) {
|
|
49
|
-
return formatCanopyPath(input)
|
|
50
|
-
}
|
|
51
|
-
return formatCanopyPath(parseCanopyPath(input))
|
|
52
|
-
}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import type { EntrySchema, FieldConfig, ReferenceFieldConfig } from '../config'
|
|
2
|
-
import type { FormValue } from './FormRenderer'
|
|
3
|
-
import { createApiClient } from '../api/client'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Client-side utility for incrementally resolving reference fields in form data.
|
|
7
|
-
* Used by FormRenderer to transform draft data before sending to preview.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Find which fields changed between two form values.
|
|
12
|
-
* Only returns top-level field configs for fields that changed.
|
|
13
|
-
*/
|
|
14
|
-
export function findChangedFields(
|
|
15
|
-
prevValue: FormValue,
|
|
16
|
-
currentValue: FormValue,
|
|
17
|
-
schema: EntrySchema,
|
|
18
|
-
): FieldConfig[] {
|
|
19
|
-
const changed: FieldConfig[] = []
|
|
20
|
-
|
|
21
|
-
for (const field of schema) {
|
|
22
|
-
const prevFieldValue = prevValue[field.name]
|
|
23
|
-
const currentFieldValue = currentValue[field.name]
|
|
24
|
-
|
|
25
|
-
// Deep equality check for objects and arrays
|
|
26
|
-
if (JSON.stringify(prevFieldValue) !== JSON.stringify(currentFieldValue)) {
|
|
27
|
-
changed.push(field)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return changed
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Resolve changed references incrementally.
|
|
36
|
-
* Only resolves reference fields that have changed.
|
|
37
|
-
* Uses cache to avoid duplicate API calls.
|
|
38
|
-
*/
|
|
39
|
-
export async function resolveChangedReferences(
|
|
40
|
-
prevValue: FormValue,
|
|
41
|
-
currentValue: FormValue,
|
|
42
|
-
schema: EntrySchema,
|
|
43
|
-
branch: string,
|
|
44
|
-
cache: Map<string, unknown>,
|
|
45
|
-
): Promise<Partial<FormValue>> {
|
|
46
|
-
const changedFields = findChangedFields(prevValue, currentValue, schema)
|
|
47
|
-
const updates: Partial<FormValue> = {}
|
|
48
|
-
|
|
49
|
-
for (const field of changedFields) {
|
|
50
|
-
if (field.type === 'reference') {
|
|
51
|
-
const refField = field as ReferenceFieldConfig
|
|
52
|
-
const fieldValue = currentValue[field.name]
|
|
53
|
-
|
|
54
|
-
// Resolve this field's value
|
|
55
|
-
if (refField.list && Array.isArray(fieldValue)) {
|
|
56
|
-
// List of references
|
|
57
|
-
const resolved = await Promise.all(
|
|
58
|
-
fieldValue.map((id) => resolveReferenceId(id, branch, cache)),
|
|
59
|
-
)
|
|
60
|
-
updates[field.name] = resolved
|
|
61
|
-
} else if (fieldValue) {
|
|
62
|
-
// Single reference
|
|
63
|
-
const resolved = await resolveReferenceId(fieldValue, branch, cache)
|
|
64
|
-
updates[field.name] = resolved
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return updates
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Resolve a single reference ID to full object.
|
|
74
|
-
* Checks cache first, then makes API call if needed.
|
|
75
|
-
* Returns original ID if resolution fails.
|
|
76
|
-
*/
|
|
77
|
-
async function resolveReferenceId(
|
|
78
|
-
id: unknown,
|
|
79
|
-
branch: string,
|
|
80
|
-
cache: Map<string, unknown>,
|
|
81
|
-
): Promise<unknown> {
|
|
82
|
-
// Only resolve string IDs
|
|
83
|
-
if (typeof id !== 'string') {
|
|
84
|
-
return id
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Check if already resolved (has __typename or other object properties)
|
|
88
|
-
if (typeof id === 'object' && id !== null) {
|
|
89
|
-
return id
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const cacheKey = `${branch}:${id}`
|
|
93
|
-
|
|
94
|
-
// Check cache first
|
|
95
|
-
if (cache.has(cacheKey)) {
|
|
96
|
-
return cache.get(cacheKey)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
try {
|
|
100
|
-
// Fetch from API (single ID)
|
|
101
|
-
const apiClient = createApiClient()
|
|
102
|
-
const result = await apiClient.content.resolveReferences({ branch }, { ids: [id] })
|
|
103
|
-
|
|
104
|
-
if (result.ok && result.data && result.data.resolved[id]) {
|
|
105
|
-
// Cache and return resolved object
|
|
106
|
-
const resolved = result.data.resolved[id]
|
|
107
|
-
cache.set(cacheKey, resolved)
|
|
108
|
-
return resolved
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Resolution failed - return original ID string
|
|
112
|
-
return id
|
|
113
|
-
} catch (error) {
|
|
114
|
-
console.error(`Failed to resolve reference ID ${id}:`, error)
|
|
115
|
-
// Return original ID on error
|
|
116
|
-
return id
|
|
117
|
-
}
|
|
118
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import React, { useMemo, useState } from 'react'
|
|
4
|
-
import { Box, Button } from '@mantine/core'
|
|
5
|
-
import type { CommentThread } from '../../comment-store'
|
|
6
|
-
import type { UserSearchResult } from '../../auth/types'
|
|
7
|
-
import { ThreadCarousel } from './ThreadCarousel'
|
|
8
|
-
|
|
9
|
-
export interface BranchCommentsProps {
|
|
10
|
-
/** All comments (will be filtered for branch-level) */
|
|
11
|
-
comments: CommentThread[]
|
|
12
|
-
/** Current user ID */
|
|
13
|
-
currentUserId: string
|
|
14
|
-
/** Whether user can resolve threads */
|
|
15
|
-
canResolve: boolean
|
|
16
|
-
/** Handler to add a comment */
|
|
17
|
-
onAddComment: (
|
|
18
|
-
text: string,
|
|
19
|
-
type: 'field' | 'entry' | 'branch',
|
|
20
|
-
entryPath?: string,
|
|
21
|
-
canopyPath?: string,
|
|
22
|
-
threadId?: string,
|
|
23
|
-
) => Promise<void>
|
|
24
|
-
/** Handler to resolve a thread */
|
|
25
|
-
onResolveThread: (threadId: string) => Promise<void>
|
|
26
|
-
/** Auto-focus and expand */
|
|
27
|
-
autoFocus?: boolean
|
|
28
|
-
/** Thread ID to highlight and scroll to */
|
|
29
|
-
highlightThreadId?: string
|
|
30
|
-
/** Optional function to fetch user metadata for displaying user badges */
|
|
31
|
-
onGetUserMetadata?: (userId: string) => Promise<UserSearchResult | null>
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Branch-level comments section displayed at the top of BranchManager.
|
|
36
|
-
* Uses ThreadCarousel for navigation.
|
|
37
|
-
*/
|
|
38
|
-
export const BranchComments: React.FC<BranchCommentsProps> = ({
|
|
39
|
-
comments,
|
|
40
|
-
currentUserId,
|
|
41
|
-
canResolve,
|
|
42
|
-
onAddComment,
|
|
43
|
-
onResolveThread,
|
|
44
|
-
autoFocus,
|
|
45
|
-
highlightThreadId,
|
|
46
|
-
onGetUserMetadata,
|
|
47
|
-
}) => {
|
|
48
|
-
const [showCarousel, setShowCarousel] = useState(false)
|
|
49
|
-
|
|
50
|
-
// Filter for branch-level threads
|
|
51
|
-
const branchThreads = useMemo(() => comments.filter((t) => t.type === 'branch'), [comments])
|
|
52
|
-
|
|
53
|
-
// Show carousel if threads exist or if auto-focused
|
|
54
|
-
const shouldShowCarousel = branchThreads.length > 0 || showCarousel || autoFocus
|
|
55
|
-
|
|
56
|
-
// Wrapper to add branch context to comment handler
|
|
57
|
-
const handleAddComment = async (text: string, threadId?: string) => {
|
|
58
|
-
await onAddComment(text, 'branch', undefined, undefined, threadId)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Show "New branch comment" button when no threads
|
|
62
|
-
if (!shouldShowCarousel) {
|
|
63
|
-
return (
|
|
64
|
-
<Box>
|
|
65
|
-
<Button
|
|
66
|
-
size="xs"
|
|
67
|
-
variant="subtle"
|
|
68
|
-
color="gray"
|
|
69
|
-
onClick={() => setShowCarousel(true)}
|
|
70
|
-
style={{ fontSize: '0.75rem', height: '1.5rem' }}
|
|
71
|
-
>
|
|
72
|
-
New branch comment
|
|
73
|
-
</Button>
|
|
74
|
-
</Box>
|
|
75
|
-
)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return (
|
|
79
|
-
<ThreadCarousel
|
|
80
|
-
threads={branchThreads}
|
|
81
|
-
label="Branch Discussion"
|
|
82
|
-
contextType="branch"
|
|
83
|
-
currentUserId={currentUserId}
|
|
84
|
-
canResolve={canResolve}
|
|
85
|
-
onAddComment={handleAddComment}
|
|
86
|
-
onResolveThread={onResolveThread}
|
|
87
|
-
autoFocus={autoFocus}
|
|
88
|
-
autoOpenNewThread={showCarousel && branchThreads.length === 0}
|
|
89
|
-
highlightThreadId={highlightThreadId}
|
|
90
|
-
onGetUserMetadata={onGetUserMetadata}
|
|
91
|
-
/>
|
|
92
|
-
)
|
|
93
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import React, { useMemo, useState } from 'react'
|
|
4
|
-
import { Box, Button } from '@mantine/core'
|
|
5
|
-
import type { CommentThread } from '../../comment-store'
|
|
6
|
-
import { ThreadCarousel } from './ThreadCarousel'
|
|
7
|
-
|
|
8
|
-
export interface EntryCommentsProps {
|
|
9
|
-
/** All comments (will be filtered for entry-level) */
|
|
10
|
-
comments: CommentThread[]
|
|
11
|
-
/** Current entry path */
|
|
12
|
-
entryPath: string
|
|
13
|
-
/** Current user ID */
|
|
14
|
-
currentUserId: string
|
|
15
|
-
/** Whether user can resolve threads */
|
|
16
|
-
canResolve: boolean
|
|
17
|
-
/** Handler to add a comment */
|
|
18
|
-
onAddComment: (
|
|
19
|
-
text: string,
|
|
20
|
-
type: 'field' | 'entry' | 'branch',
|
|
21
|
-
entryPath?: string,
|
|
22
|
-
canopyPath?: string,
|
|
23
|
-
threadId?: string,
|
|
24
|
-
) => Promise<void>
|
|
25
|
-
/** Handler to resolve a thread */
|
|
26
|
-
onResolveThread: (threadId: string) => Promise<void>
|
|
27
|
-
/** Auto-focus and expand */
|
|
28
|
-
autoFocus?: boolean
|
|
29
|
-
/** Thread ID to highlight and scroll to */
|
|
30
|
-
highlightThreadId?: string
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Entry-level comments section displayed at the top of the form.
|
|
35
|
-
* Uses ThreadCarousel for navigation.
|
|
36
|
-
*/
|
|
37
|
-
export const EntryComments: React.FC<EntryCommentsProps> = ({
|
|
38
|
-
comments,
|
|
39
|
-
entryPath,
|
|
40
|
-
currentUserId,
|
|
41
|
-
canResolve,
|
|
42
|
-
onAddComment,
|
|
43
|
-
onResolveThread,
|
|
44
|
-
autoFocus,
|
|
45
|
-
highlightThreadId,
|
|
46
|
-
}) => {
|
|
47
|
-
const [showCarousel, setShowCarousel] = useState(false)
|
|
48
|
-
|
|
49
|
-
// Filter for entry-level threads
|
|
50
|
-
const entryThreads = useMemo(
|
|
51
|
-
() => comments.filter((t) => t.type === 'entry' && t.entryPath === entryPath),
|
|
52
|
-
[comments, entryPath],
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
// Show carousel if threads exist or if auto-focused
|
|
56
|
-
const shouldShowCarousel = entryThreads.length > 0 || showCarousel || autoFocus
|
|
57
|
-
|
|
58
|
-
// Wrapper to add entry context to comment handler
|
|
59
|
-
const handleAddComment = async (text: string, threadId?: string) => {
|
|
60
|
-
await onAddComment(text, 'entry', entryPath, undefined, threadId)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Show "New file comment" button when no threads
|
|
64
|
-
if (!shouldShowCarousel) {
|
|
65
|
-
return (
|
|
66
|
-
<Box>
|
|
67
|
-
<Button
|
|
68
|
-
size="xs"
|
|
69
|
-
variant="subtle"
|
|
70
|
-
color="gray"
|
|
71
|
-
onClick={() => setShowCarousel(true)}
|
|
72
|
-
style={{ fontSize: '0.75rem', height: '1.5rem' }}
|
|
73
|
-
>
|
|
74
|
-
New file comment
|
|
75
|
-
</Button>
|
|
76
|
-
</Box>
|
|
77
|
-
)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return (
|
|
81
|
-
<ThreadCarousel
|
|
82
|
-
threads={entryThreads}
|
|
83
|
-
label="Entry Comments"
|
|
84
|
-
contextType="entry"
|
|
85
|
-
currentUserId={currentUserId}
|
|
86
|
-
canResolve={canResolve}
|
|
87
|
-
onAddComment={handleAddComment}
|
|
88
|
-
onResolveThread={onResolveThread}
|
|
89
|
-
autoFocus={autoFocus}
|
|
90
|
-
autoOpenNewThread={showCarousel && entryThreads.length === 0}
|
|
91
|
-
highlightThreadId={highlightThreadId}
|
|
92
|
-
/>
|
|
93
|
-
)
|
|
94
|
-
}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
-
import { FieldWrapper } from './FieldWrapper'
|
|
3
|
-
import type { CommentThread } from '../../comment-store'
|
|
4
|
-
import { TextInput, Box } from '@mantine/core'
|
|
5
|
-
|
|
6
|
-
const meta: Meta<typeof FieldWrapper> = {
|
|
7
|
-
title: 'Editor/Comments/FieldWrapper',
|
|
8
|
-
component: FieldWrapper,
|
|
9
|
-
decorators: [
|
|
10
|
-
(Story) => (
|
|
11
|
-
<Box p="xl" bg="gray.0">
|
|
12
|
-
<Story />
|
|
13
|
-
</Box>
|
|
14
|
-
),
|
|
15
|
-
],
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export default meta
|
|
19
|
-
type Story = StoryObj<typeof FieldWrapper>
|
|
20
|
-
|
|
21
|
-
const sampleThreads: CommentThread[] = [
|
|
22
|
-
{
|
|
23
|
-
id: 'thread-1',
|
|
24
|
-
type: 'field',
|
|
25
|
-
entryPath: 'posts/hello',
|
|
26
|
-
canopyPath: 'title',
|
|
27
|
-
authorId: 'alice',
|
|
28
|
-
resolved: false,
|
|
29
|
-
createdAt: new Date(Date.now() - 3600000).toISOString(),
|
|
30
|
-
comments: [
|
|
31
|
-
{
|
|
32
|
-
id: 'comment-1',
|
|
33
|
-
threadId: 'thread-1',
|
|
34
|
-
userId: 'alice',
|
|
35
|
-
timestamp: new Date(Date.now() - 3600000).toISOString(),
|
|
36
|
-
text: 'This title needs work.',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
id: 'comment-2',
|
|
40
|
-
threadId: 'thread-1',
|
|
41
|
-
userId: 'bob',
|
|
42
|
-
timestamp: new Date(Date.now() - 1800000).toISOString(),
|
|
43
|
-
text: 'I agree, let me revise it.',
|
|
44
|
-
},
|
|
45
|
-
],
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
id: 'thread-2',
|
|
49
|
-
type: 'field',
|
|
50
|
-
entryPath: 'posts/hello',
|
|
51
|
-
canopyPath: 'title',
|
|
52
|
-
authorId: 'charlie',
|
|
53
|
-
resolved: false,
|
|
54
|
-
createdAt: new Date(Date.now() - 7200000).toISOString(),
|
|
55
|
-
comments: [
|
|
56
|
-
{
|
|
57
|
-
id: 'comment-3',
|
|
58
|
-
threadId: 'thread-2',
|
|
59
|
-
userId: 'charlie',
|
|
60
|
-
timestamp: new Date(Date.now() - 7200000).toISOString(),
|
|
61
|
-
text: 'Another concern here.',
|
|
62
|
-
},
|
|
63
|
-
],
|
|
64
|
-
},
|
|
65
|
-
]
|
|
66
|
-
|
|
67
|
-
const resolvedThreads: CommentThread[] = [
|
|
68
|
-
{
|
|
69
|
-
id: 'thread-3',
|
|
70
|
-
type: 'field',
|
|
71
|
-
entryPath: 'posts/hello',
|
|
72
|
-
canopyPath: 'title',
|
|
73
|
-
authorId: 'alice',
|
|
74
|
-
resolved: true,
|
|
75
|
-
createdAt: new Date(Date.now() - 86400000).toISOString(),
|
|
76
|
-
resolvedBy: 'bob',
|
|
77
|
-
resolvedAt: new Date(Date.now() - 43200000).toISOString(),
|
|
78
|
-
comments: [
|
|
79
|
-
{
|
|
80
|
-
id: 'comment-4',
|
|
81
|
-
threadId: 'thread-3',
|
|
82
|
-
userId: 'alice',
|
|
83
|
-
timestamp: new Date(Date.now() - 86400000).toISOString(),
|
|
84
|
-
text: 'Fixed now!',
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
},
|
|
88
|
-
]
|
|
89
|
-
|
|
90
|
-
export const WithUnresolvedComments: Story = {
|
|
91
|
-
args: {
|
|
92
|
-
children: <TextInput label="Title" placeholder="Enter title..." />,
|
|
93
|
-
canopyPath: 'title',
|
|
94
|
-
entryPath: 'posts/hello',
|
|
95
|
-
threads: sampleThreads,
|
|
96
|
-
autoFocus: false,
|
|
97
|
-
currentUserId: 'alice',
|
|
98
|
-
canResolve: true,
|
|
99
|
-
onAddComment: async (
|
|
100
|
-
text: string,
|
|
101
|
-
type: string,
|
|
102
|
-
entryPath?: string,
|
|
103
|
-
canopyPath?: string,
|
|
104
|
-
threadId?: string,
|
|
105
|
-
) => {
|
|
106
|
-
console.log('Add comment:', {
|
|
107
|
-
text,
|
|
108
|
-
type,
|
|
109
|
-
entryPath,
|
|
110
|
-
canopyPath,
|
|
111
|
-
threadId,
|
|
112
|
-
})
|
|
113
|
-
await new Promise((resolve) => setTimeout(resolve, 500))
|
|
114
|
-
},
|
|
115
|
-
onResolveThread: async (threadId: string) => {
|
|
116
|
-
console.log('Resolve thread:', threadId)
|
|
117
|
-
await new Promise((resolve) => setTimeout(resolve, 500))
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export const WithResolvedComments: Story = {
|
|
123
|
-
args: {
|
|
124
|
-
children: <TextInput label="Title" placeholder="Enter title..." />,
|
|
125
|
-
canopyPath: 'title',
|
|
126
|
-
entryPath: 'posts/hello',
|
|
127
|
-
threads: resolvedThreads,
|
|
128
|
-
autoFocus: false,
|
|
129
|
-
currentUserId: 'alice',
|
|
130
|
-
canResolve: true,
|
|
131
|
-
onAddComment: async (
|
|
132
|
-
text: string,
|
|
133
|
-
type: string,
|
|
134
|
-
entryPath?: string,
|
|
135
|
-
canopyPath?: string,
|
|
136
|
-
threadId?: string,
|
|
137
|
-
) => {
|
|
138
|
-
console.log('Add comment:', {
|
|
139
|
-
text,
|
|
140
|
-
type,
|
|
141
|
-
entryPath,
|
|
142
|
-
canopyPath,
|
|
143
|
-
threadId,
|
|
144
|
-
})
|
|
145
|
-
},
|
|
146
|
-
onResolveThread: async (threadId: string) => {
|
|
147
|
-
console.log('Resolve thread:', threadId)
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export const NoComments: Story = {
|
|
153
|
-
args: {
|
|
154
|
-
children: <TextInput label="Description" placeholder="Enter description..." />,
|
|
155
|
-
canopyPath: 'description',
|
|
156
|
-
entryPath: 'posts/hello',
|
|
157
|
-
threads: [],
|
|
158
|
-
autoFocus: false,
|
|
159
|
-
currentUserId: 'alice',
|
|
160
|
-
canResolve: true,
|
|
161
|
-
onAddComment: async (
|
|
162
|
-
text: string,
|
|
163
|
-
type: string,
|
|
164
|
-
entryPath?: string,
|
|
165
|
-
canopyPath?: string,
|
|
166
|
-
threadId?: string,
|
|
167
|
-
) => {
|
|
168
|
-
console.log('Add comment:', {
|
|
169
|
-
text,
|
|
170
|
-
type,
|
|
171
|
-
entryPath,
|
|
172
|
-
canopyPath,
|
|
173
|
-
threadId,
|
|
174
|
-
})
|
|
175
|
-
},
|
|
176
|
-
onResolveThread: async (threadId: string) => {
|
|
177
|
-
console.log('Resolve thread:', threadId)
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export const AutoFocused: Story = {
|
|
183
|
-
args: {
|
|
184
|
-
children: <TextInput label="Title" placeholder="Enter title..." />,
|
|
185
|
-
canopyPath: 'title',
|
|
186
|
-
entryPath: 'posts/hello',
|
|
187
|
-
threads: sampleThreads,
|
|
188
|
-
autoFocus: true,
|
|
189
|
-
currentUserId: 'alice',
|
|
190
|
-
canResolve: true,
|
|
191
|
-
onAddComment: async (
|
|
192
|
-
text: string,
|
|
193
|
-
type: string,
|
|
194
|
-
entryPath?: string,
|
|
195
|
-
canopyPath?: string,
|
|
196
|
-
threadId?: string,
|
|
197
|
-
) => {
|
|
198
|
-
console.log('Add comment:', {
|
|
199
|
-
text,
|
|
200
|
-
type,
|
|
201
|
-
entryPath,
|
|
202
|
-
canopyPath,
|
|
203
|
-
threadId,
|
|
204
|
-
})
|
|
205
|
-
},
|
|
206
|
-
onResolveThread: async (threadId: string) => {
|
|
207
|
-
console.log('Resolve thread:', threadId)
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
}
|