canopycms 0.0.16 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/ai/generate.js +3 -3
  2. package/dist/ai/handler.js +5 -5
  3. package/dist/ai/index.js +3 -3
  4. package/dist/ai/resolve-branch.js +2 -2
  5. package/dist/api/__test__/mock-client.js +1 -1
  6. package/dist/api/assets.js +1 -1
  7. package/dist/api/branch-merge.js +3 -3
  8. package/dist/api/branch-review.js +4 -4
  9. package/dist/api/branch-status.js +8 -8
  10. package/dist/api/branch-withdraw.js +5 -5
  11. package/dist/api/branch.js +9 -9
  12. package/dist/api/comments.js +4 -4
  13. package/dist/api/content.js +5 -5
  14. package/dist/api/entries.js +8 -8
  15. package/dist/api/github-sync.js +3 -3
  16. package/dist/api/groups.js +4 -4
  17. package/dist/api/guards.js +1 -1
  18. package/dist/api/index.js +3 -3
  19. package/dist/api/permissions.js +4 -4
  20. package/dist/api/reference-options.js +5 -5
  21. package/dist/api/resolve-references.js +4 -4
  22. package/dist/api/route-builder.js +1 -1
  23. package/dist/api/schema.js +5 -5
  24. package/dist/api/settings-helpers.js +1 -1
  25. package/dist/api/user.js +1 -1
  26. package/dist/api/validators.js +3 -3
  27. package/dist/asset-store.js +1 -1
  28. package/dist/auth/cache.js +2 -2
  29. package/dist/auth/caching-auth-plugin.js +1 -1
  30. package/dist/auth/file-based-auth-cache.js +1 -1
  31. package/dist/auth/index.js +1 -1
  32. package/dist/authorization/branch.js +1 -1
  33. package/dist/authorization/content.js +3 -3
  34. package/dist/authorization/groups/index.js +2 -2
  35. package/dist/authorization/groups/loader.js +4 -4
  36. package/dist/authorization/index.js +8 -8
  37. package/dist/authorization/path.js +1 -1
  38. package/dist/authorization/permissions/index.js +2 -2
  39. package/dist/authorization/permissions/loader.js +3 -3
  40. package/dist/authorization/permissions/schema.js +1 -1
  41. package/dist/authorization/test-utils.js +1 -1
  42. package/dist/authorization/validation.js +1 -1
  43. package/dist/branch-metadata.js +3 -3
  44. package/dist/branch-registry.js +2 -2
  45. package/dist/branch-schema-cache.js +2 -2
  46. package/dist/branch-workspace.js +6 -6
  47. package/dist/build/generate-ai-content.js +4 -4
  48. package/dist/build/index.js +1 -1
  49. package/dist/cli/cli.js +5 -5
  50. package/dist/cli/generate-ai-content.js +1 -9
  51. package/dist/cli/init.js +2 -10
  52. package/dist/cli/sync.js +1 -1
  53. package/dist/client.js +9 -9
  54. package/dist/config/flatten.js +2 -2
  55. package/dist/config/helpers.js +3 -3
  56. package/dist/config/index.js +9 -9
  57. package/dist/config/schemas/collection.js +1 -1
  58. package/dist/config/schemas/config.js +2 -2
  59. package/dist/config/schemas/field.js +1 -1
  60. package/dist/config/validation.js +2 -2
  61. package/dist/config-test.js +2 -2
  62. package/dist/config.js +2 -2
  63. package/dist/content-id-index.js +2 -2
  64. package/dist/content-listing.js +7 -7
  65. package/dist/content-reader.js +5 -5
  66. package/dist/content-store.js +5 -5
  67. package/dist/content-tree.js +1 -1
  68. package/dist/context.js +6 -6
  69. package/dist/editor/BranchManager.js +4 -4
  70. package/dist/editor/CanopyEditor.js +3 -3
  71. package/dist/editor/CanopyEditorPage.js +1 -1
  72. package/dist/editor/CommentsPanel.js +1 -1
  73. package/dist/editor/Editor.js +18 -18
  74. package/dist/editor/EntryNavigator.js +1 -1
  75. package/dist/editor/FormRenderer.js +12 -12
  76. package/dist/editor/GroupManager.js +1 -1
  77. package/dist/editor/PermissionManager.js +1 -1
  78. package/dist/editor/client-reference-resolver.js +1 -1
  79. package/dist/editor/comments/BranchComments.js +1 -1
  80. package/dist/editor/comments/EntryComments.js +1 -1
  81. package/dist/editor/comments/FieldWrapper.js +1 -1
  82. package/dist/editor/comments/InlineCommentThread.js +1 -1
  83. package/dist/editor/comments/ThreadCarousel.js +1 -1
  84. package/dist/editor/components/EditorHeader.js +1 -1
  85. package/dist/editor/components/UserBadge.js +1 -1
  86. package/dist/editor/components/index.js +3 -3
  87. package/dist/editor/context/ApiClientContext.js +1 -1
  88. package/dist/editor/context/index.js +2 -2
  89. package/dist/editor/editor-utils.js +1 -1
  90. package/dist/editor/fields/BlockField.js +1 -1
  91. package/dist/editor/fields/ObjectField.js +1 -1
  92. package/dist/editor/fields/ReferenceField.js +1 -1
  93. package/dist/editor/group-manager/GroupCard.js +1 -1
  94. package/dist/editor/group-manager/InternalGroupsTab.js +1 -1
  95. package/dist/editor/group-manager/MemberList.js +1 -1
  96. package/dist/editor/group-manager/index.js +9 -9
  97. package/dist/editor/hooks/__test__/test-utils.js +3 -3
  98. package/dist/editor/hooks/index.js +11 -11
  99. package/dist/editor/hooks/useBranchActions.js +1 -1
  100. package/dist/editor/hooks/useBranchManager.js +1 -1
  101. package/dist/editor/hooks/useCommentSystem.js +2 -2
  102. package/dist/editor/hooks/useDraftManager.js +1 -1
  103. package/dist/editor/hooks/useEntryManager.js +3 -3
  104. package/dist/editor/hooks/useGroupManager.js +1 -1
  105. package/dist/editor/hooks/usePermissionManager.js +1 -1
  106. package/dist/editor/hooks/useReferenceResolution.js +1 -1
  107. package/dist/editor/hooks/useSchemaManager.js +1 -1
  108. package/dist/editor/hooks/useUserContext.js +1 -1
  109. package/dist/editor/permission-manager/PermissionEditor.js +4 -4
  110. package/dist/editor/permission-manager/PermissionLevelBadge.js +1 -1
  111. package/dist/editor/permission-manager/PermissionTree.js +3 -3
  112. package/dist/editor/permission-manager/UserSelector.js +1 -1
  113. package/dist/editor/permission-manager/hooks/usePermissionTree.js +2 -2
  114. package/dist/editor/permission-manager/index.js +6 -6
  115. package/dist/editor/preview-bridge.js +1 -1
  116. package/dist/editor/schema-editor/CollectionEditor.js +2 -2
  117. package/dist/editor/schema-editor/index.js +2 -2
  118. package/dist/entry-schema-registry.js +3 -3
  119. package/dist/git-manager.js +4 -4
  120. package/dist/github-service.js +1 -1
  121. package/dist/http/handler.js +7 -7
  122. package/dist/http/index.js +3 -3
  123. package/dist/http/router.js +12 -12
  124. package/dist/id.js +1 -1
  125. package/dist/index.js +6 -6
  126. package/dist/operating-mode/client-unsafe-strategy.js +2 -2
  127. package/dist/operating-mode/client.js +1 -1
  128. package/dist/operating-mode/index.js +2 -2
  129. package/dist/paths/branch.js +1 -1
  130. package/dist/paths/index.js +6 -6
  131. package/dist/paths/test-utils.js +1 -1
  132. package/dist/paths/validation.js +1 -1
  133. package/dist/reference-resolver.js +1 -1
  134. package/dist/schema/index.js +2 -2
  135. package/dist/schema/meta-loader.js +1 -1
  136. package/dist/schema/resolver.js +1 -1
  137. package/dist/schema/schema-store.js +4 -4
  138. package/dist/server.js +13 -13
  139. package/dist/services.js +12 -12
  140. package/dist/settings-branch-utils.js +1 -1
  141. package/dist/settings-workspace.js +3 -3
  142. package/dist/task-queue/index.js +1 -1
  143. package/dist/task-queue/task-queue.js +1 -1
  144. package/dist/user.js +1 -1
  145. package/dist/utils/fs.js +1 -1
  146. package/dist/validation/reference-validator.js +2 -2
  147. package/dist/worker/cms-worker.js +5 -5
  148. package/dist/worker/task-queue-config.js +1 -1
  149. package/dist/worker/task-queue.js +2 -2
  150. package/package.json +1 -1
@@ -3,7 +3,7 @@ import { forwardRef } from 'react';
3
3
  import { Badge, Box, Button, Group, Menu, Paper, Stack, Text, Title, Tooltip } from '@mantine/core';
4
4
  import { MdFolderOpen, MdKeyboardArrowDown } from 'react-icons/md';
5
5
  import { GoGitBranch } from 'react-icons/go';
6
- import { clientOperatingStrategy } from '../../operating-mode/client';
6
+ import { clientOperatingStrategy } from '../../operating-mode/client.js';
7
7
  /**
8
8
  * Status color map matching BranchManager.tsx pattern.
9
9
  * Returns the Mantine color string for a given branch status.
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Avatar, Badge, Tooltip, Group, Text, Skeleton, ActionIcon } from '@mantine/core';
3
3
  import { IconUserOff, IconX } from '@tabler/icons-react';
4
- import { useUserMetadata } from '../hooks/useUserMetadata';
4
+ import { useUserMetadata } from '../hooks/useUserMetadata.js';
5
5
  export const UserBadge = ({ userId, getUserMetadata, variant = 'avatar-name', showEmailTooltip = true, onRemove, color, size = 'sm', badgeVariant = 'filled', showBadge = false, loading: loadingOverride, cachedUser, }) => {
6
6
  const { userMetadata, isLoading, error } = useUserMetadata(userId, getUserMetadata, cachedUser);
7
7
  const loading = loadingOverride ?? isLoading;
@@ -1,6 +1,6 @@
1
1
  // Barrel export for all Editor UI components
2
2
  // Export components as they are created
3
- export * from './EditorFooter';
4
- export * from './EditorHeader';
5
- export * from './EditorSidebar';
3
+ export * from './EditorFooter.js';
4
+ export * from './EditorHeader.js';
5
+ export * from './EditorSidebar.js';
6
6
  //# sourceMappingURL=index.js.map
@@ -10,7 +10,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
10
10
  * - No global mutable state
11
11
  */
12
12
  import { createContext, useContext, useMemo } from 'react';
13
- import { createApiClient } from '../../api';
13
+ import { createApiClient } from '../../api/index.js';
14
14
  const ApiClientContext = createContext(null);
15
15
  /**
16
16
  * Provider that creates and provides the API client.
@@ -15,6 +15,6 @@
15
15
  * </ApiClientProvider>
16
16
  * ```
17
17
  */
18
- export { ApiClientProvider, useApiClient, useOptionalApiClient, } from './ApiClientContext';
19
- export { EditorStateProvider, useEditorState, useEditorLoading, useEditorModals, useEditorPreview, } from './EditorStateContext';
18
+ export { ApiClientProvider, useApiClient, useOptionalApiClient, } from './ApiClientContext.js';
19
+ export { EditorStateProvider, useEditorState, useEditorLoading, useEditorModals, useEditorPreview, } from './EditorStateContext.js';
20
20
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  // Import directly from normalize to avoid pulling in server-only branch.ts
2
- import { normalizeCollectionPath } from '../paths/normalize';
2
+ import { normalizeCollectionPath } from '../paths/normalize.js';
3
3
  export { normalizeCollectionPath };
4
4
  export const encodeSlug = (value) => (value ?? '')
5
5
  .split('/')
@@ -5,7 +5,7 @@ import { ActionIcon, Button, Group, Paper, Select, Stack, Text } from '@mantine/
5
5
  import { DndContext, KeyboardSensor, PointerSensor, useSensor, useSensors, } from '@dnd-kit/core';
6
6
  import { SortableContext, arrayMove, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy, } from '@dnd-kit/sortable';
7
7
  import { CSS } from '@dnd-kit/utilities';
8
- import { formatCanopyPath } from '../canopy-path';
8
+ import { formatCanopyPath } from '../canopy-path.js';
9
9
  const findTemplate = (templates, name) => templates.find((t) => t.name === name);
10
10
  const SortableBlock = ({ id, children }) => {
11
11
  const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Paper, Stack, Text } from '@mantine/core';
3
- import { formatCanopyPath } from '../canopy-path';
3
+ import { formatCanopyPath } from '../canopy-path.js';
4
4
  export const ObjectField = ({ label, fields, value, onChange, renderField, path, dataCanopyField, }) => {
5
5
  const current = value ?? {};
6
6
  return (_jsx(Paper, { withBorder: true, radius: "md", p: "md", bg: "gray.0", "data-canopy-field": dataCanopyField ?? formatCanopyPath(path), shadow: "xs", children: _jsxs(Stack, { gap: "sm", children: [label && (_jsx(Text, { size: "xs", fw: 700, c: "neutral.8", children: label })), _jsx(Stack, { gap: "sm", children: fields.map((field) => {
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useId, useState } from 'react';
3
3
  import { MultiSelect, Select, Stack, Text, Loader } from '@mantine/core';
4
- import { createApiClient } from '../../api/client';
4
+ import { createApiClient } from '../../api/client.js';
5
5
  export const ReferenceField = ({ id, label, options: staticOptions, collections, displayField = 'title', branch = 'main', value, onChange, multiple, dataCanopyField, }) => {
6
6
  const needsFetch = !staticOptions && !!collections && collections.length > 0;
7
7
  const [options, setOptions] = useState(staticOptions || []);
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { ActionIcon, Badge, Group, Paper, Text, Tooltip } from '@mantine/core';
4
4
  import { IconEdit, IconTrash } from '@tabler/icons-react';
5
- import { MemberList } from './MemberList';
5
+ import { MemberList } from './MemberList.js';
6
6
  export const GroupCard = ({ group, onEdit, onDelete, onAddMember, onRemoveMember, onGetUserMetadata, showUserSearch, searchQuery, searchResults, isSearching, searchError, onSearchQueryChange, onShowSearch, onHideSearch, canSearch, }) => {
7
7
  return (_jsxs(Paper, { withBorder: true, p: "sm", mb: "xs", children: [_jsxs(Group, { justify: "space-between", mb: "sm", children: [_jsxs("div", { style: { flex: 1 }, children: [_jsxs(Group, { gap: "xs", children: [_jsx(Text, { size: "sm", fw: 500, children: group.name }), _jsxs(Badge, { size: "sm", variant: "light", children: [group.members?.length || 0, " members"] })] }), _jsxs(Text, { size: "xs", c: "dimmed", mt: 4, children: ["ID: ", group.id] }), group.description && (_jsx(Text, { size: "xs", c: "dimmed", mt: 4, children: group.description }))] }), _jsxs(Group, { gap: "xs", children: [_jsx(Tooltip, { label: "Edit group", children: _jsx(ActionIcon, { size: "sm", variant: "subtle", onClick: () => onEdit(group), children: _jsx(IconEdit, { size: 16 }) }) }), _jsx(Tooltip, { label: "Delete group", children: _jsx(ActionIcon, { size: "sm", variant: "subtle", color: "red", onClick: () => onDelete(group.id), children: _jsx(IconTrash, { size: 16 }) }) })] })] }), _jsx(MemberList, { groupId: group.id, members: group.members || [], onRemoveMember: onRemoveMember, onAddMember: onAddMember, onGetUserMetadata: onGetUserMetadata, showUserSearch: showUserSearch, searchQuery: searchQuery, searchResults: searchResults, isSearching: isSearching, searchError: searchError, onSearchQueryChange: onSearchQueryChange, onShowSearch: onShowSearch, onHideSearch: onHideSearch, canSearch: canSearch })] }));
8
8
  };
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Button, Group, Paper, ScrollArea, Stack, Text } from '@mantine/core';
4
4
  import { IconPlus, IconUsers } from '@tabler/icons-react';
5
- import { GroupCard } from './GroupCard';
5
+ import { GroupCard } from './GroupCard.js';
6
6
  export const InternalGroupsTab = ({ groups, canEdit, onCreateGroup, onEditGroup, onDeleteGroup, onAddMember, onRemoveMember, onGetUserMetadata, activeSearchGroupId, searchQuery, searchResults, isSearching, searchError, onSearchQueryChange, onShowSearch, onHideSearch, canSearch, }) => {
7
7
  // Read-only view
8
8
  if (!canEdit) {
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { ActionIcon, Badge, Button, Group, Loader, Paper, Stack, Text, TextInput, } from '@mantine/core';
4
4
  import { IconSearch, IconX } from '@tabler/icons-react';
5
- import { UserBadge } from '../components/UserBadge';
5
+ import { UserBadge } from '../components/UserBadge.js';
6
6
  export const MemberList = ({ groupId, members, onRemoveMember, onAddMember, onGetUserMetadata, showUserSearch, searchQuery, searchResults, isSearching, searchError, onSearchQueryChange, onShowSearch, onHideSearch, canSearch, }) => {
7
7
  const handleAddMember = (userId) => {
8
8
  onAddMember(groupId, userId);
@@ -9,12 +9,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
9
9
  import { useState, useCallback } from 'react';
10
10
  import { Alert, Button, Group, Loader, Stack, Tabs, Text } from '@mantine/core';
11
11
  import { IconAlertCircle } from '@tabler/icons-react';
12
- import { useGroupState } from './hooks/useGroupState';
13
- import { useUserSearch } from './hooks/useUserSearch';
14
- import { useExternalGroupSearch } from './hooks/useExternalGroupSearch';
15
- import { InternalGroupsTab } from './InternalGroupsTab';
16
- import { ExternalGroupsTab } from './ExternalGroupsTab';
17
- import { GroupForm } from './GroupForm';
12
+ import { useGroupState } from './hooks/useGroupState.js';
13
+ import { useUserSearch } from './hooks/useUserSearch.js';
14
+ import { useExternalGroupSearch } from './hooks/useExternalGroupSearch.js';
15
+ import { InternalGroupsTab } from './InternalGroupsTab.js';
16
+ import { ExternalGroupsTab } from './ExternalGroupsTab.js';
17
+ import { GroupForm } from './GroupForm.js';
18
18
  export const GroupManager = ({ internalGroups: initialInternalGroups, loading = false, canEdit, onSave, onSearchUsers, onGetUserMetadata, onSearchExternalGroups, onClose: _, }) => {
19
19
  // Group state management
20
20
  const { groups, isDirty, isSaving, error, setError, createGroup, updateGroup, deleteGroup, addMember, removeMember, save, discard, } = useGroupState({
@@ -65,7 +65,7 @@ export const GroupManager = ({ internalGroups: initialInternalGroups, loading =
65
65
  }, [addMember, userSearch]);
66
66
  return (_jsxs(Stack, { h: "100%", style: { display: 'flex', flexDirection: 'column' }, gap: 0, children: [!canEdit && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "yellow", mb: "sm", title: "Read-only", children: "You need admin access to manage groups." })), error && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "red", mb: "sm", title: "Error", withCloseButton: true, onClose: () => setError(null), children: error })), loading ? (_jsxs(Group, { justify: "center", py: "xl", children: [_jsx(Loader, { size: "md" }), _jsx(Text, { size: "sm", c: "dimmed", children: "Loading groups..." })] })) : (_jsxs(Tabs, { defaultValue: "internal", style: { flex: 1, display: 'flex', flexDirection: 'column' }, children: [_jsxs(Tabs.List, { children: [_jsx(Tabs.Tab, { value: "internal", children: "Internal Groups" }), _jsx(Tabs.Tab, { value: "external", children: "External Groups" })] }), _jsx(Tabs.Panel, { value: "internal", style: { flex: 1, overflow: 'auto' }, children: _jsx(InternalGroupsTab, { groups: groups, canEdit: canEdit, onCreateGroup: handleCreateGroup, onEditGroup: handleEditGroup, onDeleteGroup: deleteGroup, onAddMember: handleAddMember, onRemoveMember: removeMember, onGetUserMetadata: onGetUserMetadata, activeSearchGroupId: userSearch.activeGroupId, searchQuery: userSearch.searchQuery, searchResults: userSearch.searchResults, isSearching: userSearch.isSearching, searchError: userSearch.searchError, onSearchQueryChange: userSearch.setSearchQuery, onShowSearch: userSearch.showSearch, onHideSearch: userSearch.hideSearch, canSearch: !!onSearchUsers }) }), _jsx(Tabs.Panel, { value: "external", style: { flex: 1, overflow: 'auto' }, children: _jsx(ExternalGroupsTab, { canEdit: canEdit, searchQuery: externalGroupSearch.searchQuery, searchResults: externalGroupSearch.searchResults, isSearching: externalGroupSearch.isSearching, searchError: externalGroupSearch.searchError, onSearchQueryChange: externalGroupSearch.setSearchQuery, canSearch: !!onSearchExternalGroups }) })] })), canEdit && isDirty && (_jsxs(Group, { justify: "flex-end", py: "sm", gap: "sm", style: { borderTop: '1px solid var(--mantine-color-gray-3)' }, children: [_jsx(Button, { variant: "subtle", color: "neutral", onClick: discard, disabled: isSaving, children: "Discard Changes" }), _jsx(Button, { onClick: save, loading: isSaving, disabled: isSaving, children: "Save Groups" })] })), _jsx(GroupForm, { isOpen: isModalOpen, editingGroup: editingGroup, formData: formData, onFormChange: handleFormChange, onSave: handleSaveModal, onClose: () => setIsModalOpen(false) })] }));
67
67
  };
68
- export { useGroupState } from './hooks/useGroupState';
69
- export { useUserSearch } from './hooks/useUserSearch';
70
- export { useExternalGroupSearch } from './hooks/useExternalGroupSearch';
68
+ export { useGroupState } from './hooks/useGroupState.js';
69
+ export { useUserSearch } from './hooks/useUserSearch.js';
70
+ export { useExternalGroupSearch } from './hooks/useExternalGroupSearch.js';
71
71
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { vi } from 'vitest';
3
- import { createMockApiClient } from '../../../api/__test__/mock-client';
4
- import { ApiClientProvider } from '../../context';
3
+ import { createMockApiClient } from '../../../api/__test__/mock-client.js';
4
+ import { ApiClientProvider } from '../../context/index.js';
5
5
  /**
6
6
  * Setup mock API client for hook tests.
7
7
  *
@@ -21,7 +21,7 @@ import { ApiClientProvider } from '../../context';
21
21
  * ```
22
22
  */
23
23
  export async function setupMockApiClient() {
24
- const { createApiClient } = await import('../../../api');
24
+ const { createApiClient } = await import('../../../api/index.js');
25
25
  const mockClient = createMockApiClient();
26
26
  vi.mocked(createApiClient).mockReturnValue(mockClient);
27
27
  return mockClient;
@@ -1,15 +1,15 @@
1
1
  // Barrel export for all custom hooks
2
2
  // Export hooks as they are created
3
3
  // Note: resetApiClient functions are not exported - they're test-only utilities
4
- export * from './useEditorLayout';
5
- export { useBranchManager } from './useBranchManager';
6
- export { useEntryManager } from './useEntryManager';
7
- export * from './useDraftManager';
8
- export { useCommentSystem } from './useCommentSystem';
9
- export { useGroupManager } from './useGroupManager';
10
- export { usePermissionManager } from './usePermissionManager';
11
- export { useBranchActions } from './useBranchActions';
12
- export { useUserContext } from './useUserContext';
13
- export { useReferenceResolution, } from './useReferenceResolution';
14
- export { useSchemaManager, } from './useSchemaManager';
4
+ export * from './useEditorLayout.js';
5
+ export { useBranchManager } from './useBranchManager.js';
6
+ export { useEntryManager } from './useEntryManager.js';
7
+ export * from './useDraftManager.js';
8
+ export { useCommentSystem } from './useCommentSystem.js';
9
+ export { useGroupManager } from './useGroupManager.js';
10
+ export { usePermissionManager } from './usePermissionManager.js';
11
+ export { useBranchActions } from './useBranchActions.js';
12
+ export { useUserContext } from './useUserContext.js';
13
+ export { useReferenceResolution, } from './useReferenceResolution.js';
14
+ export { useSchemaManager, } from './useSchemaManager.js';
15
15
  //# sourceMappingURL=index.js.map
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { modals } from '@mantine/modals';
3
3
  import { notifications } from '@mantine/notifications';
4
4
  import { Text } from '@mantine/core';
5
- import { useApiClient } from '../context';
5
+ import { useApiClient } from '../context/index.js';
6
6
  /**
7
7
  * Custom hook for branch navigation actions with dirty check support.
8
8
  *
@@ -3,7 +3,7 @@ import { useEffect, useMemo, useState } from 'react';
3
3
  import { Text } from '@mantine/core';
4
4
  import { modals } from '@mantine/modals';
5
5
  import { notifications } from '@mantine/notifications';
6
- import { useApiClient } from '../context';
6
+ import { useApiClient } from '../context/index.js';
7
7
  /**
8
8
  * Helper function to show confirmation modal for branch submit action.
9
9
  */
@@ -1,7 +1,7 @@
1
1
  import { useEffect, useMemo, useState } from 'react';
2
2
  import { notifications } from '@mantine/notifications';
3
- import { normalizeCanopyPath } from '../canopy-path';
4
- import { useApiClient } from '../context';
3
+ import { normalizeCanopyPath } from '../canopy-path.js';
4
+ import { useApiClient } from '../context/index.js';
5
5
  /**
6
6
  * Custom hook for managing the comment system.
7
7
  *
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { notifications } from '@mantine/notifications';
3
- import { getNotificationDuration } from '../utils/env';
3
+ import { getNotificationDuration } from '../utils/env.js';
4
4
  /**
5
5
  * Custom hook for managing draft state (localStorage persistence, save/discard).
6
6
  *
@@ -1,7 +1,7 @@
1
1
  import { useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { notifications } from '@mantine/notifications';
3
- import { buildEntriesFromListResponse, buildWritePayload, normalizeContentPayload, } from '../editor-utils';
4
- import { useApiClient } from '../context';
3
+ import { buildEntriesFromListResponse, buildWritePayload, normalizeContentPayload, } from '../editor-utils.js';
4
+ import { useApiClient } from '../context/index.js';
5
5
  /**
6
6
  * Custom hook for managing editor entries (CRUD operations).
7
7
  *
@@ -107,7 +107,7 @@ export function useEntryManager(options) {
107
107
  const hydratedFlatSchema = schemaResult.data.flatSchema.map((item) => item.type === 'entry-type' ? { ...item, schema: entrySchemas[item.schemaRef] ?? [] } : item);
108
108
  // Build editor collections from hydrated flatSchema
109
109
  // Dynamic import: lazy-load heavier editor config; only needed after API data arrives
110
- const { buildEditorCollections } = await import('../editor-config');
110
+ const { buildEditorCollections } = await import('../editor-config.js');
111
111
  const collections = buildEditorCollections(hydratedFlatSchema);
112
112
  setCollectionsState(collections);
113
113
  // Fetch entries from entries API
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useState } from 'react';
2
2
  import { notifications } from '@mantine/notifications';
3
- import { useApiClient } from '../context';
3
+ import { useApiClient } from '../context/index.js';
4
4
  /**
5
5
  * Custom hook for managing internal groups (CRUD operations).
6
6
  *
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useState } from 'react';
2
2
  import { notifications } from '@mantine/notifications';
3
- import { useApiClient } from '../context';
3
+ import { useApiClient } from '../context/index.js';
4
4
  /**
5
5
  * Custom hook for managing path permissions (CRUD operations).
6
6
  *
@@ -31,7 +31,7 @@
31
31
  * - Persists across edits for instant re-renders
32
32
  */
33
33
  import { useEffect, useMemo, useRef, useState } from 'react';
34
- import { resolveChangedReferences } from '../client-reference-resolver';
34
+ import { resolveChangedReferences } from '../client-reference-resolver.js';
35
35
  export function useReferenceResolution({ value, fields, branch, onResolvedValueChange, onLoadingStateChange, }) {
36
36
  const resolvedCache = useRef(new Map());
37
37
  const prevValueRef = useRef({}); // Track previous value for change detection
@@ -1,6 +1,6 @@
1
1
  import { useState, useCallback } from 'react';
2
2
  import { notifications } from '@mantine/notifications';
3
- import { useApiClient } from '../context';
3
+ import { useApiClient } from '../context/index.js';
4
4
  /**
5
5
  * Hook for managing schema operations (collections, entry types, ordering).
6
6
  *
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useState } from 'react';
2
- import { createApiClient } from '../../api';
2
+ import { createApiClient } from '../../api/index.js';
3
3
  /**
4
4
  * Hook to fetch current user context from the API.
5
5
  * This provides the userId and groups needed for permission checks.
@@ -2,10 +2,10 @@
2
2
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
3
  import { ActionIcon, Badge, Button, Group, Paper, Stack, Tabs, Text, Tooltip } from '@mantine/core';
4
4
  import { IconSearch, IconX, IconUserOff } from '@tabler/icons-react';
5
- import { PERMISSION_LEVELS, LEVEL_CONFIG } from './constants';
6
- import { GroupSelector } from './GroupSelector';
7
- import { UserSelector } from './UserSelector';
8
- import { UserBadge } from '../components/UserBadge';
5
+ import { PERMISSION_LEVELS, LEVEL_CONFIG } from './constants.js';
6
+ import { GroupSelector } from './GroupSelector.js';
7
+ import { UserSelector } from './UserSelector.js';
8
+ import { UserBadge } from '../components/UserBadge.js';
9
9
  export const PermissionEditor = ({ node, activeLevel, onSetActiveLevel, canEdit, groups, isSelected, userSearchResults, isSearchingUsers, showUserSearch, userSearchQuery, userSearchError, onSearchUsers, onGetUserMetadata, onToggleUserSearch, onAddUser, onRemoveUser, showGroupSearch, groupSearchQuery, filteredGroups, onSearchGroups, onToggleGroupSearch, onAddGroup, onRemoveGroup, }) => {
10
10
  const directPerm = node.directPermission;
11
11
  const inheritedPerm = node.inheritedPermission;
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Badge, Tooltip } from '@mantine/core';
4
- import { LEVEL_CONFIG } from './constants';
4
+ import { LEVEL_CONFIG } from './constants.js';
5
5
  /**
6
6
  * Displays a badge for a permission level.
7
7
  * Shows filled badge for direct permissions, outlined for inherited.
@@ -2,9 +2,9 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { ActionIcon, Collapse } from '@mantine/core';
4
4
  import { IconChevronRight, IconChevronDown, IconFolder, IconFile } from '@tabler/icons-react';
5
- import { PERMISSION_LEVELS } from './constants';
6
- import { PermissionLevelBadge } from './PermissionLevelBadge';
7
- import { PermissionEditor } from './PermissionEditor';
5
+ import { PERMISSION_LEVELS } from './constants.js';
6
+ import { PermissionLevelBadge } from './PermissionLevelBadge.js';
7
+ import { PermissionEditor } from './PermissionEditor.js';
8
8
  export const PermissionTree = ({ node, expandedNodes, selectedNode, canEdit, groups, activeLevel, userSearchResults, isSearchingUsers, showUserSearch, userSearchQuery, userSearchError, showGroupSearch, groupSearchQuery, filteredGroups, onToggle, onSelect, onSetActiveLevel, onUpdatePermission, onSearchUsers, onGetUserMetadata, onToggleUserSearch, onAddUser, onRemoveUser, onSearchGroups, onToggleGroupSearch, onAddGroup, onRemoveGroup, }) => {
9
9
  const isExpanded = expandedNodes.has(node.path);
10
10
  const isSelected = selectedNode === node.path;
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Paper, Stack, Text, Loader } from '@mantine/core';
4
- import { UserBadge } from '../components/UserBadge';
4
+ import { UserBadge } from '../components/UserBadge.js';
5
5
  export const UserSelector = ({ searchQuery, onSearchChange, searchResults, isSearching, searchError, onSelectUser, onGetUserMetadata, }) => {
6
6
  return (_jsx(Paper, { withBorder: true, p: "sm", mt: "xs", children: _jsxs(Stack, { gap: "xs", children: [_jsx("input", { type: "text", placeholder: "Search users by name or email...", value: searchQuery, onChange: (e) => onSearchChange(e.target.value), "aria-label": "Search users by name or email", style: {
7
7
  width: '100%',
@@ -2,8 +2,8 @@
2
2
  * Hook for managing permission tree state and operations
3
3
  */
4
4
  import { useState, useMemo, useEffect, useCallback } from 'react';
5
- import { buildTree, annotateTreeWithPermissions, findTreeNode } from '../utils';
6
- import { parsePermissionPath } from '../../../authorization/validation';
5
+ import { buildTree, annotateTreeWithPermissions, findTreeNode } from '../utils.js';
6
+ import { parsePermissionPath } from '../../../authorization/validation.js';
7
7
  export function usePermissionTree({ collections, contentRoot = 'content', permissions, contentTree, }) {
8
8
  const [expandedNodes, setExpandedNodes] = useState(new Set([contentRoot]));
9
9
  const [selectedNode, setSelectedNode] = useState(null);
@@ -10,10 +10,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  import { useState, useCallback } from 'react';
11
11
  import { Alert, Button, Group, Loader, ScrollArea, Stack, Text } from '@mantine/core';
12
12
  import { IconAlertCircle } from '@tabler/icons-react';
13
- import { usePermissionTree } from './hooks/usePermissionTree';
14
- import { useGroupsAndUsers } from './hooks/useGroupsAndUsers';
15
- import { PermissionTree } from './PermissionTree';
16
- import { findTreeNode } from './utils';
13
+ import { usePermissionTree } from './hooks/usePermissionTree.js';
14
+ import { useGroupsAndUsers } from './hooks/useGroupsAndUsers.js';
15
+ import { PermissionTree } from './PermissionTree.js';
16
+ import { findTreeNode } from './utils.js';
17
17
  export const PermissionManager = ({ collections, contentRoot = 'content', permissions, canEdit, onSave, onSearchUsers, onGetUserMetadata, onListGroups, onClose: __, loading = false, contentTree, }) => {
18
18
  const [isSaving, setIsSaving] = useState(false);
19
19
  const [error, setError] = useState(null);
@@ -120,6 +120,6 @@ export const PermissionManager = ({ collections, contentRoot = 'content', permis
120
120
  }, [annotatedTree, localPermissions, updateNodePermission]);
121
121
  return (_jsxs(Stack, { h: "100%", style: { display: 'flex', flexDirection: 'column' }, gap: 0, children: [!canEdit && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "yellow", mb: "sm", title: "Read-only", children: "You need admin access to edit permissions" })), error && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "red", mb: "sm", title: "Error", withCloseButton: true, onClose: () => setError(null), children: error })), groupLoadError && (_jsx(Alert, { icon: _jsx(IconAlertCircle, { size: 16 }), color: "orange", mb: "sm", title: "Warning", withCloseButton: true, onClose: clearGroupLoadError, children: groupLoadError })), _jsxs(Group, { gap: "xs", pb: "sm", children: [_jsx(Button, { size: "xs", variant: "subtle", onClick: expandAll, children: "Expand All" }), _jsx(Button, { size: "xs", variant: "subtle", onClick: collapseAll, children: "Collapse All" })] }), _jsx(ScrollArea, { style: { flex: 1 }, pb: "md", children: loading ? (_jsxs(Group, { justify: "center", py: "xl", children: [_jsx(Loader, { size: "md" }), _jsx(Text, { size: "sm", c: "dimmed", children: "Loading permissions..." })] })) : (_jsx(PermissionTree, { node: annotatedTree, expandedNodes: expandedNodes, selectedNode: selectedNode, canEdit: canEdit, groups: groupSelectData, activeLevel: activeLevel, userSearchResults: userSearchResults, isSearchingUsers: isSearchingUsers, showUserSearch: showUserSearch, userSearchQuery: userSearchQuery, userSearchError: userSearchError, showGroupSearch: showGroupSearch, groupSearchQuery: groupSearchQuery, filteredGroups: filteredGroups, onToggle: toggleNode, onSelect: selectNode, onSetActiveLevel: setActiveLevel, onUpdatePermission: updateNodePermission, onSearchUsers: setUserSearchQuery, onGetUserMetadata: onGetUserMetadata, onToggleUserSearch: toggleUserSearch, onAddUser: handleAddUser, onRemoveUser: handleRemoveUser, onSearchGroups: setGroupSearchQuery, onToggleGroupSearch: setShowGroupSearch, onAddGroup: handleAddGroup, onRemoveGroup: handleRemoveGroup })) }), canEdit && isDirty && (_jsxs(Group, { justify: "flex-end", py: "sm", gap: "sm", style: { borderTop: '1px solid var(--mantine-color-gray-3)' }, children: [_jsx(Button, { variant: "subtle", color: "neutral", onClick: handleDiscard, disabled: isSaving, children: "Discard Changes" }), _jsx(Button, { onClick: handleSave, loading: isSaving, disabled: isSaving, children: "Save Permissions" })] }))] }));
122
122
  };
123
- export { usePermissionTree } from './hooks/usePermissionTree';
124
- export { useGroupsAndUsers } from './hooks/useGroupsAndUsers';
123
+ export { usePermissionTree } from './hooks/usePermissionTree.js';
124
+ export { useGroupsAndUsers } from './hooks/useGroupsAndUsers.js';
125
125
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useRef, useState } from 'react';
4
- import { formatCanopyPath } from './canopy-path';
4
+ import { formatCanopyPath } from './canopy-path.js';
5
5
  export const __CANOPY_PREVIEW_CLIENT__ = true;
6
6
  export const CANOPY_PREVIEW_MESSAGE = 'canopycms:draft:update';
7
7
  export const CANOPY_PREVIEW_FOCUS = 'canopycms:preview:focus';
@@ -14,8 +14,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
14
14
  import { useState, useCallback, useEffect } from 'react';
15
15
  import { Modal, Stack, TextInput, Group, Button, Alert, Text, Paper, ActionIcon, Menu, Divider, Badge, } from '@mantine/core';
16
16
  import { IconAlertCircle, IconPlus, IconDotsVertical, IconTrash, IconEdit, IconStar, } from '@tabler/icons-react';
17
- import { EntryTypeEditor } from './EntryTypeEditor';
18
- import { ConfirmDeleteModal } from '../components/ConfirmDeleteModal';
17
+ import { EntryTypeEditor } from './EntryTypeEditor.js';
18
+ import { ConfirmDeleteModal } from '../components/ConfirmDeleteModal.js';
19
19
  // ============================================================================
20
20
  // Component
21
21
  // ============================================================================
@@ -5,6 +5,6 @@
5
5
  * - CollectionEditor: Create/edit collections and their entry types
6
6
  * - EntryTypeEditor: Create/edit individual entry types
7
7
  */
8
- export { CollectionEditor, } from './CollectionEditor';
9
- export { EntryTypeEditor, } from './EntryTypeEditor';
8
+ export { CollectionEditor, } from './CollectionEditor.js';
9
+ export { EntryTypeEditor, } from './EntryTypeEditor.js';
10
10
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { countTitleFields, findInvalidTitleFields, findTitleFieldsInLists, } from './utils/title-field';
1
+ import { countTitleFields, findInvalidTitleFields, findTitleFieldsInLists, } from './utils/title-field.js';
2
2
  /** Look up a field's type by dotted path (e.g., "meta.order"). */
3
3
  function findFieldType(fields, dottedPath) {
4
4
  const parts = dottedPath.split('.');
@@ -84,13 +84,13 @@ export function createEntrySchemaRegistry(registry) {
84
84
  * @example
85
85
  * ```typescript
86
86
  * import { validateEntrySchemaRegistry } from 'canopycms/server'
87
- * import { entrySchemaRegistry } from './schemas'
87
+ * import { entrySchemaRegistry } from './schemas.js'
88
88
  *
89
89
  * await validateEntrySchemaRegistry(entrySchemaRegistry, './content')
90
90
  * ```
91
91
  */
92
92
  export async function validateEntrySchemaRegistry(entrySchemaRegistry, contentPath) {
93
- const { loadCollectionMetaFiles } = await import('./schema');
93
+ const { loadCollectionMetaFiles } = await import('./schema/index.js');
94
94
  const { access } = await import('fs/promises');
95
95
  // Check if content directory exists
96
96
  try {
@@ -1,9 +1,9 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { simpleGit, } from 'simple-git';
4
- import { createDebugLogger } from './utils/debug';
5
- import { isNotFoundError } from './utils/error';
6
- import { detectHeadBranch } from './utils/git';
4
+ import { createDebugLogger } from './utils/debug.js';
5
+ import { isNotFoundError } from './utils/error.js';
6
+ import { detectHeadBranch } from './utils/git.js';
7
7
  const log = createDebugLogger({ prefix: 'GitManager' });
8
8
  // In-memory lock to prevent concurrent remote.git initialization
9
9
  // Maps remotePath -> Promise<void> to serialize access
@@ -239,7 +239,7 @@ export class GitManager {
239
239
  static async resolveRemoteUrl(options) {
240
240
  // Dynamic import: operating-mode contains Node-only code; deferring the
241
241
  // import keeps git-manager loadable in non-Node evaluation contexts
242
- const { operatingStrategy } = await import('./operating-mode');
242
+ const { operatingStrategy } = await import('./operating-mode/index.js');
243
243
  const strategy = operatingStrategy(options.mode);
244
244
  const config = strategy.getRemoteUrlConfig();
245
245
  // Centralized priority chain (no duplication across strategies)
@@ -1,5 +1,5 @@
1
1
  import { Octokit } from '@octokit/rest';
2
- import { operatingStrategy } from './operating-mode';
2
+ import { operatingStrategy } from './operating-mode/index.js';
3
3
  /**
4
4
  * Service for interacting with GitHub API (pull requests, branches, etc.)
5
5
  */
@@ -1,10 +1,10 @@
1
- import { jsonResponse } from './types';
2
- import { createCanopyRouter } from './router';
3
- import { createCanopyServices } from '../services';
4
- import { loadBranchContext, BranchWorkspaceManager } from '../branch-workspace';
5
- import { authResultToCanopyUser } from '../user';
6
- import { loadInternalGroups, RESERVED_GROUPS } from '../authorization';
7
- import { clientOperatingStrategy } from '../operating-mode';
1
+ import { jsonResponse } from './types.js';
2
+ import { createCanopyRouter } from './router.js';
3
+ import { createCanopyServices } from '../services.js';
4
+ import { loadBranchContext, BranchWorkspaceManager } from '../branch-workspace.js';
5
+ import { authResultToCanopyUser } from '../user.js';
6
+ import { loadInternalGroups, RESERVED_GROUPS } from '../authorization/index.js';
7
+ import { clientOperatingStrategy } from '../operating-mode/index.js';
8
8
  let warnedNoAdmins = false;
9
9
  /**
10
10
  * Build API context from options.
@@ -1,4 +1,4 @@
1
- export { jsonResponse } from './types';
2
- export { createCanopyRouter } from './router';
3
- export { createCanopyRequestHandler, createCanopyRequestHandlerFromConfig } from './handler';
1
+ export { jsonResponse } from './types.js';
2
+ export { createCanopyRouter } from './router.js';
3
+ export { createCanopyRequestHandler, createCanopyRequestHandlerFromConfig } from './handler.js';
4
4
  //# sourceMappingURL=index.js.map
@@ -1,15 +1,15 @@
1
- import { BRANCH_ROUTES } from '../api/branch';
2
- import { WORKFLOW_ROUTES } from '../api/branch-status';
3
- import { COMMENT_ROUTES } from '../api/comments';
4
- import { CONTENT_ROUTES } from '../api/content';
5
- import { REFERENCE_OPTIONS_ROUTES } from '../api/reference-options';
6
- import { RESOLVE_REFERENCES_ROUTES } from '../api/resolve-references';
7
- import { ENTRY_ROUTES } from '../api/entries';
8
- import { ASSET_ROUTES } from '../api/assets';
9
- import { PERMISSION_ROUTES } from '../api/permissions';
10
- import { GROUP_ROUTES } from '../api/groups';
11
- import { USER_ROUTES } from '../api/user';
12
- import { SCHEMA_ROUTES } from '../api/schema';
1
+ import { BRANCH_ROUTES } from '../api/branch.js';
2
+ import { WORKFLOW_ROUTES } from '../api/branch-status.js';
3
+ import { COMMENT_ROUTES } from '../api/comments.js';
4
+ import { CONTENT_ROUTES } from '../api/content.js';
5
+ import { REFERENCE_OPTIONS_ROUTES } from '../api/reference-options.js';
6
+ import { RESOLVE_REFERENCES_ROUTES } from '../api/resolve-references.js';
7
+ import { ENTRY_ROUTES } from '../api/entries.js';
8
+ import { ASSET_ROUTES } from '../api/assets.js';
9
+ import { PERMISSION_ROUTES } from '../api/permissions.js';
10
+ import { GROUP_ROUTES } from '../api/groups.js';
11
+ import { USER_ROUTES } from '../api/user.js';
12
+ import { SCHEMA_ROUTES } from '../api/schema.js';
13
13
  /**
14
14
  * Build the standard route definitions for the Canopy API.
15
15
  * Assembled from co-located route definitions in each API module.
package/dist/id.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { generate } from 'short-uuid';
2
- import { isValidContentId } from './paths/validation';
2
+ import { isValidContentId } from './paths/validation.js';
3
3
  /**
4
4
  * Generate a new 12-character content ID.
5
5
  * Uses Base58-encoded UUID, truncated for shorter filenames.
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- export * from './config';
2
- export * from './entry-schema';
3
- export * from './types';
4
- export * from './user';
1
+ export * from './config/index.js';
2
+ export * from './entry-schema.js';
3
+ export * from './types.js';
4
+ export * from './user.js';
5
5
  // AI content config helper — client-safe (no node: imports).
6
6
  // Server-only AI features (handler, generator) are in 'canopycms/ai'.
7
- export { defineAIContentConfig } from './ai/types';
8
- export { isCanopyRequest, isHeadersLike, extractHeaders, validateAuthContext, } from './auth/context-helpers';
7
+ export { defineAIContentConfig } from './ai/types.js';
8
+ export { isCanopyRequest, isHeadersLike, extractHeaders, validateAuthContext, } from './auth/context-helpers.js';
9
9
  //# sourceMappingURL=index.js.map
@@ -7,8 +7,8 @@
7
7
  * These classes inherit all client-safe methods and add client-unsafe functionality.
8
8
  */
9
9
  import path from 'node:path';
10
- import { ProdClientSafeStrategy, DevClientSafeStrategy } from './client-safe-strategy';
11
- import { DEFAULT_PROD_WORKSPACE } from '../config';
10
+ import { ProdClientSafeStrategy, DevClientSafeStrategy } from './client-safe-strategy.js';
11
+ import { DEFAULT_PROD_WORKSPACE } from '../config/index.js';
12
12
  // ============================================================================
13
13
  // Production Mode - Full Strategy
14
14
  // ============================================================================
@@ -7,5 +7,5 @@
7
7
  * Usage in client components:
8
8
  * import { clientOperatingStrategy } from '@/operating-mode/client'
9
9
  */
10
- export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy';
10
+ export { clientOperatingStrategy, clearClientStrategyCache } from './client-safe-strategy.js';
11
11
  //# sourceMappingURL=client.js.map