@voltro/cli 0.33.0 → 0.34.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/CHANGELOG.md +1801 -0
- package/bin/nodeEnvironment.d.mts +30 -0
- package/bin/nodeEnvironment.mjs +158 -0
- package/bin/voltro.mjs +69 -5
- package/dist/addCommand-BNeoeSxe.js +124 -0
- package/dist/addCommand-aXSQveak.js +2 -0
- package/dist/agentsMd-BTchIZku.js +2 -0
- package/dist/agentsMd-mhQMF1bx.js +254 -0
- package/dist/apiBuild-BICVGnEC.js +2 -0
- package/dist/{apiBuild-h9VHtnlw.js → apiBuild-DZF_f0_I.js} +46 -46
- package/dist/appPort-B_HpJ_ck.js +48 -0
- package/dist/baselineCommand-C2ClWZN3.js +2 -0
- package/dist/baselineCommand-DIttzO8A.js +227 -0
- package/dist/bin.js +71 -28
- package/dist/build-CE7Ca9gm.js +711 -0
- package/dist/cacheCommand-DA4OH9xt.js +42 -0
- package/dist/capabilitiesCommand-nq_pz5xd.js +123 -0
- package/dist/checkCommand-Dv8r9tGO.js +231 -0
- package/dist/checkCommand-YZDmkAGd.js +2 -0
- package/dist/{cliArgs-qdZSElM3.js → cliArgs-D4p8n7EE.js} +12 -1
- package/dist/cliError-BmdYnghb.js +10 -0
- package/dist/cliOutput-D1tSBoRM.js +15 -0
- package/dist/{cliRuntime-Oh517vCV.js → cliRuntime-Dh7UDinH.js} +20 -20
- package/dist/cloudClient-DWL-Hw_T.js +67 -0
- package/dist/cloudCmd-Cvv5HGaZ.js +364 -0
- package/dist/clusterCmd-CNXKlcvD.js +54 -0
- package/dist/codegen-CYM3Zqrf.js +605 -0
- package/dist/codegen-ChBi_hVa.js +2 -0
- package/dist/codegenCommand-DC6w2tNZ.js +30 -0
- package/dist/codemodRunner-DRRqXR74.js +5243 -0
- package/dist/commandRunner-BLAEFLjp.js +47 -0
- package/dist/commands-gutsz-Ac.js +808 -0
- package/dist/connectionConfig-UFlIEiys.js +66 -0
- package/dist/dashboardCommand-3YG8p-UA.js +25 -0
- package/dist/dataCommand-qL0r7fPO.js +535 -0
- package/dist/dataProfile-dW-PsfLB.js +15 -0
- package/dist/{dbCommand-DTLKAfbA.js → dbCommand-B6X0FZbq.js} +551 -401
- package/dist/dbCommand-CpdKLeQq.js +2 -0
- package/dist/{dev-C_P8FLSx.js → dev-CerMd0mW.js} +3122 -3129
- package/dist/dev-CoG-ZPx8.js +3 -0
- package/dist/devActivity-Dx_3nnGv.js +100 -0
- package/dist/devActivity.js +1 -1
- package/dist/dialectDriver-CgXnDfec.js +39 -0
- package/dist/discover-C9XKJDco.js +25 -0
- package/dist/doctorCommand-BvqGBwNG.js +2 -0
- package/dist/{checkCommand-xGhRFFg2.js → doctorCommand-CnDXQxfa.js} +520 -1278
- package/dist/dormancyCommand-Dszo57d6.js +69 -0
- package/dist/e2eCmd-BRabZww-.js +147 -0
- package/dist/embeddingsCommand-C0sKVRo1.js +73 -0
- package/dist/envCommand-DPgdV1Bq.js +60 -0
- package/dist/evalCommand-6RUfPen4.js +118 -0
- package/dist/evolveCommand-DHpkgjgH.js +281 -0
- package/dist/fileTaxonomy-CJfgOllU.js +457 -0
- package/dist/frameworkTableAssembly-BGHmck-x.js +2 -0
- package/dist/{frameworkTableAssembly-BwIrO5nv.js → frameworkTableAssembly-DkkP6BgC.js} +184 -148
- package/dist/generateCommand-oibemh97.js +147 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +4 -3
- package/dist/infoCommand-BJw9nLUR.js +60 -0
- package/dist/{inspect-BUUjt773.js → inspect-CBqFtAKA.js} +82 -40
- package/dist/inspect-C_T_WGvl.js +2 -0
- package/dist/inspectCmd-Bppy-GGw.js +224 -0
- package/dist/inspectFetch-Cm8_wVvp.js +151 -0
- package/dist/inspectMetrics-CfdKLh6t.js +72 -0
- package/dist/loadEnv-D9nEOClM.js +44 -0
- package/dist/logFileSink-C_D2wRN1.js +105 -0
- package/dist/logsCmd-CCca3KRZ.js +260 -0
- package/dist/manifestBuild-ChsKAhmn.js +2 -0
- package/dist/{manifestBuild-BLrVuSlM.js → manifestBuild-sxpwdKY1.js} +1 -1
- package/dist/metaCommands-7MJfZ5cf.js +196 -0
- package/dist/migrate-CBwOt_iV.js +83 -0
- package/dist/mssqlClusterPatch-_4cE_nun.js +44 -0
- package/dist/newCommand-COWOJ1_E.js +156 -0
- package/dist/nodeEnvironment-cGFAj1J8.js +28 -0
- package/dist/packageCommand-Cug_3Ogl.js +271 -0
- package/dist/pageConvention-cEiRxdab.js +5 -0
- package/dist/privacyCommand-C-Df56U_.js +146 -0
- package/dist/projectScaffold-DmzEKHib.js +2 -0
- package/dist/projectScaffold-LMMtaavR.js +814 -0
- package/dist/renderModeScan-D7J1B7Kw.js +105 -0
- package/dist/renderProfile-1OWWAAtx.js +81 -0
- package/dist/runtimeRegistry-DMeKfTHP.js +81 -0
- package/dist/runtimeTrace-CRxalXTs.js +91 -0
- package/dist/scheduleCmd--jksTrf6.js +69 -0
- package/dist/scheduleManifestCmd-D2x0CTTY.js +249 -0
- package/dist/schemaIr-UJybUUZW.js +103 -0
- package/dist/{sdkgen-C81QIkiL.js → sdkgen-CYJscZC7.js} +111 -209
- package/dist/seedRunner-TFHHiToI.js +329 -0
- package/dist/serveCommand-B_isw7q4.js +1647 -0
- package/dist/serveCommand-DOvbgRnQ.js +2 -0
- package/dist/serveEntry.js +5 -5
- package/dist/serverlessCommand-CfJZy6dS.js +482 -0
- package/dist/start-9LiUOfES.js +1087 -0
- package/dist/start-B-9Nsp-S.js +3 -0
- package/dist/startEntry.js +2 -2
- package/dist/staticCommand-Dr2M6tpU.js +304 -0
- package/dist/storageCommand-Co6NfLqN.js +42 -0
- package/dist/templates-De8IR5-c.js +102 -0
- package/dist/test-CI6iDsYc.js +115 -0
- package/dist/tracesCmd-CkEZQrtt.js +232 -0
- package/dist/tsconfigPaths-BWXBWgcl.js +107 -0
- package/dist/tsxLoader-EuXmSJ1K.js +51 -0
- package/dist/typecheckCommand-BlsWiCNq.js +61 -0
- package/dist/updateCommand-Bkptutss.js +585 -0
- package/dist/updateCommand-us1_hdIC.js +2 -0
- package/dist/{inspectMetrics-1xzTKAFx.js → webDev-CBYvPqQr.js} +975 -1559
- package/dist/webDev-Cg-fFiyd2.js +2 -0
- package/dist/webhookDiscovery-CrGAfhIG.js +2 -0
- package/dist/webhookDiscovery-D7VaeMlz.js +51 -0
- package/dist/webhooksCommand-CID96Rga.js +267 -0
- package/dist/workflowsCmd-D1VTmLMY.js +608 -0
- package/package.json +179 -17
- package/templates/AGENTS.core.md +58 -3
- package/templates/AGENTS.md +64 -7
- package/templates/agent-docs/_index.md +6 -4
- package/templates/agent-docs/_manifest.json +22 -5
- package/templates/agent-docs/ai.md +370 -0
- package/templates/agent-docs/authentication.md +265 -31
- package/templates/agent-docs/caching.md +6 -0
- package/templates/agent-docs/cli.md +794 -50
- package/templates/agent-docs/data.md +550 -11
- package/templates/agent-docs/database/migrations.md +174 -25
- package/templates/agent-docs/database/misc.md +156 -40
- package/templates/agent-docs/database/querying.md +19 -1
- package/templates/agent-docs/database/scaling.md +60 -0
- package/templates/agent-docs/database/schema.md +1 -0
- package/templates/agent-docs/database/seedsdialects.md +208 -19
- package/templates/agent-docs/database/transactions.md +68 -0
- package/templates/agent-docs/deployment.md +69 -3
- package/templates/agent-docs/introduction.md +87 -16
- package/templates/agent-docs/local-first-mobile.md +79 -4
- package/templates/agent-docs/multi-tenancy.md +95 -20
- package/templates/agent-docs/observability.md +58 -3
- package/templates/agent-docs/plugins/ai-flows.md +161 -2
- package/templates/agent-docs/plugins/analytics-postgres.md +1 -1
- package/templates/agent-docs/plugins/audit.md +37 -1
- package/templates/agent-docs/plugins/auth-social.md +143 -0
- package/templates/agent-docs/plugins/auth-workos.md +4 -2
- package/templates/agent-docs/plugins/auth.md +131 -6
- package/templates/agent-docs/plugins/billing.md +132 -15
- package/templates/agent-docs/plugins/cdc-out.md +46 -7
- package/templates/agent-docs/plugins/clickhouse.md +1 -1
- package/templates/agent-docs/plugins/duckdb.md +1 -1
- package/templates/agent-docs/plugins/flags.md +132 -0
- package/templates/agent-docs/plugins/governance.md +105 -7
- package/templates/agent-docs/plugins/multitenancy.md +9 -4
- package/templates/agent-docs/plugins/presence.md +13 -2
- package/templates/agent-docs/plugins/ratelimit.md +9 -0
- package/templates/agent-docs/plugins/search.md +157 -6
- package/templates/agent-docs/plugins/sso-saml.md +47 -8
- package/templates/agent-docs/plugins/webhooks.md +105 -0
- package/templates/agent-docs/plugins.md +150 -18
- package/templates/agent-docs/reference.md +60 -3
- package/templates/agent-docs/releases.md +1117 -0
- package/templates/agent-docs/routing.md +43 -25
- package/templates/agent-docs/scheduling.md +10 -0
- package/templates/agent-docs/schema-driven-ui.md +92 -12
- package/templates/agent-docs/security.md +426 -0
- package/templates/agent-docs/templates/apibackends.md +87 -18
- package/templates/agent-docs/templates/appshells.md +32 -14
- package/templates/agent-docs/templates/overview.md +13 -8
- package/templates/agent-docs/testing.md +211 -14
- package/templates/agent-docs/whats-new.md +1700 -104
- package/templates/agent-docs/workflows.md +130 -14
- package/templates/apps/api-ai/actions/summarize.action.ts +11 -0
- package/templates/apps/api-ai/package.json +8 -7
- package/templates/apps/api-auth/actions/me.action.ts +13 -0
- package/templates/apps/api-auth/package.json +9 -8
- package/templates/apps/api-backend/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend/package.json +12 -8
- package/templates/apps/api-backend/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +14 -0
- package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +8 -0
- package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +10 -0
- package/templates/apps/api-backend-deactivation/package.json +8 -7
- package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +17 -0
- package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-mail/package.json +9 -8
- package/templates/apps/api-backend-mail/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-mariadb/.env.example +14 -0
- package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-mariadb/package.json +10 -9
- package/templates/apps/api-backend-mariadb/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-sqlite/.env.example +14 -0
- package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-sqlite/package.json +9 -8
- package/templates/apps/api-backend-sqlite/queries/notes.query.ts +30 -8
- package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +13 -0
- package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +12 -0
- package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +9 -0
- package/templates/apps/api-backend-storage/package.json +9 -8
- package/templates/apps/api-backend-storage/queries/notes.query.ts +30 -8
- package/templates/apps/api-cms/actions/content.get.action.ts +7 -0
- package/templates/apps/api-cms/actions/content.types.action.ts +6 -0
- package/templates/apps/api-cms/actions/me.action.ts +13 -0
- package/templates/apps/api-cms/app.config.ts +19 -0
- package/templates/apps/api-cms/authz.ts +63 -0
- package/templates/apps/api-cms/mutations/content.publish.mutation.ts +10 -0
- package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +10 -0
- package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +5 -0
- package/templates/apps/api-cms/package.json +11 -10
- package/templates/apps/api-cms/queries/content.list.query.ts +23 -7
- package/templates/apps/api-cms/tests/accessDecisions.test.ts +121 -0
- package/templates/apps/api-cms/tests/content.descriptors.test.ts +8 -4
- package/templates/apps/api-collab/mutations/documents.create.mutation.ts +8 -0
- package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +13 -0
- package/templates/apps/api-collab/package.json +9 -8
- package/templates/apps/api-collab/queries/documents.query.ts +19 -7
- package/templates/apps/api-data-advanced/package.json +9 -8
- package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +12 -0
- package/templates/apps/api-data-advanced/queries/books.search.query.ts +9 -0
- package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +17 -0
- package/templates/apps/api-durable/mutations/orders.place.mutation.ts +9 -0
- package/templates/apps/api-durable/package.json +9 -8
- package/templates/apps/api-feature-flags/actions/notes.export.action.ts +16 -0
- package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +12 -0
- package/templates/apps/api-feature-flags/package.json +10 -9
- package/templates/apps/api-governance/README.md +30 -8
- package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -1
- package/templates/apps/api-governance/actions/profiles.get.action.ts +29 -4
- package/templates/apps/api-governance/database/schema.ts +16 -4
- package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +12 -0
- package/templates/apps/api-governance/package.json +9 -8
- package/templates/apps/api-kv/actions/sync.pull.action.ts +15 -0
- package/templates/apps/api-kv/actions/sync.reset.action.ts +13 -0
- package/templates/apps/api-kv/actions/sync.status.action.ts +7 -0
- package/templates/apps/api-kv/package.json +9 -8
- package/templates/apps/api-kv/queries/events.list.query.ts +19 -8
- package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +11 -0
- package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +13 -0
- package/templates/apps/api-moderation/package.json +9 -8
- package/templates/apps/api-observability/mutations/notes.create.mutation.ts +8 -0
- package/templates/apps/api-observability/package.json +9 -8
- package/templates/apps/api-observability/queries/notes.list.query.ts +13 -0
- package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +14 -0
- package/templates/apps/api-ratelimit/package.json +9 -8
- package/templates/apps/api-rbac/package.json +9 -8
- package/templates/apps/api-rest/package.json +8 -7
- package/templates/apps/api-saas/mutations/projects.create.mutation.ts +13 -0
- package/templates/apps/api-saas/package.json +12 -11
- package/templates/apps/api-saas/queries/projects.list.query.ts +11 -0
- package/templates/apps/api-saas-starter/actions/me.action.ts +13 -0
- package/templates/apps/api-saas-starter/app.config.ts +19 -0
- package/templates/apps/api-saas-starter/authz.ts +75 -0
- package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +10 -0
- package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +9 -0
- package/templates/apps/api-saas-starter/package.json +15 -11
- package/templates/apps/api-saas-starter/queries/invites.list.query.ts +19 -8
- package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -7
- package/templates/apps/api-saas-starter/tests/accessDecisions.test.ts +135 -0
- package/templates/apps/api-search/mutations/articles.create.mutation.ts +14 -0
- package/templates/apps/api-search/package.json +9 -8
- package/templates/apps/api-search/queries/articles.list.query.ts +21 -8
- package/templates/apps/api-status/README.md +10 -3
- package/templates/apps/api-status/app.config.ts +8 -3
- package/templates/apps/api-status/authz.ts +5 -3
- package/templates/apps/api-status/package.json +9 -8
- package/templates/apps/api-status/queries/components.list.query.ts +14 -6
- package/templates/apps/api-status/queries/incidents.live.query.ts +23 -10
- package/templates/apps/api-status/queries/updates.list.query.ts +16 -9
- package/templates/apps/api-status/tests/status.test.ts +9 -1
- package/templates/apps/api-versioning/actions/documents.asOf.action.ts +12 -0
- package/templates/apps/api-versioning/actions/documents.history.action.ts +13 -0
- package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +9 -0
- package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +12 -0
- package/templates/apps/api-versioning/package.json +9 -8
- package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +16 -0
- package/templates/apps/api-webhooks/package.json +10 -9
- package/templates/apps/api-webhooks/queries/orders.list.query.ts +10 -0
- package/templates/apps/changelog/package.json +8 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +10 -8
- package/templates/apps/frontend-admin/src/lib/admin.ts +20 -9
- package/templates/apps/frontend-admin/src/locales/de.ts +11 -1
- package/templates/apps/frontend-admin/src/locales/en.ts +13 -1
- package/templates/apps/frontend-admin/src/pages/admin/[entity]/page.tsx +65 -22
- package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +130 -23
- package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +3 -2
- package/templates/apps/frontend-admin/src/pages/admin/page.test.tsx +19 -2
- package/templates/apps/frontend-admin/src/pages/admin/page.tsx +9 -4
- package/templates/apps/frontend-app/app.config.ts +4 -3
- package/templates/apps/frontend-app/package.json +11 -8
- package/templates/apps/frontend-app/src/lib/api.ts +25 -0
- package/templates/apps/frontend-app/src/pages/page.test.tsx +130 -82
- package/templates/apps/frontend-app/src/pages/page.tsx +14 -18
- package/templates/apps/frontend-auth/package.json +10 -8
- package/templates/apps/frontend-blank/package.json +9 -7
- package/templates/apps/frontend-cms/package.json +11 -9
- package/templates/apps/frontend-collab/package.json +12 -9
- package/templates/apps/frontend-collab/src/pages/page.test.tsx +122 -78
- package/templates/apps/frontend-contact/package.json +9 -7
- package/templates/apps/frontend-dashboard/package.json +9 -7
- package/templates/apps/frontend-docs/package.json +9 -7
- package/templates/apps/frontend-i18n/package.json +8 -6
- package/templates/apps/frontend-landing/package.json +9 -7
- package/templates/apps/frontend-portal/package.json +10 -8
- package/templates/apps/frontend-saas/app.config.ts +10 -6
- package/templates/apps/frontend-saas/package.json +10 -8
- package/templates/apps/frontend-saas/src/lib/api.ts +27 -32
- package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +7 -8
- package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +27 -3
- package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +4 -4
- package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +3 -4
- package/templates/apps/frontend-spa/package.json +9 -7
- package/templates/apps/frontend-ssr/package.json +9 -7
- package/templates/apps/frontend-ssr-api/package.json +10 -8
- package/templates/apps/frontend-static-blog/package.json +8 -6
- package/templates/apps/frontend-status/package.json +10 -8
- package/templates/apps/mobile-app/README.md +1 -0
- package/templates/apps/mobile-app/package.json +4 -2
- package/templates/apps/mobile-app/src/app/index.tsx +22 -12
- package/templates/apps/mobile-app/src/app/orders/[id].tsx +1 -1
- package/templates/apps/mobile-app/src/lib/api.ts +34 -0
- package/templates/apps/mobile-app/voltro.mobile.ts +4 -2
- package/templates/baselines/bare/.env.example +14 -0
- package/templates/baselines/bare/baseline.json +4 -4
- package/templates/baselines/compose/.env.example +14 -0
- package/templates/baselines/compose/README.md +1 -1
- package/templates/baselines/compose/baseline.json +5 -5
- package/templates/baselines/compose-mariadb/.env.example +14 -0
- package/templates/baselines/compose-mariadb/README.md +1 -1
- package/templates/baselines/compose-mariadb/baseline.json +5 -5
- package/templates/baselines/helm/.env.example +14 -0
- package/templates/baselines/helm/baseline.json +4 -4
- package/dist/apiBuild-C-x9YacA.js +0 -2
- package/dist/checkCommand-DRovTKza.js +0 -2
- package/dist/commands-CJfepbm4.js +0 -11541
- package/dist/dbCommand-b1gum4td.js +0 -2
- package/dist/dev-iiMtlkfs.js +0 -3
- package/dist/devActivity-BhIu6ncs.js +0 -159
- package/dist/frameworkTableAssembly-D-EebUQX.js +0 -2
- package/dist/inspect-mmBuRXmy.js +0 -2
- package/dist/manifestBuild-Dj8Jjoto.js +0 -2
- package/dist/seedRunner-Bqxgp7HZ.js +0 -230
- package/dist/serveCommand-DdaM4Hup.js +0 -1608
- package/dist/start-C0koT0UO.js +0 -1084
- /package/templates/apps/api-ai/actions/{summarize.action.server.tsx → summarize.action.server.ts} +0 -0
|
@@ -1,161 +1,63 @@
|
|
|
1
|
-
import { t as e } from "./cliRuntime-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
inProgress: /* @__PURE__ */ new Set()
|
|
11
|
-
}), c = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^A-Za-z0-9]+/).filter((e) => e.length > 0), l = (e) => {
|
|
12
|
-
let t = c(e);
|
|
13
|
-
if (t.length === 0) return "Value";
|
|
14
|
-
let n = t.map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("");
|
|
15
|
-
return /^[0-9]/.test(n) ? `T${n}` : n;
|
|
16
|
-
}, u = (e) => {
|
|
17
|
-
let t = l(e);
|
|
18
|
-
return t.charAt(0).toLowerCase() + t.slice(1);
|
|
19
|
-
}, d = (e) => {
|
|
20
|
-
let t = c(e);
|
|
21
|
-
if (t.length === 0) return "VALUE";
|
|
22
|
-
let n = t.map((e) => e.toUpperCase()).join("_");
|
|
23
|
-
return /^[0-9]/.test(n) ? `V_${n}` : n;
|
|
24
|
-
}, f = (e) => typeof e == "object" && !!e && e.type === "null", p = (e) => l(e.split("/").pop() ?? e), m = (e) => e.every((e) => typeof e == "string"), h = (e, t, n) => (e.enums.has(t) || e.enums.set(t, {
|
|
25
|
-
name: t,
|
|
26
|
-
values: n
|
|
27
|
-
}), {
|
|
28
|
-
kind: "ref",
|
|
29
|
-
name: t
|
|
30
|
-
}), g = (e, t, n, r) => {
|
|
31
|
-
let i = e.$ref;
|
|
32
|
-
if (typeof i == "string") {
|
|
33
|
-
let e = p(i);
|
|
34
|
-
if (r.models.has(e) || r.enums.has(e) || r.inProgress.has(e)) return {
|
|
35
|
-
kind: "ref",
|
|
36
|
-
name: e
|
|
37
|
-
};
|
|
38
|
-
let t = n[i.split("/").pop() ?? ""];
|
|
39
|
-
if (t === void 0) return { kind: "unknown" };
|
|
40
|
-
r.inProgress.add(e);
|
|
41
|
-
let a = g(t, e, n, r);
|
|
42
|
-
return r.inProgress.delete(e), a;
|
|
43
|
-
}
|
|
44
|
-
let a = e.type;
|
|
45
|
-
if (Array.isArray(a)) {
|
|
46
|
-
let i = a.filter((e) => e !== "null"), o = a.includes("null"), s = g({
|
|
47
|
-
...e,
|
|
48
|
-
...i.length === 1 ? { type: i[0] } : { type: void 0 }
|
|
49
|
-
}, t, n, r);
|
|
50
|
-
return o ? {
|
|
51
|
-
kind: "optional",
|
|
52
|
-
inner: s
|
|
53
|
-
} : s;
|
|
54
|
-
}
|
|
55
|
-
let o = e.anyOf ?? e.oneOf;
|
|
56
|
-
if (Array.isArray(o)) {
|
|
57
|
-
let e = o.filter(f), i = o.filter((e) => !f(e));
|
|
58
|
-
if (i.length === 1 && i[0] !== void 0) {
|
|
59
|
-
let a = g(i[0], t, n, r);
|
|
60
|
-
return e.length > 0 ? {
|
|
61
|
-
kind: "optional",
|
|
62
|
-
inner: a
|
|
63
|
-
} : a;
|
|
64
|
-
}
|
|
65
|
-
return { kind: "unknown" };
|
|
66
|
-
}
|
|
67
|
-
let s = e.enum;
|
|
68
|
-
if (Array.isArray(s) && s.length > 0 && m(s)) return h(r, t, [...s]);
|
|
69
|
-
switch (a) {
|
|
70
|
-
case "string": return { kind: "string" };
|
|
71
|
-
case "integer": return { kind: "integer" };
|
|
72
|
-
case "number": return { kind: "number" };
|
|
73
|
-
case "boolean": return { kind: "boolean" };
|
|
74
|
-
case "array": {
|
|
75
|
-
let i = e.items;
|
|
76
|
-
return {
|
|
77
|
-
kind: "array",
|
|
78
|
-
element: i !== void 0 && typeof i == "object" && !Array.isArray(i) ? g(i, `${t}Item`, n, r) : { kind: "unknown" }
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
case "object": {
|
|
82
|
-
let i = e.properties;
|
|
83
|
-
if (i === void 0 || Object.keys(i).length === 0) return { kind: "unknown" };
|
|
84
|
-
let a = new Set(Array.isArray(e.required) ? e.required : []);
|
|
85
|
-
r.inProgress.add(t);
|
|
86
|
-
let o = Object.entries(i).map(([e, i]) => {
|
|
87
|
-
let o = g(i, `${t}${l(e)}`, n, r);
|
|
88
|
-
return {
|
|
89
|
-
jsonName: e,
|
|
90
|
-
type: !a.has(e) && o.kind !== "optional" ? {
|
|
91
|
-
kind: "optional",
|
|
92
|
-
inner: o
|
|
93
|
-
} : o
|
|
94
|
-
};
|
|
95
|
-
});
|
|
96
|
-
return r.inProgress.delete(t), r.models.set(t, {
|
|
97
|
-
name: t,
|
|
98
|
-
fields: o
|
|
99
|
-
}), {
|
|
100
|
-
kind: "ref",
|
|
101
|
-
name: t
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
default: return { kind: "unknown" };
|
|
105
|
-
}
|
|
106
|
-
}, _ = (e, t, n) => e === void 0 ? void 0 : g(e, t, e.$defs ?? e.definitions ?? {}, n), v = (e, t) => e.name.localeCompare(t.name), y = (e) => {
|
|
107
|
-
let t = s();
|
|
1
|
+
import { t as e } from "./cliRuntime-Dh7UDinH.js";
|
|
2
|
+
import { a as t, i as n, n as r, r as i, t as a } from "./schemaIr-UJybUUZW.js";
|
|
3
|
+
import { dirname as o, isAbsolute as s, join as c } from "node:path";
|
|
4
|
+
import { promises as l } from "node:fs";
|
|
5
|
+
import { createLogger as u } from "@voltro/logger";
|
|
6
|
+
import { Effect as d } from "effect";
|
|
7
|
+
//#region src/sdkgen/manifestModel.ts
|
|
8
|
+
var f = (e, t) => e.name.localeCompare(t.name), p = (e) => {
|
|
9
|
+
let t = r();
|
|
108
10
|
return {
|
|
109
11
|
procedures: [...e.procedures].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => {
|
|
110
|
-
let
|
|
12
|
+
let r = i(e.tag);
|
|
111
13
|
return {
|
|
112
14
|
tag: e.tag,
|
|
113
15
|
kind: e.kind,
|
|
114
|
-
methodName:
|
|
115
|
-
input:
|
|
116
|
-
output:
|
|
16
|
+
methodName: a(e.tag),
|
|
17
|
+
input: n(e.input, `${r}Input`, t),
|
|
18
|
+
output: n(e.output, `${r}Output`, t)
|
|
117
19
|
};
|
|
118
20
|
}),
|
|
119
|
-
models: [...t.models.values()].sort(
|
|
120
|
-
enums: [...t.enums.values()].sort(
|
|
21
|
+
models: [...t.models.values()].sort(f),
|
|
22
|
+
enums: [...t.enums.values()].sort(f)
|
|
121
23
|
};
|
|
122
|
-
},
|
|
123
|
-
if (
|
|
24
|
+
}, m = /^[A-Za-z_][A-Za-z0-9_]*$/, h = /* @__PURE__ */ new Set(/* @__PURE__ */ "associatedtype.class.deinit.enum.extension.fileprivate.func.import.init.inout.internal.let.open.operator.private.protocol.public.rethrows.static.struct.subscript.typealias.var.break.case.continue.default.defer.do.else.fallthrough.for.guard.if.in.repeat.return.switch.where.while.as.catch.false.is.nil.super.self.Self.throw.throws.true.try.Type.Protocol".split(".")), g = /* @__PURE__ */ new Set(/* @__PURE__ */ "as.break.class.continue.do.else.false.for.fun.if.in.interface.is.null.object.package.return.super.this.throw.true.try.typealias.typeof.val.var.when.while".split(".")), _ = (e, t) => {
|
|
25
|
+
if (m.test(e)) return t.has(e) ? {
|
|
124
26
|
ident: `\`${e}\``,
|
|
125
27
|
needsAlias: !1
|
|
126
28
|
} : {
|
|
127
29
|
ident: e,
|
|
128
30
|
needsAlias: !1
|
|
129
31
|
};
|
|
130
|
-
let n =
|
|
32
|
+
let n = a(e);
|
|
131
33
|
return {
|
|
132
|
-
ident:
|
|
34
|
+
ident: m.test(n) ? n : `field_${n.replace(/[^A-Za-z0-9_]/g, "")}`,
|
|
133
35
|
needsAlias: !0
|
|
134
36
|
};
|
|
135
|
-
},
|
|
37
|
+
}, v = (e) => _(e, h), y = (e) => _(e, g), b = "// Generated by `voltro build api --target kotlin`. Do not edit by hand.", x = (e) => {
|
|
136
38
|
switch (e.kind) {
|
|
137
39
|
case "string": return "String";
|
|
138
40
|
case "integer": return "Int";
|
|
139
41
|
case "number": return "Double";
|
|
140
42
|
case "boolean": return "Boolean";
|
|
141
43
|
case "unknown": return "JsonElement";
|
|
142
|
-
case "array": return `List<${
|
|
143
|
-
case "optional": return `${
|
|
44
|
+
case "array": return `List<${x(e.element)}>`;
|
|
45
|
+
case "optional": return `${x(e.inner)}?`;
|
|
144
46
|
case "ref": return e.name;
|
|
145
47
|
}
|
|
146
|
-
},
|
|
48
|
+
}, S = (e) => e.kind === "optional", C = (e) => {
|
|
147
49
|
if (e.fields.length === 0) return `@Serializable\npublic class ${e.name}`;
|
|
148
50
|
let t = ["@Serializable", `public data class ${e.name}(`];
|
|
149
51
|
for (let n of e.fields) {
|
|
150
|
-
let e =
|
|
151
|
-
t.push(` ${r}val ${e.ident}: ${
|
|
52
|
+
let e = y(n.jsonName), r = e.needsAlias ? `@SerialName(${JSON.stringify(n.jsonName)}) ` : "", i = S(n.type) ? " = null" : "";
|
|
53
|
+
t.push(` ${r}val ${e.ident}: ${x(n.type)}${i},`);
|
|
152
54
|
}
|
|
153
55
|
return t.push(")"), t.join("\n");
|
|
154
|
-
},
|
|
155
|
-
let
|
|
156
|
-
for (let
|
|
157
|
-
return
|
|
158
|
-
},
|
|
56
|
+
}, w = (e) => {
|
|
57
|
+
let n = ["@Serializable", `public enum class ${e.name} {`];
|
|
58
|
+
for (let r of e.values) n.push(` @SerialName(${JSON.stringify(r)}) ${t(r)},`);
|
|
59
|
+
return n.push("}"), n.join("\n");
|
|
60
|
+
}, T = (e) => e.output ? x(e.output) : "JsonElement", E = (e, t) => {
|
|
159
61
|
let n = t.filter((e) => e.kind !== "stream"), r = [
|
|
160
62
|
"/** One-shot RPC client (query / mutation / action) over HTTP. */",
|
|
161
63
|
`public class ${e}(`,
|
|
@@ -165,11 +67,11 @@ var s = () => ({
|
|
|
165
67
|
") {"
|
|
166
68
|
];
|
|
167
69
|
for (let e of n) {
|
|
168
|
-
let t =
|
|
169
|
-
e.input === void 0 ? r.push("", ` /** \`${e.tag}\` (${e.kind}) */`, ` public suspend fun ${e.methodName}(): ${t} =`, ` transport.call(baseUrl, auth, ${JSON.stringify(e.tag)}, EmptyPayload)`) : r.push("", ` /** \`${e.tag}\` (${e.kind}) */`, ` public suspend fun ${e.methodName}(input: ${
|
|
70
|
+
let t = T(e);
|
|
71
|
+
e.input === void 0 ? r.push("", ` /** \`${e.tag}\` (${e.kind}) */`, ` public suspend fun ${e.methodName}(): ${t} =`, ` transport.call(baseUrl, auth, ${JSON.stringify(e.tag)}, EmptyPayload)`) : r.push("", ` /** \`${e.tag}\` (${e.kind}) */`, ` public suspend fun ${e.methodName}(input: ${x(e.input)}): ${t} =`, ` transport.call(baseUrl, auth, ${JSON.stringify(e.tag)}, input)`);
|
|
170
72
|
}
|
|
171
73
|
return r.push("}"), r.join("\n");
|
|
172
|
-
},
|
|
74
|
+
}, D = (e, t) => {
|
|
173
75
|
let n = t.filter((e) => e.kind === "stream"), r = [
|
|
174
76
|
"/** Reactive subscription client over WebSocket — one Flow per server-push procedure. */",
|
|
175
77
|
`public class ${e}(`,
|
|
@@ -179,11 +81,11 @@ var s = () => ({
|
|
|
179
81
|
") {"
|
|
180
82
|
];
|
|
181
83
|
for (let e of n) {
|
|
182
|
-
let t =
|
|
183
|
-
e.input === void 0 ? r.push("", ` /** \`${e.tag}\` (stream) */`, ` public fun ${e.methodName}(): Flow<${t}> =`, ` transport.subscribe(socketUrl, auth, ${JSON.stringify(e.tag)}, EmptyPayload)`) : r.push("", ` /** \`${e.tag}\` (stream) */`, ` public fun ${e.methodName}(input: ${
|
|
84
|
+
let t = T(e);
|
|
85
|
+
e.input === void 0 ? r.push("", ` /** \`${e.tag}\` (stream) */`, ` public fun ${e.methodName}(): Flow<${t}> =`, ` transport.subscribe(socketUrl, auth, ${JSON.stringify(e.tag)}, EmptyPayload)`) : r.push("", ` /** \`${e.tag}\` (stream) */`, ` public fun ${e.methodName}(input: ${x(e.input)}): Flow<${t}> =`, ` transport.subscribe(socketUrl, auth, ${JSON.stringify(e.tag)}, input)`);
|
|
184
86
|
}
|
|
185
87
|
return r.push("}"), r.join("\n");
|
|
186
|
-
},
|
|
88
|
+
}, O = (e) => `${b}
|
|
187
89
|
package ${e}
|
|
188
90
|
|
|
189
91
|
/**
|
|
@@ -200,7 +102,7 @@ public data class AuthContext(
|
|
|
200
102
|
tenant?.let { add("x-tenant" to it) }
|
|
201
103
|
}
|
|
202
104
|
}
|
|
203
|
-
`,
|
|
105
|
+
`, k = (e) => `${b}
|
|
204
106
|
package ${e}
|
|
205
107
|
|
|
206
108
|
import kotlinx.serialization.SerialName
|
|
@@ -221,7 +123,7 @@ public data class PushRegistration(
|
|
|
221
123
|
val locale: String? = null,
|
|
222
124
|
val timezone: String? = null,
|
|
223
125
|
)
|
|
224
|
-
`,
|
|
126
|
+
`, A = (e) => `${b}
|
|
225
127
|
package ${e}
|
|
226
128
|
|
|
227
129
|
import io.ktor.client.HttpClient
|
|
@@ -320,7 +222,7 @@ internal expect fun randomId(): String
|
|
|
320
222
|
|
|
321
223
|
/** A raw JSON value, for schemas with no faithful static type. */
|
|
322
224
|
public typealias AnyJson = JsonElement
|
|
323
|
-
`,
|
|
225
|
+
`, j = (e) => `// ${b.replace("// ", "")}
|
|
324
226
|
plugins {
|
|
325
227
|
kotlin("multiplatform") version "2.0.20"
|
|
326
228
|
kotlin("plugin.serialization") version "2.0.20"
|
|
@@ -349,85 +251,85 @@ kotlin {
|
|
|
349
251
|
}
|
|
350
252
|
|
|
351
253
|
// Generated Kotlin Multiplatform module: ${e}
|
|
352
|
-
`,
|
|
353
|
-
let r = `src/commonMain/kotlin/${n.replace(/\./g, "/")}`, i = [...e.enums.map(
|
|
254
|
+
`, M = (e, t, n) => {
|
|
255
|
+
let r = `src/commonMain/kotlin/${n.replace(/\./g, "/")}`, i = [...e.enums.map(w), ...e.models.map(C)].join("\n\n");
|
|
354
256
|
return [
|
|
355
257
|
{
|
|
356
258
|
path: "build.gradle.kts",
|
|
357
|
-
content:
|
|
259
|
+
content: j(t)
|
|
358
260
|
},
|
|
359
261
|
{
|
|
360
262
|
path: `${r}/Models.kt`,
|
|
361
|
-
content: `${
|
|
263
|
+
content: `${b}\npackage ${n}\n\nimport kotlinx.serialization.SerialName
|
|
362
264
|
import kotlinx.serialization.Serializable
|
|
363
265
|
import kotlinx.serialization.json.JsonElement\n\n${i}${i ? "\n" : ""}`
|
|
364
266
|
},
|
|
365
267
|
{
|
|
366
268
|
path: `${r}/Client.kt`,
|
|
367
|
-
content: `${
|
|
269
|
+
content: `${b}\npackage ${n}\n\nimport kotlinx.serialization.json.JsonElement\n\n${E(`${t}Client`, e.procedures)}\n`
|
|
368
270
|
},
|
|
369
271
|
{
|
|
370
272
|
path: `${r}/Subscriptions.kt`,
|
|
371
|
-
content: `${
|
|
273
|
+
content: `${b}\npackage ${n}\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.serialization.json.JsonElement\n\n${D(`${t}Subscriptions`, e.procedures)}\n`
|
|
372
274
|
},
|
|
373
275
|
{
|
|
374
276
|
path: `${r}/Auth.kt`,
|
|
375
|
-
content:
|
|
277
|
+
content: O(n)
|
|
376
278
|
},
|
|
377
279
|
{
|
|
378
280
|
path: `${r}/Push.kt`,
|
|
379
|
-
content:
|
|
281
|
+
content: k(n)
|
|
380
282
|
},
|
|
381
283
|
{
|
|
382
284
|
path: `${r}/RpcTransport.kt`,
|
|
383
|
-
content:
|
|
285
|
+
content: A(n)
|
|
384
286
|
}
|
|
385
287
|
];
|
|
386
|
-
},
|
|
288
|
+
}, N = (e) => {
|
|
387
289
|
switch (e.kind) {
|
|
388
290
|
case "string": return "String";
|
|
389
291
|
case "integer": return "Int";
|
|
390
292
|
case "number": return "Double";
|
|
391
293
|
case "boolean": return "Bool";
|
|
392
294
|
case "unknown": return "AnyCodable";
|
|
393
|
-
case "array": return `[${
|
|
394
|
-
case "optional": return `${
|
|
295
|
+
case "array": return `[${N(e.element)}]`;
|
|
296
|
+
case "optional": return `${N(e.inner)}?`;
|
|
395
297
|
case "ref": return e.name;
|
|
396
298
|
}
|
|
397
|
-
},
|
|
299
|
+
}, P = (e) => e.kind === "optional", F = (e) => {
|
|
398
300
|
let t = [`public struct ${e.name}: Codable, Equatable, Sendable {`], n = e.fields.map((e) => ({
|
|
399
301
|
field: e,
|
|
400
|
-
id:
|
|
302
|
+
id: v(e.jsonName)
|
|
401
303
|
}));
|
|
402
|
-
for (let { field: e, id: r } of n) t.push(` public var ${r.ident}: ${
|
|
304
|
+
for (let { field: e, id: r } of n) t.push(` public var ${r.ident}: ${N(e.type)}`);
|
|
403
305
|
if (n.some(({ id: e }) => e.needsAlias)) {
|
|
404
306
|
t.push("", " enum CodingKeys: String, CodingKey {");
|
|
405
307
|
for (let { field: e, id: r } of n) t.push(r.needsAlias ? ` case ${r.ident} = ${JSON.stringify(e.jsonName)}` : ` case ${r.ident}`);
|
|
406
308
|
t.push(" }");
|
|
407
309
|
}
|
|
408
|
-
let r = n.map(({ field: e, id: t }) =>
|
|
310
|
+
let r = n.map(({ field: e, id: t }) => P(e.type) ? `${t.ident}: ${N(e.type)} = nil` : `${t.ident}: ${N(e.type)}`);
|
|
409
311
|
t.push("", ` public init(${r.join(", ")}) {`);
|
|
410
312
|
for (let { id: e } of n) t.push(` self.${e.ident} = ${e.ident}`);
|
|
411
313
|
return t.push(" }", "}"), t.join("\n");
|
|
412
|
-
},
|
|
314
|
+
}, I = (e) => {
|
|
413
315
|
let t = [`public enum ${e.name}: String, Codable, Sendable {`];
|
|
414
316
|
for (let n of e.values) {
|
|
415
|
-
let e =
|
|
317
|
+
let e = v(n).ident;
|
|
416
318
|
t.push(e === n ? ` case ${e}` : ` case ${e} = ${JSON.stringify(n)}`);
|
|
417
319
|
}
|
|
418
320
|
return t.push("}"), t.join("\n");
|
|
419
|
-
},
|
|
420
|
-
let t = e.output ?
|
|
321
|
+
}, L = (e) => {
|
|
322
|
+
let t = e.output ? N(e.output) : "AnyCodable";
|
|
421
323
|
return e.input === void 0 ? {
|
|
422
324
|
signature: "()",
|
|
423
325
|
payload: "EmptyPayload()",
|
|
424
326
|
returns: t
|
|
425
327
|
} : {
|
|
426
|
-
signature: `(_ input: ${
|
|
328
|
+
signature: `(_ input: ${N(e.input)})`,
|
|
427
329
|
payload: "input",
|
|
428
330
|
returns: t
|
|
429
331
|
};
|
|
430
|
-
},
|
|
332
|
+
}, R = (e, t) => {
|
|
431
333
|
let n = t.filter((e) => e.kind !== "stream"), r = [
|
|
432
334
|
"/// One-shot RPC client (query / mutation / action) over HTTP.",
|
|
433
335
|
`public struct ${e}: Sendable {`,
|
|
@@ -442,11 +344,11 @@ import kotlinx.serialization.json.JsonElement\n\n${i}${i ? "\n" : ""}`
|
|
|
442
344
|
" }"
|
|
443
345
|
];
|
|
444
346
|
for (let e of n) {
|
|
445
|
-
let { signature: t, payload: n, returns: i } =
|
|
347
|
+
let { signature: t, payload: n, returns: i } = L(e);
|
|
446
348
|
r.push("", ` /// \`${e.tag}\` (${e.kind})`, ` public func ${e.methodName}${t} async throws -> ${i} {`, ` try await transport.call(baseURL: baseURL, auth: auth, tag: ${JSON.stringify(e.tag)}, payload: ${n})`, " }");
|
|
447
349
|
}
|
|
448
350
|
return r.push("}"), r.join("\n");
|
|
449
|
-
},
|
|
351
|
+
}, ee = (e, t) => {
|
|
450
352
|
let n = t.filter((e) => e.kind === "stream"), r = [
|
|
451
353
|
"/// Reactive subscription client over WebSocket. Each method opens a stream",
|
|
452
354
|
"/// for one server-push procedure and yields decoded values as they arrive.",
|
|
@@ -462,11 +364,11 @@ import kotlinx.serialization.json.JsonElement\n\n${i}${i ? "\n" : ""}`
|
|
|
462
364
|
" }"
|
|
463
365
|
];
|
|
464
366
|
for (let e of n) {
|
|
465
|
-
let t = e.output ?
|
|
367
|
+
let t = e.output ? N(e.output) : "AnyCodable", { signature: n, payload: i } = L(e);
|
|
466
368
|
r.push("", ` /// \`${e.tag}\` (stream)`, ` public func ${e.methodName}${n} -> AsyncThrowingStream<${t}, Error> {`, ` transport.subscribe(socketURL: socketURL, auth: auth, tag: ${JSON.stringify(e.tag)}, payload: ${i})`, " }");
|
|
467
369
|
}
|
|
468
370
|
return r.push("}"), r.join("\n");
|
|
469
|
-
},
|
|
371
|
+
}, z = "import Foundation\n\n/// Authentication + tenant context carried on every request. The bearer token\n/// and tenant id are injected as request headers by the transport.\npublic struct AuthContext: Sendable {\n public var token: String?\n public var tenant: String?\n\n public init(token: String? = nil, tenant: String? = nil) {\n self.token = token\n self.tenant = tenant\n }\n\n /// The header pairs this context contributes. Empty when unauthenticated.\n public func headers() -> [(String, String)] {\n var out: [(String, String)] = []\n if let token = token { out.append((\"authorization\", \"Bearer \\(token)\")) }\n if let tenant = tenant { out.append((\"x-tenant\", tenant)) }\n return out\n }\n}\n", B = "import Foundation\n\n/// Device registration for push notifications.\n///\n/// STUB — this registers the device TOKEN with the app's `registerDevice`\n/// procedure (the storage side). The SENDER (APNs / FCM) is deliberately NOT\n/// part of the generated SDK: it needs per-tenant Apple Developer / Firebase\n/// credentials managed by provider provisioning, which is server infrastructure,\n/// not client code. Wire this to your app's registerDevice mutation.\npublic struct PushRegistration: Codable, Equatable, Sendable {\n public var deviceToken: String\n public var platform: String\n public var locale: String?\n public var timezone: String?\n\n public init(deviceToken: String, platform: String = \"ios\", locale: String? = nil, timezone: String? = nil) {\n self.deviceToken = deviceToken\n self.platform = platform\n self.locale = locale\n self.timezone = timezone\n }\n}\n\npublic extension AuthContext {\n /// Convenience: build a registration payload after the OS issues a token.\n static func pushRegistration(deviceToken: String, platform: String = \"ios\") -> PushRegistration {\n PushRegistration(deviceToken: deviceToken, platform: platform)\n }\n}\n", V = "import Foundation\n\n/// The RPC request envelope sent to the api's `/rpc` endpoint. Mirrors the\n/// wire shape `{ _tag: \"Request\", id, tag, payload, headers }`.\nstruct RpcRequest<Payload: Encodable>: Encodable {\n let _tag = \"Request\"\n let id: String\n let tag: String\n let payload: Payload\n let headers: [String: String]\n}\n\n/// An empty payload for no-argument procedures.\nstruct EmptyPayload: Encodable {}\n\n/// A dynamic JSON value for schemas with no faithful static type.\npublic struct AnyCodable: Codable, Equatable, Sendable {\n public let value: Data\n public init(from decoder: Decoder) throws {\n let container = try decoder.singleValueContainer()\n if let raw = try? container.decode(AnyCodableRaw.self) {\n self.value = raw.data\n } else {\n self.value = Data()\n }\n }\n public func encode(to encoder: Encoder) throws {\n var container = encoder.singleValueContainer()\n try container.encode(AnyCodableRaw(data: value))\n }\n}\n\nstruct AnyCodableRaw: Codable {\n let data: Data\n init(data: Data) { self.data = data }\n init(from decoder: Decoder) throws {\n let container = try decoder.singleValueContainer()\n let json = try container.decode(JSONValue.self)\n self.data = try JSONEncoder().encode(json)\n }\n func encode(to encoder: Encoder) throws {\n var container = encoder.singleValueContainer()\n try container.encode(try JSONDecoder().decode(JSONValue.self, from: data))\n }\n}\n\nindirect enum JSONValue: Codable {\n case null\n case bool(Bool)\n case number(Double)\n case string(String)\n case array([JSONValue])\n case object([String: JSONValue])\n init(from decoder: Decoder) throws {\n let c = try decoder.singleValueContainer()\n if c.decodeNil() { self = .null }\n else if let b = try? c.decode(Bool.self) { self = .bool(b) }\n else if let n = try? c.decode(Double.self) { self = .number(n) }\n else if let s = try? c.decode(String.self) { self = .string(s) }\n else if let a = try? c.decode([JSONValue].self) { self = .array(a) }\n else if let o = try? c.decode([String: JSONValue].self) { self = .object(o) }\n else { self = .null }\n }\n func encode(to encoder: Encoder) throws {\n var c = encoder.singleValueContainer()\n switch self {\n case .null: try c.encodeNil()\n case .bool(let b): try c.encode(b)\n case .number(let n): try c.encode(n)\n case .string(let s): try c.encode(s)\n case .array(let a): try c.encode(a)\n case .object(let o): try c.encode(o)\n }\n }\n}\n\npublic enum RpcError: Error {\n case http(status: Int, body: Data)\n case decoding(Error)\n case transport(Error)\n}\n\n/// HTTP transport for one-shot calls.\n///\n/// NOTE — the exact @effect/rpc response FRAMING (success/failure envelope over\n/// HTTP) is the one seam that must be validated against a live server; this\n/// decodes the success value from the response body and surfaces non-2xx as\n/// `RpcError.http`. Correct type mapping + one method per procedure is what the\n/// generator guarantees; the wire framing is the cross-language integration step.\nstruct RpcTransport: Sendable {\n let session: URLSession\n\n func call<Payload: Encodable, Result: Decodable>(\n baseURL: URL, auth: AuthContext, tag: String, payload: Payload\n ) async throws -> Result {\n var request = URLRequest(url: baseURL.appendingPathComponent(\"rpc\"))\n request.httpMethod = \"POST\"\n request.setValue(\"application/json\", forHTTPHeaderField: \"content-type\")\n for (k, v) in auth.headers() { request.setValue(v, forHTTPHeaderField: k) }\n let envelope = RpcRequest(id: UUID().uuidString, tag: tag, payload: payload, headers: [:])\n request.httpBody = try JSONEncoder().encode(envelope)\n let (data, response): (Data, URLResponse)\n do { (data, response) = try await session.data(for: request) }\n catch { throw RpcError.transport(error) }\n if let http = response as? HTTPURLResponse, !(200...299).contains(http.statusCode) {\n throw RpcError.http(status: http.statusCode, body: data)\n }\n do { return try JSONDecoder().decode(Result.self, from: data) }\n catch { throw RpcError.decoding(error) }\n }\n}\n\n/// WebSocket transport for reactive subscriptions.\nstruct SocketTransport: Sendable {\n let session: URLSession\n\n func subscribe<Payload: Encodable, Value: Decodable>(\n socketURL: URL, auth: AuthContext, tag: String, payload: Payload\n ) -> AsyncThrowingStream<Value, Error> {\n AsyncThrowingStream { continuation in\n let task = session.webSocketTask(with: socketURL)\n task.resume()\n let envelope = RpcRequest(id: UUID().uuidString, tag: tag, payload: payload, headers: [:])\n if let frame = try? JSONEncoder().encode(envelope), let text = String(data: frame, encoding: .utf8) {\n task.send(.string(text)) { _ in }\n }\n func receive() {\n task.receive { result in\n switch result {\n case .failure(let error):\n continuation.finish(throwing: error)\n case .success(let message):\n let data: Data?\n switch message {\n case .string(let s): data = s.data(using: .utf8)\n case .data(let d): data = d\n @unknown default: data = nil\n }\n if let data = data, let value = try? JSONDecoder().decode(Value.self, from: data) {\n continuation.yield(value)\n }\n receive()\n }\n }\n }\n receive()\n continuation.onTermination = { _ in task.cancel(with: .goingAway, reason: nil) }\n }\n }\n}\n", H = (e) => `// swift-tools-version:5.9
|
|
470
372
|
import PackageDescription
|
|
471
373
|
|
|
472
374
|
let package = Package(
|
|
@@ -479,104 +381,104 @@ let package = Package(
|
|
|
479
381
|
.target(name: ${JSON.stringify(e)}, path: "Sources/${e}"),
|
|
480
382
|
]
|
|
481
383
|
)
|
|
482
|
-
`,
|
|
483
|
-
let n = `Sources/${t}`, r = [...e.enums.map(
|
|
384
|
+
`, U = "// Generated by `voltro build api --target swift`. Do not edit by hand.", W = (e, t) => {
|
|
385
|
+
let n = `Sources/${t}`, r = [...e.enums.map(I), ...e.models.map(F)].join("\n\n");
|
|
484
386
|
return [
|
|
485
387
|
{
|
|
486
388
|
path: "Package.swift",
|
|
487
|
-
content:
|
|
389
|
+
content: H(t)
|
|
488
390
|
},
|
|
489
391
|
{
|
|
490
392
|
path: `${n}/Models.swift`,
|
|
491
|
-
content: `${
|
|
393
|
+
content: `${U}\nimport Foundation\n\n${r}${r ? "\n" : ""}`
|
|
492
394
|
},
|
|
493
395
|
{
|
|
494
396
|
path: `${n}/Client.swift`,
|
|
495
|
-
content: `${
|
|
397
|
+
content: `${U}\nimport Foundation\n\n${R(`${t}Client`, e.procedures)}\n`
|
|
496
398
|
},
|
|
497
399
|
{
|
|
498
400
|
path: `${n}/Subscriptions.swift`,
|
|
499
|
-
content: `${
|
|
401
|
+
content: `${U}\nimport Foundation\n\n${ee(`${t}Subscriptions`, e.procedures)}\n`
|
|
500
402
|
},
|
|
501
403
|
{
|
|
502
404
|
path: `${n}/Auth.swift`,
|
|
503
|
-
content: `${
|
|
405
|
+
content: `${U}\n${z}`
|
|
504
406
|
},
|
|
505
407
|
{
|
|
506
408
|
path: `${n}/Push.swift`,
|
|
507
|
-
content: `${
|
|
409
|
+
content: `${U}\n${B}`
|
|
508
410
|
},
|
|
509
411
|
{
|
|
510
412
|
path: `${n}/RpcTransport.swift`,
|
|
511
|
-
content: `${
|
|
413
|
+
content: `${U}\n${V}`
|
|
512
414
|
}
|
|
513
415
|
];
|
|
514
|
-
},
|
|
515
|
-
let n =
|
|
516
|
-
return t.target === "swift" ?
|
|
517
|
-
},
|
|
518
|
-
for (let
|
|
519
|
-
let e =
|
|
520
|
-
await
|
|
416
|
+
}, G = u({ scope: "voltro:sdk" }), K = "VoltroClient", q = "com.voltro.client", J = (e, t) => {
|
|
417
|
+
let n = p(e), r = t.packageName ?? K;
|
|
418
|
+
return t.target === "swift" ? W(n, r) : M(n, r, t.kotlinPackage ?? q);
|
|
419
|
+
}, Y = async (e, t) => {
|
|
420
|
+
for (let n of e) {
|
|
421
|
+
let e = c(t, n.path);
|
|
422
|
+
await l.mkdir(o(e), { recursive: !0 }), await l.writeFile(e, n.content, "utf8");
|
|
521
423
|
}
|
|
522
|
-
},
|
|
523
|
-
let { offlineManifest: t } = await import("./checkCommand-
|
|
424
|
+
}, X = async (e) => {
|
|
425
|
+
let { offlineManifest: t } = await import("./checkCommand-YZDmkAGd.js"), { manifest: n } = await t(e);
|
|
524
426
|
return n;
|
|
525
|
-
},
|
|
526
|
-
let t =
|
|
427
|
+
}, Z = async (e) => {
|
|
428
|
+
let t = J(await (e.manifestProvider ?? X)(e.root), {
|
|
527
429
|
target: e.target,
|
|
528
430
|
...e.packageName === void 0 ? {} : { packageName: e.packageName },
|
|
529
431
|
...e.kotlinPackage === void 0 ? {} : { kotlinPackage: e.kotlinPackage }
|
|
530
432
|
});
|
|
531
|
-
return await
|
|
433
|
+
return await Y(t, e.outDir), {
|
|
532
434
|
files: t,
|
|
533
435
|
outDir: e.outDir
|
|
534
436
|
};
|
|
535
|
-
},
|
|
437
|
+
}, Q = (e, t) => {
|
|
536
438
|
let n = e.indexOf(t);
|
|
537
439
|
return n !== -1 && n + 1 < e.length ? e[n + 1] : void 0;
|
|
538
|
-
},
|
|
539
|
-
let
|
|
540
|
-
if (
|
|
541
|
-
let
|
|
440
|
+
}, $ = (e, t) => {
|
|
441
|
+
let n = Q(e, "--target");
|
|
442
|
+
if (n !== "swift" && n !== "kotlin") return { error: `--target must be "swift" or "kotlin" (got ${n === void 0 ? "<none>" : JSON.stringify(n)})` };
|
|
443
|
+
let r = Q(e, "--out"), i = Q(e, "--name"), a = Q(e, "--kotlin-package"), o = new Set([
|
|
444
|
+
n,
|
|
445
|
+
r,
|
|
542
446
|
i,
|
|
543
|
-
a
|
|
544
|
-
o,
|
|
545
|
-
s
|
|
447
|
+
a
|
|
546
448
|
].filter((e) => e !== void 0)), l = /* @__PURE__ */ new Set([
|
|
547
449
|
"--target",
|
|
548
450
|
"--out",
|
|
549
451
|
"--name",
|
|
550
452
|
"--kotlin-package"
|
|
551
|
-
]), u = e.find((e) => !e.startsWith("-") && e !== "api" && !l.has(e) && !
|
|
453
|
+
]), u = e.find((e) => !e.startsWith("-") && e !== "api" && !l.has(e) && !o.has(e));
|
|
552
454
|
return {
|
|
553
|
-
target:
|
|
554
|
-
root: u ?
|
|
555
|
-
...
|
|
556
|
-
...
|
|
557
|
-
...
|
|
455
|
+
target: n,
|
|
456
|
+
root: u ? s(u) ? u : c(t, u) : t,
|
|
457
|
+
...r === void 0 ? {} : { outDir: r },
|
|
458
|
+
...i === void 0 ? {} : { packageName: i },
|
|
459
|
+
...a === void 0 ? {} : { kotlinPackage: a }
|
|
558
460
|
};
|
|
559
|
-
},
|
|
560
|
-
let r =
|
|
461
|
+
}, te = (e, t) => c(e, "sdk", t), ne = async (t, n = process.cwd()) => {
|
|
462
|
+
let r = $(t, n);
|
|
561
463
|
if ("error" in r) return console.error(`voltro build --target: ${r.error}`), 1;
|
|
562
|
-
let
|
|
563
|
-
return e(
|
|
564
|
-
let e = yield*
|
|
565
|
-
try: () =>
|
|
464
|
+
let i = r.outDir ?? te(r.root, r.target);
|
|
465
|
+
return e(d.gen(function* () {
|
|
466
|
+
let e = yield* d.tryPromise({
|
|
467
|
+
try: () => Z({
|
|
566
468
|
root: r.root,
|
|
567
469
|
target: r.target,
|
|
568
|
-
outDir:
|
|
470
|
+
outDir: i,
|
|
569
471
|
...r.packageName === void 0 ? {} : { packageName: r.packageName },
|
|
570
472
|
...r.kotlinPackage === void 0 ? {} : { kotlinPackage: r.kotlinPackage }
|
|
571
473
|
}),
|
|
572
474
|
catch: (e) => e
|
|
573
|
-
}).pipe(
|
|
574
|
-
return yield*
|
|
475
|
+
}).pipe(d.orDie);
|
|
476
|
+
return yield* d.sync(() => G.info("SDK generated", {
|
|
575
477
|
target: r.target,
|
|
576
478
|
files: e.files.length,
|
|
577
|
-
out:
|
|
479
|
+
out: i
|
|
578
480
|
})), 0;
|
|
579
481
|
}), { scope: "voltro:sdk" });
|
|
580
482
|
};
|
|
581
483
|
//#endregion
|
|
582
|
-
export {
|
|
484
|
+
export { ne as runSdkBuildCommand };
|