create-kumiko-app 0.386.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/LICENSE +21 -57
- package/feature-manifest.json +120 -3
- package/package.json +6 -6
- package/src/feature-constructors.ts +1 -1
package/LICENSE
CHANGED
|
@@ -1,57 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
controlling, or under common control with the Licensor ("Affiliates"), or
|
|
23
|
-
contractors acting on their behalf. The Licensor remains free to use the
|
|
24
|
-
Licensed Work for any purpose, including for the operation of kumiko.rocks.
|
|
25
|
-
|
|
26
|
-
Change Date: 2030-05-05
|
|
27
|
-
Change License: Apache License, Version 2.0
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Terms
|
|
31
|
-
|
|
32
|
-
The Licensor hereby grants you the right to copy, modify, create derivative works,
|
|
33
|
-
redistribute, and make non-production use of the Licensed Work. The Licensor may
|
|
34
|
-
make an Additional Use Grant, above, permitting limited production use.
|
|
35
|
-
|
|
36
|
-
Effective on the Change Date, or the fourth anniversary of the first publicly
|
|
37
|
-
available distribution of the Licensed Work under this License, whichever comes
|
|
38
|
-
first, this License will convert to the Change License.
|
|
39
|
-
|
|
40
|
-
This Business Source License governs use of the Licensed Work in all cases, except
|
|
41
|
-
as to any use that is explicitly granted in the Additional Use Grant above or
|
|
42
|
-
under the Change License after the Change Date.
|
|
43
|
-
|
|
44
|
-
If your use of the Licensed Work does not comply with the requirements of this
|
|
45
|
-
License, you must cease use of the Licensed Work immediately.
|
|
46
|
-
|
|
47
|
-
All copies of the Licensed Work, and all derivative works thereof, must include
|
|
48
|
-
this License.
|
|
49
|
-
|
|
50
|
-
This License does not grant you any right, title, or interest in any trademark,
|
|
51
|
-
logo, or branding of the Licensor, except as required to comply with this License.
|
|
52
|
-
|
|
53
|
-
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN
|
|
54
|
-
“AS IS” BASIS. LICENSOR DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
|
|
55
|
-
WITHOUT LIMITATION WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
|
56
|
-
TITLE, AND NON-INFRINGEMENT. IN NO EVENT WILL LICENSOR BE LIABLE FOR ANY DAMAGES
|
|
57
|
-
ARISING OUT OF OR RELATED TO THIS LICENSE OR THE USE OF THE LICENSED WORK.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Marc Frost
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
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,8 +1,8 @@
|
|
|
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
|
-
"license": "
|
|
5
|
+
"license": "MIT",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -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
|
},
|
|
@@ -50,7 +50,7 @@ export const FEATURE_CONSTRUCTORS: Readonly<Record<string, ScaffoldFeatureEntry>
|
|
|
50
50
|
callExpression: "createAuthEmailPasswordFeature()",
|
|
51
51
|
},
|
|
52
52
|
// Only meaningful alongside auth.signup — composeFeatures auto-mounts it
|
|
53
|
-
// when signup is set; listed so scaffolds can pick it explicitly
|
|
53
|
+
// when signup is set; listed so scaffolds can pick it explicitly.
|
|
54
54
|
"auth-self-registration": {
|
|
55
55
|
name: "auth-self-registration",
|
|
56
56
|
importPath: "@cosmicdrift/kumiko-bundled-features/auth-email-password",
|