create-kumiko-app 0.387.0 → 0.388.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/feature-manifest.json +120 -3
- package/package.json +5 -5
package/feature-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "samples/apps/use-all-bundled APP_FEATURES (composeFeatures includeBundled + signup)",
|
|
3
|
-
"featureCount":
|
|
3
|
+
"featureCount": 88,
|
|
4
4
|
"features": [
|
|
5
5
|
{
|
|
6
6
|
"name": "account-security",
|
|
@@ -300,7 +300,7 @@
|
|
|
300
300
|
},
|
|
301
301
|
{
|
|
302
302
|
"name": "billing-foundation",
|
|
303
|
-
"description": "Plugin host for subscription billing
|
|
303
|
+
"description": "Plugin host for subscription billing. Manages the `read_subscriptions` projection table and exposes 5 domain events (subscription created/updated/canceled, invoice paid/failed) appended by the foundation's own `billing-foundation:write:process-event` write-handler after provider plugins verify and normalize each webhook. Also manages a separate `read_payments` projection table (one row per one-off-payment) fed by its own `payment-received` event and `billing-foundation:write:process-payment-event` write-handler. Also ships `billing-foundation:write:create-checkout-session` and `billing-foundation:write:create-portal-session` write-handlers, a `billing-foundation:query:subscription:list` query handler, and a `createSubscriptionWebhookRoute` factory for the `/api/subscription/webhook/:providerName` extraRoute. `createBillingFoundationFeature({ baseUrl, catalog })` additionally derives a `billing-foundation:query:billing-plans` query, `start-plan-checkout`/`switch-plan` write-handlers, a `plan-switch-preview` query and a dormant billing-plans dashboard screen/panel from the catalog. Several providers can be mounted at once: new checkouts are offered by every enabled provider (enabled means keys set and billingLive on, or simply mounted for plugins without `isBillingEnabled`), the customer picks one in the plan panel and `start-plan-checkout` takes a `providerName`. An existing subscription stays with the provider that stored it, so the plan list and every switch follow that provider. A plan switch is either hosted (`createPlanSwitchSession` answers a url) or in-app (`previewPlanSwitch` shows the proration, `applyPlanSwitch` runs after the customer confirms; `switch-plan` then answers `{ applied: true }` and records the consent). `consumerProtection.providerTexts` overrides the checkout note and the VAT note per provider. Also ships `billing-foundation:write:sync-subscription` (pulls a provider plugin's live subscription state via `retrieveSubscription` and appends drift as a `subscription.updated` event, which catches changes made on the provider's own dashboard that never reached us as a webhook) and the `sync-subscriptions` job (manual-trigger + runOnBoot, perTenant) that dispatches it. Low-level building block: use `subscription-stripe`, `subscription-mollie` or `subscription-dodo` unless you are writing a new payment provider.",
|
|
304
304
|
"toggleableDefault": null,
|
|
305
305
|
"requires": [
|
|
306
306
|
"tenant-lifecycle",
|
|
@@ -424,7 +424,7 @@
|
|
|
424
424
|
},
|
|
425
425
|
{
|
|
426
426
|
"name": "channel-email",
|
|
427
|
-
"description": "Wires an `EmailTransport` (typically `mail-transport-smtp` in production, `createInMemoryTransport()` in tests) into the delivery system as the `email` channel. Requires `delivery`; pass an `EmailChannelOptions` with a `transport` and a `resolveEmail` function that maps a user ID to their email address. Mails render from stored templates (`renderer-mail-html`): a notification routed to this channel needs `template` + `meta` on `r.notification`, otherwise its delivery fails. Pass `tenantTransport: tenantMailTransport` (from `mail-foundation`) to send the notifications declared with `tenantTransport: true` through the sending tenant's own configured provider: a broken provider fails the send, a tenant without one uses the app `transport`; every other notification (password reset, sign-in) always goes through the app `transport`. `transport` may be left out when `tenantTransport` is set
|
|
427
|
+
"description": "Wires an `EmailTransport` (typically `mail-transport-smtp` in production, `createInMemoryTransport()` in tests) into the delivery system as the `email` channel. Requires `delivery`; pass an `EmailChannelOptions` with a `transport` and a `resolveEmail` function that maps a user ID to their email address. Mails render from stored templates (`renderer-mail-html`): a notification routed to this channel needs `template` + `meta` on `r.notification`, otherwise its delivery fails. Pass `tenantTransport: tenantMailTransport` (from `mail-foundation`) to send the notifications declared with `tenantTransport: true` through the sending tenant's own configured provider: a broken provider fails the send, a tenant without one uses the app `transport`; every other notification (password reset, sign-in) always goes through the app `transport`. `transport` may be left out when `tenantTransport` is set, but then only notifications declared with `tenantTransport: true` are delivered: every other notification (password reset, sign-in, invitations) fails with `missing_credentials`, so an app without an app SMTP server must mark every notification that should go out or keep an app `transport`. Notifications declared with `unsubscribe: true` get a signed `data.unsubscribeUrl` from delivery, which turns into the `List-Unsubscribe` headers.",
|
|
428
428
|
"toggleableDefault": null,
|
|
429
429
|
"requires": [
|
|
430
430
|
"delivery"
|
|
@@ -2467,6 +2467,123 @@
|
|
|
2467
2467
|
"recommended": false
|
|
2468
2468
|
}
|
|
2469
2469
|
},
|
|
2470
|
+
{
|
|
2471
|
+
"name": "subscription-dodo",
|
|
2472
|
+
"description": "Dodo Payments provider plugin for `billing-foundation`. Dodo acts as merchant of record: it sells to the customer and issues invoice and VAT, so the consumer-protection texts for this provider come from `consumerProtection.providerTexts`. Reads its API key and webhook secret from system config keys with `backing:\"secrets\"` (envelope-encrypted in the secrets store under the system tenant), plus a `billingLive` master switch and an `environment` key (test | live). `environment` is its own key because Dodo serves test and live mode from different API hosts and a live key must never hit the test host or the other way round; `billingLive` only decides whether checkouts are offered at all. All four are runtime config, so keys rotate and prod goes live without a redeploy, and the `mask` on each derives the sysadmin settings screen and nav. Mount via `createSubscriptionDodoFeature({ priceToTier })`; the optional `apiKey`/`webhookSecret` options are env to secrets bridge fallbacks (`DODO_PAYMENTS_API_KEY`, `DODO_PAYMENTS_WEBHOOK_KEY`). The plugin always mounts; `createCheckoutSession` throws `feature_disabled` unless `billingLive` is true. Webhooks arrive at `/api/subscription/webhook/dodo` and are verified per the Standard Webhooks spec (HMAC-SHA256 over id, timestamp and the raw body, 5 minute tolerance); events for products outside `priceToTier` or without tenant metadata are dropped. Implements hosted checkout, customer portal, cancel and resume, `retrievePrices` (10-minute TTL cache), `retrieveSubscription` for the sync job, and an in-app plan switch: `previewPlanSwitch` shows the proration before the customer confirms, `applyPlanSwitch` changes the plan without a hosted page and waits for the `plan_changed` webhook to move the tier. A plan switch in Dodo requires all plan products to belong to one Product Collection.",
|
|
2473
|
+
"toggleableDefault": null,
|
|
2474
|
+
"requires": [
|
|
2475
|
+
"billing-foundation",
|
|
2476
|
+
"config",
|
|
2477
|
+
"secrets"
|
|
2478
|
+
],
|
|
2479
|
+
"optionalRequires": [],
|
|
2480
|
+
"configReads": [],
|
|
2481
|
+
"exposesApis": [],
|
|
2482
|
+
"usesApis": [],
|
|
2483
|
+
"extensionsUsed": [
|
|
2484
|
+
{
|
|
2485
|
+
"extensionName": "subscriptionProvider",
|
|
2486
|
+
"entityName": "dodo"
|
|
2487
|
+
}
|
|
2488
|
+
],
|
|
2489
|
+
"configKeys": [
|
|
2490
|
+
{
|
|
2491
|
+
"key": "api-key",
|
|
2492
|
+
"qualifiedName": "subscription-dodo:config:api-key",
|
|
2493
|
+
"type": "text",
|
|
2494
|
+
"scope": "system",
|
|
2495
|
+
"default": null,
|
|
2496
|
+
"encrypted": true,
|
|
2497
|
+
"computed": false,
|
|
2498
|
+
"validated": false,
|
|
2499
|
+
"options": null,
|
|
2500
|
+
"bounds": null,
|
|
2501
|
+
"pattern": null,
|
|
2502
|
+
"writeRoles": [
|
|
2503
|
+
"SystemAdmin"
|
|
2504
|
+
],
|
|
2505
|
+
"readRoles": [
|
|
2506
|
+
"TenantAdmin",
|
|
2507
|
+
"Admin",
|
|
2508
|
+
"SystemAdmin"
|
|
2509
|
+
]
|
|
2510
|
+
},
|
|
2511
|
+
{
|
|
2512
|
+
"key": "billing-live",
|
|
2513
|
+
"qualifiedName": "subscription-dodo:config:billing-live",
|
|
2514
|
+
"type": "boolean",
|
|
2515
|
+
"scope": "system",
|
|
2516
|
+
"default": false,
|
|
2517
|
+
"encrypted": false,
|
|
2518
|
+
"computed": false,
|
|
2519
|
+
"validated": false,
|
|
2520
|
+
"options": null,
|
|
2521
|
+
"bounds": null,
|
|
2522
|
+
"pattern": null,
|
|
2523
|
+
"writeRoles": [
|
|
2524
|
+
"system",
|
|
2525
|
+
"SystemAdmin"
|
|
2526
|
+
],
|
|
2527
|
+
"readRoles": [
|
|
2528
|
+
"TenantAdmin",
|
|
2529
|
+
"Admin",
|
|
2530
|
+
"SystemAdmin"
|
|
2531
|
+
]
|
|
2532
|
+
},
|
|
2533
|
+
{
|
|
2534
|
+
"key": "environment",
|
|
2535
|
+
"qualifiedName": "subscription-dodo:config:environment",
|
|
2536
|
+
"type": "select",
|
|
2537
|
+
"scope": "system",
|
|
2538
|
+
"default": "test",
|
|
2539
|
+
"encrypted": false,
|
|
2540
|
+
"computed": false,
|
|
2541
|
+
"validated": false,
|
|
2542
|
+
"options": [
|
|
2543
|
+
"test",
|
|
2544
|
+
"live"
|
|
2545
|
+
],
|
|
2546
|
+
"bounds": null,
|
|
2547
|
+
"pattern": null,
|
|
2548
|
+
"writeRoles": [
|
|
2549
|
+
"SystemAdmin"
|
|
2550
|
+
],
|
|
2551
|
+
"readRoles": [
|
|
2552
|
+
"TenantAdmin",
|
|
2553
|
+
"Admin",
|
|
2554
|
+
"SystemAdmin"
|
|
2555
|
+
]
|
|
2556
|
+
},
|
|
2557
|
+
{
|
|
2558
|
+
"key": "webhook-secret",
|
|
2559
|
+
"qualifiedName": "subscription-dodo:config:webhook-secret",
|
|
2560
|
+
"type": "text",
|
|
2561
|
+
"scope": "system",
|
|
2562
|
+
"default": null,
|
|
2563
|
+
"encrypted": true,
|
|
2564
|
+
"computed": false,
|
|
2565
|
+
"validated": false,
|
|
2566
|
+
"options": null,
|
|
2567
|
+
"bounds": null,
|
|
2568
|
+
"pattern": null,
|
|
2569
|
+
"writeRoles": [
|
|
2570
|
+
"SystemAdmin"
|
|
2571
|
+
],
|
|
2572
|
+
"readRoles": [
|
|
2573
|
+
"TenantAdmin",
|
|
2574
|
+
"Admin",
|
|
2575
|
+
"SystemAdmin"
|
|
2576
|
+
]
|
|
2577
|
+
}
|
|
2578
|
+
],
|
|
2579
|
+
"secrets": [],
|
|
2580
|
+
"writeHandlers": [],
|
|
2581
|
+
"uiHints": {
|
|
2582
|
+
"displayLabel": "Billing · Dodo Payments",
|
|
2583
|
+
"category": "billing",
|
|
2584
|
+
"recommended": false
|
|
2585
|
+
}
|
|
2586
|
+
},
|
|
2470
2587
|
{
|
|
2471
2588
|
"name": "subscription-mollie",
|
|
2472
2589
|
"description": "Mollie payment provider plugin for `billing-foundation`, covering the DACH/EU mid-market use case. Mount via `createSubscriptionMollieFeature({ apiKey, webhookUrl, priceToTier, priceToConfig })` — the factory validates that `priceToTier` and `priceToConfig` keys are identical at boot time. Implements `verifyAndParseWebhook` (lazy Mollie-API fetch + heuristic event-type mapping) and `createCheckoutSession` (customer + first-payment with `sequenceType=\"first\"`); `createPortalSession` and `cancelSubscription` are not available because Mollie has no customer portal and requires a `customerId` that the plugin contract does not carry.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-kumiko-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.388.0",
|
|
4
4
|
"description": "`bun create kumiko-app <name>` — scaffold a new Kumiko app with an interactive feature picker.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@cosmicdrift/kumiko-dev-server": "0.
|
|
31
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
32
|
-
"@cosmicdrift/kumiko-server-runtime": "0.
|
|
33
|
-
"@cosmicdrift/kumiko-testing": "0.
|
|
30
|
+
"@cosmicdrift/kumiko-dev-server": "0.388.0",
|
|
31
|
+
"@cosmicdrift/kumiko-framework": "0.388.0",
|
|
32
|
+
"@cosmicdrift/kumiko-server-runtime": "0.388.0",
|
|
33
|
+
"@cosmicdrift/kumiko-testing": "0.388.0",
|
|
34
34
|
"@inquirer/core": "^10.0.0",
|
|
35
35
|
"@inquirer/prompts": "^7.4.0"
|
|
36
36
|
},
|