@businessdash/sdk 0.9.60
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 -0
- package/README.md +899 -0
- package/dist/adapters-revalidate.d.ts +44 -0
- package/dist/adapters-revalidate.d.ts.map +1 -0
- package/dist/adapters-revalidate.js +68 -0
- package/dist/adapters-revalidate.js.map +1 -0
- package/dist/alpha.d.ts +21 -0
- package/dist/alpha.d.ts.map +1 -0
- package/dist/alpha.js +21 -0
- package/dist/alpha.js.map +1 -0
- package/dist/analytics-core.d.ts +34 -0
- package/dist/analytics-core.d.ts.map +1 -0
- package/dist/analytics-core.js +138 -0
- package/dist/analytics-core.js.map +1 -0
- package/dist/analytics-server.d.ts +54 -0
- package/dist/analytics-server.d.ts.map +1 -0
- package/dist/analytics-server.js +78 -0
- package/dist/analytics-server.js.map +1 -0
- package/dist/attribution-logo.d.ts +2 -0
- package/dist/attribution-logo.d.ts.map +1 -0
- package/dist/attribution-logo.js +5 -0
- package/dist/attribution-logo.js.map +1 -0
- package/dist/auth-handler.d.ts +92 -0
- package/dist/auth-handler.d.ts.map +1 -0
- package/dist/auth-handler.js +277 -0
- package/dist/auth-handler.js.map +1 -0
- package/dist/biab-forms.css +484 -0
- package/dist/cli.d.ts +46 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1824 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +1681 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2845 -0
- package/dist/client.js.map +1 -0
- package/dist/collections.d.ts +13 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +13 -0
- package/dist/collections.js.map +1 -0
- package/dist/contracts.d.ts +14609 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +2428 -0
- package/dist/contracts.js.map +1 -0
- package/dist/data-model-schema.d.ts +962 -0
- package/dist/data-model-schema.d.ts.map +1 -0
- package/dist/data-model-schema.js +2295 -0
- package/dist/data-model-schema.js.map +1 -0
- package/dist/distribution.d.ts +38 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +61 -0
- package/dist/distribution.js.map +1 -0
- package/dist/element.d.ts +121 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +276 -0
- package/dist/element.js.map +1 -0
- package/dist/enums.d.ts +25 -0
- package/dist/enums.d.ts.map +1 -0
- package/dist/enums.js +38 -0
- package/dist/enums.js.map +1 -0
- package/dist/errors.d.ts +195 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +188 -0
- package/dist/errors.js.map +1 -0
- package/dist/forms-core/autocomplete.d.ts +37 -0
- package/dist/forms-core/autocomplete.d.ts.map +1 -0
- package/dist/forms-core/autocomplete.js +82 -0
- package/dist/forms-core/autocomplete.js.map +1 -0
- package/dist/forms-core/business-function.d.ts +61 -0
- package/dist/forms-core/business-function.d.ts.map +1 -0
- package/dist/forms-core/business-function.js +149 -0
- package/dist/forms-core/business-function.js.map +1 -0
- package/dist/forms-core/calculation.d.ts +72 -0
- package/dist/forms-core/calculation.d.ts.map +1 -0
- package/dist/forms-core/calculation.js +103 -0
- package/dist/forms-core/calculation.js.map +1 -0
- package/dist/forms-core/controller.d.ts +249 -0
- package/dist/forms-core/controller.d.ts.map +1 -0
- package/dist/forms-core/controller.js +590 -0
- package/dist/forms-core/controller.js.map +1 -0
- package/dist/forms-core/elements.d.ts +44 -0
- package/dist/forms-core/elements.d.ts.map +1 -0
- package/dist/forms-core/elements.js +68 -0
- package/dist/forms-core/elements.js.map +1 -0
- package/dist/forms-core/email-domains.d.ts +10 -0
- package/dist/forms-core/email-domains.d.ts.map +1 -0
- package/dist/forms-core/email-domains.js +69 -0
- package/dist/forms-core/email-domains.js.map +1 -0
- package/dist/forms-core/file-rules.d.ts +51 -0
- package/dist/forms-core/file-rules.d.ts.map +1 -0
- package/dist/forms-core/file-rules.js +105 -0
- package/dist/forms-core/file-rules.js.map +1 -0
- package/dist/forms-core/formula.d.ts +114 -0
- package/dist/forms-core/formula.d.ts.map +1 -0
- package/dist/forms-core/formula.js +1170 -0
- package/dist/forms-core/formula.js.map +1 -0
- package/dist/forms-core/index.d.ts +24 -0
- package/dist/forms-core/index.d.ts.map +1 -0
- package/dist/forms-core/index.js +28 -0
- package/dist/forms-core/index.js.map +1 -0
- package/dist/forms-core/units.d.ts +49 -0
- package/dist/forms-core/units.d.ts.map +1 -0
- package/dist/forms-core/units.js +255 -0
- package/dist/forms-core/units.js.map +1 -0
- package/dist/forms-core/us-states.d.ts +14 -0
- package/dist/forms-core/us-states.d.ts.map +1 -0
- package/dist/forms-core/us-states.js +66 -0
- package/dist/forms-core/us-states.js.map +1 -0
- package/dist/forms-core/validation.d.ts +266 -0
- package/dist/forms-core/validation.d.ts.map +1 -0
- package/dist/forms-core/validation.js +850 -0
- package/dist/forms-core/validation.js.map +1 -0
- package/dist/forms.d.ts +19 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +29 -0
- package/dist/forms.js.map +1 -0
- package/dist/gallery-types.d.ts +32 -0
- package/dist/gallery-types.d.ts.map +1 -0
- package/dist/gallery-types.js +2 -0
- package/dist/gallery-types.js.map +1 -0
- package/dist/graphql.d.ts +97 -0
- package/dist/graphql.d.ts.map +1 -0
- package/dist/graphql.js +212 -0
- package/dist/graphql.js.map +1 -0
- package/dist/index.cjs +19448 -0
- package/dist/index.d.cts +19 -0
- package/dist/index.d.mts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/marketing-schema.d.ts +216 -0
- package/dist/marketing-schema.d.ts.map +1 -0
- package/dist/marketing-schema.js +200 -0
- package/dist/marketing-schema.js.map +1 -0
- package/dist/mcp.d.ts +42 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +87 -0
- package/dist/mcp.js.map +1 -0
- package/dist/native.d.ts +45 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +43 -0
- package/dist/native.js.map +1 -0
- package/dist/next-revalidate.d.ts +43 -0
- package/dist/next-revalidate.d.ts.map +1 -0
- package/dist/next-revalidate.js +84 -0
- package/dist/next-revalidate.js.map +1 -0
- package/dist/parallel-pages.d.ts +102 -0
- package/dist/parallel-pages.d.ts.map +1 -0
- package/dist/parallel-pages.js +108 -0
- package/dist/parallel-pages.js.map +1 -0
- package/dist/payment-icons.d.ts +66 -0
- package/dist/payment-icons.d.ts.map +1 -0
- package/dist/payment-icons.js +160 -0
- package/dist/payment-icons.js.map +1 -0
- package/dist/proxy.d.ts +67 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +97 -0
- package/dist/proxy.js.map +1 -0
- package/dist/react-analytics.d.ts +39 -0
- package/dist/react-analytics.d.ts.map +1 -0
- package/dist/react-analytics.js +59 -0
- package/dist/react-analytics.js.map +1 -0
- package/dist/react-attribution.d.ts +99 -0
- package/dist/react-attribution.d.ts.map +1 -0
- package/dist/react-attribution.js +52 -0
- package/dist/react-attribution.js.map +1 -0
- package/dist/react-marketing.d.ts +181 -0
- package/dist/react-marketing.d.ts.map +1 -0
- package/dist/react-marketing.js +215 -0
- package/dist/react-marketing.js.map +1 -0
- package/dist/react.d.ts +727 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +2418 -0
- package/dist/react.js.map +1 -0
- package/dist/reserved-paths.d.ts +24 -0
- package/dist/reserved-paths.d.ts.map +1 -0
- package/dist/reserved-paths.js +60 -0
- package/dist/reserved-paths.js.map +1 -0
- package/dist/revalidate-verify.d.ts +30 -0
- package/dist/revalidate-verify.d.ts.map +1 -0
- package/dist/revalidate-verify.js +74 -0
- package/dist/revalidate-verify.js.map +1 -0
- package/dist/sdk.d.ts +678 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +801 -0
- package/dist/sdk.js.map +1 -0
- package/dist/seo.d.ts +218 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +309 -0
- package/dist/seo.js.map +1 -0
- package/dist/socials.d.ts +47 -0
- package/dist/socials.d.ts.map +1 -0
- package/dist/socials.js +172 -0
- package/dist/socials.js.map +1 -0
- package/dist/static.d.ts +14 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +14 -0
- package/dist/static.js.map +1 -0
- package/dist/url-pattern.d.ts +47 -0
- package/dist/url-pattern.d.ts.map +1 -0
- package/dist/url-pattern.js +124 -0
- package/dist/url-pattern.js.map +1 -0
- package/dist/vanilla.d.ts +77 -0
- package/dist/vanilla.d.ts.map +1 -0
- package/dist/vanilla.js +903 -0
- package/dist/vanilla.js.map +1 -0
- package/openapi.json +13779 -0
- package/package.json +204 -0
- package/src/adapters-revalidate.ts +88 -0
- package/src/alpha.ts +89 -0
- package/src/analytics-core.ts +175 -0
- package/src/analytics-server.ts +99 -0
- package/src/angular/biab-form.component.ts +1443 -0
- package/src/angular/index.ts +26 -0
- package/src/attribution-logo.ts +5 -0
- package/src/auth-handler.ts +352 -0
- package/src/cli.ts +2517 -0
- package/src/client.ts +3578 -0
- package/src/collections.ts +101 -0
- package/src/contracts.ts +3390 -0
- package/src/data-model-schema.ts +4042 -0
- package/src/distribution.ts +73 -0
- package/src/element.ts +321 -0
- package/src/enums.ts +65 -0
- package/src/errors.ts +338 -0
- package/src/forms-core/autocomplete.ts +97 -0
- package/src/forms-core/business-function.ts +209 -0
- package/src/forms-core/calculation.ts +167 -0
- package/src/forms-core/controller.ts +922 -0
- package/src/forms-core/elements.ts +86 -0
- package/src/forms-core/email-domains.ts +68 -0
- package/src/forms-core/file-rules.ts +123 -0
- package/src/forms-core/formula.ts +1339 -0
- package/src/forms-core/index.ts +122 -0
- package/src/forms-core/units.ts +308 -0
- package/src/forms-core/us-states.ts +68 -0
- package/src/forms-core/validation.ts +1037 -0
- package/src/forms.ts +63 -0
- package/src/gallery-types.ts +31 -0
- package/src/graphql.ts +295 -0
- package/src/index.ts +505 -0
- package/src/marketing-schema.ts +395 -0
- package/src/mcp.ts +108 -0
- package/src/native.ts +73 -0
- package/src/next-revalidate.ts +124 -0
- package/src/parallel-pages.ts +192 -0
- package/src/payment-icons.ts +205 -0
- package/src/proxy.ts +173 -0
- package/src/qwik.tsx +1234 -0
- package/src/react-analytics.tsx +76 -0
- package/src/react-attribution.tsx +192 -0
- package/src/react-marketing.tsx +338 -0
- package/src/react.tsx +5495 -0
- package/src/reserved-paths.ts +65 -0
- package/src/revalidate-verify.ts +98 -0
- package/src/sdk.ts +1671 -0
- package/src/seo.ts +488 -0
- package/src/socials.ts +230 -0
- package/src/solid.tsx +1466 -0
- package/src/static.ts +21 -0
- package/src/styles/biab-forms.css +484 -0
- package/src/svelte/BiabForm.svelte +1069 -0
- package/src/svelte/context.ts +57 -0
- package/src/svelte/index.ts +79 -0
- package/src/url-pattern.ts +153 -0
- package/src/vanilla.ts +1290 -0
- package/src/vue/BiabForm.vue +1538 -0
- package/src/vue/index.ts +119 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page paths reserved by the BIAB platform. These routes are served by
|
|
3
|
+
* BIAB on every verified org hostname (`pay.acme.com/quotes/accept/<token>`,
|
|
4
|
+
* `acme.com/contracts/sign/<token>`, etc.), so a marketing page declared at
|
|
5
|
+
* one of these paths would collide and silently break customer-facing
|
|
6
|
+
* accept / sign / pay flows.
|
|
7
|
+
*
|
|
8
|
+
* Keep in sync with the server-side mirror at
|
|
9
|
+
* `src/server/sites/reserved-page-paths.ts` (same list, same semantics).
|
|
10
|
+
*/
|
|
11
|
+
export const RESERVED_PAGE_PATHS = [
|
|
12
|
+
// Quote accept (public review/accept page from emailed quotes)
|
|
13
|
+
"quotes",
|
|
14
|
+
"quotes/accept",
|
|
15
|
+
// Contract signing (public signing page from emailed contracts)
|
|
16
|
+
"contracts",
|
|
17
|
+
"contracts/sign",
|
|
18
|
+
// Invoice payment (reserved for the upcoming public pay flow)
|
|
19
|
+
"invoices",
|
|
20
|
+
"invoices/pay",
|
|
21
|
+
// Customer portal (logged-in customer-facing surface)
|
|
22
|
+
"portal",
|
|
23
|
+
] as const;
|
|
24
|
+
|
|
25
|
+
export type ReservedPagePath = (typeof RESERVED_PAGE_PATHS)[number];
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Normalize an input path/slug/pageKey to the canonical form used for
|
|
29
|
+
* reserved-path matching: lowercase, no surrounding slashes, no trailing
|
|
30
|
+
* `/index`.
|
|
31
|
+
*/
|
|
32
|
+
function normalize(input: string): string {
|
|
33
|
+
return input
|
|
34
|
+
.trim()
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.replace(/^\/+|\/+$/g, "")
|
|
37
|
+
.replace(/\/index$/, "");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* True when `input` exactly matches a reserved path *or* is a child of
|
|
42
|
+
* one (`quotes/accept/foo` is reserved because it lives under `quotes`).
|
|
43
|
+
* Accepts page slugs, page keys, and full URL paths.
|
|
44
|
+
*/
|
|
45
|
+
export function isReservedPagePath(input: string): boolean {
|
|
46
|
+
const norm = normalize(input);
|
|
47
|
+
if (!norm) return false;
|
|
48
|
+
return RESERVED_PAGE_PATHS.some(
|
|
49
|
+
(reserved) => norm === reserved || norm.startsWith(`${reserved}/`),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Human-readable error message for use in CLI output and tRPC errors.
|
|
55
|
+
* Shared so the wording stays consistent across surfaces.
|
|
56
|
+
*/
|
|
57
|
+
export function reservedPagePathErrorMessage(input: string): string {
|
|
58
|
+
return [
|
|
59
|
+
`"${input}" is reserved by the BIAB platform.`,
|
|
60
|
+
`Reserved paths: ${RESERVED_PAGE_PATHS.join(", ")}.`,
|
|
61
|
+
`These routes are served on every verified org hostname for quote / contract / invoice flows;`,
|
|
62
|
+
`shipping a marketing page at the same path would break customer-facing accept / sign / pay links.`,
|
|
63
|
+
`Rename the page (e.g. "${input}-info") and try again.`,
|
|
64
|
+
].join(" ");
|
|
65
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-agnostic HMAC verification for BIAB revalidation
|
|
3
|
+
* webhooks. Lives in its own file so adapters (Cloudflare, KV
|
|
4
|
+
* purge, static rebuild trigger, …) can pull it in without
|
|
5
|
+
* transitively bringing the Next-only `next-revalidate.ts` into
|
|
6
|
+
* the bundle graph. Some bundlers (Nitro, certain workerd
|
|
7
|
+
* targets) try to resolve every imported module name at build
|
|
8
|
+
* time, including ones reachable only through a runtime
|
|
9
|
+
* `await import(...)` — splitting `next/cache` into its own file
|
|
10
|
+
* keeps it isolated to the Next handler.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
14
|
+
|
|
15
|
+
const REPLAY_WINDOW_SECONDS = 5 * 60;
|
|
16
|
+
|
|
17
|
+
export interface BiabPublishPayload {
|
|
18
|
+
event: "content.published";
|
|
19
|
+
orgId: string;
|
|
20
|
+
tags: string[];
|
|
21
|
+
firedAt: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface VerifyOptions {
|
|
25
|
+
secret: string;
|
|
26
|
+
rawBody: string;
|
|
27
|
+
signatureHeader: string | null;
|
|
28
|
+
nowSeconds?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface VerifyResult {
|
|
32
|
+
ok: boolean;
|
|
33
|
+
payload?: BiabPublishPayload;
|
|
34
|
+
reason?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function safeEqualHex(a: string, b: string): boolean {
|
|
38
|
+
try {
|
|
39
|
+
const bufA = Buffer.from(a, "hex");
|
|
40
|
+
const bufB = Buffer.from(b, "hex");
|
|
41
|
+
if (bufA.length !== bufB.length) return false;
|
|
42
|
+
return timingSafeEqual(bufA, bufB);
|
|
43
|
+
} catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function parseSignatureHeader(
|
|
49
|
+
header: string | null,
|
|
50
|
+
): { timestamp: number; v1: string } | null {
|
|
51
|
+
if (!header) return null;
|
|
52
|
+
const parts = header.split(",").map((p) => p.trim());
|
|
53
|
+
let timestamp = NaN;
|
|
54
|
+
let v1 = "";
|
|
55
|
+
for (const part of parts) {
|
|
56
|
+
const [k, v] = part.split("=", 2);
|
|
57
|
+
if (k === "t") timestamp = Number(v);
|
|
58
|
+
else if (k === "v1") v1 = v ?? "";
|
|
59
|
+
}
|
|
60
|
+
if (!Number.isFinite(timestamp) || !v1) return null;
|
|
61
|
+
return { timestamp, v1 };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function verifyAndExtractTags(opts: VerifyOptions): VerifyResult {
|
|
65
|
+
const parsed = parseSignatureHeader(opts.signatureHeader);
|
|
66
|
+
if (!parsed) return { ok: false, reason: "missing_or_malformed_signature" };
|
|
67
|
+
|
|
68
|
+
const now =
|
|
69
|
+
typeof opts.nowSeconds === "number"
|
|
70
|
+
? opts.nowSeconds
|
|
71
|
+
: Math.floor(Date.now() / 1000);
|
|
72
|
+
if (Math.abs(now - parsed.timestamp) > REPLAY_WINDOW_SECONDS) {
|
|
73
|
+
return { ok: false, reason: "replay_window_expired" };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const signedPayload = `${parsed.timestamp}.${opts.rawBody}`;
|
|
77
|
+
const expected = createHmac("sha256", opts.secret)
|
|
78
|
+
.update(signedPayload)
|
|
79
|
+
.digest("hex");
|
|
80
|
+
if (!safeEqualHex(parsed.v1, expected)) {
|
|
81
|
+
return { ok: false, reason: "signature_mismatch" };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let payload: BiabPublishPayload;
|
|
85
|
+
try {
|
|
86
|
+
payload = JSON.parse(opts.rawBody) as BiabPublishPayload;
|
|
87
|
+
} catch {
|
|
88
|
+
return { ok: false, reason: "body_not_json" };
|
|
89
|
+
}
|
|
90
|
+
if (
|
|
91
|
+
payload?.event !== "content.published" ||
|
|
92
|
+
!Array.isArray(payload?.tags) ||
|
|
93
|
+
typeof payload?.orgId !== "string"
|
|
94
|
+
) {
|
|
95
|
+
return { ok: false, reason: "body_shape_invalid" };
|
|
96
|
+
}
|
|
97
|
+
return { ok: true, payload };
|
|
98
|
+
}
|