@strapi/content-type-builder 5.25.0 → 5.26.0
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/admin/components/AIChat/Chat.js +431 -0
- package/dist/admin/components/AIChat/Chat.js.map +1 -0
- package/dist/admin/components/AIChat/Chat.mjs +429 -0
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.js +237 -0
- package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs +233 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js +427 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs +423 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js +377 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +373 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.js +46 -0
- package/dist/admin/components/AIChat/components/Alert.js.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.mjs +44 -0
- package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js +34 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs +32 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js +92 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs +90 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +100 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +97 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.js +127 -0
- package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs +125 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.js +71 -0
- package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs +66 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.js +172 -0
- package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs +167 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js +166 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs +163 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js +190 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs +187 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js +87 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs +85 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Input.js +126 -0
- package/dist/admin/components/AIChat/components/Input.js.map +1 -0
- package/dist/admin/components/AIChat/components/Input.mjs +121 -0
- package/dist/admin/components/AIChat/components/Input.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js +138 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs +136 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js +214 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +212 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js +78 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs +76 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js +60 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs +35 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.js +175 -0
- package/dist/admin/components/AIChat/components/StepModal.js.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs +171 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/animations.js +67 -0
- package/dist/admin/components/AIChat/components/animations.js.map +1 -0
- package/dist/admin/components/AIChat/components/animations.mjs +65 -0
- package/dist/admin/components/AIChat/components/animations.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js +50 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs +48 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js +25 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs +23 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js +107 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +96 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js +152 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs +150 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js +47 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs +45 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js +212 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs +207 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js +76 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs +74 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js +206 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs +200 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js +115 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs +113 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js +19 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs +17 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.js +168 -0
- package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs +161 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.js +16 -0
- package/dist/admin/components/AIChat/lib/constants.js.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.mjs +10 -0
- package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.js +8 -0
- package/dist/admin/components/AIChat/lib/misc.js.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.mjs +6 -0
- package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +46 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +44 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +151 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +148 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js +191 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +187 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +90 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +88 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -0
- package/dist/admin/components/ComponentList.js +1 -0
- package/dist/admin/components/ComponentList.js.map +1 -1
- package/dist/admin/components/ComponentList.mjs +1 -0
- package/dist/admin/components/ComponentList.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +48 -6
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +48 -6
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +60 -29
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +62 -31
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.js +75 -9
- package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.mjs +77 -11
- package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/Chat.d.ts +2 -0
- package/dist/admin/src/components/AIChat/FeedbackModal.d.ts +13 -0
- package/dist/admin/src/components/AIChat/UploadCodeModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/UploadFigmaModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/components/Alert.d.ts +6 -0
- package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +13 -0
- package/dist/admin/src/components/AIChat/components/Attachments/AttachmentPreview.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Attachments/components/Attachment.d.ts +27 -0
- package/dist/admin/src/components/AIChat/components/Base64Image.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Collapsible.d.ts +18 -0
- package/dist/admin/src/components/AIChat/components/Dropzone.d.ts +35 -0
- package/dist/admin/src/components/AIChat/components/FloatingPanel.d.ts +34 -0
- package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +20 -0
- package/dist/admin/src/components/AIChat/components/ImagePreview.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/ImagePreviewGroup.d.ts +7 -0
- package/dist/admin/src/components/AIChat/components/Input.d.ts +43 -0
- package/dist/admin/src/components/AIChat/components/Messages/Marker.d.ts +2 -0
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/ResizableTextArea.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/SimpleMenu.d.ts +32 -0
- package/dist/admin/src/components/AIChat/components/StepModal.d.ts +37 -0
- package/dist/admin/src/components/AIChat/components/animations.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/icons/FigmaIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/icons/StopIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/hooks/useAIFetch.d.ts +147 -0
- package/dist/admin/src/components/AIChat/hooks/useAttachments.d.ts +8 -0
- package/dist/admin/src/components/AIChat/hooks/useChatTitle.d.ts +13 -0
- package/dist/admin/src/components/AIChat/hooks/useCodeUpload.d.ts +31 -0
- package/dist/admin/src/components/AIChat/hooks/useFeedback.d.ts +7 -0
- package/dist/admin/src/components/AIChat/hooks/useFigmaUpload.d.ts +61 -0
- package/dist/admin/src/components/AIChat/hooks/useLastSeenSchemas.d.ts +10 -0
- package/dist/admin/src/components/AIChat/hooks/useTranslations.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +32 -0
- package/dist/admin/src/components/AIChat/lib/constants.d.ts +12 -0
- package/dist/admin/src/components/AIChat/lib/fileToAttachment.d.ts +2 -0
- package/dist/admin/src/components/AIChat/lib/misc.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +16 -0
- package/dist/admin/src/components/AIChat/lib/types/annotations.d.ts +19 -0
- package/dist/admin/src/components/AIChat/lib/types/attachments.d.ts +15 -0
- package/dist/admin/src/components/AIChat/lib/types/feedback.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/types/messages.d.ts +26 -0
- package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +20 -0
- package/dist/admin/src/components/AIChat/providers/ChatProvider.d.ts +30 -0
- package/dist/admin/src/components/AIChat/providers/SchemaProvider.d.ts +10 -0
- package/dist/admin/src/components/ComponentList.d.ts +1 -1
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +1 -1
- package/dist/admin/translations/ar.json.js +187 -2
- package/dist/admin/translations/ar.json.js.map +1 -1
- package/dist/admin/translations/ar.json.mjs +187 -3
- package/dist/admin/translations/ar.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +42 -7
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +42 -7
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +53 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +53 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +37 -15
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +37 -15
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +165 -3
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +165 -4
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/id.json.js +93 -23
- package/dist/admin/translations/id.json.js.map +1 -1
- package/dist/admin/translations/id.json.mjs +93 -23
- package/dist/admin/translations/id.json.mjs.map +1 -1
- package/dist/admin/translations/it.json.js +75 -6
- package/dist/admin/translations/it.json.js.map +1 -1
- package/dist/admin/translations/it.json.mjs +75 -6
- package/dist/admin/translations/it.json.mjs.map +1 -1
- package/dist/admin/translations/ja.json.js +191 -5
- package/dist/admin/translations/ja.json.js.map +1 -1
- package/dist/admin/translations/ja.json.mjs +191 -6
- package/dist/admin/translations/ja.json.mjs.map +1 -1
- package/dist/admin/translations/ko.json.js +70 -16
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +70 -16
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/ms.json.js +104 -31
- package/dist/admin/translations/ms.json.js.map +1 -1
- package/dist/admin/translations/ms.json.mjs +104 -31
- package/dist/admin/translations/ms.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +95 -15
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +95 -15
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +55 -11
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +55 -11
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/pt-BR.json.js +54 -10
- package/dist/admin/translations/pt-BR.json.js.map +1 -1
- package/dist/admin/translations/pt-BR.json.mjs +54 -10
- package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
- package/dist/admin/translations/pt.json.js +187 -2
- package/dist/admin/translations/pt.json.js.map +1 -1
- package/dist/admin/translations/pt.json.mjs +187 -3
- package/dist/admin/translations/pt.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +26 -1
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +26 -1
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +21 -1
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +21 -1
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/translations/sv.json.js +21 -1
- package/dist/admin/translations/sv.json.js.map +1 -1
- package/dist/admin/translations/sv.json.mjs +21 -1
- package/dist/admin/translations/sv.json.mjs.map +1 -1
- package/dist/admin/translations/th.json.js +21 -1
- package/dist/admin/translations/th.json.js.map +1 -1
- package/dist/admin/translations/th.json.mjs +21 -1
- package/dist/admin/translations/th.json.mjs.map +1 -1
- package/dist/admin/translations/tr.json.js +21 -1
- package/dist/admin/translations/tr.json.js.map +1 -1
- package/dist/admin/translations/tr.json.mjs +21 -1
- package/dist/admin/translations/tr.json.mjs.map +1 -1
- package/dist/admin/translations/uk.json.js +21 -2
- package/dist/admin/translations/uk.json.js.map +1 -1
- package/dist/admin/translations/uk.json.mjs +21 -2
- package/dist/admin/translations/uk.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +222 -133
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +222 -133
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/admin/translations/zh.json.js +21 -1
- package/dist/admin/translations/zh.json.js.map +1 -1
- package/dist/admin/translations/zh.json.mjs +21 -1
- package/dist/admin/translations/zh.json.mjs.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +2 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/register.js +98 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/register.mjs +96 -0
- package/dist/server/register.mjs.map +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts.map +1 -0
- package/dist/server/src/controllers/ai/index.d.ts +1 -0
- package/dist/server/src/controllers/ai/index.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts +11 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/package.json +12 -5
- package/dist/admin/components/DataManager/utils/formatSchemas.js +0 -21
- package/dist/admin/components/DataManager/utils/formatSchemas.js.map +0 -1
- package/dist/admin/components/DataManager/utils/formatSchemas.mjs +0 -18
- package/dist/admin/components/DataManager/utils/formatSchemas.mjs.map +0 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var isEqual = require('lodash/isEqual');
|
|
4
|
+
var omit = require('lodash/omit');
|
|
5
|
+
var pluralize = require('pluralize');
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
8
|
+
const ACTION_TO_STATUS = {
|
|
9
|
+
create: 'NEW',
|
|
10
|
+
remove: 'REMOVED',
|
|
11
|
+
update: 'CHANGED'
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new attribute with the specified status
|
|
15
|
+
*/ const createAttributeWithStatus = (name, attributeData, status)=>({
|
|
16
|
+
...attributeData,
|
|
17
|
+
name,
|
|
18
|
+
status
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Determines the status of an attribute by comparing new and old versions
|
|
22
|
+
*/ const determineAttributeStatus = (newAttr, oldAttr, oldSchema)=>{
|
|
23
|
+
if (!oldAttr) {
|
|
24
|
+
return 'NEW';
|
|
25
|
+
}
|
|
26
|
+
// If the schema was already new, don't mark attributes as changed, keep them as new.
|
|
27
|
+
if (oldSchema?.status === 'NEW') {
|
|
28
|
+
return 'NEW';
|
|
29
|
+
}
|
|
30
|
+
// Compare attributes without the status field to determine if they've changed
|
|
31
|
+
const newAttrWithoutStatus = omit(newAttr, [
|
|
32
|
+
'status'
|
|
33
|
+
]);
|
|
34
|
+
const oldAttrWithoutStatus = omit(oldAttr, [
|
|
35
|
+
'status'
|
|
36
|
+
]);
|
|
37
|
+
if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {
|
|
38
|
+
return 'CHANGED';
|
|
39
|
+
}
|
|
40
|
+
// If unchanged, keep the previous status
|
|
41
|
+
return oldAttr.status;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Determines the status of a schema by comparing action and checking if oldSchema exists
|
|
45
|
+
*/ const transformStatusFromChatToCTB = (schema, oldSchema)=>{
|
|
46
|
+
// If schema has an action, use the mapped status
|
|
47
|
+
if (schema.action) {
|
|
48
|
+
return ACTION_TO_STATUS[schema.action];
|
|
49
|
+
}
|
|
50
|
+
// If oldSchema doesn't exist, it's a new schema
|
|
51
|
+
if (!oldSchema) {
|
|
52
|
+
return 'NEW';
|
|
53
|
+
}
|
|
54
|
+
// If no action is specified and oldSchema exists, keep the existing status
|
|
55
|
+
return oldSchema.status;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Transform attributes from Chat format to CTB format
|
|
59
|
+
* Also performs a diff to determine the status of each attribute
|
|
60
|
+
*/ const transformAttributesFromChatToCTB = ({ action, attributes }, oldSchema)=>{
|
|
61
|
+
// If it's a new schema or no oldAttributes provided, all attributes are NEW
|
|
62
|
+
if (action === 'create' || !oldSchema) {
|
|
63
|
+
return Object.entries(attributes).map(([name, attribute])=>createAttributeWithStatus(name, attribute, 'NEW'));
|
|
64
|
+
}
|
|
65
|
+
// Convert old attributes array to a lookup map for faster access
|
|
66
|
+
const oldAttributesMap = oldSchema.attributes.reduce((acc, attr)=>({
|
|
67
|
+
...acc,
|
|
68
|
+
[attr.name]: attr
|
|
69
|
+
}), {});
|
|
70
|
+
// Process current attributes (new and changed)
|
|
71
|
+
const processedAttributes = Object.entries(attributes).map(([name, attr])=>{
|
|
72
|
+
const oldAttr = oldAttributesMap[name];
|
|
73
|
+
const status = determineAttributeStatus({
|
|
74
|
+
...attr,
|
|
75
|
+
name
|
|
76
|
+
}, oldAttr, oldSchema);
|
|
77
|
+
return createAttributeWithStatus(name, attr, status);
|
|
78
|
+
});
|
|
79
|
+
// No need to mark removed attributes if the old schema is new, just remove it from the list
|
|
80
|
+
// TODO: Else a validation error occurs on the backend side.
|
|
81
|
+
if (oldSchema?.status === 'NEW') {
|
|
82
|
+
return processedAttributes;
|
|
83
|
+
}
|
|
84
|
+
// Find removed attributes (exist in old but not in new)
|
|
85
|
+
const removedAttributes = Object.entries(oldAttributesMap).filter(([name])=>!attributes[name]).map(([name, oldAttr])=>createAttributeWithStatus(name, oldAttr, 'REMOVED'));
|
|
86
|
+
// Combine both sets of attributes
|
|
87
|
+
return [
|
|
88
|
+
...processedAttributes,
|
|
89
|
+
...removedAttributes
|
|
90
|
+
];
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Transform schema format
|
|
94
|
+
* AI chat -> CTB
|
|
95
|
+
*
|
|
96
|
+
* The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.
|
|
97
|
+
*
|
|
98
|
+
* We need to keep track of which changes have been made
|
|
99
|
+
*/ const transformChatToCTB = (schema, oldSchema)=>{
|
|
100
|
+
const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');
|
|
101
|
+
const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');
|
|
102
|
+
if (schema.modelType === 'component') {
|
|
103
|
+
return {
|
|
104
|
+
category: schema.category || 'default',
|
|
105
|
+
modelName: singularName,
|
|
106
|
+
attributes: transformAttributesFromChatToCTB(schema, oldSchema),
|
|
107
|
+
info: {
|
|
108
|
+
displayName: schema.name,
|
|
109
|
+
description: schema.description
|
|
110
|
+
},
|
|
111
|
+
modelType: schema.modelType,
|
|
112
|
+
uid: schema.uid,
|
|
113
|
+
collectionName: pluralName,
|
|
114
|
+
status: transformStatusFromChatToCTB(schema, oldSchema),
|
|
115
|
+
globalId: singularName
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
uid: schema.uid,
|
|
120
|
+
modelType: schema.modelType,
|
|
121
|
+
modelName: singularName,
|
|
122
|
+
kind: schema.kind,
|
|
123
|
+
info: {
|
|
124
|
+
displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),
|
|
125
|
+
// Always keep the old by default
|
|
126
|
+
// @ts-expect-error - not in types
|
|
127
|
+
singularName: oldSchema?.info?.singularName || singularName,
|
|
128
|
+
// Always keep the old by default
|
|
129
|
+
// @ts-expect-error - not in types
|
|
130
|
+
pluralName: oldSchema?.info?.pluralName || pluralName
|
|
131
|
+
},
|
|
132
|
+
collectionName: pluralName,
|
|
133
|
+
attributes: transformAttributesFromChatToCTB(schema, oldSchema),
|
|
134
|
+
options: {
|
|
135
|
+
draftAndPublish: schema.options?.draftAndPublish ?? false
|
|
136
|
+
},
|
|
137
|
+
pluginOptions: {
|
|
138
|
+
i18n: {
|
|
139
|
+
localized: schema.options?.localized ?? false
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
visible: true,
|
|
143
|
+
status: transformStatusFromChatToCTB(schema, oldSchema),
|
|
144
|
+
globalId: singularName,
|
|
145
|
+
restrictRelationsTo: null
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
exports.transformAttributesFromChatToCTB = transformAttributesFromChatToCTB;
|
|
150
|
+
exports.transformChatToCTB = transformChatToCTB;
|
|
151
|
+
//# sourceMappingURL=toCTB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCTB.js","sources":["../../../../../../../admin/src/components/AIChat/lib/transforms/schemas/toCTB.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport pluralize from 'pluralize';\n\nimport { Schema } from '../../types/schema';\n\nimport type { ContentType, Component, AnyAttribute } from '../../../../../types';\n\nconst ACTION_TO_STATUS: Record<Schema['action'], ContentType['status']> = {\n create: 'NEW',\n remove: 'REMOVED',\n update: 'CHANGED',\n};\n\n/**\n * Creates a new attribute with the specified status\n */\nconst createAttributeWithStatus = (\n name: string,\n attributeData: Record<string, any>,\n status: AnyAttribute['status']\n): AnyAttribute =>\n ({\n ...attributeData,\n name,\n status,\n }) as AnyAttribute;\n\n/**\n * Determines the status of an attribute by comparing new and old versions\n */\nconst determineAttributeStatus = (\n newAttr: Record<string, any>,\n oldAttr?: AnyAttribute,\n oldSchema?: ContentType | Component\n): AnyAttribute['status'] => {\n if (!oldAttr) {\n return 'NEW';\n }\n\n // If the schema was already new, don't mark attributes as changed, keep them as new.\n if (oldSchema?.status === 'NEW') {\n return 'NEW';\n }\n\n // Compare attributes without the status field to determine if they've changed\n const newAttrWithoutStatus = omit(newAttr, ['status']);\n const oldAttrWithoutStatus = omit(oldAttr, ['status']);\n\n if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {\n return 'CHANGED';\n }\n\n // If unchanged, keep the previous status\n return oldAttr.status;\n};\n\n/**\n * Determines the status of a schema by comparing action and checking if oldSchema exists\n */\nconst transformStatusFromChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType['status'] => {\n // If schema has an action, use the mapped status\n if (schema.action) {\n return ACTION_TO_STATUS[schema.action];\n }\n\n // If oldSchema doesn't exist, it's a new schema\n if (!oldSchema) {\n return 'NEW';\n }\n\n // If no action is specified and oldSchema exists, keep the existing status\n return oldSchema.status;\n};\n\n/**\n * Transform attributes from Chat format to CTB format\n * Also performs a diff to determine the status of each attribute\n */\nexport const transformAttributesFromChatToCTB = (\n { action, attributes }: Schema,\n oldSchema?: ContentType | Component\n): AnyAttribute[] => {\n // If it's a new schema or no oldAttributes provided, all attributes are NEW\n if (action === 'create' || !oldSchema) {\n return Object.entries(attributes).map(([name, attribute]) =>\n createAttributeWithStatus(name, attribute, 'NEW')\n );\n }\n\n // Convert old attributes array to a lookup map for faster access\n const oldAttributesMap = oldSchema.attributes.reduce(\n (acc, attr) => ({ ...acc, [attr.name]: attr }),\n {} as Record<string, AnyAttribute>\n );\n\n // Process current attributes (new and changed)\n const processedAttributes = Object.entries(attributes).map(([name, attr]) => {\n const oldAttr = oldAttributesMap[name];\n const status = determineAttributeStatus({ ...attr, name }, oldAttr, oldSchema);\n\n return createAttributeWithStatus(name, attr, status);\n });\n\n // No need to mark removed attributes if the old schema is new, just remove it from the list\n // TODO: Else a validation error occurs on the backend side.\n if (oldSchema?.status === 'NEW') {\n return processedAttributes;\n }\n\n // Find removed attributes (exist in old but not in new)\n const removedAttributes = Object.entries(oldAttributesMap)\n .filter(([name]) => !attributes[name])\n .map(([name, oldAttr]) => createAttributeWithStatus(name, oldAttr, 'REMOVED'));\n\n // Combine both sets of attributes\n return [...processedAttributes, ...removedAttributes];\n};\n\n/**\n * Transform schema format\n * AI chat -> CTB\n *\n * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.\n *\n * We need to keep track of which changes have been made\n */\nexport const transformChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType | Component => {\n const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');\n const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');\n\n if (schema.modelType === 'component') {\n return {\n category: schema.category || 'default',\n modelName: singularName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n info: {\n displayName: schema.name,\n description: schema.description,\n // TODO\n // icon: schema.icon,\n },\n modelType: schema.modelType,\n uid: schema.uid as any,\n collectionName: pluralName,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n } satisfies Component;\n }\n\n return {\n uid: schema.uid as any,\n modelType: schema.modelType,\n modelName: singularName,\n kind: schema.kind!,\n info: {\n displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),\n // Always keep the old by default\n // @ts-expect-error - not in types\n singularName: oldSchema?.info?.singularName || singularName,\n // Always keep the old by default\n // @ts-expect-error - not in types\n pluralName: oldSchema?.info?.pluralName || pluralName,\n },\n collectionName: pluralName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n options: {\n draftAndPublish: schema.options?.draftAndPublish ?? false,\n },\n pluginOptions: {\n i18n: {\n localized: schema.options?.localized ?? false,\n },\n },\n visible: true,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n restrictRelationsTo: null, // TODO: not sure what this is about\n } satisfies ContentType;\n};\n"],"names":["ACTION_TO_STATUS","create","remove","update","createAttributeWithStatus","name","attributeData","status","determineAttributeStatus","newAttr","oldAttr","oldSchema","newAttrWithoutStatus","omit","oldAttrWithoutStatus","isEqual","transformStatusFromChatToCTB","schema","action","transformAttributesFromChatToCTB","attributes","Object","entries","map","attribute","oldAttributesMap","reduce","acc","attr","processedAttributes","removedAttributes","filter","transformChatToCTB","singularName","pluralize","singular","toLowerCase","replace","pluralName","plural","modelType","category","modelName","info","displayName","description","uid","collectionName","globalId","kind","charAt","toUpperCase","slice","options","draftAndPublish","pluginOptions","i18n","localized","visible","restrictRelationsTo"],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import isEqual from 'lodash/isEqual';
|
|
2
|
+
import omit from 'lodash/omit';
|
|
3
|
+
import pluralize from 'pluralize';
|
|
4
|
+
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
6
|
+
const ACTION_TO_STATUS = {
|
|
7
|
+
create: 'NEW',
|
|
8
|
+
remove: 'REMOVED',
|
|
9
|
+
update: 'CHANGED'
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new attribute with the specified status
|
|
13
|
+
*/ const createAttributeWithStatus = (name, attributeData, status)=>({
|
|
14
|
+
...attributeData,
|
|
15
|
+
name,
|
|
16
|
+
status
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Determines the status of an attribute by comparing new and old versions
|
|
20
|
+
*/ const determineAttributeStatus = (newAttr, oldAttr, oldSchema)=>{
|
|
21
|
+
if (!oldAttr) {
|
|
22
|
+
return 'NEW';
|
|
23
|
+
}
|
|
24
|
+
// If the schema was already new, don't mark attributes as changed, keep them as new.
|
|
25
|
+
if (oldSchema?.status === 'NEW') {
|
|
26
|
+
return 'NEW';
|
|
27
|
+
}
|
|
28
|
+
// Compare attributes without the status field to determine if they've changed
|
|
29
|
+
const newAttrWithoutStatus = omit(newAttr, [
|
|
30
|
+
'status'
|
|
31
|
+
]);
|
|
32
|
+
const oldAttrWithoutStatus = omit(oldAttr, [
|
|
33
|
+
'status'
|
|
34
|
+
]);
|
|
35
|
+
if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {
|
|
36
|
+
return 'CHANGED';
|
|
37
|
+
}
|
|
38
|
+
// If unchanged, keep the previous status
|
|
39
|
+
return oldAttr.status;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Determines the status of a schema by comparing action and checking if oldSchema exists
|
|
43
|
+
*/ const transformStatusFromChatToCTB = (schema, oldSchema)=>{
|
|
44
|
+
// If schema has an action, use the mapped status
|
|
45
|
+
if (schema.action) {
|
|
46
|
+
return ACTION_TO_STATUS[schema.action];
|
|
47
|
+
}
|
|
48
|
+
// If oldSchema doesn't exist, it's a new schema
|
|
49
|
+
if (!oldSchema) {
|
|
50
|
+
return 'NEW';
|
|
51
|
+
}
|
|
52
|
+
// If no action is specified and oldSchema exists, keep the existing status
|
|
53
|
+
return oldSchema.status;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Transform attributes from Chat format to CTB format
|
|
57
|
+
* Also performs a diff to determine the status of each attribute
|
|
58
|
+
*/ const transformAttributesFromChatToCTB = ({ action, attributes }, oldSchema)=>{
|
|
59
|
+
// If it's a new schema or no oldAttributes provided, all attributes are NEW
|
|
60
|
+
if (action === 'create' || !oldSchema) {
|
|
61
|
+
return Object.entries(attributes).map(([name, attribute])=>createAttributeWithStatus(name, attribute, 'NEW'));
|
|
62
|
+
}
|
|
63
|
+
// Convert old attributes array to a lookup map for faster access
|
|
64
|
+
const oldAttributesMap = oldSchema.attributes.reduce((acc, attr)=>({
|
|
65
|
+
...acc,
|
|
66
|
+
[attr.name]: attr
|
|
67
|
+
}), {});
|
|
68
|
+
// Process current attributes (new and changed)
|
|
69
|
+
const processedAttributes = Object.entries(attributes).map(([name, attr])=>{
|
|
70
|
+
const oldAttr = oldAttributesMap[name];
|
|
71
|
+
const status = determineAttributeStatus({
|
|
72
|
+
...attr,
|
|
73
|
+
name
|
|
74
|
+
}, oldAttr, oldSchema);
|
|
75
|
+
return createAttributeWithStatus(name, attr, status);
|
|
76
|
+
});
|
|
77
|
+
// No need to mark removed attributes if the old schema is new, just remove it from the list
|
|
78
|
+
// TODO: Else a validation error occurs on the backend side.
|
|
79
|
+
if (oldSchema?.status === 'NEW') {
|
|
80
|
+
return processedAttributes;
|
|
81
|
+
}
|
|
82
|
+
// Find removed attributes (exist in old but not in new)
|
|
83
|
+
const removedAttributes = Object.entries(oldAttributesMap).filter(([name])=>!attributes[name]).map(([name, oldAttr])=>createAttributeWithStatus(name, oldAttr, 'REMOVED'));
|
|
84
|
+
// Combine both sets of attributes
|
|
85
|
+
return [
|
|
86
|
+
...processedAttributes,
|
|
87
|
+
...removedAttributes
|
|
88
|
+
];
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Transform schema format
|
|
92
|
+
* AI chat -> CTB
|
|
93
|
+
*
|
|
94
|
+
* The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.
|
|
95
|
+
*
|
|
96
|
+
* We need to keep track of which changes have been made
|
|
97
|
+
*/ const transformChatToCTB = (schema, oldSchema)=>{
|
|
98
|
+
const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');
|
|
99
|
+
const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');
|
|
100
|
+
if (schema.modelType === 'component') {
|
|
101
|
+
return {
|
|
102
|
+
category: schema.category || 'default',
|
|
103
|
+
modelName: singularName,
|
|
104
|
+
attributes: transformAttributesFromChatToCTB(schema, oldSchema),
|
|
105
|
+
info: {
|
|
106
|
+
displayName: schema.name,
|
|
107
|
+
description: schema.description
|
|
108
|
+
},
|
|
109
|
+
modelType: schema.modelType,
|
|
110
|
+
uid: schema.uid,
|
|
111
|
+
collectionName: pluralName,
|
|
112
|
+
status: transformStatusFromChatToCTB(schema, oldSchema),
|
|
113
|
+
globalId: singularName
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
uid: schema.uid,
|
|
118
|
+
modelType: schema.modelType,
|
|
119
|
+
modelName: singularName,
|
|
120
|
+
kind: schema.kind,
|
|
121
|
+
info: {
|
|
122
|
+
displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),
|
|
123
|
+
// Always keep the old by default
|
|
124
|
+
// @ts-expect-error - not in types
|
|
125
|
+
singularName: oldSchema?.info?.singularName || singularName,
|
|
126
|
+
// Always keep the old by default
|
|
127
|
+
// @ts-expect-error - not in types
|
|
128
|
+
pluralName: oldSchema?.info?.pluralName || pluralName
|
|
129
|
+
},
|
|
130
|
+
collectionName: pluralName,
|
|
131
|
+
attributes: transformAttributesFromChatToCTB(schema, oldSchema),
|
|
132
|
+
options: {
|
|
133
|
+
draftAndPublish: schema.options?.draftAndPublish ?? false
|
|
134
|
+
},
|
|
135
|
+
pluginOptions: {
|
|
136
|
+
i18n: {
|
|
137
|
+
localized: schema.options?.localized ?? false
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
visible: true,
|
|
141
|
+
status: transformStatusFromChatToCTB(schema, oldSchema),
|
|
142
|
+
globalId: singularName,
|
|
143
|
+
restrictRelationsTo: null
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export { transformAttributesFromChatToCTB, transformChatToCTB };
|
|
148
|
+
//# sourceMappingURL=toCTB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toCTB.mjs","sources":["../../../../../../../admin/src/components/AIChat/lib/transforms/schemas/toCTB.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport pluralize from 'pluralize';\n\nimport { Schema } from '../../types/schema';\n\nimport type { ContentType, Component, AnyAttribute } from '../../../../../types';\n\nconst ACTION_TO_STATUS: Record<Schema['action'], ContentType['status']> = {\n create: 'NEW',\n remove: 'REMOVED',\n update: 'CHANGED',\n};\n\n/**\n * Creates a new attribute with the specified status\n */\nconst createAttributeWithStatus = (\n name: string,\n attributeData: Record<string, any>,\n status: AnyAttribute['status']\n): AnyAttribute =>\n ({\n ...attributeData,\n name,\n status,\n }) as AnyAttribute;\n\n/**\n * Determines the status of an attribute by comparing new and old versions\n */\nconst determineAttributeStatus = (\n newAttr: Record<string, any>,\n oldAttr?: AnyAttribute,\n oldSchema?: ContentType | Component\n): AnyAttribute['status'] => {\n if (!oldAttr) {\n return 'NEW';\n }\n\n // If the schema was already new, don't mark attributes as changed, keep them as new.\n if (oldSchema?.status === 'NEW') {\n return 'NEW';\n }\n\n // Compare attributes without the status field to determine if they've changed\n const newAttrWithoutStatus = omit(newAttr, ['status']);\n const oldAttrWithoutStatus = omit(oldAttr, ['status']);\n\n if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {\n return 'CHANGED';\n }\n\n // If unchanged, keep the previous status\n return oldAttr.status;\n};\n\n/**\n * Determines the status of a schema by comparing action and checking if oldSchema exists\n */\nconst transformStatusFromChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType['status'] => {\n // If schema has an action, use the mapped status\n if (schema.action) {\n return ACTION_TO_STATUS[schema.action];\n }\n\n // If oldSchema doesn't exist, it's a new schema\n if (!oldSchema) {\n return 'NEW';\n }\n\n // If no action is specified and oldSchema exists, keep the existing status\n return oldSchema.status;\n};\n\n/**\n * Transform attributes from Chat format to CTB format\n * Also performs a diff to determine the status of each attribute\n */\nexport const transformAttributesFromChatToCTB = (\n { action, attributes }: Schema,\n oldSchema?: ContentType | Component\n): AnyAttribute[] => {\n // If it's a new schema or no oldAttributes provided, all attributes are NEW\n if (action === 'create' || !oldSchema) {\n return Object.entries(attributes).map(([name, attribute]) =>\n createAttributeWithStatus(name, attribute, 'NEW')\n );\n }\n\n // Convert old attributes array to a lookup map for faster access\n const oldAttributesMap = oldSchema.attributes.reduce(\n (acc, attr) => ({ ...acc, [attr.name]: attr }),\n {} as Record<string, AnyAttribute>\n );\n\n // Process current attributes (new and changed)\n const processedAttributes = Object.entries(attributes).map(([name, attr]) => {\n const oldAttr = oldAttributesMap[name];\n const status = determineAttributeStatus({ ...attr, name }, oldAttr, oldSchema);\n\n return createAttributeWithStatus(name, attr, status);\n });\n\n // No need to mark removed attributes if the old schema is new, just remove it from the list\n // TODO: Else a validation error occurs on the backend side.\n if (oldSchema?.status === 'NEW') {\n return processedAttributes;\n }\n\n // Find removed attributes (exist in old but not in new)\n const removedAttributes = Object.entries(oldAttributesMap)\n .filter(([name]) => !attributes[name])\n .map(([name, oldAttr]) => createAttributeWithStatus(name, oldAttr, 'REMOVED'));\n\n // Combine both sets of attributes\n return [...processedAttributes, ...removedAttributes];\n};\n\n/**\n * Transform schema format\n * AI chat -> CTB\n *\n * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.\n *\n * We need to keep track of which changes have been made\n */\nexport const transformChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType | Component => {\n const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');\n const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');\n\n if (schema.modelType === 'component') {\n return {\n category: schema.category || 'default',\n modelName: singularName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n info: {\n displayName: schema.name,\n description: schema.description,\n // TODO\n // icon: schema.icon,\n },\n modelType: schema.modelType,\n uid: schema.uid as any,\n collectionName: pluralName,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n } satisfies Component;\n }\n\n return {\n uid: schema.uid as any,\n modelType: schema.modelType,\n modelName: singularName,\n kind: schema.kind!,\n info: {\n displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),\n // Always keep the old by default\n // @ts-expect-error - not in types\n singularName: oldSchema?.info?.singularName || singularName,\n // Always keep the old by default\n // @ts-expect-error - not in types\n pluralName: oldSchema?.info?.pluralName || pluralName,\n },\n collectionName: pluralName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n options: {\n draftAndPublish: schema.options?.draftAndPublish ?? false,\n },\n pluginOptions: {\n i18n: {\n localized: schema.options?.localized ?? false,\n },\n },\n visible: true,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n restrictRelationsTo: null, // TODO: not sure what this is about\n } satisfies ContentType;\n};\n"],"names":["ACTION_TO_STATUS","create","remove","update","createAttributeWithStatus","name","attributeData","status","determineAttributeStatus","newAttr","oldAttr","oldSchema","newAttrWithoutStatus","omit","oldAttrWithoutStatus","isEqual","transformStatusFromChatToCTB","schema","action","transformAttributesFromChatToCTB","attributes","Object","entries","map","attribute","oldAttributesMap","reduce","acc","attr","processedAttributes","removedAttributes","filter","transformChatToCTB","singularName","pluralize","singular","toLowerCase","replace","pluralName","plural","modelType","category","modelName","info","displayName","description","uid","collectionName","globalId","kind","charAt","toUpperCase","slice","options","draftAndPublish","pluginOptions","i18n","localized","visible","restrictRelationsTo"],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
|
+
var ee = require('@strapi/admin/strapi-admin/ee');
|
|
7
|
+
var useDataManager = require('../../DataManager/useDataManager.js');
|
|
8
|
+
var FeedbackModal = require('../FeedbackModal.js');
|
|
9
|
+
var useAIFetch = require('../hooks/useAIFetch.js');
|
|
10
|
+
var useChatTitle = require('../hooks/useChatTitle.js');
|
|
11
|
+
var useLastSeenSchemas = require('../hooks/useLastSeenSchemas.js');
|
|
12
|
+
var fromCTB = require('../lib/transforms/schemas/fromCTB.js');
|
|
13
|
+
var UploadCodeModal = require('../UploadCodeModal.js');
|
|
14
|
+
var UploadFigmaModal = require('../UploadFigmaModal.js');
|
|
15
|
+
var SchemaProvider = require('./SchemaProvider.js');
|
|
16
|
+
|
|
17
|
+
const ChatContext = /*#__PURE__*/ React.createContext(undefined);
|
|
18
|
+
const generateRandomId = ()=>{
|
|
19
|
+
return Math.random().toString(36).substring(2, 15);
|
|
20
|
+
};
|
|
21
|
+
const BaseChatProvider = ({ children, defaultOpen = false })=>{
|
|
22
|
+
const [chatId, setChatId] = React.useState(generateRandomId());
|
|
23
|
+
const [isChatOpen, setIsChatOpen] = React.useState(defaultOpen);
|
|
24
|
+
const [openCount, setOpenCount] = React.useState(0);
|
|
25
|
+
const [input, setInput] = React.useState('');
|
|
26
|
+
// Files
|
|
27
|
+
const [attachments, setAttachments] = React.useState([]);
|
|
28
|
+
const { trackUsage } = strapiAdmin.useTracking();
|
|
29
|
+
// DataManager
|
|
30
|
+
const { components, contentTypes } = useDataManager.useDataManager();
|
|
31
|
+
// Last user seen schemas
|
|
32
|
+
const { lastSeenSchemas } = useLastSeenSchemas.useLastSeenSchemas();
|
|
33
|
+
// Schemas to be sent to the chat
|
|
34
|
+
const schemas = React.useMemo(()=>{
|
|
35
|
+
return [
|
|
36
|
+
...Object.values(contentTypes).filter((schema)=>schema.status !== 'REMOVED')// Probably we should still keep this one, not sure
|
|
37
|
+
.filter((schema)=>schema.uid !== 'plugin::users-permissions.user').filter((schema)=>schema.visible).map(fromCTB.transformCTBToChat),
|
|
38
|
+
...Object.values(components).filter((schema)=>schema.status !== 'REMOVED').map(fromCTB.transformCTBToChat)
|
|
39
|
+
];
|
|
40
|
+
}, [
|
|
41
|
+
contentTypes,
|
|
42
|
+
components
|
|
43
|
+
]);
|
|
44
|
+
const { id, messages, sendMessage: _sendMessage, status, stop, ...chat } = useAIFetch.useAIChat({
|
|
45
|
+
id: chatId?.toString(),
|
|
46
|
+
experimental_throttle: 100
|
|
47
|
+
});
|
|
48
|
+
/* -------------------------------------------------------------------------------------------------
|
|
49
|
+
* AI SDK chat overrides
|
|
50
|
+
* -----------------------------------------------------------------------------------------------*/ // NOTE: body is using state variables, so they can not be passed as a prop in useChat
|
|
51
|
+
const sendMessage = async (message, options)=>{
|
|
52
|
+
if (status === 'streaming' || status === 'submitted') {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
return _sendMessage(message, {
|
|
56
|
+
...options,
|
|
57
|
+
body: {
|
|
58
|
+
...options?.body,
|
|
59
|
+
schemas,
|
|
60
|
+
metadata: {
|
|
61
|
+
lastSeenSchemas: lastSeenSchemas.map((schema)=>schema.uid)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
const handleSubmit = (e)=>{
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
if (status === 'streaming' || status === 'submitted') {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const readyAttachments = attachments.filter((a)=>a.status !== 'loading');
|
|
72
|
+
if (input.trim().length === 0 && attachments.length === 0) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const files = readyAttachments.map((attachment)=>({
|
|
76
|
+
type: 'file',
|
|
77
|
+
filename: attachment.filename,
|
|
78
|
+
mediaType: attachment.mediaType,
|
|
79
|
+
url: attachment.url
|
|
80
|
+
}));
|
|
81
|
+
sendMessage({
|
|
82
|
+
text: input,
|
|
83
|
+
files
|
|
84
|
+
});
|
|
85
|
+
setInput('');
|
|
86
|
+
setAttachments([]);
|
|
87
|
+
};
|
|
88
|
+
/* -------------------------------------------------------------------------------------------------
|
|
89
|
+
* Chat title
|
|
90
|
+
* -----------------------------------------------------------------------------------------------*/ const { title, generateTitle, resetTitle } = useChatTitle.useChatTitle({
|
|
91
|
+
chatId: id,
|
|
92
|
+
messages
|
|
93
|
+
});
|
|
94
|
+
// Automatically generate title when we have at least 1 message (user query)
|
|
95
|
+
React.useEffect(()=>{
|
|
96
|
+
if (messages.length >= 1 && !title) {
|
|
97
|
+
generateTitle();
|
|
98
|
+
}
|
|
99
|
+
}, [
|
|
100
|
+
messages.length,
|
|
101
|
+
title,
|
|
102
|
+
generateTitle
|
|
103
|
+
]);
|
|
104
|
+
React.useEffect(()=>{
|
|
105
|
+
if (status === 'error') {
|
|
106
|
+
trackUsage('didAnswerMessage', {
|
|
107
|
+
successful: false
|
|
108
|
+
});
|
|
109
|
+
} else if (status === 'ready' && messages.length > 0 && messages[messages.length - 1]?.role === 'assistant') {
|
|
110
|
+
trackUsage('didAnswerMessage', {
|
|
111
|
+
successful: true
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}, [
|
|
115
|
+
status,
|
|
116
|
+
messages,
|
|
117
|
+
trackUsage
|
|
118
|
+
]);
|
|
119
|
+
const isChatAvailable = ee.useAIAvailability();
|
|
120
|
+
return /*#__PURE__*/ jsxRuntime.jsx(ChatContext.Provider, {
|
|
121
|
+
value: {
|
|
122
|
+
isChatEnabled: isChatAvailable,
|
|
123
|
+
id,
|
|
124
|
+
status,
|
|
125
|
+
stop,
|
|
126
|
+
sendMessage,
|
|
127
|
+
...chat,
|
|
128
|
+
messages,
|
|
129
|
+
handleSubmit,
|
|
130
|
+
input,
|
|
131
|
+
setInput,
|
|
132
|
+
handleInputChange: (e)=>setInput(e.target.value),
|
|
133
|
+
reset: ()=>{
|
|
134
|
+
stop();
|
|
135
|
+
setChatId(generateRandomId());
|
|
136
|
+
trackUsage('didStartNewChat');
|
|
137
|
+
resetTitle();
|
|
138
|
+
},
|
|
139
|
+
schemas,
|
|
140
|
+
// Chat
|
|
141
|
+
title,
|
|
142
|
+
isChatOpen,
|
|
143
|
+
openChat: ()=>{
|
|
144
|
+
setIsChatOpen(true);
|
|
145
|
+
// if this is the first open, it's a new chat
|
|
146
|
+
if (openCount === 0) {
|
|
147
|
+
trackUsage('didStartNewChat');
|
|
148
|
+
}
|
|
149
|
+
setOpenCount((prev)=>prev + 1);
|
|
150
|
+
},
|
|
151
|
+
closeChat: ()=>setIsChatOpen(false),
|
|
152
|
+
// Attachments
|
|
153
|
+
attachments,
|
|
154
|
+
setAttachments
|
|
155
|
+
},
|
|
156
|
+
children: children
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
const ChatProvider = ({ children, defaultOpen = false })=>{
|
|
160
|
+
return /*#__PURE__*/ jsxRuntime.jsx(BaseChatProvider, {
|
|
161
|
+
defaultOpen: defaultOpen,
|
|
162
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(SchemaProvider.SchemaChatProvider, {
|
|
163
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(UploadCodeModal.UploadProjectToChatProvider, {
|
|
164
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(UploadFigmaModal.UploadFigmaToChatProvider, {
|
|
165
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(FeedbackModal.FeedbackProvider, {
|
|
166
|
+
children: children
|
|
167
|
+
})
|
|
168
|
+
})
|
|
169
|
+
})
|
|
170
|
+
})
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
function useStrapiChat() {
|
|
174
|
+
const context = React.useContext(ChatContext);
|
|
175
|
+
if (process.env.NODE_ENV === 'development') {
|
|
176
|
+
// In development, provide a fallback to prevent crashes during hot reloading
|
|
177
|
+
// This allows the app to continue working during HMR updates
|
|
178
|
+
if (context === undefined) {
|
|
179
|
+
console.warn('useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.');
|
|
180
|
+
return {};
|
|
181
|
+
}
|
|
182
|
+
} else if (context === undefined) {
|
|
183
|
+
throw new Error('useStrapiChat must be used within a ChatProvider');
|
|
184
|
+
}
|
|
185
|
+
return context;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
exports.BaseChatProvider = BaseChatProvider;
|
|
189
|
+
exports.ChatProvider = ChatProvider;
|
|
190
|
+
exports.useStrapiChat = useStrapiChat;
|
|
191
|
+
//# sourceMappingURL=ChatProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatProvider.js","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":"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"}
|