spine-framework 0.1.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/.framework/README.md +129 -0
- package/.framework/cli/bin.cjs +14 -0
- package/.framework/cli/commands/agents.ts +153 -0
- package/.framework/cli/commands/auth.ts +94 -0
- package/.framework/cli/commands/create-app.ts +185 -0
- package/.framework/cli/commands/dev.ts +295 -0
- package/.framework/cli/commands/doctor.ts +442 -0
- package/.framework/cli/commands/generate.ts +332 -0
- package/.framework/cli/commands/init.ts +272 -0
- package/.framework/cli/commands/install-app.ts +391 -0
- package/.framework/cli/commands/items.ts +253 -0
- package/.framework/cli/commands/migrations.ts +141 -0
- package/.framework/cli/commands/pipelines.ts +166 -0
- package/.framework/cli/commands/status.ts +197 -0
- package/.framework/cli/commands/system.ts +184 -0
- package/.framework/cli/commands/test.ts +227 -0
- package/.framework/cli/commands/uninstall-app.ts +166 -0
- package/.framework/cli/context.ts +268 -0
- package/.framework/cli/env-loader.ts +36 -0
- package/.framework/cli/index.ts +106 -0
- package/.framework/cli/welcome.cjs +45 -0
- package/.framework/docs/API.md +384 -0
- package/.framework/docs/STABILITY.md +52 -0
- package/.framework/docs/admin-routes.md +76 -0
- package/.framework/docs/api-docs-progress.md +38 -0
- package/.framework/docs/api-governance.md +146 -0
- package/.framework/docs/api-testing-results.md +212 -0
- package/.framework/docs/apis/admin-configs.md +567 -0
- package/.framework/docs/apis/admin-data.md +272 -0
- package/.framework/docs/apis/index.md +231 -0
- package/.framework/docs/apis/internal.md +295 -0
- package/.framework/docs/apis/runtime.md +537 -0
- package/.framework/docs/assembly-launch-guide.md +138 -0
- package/.framework/docs/audit-results.md +590 -0
- package/.framework/docs/authorization-model.md +170 -0
- package/.framework/docs/db-api-inventory.md +95 -0
- package/.framework/docs/examples/custom-app/README.md +77 -0
- package/.framework/docs/examples/custom-function/README.md +27 -0
- package/.framework/docs/examples/custom-function/handler.ts +48 -0
- package/.framework/docs/examples/custom-webhook/README.md +68 -0
- package/.framework/docs/gap-remediation-backlog.md +103 -0
- package/.framework/docs/guides/cli-guide.md +224 -0
- package/.framework/docs/guides/getting-started.md +103 -0
- package/.framework/docs/guides/import-guide.md +193 -0
- package/.framework/docs/guides/testing-guide.md +229 -0
- package/.framework/docs/permission-examples.md +326 -0
- package/.framework/docs/ui-adoption-verification.md +111 -0
- package/.framework/docs/ui-api-coverage.md +84 -0
- package/.framework/docs/v2-compatibility-audit.md +228 -0
- package/.framework/functions/.gitkeep +1 -0
- package/.framework/functions/_shared/agent-runner.ts +1097 -0
- package/.framework/functions/_shared/app-manifest.ts +184 -0
- package/.framework/functions/_shared/audit.ts +150 -0
- package/.framework/functions/_shared/db.ts +174 -0
- package/.framework/functions/_shared/index.ts +382 -0
- package/.framework/functions/_shared/middleware.ts +490 -0
- package/.framework/functions/_shared/permissions.ts +1325 -0
- package/.framework/functions/_shared/pipeline-runner.ts +731 -0
- package/.framework/functions/_shared/principal.ts +760 -0
- package/.framework/functions/_shared/schema-utils.ts +967 -0
- package/.framework/functions/_shared/testing.ts +258 -0
- package/.framework/functions/_shared/trigger-engine.ts +425 -0
- package/.framework/functions/_shared/webhook-registration.ts +168 -0
- package/.framework/functions/_shared/webhook-registry.ts +129 -0
- package/.framework/functions/account-nodes.ts +111 -0
- package/.framework/functions/admin-data.ts +606 -0
- package/.framework/functions/ai-agents.ts +323 -0
- package/.framework/functions/api-keys.ts +376 -0
- package/.framework/functions/apps.ts +483 -0
- package/.framework/functions/auth.ts +196 -0
- package/.framework/functions/debug-auth.ts +107 -0
- package/.framework/functions/embeddings.ts +556 -0
- package/.framework/functions/integration-routes.ts +523 -0
- package/.framework/functions/integrations.ts +319 -0
- package/.framework/functions/item-progress.ts +272 -0
- package/.framework/functions/logs.ts +438 -0
- package/.framework/functions/observability.ts +275 -0
- package/.framework/functions/pipeline-executions.ts +494 -0
- package/.framework/functions/pipelines.ts +485 -0
- package/.framework/functions/prompt-configs.ts +339 -0
- package/.framework/functions/roles.ts +387 -0
- package/.framework/functions/system-cron.ts +742 -0
- package/.framework/functions/system.ts +323 -0
- package/.framework/functions/tests.ts +119 -0
- package/.framework/functions/timers.ts +357 -0
- package/.framework/functions/triggers.ts +563 -0
- package/.framework/functions/types.ts +604 -0
- package/.framework/migrations/000_foundation.sql +1256 -0
- package/.framework/migrations/001_seed.sql +92 -0
- package/.framework/migrations/002_seed_constraints.sql +13 -0
- package/.framework/migrations/003_auth_user_trigger.sql +59 -0
- package/.framework/src/App.tsx +126 -0
- package/.framework/src/apps/admin/index.tsx +173 -0
- package/.framework/src/components/AppWrapper.tsx +56 -0
- package/.framework/src/components/CustomAppLoader.tsx +116 -0
- package/.framework/src/components/admin/AdminListPage.tsx +151 -0
- package/.framework/src/components/admin/AdminSidebar.tsx +166 -0
- package/.framework/src/components/admin/AdminStatsCard.tsx +62 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +42 -0
- package/.framework/src/components/app-shell/GenericAppShell.tsx +181 -0
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +200 -0
- package/.framework/src/components/app-shell/GenericListPage.tsx +116 -0
- package/.framework/src/components/app-sidebar.tsx +228 -0
- package/.framework/src/components/auth/ProtectedRoute.tsx +88 -0
- package/.framework/src/components/layout/AppShell.tsx +91 -0
- package/.framework/src/components/layout/Header.tsx +88 -0
- package/.framework/src/components/layout/Layout.tsx +95 -0
- package/.framework/src/components/layout/Sidebar.tsx +329 -0
- package/.framework/src/components/runtime/DataDetailHeader.tsx +77 -0
- package/.framework/src/components/runtime/DataDetailPage.tsx +171 -0
- package/.framework/src/components/runtime/DataFilters.tsx +91 -0
- package/.framework/src/components/runtime/DataHeader.tsx +68 -0
- package/.framework/src/components/runtime/DataListPage.tsx +124 -0
- package/.framework/src/components/runtime/DataStats.tsx +70 -0
- package/.framework/src/components/runtime/DataTable.tsx +174 -0
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +134 -0
- package/.framework/src/components/runtime/index.ts +18 -0
- package/.framework/src/components/search-form.tsx +29 -0
- package/.framework/src/components/shared/AgentView.tsx +213 -0
- package/.framework/src/components/shared/FieldRenderer.tsx +478 -0
- package/.framework/src/components/shared/SchemaFields.tsx +226 -0
- package/.framework/src/components/ui/DataTable.tsx +343 -0
- package/.framework/src/components/ui/Form.tsx +281 -0
- package/.framework/src/components/ui/ItemCard.tsx +296 -0
- package/.framework/src/components/ui/ItemListView.tsx +308 -0
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -0
- package/.framework/src/components/ui/Modal.tsx +61 -0
- package/.framework/src/components/ui/RichTextEditor.tsx +210 -0
- package/.framework/src/components/ui/accordion.tsx +82 -0
- package/.framework/src/components/ui/alert-dialog.tsx +197 -0
- package/.framework/src/components/ui/alert.tsx +76 -0
- package/.framework/src/components/ui/aspect-ratio.tsx +11 -0
- package/.framework/src/components/ui/avatar.tsx +110 -0
- package/.framework/src/components/ui/badge.tsx +49 -0
- package/.framework/src/components/ui/breadcrumb.tsx +122 -0
- package/.framework/src/components/ui/button-group.tsx +83 -0
- package/.framework/src/components/ui/button.tsx +65 -0
- package/.framework/src/components/ui/calendar.tsx +222 -0
- package/.framework/src/components/ui/card.tsx +100 -0
- package/.framework/src/components/ui/carousel.tsx +240 -0
- package/.framework/src/components/ui/chart.tsx +373 -0
- package/.framework/src/components/ui/checkbox.tsx +31 -0
- package/.framework/src/components/ui/collapsible.tsx +33 -0
- package/.framework/src/components/ui/combobox.tsx +299 -0
- package/.framework/src/components/ui/command.tsx +193 -0
- package/.framework/src/components/ui/context-menu.tsx +261 -0
- package/.framework/src/components/ui/dialog.tsx +165 -0
- package/.framework/src/components/ui/direction.tsx +22 -0
- package/.framework/src/components/ui/drawer.tsx +132 -0
- package/.framework/src/components/ui/dropdown-menu.tsx +269 -0
- package/.framework/src/components/ui/empty.tsx +104 -0
- package/.framework/src/components/ui/field.tsx +238 -0
- package/.framework/src/components/ui/hover-card.tsx +42 -0
- package/.framework/src/components/ui/input-group.tsx +153 -0
- package/.framework/src/components/ui/input-otp.tsx +87 -0
- package/.framework/src/components/ui/input.tsx +19 -0
- package/.framework/src/components/ui/item.tsx +196 -0
- package/.framework/src/components/ui/kbd.tsx +26 -0
- package/.framework/src/components/ui/label.tsx +22 -0
- package/.framework/src/components/ui/menubar.tsx +277 -0
- package/.framework/src/components/ui/native-select.tsx +61 -0
- package/.framework/src/components/ui/navigation-menu.tsx +164 -0
- package/.framework/src/components/ui/pagination.tsx +129 -0
- package/.framework/src/components/ui/popover.tsx +87 -0
- package/.framework/src/components/ui/progress.tsx +31 -0
- package/.framework/src/components/ui/radio-group.tsx +42 -0
- package/.framework/src/components/ui/resizable.tsx +50 -0
- package/.framework/src/components/ui/scroll-area.tsx +53 -0
- package/.framework/src/components/ui/select.tsx +195 -0
- package/.framework/src/components/ui/separator.tsx +26 -0
- package/.framework/src/components/ui/sheet.tsx +145 -0
- package/.framework/src/components/ui/sidebar.tsx +706 -0
- package/.framework/src/components/ui/skeleton.tsx +13 -0
- package/.framework/src/components/ui/slider.tsx +59 -0
- package/.framework/src/components/ui/sonner.tsx +47 -0
- package/.framework/src/components/ui/spinner.tsx +10 -0
- package/.framework/src/components/ui/switch.tsx +33 -0
- package/.framework/src/components/ui/table-primitives.tsx +141 -0
- package/.framework/src/components/ui/table.tsx +114 -0
- package/.framework/src/components/ui/tabs.tsx +90 -0
- package/.framework/src/components/ui/textarea.tsx +18 -0
- package/.framework/src/components/ui/toggle-group.tsx +89 -0
- package/.framework/src/components/ui/toggle.tsx +45 -0
- package/.framework/src/components/ui/tooltip.tsx +57 -0
- package/.framework/src/contexts/AppContext.tsx +133 -0
- package/.framework/src/contexts/AuthContext.tsx +371 -0
- package/.framework/src/hooks/use-mobile.ts +19 -0
- package/.framework/src/hooks/useApi.ts +526 -0
- package/.framework/src/hooks/useApps.ts +114 -0
- package/.framework/src/hooks/useEntityList.ts +190 -0
- package/.framework/src/hooks/useEntityRecord.ts +308 -0
- package/.framework/src/hooks/useForm.ts +307 -0
- package/.framework/src/hooks/useListSchema.ts +264 -0
- package/.framework/src/hooks/useSchemaRecord.ts +223 -0
- package/.framework/src/index.css +128 -0
- package/.framework/src/lib/api.ts +156 -0
- package/.framework/src/lib/supabase.ts +94 -0
- package/.framework/src/lib/utils.ts +317 -0
- package/.framework/src/main.tsx +27 -0
- package/.framework/src/pages/DashboardPage.tsx +181 -0
- package/.framework/src/pages/NotFoundPage.tsx +39 -0
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +161 -0
- package/.framework/src/pages/admin/AIAgentsPage.tsx +318 -0
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +199 -0
- package/.framework/src/pages/admin/APIKeysPage.tsx +303 -0
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +523 -0
- package/.framework/src/pages/admin/AppDetailPage.tsx +493 -0
- package/.framework/src/pages/admin/AppsPage.tsx +355 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +491 -0
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +534 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +424 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +176 -0
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +109 -0
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +402 -0
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +187 -0
- package/.framework/src/pages/admin/IntegrationsPage.tsx +301 -0
- package/.framework/src/pages/admin/LogsPage.tsx +283 -0
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +85 -0
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +470 -0
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +183 -0
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +279 -0
- package/.framework/src/pages/admin/PipelinesPage.tsx +390 -0
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +299 -0
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +292 -0
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +434 -0
- package/.framework/src/pages/admin/RoleDetailPage.tsx +273 -0
- package/.framework/src/pages/admin/RolesPage.tsx +292 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +61 -0
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +588 -0
- package/.framework/src/pages/admin/SimpleDashboard.tsx +387 -0
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +172 -0
- package/.framework/src/pages/admin/TestingDashboard.tsx +257 -0
- package/.framework/src/pages/admin/TimerDetailPage.tsx +151 -0
- package/.framework/src/pages/admin/TimersPage.tsx +376 -0
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +149 -0
- package/.framework/src/pages/admin/TriggersPage.tsx +381 -0
- package/.framework/src/pages/admin/TypeDetailPage.tsx +694 -0
- package/.framework/src/pages/admin/TypesPage.tsx +295 -0
- package/.framework/src/pages/auth/LoginPage.tsx +188 -0
- package/.framework/src/pages/auth/RegisterPage.tsx +163 -0
- package/.framework/src/pages/spine-framework/APIPage.tsx +17 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +25 -0
- package/.framework/src/types/auth.ts +125 -0
- package/.framework/src/types/types.ts +407 -0
- package/STRUCTURE.md +150 -0
- package/config/components.json +25 -0
- package/config/deno.lock +108 -0
- package/config/package-lock.json +17183 -0
- package/config/postcss.config.cjs +10 -0
- package/config/tailwind.config.cjs +78 -0
- package/config/tsconfig.build.json +32 -0
- package/config/tsconfig.cli.json +18 -0
- package/config/tsconfig.json +41 -0
- package/config/tsconfig.node.json +17 -0
- package/config/tsconfig.node.tsbuildinfo +1 -0
- package/config/tsconfig.tsbuildinfo +1 -0
- package/config/typedoc.json +16 -0
- package/config/vite.config.d.ts +2 -0
- package/config/vite.config.ts +72 -0
- package/dist/cli/commands/agents.d.ts +39 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/auth.d.ts +36 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/create-app.d.ts +23 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/dev.d.ts +39 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/doctor.d.ts +42 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/generate.d.ts +36 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +30 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/install-app.d.ts +30 -0
- package/dist/cli/commands/install-app.d.ts.map +1 -0
- package/dist/cli/commands/items.d.ts +45 -0
- package/dist/cli/commands/items.d.ts.map +1 -0
- package/dist/cli/commands/migrations.d.ts +41 -0
- package/dist/cli/commands/migrations.d.ts.map +1 -0
- package/dist/cli/commands/pipelines.d.ts +40 -0
- package/dist/cli/commands/pipelines.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts +23 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/system.d.ts +29 -0
- package/dist/cli/commands/system.d.ts.map +1 -0
- package/dist/cli/commands/test.d.ts +46 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/uninstall-app.d.ts +23 -0
- package/dist/cli/commands/uninstall-app.d.ts.map +1 -0
- package/dist/cli/context.d.ts +88 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/env-loader.d.ts +14 -0
- package/dist/cli/env-loader.d.ts.map +1 -0
- package/dist/cli/index.d.ts +41 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/functions/_shared/agent-runner.d.ts +156 -0
- package/dist/functions/_shared/agent-runner.d.ts.map +1 -0
- package/dist/functions/_shared/app-manifest.d.ts +68 -0
- package/dist/functions/_shared/app-manifest.d.ts.map +1 -0
- package/dist/functions/_shared/audit.d.ts +91 -0
- package/dist/functions/_shared/audit.d.ts.map +1 -0
- package/dist/functions/_shared/db.d.ts +125 -0
- package/dist/functions/_shared/db.d.ts.map +1 -0
- package/dist/functions/_shared/index.d.ts +298 -0
- package/dist/functions/_shared/index.d.ts.map +1 -0
- package/dist/functions/_shared/middleware.d.ts +315 -0
- package/dist/functions/_shared/middleware.d.ts.map +1 -0
- package/dist/functions/_shared/permissions.d.ts +626 -0
- package/dist/functions/_shared/permissions.d.ts.map +1 -0
- package/dist/functions/_shared/pipeline-runner.d.ts +124 -0
- package/dist/functions/_shared/pipeline-runner.d.ts.map +1 -0
- package/dist/functions/_shared/principal.d.ts +284 -0
- package/dist/functions/_shared/principal.d.ts.map +1 -0
- package/dist/functions/_shared/schema-utils.d.ts +181 -0
- package/dist/functions/_shared/schema-utils.d.ts.map +1 -0
- package/dist/functions/_shared/testing.d.ts +172 -0
- package/dist/functions/_shared/testing.d.ts.map +1 -0
- package/dist/functions/_shared/trigger-engine.d.ts +140 -0
- package/dist/functions/_shared/trigger-engine.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registration.d.ts +81 -0
- package/dist/functions/_shared/webhook-registration.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registry.d.ts +57 -0
- package/dist/functions/_shared/webhook-registry.d.ts.map +1 -0
- package/dist/functions/account-nodes.d.ts +48 -0
- package/dist/functions/account-nodes.d.ts.map +1 -0
- package/dist/functions/admin-data.d.ts +178 -0
- package/dist/functions/admin-data.d.ts.map +1 -0
- package/dist/functions/ai-agents.d.ts +125 -0
- package/dist/functions/ai-agents.d.ts.map +1 -0
- package/dist/functions/api-keys.d.ts +140 -0
- package/dist/functions/api-keys.d.ts.map +1 -0
- package/dist/functions/apps.d.ts +163 -0
- package/dist/functions/apps.d.ts.map +1 -0
- package/dist/functions/auth.d.ts +74 -0
- package/dist/functions/auth.d.ts.map +1 -0
- package/dist/functions/debug-auth.d.ts +33 -0
- package/dist/functions/debug-auth.d.ts.map +1 -0
- package/dist/functions/embeddings.d.ts +205 -0
- package/dist/functions/embeddings.d.ts.map +1 -0
- package/dist/functions/integration-routes.d.ts +45 -0
- package/dist/functions/integration-routes.d.ts.map +1 -0
- package/dist/functions/integrations.d.ts +124 -0
- package/dist/functions/integrations.d.ts.map +1 -0
- package/dist/functions/item-progress.d.ts +41 -0
- package/dist/functions/item-progress.d.ts.map +1 -0
- package/dist/functions/logs.d.ts +162 -0
- package/dist/functions/logs.d.ts.map +1 -0
- package/dist/functions/observability.d.ts +123 -0
- package/dist/functions/observability.d.ts.map +1 -0
- package/dist/functions/pipeline-executions.d.ts +190 -0
- package/dist/functions/pipeline-executions.d.ts.map +1 -0
- package/dist/functions/pipelines.d.ts +171 -0
- package/dist/functions/pipelines.d.ts.map +1 -0
- package/dist/functions/prompt-configs.d.ts +125 -0
- package/dist/functions/prompt-configs.d.ts.map +1 -0
- package/dist/functions/roles.d.ts +118 -0
- package/dist/functions/roles.d.ts.map +1 -0
- package/dist/functions/system-cron.d.ts +65 -0
- package/dist/functions/system-cron.d.ts.map +1 -0
- package/dist/functions/system.d.ts +29 -0
- package/dist/functions/system.d.ts.map +1 -0
- package/dist/functions/tests.d.ts +28 -0
- package/dist/functions/tests.d.ts.map +1 -0
- package/dist/functions/timers.d.ts +139 -0
- package/dist/functions/timers.d.ts.map +1 -0
- package/dist/functions/triggers.d.ts +203 -0
- package/dist/functions/triggers.d.ts.map +1 -0
- package/dist/functions/types.d.ts +151 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/src/types/types.d.ts +364 -0
- package/dist/src/types/types.d.ts.map +1 -0
- package/package.json +192 -0
- package/scripts/app-install-cli.ts +286 -0
- package/scripts/assemble-frontend.sh +79 -0
- package/scripts/assemble-functions.sh +62 -0
- package/scripts/assemble.sh +35 -0
- package/scripts/boundary-check.sh +106 -0
- package/scripts/build-manifest.sh +80 -0
- package/scripts/check-core-integrity.sh +82 -0
- package/scripts/ingest-chunks.cjs +202 -0
- package/scripts/kb-chunk-parser.cjs +312 -0
- package/scripts/kb-chunk-parser.ts +330 -0
- package/scripts/load-test-app-install.ts +484 -0
- package/scripts/netlify-dev-wrapper.sh +22 -0
- package/scripts/verify-integrity.sh +69 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module testing
|
|
3
|
+
* @audience custom-developer
|
|
4
|
+
* @layer shared-util
|
|
5
|
+
* @stability evolving
|
|
6
|
+
*
|
|
7
|
+
* Testing utilities for custom code developers.
|
|
8
|
+
* Use these to test your custom functions without full deployment.
|
|
9
|
+
*
|
|
10
|
+
* **Usage in custom function tests:**
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { makeTestContext, mockPrincipal, cleanup } from '@core/testing'
|
|
13
|
+
*
|
|
14
|
+
* describe('My Custom Handler', () => {
|
|
15
|
+
* it('should process items', async () => {
|
|
16
|
+
* const ctx = makeTestContext({
|
|
17
|
+
* principal: mockPrincipal({ roles: ['member'] }),
|
|
18
|
+
* accountId: 'test-account'
|
|
19
|
+
* })
|
|
20
|
+
*
|
|
21
|
+
* const result = await myHandler(mockEvent, ctx)
|
|
22
|
+
* expect(result.status).toBe('success')
|
|
23
|
+
*
|
|
24
|
+
* cleanup()
|
|
25
|
+
* })
|
|
26
|
+
* })
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @seeAlso .framework/tests/unit/core-isolation.test.ts (examples)
|
|
30
|
+
*/
|
|
31
|
+
import { adminDb } from './db';
|
|
32
|
+
export interface TestContext {
|
|
33
|
+
db: typeof adminDb;
|
|
34
|
+
principal: TestPrincipal;
|
|
35
|
+
logger: TestLogger;
|
|
36
|
+
accountId: string;
|
|
37
|
+
}
|
|
38
|
+
export interface TestPrincipal {
|
|
39
|
+
id: string;
|
|
40
|
+
account_id: string;
|
|
41
|
+
roles: string[];
|
|
42
|
+
permissions: Record<string, any>;
|
|
43
|
+
email?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface TestLogger {
|
|
46
|
+
info: (msg: string, meta?: any) => void;
|
|
47
|
+
warn: (msg: string, meta?: any) => void;
|
|
48
|
+
error: (msg: string, meta?: any) => void;
|
|
49
|
+
debug: (msg: string, meta?: any) => void;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Creates a mock principal for testing.
|
|
53
|
+
*
|
|
54
|
+
* @param overrides - Override default principal properties
|
|
55
|
+
* @returns Mock principal object
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const admin = mockPrincipal({
|
|
60
|
+
* roles: ['system_admin'],
|
|
61
|
+
* permissions: { all: true }
|
|
62
|
+
* })
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function mockPrincipal(overrides?: Partial<TestPrincipal>): TestPrincipal;
|
|
66
|
+
/**
|
|
67
|
+
* Creates a mock logger that captures logs for assertions.
|
|
68
|
+
*
|
|
69
|
+
* @returns TestLogger with log capture
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* const logger = mockLogger()
|
|
74
|
+
* await myFunction(logger)
|
|
75
|
+
* expect(logger.getLogs()).toContain('Processing started')
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function mockLogger(): TestLogger & {
|
|
79
|
+
getLogs: () => string[];
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Creates a test context for handler testing.
|
|
83
|
+
*
|
|
84
|
+
* @param options - Test context configuration
|
|
85
|
+
* @returns TestContext ready for handler
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* const ctx = makeTestContext({
|
|
90
|
+
* principal: mockPrincipal({ roles: ['operator'] }),
|
|
91
|
+
* accountId: 'my-account'
|
|
92
|
+
* })
|
|
93
|
+
*
|
|
94
|
+
* const result = await handler(mockEvent, ctx)
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export declare function makeTestContext(options?: {
|
|
98
|
+
principal?: TestPrincipal;
|
|
99
|
+
accountId?: string;
|
|
100
|
+
logger?: TestLogger;
|
|
101
|
+
}): TestContext;
|
|
102
|
+
/**
|
|
103
|
+
* Creates a mock API Gateway event.
|
|
104
|
+
*
|
|
105
|
+
* @param overrides - Override default event properties
|
|
106
|
+
* @returns Mock event object
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* const event = mockEvent({
|
|
111
|
+
* httpMethod: 'POST',
|
|
112
|
+
* body: JSON.stringify({ item_id: '123' })
|
|
113
|
+
* })
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export declare function mockEvent(overrides?: any): any;
|
|
117
|
+
/**
|
|
118
|
+
* Creates a mock Netlify function context.
|
|
119
|
+
*
|
|
120
|
+
* @returns Mock context object
|
|
121
|
+
*/
|
|
122
|
+
export declare function mockNetlifyContext(): any;
|
|
123
|
+
/**
|
|
124
|
+
* Cleanup function for tests.
|
|
125
|
+
* Clears caches and resets state.
|
|
126
|
+
*/
|
|
127
|
+
export declare function cleanup(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Setup helper for test files.
|
|
130
|
+
* Returns utilities commonly needed in tests.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* import { setupTests } from '@core/testing'
|
|
135
|
+
*
|
|
136
|
+
* const { makeTestContext, mockPrincipal, cleanup } = setupTests()
|
|
137
|
+
*
|
|
138
|
+
* describe('My Tests', () => {
|
|
139
|
+
* afterEach(cleanup)
|
|
140
|
+
* // ... tests
|
|
141
|
+
* })
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export declare function setupTests(): {
|
|
145
|
+
makeTestContext: typeof makeTestContext;
|
|
146
|
+
mockPrincipal: typeof mockPrincipal;
|
|
147
|
+
mockLogger: typeof mockLogger;
|
|
148
|
+
mockEvent: typeof mockEvent;
|
|
149
|
+
mockNetlifyContext: typeof mockNetlifyContext;
|
|
150
|
+
cleanup: typeof cleanup;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Asserts that a handler response matches expected structure.
|
|
154
|
+
*
|
|
155
|
+
* @param response - Handler response
|
|
156
|
+
* @param expectedStatus - Expected status code
|
|
157
|
+
*/
|
|
158
|
+
export declare function expectSuccessResponse(response: {
|
|
159
|
+
statusCode?: number;
|
|
160
|
+
body?: string;
|
|
161
|
+
}, expectedStatus?: number): void;
|
|
162
|
+
/**
|
|
163
|
+
* Asserts that a handler returned an error.
|
|
164
|
+
*
|
|
165
|
+
* @param response - Handler response
|
|
166
|
+
* @param expectedStatus - Expected error status code
|
|
167
|
+
*/
|
|
168
|
+
export declare function expectErrorResponse(response: {
|
|
169
|
+
statusCode?: number;
|
|
170
|
+
body?: string;
|
|
171
|
+
}, expectedStatus?: number): void;
|
|
172
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../.framework/functions/_shared/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,OAAO,CAAA;IAClB,SAAS,EAAE,aAAa,CAAA;IACxB,MAAM,EAAE,UAAU,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IACvC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IACvC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IACxC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CACzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,aAAa,CASnF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,IAAI,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,MAAM,EAAE,CAAA;CAAE,CAsBrE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE;IACvC,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,UAAU,CAAA;CACf,GAAG,WAAW,CAOnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,SAAS,GAAE,GAAQ,GAAG,GAAG,CASlD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,GAAG,CASxC;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAI9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU;;;;;;;EASzB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,cAAc,GAAE,MAAY,GAC3B,IAAI,CAON;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,cAAc,GAAE,MAAY,GAC3B,IAAI,CAON"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module trigger-engine
|
|
3
|
+
* @audience both
|
|
4
|
+
* @layer shared-core
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Event-driven trigger dispatch system. API handlers call `fire*Triggers` after
|
|
8
|
+
* a successful write to check whether any active triggers should fire. Matching
|
|
9
|
+
* triggers cause `runPipeline` to be invoked with structured `triggerData`.
|
|
10
|
+
*
|
|
11
|
+
* Public surface:
|
|
12
|
+
* - `checkAndFireTriggers` — full trigger evaluation and firing loop
|
|
13
|
+
* - `fireCreateTriggers` — convenience wrapper for `*_created` events
|
|
14
|
+
* - `fireUpdateTriggers` — convenience wrapper for `*_updated` events
|
|
15
|
+
* - `fireDeleteTriggers` — convenience wrapper for `*_deleted` events
|
|
16
|
+
*
|
|
17
|
+
* Trigger condition evaluation (in order, all must pass):
|
|
18
|
+
* 1. `config.entity_type` — exact match on entityType param
|
|
19
|
+
* 2. `config.type_slug` — match on `entityData.type_slug` (items only)
|
|
20
|
+
* 3. `config.filters` — field-level predicates with operators
|
|
21
|
+
* (`$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$exists`)
|
|
22
|
+
*
|
|
23
|
+
* INVARIANT: trigger evaluation and firing errors are caught per-trigger —
|
|
24
|
+
* a single failing trigger never prevents other triggers from firing.
|
|
25
|
+
* INVARIANT: `checkAndFireTriggers` never throws — all errors are caught
|
|
26
|
+
* and logged. Callers do not need to wrap in try/catch.
|
|
27
|
+
* INVARIANT: `adminDb` (service role) is used for trigger lookups and stats
|
|
28
|
+
* updates; `runPipeline` then uses the passed `ctx` for stage execution.
|
|
29
|
+
*
|
|
30
|
+
* @seeAlso pipeline-runner.ts (runPipeline — called when a trigger fires)
|
|
31
|
+
* @seeAlso audit.ts (emitAudit for trigger.fired / trigger.failed)
|
|
32
|
+
* @seeAlso index.ts (fire*Triggers re-exported for v2-custom/ and CLI)
|
|
33
|
+
*/
|
|
34
|
+
import { CoreContext } from './middleware';
|
|
35
|
+
/**
|
|
36
|
+
* All entity lifecycle event types that triggers can subscribe to.
|
|
37
|
+
*
|
|
38
|
+
* Format: `<entity>_<lifecycle>` where entity is one of:
|
|
39
|
+
* `item | account | person | thread | message | attachment | link`
|
|
40
|
+
* and lifecycle is `created | updated | deleted`.
|
|
41
|
+
*
|
|
42
|
+
* @calledBy checkAndFireTriggers, fireCreateTriggers, fireUpdateTriggers,
|
|
43
|
+
* fireDeleteTriggers, all API handlers that write to these entity tables
|
|
44
|
+
*/
|
|
45
|
+
export type EventType = 'item_created' | 'item_updated' | 'item_deleted' | 'account_created' | 'account_updated' | 'account_deleted' | 'person_created' | 'person_updated' | 'person_deleted' | 'thread_created' | 'thread_updated' | 'thread_deleted' | 'message_created' | 'message_updated' | 'message_deleted' | 'attachment_created' | 'attachment_updated' | 'attachment_deleted' | 'link_created' | 'link_updated' | 'link_deleted';
|
|
46
|
+
/**
|
|
47
|
+
* Queries active triggers for `eventType`, evaluates each against the entity
|
|
48
|
+
* data, and fires the associated pipeline for every matching trigger.
|
|
49
|
+
*
|
|
50
|
+
* Execution per trigger:
|
|
51
|
+
* 1. `evaluateTriggerConditions` — all conditions must pass
|
|
52
|
+
* 2. `runPipeline(trigger.pipeline_id, triggerData, ctx)` — fire pipeline
|
|
53
|
+
* 3. Update `triggers.last_triggered` and increment `trigger_count` via RPC
|
|
54
|
+
* 4. Emit `trigger.fired` audit log (or `trigger.failed` on error)
|
|
55
|
+
*
|
|
56
|
+
* `triggerData` passed to the pipeline:
|
|
57
|
+
* ```json
|
|
58
|
+
* {
|
|
59
|
+
* "event": "item_updated",
|
|
60
|
+
* "entity": { "type": "item", "id": "<uuid>", "data": {...} },
|
|
61
|
+
* "trigger": { "id": "<uuid>", "name": "My Trigger" },
|
|
62
|
+
* "fired_at": "2024-01-15T10:00:00.000Z"
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* @param eventType - The lifecycle event (e.g. 'item_updated')
|
|
67
|
+
* @param entityType - The entity table name (e.g. 'item', 'person')
|
|
68
|
+
* @param entityId - UUID of the entity that changed
|
|
69
|
+
* @param entityData - Full record data for condition evaluation
|
|
70
|
+
* @param ctx - CoreContext with requestId, accountId, and principal
|
|
71
|
+
* @returns Promise<void> — always resolves; never throws
|
|
72
|
+
* @throws never — all errors are caught per-trigger and logged
|
|
73
|
+
* @inputSpec eventType: EventType — must be one of the 21 defined event types
|
|
74
|
+
* @inputSpec entityId: string — UUID of the changed entity
|
|
75
|
+
* @inputSpec entityData: any — full record (used for condition evaluation)
|
|
76
|
+
* @outputSpec void
|
|
77
|
+
* @sideEffects DB read: triggers table
|
|
78
|
+
* @sideEffects DB write (per matching trigger): triggers.last_triggered, trigger_count
|
|
79
|
+
* @sideEffects Calls runPipeline (per matching trigger) — which writes pipeline_executions
|
|
80
|
+
* @sideEffects DB write: emitAudit (trigger.fired or trigger.failed per trigger)
|
|
81
|
+
* @calledBy All API handlers after successful create/update/delete writes
|
|
82
|
+
* @calledBy fireCreateTriggers, fireUpdateTriggers, fireDeleteTriggers
|
|
83
|
+
* @calls evaluateTriggerConditions, runPipeline, emitAudit
|
|
84
|
+
* @testUnit tests/unit/trigger-engine.test.ts
|
|
85
|
+
* @testIntegration tests/integration/trigger-engine.test.ts
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* // In an API handler after a successful item update:
|
|
90
|
+
* await fireUpdateTriggers('item', updatedItem.id, updatedItem, ctx)
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare function checkAndFireTriggers(eventType: EventType, entityType: string, entityId: string, entityData: any, ctx: CoreContext): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Fires `<entityType>_created` triggers. Thin wrapper around
|
|
96
|
+
* `checkAndFireTriggers` that constructs the correct EventType.
|
|
97
|
+
*
|
|
98
|
+
* @param entityType - Entity table name (e.g. 'item', 'person')
|
|
99
|
+
* @param entityId - UUID of the newly created entity
|
|
100
|
+
* @param entityData - The created record (for condition evaluation)
|
|
101
|
+
* @param ctx - CoreContext
|
|
102
|
+
* @returns Promise<void> — always resolves
|
|
103
|
+
* @throws never
|
|
104
|
+
* @sideEffects same as checkAndFireTriggers
|
|
105
|
+
* @calledBy Any API handler's create path (e.g. items.ts, people.ts)
|
|
106
|
+
* @calls checkAndFireTriggers
|
|
107
|
+
* @testUnit tests/unit/trigger-engine.test.ts — 'fireCreateTriggers'
|
|
108
|
+
*/
|
|
109
|
+
export declare function fireCreateTriggers(entityType: string, entityId: string, entityData: any, ctx: CoreContext): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Fires `<entityType>_updated` triggers. Thin wrapper around
|
|
112
|
+
* `checkAndFireTriggers` that constructs the correct EventType.
|
|
113
|
+
*
|
|
114
|
+
* @param entityType - Entity table name (e.g. 'item', 'person')
|
|
115
|
+
* @param entityId - UUID of the updated entity
|
|
116
|
+
* @param entityData - The updated record (for condition evaluation)
|
|
117
|
+
* @param ctx - CoreContext
|
|
118
|
+
* @returns Promise<void> — always resolves
|
|
119
|
+
* @throws never
|
|
120
|
+
* @sideEffects same as checkAndFireTriggers
|
|
121
|
+
* @calledBy Any API handler's update path
|
|
122
|
+
* @calls checkAndFireTriggers
|
|
123
|
+
*/
|
|
124
|
+
export declare function fireUpdateTriggers(entityType: string, entityId: string, entityData: any, ctx: CoreContext): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Fires `<entityType>_deleted` triggers. Thin wrapper around
|
|
127
|
+
* `checkAndFireTriggers` that constructs the correct EventType.
|
|
128
|
+
*
|
|
129
|
+
* @param entityType - Entity table name (e.g. 'item', 'person')
|
|
130
|
+
* @param entityId - UUID of the deleted entity
|
|
131
|
+
* @param entityData - The record snapshot before deletion (for condition evaluation)
|
|
132
|
+
* @param ctx - CoreContext
|
|
133
|
+
* @returns Promise<void> — always resolves
|
|
134
|
+
* @throws never
|
|
135
|
+
* @sideEffects same as checkAndFireTriggers
|
|
136
|
+
* @calledBy Any API handler's delete path
|
|
137
|
+
* @calls checkAndFireTriggers
|
|
138
|
+
*/
|
|
139
|
+
export declare function fireDeleteTriggers(entityType: string, entityId: string, entityData: any, ctx: CoreContext): Promise<void>;
|
|
140
|
+
//# sourceMappingURL=trigger-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-engine.d.ts","sourceRoot":"","sources":["../../../.framework/functions/_shared/trigger-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAO1C;;;;;;;;;GASG;AACH,MAAM,MAAM,SAAS,GACjB,cAAc,GAAG,cAAc,GAAG,cAAc,GAChD,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GACzD,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GACtD,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GACtD,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GACzD,oBAAoB,GAAG,oBAAoB,GAAG,oBAAoB,GAClE,cAAc,GAAG,cAAc,GAAG,cAAc,CAAA;AA0BpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,EACf,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAgFf;AAwID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,EACf,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,EACf,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,EACf,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module webhook-registration
|
|
3
|
+
* @audience custom-developer
|
|
4
|
+
* @layer shared-util
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Helper utilities for custom webhook handlers to self-register.
|
|
8
|
+
* Use this in your custom Netlify functions to register as webhook handlers.
|
|
9
|
+
*
|
|
10
|
+
* **Usage in a custom function:**
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { createHandler } from '../_shared/middleware'
|
|
13
|
+
* import { registerWebhookHandler } from '../_shared/webhook-registration'
|
|
14
|
+
* import { adminDb } from '../_shared/db'
|
|
15
|
+
*
|
|
16
|
+
* export const handler = createHandler(async (event, ctx) => {
|
|
17
|
+
* // Your webhook logic here
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* // Self-register on first load (idempotent)
|
|
21
|
+
* registerWebhookHandler({
|
|
22
|
+
* name: 'my-custom-handler',
|
|
23
|
+
* functionName: 'custom_my-webhook',
|
|
24
|
+
* description: 'Handles my custom integration events',
|
|
25
|
+
* events: ['user.created', 'item.updated'],
|
|
26
|
+
* db: adminDb
|
|
27
|
+
* }).catch(console.error)
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @seeAlso webhook-registry.ts (core lookup service)
|
|
31
|
+
* @seeAlso 014_webhook_registry.sql (database table)
|
|
32
|
+
*/
|
|
33
|
+
import { adminDb } from './db';
|
|
34
|
+
export interface WebhookHandlerRegistration {
|
|
35
|
+
/** Unique handler identifier (e.g., 'cortex-handler') */
|
|
36
|
+
name: string;
|
|
37
|
+
/** Netlify function name (e.g., 'custom_cortex-handler') */
|
|
38
|
+
functionName: string;
|
|
39
|
+
/** Human-readable description */
|
|
40
|
+
description?: string;
|
|
41
|
+
/** Events this handler subscribes to */
|
|
42
|
+
events?: string[];
|
|
43
|
+
/** Account ID (null for system handlers) */
|
|
44
|
+
accountId?: string | null;
|
|
45
|
+
/** Database client (defaults to adminDb) */
|
|
46
|
+
db?: typeof adminDb;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Registers a webhook handler in the database registry.
|
|
50
|
+
* Idempotent - safe to call multiple times.
|
|
51
|
+
*
|
|
52
|
+
* @param config - Handler registration configuration
|
|
53
|
+
* @returns Promise that resolves when registration completes
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* await registerWebhookHandler({
|
|
58
|
+
* name: 'slack-webhook',
|
|
59
|
+
* functionName: 'custom_slack-integration',
|
|
60
|
+
* description: 'Posts notifications to Slack',
|
|
61
|
+
* events: ['item.created', 'item.updated']
|
|
62
|
+
* })
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function registerWebhookHandler(config: WebhookHandlerRegistration): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Deregisters a webhook handler (soft delete).
|
|
68
|
+
*
|
|
69
|
+
* @param name - Handler identifier to deregister
|
|
70
|
+
* @param db - Optional database client
|
|
71
|
+
*/
|
|
72
|
+
export declare function deregisterWebhookHandler(name: string, db?: typeof adminDb): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Checks if a handler is registered.
|
|
75
|
+
*
|
|
76
|
+
* @param name - Handler identifier to check
|
|
77
|
+
* @param db - Optional database client
|
|
78
|
+
* @returns True if handler exists and is active
|
|
79
|
+
*/
|
|
80
|
+
export declare function isHandlerRegistered(name: string, db?: typeof adminDb): Promise<boolean>;
|
|
81
|
+
//# sourceMappingURL=webhook-registration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-registration.d.ts","sourceRoot":"","sources":["../../../.framework/functions/_shared/webhook-registration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,MAAM,WAAW,0BAA0B;IACzC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IAEZ,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAA;IAEpB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IAEjB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAEzB,4CAA4C;IAC5C,EAAE,CAAC,EAAE,OAAO,OAAO,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,EAAE,GAAE,OAAO,OAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,EAAE,GAAE,OAAO,OAAiB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module webhook-registry
|
|
3
|
+
* @audience core-contributor
|
|
4
|
+
* @layer shared-service
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Dynamic webhook handler registry for runtime handler resolution.
|
|
8
|
+
* Replaces static imports with database-driven handler lookups.
|
|
9
|
+
*
|
|
10
|
+
* **Pattern:**
|
|
11
|
+
* 1. Custom handlers self-register via `integrations` table or `webhook_handlers` table
|
|
12
|
+
* 2. Core looks up handler by name at runtime
|
|
13
|
+
* 3. Dynamic import loads the handler function
|
|
14
|
+
*
|
|
15
|
+
* **Benefits:**
|
|
16
|
+
* - Core has zero hardcoded dependencies on custom handlers
|
|
17
|
+
* - Handlers can be added/removed without core code changes
|
|
18
|
+
* - Multi-tenancy: different tenants can have different handlers
|
|
19
|
+
*
|
|
20
|
+
* @seeAlso integration-routes.ts (uses this registry)
|
|
21
|
+
* @seeAlso webhook-registration.ts (self-registration helper for custom handlers)
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Looks up a webhook handler in the database registry.
|
|
25
|
+
* Returns the function name to dynamically import.
|
|
26
|
+
*
|
|
27
|
+
* @param handlerName - The handler identifier (e.g., "cortex-handler")
|
|
28
|
+
* @returns Handler metadata or null if not found
|
|
29
|
+
*/
|
|
30
|
+
export declare function lookupHandler(handlerName: string): Promise<{
|
|
31
|
+
functionName: string;
|
|
32
|
+
} | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Loads a webhook handler function dynamically.
|
|
35
|
+
* Uses dynamic import to avoid static dependencies.
|
|
36
|
+
*
|
|
37
|
+
* @param functionName - The Netlify function name (e.g., "custom_cortex-handler")
|
|
38
|
+
* @returns The handler function or null if not found
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadHandler(functionName: string): Promise<Function | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Resolves a webhook handler by name.
|
|
43
|
+
* Combines lookup + load for convenience.
|
|
44
|
+
*
|
|
45
|
+
* @param handlerName - The handler identifier
|
|
46
|
+
* @returns The handler function or null
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveHandler(handlerName: string): Promise<Function | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Clears the handler cache. Useful for testing or after deployments.
|
|
51
|
+
*/
|
|
52
|
+
export declare function clearHandlerCache(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Lists all registered handlers (for debugging/admin).
|
|
55
|
+
*/
|
|
56
|
+
export declare function listRegisteredHandlers(): Promise<string[]>;
|
|
57
|
+
//# sourceMappingURL=webhook-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-registry.d.ts","sourceRoot":"","sources":["../../../.framework/functions/_shared/webhook-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA2BjG;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAmBhF;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAKlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module account-nodes
|
|
3
|
+
* @audience core-contributor
|
|
4
|
+
* @layer api-handler
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Account hierarchy traversal endpoint. Given a single `node_id`, returns
|
|
8
|
+
* the target account record plus three relational views:
|
|
9
|
+
* - **ancestors** — all nodes from root to this node (via `get_account_ancestors` RPC)
|
|
10
|
+
* - **children** — direct active children ordered by `display_name`
|
|
11
|
+
* - **descendants** — all active nodes in the subtree (via `get_account_descendants` RPC)
|
|
12
|
+
*
|
|
13
|
+
* **Routed by:** `GET /.netlify/functions/account-nodes`
|
|
14
|
+
*
|
|
15
|
+
* **Authorization:** Uses `ctx.db` (RLS-scoped). Only accounts visible to
|
|
16
|
+
* the authenticated principal are returned. Inactive accounts are excluded
|
|
17
|
+
* (`is_active = true` filter on node + children queries).
|
|
18
|
+
*
|
|
19
|
+
* **Response shape:**
|
|
20
|
+
* ```ts
|
|
21
|
+
* {
|
|
22
|
+
* node: Account & { type: TypeRecord }
|
|
23
|
+
* ancestors: AccountAncestorRow[]
|
|
24
|
+
* children: Array<Account & { type: TypeRecord }>
|
|
25
|
+
* descendants: AccountDescendantRow[]
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @seeAlso auth.ts (context handler also calls get_account_hierarchy RPC)
|
|
30
|
+
* @seeAlso accounts.ts (CRUD; creates the account nodes)
|
|
31
|
+
* @seeAlso _shared/db.ts (get_account_ancestors / get_account_descendants RPCs)
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* @chunk-id ACCOUNT_NODES_HANDLER_1_0_0
|
|
35
|
+
* @version 1.0.0
|
|
36
|
+
* @hash 0778bcec10cfbe1a79177e4352706270194cf80cd0baa39c6ed615c73c7c7695
|
|
37
|
+
* @macro Account Hierarchy Handler
|
|
38
|
+
* @micro Returns account node with ancestors, children, and descendants
|
|
39
|
+
* @inputs ctx: CoreContext — Request context with principal and database
|
|
40
|
+
* @inputs body: any — Request body (unused for GET)
|
|
41
|
+
* @outputs {node, ancestors, children, descendants} — Complete hierarchy data
|
|
42
|
+
* @depends-on [createHandler, get_account_ancestors, get_account_descendants]
|
|
43
|
+
* @depended-by [Netlify function routing]
|
|
44
|
+
* @side-effects [DB queries, RPC calls]
|
|
45
|
+
* @tags account, hierarchy, netlify-function, api
|
|
46
|
+
*/
|
|
47
|
+
export declare const handler: (event: any, context: any) => Promise<any>;
|
|
48
|
+
//# sourceMappingURL=account-nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-nodes.d.ts","sourceRoot":"","sources":["../../.framework/functions/account-nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAKH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,OAAO,4CA2DlB,CAAA"}
|