better-supabase 0.13.0 → 0.15.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/README.md +67 -345
- package/dist/access-sql-B-MkVARa.js +207 -0
- package/dist/actor-go7p9-CJ.js +150 -0
- package/dist/adapter-B0b6MXYS.js +2299 -0
- package/dist/agents-5n8DWRfP.d.ts +117 -0
- package/dist/ai-cache-Cu8j6aQQ.js +87 -0
- package/dist/ai-cache-DyHohbFP.d.ts +82 -0
- package/dist/ai-chat-D1GuRnke.d.ts +619 -0
- package/dist/ai-files-CgFCRsnU.js +339 -0
- package/dist/ai-schedules-CAquecT_.d.ts +166 -0
- package/dist/ai-sdk/agents/index.d.ts +6 -6
- package/dist/ai-sdk/agents/index.js +4 -4
- package/dist/ai-sdk/batches/index.d.ts +5 -5
- package/dist/ai-sdk/batches/index.js +4 -4
- package/dist/ai-sdk/cache/index.d.ts +3 -3
- package/dist/ai-sdk/cache/index.js +2 -2
- package/dist/ai-sdk/chat/index.d.ts +1 -1
- package/dist/ai-sdk/chat/index.js +5 -5
- package/dist/ai-sdk/embeddings/index.d.ts +2 -2
- package/dist/ai-sdk/embeddings/index.js +1 -1
- package/dist/ai-sdk/files/index.d.ts +2 -2
- package/dist/ai-sdk/files/index.js +5 -5
- package/dist/ai-sdk/index.d.ts +30 -9
- package/dist/ai-sdk/index.js +42 -4
- package/dist/ai-sdk/mcp/index.d.ts +4 -4
- package/dist/ai-sdk/mcp/index.js +7 -7
- package/dist/ai-sdk/memory/index.d.ts +3 -3
- package/dist/ai-sdk/memory/index.js +2 -2
- package/dist/ai-sdk/workflow/index.d.ts +4 -4
- package/dist/ai-sdk/workflow/index.js +7 -7
- package/dist/anchors-7F34QyHa.d.ts +40 -0
- package/dist/api-DxAPqMrE.d.ts +495 -0
- package/dist/api-keys-D5k63K6y.d.ts +213 -0
- package/dist/app-tables-CF2DD-Mu.d.ts +28 -0
- package/dist/app-tables-D29Rahtg.js +16350 -0
- package/dist/approvals-Crutd4-o.d.ts +129 -0
- package/dist/assistant-CD_h8Vxx.d.ts +157 -0
- package/dist/astro/index.d.ts +19 -16
- package/dist/astro/index.js +8 -8
- package/dist/attachments-aJYgdYtB.js +369 -0
- package/dist/attributes-Bzf51_nc.js +47 -0
- package/dist/auth-module-BEFESDC4.js +44 -0
- package/dist/auth-reply-tlXB2FQ9.js +31 -0
- package/dist/authorization-HZdJCaVm.d.ts +3595 -0
- package/dist/authorization-hooks-Cs1vP_ej.d.ts +217 -0
- package/dist/authorizer-B6X09otb.d.ts +118 -0
- package/dist/authorizer-BGhXaDmo.js +172 -0
- package/dist/automation-D41DXyvT.js +75 -0
- package/dist/automations-BYsz43AG.js +314 -0
- package/dist/automations-Bc2ue55V.js +26 -0
- package/dist/automations-CD1XlL2W.js +33 -0
- package/dist/automations-CIwRq7zm.js +30 -0
- package/dist/availability-vguUvEK2.d.ts +226 -0
- package/dist/better-result/index.d.ts +20 -30
- package/dist/better-result/index.js +2 -2
- package/dist/bind-CrMBwrPN.d.ts +104 -0
- package/dist/block-authors-BDV3y1SP.js +14 -0
- package/dist/block-authors-DzXLUiIq.d.ts +12 -0
- package/dist/block-env-B_uEM2xz.d.ts +32 -0
- package/dist/block-event-listener-Bu6G0TFH.js +16 -0
- package/dist/block-events-pBXPzwnW.js +83 -0
- package/dist/block-fields-BE7pInWZ.d.ts +58 -0
- package/dist/block-fields-DE_FgpOU.js +139 -0
- package/dist/block-helpers-CRpAHrp_.d.ts +62 -0
- package/dist/block-helpers-CtBdjgO4.js +353 -0
- package/dist/block-hooks-BfxX3682.js +130 -0
- package/dist/block-hooks-DZN2w69m.d.ts +117 -0
- package/dist/block-method-C9hWdHom.js +21 -0
- package/dist/block-method-CiVa2G-J.d.ts +14 -0
- package/dist/block-subjects-BhDKK_j7.js +55 -0
- package/dist/block-subjects-CphkQPxp.d.ts +6 -0
- package/dist/block-tenant-DHp7subc.js +14 -0
- package/dist/block-transport-DWZSJrwN.d.ts +69 -0
- package/dist/blocks/access-requests/index.d.ts +8 -8
- package/dist/blocks/access-requests/index.js +6 -7
- package/dist/blocks/activities/index.d.ts +215 -0
- package/dist/blocks/activities/index.js +414 -0
- package/dist/blocks/agents/index.d.ts +4 -4
- package/dist/blocks/agents/index.js +5 -6
- package/dist/blocks/ai-cache/index.d.ts +3 -3
- package/dist/blocks/ai-cache/index.js +3 -3
- package/dist/blocks/ai-chat/index.d.ts +119 -6
- package/dist/blocks/ai-chat/index.js +1067 -5
- package/dist/blocks/ai-files/index.d.ts +5 -5
- package/dist/blocks/ai-files/index.js +3 -3
- package/dist/blocks/ai-keys/index.d.ts +22 -0
- package/dist/blocks/ai-keys/index.js +236 -0
- package/dist/blocks/ai-schedules/index.d.ts +10 -0
- package/dist/blocks/ai-schedules/index.js +258 -0
- package/dist/blocks/announcements/index.d.ts +134 -5
- package/dist/blocks/announcements/index.js +179 -4
- package/dist/blocks/api-keys/index.d.ts +69 -8
- package/dist/blocks/api-keys/index.js +417 -7
- package/dist/blocks/approvals/index.d.ts +4 -4
- package/dist/blocks/approvals/index.js +25 -24
- package/dist/blocks/assets/index.d.ts +281 -0
- package/dist/blocks/assets/index.js +288 -0
- package/dist/blocks/assignment/index.d.ts +124 -0
- package/dist/blocks/assignment/index.js +141 -0
- package/dist/blocks/attachments/index.d.ts +130 -6
- package/dist/blocks/attachments/index.js +328 -7
- package/dist/blocks/audit/index.d.ts +476 -7
- package/dist/blocks/audit/index.js +863 -7
- package/dist/blocks/automations/index.d.ts +524 -0
- package/dist/blocks/automations/index.js +553 -0
- package/dist/blocks/billable-time/index.d.ts +201 -0
- package/dist/blocks/billable-time/index.js +260 -0
- package/dist/blocks/billing/index.d.ts +146 -16
- package/dist/blocks/billing/index.js +231 -41
- package/dist/blocks/bookings/index.d.ts +54 -5
- package/dist/blocks/bookings/index.js +423 -6
- package/dist/blocks/bulk/index.d.ts +6 -6
- package/dist/blocks/bulk/index.js +4 -4
- package/dist/blocks/calendar/index.d.ts +186 -5
- package/dist/blocks/calendar/index.js +1180 -4
- package/dist/blocks/catalog/index.d.ts +134 -28
- package/dist/blocks/catalog/index.js +183 -54
- package/dist/blocks/channels/index.d.ts +113 -0
- package/dist/blocks/channels/index.js +189 -0
- package/dist/blocks/collections/index.d.ts +90 -17
- package/dist/blocks/collections/index.js +85 -10
- package/dist/blocks/comments/index.d.ts +263 -45
- package/dist/blocks/comments/index.js +360 -16
- package/dist/blocks/compliance/index.d.ts +325 -0
- package/dist/blocks/compliance/index.js +410 -0
- package/dist/blocks/connectors/index.d.ts +4 -4
- package/dist/blocks/connectors/index.js +8 -9
- package/dist/blocks/contacts/index.d.ts +182 -0
- package/dist/blocks/contacts/index.js +358 -0
- package/dist/blocks/content/index.d.ts +188 -0
- package/dist/blocks/content/index.js +219 -0
- package/dist/blocks/contracts/index.d.ts +239 -0
- package/dist/blocks/contracts/index.js +361 -0
- package/dist/blocks/courses/index.d.ts +341 -0
- package/dist/blocks/courses/index.js +445 -0
- package/dist/blocks/created-by/index.d.ts +27 -0
- package/dist/blocks/created-by/index.js +14 -0
- package/dist/blocks/custom-fields/index.d.ts +44 -13
- package/dist/blocks/custom-fields/index.js +25 -20
- package/dist/blocks/data-lifecycle/index.d.ts +9 -9
- package/dist/blocks/data-lifecycle/index.js +7 -8
- package/dist/blocks/deals/index.d.ts +20 -40
- package/dist/blocks/deals/index.js +156 -66
- package/dist/blocks/dispatch/index.d.ts +325 -0
- package/dist/blocks/dispatch/index.js +406 -0
- package/dist/blocks/documents/index.d.ts +8 -5
- package/dist/blocks/documents/index.js +66 -7
- package/dist/blocks/domains/index.d.ts +7 -7
- package/dist/blocks/domains/index.js +6 -7
- package/dist/blocks/donations/index.d.ts +350 -0
- package/dist/blocks/donations/index.js +610 -0
- package/dist/blocks/drive/index.d.ts +56 -11
- package/dist/blocks/drive/index.js +62 -11
- package/dist/blocks/employees/index.d.ts +41 -23
- package/dist/blocks/employees/index.js +125 -33
- package/dist/blocks/enrichment/index.d.ts +176 -0
- package/dist/blocks/enrichment/index.js +251 -0
- package/dist/blocks/enrollments/index.d.ts +182 -0
- package/dist/blocks/enrollments/index.js +173 -0
- package/dist/blocks/entitlements/index.d.ts +48 -8
- package/dist/blocks/entitlements/index.js +62 -4
- package/dist/blocks/expenses/index.d.ts +214 -0
- package/dist/blocks/expenses/index.js +279 -0
- package/dist/blocks/field-history/index.d.ts +63 -0
- package/dist/blocks/field-history/index.js +46 -0
- package/dist/blocks/flags/index.d.ts +17 -13
- package/dist/blocks/flags/index.js +7 -8
- package/dist/blocks/forecasts/index.d.ts +119 -0
- package/dist/blocks/forecasts/index.js +129 -0
- package/dist/blocks/forms/index.d.ts +208 -140
- package/dist/blocks/forms/index.js +488 -149
- package/dist/blocks/goals/index.d.ts +82 -0
- package/dist/blocks/goals/index.js +72 -0
- package/dist/blocks/guests/index.d.ts +198 -0
- package/dist/blocks/guests/index.js +224 -0
- package/dist/blocks/hiring/index.d.ts +20 -10
- package/dist/blocks/hiring/index.js +10 -10
- package/dist/blocks/identities/index.d.ts +7 -7
- package/dist/blocks/identities/index.js +4 -5
- package/dist/blocks/imports/index.d.ts +8 -8
- package/dist/blocks/imports/index.js +6 -6
- package/dist/blocks/inbox/index.d.ts +138 -6
- package/dist/blocks/inbox/index.js +383 -85
- package/dist/blocks/incidents/index.d.ts +337 -0
- package/dist/blocks/incidents/index.js +477 -0
- package/dist/blocks/index.d.ts +145 -11
- package/dist/blocks/index.js +184 -187
- package/dist/blocks/inventory/index.d.ts +10 -10
- package/dist/blocks/inventory/index.js +6 -7
- package/dist/blocks/invoices/index.d.ts +11 -11
- package/dist/blocks/invoices/index.js +8 -9
- package/dist/blocks/knowledge/index.d.ts +3 -3
- package/dist/blocks/knowledge/index.js +4 -4
- package/dist/blocks/lead-scoring/index.d.ts +50 -0
- package/dist/blocks/lead-scoring/index.js +87 -0
- package/dist/blocks/leases/index.d.ts +221 -0
- package/dist/blocks/leases/index.js +244 -0
- package/dist/blocks/leave/index.d.ts +8 -8
- package/dist/blocks/leave/index.js +5 -6
- package/dist/blocks/ledger/index.d.ts +279 -0
- package/dist/blocks/ledger/index.js +229 -0
- package/dist/blocks/mail-sync/index.d.ts +37 -0
- package/dist/blocks/mail-sync/index.js +906 -0
- package/dist/blocks/memberships/index.d.ts +67 -0
- package/dist/blocks/memberships/index.js +14 -0
- package/dist/blocks/memory/index.d.ts +4 -4
- package/dist/blocks/memory/index.js +8 -9
- package/dist/blocks/messaging/index.d.ts +186 -0
- package/dist/blocks/messaging/index.js +619 -0
- package/dist/blocks/metrics/index.d.ts +7 -7
- package/dist/blocks/metrics/index.js +6 -7
- package/dist/blocks/mfa/index.d.ts +145 -3
- package/dist/blocks/mfa/index.js +211 -2
- package/dist/blocks/moderation/index.d.ts +203 -0
- package/dist/blocks/moderation/index.js +199 -0
- package/dist/blocks/notifications/index.d.ts +67 -15
- package/dist/blocks/notifications/index.js +64 -16
- package/dist/blocks/numbering/index.d.ts +45 -0
- package/dist/blocks/numbering/index.js +49 -0
- package/dist/blocks/oauth-server/index.d.ts +6 -6
- package/dist/blocks/oauth-server/index.js +6 -7
- package/dist/blocks/onboarding/index.d.ts +112 -4
- package/dist/blocks/onboarding/index.js +107 -4
- package/dist/blocks/orders/index.d.ts +152 -13
- package/dist/blocks/orders/index.js +188 -18
- package/dist/blocks/organizations/index.d.ts +452 -6
- package/dist/blocks/organizations/index.js +689 -5
- package/dist/blocks/outbox/index.d.ts +4 -4
- package/dist/blocks/outbox/index.js +20 -8
- package/dist/blocks/passes/index.d.ts +306 -0
- package/dist/blocks/passes/index.js +411 -0
- package/dist/blocks/permissions/index.d.ts +92 -0
- package/dist/blocks/permissions/index.js +127 -0
- package/dist/blocks/pipelines/index.d.ts +15 -15
- package/dist/blocks/pipelines/index.js +12 -13
- package/dist/blocks/posts/index.d.ts +190 -0
- package/dist/blocks/posts/index.js +230 -0
- package/dist/blocks/profiles/index.d.ts +7 -7
- package/dist/blocks/profiles/index.js +5 -6
- package/dist/blocks/promotions/index.d.ts +9 -9
- package/dist/blocks/promotions/index.js +7 -8
- package/dist/blocks/push/index.d.ts +9 -9
- package/dist/blocks/push/index.js +4 -5
- package/dist/blocks/queue/index.d.ts +562 -0
- package/dist/blocks/queue/index.js +1407 -0
- package/dist/blocks/quotes/index.d.ts +29 -14
- package/dist/blocks/quotes/index.js +14 -14
- package/dist/blocks/rank/index.d.ts +7 -7
- package/dist/blocks/rank/index.js +4 -4
- package/dist/blocks/reactions/index.d.ts +154 -5
- package/dist/blocks/reactions/index.js +168 -4
- package/dist/blocks/relations/index.d.ts +59 -42
- package/dist/blocks/relations/index.js +117 -59
- package/dist/blocks/reminders/index.d.ts +21 -17
- package/dist/blocks/reminders/index.js +26 -27
- package/dist/blocks/reviews/index.d.ts +8 -8
- package/dist/blocks/reviews/index.js +6 -7
- package/dist/blocks/saved-views/index.d.ts +311 -4
- package/dist/blocks/saved-views/index.js +437 -2
- package/dist/blocks/scores/index.d.ts +48 -0
- package/dist/blocks/scores/index.js +40 -0
- package/dist/blocks/search/index.d.ts +168 -5
- package/dist/blocks/search/index.js +277 -6
- package/dist/blocks/security-events/index.d.ts +440 -0
- package/dist/blocks/security-events/index.js +885 -0
- package/dist/blocks/segments/index.d.ts +130 -0
- package/dist/blocks/segments/index.js +135 -0
- package/dist/blocks/sequences/index.d.ts +259 -0
- package/dist/blocks/sequences/index.js +376 -0
- package/dist/blocks/service-accounts/index.d.ts +132 -0
- package/dist/blocks/service-accounts/index.js +109 -0
- package/dist/blocks/sessions/index.d.ts +138 -3
- package/dist/blocks/sessions/index.js +173 -2
- package/dist/blocks/settings/index.d.ts +181 -5
- package/dist/blocks/settings/index.js +226 -4
- package/dist/blocks/share-links/index.d.ts +46 -19
- package/dist/blocks/share-links/index.js +74 -23
- package/dist/blocks/shipments/index.d.ts +236 -0
- package/dist/blocks/shipments/index.js +548 -0
- package/dist/blocks/signatures/index.d.ts +151 -0
- package/dist/blocks/signatures/index.js +149 -0
- package/dist/blocks/signing-keys/index.d.ts +4 -4
- package/dist/blocks/signing-keys/index.js +4 -165
- package/dist/blocks/sla/index.d.ts +37 -27
- package/dist/blocks/sla/index.js +48 -13
- package/dist/blocks/sso/index.d.ts +7 -7
- package/dist/blocks/sso/index.js +4 -5
- package/dist/blocks/state-machine/index.d.ts +14 -14
- package/dist/blocks/state-machine/index.js +26 -26
- package/dist/blocks/subjects/index.d.ts +45 -0
- package/dist/blocks/subjects/index.js +203 -0
- package/dist/blocks/tags/index.d.ts +170 -5
- package/dist/blocks/tags/index.js +265 -5
- package/dist/blocks/tasks/index.d.ts +346 -0
- package/dist/blocks/tasks/index.js +626 -0
- package/dist/blocks/teams/index.d.ts +7 -7
- package/dist/blocks/teams/index.js +4 -4
- package/dist/blocks/templates/index.d.ts +18 -18
- package/dist/blocks/templates/index.js +11 -12
- package/dist/blocks/time-tracking/index.d.ts +40 -32
- package/dist/blocks/time-tracking/index.js +40 -40
- package/dist/blocks/timeline/index.d.ts +116 -0
- package/dist/blocks/timeline/index.js +164 -0
- package/dist/blocks/trash/index.d.ts +47 -9
- package/dist/blocks/trash/index.js +9 -8
- package/dist/blocks/undo/index.d.ts +48 -5
- package/dist/blocks/undo/index.js +60 -4
- package/dist/blocks/updated-at/index.d.ts +20 -0
- package/dist/blocks/updated-at/index.js +14 -0
- package/dist/blocks/usage/index.d.ts +40 -6
- package/dist/blocks/usage/index.js +301 -4
- package/dist/blocks/vercel-marketplace/index.d.ts +7 -7
- package/dist/blocks/vercel-marketplace/index.js +8 -9
- package/dist/blocks/versions/index.d.ts +38 -19
- package/dist/blocks/versions/index.js +66 -19
- package/dist/blocks/waitlist/index.d.ts +9 -9
- package/dist/blocks/waitlist/index.js +5 -6
- package/dist/blocks/webhooks/index.d.ts +21 -21
- package/dist/blocks/webhooks/index.js +18 -19
- package/dist/blocks/workflow-editor/index.d.ts +99 -0
- package/dist/blocks/workflow-editor/index.js +733 -0
- package/dist/blocks/workflows/index.d.ts +72 -6
- package/dist/blocks/workflows/index.js +379 -4
- package/dist/bookings-D4dvGXiR.d.ts +290 -0
- package/dist/bucket-CiNi8sIw.d.ts +666 -0
- package/dist/build-BFC8nFiL.js +797 -0
- package/dist/build-QitPVzzO.js +2073 -0
- package/dist/carrier-KzeYXVrW.d.ts +169 -0
- package/dist/chat-sdk/index.d.ts +43 -11
- package/dist/chat-sdk/index.js +51 -24
- package/dist/claims-DTy6R6my.js +63 -0
- package/dist/cli/add-BgsUjCan.js +1252 -0
- package/dist/cli/add-DCI5JKjA.js +99 -0
- package/dist/cli/add-DWjlVwvP.js +1 -0
- package/dist/cli/args-UEwg0l-N.js +27 -0
- package/dist/cli/backfill-nxPbcsns.js +293 -0
- package/dist/cli/bin.js +1 -1
- package/dist/cli/blocks-BZHI8mRC.js +156 -0
- package/dist/cli/blocks-Cr4HGePW.js +1 -0
- package/dist/cli/cache-CXgR_Ahi.js +607 -0
- package/dist/cli/codemod-DSN7iAdg.js +2343 -0
- package/dist/cli/codemod-block-renames-BuSaTE_G.js +239 -0
- package/dist/cli/command-CQ61x6gN.js +941 -0
- package/dist/cli/completion-2Y3D_eNu.js +211 -0
- package/dist/cli/completion-BwI0_Ap5.js +30 -0
- package/dist/cli/completion-Dlu5AdUW.js +1 -0
- package/dist/cli/config-9t5ec_N7.js +1642 -0
- package/dist/cli/config-CBqkQjjN.js +1 -0
- package/dist/cli/config-CPux9Wa7.js +47 -0
- package/dist/cli/config-edit-CrWfk8s3.js +621 -0
- package/dist/cli/config-group-C8tjut39.js +391 -0
- package/dist/cli/content-mapper-DNs7lTu7.js +182 -0
- package/dist/cli/db-DrBI_HNv.js +223 -0
- package/dist/cli/doctor-DDrEM6S1.js +4561 -0
- package/dist/cli/env-BBl5L8Bf.js +143 -0
- package/dist/cli/env-CAU1nknN.js +1 -0
- package/dist/cli/files-CX71yBm8.js +1010 -0
- package/dist/cli/gen-MtijJQ9r.js +387 -0
- package/dist/cli/in-stack-diff-DQTW53Vf.js +257 -0
- package/dist/cli/index.d.ts +51 -5
- package/dist/cli/index.js +8 -8
- package/dist/cli/init-D-aDv9r5.js +440 -0
- package/dist/cli/keys-DGEpMbeB.js +106 -0
- package/dist/cli/live-iEeH15ck.js +341 -0
- package/dist/cli/mcp-BAPyaQ62.js +249 -0
- package/dist/cli/metadata-DVx9Zgbj.js +150 -0
- package/dist/cli/migration-safety-D7PhzFxm.js +928 -0
- package/dist/cli/module-migration-aPCckev6.js +734 -0
- package/dist/cli/moved-CsfDQcyk.js +254 -0
- package/dist/cli/orphans-BAboqyVM.js +28 -0
- package/dist/cli/parse-B9Iv_-Pf.js +182 -0
- package/dist/cli/preset-BwmIfFnh.js +101 -0
- package/dist/cli/print-BeWO7OJY.js +67 -0
- package/dist/cli/remove-B46Dmd2M.js +238 -0
- package/dist/cli/render-ucJmUyuM.js +2170 -0
- package/dist/cli/run-BXx6D1aR.js +63 -0
- package/dist/cli/run-CvYVAztY.js +1427 -0
- package/dist/cli/run-DYhLBcFW.js +702 -0
- package/dist/cli/seed-Cz8PcXeT.js +188 -0
- package/dist/cli/seed-D6XijwbR.js +1 -0
- package/dist/cli/shared-LZroULBe.js +151 -0
- package/dist/cli/skills-toUan_OV.js +121 -0
- package/dist/cli/snapshot-C8MVPyO8.js +729 -0
- package/dist/cli/source-DANaJJVc.js +320 -0
- package/dist/cli/source-args-IpJRJO5t.js +59 -0
- package/dist/cli/spec-DGVNMSSB.js +7530 -0
- package/dist/cli/spec-g8_G5K7o.js +1 -0
- package/dist/cli/stack-CWEHdO0b.js +135 -0
- package/dist/cli/sync-btj01bcM.js +319 -0
- package/dist/cli/upgrade-B596d4t8.js +403 -0
- package/dist/cli/upgrade-Dw3TMQzn.js +41 -0
- package/dist/cli/version-Du4CgONY.js +4 -0
- package/dist/client/index.d.ts +8 -7
- package/dist/client/index.js +11 -7
- package/dist/client/native/index.d.ts +6 -6
- package/dist/client/native/index.js +3 -3
- package/dist/client-BAEbEA7t.js +287 -0
- package/dist/cloud-event-CzZTJkXv.d.ts +64 -0
- package/dist/codecs-CMWlhHZ0.d.ts +222 -0
- package/dist/codecs-TylXqU_I.js +358 -0
- package/dist/commerce/index.d.ts +4 -3
- package/dist/commerce/index.js +6 -6
- package/dist/compiler-D3UmE7ao.d.ts +14 -0
- package/dist/compose-DKW0Tr3e.js +53 -0
- package/dist/composite-BARuBEDE.js +130 -0
- package/dist/composite-Dsxj7T5K.d.ts +82 -0
- package/dist/config/index.d.ts +6 -7
- package/dist/config/index.js +6 -6
- package/dist/config-CcehOvbz.js +1698 -0
- package/dist/config-DWGgUQCh.js +1108 -0
- package/dist/connectors-Fud4amxp.d.ts +147 -0
- package/dist/context-CEuTKrkz.d.ts +4129 -0
- package/dist/context-DBicfUNz.js +41 -0
- package/dist/controller-BNZKd6bJ.js +73 -0
- package/dist/controller-BrP0gn47.d.ts +52 -0
- package/dist/conversion-BAbucuXq.d.ts +86 -0
- package/dist/conversion-Dq1S7xzE.js +77 -0
- package/dist/create/index.d.ts +34 -23
- package/dist/create/index.js +35 -27
- package/dist/create/lite/index.d.ts +2 -2
- package/dist/create/supabase/index.d.ts +2 -2
- package/dist/create/supabase/index.js +2 -2
- package/dist/create-blocks-Bu4H5TXw.js +352 -0
- package/dist/credentials/index.d.ts +5 -5
- package/dist/credentials/index.js +6 -7
- package/dist/cron-CgHTKwYG.js +148 -0
- package/dist/cron-route-UU9i5i9J.js +24 -0
- package/dist/data-engine-BWoz9lED.d.ts +273 -0
- package/dist/data-engine-D1BkmBoR.js +173 -0
- package/dist/data-hooks-tgF1Ct0F.js +280 -0
- package/dist/db-blocks-DJGbjIPz.js +62 -0
- package/dist/db-exception-Lngc1W49.js +31 -0
- package/dist/deal-forecast-Bv52QMyX.js +39 -0
- package/dist/deal-forecast-LwO-Z4_C.d.ts +23 -0
- package/dist/define-DFBnQyYg.d.ts +1255 -0
- package/dist/define-DlUeKHce.js +2011 -0
- package/dist/define-block-BGqOO8B3.js +64 -0
- package/dist/define-block-BVcLQ3DF.d.ts +1657 -0
- package/dist/delegation--93jRsVO.js +146 -0
- package/dist/documents-Cup1rpjF.d.ts +152 -0
- package/dist/edge/index.d.ts +23 -23
- package/dist/edge/index.js +14 -14
- package/dist/elysia/index.d.ts +1 -1
- package/dist/elysia/index.js +1 -1
- package/dist/embeddings-kFbRvuic.d.ts +78 -0
- package/dist/embeddings-vVzseUw0.js +128 -0
- package/dist/ended-gUsMZVNg.d.ts +26 -0
- package/dist/entitlements-CJpYQXeE.d.ts +54 -0
- package/dist/entitlements-NZAE_vLj.js +45 -0
- package/dist/entity-naming-Dtyq5sKE.js +131 -0
- package/dist/entity-schema-BDv6w-OQ.js +39 -0
- package/dist/envelope-Bzu0JnY2.js +90 -0
- package/dist/errors-BVFgt8BZ.js +328 -0
- package/dist/errors-CyxMxzlu.js +44 -0
- package/dist/escape-like-PReMbEEU.d.ts +30 -0
- package/dist/eve/index.d.ts +5 -5
- package/dist/eve/index.js +4 -4
- package/dist/eve-BFSwTu1z.d.ts +157 -0
- package/dist/event-calendar-DCufbihU.d.ts +65 -0
- package/dist/events/index.d.ts +4 -4
- package/dist/events/index.js +2 -1
- package/dist/events-vcqenSYU.d.ts +852 -0
- package/dist/executor-3qcMhg6R.js +207 -0
- package/dist/executor-BQ7dYw4E.js +843 -0
- package/dist/executor-CVIn6JHa.d.ts +174 -0
- package/dist/executor-D3gB-9si.js +486 -0
- package/dist/executor-_2ekNofh.d.ts +104 -0
- package/dist/executor-hGjrop3A.d.ts +37 -0
- package/dist/expo/index.d.ts +12 -11
- package/dist/expo/index.js +12 -11
- package/dist/extension-B-lajjex.js +58 -0
- package/dist/extension-B0EjCYhO.js +61 -0
- package/dist/extension-DeAd_MqI.js +121 -0
- package/dist/extension-DzCc0IOd.js +103 -0
- package/dist/extension-shared-Djm8mGHD.js +60 -0
- package/dist/field-errors-fsbFktYF.d.ts +216 -0
- package/dist/field-formats-CAFNkKSN.d.ts +38 -0
- package/dist/fields-B0zaJAO3.js +107 -0
- package/dist/fields-C3q2ypnO.d.ts +78 -0
- package/dist/filter-evaluate-CPxeae5X.d.ts +37 -0
- package/dist/filter-evaluate-w1XOIUOL.js +217 -0
- package/dist/filter-query-BXLs72G9.d.ts +133 -0
- package/dist/filter-query-DMoKo82_.js +566 -0
- package/dist/flags-BOdA_ETQ.js +279 -0
- package/dist/flags-C01PLMJ-.d.ts +246 -0
- package/dist/flags-sdk/index.d.ts +1 -1
- package/dist/flags-sdk/index.js +2 -2
- package/dist/form-definition-BTpM_tz1.js +363 -0
- package/dist/form-definition-BjEtH8BT.d.ts +119 -0
- package/dist/format-u-65igKI.d.ts +79 -0
- package/dist/framework-BKyTeS-j.d.ts +47 -0
- package/dist/framework-DDdkR7FX.js +58 -0
- package/dist/function-contract-DxFNOmsm.d.ts +27 -0
- package/dist/gateway-TD1pRfTP.d.ts +115 -0
- package/dist/guest-actions-1T1DeS5Y.d.ts +5 -0
- package/dist/guest-actions-B7zdhfnh.js +9 -0
- package/dist/h3/index.d.ts +2 -4
- package/dist/h3/index.js +2 -4
- package/dist/h3/v1/index.d.ts +2 -3
- package/dist/h3/v1/index.js +2 -3
- package/dist/hono/index.d.ts +27 -21
- package/dist/hono/index.js +22 -20
- package/dist/http-7-UvHjQe.js +28 -0
- package/dist/impersonation-DM3oWNoD.js +62 -0
- package/dist/inbox-NDKwSk_H.d.ts +321 -0
- package/dist/index-B938YqY-.d.ts +188 -0
- package/dist/index-BUuVq1co.d.ts +158 -0
- package/dist/index-BnH4Gomw.d.ts +633 -0
- package/dist/index-BxYOB1Oc.d.ts +149 -0
- package/dist/index-C-qpk8EQ.d.ts +262 -0
- package/dist/index-CG9rA8H8.d.ts +407 -0
- package/dist/index-CguFm716.d.ts +518 -0
- package/dist/index-DLq69k3F.d.ts +588 -0
- package/dist/index-Do2ChN_y.d.ts +287 -0
- package/dist/index.d.ts +39 -92
- package/dist/index.js +95 -16
- package/dist/instances-BHjCZoF8.js +277 -0
- package/dist/invalidate-DMp4eqfF.d.ts +21 -0
- package/dist/json-schema-Ca6gYbEP.js +888 -0
- package/dist/jwks-cache-DEsKI0hJ.js +49 -0
- package/dist/kit-5l-o8RxL.js +133 -0
- package/dist/kit-DOwKpSkA.d.ts +94 -0
- package/dist/knowledge-BGbtxMP9.js +300 -0
- package/dist/knowledge-CtL-Vfgy.d.ts +217 -0
- package/dist/lint/index.d.ts +94 -11
- package/dist/lint/index.js +268 -26
- package/dist/list/index.d.ts +4 -4
- package/dist/list/index.js +3 -3
- package/dist/list-query-BDVutLFr.d.ts +222 -0
- package/dist/list-query-BKy2zBaT.js +559 -0
- package/dist/live-C21DgbsD.js +275 -0
- package/dist/mapper/bin.js +380 -0
- package/dist/mcp/index.d.ts +8 -8
- package/dist/mcp/index.js +11 -11
- package/dist/mcp/sdk/index.d.ts +10 -10
- package/dist/mcp/sdk/index.js +11 -11
- package/dist/messages-D4XWuRTj.js +492 -0
- package/dist/messaging-C_Pr9tGx.d.ts +297 -0
- package/dist/methods-B3o7BFOW.js +11 -0
- package/dist/mfa-oIOYTpvc.d.ts +36 -0
- package/dist/model-hwpvole9.d.ts +340 -0
- package/dist/model-messages-CKG0zwdF.js +206 -0
- package/dist/money-codec-BzddguAQ.js +41 -0
- package/dist/my-work-kinds-BU3SlA-6.js +11 -0
- package/dist/nestjs/index.d.ts +3 -3
- package/dist/nestjs/index.js +2 -2
- package/dist/next/index.d.ts +296 -57
- package/dist/next/index.js +310 -54
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +6 -8
- package/dist/operations-CSc_IsHO.d.ts +6 -0
- package/dist/options-0qvUckqt.js +9 -0
- package/dist/options-1GgseJq5.js +10 -0
- package/dist/options-21s0dpnX.js +9 -0
- package/dist/options-2EMA_x6_.js +16 -0
- package/dist/options-63AKQNv0.js +5 -0
- package/dist/options-9gvPo1BC.js +8 -0
- package/dist/options-B-cxGmRA.js +5 -0
- package/dist/options-B0EJULm5.js +5 -0
- package/dist/options-B2swWnJW.js +9 -0
- package/dist/options-B5VUf4IT.js +8 -0
- package/dist/options-BMGClqoa.js +11 -0
- package/dist/options-BPDiwSa-.js +5 -0
- package/dist/options-BQIYfx9F.js +9 -0
- package/dist/options-BVg58avP.js +5 -0
- package/dist/options-BYOtaF7w.js +5 -0
- package/dist/options-BZOliZvb.js +9 -0
- package/dist/options-BbnPv6p7.js +12 -0
- package/dist/options-BfLmA375.js +5 -0
- package/dist/options-BjtrC7o6.js +8 -0
- package/dist/options-BlncUmIc.js +9 -0
- package/dist/options-BlzSfWxC.d.ts +10 -0
- package/dist/options-BnZS7IK-.js +9 -0
- package/dist/options-Bpl-WFPk.js +15 -0
- package/dist/options-Br1Xi2Hw.js +9 -0
- package/dist/options-Bt0bYMLl.js +24 -0
- package/dist/options-BvtnxHfK.js +24 -0
- package/dist/options-C-dQHH5-.js +8 -0
- package/dist/options-C3RgtOLo.js +5 -0
- package/dist/options-CE93HOYi.d.ts +7 -0
- package/dist/options-CF7nRWXS.js +5 -0
- package/dist/options-CM6-18FQ.d.ts +13 -0
- package/dist/options-CPK2nQER.js +5 -0
- package/dist/options-CRz8Ht_4.js +9 -0
- package/dist/options-CSCXNYJO.d.ts +8 -0
- package/dist/options-CW9wTqOk.js +11 -0
- package/dist/options-CYV4iZiQ.js +5 -0
- package/dist/options-Cl9Ag2Pt.js +8 -0
- package/dist/options-Cp0HyUEk.js +9 -0
- package/dist/options-Cqq2jUww.js +10 -0
- package/dist/options-CsGl5BLH.d.ts +52 -0
- package/dist/options-CtUUU71w.js +20 -0
- package/dist/options-CvD9vNvx.js +9 -0
- package/dist/options-CyAhRKKm.d.ts +14 -0
- package/dist/options-Cyu0hgmN.js +9 -0
- package/dist/options-D0G06Zm9.js +8 -0
- package/dist/options-D0bzZx9a.d.ts +10 -0
- package/dist/options-D1hSuf50.d.ts +12 -0
- package/dist/options-D6as77gU.d.ts +16 -0
- package/dist/options-DChZoVfs.d.ts +11 -0
- package/dist/options-DINdgVih.d.ts +9 -0
- package/dist/options-DJ-aYPVN.js +5 -0
- package/dist/options-DPgdAXO5.js +11 -0
- package/dist/options-DWML05Cp.js +5 -0
- package/dist/options-DWVYM8P0.d.ts +17 -0
- package/dist/options-DWbA9buW.js +9 -0
- package/dist/options-DXnBN2E7.js +8 -0
- package/dist/options-D_bBVCXg.js +5 -0
- package/dist/options-DcOx8_3X.d.ts +19 -0
- package/dist/options-DeNejBtq.js +8 -0
- package/dist/options-DgQo80Xh.js +5 -0
- package/dist/options-DlohRAYd.d.ts +13 -0
- package/dist/options-DplE18Ko.d.ts +12 -0
- package/dist/options-DrSkIBCD.js +9 -0
- package/dist/options-E7KcmHQv.js +8 -0
- package/dist/options-HLwOuF2H.js +10 -0
- package/dist/options-IHPg8ZoA.js +5 -0
- package/dist/options-KV84gAxl.js +10 -0
- package/dist/options-Li1Dyu88.d.ts +10 -0
- package/dist/options-Q1Bzgqpr.js +5 -0
- package/dist/options-_F-enoBs.d.ts +26 -0
- package/dist/options-c5WCsky5.js +21 -0
- package/dist/options-nFzfgtA6.js +5 -0
- package/dist/options-o2kfYU2x.js +8 -0
- package/dist/options-pOVWwbAK.d.ts +10 -0
- package/dist/options-t_O5ldT6.js +5 -0
- package/dist/options-xD4_FRUq.js +10 -0
- package/dist/options-y_-AkVCs.d.ts +15 -0
- package/dist/options-zkyhM3qi.js +8 -0
- package/dist/orpc/index.d.ts +76 -20
- package/dist/orpc/index.js +174 -9
- package/dist/otel/index.d.ts +3 -3
- package/dist/otel/index.js +7 -7
- package/dist/outbox-HvGAJuBe.d.ts +199 -0
- package/dist/payments-BXvabJOw.js +16 -0
- package/dist/payments-BYcN34Fp.d.ts +114 -0
- package/dist/permissions-controller-BMsqIE5T.js +34 -0
- package/dist/plugin-AKwwe2gF.js +48 -0
- package/dist/pool-CrtT4dg-.d.ts +123 -0
- package/dist/pool-errors-JUBcGrre.js +27 -0
- package/dist/ports-DOhtuw3c.js +152 -0
- package/dist/ports-sx226JUL.d.ts +89 -0
- package/dist/postgres/index.d.ts +5 -5
- package/dist/postgres/index.js +3 -3
- package/dist/postgrest-executor-BFW4oWte.js +1064 -0
- package/dist/postgrest-z-T0l23T.d.ts +53 -0
- package/dist/powersync/index.d.ts +106 -7
- package/dist/powersync/index.js +169 -23
- package/dist/preset/index.d.ts +4 -4
- package/dist/preset/index.js +4 -4
- package/dist/preset-CsHnIBJF.js +875 -0
- package/dist/problem-Bf0cJ7tk.js +162 -0
- package/dist/problem-DNwN8iGz.d.ts +79 -0
- package/dist/provider-B6g7rBZX.js +57 -0
- package/dist/provider-CqwEOLCA.d.ts +112 -0
- package/dist/push-token-D3Vcf0Pf.d.ts +24 -0
- package/dist/queries-BWYYS9um.js +239 -0
- package/dist/query/index.d.ts +4 -4
- package/dist/query/index.js +357 -3
- package/dist/rank-result-BBJIK-k_.js +18 -0
- package/dist/rank-result-Bwe7igy-.d.ts +14 -0
- package/dist/rate-limit-BWKGlhTM.js +49 -0
- package/dist/rate-limit-Bztf32cl.d.ts +50 -0
- package/dist/rate-limit-o44SYkVY.js +327 -0
- package/dist/react/index.d.ts +10 -9
- package/dist/react/index.js +5 -5
- package/dist/react/native/index.d.ts +1 -1
- package/dist/react/native/index.js +2 -3
- package/dist/react/server.d.ts +72 -13
- package/dist/react/server.js +71 -9
- package/dist/react/session.d.ts +3 -3
- package/dist/react-BuDYI62C.js +979 -0
- package/dist/react-router/index.d.ts +19 -13
- package/dist/react-router/index.js +10 -10
- package/dist/read-set-BnKnofIj.js +199 -0
- package/dist/realtime/index.d.ts +7 -7
- package/dist/realtime/index.js +36 -4
- package/dist/record-bindings-DkBJpC5A.js +26 -0
- package/dist/record-form-BYs9xv_N.d.ts +82 -0
- package/dist/record-type-DRbnlj5q.js +221 -0
- package/dist/recordings-BBSJt_YV.d.ts +119 -0
- package/dist/records/index.d.ts +83 -0
- package/dist/records/index.js +314 -0
- package/dist/refresh-DT_ICaK-.d.ts +54 -0
- package/dist/refusal-ByBZcm0V.js +64 -0
- package/dist/refusal-CSntB_x8.d.ts +32 -0
- package/dist/replicas-Dyoh3CEg.js +94 -0
- package/dist/resolve-B0mW2m7f.js +932 -0
- package/dist/resolve-CXX6DHv3.d.ts +288 -0
- package/dist/resource-D8pzB5Qf.d.ts +123 -0
- package/dist/resource-DV2GC2dB.js +520 -0
- package/dist/resource-DvgXqZB_.js +105 -0
- package/dist/resource-execute-CzHuDsil.d.ts +15 -0
- package/dist/resource-types-DnKiH4G2.d.ts +157 -0
- package/dist/resources-B9cQxhjw.d.ts +7 -0
- package/dist/resources-C02l_YBJ.js +64 -0
- package/dist/respond-C3CcOZlA.js +100 -0
- package/dist/respond-Dn1_YhC1.d.ts +106 -0
- package/dist/result-DZeA5KS6.d.ts +351 -0
- package/dist/result-ntFBW2p2.js +146 -0
- package/dist/rows-BDLZStp4.js +80 -0
- package/dist/rows-Bm6sskji.js +39 -0
- package/dist/rrule-79K2c3Nr.js +290 -0
- package/dist/run-state-BMCD_1Lt.d.ts +13 -0
- package/dist/sales-lines-Bk4mbLH1.d.ts +37 -0
- package/dist/sales-lines-D-sf9PIB.js +43 -0
- package/dist/sales-shared-DXGFJP4g.js +22 -0
- package/dist/schemas-l2aF78zQ.js +216 -0
- package/dist/scores-B2BiNuVJ.d.ts +174 -0
- package/dist/scores-CRp3vvQU.js +177 -0
- package/dist/server/index.d.ts +103 -42
- package/dist/server/index.js +98 -30
- package/dist/server-types-CFtehAsr.d.ts +946 -0
- package/dist/session-CH0SKgIz.d.ts +99 -0
- package/dist/shared-C47zAh2A.js +17 -0
- package/dist/sign-in-BAjR49fq.d.ts +24 -0
- package/dist/sign-in-BsIaNx2C.js +392 -0
- package/dist/sign-in-DNCdrk05.js +608 -0
- package/dist/signatures-CNcoq392.js +145 -0
- package/dist/signatures-Dkx9OE8j.d.ts +43 -0
- package/dist/signers-BAEzvTJ0.d.ts +390 -0
- package/dist/signing-keys-BNDUxpQL.d.ts +119 -0
- package/dist/signing-keys-wGKh4vtt.js +164 -0
- package/dist/solid/index.d.ts +67 -15
- package/dist/solid/index.js +93 -11
- package/dist/solid-start/index.d.ts +17 -14
- package/dist/solid-start/index.js +8 -8
- package/dist/spec/index.d.ts +691 -9
- package/dist/spec/index.js +2487 -5
- package/dist/spec-DTWkHzYZ.js +124 -0
- package/dist/spec-pins-C1Vm8OBl.js +61 -0
- package/dist/spec-pins-DIx95afw.d.ts +125 -0
- package/dist/sql/index.d.ts +5 -5
- package/dist/sql/index.js +5 -5
- package/dist/sql-BPbbPzRJ.js +421 -0
- package/dist/sql-ClHIdgKS.js +126996 -0
- package/dist/sqlite/index.d.ts +126 -0
- package/dist/sqlite/index.js +197 -0
- package/dist/sso-B0Txid2-.d.ts +161 -0
- package/dist/sso-d2S4x_f9.js +217 -0
- package/dist/ssr/index.d.ts +5 -4
- package/dist/ssr/index.js +3 -3
- package/dist/standard-BA3mLh6w.js +25 -0
- package/dist/standard-DBV730sF.d.ts +7 -0
- package/dist/stats-BHl1-zj9.js +83 -0
- package/dist/statuses-DMMDwXpZ.js +29 -0
- package/dist/statuses-zRcc2TeZ.js +28 -0
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.js +11 -11
- package/dist/store-CpheI-lN.d.ts +83 -0
- package/dist/streams/index.d.ts +3 -3
- package/dist/streams/index.js +2 -3
- package/dist/streams/redis/index.d.ts +2 -2
- package/dist/streams/redis/index.js +3 -3
- package/dist/stripe/index.d.ts +1 -1
- package/dist/stripe-X22LjuH-.d.ts +156 -0
- package/dist/subject-readers-B-pQ9Mmo.js +49 -0
- package/dist/subject-readers-BNSzkqw_.d.ts +21 -0
- package/dist/subjects-BpIEN1MS.d.ts +90 -0
- package/dist/subjects-DvmQeF_F.d.ts +79 -0
- package/dist/summaries-8jQTELIX.d.ts +69 -0
- package/dist/support-view-BYOgwXsJ.d.ts +17 -0
- package/dist/svelte/index.d.ts +67 -12
- package/dist/svelte/index.js +108 -11
- package/dist/sveltekit/index.d.ts +19 -16
- package/dist/sveltekit/index.js +14 -14
- package/dist/table-schema-BlF6k62Q.d.ts +81 -0
- package/dist/table-schema-CD8cJz_M.js +293 -0
- package/dist/tags-BjHflcHF.d.ts +30 -0
- package/dist/tags-CIZTqtlY.js +39 -0
- package/dist/tanstack-db/index.d.ts +50 -6
- package/dist/tanstack-db/index.js +44 -3
- package/dist/tanstack-start/index.d.ts +15 -12
- package/dist/tanstack-start/index.js +9 -9
- package/dist/tax-BkCNWWMc.js +140 -0
- package/dist/tax-DPShHual.d.ts +170 -0
- package/dist/tee-V97_v1ZS.js +101 -0
- package/dist/template-Drgg3v2J.js +126 -0
- package/dist/temporal-required-Dy0GGD8E.js +20 -0
- package/dist/tenant-BgIiMQpo.js +27 -0
- package/dist/tenant-source-bqWpSr86.js +8 -0
- package/dist/tenant-yYg0E2-n.d.ts +17 -0
- package/dist/testing/index.d.ts +183 -58
- package/dist/testing/index.js +405 -97
- package/dist/timeline--VU3A1e4.js +50 -0
- package/dist/timeline-CtG0sehj.d.ts +151 -0
- package/dist/timing-dypS0nxW.js +95 -0
- package/dist/topic-CJrQZQaa.d.ts +415 -0
- package/dist/topic-ikV_pLTX.js +643 -0
- package/dist/types-BBQLbui9.d.ts +659 -0
- package/dist/types-CAQBmpDx.d.ts +217 -0
- package/dist/types-DFdg_4yN.d.ts +912 -0
- package/dist/types-Dp3UCr1e.d.ts +194 -0
- package/dist/types-Dr9wZgNy.d.ts +251 -0
- package/dist/types-EO2crSX_.d.ts +177 -0
- package/dist/types-SFRomQF7.d.ts +624 -0
- package/dist/undo-B1jwnVyN.d.ts +46 -0
- package/dist/undo-BjCChCmH.js +44 -0
- package/dist/upload-claim-B1ZU8ydB.js +33 -0
- package/dist/usage-D7QkrwzV.d.ts +232 -0
- package/dist/user-change-DgWC6RRC.js +135 -0
- package/dist/variants-Cy--Ub-a.js +53 -0
- package/dist/vault-O-YlAyHb.d.ts +62 -0
- package/dist/vercel-connect/index.d.ts +1 -1
- package/dist/vercel-connect/index.js +3 -3
- package/dist/verify-CMou8dWZ.d.ts +146 -0
- package/dist/verify-ZLFUdlqE.js +130 -0
- package/dist/view-C8Ve14ja.js +247 -0
- package/dist/view-DyFdMCqg.d.ts +97 -0
- package/dist/vue/index.d.ts +67 -20
- package/dist/vue/index.js +102 -14
- package/dist/watch-topic-BcGfvZOE.d.ts +31 -0
- package/dist/wiring-CDNuQoJJ.js +13 -0
- package/dist/workflow-sdk/builder/index.d.ts +12 -12
- package/dist/workflow-sdk/builder/index.js +16 -17
- package/dist/workflow-sdk/index.d.ts +18 -15
- package/dist/workflow-sdk/index.js +2 -2
- package/dist/workflow-sdk/world/index.d.ts +6 -6
- package/dist/workflow-sdk/world/index.js +12 -12
- package/dist/workflow-sdk-BFHu4sci.d.ts +163 -0
- package/dist/workflow-sdk-BVlFEB5Q.js +242 -0
- package/dist/workflow-sdk-Bw6_u0ar.js +2446 -0
- package/dist/workflows-B0ZPAQu0.d.ts +255 -0
- package/dist/yjs/index.d.ts +28 -4
- package/dist/yjs/index.js +52 -10
- package/package.json +201 -540
- package/schemas/config-v1.json +2720 -1693
- package/schemas/design-v1.json +147 -5
- package/schemas/doctor-report-v1.json +14 -0
- package/schemas/snapshot-v2.json +25 -0
- package/skills/better-supabase/SKILL.md +71 -28
- package/skills/better-supabase/references/block-extensions.md +64 -0
- package/skills/better-supabase/references/frontend.md +29 -26
- package/skills/better-supabase/references/troubleshooting.md +19 -19
- package/skills/better-supabase/references/ui-recipes.md +12837 -8039
- package/skills/better-supabase-api/SKILL.md +49 -38
- package/skills/better-supabase-api/references/adapters.md +42 -39
- package/skills/better-supabase-api/references/ai.md +4 -4
- package/skills/better-supabase-api/references/expo.md +8 -8
- package/skills/better-supabase-api/references/powersync.md +25 -11
- package/skills/better-supabase-api/references/streams-credentials.md +3 -3
- package/skills/better-supabase-auth/SKILL.md +17 -17
- package/skills/better-supabase-auth/references/authorization-providers.md +8 -6
- package/skills/better-supabase-testing/SKILL.md +8 -8
- package/dist/access-sql-BpOdJvfj.js +0 -205
- package/dist/actor-C9pwyCVz.js +0 -150
- package/dist/adapter-D8dW6p2A.js +0 -2190
- package/dist/agents-CuxuXVWv.d.ts +0 -117
- package/dist/ai-cache-BXMXRhkx.d.ts +0 -82
- package/dist/ai-cache-Byy5q6EZ.js +0 -87
- package/dist/ai-chat-B00sIOjY.d.ts +0 -619
- package/dist/ai-files-DTbIJcxQ.js +0 -339
- package/dist/ai-tasks-DN-AV7qB.d.ts +0 -166
- package/dist/announcements-DqiLxtKK.js +0 -128
- package/dist/api-CmcTYuFT.js +0 -685
- package/dist/api-DwLhJS1j.d.ts +0 -444
- package/dist/api-keys-Bade6Qtl.d.ts +0 -213
- package/dist/api-keys-CO24Ffil.js +0 -318
- package/dist/app-tables-0YZ9IskE.js +0 -831
- package/dist/app-tables-CbWUI7h_.d.ts +0 -35
- package/dist/approvals-C-4MOWdV.d.ts +0 -127
- package/dist/arazzo/index.d.ts +0 -277
- package/dist/arazzo/index.js +0 -630
- package/dist/assistant-CcP_kpu7.d.ts +0 -157
- package/dist/asyncapi/index.d.ts +0 -109
- package/dist/asyncapi/index.js +0 -572
- package/dist/attachments-CPkGJVfk.js +0 -270
- package/dist/attributes-BOFl922R.js +0 -44
- package/dist/audit-log-5aTnl7W2.js +0 -788
- package/dist/auth-module-CwCIY97x.js +0 -10
- package/dist/auth-reply-D02x5NSv.js +0 -31
- package/dist/authorization-CB69cvnA.d.ts +0 -1504
- package/dist/authorization-hooks-HXVZXxUk.d.ts +0 -217
- package/dist/authorizer-BVR2vPGA.js +0 -125
- package/dist/authorizer-DFP3gHv8.d.ts +0 -82
- package/dist/bind-DcXLU1ul.d.ts +0 -76
- package/dist/block-env-YfPmSNa1.js +0 -32
- package/dist/block-env-kFcaaJLM.d.ts +0 -10
- package/dist/block-events-BURaqwyp.js +0 -96
- package/dist/block-fields-Cwd4c8m-.js +0 -139
- package/dist/block-fields-DnXkMney.d.ts +0 -58
- package/dist/block-helpers-DwE32_gT.js +0 -272
- package/dist/block-helpers-DyA5BAW4.d.ts +0 -43
- package/dist/block-hooks-BadAniNI.d.ts +0 -117
- package/dist/block-hooks-C1r-R2r0.js +0 -130
- package/dist/block-transport-DBPhgF3W.d.ts +0 -69
- package/dist/block-transport-Ds0C2mUf.js +0 -84
- package/dist/blocks/ai-chat/react/index.d.ts +0 -52
- package/dist/blocks/ai-chat/react/index.js +0 -95
- package/dist/blocks/ai-chat/react/server.d.ts +0 -25
- package/dist/blocks/ai-chat/react/server.js +0 -23
- package/dist/blocks/ai-chat/solid/index.d.ts +0 -34
- package/dist/blocks/ai-chat/solid/index.js +0 -41
- package/dist/blocks/ai-chat/svelte/index.d.ts +0 -34
- package/dist/blocks/ai-chat/svelte/index.js +0 -41
- package/dist/blocks/ai-chat/vue/index.d.ts +0 -34
- package/dist/blocks/ai-chat/vue/index.js +0 -41
- package/dist/blocks/ai-providers/index.d.ts +0 -22
- package/dist/blocks/ai-providers/index.js +0 -237
- package/dist/blocks/ai-tasks/index.d.ts +0 -10
- package/dist/blocks/ai-tasks/index.js +0 -253
- package/dist/blocks/announcements/react/index.d.ts +0 -28
- package/dist/blocks/announcements/react/index.js +0 -38
- package/dist/blocks/announcements/react/server.d.ts +0 -9
- package/dist/blocks/announcements/react/server.js +0 -10
- package/dist/blocks/announcements/solid/index.d.ts +0 -13
- package/dist/blocks/announcements/solid/index.js +0 -14
- package/dist/blocks/announcements/svelte/index.d.ts +0 -13
- package/dist/blocks/announcements/svelte/index.js +0 -14
- package/dist/blocks/announcements/vue/index.d.ts +0 -13
- package/dist/blocks/announcements/vue/index.js +0 -14
- package/dist/blocks/api-keys/react/index.d.ts +0 -32
- package/dist/blocks/api-keys/react/index.js +0 -43
- package/dist/blocks/api-keys/react/server.d.ts +0 -7
- package/dist/blocks/api-keys/react/server.js +0 -7
- package/dist/blocks/api-keys/solid/index.d.ts +0 -13
- package/dist/blocks/api-keys/solid/index.js +0 -14
- package/dist/blocks/api-keys/svelte/index.d.ts +0 -13
- package/dist/blocks/api-keys/svelte/index.js +0 -14
- package/dist/blocks/api-keys/vue/index.d.ts +0 -13
- package/dist/blocks/api-keys/vue/index.js +0 -14
- package/dist/blocks/audit/react/index.d.ts +0 -31
- package/dist/blocks/audit/react/index.js +0 -46
- package/dist/blocks/audit/react/server.d.ts +0 -7
- package/dist/blocks/audit/react/server.js +0 -7
- package/dist/blocks/audit/solid/index.d.ts +0 -13
- package/dist/blocks/audit/solid/index.js +0 -14
- package/dist/blocks/audit/svelte/index.d.ts +0 -13
- package/dist/blocks/audit/svelte/index.js +0 -14
- package/dist/blocks/audit/vue/index.d.ts +0 -13
- package/dist/blocks/audit/vue/index.js +0 -14
- package/dist/blocks/billing/react/index.d.ts +0 -44
- package/dist/blocks/billing/react/index.js +0 -40
- package/dist/blocks/billing/react/server.d.ts +0 -10
- package/dist/blocks/billing/react/server.js +0 -10
- package/dist/blocks/billing/solid/index.d.ts +0 -15
- package/dist/blocks/billing/solid/index.js +0 -14
- package/dist/blocks/billing/svelte/index.d.ts +0 -15
- package/dist/blocks/billing/svelte/index.js +0 -14
- package/dist/blocks/billing/vue/index.d.ts +0 -15
- package/dist/blocks/billing/vue/index.js +0 -14
- package/dist/blocks/bookings/react/index.d.ts +0 -35
- package/dist/blocks/bookings/react/index.js +0 -63
- package/dist/blocks/bookings/react/server.d.ts +0 -9
- package/dist/blocks/bookings/react/server.js +0 -10
- package/dist/blocks/bookings/solid/index.d.ts +0 -13
- package/dist/blocks/bookings/solid/index.js +0 -14
- package/dist/blocks/bookings/svelte/index.d.ts +0 -13
- package/dist/blocks/bookings/svelte/index.js +0 -14
- package/dist/blocks/bookings/vue/index.d.ts +0 -13
- package/dist/blocks/bookings/vue/index.js +0 -14
- package/dist/blocks/calendar/react/index.d.ts +0 -26
- package/dist/blocks/calendar/react/index.js +0 -58
- package/dist/blocks/calendar/react/server.d.ts +0 -9
- package/dist/blocks/calendar/react/server.js +0 -10
- package/dist/blocks/calendar/solid/index.d.ts +0 -13
- package/dist/blocks/calendar/solid/index.js +0 -14
- package/dist/blocks/calendar/svelte/index.d.ts +0 -13
- package/dist/blocks/calendar/svelte/index.js +0 -14
- package/dist/blocks/calendar/vue/index.d.ts +0 -13
- package/dist/blocks/calendar/vue/index.js +0 -14
- package/dist/blocks/comments/react/index.d.ts +0 -34
- package/dist/blocks/comments/react/index.js +0 -49
- package/dist/blocks/comments/react/server.d.ts +0 -7
- package/dist/blocks/comments/react/server.js +0 -7
- package/dist/blocks/comments/solid/index.d.ts +0 -13
- package/dist/blocks/comments/solid/index.js +0 -14
- package/dist/blocks/comments/svelte/index.d.ts +0 -13
- package/dist/blocks/comments/svelte/index.js +0 -14
- package/dist/blocks/comments/vue/index.d.ts +0 -13
- package/dist/blocks/comments/vue/index.js +0 -14
- package/dist/blocks/engagements/index.d.ts +0 -134
- package/dist/blocks/engagements/index.js +0 -143
- package/dist/blocks/entitlements/react/index.d.ts +0 -27
- package/dist/blocks/entitlements/react/index.js +0 -35
- package/dist/blocks/entitlements/react/server.d.ts +0 -9
- package/dist/blocks/entitlements/react/server.js +0 -10
- package/dist/blocks/entitlements/solid/index.d.ts +0 -13
- package/dist/blocks/entitlements/solid/index.js +0 -14
- package/dist/blocks/entitlements/svelte/index.d.ts +0 -13
- package/dist/blocks/entitlements/svelte/index.js +0 -14
- package/dist/blocks/entitlements/vue/index.d.ts +0 -13
- package/dist/blocks/entitlements/vue/index.js +0 -14
- package/dist/blocks/forms/react/index.d.ts +0 -19
- package/dist/blocks/forms/react/index.js +0 -28
- package/dist/blocks/forms/react/server.d.ts +0 -9
- package/dist/blocks/forms/react/server.js +0 -10
- package/dist/blocks/forms/solid/index.d.ts +0 -13
- package/dist/blocks/forms/solid/index.js +0 -14
- package/dist/blocks/forms/svelte/index.d.ts +0 -13
- package/dist/blocks/forms/svelte/index.js +0 -14
- package/dist/blocks/forms/vue/index.d.ts +0 -13
- package/dist/blocks/forms/vue/index.js +0 -14
- package/dist/blocks/inbox/react/index.d.ts +0 -3
- package/dist/blocks/inbox/react/index.js +0 -81
- package/dist/blocks/inbox/react/server.d.ts +0 -17
- package/dist/blocks/inbox/react/server.js +0 -18
- package/dist/blocks/inbox/solid/index.d.ts +0 -27
- package/dist/blocks/inbox/solid/index.js +0 -32
- package/dist/blocks/inbox/svelte/index.d.ts +0 -27
- package/dist/blocks/inbox/svelte/index.js +0 -32
- package/dist/blocks/inbox/vue/index.d.ts +0 -27
- package/dist/blocks/inbox/vue/index.js +0 -32
- package/dist/blocks/jobs/index.d.ts +0 -523
- package/dist/blocks/jobs/index.js +0 -1346
- package/dist/blocks/mfa/react/index.d.ts +0 -30
- package/dist/blocks/mfa/react/index.js +0 -45
- package/dist/blocks/mfa/react/server.d.ts +0 -9
- package/dist/blocks/mfa/react/server.js +0 -12
- package/dist/blocks/mfa/solid/index.d.ts +0 -20
- package/dist/blocks/mfa/solid/index.js +0 -23
- package/dist/blocks/mfa/svelte/index.d.ts +0 -20
- package/dist/blocks/mfa/svelte/index.js +0 -23
- package/dist/blocks/mfa/vue/index.d.ts +0 -20
- package/dist/blocks/mfa/vue/index.js +0 -23
- package/dist/blocks/notifications/react/index.d.ts +0 -19
- package/dist/blocks/notifications/react/index.js +0 -41
- package/dist/blocks/notifications/react/server.d.ts +0 -10
- package/dist/blocks/notifications/react/server.js +0 -10
- package/dist/blocks/notifications/solid/index.d.ts +0 -13
- package/dist/blocks/notifications/solid/index.js +0 -14
- package/dist/blocks/notifications/svelte/index.d.ts +0 -13
- package/dist/blocks/notifications/svelte/index.js +0 -14
- package/dist/blocks/notifications/vue/index.d.ts +0 -13
- package/dist/blocks/notifications/vue/index.js +0 -14
- package/dist/blocks/number-sequences/index.d.ts +0 -48
- package/dist/blocks/number-sequences/index.js +0 -52
- package/dist/blocks/onboarding/react/index.d.ts +0 -24
- package/dist/blocks/onboarding/react/index.js +0 -38
- package/dist/blocks/onboarding/react/server.d.ts +0 -10
- package/dist/blocks/onboarding/react/server.js +0 -10
- package/dist/blocks/onboarding/solid/index.d.ts +0 -13
- package/dist/blocks/onboarding/solid/index.js +0 -14
- package/dist/blocks/onboarding/svelte/index.d.ts +0 -13
- package/dist/blocks/onboarding/svelte/index.js +0 -14
- package/dist/blocks/onboarding/vue/index.d.ts +0 -13
- package/dist/blocks/onboarding/vue/index.js +0 -14
- package/dist/blocks/organizations/react/index.d.ts +0 -127
- package/dist/blocks/organizations/react/index.js +0 -113
- package/dist/blocks/organizations/react/server.d.ts +0 -20
- package/dist/blocks/organizations/react/server.js +0 -24
- package/dist/blocks/organizations/solid/index.d.ts +0 -34
- package/dist/blocks/organizations/solid/index.js +0 -32
- package/dist/blocks/organizations/svelte/index.d.ts +0 -34
- package/dist/blocks/organizations/svelte/index.js +0 -32
- package/dist/blocks/organizations/vue/index.d.ts +0 -34
- package/dist/blocks/organizations/vue/index.js +0 -32
- package/dist/blocks/parties/index.d.ts +0 -190
- package/dist/blocks/parties/index.js +0 -261
- package/dist/blocks/reactions/react/index.d.ts +0 -33
- package/dist/blocks/reactions/react/index.js +0 -50
- package/dist/blocks/reactions/react/server.d.ts +0 -9
- package/dist/blocks/reactions/react/server.js +0 -10
- package/dist/blocks/reactions/solid/index.d.ts +0 -13
- package/dist/blocks/reactions/solid/index.js +0 -14
- package/dist/blocks/reactions/svelte/index.d.ts +0 -13
- package/dist/blocks/reactions/svelte/index.js +0 -14
- package/dist/blocks/reactions/vue/index.d.ts +0 -13
- package/dist/blocks/reactions/vue/index.js +0 -14
- package/dist/blocks/rules/index.d.ts +0 -171
- package/dist/blocks/rules/index.js +0 -162
- package/dist/blocks/rules/react/index.d.ts +0 -38
- package/dist/blocks/rules/react/index.js +0 -59
- package/dist/blocks/rules/react/server.d.ts +0 -6
- package/dist/blocks/rules/react/server.js +0 -7
- package/dist/blocks/rules/solid/index.d.ts +0 -13
- package/dist/blocks/rules/solid/index.js +0 -14
- package/dist/blocks/rules/svelte/index.d.ts +0 -13
- package/dist/blocks/rules/svelte/index.js +0 -14
- package/dist/blocks/rules/vue/index.d.ts +0 -13
- package/dist/blocks/rules/vue/index.js +0 -14
- package/dist/blocks/saved-views/react/index.d.ts +0 -40
- package/dist/blocks/saved-views/react/index.js +0 -60
- package/dist/blocks/saved-views/react/server.d.ts +0 -10
- package/dist/blocks/saved-views/react/server.js +0 -10
- package/dist/blocks/saved-views/solid/index.d.ts +0 -13
- package/dist/blocks/saved-views/solid/index.js +0 -14
- package/dist/blocks/saved-views/svelte/index.d.ts +0 -13
- package/dist/blocks/saved-views/svelte/index.js +0 -14
- package/dist/blocks/saved-views/vue/index.d.ts +0 -13
- package/dist/blocks/saved-views/vue/index.js +0 -14
- package/dist/blocks/search/react/index.d.ts +0 -39
- package/dist/blocks/search/react/index.js +0 -49
- package/dist/blocks/search/react/server.d.ts +0 -10
- package/dist/blocks/search/react/server.js +0 -11
- package/dist/blocks/search/solid/index.d.ts +0 -13
- package/dist/blocks/search/solid/index.js +0 -14
- package/dist/blocks/search/svelte/index.d.ts +0 -13
- package/dist/blocks/search/svelte/index.js +0 -14
- package/dist/blocks/search/vue/index.d.ts +0 -13
- package/dist/blocks/search/vue/index.js +0 -14
- package/dist/blocks/service-principals/index.d.ts +0 -132
- package/dist/blocks/service-principals/index.js +0 -110
- package/dist/blocks/sessions/react/index.d.ts +0 -36
- package/dist/blocks/sessions/react/index.js +0 -53
- package/dist/blocks/sessions/react/server.d.ts +0 -15
- package/dist/blocks/sessions/react/server.js +0 -17
- package/dist/blocks/sessions/solid/index.d.ts +0 -20
- package/dist/blocks/sessions/solid/index.js +0 -23
- package/dist/blocks/sessions/svelte/index.d.ts +0 -20
- package/dist/blocks/sessions/svelte/index.js +0 -23
- package/dist/blocks/sessions/vue/index.d.ts +0 -20
- package/dist/blocks/sessions/vue/index.js +0 -23
- package/dist/blocks/settings/react/index.d.ts +0 -31
- package/dist/blocks/settings/react/index.js +0 -37
- package/dist/blocks/settings/react/server.d.ts +0 -10
- package/dist/blocks/settings/react/server.js +0 -10
- package/dist/blocks/settings/solid/index.d.ts +0 -13
- package/dist/blocks/settings/solid/index.js +0 -14
- package/dist/blocks/settings/svelte/index.d.ts +0 -13
- package/dist/blocks/settings/svelte/index.js +0 -14
- package/dist/blocks/settings/vue/index.d.ts +0 -13
- package/dist/blocks/settings/vue/index.js +0 -14
- package/dist/blocks/shared-signals/index.d.ts +0 -440
- package/dist/blocks/shared-signals/index.js +0 -886
- package/dist/blocks/tags/react/index.d.ts +0 -36
- package/dist/blocks/tags/react/index.js +0 -52
- package/dist/blocks/tags/react/server.d.ts +0 -7
- package/dist/blocks/tags/react/server.js +0 -7
- package/dist/blocks/tags/solid/index.d.ts +0 -13
- package/dist/blocks/tags/solid/index.js +0 -14
- package/dist/blocks/tags/svelte/index.d.ts +0 -13
- package/dist/blocks/tags/svelte/index.js +0 -14
- package/dist/blocks/tags/vue/index.d.ts +0 -13
- package/dist/blocks/tags/vue/index.js +0 -14
- package/dist/blocks/targets/index.d.ts +0 -82
- package/dist/blocks/targets/index.js +0 -73
- package/dist/blocks/undo/react/index.d.ts +0 -17
- package/dist/blocks/undo/react/index.js +0 -24
- package/dist/blocks/undo/react/server.d.ts +0 -10
- package/dist/blocks/undo/react/server.js +0 -10
- package/dist/blocks/undo/solid/index.d.ts +0 -13
- package/dist/blocks/undo/solid/index.js +0 -14
- package/dist/blocks/undo/svelte/index.d.ts +0 -13
- package/dist/blocks/undo/svelte/index.js +0 -14
- package/dist/blocks/undo/vue/index.d.ts +0 -13
- package/dist/blocks/undo/vue/index.js +0 -14
- package/dist/blocks/usage/react/index.d.ts +0 -29
- package/dist/blocks/usage/react/index.js +0 -38
- package/dist/blocks/usage/react/server.d.ts +0 -7
- package/dist/blocks/usage/react/server.js +0 -7
- package/dist/blocks/usage/solid/index.d.ts +0 -13
- package/dist/blocks/usage/solid/index.js +0 -14
- package/dist/blocks/usage/svelte/index.d.ts +0 -13
- package/dist/blocks/usage/svelte/index.js +0 -14
- package/dist/blocks/usage/vue/index.d.ts +0 -13
- package/dist/blocks/usage/vue/index.js +0 -14
- package/dist/blocks/work-items/index.d.ts +0 -210
- package/dist/blocks/work-items/index.js +0 -304
- package/dist/blocks/workflow-builder/index.d.ts +0 -43
- package/dist/blocks/workflow-builder/index.js +0 -33
- package/dist/blocks/workflow-builder/react/index.d.ts +0 -32
- package/dist/blocks/workflow-builder/react/index.js +0 -75
- package/dist/blocks/workflow-builder/react/server.d.ts +0 -14
- package/dist/blocks/workflow-builder/react/server.js +0 -17
- package/dist/blocks/workflow-builder/solid/index.d.ts +0 -20
- package/dist/blocks/workflow-builder/solid/index.js +0 -23
- package/dist/blocks/workflow-builder/svelte/index.d.ts +0 -20
- package/dist/blocks/workflow-builder/svelte/index.js +0 -23
- package/dist/blocks/workflow-builder/vue/index.d.ts +0 -20
- package/dist/blocks/workflow-builder/vue/index.js +0 -23
- package/dist/blocks/workflows/react/index.d.ts +0 -39
- package/dist/blocks/workflows/react/index.js +0 -65
- package/dist/blocks/workflows/react/server.d.ts +0 -14
- package/dist/blocks/workflows/react/server.js +0 -17
- package/dist/blocks/workflows/solid/index.d.ts +0 -20
- package/dist/blocks/workflows/solid/index.js +0 -23
- package/dist/blocks/workflows/svelte/index.d.ts +0 -20
- package/dist/blocks/workflows/svelte/index.js +0 -23
- package/dist/blocks/workflows/vue/index.d.ts +0 -20
- package/dist/blocks/workflows/vue/index.js +0 -23
- package/dist/blocks-CR3vCYhj.js +0 -88
- package/dist/bookings-DJflcGqs.js +0 -184
- package/dist/bucket-DBay-ICp.d.ts +0 -667
- package/dist/build-DxzJf79X.js +0 -1839
- package/dist/build-UqJeGtsH.js +0 -703
- package/dist/calendar-DvbYFkrh.js +0 -801
- package/dist/chat-sdk/react/index.d.ts +0 -3
- package/dist/chat-sdk/react/index.js +0 -2
- package/dist/chat-sdk/react/server.d.ts +0 -4
- package/dist/chat-sdk/react/server.js +0 -1
- package/dist/claims-T8TWZ53E.js +0 -63
- package/dist/cli/add-BRjL7LuG.js +0 -1
- package/dist/cli/add-Cf0uxfZ2.js +0 -672
- package/dist/cli/add-DPfdDRq7.js +0 -75
- package/dist/cli/adopt-B28iUeGg.js +0 -1
- package/dist/cli/adopt-C0VugVMu.js +0 -421
- package/dist/cli/apply-BlxtZPxe.js +0 -329
- package/dist/cli/blocks-CHQ7K8Yz.js +0 -1
- package/dist/cli/blocks-D3tsq-mR.js +0 -124
- package/dist/cli/cache-DdgzhoaL.js +0 -516
- package/dist/cli/catalog-DwTUdJaQ.js +0 -188
- package/dist/cli/codemod-Dz4R-tVY.js +0 -1127
- package/dist/cli/command-33pu13LT.js +0 -963
- package/dist/cli/completion-6M6Hr8TL.js +0 -211
- package/dist/cli/completion-Bqu8yq0q.js +0 -1
- package/dist/cli/completion-Ddr3yqd3.js +0 -30
- package/dist/cli/config-2qlSTi2o.js +0 -1503
- package/dist/cli/config-B31tIvAl.js +0 -42
- package/dist/cli/config-DVksOjSr.js +0 -1
- package/dist/cli/config-edit-D46H0UHp.js +0 -613
- package/dist/cli/db-D8iId4R8.js +0 -473
- package/dist/cli/design-edit-B2aBiarJ.js +0 -205
- package/dist/cli/doctor-pIek4vIO.js +0 -3897
- package/dist/cli/emit-CJKf47Bi.js +0 -1078
- package/dist/cli/env-BrLZfqsL.js +0 -143
- package/dist/cli/env-cbCEa79W.js +0 -1
- package/dist/cli/files-C5JfVnj5.js +0 -972
- package/dist/cli/gen-DquZzY5a.js +0 -307
- package/dist/cli/init-Dd-UdrE0.js +0 -397
- package/dist/cli/introspect-IMQCji2l.js +0 -51
- package/dist/cli/keys-iJs_1WT8.js +0 -106
- package/dist/cli/live-BfAO5YRX.js +0 -344
- package/dist/cli/mcp-D8Az0FNn.js +0 -240
- package/dist/cli/metadata-CTStQPfV.js +0 -144
- package/dist/cli/migration-safety-Dg1lxomi.js +0 -305
- package/dist/cli/module-migration-CbX-jRhV.js +0 -606
- package/dist/cli/moved-CdNtCf4t.js +0 -161
- package/dist/cli/names-D6LrQnOv.js +0 -6
- package/dist/cli/parse-CRZLku1b.js +0 -182
- package/dist/cli/preset-DEvwDc7U.js +0 -129
- package/dist/cli/run-BXhJoghZ.js +0 -1602
- package/dist/cli/run-DdxNRTr0.js +0 -63
- package/dist/cli/run-dTu_PD4I.js +0 -711
- package/dist/cli/scaffold-Bx3bcy2R.js +0 -901
- package/dist/cli/scaffold-mbNAQE19.js +0 -1
- package/dist/cli/seed-CLseQdXQ.js +0 -188
- package/dist/cli/seed-DSHSUsYy.js +0 -1
- package/dist/cli/shared-CAdIkTR7.js +0 -151
- package/dist/cli/skills-Bz4INB8f.js +0 -121
- package/dist/cli/snapshot-GfdB9Cjl.js +0 -350
- package/dist/cli/source-args-Dy3j1-H-.js +0 -59
- package/dist/cli/spec-BfEK0_04.js +0 -1
- package/dist/cli/spec-DXTdodlO.js +0 -7534
- package/dist/cli/sql-BUhpAvrW.js +0 -2
- package/dist/cli/sql-CLbWk3Yb.js +0 -332
- package/dist/cli/stack-_F_JhllX.js +0 -135
- package/dist/cli/sync-BBzNO-v9.js +0 -91
- package/dist/cli/typegen-F9GEjpvD.js +0 -502
- package/dist/cli/typegen-version-BNBPI4Eu.js +0 -9
- package/dist/cli/version-DiwcIKOL.js +0 -4
- package/dist/cli/write-DZKk5rSF.js +0 -201
- package/dist/client--tyFmxDT.js +0 -52
- package/dist/client-0qFNkNhT.js +0 -1060
- package/dist/client-2z1aHG57.d.ts +0 -475
- package/dist/client-5IVhjmtl.d.ts +0 -74
- package/dist/client-B3WBilR2.d.ts +0 -69
- package/dist/client-B4JPQgf-.d.ts +0 -165
- package/dist/client-BAYh7P2h.js +0 -211
- package/dist/client-BKGVUgo7.js +0 -380
- package/dist/client-BNaOcfeH.js +0 -58
- package/dist/client-BOuaQA0h.js +0 -173
- package/dist/client-BP-8vn9G.d.ts +0 -37
- package/dist/client-BU5Yd0yO.d.ts +0 -103
- package/dist/client-Bb_Pj9wL.js +0 -137
- package/dist/client-BkH-Vh3s.d.ts +0 -112
- package/dist/client-BsfsRHae.d.ts +0 -136
- package/dist/client-Bta7yl1C.d.ts +0 -451
- package/dist/client-BwKXlohx.js +0 -121
- package/dist/client-C1zOmnS8.js +0 -89
- package/dist/client-CMqO1gCn.d.ts +0 -64
- package/dist/client-CPirbPPi.js +0 -85
- package/dist/client-CQPB-VJx.d.ts +0 -110
- package/dist/client-CXbP_p02.d.ts +0 -156
- package/dist/client-C_S9avzV.d.ts +0 -420
- package/dist/client-Cb1g45Hc.js +0 -99
- package/dist/client-CebKlRU7.js +0 -157
- package/dist/client-Ch-dDfTB.js +0 -437
- package/dist/client-CuFD4o56.d.ts +0 -111
- package/dist/client-D2y_CfhU.d.ts +0 -137
- package/dist/client-DAcVF-YJ.js +0 -134
- package/dist/client-DCuE1rFm.js +0 -441
- package/dist/client-DD02cst6.d.ts +0 -245
- package/dist/client-DD3EcytK.js +0 -65
- package/dist/client-DEE57s9m.d.ts +0 -132
- package/dist/client-DScMvaty.js +0 -38
- package/dist/client-DVRFa59w.d.ts +0 -309
- package/dist/client-DXb1Nmr3.js +0 -111
- package/dist/client-DkI0oyR7.js +0 -76
- package/dist/client-DkQcRKhm.js +0 -67
- package/dist/client-DoXBX3vS.d.ts +0 -116
- package/dist/client-Dsuy9wfA.d.ts +0 -59
- package/dist/client-EQvEzUQg.d.ts +0 -276
- package/dist/client-G7NGXZKe.d.ts +0 -43
- package/dist/client-OhTiAol1.js +0 -213
- package/dist/client-Wt19DaEb.js +0 -291
- package/dist/client-Y-kaHabc.d.ts +0 -46
- package/dist/client-YASsOslj.js +0 -321
- package/dist/client-Y_HnZGF4.js +0 -51
- package/dist/client-_mL998Gl.js +0 -129
- package/dist/client-i_u1e0Kf.d.ts +0 -144
- package/dist/client-kRvHKAKS.js +0 -60
- package/dist/client-nieeGXdg.d.ts +0 -178
- package/dist/client-pxXoQOdC.js +0 -40
- package/dist/client-ysVOUgxM.d.ts +0 -54
- package/dist/cloud-event-CidL9jiw.d.ts +0 -64
- package/dist/codecs-Du_zE1xu.js +0 -358
- package/dist/codecs-WHpM3Byy.d.ts +0 -221
- package/dist/codegen-DGtOsqz9.d.ts +0 -1809
- package/dist/comments-Ceqo9bwE.js +0 -230
- package/dist/compiler-DCotQWcs.d.ts +0 -14
- package/dist/compose-VBQL7zIO.js +0 -53
- package/dist/composite-BgBzdYP-.d.ts +0 -82
- package/dist/composite-BgSdL5tk.js +0 -130
- package/dist/config-V6HMvce5.js +0 -3930
- package/dist/config-xUf0dj0t.js +0 -562
- package/dist/connector-CKcTPJRV.d.ts +0 -107
- package/dist/connectors-CgWuPQks.d.ts +0 -147
- package/dist/context-B8_p3MXo.js +0 -11
- package/dist/context-C-bHOtoD.js +0 -5
- package/dist/context-CCz6ZgyI.js +0 -19
- package/dist/context-CMxVnPMY.js +0 -9
- package/dist/context-CrojkPNC.js +0 -41
- package/dist/context-DvBEhsXX.d.ts +0 -403
- package/dist/controller-lWRcKqCl.d.ts +0 -52
- package/dist/cron-CI1kP-t5.js +0 -148
- package/dist/cron-route-BbVtwXZz.js +0 -24
- package/dist/db-exception-CnWcYPxL.js +0 -15
- package/dist/define-D0LSXmUP.d.ts +0 -1117
- package/dist/define-DwZ_LQVO.js +0 -2011
- package/dist/define-block-B6Gjs57G.js +0 -52
- package/dist/define-block-MyM4lH42.d.ts +0 -281
- package/dist/delegation-DeAJehLk.js +0 -146
- package/dist/documents-BijGGIjr.d.ts +0 -99
- package/dist/embeddings-DRGIc8ti.js +0 -128
- package/dist/embeddings-Deusi99x.d.ts +0 -78
- package/dist/ended-D_Twxl8v.d.ts +0 -76
- package/dist/entitlements-CMGsO4gL.d.ts +0 -54
- package/dist/entitlements-_tw0V3BY.js +0 -45
- package/dist/envelope-BDShQQ7-.js +0 -90
- package/dist/errors-Cq72lONT.js +0 -44
- package/dist/errors-D7u24ZJH.js +0 -321
- package/dist/escape-like-DuKupGUV.d.ts +0 -15
- package/dist/eve-dWNqpd9Z.d.ts +0 -157
- package/dist/event-calendar-E6AI-dgg.d.ts +0 -217
- package/dist/events-DhGgwqQA.d.ts +0 -842
- package/dist/executor-C29668fO.d.ts +0 -281
- package/dist/executor-C5uyGttm.js +0 -207
- package/dist/executor-Cy1nk4MZ.d.ts +0 -104
- package/dist/executor-DK2F9Zis.js +0 -746
- package/dist/executor-DXfgDsKd.d.ts +0 -37
- package/dist/executor-D_viYkhf.d.ts +0 -179
- package/dist/executor-QtVn0axs.js +0 -147
- package/dist/expo-sqlite/index.d.ts +0 -61
- package/dist/expo-sqlite/index.js +0 -110
- package/dist/field-errors-CKEqR38q.d.ts +0 -119
- package/dist/field-errors-DZVRWRkf.js +0 -13
- package/dist/field-formats-BX2FqLle.d.ts +0 -39
- package/dist/filter-evaluate-CRDXv0Dl.js +0 -217
- package/dist/filter-evaluate-CSWhzYWN.d.ts +0 -37
- package/dist/filter-query-C7qgRYYv.d.ts +0 -133
- package/dist/filter-query-D4ZSwbcJ.js +0 -524
- package/dist/flags-C--SBMT9.js +0 -279
- package/dist/flags-CJFDNAvL.d.ts +0 -246
- package/dist/form-definition-BjeElHsB.js +0 -311
- package/dist/form-definition-DcVnFzl4.d.ts +0 -95
- package/dist/format-AYHceC2m.d.ts +0 -79
- package/dist/framework-BpEnOfAo.js +0 -57
- package/dist/framework-CMeAuJts.d.ts +0 -41
- package/dist/function-contract-4vfi93Y5.d.ts +0 -27
- package/dist/gateway-Dar9C0uP.d.ts +0 -115
- package/dist/graph-B4eubUQG.js +0 -365
- package/dist/groups-CxonH3u5.js +0 -16
- package/dist/http-AkLjqOuB.js +0 -28
- package/dist/impersonation-DFfDVJHk.js +0 -62
- package/dist/inbox-CLsIrPXs.d.ts +0 -417
- package/dist/index-B5XcM3VY.d.ts +0 -230
- package/dist/index-B5dVVZtW.d.ts +0 -142
- package/dist/index-Brm8I8iZ.d.ts +0 -232
- package/dist/index-C7-2ZS9f.d.ts +0 -127
- package/dist/index-CE0p3st5.d.ts +0 -227
- package/dist/index-CcpGT2GI.d.ts +0 -151
- package/dist/index-CrAKHNJF.d.ts +0 -287
- package/dist/index-DLjs7j_z.d.ts +0 -61
- package/dist/index-DdZcWH6q.d.ts +0 -820
- package/dist/index-Dh5ZFCtu.d.ts +0 -61
- package/dist/index-PADpaDku.d.ts +0 -447
- package/dist/index-eoAU_QaY.d.ts +0 -357
- package/dist/invalidate-BLiBFbLy.d.ts +0 -19
- package/dist/json-schema-Bu4YCRbZ.js +0 -551
- package/dist/jwks-cache-DbgNmSgV.js +0 -49
- package/dist/kit-BeXTrlZn.js +0 -127
- package/dist/kit-LeQGMzLH.d.ts +0 -94
- package/dist/knowledge-Bx_qehoZ.js +0 -272
- package/dist/knowledge-CYdNJasZ.d.ts +0 -202
- package/dist/list-query-CuS1w2Af.js +0 -559
- package/dist/list-query-Dx5cAqG6.d.ts +0 -223
- package/dist/live-CZtRMh62.js +0 -246
- package/dist/messages-Bd5-5ZjP.js +0 -492
- package/dist/methods-7u6vSgz_.js +0 -11
- package/dist/mfa-Dt8AdWht.d.ts +0 -36
- package/dist/model-Btl8X9cs.d.ts +0 -326
- package/dist/model-messages-BWyXXA4s.js +0 -206
- package/dist/money-codec-BdnIiFFX.js +0 -41
- package/dist/onboarding-DjXV4rgO.js +0 -68
- package/dist/openapi/index.d.ts +0 -4
- package/dist/openapi/index.js +0 -36
- package/dist/operations-Cc27HkTG.d.ts +0 -6
- package/dist/options-B7EJaOX-.js +0 -5
- package/dist/options-BAW2ZlZ8.js +0 -8
- package/dist/options-Blg8lAkz.js +0 -9
- package/dist/options-Bn4cu0gt.js +0 -5
- package/dist/options-BnoJOwXK.js +0 -8
- package/dist/options-C1HR4UZd.js +0 -13
- package/dist/options-C2HesT4A.js +0 -9
- package/dist/options-C3EzJATk.js +0 -10
- package/dist/options-C3hZ1fbC.js +0 -10
- package/dist/options-CAzVf-1T.js +0 -8
- package/dist/options-CGKSUFUq.js +0 -5
- package/dist/options-CGjGE8xS.js +0 -12
- package/dist/options-CIf3xni7.d.ts +0 -52
- package/dist/options-CUqQ9pm7.js +0 -9
- package/dist/options-ChD15QxJ.js +0 -9
- package/dist/options-CyD7OObW.js +0 -17
- package/dist/options-D1blDihM.js +0 -9
- package/dist/options-D2Gd6VfS.js +0 -8
- package/dist/options-D7f2VKzj.js +0 -25
- package/dist/options-DXqcJyOP.js +0 -10
- package/dist/options-Dh4wu9Ks.js +0 -15
- package/dist/options-Dmg1Da9P.js +0 -25
- package/dist/options-DsUgamiy.js +0 -5
- package/dist/options-HSv8R6h5.js +0 -13
- package/dist/options-I8zVkB_y.js +0 -8
- package/dist/options-MHhjOoWz.js +0 -5
- package/dist/options-MLxMkd5B.js +0 -11
- package/dist/options-OJ5zmgr8.js +0 -10
- package/dist/options-QKP9FFcK.js +0 -8
- package/dist/options-XgfTctbI.js +0 -5
- package/dist/options-_9arpsX9.js +0 -11
- package/dist/options-kLKILdIu.js +0 -10
- package/dist/options-n22NK3PL.js +0 -8
- package/dist/options-qU8vgxhO.js +0 -18
- package/dist/options-vXMBEWSH.js +0 -5
- package/dist/options-wFnK3qWl.js +0 -9
- package/dist/options-xVAy3UsV.js +0 -9
- package/dist/organizations-R98kfFwF.js +0 -401
- package/dist/outbox-Bsk-HJnq.d.ts +0 -199
- package/dist/overlay/index.d.ts +0 -249
- package/dist/overlay/index.js +0 -561
- package/dist/payments-6uuergov.js +0 -16
- package/dist/plugin-D9bYbYli.js +0 -45
- package/dist/plugin-DouW0Kvg.d.ts +0 -203
- package/dist/plugins/actor/index.d.ts +0 -19
- package/dist/plugins/actor/index.js +0 -57
- package/dist/plugins/rules/index.d.ts +0 -96
- package/dist/plugins/rules/index.js +0 -235
- package/dist/plugins/soft-delete/index.d.ts +0 -39
- package/dist/plugins/soft-delete/index.js +0 -90
- package/dist/plugins/tenant/index.d.ts +0 -60
- package/dist/plugins/tenant/index.js +0 -119
- package/dist/plugins/timestamps/index.d.ts +0 -11
- package/dist/plugins/timestamps/index.js +0 -47
- package/dist/plugins/validation/index.d.ts +0 -24
- package/dist/plugins/validation/index.js +0 -83
- package/dist/pool-Bu8zXGzI.d.ts +0 -123
- package/dist/pool-errors-DOZ3oDeS.js +0 -27
- package/dist/ports-BltcWsHf.d.ts +0 -312
- package/dist/ports-CM3aG3zn.js +0 -137
- package/dist/ports-n3ZWSS_I.d.ts +0 -89
- package/dist/postgrest-DGjrW4sK.d.ts +0 -53
- package/dist/powersync/react/index.d.ts +0 -93
- package/dist/powersync/react/index.js +0 -120
- package/dist/preset-HNFqCWaD.js +0 -838
- package/dist/problem-D0KDiYPk.js +0 -162
- package/dist/problem-D_DEBfMn.d.ts +0 -79
- package/dist/provider-BhIkKBOh.js +0 -57
- package/dist/provider-Dmsbl8ug.d.ts +0 -112
- package/dist/push-token-8lvtOEv4.d.ts +0 -24
- package/dist/query-DgPYlU82.js +0 -311
- package/dist/rank-result-C6vsw27N.js +0 -18
- package/dist/rank-result-DHflCNwo.d.ts +0 -14
- package/dist/rate-limit-B7N1ZGl6.d.ts +0 -50
- package/dist/rate-limit-CXpPm4_l.js +0 -49
- package/dist/rate-limit-CpTD_WHm.js +0 -328
- package/dist/react-controller-CKSdtJ10.js +0 -43
- package/dist/react-env-CodKZgPk.js +0 -16
- package/dist/react-uvu_KcVY.js +0 -599
- package/dist/read-set-DP6fm21F.js +0 -316
- package/dist/refusal-BEyNVFy7.d.ts +0 -32
- package/dist/refusal-Ce2p81VW.js +0 -64
- package/dist/replicas-BvIL4_jL.js +0 -94
- package/dist/resolve-D57oDWNr.d.ts +0 -289
- package/dist/resolve-sy3_Gz0i.js +0 -892
- package/dist/resource-BRRU-A7j.js +0 -91
- package/dist/resource-BVvIiuX_.js +0 -469
- package/dist/resource-DxQOPkZ5.d.ts +0 -115
- package/dist/resource-execute-BbjuiXwD.d.ts +0 -15
- package/dist/resource-types-NXau9LJE.d.ts +0 -153
- package/dist/resources-CIi7sw1T.js +0 -64
- package/dist/resources-CZ60Vqwq.d.ts +0 -7
- package/dist/respond-DjEmE_DN.js +0 -100
- package/dist/respond-QW-f1yio.d.ts +0 -101
- package/dist/result-DIT_qp4G.js +0 -146
- package/dist/result-mijqfoJN.d.ts +0 -346
- package/dist/rrule-CesB9Rxd.js +0 -290
- package/dist/rules-D75V7dAE.js +0 -286
- package/dist/run-state-CPo-1X2B.d.ts +0 -12
- package/dist/sales-lines-9HsX89aO.d.ts +0 -28
- package/dist/sales-lines-DgXeOEar.js +0 -41
- package/dist/sales-shared-CjXsy0NJ.js +0 -22
- package/dist/sales-shared-DAAGwQwN.d.ts +0 -8
- package/dist/search-9hoZ8rN1.js +0 -106
- package/dist/server-types-D_cQ6OxZ.d.ts +0 -809
- package/dist/session-DNRYXIOU.d.ts +0 -97
- package/dist/settings-DzQtMwfl.js +0 -93
- package/dist/shared-C80IHf4B.js +0 -60
- package/dist/shared-D11SWNLx.js +0 -17
- package/dist/sign-in-B_QJ2u62.js +0 -386
- package/dist/signatures-CzqfLlfV.d.ts +0 -43
- package/dist/signatures-D8IoN3Rw.js +0 -145
- package/dist/signers-BuVQKDfK.d.ts +0 -390
- package/dist/signing-keys-i2Rsll6L.d.ts +0 -119
- package/dist/solid-controller-7TxGaJNy.js +0 -33
- package/dist/solid-controller-BnF3ovwV.d.ts +0 -11
- package/dist/spec-pins-CZ2CL8YZ.d.ts +0 -120
- package/dist/spec-pins-D3Tm6HJi.js +0 -60
- package/dist/sql-CQIikLnQ.js +0 -421
- package/dist/sql-frpIs51D.js +0 -89308
- package/dist/sso-C86TPpZr.js +0 -217
- package/dist/sso-D_am-gBz.d.ts +0 -161
- package/dist/standard-16AIDny5.d.ts +0 -7
- package/dist/standard-l10kE0yS.js +0 -25
- package/dist/stats-Bt1RyT-F.js +0 -1147
- package/dist/store-DKqbuNvw.d.ts +0 -83
- package/dist/stripe-BSEwKCni.d.ts +0 -140
- package/dist/subject-readers-BJzh7WF7.js +0 -49
- package/dist/subject-readers-Bbq1i0Ol.d.ts +0 -21
- package/dist/subjects-DQ2SU4cA.d.ts +0 -77
- package/dist/support-CWVTM2AB.js +0 -534
- package/dist/support-view-BOJJSZKv.d.ts +0 -17
- package/dist/svelte-controller-BmRhHvFz.js +0 -50
- package/dist/svelte-controller-DXO7gsmS.d.ts +0 -13
- package/dist/table-schema-xqSXrjCN.js +0 -284
- package/dist/tags-C_ym1yDM.js +0 -39
- package/dist/tags-Co-QIHeK.js +0 -84
- package/dist/tags-tbiuHHMV.d.ts +0 -30
- package/dist/tanstack-db/supabase/index.d.ts +0 -66
- package/dist/tanstack-db/supabase/index.js +0 -271
- package/dist/tax-BHSCb5Rw.d.ts +0 -280
- package/dist/tax-keSd-q_1.js +0 -140
- package/dist/tee-1fsH3bEz.js +0 -101
- package/dist/template-DXsGm_R0.js +0 -126
- package/dist/temporal-required-Dt4mcPsi.js +0 -20
- package/dist/tenant-DnMqeNIM.js +0 -27
- package/dist/tenant-l3H2ouv7.d.ts +0 -17
- package/dist/tenant-naming-Bsj3Uvap.js +0 -27
- package/dist/timing-C5NzaEgy.js +0 -95
- package/dist/topic-CZvLXFND.d.ts +0 -415
- package/dist/topic-Cr01EHZy.js +0 -643
- package/dist/types-BTK75521.js +0 -8
- package/dist/types-Bzm0OgJk.d.ts +0 -177
- package/dist/types-CB5MvzuE.d.ts +0 -624
- package/dist/types-DYXhFhmQ.d.ts +0 -251
- package/dist/types-DmshMaXz.d.ts +0 -421
- package/dist/types-EUrisY2U.d.ts +0 -217
- package/dist/types-vVsLvOUJ.d.ts +0 -700
- package/dist/undo-CClrTbm9.d.ts +0 -46
- package/dist/undo-HHonvNeg.js +0 -44
- package/dist/upload-claim-DCuklVyh.js +0 -33
- package/dist/usage-BFwuH7GK.d.ts +0 -232
- package/dist/usage-CJmmCGzd.js +0 -264
- package/dist/user-change-CSR_prhd.js +0 -133
- package/dist/variants-Bat9zU8l.js +0 -53
- package/dist/vault-BQThkbws.d.ts +0 -62
- package/dist/verify-BCmBaHlN.js +0 -130
- package/dist/verify-BTAEsJbF.d.ts +0 -146
- package/dist/view-CKzCp8FW.d.ts +0 -90
- package/dist/view-CfUd5vI9.js +0 -108
- package/dist/vue-controller-DCOtUOA_.d.ts +0 -11
- package/dist/vue-controller-EzyTjqca.js +0 -32
- package/dist/watch-CYeMXFtj.d.ts +0 -92
- package/dist/watch-Cnd6XDnU.js +0 -139
- package/dist/watch-topic-CloXeDTO.d.ts +0 -31
- package/dist/wire-BJhepFbv.js +0 -66
- package/dist/workflow-builder-DzZNlI45.js +0 -699
- package/dist/workflow-sdk-BXwl1THQ.d.ts +0 -163
- package/dist/workflow-sdk-CPGiFE1B.js +0 -242
- package/dist/workflow-sdk-world-BOEsvWmx.js +0 -2123
- package/dist/workflows-BHyYAR6c.d.ts +0 -258
- package/dist/workflows-otOMN33L.js +0 -285
- package/skills/better-supabase/references/plugins.md +0 -71
package/dist/spec/index.js
CHANGED
|
@@ -1,8 +1,701 @@
|
|
|
1
1
|
import { r as isPlainObject } from "../clone-CkG0-hlI.js";
|
|
2
|
-
import { a as methodNotAllowed } from "../problem-
|
|
2
|
+
import { a as methodNotAllowed } from "../problem-Bf0cJ7tk.js";
|
|
3
|
+
import { t as SPEC_PINS } from "../spec-pins-C1Vm8OBl.js";
|
|
3
4
|
import { t as FUNCTION_DESCRIPTOR } from "../function-contract-pEmsaUIf.js";
|
|
4
|
-
import {
|
|
5
|
-
import { a as
|
|
5
|
+
import { n as memoized, t as importOptionalPeer } from "../optional-peer-C1NbBRJm.js";
|
|
6
|
+
import { a as topicsFrom, c as PROBLEM_SCHEMA, d as mergeJson, f as pointerToken, i as safeKey, l as convertStandard, n as publishedResources, o as publishedBlocks, r as CLOUD_EVENT_TRAIT, s as DEFAULT_ERRORS, t as buildApiModel, u as pascal } from "../build-QitPVzzO.js";
|
|
7
|
+
//#region src/spec/format.ts
|
|
8
|
+
/**
|
|
9
|
+
* Identity helper that fixes `apiVersion` and checks that the default version
|
|
10
|
+
* exists.
|
|
11
|
+
*/
|
|
12
|
+
function defineDocumentFormat(format) {
|
|
13
|
+
if (!Object.hasOwn(format.versions, format.defaultVersion)) throw new TypeError(`Document format "${format.id}": the default version "${format.defaultVersion}" is not in versions`);
|
|
14
|
+
if (format.versions[format.defaultVersion].status === "preview") throw new TypeError(`Document format "${format.id}": a preview version cannot be the default`);
|
|
15
|
+
return {
|
|
16
|
+
...format,
|
|
17
|
+
apiVersion: 1
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/openapi/schema30.ts
|
|
22
|
+
/** Keywords whose value is one subschema. */
|
|
23
|
+
const SINGLE = /* @__PURE__ */ new Set([
|
|
24
|
+
"items",
|
|
25
|
+
"additionalProperties",
|
|
26
|
+
"not"
|
|
27
|
+
]);
|
|
28
|
+
/** Keywords whose value is a list of subschemas. */
|
|
29
|
+
const LISTS = /* @__PURE__ */ new Set([
|
|
30
|
+
"allOf",
|
|
31
|
+
"anyOf",
|
|
32
|
+
"oneOf"
|
|
33
|
+
]);
|
|
34
|
+
/** 2020-12 keywords the OpenAPI 3.0 Schema Object does not have. */
|
|
35
|
+
const DROPPED = /* @__PURE__ */ new Set([
|
|
36
|
+
"$schema",
|
|
37
|
+
"$id",
|
|
38
|
+
"$anchor",
|
|
39
|
+
"$dynamicAnchor",
|
|
40
|
+
"$dynamicRef",
|
|
41
|
+
"$comment",
|
|
42
|
+
"$defs",
|
|
43
|
+
"$vocabulary",
|
|
44
|
+
"prefixItems",
|
|
45
|
+
"contains",
|
|
46
|
+
"minContains",
|
|
47
|
+
"maxContains",
|
|
48
|
+
"propertyNames",
|
|
49
|
+
"patternProperties",
|
|
50
|
+
"dependentRequired",
|
|
51
|
+
"dependentSchemas",
|
|
52
|
+
"unevaluatedItems",
|
|
53
|
+
"unevaluatedProperties",
|
|
54
|
+
"if",
|
|
55
|
+
"then",
|
|
56
|
+
"else",
|
|
57
|
+
"contentMediaType",
|
|
58
|
+
"contentSchema"
|
|
59
|
+
]);
|
|
60
|
+
const isNullSchema = (value) => isPlainObject(value) && value["type"] === "null" && Object.keys(value).length === 1;
|
|
61
|
+
/**
|
|
62
|
+
* Rewrites a JSON Schema 2020-12 schema into the OpenAPI 3.0 Schema Object:
|
|
63
|
+
* `null` in `type` or in an `anyOf`/`oneOf` becomes `nullable`, a type list
|
|
64
|
+
* becomes `anyOf`, `const` becomes a one-value `enum`, `examples` becomes
|
|
65
|
+
* `example`, numeric `exclusiveMinimum`/`exclusiveMaximum` become the boolean
|
|
66
|
+
* form, `contentEncoding: base64` becomes `format: byte`, and a `$ref` with
|
|
67
|
+
* siblings is wrapped in `allOf`. Keywords 3.0 does not have are left out. The
|
|
68
|
+
* input is not changed.
|
|
69
|
+
*/
|
|
70
|
+
function toOpenApi30Schema(schema) {
|
|
71
|
+
const out = {};
|
|
72
|
+
let nullable = false;
|
|
73
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
74
|
+
if (DROPPED.has(key)) continue;
|
|
75
|
+
if (key === "properties" && isPlainObject(value)) out[key] = Object.fromEntries(Object.entries(value).map(([name, child]) => [name, isPlainObject(child) ? toOpenApi30Schema(child) : child]));
|
|
76
|
+
else if (SINGLE.has(key) && isPlainObject(value)) out[key] = toOpenApi30Schema(value);
|
|
77
|
+
else if (LISTS.has(key) && Array.isArray(value)) {
|
|
78
|
+
const branches = value;
|
|
79
|
+
const rest = branches.filter((branch) => !isNullSchema(branch));
|
|
80
|
+
if (key !== "allOf" && rest.length < branches.length) nullable = true;
|
|
81
|
+
out[key] = rest.map((branch) => isPlainObject(branch) ? toOpenApi30Schema(branch) : branch);
|
|
82
|
+
} else if (key === "examples" && Array.isArray(value)) {
|
|
83
|
+
if (value.length > 0) out["example"] = value[0];
|
|
84
|
+
} else if ((key === "exclusiveMinimum" || key === "exclusiveMaximum") && typeof value === "number") {
|
|
85
|
+
out[key === "exclusiveMinimum" ? "minimum" : "maximum"] = value;
|
|
86
|
+
out[key] = true;
|
|
87
|
+
} else if (key === "const") out["enum"] = [value];
|
|
88
|
+
else if (key === "contentEncoding") {
|
|
89
|
+
if (value === "base64" && schema["format"] === void 0) out["format"] = "byte";
|
|
90
|
+
} else if (key === "type" && Array.isArray(value)) {
|
|
91
|
+
const types = value;
|
|
92
|
+
const rest = types.filter((type) => type !== "null");
|
|
93
|
+
if (rest.length < types.length) nullable = true;
|
|
94
|
+
if (rest.length === 1) out["type"] = rest[0];
|
|
95
|
+
else if (rest.length > 1) out["anyOf"] = rest.map((type) => ({ type }));
|
|
96
|
+
} else if (key === "type" && value === "null") {
|
|
97
|
+
nullable = true;
|
|
98
|
+
out["enum"] = [null];
|
|
99
|
+
} else out[key] = value;
|
|
100
|
+
}
|
|
101
|
+
for (const key of ["anyOf", "oneOf"]) {
|
|
102
|
+
const branches = out[key];
|
|
103
|
+
if (!Array.isArray(branches) || branches.length !== 1) continue;
|
|
104
|
+
const only = branches[0];
|
|
105
|
+
if (!isPlainObject(only)) continue;
|
|
106
|
+
delete out[key];
|
|
107
|
+
if (typeof only["$ref"] === "string") out["allOf"] = [only];
|
|
108
|
+
else for (const [name, entry] of Object.entries(only)) if (!(name in out)) out[name] = entry;
|
|
109
|
+
}
|
|
110
|
+
if (typeof out["$ref"] === "string" && Object.keys(out).length > 1) {
|
|
111
|
+
const { $ref, ...siblings } = out;
|
|
112
|
+
return {
|
|
113
|
+
allOf: [{ $ref }],
|
|
114
|
+
...siblings,
|
|
115
|
+
...nullable ? { nullable: true } : {}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (nullable) {
|
|
119
|
+
if (typeof out["$ref"] === "string") return {
|
|
120
|
+
allOf: [{ $ref: out["$ref"] }],
|
|
121
|
+
nullable: true
|
|
122
|
+
};
|
|
123
|
+
out["nullable"] = true;
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
127
|
+
const mapEntries = (value, convert) => isPlainObject(value) ? Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, isPlainObject(entry) ? convert(entry) : entry])) : value;
|
|
128
|
+
const withSchema = (holder) => {
|
|
129
|
+
const out = { ...holder };
|
|
130
|
+
for (const key of ["schema", "x-oai-itemSchema"]) {
|
|
131
|
+
const schema = out[key];
|
|
132
|
+
if (isPlainObject(schema)) out[key] = toOpenApi30Schema(schema);
|
|
133
|
+
}
|
|
134
|
+
if (isPlainObject(out["content"])) out["content"] = mapEntries(out["content"], withSchema);
|
|
135
|
+
if (isPlainObject(out["headers"])) out["headers"] = mapEntries(out["headers"], withSchema);
|
|
136
|
+
return out;
|
|
137
|
+
};
|
|
138
|
+
const lowerParameters = (value) => Array.isArray(value) ? value.map((entry) => isPlainObject(entry) ? withSchema(entry) : entry) : value;
|
|
139
|
+
const lowerOperation$1 = (operation) => {
|
|
140
|
+
const out = { ...operation };
|
|
141
|
+
out["parameters"] = lowerParameters(out["parameters"]);
|
|
142
|
+
if (out["parameters"] === void 0) delete out["parameters"];
|
|
143
|
+
if (isPlainObject(out["requestBody"])) out["requestBody"] = withSchema(out["requestBody"]);
|
|
144
|
+
if (isPlainObject(out["responses"])) out["responses"] = mapEntries(out["responses"], withSchema);
|
|
145
|
+
return out;
|
|
146
|
+
};
|
|
147
|
+
const PATH_ITEM_LISTS = /* @__PURE__ */ new Set(["parameters"]);
|
|
148
|
+
const lowerPathItem = (item) => {
|
|
149
|
+
const out = {};
|
|
150
|
+
for (const [key, value] of Object.entries(item)) if (PATH_ITEM_LISTS.has(key)) out[key] = lowerParameters(value);
|
|
151
|
+
else if (isPlainObject(value) && !key.startsWith("x-") && key !== "servers") out[key] = lowerOperation$1(value);
|
|
152
|
+
else out[key] = value;
|
|
153
|
+
return out;
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Lowers every Schema Object position of an OpenAPI document to the 3.0
|
|
157
|
+
* dialect.
|
|
158
|
+
*/
|
|
159
|
+
function lowerDocumentSchemas30(document) {
|
|
160
|
+
const out = { ...document };
|
|
161
|
+
if (isPlainObject(out["paths"])) out["paths"] = mapEntries(out["paths"], lowerPathItem);
|
|
162
|
+
const components = out["components"];
|
|
163
|
+
if (isPlainObject(components)) {
|
|
164
|
+
const lowered = {
|
|
165
|
+
...components,
|
|
166
|
+
schemas: mapEntries(components["schemas"], toOpenApi30Schema)
|
|
167
|
+
};
|
|
168
|
+
for (const key of [
|
|
169
|
+
"responses",
|
|
170
|
+
"parameters",
|
|
171
|
+
"requestBodies",
|
|
172
|
+
"headers"
|
|
173
|
+
]) if (isPlainObject(components[key])) lowered[key] = mapEntries(components[key], withSchema);
|
|
174
|
+
if (lowered["schemas"] === void 0) delete lowered["schemas"];
|
|
175
|
+
out["components"] = lowered;
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
//#endregion
|
|
180
|
+
//#region src/openapi/types.ts
|
|
181
|
+
/** The `openapi` field `3.3-preview` emits, as in the v3.3-dev branch. */
|
|
182
|
+
const OPENAPI_33_PREVIEW_VERSION = "3.3.0";
|
|
183
|
+
/** The file name `openapiFormat` writes for every version. */
|
|
184
|
+
const OPENAPI_FILE_NAME = "openapi.json";
|
|
185
|
+
//#endregion
|
|
186
|
+
//#region src/openapi/format.ts
|
|
187
|
+
const DIALECT = "https://json-schema.org/draft/2020-12/schema";
|
|
188
|
+
const OPENAPI_FIELD = {
|
|
189
|
+
"3.0": SPEC_PINS.openapi30,
|
|
190
|
+
"3.1": SPEC_PINS.openapi31,
|
|
191
|
+
"3.2": SPEC_PINS.openapi32,
|
|
192
|
+
"3.3-preview": OPENAPI_33_PREVIEW_VERSION
|
|
193
|
+
};
|
|
194
|
+
/** Path Item fields that hold an Operation Object. */
|
|
195
|
+
const METHODS = /* @__PURE__ */ new Set([
|
|
196
|
+
"get",
|
|
197
|
+
"put",
|
|
198
|
+
"post",
|
|
199
|
+
"delete",
|
|
200
|
+
"options",
|
|
201
|
+
"head",
|
|
202
|
+
"patch",
|
|
203
|
+
"trace",
|
|
204
|
+
"query"
|
|
205
|
+
]);
|
|
206
|
+
const omitUndefined$2 = (value) => Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== void 0));
|
|
207
|
+
function lowerContent(content, features) {
|
|
208
|
+
return Object.fromEntries(Object.entries(content).map(([type, media]) => [type, omitUndefined$2({
|
|
209
|
+
schema: media.schema,
|
|
210
|
+
[features.native32 ? "itemSchema" : "x-oai-itemSchema"]: media.itemSchema,
|
|
211
|
+
examples: media.examples ? Object.fromEntries(Object.entries(media.examples).map(([name, example]) => [name, omitUndefined$2({ ...example })])) : void 0
|
|
212
|
+
})]));
|
|
213
|
+
}
|
|
214
|
+
function lowerResponse(response, features) {
|
|
215
|
+
return omitUndefined$2({
|
|
216
|
+
[features.native32 ? "summary" : "x-oai-summary"]: response.summary,
|
|
217
|
+
description: response.description,
|
|
218
|
+
headers: response.headers ? Object.fromEntries(Object.entries(response.headers).map(([name, header]) => [name, omitUndefined$2({ ...header })])) : void 0,
|
|
219
|
+
content: response.content ? lowerContent(response.content, features) : void 0
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
const lowerResponseOrRef = (response, features) => "ref" in response ? { $ref: `#/components/responses/${response.ref}` } : lowerResponse(response, features);
|
|
223
|
+
const lowerParameter = (parameter) => omitUndefined$2({ ...parameter });
|
|
224
|
+
function lowerSecurity(requirements, features) {
|
|
225
|
+
return requirements.filter((requirement) => Object.keys(requirement).every((name) => !features.dropped.has(name))).map((requirement) => ({ ...requirement }));
|
|
226
|
+
}
|
|
227
|
+
function lowerScheme$1(scheme, features) {
|
|
228
|
+
switch (scheme.type) {
|
|
229
|
+
case "http":
|
|
230
|
+
case "apiKey":
|
|
231
|
+
case "openIdConnect": return omitUndefined$2({ ...scheme });
|
|
232
|
+
case "oauth2": {
|
|
233
|
+
const { metadataUrl, ...rest } = scheme;
|
|
234
|
+
return omitUndefined$2({
|
|
235
|
+
...rest,
|
|
236
|
+
[features.native32 ? "oauth2MetadataUrl" : `${features.prefix}oauth2MetadataUrl`]: metadataUrl
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
case "profile": return features.is33 ? omitUndefined$2({ ...scheme }) : void 0;
|
|
240
|
+
default: return scheme;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function lowerOperation(operation, features) {
|
|
244
|
+
return omitUndefined$2({
|
|
245
|
+
operationId: operation.id,
|
|
246
|
+
summary: operation.summary,
|
|
247
|
+
description: operation.description,
|
|
248
|
+
tags: operation.tags.length > 0 ? [...operation.tags] : void 0,
|
|
249
|
+
deprecated: operation.deprecated,
|
|
250
|
+
parameters: operation.parameters.length > 0 ? operation.parameters.map(lowerParameter) : void 0,
|
|
251
|
+
requestBody: operation.requestBody ? omitUndefined$2({
|
|
252
|
+
description: operation.requestBody.description,
|
|
253
|
+
required: operation.requestBody.required,
|
|
254
|
+
content: lowerContent(operation.requestBody.content, features)
|
|
255
|
+
}) : void 0,
|
|
256
|
+
responses: Object.fromEntries(Object.entries(operation.responses).map(([status, response]) => [status, lowerResponseOrRef(response, features)])),
|
|
257
|
+
servers: operation.servers ? lowerServers(operation.servers, features) : void 0,
|
|
258
|
+
security: operation.security ? lowerSecurity(operation.security, features) : void 0,
|
|
259
|
+
...operation.extensions
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function lowerServers(servers, features) {
|
|
263
|
+
return servers.length > 0 ? servers.map((server) => omitUndefined$2({
|
|
264
|
+
url: server.url,
|
|
265
|
+
description: server.description,
|
|
266
|
+
[features.native32 ? "name" : "x-oai-name"]: server.name
|
|
267
|
+
})) : void 0;
|
|
268
|
+
}
|
|
269
|
+
const sameJson = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
270
|
+
/**
|
|
271
|
+
* Builds one Path Item. Path parameters every operation shares move to the Path
|
|
272
|
+
* Item; in 3.3 a `security` every operation shares does too.
|
|
273
|
+
*/
|
|
274
|
+
function pathItem(operations, features) {
|
|
275
|
+
const pathParameters = (operation) => Array.isArray(operation["parameters"]) ? operation["parameters"].filter((parameter) => isPlainObject(parameter) && parameter["in"] === "path") : [];
|
|
276
|
+
const first = operations[0];
|
|
277
|
+
const shared = first ? pathParameters(first.operation) : [];
|
|
278
|
+
const hoist = shared.length > 0 && operations.every(({ operation }) => sameJson(pathParameters(operation), shared));
|
|
279
|
+
const firstSecurity = first?.operation["security"];
|
|
280
|
+
const hoistSecurity = features.is33 && firstSecurity !== void 0 && operations.every(({ operation }) => sameJson(operation["security"], firstSecurity));
|
|
281
|
+
const item = {};
|
|
282
|
+
if (hoist) item["parameters"] = shared;
|
|
283
|
+
if (hoistSecurity) item["security"] = firstSecurity;
|
|
284
|
+
for (const { method, operation } of operations) {
|
|
285
|
+
const out = { ...operation };
|
|
286
|
+
if (hoist) {
|
|
287
|
+
const rest = Array.isArray(out["parameters"]) ? out["parameters"].filter((parameter) => !isPlainObject(parameter) || parameter["in"] !== "path") : [];
|
|
288
|
+
if (rest.length > 0) out["parameters"] = rest;
|
|
289
|
+
else delete out["parameters"];
|
|
290
|
+
}
|
|
291
|
+
if (hoistSecurity) delete out["security"];
|
|
292
|
+
item[method] = out;
|
|
293
|
+
}
|
|
294
|
+
return item;
|
|
295
|
+
}
|
|
296
|
+
const STANDARD_WEBHOOK_HEADERS$1 = [
|
|
297
|
+
{
|
|
298
|
+
name: "webhook-id",
|
|
299
|
+
in: "header",
|
|
300
|
+
required: true,
|
|
301
|
+
description: "Unique message id; the same on every retry.",
|
|
302
|
+
schema: { type: "string" }
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: "webhook-timestamp",
|
|
306
|
+
in: "header",
|
|
307
|
+
required: true,
|
|
308
|
+
description: "Unix time in seconds when the message was sent.",
|
|
309
|
+
schema: {
|
|
310
|
+
type: "string",
|
|
311
|
+
pattern: "^[0-9]+$"
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: "webhook-signature",
|
|
316
|
+
in: "header",
|
|
317
|
+
required: true,
|
|
318
|
+
description: "Space-separated signatures of `id.timestamp.body`, each `v1,<base64>`.",
|
|
319
|
+
schema: { type: "string" }
|
|
320
|
+
}
|
|
321
|
+
];
|
|
322
|
+
function lowerWebhook(webhook) {
|
|
323
|
+
return { post: omitUndefined$2({
|
|
324
|
+
operationId: `on${pascal(webhook.id.replaceAll(".", "_"))}`,
|
|
325
|
+
summary: webhook.summary,
|
|
326
|
+
description: webhook.description,
|
|
327
|
+
parameters: webhook.standardWebhooks ? STANDARD_WEBHOOK_HEADERS$1.map((header) => ({ ...header })) : void 0,
|
|
328
|
+
requestBody: {
|
|
329
|
+
required: true,
|
|
330
|
+
content: { "application/json": { schema: webhook.payload } }
|
|
331
|
+
},
|
|
332
|
+
responses: { "2XX": { description: "The receiver accepted the event." } }
|
|
333
|
+
}) };
|
|
334
|
+
}
|
|
335
|
+
function lowerTags(model, features) {
|
|
336
|
+
return model.tags.map((tag) => features.native32 ? omitUndefined$2({ ...tag }) : omitUndefined$2({
|
|
337
|
+
name: tag.name,
|
|
338
|
+
description: tag.description,
|
|
339
|
+
[`${features.prefix}summary`]: tag.summary,
|
|
340
|
+
[`${features.prefix}parent`]: tag.parent,
|
|
341
|
+
[`${features.prefix}kind`]: tag.kind
|
|
342
|
+
}));
|
|
343
|
+
}
|
|
344
|
+
function lowerOpenApi(model, version, ctx) {
|
|
345
|
+
const is33 = version === "3.3-preview";
|
|
346
|
+
const dropped = new Set(is33 ? [] : Object.entries(model.securitySchemes).filter(([, scheme]) => scheme.type === "profile").map(([name]) => name));
|
|
347
|
+
const features = {
|
|
348
|
+
version,
|
|
349
|
+
native32: version === "3.2" || is33,
|
|
350
|
+
is30: version === "3.0",
|
|
351
|
+
is33,
|
|
352
|
+
prefix: model.extensionPrefix,
|
|
353
|
+
dropped
|
|
354
|
+
};
|
|
355
|
+
for (const name of dropped) ctx.report({
|
|
356
|
+
code: "preview-only",
|
|
357
|
+
severity: "info",
|
|
358
|
+
message: `Security scheme "${name}" uses Security Profiles, which only 3.3-preview emits; it and the requirements that name it are left out`,
|
|
359
|
+
pointer: `/components/securitySchemes/${pointerToken(name)}`
|
|
360
|
+
});
|
|
361
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
362
|
+
const placed = [];
|
|
363
|
+
for (const operation of model.operations) {
|
|
364
|
+
if (operation.method === "query" && !features.native32) {
|
|
365
|
+
ctx.report({
|
|
366
|
+
code: "method-unsupported",
|
|
367
|
+
severity: "warning",
|
|
368
|
+
message: `Operation "${operation.id}" uses the QUERY method, which OpenAPI ${version} cannot describe; it is left out`,
|
|
369
|
+
pointer: `/paths/${pointerToken(operation.path)}`
|
|
370
|
+
});
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
const list = grouped.get(operation.path) ?? [];
|
|
374
|
+
list.push({
|
|
375
|
+
method: operation.method,
|
|
376
|
+
operation: lowerOperation(operation, features)
|
|
377
|
+
});
|
|
378
|
+
grouped.set(operation.path, list);
|
|
379
|
+
placed.push(operation);
|
|
380
|
+
}
|
|
381
|
+
const paths = {};
|
|
382
|
+
for (const [path, operations] of grouped) paths[path] = pathItem(operations, features);
|
|
383
|
+
const securitySchemes = {};
|
|
384
|
+
for (const [name, scheme] of Object.entries(model.securitySchemes)) {
|
|
385
|
+
const lowered = lowerScheme$1(scheme, features);
|
|
386
|
+
if (lowered) securitySchemes[name] = lowered;
|
|
387
|
+
}
|
|
388
|
+
const components = {
|
|
389
|
+
schemas: structuredClone(model.schemas),
|
|
390
|
+
responses: Object.fromEntries(Object.entries(model.responses).map(([name, response]) => [name, lowerResponse(response, features)])),
|
|
391
|
+
securitySchemes
|
|
392
|
+
};
|
|
393
|
+
if (is33 && model.securityProfileRequirements) components["securityProfileRequirements"] = structuredClone(model.securityProfileRequirements);
|
|
394
|
+
let webhooks;
|
|
395
|
+
if (model.webhooks.length > 0) {
|
|
396
|
+
if (features.is30) ctx.report({
|
|
397
|
+
code: "webhooks-unsupported",
|
|
398
|
+
severity: "warning",
|
|
399
|
+
message: `OpenAPI 3.0 has no webhooks; ${model.webhooks.length} webhook(s) are left out`
|
|
400
|
+
});
|
|
401
|
+
else webhooks = Object.fromEntries(model.webhooks.map((webhook) => [webhook.id, lowerWebhook(webhook)]));
|
|
402
|
+
}
|
|
403
|
+
const info = features.is30 ? omitUndefined$2({
|
|
404
|
+
...model.info,
|
|
405
|
+
summary: void 0,
|
|
406
|
+
license: model.info.license ? omitUndefined$2({
|
|
407
|
+
...model.info.license,
|
|
408
|
+
identifier: void 0
|
|
409
|
+
}) : void 0
|
|
410
|
+
}) : omitUndefined$2({ ...model.info });
|
|
411
|
+
let document = omitUndefined$2({
|
|
412
|
+
openapi: OPENAPI_FIELD[version],
|
|
413
|
+
[features.native32 ? "$self" : "x-oai-$self"]: model.self,
|
|
414
|
+
info: structuredClone(info),
|
|
415
|
+
jsonSchemaDialect: features.is30 ? void 0 : DIALECT,
|
|
416
|
+
servers: lowerServers(model.servers, features),
|
|
417
|
+
tags: lowerTags(model, features),
|
|
418
|
+
security: lowerSecurity(model.security, features),
|
|
419
|
+
paths,
|
|
420
|
+
webhooks,
|
|
421
|
+
components,
|
|
422
|
+
[`${features.prefix}preview`]: is33 ? SPEC_PINS.openapi33Preview : void 0
|
|
423
|
+
});
|
|
424
|
+
for (const [index, fragment] of model.fragments.entries()) document = mergeJson(document, fragment, (pointer) => {
|
|
425
|
+
ctx.report({
|
|
426
|
+
code: "fragment-conflict",
|
|
427
|
+
severity: "warning",
|
|
428
|
+
message: `Fragment ${index} replaces a generated value`,
|
|
429
|
+
pointer
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
for (const operation of placed) {
|
|
433
|
+
if (!operation.extend) continue;
|
|
434
|
+
const patch = { paths: { [operation.path]: { [operation.method]: operation.extend } } };
|
|
435
|
+
document = mergeJson(document, patch);
|
|
436
|
+
}
|
|
437
|
+
if (features.is30) document = lowerDocumentSchemas30(document);
|
|
438
|
+
if (!isOpenApiDocument(document)) throw new TypeError("better-supabase/spec: a fragment removed a required document field");
|
|
439
|
+
return document;
|
|
440
|
+
}
|
|
441
|
+
/** The fields every OpenAPI document this format renders has. */
|
|
442
|
+
function isOpenApiDocument(value) {
|
|
443
|
+
return typeof value["openapi"] === "string" && isPlainObject(value["info"]) && isPlainObject(value["paths"]) && isPlainObject(value["components"]) && Array.isArray(value["tags"]) && Array.isArray(value["security"]);
|
|
444
|
+
}
|
|
445
|
+
const PATH_PARAM = /\{([^}]+)\}/g;
|
|
446
|
+
function resolves(document, ref) {
|
|
447
|
+
if (!ref.startsWith("#")) return true;
|
|
448
|
+
let node = document;
|
|
449
|
+
for (const raw of ref.slice(2).split("/")) {
|
|
450
|
+
if (raw === "" && ref === "#") break;
|
|
451
|
+
const key = raw.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
452
|
+
if (Array.isArray(node)) node = node[Number(key)];
|
|
453
|
+
else if (isPlainObject(node)) node = node[key];
|
|
454
|
+
else return false;
|
|
455
|
+
if (node === void 0) return false;
|
|
456
|
+
}
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
function collectRefs$1(value, pointer, out) {
|
|
460
|
+
if (Array.isArray(value)) for (const [index, item] of value.entries()) collectRefs$1(item, `${pointer}/${index}`, out);
|
|
461
|
+
else if (isPlainObject(value)) for (const [key, item] of Object.entries(value)) if (key === "$ref" && typeof item === "string") out.push([pointer, item]);
|
|
462
|
+
else collectRefs$1(item, `${pointer}/${pointerToken(key)}`, out);
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* The keys of `value[key]` when it is an object; documents read from disk may
|
|
466
|
+
* omit any field.
|
|
467
|
+
*/
|
|
468
|
+
function keysAt(value, key) {
|
|
469
|
+
if (!isPlainObject(value)) return [];
|
|
470
|
+
const child = value[key];
|
|
471
|
+
return isPlainObject(child) ? Object.keys(child) : [];
|
|
472
|
+
}
|
|
473
|
+
function lintOpenApi(document) {
|
|
474
|
+
const diagnostics = [];
|
|
475
|
+
const ids = /* @__PURE__ */ new Map();
|
|
476
|
+
const components = document.components;
|
|
477
|
+
const schemes = new Set(keysAt(components, "securitySchemes"));
|
|
478
|
+
const checkSecurity = (requirements, pointer) => {
|
|
479
|
+
if (!Array.isArray(requirements)) return;
|
|
480
|
+
const list = requirements;
|
|
481
|
+
for (const requirement of list) {
|
|
482
|
+
if (!isPlainObject(requirement)) continue;
|
|
483
|
+
for (const name of Object.keys(requirement)) if (!schemes.has(name)) diagnostics.push({
|
|
484
|
+
code: "security-unresolved",
|
|
485
|
+
severity: "error",
|
|
486
|
+
message: `Security requirement names an unknown scheme "${name}"`,
|
|
487
|
+
pointer
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
};
|
|
491
|
+
checkSecurity(document.security, "/security");
|
|
492
|
+
const paths = document.paths;
|
|
493
|
+
for (const [path, item] of Object.entries(isPlainObject(paths) ? paths : {})) {
|
|
494
|
+
if (!isPlainObject(item)) continue;
|
|
495
|
+
const base = `/paths/${pointerToken(path)}`;
|
|
496
|
+
const templated = new Set([...path.matchAll(PATH_PARAM)].map((match) => match[1] ?? ""));
|
|
497
|
+
const shared = Array.isArray(item["parameters"]) ? item["parameters"] : [];
|
|
498
|
+
checkSecurity(item["security"], `${base}/security`);
|
|
499
|
+
for (const [method, operation] of Object.entries(item)) {
|
|
500
|
+
if (!METHODS.has(method) || !isPlainObject(operation)) continue;
|
|
501
|
+
const pointer = `${base}/${method}`;
|
|
502
|
+
const id = operation["operationId"];
|
|
503
|
+
if (typeof id === "string") {
|
|
504
|
+
const seen = ids.get(id);
|
|
505
|
+
if (seen) diagnostics.push({
|
|
506
|
+
code: "operation-id-duplicate",
|
|
507
|
+
severity: "error",
|
|
508
|
+
message: `operationId "${id}" is also used at ${seen}`,
|
|
509
|
+
pointer
|
|
510
|
+
});
|
|
511
|
+
else ids.set(id, pointer);
|
|
512
|
+
}
|
|
513
|
+
checkSecurity(operation["security"], `${pointer}/security`);
|
|
514
|
+
const own = Array.isArray(operation["parameters"]) ? operation["parameters"] : [];
|
|
515
|
+
const declared = /* @__PURE__ */ new Set();
|
|
516
|
+
for (const parameter of [...shared, ...own]) {
|
|
517
|
+
if (!isPlainObject(parameter) || parameter["in"] !== "path") continue;
|
|
518
|
+
const name = String(parameter["name"]);
|
|
519
|
+
declared.add(name);
|
|
520
|
+
if (!templated.has(name)) diagnostics.push({
|
|
521
|
+
code: "path-param-unknown",
|
|
522
|
+
severity: "error",
|
|
523
|
+
message: `Path parameter "${name}" is not in the path template`,
|
|
524
|
+
pointer
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
for (const name of templated) if (!declared.has(name)) diagnostics.push({
|
|
528
|
+
code: "path-param-missing",
|
|
529
|
+
severity: "error",
|
|
530
|
+
message: `Path template parameter "${name}" has no parameter`,
|
|
531
|
+
pointer
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
const refs = [];
|
|
536
|
+
collectRefs$1(document, "", refs);
|
|
537
|
+
for (const [pointer, ref] of refs) if (!resolves(document, ref)) diagnostics.push({
|
|
538
|
+
code: "ref-unresolved",
|
|
539
|
+
severity: "error",
|
|
540
|
+
message: `$ref "${ref}" does not resolve inside the document`,
|
|
541
|
+
pointer
|
|
542
|
+
});
|
|
543
|
+
return diagnostics;
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* OpenAPI as a `DocumentFormat`. 3.1 is the default; 3.0 is legacy (schemas
|
|
547
|
+
* lowered to the 3.0 Schema Object); 3.2 has native `$self`, nested tags,
|
|
548
|
+
* `itemSchema`, `oauth2MetadataUrl` and `query`; `3.3-preview` follows the
|
|
549
|
+
* v3.3-dev branch at `SPEC_PINS.openapi33Preview`, with Path Item `security`
|
|
550
|
+
* and the Security Profiles proposal. Below 3.2, the 3.2 fields travel as the
|
|
551
|
+
* registered `x-oai-*` extensions where one exists, and as the model's prefixed
|
|
552
|
+
* extensions otherwise.
|
|
553
|
+
*/
|
|
554
|
+
const openapiFormat = defineDocumentFormat({
|
|
555
|
+
id: "openapi",
|
|
556
|
+
versions: {
|
|
557
|
+
"3.0": {
|
|
558
|
+
pin: SPEC_PINS.openapi30,
|
|
559
|
+
status: "legacy"
|
|
560
|
+
},
|
|
561
|
+
"3.1": {
|
|
562
|
+
pin: SPEC_PINS.openapi31,
|
|
563
|
+
status: "stable"
|
|
564
|
+
},
|
|
565
|
+
"3.2": {
|
|
566
|
+
pin: SPEC_PINS.openapi32,
|
|
567
|
+
status: "stable"
|
|
568
|
+
},
|
|
569
|
+
"3.3-preview": {
|
|
570
|
+
pin: SPEC_PINS.openapi33Preview,
|
|
571
|
+
status: "preview"
|
|
572
|
+
}
|
|
573
|
+
},
|
|
574
|
+
defaultVersion: "3.1",
|
|
575
|
+
lower: lowerOpenApi,
|
|
576
|
+
lint: lintOpenApi,
|
|
577
|
+
fileName: () => OPENAPI_FILE_NAME
|
|
578
|
+
});
|
|
579
|
+
//#endregion
|
|
580
|
+
//#region src/spec/api.ts
|
|
581
|
+
function dedupe(diagnostics) {
|
|
582
|
+
const seen = /* @__PURE__ */ new Set();
|
|
583
|
+
return diagnostics.filter((diagnostic) => {
|
|
584
|
+
const key = `${diagnostic.code}\u0000${diagnostic.pointer ?? ""}\u0000${diagnostic.message}`;
|
|
585
|
+
if (seen.has(key)) return false;
|
|
586
|
+
seen.add(key);
|
|
587
|
+
return true;
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* The API model for a `defineSupabase()` result, and the documents it renders.
|
|
592
|
+
* The model is built once per options object; each format and version is
|
|
593
|
+
* lowered once and copied for every render.
|
|
594
|
+
*
|
|
595
|
+
* ```ts
|
|
596
|
+
* const api = defineApi(betterSupabase, {
|
|
597
|
+
* info: { title: "CRM API", version: "1.0.0" },
|
|
598
|
+
* resources: { customers: { list: customerList } },
|
|
599
|
+
* });
|
|
600
|
+
* ```
|
|
601
|
+
*
|
|
602
|
+
* Without `resources` it publishes every table, and without `blocks` every
|
|
603
|
+
* block instance `betterSupabase.blocks(set)` registered:
|
|
604
|
+
*
|
|
605
|
+
* ```ts
|
|
606
|
+
* const api = defineApi(betterSupabase, { info, basePath: "/api" });
|
|
607
|
+
* export const { procedures } = bsb.router(api, { meta: openapi });
|
|
608
|
+
* const { document } = api.openapi({ version: "3.2" });
|
|
609
|
+
* ```
|
|
610
|
+
*/
|
|
611
|
+
function defineApi(source, options) {
|
|
612
|
+
const built = buildApiModel(source, options);
|
|
613
|
+
const lowered = /* @__PURE__ */ new WeakMap();
|
|
614
|
+
const lower = (format, version) => {
|
|
615
|
+
let byVersion = lowered.get(format);
|
|
616
|
+
if (!byVersion) {
|
|
617
|
+
byVersion = /* @__PURE__ */ new Map();
|
|
618
|
+
lowered.set(format, byVersion);
|
|
619
|
+
}
|
|
620
|
+
let hit = byVersion.get(version);
|
|
621
|
+
if (!hit) {
|
|
622
|
+
const diagnostics = [];
|
|
623
|
+
hit = {
|
|
624
|
+
document: format.lower(built.model, version, { report: (diagnostic) => {
|
|
625
|
+
diagnostics.push(diagnostic);
|
|
626
|
+
} }),
|
|
627
|
+
diagnostics
|
|
628
|
+
};
|
|
629
|
+
byVersion.set(version, hit);
|
|
630
|
+
}
|
|
631
|
+
return hit;
|
|
632
|
+
};
|
|
633
|
+
const render = (format, renderOptions = {}) => {
|
|
634
|
+
const fallback = format.defaultVersion;
|
|
635
|
+
const version = renderOptions.version ?? fallback;
|
|
636
|
+
const status = format.versions[version];
|
|
637
|
+
if (!status) throw new TypeError(`Document format "${format.id}" has no version "${String(version)}"`);
|
|
638
|
+
const diagnostics = [...built.diagnostics];
|
|
639
|
+
if (status.status === "preview") diagnostics.push({
|
|
640
|
+
code: "preview-version",
|
|
641
|
+
severity: "warning",
|
|
642
|
+
message: `${format.id} ${String(version)} follows a draft (${status.pin}); its fields may change before release`
|
|
643
|
+
});
|
|
644
|
+
const base = lower(format, version);
|
|
645
|
+
diagnostics.push(...base.diagnostics);
|
|
646
|
+
let document = structuredClone(base.document);
|
|
647
|
+
if (renderOptions.transform) {
|
|
648
|
+
const rendered = {
|
|
649
|
+
format: format.id,
|
|
650
|
+
version,
|
|
651
|
+
document
|
|
652
|
+
};
|
|
653
|
+
document = renderOptions.transform(rendered) ?? document;
|
|
654
|
+
}
|
|
655
|
+
const overlays = renderOptions.overlays ?? [];
|
|
656
|
+
if (overlays.length > 0) {
|
|
657
|
+
const engine = renderOptions.applyOverlays ?? options.applyOverlays;
|
|
658
|
+
if (!engine) throw new TypeError("better-supabase/spec: overlays need applyOverlays (from better-supabase/spec)");
|
|
659
|
+
const result = engine(document, overlays);
|
|
660
|
+
document = result.document;
|
|
661
|
+
diagnostics.push(...result.diagnostics ?? []);
|
|
662
|
+
}
|
|
663
|
+
diagnostics.push(...format.lint?.(document, version) ?? []);
|
|
664
|
+
return {
|
|
665
|
+
format: format.id,
|
|
666
|
+
version,
|
|
667
|
+
document,
|
|
668
|
+
diagnostics: dedupe(diagnostics),
|
|
669
|
+
fileName: format.fileName(version)
|
|
670
|
+
};
|
|
671
|
+
};
|
|
672
|
+
return {
|
|
673
|
+
model: built.model,
|
|
674
|
+
basePath: (options.basePath ?? "").replace(/\/$/, ""),
|
|
675
|
+
resources: publishedResources(source.meta, options),
|
|
676
|
+
blocks: publishedBlocks(source.options?.blocks, options.blocks),
|
|
677
|
+
diagnostics: built.diagnostics,
|
|
678
|
+
render,
|
|
679
|
+
openapi(openapiOptions = {}) {
|
|
680
|
+
const { transform, version, overlays, applyOverlays } = openapiOptions;
|
|
681
|
+
const renderOptions = {
|
|
682
|
+
...version === void 0 ? {} : { version },
|
|
683
|
+
...overlays === void 0 ? {} : { overlays },
|
|
684
|
+
...applyOverlays === void 0 ? {} : { applyOverlays },
|
|
685
|
+
...transform === void 0 ? {} : { transform: (rendered) => transform(rendered) }
|
|
686
|
+
};
|
|
687
|
+
const result = render(openapiFormat, renderOptions);
|
|
688
|
+
return {
|
|
689
|
+
format: "openapi",
|
|
690
|
+
version: result.version,
|
|
691
|
+
document: result.document,
|
|
692
|
+
diagnostics: result.diagnostics,
|
|
693
|
+
fileName: result.fileName
|
|
694
|
+
};
|
|
695
|
+
}
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
//#endregion
|
|
6
699
|
//#region src/spec/function-route.ts
|
|
7
700
|
function isDescriptor(value) {
|
|
8
701
|
return typeof value === "object" && value !== null && "input" in value;
|
|
@@ -18,7 +711,7 @@ function descriptorOf(fn) {
|
|
|
18
711
|
* `basePath` goes in front of it like any other route.
|
|
19
712
|
*
|
|
20
713
|
* ```ts
|
|
21
|
-
* defineApi(
|
|
714
|
+
* defineApi(bsb, { routes: [functionRoute("send-invite", sendInvite)] });
|
|
22
715
|
* ```
|
|
23
716
|
*/
|
|
24
717
|
function functionRoute(name, fn, options = {}) {
|
|
@@ -388,4 +1081,1793 @@ function scalarPreset(document, options = {}) {
|
|
|
388
1081
|
return copy;
|
|
389
1082
|
}
|
|
390
1083
|
//#endregion
|
|
391
|
-
|
|
1084
|
+
//#region src/openapi/create.ts
|
|
1085
|
+
/**
|
|
1086
|
+
* An OpenAPI document for REST resources over your tables, with schemas from
|
|
1087
|
+
* the generated metadata, list-query parameters, Supabase security schemes and
|
|
1088
|
+
* Problem Details errors. Throws when building or checking the document finds
|
|
1089
|
+
* an error; use `defineApi` to read every finding instead.
|
|
1090
|
+
*
|
|
1091
|
+
* ```ts
|
|
1092
|
+
* const doc = createOpenApi(betterSupabase, {
|
|
1093
|
+
* info: { title: "CRM API", version: "1.0.0" },
|
|
1094
|
+
* resources: {
|
|
1095
|
+
* customers: { list: customerList },
|
|
1096
|
+
* notes: { operations: ["list", "get"] },
|
|
1097
|
+
* },
|
|
1098
|
+
* });
|
|
1099
|
+
* ```
|
|
1100
|
+
*/
|
|
1101
|
+
function createOpenApi(betterSupabase, options) {
|
|
1102
|
+
const { version, transform, overlays, onDiagnostic, ...apiOptions } = options;
|
|
1103
|
+
const api = defineApi(betterSupabase, apiOptions);
|
|
1104
|
+
const engine = options.applyOverlays;
|
|
1105
|
+
const result = api.openapi({
|
|
1106
|
+
...version === void 0 ? {} : { version },
|
|
1107
|
+
...transform === void 0 ? {} : { transform },
|
|
1108
|
+
...overlays === void 0 ? {} : { overlays },
|
|
1109
|
+
...engine === void 0 ? {} : { applyOverlays: engine }
|
|
1110
|
+
});
|
|
1111
|
+
const errors = result.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
|
|
1112
|
+
if (errors.length > 0) throw new TypeError(`createOpenApi: ${errors.map((error) => `${error.code}: ${error.message}${error.pointer ? ` (${error.pointer})` : ""}`).join("; ")}`);
|
|
1113
|
+
if (onDiagnostic) for (const diagnostic of result.diagnostics) onDiagnostic(diagnostic);
|
|
1114
|
+
return result.document;
|
|
1115
|
+
}
|
|
1116
|
+
//#endregion
|
|
1117
|
+
//#region src/asyncapi/types.ts
|
|
1118
|
+
/**
|
|
1119
|
+
* The file name `asyncapiFormat` writes; Arazzo source descriptions point at
|
|
1120
|
+
* it.
|
|
1121
|
+
*/
|
|
1122
|
+
const ASYNCAPI_FILE_NAME = "asyncapi.json";
|
|
1123
|
+
//#endregion
|
|
1124
|
+
//#region src/asyncapi/format.ts
|
|
1125
|
+
const ASYNCAPI_FIELD = {
|
|
1126
|
+
"3.0": SPEC_PINS.asyncapi30,
|
|
1127
|
+
"3.1": SPEC_PINS.asyncapi31
|
|
1128
|
+
};
|
|
1129
|
+
const SCHEMA_PREFIX = "#/components/schemas/";
|
|
1130
|
+
const KEY = /^[A-Za-z0-9_-]+$/;
|
|
1131
|
+
const PARAM = /\{([^}]+)\}/g;
|
|
1132
|
+
/** JSON Schema 2020-12 keywords the AsyncAPI Schema Object (draft-07) lacks. */
|
|
1133
|
+
const KEYWORDS_2020 = /* @__PURE__ */ new Set([
|
|
1134
|
+
"$defs",
|
|
1135
|
+
"$anchor",
|
|
1136
|
+
"$dynamicRef",
|
|
1137
|
+
"$dynamicAnchor",
|
|
1138
|
+
"prefixItems",
|
|
1139
|
+
"dependentSchemas",
|
|
1140
|
+
"dependentRequired",
|
|
1141
|
+
"unevaluatedProperties",
|
|
1142
|
+
"unevaluatedItems"
|
|
1143
|
+
]);
|
|
1144
|
+
/** The query Supabase Realtime reads on the websocket upgrade. */
|
|
1145
|
+
const WS_BINDING = { ws: {
|
|
1146
|
+
method: "GET",
|
|
1147
|
+
query: {
|
|
1148
|
+
type: "object",
|
|
1149
|
+
required: ["apikey"],
|
|
1150
|
+
properties: {
|
|
1151
|
+
apikey: {
|
|
1152
|
+
type: "string",
|
|
1153
|
+
description: "The project's publishable (anon) key."
|
|
1154
|
+
},
|
|
1155
|
+
vsn: {
|
|
1156
|
+
type: "string",
|
|
1157
|
+
description: "Realtime protocol version."
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
},
|
|
1161
|
+
bindingVersion: "0.1.0"
|
|
1162
|
+
} };
|
|
1163
|
+
const STANDARD_WEBHOOK_HEADERS = {
|
|
1164
|
+
type: "object",
|
|
1165
|
+
required: [
|
|
1166
|
+
"webhook-id",
|
|
1167
|
+
"webhook-timestamp",
|
|
1168
|
+
"webhook-signature"
|
|
1169
|
+
],
|
|
1170
|
+
properties: {
|
|
1171
|
+
"webhook-id": {
|
|
1172
|
+
type: "string",
|
|
1173
|
+
description: "Unique message id; the same on every retry."
|
|
1174
|
+
},
|
|
1175
|
+
"webhook-timestamp": {
|
|
1176
|
+
type: "string",
|
|
1177
|
+
pattern: "^[0-9]+$",
|
|
1178
|
+
description: "Unix time in seconds when the message was sent."
|
|
1179
|
+
},
|
|
1180
|
+
"webhook-signature": {
|
|
1181
|
+
type: "string",
|
|
1182
|
+
description: "Space-separated signatures of `id.timestamp.body`, each `v1,<base64>`."
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
};
|
|
1186
|
+
const omitUndefined$1 = (value) => Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== void 0));
|
|
1187
|
+
function collectRefs(value, out) {
|
|
1188
|
+
if (Array.isArray(value)) for (const item of value) collectRefs(item, out);
|
|
1189
|
+
else if (isPlainObject(value)) for (const [key, item] of Object.entries(value)) if (key === "$ref" && typeof item === "string") out.add(item);
|
|
1190
|
+
else collectRefs(item, out);
|
|
1191
|
+
}
|
|
1192
|
+
function uses2020(value) {
|
|
1193
|
+
if (Array.isArray(value)) return value.some(uses2020);
|
|
1194
|
+
if (!isPlainObject(value)) return false;
|
|
1195
|
+
return Object.entries(value).some(([key, item]) => KEYWORDS_2020.has(key) || uses2020(item));
|
|
1196
|
+
}
|
|
1197
|
+
/** Component names a set of values references, with everything they reference. */
|
|
1198
|
+
function referencedSchemas(model, roots) {
|
|
1199
|
+
const out = {};
|
|
1200
|
+
const pending = [];
|
|
1201
|
+
const visit = (value) => {
|
|
1202
|
+
const refs = /* @__PURE__ */ new Set();
|
|
1203
|
+
collectRefs(value, refs);
|
|
1204
|
+
for (const ref of refs) {
|
|
1205
|
+
if (!ref.startsWith(SCHEMA_PREFIX)) continue;
|
|
1206
|
+
const name = ref.slice(21).replaceAll("~1", "/").replaceAll("~0", "~");
|
|
1207
|
+
if (name in out || !model.schemas[name]) continue;
|
|
1208
|
+
out[name] = model.schemas[name];
|
|
1209
|
+
pending.push(name);
|
|
1210
|
+
}
|
|
1211
|
+
};
|
|
1212
|
+
for (const root of roots) visit(root);
|
|
1213
|
+
while (pending.length > 0) {
|
|
1214
|
+
const name = pending.pop();
|
|
1215
|
+
if (name !== void 0) visit(out[name]);
|
|
1216
|
+
}
|
|
1217
|
+
const sorted = {};
|
|
1218
|
+
for (const name of Object.keys(out).toSorted()) {
|
|
1219
|
+
const schema = out[name];
|
|
1220
|
+
if (schema) sorted[name] = structuredClone(schema);
|
|
1221
|
+
}
|
|
1222
|
+
return sorted;
|
|
1223
|
+
}
|
|
1224
|
+
function lowerScheme(name, scheme, ctx) {
|
|
1225
|
+
switch (scheme.type) {
|
|
1226
|
+
case "http": return omitUndefined$1({ ...scheme });
|
|
1227
|
+
case "apiKey": return omitUndefined$1({
|
|
1228
|
+
type: "httpApiKey",
|
|
1229
|
+
name: scheme.name,
|
|
1230
|
+
in: scheme.in,
|
|
1231
|
+
description: scheme.description
|
|
1232
|
+
});
|
|
1233
|
+
case "openIdConnect": return omitUndefined$1({ ...scheme });
|
|
1234
|
+
case "oauth2": {
|
|
1235
|
+
const flows = {};
|
|
1236
|
+
for (const [flow, value] of Object.entries(scheme.flows)) {
|
|
1237
|
+
const { scopes, ...rest } = value;
|
|
1238
|
+
flows[flow] = omitUndefined$1({
|
|
1239
|
+
...rest,
|
|
1240
|
+
availableScopes: { ...scopes }
|
|
1241
|
+
});
|
|
1242
|
+
}
|
|
1243
|
+
return omitUndefined$1({
|
|
1244
|
+
type: "oauth2",
|
|
1245
|
+
description: scheme.description,
|
|
1246
|
+
flows
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
1249
|
+
case "profile":
|
|
1250
|
+
ctx.report({
|
|
1251
|
+
code: "asyncapi-security-unsupported",
|
|
1252
|
+
severity: "info",
|
|
1253
|
+
message: `Security scheme "${name}" uses Security Profiles, which AsyncAPI cannot describe; it is left out`,
|
|
1254
|
+
pointer: `/components/securitySchemes/${pointerToken(name)}`
|
|
1255
|
+
});
|
|
1256
|
+
return;
|
|
1257
|
+
default: return scheme;
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
function lowerMessage(message, prefix) {
|
|
1261
|
+
return omitUndefined$1({
|
|
1262
|
+
name: message.name,
|
|
1263
|
+
title: message.title,
|
|
1264
|
+
summary: message.summary,
|
|
1265
|
+
description: message.description,
|
|
1266
|
+
contentType: message.contentType,
|
|
1267
|
+
headers: message.headers ? structuredClone(message.headers) : void 0,
|
|
1268
|
+
payload: structuredClone(message.payload),
|
|
1269
|
+
correlationId: message.correlationId ? { location: message.correlationId } : void 0,
|
|
1270
|
+
traits: message.traits?.map((trait) => ({ $ref: `#/components/messageTraits/${safeKey(trait)}` })),
|
|
1271
|
+
...Object.fromEntries(Object.entries(message.extensions ?? {}).map(([key, value]) => [key.startsWith("x-") ? key : `${prefix}${key}`, value]))
|
|
1272
|
+
});
|
|
1273
|
+
}
|
|
1274
|
+
function lowerTrait(trait) {
|
|
1275
|
+
return omitUndefined$1({
|
|
1276
|
+
...trait,
|
|
1277
|
+
headers: trait.headers ? structuredClone(trait.headers) : void 0
|
|
1278
|
+
});
|
|
1279
|
+
}
|
|
1280
|
+
function webhookMessage(webhook) {
|
|
1281
|
+
return {
|
|
1282
|
+
id: `webhook${safeKey(pascal(webhook.id))}`,
|
|
1283
|
+
name: webhook.id,
|
|
1284
|
+
title: webhook.id,
|
|
1285
|
+
...webhook.summary ? { summary: webhook.summary } : {},
|
|
1286
|
+
...webhook.description ? { description: webhook.description } : {},
|
|
1287
|
+
contentType: "application/json",
|
|
1288
|
+
...webhook.standardWebhooks ? { headers: STANDARD_WEBHOOK_HEADERS } : {},
|
|
1289
|
+
payload: webhook.payload
|
|
1290
|
+
};
|
|
1291
|
+
}
|
|
1292
|
+
/** A server from a URL: `host` and `pathname` split, the scheme as protocol. */
|
|
1293
|
+
function serverFrom(url, fields, wsDefault) {
|
|
1294
|
+
let parsed;
|
|
1295
|
+
try {
|
|
1296
|
+
parsed = new URL(url);
|
|
1297
|
+
} catch {
|
|
1298
|
+
return;
|
|
1299
|
+
}
|
|
1300
|
+
const scheme = parsed.protocol.slice(0, -1);
|
|
1301
|
+
const protocol = wsDefault ? scheme === "http" || scheme === "ws" ? "ws" : "wss" : scheme;
|
|
1302
|
+
const pathname = parsed.pathname === "/" ? void 0 : parsed.pathname;
|
|
1303
|
+
return omitUndefined$1({
|
|
1304
|
+
host: parsed.host,
|
|
1305
|
+
protocol,
|
|
1306
|
+
pathname,
|
|
1307
|
+
...fields
|
|
1308
|
+
});
|
|
1309
|
+
}
|
|
1310
|
+
function lowerAsyncApi(model, version, ctx) {
|
|
1311
|
+
const prefix = model.extensionPrefix;
|
|
1312
|
+
const keyOf = (id, where) => {
|
|
1313
|
+
if (KEY.test(id)) return id;
|
|
1314
|
+
const key = safeKey(id);
|
|
1315
|
+
ctx.report({
|
|
1316
|
+
code: "asyncapi-key-invalid",
|
|
1317
|
+
severity: "info",
|
|
1318
|
+
message: `${where} "${id}" is written as "${key}"; AsyncAPI keys allow letters, digits, "_" and "-"`
|
|
1319
|
+
});
|
|
1320
|
+
return key;
|
|
1321
|
+
};
|
|
1322
|
+
const securitySchemes = {};
|
|
1323
|
+
for (const [name, scheme] of Object.entries(model.securitySchemes)) {
|
|
1324
|
+
const lowered = lowerScheme(name, scheme, ctx);
|
|
1325
|
+
if (lowered) securitySchemes[safeKey(name)] = lowered;
|
|
1326
|
+
}
|
|
1327
|
+
const security = [];
|
|
1328
|
+
for (const requirement of model.security) {
|
|
1329
|
+
const names = Object.keys(requirement);
|
|
1330
|
+
if (names.length > 1) ctx.report({
|
|
1331
|
+
code: "asyncapi-security-combined",
|
|
1332
|
+
severity: "info",
|
|
1333
|
+
message: `A requirement that needs ${names.join(" and ")} together is listed as alternatives; AsyncAPI security lists have no AND`,
|
|
1334
|
+
pointer: "/security"
|
|
1335
|
+
});
|
|
1336
|
+
for (const name of names) {
|
|
1337
|
+
const key = safeKey(name);
|
|
1338
|
+
if (key in securitySchemes && !security.some((entry) => entry["$ref"] === `#/components/securitySchemes/${key}`)) security.push({ $ref: `#/components/securitySchemes/${key}` });
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
const webhookMessages = model.webhooks.map(webhookMessage);
|
|
1342
|
+
const allMessages = { ...model.messages };
|
|
1343
|
+
for (const message of webhookMessages) allMessages[message.id] = message;
|
|
1344
|
+
const channels = [...model.channels];
|
|
1345
|
+
if (webhookMessages.length > 0) channels.push({
|
|
1346
|
+
id: "webhooks",
|
|
1347
|
+
address: "",
|
|
1348
|
+
title: "Outgoing webhooks",
|
|
1349
|
+
description: "Webhooks the app sends to each receiver's URL, signed per Standard Webhooks when the headers are listed.",
|
|
1350
|
+
protocol: "http",
|
|
1351
|
+
messages: webhookMessages.map((message) => message.id),
|
|
1352
|
+
operations: model.webhooks.map((webhook, index) => ({
|
|
1353
|
+
id: `send${safeKey(pascal(webhook.id))}Webhook`,
|
|
1354
|
+
action: "send",
|
|
1355
|
+
...webhook.summary ? { summary: webhook.summary } : {},
|
|
1356
|
+
messages: [webhookMessages[index]?.id ?? webhook.id]
|
|
1357
|
+
}))
|
|
1358
|
+
});
|
|
1359
|
+
const servers = {};
|
|
1360
|
+
const wsServers = [];
|
|
1361
|
+
const httpServers = [];
|
|
1362
|
+
const hasWs = channels.some((channel) => channel.protocol === "ws");
|
|
1363
|
+
const hasHttp = channels.some((channel) => channel.protocol === "http");
|
|
1364
|
+
if (hasWs && model.realtimeUrl) {
|
|
1365
|
+
const server = serverFrom(model.realtimeUrl, {
|
|
1366
|
+
title: "Supabase Realtime",
|
|
1367
|
+
description: "The Realtime websocket. Private channels need the user's access token.",
|
|
1368
|
+
security: security.length > 0 ? security : void 0
|
|
1369
|
+
}, true);
|
|
1370
|
+
if (server) {
|
|
1371
|
+
servers["realtime"] = server;
|
|
1372
|
+
wsServers.push({ $ref: "#/servers/realtime" });
|
|
1373
|
+
} else ctx.report({
|
|
1374
|
+
code: "asyncapi-realtime-url-invalid",
|
|
1375
|
+
severity: "error",
|
|
1376
|
+
message: `realtimeUrl "${model.realtimeUrl}" is not an absolute URL`,
|
|
1377
|
+
pointer: "/servers/realtime"
|
|
1378
|
+
});
|
|
1379
|
+
} else if (hasWs) ctx.report({
|
|
1380
|
+
code: "asyncapi-server-missing",
|
|
1381
|
+
severity: "warning",
|
|
1382
|
+
message: "Realtime channels are described without a server; set realtimeUrl to add the Realtime websocket",
|
|
1383
|
+
pointer: "/servers"
|
|
1384
|
+
});
|
|
1385
|
+
if (hasHttp) for (const [index, entry] of model.servers.entries()) {
|
|
1386
|
+
const key = safeKey(entry.name ?? (index === 0 ? "api" : `api${String(index + 1)}`));
|
|
1387
|
+
const server = serverFrom(entry.url, omitUndefined$1({ description: entry.description }), false);
|
|
1388
|
+
if (!server || key in servers) continue;
|
|
1389
|
+
servers[key] = server;
|
|
1390
|
+
httpServers.push({ $ref: `#/servers/${key}` });
|
|
1391
|
+
}
|
|
1392
|
+
const messageKeys = /* @__PURE__ */ new Map();
|
|
1393
|
+
const messages = {};
|
|
1394
|
+
for (const [id, message] of Object.entries(allMessages)) {
|
|
1395
|
+
const key = keyOf(id, "Message");
|
|
1396
|
+
messageKeys.set(id, key);
|
|
1397
|
+
messages[key] = lowerMessage(message, prefix);
|
|
1398
|
+
if (uses2020(message.payload) || uses2020(message.headers)) ctx.report({
|
|
1399
|
+
code: "asyncapi-schema-dialect",
|
|
1400
|
+
severity: "warning",
|
|
1401
|
+
message: `Message "${id}" uses JSON Schema 2020-12 keywords that the AsyncAPI Schema Object (draft-07) does not define`,
|
|
1402
|
+
pointer: `/components/messages/${pointerToken(key)}`
|
|
1403
|
+
});
|
|
1404
|
+
}
|
|
1405
|
+
const channelObjects = {};
|
|
1406
|
+
const operations = {};
|
|
1407
|
+
const placed = [];
|
|
1408
|
+
const addOperation = (key, operation, pointer) => {
|
|
1409
|
+
if (key in operations) {
|
|
1410
|
+
ctx.report({
|
|
1411
|
+
code: "asyncapi-operation-id-duplicate",
|
|
1412
|
+
severity: "error",
|
|
1413
|
+
message: `Two operations have the id "${key}"; the first one is kept`,
|
|
1414
|
+
pointer
|
|
1415
|
+
});
|
|
1416
|
+
return;
|
|
1417
|
+
}
|
|
1418
|
+
operations[key] = operation;
|
|
1419
|
+
};
|
|
1420
|
+
for (const channel of channels) {
|
|
1421
|
+
const key = keyOf(channel.id, "Channel");
|
|
1422
|
+
if (key in channelObjects) {
|
|
1423
|
+
ctx.report({
|
|
1424
|
+
code: "asyncapi-channel-id-duplicate",
|
|
1425
|
+
severity: "error",
|
|
1426
|
+
message: `Two channels have the id "${key}"; the first one is kept`,
|
|
1427
|
+
pointer: `/channels/${pointerToken(key)}`
|
|
1428
|
+
});
|
|
1429
|
+
continue;
|
|
1430
|
+
}
|
|
1431
|
+
placed.push({
|
|
1432
|
+
key,
|
|
1433
|
+
channel
|
|
1434
|
+
});
|
|
1435
|
+
const channelMessages = {};
|
|
1436
|
+
for (const id of channel.messages) {
|
|
1437
|
+
const messageKey = messageKeys.get(id);
|
|
1438
|
+
if (messageKey === void 0) {
|
|
1439
|
+
ctx.report({
|
|
1440
|
+
code: "asyncapi-message-unknown",
|
|
1441
|
+
severity: "error",
|
|
1442
|
+
message: `Channel "${channel.id}" lists an unknown message "${id}"`,
|
|
1443
|
+
pointer: `/channels/${pointerToken(key)}/messages`
|
|
1444
|
+
});
|
|
1445
|
+
continue;
|
|
1446
|
+
}
|
|
1447
|
+
channelMessages[messageKey] = { $ref: `#/components/messages/${messageKey}` };
|
|
1448
|
+
}
|
|
1449
|
+
const names = [...channel.address.matchAll(PARAM)].map((match) => match[1] ?? "");
|
|
1450
|
+
const parameters = names.length > 0 ? Object.fromEntries(names.map((name) => [name, omitUndefined$1({ ...channel.parameters?.[name] })])) : void 0;
|
|
1451
|
+
const serverRefs = channel.protocol === "ws" ? wsServers : httpServers;
|
|
1452
|
+
channelObjects[key] = omitUndefined$1({
|
|
1453
|
+
address: channel.address === "" ? null : channel.address,
|
|
1454
|
+
title: channel.title,
|
|
1455
|
+
summary: channel.summary,
|
|
1456
|
+
description: channel.description,
|
|
1457
|
+
servers: serverRefs.length > 0 ? serverRefs.map((ref) => ({ ...ref })) : void 0,
|
|
1458
|
+
parameters,
|
|
1459
|
+
messages: channelMessages,
|
|
1460
|
+
bindings: channel.protocol === "ws" ? structuredClone(WS_BINDING) : void 0,
|
|
1461
|
+
...channel.extensions
|
|
1462
|
+
});
|
|
1463
|
+
for (const operation of channel.operations) {
|
|
1464
|
+
const operationKey = keyOf(operation.id, "Operation");
|
|
1465
|
+
const refs = [];
|
|
1466
|
+
for (const id of operation.messages ?? []) {
|
|
1467
|
+
const messageKey = messageKeys.get(id);
|
|
1468
|
+
if (messageKey === void 0 || !channel.messages.includes(id)) {
|
|
1469
|
+
ctx.report({
|
|
1470
|
+
code: "asyncapi-operation-message-unknown",
|
|
1471
|
+
severity: "error",
|
|
1472
|
+
message: `Operation "${operation.id}" lists "${id}", which is not a message of channel "${channel.id}"`,
|
|
1473
|
+
pointer: `/operations/${pointerToken(operationKey)}`
|
|
1474
|
+
});
|
|
1475
|
+
continue;
|
|
1476
|
+
}
|
|
1477
|
+
refs.push({ $ref: `#/channels/${key}/messages/${messageKey}` });
|
|
1478
|
+
}
|
|
1479
|
+
addOperation(operationKey, omitUndefined$1({
|
|
1480
|
+
action: operation.action,
|
|
1481
|
+
channel: { $ref: `#/channels/${key}` },
|
|
1482
|
+
summary: operation.summary,
|
|
1483
|
+
description: operation.description,
|
|
1484
|
+
messages: operation.messages ? refs : void 0,
|
|
1485
|
+
[`${prefix}permission`]: operation.permission,
|
|
1486
|
+
...operation.extensions
|
|
1487
|
+
}), `/operations/${pointerToken(operationKey)}`);
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
for (const operation of model.operations) {
|
|
1491
|
+
const emits = operation.extensions[`${prefix}emits`];
|
|
1492
|
+
if (!Array.isArray(emits)) continue;
|
|
1493
|
+
const byChannel = /* @__PURE__ */ new Map();
|
|
1494
|
+
for (const event of emits) {
|
|
1495
|
+
if (typeof event !== "string") continue;
|
|
1496
|
+
const target = placed.find(({ channel }) => channel.messages.some((id) => {
|
|
1497
|
+
const message = allMessages[id];
|
|
1498
|
+
return id === event || message?.name === event || message?.name?.endsWith(`.${event}`) === true;
|
|
1499
|
+
}));
|
|
1500
|
+
const id = target?.channel.messages.find((candidate) => {
|
|
1501
|
+
const message = allMessages[candidate];
|
|
1502
|
+
return candidate === event || message?.name === event || message?.name?.endsWith(`.${event}`) === true;
|
|
1503
|
+
});
|
|
1504
|
+
if (!target || id === void 0) {
|
|
1505
|
+
ctx.report({
|
|
1506
|
+
code: "asyncapi-emits-unknown",
|
|
1507
|
+
severity: "warning",
|
|
1508
|
+
message: `Operation "${operation.id}" emits "${event}", which no message describes`,
|
|
1509
|
+
pointer: `/operations/${pointerToken(operation.id)}`
|
|
1510
|
+
});
|
|
1511
|
+
continue;
|
|
1512
|
+
}
|
|
1513
|
+
const list = byChannel.get(target.key) ?? [];
|
|
1514
|
+
list.push(messageKeys.get(id) ?? id);
|
|
1515
|
+
byChannel.set(target.key, list);
|
|
1516
|
+
}
|
|
1517
|
+
const many = byChannel.size > 1;
|
|
1518
|
+
for (const [channelKey, keys] of byChannel) {
|
|
1519
|
+
const operationKey = safeKey(many ? `${operation.id}Emits${pascal(channelKey)}` : `${operation.id}Emits`);
|
|
1520
|
+
addOperation(operationKey, {
|
|
1521
|
+
action: "send",
|
|
1522
|
+
channel: { $ref: `#/channels/${channelKey}` },
|
|
1523
|
+
summary: `Events sent by ${operation.method.toUpperCase()} ${operation.path}`,
|
|
1524
|
+
messages: [...new Set(keys)].map((messageKey) => ({ $ref: `#/channels/${channelKey}/messages/${messageKey}` })),
|
|
1525
|
+
[`${prefix}operation`]: operation.id
|
|
1526
|
+
}, `/operations/${pointerToken(operationKey)}`);
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
const traits = {};
|
|
1530
|
+
for (const [name, trait] of Object.entries(model.messageTraits ?? {})) traits[safeKey(name)] = lowerTrait(trait);
|
|
1531
|
+
const schemas = referencedSchemas(model, [Object.values(messages), Object.values(traits)]);
|
|
1532
|
+
const { info } = model;
|
|
1533
|
+
const document = omitUndefined$1({
|
|
1534
|
+
asyncapi: ASYNCAPI_FIELD[version],
|
|
1535
|
+
info: omitUndefined$1({
|
|
1536
|
+
title: info.title,
|
|
1537
|
+
version: info.version,
|
|
1538
|
+
description: info.description ?? info.summary,
|
|
1539
|
+
termsOfService: info.termsOfService,
|
|
1540
|
+
contact: info.contact ? omitUndefined$1({ ...info.contact }) : void 0,
|
|
1541
|
+
license: info.license ? omitUndefined$1({
|
|
1542
|
+
name: info.license.name,
|
|
1543
|
+
url: info.license.url
|
|
1544
|
+
}) : void 0
|
|
1545
|
+
}),
|
|
1546
|
+
defaultContentType: "application/json",
|
|
1547
|
+
servers: Object.keys(servers).length > 0 ? servers : void 0,
|
|
1548
|
+
channels: channelObjects,
|
|
1549
|
+
operations,
|
|
1550
|
+
components: omitUndefined$1({
|
|
1551
|
+
schemas: Object.keys(schemas).length > 0 ? schemas : void 0,
|
|
1552
|
+
messages: Object.keys(messages).length > 0 ? messages : void 0,
|
|
1553
|
+
messageTraits: Object.keys(traits).length > 0 ? traits : void 0,
|
|
1554
|
+
securitySchemes: Object.keys(securitySchemes).length > 0 ? securitySchemes : void 0
|
|
1555
|
+
})
|
|
1556
|
+
});
|
|
1557
|
+
if (!isAsyncApiDocument(document)) throw new TypeError("better-supabase/spec: lowering lost a required field");
|
|
1558
|
+
return document;
|
|
1559
|
+
}
|
|
1560
|
+
function isAsyncApiDocument(value) {
|
|
1561
|
+
return typeof value["asyncapi"] === "string" && isPlainObject(value["info"]) && isPlainObject(value["channels"]) && isPlainObject(value["operations"]) && isPlainObject(value["components"]);
|
|
1562
|
+
}
|
|
1563
|
+
function resolve$1(document, ref) {
|
|
1564
|
+
if (!ref.startsWith("#/")) return;
|
|
1565
|
+
let node = document;
|
|
1566
|
+
for (const raw of ref.slice(2).split("/")) {
|
|
1567
|
+
const key = raw.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
1568
|
+
if (!isPlainObject(node)) return;
|
|
1569
|
+
node = node[key];
|
|
1570
|
+
}
|
|
1571
|
+
return node;
|
|
1572
|
+
}
|
|
1573
|
+
function refOf(value) {
|
|
1574
|
+
return isPlainObject(value) && typeof value["$ref"] === "string" ? value["$ref"] : void 0;
|
|
1575
|
+
}
|
|
1576
|
+
function lintAsyncApi(document) {
|
|
1577
|
+
const diagnostics = [];
|
|
1578
|
+
const refs = /* @__PURE__ */ new Set();
|
|
1579
|
+
collectRefs(document, refs);
|
|
1580
|
+
for (const ref of refs) if (ref.startsWith("#") && resolve$1(document, ref) === void 0) diagnostics.push({
|
|
1581
|
+
code: "asyncapi-ref-unresolved",
|
|
1582
|
+
severity: "error",
|
|
1583
|
+
message: `$ref "${ref}" does not resolve inside the document`
|
|
1584
|
+
});
|
|
1585
|
+
for (const [key, channel] of Object.entries(document.channels)) {
|
|
1586
|
+
const pointer = `/channels/${pointerToken(key)}`;
|
|
1587
|
+
if (!KEY.test(key)) diagnostics.push({
|
|
1588
|
+
code: "asyncapi-key-invalid",
|
|
1589
|
+
severity: "error",
|
|
1590
|
+
message: `Channel id "${key}" has characters AsyncAPI keys do not allow`,
|
|
1591
|
+
pointer
|
|
1592
|
+
});
|
|
1593
|
+
const address = channel["address"];
|
|
1594
|
+
const names = new Set(typeof address === "string" ? [...address.matchAll(PARAM)].map((match) => match[1] ?? "") : []);
|
|
1595
|
+
const parameters = isPlainObject(channel["parameters"]) ? Object.keys(channel["parameters"]) : [];
|
|
1596
|
+
for (const name of parameters) if (!names.has(name)) diagnostics.push({
|
|
1597
|
+
code: "asyncapi-parameter-unknown",
|
|
1598
|
+
severity: "error",
|
|
1599
|
+
message: `Parameter "${name}" is not in the address of channel "${key}"`,
|
|
1600
|
+
pointer: `${pointer}/parameters`
|
|
1601
|
+
});
|
|
1602
|
+
for (const name of names) if (!parameters.includes(name)) diagnostics.push({
|
|
1603
|
+
code: "asyncapi-parameter-missing",
|
|
1604
|
+
severity: "error",
|
|
1605
|
+
message: `Address expression "{${name}}" of channel "${key}" has no parameter`,
|
|
1606
|
+
pointer: `${pointer}/parameters`
|
|
1607
|
+
});
|
|
1608
|
+
}
|
|
1609
|
+
for (const [key, operation] of Object.entries(document.operations)) {
|
|
1610
|
+
const pointer = `/operations/${pointerToken(key)}`;
|
|
1611
|
+
const channelRef = refOf(operation["channel"]);
|
|
1612
|
+
if (!channelRef?.startsWith("#/channels/")) {
|
|
1613
|
+
diagnostics.push({
|
|
1614
|
+
code: "asyncapi-operation-channel-unknown",
|
|
1615
|
+
severity: "error",
|
|
1616
|
+
message: `Operation "${key}" does not reference a root channel`,
|
|
1617
|
+
pointer: `${pointer}/channel`
|
|
1618
|
+
});
|
|
1619
|
+
continue;
|
|
1620
|
+
}
|
|
1621
|
+
const list = Array.isArray(operation["messages"]) ? operation["messages"] : [];
|
|
1622
|
+
for (const entry of list) if (!refOf(entry)?.startsWith(`${channelRef}/messages/`)) diagnostics.push({
|
|
1623
|
+
code: "asyncapi-operation-message-unknown",
|
|
1624
|
+
severity: "error",
|
|
1625
|
+
message: `Operation "${key}" lists a message outside its channel`,
|
|
1626
|
+
pointer: `${pointer}/messages`
|
|
1627
|
+
});
|
|
1628
|
+
}
|
|
1629
|
+
return diagnostics;
|
|
1630
|
+
}
|
|
1631
|
+
/**
|
|
1632
|
+
* AsyncAPI as a `DocumentFormat`, for the events the API model describes:
|
|
1633
|
+
* Realtime table change signals and broadcast topics on the Supabase Realtime
|
|
1634
|
+
* websocket (`ws` bindings), CloudEvents (headers as the `cloudEvent` message
|
|
1635
|
+
* trait), outgoing webhooks over HTTP and the events HTTP operations emit. 3.0
|
|
1636
|
+
* is the default; 3.1 only adds `ros2` bindings, so the two documents differ in
|
|
1637
|
+
* the `asyncapi` field.
|
|
1638
|
+
*/
|
|
1639
|
+
const asyncapiFormat = defineDocumentFormat({
|
|
1640
|
+
id: "asyncapi",
|
|
1641
|
+
versions: {
|
|
1642
|
+
"3.0": {
|
|
1643
|
+
pin: SPEC_PINS.asyncapi30,
|
|
1644
|
+
status: "stable"
|
|
1645
|
+
},
|
|
1646
|
+
"3.1": {
|
|
1647
|
+
pin: SPEC_PINS.asyncapi31,
|
|
1648
|
+
status: "stable"
|
|
1649
|
+
}
|
|
1650
|
+
},
|
|
1651
|
+
defaultVersion: "3.0",
|
|
1652
|
+
lower: lowerAsyncApi,
|
|
1653
|
+
lint: lintAsyncApi,
|
|
1654
|
+
fileName: () => ASYNCAPI_FILE_NAME
|
|
1655
|
+
});
|
|
1656
|
+
//#endregion
|
|
1657
|
+
//#region src/asyncapi/create.ts
|
|
1658
|
+
/**
|
|
1659
|
+
* An AsyncAPI document for the app's events: Realtime table change signals and
|
|
1660
|
+
* broadcast topics, CloudEvents for row and block events, outgoing webhooks and
|
|
1661
|
+
* the events HTTP operations emit. Pass `events` (and `realtimeUrl` for the
|
|
1662
|
+
* websocket server). Throws when building or checking the document finds an
|
|
1663
|
+
* error; use `defineApi(...).render(asyncapiFormat)` to read every finding
|
|
1664
|
+
* instead.
|
|
1665
|
+
*
|
|
1666
|
+
* ```ts
|
|
1667
|
+
* const doc = createAsyncApi(betterSupabase, {
|
|
1668
|
+
* info: { title: "CRM events", version: "1.0.0" },
|
|
1669
|
+
* realtimeUrl: "wss://example.supabase.co/realtime/v1/websocket",
|
|
1670
|
+
* events: {
|
|
1671
|
+
* tables: ["customers"],
|
|
1672
|
+
* cloudEvents: { source: "/crm", blocks: { "support.started": true } },
|
|
1673
|
+
* },
|
|
1674
|
+
* });
|
|
1675
|
+
* ```
|
|
1676
|
+
*/
|
|
1677
|
+
function createAsyncApi(betterSupabase, options) {
|
|
1678
|
+
const { version, transform, overlays, onDiagnostic, ...apiOptions } = options;
|
|
1679
|
+
const result = defineApi(betterSupabase, apiOptions).render(asyncapiFormat, {
|
|
1680
|
+
...version === void 0 ? {} : { version },
|
|
1681
|
+
...transform === void 0 ? {} : { transform: (rendered) => transform(rendered) },
|
|
1682
|
+
...overlays === void 0 ? {} : { overlays }
|
|
1683
|
+
});
|
|
1684
|
+
const errors = result.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
|
|
1685
|
+
if (errors.length > 0) throw new TypeError(`createAsyncApi: ${errors.map((error) => `${error.code}: ${error.message}${error.pointer ? ` (${error.pointer})` : ""}`).join("; ")}`);
|
|
1686
|
+
if (onDiagnostic) for (const diagnostic of result.diagnostics) onDiagnostic(diagnostic);
|
|
1687
|
+
return result.document;
|
|
1688
|
+
}
|
|
1689
|
+
//#endregion
|
|
1690
|
+
//#region src/arazzo/format.ts
|
|
1691
|
+
const ARAZZO_FIELD = {
|
|
1692
|
+
"1.0": SPEC_PINS.arazzo10,
|
|
1693
|
+
"1.1": SPEC_PINS.arazzo11
|
|
1694
|
+
};
|
|
1695
|
+
const ID = /^[A-Za-z0-9_-]+$/;
|
|
1696
|
+
const STEP_OUTPUT = /\$steps\.([A-Za-z0-9_-]+)\.outputs\.([A-Za-z0-9_-]+)/g;
|
|
1697
|
+
const INPUT = /\$inputs\.([A-Za-z0-9_-]+)/g;
|
|
1698
|
+
const SOURCE = /\$sourceDescriptions\.([A-Za-z0-9_-]+)\./g;
|
|
1699
|
+
const omitUndefined = (value) => Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== void 0));
|
|
1700
|
+
function firstSuccess(operation) {
|
|
1701
|
+
return Object.keys(operation.responses).filter((status) => /^2\d\d$/.test(status)).toSorted()[0];
|
|
1702
|
+
}
|
|
1703
|
+
function stripActionParameters(actions, version, report, pointer) {
|
|
1704
|
+
if (!actions) return;
|
|
1705
|
+
return actions.map((action, index) => {
|
|
1706
|
+
const copy = structuredClone({ ...action });
|
|
1707
|
+
if (version === "1.0" && "parameters" in copy) {
|
|
1708
|
+
delete copy["parameters"];
|
|
1709
|
+
report(`${pointer}/${String(index)}/parameters`);
|
|
1710
|
+
}
|
|
1711
|
+
return copy;
|
|
1712
|
+
});
|
|
1713
|
+
}
|
|
1714
|
+
function lowerStep(step, pointer, state) {
|
|
1715
|
+
const { ctx, version } = state;
|
|
1716
|
+
const operation = step.operationId === void 0 ? void 0 : state.operations.get(step.operationId);
|
|
1717
|
+
let target = {};
|
|
1718
|
+
if (step.operationId !== void 0) {
|
|
1719
|
+
if (!operation) ctx.report({
|
|
1720
|
+
code: "arazzo-operation-unknown",
|
|
1721
|
+
severity: "error",
|
|
1722
|
+
message: `Step "${step.id}" calls operation "${step.operationId}", which the API does not have`,
|
|
1723
|
+
pointer: `${pointer}/operationId`
|
|
1724
|
+
});
|
|
1725
|
+
target = { operationId: state.qualify ? `$sourceDescriptions.${state.apiName}.${step.operationId}` : step.operationId };
|
|
1726
|
+
} else if (step.workflowId !== void 0) target = { workflowId: step.workflowId };
|
|
1727
|
+
else if (step.channel) {
|
|
1728
|
+
if (version === "1.0") {
|
|
1729
|
+
ctx.report({
|
|
1730
|
+
code: "arazzo-channel-step-unsupported",
|
|
1731
|
+
severity: "error",
|
|
1732
|
+
message: `Step "${step.id}" uses an AsyncAPI channel, which needs Arazzo 1.1; the step is left out`,
|
|
1733
|
+
pointer
|
|
1734
|
+
});
|
|
1735
|
+
return;
|
|
1736
|
+
}
|
|
1737
|
+
if (!state.channels.has(step.channel.id)) ctx.report({
|
|
1738
|
+
code: "arazzo-channel-unknown",
|
|
1739
|
+
severity: "error",
|
|
1740
|
+
message: `Step "${step.id}" uses channel "${step.channel.id}", which the API does not have`,
|
|
1741
|
+
pointer: `${pointer}/channelPath`
|
|
1742
|
+
});
|
|
1743
|
+
target = {
|
|
1744
|
+
channelPath: `{$sourceDescriptions.${state.eventsName}.url}#/channels/${safeKey(step.channel.id)}`,
|
|
1745
|
+
action: step.channel.action,
|
|
1746
|
+
...step.channel.correlationId === void 0 ? {} : { correlationId: step.channel.correlationId }
|
|
1747
|
+
};
|
|
1748
|
+
}
|
|
1749
|
+
const parameters = step.parameters?.map((parameter, index) => {
|
|
1750
|
+
const location = parameter.in ?? operation?.parameters.find((candidate) => candidate.name === parameter.name)?.in;
|
|
1751
|
+
if (location === void 0 && step.operationId !== void 0) ctx.report({
|
|
1752
|
+
code: "arazzo-parameter-in-missing",
|
|
1753
|
+
severity: "error",
|
|
1754
|
+
message: `Parameter "${parameter.name}" of step "${step.id}" has no "in", and operation "${step.operationId}" has no parameter by that name`,
|
|
1755
|
+
pointer: `${pointer}/parameters/${String(index)}`
|
|
1756
|
+
});
|
|
1757
|
+
return omitUndefined({
|
|
1758
|
+
name: parameter.name,
|
|
1759
|
+
in: location,
|
|
1760
|
+
value: structuredClone(parameter.value)
|
|
1761
|
+
});
|
|
1762
|
+
});
|
|
1763
|
+
const contentType = operation?.requestBody ? Object.keys(operation.requestBody.content)[0] : void 0;
|
|
1764
|
+
const success = operation ? firstSuccess(operation) : void 0;
|
|
1765
|
+
const successCriteria = step.successCriteria?.map((criterion) => ({ ...criterion })) ?? (success === void 0 ? void 0 : [{ condition: `$statusCode == ${success}` }]);
|
|
1766
|
+
const reportParameters = (where) => {
|
|
1767
|
+
ctx.report({
|
|
1768
|
+
code: "arazzo-action-parameters-unsupported",
|
|
1769
|
+
severity: "warning",
|
|
1770
|
+
message: `Action parameters need Arazzo 1.1; they are left out of step "${step.id}"`,
|
|
1771
|
+
pointer: where
|
|
1772
|
+
});
|
|
1773
|
+
};
|
|
1774
|
+
const onSuccess = stripActionParameters(step.onSuccess, version, reportParameters, `${pointer}/onSuccess`);
|
|
1775
|
+
const onFailure = stripActionParameters(step.onFailure, version, reportParameters, `${pointer}/onFailure`);
|
|
1776
|
+
return {
|
|
1777
|
+
stepId: step.id,
|
|
1778
|
+
...step.description === void 0 ? {} : { description: step.description },
|
|
1779
|
+
...target,
|
|
1780
|
+
...parameters === void 0 ? {} : { parameters },
|
|
1781
|
+
...step.requestBody ? { requestBody: omitUndefined({
|
|
1782
|
+
contentType,
|
|
1783
|
+
payload: structuredClone(step.requestBody.payload)
|
|
1784
|
+
}) } : {},
|
|
1785
|
+
...successCriteria === void 0 ? {} : { successCriteria },
|
|
1786
|
+
...onSuccess === void 0 ? {} : { onSuccess },
|
|
1787
|
+
...onFailure === void 0 ? {} : { onFailure },
|
|
1788
|
+
...step.outputs ? { outputs: { ...step.outputs } } : {}
|
|
1789
|
+
};
|
|
1790
|
+
}
|
|
1791
|
+
function lowerWorkflow(workflow, index, state) {
|
|
1792
|
+
const pointer = `/workflows/${String(index)}`;
|
|
1793
|
+
const steps = workflow.steps.flatMap((step, stepIndex) => {
|
|
1794
|
+
const lowered = lowerStep(step, `${pointer}/steps/${String(stepIndex)}`, state);
|
|
1795
|
+
return lowered ? [lowered] : [];
|
|
1796
|
+
});
|
|
1797
|
+
return {
|
|
1798
|
+
workflowId: workflow.id,
|
|
1799
|
+
...workflow.summary === void 0 ? {} : { summary: workflow.summary },
|
|
1800
|
+
...workflow.description === void 0 ? {} : { description: workflow.description },
|
|
1801
|
+
...workflow.inputs ? { inputs: structuredClone(workflow.inputs) } : {},
|
|
1802
|
+
steps,
|
|
1803
|
+
...workflow.outputs ? { outputs: { ...workflow.outputs } } : {}
|
|
1804
|
+
};
|
|
1805
|
+
}
|
|
1806
|
+
function lowerArazzo(options, model, version, ctx) {
|
|
1807
|
+
const apiName = options.openapi?.name ?? "api";
|
|
1808
|
+
const eventsName = options.asyncapi?.name ?? "events";
|
|
1809
|
+
const usesChannels = version === "1.1" && model.workflows.some((workflow) => workflow.steps.some((step) => step.channel !== void 0));
|
|
1810
|
+
const usesOperations = model.workflows.some((workflow) => workflow.steps.some((step) => step.operationId !== void 0));
|
|
1811
|
+
const sources = [];
|
|
1812
|
+
if (usesOperations || !usesChannels) sources.push({
|
|
1813
|
+
name: apiName,
|
|
1814
|
+
url: options.openapi?.url ?? model.self ?? "openapi.json",
|
|
1815
|
+
type: "openapi"
|
|
1816
|
+
});
|
|
1817
|
+
if (usesChannels) sources.push({
|
|
1818
|
+
name: eventsName,
|
|
1819
|
+
url: options.asyncapi?.url ?? "asyncapi.json",
|
|
1820
|
+
type: "asyncapi"
|
|
1821
|
+
});
|
|
1822
|
+
const state = {
|
|
1823
|
+
model,
|
|
1824
|
+
version,
|
|
1825
|
+
ctx,
|
|
1826
|
+
operations: new Map(model.operations.map((operation) => [operation.id, operation])),
|
|
1827
|
+
channels: new Set(model.channels.map((channel) => channel.id)),
|
|
1828
|
+
apiName,
|
|
1829
|
+
eventsName,
|
|
1830
|
+
qualify: sources.length > 1
|
|
1831
|
+
};
|
|
1832
|
+
if (model.workflows.length === 0) ctx.report({
|
|
1833
|
+
code: "arazzo-workflows-empty",
|
|
1834
|
+
severity: "error",
|
|
1835
|
+
message: "The API has no workflows; an Arazzo document needs at least one (pass workflows, or a built-in such as paginationWorkflows())",
|
|
1836
|
+
pointer: "/workflows"
|
|
1837
|
+
});
|
|
1838
|
+
const { info } = model;
|
|
1839
|
+
return {
|
|
1840
|
+
arazzo: ARAZZO_FIELD[version],
|
|
1841
|
+
info: {
|
|
1842
|
+
title: info.title,
|
|
1843
|
+
version: info.version,
|
|
1844
|
+
...info.summary === void 0 ? {} : { summary: info.summary },
|
|
1845
|
+
...info.description === void 0 ? {} : { description: info.description }
|
|
1846
|
+
},
|
|
1847
|
+
sourceDescriptions: sources,
|
|
1848
|
+
workflows: model.workflows.map((workflow, index) => lowerWorkflow(workflow, index, state))
|
|
1849
|
+
};
|
|
1850
|
+
}
|
|
1851
|
+
function strings(value, out) {
|
|
1852
|
+
if (typeof value === "string") out.push(value);
|
|
1853
|
+
else if (Array.isArray(value)) for (const item of value) strings(item, out);
|
|
1854
|
+
else if (isPlainObject(value)) for (const item of Object.values(value)) strings(item, out);
|
|
1855
|
+
}
|
|
1856
|
+
function inputNames(inputs) {
|
|
1857
|
+
if (!inputs || !isPlainObject(inputs["properties"])) return;
|
|
1858
|
+
return new Set(Object.keys(inputs["properties"]));
|
|
1859
|
+
}
|
|
1860
|
+
function lintWorkflow(workflow, index, workflowIds, sourceNames, diagnostics) {
|
|
1861
|
+
const pointer = `/workflows/${String(index)}`;
|
|
1862
|
+
const stepIndex = /* @__PURE__ */ new Map();
|
|
1863
|
+
const outputsOf = /* @__PURE__ */ new Map();
|
|
1864
|
+
for (const [position, step] of workflow.steps.entries()) {
|
|
1865
|
+
if (stepIndex.has(step.stepId)) diagnostics.push({
|
|
1866
|
+
code: "arazzo-step-id-duplicate",
|
|
1867
|
+
severity: "error",
|
|
1868
|
+
message: `Workflow "${workflow.workflowId}" has two steps "${step.stepId}"`,
|
|
1869
|
+
pointer: `${pointer}/steps/${String(position)}`
|
|
1870
|
+
});
|
|
1871
|
+
else stepIndex.set(step.stepId, position);
|
|
1872
|
+
outputsOf.set(step.stepId, new Set(Object.keys(step.outputs ?? {})));
|
|
1873
|
+
}
|
|
1874
|
+
const inputs = inputNames(workflow.inputs);
|
|
1875
|
+
const checkExpressions = (value, where, position) => {
|
|
1876
|
+
const texts = [];
|
|
1877
|
+
strings(value, texts);
|
|
1878
|
+
for (const text of texts) {
|
|
1879
|
+
for (const [, stepId = "", output = ""] of text.matchAll(STEP_OUTPUT)) {
|
|
1880
|
+
const target = stepIndex.get(stepId);
|
|
1881
|
+
if (target === void 0 || !outputsOf.get(stepId)?.has(output)) diagnostics.push({
|
|
1882
|
+
code: "arazzo-step-output-unknown",
|
|
1883
|
+
severity: "error",
|
|
1884
|
+
message: `"$steps.${stepId}.outputs.${output}" names an output no step "${stepId}" declares`,
|
|
1885
|
+
pointer: where
|
|
1886
|
+
});
|
|
1887
|
+
else if (position !== void 0 && target >= position) diagnostics.push({
|
|
1888
|
+
code: "arazzo-step-output-order",
|
|
1889
|
+
severity: "error",
|
|
1890
|
+
message: `"$steps.${stepId}.outputs.${output}" is read before step "${stepId}" runs`,
|
|
1891
|
+
pointer: where
|
|
1892
|
+
});
|
|
1893
|
+
}
|
|
1894
|
+
if (inputs) {
|
|
1895
|
+
for (const [, name = ""] of text.matchAll(INPUT)) if (!inputs.has(name)) diagnostics.push({
|
|
1896
|
+
code: "arazzo-input-undeclared",
|
|
1897
|
+
severity: "warning",
|
|
1898
|
+
message: `"$inputs.${name}" is not a property of workflow "${workflow.workflowId}" inputs`,
|
|
1899
|
+
pointer: where
|
|
1900
|
+
});
|
|
1901
|
+
}
|
|
1902
|
+
for (const [, name = ""] of text.matchAll(SOURCE)) if (!sourceNames.has(name)) diagnostics.push({
|
|
1903
|
+
code: "arazzo-source-unknown",
|
|
1904
|
+
severity: "error",
|
|
1905
|
+
message: `"$sourceDescriptions.${name}" is not a listed source description`,
|
|
1906
|
+
pointer: where
|
|
1907
|
+
});
|
|
1908
|
+
}
|
|
1909
|
+
};
|
|
1910
|
+
for (const [position, step] of workflow.steps.entries()) {
|
|
1911
|
+
const where = `${pointer}/steps/${String(position)}`;
|
|
1912
|
+
if (!ID.test(step.stepId)) diagnostics.push({
|
|
1913
|
+
code: "arazzo-id-invalid",
|
|
1914
|
+
severity: "error",
|
|
1915
|
+
message: `Step id "${step.stepId}" has characters Arazzo ids do not allow`,
|
|
1916
|
+
pointer: where
|
|
1917
|
+
});
|
|
1918
|
+
if ([
|
|
1919
|
+
step.operationId,
|
|
1920
|
+
step.operationPath,
|
|
1921
|
+
step.channelPath,
|
|
1922
|
+
step.workflowId
|
|
1923
|
+
].filter((target) => target !== void 0).length !== 1) diagnostics.push({
|
|
1924
|
+
code: "arazzo-step-target",
|
|
1925
|
+
severity: "error",
|
|
1926
|
+
message: `Step "${step.stepId}" needs exactly one of operationId, operationPath, channelPath or workflowId`,
|
|
1927
|
+
pointer: where
|
|
1928
|
+
});
|
|
1929
|
+
if (step.workflowId !== void 0 && !workflowIds.has(step.workflowId)) diagnostics.push({
|
|
1930
|
+
code: "arazzo-workflow-unknown",
|
|
1931
|
+
severity: "error",
|
|
1932
|
+
message: `Step "${step.stepId}" calls workflow "${step.workflowId}", which the document does not have`,
|
|
1933
|
+
pointer: `${where}/workflowId`
|
|
1934
|
+
});
|
|
1935
|
+
checkExpressions([
|
|
1936
|
+
step.operationId,
|
|
1937
|
+
step.channelPath,
|
|
1938
|
+
step.parameters,
|
|
1939
|
+
step.requestBody,
|
|
1940
|
+
step.successCriteria
|
|
1941
|
+
], where, position);
|
|
1942
|
+
checkExpressions([
|
|
1943
|
+
step.outputs,
|
|
1944
|
+
step.onSuccess,
|
|
1945
|
+
step.onFailure
|
|
1946
|
+
], where);
|
|
1947
|
+
for (const action of [...step.onSuccess ?? [], ...step.onFailure ?? []]) {
|
|
1948
|
+
if (action["type"] !== "goto" && action["type"] !== "retry") continue;
|
|
1949
|
+
const stepId = action["stepId"];
|
|
1950
|
+
const workflowId = action["workflowId"];
|
|
1951
|
+
if (typeof stepId === "string" && !stepIndex.has(stepId) || typeof workflowId === "string" && !workflowIds.has(workflowId) && !workflowId.startsWith("$sourceDescriptions.")) diagnostics.push({
|
|
1952
|
+
code: "arazzo-goto-unknown",
|
|
1953
|
+
severity: "error",
|
|
1954
|
+
message: `Action "${String(action["name"])}" of step "${step.stepId}" goes to a step or workflow that does not exist`,
|
|
1955
|
+
pointer: where
|
|
1956
|
+
});
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
checkExpressions(workflow.outputs, `${pointer}/outputs`);
|
|
1960
|
+
}
|
|
1961
|
+
function lintArazzo(document) {
|
|
1962
|
+
const diagnostics = [];
|
|
1963
|
+
const workflowIds = /* @__PURE__ */ new Set();
|
|
1964
|
+
for (const [index, workflow] of document.workflows.entries()) {
|
|
1965
|
+
if (!ID.test(workflow.workflowId)) diagnostics.push({
|
|
1966
|
+
code: "arazzo-id-invalid",
|
|
1967
|
+
severity: "error",
|
|
1968
|
+
message: `Workflow id "${workflow.workflowId}" has characters Arazzo ids do not allow`,
|
|
1969
|
+
pointer: `/workflows/${String(index)}`
|
|
1970
|
+
});
|
|
1971
|
+
if (workflowIds.has(workflow.workflowId)) diagnostics.push({
|
|
1972
|
+
code: "arazzo-workflow-id-duplicate",
|
|
1973
|
+
severity: "error",
|
|
1974
|
+
message: `Two workflows have the id "${workflow.workflowId}"`,
|
|
1975
|
+
pointer: `/workflows/${String(index)}`
|
|
1976
|
+
});
|
|
1977
|
+
workflowIds.add(workflow.workflowId);
|
|
1978
|
+
}
|
|
1979
|
+
const sourceNames = new Set(document.sourceDescriptions.map((source) => source.name));
|
|
1980
|
+
for (const [index, workflow] of document.workflows.entries()) lintWorkflow(workflow, index, workflowIds, sourceNames, diagnostics);
|
|
1981
|
+
return diagnostics;
|
|
1982
|
+
}
|
|
1983
|
+
/**
|
|
1984
|
+
* An Arazzo format whose source descriptions point at your OpenAPI and AsyncAPI
|
|
1985
|
+
* URLs. `arazzoFormat` is this with the defaults: `api` at the model's `self`
|
|
1986
|
+
* or `openapi.json`, and `events` at `asyncapi.json`.
|
|
1987
|
+
*/
|
|
1988
|
+
function createArazzoFormat(options = {}) {
|
|
1989
|
+
return defineDocumentFormat({
|
|
1990
|
+
id: "arazzo",
|
|
1991
|
+
versions: {
|
|
1992
|
+
"1.0": {
|
|
1993
|
+
pin: SPEC_PINS.arazzo10,
|
|
1994
|
+
status: "stable"
|
|
1995
|
+
},
|
|
1996
|
+
"1.1": {
|
|
1997
|
+
pin: SPEC_PINS.arazzo11,
|
|
1998
|
+
status: "stable"
|
|
1999
|
+
}
|
|
2000
|
+
},
|
|
2001
|
+
defaultVersion: "1.0",
|
|
2002
|
+
lower: (model, version, ctx) => lowerArazzo(options, model, version, ctx),
|
|
2003
|
+
lint: lintArazzo,
|
|
2004
|
+
fileName: () => "arazzo.json"
|
|
2005
|
+
});
|
|
2006
|
+
}
|
|
2007
|
+
/**
|
|
2008
|
+
* Arazzo as a `DocumentFormat`, for the model's `workflows`. 1.0 is the
|
|
2009
|
+
* default; channel steps (AsyncAPI send and receive) and action `parameters`
|
|
2010
|
+
* need 1.1.
|
|
2011
|
+
*/
|
|
2012
|
+
const arazzoFormat = createArazzoFormat();
|
|
2013
|
+
//#endregion
|
|
2014
|
+
//#region src/arazzo/create.ts
|
|
2015
|
+
/**
|
|
2016
|
+
* An Arazzo document for the API's workflows: your `defineWorkflow` workflows
|
|
2017
|
+
* and the built-ins (`paginationWorkflows()`, `createThenGetWorkflows()`,
|
|
2018
|
+
* `authWorkflow()`), checked against the operations the API has. Throws when
|
|
2019
|
+
* building or checking the document finds an error; use
|
|
2020
|
+
* `defineApi(...).render(arazzoFormat)` to read every finding instead.
|
|
2021
|
+
*
|
|
2022
|
+
* ```ts
|
|
2023
|
+
* const doc = createArazzo(betterSupabase, {
|
|
2024
|
+
* info: { title: "CRM workflows", version: "1.0.0" },
|
|
2025
|
+
* resources: { customers: { pagination: "cursor" } },
|
|
2026
|
+
* workflows: [paginationWorkflows(), createThenGetWorkflows()],
|
|
2027
|
+
* });
|
|
2028
|
+
* ```
|
|
2029
|
+
*/
|
|
2030
|
+
function createArazzo(betterSupabase, options) {
|
|
2031
|
+
const { version, transform, overlays, onDiagnostic, openapi, asyncapi, ...apiOptions } = options;
|
|
2032
|
+
const format = createArazzoFormat({
|
|
2033
|
+
...openapi === void 0 ? {} : { openapi },
|
|
2034
|
+
...asyncapi === void 0 ? {} : { asyncapi }
|
|
2035
|
+
});
|
|
2036
|
+
const result = defineApi(betterSupabase, apiOptions).render(format, {
|
|
2037
|
+
...version === void 0 ? {} : { version },
|
|
2038
|
+
...transform === void 0 ? {} : { transform: (rendered) => transform(rendered) },
|
|
2039
|
+
...overlays === void 0 ? {} : { overlays }
|
|
2040
|
+
});
|
|
2041
|
+
const errors = result.diagnostics.filter((diagnostic) => diagnostic.severity === "error");
|
|
2042
|
+
if (errors.length > 0) throw new TypeError(`createArazzo: ${errors.map((error) => `${error.code}: ${error.message}${error.pointer ? ` (${error.pointer})` : ""}`).join("; ")}`);
|
|
2043
|
+
if (onDiagnostic) for (const diagnostic of result.diagnostics) onDiagnostic(diagnostic);
|
|
2044
|
+
return result.document;
|
|
2045
|
+
}
|
|
2046
|
+
//#endregion
|
|
2047
|
+
//#region src/arazzo/builtins.ts
|
|
2048
|
+
const resourceOf = (operations, table, operation) => operations.find((candidate) => candidate.source.kind === "resource" && candidate.source.table === table && candidate.source.operation === operation);
|
|
2049
|
+
const tablesOf = (operations) => [...new Set(operations.flatMap((operation) => operation.source.kind === "resource" ? [operation.source.table] : []))];
|
|
2050
|
+
const inputParameter = (parameter) => ({
|
|
2051
|
+
name: parameter.name,
|
|
2052
|
+
in: "path",
|
|
2053
|
+
value: `$inputs.${parameter.name}`
|
|
2054
|
+
});
|
|
2055
|
+
const pathParameter = (operation) => operation.parameters.find((parameter) => parameter.in === "path")?.name;
|
|
2056
|
+
/**
|
|
2057
|
+
* One workflow per cursor-paginated list: read the first page, then the next
|
|
2058
|
+
* one from its `nextCursor` when `hasMore` is true. Repeat the second step with
|
|
2059
|
+
* its own `nextCursor` to walk the rest.
|
|
2060
|
+
*/
|
|
2061
|
+
function paginationWorkflows(options = {}) {
|
|
2062
|
+
return (operations) => tablesOf(operations).filter((table) => !options.tables || options.tables.includes(table)).flatMap((table) => {
|
|
2063
|
+
const list = resourceOf(operations, table, "list");
|
|
2064
|
+
if (!list?.parameters.some((parameter) => parameter.name === "after" && parameter.in === "query")) return [];
|
|
2065
|
+
return [{
|
|
2066
|
+
id: `paginate${pascal(table)}`,
|
|
2067
|
+
summary: `Read ${table} page by page`,
|
|
2068
|
+
description: "Reads the first page, then the next one with the cursor the first page returned. Repeat `nextPage` with its own `nextCursor` until `hasMore` is false.",
|
|
2069
|
+
inputs: {
|
|
2070
|
+
type: "object",
|
|
2071
|
+
properties: { size: {
|
|
2072
|
+
type: "integer",
|
|
2073
|
+
minimum: 1,
|
|
2074
|
+
description: "Page size."
|
|
2075
|
+
} }
|
|
2076
|
+
},
|
|
2077
|
+
steps: [{
|
|
2078
|
+
id: "firstPage",
|
|
2079
|
+
operationId: list.id,
|
|
2080
|
+
parameters: [{
|
|
2081
|
+
name: "size",
|
|
2082
|
+
in: "query",
|
|
2083
|
+
value: "$inputs.size"
|
|
2084
|
+
}],
|
|
2085
|
+
successCriteria: [{ condition: "$statusCode == 200" }],
|
|
2086
|
+
outputs: {
|
|
2087
|
+
items: "$response.body#/items",
|
|
2088
|
+
nextCursor: "$response.body#/nextCursor",
|
|
2089
|
+
hasMore: "$response.body#/hasMore"
|
|
2090
|
+
},
|
|
2091
|
+
onSuccess: [{
|
|
2092
|
+
name: "lastPage",
|
|
2093
|
+
type: "end",
|
|
2094
|
+
criteria: [{ condition: "$response.body#/hasMore == false" }]
|
|
2095
|
+
}]
|
|
2096
|
+
}, {
|
|
2097
|
+
id: "nextPage",
|
|
2098
|
+
operationId: list.id,
|
|
2099
|
+
parameters: [{
|
|
2100
|
+
name: "size",
|
|
2101
|
+
in: "query",
|
|
2102
|
+
value: "$inputs.size"
|
|
2103
|
+
}, {
|
|
2104
|
+
name: "after",
|
|
2105
|
+
in: "query",
|
|
2106
|
+
value: "$steps.firstPage.outputs.nextCursor"
|
|
2107
|
+
}],
|
|
2108
|
+
successCriteria: [{ condition: "$statusCode == 200" }],
|
|
2109
|
+
outputs: {
|
|
2110
|
+
items: "$response.body#/items",
|
|
2111
|
+
nextCursor: "$response.body#/nextCursor",
|
|
2112
|
+
hasMore: "$response.body#/hasMore"
|
|
2113
|
+
}
|
|
2114
|
+
}],
|
|
2115
|
+
outputs: {
|
|
2116
|
+
firstPage: "$steps.firstPage.outputs.items",
|
|
2117
|
+
nextCursor: "$steps.nextPage.outputs.nextCursor"
|
|
2118
|
+
}
|
|
2119
|
+
}];
|
|
2120
|
+
});
|
|
2121
|
+
}
|
|
2122
|
+
/**
|
|
2123
|
+
* One workflow per resource with `create` and `get`: create a row, then read it
|
|
2124
|
+
* back by its key.
|
|
2125
|
+
*/
|
|
2126
|
+
function createThenGetWorkflows(options = {}) {
|
|
2127
|
+
return (operations) => tablesOf(operations).filter((table) => !options.tables || options.tables.includes(table)).flatMap((table) => {
|
|
2128
|
+
const create = resourceOf(operations, table, "create");
|
|
2129
|
+
const get = resourceOf(operations, table, "get");
|
|
2130
|
+
const key = get ? pathParameter(get) : void 0;
|
|
2131
|
+
if (!create || !get || key === void 0) return [];
|
|
2132
|
+
return [{
|
|
2133
|
+
id: `createThenGet${pascal(table)}`,
|
|
2134
|
+
summary: `Create a ${table} row, then read it back`,
|
|
2135
|
+
inputs: {
|
|
2136
|
+
type: "object",
|
|
2137
|
+
required: ["row"],
|
|
2138
|
+
properties: { row: {
|
|
2139
|
+
type: "object",
|
|
2140
|
+
description: "The row to insert."
|
|
2141
|
+
} }
|
|
2142
|
+
},
|
|
2143
|
+
steps: [{
|
|
2144
|
+
id: "create",
|
|
2145
|
+
operationId: create.id,
|
|
2146
|
+
requestBody: { payload: "$inputs.row" },
|
|
2147
|
+
successCriteria: [{ condition: "$statusCode == 201" }],
|
|
2148
|
+
outputs: { key: `$response.body#/${key}` }
|
|
2149
|
+
}, {
|
|
2150
|
+
id: "get",
|
|
2151
|
+
operationId: get.id,
|
|
2152
|
+
parameters: [{
|
|
2153
|
+
name: key,
|
|
2154
|
+
in: "path",
|
|
2155
|
+
value: "$steps.create.outputs.key"
|
|
2156
|
+
}],
|
|
2157
|
+
successCriteria: [{ condition: "$statusCode == 200" }],
|
|
2158
|
+
outputs: { row: "$response.body" }
|
|
2159
|
+
}],
|
|
2160
|
+
outputs: { row: "$steps.get.outputs.row" }
|
|
2161
|
+
}];
|
|
2162
|
+
});
|
|
2163
|
+
}
|
|
2164
|
+
/**
|
|
2165
|
+
* Sign in, then call an operation with the access token as a bearer token. A
|
|
2166
|
+
* 403 Problem Details answer with code `APPROVAL_REQUIRED` ends the workflow
|
|
2167
|
+
* (the `approvalRequired` failure action), so a client can wait for the
|
|
2168
|
+
* approval instead of retrying.
|
|
2169
|
+
*/
|
|
2170
|
+
function authWorkflow(options) {
|
|
2171
|
+
const signIn = options.signIn ?? "signIn";
|
|
2172
|
+
const pointer = options.tokenPointer ?? "/access_token";
|
|
2173
|
+
return (operations) => {
|
|
2174
|
+
const pathParameters = operations.find((operation) => operation.id === options.call)?.parameters.filter((parameter) => parameter.in === "path") ?? [];
|
|
2175
|
+
return [{
|
|
2176
|
+
id: options.id ?? `signInThen${pascal(options.call)}`,
|
|
2177
|
+
summary: `Sign in, then call ${options.call}`,
|
|
2178
|
+
inputs: {
|
|
2179
|
+
type: "object",
|
|
2180
|
+
required: [
|
|
2181
|
+
"email",
|
|
2182
|
+
"password",
|
|
2183
|
+
...pathParameters.map((p) => p.name)
|
|
2184
|
+
],
|
|
2185
|
+
properties: {
|
|
2186
|
+
email: {
|
|
2187
|
+
type: "string",
|
|
2188
|
+
format: "email"
|
|
2189
|
+
},
|
|
2190
|
+
password: {
|
|
2191
|
+
type: "string",
|
|
2192
|
+
format: "password"
|
|
2193
|
+
},
|
|
2194
|
+
...Object.fromEntries(pathParameters.map((parameter) => [parameter.name, { type: "string" }]))
|
|
2195
|
+
}
|
|
2196
|
+
},
|
|
2197
|
+
steps: [{
|
|
2198
|
+
id: "signIn",
|
|
2199
|
+
operationId: signIn,
|
|
2200
|
+
requestBody: { payload: {
|
|
2201
|
+
email: "$inputs.email",
|
|
2202
|
+
password: "$inputs.password"
|
|
2203
|
+
} },
|
|
2204
|
+
successCriteria: [{ condition: "$statusCode == 200" }],
|
|
2205
|
+
outputs: { accessToken: `$response.body#${pointer}` }
|
|
2206
|
+
}, {
|
|
2207
|
+
id: "call",
|
|
2208
|
+
operationId: options.call,
|
|
2209
|
+
parameters: [{
|
|
2210
|
+
name: "Authorization",
|
|
2211
|
+
in: "header",
|
|
2212
|
+
value: "Bearer {$steps.signIn.outputs.accessToken}"
|
|
2213
|
+
}, ...pathParameters.map(inputParameter)],
|
|
2214
|
+
outputs: { body: "$response.body" },
|
|
2215
|
+
onFailure: [{
|
|
2216
|
+
name: "approvalRequired",
|
|
2217
|
+
type: "end",
|
|
2218
|
+
criteria: [{ condition: "$statusCode == 403" }, {
|
|
2219
|
+
context: "$response.body",
|
|
2220
|
+
condition: "$.code == 'APPROVAL_REQUIRED'",
|
|
2221
|
+
type: "jsonpath"
|
|
2222
|
+
}]
|
|
2223
|
+
}]
|
|
2224
|
+
}],
|
|
2225
|
+
outputs: { body: "$steps.call.outputs.body" }
|
|
2226
|
+
}];
|
|
2227
|
+
};
|
|
2228
|
+
}
|
|
2229
|
+
//#endregion
|
|
2230
|
+
//#region src/arazzo/workflow.ts
|
|
2231
|
+
function isStandard(value) {
|
|
2232
|
+
return typeof value === "object" && value !== null && "~standard" in value && typeof value["~standard"] === "object";
|
|
2233
|
+
}
|
|
2234
|
+
function inputsOf(inputs) {
|
|
2235
|
+
if (!isStandard(inputs)) return inputs;
|
|
2236
|
+
const converted = convertStandard(inputs, "input");
|
|
2237
|
+
if (!converted) throw new TypeError("defineWorkflow: inputs is a Standard Schema without Standard JSON Schema; pass a JSON Schema instead");
|
|
2238
|
+
return converted.schema;
|
|
2239
|
+
}
|
|
2240
|
+
function parametersOf(parameters) {
|
|
2241
|
+
if (parameters === void 0) return;
|
|
2242
|
+
if (Array.isArray(parameters)) return parameters.map((parameter) => parameter.in === void 0 ? {
|
|
2243
|
+
name: parameter.name,
|
|
2244
|
+
value: parameter.value
|
|
2245
|
+
} : {
|
|
2246
|
+
name: parameter.name,
|
|
2247
|
+
in: parameter.in,
|
|
2248
|
+
value: parameter.value
|
|
2249
|
+
});
|
|
2250
|
+
return Object.entries(parameters).map(([name, value]) => ({
|
|
2251
|
+
name,
|
|
2252
|
+
value
|
|
2253
|
+
}));
|
|
2254
|
+
}
|
|
2255
|
+
function criterionOf(criterion) {
|
|
2256
|
+
return typeof criterion === "string" ? { condition: criterion } : { ...criterion };
|
|
2257
|
+
}
|
|
2258
|
+
function stepOf(step) {
|
|
2259
|
+
const parameters = parametersOf(step.parameters);
|
|
2260
|
+
let target = {};
|
|
2261
|
+
if (step.operationId) target = { operationId: step.operationId };
|
|
2262
|
+
else if (step.workflowId) target = { workflowId: step.workflowId };
|
|
2263
|
+
else if (step.channel) target = { channel: step.channel };
|
|
2264
|
+
return {
|
|
2265
|
+
id: step.id,
|
|
2266
|
+
...step.description === void 0 ? {} : { description: step.description },
|
|
2267
|
+
...target,
|
|
2268
|
+
...parameters === void 0 ? {} : { parameters },
|
|
2269
|
+
...step.requestBody === void 0 ? {} : { requestBody: { payload: step.requestBody } },
|
|
2270
|
+
...step.successCriteria === void 0 ? {} : { successCriteria: step.successCriteria.map(criterionOf) },
|
|
2271
|
+
...step.outputs === void 0 ? {} : { outputs: { ...step.outputs } },
|
|
2272
|
+
...step.onSuccess === void 0 ? {} : { onSuccess: step.onSuccess },
|
|
2273
|
+
...step.onFailure === void 0 ? {} : { onFailure: step.onFailure }
|
|
2274
|
+
};
|
|
2275
|
+
}
|
|
2276
|
+
/**
|
|
2277
|
+
* A workflow for `defineApi`'s `workflows`, rendered by `arazzoFormat`. Steps
|
|
2278
|
+
* name operations by operationId; pass the ids as `Op` (for example
|
|
2279
|
+
* `ResourceOperationIds<"customers">`) to type them. Rendering reports unknown
|
|
2280
|
+
* operationIds, steps that read outputs of later or unknown steps, and channel
|
|
2281
|
+
* steps outside Arazzo 1.1.
|
|
2282
|
+
*
|
|
2283
|
+
* ```ts
|
|
2284
|
+
* const onboarding = defineWorkflow<ResourceOperationIds<"customers">>({
|
|
2285
|
+
* id: "onboardCustomer",
|
|
2286
|
+
* inputs: { type: "object", properties: { row: { type: "object" } } },
|
|
2287
|
+
* steps: [
|
|
2288
|
+
* {
|
|
2289
|
+
* id: "create",
|
|
2290
|
+
* operationId: "createCustomers",
|
|
2291
|
+
* requestBody: "$inputs.row",
|
|
2292
|
+
* outputs: { id: "$response.body#/id" },
|
|
2293
|
+
* },
|
|
2294
|
+
* {
|
|
2295
|
+
* id: "get",
|
|
2296
|
+
* operationId: "getCustomers",
|
|
2297
|
+
* parameters: { id: "$steps.create.outputs.id" },
|
|
2298
|
+
* },
|
|
2299
|
+
* ],
|
|
2300
|
+
* });
|
|
2301
|
+
* ```
|
|
2302
|
+
*/
|
|
2303
|
+
function defineWorkflow(workflow) {
|
|
2304
|
+
return {
|
|
2305
|
+
id: workflow.id,
|
|
2306
|
+
...workflow.summary === void 0 ? {} : { summary: workflow.summary },
|
|
2307
|
+
...workflow.description === void 0 ? {} : { description: workflow.description },
|
|
2308
|
+
...workflow.inputs === void 0 ? {} : { inputs: inputsOf(workflow.inputs) },
|
|
2309
|
+
steps: workflow.steps.map(stepOf),
|
|
2310
|
+
...workflow.outputs === void 0 ? {} : { outputs: { ...workflow.outputs } }
|
|
2311
|
+
};
|
|
2312
|
+
}
|
|
2313
|
+
//#endregion
|
|
2314
|
+
//#region src/overlay/path.ts
|
|
2315
|
+
const ESCAPES = {
|
|
2316
|
+
b: "\b",
|
|
2317
|
+
f: "\f",
|
|
2318
|
+
n: "\n",
|
|
2319
|
+
r: "\r",
|
|
2320
|
+
t: " ",
|
|
2321
|
+
"'": "'",
|
|
2322
|
+
"\\": "\\",
|
|
2323
|
+
"/": "/"
|
|
2324
|
+
};
|
|
2325
|
+
/**
|
|
2326
|
+
* Parses an RFC 9535 normalized path (§ 2.7), such as `$['paths'][0]`, into its
|
|
2327
|
+
* segments. Throws for anything else, because the engine promised one.
|
|
2328
|
+
*/
|
|
2329
|
+
function parseNormalizedPath(path) {
|
|
2330
|
+
if (!path.startsWith("$")) throw new TypeError(`Not a normalized path: ${path}`);
|
|
2331
|
+
const segments = [];
|
|
2332
|
+
let i = 1;
|
|
2333
|
+
while (i < path.length) {
|
|
2334
|
+
if (path[i] !== "[") throw new TypeError(`Not a normalized path: ${path}`);
|
|
2335
|
+
i += 1;
|
|
2336
|
+
if (path[i] === "'") {
|
|
2337
|
+
i += 1;
|
|
2338
|
+
let name = "";
|
|
2339
|
+
while (i < path.length && path[i] !== "'") {
|
|
2340
|
+
const char = path[i] ?? "";
|
|
2341
|
+
if (char !== "\\") {
|
|
2342
|
+
name += char;
|
|
2343
|
+
i += 1;
|
|
2344
|
+
continue;
|
|
2345
|
+
}
|
|
2346
|
+
const next = path[i + 1] ?? "";
|
|
2347
|
+
if (next === "u") {
|
|
2348
|
+
name += String.fromCodePoint(Number.parseInt(path.slice(i + 2, i + 6), 16));
|
|
2349
|
+
i += 6;
|
|
2350
|
+
continue;
|
|
2351
|
+
}
|
|
2352
|
+
const escaped = ESCAPES[next];
|
|
2353
|
+
if (escaped === void 0) throw new TypeError(`Not a normalized path: ${path}`);
|
|
2354
|
+
name += escaped;
|
|
2355
|
+
i += 2;
|
|
2356
|
+
}
|
|
2357
|
+
if (path[i] !== "'" || path[i + 1] !== "]") throw new TypeError(`Not a normalized path: ${path}`);
|
|
2358
|
+
segments.push(name);
|
|
2359
|
+
i += 2;
|
|
2360
|
+
continue;
|
|
2361
|
+
}
|
|
2362
|
+
const end = path.indexOf("]", i);
|
|
2363
|
+
const digits = end === -1 ? "" : path.slice(i, end);
|
|
2364
|
+
if (!/^(?:0|[1-9]\d*)$/.test(digits)) throw new TypeError(`Not a normalized path: ${path}`);
|
|
2365
|
+
segments.push(Number(digits));
|
|
2366
|
+
i = end + 1;
|
|
2367
|
+
}
|
|
2368
|
+
return segments;
|
|
2369
|
+
}
|
|
2370
|
+
const SHORTHAND = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
2371
|
+
function quote(name) {
|
|
2372
|
+
let out = "";
|
|
2373
|
+
for (const char of name) {
|
|
2374
|
+
const code = char.codePointAt(0) ?? 0;
|
|
2375
|
+
if (char === "\\") out += "\\\\";
|
|
2376
|
+
else if (char === "'") out += "\\'";
|
|
2377
|
+
else if (char === "\b") out += "\\b";
|
|
2378
|
+
else if (char === "\f") out += "\\f";
|
|
2379
|
+
else if (char === "\n") out += "\\n";
|
|
2380
|
+
else if (char === "\r") out += "\\r";
|
|
2381
|
+
else if (char === " ") out += "\\t";
|
|
2382
|
+
else if (code < 32) out += `\\u${code.toString(16).padStart(4, "0")}`;
|
|
2383
|
+
else out += char;
|
|
2384
|
+
}
|
|
2385
|
+
return `['${out}']`;
|
|
2386
|
+
}
|
|
2387
|
+
/**
|
|
2388
|
+
* Formats segments as a readable RFC 9535 query: member-name shorthand for
|
|
2389
|
+
* plain names, bracket notation otherwise (`$.paths['/customers'].get`).
|
|
2390
|
+
*/
|
|
2391
|
+
function formatPath(segments) {
|
|
2392
|
+
let out = "$";
|
|
2393
|
+
for (const segment of segments) if (typeof segment === "number") out += `[${segment}]`;
|
|
2394
|
+
else if (SHORTHAND.test(segment)) out += `.${segment}`;
|
|
2395
|
+
else out += quote(segment);
|
|
2396
|
+
return out;
|
|
2397
|
+
}
|
|
2398
|
+
/** Decodes one RFC 6901 reference token. */
|
|
2399
|
+
function decodePointerToken(token) {
|
|
2400
|
+
return token.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
2401
|
+
}
|
|
2402
|
+
//#endregion
|
|
2403
|
+
//#region src/overlay/apply.ts
|
|
2404
|
+
const ALLOW_EMPTY = "x-better-supabase-allow-empty";
|
|
2405
|
+
const REF_PREFIX = "#/components/actions/";
|
|
2406
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
2407
|
+
const isArray = (value) => Array.isArray(value);
|
|
2408
|
+
const kindOf$1 = (value) => Array.isArray(value) ? "array" : isObject(value) ? "object" : "primitive";
|
|
2409
|
+
function readMinor(version) {
|
|
2410
|
+
if (typeof version !== "string") return;
|
|
2411
|
+
const match = /^1\.([012])\.\d+$/.exec(version);
|
|
2412
|
+
if (!match) return;
|
|
2413
|
+
const minor = Number(match[1]);
|
|
2414
|
+
return minor === 0 || minor === 1 || minor === 2 ? minor : void 0;
|
|
2415
|
+
}
|
|
2416
|
+
/**
|
|
2417
|
+
* An Action Object needs a string target; the other fields are read
|
|
2418
|
+
* defensively.
|
|
2419
|
+
*/
|
|
2420
|
+
const isAction = (entry) => typeof entry["target"] === "string";
|
|
2421
|
+
function report(reporter, severity, code, message, pointer) {
|
|
2422
|
+
reporter.diagnostics.push({
|
|
2423
|
+
code,
|
|
2424
|
+
severity,
|
|
2425
|
+
message,
|
|
2426
|
+
pointer: `${reporter.prefix}${pointer}`
|
|
2427
|
+
});
|
|
2428
|
+
}
|
|
2429
|
+
/**
|
|
2430
|
+
* Expands a Reusable Action Reference (Overlay 1.2 § 4.5.6) into a plain
|
|
2431
|
+
* action: the referenced `fields`, then the reference's own fields on top.
|
|
2432
|
+
*/
|
|
2433
|
+
function resolveReference(overlay, entry, pointer, reporter) {
|
|
2434
|
+
const { $ref: ref, ...own } = entry;
|
|
2435
|
+
if (typeof ref !== "string" || !ref.startsWith(REF_PREFIX)) {
|
|
2436
|
+
report(reporter, "error", "overlay-ref-unresolved", `The reusable action reference ${String(ref)} does not point under ${REF_PREFIX}`, pointer);
|
|
2437
|
+
return;
|
|
2438
|
+
}
|
|
2439
|
+
const name = decodePointerToken(ref.slice(21));
|
|
2440
|
+
const components = "components" in overlay ? overlay.components : void 0;
|
|
2441
|
+
const reusables = isObject(components) ? components["actions"] : void 0;
|
|
2442
|
+
const reusable = isObject(reusables) && Object.hasOwn(reusables, name) ? reusables[name] : void 0;
|
|
2443
|
+
if (!isObject(reusable)) {
|
|
2444
|
+
report(reporter, "error", "overlay-ref-unresolved", `The reusable action ${ref} does not exist in components.actions`, pointer);
|
|
2445
|
+
return;
|
|
2446
|
+
}
|
|
2447
|
+
const fields = isObject(reusable["fields"]) ? { ...reusable["fields"] } : {};
|
|
2448
|
+
if ("target" in fields) {
|
|
2449
|
+
report(reporter, "warning", "overlay-invalid-action", `The reusable action ${ref} sets target, which only the reference may set; it is ignored`, pointer);
|
|
2450
|
+
delete fields["target"];
|
|
2451
|
+
}
|
|
2452
|
+
return {
|
|
2453
|
+
...fields,
|
|
2454
|
+
...own
|
|
2455
|
+
};
|
|
2456
|
+
}
|
|
2457
|
+
function resolve(document, segments) {
|
|
2458
|
+
let parent = void 0;
|
|
2459
|
+
let key = void 0;
|
|
2460
|
+
let value = document;
|
|
2461
|
+
for (const segment of segments) {
|
|
2462
|
+
parent = value;
|
|
2463
|
+
key = segment;
|
|
2464
|
+
value = typeof segment === "number" ? Array.isArray(value) ? value[segment] : void 0 : isObject(value) ? value[segment] : void 0;
|
|
2465
|
+
}
|
|
2466
|
+
return {
|
|
2467
|
+
parent,
|
|
2468
|
+
key,
|
|
2469
|
+
value
|
|
2470
|
+
};
|
|
2471
|
+
}
|
|
2472
|
+
const escapeToken = (segment) => `/${String(segment).replaceAll("~", "~0").replaceAll("/", "~1")}`;
|
|
2473
|
+
const toPointer = (segments) => segments.map(escapeToken).join("");
|
|
2474
|
+
/**
|
|
2475
|
+
* Merges `source` into `target` recursively (§ 4.5.4.1) and collects the
|
|
2476
|
+
* conflicting pointers.
|
|
2477
|
+
*/
|
|
2478
|
+
function mergeInto(target, source, at, conflicts) {
|
|
2479
|
+
for (const [key, value] of Object.entries(source)) {
|
|
2480
|
+
if (!Object.hasOwn(target, key)) {
|
|
2481
|
+
target[key] = value;
|
|
2482
|
+
continue;
|
|
2483
|
+
}
|
|
2484
|
+
const current = target[key];
|
|
2485
|
+
if (kindOf$1(current) !== kindOf$1(value)) {
|
|
2486
|
+
conflicts.push(`${at}${escapeToken(key)}`);
|
|
2487
|
+
continue;
|
|
2488
|
+
}
|
|
2489
|
+
if (isObject(current) && isObject(value)) mergeInto(current, value, `${at}${escapeToken(key)}`, conflicts);
|
|
2490
|
+
else if (isArray(current) && isArray(value)) current.push(...value);
|
|
2491
|
+
else target[key] = value;
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
function select(state, expression, options, reporter, pointer, field) {
|
|
2495
|
+
try {
|
|
2496
|
+
return options.jsonpath.paths(state.document, expression).map(parseNormalizedPath);
|
|
2497
|
+
} catch (error) {
|
|
2498
|
+
report(reporter, "error", "overlay-invalid-target", `The ${field} ${JSON.stringify(expression)} is not a valid RFC 9535 query: ${error instanceof Error ? error.message : String(error)}`, pointer);
|
|
2499
|
+
return;
|
|
2500
|
+
}
|
|
2501
|
+
}
|
|
2502
|
+
function removeNodes(state, targets, reporter, pointer) {
|
|
2503
|
+
const fromArrays = /* @__PURE__ */ new Map();
|
|
2504
|
+
for (const segments of targets) {
|
|
2505
|
+
const { parent, key } = resolve(state.document, segments);
|
|
2506
|
+
if (key === void 0) {
|
|
2507
|
+
report(reporter, "error", "overlay-invalid-action", "The action removes the document root, which is not allowed", pointer);
|
|
2508
|
+
continue;
|
|
2509
|
+
}
|
|
2510
|
+
if (Array.isArray(parent) && typeof key === "number") {
|
|
2511
|
+
const indexes = fromArrays.get(parent) ?? [];
|
|
2512
|
+
indexes.push(key);
|
|
2513
|
+
fromArrays.set(parent, indexes);
|
|
2514
|
+
} else if (isObject(parent) && typeof key === "string") delete parent[key];
|
|
2515
|
+
}
|
|
2516
|
+
for (const [array, indexes] of fromArrays) for (const index of [...new Set(indexes)].toSorted((a, b) => b - a)) array.splice(index, 1);
|
|
2517
|
+
}
|
|
2518
|
+
function updateNodes(state, targets, value, reporter, pointer) {
|
|
2519
|
+
const nodes = targets.map((segments) => ({
|
|
2520
|
+
segments,
|
|
2521
|
+
...resolve(state.document, segments)
|
|
2522
|
+
}));
|
|
2523
|
+
const kinds = new Set(nodes.map((node) => kindOf$1(node.value)));
|
|
2524
|
+
if (kinds.size > 1) {
|
|
2525
|
+
report(reporter, "error", "overlay-mixed-targets", `The target selects ${[...kinds].join(" and ")} nodes; an update needs nodes of one kind`, pointer);
|
|
2526
|
+
return;
|
|
2527
|
+
}
|
|
2528
|
+
const valueKind = kindOf$1(value);
|
|
2529
|
+
for (const node of nodes) {
|
|
2530
|
+
const copy = structuredClone(value);
|
|
2531
|
+
const at = toPointer(node.segments) || "the root";
|
|
2532
|
+
if (isArray(node.value)) {
|
|
2533
|
+
if (isArray(copy)) node.value.push(...copy);
|
|
2534
|
+
else node.value.push(copy);
|
|
2535
|
+
continue;
|
|
2536
|
+
}
|
|
2537
|
+
if (isObject(node.value)) {
|
|
2538
|
+
if (!isObject(copy)) {
|
|
2539
|
+
report(reporter, "error", "overlay-merge-conflict", `Cannot merge a${valueKind === "array" ? "n array" : " primitive"} into the object at ${at}`, pointer);
|
|
2540
|
+
continue;
|
|
2541
|
+
}
|
|
2542
|
+
const conflicts = [];
|
|
2543
|
+
mergeInto(node.value, copy, toPointer(node.segments), conflicts);
|
|
2544
|
+
for (const conflict of conflicts) report(reporter, "error", "overlay-merge-conflict", `Cannot merge values of different kinds at ${conflict}`, pointer);
|
|
2545
|
+
continue;
|
|
2546
|
+
}
|
|
2547
|
+
if (valueKind !== "primitive") {
|
|
2548
|
+
report(reporter, "error", "overlay-merge-conflict", `Cannot replace the primitive at ${at} with a${valueKind === "array" ? "n array" : "n object"}`, pointer);
|
|
2549
|
+
continue;
|
|
2550
|
+
}
|
|
2551
|
+
if (node.key === void 0) state.document = copy;
|
|
2552
|
+
else if (Array.isArray(node.parent) && typeof node.key === "number") node.parent[node.key] = copy;
|
|
2553
|
+
else if (isObject(node.parent) && typeof node.key === "string") node.parent[node.key] = copy;
|
|
2554
|
+
}
|
|
2555
|
+
}
|
|
2556
|
+
function runAction(state, action, minor, options, reporter, pointer) {
|
|
2557
|
+
if (action.remove !== true && action.update === void 0 && action.copy !== void 0 && minor === 0) {
|
|
2558
|
+
report(reporter, "error", "overlay-version-feature", "copy needs Overlay 1.1 or later; the action is skipped", pointer);
|
|
2559
|
+
return;
|
|
2560
|
+
}
|
|
2561
|
+
const targets = select(state, action.target, options, reporter, pointer, "target");
|
|
2562
|
+
if (!targets) return;
|
|
2563
|
+
if (targets.length === 0) {
|
|
2564
|
+
if (action[ALLOW_EMPTY] !== true && options.allowEmpty !== true) report(reporter, "error", "overlay-no-match", `The target ${action.target} selects no nodes; set ${ALLOW_EMPTY}: true on the action if that is expected`, pointer);
|
|
2565
|
+
return;
|
|
2566
|
+
}
|
|
2567
|
+
if (action.remove === true) {
|
|
2568
|
+
removeNodes(state, targets, reporter, pointer);
|
|
2569
|
+
return;
|
|
2570
|
+
}
|
|
2571
|
+
if (action.update !== void 0) {
|
|
2572
|
+
updateNodes(state, targets, action.update, reporter, pointer);
|
|
2573
|
+
return;
|
|
2574
|
+
}
|
|
2575
|
+
if (typeof action.copy === "string") {
|
|
2576
|
+
const sources = select(state, action.copy, options, reporter, pointer, "copy source");
|
|
2577
|
+
if (!sources) return;
|
|
2578
|
+
const [source] = sources;
|
|
2579
|
+
if (sources.length !== 1 || !source) {
|
|
2580
|
+
report(reporter, "error", "overlay-copy-source", `The copy source ${action.copy} selects ${sources.length} nodes; it must select exactly one`, pointer);
|
|
2581
|
+
return;
|
|
2582
|
+
}
|
|
2583
|
+
updateNodes(state, targets, resolve(state.document, source).value, reporter, pointer);
|
|
2584
|
+
return;
|
|
2585
|
+
}
|
|
2586
|
+
report(reporter, "warning", "overlay-empty-action", "The action has no update, copy or remove, so it changes nothing", pointer);
|
|
2587
|
+
}
|
|
2588
|
+
/** Applies one overlay to `state.document` in place. */
|
|
2589
|
+
function applyInPlace(state, overlay, options, reporter) {
|
|
2590
|
+
const minor = readMinor(overlay.overlay);
|
|
2591
|
+
if (minor === void 0) {
|
|
2592
|
+
report(reporter, "error", "overlay-version-unsupported", `Overlay version ${overlay.overlay} is not supported; use 1.0.x, 1.1.x or 1.2.x`, "/overlay");
|
|
2593
|
+
return;
|
|
2594
|
+
}
|
|
2595
|
+
if (!Array.isArray(overlay.actions)) {
|
|
2596
|
+
report(reporter, "error", "overlay-invalid-action", "The overlay has no actions array", "/actions");
|
|
2597
|
+
return;
|
|
2598
|
+
}
|
|
2599
|
+
const actions = overlay.actions;
|
|
2600
|
+
for (const [index, entry] of actions.entries()) {
|
|
2601
|
+
const pointer = `/actions/${index}`;
|
|
2602
|
+
if (!isObject(entry)) {
|
|
2603
|
+
report(reporter, "error", "overlay-invalid-action", "The action is not an object", pointer);
|
|
2604
|
+
continue;
|
|
2605
|
+
}
|
|
2606
|
+
if ("$ref" in entry && minor < 2) report(reporter, "warning", "overlay-version-feature", `Reusable actions need Overlay 1.2; the reference is expanded for this ${overlay.overlay} overlay`, pointer);
|
|
2607
|
+
const action = "$ref" in entry ? resolveReference(overlay, entry, pointer, reporter) : entry;
|
|
2608
|
+
if (!action) continue;
|
|
2609
|
+
if (!isAction(action)) {
|
|
2610
|
+
report(reporter, "error", "overlay-invalid-action", "The action has no target", pointer);
|
|
2611
|
+
continue;
|
|
2612
|
+
}
|
|
2613
|
+
runAction(state, action, minor, options, reporter, pointer);
|
|
2614
|
+
}
|
|
2615
|
+
}
|
|
2616
|
+
/**
|
|
2617
|
+
* Applies an Overlay 1.0, 1.1 or 1.2 document to `document` and returns a new
|
|
2618
|
+
* document. The input is cloned once with `structuredClone` and never changed;
|
|
2619
|
+
* each target runs once through `options.jsonpath`.
|
|
2620
|
+
*
|
|
2621
|
+
* Actions run in order, each on the result of the previous one (Overlay §
|
|
2622
|
+
* 4.5.1.1). `update` merges objects, concatenates or appends to arrays and
|
|
2623
|
+
* replaces primitives; `remove` deletes the selected nodes; `copy` (1.1 and
|
|
2624
|
+
* later) uses the value of the single node its query selects. Reusable action
|
|
2625
|
+
* references (1.2) are expanded, with a warning when the overlay declares 1.0
|
|
2626
|
+
* or 1.1.
|
|
2627
|
+
*
|
|
2628
|
+
* Problems never throw: they are diagnostics, and the failing action is
|
|
2629
|
+
* skipped. A target that selects nothing reports `overlay-no-match` as an error
|
|
2630
|
+
* unless the action sets `x-better-supabase-allow-empty: true` or the options
|
|
2631
|
+
* set `allowEmpty`. The other codes are `overlay-invalid-target`,
|
|
2632
|
+
* `overlay-invalid-action`, `overlay-mixed-targets`, `overlay-merge-conflict`,
|
|
2633
|
+
* `overlay-copy-source`, `overlay-ref-unresolved`, `overlay-version-feature`,
|
|
2634
|
+
* `overlay-version-unsupported` and `overlay-empty-action`.
|
|
2635
|
+
*
|
|
2636
|
+
* The result keeps the input's type; an overlay that changes the shape needs
|
|
2637
|
+
* the caller to narrow it.
|
|
2638
|
+
*
|
|
2639
|
+
* @example
|
|
2640
|
+
* const jsonpath = await loadJsonPath();
|
|
2641
|
+
* const { document, diagnostics } = applyOverlay(openapi, overlay, {
|
|
2642
|
+
* jsonpath,
|
|
2643
|
+
* });
|
|
2644
|
+
*/
|
|
2645
|
+
function applyOverlay(document, overlay, options) {
|
|
2646
|
+
return run(document, [overlay], options, () => "");
|
|
2647
|
+
}
|
|
2648
|
+
/**
|
|
2649
|
+
* Applies overlays in order, each to the result of the previous one, with a
|
|
2650
|
+
* single clone of the input. Diagnostic pointers start with the overlay's index
|
|
2651
|
+
* (`/1/actions/0`).
|
|
2652
|
+
*/
|
|
2653
|
+
function applyOverlays(document, overlays, options) {
|
|
2654
|
+
return run(document, overlays, options, (index) => `/${index}`);
|
|
2655
|
+
}
|
|
2656
|
+
function run(document, overlays, options, prefix) {
|
|
2657
|
+
const state = { document: structuredClone(document) };
|
|
2658
|
+
const diagnostics = [];
|
|
2659
|
+
for (const [index, overlay] of overlays.entries()) applyInPlace(state, overlay, options, {
|
|
2660
|
+
prefix: prefix(index),
|
|
2661
|
+
diagnostics
|
|
2662
|
+
});
|
|
2663
|
+
return {
|
|
2664
|
+
document: state.document,
|
|
2665
|
+
diagnostics
|
|
2666
|
+
};
|
|
2667
|
+
}
|
|
2668
|
+
//#endregion
|
|
2669
|
+
//#region src/overlay/define.ts
|
|
2670
|
+
const isReference = (action) => "$ref" in action;
|
|
2671
|
+
const isPlain = (action) => !("$ref" in action);
|
|
2672
|
+
function defineOverlay(input) {
|
|
2673
|
+
const { overlay: declared, ...rest } = input;
|
|
2674
|
+
if (input.actions.length === 0) throw new TypeError("defineOverlay: an overlay needs at least one action");
|
|
2675
|
+
const references = input.actions.filter(isReference);
|
|
2676
|
+
const uses12 = input.components !== void 0 || input.$self !== void 0 || references.length > 0;
|
|
2677
|
+
const version = declared ?? (uses12 ? "1.2.0" : "1.1.0");
|
|
2678
|
+
if (version !== "1.2.0" && uses12) throw new TypeError(`defineOverlay: reusable actions, components and $self need overlay 1.2.0, not ${version}`);
|
|
2679
|
+
if (version === "1.0.0" && input.actions.some((action) => !isReference(action) && action.copy !== void 0)) throw new TypeError("defineOverlay: copy needs overlay 1.1.0 or later");
|
|
2680
|
+
for (const field of ["extends", "$self"]) if (input[field]?.includes("#")) throw new TypeError(`defineOverlay: ${field} must not contain a fragment`);
|
|
2681
|
+
const reusables = input.components?.actions ?? {};
|
|
2682
|
+
for (const reference of references) {
|
|
2683
|
+
const name = decodePointerToken(reference.$ref.slice(21));
|
|
2684
|
+
if (!Object.hasOwn(reusables, name)) throw new TypeError(`defineOverlay: ${reference.$ref} does not exist in components.actions`);
|
|
2685
|
+
}
|
|
2686
|
+
switch (version) {
|
|
2687
|
+
case "1.2.0": return {
|
|
2688
|
+
overlay: version,
|
|
2689
|
+
...rest
|
|
2690
|
+
};
|
|
2691
|
+
case "1.1.0":
|
|
2692
|
+
case "1.0.0": return {
|
|
2693
|
+
overlay: version,
|
|
2694
|
+
...rest,
|
|
2695
|
+
actions: input.actions.filter(isPlain)
|
|
2696
|
+
};
|
|
2697
|
+
default: throw new TypeError(`defineOverlay: unsupported overlay ${String(version)}`);
|
|
2698
|
+
}
|
|
2699
|
+
}
|
|
2700
|
+
/**
|
|
2701
|
+
* Turns an overlay into an equivalent Overlay 1.1 document for tools that do
|
|
2702
|
+
* not read 1.2: every reusable action reference becomes a plain action, and
|
|
2703
|
+
* `$self` and `components` are dropped. A reference that does not resolve is
|
|
2704
|
+
* left out and reported as `overlay-ref-unresolved`.
|
|
2705
|
+
*/
|
|
2706
|
+
function expandReusableActions(overlay) {
|
|
2707
|
+
const reporter = {
|
|
2708
|
+
prefix: "",
|
|
2709
|
+
diagnostics: []
|
|
2710
|
+
};
|
|
2711
|
+
const actions = [];
|
|
2712
|
+
const entries = overlay.actions;
|
|
2713
|
+
for (const [index, entry] of entries.entries()) {
|
|
2714
|
+
if (!isObject(entry)) continue;
|
|
2715
|
+
const action = "$ref" in entry ? resolveReference(overlay, entry, `/actions/${index}`, reporter) : entry;
|
|
2716
|
+
if (action && isAction(action)) actions.push(action);
|
|
2717
|
+
}
|
|
2718
|
+
const extensions = Object.fromEntries(Object.entries(overlay).filter(([key]) => key.startsWith("x-")));
|
|
2719
|
+
return {
|
|
2720
|
+
overlay: {
|
|
2721
|
+
overlay: "1.1.0",
|
|
2722
|
+
info: overlay.info,
|
|
2723
|
+
...overlay.extends === void 0 ? {} : { extends: overlay.extends },
|
|
2724
|
+
actions,
|
|
2725
|
+
...extensions
|
|
2726
|
+
},
|
|
2727
|
+
diagnostics: reporter.diagnostics
|
|
2728
|
+
};
|
|
2729
|
+
}
|
|
2730
|
+
//#endregion
|
|
2731
|
+
//#region src/overlay/diff.ts
|
|
2732
|
+
const kindOf = (value) => Array.isArray(value) ? "array" : isObject(value) ? "object" : "primitive";
|
|
2733
|
+
function equal(a, b) {
|
|
2734
|
+
if (a === b) return true;
|
|
2735
|
+
if (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((item, i) => equal(item, b[i]));
|
|
2736
|
+
if (isObject(a) && isObject(b)) {
|
|
2737
|
+
const keys = Object.keys(a);
|
|
2738
|
+
return keys.length === Object.keys(b).length && keys.every((key) => Object.hasOwn(b, key) && equal(a[key], b[key]));
|
|
2739
|
+
}
|
|
2740
|
+
return false;
|
|
2741
|
+
}
|
|
2742
|
+
/**
|
|
2743
|
+
* Appends the actions that turn the array `a` into `b`, or returns `false` when
|
|
2744
|
+
* the change needs the array replaced as a whole.
|
|
2745
|
+
*/
|
|
2746
|
+
function diffArray(path, a, b, ctx) {
|
|
2747
|
+
if (b.length >= a.length && a.every((item, i) => equal(item, b[i]))) {
|
|
2748
|
+
if (b.length > a.length) ctx.actions.push({
|
|
2749
|
+
target: formatPath(path),
|
|
2750
|
+
update: b.slice(a.length)
|
|
2751
|
+
});
|
|
2752
|
+
return true;
|
|
2753
|
+
}
|
|
2754
|
+
if (a.length !== b.length) return false;
|
|
2755
|
+
const pending = [];
|
|
2756
|
+
for (const [i, item] of a.entries()) {
|
|
2757
|
+
const next = b[i];
|
|
2758
|
+
if (equal(item, next)) continue;
|
|
2759
|
+
if (!isObject(item) || !isObject(next)) return false;
|
|
2760
|
+
diffObject([...path, i], item, next, {
|
|
2761
|
+
...ctx,
|
|
2762
|
+
actions: pending
|
|
2763
|
+
});
|
|
2764
|
+
}
|
|
2765
|
+
ctx.actions.push(...pending);
|
|
2766
|
+
return true;
|
|
2767
|
+
}
|
|
2768
|
+
function diffObject(path, a, b, ctx) {
|
|
2769
|
+
const removals = [];
|
|
2770
|
+
const added = {};
|
|
2771
|
+
const nested = [];
|
|
2772
|
+
const replace = (key, value) => {
|
|
2773
|
+
removals.push({
|
|
2774
|
+
target: formatPath([...path, key]),
|
|
2775
|
+
remove: true
|
|
2776
|
+
});
|
|
2777
|
+
added[key] = value;
|
|
2778
|
+
};
|
|
2779
|
+
for (const key of Object.keys(a)) if (!Object.hasOwn(b, key)) removals.push({
|
|
2780
|
+
target: formatPath([...path, key]),
|
|
2781
|
+
remove: true
|
|
2782
|
+
});
|
|
2783
|
+
for (const [key, next] of Object.entries(b)) {
|
|
2784
|
+
if (!Object.hasOwn(a, key)) {
|
|
2785
|
+
added[key] = next;
|
|
2786
|
+
continue;
|
|
2787
|
+
}
|
|
2788
|
+
const current = a[key];
|
|
2789
|
+
if (equal(current, next)) continue;
|
|
2790
|
+
if (kindOf(current) !== kindOf(next)) replace(key, next);
|
|
2791
|
+
else if (isObject(current) && isObject(next)) diffObject([...path, key], current, next, {
|
|
2792
|
+
...ctx,
|
|
2793
|
+
actions: nested
|
|
2794
|
+
});
|
|
2795
|
+
else if (Array.isArray(current) && Array.isArray(next)) {
|
|
2796
|
+
if (!diffArray([...path, key], current, next, {
|
|
2797
|
+
...ctx,
|
|
2798
|
+
actions: nested
|
|
2799
|
+
})) replace(key, next);
|
|
2800
|
+
} else if (ctx.replacePrimitives) nested.push({
|
|
2801
|
+
target: formatPath([...path, key]),
|
|
2802
|
+
update: next
|
|
2803
|
+
});
|
|
2804
|
+
else replace(key, next);
|
|
2805
|
+
}
|
|
2806
|
+
ctx.actions.push(...removals);
|
|
2807
|
+
if (Object.keys(added).length > 0) ctx.actions.push({
|
|
2808
|
+
target: formatPath(path),
|
|
2809
|
+
update: added
|
|
2810
|
+
});
|
|
2811
|
+
ctx.actions.push(...nested);
|
|
2812
|
+
}
|
|
2813
|
+
/**
|
|
2814
|
+
* Writes the Overlay that turns `base` into `enriched`, so other tools can
|
|
2815
|
+
* reproduce what hooks and transforms changed. Targets use stable keys
|
|
2816
|
+
* (`$.paths['/customers'].get`); array indexes appear only inside arrays of the
|
|
2817
|
+
* same length.
|
|
2818
|
+
*
|
|
2819
|
+
* A deleted key becomes a `remove` action; added keys become one `update` on
|
|
2820
|
+
* their parent; a changed primitive becomes an `update` on it (1.1 and later)
|
|
2821
|
+
* or a `remove` and re-add (1.0). An array that only grew gets its new items
|
|
2822
|
+
* appended; any other array change replaces the array. Applying the result to
|
|
2823
|
+
* `base` gives a document equal to `enriched`, though replaced keys move to the
|
|
2824
|
+
* end of their object.
|
|
2825
|
+
*
|
|
2826
|
+
* Throws a `TypeError` when the roots are not both objects, or when the two
|
|
2827
|
+
* documents are equal (an overlay needs at least one action).
|
|
2828
|
+
*/
|
|
2829
|
+
function overlayFromDiff(base, enriched, options = {}) {
|
|
2830
|
+
if (!isObject(base) || !isObject(enriched)) throw new TypeError("overlayFromDiff: both documents must be objects");
|
|
2831
|
+
const version = options.version ?? "1.1.0";
|
|
2832
|
+
const actions = [];
|
|
2833
|
+
diffObject([], base, enriched, {
|
|
2834
|
+
replacePrimitives: version !== "1.0.0",
|
|
2835
|
+
actions
|
|
2836
|
+
});
|
|
2837
|
+
if (actions.length === 0) throw new TypeError("overlayFromDiff: the documents are equal, so there is nothing to write");
|
|
2838
|
+
return {
|
|
2839
|
+
overlay: version,
|
|
2840
|
+
info: options.info ?? {
|
|
2841
|
+
title: "better-supabase changes",
|
|
2842
|
+
version: "1.0.0"
|
|
2843
|
+
},
|
|
2844
|
+
...options.extends === void 0 ? {} : { extends: options.extends },
|
|
2845
|
+
actions
|
|
2846
|
+
};
|
|
2847
|
+
}
|
|
2848
|
+
//#endregion
|
|
2849
|
+
//#region src/overlay/load.ts
|
|
2850
|
+
const isEngine = (value) => typeof value === "object" && value !== null && "paths" in value && typeof value.paths === "function";
|
|
2851
|
+
/**
|
|
2852
|
+
* Imports `jsonpath-rfc9535` on first use. The specifier is a variable so
|
|
2853
|
+
* bundlers leave the optional peer out of apps that pass their own engine.
|
|
2854
|
+
*/
|
|
2855
|
+
const importEngine = () => importOptionalPeer("jsonpath-rfc9535");
|
|
2856
|
+
async function load(importer) {
|
|
2857
|
+
const module = await importer();
|
|
2858
|
+
if (!isEngine(module)) throw new TypeError("Overlays need an RFC 9535 JSONPath engine: pnpm add jsonpath-rfc9535, or pass your own { paths(document, expression) }");
|
|
2859
|
+
return module;
|
|
2860
|
+
}
|
|
2861
|
+
const cachedEngine = memoized(() => load(importEngine));
|
|
2862
|
+
/**
|
|
2863
|
+
* Loads the optional `jsonpath-rfc9535` peer, an RFC 9535 implementation that
|
|
2864
|
+
* passes the JSONPath Compliance Test Suite, for `applyOverlay`. Rejects with
|
|
2865
|
+
* an install message when the package is missing. The engine is loaded once per
|
|
2866
|
+
* module; `importer` replaces the import in tests.
|
|
2867
|
+
*/
|
|
2868
|
+
function loadJsonPath(importer) {
|
|
2869
|
+
if (importer) return load(importer);
|
|
2870
|
+
return cachedEngine();
|
|
2871
|
+
}
|
|
2872
|
+
//#endregion
|
|
2873
|
+
export { ASYNCAPI_FILE_NAME, CLOUD_EVENT_TRAIT, DEFAULT_ERRORS, OPENAPI_33_PREVIEW_VERSION, PROBLEM_SCHEMA, SPEC_UIS, SPEC_UI_PACKAGES, applyOverlay, applyOverlays, arazzoFormat, asyncapiFormat, authWorkflow, buildApiModel, createArazzo, createArazzoFormat, createAsyncApi, createOpenApi, createThenGetWorkflows, defineApi, defineDocumentFormat, defineOverlay, defineWorkflow, expandReusableActions, functionRoute, loadJsonPath, mergeJson, openapiFormat, overlayFromDiff, paginationWorkflows, pointerToken, scalarPreset, serializeDocument, specReference, specReferenceCsp, specReferenceHtml, specResponse, toOpenApi30Schema, topicsFrom };
|