@cosmicdrift/kumiko-bundled-features 0.373.0 → 0.377.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/dist/account-security/constants.d.ts +1 -0
- package/dist/account-security/constants.js +1 -0
- package/dist/account-security/index.d.ts +1 -1
- package/dist/account-security/index.js +1 -1
- package/dist/admin-shell/web/client-plugin.d.ts +1 -1
- package/dist/audit/web/client-plugin.d.ts +1 -1
- package/dist/auth-email-password/i18n.js +1 -0
- package/dist/auth-email-password/mail-notifications.js +1 -1
- package/dist/auth-email-password/web/auth-client.js +1 -1
- package/dist/auth-email-password/web/auth-form-primitives.js +1 -1
- package/dist/auth-email-password/web/client-actions.d.ts +2 -0
- package/dist/auth-email-password/web/client-actions.js +23 -0
- package/dist/auth-email-password/web/client-plugin.d.ts +2 -1
- package/dist/auth-email-password/web/client-plugin.js +2 -0
- package/dist/auth-email-password/web/default-topbar-actions.js +1 -1
- package/dist/auth-email-password/web/index.js +1 -1
- package/dist/auth-email-password/web/session.js +1 -1
- package/dist/auth-email-password/web/tenant-menu-items.js +1 -1
- package/dist/auth-email-password/web/tenant-switcher.js +1 -1
- package/dist/auth-email-password/web/user-menu.js +1 -1
- package/dist/auth-foundation/env.d.ts +9 -0
- package/dist/auth-foundation/env.js +21 -0
- package/dist/auth-foundation/index.d.ts +1 -0
- package/dist/auth-foundation/index.js +1 -0
- package/dist/auth-mfa/schema/user-mfa.d.ts +6 -6
- package/dist/billing-foundation/consumer-protection/confirmation-mail.js +1 -1
- package/dist/billing-foundation/consumer-protection/termination-pages.js +1 -1
- package/dist/billing-foundation/contact-card.d.ts +2 -0
- package/dist/billing-foundation/contact-card.js +16 -0
- package/dist/billing-foundation/entities.d.ts +8 -8
- package/dist/billing-foundation/handlers/billing-plans.query.js +1 -1
- package/dist/billing-foundation/index.d.ts +1 -1
- package/dist/billing-foundation/plan-catalog.js +1 -0
- package/dist/billing-foundation/projection.d.ts +8 -8
- package/dist/billing-foundation/types.d.ts +11 -0
- package/dist/billing-foundation/validate-options.js +13 -0
- package/dist/billing-foundation/web/billing-contact-plan.d.ts +5 -0
- package/dist/billing-foundation/web/billing-contact-plan.js +17 -0
- package/dist/billing-foundation/web/billing-plans-panel.js +5 -13
- package/dist/billing-foundation/web/cancel-contract-dialog.js +2 -2
- package/dist/billing-foundation/web/checkout-consent-dialog.d.ts +1 -1
- package/dist/billing-foundation/web/checkout-consent-dialog.js +1 -0
- package/dist/billing-foundation/web/client-plugin.d.ts +1 -1
- package/dist/billing-foundation/web/localized-params.d.ts +1 -0
- package/dist/billing-foundation/web/localized-params.js +11 -0
- package/dist/cap-counter/entity.d.ts +1 -1
- package/dist/cap-overview/handlers/tenant-caps-list.query.d.ts +9 -4
- package/dist/cap-overview/handlers/tenant-caps-list.query.js +14 -61
- package/dist/cap-overview/i18n.js +0 -2
- package/dist/cap-overview/web/cap-cards-panel.js +3 -3
- package/dist/cap-overview/web/client-plugin.d.ts +1 -1
- package/dist/channel-email/email-channel.d.ts +2 -1
- package/dist/compliance-profiles/web/client-plugin.d.ts +1 -1
- package/dist/config/feature.js +2 -2
- package/dist/config/table.d.ts +6 -6
- package/dist/custom-fields/entity.d.ts +4 -4
- package/dist/custom-fields/web/client-plugin.d.ts +1 -1
- package/dist/data-retention/schema/tenant-retention-override.d.ts +4 -4
- package/dist/delivery/tables.d.ts +6 -6
- package/dist/delivery/unsubscribe-page.js +1 -1
- package/dist/delivery/web/client-plugin.d.ts +1 -1
- package/dist/delivery/web/delivery-status-cell.js +1 -1
- package/dist/document-ingest-foundation/entity.d.ts +4 -4
- package/dist/feature-toggles/web/client-plugin.d.ts +1 -1
- package/dist/file-provider-s3/env-named-feature.d.ts +17 -0
- package/dist/file-provider-s3/env-named-feature.js +23 -0
- package/dist/file-provider-s3/env-schema.d.ts +7 -0
- package/dist/file-provider-s3/env-schema.js +15 -10
- package/dist/file-provider-s3/index.d.ts +1 -0
- package/dist/file-provider-s3/index.js +1 -0
- package/dist/folders/entity.d.ts +8 -8
- package/dist/folders/web/client-plugin.d.ts +1 -1
- package/dist/form-draft/entity.d.ts +2 -2
- package/dist/host-routing/constants.d.ts +2 -0
- package/dist/host-routing/constants.js +3 -0
- package/dist/host-routing/dispatch.d.ts +1 -1
- package/dist/host-routing/dispatch.js +35 -25
- package/dist/host-routing/feature.js +100 -27
- package/dist/host-routing/host.d.ts +9 -0
- package/dist/host-routing/host.js +24 -2
- package/dist/host-routing/index.d.ts +2 -1
- package/dist/host-routing/index.js +1 -0
- package/dist/host-routing/options.d.ts +14 -0
- package/dist/host-routing/redirects.d.ts +6 -0
- package/dist/host-routing/redirects.js +27 -0
- package/dist/host-routing/tenant-lookup.d.ts +7 -0
- package/dist/host-routing/tenant-lookup.js +39 -0
- package/dist/host-routing/validate-options.js +34 -1
- package/dist/inbound-mail-foundation/entities.d.ts +25 -25
- package/dist/inbound-mail-foundation/feature.js +7 -0
- package/dist/inbound-mail-foundation/i18n.d.ts +3 -0
- package/dist/inbound-mail-foundation/i18n.js +35 -0
- package/dist/inbound-mail-foundation/index.d.ts +1 -0
- package/dist/inbound-mail-foundation/index.js +1 -0
- package/dist/inbound-mail-foundation/projection.d.ts +20 -20
- package/dist/inbound-mail-foundation/screens.d.ts +7 -0
- package/dist/inbound-mail-foundation/screens.js +86 -0
- package/dist/inbound-mail-foundation/types.d.ts +2 -2
- package/dist/jobs/job-run-table.d.ts +6 -6
- package/dist/jobs/web/client-plugin.d.ts +1 -1
- package/dist/ledger/entity.d.ts +13 -13
- package/dist/legal-pages/feature.js +11 -1
- package/dist/legal-pages/layout.d.ts +2 -2
- package/dist/legal-pages/layout.js +4 -4
- package/dist/legal-pages/web/client-plugin.d.ts +1 -1
- package/dist/mail-foundation/feature.d.ts +20 -21
- package/dist/mail-foundation/feature.js +1 -1
- package/dist/managed-pages/table.d.ts +12 -12
- package/dist/managed-pages/web/client-plugin.d.ts +1 -1
- package/dist/notes-history/entity.d.ts +12 -12
- package/dist/notes-history/web/client-plugin.d.ts +1 -1
- package/dist/page-render/branding.js +1 -1
- package/dist/page-render/layout.d.ts +1 -1
- package/dist/page-render/layout.js +2 -2
- package/dist/page-render/markdown.js +1 -1
- package/dist/personal-access-tokens/i18n.js +1 -1
- package/dist/personal-access-tokens/schema/api-token.d.ts +6 -6
- package/dist/personal-access-tokens/screens.js +1 -1
- package/dist/secrets/feature.d.ts +1 -1
- package/dist/secrets/feature.js +3 -3
- package/dist/secrets/table.d.ts +1 -1
- package/dist/seo/sitemap.js +1 -1
- package/dist/sessions/schema/user-session.d.ts +4 -4
- package/dist/shared/mail-template-body.js +1 -1
- package/dist/shared/purge-files-reaching-subject.js +98 -3
- package/dist/tags/entity.d.ts +9 -9
- package/dist/tags/web/client-plugin.d.ts +1 -1
- package/dist/template-resolver/document-blocks.d.ts +5 -0
- package/dist/template-resolver/document-blocks.js +21 -0
- package/dist/template-resolver/document-ops.d.ts +167 -0
- package/dist/template-resolver/document-ops.js +390 -0
- package/dist/template-resolver/document-sanitizer.d.ts +3 -0
- package/dist/template-resolver/document-sanitizer.js +6 -0
- package/dist/template-resolver/feature.d.ts +2 -0
- package/dist/template-resolver/feature.js +4 -0
- package/dist/template-resolver/handlers/bundle-import.js +1 -0
- package/dist/template-resolver/handlers/document-base.d.ts +23 -0
- package/dist/template-resolver/handlers/document-base.js +55 -0
- package/dist/template-resolver/handlers/document-blocks.query.d.ts +22 -0
- package/dist/template-resolver/handlers/document-blocks.query.js +46 -0
- package/dist/template-resolver/handlers/export-bundle.query.d.ts +1 -0
- package/dist/template-resolver/handlers/export-bundle.query.js +9 -2
- package/dist/template-resolver/handlers/import-bundle-system.write.d.ts +1 -0
- package/dist/template-resolver/handlers/import-bundle.write.d.ts +1 -0
- package/dist/template-resolver/handlers/patch-draft.write.d.ts +66 -0
- package/dist/template-resolver/handlers/patch-draft.write.js +105 -0
- package/dist/template-resolver/handlers/preview.query.d.ts +1 -0
- package/dist/template-resolver/handlers/preview.query.js +2 -1
- package/dist/template-resolver/handlers/send-test.write.d.ts +1 -0
- package/dist/template-resolver/handlers/send-test.write.js +2 -1
- package/dist/template-resolver/handlers/template-write.d.ts +2 -0
- package/dist/template-resolver/handlers/template-write.js +14 -2
- package/dist/template-resolver/handlers/validate.query.d.ts +10 -4
- package/dist/template-resolver/handlers/validate.query.js +12 -7
- package/dist/template-resolver/{web/placeholder-text.js → placeholder-text.js} +1 -1
- package/dist/template-resolver/qualified-names.d.ts +2 -0
- package/dist/template-resolver/qualified-names.js +2 -0
- package/dist/template-resolver/seeding.d.ts +1 -0
- package/dist/template-resolver/seeding.js +2 -1
- package/dist/template-resolver/table.d.ts +10 -10
- package/dist/template-resolver/template-bundle.d.ts +1 -0
- package/dist/template-resolver/template-bundle.js +6 -1
- package/dist/template-resolver/template-preview.d.ts +4 -1
- package/dist/template-resolver/template-preview.js +16 -3
- package/dist/template-resolver/template-validation.d.ts +2 -1
- package/dist/template-resolver/template-validation.js +1 -1
- package/dist/template-resolver/user-content-table.d.ts +10 -10
- package/dist/template-resolver/web/client-plugin.d.ts +1 -1
- package/dist/template-resolver/web/client-plugin.js +3 -3
- package/dist/template-resolver/web/document-tiptap-editor.js +1 -1
- package/dist/template-resolver/web/document-toolbar-blocks.d.ts +2 -5
- package/dist/template-resolver/web/document-toolbar-blocks.js +1 -21
- package/dist/template-resolver/web/i18n.js +14 -0
- package/dist/template-resolver/web/placeholder-line-editor.js +2 -2
- package/dist/tenant/invitation-table.d.ts +6 -6
- package/dist/tenant/membership-table.d.ts +4 -4
- package/dist/tenant/schema/tenant.d.ts +6 -6
- package/dist/tenant/web/client-plugin.d.ts +1 -1
- package/dist/tenant/web/member-status-cell.js +1 -1
- package/dist/tier-engine/entity.d.ts +1 -1
- package/dist/tier-engine/tier-resolver.d.ts +1 -1
- package/dist/tier-engine/web/client-plugin.d.ts +1 -1
- package/dist/user/schema/user.d.ts +12 -12
- package/dist/user-data-rights/env.d.ts +5 -0
- package/dist/user-data-rights/env.js +11 -0
- package/dist/user-data-rights/feature.js +4 -2
- package/dist/user-data-rights/index.d.ts +1 -0
- package/dist/user-data-rights/index.js +1 -0
- package/dist/user-data-rights/lib/mail-transport-resolver.js +1 -1
- package/dist/user-data-rights/lib/storage-provider-resolver.js +1 -1
- package/dist/user-data-rights/mail-notifications.js +1 -1
- package/dist/user-data-rights/schema/download-attempt.d.ts +14 -14
- package/dist/user-data-rights/schema/download-token.d.ts +8 -8
- package/dist/user-data-rights/schema/export-job.d.ts +6 -6
- package/dist/user-data-rights/web/client-plugin.d.ts +1 -1
- package/dist/user-data-rights/web/privacy-center-screen.js +2 -2
- package/dist/waitlist/entity.d.ts +14 -14
- package/dist/waitlist/legacy-migrate.d.ts +2 -0
- package/dist/waitlist/legacy-migrate.js +38 -3
- package/package.json +16 -11
- package/src/account-security/changes.json +6 -0
- package/src/auth-email-password/changes.json +6 -0
- package/src/auth-foundation/changes.json +6 -0
- package/src/billing-foundation/changes.json +6 -0
- package/src/cap-overview/changes.json +7 -0
- package/src/channel-email/changes.json +6 -0
- package/src/crypto-shredding/changes.json +6 -0
- package/src/file-provider-s3/changes.json +6 -0
- package/src/host-routing/changes.json +6 -0
- package/src/inbound-mail-foundation/changes.json +7 -0
- package/src/legal-pages/changes.json +6 -0
- package/src/template-resolver/changes.json +18 -0
- package/src/user-data-rights/changes.json +6 -0
- package/src/waitlist/changes.json +6 -0
- /package/dist/template-resolver/{web/placeholder-text.d.ts → placeholder-text.d.ts} +0 -0
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// @runtime client
|
|
3
|
-
import { toInstant } from "@cosmicdrift/kumiko-headless";
|
|
4
3
|
import { useLocale, useMutation, usePrimitives, useQuery, useTranslation, } from "@cosmicdrift/kumiko-renderer";
|
|
5
|
-
import {
|
|
4
|
+
import { toInstant } from "@cosmicdrift/kumiko-renderer/headless";
|
|
5
|
+
import { formatMoney, PlanCard, PlanGrid, } from "@cosmicdrift/kumiko-renderer/web";
|
|
6
6
|
import { useState } from "react";
|
|
7
7
|
import { BillingPlanActions, SubscriptionFoundationHandlers, SubscriptionFoundationQueries, SubscriptionStatuses, } from "../constants.js";
|
|
8
|
+
import { BillingContactPlan } from "./billing-contact-plan.js";
|
|
8
9
|
import { CancelContractDialog } from "./cancel-contract-dialog.js";
|
|
9
10
|
import { CheckoutConsentDialog } from "./checkout-consent-dialog.js";
|
|
11
|
+
import { localizedParams } from "./localized-params.js";
|
|
10
12
|
function intervalKey(price) {
|
|
11
13
|
if (price === null || price.interval === null)
|
|
12
14
|
return undefined;
|
|
@@ -21,16 +23,6 @@ function renewalKey(price) {
|
|
|
21
23
|
? `billing-foundation.consent.renewsEvery.${price.interval}`
|
|
22
24
|
: `billing-foundation.consent.renews.${price.interval}`;
|
|
23
25
|
}
|
|
24
|
-
function localizedParams(params, locale) {
|
|
25
|
-
if (params === undefined)
|
|
26
|
-
return undefined;
|
|
27
|
-
const localized = {};
|
|
28
|
-
for (const [key, value] of Object.entries(params)) {
|
|
29
|
-
localized[key] =
|
|
30
|
-
typeof value === "number" ? new Intl.NumberFormat(locale).format(value) : value;
|
|
31
|
-
}
|
|
32
|
-
return localized;
|
|
33
|
-
}
|
|
34
26
|
/** Which action the plan "would" offer if it weren't blocked — mirrors
|
|
35
27
|
* plan-catalog.ts's own decision tree, since `unavailable` collapses both
|
|
36
28
|
* "would checkout" and "would switch" into one action and the disabled CTA
|
|
@@ -189,7 +181,7 @@ export function BillingPlansPanel(_props) {
|
|
|
189
181
|
date: toInstant(result.subscription.cancelAt).toLocaleString(locale, {
|
|
190
182
|
dateStyle: "medium",
|
|
191
183
|
}),
|
|
192
|
-
}), " ", t("billing-foundation.plans.switchRequiresReactivation")] })), consumerProtection !== undefined && canManage && result.subscription?.cancelAt == null && (_jsx("div", { children: _jsx(Button, { variant: "secondary", onClick: () => setCancelOpen(true), testId: "billing-plans-cancel-contract", children: t("billing-foundation.cancel.open") }) })), _jsxs(PlanGrid, { testId: "billing-plans-grid", children: [!currentTierInPlans && (_jsx(PlanCard, { title: t(result.currentTier.labelKey), current: true, testId: "billing-plan-card-current", features: result.currentTier.benefits.map((benefit) => t(benefit.labelKey, localizedParams(benefit.params, locale))), secondaryAction: manageOrReactivateAction(canManage, result.subscription, t, handleManage, redirecting) })), visiblePlans.map((plan) => (_jsx(PlanCard, { testId: `billing-plan-card-${plan.tier}`, ...toCardProps(plan) }, plan.tier)))] }), consumerProtection !== undefined &&
|
|
184
|
+
}), " ", t("billing-foundation.plans.switchRequiresReactivation")] })), consumerProtection !== undefined && canManage && result.subscription?.cancelAt == null && (_jsx("div", { children: _jsx(Button, { variant: "secondary", onClick: () => setCancelOpen(true), testId: "billing-plans-cancel-contract", children: t("billing-foundation.cancel.open") }) })), _jsxs(PlanGrid, { testId: "billing-plans-grid", children: [!currentTierInPlans && (_jsx(PlanCard, { title: t(result.currentTier.labelKey), current: true, testId: "billing-plan-card-current", features: result.currentTier.benefits.map((benefit) => t(benefit.labelKey, localizedParams(benefit.params, locale))), secondaryAction: manageOrReactivateAction(canManage, result.subscription, t, handleManage, redirecting) })), visiblePlans.map((plan) => (_jsx(PlanCard, { testId: `billing-plan-card-${plan.tier}`, ...toCardProps(plan) }, plan.tier))), result.contact !== undefined && _jsx(BillingContactPlan, { contact: result.contact })] }), consumerProtection !== undefined &&
|
|
193
185
|
consentPlan !== undefined &&
|
|
194
186
|
consentPlan.price !== null && (_jsx(CheckoutConsentDialog, { open: true, onOpenChange: (open) => {
|
|
195
187
|
if (!open)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// @runtime client
|
|
3
|
-
import { toInstant } from "@cosmicdrift/kumiko-headless";
|
|
4
3
|
import { useLocale, useMutation, usePrimitives, useTranslation, } from "@cosmicdrift/kumiko-renderer";
|
|
5
|
-
import {
|
|
4
|
+
import { toInstant } from "@cosmicdrift/kumiko-renderer/headless";
|
|
5
|
+
import { ModeSwitch } from "@cosmicdrift/kumiko-renderer/web";
|
|
6
6
|
import { useState } from "react";
|
|
7
7
|
import { SubscriptionFoundationHandlers } from "../constants.js";
|
|
8
8
|
const DECLARATION_TYPES = [
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WriteResult } from "@cosmicdrift/kumiko-headless";
|
|
1
|
+
import type { WriteResult } from "@cosmicdrift/kumiko-renderer/headless";
|
|
2
2
|
import { type ReactNode } from "react";
|
|
3
3
|
import type { BillingPlansResult } from "../types.ts";
|
|
4
4
|
export declare const CONSENT_TEXT_OUTDATED_CODE = "consent_text_outdated";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// @runtime client
|
|
2
3
|
import { useLocale, usePrimitives, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
3
4
|
import { useState } from "react";
|
|
4
5
|
import { resolveConsentLocale } from "../consumer-protection/consent-locale.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type BillingFoundationClientOptions = {
|
|
4
4
|
readonly translations?: TranslationsByLocale;
|
|
5
5
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function localizedParams(params: Readonly<Record<string, string | number>> | undefined, locale: string): Readonly<Record<string, string>> | undefined;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// @runtime client
|
|
2
|
+
export function localizedParams(params, locale) {
|
|
3
|
+
if (params === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
const localized = {};
|
|
6
|
+
for (const [key, value] of Object.entries(params)) {
|
|
7
|
+
localized[key] =
|
|
8
|
+
typeof value === "number" ? new Intl.NumberFormat(locale).format(value) : value;
|
|
9
|
+
}
|
|
10
|
+
return localized;
|
|
11
|
+
}
|
|
@@ -13,7 +13,7 @@ export declare const capCounterEntity: import("@cosmicdrift/kumiko-types/fields"
|
|
|
13
13
|
readonly sensitive?: boolean;
|
|
14
14
|
readonly writeOnly?: boolean;
|
|
15
15
|
readonly readAsInstruction?: boolean;
|
|
16
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
16
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
17
17
|
readonly default?: string;
|
|
18
18
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
19
19
|
readonly multiline?: boolean | {
|
|
@@ -8,14 +8,20 @@ type TenantCapsListRow = {
|
|
|
8
8
|
readonly [capField: string]: unknown;
|
|
9
9
|
};
|
|
10
10
|
export declare function createTenantCapsListQuery(caps: readonly CapSpec[], listCaps: readonly string[]): import("@cosmicdrift/kumiko-framework/engine").PagedQueryHandlerDefinition<"tenant-caps:list", z.ZodObject<{
|
|
11
|
-
cursor: z.ZodOptional<z.ZodString>;
|
|
12
11
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
13
|
-
|
|
12
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
search: z.ZodOptional<z.ZodString>;
|
|
14
|
+
sort: z.ZodOptional<z.ZodEnum<{
|
|
15
|
+
billing: "billing";
|
|
16
|
+
name: "name";
|
|
17
|
+
tier: "tier";
|
|
18
|
+
}>>;
|
|
14
19
|
sortDirection: z.ZodOptional<z.ZodEnum<{
|
|
15
20
|
asc: "asc";
|
|
16
21
|
desc: "desc";
|
|
17
22
|
}>>;
|
|
18
|
-
|
|
23
|
+
totalCount: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
+
cursor: z.ZodOptional<z.ZodNever>;
|
|
19
25
|
filters: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
20
26
|
field: z.ZodString;
|
|
21
27
|
op: z.ZodEnum<{
|
|
@@ -27,6 +33,5 @@ export declare function createTenantCapsListQuery(caps: readonly CapSpec[], list
|
|
|
27
33
|
}>;
|
|
28
34
|
value: z.ZodUnknown;
|
|
29
35
|
}, z.core.$strip>>>;
|
|
30
|
-
totalCount: z.ZodOptional<z.ZodBoolean>;
|
|
31
36
|
}, z.core.$strip>, TenantCapsListRow, import("@cosmicdrift/kumiko-types/event-type-map").KumikoEventTypeMap>;
|
|
32
37
|
export {};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { buildEntityTable,
|
|
2
|
-
import { definePagedQueryHandler,
|
|
1
|
+
import { buildEntityTable, selectMany } from "@cosmicdrift/kumiko-framework/db";
|
|
2
|
+
import { definePagedQueryHandler, pagedListSchema, pageRows, } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { InternalError, ValidationError } from "@cosmicdrift/kumiko-framework/errors";
|
|
4
|
-
import { isOneOf } from "@cosmicdrift/kumiko-types/type-guards";
|
|
5
4
|
import * as z from "zod";
|
|
6
5
|
import { subscriptionsProjectionTable } from "../../billing-foundation/index.js";
|
|
7
6
|
import { decryptTenantNames, tenantTable } from "../../tenant/index.js";
|
|
@@ -33,9 +32,6 @@ async function resolveLimitsByTenantAndCap(caps, tenants, configFor) {
|
|
|
33
32
|
}));
|
|
34
33
|
return new Map(entries);
|
|
35
34
|
}
|
|
36
|
-
function isSortableField(field) {
|
|
37
|
-
return isOneOf(SORTABLE_FIELDS, field);
|
|
38
|
-
}
|
|
39
35
|
// tier is a plain string with no defined ordering — lt/gt have no meaning
|
|
40
36
|
// on it and are rejected rather than silently treated as "no filter".
|
|
41
37
|
function assertSupportedTierFilterOp(op) {
|
|
@@ -93,16 +89,10 @@ export function createTenantCapsListQuery(caps, listCaps) {
|
|
|
93
89
|
return definePagedQueryHandler({
|
|
94
90
|
name: "tenant-caps:list",
|
|
95
91
|
description: "Lists every tenant on the platform with its tier, billing provider/status and per-cap usage, paged, searchable by name and filterable by tier; use it as the operator-wide capacity overview.",
|
|
96
|
-
schema:
|
|
97
|
-
cursor: z.string().optional(),
|
|
98
|
-
limit: z.number().int().min(1).max(MAX_LIST_LIMIT).default(50),
|
|
99
|
-
sort: z.string().optional(),
|
|
100
|
-
sortDirection: z.enum(["asc", "desc"]).optional(),
|
|
101
|
-
search: z.string().optional(),
|
|
92
|
+
schema: pagedListSchema(SORTABLE_FIELDS).extend({
|
|
102
93
|
filters: z
|
|
103
94
|
.array(z.object({ field: z.string(), op: FILTER_OP, value: z.unknown() }))
|
|
104
95
|
.optional(),
|
|
105
|
-
totalCount: z.boolean().optional(),
|
|
106
96
|
}),
|
|
107
97
|
access: { roles: ["SystemAdmin"] },
|
|
108
98
|
escapeHatch: {
|
|
@@ -122,60 +112,28 @@ export function createTenantCapsListQuery(caps, listCaps) {
|
|
|
122
112
|
const subscriptions = await selectMany(db, subscriptionsProjectionTable, {});
|
|
123
113
|
const assignmentByTenant = new Map(assignments.map((row) => [row.tenantId, row]));
|
|
124
114
|
const subscriptionByTenant = new Map(subscriptions.map((row) => [row.tenantId, row]));
|
|
125
|
-
// Case-insensitive substring search has no `ilike` operator in the
|
|
126
|
-
// query builder (only `like`, SQL-LIKE case-sensitive) — filtered here
|
|
127
|
-
// in JS, same as tenant/team-list.query.ts's search.
|
|
128
|
-
const search = query.payload.search?.trim().toLowerCase();
|
|
129
115
|
const tierFilter = extractTierFilter(query.payload.filters ?? []);
|
|
130
116
|
const merged = tenants
|
|
131
|
-
.filter((tenant) => search === undefined || search === "" || tenant.name.toLowerCase().includes(search))
|
|
132
117
|
.map((tenant) => {
|
|
133
118
|
const assignment = assignmentByTenant.get(tenant.id);
|
|
134
119
|
return {
|
|
120
|
+
id: tenant.id,
|
|
135
121
|
tenantId: tenant.id,
|
|
136
122
|
name: tenant.name,
|
|
137
123
|
tier: assignment?.tier ?? "",
|
|
138
|
-
source: assignment?.source ?? null,
|
|
139
124
|
billing: billingLabel(subscriptionByTenant.get(tenant.id), assignment?.source ?? null),
|
|
140
125
|
};
|
|
141
126
|
})
|
|
142
127
|
.filter((row) => matchesTierFilter(row.tier, tierFilter));
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
},
|
|
153
|
-
],
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
const sortDirection = query.payload.sortDirection ?? "asc";
|
|
157
|
-
const directionMultiplier = sortDirection === "asc" ? 1 : -1;
|
|
158
|
-
const sorted = [...merged].sort((a, b) => a[sortField].localeCompare(b[sortField]) * directionMultiplier);
|
|
159
|
-
// ponytail: base64-wrapped offset, not a SQL keyset — rows come from a
|
|
160
|
-
// JS merge of three tables (tenant/tier-assignment/subscription), same
|
|
161
|
-
// rationale as tenant/team-list.query.ts. Holds up to tier-engine's
|
|
162
|
-
// documented "single-pass scan" scale (a few thousand tenants); past
|
|
163
|
-
// that the fix is a real combined read-projection, not a cursor
|
|
164
|
-
// bolted onto this merge.
|
|
165
|
-
const offset = query.payload.cursor ? Number(decodeCursor(query.payload.cursor)) : 0;
|
|
166
|
-
if (!Number.isInteger(offset) || offset < 0) {
|
|
167
|
-
throw new ValidationError({
|
|
168
|
-
fields: [
|
|
169
|
-
{
|
|
170
|
-
path: "cursor",
|
|
171
|
-
code: "invalid_cursor",
|
|
172
|
-
i18nKey: "cap-overview.errors.invalidCursor",
|
|
173
|
-
},
|
|
174
|
-
],
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
const limit = query.payload.limit;
|
|
178
|
-
const page = sorted.slice(offset, offset + limit);
|
|
128
|
+
// Search and paging run in memory because the rows are a JS merge of
|
|
129
|
+
// three tables (tenant/tier-assignment/subscription), same rationale as
|
|
130
|
+
// tenant/team-list.query.ts. Holds up to tier-engine's documented
|
|
131
|
+
// "single-pass scan" scale (a few thousand tenants); past that the fix
|
|
132
|
+
// is a real combined read-projection.
|
|
133
|
+
const { rows: page, total } = pageRows(merged, query.payload, {
|
|
134
|
+
searchFields: ["name"],
|
|
135
|
+
defaultSort: "name",
|
|
136
|
+
});
|
|
179
137
|
// Usage is computed only for this page's tenant ids, never for the
|
|
180
138
|
// full tenant set; caps without usageBatch still cost one query per
|
|
181
139
|
// tenant of the page, so those run in parallel.
|
|
@@ -212,12 +170,7 @@ export function createTenantCapsListQuery(caps, listCaps) {
|
|
|
212
170
|
...capFields,
|
|
213
171
|
};
|
|
214
172
|
});
|
|
215
|
-
|
|
216
|
-
return {
|
|
217
|
-
rows,
|
|
218
|
-
nextCursor,
|
|
219
|
-
...(query.payload.totalCount === true && { total: merged.length }),
|
|
220
|
-
};
|
|
173
|
+
return { rows, nextCursor: null, ...(total !== undefined && { total }) };
|
|
221
174
|
},
|
|
222
175
|
});
|
|
223
176
|
}
|
|
@@ -15,11 +15,9 @@ export const CAP_OVERVIEW_I18N = {
|
|
|
15
15
|
"cap-overview.errors.progressPrimitiveMissing": {
|
|
16
16
|
en: "Usage bar unavailable — Progress primitive is not registered.",
|
|
17
17
|
},
|
|
18
|
-
"cap-overview.errors.invalidCursor": { en: "The pagination cursor is invalid." },
|
|
19
18
|
"cap-overview.errors.filterFieldUnsupported": {
|
|
20
19
|
en: "Filtering by this field is not supported, or tier was filtered more than once.",
|
|
21
20
|
},
|
|
22
|
-
"cap-overview.errors.sortFieldUnsupported": { en: "Sorting by this field is not supported." },
|
|
23
21
|
"cap-overview.errors.tenantOverrideRequiresSystemAdmin": {
|
|
24
22
|
en: "Only SystemAdmin may query another tenant's data.",
|
|
25
23
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-headless";
|
|
3
2
|
import { usePrimitives, useQuery, useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
4
|
-
import {
|
|
3
|
+
import { EMPTY_VALUE_PLACEHOLDER } from "@cosmicdrift/kumiko-renderer/headless";
|
|
4
|
+
import { EmptyState, StatCard, StatusBadge, } from "@cosmicdrift/kumiko-renderer/web";
|
|
5
5
|
import { Database, FileText, Gauge, Hash, Mail, Users } from "lucide-react";
|
|
6
6
|
import { CapOverviewQueries } from "../constants.js";
|
|
7
7
|
import { CapUsageBar } from "./cap-usage-bar.js";
|
|
@@ -44,7 +44,7 @@ export function CapCardsPanel({ filterParams }) {
|
|
|
44
44
|
}
|
|
45
45
|
return (_jsxs("div", {
|
|
46
46
|
// Arbitrary bracket values (grid-cols-[repeat(...)]) never compiled:
|
|
47
|
-
// styles.css's Tailwind v4 @source scan only covers renderer
|
|
47
|
+
// styles.css's Tailwind v4 @source scan only covers renderer/web/src,
|
|
48
48
|
// renderer/src and samples/**/src (see its comment) — bundled-features
|
|
49
49
|
// isn't scanned, so a class unique to this file has no generated rule
|
|
50
50
|
// and silently no-ops (the grid fell back to one implicit column,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type CapOverviewClientOptions = {
|
|
4
4
|
readonly translations?: TranslationsByLocale;
|
|
5
5
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { TenantDb } from "@cosmicdrift/kumiko-framework/db";
|
|
1
2
|
import type { TenantId } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
3
|
import { type ChannelContext, type DeliveryChannel, type EmailAttachmentRef } from "../delivery/index.ts";
|
|
3
4
|
import type { EmailTransport } from "./types.ts";
|
|
@@ -16,7 +17,7 @@ type EmailChannelTransports = {
|
|
|
16
17
|
};
|
|
17
18
|
export type EmailChannelOptions = EmailChannelTransports & {
|
|
18
19
|
readonly resolveEmail: (userId: string, ctx: {
|
|
19
|
-
db:
|
|
20
|
+
db: TenantDb;
|
|
20
21
|
tenantId: TenantId;
|
|
21
22
|
}) => Promise<string | null>;
|
|
22
23
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type ComplianceProfilesClientOptions = {
|
|
4
4
|
readonly translations?: TranslationsByLocale;
|
|
5
5
|
};
|
package/dist/config/feature.js
CHANGED
|
@@ -53,7 +53,7 @@ export function createConfigAccessor(registry, resolver, tenantId, userId, db, s
|
|
|
53
53
|
}
|
|
54
54
|
return configAccessor;
|
|
55
55
|
}
|
|
56
|
-
// Pass to the test-stack / server-boot as `
|
|
56
|
+
// Pass to the test-stack / server-boot as `configAccessorFactory` —
|
|
57
57
|
// `buildHandlerContext` mints a per-user `ctx.config` from this.
|
|
58
58
|
export function createConfigAccessorFactory(registry, resolver) {
|
|
59
59
|
return ({ user, db, secrets }) => createConfigAccessor(registry, resolver, user.tenantId, user.id, db, secrets);
|
|
@@ -67,7 +67,7 @@ export function requireConfigResolver(ctx, handlerName) {
|
|
|
67
67
|
if (!ctx.configResolver) {
|
|
68
68
|
throw new InternalError({
|
|
69
69
|
message: `[${handlerName}] ctx.configResolver missing — pass createConfigAccessorFactory's ` +
|
|
70
|
-
`output via extraContext.
|
|
70
|
+
`output via extraContext.configAccessorFactory and the resolver via ` +
|
|
71
71
|
`extraContext.configResolver at boot.`,
|
|
72
72
|
});
|
|
73
73
|
}
|
package/dist/config/table.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare const configValueEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
13
13
|
readonly sensitive?: boolean;
|
|
14
14
|
readonly writeOnly?: boolean;
|
|
15
15
|
readonly readAsInstruction?: boolean;
|
|
16
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
16
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
17
17
|
readonly default?: string;
|
|
18
18
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
19
19
|
readonly multiline?: boolean | {
|
|
@@ -36,7 +36,7 @@ export declare const configValueEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
36
36
|
readonly sensitive?: boolean;
|
|
37
37
|
readonly writeOnly?: boolean;
|
|
38
38
|
readonly readAsInstruction?: boolean;
|
|
39
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
39
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
40
40
|
readonly default?: string;
|
|
41
41
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
42
42
|
readonly multiline?: boolean | {
|
|
@@ -59,7 +59,7 @@ export declare const configValueEntity: import("@cosmicdrift/kumiko-types/fields
|
|
|
59
59
|
readonly sensitive?: boolean;
|
|
60
60
|
readonly writeOnly?: boolean;
|
|
61
61
|
readonly readAsInstruction?: boolean;
|
|
62
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
62
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
63
63
|
readonly default?: string;
|
|
64
64
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
65
65
|
readonly multiline?: boolean | {
|
|
@@ -84,7 +84,7 @@ export declare const configValuesTable: import("@cosmicdrift/kumiko-framework/db
|
|
|
84
84
|
readonly sensitive?: boolean;
|
|
85
85
|
readonly writeOnly?: boolean;
|
|
86
86
|
readonly readAsInstruction?: boolean;
|
|
87
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
87
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
88
88
|
readonly default?: string;
|
|
89
89
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
90
90
|
readonly multiline?: boolean | {
|
|
@@ -107,7 +107,7 @@ export declare const configValuesTable: import("@cosmicdrift/kumiko-framework/db
|
|
|
107
107
|
readonly sensitive?: boolean;
|
|
108
108
|
readonly writeOnly?: boolean;
|
|
109
109
|
readonly readAsInstruction?: boolean;
|
|
110
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
110
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
111
111
|
readonly default?: string;
|
|
112
112
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
113
113
|
readonly multiline?: boolean | {
|
|
@@ -130,7 +130,7 @@ export declare const configValuesTable: import("@cosmicdrift/kumiko-framework/db
|
|
|
130
130
|
readonly sensitive?: boolean;
|
|
131
131
|
readonly writeOnly?: boolean;
|
|
132
132
|
readonly readAsInstruction?: boolean;
|
|
133
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
133
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
134
134
|
readonly default?: string;
|
|
135
135
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
136
136
|
readonly multiline?: boolean | {
|
|
@@ -13,7 +13,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
|
|
|
13
13
|
readonly sensitive?: boolean;
|
|
14
14
|
readonly writeOnly?: boolean;
|
|
15
15
|
readonly readAsInstruction?: boolean;
|
|
16
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
16
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
17
17
|
readonly default?: string;
|
|
18
18
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
19
19
|
readonly multiline?: boolean | {
|
|
@@ -36,7 +36,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
|
|
|
36
36
|
readonly sensitive?: boolean;
|
|
37
37
|
readonly writeOnly?: boolean;
|
|
38
38
|
readonly readAsInstruction?: boolean;
|
|
39
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
39
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
40
40
|
readonly default?: string;
|
|
41
41
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
42
42
|
readonly multiline?: boolean | {
|
|
@@ -59,7 +59,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
|
|
|
59
59
|
readonly sensitive?: boolean;
|
|
60
60
|
readonly writeOnly?: boolean;
|
|
61
61
|
readonly readAsInstruction?: boolean;
|
|
62
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
62
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
63
63
|
readonly default?: string;
|
|
64
64
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
65
65
|
readonly multiline?: boolean | {
|
|
@@ -109,7 +109,7 @@ export declare const fieldDefinitionEntity: import("@cosmicdrift/kumiko-types/fi
|
|
|
109
109
|
readonly sensitive?: boolean;
|
|
110
110
|
readonly writeOnly?: boolean;
|
|
111
111
|
readonly readAsInstruction?: boolean;
|
|
112
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
112
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
113
113
|
readonly default?: string;
|
|
114
114
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
115
115
|
readonly multiline?: boolean | {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
1
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
2
2
|
export declare function customFieldsClient(): ClientFeatureDefinition;
|
|
@@ -13,7 +13,7 @@ export declare const tenantRetentionOverrideEntity: import("@cosmicdrift/kumiko-
|
|
|
13
13
|
readonly sensitive?: boolean;
|
|
14
14
|
readonly writeOnly?: boolean;
|
|
15
15
|
readonly readAsInstruction?: boolean;
|
|
16
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
16
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
17
17
|
readonly default?: string;
|
|
18
18
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
19
19
|
readonly multiline?: boolean | {
|
|
@@ -52,7 +52,7 @@ export declare const tenantRetentionOverrideEntity: import("@cosmicdrift/kumiko-
|
|
|
52
52
|
readonly sensitive?: boolean;
|
|
53
53
|
readonly writeOnly?: boolean;
|
|
54
54
|
readonly readAsInstruction?: boolean;
|
|
55
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
55
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
56
56
|
readonly default?: string;
|
|
57
57
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
58
58
|
readonly multiline?: boolean | {
|
|
@@ -77,7 +77,7 @@ export declare const tenantRetentionOverrideTable: import("@cosmicdrift/kumiko-f
|
|
|
77
77
|
readonly sensitive?: boolean;
|
|
78
78
|
readonly writeOnly?: boolean;
|
|
79
79
|
readonly readAsInstruction?: boolean;
|
|
80
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
80
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
81
81
|
readonly default?: string;
|
|
82
82
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
83
83
|
readonly multiline?: boolean | {
|
|
@@ -116,7 +116,7 @@ export declare const tenantRetentionOverrideTable: import("@cosmicdrift/kumiko-f
|
|
|
116
116
|
readonly sensitive?: boolean;
|
|
117
117
|
readonly writeOnly?: boolean;
|
|
118
118
|
readonly readAsInstruction?: boolean;
|
|
119
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
119
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
120
120
|
readonly default?: string;
|
|
121
121
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
122
122
|
readonly multiline?: boolean | {
|
|
@@ -16,7 +16,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
|
|
|
16
16
|
readonly sensitive?: boolean;
|
|
17
17
|
readonly writeOnly?: boolean;
|
|
18
18
|
readonly readAsInstruction?: boolean;
|
|
19
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
19
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
20
20
|
readonly default?: string;
|
|
21
21
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
22
22
|
readonly multiline?: boolean | {
|
|
@@ -39,7 +39,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
|
|
|
39
39
|
readonly sensitive?: boolean;
|
|
40
40
|
readonly writeOnly?: boolean;
|
|
41
41
|
readonly readAsInstruction?: boolean;
|
|
42
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
42
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
43
43
|
readonly default?: string;
|
|
44
44
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
45
45
|
readonly multiline?: boolean | {
|
|
@@ -62,7 +62,7 @@ export declare const notificationPreferenceEntity: import("@cosmicdrift/kumiko-t
|
|
|
62
62
|
readonly sensitive?: boolean;
|
|
63
63
|
readonly writeOnly?: boolean;
|
|
64
64
|
readonly readAsInstruction?: boolean;
|
|
65
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
65
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
66
66
|
readonly default?: string;
|
|
67
67
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
68
68
|
readonly multiline?: boolean | {
|
|
@@ -92,7 +92,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
|
|
|
92
92
|
readonly sensitive?: boolean;
|
|
93
93
|
readonly writeOnly?: boolean;
|
|
94
94
|
readonly readAsInstruction?: boolean;
|
|
95
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
95
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
96
96
|
readonly default?: string;
|
|
97
97
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
98
98
|
readonly multiline?: boolean | {
|
|
@@ -115,7 +115,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
|
|
|
115
115
|
readonly sensitive?: boolean;
|
|
116
116
|
readonly writeOnly?: boolean;
|
|
117
117
|
readonly readAsInstruction?: boolean;
|
|
118
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
118
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
119
119
|
readonly default?: string;
|
|
120
120
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
121
121
|
readonly multiline?: boolean | {
|
|
@@ -138,7 +138,7 @@ export declare const notificationAddressOptOutEntity: import("@cosmicdrift/kumik
|
|
|
138
138
|
readonly sensitive?: boolean;
|
|
139
139
|
readonly writeOnly?: boolean;
|
|
140
140
|
readonly readAsInstruction?: boolean;
|
|
141
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
141
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
142
142
|
readonly default?: string;
|
|
143
143
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
144
144
|
readonly multiline?: boolean | {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { mailT } from "@cosmicdrift/kumiko-framework/i18n";
|
|
3
|
-
import { escapeHtml, escapeHtmlAttr } from "@cosmicdrift/kumiko-headless";
|
|
3
|
+
import { escapeHtml, escapeHtmlAttr } from "@cosmicdrift/kumiko-renderer/headless";
|
|
4
4
|
import { DELIVERY_RESUBSCRIBE_PATH, DELIVERY_UNSUBSCRIBE_PATH } from "./public-names.js";
|
|
5
5
|
import "./unsubscribe-page-strings.js";
|
|
6
6
|
// Same values as the in-code mail layout of renderer-mail-html, so the page reads as the mail's sequel.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type DeliveryClientOptions = {
|
|
4
4
|
readonly translations?: TranslationsByLocale;
|
|
5
5
|
};
|
|
@@ -5,7 +5,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
5
5
|
// in feature.ts). The list frame itself is the generic declarative
|
|
6
6
|
// projectionList renderer — only this one cell stays TSX.
|
|
7
7
|
import { useTranslation } from "@cosmicdrift/kumiko-renderer";
|
|
8
|
-
import { StatusBadge } from "@cosmicdrift/kumiko-renderer
|
|
8
|
+
import { StatusBadge } from "@cosmicdrift/kumiko-renderer/web";
|
|
9
9
|
import { translateOrRaw } from "../../shared/web/translate-or-raw.js";
|
|
10
10
|
import { DeliveryStatus } from "../public-names.js";
|
|
11
11
|
const STATUS_TONE = {
|
|
@@ -24,7 +24,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
|
|
|
24
24
|
readonly sensitive?: boolean;
|
|
25
25
|
readonly writeOnly?: boolean;
|
|
26
26
|
readonly readAsInstruction?: boolean;
|
|
27
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
27
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
28
28
|
readonly default?: string;
|
|
29
29
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
30
30
|
readonly multiline?: boolean | {
|
|
@@ -47,7 +47,7 @@ export declare const documentExtractEntity: import("@cosmicdrift/kumiko-types/fi
|
|
|
47
47
|
readonly sensitive?: boolean;
|
|
48
48
|
readonly writeOnly?: boolean;
|
|
49
49
|
readonly readAsInstruction?: boolean;
|
|
50
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
50
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
51
51
|
readonly default?: string;
|
|
52
52
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
53
53
|
readonly multiline?: boolean | {
|
|
@@ -89,7 +89,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
|
|
|
89
89
|
readonly sensitive?: boolean;
|
|
90
90
|
readonly writeOnly?: boolean;
|
|
91
91
|
readonly readAsInstruction?: boolean;
|
|
92
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
92
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
93
93
|
readonly default?: string;
|
|
94
94
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
95
95
|
readonly multiline?: boolean | {
|
|
@@ -112,7 +112,7 @@ export declare const documentExtractsTable: import("@cosmicdrift/kumiko-framewor
|
|
|
112
112
|
readonly sensitive?: boolean;
|
|
113
113
|
readonly writeOnly?: boolean;
|
|
114
114
|
readonly readAsInstruction?: boolean;
|
|
115
|
-
readonly format?: "email" | "url" | "phone" | "password";
|
|
115
|
+
readonly format?: "email" | "url" | "phone" | "password" | "month";
|
|
116
116
|
readonly default?: string;
|
|
117
117
|
readonly access?: import("@cosmicdrift/kumiko-types/fields").FieldAccess;
|
|
118
118
|
readonly multiline?: boolean | {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
2
|
-
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer
|
|
2
|
+
import type { ClientFeatureDefinition } from "@cosmicdrift/kumiko-renderer/web";
|
|
3
3
|
export type FeatureTogglesClientOptions = {
|
|
4
4
|
readonly translations?: TranslationsByLocale;
|
|
5
5
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type NamedS3EnvProviderOptions = {
|
|
2
|
+
/** Provider key tenants select in `file-foundation`'s `provider` config; the feature is `file-provider-s3-env-<name>`. */
|
|
3
|
+
readonly name: string;
|
|
4
|
+
/** Env prefix of the credential set, e.g. `RELEASES_S3_`. */
|
|
5
|
+
readonly envPrefix: string;
|
|
6
|
+
/** Tolerate missing credentials at boot; the provider then fails on its first file operation. */
|
|
7
|
+
readonly lazy?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/** An additional S3 provider next to `"s3-env"`, reading its credentials from `<envPrefix>BUCKET` etc. */
|
|
10
|
+
export declare function createFileProviderS3NamedEnvFeature(options: NamedS3EnvProviderOptions): import("@cosmicdrift/kumiko-framework/env").FeatureWithEnvSchema<import("@cosmicdrift/kumiko-types/feature").FeatureDefinition & {
|
|
11
|
+
readonly exports: void;
|
|
12
|
+
}, {
|
|
13
|
+
[x: string]: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
14
|
+
false: "false";
|
|
15
|
+
true: "true";
|
|
16
|
+
}>> | import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodPipe<import("zod").ZodLiteral<"">, import("zod").ZodTransform<undefined, "">>, import("zod").ZodURL]>>;
|
|
17
|
+
}>;
|