camox 0.0.0 → 0.1.2-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +110 -0
- package/dist/components/AuthGate.d.ts +7 -0
- package/dist/components/AuthGate.d.ts.map +1 -0
- package/dist/core/components/AddBlockControlBar.d.ts +9 -0
- package/dist/core/components/AddBlockControlBar.d.ts.map +1 -0
- package/dist/core/components/AddBlockControlBar.js +65 -0
- package/dist/core/components/lexical/InlineContentEditable.d.ts +7 -0
- package/dist/core/components/lexical/InlineContentEditable.d.ts.map +1 -0
- package/dist/core/components/lexical/InlineContentEditable.js +40 -0
- package/dist/core/components/lexical/InlineLexicalEditor.d.ts +12 -0
- package/dist/core/components/lexical/InlineLexicalEditor.d.ts.map +1 -0
- package/dist/core/components/lexical/InlineLexicalEditor.js +133 -0
- package/dist/core/components/lexical/InlineParagraphNode.d.ts +10 -0
- package/dist/core/components/lexical/InlineParagraphNode.d.ts.map +1 -0
- package/dist/core/components/lexical/InlineParagraphNode.js +34 -0
- package/dist/core/components/lexical/SelectionBroadcaster.d.ts +6 -0
- package/dist/core/components/lexical/SelectionBroadcaster.d.ts.map +1 -0
- package/dist/core/components/lexical/SelectionBroadcaster.js +62 -0
- package/dist/core/components/lexical/SidebarLexicalEditor.d.ts +9 -0
- package/dist/core/components/lexical/SidebarLexicalEditor.d.ts.map +1 -0
- package/dist/core/components/lexical/editorConfig.d.ts +4 -0
- package/dist/core/components/lexical/editorConfig.d.ts.map +1 -0
- package/dist/core/components/lexical/editorConfig.js +24 -0
- package/dist/core/createApp.d.ts +373 -0
- package/dist/core/createApp.d.ts.map +1 -0
- package/dist/core/createApp.js +40 -0
- package/dist/core/createBlock.d.ts +947 -0
- package/dist/core/createBlock.d.ts.map +1 -0
- package/dist/core/createBlock.js +873 -0
- package/dist/core/createLayout.d.ts +78 -0
- package/dist/core/createLayout.d.ts.map +1 -0
- package/dist/core/createLayout.js +73 -0
- package/dist/core/hooks/useFieldSelection.d.ts +11 -0
- package/dist/core/hooks/useFieldSelection.d.ts.map +1 -0
- package/dist/core/hooks/useFieldSelection.js +25 -0
- package/dist/core/hooks/useIsEditable.d.ts +2 -0
- package/dist/core/hooks/useIsEditable.d.ts.map +1 -0
- package/dist/core/hooks/useIsEditable.js +12 -0
- package/dist/core/hooks/useOverlayMessage.d.ts +10 -0
- package/dist/core/hooks/useOverlayMessage.d.ts.map +1 -0
- package/dist/core/hooks/useOverlayMessage.js +37 -0
- package/dist/core/lib/contentType.d.ts +165 -0
- package/dist/core/lib/contentType.d.ts.map +1 -0
- package/dist/core/lib/contentType.js +148 -0
- package/dist/core/lib/fieldTypes.d.ts +85 -0
- package/dist/core/lib/fieldTypes.d.ts.map +1 -0
- package/dist/core/lib/lexicalReact.d.ts +3 -0
- package/dist/core/lib/lexicalReact.d.ts.map +1 -0
- package/dist/core/lib/lexicalReact.js +24 -0
- package/dist/core/lib/lexicalState.d.ts +10 -0
- package/dist/core/lib/lexicalState.d.ts.map +1 -0
- package/dist/core/lib/lexicalState.js +38 -0
- package/dist/core/lib/modifierFormats.d.ts +9 -0
- package/dist/core/lib/modifierFormats.d.ts.map +1 -0
- package/dist/core/lib/modifierFormats.js +8 -0
- package/dist/core/lib/modifiers.d.ts +12 -0
- package/dist/core/lib/modifiers.d.ts.map +1 -0
- package/dist/core/lib/modifiers.js +27 -0
- package/dist/features/content/CamoxContent.d.ts +2 -0
- package/dist/features/content/CamoxContent.d.ts.map +1 -0
- package/dist/features/content/CamoxContent.js +100 -0
- package/dist/features/content/components/AssetCard.d.ts +10 -0
- package/dist/features/content/components/AssetCard.d.ts.map +1 -0
- package/dist/features/content/components/AssetCard.js +41 -0
- package/dist/features/content/components/AssetCardSkeleton.d.ts +2 -0
- package/dist/features/content/components/AssetCardSkeleton.d.ts.map +1 -0
- package/dist/features/content/components/AssetCardSkeleton.js +11 -0
- package/dist/features/content/components/ContentSidebar.d.ts +2 -0
- package/dist/features/content/components/ContentSidebar.d.ts.map +1 -0
- package/dist/features/content/components/ContentSidebar.js +15 -0
- package/dist/features/content/components/UploadDropZone.d.ts +9 -0
- package/dist/features/content/components/UploadDropZone.d.ts.map +1 -0
- package/dist/features/content/components/UploadDropZone.js +51 -0
- package/dist/features/content/components/UploadProgressDrawer.d.ts +11 -0
- package/dist/features/content/components/UploadProgressDrawer.d.ts.map +1 -0
- package/dist/features/content/components/UploadProgressDrawer.js +72 -0
- package/dist/features/preview/CamoxPreview.d.ts +124 -0
- package/dist/features/preview/CamoxPreview.d.ts.map +1 -0
- package/dist/features/preview/CamoxPreview.js +253 -0
- package/dist/features/preview/components/AddBlockSheet.d.ts +3 -0
- package/dist/features/preview/components/AddBlockSheet.d.ts.map +1 -0
- package/dist/features/preview/components/AddBlockSheet.js +121 -0
- package/dist/features/preview/components/AgentChatSheet.d.ts +3 -0
- package/dist/features/preview/components/AgentChatSheet.d.ts.map +1 -0
- package/dist/features/preview/components/AgentChatSheet.js +24 -0
- package/dist/features/preview/components/AssetFieldEditor.d.ts +18 -0
- package/dist/features/preview/components/AssetFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/AssetFieldEditor.js +139 -0
- package/dist/features/preview/components/AssetLightbox.d.ts +9 -0
- package/dist/features/preview/components/AssetLightbox.d.ts.map +1 -0
- package/dist/features/preview/components/AssetLightbox.js +421 -0
- package/dist/features/preview/components/AssetPickerGrid.d.ts +11 -0
- package/dist/features/preview/components/AssetPickerGrid.d.ts.map +1 -0
- package/dist/features/preview/components/AssetPickerGrid.js +92 -0
- package/dist/features/preview/components/BlockActionsPopover.d.ts +15 -0
- package/dist/features/preview/components/BlockActionsPopover.d.ts.map +1 -0
- package/dist/features/preview/components/BlockActionsPopover.js +506 -0
- package/dist/features/preview/components/CreatePageSheet.d.ts +3 -0
- package/dist/features/preview/components/CreatePageSheet.d.ts.map +1 -0
- package/dist/features/preview/components/CreatePageSheet.js +159 -0
- package/dist/features/preview/components/DebouncedFieldEditor.d.ts +10 -0
- package/dist/features/preview/components/DebouncedFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/DebouncedFieldEditor.js +51 -0
- package/dist/features/preview/components/EditPageSheet.d.ts +3 -0
- package/dist/features/preview/components/EditPageSheet.d.ts.map +1 -0
- package/dist/features/preview/components/EditPageSheet.js +352 -0
- package/dist/features/preview/components/ItemFieldsEditor.d.ts +29 -0
- package/dist/features/preview/components/ItemFieldsEditor.d.ts.map +1 -0
- package/dist/features/preview/components/ItemFieldsEditor.js +308 -0
- package/dist/features/preview/components/LinkFieldEditor.d.ts +8 -0
- package/dist/features/preview/components/LinkFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/LinkFieldEditor.js +190 -0
- package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts +10 -0
- package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts.map +1 -0
- package/dist/features/preview/components/MultipleAssetFieldEditor.js +232 -0
- package/dist/features/preview/components/OverlayTracker.d.ts +6 -0
- package/dist/features/preview/components/OverlayTracker.d.ts.map +1 -0
- package/dist/features/preview/components/OverlayTracker.js +41 -0
- package/dist/features/preview/components/Overlays.d.ts +6 -0
- package/dist/features/preview/components/Overlays.d.ts.map +1 -0
- package/dist/features/preview/components/Overlays.js +58 -0
- package/dist/features/preview/components/PageContentSheet.d.ts +3 -0
- package/dist/features/preview/components/PageContentSheet.d.ts.map +1 -0
- package/dist/features/preview/components/PageContentSheet.js +492 -0
- package/dist/features/preview/components/PageLocationFieldset.d.ts +14 -0
- package/dist/features/preview/components/PageLocationFieldset.d.ts.map +1 -0
- package/dist/features/preview/components/PageLocationFieldset.js +77 -0
- package/dist/features/preview/components/PagePicker.d.ts +3 -0
- package/dist/features/preview/components/PagePicker.d.ts.map +1 -0
- package/dist/features/preview/components/PagePicker.js +185 -0
- package/dist/features/preview/components/PageTree.d.ts +3 -0
- package/dist/features/preview/components/PageTree.d.ts.map +1 -0
- package/dist/features/preview/components/PageTree.js +410 -0
- package/dist/features/preview/components/PeekedBlock.d.ts +6 -0
- package/dist/features/preview/components/PeekedBlock.d.ts.map +1 -0
- package/dist/features/preview/components/PeekedBlock.js +95 -0
- package/dist/features/preview/components/PreviewPanel.d.ts +12 -0
- package/dist/features/preview/components/PreviewPanel.d.ts.map +1 -0
- package/dist/features/preview/components/PreviewPanel.js +192 -0
- package/dist/features/preview/components/PreviewSideSheet.d.ts +13 -0
- package/dist/features/preview/components/PreviewSideSheet.d.ts.map +1 -0
- package/dist/features/preview/components/PreviewSideSheet.js +28 -0
- package/dist/features/preview/components/PreviewToolbar.d.ts +2 -0
- package/dist/features/preview/components/PreviewToolbar.d.ts.map +1 -0
- package/dist/features/preview/components/PreviewToolbar.js +79 -0
- package/dist/features/preview/components/RepeatableItemsList.d.ts +14 -0
- package/dist/features/preview/components/RepeatableItemsList.d.ts.map +1 -0
- package/dist/features/preview/components/RepeatableItemsList.js +366 -0
- package/dist/features/preview/components/ShikiMarkdown.d.ts +4 -0
- package/dist/features/preview/components/ShikiMarkdown.d.ts.map +1 -0
- package/dist/features/preview/components/ShikiMarkdown.js +37 -0
- package/dist/features/preview/components/TextFormatToolbar.d.ts +2 -0
- package/dist/features/preview/components/TextFormatToolbar.d.ts.map +1 -0
- package/dist/features/preview/components/TextFormatToolbar.js +73 -0
- package/dist/features/preview/components/UnlinkAssetButton.d.ts +9 -0
- package/dist/features/preview/components/UnlinkAssetButton.d.ts.map +1 -0
- package/dist/features/preview/components/UnlinkAssetButton.js +55 -0
- package/dist/features/preview/overlayConstants.d.ts +19 -0
- package/dist/features/preview/overlayConstants.d.ts.map +1 -0
- package/dist/features/preview/overlayConstants.js +21 -0
- package/dist/features/preview/overlayMessages.d.ts +62 -0
- package/dist/features/preview/overlayMessages.d.ts.map +1 -0
- package/dist/features/preview/overlayMessages.js +9 -0
- package/dist/features/preview/previewConstants.d.ts +2 -0
- package/dist/features/preview/previewConstants.d.ts.map +1 -0
- package/dist/features/preview/previewStore.d.ts +116 -0
- package/dist/features/preview/previewStore.d.ts.map +1 -0
- package/dist/features/preview/previewStore.js +321 -0
- package/dist/features/provider/CamoxProvider.d.ts +11 -0
- package/dist/features/provider/CamoxProvider.d.ts.map +1 -0
- package/dist/features/provider/CamoxProvider.js +73 -0
- package/dist/features/provider/actionsStore.d.ts +39 -0
- package/dist/features/provider/actionsStore.d.ts.map +1 -0
- package/dist/features/provider/actionsStore.js +35 -0
- package/dist/features/provider/components/CamoxAppContext.d.ts +371 -0
- package/dist/features/provider/components/CamoxAppContext.d.ts.map +1 -0
- package/dist/features/provider/components/CamoxAppContext.js +17 -0
- package/dist/features/provider/components/CommandPalette.d.ts +3 -0
- package/dist/features/provider/components/CommandPalette.d.ts.map +1 -0
- package/dist/features/provider/components/CommandPalette.js +127 -0
- package/dist/features/provider/useAdminShortcuts.d.ts +5 -0
- package/dist/features/provider/useAdminShortcuts.d.ts.map +1 -0
- package/dist/features/provider/useAdminShortcuts.js +83 -0
- package/dist/features/routes/ogRoute.d.ts +7 -0
- package/dist/features/routes/ogRoute.d.ts.map +1 -0
- package/dist/features/routes/ogRoute.js +19 -0
- package/dist/features/routes/pageRoute.d.ts +135 -0
- package/dist/features/routes/pageRoute.d.ts.map +1 -0
- package/dist/features/routes/pageRoute.js +112 -0
- package/dist/features/studio/CamoxStudio.d.ts +7 -0
- package/dist/features/studio/CamoxStudio.d.ts.map +1 -0
- package/dist/features/studio/CamoxStudio.js +24 -0
- package/dist/features/studio/components/Navbar.d.ts +4 -0
- package/dist/features/studio/components/Navbar.d.ts.map +1 -0
- package/dist/features/studio/components/Navbar.js +95 -0
- package/dist/features/studio/components/ProjectMenu.d.ts +2 -0
- package/dist/features/studio/components/ProjectMenu.d.ts.map +1 -0
- package/dist/features/studio/components/ProjectMenu.js +132 -0
- package/dist/features/studio/components/UserButton.d.ts +2 -0
- package/dist/features/studio/components/UserButton.d.ts.map +1 -0
- package/dist/features/studio/components/UserButton.js +96 -0
- package/dist/features/studio/studioStore.d.ts +17 -0
- package/dist/features/studio/studioStore.d.ts.map +1 -0
- package/dist/features/studio/studioStore.js +44 -0
- package/dist/features/studio/useTheme.d.ts +9 -0
- package/dist/features/studio/useTheme.d.ts.map +1 -0
- package/dist/features/studio/useTheme.js +98 -0
- package/dist/features/vite/appGeneration.d.ts +4 -0
- package/dist/features/vite/appGeneration.d.ts.map +1 -0
- package/dist/features/vite/appGeneration.js +67 -0
- package/dist/features/vite/blockBoilerplate.d.ts +3 -0
- package/dist/features/vite/blockBoilerplate.d.ts.map +1 -0
- package/dist/features/vite/blockBoilerplate.js +59 -0
- package/dist/features/vite/convexSync.d.ts +6 -0
- package/dist/features/vite/convexSync.d.ts.map +1 -0
- package/dist/features/vite/convexSync.js +98 -0
- package/dist/features/vite/definitionsSync.d.ts +11 -0
- package/dist/features/vite/definitionsSync.d.ts.map +1 -0
- package/dist/features/vite/definitionsSync.js +157 -0
- package/dist/features/vite/routeGeneration.d.ts +4 -0
- package/dist/features/vite/routeGeneration.d.ts.map +1 -0
- package/dist/features/vite/routeGeneration.js +194 -0
- package/dist/features/vite/skillGeneration.d.ts +4 -0
- package/dist/features/vite/skillGeneration.d.ts.map +1 -0
- package/dist/features/vite/skillGeneration.js +69 -0
- package/dist/features/vite/utils.d.ts +2 -0
- package/dist/features/vite/utils.d.ts.map +1 -0
- package/dist/features/vite/utils.js +10 -0
- package/dist/features/vite/vite.d.ts +18 -0
- package/dist/features/vite/vite.d.ts.map +1 -0
- package/dist/features/vite/vite.js +77 -0
- package/dist/hooks/use-file-upload.d.ts +22 -0
- package/dist/hooks/use-file-upload.d.ts.map +1 -0
- package/dist/hooks/use-marquee-selection.d.ts +17 -0
- package/dist/hooks/use-marquee-selection.d.ts.map +1 -0
- package/dist/lib/analytics-client.d.ts +3 -0
- package/dist/lib/analytics-client.d.ts.map +1 -0
- package/dist/lib/analytics.d.ts +3 -0
- package/dist/lib/analytics.d.ts.map +1 -0
- package/dist/lib/analytics.js +24 -0
- package/dist/lib/auth.d.ts +3683 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/convex-site.d.ts +3 -0
- package/dist/lib/convex-site.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +40 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/studio.css +2 -0
- package/package.json +123 -10
- package/server/api.d.ts +1 -0
- package/server/api.js +1 -0
- package/server/dataModel.d.ts +1 -0
- package/server/dataModel.js +1 -0
- package/skills/camox-block/SKILL.md +357 -0
- package/skills/camox-layout/SKILL.md +181 -0
- package/index.js +0 -3
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { writeIfChanged } from "./utils.js";
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { relative, resolve } from "node:path";
|
|
4
|
+
//#region src/features/vite/routeGeneration.ts
|
|
5
|
+
var HEADER = `/* ============================================================================
|
|
6
|
+
* AUTO-GENERATED BY CAMOX — DO NOT EDIT
|
|
7
|
+
*
|
|
8
|
+
* This file is managed by the Camox Vite plugin and should stay gitignored.
|
|
9
|
+
* Any manual edits will be automatically reverted by the dev server.
|
|
10
|
+
* ============================================================================ */
|
|
11
|
+
|
|
12
|
+
`;
|
|
13
|
+
function generateCamoxLayout(convexUrl, managementUrl) {
|
|
14
|
+
return HEADER + `import { Outlet, createFileRoute } from "@tanstack/react-router";
|
|
15
|
+
import { CamoxProvider } from "camox/CamoxProvider";
|
|
16
|
+
import { camoxApp } from "@/camox/app";
|
|
17
|
+
|
|
18
|
+
export const Route = createFileRoute("/_camox")({
|
|
19
|
+
component: CamoxPathlessLayout,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
function CamoxPathlessLayout() {
|
|
23
|
+
return (
|
|
24
|
+
<CamoxProvider camoxApp={camoxApp} convexUrl="${convexUrl}" managementUrl="${managementUrl}">
|
|
25
|
+
<Outlet />
|
|
26
|
+
</CamoxProvider>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
}
|
|
31
|
+
function generatePageRoute(convexUrl) {
|
|
32
|
+
return HEADER + `import { createFileRoute } from "@tanstack/react-router";
|
|
33
|
+
import {
|
|
34
|
+
createMarkdownMiddleware,
|
|
35
|
+
createPageLoader,
|
|
36
|
+
createPageHead,
|
|
37
|
+
PageRouteComponent,
|
|
38
|
+
} from "camox/_internal/pageRoute";
|
|
39
|
+
import { camoxApp } from "@/camox/app";
|
|
40
|
+
|
|
41
|
+
const markdownMiddleware = createMarkdownMiddleware("${convexUrl}");
|
|
42
|
+
const loader = createPageLoader("${convexUrl}");
|
|
43
|
+
const head = createPageHead(camoxApp);
|
|
44
|
+
|
|
45
|
+
export const Route = createFileRoute("/_camox/$")({
|
|
46
|
+
server: {
|
|
47
|
+
middleware: [markdownMiddleware],
|
|
48
|
+
},
|
|
49
|
+
component: App,
|
|
50
|
+
loader,
|
|
51
|
+
head,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
function App() {
|
|
55
|
+
const { page } = Route.useLoaderData();
|
|
56
|
+
return <PageRouteComponent page={page} />;
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
function generateOgRoute() {
|
|
61
|
+
return HEADER + `import { createFileRoute } from "@tanstack/react-router";
|
|
62
|
+
import { createOgHandler } from "camox/_internal/ogRoute";
|
|
63
|
+
import { camoxApp } from "@/camox/app";
|
|
64
|
+
|
|
65
|
+
export const Route = createFileRoute("/_camox/og")({
|
|
66
|
+
server: {
|
|
67
|
+
handlers: createOgHandler(camoxApp),
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
`;
|
|
71
|
+
}
|
|
72
|
+
function generateCmxRedirect() {
|
|
73
|
+
return HEADER + `import { createFileRoute, redirect } from "@tanstack/react-router";
|
|
74
|
+
|
|
75
|
+
export const Route = createFileRoute("/_camox/cmx")({
|
|
76
|
+
component: RouteComponent,
|
|
77
|
+
loader: () => {
|
|
78
|
+
throw redirect({ to: "/cmx-studio" });
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
function RouteComponent() {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
`;
|
|
86
|
+
}
|
|
87
|
+
function generateCmxStudio() {
|
|
88
|
+
return HEADER + `import { Outlet, createFileRoute } from "@tanstack/react-router";
|
|
89
|
+
import { CamoxStudio } from "camox/CamoxStudio";
|
|
90
|
+
|
|
91
|
+
export const Route = createFileRoute("/_camox/cmx-studio")({
|
|
92
|
+
component: RouteComponent,
|
|
93
|
+
notFoundComponent: () => <div>Studio page not found</div>,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
function RouteComponent() {
|
|
97
|
+
return (
|
|
98
|
+
<CamoxStudio>
|
|
99
|
+
<Outlet />
|
|
100
|
+
</CamoxStudio>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
function generateCmxStudioCatchAll() {
|
|
106
|
+
return HEADER + `import { Outlet, createFileRoute } from "@tanstack/react-router";
|
|
107
|
+
import { CamoxStudio } from "camox/CamoxStudio";
|
|
108
|
+
|
|
109
|
+
export const Route = createFileRoute("/_camox/cmx-studio/$")({
|
|
110
|
+
component: RouteComponent,
|
|
111
|
+
notFoundComponent: () => <div>Studio page not found</div>,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
function RouteComponent() {
|
|
115
|
+
return (
|
|
116
|
+
<CamoxStudio>
|
|
117
|
+
<Outlet />
|
|
118
|
+
</CamoxStudio>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
`;
|
|
122
|
+
}
|
|
123
|
+
function generateCmxStudioContent() {
|
|
124
|
+
return HEADER + `import { createFileRoute } from "@tanstack/react-router";
|
|
125
|
+
import { CamoxContent } from "camox/CamoxContent";
|
|
126
|
+
|
|
127
|
+
export const Route = createFileRoute("/_camox/cmx-studio/content")({
|
|
128
|
+
component: RouteComponent,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
function RouteComponent() {
|
|
132
|
+
return <CamoxContent />;
|
|
133
|
+
}
|
|
134
|
+
`;
|
|
135
|
+
}
|
|
136
|
+
function getRouteFileEntries(routesDir, convexUrl, managementUrl) {
|
|
137
|
+
const camoxDir = resolve(routesDir, "_camox");
|
|
138
|
+
return [
|
|
139
|
+
{
|
|
140
|
+
path: resolve(routesDir, "_camox.tsx"),
|
|
141
|
+
content: generateCamoxLayout(convexUrl, managementUrl)
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
path: resolve(camoxDir, "$.tsx"),
|
|
145
|
+
content: generatePageRoute(convexUrl)
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
path: resolve(camoxDir, "og.tsx"),
|
|
149
|
+
content: generateOgRoute()
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
path: resolve(camoxDir, "cmx.tsx"),
|
|
153
|
+
content: generateCmxRedirect()
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
path: resolve(camoxDir, "cmx-studio.tsx"),
|
|
157
|
+
content: generateCmxStudio()
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
path: resolve(camoxDir, "cmx-studio.$.tsx"),
|
|
161
|
+
content: generateCmxStudioCatchAll()
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
path: resolve(camoxDir, "cmx-studio.content.tsx"),
|
|
165
|
+
content: generateCmxStudioContent()
|
|
166
|
+
}
|
|
167
|
+
];
|
|
168
|
+
}
|
|
169
|
+
function generateRouteFiles(routesDir, convexUrl, managementUrl) {
|
|
170
|
+
mkdirSync(resolve(routesDir, "_camox"), { recursive: true });
|
|
171
|
+
for (const entry of getRouteFileEntries(routesDir, convexUrl, managementUrl)) writeIfChanged(entry.path, entry.content);
|
|
172
|
+
}
|
|
173
|
+
function watchRouteFiles(server, routesDir, convexUrl, managementUrl) {
|
|
174
|
+
const entries = getRouteFileEntries(routesDir, convexUrl, managementUrl);
|
|
175
|
+
const expectedByPath = new Map(entries.map((e) => [e.path, e.content]));
|
|
176
|
+
server.watcher.on("change", (changedPath) => {
|
|
177
|
+
const expected = expectedByPath.get(changedPath);
|
|
178
|
+
if (!expected) return;
|
|
179
|
+
if (readFileSync(changedPath, "utf-8") !== expected) {
|
|
180
|
+
const rel = relative(server.config.root, changedPath);
|
|
181
|
+
server.config.logger.warn(`Camox route file "${rel}" was modified — reverting to generated version.`, { timestamp: true });
|
|
182
|
+
writeFileSync(changedPath, expected, "utf-8");
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
server.watcher.on("unlink", (deletedPath) => {
|
|
186
|
+
const expected = expectedByPath.get(deletedPath);
|
|
187
|
+
if (!expected) return;
|
|
188
|
+
const rel = relative(server.config.root, deletedPath);
|
|
189
|
+
server.config.logger.warn(`Camox route file "${rel}" was deleted — recreating.`, { timestamp: true });
|
|
190
|
+
writeFileSync(deletedPath, expected, "utf-8");
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
194
|
+
export { generateRouteFiles, watchRouteFiles };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillGeneration.d.ts","sourceRoot":"","sources":["../../../src/features/vite/skillGeneration.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AA8B1C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,QAUjD;AA6BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,QA6BrE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { writeIfChanged } from "./utils.js";
|
|
2
|
+
import { lstatSync, mkdirSync, readFileSync, readdirSync, readlinkSync, symlinkSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
//#region src/features/vite/skillGeneration.ts
|
|
6
|
+
var HEADER = `<!-- AUTO-GENERATED BY CAMOX — DO NOT EDIT
|
|
7
|
+
This file is managed by the Camox Vite plugin.
|
|
8
|
+
Any manual edits will be automatically reverted by the dev server. -->
|
|
9
|
+
|
|
10
|
+
`;
|
|
11
|
+
var sdkRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
|
|
12
|
+
function getSkillNames() {
|
|
13
|
+
const skillsDir = resolve(sdkRoot, "skills");
|
|
14
|
+
return readdirSync(skillsDir).filter((name) => lstatSync(resolve(skillsDir, name)).isDirectory());
|
|
15
|
+
}
|
|
16
|
+
function generateSkillContent(skillName) {
|
|
17
|
+
return HEADER + readFileSync(resolve(sdkRoot, `skills/${skillName}/SKILL.md`), "utf-8");
|
|
18
|
+
}
|
|
19
|
+
function getSkillFileEntries(appRoot) {
|
|
20
|
+
return getSkillNames().map((name) => ({
|
|
21
|
+
path: resolve(appRoot, `.agents/skills/${name}/SKILL.md`),
|
|
22
|
+
content: generateSkillContent(name)
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
function generateSkillFiles(appRoot) {
|
|
26
|
+
for (const name of getSkillNames()) mkdirSync(resolve(appRoot, `.agents/skills/${name}`), { recursive: true });
|
|
27
|
+
for (const entry of getSkillFileEntries(appRoot)) writeIfChanged(entry.path, entry.content);
|
|
28
|
+
ensureClaudeSkillSymlinks(appRoot);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* For each skill directory in `.agents/skills/`, ensure a corresponding
|
|
32
|
+
* symlink exists in `.claude/skills/` pointing to it via a relative path.
|
|
33
|
+
*/
|
|
34
|
+
function ensureClaudeSkillSymlinks(appRoot) {
|
|
35
|
+
const agentsSkillsDir = resolve(appRoot, ".agents/skills");
|
|
36
|
+
const claudeSkillsDir = resolve(appRoot, ".claude/skills");
|
|
37
|
+
mkdirSync(claudeSkillsDir, { recursive: true });
|
|
38
|
+
for (const name of readdirSync(agentsSkillsDir)) {
|
|
39
|
+
if (!lstatSync(join(agentsSkillsDir, name)).isDirectory()) continue;
|
|
40
|
+
const symlinkPath = join(claudeSkillsDir, name);
|
|
41
|
+
const targetRelative = join("../../.agents/skills", name);
|
|
42
|
+
try {
|
|
43
|
+
if (readlinkSync(symlinkPath) === targetRelative) continue;
|
|
44
|
+
} catch {}
|
|
45
|
+
symlinkSync(targetRelative, symlinkPath);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function watchSkillFiles(server, appRoot) {
|
|
49
|
+
const entries = getSkillFileEntries(appRoot);
|
|
50
|
+
const expectedByPath = new Map(entries.map((e) => [e.path, e.content]));
|
|
51
|
+
server.watcher.on("change", (changedPath) => {
|
|
52
|
+
const expected = expectedByPath.get(changedPath);
|
|
53
|
+
if (!expected) return;
|
|
54
|
+
if (readFileSync(changedPath, "utf-8") !== expected) {
|
|
55
|
+
const rel = relative(server.config.root, changedPath);
|
|
56
|
+
server.config.logger.warn(`Camox skill file "${rel}" was modified — reverting to generated version.`, { timestamp: true });
|
|
57
|
+
writeFileSync(changedPath, expected, "utf-8");
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
server.watcher.on("unlink", (deletedPath) => {
|
|
61
|
+
const expected = expectedByPath.get(deletedPath);
|
|
62
|
+
if (!expected) return;
|
|
63
|
+
const rel = relative(server.config.root, deletedPath);
|
|
64
|
+
server.config.logger.warn(`Camox skill file "${rel}" was deleted — recreating.`, { timestamp: true });
|
|
65
|
+
writeFileSync(deletedPath, expected, "utf-8");
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { generateSkillFiles, watchSkillFiles };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/vite/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAM/D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
//#region src/features/vite/utils.ts
|
|
3
|
+
function writeIfChanged(filePath, content) {
|
|
4
|
+
if (existsSync(filePath)) {
|
|
5
|
+
if (readFileSync(filePath, "utf-8") === content) return;
|
|
6
|
+
}
|
|
7
|
+
writeFileSync(filePath, content, "utf-8");
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { writeIfChanged };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
import { DefinitionsSyncOptions } from './definitionsSync';
|
|
3
|
+
export interface CamoxPluginOptions {
|
|
4
|
+
/** Stable, human-readable slug identifying this project (e.g. "prestigious-impala-84") */
|
|
5
|
+
projectSlug: string;
|
|
6
|
+
/** Disable the generation of boilerplate code when creating a blank file in the blocks directory (default: false) */
|
|
7
|
+
disableBlockBoilerplateGeneration?: boolean;
|
|
8
|
+
/** Disable automatic definitions sync on server start (default: false) */
|
|
9
|
+
disableDefinitionsSync?: boolean;
|
|
10
|
+
/** Options for definitions sync */
|
|
11
|
+
definitionsSync?: DefinitionsSyncOptions;
|
|
12
|
+
/** URL of the Camox management web app, used for authentication redirects */
|
|
13
|
+
managementUrl?: string;
|
|
14
|
+
/** Disable PostHog analytics collection (default: false) */
|
|
15
|
+
disableAnalytics?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function camox(options: CamoxPluginOptions): Plugin;
|
|
18
|
+
//# sourceMappingURL=vite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../../../src/features/vite/vite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAclD,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAOjF,MAAM,WAAW,kBAAkB;IACjC,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;IACpB,qHAAqH;IACrH,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mCAAmC;IACnC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA8EzD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { generateAppFile, watchAppFile } from "./appGeneration.js";
|
|
2
|
+
import { watchNewBlockFiles } from "./blockBoilerplate.js";
|
|
3
|
+
import { LOCAL_CONVEX_URL, startConvexDev, stopConvexDev } from "./convexSync.js";
|
|
4
|
+
import { syncDefinitions } from "./definitionsSync.js";
|
|
5
|
+
import { generateRouteFiles, watchRouteFiles } from "./routeGeneration.js";
|
|
6
|
+
import { generateSkillFiles, watchSkillFiles } from "./skillGeneration.js";
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
8
|
+
import { dirname, resolve } from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
//#region src/features/vite/vite.ts
|
|
11
|
+
var sdkRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
|
|
12
|
+
var VIRTUAL_STUDIO_CSS = "virtual:camox-studio-css";
|
|
13
|
+
var RESOLVED_VIRTUAL_STUDIO_CSS = "\0" + VIRTUAL_STUDIO_CSS;
|
|
14
|
+
/** Default management backend URL (production Camox web app) */
|
|
15
|
+
var DEFAULT_MANAGEMENT_URL = "https://camox.ai";
|
|
16
|
+
function camox(options) {
|
|
17
|
+
const convexUrl = LOCAL_CONVEX_URL;
|
|
18
|
+
const managementUrl = options.managementUrl ?? DEFAULT_MANAGEMENT_URL;
|
|
19
|
+
let isBuild = false;
|
|
20
|
+
return {
|
|
21
|
+
name: "camox",
|
|
22
|
+
resolveId(id) {
|
|
23
|
+
if (id === VIRTUAL_STUDIO_CSS) return RESOLVED_VIRTUAL_STUDIO_CSS;
|
|
24
|
+
},
|
|
25
|
+
load(id) {
|
|
26
|
+
if (id !== RESOLVED_VIRTUAL_STUDIO_CSS) return;
|
|
27
|
+
const cssPath = resolve(sdkRoot, "dist/studio.css");
|
|
28
|
+
if (isBuild) {
|
|
29
|
+
const css = readFileSync(cssPath, "utf-8");
|
|
30
|
+
return `export default import.meta.ROLLUP_FILE_URL_${this.emitFile({
|
|
31
|
+
type: "asset",
|
|
32
|
+
name: "studio.css",
|
|
33
|
+
source: css
|
|
34
|
+
})};`;
|
|
35
|
+
}
|
|
36
|
+
return `export default "/@fs/${cssPath}";`;
|
|
37
|
+
},
|
|
38
|
+
config(_config, env) {
|
|
39
|
+
isBuild = env.command === "build";
|
|
40
|
+
return { define: {
|
|
41
|
+
...env.command === "serve" && {
|
|
42
|
+
"import.meta.env.VITE_CONVEX_URL": JSON.stringify(convexUrl),
|
|
43
|
+
"import.meta.env.VITE_CONVEX_SITE_URL": JSON.stringify("http://127.0.0.1:3211")
|
|
44
|
+
},
|
|
45
|
+
__CAMOX_ANALYTICS_DISABLED__: JSON.stringify(!!options.disableAnalytics)
|
|
46
|
+
} };
|
|
47
|
+
},
|
|
48
|
+
configResolved(config) {
|
|
49
|
+
const routesDir = resolve(config.root, "src/routes");
|
|
50
|
+
generateAppFile(config.root);
|
|
51
|
+
generateRouteFiles(routesDir, convexUrl, managementUrl);
|
|
52
|
+
generateSkillFiles(config.root);
|
|
53
|
+
const message = config.command === "serve" ? `Running Camox app (NODE_ENV: ${process.env.NODE_ENV})` : `Building Camox app (NODE_ENV: ${process.env.NODE_ENV})`;
|
|
54
|
+
config.logger.info(message, { timestamp: true });
|
|
55
|
+
},
|
|
56
|
+
configureServer(server) {
|
|
57
|
+
const routesDir = resolve(server.config.root, "src/routes");
|
|
58
|
+
watchAppFile(server, server.config.root);
|
|
59
|
+
watchRouteFiles(server, routesDir, convexUrl, managementUrl);
|
|
60
|
+
watchSkillFiles(server, server.config.root);
|
|
61
|
+
if (!options.disableBlockBoilerplateGeneration) watchNewBlockFiles(server);
|
|
62
|
+
server.httpServer?.once("listening", async () => {
|
|
63
|
+
await startConvexDev(server);
|
|
64
|
+
if (!options.disableDefinitionsSync) syncDefinitions(server, {
|
|
65
|
+
...options.definitionsSync,
|
|
66
|
+
projectSlug: options.projectSlug,
|
|
67
|
+
convexUrl
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
},
|
|
71
|
+
buildEnd() {
|
|
72
|
+
stopConvexDev();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { camox };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface UploadItem {
|
|
2
|
+
id: string;
|
|
3
|
+
filename: string;
|
|
4
|
+
progress: number;
|
|
5
|
+
status: "uploading" | "committing" | "complete" | "error";
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
interface UseFileUploadOptions {
|
|
9
|
+
onFileCommitted?: (result: {
|
|
10
|
+
fileId: string;
|
|
11
|
+
url: string;
|
|
12
|
+
filename: string;
|
|
13
|
+
mimeType: string;
|
|
14
|
+
}) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function useFileUpload(options?: UseFileUploadOptions): {
|
|
17
|
+
uploads: UploadItem[];
|
|
18
|
+
uploadFiles: (files: FileList) => void;
|
|
19
|
+
clearAll: () => void;
|
|
20
|
+
};
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=use-file-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-file-upload.d.ts","sourceRoot":"","sources":["../../src/hooks/use-file-upload.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,oBAAoB;IAC5B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,IAAI,CAAC;CACZ;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;;yBA+EhD,QAAQ;;EAgCnB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface Rect {
|
|
2
|
+
left: number;
|
|
3
|
+
top: number;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function useMarqueeSelection(containerRef: React.RefObject<HTMLElement | null>, onSelectionChange: (ids: Set<string>) => void): {
|
|
8
|
+
selectionRect: Rect | null;
|
|
9
|
+
didDragRef: import('react').RefObject<boolean>;
|
|
10
|
+
handlers: {
|
|
11
|
+
onPointerDown: (e: React.PointerEvent) => void;
|
|
12
|
+
onPointerMove: (e: React.PointerEvent) => void;
|
|
13
|
+
onPointerUp: (e: React.PointerEvent) => void;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=use-marquee-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-marquee-selection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-marquee-selection.ts"],"names":[],"mappings":"AAOA,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACjD,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;;;;2BA8DvC,KAAK,CAAC,YAAY;2BAiBlB,KAAK,CAAC,YAAY;yBAyBY,KAAK,CAAC,YAAY;;EAcvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-client.d.ts","sourceRoot":"","sources":["../../src/lib/analytics-client.ts"],"names":[],"mappings":"AAiCA,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAGlF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/lib/analytics.ts"],"names":[],"mappings":"AAmBA,kEAAkE;AAClE,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,iBAKlF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/lib/analytics.ts
|
|
2
|
+
var POSTHOG_API_KEY = "phc_DV6H1bUHFvtNFfhyiq9skEQMniuyxs3HLx06TajB6Fw";
|
|
3
|
+
var client = null;
|
|
4
|
+
async function getClient() {
|
|
5
|
+
if (__CAMOX_ANALYTICS_DISABLED__) return null;
|
|
6
|
+
if (!client) {
|
|
7
|
+
const { PostHog } = await import("posthog-node");
|
|
8
|
+
client = new PostHog(POSTHOG_API_KEY, { host: "https://us.i.posthog.com" });
|
|
9
|
+
}
|
|
10
|
+
return client;
|
|
11
|
+
}
|
|
12
|
+
/** Server-side tracking for page views (used in pageRoute.tsx) */
|
|
13
|
+
async function trackEvent(event, properties) {
|
|
14
|
+
const posthog = await getClient();
|
|
15
|
+
if (!posthog) return;
|
|
16
|
+
const distinctId = properties.projectId ?? "unknown";
|
|
17
|
+
posthog.capture({
|
|
18
|
+
distinctId,
|
|
19
|
+
event,
|
|
20
|
+
properties
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { trackEvent };
|