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,139 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for prod-sim mode initialization.
|
|
3
|
-
* Tests that branch workspaces are created correctly with proper
|
|
4
|
-
* handling of concurrent requests (no race conditions).
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
8
|
-
import fs from 'node:fs/promises'
|
|
9
|
-
import path from 'node:path'
|
|
10
|
-
|
|
11
|
-
import { BranchWorkspaceManager } from '../../branch-workspace'
|
|
12
|
-
import { createTestWorkspace, type TestWorkspace } from '../test-utils/test-workspace'
|
|
13
|
-
import { BLOG_SCHEMA } from '../fixtures/schemas'
|
|
14
|
-
|
|
15
|
-
describe('prod-sim Initialization', () => {
|
|
16
|
-
let workspace: TestWorkspace
|
|
17
|
-
|
|
18
|
-
beforeEach(async () => {
|
|
19
|
-
workspace = await createTestWorkspace({
|
|
20
|
-
schema: BLOG_SCHEMA,
|
|
21
|
-
mode: 'prod-sim',
|
|
22
|
-
})
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
afterEach(async () => {
|
|
26
|
-
await workspace.cleanup()
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('handles concurrent branch initialization without race conditions', async () => {
|
|
30
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
31
|
-
|
|
32
|
-
// Fire 5 concurrent requests to create the same branch workspace
|
|
33
|
-
// This simulates multiple API requests hitting the server simultaneously
|
|
34
|
-
const initPromises = Promise.all([
|
|
35
|
-
manager.openOrCreateBranch({
|
|
36
|
-
branchName: 'main',
|
|
37
|
-
mode: 'prod-sim',
|
|
38
|
-
createdBy: 'test-1',
|
|
39
|
-
}),
|
|
40
|
-
manager.openOrCreateBranch({
|
|
41
|
-
branchName: 'main',
|
|
42
|
-
mode: 'prod-sim',
|
|
43
|
-
createdBy: 'test-2',
|
|
44
|
-
}),
|
|
45
|
-
manager.openOrCreateBranch({
|
|
46
|
-
branchName: 'main',
|
|
47
|
-
mode: 'prod-sim',
|
|
48
|
-
createdBy: 'test-3',
|
|
49
|
-
}),
|
|
50
|
-
manager.openOrCreateBranch({
|
|
51
|
-
branchName: 'main',
|
|
52
|
-
mode: 'prod-sim',
|
|
53
|
-
createdBy: 'test-4',
|
|
54
|
-
}),
|
|
55
|
-
manager.openOrCreateBranch({
|
|
56
|
-
branchName: 'main',
|
|
57
|
-
mode: 'prod-sim',
|
|
58
|
-
createdBy: 'test-5',
|
|
59
|
-
}),
|
|
60
|
-
])
|
|
61
|
-
|
|
62
|
-
// All should succeed without errors
|
|
63
|
-
const contexts = await initPromises
|
|
64
|
-
expect(contexts).toHaveLength(5)
|
|
65
|
-
|
|
66
|
-
// All should return valid contexts
|
|
67
|
-
contexts.forEach((ctx) => {
|
|
68
|
-
expect(ctx.branch.name).toBe('main')
|
|
69
|
-
expect(ctx.branchRoot).toBeTruthy()
|
|
70
|
-
expect(ctx.baseRoot).toBeTruthy()
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
// Verify only one workspace was created (no duplicates from race)
|
|
74
|
-
const branchesDir = path.join(workspace.tmpRoot, '.canopy-prod-sim', 'content-branches')
|
|
75
|
-
const entries = await fs.readdir(branchesDir)
|
|
76
|
-
|
|
77
|
-
// Should have main workspace + branches.json
|
|
78
|
-
expect(entries).toContain('main')
|
|
79
|
-
const mainDirs = entries.filter((e) => e === 'main')
|
|
80
|
-
expect(mainDirs.length).toBe(1)
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it('creates valid git workspace with correct remote', async () => {
|
|
84
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
85
|
-
|
|
86
|
-
// Trigger initialization
|
|
87
|
-
const context = await manager.openOrCreateBranch({
|
|
88
|
-
branchName: 'main',
|
|
89
|
-
mode: 'prod-sim',
|
|
90
|
-
createdBy: 'test',
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
const mainWorkspace = context.branchRoot
|
|
94
|
-
|
|
95
|
-
// Verify it's a git repo
|
|
96
|
-
const gitDir = path.join(mainWorkspace, '.git')
|
|
97
|
-
const gitStat = await fs.stat(gitDir)
|
|
98
|
-
expect(gitStat.isDirectory()).toBe(true)
|
|
99
|
-
|
|
100
|
-
// Verify git remote is configured
|
|
101
|
-
const { simpleGit } = await import('simple-git')
|
|
102
|
-
const git = simpleGit({ baseDir: mainWorkspace })
|
|
103
|
-
|
|
104
|
-
const remotes = await git.getRemotes(true)
|
|
105
|
-
expect(remotes.length).toBeGreaterThan(0)
|
|
106
|
-
expect(remotes[0].name).toBe('origin')
|
|
107
|
-
|
|
108
|
-
// Verify on main branch
|
|
109
|
-
const branch = await git.branchLocal()
|
|
110
|
-
expect(branch.current).toBe('main')
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
it('workspace persists across multiple operations', async () => {
|
|
114
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
115
|
-
|
|
116
|
-
// First initialization
|
|
117
|
-
const firstContext = await manager.openOrCreateBranch({
|
|
118
|
-
branchName: 'main',
|
|
119
|
-
mode: 'prod-sim',
|
|
120
|
-
createdBy: 'test-1',
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
// Second access should load existing workspace
|
|
124
|
-
const secondContext = await manager.openOrCreateBranch({
|
|
125
|
-
branchName: 'main',
|
|
126
|
-
mode: 'prod-sim',
|
|
127
|
-
createdBy: 'test-2',
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
// Should return the same workspace path
|
|
131
|
-
expect(secondContext.branchRoot).toBe(firstContext.branchRoot)
|
|
132
|
-
|
|
133
|
-
// Verify only one workspace exists
|
|
134
|
-
const branchesDir = path.join(workspace.tmpRoot, '.canopy-prod-sim', 'content-branches')
|
|
135
|
-
const entries = await fs.readdir(branchesDir)
|
|
136
|
-
const mainDirs = entries.filter((e) => e === 'main')
|
|
137
|
-
expect(mainDirs.length).toBe(1)
|
|
138
|
-
})
|
|
139
|
-
})
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for path-based permissions.
|
|
3
|
-
* Tests glob pattern matching, first-match-wins rule, and permission levels.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
7
|
-
|
|
8
|
-
import { createTestWorkspace, type TestWorkspace } from '../test-utils/test-workspace'
|
|
9
|
-
import { createTestUser } from '../test-utils/multi-user'
|
|
10
|
-
import { BLOG_SCHEMA } from '../fixtures/schemas'
|
|
11
|
-
import { BranchWorkspaceManager } from '../../branch-workspace'
|
|
12
|
-
import {
|
|
13
|
-
checkBranchAccessWithDefault,
|
|
14
|
-
loadPathPermissions,
|
|
15
|
-
savePathPermissions,
|
|
16
|
-
createCheckPathAccess,
|
|
17
|
-
} from '../../authorization'
|
|
18
|
-
import { unsafeAsPermissionPath } from '../../authorization/test-utils'
|
|
19
|
-
import { unsafeAsPhysicalPath } from '../../paths/test-utils'
|
|
20
|
-
|
|
21
|
-
describe('Path Permission Integration', () => {
|
|
22
|
-
let workspace: TestWorkspace
|
|
23
|
-
|
|
24
|
-
beforeEach(async () => {
|
|
25
|
-
workspace = await createTestWorkspace({
|
|
26
|
-
schema: BLOG_SCHEMA,
|
|
27
|
-
defaultPathAccess: 'allow',
|
|
28
|
-
})
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
afterEach(async () => {
|
|
32
|
-
await workspace.cleanup()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('restricts editor from editing posts/** when not in allowed group', async () => {
|
|
36
|
-
const editor = createTestUser('editor')
|
|
37
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
38
|
-
|
|
39
|
-
const branch = await manager.openOrCreateBranch({
|
|
40
|
-
branchName: 'test-permissions',
|
|
41
|
-
mode: 'prod-sim',
|
|
42
|
-
title: 'Permission Test',
|
|
43
|
-
createdBy: editor.userId,
|
|
44
|
-
remoteUrl: workspace.remotePath,
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
// Set up path permissions: only 'BlogAuthors' group can edit posts
|
|
48
|
-
await savePathPermissions(
|
|
49
|
-
branch.branchRoot,
|
|
50
|
-
[
|
|
51
|
-
{
|
|
52
|
-
path: unsafeAsPermissionPath('content/posts/**'),
|
|
53
|
-
edit: { allowedGroups: ['BlogAuthors'] },
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
'test-admin',
|
|
57
|
-
'prod-sim',
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
// Load permissions and check access
|
|
61
|
-
const rules = await loadPathPermissions(branch.branchRoot, 'prod-sim')
|
|
62
|
-
const pathChecker = createCheckPathAccess(rules, workspace.config.defaultPathAccess ?? 'deny')
|
|
63
|
-
|
|
64
|
-
const access = pathChecker({
|
|
65
|
-
relativePath: unsafeAsPhysicalPath('content/posts/hello.mdx'),
|
|
66
|
-
user: editor,
|
|
67
|
-
level: 'edit',
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
expect(access.allowed).toBe(false)
|
|
71
|
-
expect(access.reason).toBe('denied_by_rule')
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
it('allows admin to bypass path permissions', async () => {
|
|
75
|
-
const admin = createTestUser('admin')
|
|
76
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
77
|
-
|
|
78
|
-
const branch = await manager.openOrCreateBranch({
|
|
79
|
-
branchName: 'test-admin-bypass',
|
|
80
|
-
mode: 'prod-sim',
|
|
81
|
-
title: 'Admin Bypass Test',
|
|
82
|
-
createdBy: admin.userId,
|
|
83
|
-
remoteUrl: workspace.remotePath,
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
// Check branch access first - admin should have bypass
|
|
87
|
-
const branchAccess = checkBranchAccessWithDefault(branch, admin)
|
|
88
|
-
expect(branchAccess.allowed).toBe(true)
|
|
89
|
-
expect(branchAccess.reason).toBe('privileged')
|
|
90
|
-
|
|
91
|
-
// Set up strict path permissions
|
|
92
|
-
await savePathPermissions(
|
|
93
|
-
branch.branchRoot,
|
|
94
|
-
[
|
|
95
|
-
{
|
|
96
|
-
path: unsafeAsPermissionPath('content/posts/**'),
|
|
97
|
-
edit: { allowedGroups: ['BlogAuthors'] },
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
admin.userId,
|
|
101
|
-
'prod-sim',
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
// Admin bypasses at branch level, so path restrictions don't matter
|
|
105
|
-
const rules = await loadPathPermissions(branch.branchRoot, 'prod-sim')
|
|
106
|
-
const pathChecker = createCheckPathAccess(rules, workspace.config.defaultPathAccess ?? 'deny')
|
|
107
|
-
|
|
108
|
-
// Path check alone would fail for non-BlogAuthors
|
|
109
|
-
const pathAccess = pathChecker({
|
|
110
|
-
relativePath: unsafeAsPhysicalPath('content/posts/restricted.mdx'),
|
|
111
|
-
user: admin,
|
|
112
|
-
level: 'edit',
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
// Admin has bypass via groups (Admins group), but path check would deny
|
|
116
|
-
expect(admin.groups).toContain('Admins')
|
|
117
|
-
// Path access would be denied for non-BlogAuthors, but admin bypasses at branch level
|
|
118
|
-
expect(pathAccess.allowed).toBe(true) // Path rule denies, but admin bypasses elsewhere
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
it('applies first-match-wins rule for glob patterns', async () => {
|
|
122
|
-
const editor = createTestUser('editor')
|
|
123
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
124
|
-
|
|
125
|
-
const branch = await manager.openOrCreateBranch({
|
|
126
|
-
branchName: 'test-glob-matching',
|
|
127
|
-
mode: 'prod-sim',
|
|
128
|
-
title: 'Glob Pattern Test',
|
|
129
|
-
createdBy: editor.userId,
|
|
130
|
-
remoteUrl: workspace.remotePath,
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
// Set up overlapping permissions - first match wins
|
|
134
|
-
await savePathPermissions(
|
|
135
|
-
branch.branchRoot,
|
|
136
|
-
[
|
|
137
|
-
{
|
|
138
|
-
path: unsafeAsPermissionPath('content/posts/public-*'),
|
|
139
|
-
edit: { allowedGroups: ['ContentEditors'] }, // Allow ContentEditors to edit public posts
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
path: unsafeAsPermissionPath('content/posts/**'),
|
|
143
|
-
edit: { allowedGroups: ['BlogAuthors'] }, // Restrict all other posts to BlogAuthors
|
|
144
|
-
},
|
|
145
|
-
],
|
|
146
|
-
'test-admin',
|
|
147
|
-
'prod-sim',
|
|
148
|
-
)
|
|
149
|
-
|
|
150
|
-
const rules = await loadPathPermissions(branch.branchRoot, 'prod-sim')
|
|
151
|
-
const pathChecker = createCheckPathAccess(rules, workspace.config.defaultPathAccess ?? 'deny')
|
|
152
|
-
|
|
153
|
-
// Check access to public post (should match first rule)
|
|
154
|
-
const publicAccess = pathChecker({
|
|
155
|
-
relativePath: unsafeAsPhysicalPath('content/posts/public-announcement.mdx'),
|
|
156
|
-
user: editor,
|
|
157
|
-
level: 'edit',
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
expect(publicAccess.allowed).toBe(true)
|
|
161
|
-
|
|
162
|
-
// Check access to private post (should match second rule and be denied)
|
|
163
|
-
const privateAccess = pathChecker({
|
|
164
|
-
relativePath: unsafeAsPhysicalPath('content/posts/private-draft.mdx'),
|
|
165
|
-
user: editor,
|
|
166
|
-
level: 'edit',
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
expect(privateAccess.allowed).toBe(false)
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
it('supports different permission levels: read, edit, review', async () => {
|
|
173
|
-
const reviewer = createTestUser('reviewer')
|
|
174
|
-
const editor = createTestUser('editor')
|
|
175
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
176
|
-
|
|
177
|
-
const branch = await manager.openOrCreateBranch({
|
|
178
|
-
branchName: 'test-permission-levels',
|
|
179
|
-
mode: 'prod-sim',
|
|
180
|
-
title: 'Permission Levels Test',
|
|
181
|
-
createdBy: editor.userId,
|
|
182
|
-
remoteUrl: workspace.remotePath,
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
// Set up multi-level permissions
|
|
186
|
-
await savePathPermissions(
|
|
187
|
-
branch.branchRoot,
|
|
188
|
-
[
|
|
189
|
-
{
|
|
190
|
-
path: unsafeAsPermissionPath('content/posts/**'),
|
|
191
|
-
// No read restriction (defaults to allow if defaultPathAccess is 'allow')
|
|
192
|
-
edit: { allowedGroups: ['ContentEditors'] }, // Only editors can edit
|
|
193
|
-
review: { allowedGroups: ['Reviewers', 'Admins'] }, // Only reviewers can review
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
'test-admin',
|
|
197
|
-
'prod-sim',
|
|
198
|
-
)
|
|
199
|
-
|
|
200
|
-
const rules = await loadPathPermissions(branch.branchRoot, 'prod-sim')
|
|
201
|
-
const pathChecker = createCheckPathAccess(rules, workspace.config.defaultPathAccess ?? 'deny')
|
|
202
|
-
|
|
203
|
-
// Reviewer can read and review, but not edit
|
|
204
|
-
const reviewerReadAccess = pathChecker({
|
|
205
|
-
relativePath: unsafeAsPhysicalPath('content/posts/test.mdx'),
|
|
206
|
-
user: reviewer,
|
|
207
|
-
level: 'read',
|
|
208
|
-
})
|
|
209
|
-
expect(reviewerReadAccess.allowed).toBe(true)
|
|
210
|
-
|
|
211
|
-
const reviewerReviewAccess = pathChecker({
|
|
212
|
-
relativePath: unsafeAsPhysicalPath('content/posts/test.mdx'),
|
|
213
|
-
user: reviewer,
|
|
214
|
-
level: 'review',
|
|
215
|
-
})
|
|
216
|
-
expect(reviewerReviewAccess.allowed).toBe(true)
|
|
217
|
-
|
|
218
|
-
const reviewerEditAccess = pathChecker({
|
|
219
|
-
relativePath: unsafeAsPhysicalPath('content/posts/test.mdx'),
|
|
220
|
-
user: reviewer,
|
|
221
|
-
level: 'edit',
|
|
222
|
-
})
|
|
223
|
-
expect(reviewerEditAccess.allowed).toBe(false)
|
|
224
|
-
|
|
225
|
-
// Editor can read and edit, but not review
|
|
226
|
-
const editorReadAccess = pathChecker({
|
|
227
|
-
relativePath: unsafeAsPhysicalPath('content/posts/test.mdx'),
|
|
228
|
-
user: editor,
|
|
229
|
-
level: 'read',
|
|
230
|
-
})
|
|
231
|
-
expect(editorReadAccess.allowed).toBe(true)
|
|
232
|
-
|
|
233
|
-
const editorEditAccess = pathChecker({
|
|
234
|
-
relativePath: unsafeAsPhysicalPath('content/posts/test.mdx'),
|
|
235
|
-
user: editor,
|
|
236
|
-
level: 'edit',
|
|
237
|
-
})
|
|
238
|
-
expect(editorEditAccess.allowed).toBe(true)
|
|
239
|
-
|
|
240
|
-
const editorReviewAccess = pathChecker({
|
|
241
|
-
relativePath: unsafeAsPhysicalPath('content/posts/test.mdx'),
|
|
242
|
-
user: editor,
|
|
243
|
-
level: 'review',
|
|
244
|
-
})
|
|
245
|
-
expect(editorReviewAccess.allowed).toBe(false)
|
|
246
|
-
})
|
|
247
|
-
|
|
248
|
-
it('allows entry access with specific path rules', async () => {
|
|
249
|
-
const editor = createTestUser('editor')
|
|
250
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
251
|
-
|
|
252
|
-
const branch = await manager.openOrCreateBranch({
|
|
253
|
-
branchName: 'test-entry-perms',
|
|
254
|
-
mode: 'prod-sim',
|
|
255
|
-
title: 'Entry Permission Test',
|
|
256
|
-
createdBy: editor.userId,
|
|
257
|
-
remoteUrl: workspace.remotePath,
|
|
258
|
-
})
|
|
259
|
-
|
|
260
|
-
// Allow editing about page for ContentEditors
|
|
261
|
-
await savePathPermissions(
|
|
262
|
-
branch.branchRoot,
|
|
263
|
-
[
|
|
264
|
-
{
|
|
265
|
-
path: unsafeAsPermissionPath('content/about.md'),
|
|
266
|
-
edit: { allowedGroups: ['ContentEditors'] },
|
|
267
|
-
},
|
|
268
|
-
],
|
|
269
|
-
'test-admin',
|
|
270
|
-
'prod-sim',
|
|
271
|
-
)
|
|
272
|
-
|
|
273
|
-
const rules = await loadPathPermissions(branch.branchRoot, 'prod-sim')
|
|
274
|
-
const pathChecker = createCheckPathAccess(rules, workspace.config.defaultPathAccess ?? 'deny')
|
|
275
|
-
|
|
276
|
-
// Editor should have access to about page
|
|
277
|
-
const access = pathChecker({
|
|
278
|
-
relativePath: unsafeAsPhysicalPath('content/about.md'),
|
|
279
|
-
user: editor,
|
|
280
|
-
level: 'edit',
|
|
281
|
-
})
|
|
282
|
-
|
|
283
|
-
expect(access.allowed).toBe(true)
|
|
284
|
-
})
|
|
285
|
-
|
|
286
|
-
it('persists permission rules across branch lifecycle', async () => {
|
|
287
|
-
const admin = createTestUser('admin')
|
|
288
|
-
const manager = new BranchWorkspaceManager(workspace.config)
|
|
289
|
-
|
|
290
|
-
const branch = await manager.openOrCreateBranch({
|
|
291
|
-
branchName: 'test-persist-perms',
|
|
292
|
-
mode: 'prod-sim',
|
|
293
|
-
title: 'Permission Persistence Test',
|
|
294
|
-
createdBy: admin.userId,
|
|
295
|
-
remoteUrl: workspace.remotePath,
|
|
296
|
-
})
|
|
297
|
-
|
|
298
|
-
// Set up permissions
|
|
299
|
-
const initialRules: any[] = [
|
|
300
|
-
{
|
|
301
|
-
path: unsafeAsPermissionPath('content/posts/**'),
|
|
302
|
-
edit: { allowedGroups: ['BlogAuthors'] },
|
|
303
|
-
},
|
|
304
|
-
]
|
|
305
|
-
|
|
306
|
-
await savePathPermissions(branch.branchRoot, initialRules, admin.userId, 'prod-sim')
|
|
307
|
-
|
|
308
|
-
// Load and verify
|
|
309
|
-
const loadedRules = await loadPathPermissions(branch.branchRoot, 'prod-sim')
|
|
310
|
-
expect(loadedRules).toHaveLength(1)
|
|
311
|
-
expect(loadedRules[0].path).toBe('content/posts/**')
|
|
312
|
-
expect(loadedRules[0].edit?.allowedGroups).toContain('BlogAuthors')
|
|
313
|
-
})
|
|
314
|
-
})
|