@brandlab-digital/site-next 0.1.0-alpha.9 → 1.0.0-rc.10

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.
Files changed (112) hide show
  1. package/dist/analytics.d.ts +71 -0
  2. package/dist/analytics.d.ts.map +1 -0
  3. package/dist/analytics.js +219 -0
  4. package/dist/analytics.js.map +1 -0
  5. package/dist/blog.d.ts +163 -0
  6. package/dist/blog.d.ts.map +1 -0
  7. package/dist/blog.js +208 -0
  8. package/dist/blog.js.map +1 -0
  9. package/dist/breadcrumbs.d.ts +58 -0
  10. package/dist/breadcrumbs.d.ts.map +1 -0
  11. package/dist/breadcrumbs.js +93 -0
  12. package/dist/breadcrumbs.js.map +1 -0
  13. package/dist/contact/attribution.d.ts +11 -0
  14. package/dist/contact/attribution.d.ts.map +1 -0
  15. package/dist/contact/attribution.js +145 -0
  16. package/dist/contact/attribution.js.map +1 -0
  17. package/dist/contact/client.d.ts +79 -0
  18. package/dist/contact/client.d.ts.map +1 -0
  19. package/dist/contact/client.js +436 -0
  20. package/dist/contact/client.js.map +1 -0
  21. package/dist/contact/context.d.ts +30 -0
  22. package/dist/contact/context.d.ts.map +1 -0
  23. package/dist/contact/context.js +315 -0
  24. package/dist/contact/context.js.map +1 -0
  25. package/dist/contact/contract.d.ts +11 -0
  26. package/dist/contact/contract.d.ts.map +1 -0
  27. package/dist/contact/contract.js +67 -0
  28. package/dist/contact/contract.js.map +1 -0
  29. package/dist/contact/durable.d.ts +31 -0
  30. package/dist/contact/durable.d.ts.map +1 -0
  31. package/dist/contact/durable.js +331 -0
  32. package/dist/contact/durable.js.map +1 -0
  33. package/dist/contact/email.d.ts +20 -0
  34. package/dist/contact/email.d.ts.map +1 -0
  35. package/dist/contact/email.js +214 -0
  36. package/dist/contact/email.js.map +1 -0
  37. package/dist/contact/image-sanitizer.d.ts +9 -0
  38. package/dist/contact/image-sanitizer.d.ts.map +1 -0
  39. package/dist/contact/image-sanitizer.js +109 -0
  40. package/dist/contact/image-sanitizer.js.map +1 -0
  41. package/dist/contact/index.d.ts +3 -0
  42. package/dist/contact/index.d.ts.map +1 -0
  43. package/dist/contact/index.js +3 -0
  44. package/dist/contact/index.js.map +1 -0
  45. package/dist/contact/production.d.ts +50 -0
  46. package/dist/contact/production.d.ts.map +1 -0
  47. package/dist/contact/production.js +383 -0
  48. package/dist/contact/production.js.map +1 -0
  49. package/dist/contact/request.d.ts +19 -0
  50. package/dist/contact/request.d.ts.map +1 -0
  51. package/dist/contact/request.js +116 -0
  52. package/dist/contact/request.js.map +1 -0
  53. package/dist/contact/resend.d.ts +49 -0
  54. package/dist/contact/resend.d.ts.map +1 -0
  55. package/dist/contact/resend.js +137 -0
  56. package/dist/contact/resend.js.map +1 -0
  57. package/dist/contact/route.d.ts +15 -0
  58. package/dist/contact/route.d.ts.map +1 -0
  59. package/dist/contact/route.js +128 -0
  60. package/dist/contact/route.js.map +1 -0
  61. package/dist/contact/server.d.ts +30 -0
  62. package/dist/contact/server.d.ts.map +1 -0
  63. package/dist/contact/server.js +988 -0
  64. package/dist/contact/server.js.map +1 -0
  65. package/dist/contact/shared.d.ts +242 -0
  66. package/dist/contact/shared.d.ts.map +1 -0
  67. package/dist/contact/shared.js +17 -0
  68. package/dist/contact/shared.js.map +1 -0
  69. package/dist/contact/testing.d.ts +61 -0
  70. package/dist/contact/testing.d.ts.map +1 -0
  71. package/dist/contact/testing.js +87 -0
  72. package/dist/contact/testing.js.map +1 -0
  73. package/dist/google-maps-attribution-assets.d.ts +19 -0
  74. package/dist/google-maps-attribution-assets.d.ts.map +1 -0
  75. package/dist/google-maps-attribution-assets.js +19 -0
  76. package/dist/google-maps-attribution-assets.js.map +1 -0
  77. package/dist/google-reviews.d.ts +326 -0
  78. package/dist/google-reviews.d.ts.map +1 -0
  79. package/dist/google-reviews.js +256 -0
  80. package/dist/google-reviews.js.map +1 -0
  81. package/dist/headers.d.ts +64 -0
  82. package/dist/headers.d.ts.map +1 -0
  83. package/dist/headers.js +179 -0
  84. package/dist/headers.js.map +1 -0
  85. package/dist/instrumentation-client.d.ts +3 -0
  86. package/dist/instrumentation-client.d.ts.map +1 -1
  87. package/dist/instrumentation-client.js +61 -11
  88. package/dist/instrumentation-client.js.map +1 -1
  89. package/dist/metadata.d.ts +16 -0
  90. package/dist/metadata.d.ts.map +1 -0
  91. package/dist/metadata.js +50 -0
  92. package/dist/metadata.js.map +1 -0
  93. package/dist/reviews.d.ts +18 -0
  94. package/dist/reviews.d.ts.map +1 -0
  95. package/dist/reviews.js +16 -0
  96. package/dist/reviews.js.map +1 -0
  97. package/dist/robots.d.ts +0 -1
  98. package/dist/robots.d.ts.map +1 -1
  99. package/dist/robots.js +5 -7
  100. package/dist/robots.js.map +1 -1
  101. package/dist/schema.d.ts.map +1 -1
  102. package/dist/schema.js +2 -2
  103. package/dist/schema.js.map +1 -1
  104. package/dist/ui-client.d.ts +48 -0
  105. package/dist/ui-client.d.ts.map +1 -0
  106. package/dist/ui-client.js +120 -0
  107. package/dist/ui-client.js.map +1 -0
  108. package/dist/ui.d.ts +81 -0
  109. package/dist/ui.d.ts.map +1 -0
  110. package/dist/ui.js +65 -0
  111. package/dist/ui.js.map +1 -0
  112. package/package.json +90 -2
@@ -0,0 +1,71 @@
1
+ import { type BrandlabAnalyticsContract, type ContactFormConversionResult, type GtagTransport } from '@brandlab-digital/site-core/analytics';
2
+ import type { ContactActionResult } from '@brandlab-digital/site-core/contact';
3
+ import type { BrandlabContactDefinition } from './contact/shared.js';
4
+ export interface BrandlabBrowserAnalyticsConfig {
5
+ enabled: boolean;
6
+ webVitalsEnabled?: boolean;
7
+ enhancedConversionsEnabled?: boolean;
8
+ measurementId?: string | null;
9
+ googleAdsConversionId?: string | null;
10
+ googleAdsConversionLabel?: string | null;
11
+ gtag?: GtagTransport;
12
+ }
13
+ export interface SafeContactAnalyticsParams {
14
+ page_template?: string;
15
+ service_slug?: string;
16
+ location_slug?: string;
17
+ }
18
+ export interface SafeContactAdsParams {
19
+ currency?: string;
20
+ value?: number;
21
+ }
22
+ export declare const PHONE_CALL_PLACEMENTS: readonly ["header", "footer", "hero", "cta", "fab", "contact", "location", "page"];
23
+ export type PhoneCallPlacement = (typeof PHONE_CALL_PLACEMENTS)[number];
24
+ export declare function resolveBrowserAnalyticsConfig(contract: BrandlabAnalyticsContract, environment: Readonly<Record<string, string | undefined>>, options: {
25
+ enabled: boolean;
26
+ gtag?: GtagTransport;
27
+ }): BrandlabBrowserAnalyticsConfig;
28
+ export type BrandlabWebVitalName = 'CLS' | 'FCP' | 'INP' | 'LCP' | 'TTFB';
29
+ export type BrandlabWebVitalRating = 'good' | 'needs-improvement' | 'poor';
30
+ export interface BrandlabWebVitalMetric {
31
+ name: BrandlabWebVitalName;
32
+ value: number;
33
+ delta: number;
34
+ rating: BrandlabWebVitalRating;
35
+ navigationType?: string;
36
+ }
37
+ /** Privacy-safe callback for Next's useReportWebVitals hook. */
38
+ export declare function reportBrandlabWebVital(metric: BrandlabWebVitalMetric, config: Pick<BrandlabBrowserAnalyticsConfig, 'enabled' | 'webVitalsEnabled' | 'measurementId' | 'gtag'>): boolean;
39
+ export declare function createBrandlabWebVitalsReporter(config: Pick<BrandlabBrowserAnalyticsConfig, 'enabled' | 'webVitalsEnabled' | 'measurementId' | 'gtag'>): (metric: BrandlabWebVitalMetric) => boolean;
40
+ export declare function getBrowserGtag(win?: Window): GtagTransport | undefined;
41
+ export declare function isTrackableContactActionResult(result: ContactActionResult): result is Extract<ContactActionResult, {
42
+ ok: true;
43
+ accepted: true;
44
+ }>;
45
+ export declare function trackDeliveredContact(result: ContactActionResult, config: BrandlabBrowserAnalyticsConfig, options: {
46
+ pagePath: string;
47
+ params?: SafeContactAnalyticsParams;
48
+ adsParams?: SafeContactAdsParams;
49
+ }): ContactFormConversionResult;
50
+ /**
51
+ * Sends Enhanced Conversions only after provider acceptance. Email and phone may
52
+ * only be sourced from fields with explicit declarative roles; they never enter
53
+ * the GA4 parameter object.
54
+ */
55
+ export declare function trackDeliveredContactWithEnhancedConversions(result: ContactActionResult, config: BrandlabBrowserAnalyticsConfig, options: {
56
+ pagePath: string;
57
+ definition: BrandlabContactDefinition;
58
+ formData: FormData;
59
+ /** Live Consent Mode decision for ad_user_data; absence is deny. */
60
+ adUserDataConsent: boolean;
61
+ params?: SafeContactAnalyticsParams;
62
+ adsParams?: SafeContactAdsParams;
63
+ }): ContactFormConversionResult;
64
+ export declare function trackPhoneCall(input: {
65
+ pagePath: string;
66
+ placement: PhoneCallPlacement;
67
+ }, config: Pick<BrandlabBrowserAnalyticsConfig, 'enabled' | 'measurementId' | 'gtag'>): boolean;
68
+ export declare function trackBrandlabBrowserEvent(eventName: string, params: Record<string, unknown>, config: Pick<BrandlabBrowserAnalyticsConfig, 'enabled' | 'measurementId' | 'gtag'> & {
69
+ contract: BrandlabAnalyticsContract;
70
+ }): boolean;
71
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,219 @@
1
+ 'use client';
2
+ import { defineAnalyticsContract, normalizeEnhancedConversionEmail, normalizeEnhancedConversionPhone, sendBrandlabAnalyticsEvent, sendContactFormConversion, } from '@brandlab-digital/site-core/analytics';
3
+ import { normalizeBrandlabRoutePath } from '@brandlab-digital/site-core/routes';
4
+ export const PHONE_CALL_PLACEMENTS = [
5
+ 'header',
6
+ 'footer',
7
+ 'hero',
8
+ 'cta',
9
+ 'fab',
10
+ 'contact',
11
+ 'location',
12
+ 'page',
13
+ ];
14
+ export function resolveBrowserAnalyticsConfig(contract, environment, options) {
15
+ defineAnalyticsContract(contract);
16
+ return {
17
+ enabled: options.enabled,
18
+ webVitalsEnabled: contract.webVitals,
19
+ enhancedConversionsEnabled: contract.googleAds?.enhancedConversions?.mode === 'consent-required',
20
+ measurementId: environment[contract.measurementIdEnv],
21
+ googleAdsConversionId: contract.googleAds
22
+ ? environment[contract.googleAds.conversionIdEnv]
23
+ : undefined,
24
+ googleAdsConversionLabel: contract.googleAds
25
+ ? environment[contract.googleAds.contactConversionLabelEnv]
26
+ : undefined,
27
+ gtag: options.gtag,
28
+ };
29
+ }
30
+ const WEB_VITAL_NAMES = new Set(['CLS', 'FCP', 'INP', 'LCP', 'TTFB']);
31
+ const WEB_VITAL_RATINGS = new Set([
32
+ 'good',
33
+ 'needs-improvement',
34
+ 'poor',
35
+ ]);
36
+ const WEB_VITAL_NAVIGATION_TYPES = new Set([
37
+ 'navigate',
38
+ 'reload',
39
+ 'back-forward',
40
+ 'back-forward-cache',
41
+ 'prerender',
42
+ 'restore',
43
+ ]);
44
+ /** Privacy-safe callback for Next's useReportWebVitals hook. */
45
+ export function reportBrandlabWebVital(metric, config) {
46
+ if (!WEB_VITAL_NAMES.has(metric.name) ||
47
+ !WEB_VITAL_RATINGS.has(metric.rating) ||
48
+ !Number.isFinite(metric.value) ||
49
+ metric.value < 0 ||
50
+ !Number.isFinite(metric.delta)) {
51
+ return false;
52
+ }
53
+ const navigationType = WEB_VITAL_NAVIGATION_TYPES.has(metric.navigationType ?? '')
54
+ ? metric.navigationType
55
+ : undefined;
56
+ return sendBrandlabAnalyticsEvent({
57
+ enabled: config.enabled && config.webVitalsEnabled !== false,
58
+ measurementId: config.measurementId,
59
+ gtag: config.gtag ?? getBrowserGtag(),
60
+ eventName: 'web_vital',
61
+ params: {
62
+ metric_name: metric.name,
63
+ metric_value: metric.value,
64
+ metric_delta: metric.delta,
65
+ metric_rating: metric.rating,
66
+ ...(navigationType ? { navigation_type: navigationType } : {}),
67
+ },
68
+ });
69
+ }
70
+ export function createBrandlabWebVitalsReporter(config) {
71
+ return (metric) => reportBrandlabWebVital(metric, config);
72
+ }
73
+ export function getBrowserGtag(win = window) {
74
+ const candidate = win.gtag;
75
+ return typeof candidate === 'function' ? candidate : undefined;
76
+ }
77
+ function safePagePath(value) {
78
+ const path = value.trim().split(/[?#]/, 1)[0];
79
+ if (!path || path.length > 500)
80
+ return '/';
81
+ try {
82
+ return normalizeBrandlabRoutePath(path);
83
+ }
84
+ catch {
85
+ return '/';
86
+ }
87
+ }
88
+ function safeSlug(value) {
89
+ const normalized = value?.trim().toLowerCase();
90
+ return normalized && /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/.test(normalized) && normalized.length <= 80
91
+ ? normalized
92
+ : undefined;
93
+ }
94
+ function sanitizeContactParams(params) {
95
+ return {
96
+ ...(safeSlug(params?.page_template)
97
+ ? { page_template: safeSlug(params?.page_template) }
98
+ : {}),
99
+ ...(safeSlug(params?.service_slug)
100
+ ? { service_slug: safeSlug(params?.service_slug) }
101
+ : {}),
102
+ ...(safeSlug(params?.location_slug)
103
+ ? { location_slug: safeSlug(params?.location_slug) }
104
+ : {}),
105
+ };
106
+ }
107
+ function sanitizeAdsParams(params) {
108
+ return {
109
+ ...(params?.currency && /^[A-Z]{3}$/.test(params.currency)
110
+ ? { currency: params.currency }
111
+ : {}),
112
+ ...(typeof params?.value === 'number' && Number.isFinite(params.value) && params.value >= 0
113
+ ? { value: params.value }
114
+ : {}),
115
+ };
116
+ }
117
+ export function isTrackableContactActionResult(result) {
118
+ return result.ok && result.accepted && result.trackConversion;
119
+ }
120
+ export function trackDeliveredContact(result, config, options) {
121
+ if (!isTrackableContactActionResult(result)) {
122
+ return { ga4Sent: false, enhancedConversionSent: false, adsConversionSent: false };
123
+ }
124
+ return sendContactFormConversion({
125
+ ...config,
126
+ gtag: config.gtag ?? getBrowserGtag(),
127
+ pagePath: safePagePath(options.pagePath),
128
+ submissionId: result.confirmationId,
129
+ params: sanitizeContactParams(options.params),
130
+ adsParams: sanitizeAdsParams(options.adsParams),
131
+ });
132
+ }
133
+ function explicitRoleValue(definition, formData, role) {
134
+ const field = definition.fields.find((candidate) => candidate.role === role);
135
+ if (!field)
136
+ return undefined;
137
+ const value = formData.get(field.name);
138
+ return typeof value === 'string' ? value : undefined;
139
+ }
140
+ /**
141
+ * Sends Enhanced Conversions only after provider acceptance. Email and phone may
142
+ * only be sourced from fields with explicit declarative roles; they never enter
143
+ * the GA4 parameter object.
144
+ */
145
+ export function trackDeliveredContactWithEnhancedConversions(result, config, options) {
146
+ if (!isTrackableContactActionResult(result)) {
147
+ return { ga4Sent: false, enhancedConversionSent: false, adsConversionSent: false };
148
+ }
149
+ const email = normalizeEnhancedConversionEmail(explicitRoleValue(options.definition, options.formData, 'email'));
150
+ const phone = normalizeEnhancedConversionPhone(explicitRoleValue(options.definition, options.formData, 'phone'));
151
+ return sendContactFormConversion({
152
+ ...config,
153
+ gtag: config.gtag ?? getBrowserGtag(),
154
+ pagePath: safePagePath(options.pagePath),
155
+ submissionId: result.confirmationId,
156
+ params: sanitizeContactParams(options.params),
157
+ adsParams: sanitizeAdsParams(options.adsParams),
158
+ enhancedConversionsEnabled: config.enhancedConversionsEnabled === true,
159
+ adUserDataConsent: options.adUserDataConsent === true,
160
+ ...((email || phone) ? { enhancedConversion: { email, phone } } : {}),
161
+ });
162
+ }
163
+ export function trackPhoneCall(input, config) {
164
+ if (!PHONE_CALL_PLACEMENTS.includes(input.placement))
165
+ return false;
166
+ return sendBrandlabAnalyticsEvent({
167
+ ...config,
168
+ gtag: config.gtag ?? getBrowserGtag(),
169
+ eventName: 'phone_call',
170
+ params: {
171
+ event_category: 'lead',
172
+ page_path: safePagePath(input.pagePath),
173
+ placement: input.placement,
174
+ },
175
+ });
176
+ }
177
+ function safeAdditionalEventValue(value, policy) {
178
+ if (policy.type === 'boolean')
179
+ return typeof value === 'boolean' ? value : undefined;
180
+ if (policy.type === 'count') {
181
+ const minimum = policy.minimum ?? 0;
182
+ const maximum = policy.maximum ?? 100_000;
183
+ return typeof value === 'number' && Number.isInteger(value) && value >= minimum && value <= maximum
184
+ ? value
185
+ : undefined;
186
+ }
187
+ if (typeof value !== 'string')
188
+ return undefined;
189
+ const normalized = value.trim();
190
+ if (policy.type === 'enum')
191
+ return policy.values.includes(normalized) ? normalized : undefined;
192
+ if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/.test(normalized) || normalized.length > 80) {
193
+ return undefined;
194
+ }
195
+ const digits = normalized.replace(/\D/g, '');
196
+ return digits.length >= 4 || /^[a-f0-9]{24,}$/.test(normalized)
197
+ ? undefined
198
+ : normalized;
199
+ }
200
+ export function trackBrandlabBrowserEvent(eventName, params, config) {
201
+ defineAnalyticsContract(config.contract);
202
+ const event = config.contract.additionalEvents?.find((candidate) => candidate.name === eventName);
203
+ if (!event)
204
+ return false;
205
+ const safeParams = Object.fromEntries(Object.entries(params).flatMap(([key, value]) => {
206
+ const policy = event.parameters.find((candidate) => candidate.key === key);
207
+ if (!policy)
208
+ return [];
209
+ const safeValue = safeAdditionalEventValue(value, policy);
210
+ return safeValue === undefined ? [] : [[key, safeValue]];
211
+ }));
212
+ return sendBrandlabAnalyticsEvent({
213
+ ...config,
214
+ gtag: config.gtag ?? getBrowserGtag(),
215
+ eventName,
216
+ params: safeParams,
217
+ });
218
+ }
219
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
package/dist/blog.d.ts ADDED
@@ -0,0 +1,163 @@
1
+ import { type BrandlabBlogAdapter, type BrandlabBlogPost } from '@brandlab-digital/site-core/blog';
2
+ import { type BrandlabRouteCatalog } from '@brandlab-digital/site-core/routes';
3
+ import { type SitemapEntry } from '@brandlab-digital/site-core/sitemaps';
4
+ import { type BrandlabMetadataDefaults, type NextCompatibleMetadata } from './metadata.js';
5
+ export interface BrandlabBlogAdapterOptions<Content> {
6
+ adapter: BrandlabBlogAdapter;
7
+ posts: readonly BrandlabBlogPost[];
8
+ metadata: BrandlabMetadataDefaults;
9
+ publisherId: string;
10
+ resolveContent: (post: BrandlabBlogPost) => Content | Promise<Content>;
11
+ now?: () => Date;
12
+ /** Required by the candidate route-aware contract; optional only for v1 compatibility. */
13
+ routes?: BrandlabRouteCatalog;
14
+ rss?: {
15
+ title: string;
16
+ description: string;
17
+ path?: string;
18
+ };
19
+ }
20
+ export declare function createBrandlabBlogAdapter<Content>(options: BrandlabBlogAdapterOptions<Content>): {
21
+ getPublishedPosts: () => (BrandlabBlogPost & {
22
+ status: "published";
23
+ publishedAt: string;
24
+ })[];
25
+ getPostBySlug(slug: string): (BrandlabBlogPost & {
26
+ status: "published";
27
+ publishedAt: string;
28
+ }) | undefined;
29
+ generateStaticParams(): {
30
+ slug: string;
31
+ }[];
32
+ generateMetadata(slug: string): NextCompatibleMetadata | undefined;
33
+ generateSchema(slug: string): import("@brandlab-digital/site-core/schema").BrandlabSchemaNode | undefined;
34
+ getSitemapEntries(): SitemapEntry[];
35
+ getRelatedPosts(slug: string, limit?: number): (BrandlabBlogPost & {
36
+ status: "published";
37
+ publishedAt: string;
38
+ })[];
39
+ renderRss(): string | undefined;
40
+ resolve(slug: string): Promise<{
41
+ post: BrandlabBlogPost & {
42
+ status: "published";
43
+ publishedAt: string;
44
+ };
45
+ content: Awaited<Content>;
46
+ } | undefined>;
47
+ };
48
+ export declare function createMdxBlogAdapter<Content>(options: Omit<BrandlabBlogAdapterOptions<Content>, 'adapter'>): {
49
+ getPublishedPosts: () => (BrandlabBlogPost & {
50
+ status: "published";
51
+ publishedAt: string;
52
+ })[];
53
+ getPostBySlug(slug: string): (BrandlabBlogPost & {
54
+ status: "published";
55
+ publishedAt: string;
56
+ }) | undefined;
57
+ generateStaticParams(): {
58
+ slug: string;
59
+ }[];
60
+ generateMetadata(slug: string): NextCompatibleMetadata | undefined;
61
+ generateSchema(slug: string): import("@brandlab-digital/site-core/schema").BrandlabSchemaNode | undefined;
62
+ getSitemapEntries(): SitemapEntry[];
63
+ getRelatedPosts(slug: string, limit?: number): (BrandlabBlogPost & {
64
+ status: "published";
65
+ publishedAt: string;
66
+ })[];
67
+ renderRss(): string | undefined;
68
+ resolve(slug: string): Promise<{
69
+ post: BrandlabBlogPost & {
70
+ status: "published";
71
+ publishedAt: string;
72
+ };
73
+ content: Awaited<Content>;
74
+ } | undefined>;
75
+ };
76
+ export declare function createStructuredBlogAdapter<Content>(options: Omit<BrandlabBlogAdapterOptions<Content>, 'adapter'>): {
77
+ getPublishedPosts: () => (BrandlabBlogPost & {
78
+ status: "published";
79
+ publishedAt: string;
80
+ })[];
81
+ getPostBySlug(slug: string): (BrandlabBlogPost & {
82
+ status: "published";
83
+ publishedAt: string;
84
+ }) | undefined;
85
+ generateStaticParams(): {
86
+ slug: string;
87
+ }[];
88
+ generateMetadata(slug: string): NextCompatibleMetadata | undefined;
89
+ generateSchema(slug: string): import("@brandlab-digital/site-core/schema").BrandlabSchemaNode | undefined;
90
+ getSitemapEntries(): SitemapEntry[];
91
+ getRelatedPosts(slug: string, limit?: number): (BrandlabBlogPost & {
92
+ status: "published";
93
+ publishedAt: string;
94
+ })[];
95
+ renderRss(): string | undefined;
96
+ resolve(slug: string): Promise<{
97
+ post: BrandlabBlogPost & {
98
+ status: "published";
99
+ publishedAt: string;
100
+ };
101
+ content: Awaited<Content>;
102
+ } | undefined>;
103
+ };
104
+ export type BrandlabRouteAwareBlogAdapterOptions<Content> = Omit<BrandlabBlogAdapterOptions<Content>, 'adapter' | 'routes'> & {
105
+ routes: BrandlabRouteCatalog;
106
+ };
107
+ export declare function createRouteAwareMdxBlogAdapter<Content>(options: BrandlabRouteAwareBlogAdapterOptions<Content>): {
108
+ getPublishedPosts: () => (BrandlabBlogPost & {
109
+ status: "published";
110
+ publishedAt: string;
111
+ })[];
112
+ getPostBySlug(slug: string): (BrandlabBlogPost & {
113
+ status: "published";
114
+ publishedAt: string;
115
+ }) | undefined;
116
+ generateStaticParams(): {
117
+ slug: string;
118
+ }[];
119
+ generateMetadata(slug: string): NextCompatibleMetadata | undefined;
120
+ generateSchema(slug: string): import("@brandlab-digital/site-core/schema").BrandlabSchemaNode | undefined;
121
+ getSitemapEntries(): SitemapEntry[];
122
+ getRelatedPosts(slug: string, limit?: number): (BrandlabBlogPost & {
123
+ status: "published";
124
+ publishedAt: string;
125
+ })[];
126
+ renderRss(): string | undefined;
127
+ resolve(slug: string): Promise<{
128
+ post: BrandlabBlogPost & {
129
+ status: "published";
130
+ publishedAt: string;
131
+ };
132
+ content: Awaited<Content>;
133
+ } | undefined>;
134
+ };
135
+ export declare function createRouteAwareStructuredBlogAdapter<Content>(options: BrandlabRouteAwareBlogAdapterOptions<Content>): {
136
+ getPublishedPosts: () => (BrandlabBlogPost & {
137
+ status: "published";
138
+ publishedAt: string;
139
+ })[];
140
+ getPostBySlug(slug: string): (BrandlabBlogPost & {
141
+ status: "published";
142
+ publishedAt: string;
143
+ }) | undefined;
144
+ generateStaticParams(): {
145
+ slug: string;
146
+ }[];
147
+ generateMetadata(slug: string): NextCompatibleMetadata | undefined;
148
+ generateSchema(slug: string): import("@brandlab-digital/site-core/schema").BrandlabSchemaNode | undefined;
149
+ getSitemapEntries(): SitemapEntry[];
150
+ getRelatedPosts(slug: string, limit?: number): (BrandlabBlogPost & {
151
+ status: "published";
152
+ publishedAt: string;
153
+ })[];
154
+ renderRss(): string | undefined;
155
+ resolve(slug: string): Promise<{
156
+ post: BrandlabBlogPost & {
157
+ status: "published";
158
+ publishedAt: string;
159
+ };
160
+ content: Awaited<Content>;
161
+ } | undefined>;
162
+ };
163
+ //# sourceMappingURL=blog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog.d.ts","sourceRoot":"","sources":["../src/blog.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACnF,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,0BAA0B,CAAC,OAAO;IACjD,OAAO,EAAE,mBAAmB,CAAA;IAC5B,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAA;IAClC,QAAQ,EAAE,wBAAwB,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACtE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;IAChB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,oBAAoB,CAAA;IAC7B,GAAG,CAAC,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAC/C,OAAO,EAAE,0BAA0B,CAAC,OAAO,CAAC;;;;;wBA2CtB,MAAM;;;;;;;2BAMH,MAAM,GAAG,sBAAsB,GAAG,SAAS;yBAgC7C,MAAM;yBAuBN,YAAY,EAAE;0BAcb,MAAM;;;;;kBA+CR,MAAM;;;;;;;EAK7B;AAeD,wBAAgB,oBAAoB,CAAC,OAAO,EAC1C,OAAO,EAAE,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;;;;;wBA/IvC,MAAM;;;;;;;2BAMH,MAAM,GAAG,sBAAsB,GAAG,SAAS;yBAgC7C,MAAM;yBAuBN,YAAY,EAAE;0BAcb,MAAM;;;;;kBA+CR,MAAM;;;;;;;EAwB7B;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EACjD,OAAO,EAAE,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;;;;;wBArJvC,MAAM;;;;;;;2BAMH,MAAM,GAAG,sBAAsB,GAAG,SAAS;yBAgC7C,MAAM;yBAuBN,YAAY,EAAE;0BAcb,MAAM;;;;;kBA+CR,MAAM;;;;;;;EA8B7B;AAED,MAAM,MAAM,oCAAoC,CAAC,OAAO,IAAI,IAAI,CAC9D,0BAA0B,CAAC,OAAO,CAAC,EACnC,SAAS,GAAG,QAAQ,CACrB,GAAG;IAAE,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAA;AAEpC,wBAAgB,8BAA8B,CAAC,OAAO,EACpD,OAAO,EAAE,oCAAoC,CAAC,OAAO,CAAC;;;;;wBAhKhC,MAAM;;;;;;;2BAMH,MAAM,GAAG,sBAAsB,GAAG,SAAS;yBAgC7C,MAAM;yBAuBN,YAAY,EAAE;0BAcb,MAAM;;;;;kBA+CR,MAAM;;;;;;;EAyC7B;AAED,wBAAgB,qCAAqC,CAAC,OAAO,EAC3D,OAAO,EAAE,oCAAoC,CAAC,OAAO,CAAC;;;;;wBAtKhC,MAAM;;;;;;;2BAMH,MAAM,GAAG,sBAAsB,GAAG,SAAS;yBAgC7C,MAAM;yBAuBN,YAAY,EAAE;0BAcb,MAAM;;;;;kBA+CR,MAAM;;;;;;;EA+C7B"}