@riverbankcms/sdk 0.77.0 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -0
- package/dist/{PreviewEditorSidebar-XSX7QKHQ.mjs → PreviewEditorSidebar-RIKFQ72L.mjs} +4916 -4847
- package/dist/{PreviewEditorUI-YZNEZ3QD.mjs → PreviewEditorUI-XO7TUWKK.mjs} +3 -3
- package/dist/SdkPreviewModeRuntime-LAGYMPNF.mjs +8 -0
- package/dist/_dts/ai/src/contracts/proposals.d.ts +194 -184
- package/dist/_dts/api/src/accessAdmin.d.ts +5 -0
- package/dist/_dts/api/src/billing.d.ts +3 -26
- package/dist/_dts/api/src/bookingVerticals.d.ts +4 -0
- package/dist/_dts/api/src/content-editor.d.ts +1 -0
- package/dist/_dts/api/src/demoDashboardMutationSurfaces.d.ts +46 -0
- package/dist/_dts/api/src/endpoints.d.ts +8 -0
- package/dist/_dts/api/src/index.d.ts +14 -2
- package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +87 -0
- package/dist/_dts/api/src/navigation/dashboardDemoNav.d.ts +5 -0
- package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +45 -0
- package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +42 -0
- package/dist/_dts/api/src/navigation/dashboardTeamMemberNav.d.ts +24 -0
- package/dist/_dts/api/src/navigation/linkUrlType.d.ts +3 -0
- package/dist/_dts/api/src/navigation.d.ts +12 -0
- package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +55 -26
- package/dist/_dts/api/src/staffAccess.d.ts +79 -0
- package/dist/_dts/api/src/types.d.ts +3 -1
- package/dist/_dts/api/src/workflows/automaticWorkflowTriggers.d.ts +21 -0
- package/dist/_dts/blocks/src/client/site-chrome.d.ts +4 -1
- package/dist/_dts/blocks/src/customBlockRegistry.d.ts +20 -1
- package/dist/_dts/blocks/src/index.d.ts +3 -2
- package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +2 -2
- package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
- package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
- package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +21 -21
- package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +2 -2
- package/dist/_dts/blocks/src/system/data/index.d.ts +5 -3
- package/dist/_dts/blocks/src/system/data/previewResolvedDataState.d.ts +45 -0
- package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
- package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +5 -0
- package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +5 -0
- package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -29
- package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +10 -0
- package/dist/_dts/blocks/src/system/node/fragments/index.d.ts +1 -0
- package/dist/_dts/blocks/src/system/node/fragments/styledSection.d.ts +9 -0
- package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +3 -2
- package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +8 -0
- package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
- package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +43 -8
- package/dist/_dts/blocks/src/system/runtime/components/multi-step/runtimeFormValidation.d.ts +28 -0
- package/dist/_dts/blocks/src/system/runtime/header/shared.d.ts +8 -7
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCompactRow.d.ts +1 -4
- package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -8
- package/dist/_dts/blocks/src/system/runtime/nodes/header-section.server.d.ts +2 -9
- package/dist/_dts/blocks/src/system/runtime/nodes/shop-cart-discount-ui.d.ts +5 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +76 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout.state.d.ts +1 -4
- package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce-store.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/shop-commerce.shared.d.ts +1 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/shop-discount-apply.state.d.ts +52 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/shop.state.d.ts +2 -4
- package/dist/_dts/blocks/src/system/runtime/nodes/useDiscountApply.d.ts +21 -0
- package/dist/_dts/blocks/src/system/runtime/shared/components/DiscountCodeDisclosure.d.ts +54 -0
- package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
- package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
- package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +4 -4
- package/dist/_dts/blocks/src/system/transforms/registry/ui.d.ts +1 -1
- package/dist/_dts/blocks/src/system/transforms/typed.d.ts +1 -1
- package/dist/_dts/content-editor/src/contentTypeEditorContentState.d.ts +26 -0
- package/dist/_dts/content-editor/src/definitions/factory.d.ts +75 -0
- package/dist/_dts/content-editor/src/entryWorkflows.d.ts +2 -0
- package/dist/_dts/content-editor/src/footerBlocksEditorState.d.ts +76 -0
- package/dist/_dts/content-editor/src/index.d.ts +5 -0
- package/dist/_dts/content-editor/src/pageWorkflowContent.d.ts +29 -0
- package/dist/_dts/content-model/src/content-types/schema.d.ts +3 -3
- package/dist/_dts/content-model/src/index.d.ts +1 -0
- package/dist/_dts/content-model/src/routeTemplate.d.ts +4 -0
- package/dist/_dts/content-model/src/templates/editorState.d.ts +25 -0
- package/dist/_dts/core/src/csv-cells.d.ts +10 -0
- package/dist/_dts/core/src/csv-date-filter.d.ts +27 -0
- package/dist/_dts/core/src/csv-escape.d.ts +1 -0
- package/dist/_dts/core/src/csv-filename.d.ts +18 -0
- package/dist/_dts/core/src/csv-render.d.ts +4 -0
- package/dist/_dts/core/src/csv-types.d.ts +116 -0
- package/dist/_dts/core/src/currency-format.d.ts +4 -0
- package/dist/_dts/core/src/demo-capability-policy.d.ts +29 -0
- package/dist/_dts/core/src/demo-claim-access.d.ts +14 -0
- package/dist/_dts/core/src/demo-lifecycle-status.d.ts +11 -0
- package/dist/_dts/core/src/demo-runtime.d.ts +47 -0
- package/dist/_dts/core/src/duration.d.ts +14 -0
- package/dist/_dts/core/src/email-format.d.ts +10 -0
- package/dist/_dts/core/src/field-errors.d.ts +1 -0
- package/dist/_dts/core/src/form-submission-preview.d.ts +24 -0
- package/dist/_dts/core/src/index.d.ts +20 -0
- package/dist/_dts/core/src/number-input.d.ts +22 -0
- package/dist/_dts/core/src/public-url-validation.d.ts +12 -0
- package/dist/_dts/core/src/slug.d.ts +39 -0
- package/dist/_dts/core/src/string.d.ts +19 -0
- package/dist/_dts/core/src/uuid.d.ts +6 -0
- package/dist/_dts/db/src/schemas/forms.d.ts +50 -50
- package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +34 -0
- package/dist/_dts/media-core/src/bulkDeletePlanning.d.ts +24 -0
- package/dist/_dts/media-core/src/canonicalCropReview.d.ts +66 -0
- package/dist/_dts/media-core/src/classifyAllPlanning.d.ts +48 -0
- package/dist/_dts/media-core/src/filename.d.ts +1 -0
- package/dist/_dts/media-core/src/index.d.ts +10 -0
- package/dist/_dts/media-core/src/mediaAssetUsageStatus.d.ts +47 -0
- package/dist/_dts/media-core/src/mediaSettingsState.d.ts +3 -0
- package/dist/_dts/media-core/src/portableMediaReferences.d.ts +38 -0
- package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +28 -0
- package/dist/_dts/media-core/src/videoAssetRepair.d.ts +38 -0
- package/dist/_dts/media-editor/src/mediaEditorDebug.d.ts +1 -0
- package/dist/_dts/path-utils/src/index.d.ts +8 -0
- package/dist/_dts/path-utils/src/redirectPaths.d.ts +26 -0
- package/dist/_dts/path-utils/src/safeAppPath.d.ts +26 -0
- package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +2 -1
- package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -0
- package/dist/_dts/preview-next/src/client/preview/previewDocumentFrame.d.ts +31 -0
- package/dist/_dts/sdk/src/client/error.d.ts +3 -0
- package/dist/_dts/sdk/src/client/index.d.ts +2 -2
- package/dist/_dts/sdk/src/client/types.d.ts +37 -19
- package/dist/_dts/sdk/src/contracts/theme.d.ts +1 -1
- package/dist/_dts/sdk/src/index.d.ts +2 -2
- package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +16 -16
- package/dist/_dts/sdk/src/next/content-load-failure.d.ts +51 -0
- package/dist/_dts/sdk/src/next/index.d.ts +2 -1
- package/dist/_dts/sdk/src/next/types.d.ts +19 -0
- package/dist/_dts/sdk/src/portal/redirects.d.ts +1 -1
- package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -2
- package/dist/_dts/sdk/src/routing/index.d.ts +3 -2
- package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +71 -6
- package/dist/_dts/sdk/src/version.d.ts +1 -1
- package/dist/_dts/site-commands/src/commands.d.ts +12 -12
- package/dist/_dts/site-commands/src/index.d.ts +1 -0
- package/dist/_dts/site-commands/src/pagePaths.d.ts +6 -0
- package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +26 -0
- package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -0
- package/dist/_dts/theme-core/src/blocks/vars/index.d.ts +1 -0
- package/dist/_dts/theme-core/src/fonts/index.d.ts +1 -0
- package/dist/_dts/theme-core/src/fonts/uploadFormat.d.ts +44 -0
- package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
- package/dist/_dts/theme-core/src/index.d.ts +3 -1
- package/dist/_dts/theme-core/src/mock-themes/all.d.ts +63 -51
- package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +6 -1
- package/dist/_dts/theme-core/src/navigation/types.d.ts +12 -0
- package/dist/_dts/theme-core/src/palette/variants/types.d.ts +3 -3
- package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +7 -0
- package/dist/_dts/theme-core/src/schema.d.ts +90 -48
- package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +214 -34
- package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +5 -2
- package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +214 -34
- package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -1
- package/dist/_dts/theme-core/src/site-styles/designState.d.ts +35 -7
- package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
- package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +96 -34
- package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +4 -2
- package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +9 -1
- package/dist/_dts/theme-core/src/site-styles/types.d.ts +27 -2
- package/dist/_dts/theme-core/src/siteChrome.d.ts +17 -34
- package/dist/_dts/theme-core/src/siteChromeOverlayClearance.d.ts +22 -0
- package/dist/_dts/theme-core/src/siteChromePlacement.d.ts +22 -0
- package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +32 -0
- package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -2
- package/dist/{chunk-EAWHBECW.mjs → chunk-F7RTCZYN.mjs} +229 -50
- package/dist/{chunk-GSQX43EZ.mjs → chunk-NIDXI46P.mjs} +22 -41
- package/dist/{chunk-WLQBJN2Z.mjs → chunk-OECWLDHN.mjs} +4538 -1911
- package/dist/{chunk-VX7B5VAC.mjs → chunk-SVMMM2NA.mjs} +8 -0
- package/dist/{chunk-6SMUFTXD.mjs → chunk-SXOLGNMX.mjs} +1 -1
- package/dist/{chunk-ANKDYZ2E.mjs → chunk-TXDES5P2.mjs} +2 -2
- package/dist/cli/index.mjs +2036 -594
- package/dist/client/{accordion-RZMQSYLR.mjs → accordion-EVDEOUPR.mjs} +2 -2
- package/dist/client/{bookingForm-NF4ASVNV.mjs → bookingForm-DIHBLC64.mjs} +27 -30
- package/dist/client/bookings.mjs +3707 -259
- package/dist/client/{carousel-LDX47ZIK.mjs → carousel-FEBQHIWI.mjs} +3 -4
- package/dist/client/{cart-RGXDS5F4.mjs → cart-7CKSXAE4.mjs} +8 -8
- package/dist/client/{checkout-P7WWSNNY.mjs → checkout-WKYCANLV.mjs} +8 -8
- package/dist/client/{chunk-JNC7CGHX.mjs → chunk-2SAVKN2M.mjs} +2 -2
- package/dist/client/{chunk-TQ5MSPDX.mjs → chunk-36WJCERQ.mjs} +1 -1
- package/dist/client/{chunk-R56FQ3RR.mjs → chunk-65F47D7Y.mjs} +280 -71
- package/dist/client/{chunk-L3DNHIJX.mjs → chunk-GUK2FPXQ.mjs} +23 -45
- package/dist/client/{chunk-PMAIXMAB.mjs → chunk-IVNCUVAV.mjs} +26 -21
- package/dist/client/{chunk-II7O4XN3.mjs → chunk-OFMSCGNY.mjs} +2 -2
- package/dist/client/chunk-PD6NBCEY.mjs +66 -0
- package/dist/client/{chunk-GMVTOKYG.mjs → chunk-RV6FX7UH.mjs} +510 -64
- package/dist/client/{chunk-E2TDNXCL.mjs → chunk-RZDWX7QW.mjs} +2 -1
- package/dist/client/{chunk-M3L3KYYR.mjs → chunk-UDNSI5PY.mjs} +12 -0
- package/dist/client/{chunk-JEZECJ3W.mjs → chunk-VPPMNXCF.mjs} +129 -3
- package/dist/client/{chunk-UFSWADAO.mjs → chunk-YDSEG6GZ.mjs} +5 -66
- package/dist/client/client.mjs +8983 -6152
- package/dist/client/{courseRegistration-7F65K5ZR.mjs → courseRegistration-5QF2PHKM.mjs} +14 -11
- package/dist/client/{eventCalendar-GLSC5KTL.mjs → eventCalendar-4ZOSETDU.mjs} +9 -9
- package/dist/client/{eventCombined-ZHK4WKUR.mjs → eventCombined-WQGU7JUX.mjs} +9 -9
- package/dist/client/{eventDetails-E3PJYBIN.mjs → eventDetails-AYWVUJ5Y.mjs} +9 -9
- package/dist/client/{eventListing-EMS3WC3E.mjs → eventListing-NT7C6UT5.mjs} +9 -9
- package/dist/client/{eventRegistration-NZOTVNPI.mjs → eventRegistration-OH24F4ZJ.mjs} +9 -9
- package/dist/client/{form-ETFZFATW.mjs → form-7L42SRBB.mjs} +6 -6
- package/dist/client/{headerSection-4LBP7ULT.mjs → headerSection-OZRZNZ52.mjs} +3 -3
- package/dist/client/hooks.mjs +1388 -427
- package/dist/client/{locationMap-5M655YSJ.mjs → locationMap-ZBXRPQ7C.mjs} +2 -2
- package/dist/client/{newsletterForm-QOUYW44O.mjs → newsletterForm-SNAGFF2I.mjs} +3 -3
- package/dist/client/{productDetail-O4DOCWQG.mjs → productDetail-I46BOFGV.mjs} +8 -8
- package/dist/client/{productList-A5RO5WIS.mjs → productList-BOYHTYI6.mjs} +8 -8
- package/dist/client/rendering/client.mjs +7090 -2645
- package/dist/client/rendering/islands.mjs +19 -19
- package/dist/client/rendering.mjs +7395 -4767
- package/dist/client/{shop-L4MZH4I2.mjs → shop-XTXPZTKR.mjs} +8 -8
- package/dist/preview-next/before-render.mjs +8 -0
- package/dist/preview-next/client/runtime.mjs +5 -5
- package/dist/preview-next/editor-chrome.css +10 -0
- package/dist/preview-next/middleware.mjs +8 -0
- package/dist/{sdk-runtime-Q6MTR4KL.mjs → sdk-runtime-ZJLKC6DR.mjs} +6 -6
- package/dist/server/components.mjs +4175 -2480
- package/dist/server/config-validation.mjs +1619 -658
- package/dist/server/config.mjs +1619 -658
- package/dist/server/data.mjs +1388 -427
- package/dist/server/index.mjs +488 -246
- package/dist/server/next.mjs +5607 -3354
- package/dist/server/page-converter.mjs +912 -259
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +4176 -2481
- package/dist/server/rendering.mjs +4194 -2486
- package/dist/server/routing.mjs +2078 -639
- package/dist/server/server.mjs +1886 -685
- package/dist/server/theme-bridge.mjs +4441 -1300
- package/dist/server/theme.mjs +89 -12
- package/dist/styles/index.css +1576 -1083
- package/package.json +2 -1
- package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +0 -8
- package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/DiscountCodeSection.d.ts +0 -7
- package/dist/_dts/preview-next/src/client/widgets/PreviewMediaField.d.ts +0 -4
- package/dist/client/chunk-OJPZEZU2.mjs +0 -31
- package/dist/client/chunk-RTZ3JKKX.mjs +0 -178
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TemplateBindingValue } from './types';
|
|
2
|
+
export type TemplateEditorBindingDescriptor = TemplateBindingValue | Record<string, unknown>;
|
|
3
|
+
export type TemplateEditorBindings = Record<string, TemplateEditorBindingDescriptor>;
|
|
4
|
+
export type TemplateEditorBlockBindings = Record<string, TemplateEditorBindings>;
|
|
5
|
+
export type TemplateEditorBlockBindingSource = Readonly<{
|
|
6
|
+
id: string;
|
|
7
|
+
scope: string;
|
|
8
|
+
bindings?: Record<string, unknown> | null;
|
|
9
|
+
}>;
|
|
10
|
+
export type ParsedTemplateEditorBindings = Readonly<{
|
|
11
|
+
ok: true;
|
|
12
|
+
bindings: TemplateEditorBindings;
|
|
13
|
+
}> | Readonly<{
|
|
14
|
+
ok: false;
|
|
15
|
+
message: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function normalizeTemplateEditorBindings(bindings: Record<string, unknown> | null | undefined): TemplateEditorBindings;
|
|
18
|
+
export declare function serializeTemplateEditorBindingsJson(bindings: TemplateEditorBindings): string;
|
|
19
|
+
export declare function parseTemplateEditorBindingsJson(jsonValue: string): ParsedTemplateEditorBindings;
|
|
20
|
+
export declare function mergeTemplateBindingEdits(currentBindings: TemplateEditorBindings, editedBindings: TemplateEditorBindings): TemplateEditorBindings;
|
|
21
|
+
export declare function setTemplateEditorBinding(bindings: TemplateEditorBindings, propId: string, binding: TemplateEditorBindingDescriptor): TemplateEditorBindings;
|
|
22
|
+
export declare function removeTemplateEditorBinding(bindings: TemplateEditorBindings, propId: string): TemplateEditorBindings;
|
|
23
|
+
export declare function createEntryTemplateBindingRecords(blocks: readonly TemplateEditorBlockBindingSource[]): TemplateEditorBlockBindings;
|
|
24
|
+
export declare function setTemplateBlockBinding(allBindings: TemplateEditorBlockBindings, blockId: string, propId: string, binding: TemplateEditorBindingDescriptor): TemplateEditorBlockBindings;
|
|
25
|
+
export declare function removeTemplateBlockBinding(allBindings: TemplateEditorBlockBindings, blockId: string, propId: string): TemplateEditorBlockBindings;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CsvCell } from './csv-types';
|
|
2
|
+
export declare const csvEmptyCell: () => CsvCell;
|
|
3
|
+
export declare const csvTextCell: (value: string | null | undefined) => CsvCell;
|
|
4
|
+
export declare const csvIntegerCell: (value: number | null | undefined) => CsvCell;
|
|
5
|
+
export declare const csvDecimalCell: (value: number | null | undefined, decimals: number) => CsvCell;
|
|
6
|
+
export declare const csvMoneyCentsCell: (cents: number | null | undefined, currency: string | null | undefined) => CsvCell;
|
|
7
|
+
export declare const csvIsoDateCell: (value: string | null | undefined) => CsvCell;
|
|
8
|
+
export declare const csvIsoDateTimeCell: (value: string | null | undefined) => CsvCell;
|
|
9
|
+
export declare const csvBooleanCell: (value: boolean | null | undefined) => CsvCell;
|
|
10
|
+
export declare function formatCsvCell(cell: CsvCell): string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CsvExportDatePolicy, CsvExportId, ExportDateBasis, ExportDateFilterError, ExportDateRange, ResolvedExportDateWindow } from './csv-types';
|
|
2
|
+
export type ResolveExportDateWindowInput = Readonly<{
|
|
3
|
+
exportId: CsvExportId;
|
|
4
|
+
policy: CsvExportDatePolicy;
|
|
5
|
+
range: ExportDateRange;
|
|
6
|
+
requestedBasis?: ExportDateBasis;
|
|
7
|
+
timeZone: string;
|
|
8
|
+
today?: Date;
|
|
9
|
+
}>;
|
|
10
|
+
export type ResolveExportDateWindowInputFor<Basis extends ExportDateBasis> = Readonly<{
|
|
11
|
+
exportId: CsvExportId;
|
|
12
|
+
policy: CsvExportDatePolicy<Basis>;
|
|
13
|
+
range: ExportDateRange;
|
|
14
|
+
requestedBasis?: Basis;
|
|
15
|
+
timeZone: string;
|
|
16
|
+
today?: Date;
|
|
17
|
+
}>;
|
|
18
|
+
export type ResolveExportDateWindowResult<Basis extends ExportDateBasis = ExportDateBasis> = Readonly<{
|
|
19
|
+
ok: true;
|
|
20
|
+
window: ResolvedExportDateWindow<Basis>;
|
|
21
|
+
}> | Readonly<{
|
|
22
|
+
ok: false;
|
|
23
|
+
error: ExportDateFilterError;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function resolveExportDateWindow<Basis extends ExportDateBasis>(input: ResolveExportDateWindowInputFor<Basis>): ResolveExportDateWindowResult<Basis>;
|
|
26
|
+
export declare function resolveExportDateWindow(input: ResolveExportDateWindowInput): ResolveExportDateWindowResult;
|
|
27
|
+
export declare function describeExportDateBasis(basis: ExportDateBasis): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function csvEscape(value: string): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SafeCsvFilename } from './csv-types';
|
|
2
|
+
export type SafeCsvFilenameResult = Readonly<{
|
|
3
|
+
ok: true;
|
|
4
|
+
filename: SafeCsvFilename;
|
|
5
|
+
}> | Readonly<{
|
|
6
|
+
ok: false;
|
|
7
|
+
filename: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function toSafeCsvFilename(value: string): SafeCsvFilenameResult;
|
|
10
|
+
export declare function assertSafeCsvFilename(value: string): SafeCsvFilename;
|
|
11
|
+
export declare const unsafeCsvFilename: typeof assertSafeCsvFilename;
|
|
12
|
+
export declare function csvFilenameDateRange(input: Readonly<{
|
|
13
|
+
from?: string | null;
|
|
14
|
+
to?: string | null;
|
|
15
|
+
fallback?: string | null;
|
|
16
|
+
prefix?: string | null;
|
|
17
|
+
}>): string;
|
|
18
|
+
export declare function contentDispositionForCsv(filename: SafeCsvFilename): string;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CsvColumn, CsvColumnSensitivity, CsvRenderResult, RenderCsvInput, RenderCsvError } from './csv-types';
|
|
2
|
+
export declare function renderCsvExport<Row, Options>(input: RenderCsvInput<Row, Options>): CsvRenderResult;
|
|
3
|
+
export declare function collectCsvColumnSensitivities<Row>(columns: readonly CsvColumn<Row>[]): ReadonlySet<CsvColumnSensitivity>;
|
|
4
|
+
export declare function describeRenderCsvError(error: RenderCsvError): string;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { Brand, MoneyDateString } from './branded';
|
|
2
|
+
export type CsvExportId = Brand<string, 'CsvExportId'>;
|
|
3
|
+
export type CsvColumnKey = Brand<string, 'CsvColumnKey'>;
|
|
4
|
+
export type SafeCsvFilename = Brand<string, 'SafeCsvFilename'>;
|
|
5
|
+
export type ExportRowLimit = Brand<number, 'ExportRowLimit'>;
|
|
6
|
+
export type CsvColumnSensitivity = 'standard' | 'personal' | 'financial' | 'sensitive';
|
|
7
|
+
export type CsvCell = Readonly<{
|
|
8
|
+
kind: 'empty';
|
|
9
|
+
}> | Readonly<{
|
|
10
|
+
kind: 'text';
|
|
11
|
+
value: string;
|
|
12
|
+
}> | Readonly<{
|
|
13
|
+
kind: 'integer';
|
|
14
|
+
value: number;
|
|
15
|
+
}> | Readonly<{
|
|
16
|
+
kind: 'decimal';
|
|
17
|
+
value: number;
|
|
18
|
+
decimals: number;
|
|
19
|
+
}> | Readonly<{
|
|
20
|
+
kind: 'moneyCents';
|
|
21
|
+
cents: number;
|
|
22
|
+
currency: string;
|
|
23
|
+
}> | Readonly<{
|
|
24
|
+
kind: 'isoDate';
|
|
25
|
+
value: string;
|
|
26
|
+
}> | Readonly<{
|
|
27
|
+
kind: 'isoDateTime';
|
|
28
|
+
value: string;
|
|
29
|
+
}> | Readonly<{
|
|
30
|
+
kind: 'boolean';
|
|
31
|
+
value: boolean;
|
|
32
|
+
}>;
|
|
33
|
+
export type CsvColumn<Row> = Readonly<{
|
|
34
|
+
key: CsvColumnKey;
|
|
35
|
+
header: string;
|
|
36
|
+
sensitivity: CsvColumnSensitivity;
|
|
37
|
+
cell: (row: Row) => CsvCell;
|
|
38
|
+
}>;
|
|
39
|
+
export type CsvExportDefinition<Row, Options> = Readonly<{
|
|
40
|
+
id: CsvExportId;
|
|
41
|
+
filename: (options: Options) => string;
|
|
42
|
+
columns: (options: Options) => readonly CsvColumn<Row>[];
|
|
43
|
+
maxRows: ExportRowLimit;
|
|
44
|
+
}>;
|
|
45
|
+
export type RenderCsvInput<Row, Options> = Readonly<{
|
|
46
|
+
definition: CsvExportDefinition<Row, Options>;
|
|
47
|
+
rows: readonly Row[];
|
|
48
|
+
options: Options;
|
|
49
|
+
}>;
|
|
50
|
+
export type RenderCsvError = Readonly<{
|
|
51
|
+
tag: 'too_many_rows';
|
|
52
|
+
maxRows: number;
|
|
53
|
+
actualRows: number;
|
|
54
|
+
}> | Readonly<{
|
|
55
|
+
tag: 'duplicate_column_key';
|
|
56
|
+
key: string;
|
|
57
|
+
}> | Readonly<{
|
|
58
|
+
tag: 'invalid_filename';
|
|
59
|
+
filename: string;
|
|
60
|
+
}>;
|
|
61
|
+
export type CsvRenderResult = Readonly<{
|
|
62
|
+
ok: true;
|
|
63
|
+
csv: string;
|
|
64
|
+
filename: SafeCsvFilename;
|
|
65
|
+
rowCount: number;
|
|
66
|
+
sensitivities: ReadonlySet<CsvColumnSensitivity>;
|
|
67
|
+
}> | Readonly<{
|
|
68
|
+
ok: false;
|
|
69
|
+
error: RenderCsvError;
|
|
70
|
+
}>;
|
|
71
|
+
export type ExportDateBasis = 'created_at' | 'scheduled_at' | 'cancelled_at' | 'paid_at' | 'processed_at';
|
|
72
|
+
export type ExportDatePreset = '7d' | '30d' | '90d' | '365d' | 'all';
|
|
73
|
+
export type ExportDateRange = Readonly<{
|
|
74
|
+
kind: 'preset';
|
|
75
|
+
preset: ExportDatePreset;
|
|
76
|
+
}> | Readonly<{
|
|
77
|
+
kind: 'custom';
|
|
78
|
+
from?: string;
|
|
79
|
+
to?: string;
|
|
80
|
+
}>;
|
|
81
|
+
export type ResolvedExportDateWindow<Basis extends ExportDateBasis = ExportDateBasis> = Readonly<{
|
|
82
|
+
basis: Basis;
|
|
83
|
+
from: MoneyDateString;
|
|
84
|
+
to: MoneyDateString;
|
|
85
|
+
timeZone: string;
|
|
86
|
+
}>;
|
|
87
|
+
export type CsvExportDatePolicy<Basis extends ExportDateBasis = ExportDateBasis> = Readonly<{
|
|
88
|
+
supportedDateBases: readonly Basis[];
|
|
89
|
+
defaultDateBasis: Basis;
|
|
90
|
+
}>;
|
|
91
|
+
export type ExportDateFilterError = Readonly<{
|
|
92
|
+
tag: 'unsupported_date_basis';
|
|
93
|
+
basis: ExportDateBasis;
|
|
94
|
+
exportId: CsvExportId;
|
|
95
|
+
}> | Readonly<{
|
|
96
|
+
tag: 'invalid_date';
|
|
97
|
+
field: 'from' | 'to';
|
|
98
|
+
value: string;
|
|
99
|
+
}> | Readonly<{
|
|
100
|
+
tag: 'partial_custom_range';
|
|
101
|
+
}> | Readonly<{
|
|
102
|
+
tag: 'invalid_date_range';
|
|
103
|
+
from: MoneyDateString;
|
|
104
|
+
to: MoneyDateString;
|
|
105
|
+
}>;
|
|
106
|
+
export type MoneyExportCurrencyPolicy = Readonly<{
|
|
107
|
+
kind: 'single_currency';
|
|
108
|
+
currency: string;
|
|
109
|
+
}> | Readonly<{
|
|
110
|
+
kind: 'group_by_currency';
|
|
111
|
+
}> | Readonly<{
|
|
112
|
+
kind: 'reject_mixed_currency';
|
|
113
|
+
}>;
|
|
114
|
+
export declare function asCsvExportId(value: string): CsvExportId;
|
|
115
|
+
export declare function asCsvColumnKey(value: string): CsvColumnKey;
|
|
116
|
+
export declare function asExportRowLimit(value: number): ExportRowLimit;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type DemoCapability } from './index';
|
|
2
|
+
export declare const demoSurfaceClassificationValues: readonly ["allowed", "blocked-hidden", "blocked-disabled", "internal-only", "needs-classification"];
|
|
3
|
+
export type DemoSurfaceClassification = (typeof demoSurfaceClassificationValues)[number];
|
|
4
|
+
export type DemoRestrictionReason = 'surface_not_classified' | 'dangerous_surface' | 'internal_only' | 'claim_not_active';
|
|
5
|
+
export type DemoCapabilityDecision = Readonly<{
|
|
6
|
+
allowed: true;
|
|
7
|
+
classification: Extract<DemoSurfaceClassification, 'allowed'>;
|
|
8
|
+
}> | Readonly<{
|
|
9
|
+
allowed: false;
|
|
10
|
+
classification: DemoSurfaceClassification;
|
|
11
|
+
reason: DemoRestrictionReason;
|
|
12
|
+
surface: DemoCapability;
|
|
13
|
+
}>;
|
|
14
|
+
export type DemoClaimAccessState = Readonly<{
|
|
15
|
+
kind: 'active';
|
|
16
|
+
}> | Readonly<{
|
|
17
|
+
kind: 'expired';
|
|
18
|
+
}> | Readonly<{
|
|
19
|
+
kind: 'released';
|
|
20
|
+
}> | Readonly<{
|
|
21
|
+
kind: 'missing';
|
|
22
|
+
}>;
|
|
23
|
+
export type DemoCapabilityPolicyInput = Readonly<{
|
|
24
|
+
surface: DemoCapability;
|
|
25
|
+
classification: DemoSurfaceClassification;
|
|
26
|
+
claim: DemoClaimAccessState;
|
|
27
|
+
}>;
|
|
28
|
+
/** Evaluates a classified demo mutation surface and fails closed for inactive claims or unknown surfaces. */
|
|
29
|
+
export declare function evaluateDemoCapability(input: DemoCapabilityPolicyInput): DemoCapabilityDecision;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DemoClaimAccessState } from './demo-capability-policy';
|
|
2
|
+
import type { DemoClaimStatus, DemoInstanceStatus } from './demo-lifecycle-status';
|
|
3
|
+
export type DemoClaimAccessInstance = Readonly<{
|
|
4
|
+
status: DemoInstanceStatus;
|
|
5
|
+
}>;
|
|
6
|
+
export type DemoClaimAccessClaim = Readonly<{
|
|
7
|
+
status: DemoClaimStatus;
|
|
8
|
+
expiresAt: string;
|
|
9
|
+
}> | null;
|
|
10
|
+
export declare function deriveDemoClaimAccessState(input: Readonly<{
|
|
11
|
+
instance: DemoClaimAccessInstance;
|
|
12
|
+
claim: DemoClaimAccessClaim;
|
|
13
|
+
now: Date;
|
|
14
|
+
}>): DemoClaimAccessState;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const demoBlueprintStatusValues: readonly ["draft", "published", "archived"];
|
|
2
|
+
export type DemoBlueprintStatus = (typeof demoBlueprintStatusValues)[number];
|
|
3
|
+
export declare const demoInstanceStatusValues: readonly ["warming", "available", "claimed", "expired", "recycling", "failed"];
|
|
4
|
+
export type DemoInstanceStatus = (typeof demoInstanceStatusValues)[number];
|
|
5
|
+
export declare const demoClaimStatusValues: readonly ["active", "expired", "released"];
|
|
6
|
+
export type DemoClaimStatus = (typeof demoClaimStatusValues)[number];
|
|
7
|
+
export declare const demoBlueprintArtifactKindValues: readonly ["site_backup", "manual_snapshot"];
|
|
8
|
+
export type DemoBlueprintArtifactKind = (typeof demoBlueprintArtifactKindValues)[number];
|
|
9
|
+
export declare function narrowDemoInstanceStatus(value: string): DemoInstanceStatus;
|
|
10
|
+
export declare function narrowDemoClaimStatus(value: string): DemoClaimStatus;
|
|
11
|
+
export declare function narrowDemoBlueprintArtifactKind(value: string): DemoBlueprintArtifactKind;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const RIVERBANK_RUNTIME_ENV_VAR = "RIVERBANK_RUNTIME_ENV";
|
|
2
|
+
export declare const riverbankRuntimeEnvValues: readonly ["production", "staging", "demo"];
|
|
3
|
+
export type RiverbankRuntimeEnv = (typeof riverbankRuntimeEnvValues)[number];
|
|
4
|
+
export type RiverbankRuntime = Readonly<{
|
|
5
|
+
kind: 'production';
|
|
6
|
+
demoAllowed: false;
|
|
7
|
+
}> | Readonly<{
|
|
8
|
+
kind: 'staging';
|
|
9
|
+
demoAllowed: false;
|
|
10
|
+
}> | Readonly<{
|
|
11
|
+
kind: 'demo';
|
|
12
|
+
demoAllowed: true;
|
|
13
|
+
}>;
|
|
14
|
+
export type RiverbankRuntimeResolution = Readonly<{
|
|
15
|
+
kind: 'resolved';
|
|
16
|
+
runtime: RiverbankRuntime;
|
|
17
|
+
}> | Readonly<{
|
|
18
|
+
kind: 'invalid';
|
|
19
|
+
error: RiverbankRuntimeResolutionError;
|
|
20
|
+
}>;
|
|
21
|
+
export type RiverbankRuntimeResolutionError = Readonly<{
|
|
22
|
+
kind: 'missing_runtime_env';
|
|
23
|
+
envVar: typeof RIVERBANK_RUNTIME_ENV_VAR;
|
|
24
|
+
}> | Readonly<{
|
|
25
|
+
kind: 'unsupported_runtime_env';
|
|
26
|
+
envVar: typeof RIVERBANK_RUNTIME_ENV_VAR;
|
|
27
|
+
rawValue: string;
|
|
28
|
+
normalizedValue: string;
|
|
29
|
+
supportedValues: readonly RiverbankRuntimeEnv[];
|
|
30
|
+
}>;
|
|
31
|
+
export type DemoRuntimeRequirement = Readonly<{
|
|
32
|
+
allowed: true;
|
|
33
|
+
runtime: Extract<RiverbankRuntime, {
|
|
34
|
+
kind: 'demo';
|
|
35
|
+
}>;
|
|
36
|
+
}> | Readonly<{
|
|
37
|
+
allowed: false;
|
|
38
|
+
reason: DemoRuntimeRequirementDenialReason;
|
|
39
|
+
runtime?: Exclude<RiverbankRuntime, {
|
|
40
|
+
kind: 'demo';
|
|
41
|
+
}>;
|
|
42
|
+
error?: RiverbankRuntimeResolutionError;
|
|
43
|
+
}>;
|
|
44
|
+
export type DemoRuntimeRequirementDenialReason = 'missing_runtime_env' | 'unsupported_runtime_env' | 'not_demo_runtime';
|
|
45
|
+
export declare function parseRiverbankRuntimeEnv(rawValue: string | null | undefined): RiverbankRuntimeResolution;
|
|
46
|
+
export declare function resolveRiverbankRuntimeEnv(env: Readonly<Record<string, string | undefined>>): RiverbankRuntimeResolution;
|
|
47
|
+
export declare function requireDemoRuntime(resolution: RiverbankRuntimeResolution): DemoRuntimeRequirement;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type DurationUnit = 'minutes' | 'hours' | 'days' | 'weeks';
|
|
2
|
+
export declare const DURATION_UNIT_MINUTES: Record<DurationUnit, number>;
|
|
3
|
+
export declare function formatDurationUnitLabel(unit: DurationUnit, count: number): string;
|
|
4
|
+
/**
|
|
5
|
+
* Picks the coarsest allowed unit that cleanly divides `minutes`. Falls back
|
|
6
|
+
* to the smallest allowed unit when no clean divisor exists.
|
|
7
|
+
*/
|
|
8
|
+
export declare function pickDurationDisplayUnit(minutes: number, allowed: readonly DurationUnit[]): DurationUnit;
|
|
9
|
+
/**
|
|
10
|
+
* Guarantees the widget invariant `displayValue x unit === storedMinutes` is
|
|
11
|
+
* representable by prepending minutes when no caller-provided unit divides.
|
|
12
|
+
*/
|
|
13
|
+
export declare function expandAllowedDurationUnits(value: number, base: readonly DurationUnit[]): readonly DurationUnit[];
|
|
14
|
+
export declare function clampDurationMinutes(value: number, min: number | undefined, max: number | undefined): number;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mask an email address for display purposes.
|
|
3
|
+
* Shows first and last characters of the local part with asterisks in between.
|
|
4
|
+
* Example: "john.doe@example.com" -> "j******e@example.com"
|
|
5
|
+
* For 1-2 character local parts, preserve only the first character and append "***"
|
|
6
|
+
* so very short addresses do not leak disproportionate detail.
|
|
7
|
+
*/
|
|
8
|
+
export declare function maskEmail(email: string): string;
|
|
9
|
+
export declare function maskEmail(email: null): null;
|
|
10
|
+
export declare function maskEmail(email: string | null): string | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function clearFieldError<TField extends string, TErrors extends Partial<Record<TField, string>>>(errors: TErrors, field: TField): TErrors;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type SchemaField = {
|
|
2
|
+
id: string;
|
|
3
|
+
label?: string | null;
|
|
4
|
+
type?: string | null;
|
|
5
|
+
required?: boolean | null;
|
|
6
|
+
};
|
|
7
|
+
type SubmissionRow = {
|
|
8
|
+
dataJson: Record<string, unknown> | null;
|
|
9
|
+
};
|
|
10
|
+
export type SubmissionPreviewField = {
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
type: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const FORM_SUBMISSION_PSEUDO_FIELD_ID = "submission";
|
|
16
|
+
export declare const HIDDEN_FIELD_IDS: Set<string>;
|
|
17
|
+
export declare function selectSubmissionPreviewFields(schemaFields: unknown, submissions: SubmissionRow[]): SubmissionPreviewField[];
|
|
18
|
+
export declare function humanizeSubmissionFieldKey(input: string): string;
|
|
19
|
+
export declare function orderSubmissionFields(schemaFields: SchemaField[] | undefined, data: Record<string, unknown> | null): {
|
|
20
|
+
id: string;
|
|
21
|
+
label: string;
|
|
22
|
+
value: unknown;
|
|
23
|
+
}[];
|
|
24
|
+
export {};
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export * from "./branded";
|
|
2
2
|
export * from "./date-math";
|
|
3
|
+
export * from "./duration";
|
|
4
|
+
export * from "./demo-capability-policy";
|
|
5
|
+
export * from "./demo-claim-access";
|
|
6
|
+
export * from "./demo-lifecycle-status";
|
|
7
|
+
export * from "./demo-runtime";
|
|
3
8
|
export * from "./collections";
|
|
4
9
|
export * from "./event-pricing";
|
|
5
10
|
export * from "./money-input";
|
|
@@ -21,5 +26,20 @@ export * from "./sensitive-collection";
|
|
|
21
26
|
export * from "./assertNever";
|
|
22
27
|
export * from "./participants";
|
|
23
28
|
export * from "./participant-identity";
|
|
29
|
+
export * from "./public-url-validation";
|
|
30
|
+
export * from "./number-input";
|
|
31
|
+
export * from "./field-errors";
|
|
32
|
+
export * from "./form-submission-preview";
|
|
33
|
+
export * from "./csv-cells";
|
|
34
|
+
export * from "./csv-date-filter";
|
|
35
|
+
export * from "./csv-escape";
|
|
36
|
+
export * from "./csv-filename";
|
|
37
|
+
export * from "./csv-render";
|
|
38
|
+
export * from "./csv-types";
|
|
39
|
+
export * from "./currency-format";
|
|
40
|
+
export * from "./email-format";
|
|
41
|
+
export * from "./slug";
|
|
42
|
+
export * from "./string";
|
|
43
|
+
export * from "./uuid";
|
|
24
44
|
export { disabledSelection, enabledSelection, plannerNoChange, plannerPatch, plannerUpdate, resolvePlanningDateInput, resolvePlanningNow, resolvePlanningNowDate, systemPlanningClock, } from "./planner";
|
|
25
45
|
export type { DisabledSelection, EnabledSelection, OptionalSelection, PlannerNoChange, PlannerPatch, PlannerUpdate, PlanningClock, PlanningDateInput, PlanningTimeOptions, } from "./planner";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Numeric form-input parsing helpers with preserve-prev semantics on
|
|
3
|
+
* NaN/empty/negative. Use these in `NumberInput.onChange` so empty input
|
|
4
|
+
* doesn't silently rewrite the user's value to 0.
|
|
5
|
+
*
|
|
6
|
+
* The caller skips the dispatch when `null` is returned; the input box
|
|
7
|
+
* keeps showing whatever the user typed (it's an uncontrolled native
|
|
8
|
+
* input from React's perspective until the next state change), and the
|
|
9
|
+
* dirty/saved state stays consistent.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Parse a `valueAsNumber` (from `<input type="number">`) into a finite
|
|
13
|
+
* non-negative integer, or `null` if the value is empty / NaN / negative.
|
|
14
|
+
* Fractional input is `Math.trunc`'d to an integer.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseFiniteNonNegativeInt(value: number): number | null;
|
|
17
|
+
/**
|
|
18
|
+
* Parse a `valueAsNumber` into an integer bounded inclusive by `[min, max]`.
|
|
19
|
+
* Returns `null` for out-of-range or non-finite input — same preserve-prev
|
|
20
|
+
* pattern as `parseFiniteNonNegativeInt`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseBoundedInt(value: number, min: number, max: number): number | null;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type PublicUrlProtocol = 'http:' | 'https:';
|
|
2
|
+
export type PublicUrlPortPolicy = 'standard-only' | 'any-valid';
|
|
3
|
+
export type PublicUrlValidationOptions = Readonly<{
|
|
4
|
+
allowedProtocols: readonly PublicUrlProtocol[];
|
|
5
|
+
portPolicy: PublicUrlPortPolicy;
|
|
6
|
+
errorFactory?: (message: string) => Error;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function buildPublicUrlValidationError(message: string, errorFactory?: (message: string) => Error): Error;
|
|
9
|
+
export declare function isIpAddress(value: string): boolean;
|
|
10
|
+
export declare function isPrivateIp(ip: string): boolean;
|
|
11
|
+
export declare function assertAllowedPublicHostname(hostname: string, errorFactory?: (message: string) => Error): void;
|
|
12
|
+
export declare function assertAllowedPublicUrl(raw: string, options: PublicUrlValidationOptions): URL;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a string to a URL-safe slug
|
|
3
|
+
*
|
|
4
|
+
* @param text - The text to slugify
|
|
5
|
+
* @returns URL-safe slug (lowercase, alphanumeric + hyphens)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* slugify("Initial Consultation") // "initial-consultation"
|
|
9
|
+
* slugify("90-Minute Deep Tissue") // "90-minute-deep-tissue"
|
|
10
|
+
* slugify("Reiki & Energy Healing") // "reiki-energy-healing"
|
|
11
|
+
*/
|
|
12
|
+
export declare function slugify(text: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Generate a unique slug by appending a number if needed
|
|
15
|
+
*
|
|
16
|
+
* @param baseSlug - The base slug to make unique
|
|
17
|
+
* @param existingSlugs - Array of slugs already in use
|
|
18
|
+
* @returns Unique slug (adds -2, -3, etc. if needed)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* makeUniqueSlug("consultation", ["consultation"])
|
|
22
|
+
* // Returns: "consultation-2"
|
|
23
|
+
*
|
|
24
|
+
* makeUniqueSlug("consultation", ["consultation", "consultation-2"])
|
|
25
|
+
* // Returns: "consultation-3"
|
|
26
|
+
*/
|
|
27
|
+
export declare function makeUniqueSlug(baseSlug: string, existingSlugs: string[]): string;
|
|
28
|
+
/**
|
|
29
|
+
* Generate a slug from text and ensure it's unique
|
|
30
|
+
*
|
|
31
|
+
* @param text - The text to slugify
|
|
32
|
+
* @param existingSlugs - Array of slugs already in use
|
|
33
|
+
* @returns Unique URL-safe slug
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* generateUniqueSlug("Initial Consultation", ["initial-consultation"])
|
|
37
|
+
* // Returns: "initial-consultation-2"
|
|
38
|
+
*/
|
|
39
|
+
export declare function generateUniqueSlug(text: string, existingSlugs: string[]): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Return the string value when the input is already a string, otherwise null.
|
|
6
|
+
*/
|
|
7
|
+
export declare function asNullableString(value: unknown): string | null;
|
|
8
|
+
/**
|
|
9
|
+
* Return a non-empty string value, otherwise null.
|
|
10
|
+
*/
|
|
11
|
+
export declare function asNonEmptyStringOrNull(value: unknown): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* Trim a user-entered string and collapse blank values to null.
|
|
14
|
+
*/
|
|
15
|
+
export declare function trimmedStringOrNull(value: string | null | undefined): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Capitalize the first character of a string
|
|
18
|
+
*/
|
|
19
|
+
export declare function capitalize(str: string): string;
|