siteplane 0.1.68 → 0.2.0-next.1
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 +59 -22
- package/dist/bin/siteplane.js +1422 -1475
- package/dist/chunk-BLJCWIYD.js +340 -0
- package/dist/chunk-KZ3AQ6OA.js +27 -0
- package/dist/components.d.ts +22 -0
- package/dist/components.js +43 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +6 -0
- package/dist/index.d.ts +38 -1
- package/dist/index.js +128 -1916
- package/dist/internal/analytics.js +91 -0
- package/dist/internal/bridge-loader.js +28 -0
- package/dist/internal/bridge.js +1 -0
- package/dist/next.cjs +204 -0
- package/dist/next.d.ts +29 -119
- package/dist/next.js +128 -2819
- package/dist/route.d.ts +13 -0
- package/dist/route.js +144 -0
- package/package.json +46 -11
package/dist/index.js
CHANGED
|
@@ -1,1926 +1,138 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
expires_in: z2.number().int().positive(),
|
|
19
|
-
interval: z2.number().int().positive()
|
|
20
|
-
});
|
|
21
|
-
var deviceTokenResponseSchema = z2.object({
|
|
22
|
-
access_token: z2.string().startsWith(AGENT_CONNECTION_TOKEN_PREFIX).min(40),
|
|
23
|
-
token_type: z2.literal("Bearer"),
|
|
24
|
-
scope: z2.string(),
|
|
25
|
-
expires_in: z2.number().int().positive()
|
|
26
|
-
});
|
|
27
|
-
var deviceTokenErrorSchema = z2.object({
|
|
28
|
-
error: z2.string(),
|
|
29
|
-
error_description: z2.string().optional(),
|
|
30
|
-
interval: z2.number().int().positive().optional()
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// ../shared/dist/analytics-defaults.js
|
|
34
|
-
var ANALYTICS_BATCH_LIMITS = {
|
|
35
|
-
maxEventsPerRequest: 50,
|
|
36
|
-
maxJsonBodyBytes: 64 * 1024,
|
|
37
|
-
maxPropertiesJsonBytes: 8 * 1024
|
|
38
|
-
};
|
|
39
|
-
var ANALYTICS_RETENTION_DEFAULTS = {
|
|
40
|
-
enabledRawEventRetentionDays: 30,
|
|
41
|
-
higherTierRawEventRetentionDays: 90,
|
|
42
|
-
maxRawEventRetentionDaysWithoutAdr: 180,
|
|
43
|
-
diagnosticsRetentionDays: 30,
|
|
44
|
-
rateLimitBucketRetentionDays: 2,
|
|
45
|
-
lateEventWindowHours: 72
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// ../shared/dist/analytics-booking.js
|
|
49
|
-
import { z as z3 } from "zod";
|
|
50
|
-
var bookingProviders = ["treatwell", "beautinda", "other"];
|
|
51
|
-
var bookingAttributionModes = [
|
|
52
|
-
"outbound_click_and_utm",
|
|
53
|
-
"provider_redirect",
|
|
54
|
-
"provider_reported",
|
|
55
|
-
"manual_import",
|
|
56
|
-
"verified_webhook"
|
|
57
|
-
];
|
|
58
|
-
var bookingSignalSources = [
|
|
59
|
-
"outbound_click",
|
|
60
|
-
"provider_redirect",
|
|
61
|
-
"provider_reported",
|
|
62
|
-
"manual_import",
|
|
63
|
-
"verified_webhook"
|
|
64
|
-
];
|
|
65
|
-
var bookingAttributionConfidences = [
|
|
66
|
-
"provider_redirect",
|
|
67
|
-
"provider_reported",
|
|
68
|
-
"manual_import",
|
|
69
|
-
"verified_webhook"
|
|
70
|
-
];
|
|
71
|
-
var bookingProviderSchema = z3.enum(bookingProviders);
|
|
72
|
-
var bookingAttributionModeSchema = z3.enum(bookingAttributionModes);
|
|
73
|
-
var bookingSignalSourceSchema = z3.enum(bookingSignalSources);
|
|
74
|
-
var bookingAttributionConfidenceSchema = z3.enum(bookingAttributionConfidences);
|
|
75
|
-
var bookingProviderHintSchema = z3.object({
|
|
76
|
-
bookingProvider: bookingProviderSchema,
|
|
77
|
-
bookingUrlHost: z3.string().min(1).max(253),
|
|
78
|
-
bookingAttributionMode: bookingAttributionModeSchema,
|
|
79
|
-
utmContent: z3.string().min(1).max(200).optional(),
|
|
80
|
-
successCondition: z3.literal("redirect_status=succeeded").optional()
|
|
81
|
-
}).superRefine((hint, context) => {
|
|
82
|
-
if (hint.successCondition !== void 0 && hint.bookingAttributionMode !== "provider_redirect") {
|
|
83
|
-
context.addIssue({
|
|
84
|
-
code: "custom",
|
|
85
|
-
message: "successCondition is allowed only for provider_redirect booking hints.",
|
|
86
|
-
path: ["successCondition"]
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
// ../shared/dist/analytics-contract.js
|
|
92
|
-
import { z as z4 } from "zod";
|
|
93
|
-
var ANALYTICS_IMPORT_SCHEMA_VERSION = "analytics-provider-import.v1";
|
|
94
|
-
var analyticsImportTargetIdSchema = z4.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u);
|
|
95
|
-
var analyticsProviderImportRowSchema = z4.object({
|
|
96
|
-
targetId: analyticsImportTargetIdSchema,
|
|
97
|
-
occurredAt: z4.string().datetime({ offset: true }),
|
|
98
|
-
attributionConfidence: z4.enum(["provider_reported", "manual_import"]),
|
|
99
|
-
providerEventId: z4.string().trim().min(1).max(160).optional(),
|
|
100
|
-
idempotencyKey: z4.string().trim().min(1).max(160).optional()
|
|
101
|
-
}).strict().superRefine((row, context) => {
|
|
102
|
-
if (!row.providerEventId && !row.idempotencyKey) {
|
|
103
|
-
context.addIssue({
|
|
104
|
-
code: "custom",
|
|
105
|
-
message: "Each import row requires providerEventId or idempotencyKey.",
|
|
106
|
-
path: ["providerEventId"]
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
var analyticsProviderImportSchema = z4.object({
|
|
111
|
-
schemaVersion: z4.literal(ANALYTICS_IMPORT_SCHEMA_VERSION),
|
|
112
|
-
provider: z4.enum(["treatwell", "beautinda", "other"]),
|
|
113
|
-
sourceName: z4.string().trim().min(1).max(160).optional(),
|
|
114
|
-
rows: z4.array(analyticsProviderImportRowSchema).min(1).max(1e3)
|
|
115
|
-
}).strict();
|
|
116
|
-
|
|
117
|
-
// ../shared/dist/analytics-config.js
|
|
118
|
-
import { z as z5 } from "zod";
|
|
119
|
-
var ANALYTICS_CONFIG_LEASE_MS = 6e4;
|
|
120
|
-
var analyticsMeasurementConfigSchema = z5.object({
|
|
121
|
-
version: z5.literal(1),
|
|
122
|
-
installationGeneration: z5.number().int().positive(),
|
|
123
|
-
configRevision: z5.number().int().positive(),
|
|
124
|
-
effectiveSiteMode: z5.enum(["disabled", "session_only", "full_analytics"]),
|
|
125
|
-
measurementEnabled: z5.boolean(),
|
|
126
|
-
issuedAt: z5.string().datetime({ offset: true }),
|
|
127
|
-
expiresAt: z5.string().datetime({ offset: true })
|
|
128
|
-
}).strict().superRefine((config, context) => {
|
|
129
|
-
const lifetime = Date.parse(config.expiresAt) - Date.parse(config.issuedAt);
|
|
130
|
-
if (lifetime <= 0 || lifetime > ANALYTICS_CONFIG_LEASE_MS) {
|
|
131
|
-
context.addIssue({
|
|
132
|
-
code: "custom",
|
|
133
|
-
path: ["expiresAt"],
|
|
134
|
-
message: "Measurement permission must expire within 60 seconds."
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
if (config.measurementEnabled !== (config.effectiveSiteMode !== "disabled")) {
|
|
138
|
-
context.addIssue({
|
|
139
|
-
code: "custom",
|
|
140
|
-
path: ["measurementEnabled"],
|
|
141
|
-
message: "Measurement permission must match the effective site mode."
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
// ../shared/dist/analytics-events.js
|
|
147
|
-
import { z as z6 } from "zod";
|
|
148
|
-
var ANALYTICS_SCHEMA_VERSION = "analytics.v1";
|
|
149
|
-
var analyticsSessionIdSchema = z6.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
|
|
150
|
-
var analyticsVisitorIdSchema = z6.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
|
|
151
|
-
var analyticsPersistedIdentityHashSchema = z6.string().regex(/^[a-f0-9]{64}$/u);
|
|
152
|
-
var analyticsEventNames = [
|
|
153
|
-
"page_view",
|
|
154
|
-
"section_view",
|
|
155
|
-
"cta_click",
|
|
156
|
-
"outbound_click",
|
|
157
|
-
"email_click",
|
|
158
|
-
"phone_click",
|
|
159
|
-
"file_download",
|
|
160
|
-
"form_start",
|
|
161
|
-
"form_submit",
|
|
162
|
-
"form_error",
|
|
163
|
-
"lead_created",
|
|
164
|
-
"checkout_started",
|
|
165
|
-
"conversion",
|
|
166
|
-
"checkout_completed",
|
|
167
|
-
"payment_succeeded",
|
|
168
|
-
"subscription_started",
|
|
169
|
-
"purchase_completed",
|
|
170
|
-
"trial_started"
|
|
171
|
-
];
|
|
172
|
-
var serverOnlyAnalyticsEvents = [
|
|
173
|
-
"checkout_completed",
|
|
174
|
-
"payment_succeeded",
|
|
175
|
-
"subscription_started",
|
|
176
|
-
"purchase_completed",
|
|
177
|
-
"trial_started"
|
|
178
|
-
];
|
|
179
|
-
var analyticsEventSources = [
|
|
180
|
-
"browser",
|
|
181
|
-
"server",
|
|
182
|
-
"test",
|
|
183
|
-
"editor_preview",
|
|
184
|
-
"system"
|
|
185
|
-
];
|
|
186
|
-
var analyticsIngestionChannels = [
|
|
187
|
-
"browser_collector",
|
|
188
|
-
"server_sdk",
|
|
189
|
-
"provider_endpoint",
|
|
190
|
-
"provider_import",
|
|
191
|
-
"test",
|
|
192
|
-
"editor_preview",
|
|
193
|
-
"system_job"
|
|
194
|
-
];
|
|
195
|
-
var analyticsTargetTypes = [
|
|
196
|
-
"cta",
|
|
197
|
-
"form",
|
|
198
|
-
"section",
|
|
199
|
-
"file",
|
|
200
|
-
"link",
|
|
201
|
-
"conversion",
|
|
202
|
-
"server_conversion"
|
|
203
|
-
];
|
|
204
|
-
var analyticsDataAttributeEvents = [
|
|
205
|
-
"cta_click",
|
|
206
|
-
"outbound_click",
|
|
207
|
-
"email_click",
|
|
208
|
-
"phone_click",
|
|
209
|
-
"file_download",
|
|
210
|
-
"section_view",
|
|
211
|
-
"checkout_started",
|
|
212
|
-
"form"
|
|
213
|
-
];
|
|
214
|
-
var analyticsDeviceTypes = [
|
|
215
|
-
"desktop",
|
|
216
|
-
"tablet",
|
|
217
|
-
"mobile",
|
|
218
|
-
"unknown"
|
|
219
|
-
];
|
|
220
|
-
var analyticsBotClassifications = [
|
|
221
|
-
"normal",
|
|
222
|
-
"known_bot",
|
|
223
|
-
"suspicious",
|
|
224
|
-
"invalid"
|
|
225
|
-
];
|
|
226
|
-
var analyticsValidityStatuses = [
|
|
227
|
-
"accepted",
|
|
228
|
-
"rejected",
|
|
229
|
-
"ignored"
|
|
230
|
-
];
|
|
231
|
-
var analyticsEventNameSchema = z6.enum(analyticsEventNames);
|
|
232
|
-
var serverOnlyAnalyticsEventSchema = z6.enum(serverOnlyAnalyticsEvents);
|
|
233
|
-
var analyticsEventSourceSchema = z6.enum(analyticsEventSources);
|
|
234
|
-
var analyticsIngestionChannelSchema = z6.enum(analyticsIngestionChannels);
|
|
235
|
-
var analyticsTargetTypeSchema = z6.enum(analyticsTargetTypes);
|
|
236
|
-
var analyticsDataAttributeEventSchema = z6.enum(analyticsDataAttributeEvents);
|
|
237
|
-
var analyticsDeviceTypeSchema = z6.enum(analyticsDeviceTypes);
|
|
238
|
-
var analyticsBotClassificationSchema = z6.enum(analyticsBotClassifications);
|
|
239
|
-
var analyticsValidityStatusSchema = z6.enum(analyticsValidityStatuses);
|
|
240
|
-
var analyticsPropertiesSchema = z6.record(z6.string(), z6.unknown());
|
|
241
|
-
var analyticsTimestampSchema = z6.string().datetime({ offset: true });
|
|
242
|
-
var analyticsBrowserEventSchema = z6.object({
|
|
243
|
-
eventId: z6.string().min(1).max(160),
|
|
244
|
-
installationGeneration: z6.number().int().positive().optional(),
|
|
245
|
-
measurementMode: z6.enum(["session_only", "full_analytics"]).optional(),
|
|
246
|
-
eventName: analyticsEventNameSchema,
|
|
247
|
-
eventSource: analyticsEventSourceSchema.optional().default("browser"),
|
|
248
|
-
targetId: z6.string().min(1).max(160).optional(),
|
|
249
|
-
targetType: analyticsTargetTypeSchema.optional(),
|
|
250
|
-
visitorId: analyticsVisitorIdSchema.optional(),
|
|
251
|
-
sessionId: analyticsSessionIdSchema,
|
|
252
|
-
idempotencyKey: z6.string().min(1).max(240).optional(),
|
|
253
|
-
occurredAt: analyticsTimestampSchema,
|
|
254
|
-
pageUrl: z6.string().url().max(2048).optional(),
|
|
255
|
-
pagePath: z6.string().min(1).max(1024).optional(),
|
|
256
|
-
routeTemplate: z6.string().min(1).max(1024).optional(),
|
|
257
|
-
referrer: z6.string().url().max(2048).optional(),
|
|
258
|
-
utmSource: z6.string().min(1).max(200).optional(),
|
|
259
|
-
utmMedium: z6.string().min(1).max(200).optional(),
|
|
260
|
-
utmCampaign: z6.string().min(1).max(200).optional(),
|
|
261
|
-
utmContent: z6.string().min(1).max(200).optional(),
|
|
262
|
-
utmTerm: z6.string().min(1).max(200).optional(),
|
|
263
|
-
deviceType: analyticsDeviceTypeSchema.optional(),
|
|
264
|
-
browserName: z6.string().min(1).max(120).optional(),
|
|
265
|
-
osName: z6.string().min(1).max(120).optional(),
|
|
266
|
-
country: z6.string().min(1).max(80).optional(),
|
|
267
|
-
region: z6.string().min(1).max(120).optional(),
|
|
268
|
-
properties: analyticsPropertiesSchema.optional().default({})
|
|
269
|
-
}).superRefine((event, context) => {
|
|
270
|
-
if (isServerOnlyAnalyticsEvent(event.eventName)) {
|
|
271
|
-
context.addIssue({
|
|
272
|
-
code: "custom",
|
|
273
|
-
message: "Browser analytics payloads cannot contain server-only events.",
|
|
274
|
-
path: ["eventName"]
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
if (event.eventSource === "server" || event.eventSource === "system") {
|
|
278
|
-
context.addIssue({
|
|
279
|
-
code: "custom",
|
|
280
|
-
message: "Browser analytics payloads cannot use server/system sources.",
|
|
281
|
-
path: ["eventSource"]
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
if (event.targetType === "server_conversion") {
|
|
285
|
-
context.addIssue({
|
|
286
|
-
code: "custom",
|
|
287
|
-
message: "Browser analytics payloads cannot use server conversion targets.",
|
|
288
|
-
path: ["targetType"]
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
var analyticsBrowserEventPayloadSchema = z6.object({
|
|
293
|
-
siteKey: z6.string().min(1),
|
|
294
|
-
schemaVersion: z6.literal(ANALYTICS_SCHEMA_VERSION),
|
|
295
|
-
mode: z6.enum(["live", "test"]).optional().default("live"),
|
|
296
|
-
events: z6.array(analyticsBrowserEventSchema).min(1).max(50)
|
|
297
|
-
});
|
|
298
|
-
var analyticsNormalizedEventBaseSchema = z6.object({
|
|
299
|
-
site_id: z6.string().uuid(),
|
|
300
|
-
event_id: z6.string().min(1).max(160),
|
|
301
|
-
schema_version: z6.literal(ANALYTICS_SCHEMA_VERSION),
|
|
302
|
-
event_name: analyticsEventNameSchema,
|
|
303
|
-
event_source: analyticsEventSourceSchema,
|
|
304
|
-
ingestion_channel: analyticsIngestionChannelSchema,
|
|
305
|
-
target_id: z6.string().min(1).max(160).nullable().optional(),
|
|
306
|
-
target_type: analyticsTargetTypeSchema.nullable().optional(),
|
|
307
|
-
dedupe_key: z6.string().regex(/^analytics_dedupe_v1_[a-f0-9]{64}$/u).nullable().optional(),
|
|
308
|
-
idempotency_key: z6.string().min(1).max(240).nullable().optional(),
|
|
309
|
-
bot_classification: analyticsBotClassificationSchema,
|
|
310
|
-
validity_status: analyticsValidityStatusSchema,
|
|
311
|
-
rejection_reason: z6.string().min(1).max(240).nullable().optional(),
|
|
312
|
-
occurred_at: analyticsTimestampSchema,
|
|
313
|
-
received_at: analyticsTimestampSchema,
|
|
314
|
-
page_url: z6.string().url().max(2048).nullable().optional(),
|
|
315
|
-
page_path: z6.string().min(1).max(1024).nullable().optional(),
|
|
316
|
-
route_template: z6.string().min(1).max(1024).nullable().optional(),
|
|
317
|
-
referrer: z6.string().url().max(2048).nullable().optional(),
|
|
318
|
-
utm_source: z6.string().min(1).max(200).nullable().optional(),
|
|
319
|
-
utm_medium: z6.string().min(1).max(200).nullable().optional(),
|
|
320
|
-
utm_campaign: z6.string().min(1).max(200).nullable().optional(),
|
|
321
|
-
utm_content: z6.string().min(1).max(200).nullable().optional(),
|
|
322
|
-
utm_term: z6.string().min(1).max(200).nullable().optional(),
|
|
323
|
-
country: z6.string().min(1).max(80).nullable().optional(),
|
|
324
|
-
region: z6.string().min(1).max(120).nullable().optional(),
|
|
325
|
-
device_type: analyticsDeviceTypeSchema,
|
|
326
|
-
browser_name: z6.string().min(1).max(120).nullable().optional(),
|
|
327
|
-
os_name: z6.string().min(1).max(120).nullable().optional(),
|
|
328
|
-
provider: z6.string().min(1).max(120).nullable().optional(),
|
|
329
|
-
provider_event_id: z6.string().min(1).max(240).nullable().optional(),
|
|
330
|
-
properties: analyticsPropertiesSchema
|
|
331
|
-
});
|
|
332
|
-
var analyticsRawNormalizedEventSchema = analyticsNormalizedEventBaseSchema.extend({
|
|
333
|
-
visitor_id: analyticsVisitorIdSchema.nullable().optional(),
|
|
334
|
-
session_id: analyticsSessionIdSchema.nullable().optional()
|
|
335
|
-
});
|
|
336
|
-
var analyticsNormalizedEventSchema = analyticsNormalizedEventBaseSchema.extend({
|
|
337
|
-
visitor_id: analyticsPersistedIdentityHashSchema.nullable().optional(),
|
|
338
|
-
session_id: analyticsPersistedIdentityHashSchema.nullable().optional()
|
|
339
|
-
});
|
|
340
|
-
function isServerOnlyAnalyticsEvent(eventName) {
|
|
341
|
-
return serverOnlyAnalyticsEvents.includes(eventName);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// ../shared/dist/analytics-manifest.js
|
|
345
|
-
import { z as z7 } from "zod";
|
|
346
|
-
var analyticsTargetIdSchema = z7.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
|
|
347
|
-
message: "Analytics target IDs must be stable identifiers without whitespace or visible copy."
|
|
348
|
-
});
|
|
349
|
-
var analyticsManifestRecordSchema = z7.record(z7.string(), z7.unknown());
|
|
350
|
-
var analyticsFormPurposes = [
|
|
351
|
-
"contact",
|
|
352
|
-
"lead",
|
|
353
|
-
"newsletter",
|
|
354
|
-
"search",
|
|
355
|
-
"login",
|
|
356
|
-
"other"
|
|
357
|
-
];
|
|
358
|
-
var analyticsFormPurposeSchema = z7.enum(analyticsFormPurposes);
|
|
359
|
-
var analyticsManifestRouteSchema = z7.object({
|
|
360
|
-
path: z7.string().min(1).max(1024),
|
|
361
|
-
pageType: z7.string().min(1).max(120).optional(),
|
|
362
|
-
label: z7.string().min(1).max(200).optional()
|
|
363
|
-
}).passthrough();
|
|
364
|
-
var analyticsManifestTargetSchema = z7.object({
|
|
365
|
-
id: analyticsTargetIdSchema,
|
|
366
|
-
type: analyticsTargetTypeSchema,
|
|
367
|
-
event: analyticsEventNameSchema.optional(),
|
|
368
|
-
events: z7.array(analyticsEventNameSchema).min(1).max(20).optional(),
|
|
369
|
-
route: z7.string().min(1).max(1024).optional(),
|
|
370
|
-
label: z7.string().min(1).max(200).optional(),
|
|
371
|
-
description: z7.string().min(1).max(1e3).optional(),
|
|
372
|
-
autoActive: z7.boolean().optional(),
|
|
373
|
-
sourceHints: analyticsManifestRecordSchema.optional()
|
|
374
|
-
}).passthrough().superRefine((target, context) => {
|
|
375
|
-
if (target.event === void 0 && target.events === void 0) {
|
|
376
|
-
context.addIssue({
|
|
377
|
-
code: "custom",
|
|
378
|
-
message: "Analytics targets require event or events.",
|
|
379
|
-
path: ["event"]
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
if (target.event !== void 0 && target.events !== void 0) {
|
|
383
|
-
context.addIssue({
|
|
384
|
-
code: "custom",
|
|
385
|
-
message: "Analytics targets must use event or events, never both.",
|
|
386
|
-
path: ["events"]
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
if (target.type === "form" && !analyticsFormPurposeSchema.safeParse(target.sourceHints?.formPurpose).success) {
|
|
390
|
-
context.addIssue({
|
|
391
|
-
code: "custom",
|
|
392
|
-
message: "Analytics form targets require a typed sourceHints.formPurpose.",
|
|
393
|
-
path: ["sourceHints", "formPurpose"]
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
var analyticsManifestSchema = z7.object({
|
|
398
|
-
schemaVersion: z7.literal(ANALYTICS_SCHEMA_VERSION),
|
|
399
|
-
siteId: z7.string().min(1),
|
|
400
|
-
siteKeyRef: z7.string().regex(/^env:[A-Z][A-Z0-9_]*$/u, {
|
|
401
|
-
message: "siteKeyRef must be an environment-variable reference."
|
|
402
|
-
}),
|
|
403
|
-
siteKeyLookup: z7.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}$/),
|
|
404
|
-
routes: z7.array(analyticsManifestRouteSchema),
|
|
405
|
-
targets: z7.array(analyticsManifestTargetSchema),
|
|
406
|
-
metadata: analyticsManifestRecordSchema.optional(),
|
|
407
|
-
siteKey: z7.string().optional(),
|
|
408
|
-
secretKey: z7.string().optional(),
|
|
409
|
-
rawKey: z7.string().optional(),
|
|
410
|
-
token: z7.string().optional(),
|
|
411
|
-
accessToken: z7.string().optional()
|
|
412
|
-
}).passthrough().superRefine((manifest, context) => {
|
|
413
|
-
const targetIds = /* @__PURE__ */ new Set();
|
|
414
|
-
for (const [index, target] of manifest.targets.entries()) {
|
|
415
|
-
if (targetIds.has(target.id)) {
|
|
416
|
-
context.addIssue({
|
|
417
|
-
code: "custom",
|
|
418
|
-
message: `Duplicate analytics target ID: ${target.id}`,
|
|
419
|
-
path: ["targets", index, "id"]
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
targetIds.add(target.id);
|
|
423
|
-
}
|
|
424
|
-
for (const issue of findUnsafeSecretReferences(manifest)) {
|
|
425
|
-
context.addIssue({
|
|
426
|
-
code: "custom",
|
|
427
|
-
message: "Raw secret material is not allowed in analytics manifests.",
|
|
428
|
-
path: issue
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
});
|
|
432
|
-
var secretValuePattern = /(?:\bsk_(?:live|test)_|\bcpb_|\bpmt_(?:pc|setup|cli)_|\bservice_role\b|bearer\s+[a-z0-9._~-]+)/iu;
|
|
433
|
-
function findUnsafeSecretReferences(value, path = []) {
|
|
434
|
-
if (Array.isArray(value)) {
|
|
435
|
-
return value.flatMap((item, index) => findUnsafeSecretReferences(item, [...path, index]));
|
|
436
|
-
}
|
|
437
|
-
if (!isPlainRecord(value)) {
|
|
438
|
-
return [];
|
|
439
|
-
}
|
|
440
|
-
return Object.entries(value).flatMap(([key, childValue]) => {
|
|
441
|
-
const childPath = [...path, key];
|
|
442
|
-
const referenceLikeKey = /(?:ref|lookup|prefix)$/iu.test(key);
|
|
443
|
-
const unsafeHere = referenceLikeKey && typeof childValue === "string" && secretValuePattern.test(childValue);
|
|
444
|
-
return [
|
|
445
|
-
...unsafeHere ? [childPath] : [],
|
|
446
|
-
...findUnsafeSecretReferences(childValue, childPath)
|
|
447
|
-
];
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
function isPlainRecord(value) {
|
|
451
|
-
return typeof value === "object" && value !== null;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
// ../shared/dist/analytics-metrics.js
|
|
455
|
-
import { z as z8 } from "zod";
|
|
456
|
-
var analyticsVisitorQualities = ["exact", "estimated"];
|
|
457
|
-
var analyticsVisitorQualitySchema = z8.enum(analyticsVisitorQualities);
|
|
458
|
-
var analyticsKpiKeys = [
|
|
459
|
-
"pageViews",
|
|
460
|
-
"sessions",
|
|
461
|
-
"visitors",
|
|
462
|
-
"estimatedVisitors",
|
|
463
|
-
"inquiries",
|
|
464
|
-
"leads",
|
|
465
|
-
"conversions",
|
|
466
|
-
"conversionRate",
|
|
467
|
-
"inquiryRate"
|
|
468
|
-
];
|
|
469
|
-
var analyticsKpiKeySchema = z8.enum(analyticsKpiKeys);
|
|
470
|
-
|
|
471
|
-
// ../shared/dist/analytics-privacy.js
|
|
472
|
-
var serverPropertySchemas = {
|
|
473
|
-
lead_created: {
|
|
474
|
-
conversionId: "identifier",
|
|
475
|
-
formId: "identifier",
|
|
476
|
-
formType: "enum",
|
|
477
|
-
customerRef: "identifier"
|
|
478
|
-
},
|
|
479
|
-
conversion: {
|
|
480
|
-
conversionId: "identifier",
|
|
481
|
-
conversionType: "enum",
|
|
482
|
-
attributionConfidence: "enum",
|
|
483
|
-
bookingSignalSource: "enum",
|
|
484
|
-
bookingProvider: "enum",
|
|
485
|
-
redirectStatus: "enum",
|
|
486
|
-
importId: "identifier"
|
|
487
|
-
},
|
|
488
|
-
checkout_completed: revenuePropertySchema(),
|
|
489
|
-
payment_succeeded: revenuePropertySchema(),
|
|
490
|
-
subscription_started: revenuePropertySchema(),
|
|
491
|
-
purchase_completed: revenuePropertySchema(),
|
|
492
|
-
trial_started: revenuePropertySchema()
|
|
493
|
-
};
|
|
494
|
-
function revenuePropertySchema() {
|
|
495
|
-
return {
|
|
496
|
-
conversionId: "identifier",
|
|
497
|
-
checkoutId: "identifier",
|
|
498
|
-
customerRef: "identifier",
|
|
499
|
-
amount: "amount",
|
|
500
|
-
currency: "enum",
|
|
501
|
-
planId: "identifier",
|
|
502
|
-
productId: "identifier"
|
|
503
|
-
};
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
// ../shared/dist/assets.js
|
|
507
|
-
import { z as z9 } from "zod";
|
|
508
|
-
var ASSET_STAGES = ["staging", "final", "deleted"];
|
|
509
|
-
var ASSET_VISIBILITIES = ["private", "public", "deleted"];
|
|
510
|
-
var ASSET_USAGE_ENTITY_TYPES = [
|
|
511
|
-
"branding",
|
|
512
|
-
"draft",
|
|
513
|
-
"change_set",
|
|
514
|
-
"published_value"
|
|
515
|
-
];
|
|
516
|
-
var assetStageSchema = z9.enum(ASSET_STAGES);
|
|
517
|
-
var assetVisibilitySchema = z9.enum(ASSET_VISIBILITIES);
|
|
518
|
-
var assetUsageEntityTypeSchema = z9.enum(ASSET_USAGE_ENTITY_TYPES);
|
|
519
|
-
var brandingAccentColorSchema = z9.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
|
|
520
|
-
|
|
521
|
-
// ../shared/dist/booking-contracts.js
|
|
522
|
-
import { z as z10 } from "zod";
|
|
523
|
-
var bookingStatuses = [
|
|
524
|
-
"pending_payment",
|
|
525
|
-
"confirmed",
|
|
526
|
-
"payment_expired",
|
|
527
|
-
"cancelled",
|
|
528
|
-
"no_show"
|
|
529
|
-
];
|
|
530
|
-
var bookingPaymentStatuses = [
|
|
531
|
-
"payment_not_required",
|
|
532
|
-
"checkout_open",
|
|
533
|
-
"processing",
|
|
534
|
-
"succeeded",
|
|
535
|
-
"failed",
|
|
536
|
-
"cancelled",
|
|
537
|
-
"expired"
|
|
538
|
-
];
|
|
539
|
-
var bookingAccountReadinessStatuses = [
|
|
540
|
-
"not_started",
|
|
541
|
-
"setup_required",
|
|
542
|
-
"under_review",
|
|
543
|
-
"payments_ready",
|
|
544
|
-
"payouts_restricted",
|
|
545
|
-
"payments_restricted",
|
|
546
|
-
"deactivated"
|
|
547
|
-
];
|
|
548
|
-
var bookingRefundStatuses = [
|
|
549
|
-
"none",
|
|
550
|
-
"pending",
|
|
551
|
-
"partially_refunded",
|
|
552
|
-
"refunded",
|
|
553
|
-
"failed"
|
|
554
|
-
];
|
|
555
|
-
var bookingDisputeStatuses = [
|
|
556
|
-
"none",
|
|
557
|
-
"needs_response",
|
|
558
|
-
"under_review",
|
|
559
|
-
"won",
|
|
560
|
-
"lost"
|
|
561
|
-
];
|
|
562
|
-
var bookingPaymentModes = [
|
|
563
|
-
"onsite_only",
|
|
564
|
-
"online_required",
|
|
565
|
-
"customer_choice"
|
|
566
|
-
];
|
|
567
|
-
var bookingPaymentCollectionTypes = [
|
|
568
|
-
"full_amount",
|
|
569
|
-
"deposit_percent"
|
|
570
|
-
];
|
|
571
|
-
var bookingResourceKinds = [
|
|
572
|
-
"person",
|
|
573
|
-
"room",
|
|
574
|
-
"equipment",
|
|
575
|
-
"other"
|
|
576
|
-
];
|
|
577
|
-
var bookingStatusSchema = z10.enum(bookingStatuses);
|
|
578
|
-
var bookingPaymentStatusSchema = z10.enum(bookingPaymentStatuses);
|
|
579
|
-
var bookingAccountReadinessStatusSchema = z10.enum(bookingAccountReadinessStatuses);
|
|
580
|
-
var bookingRefundStatusSchema = z10.enum(bookingRefundStatuses);
|
|
581
|
-
var bookingDisputeStatusSchema = z10.enum(bookingDisputeStatuses);
|
|
582
|
-
var bookingPaymentModeSchema = z10.enum(bookingPaymentModes);
|
|
583
|
-
var bookingPaymentCollectionTypeSchema = z10.enum(bookingPaymentCollectionTypes);
|
|
584
|
-
var bookingPaymentCollectionSchema = z10.discriminatedUnion("type", [
|
|
585
|
-
z10.object({ type: z10.literal("full_amount") }).strict(),
|
|
586
|
-
z10.object({
|
|
587
|
-
type: z10.literal("deposit_percent"),
|
|
588
|
-
depositPercent: z10.number().int().min(10).max(90)
|
|
589
|
-
}).strict()
|
|
590
|
-
]);
|
|
591
|
-
var bookingPaymentChoices = ["onsite", "online"];
|
|
592
|
-
var bookingPaymentChoiceSchema = z10.enum(bookingPaymentChoices);
|
|
593
|
-
var bookingPaymentSnapshotSchema = z10.object({
|
|
594
|
-
snapshotId: z10.string().uuid(),
|
|
595
|
-
snapshotVersion: z10.number().int().positive(),
|
|
596
|
-
currency: z10.literal("EUR"),
|
|
597
|
-
totalAmountCents: z10.number().int().min(0),
|
|
598
|
-
onlineAmountCents: z10.number().int().min(0),
|
|
599
|
-
onsiteRemainderCents: z10.number().int().min(0),
|
|
600
|
-
maxStripeRefundAmountCents: z10.number().int().min(0)
|
|
601
|
-
}).strict().superRefine((snapshot, context) => {
|
|
602
|
-
if (snapshot.onlineAmountCents + snapshot.onsiteRemainderCents !== snapshot.totalAmountCents) {
|
|
603
|
-
context.addIssue({
|
|
604
|
-
code: "custom",
|
|
605
|
-
message: "Payment snapshot amounts must add up to the total amount."
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
if (snapshot.maxStripeRefundAmountCents > snapshot.onlineAmountCents) {
|
|
609
|
-
context.addIssue({
|
|
610
|
-
code: "custom",
|
|
611
|
-
message: "Stripe refund basis cannot exceed the online amount."
|
|
612
|
-
});
|
|
613
|
-
}
|
|
614
|
-
});
|
|
615
|
-
var bookingServiceVariantSchema = z10.object({
|
|
616
|
-
id: z10.string().uuid(),
|
|
617
|
-
name: z10.string().trim().min(1).max(120),
|
|
618
|
-
durationMinutes: z10.number().int().min(1).max(1440),
|
|
619
|
-
priceCents: z10.number().int().min(0).nullable()
|
|
620
|
-
}).strict();
|
|
621
|
-
var bookingServiceVariantsSchema = z10.array(bookingServiceVariantSchema).min(1).max(20);
|
|
622
|
-
var isoDateSchema = z10.string().regex(/^\d{4}-\d{2}-\d{2}$/);
|
|
623
|
-
var utcDateTimeSchema = z10.string().datetime();
|
|
624
|
-
var bookingLocalTimeSchema = z10.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
|
|
625
|
-
var bookingAvailabilityIntervalsSchema = z10.array(z10.object({
|
|
626
|
-
start: bookingLocalTimeSchema,
|
|
627
|
-
end: bookingLocalTimeSchema
|
|
628
|
-
}).strict().refine((interval) => interval.end > interval.start)).superRefine((intervals, context) => {
|
|
629
|
-
const sorted = [...intervals].sort((left, right) => left.start.localeCompare(right.start));
|
|
630
|
-
for (let index = 1; index < sorted.length; index += 1) {
|
|
631
|
-
if (sorted[index].start < sorted[index - 1].end) {
|
|
632
|
-
context.addIssue({
|
|
633
|
-
code: "custom",
|
|
634
|
-
message: "Booking availability intervals must not overlap."
|
|
635
|
-
});
|
|
636
|
-
return;
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
});
|
|
640
|
-
var bookingPublicConfigSchema = z10.object({
|
|
641
|
-
site: z10.object({
|
|
642
|
-
displayName: z10.string().trim().min(1),
|
|
643
|
-
timezone: z10.string().trim().min(1),
|
|
644
|
-
locale: z10.string().trim().min(2),
|
|
645
|
-
bookingPageSlug: z10.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
|
|
646
|
-
privacyUrl: z10.string().url().nullable()
|
|
647
|
-
}),
|
|
648
|
-
branding: z10.object({
|
|
649
|
-
logoUrl: z10.string().url().nullable(),
|
|
650
|
-
accentColor: z10.string().trim().min(1).nullable()
|
|
651
|
-
}),
|
|
652
|
-
settings: z10.object({
|
|
653
|
-
slotIntervalMinutes: z10.number().int().positive(),
|
|
654
|
-
minLeadMinutes: z10.number().int().min(0),
|
|
655
|
-
minCancelLeadMinutes: z10.number().int().min(0),
|
|
656
|
-
maxAdvanceDays: z10.number().int().min(1),
|
|
657
|
-
requirePhone: z10.boolean(),
|
|
658
|
-
collectNote: z10.boolean(),
|
|
659
|
-
confirmationMessage: z10.string().nullable()
|
|
660
|
-
}),
|
|
661
|
-
/** Freitexte des Salons, im Kassen-Schritt vor der Bestaetigung sichtbar. */
|
|
662
|
-
policies: z10.object({
|
|
663
|
-
cancellation: z10.string().nullable(),
|
|
664
|
-
lateArrival: z10.string().nullable()
|
|
665
|
-
}),
|
|
666
|
-
payment: z10.object({
|
|
667
|
-
mode: bookingPaymentModeSchema,
|
|
668
|
-
collection: bookingPaymentCollectionSchema,
|
|
669
|
-
onlinePaymentsReady: z10.boolean()
|
|
670
|
-
}).strict(),
|
|
671
|
-
serviceCategories: z10.array(z10.object({
|
|
672
|
-
id: z10.string().uuid(),
|
|
673
|
-
name: z10.string().trim().min(1),
|
|
674
|
-
sortOrder: z10.number().int()
|
|
675
|
-
})),
|
|
676
|
-
serviceSubcategories: z10.array(z10.object({
|
|
677
|
-
id: z10.string().uuid(),
|
|
678
|
-
categoryId: z10.string().uuid(),
|
|
679
|
-
name: z10.string().trim().min(1),
|
|
680
|
-
sortOrder: z10.number().int()
|
|
681
|
-
})),
|
|
682
|
-
services: z10.array(z10.object({
|
|
683
|
-
id: z10.string().trim().min(1),
|
|
684
|
-
name: z10.string().trim().min(1),
|
|
685
|
-
durationMinutes: z10.number().int().positive(),
|
|
686
|
-
priceCents: z10.number().int().min(0).nullable(),
|
|
687
|
-
currency: z10.string().regex(/^[A-Z]{3}$/),
|
|
688
|
-
description: z10.string().nullable(),
|
|
689
|
-
categoryId: z10.string().uuid(),
|
|
690
|
-
subcategoryId: z10.string().uuid().nullable(),
|
|
691
|
-
variants: bookingServiceVariantsSchema,
|
|
692
|
-
allowsAnyResource: z10.boolean(),
|
|
693
|
-
sortOrder: z10.number().int()
|
|
694
|
-
})),
|
|
695
|
-
resources: z10.array(z10.object({
|
|
696
|
-
id: z10.string().trim().min(1),
|
|
697
|
-
name: z10.string().trim().min(1),
|
|
698
|
-
kind: z10.enum(bookingResourceKinds),
|
|
699
|
-
/** Profilfoto für „Bei wem?“; `null` ohne Foto. */
|
|
700
|
-
photoUrl: z10.string().url().nullable()
|
|
701
|
-
})),
|
|
702
|
-
serviceResources: z10.array(z10.object({
|
|
703
|
-
serviceId: z10.string().trim().min(1),
|
|
704
|
-
resourceId: z10.string().trim().min(1)
|
|
705
|
-
}))
|
|
706
|
-
});
|
|
707
|
-
var bookingItemSchema = z10.object({
|
|
708
|
-
serviceId: z10.string().trim().min(1),
|
|
709
|
-
variantId: z10.string().trim().min(1)
|
|
710
|
-
}).strict();
|
|
711
|
-
var bookingItemsSchema = z10.array(bookingItemSchema).min(1).max(10);
|
|
712
|
-
function parseBookingItemsParam(value) {
|
|
713
|
-
const items = value.split(",").map((entry) => entry.trim()).filter((entry) => entry !== "").map((entry) => {
|
|
714
|
-
const [serviceId, variantId, ...rest] = entry.split(":");
|
|
715
|
-
return serviceId && variantId && rest.length === 0 ? { serviceId, variantId } : null;
|
|
716
|
-
});
|
|
717
|
-
return items.every((item) => item !== null) ? items : null;
|
|
718
|
-
}
|
|
719
|
-
var bookingSlotsQuerySchema = z10.object({
|
|
720
|
-
items: z10.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
|
|
721
|
-
resourceId: z10.string().trim().min(1).optional(),
|
|
722
|
-
fromDate: isoDateSchema,
|
|
723
|
-
toDate: isoDateSchema
|
|
724
|
-
});
|
|
725
|
-
var bookingSlotsResponseSchema = z10.object({
|
|
726
|
-
timezone: z10.string().trim().min(1),
|
|
727
|
-
items: bookingItemsSchema,
|
|
728
|
-
// Reine Behandlungsdauer ohne Puffer: das UI zeigt damit die Terminspanne,
|
|
729
|
-
// ohne selbst rechnen zu muessen.
|
|
730
|
-
totalDurationMinutes: z10.number().int().min(1),
|
|
731
|
-
mode: z10.enum(["any", "resource"]),
|
|
732
|
-
slots: z10.array(z10.object({
|
|
733
|
-
startUtc: utcDateTimeSchema,
|
|
734
|
-
resourceId: z10.string().trim().min(1).optional()
|
|
735
|
-
}))
|
|
736
|
-
});
|
|
737
|
-
var bookingAvailabilityQuerySchema = z10.object({
|
|
738
|
-
items: z10.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
|
|
739
|
-
resourceId: z10.string().trim().min(1).optional(),
|
|
740
|
-
fromDate: isoDateSchema,
|
|
741
|
-
toDate: isoDateSchema
|
|
742
|
-
});
|
|
743
|
-
var bookingAvailabilityResponseSchema = z10.object({
|
|
744
|
-
timezone: z10.string().trim().min(1),
|
|
745
|
-
totalDurationMinutes: z10.number().int().min(1),
|
|
746
|
-
days: z10.array(z10.object({
|
|
747
|
-
date: isoDateSchema,
|
|
748
|
-
hasSlots: z10.boolean()
|
|
749
|
-
})),
|
|
750
|
-
/** Erster Tag mit Slot ab `fromDate`, auch ausserhalb des Fensters. */
|
|
751
|
-
nextAvailableDate: isoDateSchema.nullable()
|
|
752
|
-
});
|
|
753
|
-
var bookingPublicErrorCodes = [
|
|
754
|
-
"slot_unavailable",
|
|
755
|
-
"validation_error",
|
|
756
|
-
"origin_not_allowed",
|
|
757
|
-
"invalid_key",
|
|
758
|
-
"rate_limited",
|
|
759
|
-
"payment_required",
|
|
760
|
-
"payment_unavailable",
|
|
761
|
-
"payment_amount_too_small",
|
|
762
|
-
"already_cancelled",
|
|
763
|
-
"too_late",
|
|
764
|
-
"not_found"
|
|
765
|
-
];
|
|
766
|
-
var bookingPublicErrorSchema = z10.object({
|
|
767
|
-
error: z10.enum(bookingPublicErrorCodes),
|
|
768
|
-
message: z10.string().optional(),
|
|
769
|
-
requestId: z10.string().optional()
|
|
770
|
-
}).strict();
|
|
771
|
-
var bookingCreateRequestSchema = z10.object({
|
|
772
|
-
items: bookingItemsSchema,
|
|
773
|
-
resourceId: z10.string().min(1).nullable(),
|
|
774
|
-
startUtc: utcDateTimeSchema,
|
|
775
|
-
customer: z10.object({
|
|
776
|
-
name: z10.string().min(1).max(120),
|
|
777
|
-
email: z10.string().email().max(254),
|
|
778
|
-
phone: z10.string().max(32).optional(),
|
|
779
|
-
note: z10.string().max(1e3).optional()
|
|
780
|
-
}).strict(),
|
|
781
|
-
hp: z10.string().optional(),
|
|
782
|
-
clientToken: z10.string().uuid(),
|
|
783
|
-
paymentChoice: bookingPaymentChoiceSchema,
|
|
784
|
-
// Werbe-Einwilligung. Bestaetigung, Erinnerung und Storno-Link sind davon
|
|
785
|
-
// unabhaengig und werden immer versendet.
|
|
786
|
-
consent: z10.object({
|
|
787
|
-
marketingEmail: z10.boolean(),
|
|
788
|
-
marketingSms: z10.boolean()
|
|
789
|
-
}).strict().optional()
|
|
790
|
-
}).strict();
|
|
791
|
-
var bookingPublicPaymentResponseSchema = z10.object({
|
|
792
|
-
clientSecret: z10.string().min(1),
|
|
793
|
-
stripeAccountId: z10.string().startsWith("acct_")
|
|
794
|
-
}).strict();
|
|
795
|
-
var bookingCreateResponseSchema = z10.union([
|
|
796
|
-
z10.object({
|
|
797
|
-
status: z10.literal("confirmed"),
|
|
798
|
-
booking: z10.object({
|
|
799
|
-
id: z10.string().min(1),
|
|
800
|
-
startUtc: utcDateTimeSchema,
|
|
801
|
-
endUtc: utcDateTimeSchema,
|
|
802
|
-
timezone: z10.string().trim().min(1),
|
|
803
|
-
serviceName: z10.string().trim().min(1),
|
|
804
|
-
resourceName: z10.string().trim().min(1)
|
|
805
|
-
}).strict(),
|
|
806
|
-
manageUrl: z10.string().url(),
|
|
807
|
-
confirmationMessage: z10.string().nullable()
|
|
808
|
-
}).strict(),
|
|
809
|
-
z10.object({
|
|
810
|
-
status: z10.literal("pending_payment"),
|
|
811
|
-
bookingId: z10.string().min(1),
|
|
812
|
-
holdExpiresAt: utcDateTimeSchema,
|
|
813
|
-
payment: bookingPublicPaymentResponseSchema,
|
|
814
|
-
statusToken: z10.string().min(20),
|
|
815
|
-
manageUrl: z10.string().url().optional()
|
|
816
|
-
}).strict(),
|
|
817
|
-
bookingPublicErrorSchema
|
|
818
|
-
]);
|
|
819
|
-
var bookingStatusResponseSchema = z10.object({
|
|
820
|
-
bookingStatus: bookingStatusSchema,
|
|
821
|
-
paymentStatus: bookingPaymentStatusSchema,
|
|
822
|
-
refundStatus: bookingRefundStatusSchema,
|
|
823
|
-
disputeStatus: bookingDisputeStatusSchema,
|
|
824
|
-
holdExpiresAt: utcDateTimeSchema.nullable()
|
|
825
|
-
}).strict();
|
|
826
|
-
var bookingCancelRequestSchema = z10.object({
|
|
827
|
-
token: z10.string().min(20)
|
|
828
|
-
});
|
|
829
|
-
var bookingCancelResponseSchema = z10.union([
|
|
830
|
-
z10.object({
|
|
831
|
-
status: z10.enum(["cancelled", "already_cancelled", "too_late", "not_found"])
|
|
832
|
-
}),
|
|
833
|
-
bookingPublicErrorSchema
|
|
834
|
-
]);
|
|
835
|
-
var bookingMoveErrorCodes = [
|
|
836
|
-
"slot_unavailable",
|
|
837
|
-
"booking_not_movable",
|
|
838
|
-
"not_found"
|
|
839
|
-
];
|
|
840
|
-
var bookingMoveRequestSchema = z10.object({
|
|
841
|
-
bookingId: z10.string().uuid(),
|
|
842
|
-
newStartUtc: utcDateTimeSchema,
|
|
843
|
-
newResourceId: z10.string().uuid().optional(),
|
|
844
|
-
notifyCustomer: z10.boolean().default(false),
|
|
845
|
-
reason: z10.string().max(500).optional()
|
|
846
|
-
});
|
|
847
|
-
var bookingMoveResponseSchema = z10.union([
|
|
848
|
-
z10.object({
|
|
849
|
-
status: z10.literal("moved"),
|
|
850
|
-
bookingId: z10.string().uuid(),
|
|
851
|
-
startUtc: utcDateTimeSchema,
|
|
852
|
-
endUtc: utcDateTimeSchema,
|
|
853
|
-
resourceId: z10.string().uuid()
|
|
854
|
-
}),
|
|
855
|
-
z10.object({
|
|
856
|
-
error: z10.enum(bookingMoveErrorCodes),
|
|
857
|
-
message: z10.string().optional(),
|
|
858
|
-
requestId: z10.string().optional()
|
|
859
|
-
})
|
|
860
|
-
]);
|
|
861
|
-
var bookingManifestSchema = z10.object({
|
|
862
|
-
schemaVersion: z10.number().int().positive(),
|
|
863
|
-
siteId: z10.string().trim().min(1),
|
|
864
|
-
bookingPageSlug: z10.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
|
|
865
|
-
integration: z10.literal("rewrite").optional(),
|
|
866
|
-
productionOrigin: z10.string().url().optional()
|
|
867
|
-
}).passthrough();
|
|
868
|
-
var secretManifestKeys = /* @__PURE__ */ new Set([
|
|
869
|
-
"siteKey",
|
|
870
|
-
"rawKey",
|
|
871
|
-
"token",
|
|
872
|
-
"accessToken"
|
|
873
|
-
]);
|
|
874
|
-
function redactBookingManifest(value) {
|
|
875
|
-
if (Array.isArray(value)) {
|
|
876
|
-
return value.map((item) => redactBookingManifest(item));
|
|
877
|
-
}
|
|
878
|
-
if (value && typeof value === "object") {
|
|
879
|
-
return Object.fromEntries(Object.entries(value).filter(([key]) => !secretManifestKeys.has(key)).map(([key, item]) => [key, redactBookingManifest(item)]));
|
|
880
|
-
}
|
|
881
|
-
return value;
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
// ../shared/dist/booking-defaults.js
|
|
885
|
-
var BOOKING_CREATE_PAYLOAD_LIMIT_BYTES = 16 * 1024;
|
|
886
|
-
|
|
887
|
-
// ../shared/dist/bridge-protocol.js
|
|
888
|
-
import { z as z17 } from "zod";
|
|
889
|
-
|
|
890
|
-
// ../shared/dist/field-id.js
|
|
891
|
-
import { z as z11 } from "zod";
|
|
892
|
-
var FIELD_ID_PATTERN = /^[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+$/;
|
|
893
|
-
var fieldIdSchema = z11.string().regex(FIELD_ID_PATTERN, "Invalid field id");
|
|
894
|
-
|
|
895
|
-
// ../shared/dist/field-types.js
|
|
896
|
-
import { z as z12 } from "zod";
|
|
897
|
-
var FIELD_TYPES = ["text", "longText", "image", "link"];
|
|
898
|
-
var fieldTypeSchema = z12.enum(FIELD_TYPES);
|
|
899
|
-
|
|
900
|
-
// ../shared/dist/image-value.js
|
|
901
|
-
import { z as z13 } from "zod";
|
|
902
|
-
var SUPPORTED_IMAGE_CONTENT_TYPES = [
|
|
903
|
-
"image/jpeg",
|
|
904
|
-
"image/png",
|
|
905
|
-
"image/webp",
|
|
906
|
-
"image/avif"
|
|
907
|
-
];
|
|
908
|
-
var maxImageUploadBytes = 10 * 1024 * 1024;
|
|
909
|
-
var largeImageWarningBytes = 2 * 1024 * 1024;
|
|
910
|
-
var imageContentTypeSchema = z13.enum(SUPPORTED_IMAGE_CONTENT_TYPES);
|
|
911
|
-
var imageCropSchema = z13.object({
|
|
912
|
-
x: z13.number().min(0).max(100),
|
|
913
|
-
y: z13.number().min(0).max(100),
|
|
914
|
-
zoom: z13.number().min(1).max(4),
|
|
915
|
-
aspectRatio: z13.number().positive().max(10)
|
|
916
|
-
});
|
|
917
|
-
var imageValueSchema = z13.object({
|
|
918
|
-
src: z13.string().trim().min(1),
|
|
919
|
-
alt: z13.string().trim().min(1).max(300),
|
|
920
|
-
width: z13.number().int().positive().optional(),
|
|
921
|
-
height: z13.number().int().positive().optional(),
|
|
922
|
-
crop: imageCropSchema.optional(),
|
|
923
|
-
assetId: z13.string().uuid().optional(),
|
|
924
|
-
finalStorageProvider: z13.enum([
|
|
925
|
-
"repo_static_assets",
|
|
926
|
-
"repo_handoff",
|
|
927
|
-
"site_owned_storage",
|
|
928
|
-
"siteplane_managed_fallback"
|
|
929
|
-
]).optional()
|
|
930
|
-
});
|
|
931
|
-
|
|
932
|
-
// ../shared/dist/missing-content.js
|
|
933
|
-
import { z as z14 } from "zod";
|
|
934
|
-
var MISSING_CONTENT_RENDERED_PATH_MAX_BYTES = 512;
|
|
935
|
-
var MISSING_CONTENT_VISIBLE_VALUE_MAX_BYTES = 256;
|
|
936
|
-
var MISSING_CONTENT_LOCATOR_HINT_MAX_BYTES = 512;
|
|
937
|
-
var MISSING_CONTENT_LABEL_MAX_BYTES = 120;
|
|
938
|
-
var forbiddenControlOrBidi = /[\u0000-\u001f\u007f-\u009f--]/u;
|
|
939
|
-
var unsafeLocator = /<\/?[a-z][^>]*>|\b(?:javascript|data:text\/html)\s*:|\bon[a-z]+\s*=/iu;
|
|
940
|
-
var renderedPathSchema = z14.string().trim().transform((value) => value !== "/" ? value.replace(/\/+$/u, "") : value).superRefine((value, context) => {
|
|
941
|
-
if (!value.startsWith("/") || value === "$global" || value.includes("?") || value.includes("#")) {
|
|
942
|
-
context.addIssue({
|
|
943
|
-
code: "custom",
|
|
944
|
-
message: "renderedPath must be a canonical real path."
|
|
945
|
-
});
|
|
946
|
-
}
|
|
947
|
-
addSafeByteIssues(value, MISSING_CONTENT_RENDERED_PATH_MAX_BYTES, "renderedPath", context);
|
|
948
|
-
});
|
|
949
|
-
function normalizedSafeTextSchema(maxBytes, label) {
|
|
950
|
-
return z14.string().transform((value) => value.trim().replace(new RegExp("\\p{White_Space}+", "gu"), " ")).pipe(z14.string().min(1)).superRefine((value, context) => {
|
|
951
|
-
addSafeByteIssues(value, maxBytes, label, context);
|
|
952
|
-
if (label === "locatorHint" && unsafeLocator.test(value)) {
|
|
953
|
-
context.addIssue({
|
|
954
|
-
code: "custom",
|
|
955
|
-
message: "locatorHint contains unsafe markup or executable content."
|
|
956
|
-
});
|
|
957
|
-
}
|
|
958
|
-
});
|
|
959
|
-
}
|
|
960
|
-
var missingContentItemBase = {
|
|
961
|
-
renderedPath: renderedPathSchema,
|
|
962
|
-
visibleValue: normalizedSafeTextSchema(MISSING_CONTENT_VISIBLE_VALUE_MAX_BYTES, "visibleValue"),
|
|
963
|
-
locatorHint: normalizedSafeTextSchema(MISSING_CONTENT_LOCATOR_HINT_MAX_BYTES, "locatorHint"),
|
|
964
|
-
requestedLabel: normalizedSafeTextSchema(MISSING_CONTENT_LABEL_MAX_BYTES, "requestedLabel").optional(),
|
|
965
|
-
requestedSection: normalizedSafeTextSchema(MISSING_CONTENT_LABEL_MAX_BYTES, "requestedSection").optional(),
|
|
966
|
-
requestedSubsection: normalizedSafeTextSchema(MISSING_CONTENT_LABEL_MAX_BYTES, "requestedSubsection").optional(),
|
|
967
|
-
requestedSortOrder: z14.number().int().nonnegative().optional()
|
|
968
|
-
};
|
|
969
|
-
var missingContentItemSchema = z14.discriminatedUnion("kind", [
|
|
970
|
-
z14.object({ kind: z14.literal("text"), ...missingContentItemBase }).strict(),
|
|
971
|
-
z14.object({ kind: z14.literal("link"), ...missingContentItemBase }).strict(),
|
|
972
|
-
z14.object({ kind: z14.literal("image"), ...missingContentItemBase }).strict()
|
|
973
|
-
]).superRefine((item, context) => {
|
|
974
|
-
if (item.requestedSubsection && !item.requestedSection) {
|
|
975
|
-
context.addIssue({
|
|
976
|
-
code: "custom",
|
|
977
|
-
message: "requestedSubsection requires requestedSection.",
|
|
978
|
-
path: ["requestedSubsection"]
|
|
979
|
-
});
|
|
980
|
-
}
|
|
981
|
-
});
|
|
982
|
-
function addSafeByteIssues(value, maxBytes, label, context) {
|
|
983
|
-
if (new TextEncoder().encode(value).byteLength > maxBytes) {
|
|
984
|
-
context.addIssue({
|
|
985
|
-
code: "custom",
|
|
986
|
-
message: `${label} exceeds ${maxBytes} UTF-8 bytes.`
|
|
987
|
-
});
|
|
988
|
-
}
|
|
989
|
-
if (forbiddenControlOrBidi.test(value)) {
|
|
990
|
-
context.addIssue({
|
|
991
|
-
code: "custom",
|
|
992
|
-
message: `${label} contains a forbidden control or bidi character.`
|
|
993
|
-
});
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
|
|
997
|
-
// ../shared/dist/site-field-contract.js
|
|
998
|
-
import { z as z16 } from "zod";
|
|
999
|
-
|
|
1000
|
-
// ../shared/dist/fallback-hash.js
|
|
1001
|
-
import { z as z15 } from "zod";
|
|
1002
|
-
var SAFE_REPRESENTATION_REASONS = [
|
|
1003
|
-
"asset_import_rewritten",
|
|
1004
|
-
"relative_url_normalized",
|
|
1005
|
-
"line_endings_normalized",
|
|
1006
|
-
"image_value_serialized"
|
|
1007
|
-
];
|
|
1008
|
-
var safeRepresentationReasonSchema = z15.enum(SAFE_REPRESENTATION_REASONS);
|
|
1009
|
-
var linkFallbackSchema = z15.object({
|
|
1010
|
-
href: z15.string().trim().min(1),
|
|
1011
|
-
label: z15.string().trim().min(1).optional(),
|
|
1012
|
-
target: z15.enum(["_self", "_blank"]).optional()
|
|
1013
|
-
}).passthrough();
|
|
1014
|
-
|
|
1015
|
-
// ../shared/dist/site-field-contract.js
|
|
1016
|
-
var siteFieldStatusSchema = z16.enum(["hidden", "active"]);
|
|
1017
|
-
var semanticVersionSchema = z16.string().regex(/^\d+\.\d+\.\d+$/u);
|
|
1018
|
-
var siteFieldRouteKeySchema = z16.string().trim().refine((value) => value === "$global" || value.startsWith("/") && !value.includes("?") && !value.includes("#") && (value === "/" || !value.endsWith("/")), "Route keys must be canonical paths or $global.");
|
|
1019
|
-
var repositoryRelativePosixPathSchema = z16.string().trim().min(1).refine((value) => !value.startsWith("/") && !value.includes("\\") && !/^[a-z]:/iu.test(value) && !value.split("/").includes(".."), "Source paths must be repository-relative POSIX paths.");
|
|
1020
|
-
var sourceMappingSchema = z16.object({
|
|
1021
|
-
kind: z16.literal("function"),
|
|
1022
|
-
filePath: repositoryRelativePosixPathSchema,
|
|
1023
|
-
exportName: z16.string().trim().min(1).optional(),
|
|
1024
|
-
sourcePath: z16.string().trim().min(1).optional(),
|
|
1025
|
-
editTarget: fieldIdSchema.optional()
|
|
1026
|
-
}).strict();
|
|
1027
|
-
var domMappingSchema = z16.object({
|
|
1028
|
-
attribute: z16.literal("data-siteplane-field-id"),
|
|
1029
|
-
previewStrategy: z16.enum(["dom", "event"])
|
|
1030
|
-
}).strict();
|
|
1031
|
-
var fieldBaseSchema = z16.object({
|
|
1032
|
-
fieldId: fieldIdSchema,
|
|
1033
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1034
|
-
source: sourceMappingSchema,
|
|
1035
|
-
dom: domMappingSchema.optional()
|
|
1036
|
-
}).strict();
|
|
1037
|
-
var linkFallbackSchema2 = z16.object({
|
|
1038
|
-
href: z16.string().trim().min(1),
|
|
1039
|
-
label: z16.string().trim().min(1).optional(),
|
|
1040
|
-
target: z16.enum(["_self", "_blank"]).optional()
|
|
1041
|
-
}).strict();
|
|
1042
|
-
var imageFallbackSchema = z16.object({
|
|
1043
|
-
src: z16.string().trim().min(1),
|
|
1044
|
-
alt: z16.string().trim().max(300),
|
|
1045
|
-
width: z16.number().int().positive().optional(),
|
|
1046
|
-
height: z16.number().int().positive().optional(),
|
|
1047
|
-
crop: z16.object({
|
|
1048
|
-
x: z16.number().min(0).max(100),
|
|
1049
|
-
y: z16.number().min(0).max(100),
|
|
1050
|
-
zoom: z16.number().min(1).max(4),
|
|
1051
|
-
aspectRatio: z16.number().positive().max(10)
|
|
1052
|
-
}).strict().optional()
|
|
1053
|
-
}).strict();
|
|
1054
|
-
var siteFieldContractFieldSchema = z16.discriminatedUnion("fieldType", [
|
|
1055
|
-
fieldBaseSchema.extend({
|
|
1056
|
-
fieldType: z16.literal("text"),
|
|
1057
|
-
fallback: z16.string()
|
|
1058
|
-
}),
|
|
1059
|
-
fieldBaseSchema.extend({
|
|
1060
|
-
fieldType: z16.literal("longText"),
|
|
1061
|
-
fallback: z16.string()
|
|
1062
|
-
}),
|
|
1063
|
-
fieldBaseSchema.extend({
|
|
1064
|
-
fieldType: z16.literal("link"),
|
|
1065
|
-
fallback: linkFallbackSchema2
|
|
1066
|
-
}),
|
|
1067
|
-
fieldBaseSchema.extend({
|
|
1068
|
-
fieldType: z16.literal("image"),
|
|
1069
|
-
fallback: imageFallbackSchema
|
|
1070
|
-
})
|
|
1071
|
-
]);
|
|
1072
|
-
var siteFieldContractV1Schema = z16.object({
|
|
1073
|
-
version: z16.literal(1),
|
|
1074
|
-
fieldContractVersion: semanticVersionSchema,
|
|
1075
|
-
scannerContractVersion: semanticVersionSchema,
|
|
1076
|
-
fields: z16.array(siteFieldContractFieldSchema)
|
|
1077
|
-
}).strict().superRefine((contract, context) => {
|
|
1078
|
-
const seen = /* @__PURE__ */ new Set();
|
|
1079
|
-
for (const [index, field] of contract.fields.entries()) {
|
|
1080
|
-
if (seen.has(field.fieldId)) {
|
|
1081
|
-
context.addIssue({
|
|
1082
|
-
code: "custom",
|
|
1083
|
-
message: `Duplicate field id: ${field.fieldId}`,
|
|
1084
|
-
path: ["fields", index, "fieldId"]
|
|
1085
|
-
});
|
|
1086
|
-
}
|
|
1087
|
-
seen.add(field.fieldId);
|
|
1088
|
-
}
|
|
1089
|
-
});
|
|
1090
|
-
|
|
1091
|
-
// ../shared/dist/bridge-protocol.js
|
|
1092
|
-
var BRIDGE_PROTOCOL_VERSION = 2;
|
|
1093
|
-
var bridgeRectSchema = z17.object({
|
|
1094
|
-
x: z17.number(),
|
|
1095
|
-
y: z17.number(),
|
|
1096
|
-
width: z17.number().nonnegative(),
|
|
1097
|
-
height: z17.number().nonnegative()
|
|
1098
|
-
});
|
|
1099
|
-
var previewTextValueSchema = z17.object({
|
|
1100
|
-
fieldType: z17.enum(["text", "longText"]),
|
|
1101
|
-
value: z17.string()
|
|
1102
|
-
});
|
|
1103
|
-
var previewLinkValueSchema = z17.object({
|
|
1104
|
-
fieldType: z17.literal("link"),
|
|
1105
|
-
value: z17.object({
|
|
1106
|
-
href: z17.string().trim().min(1),
|
|
1107
|
-
label: z17.string().trim().min(1).optional()
|
|
1108
|
-
})
|
|
1109
|
-
});
|
|
1110
|
-
var previewImageValueSchema = z17.object({
|
|
1111
|
-
fieldType: z17.literal("image"),
|
|
1112
|
-
value: imageValueSchema
|
|
1113
|
-
});
|
|
1114
|
-
var bridgePreviewValueSchema = z17.discriminatedUnion("fieldType", [
|
|
1115
|
-
previewTextValueSchema,
|
|
1116
|
-
previewLinkValueSchema,
|
|
1117
|
-
previewImageValueSchema
|
|
1118
|
-
]);
|
|
1119
|
-
var fieldSelectionModeSchema = z17.enum(["replace", "range", "toggle"]);
|
|
1120
|
-
var fieldBridgeMissingContentActionSchema = z17.enum([
|
|
1121
|
-
"add",
|
|
1122
|
-
"select",
|
|
1123
|
-
"remove"
|
|
1124
|
-
]);
|
|
1125
|
-
var FIELD_BRIDGE_MESSAGE_TYPES = [
|
|
1126
|
-
"siteplane:field-bridge:init",
|
|
1127
|
-
"siteplane:field-bridge:ready",
|
|
1128
|
-
"siteplane:field-bridge:fields",
|
|
1129
|
-
"siteplane:field-bridge:select-field",
|
|
1130
|
-
"siteplane:field-bridge:set-selected-field",
|
|
1131
|
-
"siteplane:field-bridge:apply-preview-values",
|
|
1132
|
-
"siteplane:field-bridge:test-preview-values",
|
|
1133
|
-
"siteplane:field-bridge:preview-ack",
|
|
1134
|
-
"siteplane:field-bridge:set-visual-control-state",
|
|
1135
|
-
"siteplane:field-bridge:missing-content",
|
|
1136
|
-
"siteplane:field-bridge:preview-scrolled",
|
|
1137
|
-
"siteplane:field-bridge:analytics-probe",
|
|
1138
|
-
"siteplane:field-bridge:analytics-probe-result",
|
|
1139
|
-
"siteplane:field-bridge:error"
|
|
1140
|
-
];
|
|
1141
|
-
var canonicalFieldContractHashSchema = z17.string().regex(/^sha256:[0-9a-f]{64}$/u);
|
|
1142
|
-
var bridgeSectionSchema = z17.string().trim().min(1).max(256);
|
|
1143
|
-
var realRenderedPathSchema = z17.string().trim().refine((value) => value.startsWith("/") && value !== "$global" && !value.includes("?") && !value.includes("#"), "A field bridge rendered path must be a real canonical path.");
|
|
1144
|
-
var fieldBridgeIdentitySchema = z17.object({
|
|
1145
|
-
publicRuntimeKeyId: z17.string().uuid(),
|
|
1146
|
-
fieldContractHash: canonicalFieldContractHashSchema,
|
|
1147
|
-
deploymentRevision: z17.string().trim().min(1).max(256)
|
|
1148
|
-
}).strict();
|
|
1149
|
-
var fieldBridgeBaseSchema = z17.object({
|
|
1150
|
-
version: z17.literal(BRIDGE_PROTOCOL_VERSION),
|
|
1151
|
-
type: z17.enum(FIELD_BRIDGE_MESSAGE_TYPES),
|
|
1152
|
-
siteId: z17.string().uuid(),
|
|
1153
|
-
sessionId: z17.string().trim().min(1),
|
|
1154
|
-
publicRuntimeKeyId: z17.string().uuid(),
|
|
1155
|
-
fieldContractHash: canonicalFieldContractHashSchema,
|
|
1156
|
-
deploymentRevision: z17.string().trim().min(1).max(256),
|
|
1157
|
-
requestId: z17.string().trim().min(1),
|
|
1158
|
-
sentAt: z17.string().datetime()
|
|
1159
|
-
}).strict();
|
|
1160
|
-
var fieldBridgeFieldSchema = z17.object({
|
|
1161
|
-
fieldId: fieldIdSchema,
|
|
1162
|
-
fieldType: fieldTypeSchema,
|
|
1163
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1164
|
-
renderedPath: realRenderedPathSchema,
|
|
1165
|
-
sourcePath: z17.string().trim().min(1).optional(),
|
|
1166
|
-
editTarget: fieldIdSchema,
|
|
1167
|
-
rect: bridgeRectSchema,
|
|
1168
|
-
targetResolved: z17.literal(true),
|
|
1169
|
-
currentValue: bridgePreviewValueSchema.optional()
|
|
1170
|
-
}).strict();
|
|
1171
|
-
var fieldBridgeInitMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1172
|
-
type: z17.literal("siteplane:field-bridge:init"),
|
|
1173
|
-
payload: z17.object({
|
|
1174
|
-
adminOrigin: z17.string().url(),
|
|
1175
|
-
customerOrigin: z17.string().url(),
|
|
1176
|
-
renderedPath: realRenderedPathSchema
|
|
1177
|
-
}).strict()
|
|
1178
|
-
});
|
|
1179
|
-
var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1180
|
-
type: z17.literal("siteplane:field-bridge:ready"),
|
|
1181
|
-
payload: z17.object({
|
|
1182
|
-
renderedPath: realRenderedPathSchema,
|
|
1183
|
-
fieldCount: z17.number().int().nonnegative(),
|
|
1184
|
-
capabilities: z17.tuple([
|
|
1185
|
-
z17.literal("field_selection"),
|
|
1186
|
-
z17.literal("preview_values"),
|
|
1187
|
-
z17.literal("field_evidence"),
|
|
1188
|
-
z17.literal("visual_field_control")
|
|
1189
|
-
]).rest(z17.enum(["analytics_preview_readiness"])).refine((capabilities) => capabilities.length <= 5)
|
|
1190
|
-
}).strict()
|
|
1191
|
-
});
|
|
1192
|
-
var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1193
|
-
type: z17.literal("siteplane:field-bridge:fields"),
|
|
1194
|
-
payload: z17.object({
|
|
1195
|
-
renderedPath: realRenderedPathSchema,
|
|
1196
|
-
fields: z17.array(fieldBridgeFieldSchema)
|
|
1197
|
-
}).strict()
|
|
1198
|
-
});
|
|
1199
|
-
var fieldBridgeSelectFieldMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1200
|
-
type: z17.literal("siteplane:field-bridge:select-field"),
|
|
1201
|
-
payload: z17.object({
|
|
1202
|
-
fieldId: fieldIdSchema,
|
|
1203
|
-
selectionMode: fieldSelectionModeSchema
|
|
1204
|
-
}).strict()
|
|
1205
|
-
});
|
|
1206
|
-
var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1207
|
-
type: z17.literal("siteplane:field-bridge:set-selected-field"),
|
|
1208
|
-
payload: z17.object({
|
|
1209
|
-
fieldIds: z17.array(fieldIdSchema).max(200),
|
|
1210
|
-
primaryFieldId: fieldIdSchema.nullable(),
|
|
1211
|
-
scrollIntoView: z17.boolean().optional()
|
|
1212
|
-
}).strict().superRefine((value, context) => {
|
|
1213
|
-
if (value.fieldIds.length > 0 && value.primaryFieldId === null) {
|
|
1214
|
-
context.addIssue({
|
|
1215
|
-
code: "custom",
|
|
1216
|
-
message: "A non-empty selection needs a primary field.",
|
|
1217
|
-
path: ["primaryFieldId"]
|
|
1218
|
-
});
|
|
1219
|
-
}
|
|
1220
|
-
if (value.primaryFieldId !== null && !value.fieldIds.includes(value.primaryFieldId)) {
|
|
1221
|
-
context.addIssue({
|
|
1222
|
-
code: "custom",
|
|
1223
|
-
message: "The primary field must be part of the selection.",
|
|
1224
|
-
path: ["primaryFieldId"]
|
|
1225
|
-
});
|
|
1226
|
-
}
|
|
1227
|
-
})
|
|
1228
|
-
});
|
|
1229
|
-
var fieldBridgeApplyPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1230
|
-
type: z17.literal("siteplane:field-bridge:apply-preview-values"),
|
|
1231
|
-
payload: z17.object({ values: z17.record(fieldIdSchema, bridgePreviewValueSchema) }).strict()
|
|
1232
|
-
});
|
|
1233
|
-
var fieldBridgeTestPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1234
|
-
type: z17.literal("siteplane:field-bridge:test-preview-values"),
|
|
1235
|
-
payload: z17.object({ fieldIds: z17.array(fieldIdSchema).min(1).max(200) }).strict()
|
|
1236
|
-
});
|
|
1237
|
-
var fieldBridgePreviewAckMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1238
|
-
type: z17.literal("siteplane:field-bridge:preview-ack"),
|
|
1239
|
-
payload: z17.object({
|
|
1240
|
-
ackRequestId: z17.string().trim().min(1),
|
|
1241
|
-
kind: z17.enum(["apply", "test"]),
|
|
1242
|
-
renderedPath: realRenderedPathSchema,
|
|
1243
|
-
fieldIds: z17.array(fieldIdSchema).max(200)
|
|
1244
|
-
}).strict()
|
|
1245
|
-
});
|
|
1246
|
-
var fieldBridgeSetVisualControlStateMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1247
|
-
type: z17.literal("siteplane:field-bridge:set-visual-control-state"),
|
|
1248
|
-
payload: z17.object({
|
|
1249
|
-
enabled: z17.boolean(),
|
|
1250
|
-
fieldProximityEnabled: z17.boolean(),
|
|
1251
|
-
pendingKeys: z17.array(z17.string().trim().min(1).max(2048)).max(50),
|
|
1252
|
-
activeFieldIds: z17.array(fieldIdSchema),
|
|
1253
|
-
fieldSections: z17.record(fieldIdSchema, bridgeSectionSchema),
|
|
1254
|
-
selectedPending: z17.array(z17.object({
|
|
1255
|
-
key: z17.string().trim().min(1).max(2048),
|
|
1256
|
-
locatorHint: z17.string().trim().min(1).max(2048)
|
|
1257
|
-
}).strict()).max(50),
|
|
1258
|
-
scrollPendingIntoView: z17.boolean().optional()
|
|
1259
|
-
}).strict()
|
|
1260
|
-
});
|
|
1261
|
-
var fieldBridgeMissingContentMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1262
|
-
type: z17.literal("siteplane:field-bridge:missing-content"),
|
|
1263
|
-
payload: z17.object({
|
|
1264
|
-
action: fieldBridgeMissingContentActionSchema,
|
|
1265
|
-
item: missingContentItemSchema,
|
|
1266
|
-
suggestedSection: bridgeSectionSchema.optional()
|
|
1267
|
-
}).strict()
|
|
1268
|
-
});
|
|
1269
|
-
var fieldBridgePreviewScrolledMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1270
|
-
type: z17.literal("siteplane:field-bridge:preview-scrolled"),
|
|
1271
|
-
payload: z17.object({ renderedPath: realRenderedPathSchema }).strict()
|
|
1272
|
-
});
|
|
1273
|
-
var analyticsPreviewChallengeSchema = z17.object({
|
|
1274
|
-
bridgeSessionId: z17.string().uuid(),
|
|
1275
|
-
challenge: z17.string().min(32).max(512),
|
|
1276
|
-
testRunId: z17.string().trim().min(1).max(160),
|
|
1277
|
-
expiresAt: z17.string().datetime()
|
|
1278
|
-
}).strict();
|
|
1279
|
-
var fieldBridgeAnalyticsProbeSchema = fieldBridgeBaseSchema.extend({
|
|
1280
|
-
type: z17.literal("siteplane:field-bridge:analytics-probe"),
|
|
1281
|
-
requestId: z17.string().min(1).max(256),
|
|
1282
|
-
payload: analyticsPreviewChallengeSchema
|
|
1283
|
-
});
|
|
1284
|
-
var fieldBridgeAnalyticsProbeResultSchema = fieldBridgeBaseSchema.extend({
|
|
1285
|
-
type: z17.literal("siteplane:field-bridge:analytics-probe-result"),
|
|
1286
|
-
payload: z17.object({
|
|
1287
|
-
ackRequestId: z17.string().min(1).max(256),
|
|
1288
|
-
status: z17.enum(["recorded", "failed"])
|
|
1289
|
-
}).strict()
|
|
1290
|
-
});
|
|
1291
|
-
var fieldBridgeErrorMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1292
|
-
type: z17.literal("siteplane:field-bridge:error"),
|
|
1293
|
-
payload: z17.object({
|
|
1294
|
-
code: z17.string().trim().min(1),
|
|
1295
|
-
message: z17.string().trim().min(1),
|
|
1296
|
-
recoverable: z17.boolean().default(false)
|
|
1297
|
-
}).strict()
|
|
1298
|
-
});
|
|
1299
|
-
var fieldBridgeMessageSchema = z17.discriminatedUnion("type", [
|
|
1300
|
-
fieldBridgeInitMessageSchema,
|
|
1301
|
-
fieldBridgeReadyMessageSchema,
|
|
1302
|
-
fieldBridgeFieldsMessageSchema,
|
|
1303
|
-
fieldBridgeSelectFieldMessageSchema,
|
|
1304
|
-
fieldBridgeSetSelectedFieldMessageSchema,
|
|
1305
|
-
fieldBridgeApplyPreviewValuesMessageSchema,
|
|
1306
|
-
fieldBridgeTestPreviewValuesMessageSchema,
|
|
1307
|
-
fieldBridgePreviewAckMessageSchema,
|
|
1308
|
-
fieldBridgeSetVisualControlStateMessageSchema,
|
|
1309
|
-
fieldBridgeMissingContentMessageSchema,
|
|
1310
|
-
fieldBridgePreviewScrolledMessageSchema,
|
|
1311
|
-
fieldBridgeErrorMessageSchema,
|
|
1312
|
-
fieldBridgeAnalyticsProbeSchema,
|
|
1313
|
-
fieldBridgeAnalyticsProbeResultSchema
|
|
1314
|
-
]);
|
|
1315
|
-
|
|
1316
|
-
// ../shared/dist/commands.js
|
|
1317
|
-
import { z as z19 } from "zod";
|
|
1318
|
-
|
|
1319
|
-
// ../shared/dist/errors.js
|
|
1320
|
-
import { z as z18 } from "zod";
|
|
1321
|
-
var UI_ERROR_CATEGORIES = [
|
|
1322
|
-
"site_member",
|
|
1323
|
-
"workspace_member",
|
|
1324
|
-
"internal"
|
|
1325
|
-
];
|
|
1326
|
-
var uiErrorCategorySchema = z18.enum(UI_ERROR_CATEGORIES);
|
|
1327
|
-
var commandErrorPayloadSchema = z18.object({
|
|
1328
|
-
code: z18.string().min(1),
|
|
1329
|
-
message: z18.string().min(1),
|
|
1330
|
-
category: uiErrorCategorySchema,
|
|
1331
|
-
details: z18.record(z18.string(), z18.unknown()).optional()
|
|
1332
|
-
});
|
|
1333
|
-
|
|
1334
|
-
// ../shared/dist/commands.js
|
|
1335
|
-
var commandSuccessSchema = z19.object({
|
|
1336
|
-
ok: z19.literal(true),
|
|
1337
|
-
data: z19.unknown()
|
|
1338
|
-
});
|
|
1339
|
-
var commandErrorSchema = z19.object({
|
|
1340
|
-
ok: z19.literal(false),
|
|
1341
|
-
error: commandErrorPayloadSchema
|
|
1342
|
-
});
|
|
1343
|
-
var commandResultSchema = z19.discriminatedUnion("ok", [
|
|
1344
|
-
commandSuccessSchema,
|
|
1345
|
-
commandErrorSchema
|
|
1346
|
-
]);
|
|
1347
|
-
|
|
1348
|
-
// ../shared/dist/editor-settings.js
|
|
1349
|
-
import { z as z20 } from "zod";
|
|
1350
|
-
var editorColorSchemeSchema = z20.enum([
|
|
1351
|
-
"paper",
|
|
1352
|
-
"slate",
|
|
1353
|
-
"siteplane",
|
|
1354
|
-
"bloom"
|
|
1355
|
-
]);
|
|
1356
|
-
var editorColorSchemes = editorColorSchemeSchema.options;
|
|
1357
|
-
var editorColorModeSchema = z20.enum(["light", "dark"]);
|
|
1358
|
-
var editorColorModes = editorColorModeSchema.options;
|
|
1359
|
-
|
|
1360
|
-
// ../shared/dist/editor-organization.js
|
|
1361
|
-
import { z as z21 } from "zod";
|
|
1362
|
-
var labelSchema = z21.string().trim().min(1).max(120);
|
|
1363
|
-
var updateFieldSchema = z21.object({
|
|
1364
|
-
operation: z21.literal("update_field"),
|
|
1365
|
-
siteId: z21.string().uuid(),
|
|
1366
|
-
fieldId: fieldIdSchema,
|
|
1367
|
-
label: labelSchema.optional(),
|
|
1368
|
-
description: z21.string().trim().max(500).nullable().optional(),
|
|
1369
|
-
section: labelSchema.nullable().optional(),
|
|
1370
|
-
subsection: labelSchema.nullable().optional(),
|
|
1371
|
-
sortOrder: z21.number().int().nonnegative().optional(),
|
|
1372
|
-
status: z21.enum(["hidden", "active"]).optional()
|
|
1373
|
-
});
|
|
1374
|
-
var updateEditorOrganizationInputSchema = z21.discriminatedUnion("operation", [
|
|
1375
|
-
updateFieldSchema,
|
|
1376
|
-
z21.object({
|
|
1377
|
-
operation: z21.literal("rename_section"),
|
|
1378
|
-
siteId: z21.string().uuid(),
|
|
1379
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1380
|
-
currentSection: labelSchema,
|
|
1381
|
-
nextSection: labelSchema
|
|
1382
|
-
}),
|
|
1383
|
-
z21.object({
|
|
1384
|
-
operation: z21.literal("create_group"),
|
|
1385
|
-
siteId: z21.string().uuid(),
|
|
1386
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1387
|
-
section: labelSchema,
|
|
1388
|
-
fieldIds: z21.array(fieldIdSchema).max(200).default([])
|
|
1389
|
-
}),
|
|
1390
|
-
z21.object({
|
|
1391
|
-
operation: z21.literal("delete_section"),
|
|
1392
|
-
siteId: z21.string().uuid(),
|
|
1393
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1394
|
-
section: labelSchema
|
|
1395
|
-
}),
|
|
1396
|
-
z21.object({
|
|
1397
|
-
operation: z21.literal("move_section"),
|
|
1398
|
-
siteId: z21.string().uuid(),
|
|
1399
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1400
|
-
section: labelSchema,
|
|
1401
|
-
direction: z21.enum(["up", "down"])
|
|
1402
|
-
}),
|
|
1403
|
-
z21.object({
|
|
1404
|
-
operation: z21.literal("create_subgroup"),
|
|
1405
|
-
siteId: z21.string().uuid(),
|
|
1406
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1407
|
-
section: labelSchema,
|
|
1408
|
-
subsection: labelSchema,
|
|
1409
|
-
fieldIds: z21.array(fieldIdSchema).min(1).max(200)
|
|
1410
|
-
}),
|
|
1411
|
-
z21.object({
|
|
1412
|
-
operation: z21.literal("update_subgroup"),
|
|
1413
|
-
siteId: z21.string().uuid(),
|
|
1414
|
-
routeKey: siteFieldRouteKeySchema,
|
|
1415
|
-
currentSection: labelSchema,
|
|
1416
|
-
currentSubsection: labelSchema,
|
|
1417
|
-
section: labelSchema,
|
|
1418
|
-
subsection: labelSchema.nullable()
|
|
1419
|
-
}),
|
|
1420
|
-
z21.object({
|
|
1421
|
-
operation: z21.literal("rename_route"),
|
|
1422
|
-
siteId: z21.string().uuid(),
|
|
1423
|
-
routeKey: siteFieldRouteKeySchema.refine((value) => value !== "$global", "Global content has no page label."),
|
|
1424
|
-
label: labelSchema
|
|
1425
|
-
})
|
|
1426
|
-
]).superRefine((input, context) => {
|
|
1427
|
-
if (input.operation === "update_field" && input.label === void 0 && input.description === void 0 && input.section === void 0 && input.subsection === void 0 && input.sortOrder === void 0 && input.status === void 0) {
|
|
1428
|
-
context.addIssue({
|
|
1429
|
-
code: "custom",
|
|
1430
|
-
message: "At least one field organization value is required."
|
|
1431
|
-
});
|
|
1432
|
-
}
|
|
1433
|
-
if (input.operation === "update_field" && input.section === null && typeof input.subsection === "string") {
|
|
1434
|
-
context.addIssue({
|
|
1435
|
-
code: "custom",
|
|
1436
|
-
message: "A subgroup requires a group.",
|
|
1437
|
-
path: ["subsection"]
|
|
1438
|
-
});
|
|
1439
|
-
}
|
|
1440
|
-
});
|
|
1441
|
-
|
|
1442
|
-
// ../shared/dist/site-slug.js
|
|
1443
|
-
import { z as z22 } from "zod";
|
|
1444
|
-
var SITE_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
1445
|
-
var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
|
|
1446
|
-
"account",
|
|
1447
|
-
"admin",
|
|
1448
|
-
"api",
|
|
1449
|
-
"app",
|
|
1450
|
-
"auth",
|
|
1451
|
-
"book",
|
|
1452
|
-
"claim",
|
|
1453
|
-
"dev",
|
|
1454
|
-
"login",
|
|
1455
|
-
"new",
|
|
1456
|
-
"portal",
|
|
1457
|
-
"support",
|
|
1458
|
-
"workspace"
|
|
1459
|
-
]);
|
|
1460
|
-
var siteSlugSchema = z22.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
|
|
1461
|
-
|
|
1462
|
-
// ../shared/dist/entitlements.js
|
|
1463
|
-
import { z as z23 } from "zod";
|
|
1464
|
-
var entitlementSnapshotSchema = z23.object({
|
|
1465
|
-
planKey: z23.string().trim().min(1),
|
|
1466
|
-
sitesLimit: z23.number().int().positive(),
|
|
1467
|
-
siteMembersPerSiteLimit: z23.number().int().positive(),
|
|
1468
|
-
customAdminDomainsEnabled: z23.boolean(),
|
|
1469
|
-
agentMcpEnabled: z23.boolean(),
|
|
1470
|
-
emailNotificationsEnabled: z23.boolean(),
|
|
1471
|
-
analyticsEnabled: z23.boolean(),
|
|
1472
|
-
analyticsSitesLimit: z23.number().int().min(0),
|
|
1473
|
-
analyticsPortalPerformanceEnabled: z23.boolean(),
|
|
1474
|
-
analyticsMonthlyReportsEnabled: z23.boolean(),
|
|
1475
|
-
analyticsAiSummaryEnabled: z23.boolean(),
|
|
1476
|
-
analyticsRawEventRetentionDays: z23.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
|
|
1477
|
-
analyticsMonthlyEventLimit: z23.number().int().min(0),
|
|
1478
|
-
bookingEnabled: z23.boolean().default(false),
|
|
1479
|
-
bookingSitesLimit: z23.number().int().min(0).default(0),
|
|
1480
|
-
bookingPortalManagementEnabled: z23.boolean().default(false),
|
|
1481
|
-
bookingResourcesPerSiteLimit: z23.number().int().min(0).default(0),
|
|
1482
|
-
bookingServicesPerSiteLimit: z23.number().int().min(0).default(0),
|
|
1483
|
-
bookingMonthlyBookingsLimit: z23.number().int().min(0).default(0),
|
|
1484
|
-
bookingRemindersEnabled: z23.boolean().default(false)
|
|
1485
|
-
});
|
|
1486
|
-
var EARLY_ACCESS_PLAN = {
|
|
1487
|
-
planKey: "early_access_2026",
|
|
1488
|
-
sitesLimit: 3,
|
|
1489
|
-
siteMembersPerSiteLimit: 5,
|
|
1490
|
-
customAdminDomainsEnabled: true,
|
|
1491
|
-
agentMcpEnabled: true,
|
|
1492
|
-
emailNotificationsEnabled: true,
|
|
1493
|
-
analyticsEnabled: true,
|
|
1494
|
-
analyticsSitesLimit: 3,
|
|
1495
|
-
analyticsPortalPerformanceEnabled: false,
|
|
1496
|
-
analyticsMonthlyReportsEnabled: false,
|
|
1497
|
-
analyticsAiSummaryEnabled: false,
|
|
1498
|
-
analyticsRawEventRetentionDays: ANALYTICS_RETENTION_DEFAULTS.enabledRawEventRetentionDays,
|
|
1499
|
-
analyticsMonthlyEventLimit: 0,
|
|
1500
|
-
bookingEnabled: true,
|
|
1501
|
-
bookingSitesLimit: 3,
|
|
1502
|
-
bookingPortalManagementEnabled: true,
|
|
1503
|
-
bookingResourcesPerSiteLimit: 10,
|
|
1504
|
-
bookingServicesPerSiteLimit: 50,
|
|
1505
|
-
bookingMonthlyBookingsLimit: 0,
|
|
1506
|
-
bookingRemindersEnabled: true
|
|
1507
|
-
};
|
|
1508
|
-
|
|
1509
|
-
// ../shared/dist/readiness.js
|
|
1510
|
-
import { z as z24 } from "zod";
|
|
1511
|
-
var READINESS_CHECK_KEYS = [
|
|
1512
|
-
"agent_instructions_installed",
|
|
1513
|
-
"runtime_package_connected",
|
|
1514
|
-
"secure_server_access_configured",
|
|
1515
|
-
"preview_bridge_working",
|
|
1516
|
-
"admin_access_url_selected",
|
|
1517
|
-
"default_publishing_mode_selected"
|
|
1518
|
-
];
|
|
1519
|
-
var READINESS_STATUSES = [
|
|
1520
|
-
"pending",
|
|
1521
|
-
"passing",
|
|
1522
|
-
"failing",
|
|
1523
|
-
"warning"
|
|
1524
|
-
];
|
|
1525
|
-
var readinessCheckKeySchema = z24.enum(READINESS_CHECK_KEYS);
|
|
1526
|
-
var readinessStatusSchema = z24.enum(READINESS_STATUSES);
|
|
1527
|
-
|
|
1528
|
-
// ../shared/dist/site.js
|
|
1529
|
-
import { z as z25 } from "zod";
|
|
1530
|
-
var SITE_STATUSES = ["active", "disabled", "archived"];
|
|
1531
|
-
var siteStatusSchema = z25.enum(SITE_STATUSES);
|
|
1532
|
-
var websiteUrlSchema = z25.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
|
|
1533
|
-
|
|
1534
|
-
// ../shared/dist/field-sync.js
|
|
1535
|
-
import { z as z26 } from "zod";
|
|
1536
|
-
var FIELD_SYNC_MAX_FIELDS = 2e3;
|
|
1537
|
-
var filePathSchema = z26.string().trim().min(1).max(500).refine((value) => !value.startsWith("/") && !value.includes("\\") && !/^[a-z]:/iu.test(value) && !value.split("/").includes(".."), "Use the file path relative to the project root.");
|
|
1538
|
-
var fieldBase = {
|
|
1539
|
-
id: fieldIdSchema.max(160),
|
|
1540
|
-
file: filePathSchema,
|
|
1541
|
-
label: z26.string().trim().min(1).max(120).optional()
|
|
1
|
+
import {
|
|
2
|
+
loadSiteValues
|
|
3
|
+
} from "./chunk-BLJCWIYD.js";
|
|
4
|
+
import "./chunk-KZ3AQ6OA.js";
|
|
5
|
+
|
|
6
|
+
// src/index.ts
|
|
7
|
+
import { cache } from "react";
|
|
8
|
+
|
|
9
|
+
// ../shared/dist/field-values.js
|
|
10
|
+
var FIELD_VALUE_LIMITS = {
|
|
11
|
+
text: 256,
|
|
12
|
+
longText: 5e4,
|
|
13
|
+
linkLabel: 256,
|
|
14
|
+
linkHref: 2048,
|
|
15
|
+
imageSrc: 2048,
|
|
16
|
+
imageAlt: 300,
|
|
17
|
+
imageSize: 1e5
|
|
1542
18
|
};
|
|
1543
|
-
var
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
}
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
}
|
|
1607
|
-
function
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
}
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
"
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
19
|
+
var linkKeys = ["href", "label"];
|
|
20
|
+
var fallbackImageKeys = ["src", "alt", "width", "height"];
|
|
21
|
+
var contentImageKeys = ["assetId", "src", "alt", "width", "height"];
|
|
22
|
+
var asciiBlank = /^[ \t\n\v\f\r]*$/u;
|
|
23
|
+
var uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
|
|
24
|
+
var webAddress = /^https?:\/\/[^/?#@]+(?:[/?#].*)?$/isu;
|
|
25
|
+
function fieldValueProblem(type, value, origin) {
|
|
26
|
+
switch (type) {
|
|
27
|
+
case "text":
|
|
28
|
+
case "longText":
|
|
29
|
+
if (typeof value !== "string")
|
|
30
|
+
return "not_text";
|
|
31
|
+
return codePoints(value) > FIELD_VALUE_LIMITS[type] ? "too_long" : null;
|
|
32
|
+
case "link":
|
|
33
|
+
return linkProblem(value);
|
|
34
|
+
case "image":
|
|
35
|
+
return imageProblem(value, origin);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function readFieldValue(type, value) {
|
|
39
|
+
const rendered = type === "link" ? pick(value, linkKeys) : type === "image" ? pick(value, fallbackImageKeys) : value;
|
|
40
|
+
return fieldValueProblem(type, rendered, "fallback") === null ? rendered : null;
|
|
41
|
+
}
|
|
42
|
+
function linkProblem(value) {
|
|
43
|
+
if (!isRecord(value))
|
|
44
|
+
return "not_object";
|
|
45
|
+
if (hasUnknownKey(value, linkKeys))
|
|
46
|
+
return "unknown_key";
|
|
47
|
+
if (!isHref(value.href))
|
|
48
|
+
return "href_invalid";
|
|
49
|
+
if (typeof value.label !== "string" || asciiBlank.test(value.label))
|
|
50
|
+
return "label_missing";
|
|
51
|
+
return codePoints(value.label) > FIELD_VALUE_LIMITS.linkLabel ? "label_too_long" : null;
|
|
52
|
+
}
|
|
53
|
+
function imageProblem(value, origin) {
|
|
54
|
+
if (!isRecord(value))
|
|
55
|
+
return "not_object";
|
|
56
|
+
if (hasUnknownKey(value, origin === "content" ? contentImageKeys : fallbackImageKeys))
|
|
57
|
+
return "unknown_key";
|
|
58
|
+
if (origin === "content" && (typeof value.assetId !== "string" || !uuidPattern.test(value.assetId))) {
|
|
59
|
+
return "asset_missing";
|
|
60
|
+
}
|
|
61
|
+
if (!isImageSource(value.src))
|
|
62
|
+
return "src_invalid";
|
|
63
|
+
if (typeof value.alt !== "string" || codePoints(value.alt) > FIELD_VALUE_LIMITS.imageAlt)
|
|
64
|
+
return "alt_invalid";
|
|
65
|
+
const sizeRequired = origin === "content";
|
|
66
|
+
for (const size of [value.width, value.height]) {
|
|
67
|
+
if (size === void 0 ? sizeRequired : !isImageSize(size))
|
|
68
|
+
return "size_invalid";
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function isHref(value) {
|
|
73
|
+
if (!isAddressText(value, FIELD_VALUE_LIMITS.linkHref))
|
|
74
|
+
return false;
|
|
75
|
+
return isSitePath(value) || value.startsWith("#") || webAddress.test(value) || /^mailto:.+$/isu.test(value) || /^tel:\+?[0-9][0-9().-]*$/iu.test(value);
|
|
76
|
+
}
|
|
77
|
+
function isImageSource(value) {
|
|
78
|
+
return isAddressText(value, FIELD_VALUE_LIMITS.imageSrc) && (isSitePath(value) || webAddress.test(value));
|
|
79
|
+
}
|
|
80
|
+
function isSitePath(value) {
|
|
81
|
+
return value.startsWith("/") && !value.startsWith("//");
|
|
82
|
+
}
|
|
83
|
+
function isAddressText(value, maxLength) {
|
|
84
|
+
if (typeof value !== "string" || value.length === 0 || codePoints(value) > maxLength)
|
|
85
|
+
return false;
|
|
86
|
+
for (const character of value) {
|
|
87
|
+
const code = character.codePointAt(0);
|
|
88
|
+
if (code <= 32 || code === 127 || character === "\\")
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
function isImageSize(value) {
|
|
94
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= FIELD_VALUE_LIMITS.imageSize;
|
|
95
|
+
}
|
|
96
|
+
function hasUnknownKey(value, keys) {
|
|
97
|
+
return Object.keys(value).some((key) => !keys.includes(key));
|
|
98
|
+
}
|
|
99
|
+
function pick(value, keys) {
|
|
100
|
+
if (!isRecord(value))
|
|
101
|
+
return value;
|
|
102
|
+
return Object.fromEntries(keys.filter((key) => key in value).map((key) => [key, value[key]]));
|
|
103
|
+
}
|
|
104
|
+
function codePoints(value) {
|
|
105
|
+
return Array.from(value).length;
|
|
106
|
+
}
|
|
107
|
+
function isRecord(value) {
|
|
108
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// src/runtime/fields.ts
|
|
112
|
+
function createFieldReaders(loadValues) {
|
|
113
|
+
async function read(type, fieldId, fallback) {
|
|
114
|
+
try {
|
|
115
|
+
const values = await loadValues();
|
|
116
|
+
if (!Object.prototype.hasOwnProperty.call(values, fieldId)) return fallback;
|
|
117
|
+
return readFieldValue(type, values[fieldId]) ?? fallback;
|
|
118
|
+
} catch {
|
|
119
|
+
return fallback;
|
|
1632
120
|
}
|
|
1633
|
-
return collectRedactedBookingKeys(value, path);
|
|
1634
|
-
});
|
|
1635
|
-
}
|
|
1636
|
-
|
|
1637
|
-
// ../cli/dist/booking/static-scan.js
|
|
1638
|
-
import ts from "typescript";
|
|
1639
|
-
function scanBookingSourceFiles(files, input) {
|
|
1640
|
-
const findings = [];
|
|
1641
|
-
const hardErrors = [];
|
|
1642
|
-
const warnings = [];
|
|
1643
|
-
for (const file of files) {
|
|
1644
|
-
let visit2 = function(node) {
|
|
1645
|
-
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "withSiteplane") {
|
|
1646
|
-
const options = node.arguments[1];
|
|
1647
|
-
const booking = options && property(options, "booking");
|
|
1648
|
-
const site = booking && property(booking, "site");
|
|
1649
|
-
if (site && ts.isStringLiteralLike(site)) {
|
|
1650
|
-
const issue = {
|
|
1651
|
-
code: site.text === input.siteId ? "booking_scan.integration_found" : "booking_scan.site_mismatch",
|
|
1652
|
-
message: site.text === input.siteId ? "Booking /booking rewrite configured for this Site ID." : "The Booking wrapper uses a different Site ID; use the Site ID supplied by Siteplane.",
|
|
1653
|
-
filePath: file.filePath
|
|
1654
|
-
};
|
|
1655
|
-
(site.text === input.siteId ? findings : hardErrors).push(issue);
|
|
1656
|
-
}
|
|
1657
|
-
}
|
|
1658
|
-
ts.forEachChild(node, visit2);
|
|
1659
|
-
};
|
|
1660
|
-
var visit = visit2;
|
|
1661
|
-
const source = ts.createSourceFile(file.filePath, file.sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
1662
|
-
visit2(source);
|
|
1663
121
|
}
|
|
1664
|
-
if (!findings.length && !hardErrors.length)
|
|
1665
|
-
hardErrors.push({
|
|
1666
|
-
code: "booking_scan.integration_missing",
|
|
1667
|
-
message: "Could not verify withSiteplane(nextConfig, { booking: { site: <site-id> } }). Include next.config.ts in the scan and use a literal Site ID.",
|
|
1668
|
-
filePath: "next.config.ts"
|
|
1669
|
-
});
|
|
1670
|
-
if (input.productionOrigin && !files.some((file) => file.sourceText.includes(input.productionOrigin)))
|
|
1671
|
-
warnings.push({
|
|
1672
|
-
code: "booking_scan.origin_not_detected",
|
|
1673
|
-
message: "Verify the public booking address and its allowed origins in Siteplane settings.",
|
|
1674
|
-
filePath: "siteplane.booking.json"
|
|
1675
|
-
});
|
|
1676
122
|
return {
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
findings,
|
|
1683
|
-
hardErrors,
|
|
1684
|
-
warnings,
|
|
1685
|
-
suggestions: []
|
|
123
|
+
text: (fieldId, fallback) => read("text", fieldId, fallback),
|
|
124
|
+
longText: (fieldId, fallback) => read("longText", fieldId, fallback),
|
|
125
|
+
link: (fieldId, fallback) => read("link", fieldId, fallback),
|
|
126
|
+
image: (fieldId, fallback) => read("image", fieldId, fallback),
|
|
127
|
+
attrs
|
|
1686
128
|
};
|
|
1687
129
|
}
|
|
1688
|
-
function
|
|
1689
|
-
|
|
1690
|
-
return;
|
|
1691
|
-
for (const item of node.properties) {
|
|
1692
|
-
if (ts.isPropertyAssignment(item) && (ts.isIdentifier(item.name) || ts.isStringLiteral(item.name)) && item.name.text === name)
|
|
1693
|
-
return item.initializer;
|
|
1694
|
-
}
|
|
130
|
+
function attrs(fieldId) {
|
|
131
|
+
return typeof fieldId === "string" ? { "data-siteplane-field": fieldId } : {};
|
|
1695
132
|
}
|
|
1696
133
|
|
|
1697
|
-
//
|
|
1698
|
-
|
|
1699
|
-
import { access, readFile as readFile2 } from "fs/promises";
|
|
1700
|
-
async function bookingCheckCommand(input) {
|
|
1701
|
-
const validatedManifest = await readBookingManifestFile(input.manifestPath);
|
|
1702
|
-
const configs = (await Promise.all(["next.config.ts", "next.config.js", "next.config.mjs"].map(async (name) => {
|
|
1703
|
-
const path = join(dirname2(input.manifestPath), name);
|
|
1704
|
-
return await access(path).then(() => path, () => null);
|
|
1705
|
-
}))).filter((path) => path !== null);
|
|
1706
|
-
const sourceFiles = await readSourceFiles([
|
|
1707
|
-
.../* @__PURE__ */ new Set([...input.sourceFilePaths, ...configs])
|
|
1708
|
-
]);
|
|
1709
|
-
const scanInput = {
|
|
1710
|
-
siteId: validatedManifest.manifest.siteId,
|
|
1711
|
-
bookingPageSlug: validatedManifest.manifest.bookingPageSlug,
|
|
1712
|
-
...validatedManifest.manifest.productionOrigin ? { productionOrigin: validatedManifest.manifest.productionOrigin } : {}
|
|
1713
|
-
};
|
|
1714
|
-
const scanResult = scanBookingSourceFiles(sourceFiles, {
|
|
1715
|
-
...scanInput
|
|
1716
|
-
});
|
|
1717
|
-
const hardErrors = [
|
|
1718
|
-
...createBoundaryErrors(validatedManifest),
|
|
1719
|
-
...scanResult.hardErrors
|
|
1720
|
-
];
|
|
1721
|
-
return {
|
|
1722
|
-
ok: hardErrors.length === 0,
|
|
1723
|
-
manifest: validatedManifest.manifest,
|
|
1724
|
-
scannedManifest: scanResult.manifest,
|
|
1725
|
-
redactedKeys: validatedManifest.redactedKeys,
|
|
1726
|
-
hardErrors,
|
|
1727
|
-
warnings: scanResult.warnings,
|
|
1728
|
-
suggestions: scanResult.suggestions,
|
|
1729
|
-
findings: scanResult.findings
|
|
1730
|
-
};
|
|
1731
|
-
}
|
|
1732
|
-
async function readSourceFiles(filePaths) {
|
|
1733
|
-
return Promise.all(filePaths.map(async (filePath) => ({
|
|
1734
|
-
filePath,
|
|
1735
|
-
sourceText: await readFile2(filePath, "utf8")
|
|
1736
|
-
})));
|
|
1737
|
-
}
|
|
1738
|
-
function createBoundaryErrors(validation) {
|
|
1739
|
-
return validation.redactedKeys.map((key) => ({
|
|
1740
|
-
code: "booking_check.raw_key_in_manifest",
|
|
1741
|
-
message: `Booking manifest contains a raw key-like field: ${key}`,
|
|
1742
|
-
filePath: "siteplane.booking.json"
|
|
1743
|
-
}));
|
|
1744
|
-
}
|
|
1745
|
-
|
|
1746
|
-
// ../cli/dist/commands/booking/init.js
|
|
1747
|
-
import { mkdir as mkdir2, writeFile as writeFile2 } from "fs/promises";
|
|
1748
|
-
import { dirname as dirname3, join as join2 } from "path";
|
|
1749
|
-
async function bookingInitCommand(input) {
|
|
1750
|
-
const manifest = {
|
|
1751
|
-
schemaVersion: 1,
|
|
1752
|
-
siteId: input.siteId,
|
|
1753
|
-
bookingPageSlug: input.bookingPageSlug,
|
|
1754
|
-
...input.productionOrigin ? { productionOrigin: input.productionOrigin } : {}
|
|
1755
|
-
};
|
|
1756
|
-
const manifestPath = join2(input.projectDir, "siteplane.booking.json");
|
|
1757
|
-
const artifacts = createBookingArtifacts(input.agentClient);
|
|
1758
|
-
await writeBookingManifestFile(manifestPath, manifest);
|
|
1759
|
-
for (const artifact of artifacts) {
|
|
1760
|
-
await writeProjectFile(input.projectDir, artifact.path, artifact.template);
|
|
1761
|
-
}
|
|
1762
|
-
return {
|
|
1763
|
-
manifestPath,
|
|
1764
|
-
manifest,
|
|
1765
|
-
artifactPaths: artifacts.map((artifact) => artifact.path)
|
|
1766
|
-
};
|
|
1767
|
-
}
|
|
1768
|
-
function createBookingArtifacts(agentClient) {
|
|
1769
|
-
const artifacts = [
|
|
1770
|
-
{
|
|
1771
|
-
path: ".siteplane/booking.md",
|
|
1772
|
-
template: bookingRulesTemplate
|
|
1773
|
-
}
|
|
1774
|
-
];
|
|
1775
|
-
if (agentClient === "codex") {
|
|
1776
|
-
artifacts.push({
|
|
1777
|
-
path: ".agents/skills/siteplane-booking/SKILL.md",
|
|
1778
|
-
template: bookingSkillTemplate("Codex")
|
|
1779
|
-
});
|
|
1780
|
-
}
|
|
1781
|
-
if (agentClient === "claude") {
|
|
1782
|
-
artifacts.push({
|
|
1783
|
-
path: ".claude/skills/siteplane-booking/SKILL.md",
|
|
1784
|
-
template: bookingSkillTemplate("Claude Code")
|
|
1785
|
-
});
|
|
1786
|
-
}
|
|
1787
|
-
if (agentClient === "cursor") {
|
|
1788
|
-
artifacts.push({
|
|
1789
|
-
path: ".cursor/rules/siteplane-booking.mdc",
|
|
1790
|
-
template: bookingCursorRulesTemplate
|
|
1791
|
-
});
|
|
1792
|
-
}
|
|
1793
|
-
return artifacts;
|
|
1794
|
-
}
|
|
1795
|
-
async function writeProjectFile(projectDir, relativePath, contents) {
|
|
1796
|
-
const path = join2(projectDir, relativePath);
|
|
1797
|
-
await mkdir2(dirname3(path), { recursive: true });
|
|
1798
|
-
await writeFile2(path, contents, "utf8");
|
|
1799
|
-
}
|
|
1800
|
-
var bookingRulesTemplate = `# Siteplane Booking Rules
|
|
1801
|
-
|
|
1802
|
-
- Do not change layout, copy, styling, animation or business logic while adding Booking.
|
|
1803
|
-
- Integrate /booking on the customer domain through withSiteplane(nextConfig, { booking: { site: "<site-id>" } }); use the immutable Site ID supplied by Siteplane.
|
|
1804
|
-
- Use a normal <a href="/booking"> link, not next/link, an iframe or an embed script.
|
|
1805
|
-
- Preserve existing rewrites. Booking-only must not require Editor setup or siteplane.config.json.
|
|
1806
|
-
- Configure the public booking address in Siteplane; register its origin and call https://siteplane.io/api/booking/* directly with CORS, without a raw public key.
|
|
1807
|
-
- Preserve customer CSP and middleware; explain required Siteplane/Stripe permissions and exclude /booking from customer middleware.
|
|
1808
|
-
- Do not write setup tokens, project CLI tokens or private keys into source files.
|
|
1809
|
-
- Run npx siteplane booking check, npx siteplane booking sync and npx siteplane booking test after setup.
|
|
1810
|
-
- The first booking sync prints a link and code for the Siteplane approval; give both to the user and wait until they click Connect. The connection stays outside the project.
|
|
1811
|
-
- booking test stays in test_mode; live booking only starts after explicit dashboard activation.
|
|
1812
|
-
`;
|
|
1813
|
-
function bookingSkillTemplate(agentName) {
|
|
1814
|
-
return `# Siteplane Booking Skill
|
|
1815
|
-
|
|
1816
|
-
Use this skill in ${agentName} before integrating Siteplane Booking at /booking.
|
|
1817
|
-
|
|
1818
|
-
${bookingRulesTemplate}`;
|
|
1819
|
-
}
|
|
1820
|
-
var bookingCursorRulesTemplate = `---
|
|
1821
|
-
description: Siteplane Booking rules
|
|
1822
|
-
alwaysApply: true
|
|
1823
|
-
---
|
|
1824
|
-
|
|
1825
|
-
${bookingRulesTemplate}`;
|
|
1826
|
-
|
|
1827
|
-
// ../cli/dist/commands/booking/sync.js
|
|
1828
|
-
async function bookingSyncCommand(input) {
|
|
1829
|
-
const redacted = validateBookingManifestInput(input.manifest);
|
|
1830
|
-
const fetcher = input.fetchImpl ?? fetch;
|
|
1831
|
-
return fetcher(`${input.config.apiBaseUrl}/api/cli/booking/sync`, {
|
|
1832
|
-
method: "POST",
|
|
1833
|
-
headers: createBookingCliRequestHeaders(input.config),
|
|
1834
|
-
body: JSON.stringify({
|
|
1835
|
-
siteId: input.config.siteId,
|
|
1836
|
-
source: "cli",
|
|
1837
|
-
manifest: redacted.manifest
|
|
1838
|
-
})
|
|
1839
|
-
});
|
|
1840
|
-
}
|
|
1841
|
-
function createBookingCliRequestHeaders(config) {
|
|
1842
|
-
const headers = {
|
|
1843
|
-
authorization: `Bearer ${config.accessToken}`,
|
|
1844
|
-
"content-type": "application/json"
|
|
1845
|
-
};
|
|
1846
|
-
const bypassSecret = config.vercelAutomationBypassSecret?.trim();
|
|
1847
|
-
if (bypassSecret) {
|
|
1848
|
-
headers["x-vercel-protection-bypass"] = bypassSecret;
|
|
1849
|
-
}
|
|
1850
|
-
return headers;
|
|
1851
|
-
}
|
|
1852
|
-
|
|
1853
|
-
// ../cli/dist/commands/booking/test.js
|
|
1854
|
-
async function bookingTestCommand(input) {
|
|
1855
|
-
const fetcher = input.fetchImpl ?? fetch;
|
|
1856
|
-
const booking = bookingCreateRequestSchema.parse(input.booking);
|
|
1857
|
-
return fetcher(`${input.config.apiBaseUrl}/api/cli/booking/test`, {
|
|
1858
|
-
method: "POST",
|
|
1859
|
-
headers: createBookingCliRequestHeaders(input.config),
|
|
1860
|
-
body: JSON.stringify({
|
|
1861
|
-
siteId: input.config.siteId,
|
|
1862
|
-
mode: "test",
|
|
1863
|
-
...input.manifest ? { manifest: input.manifest } : {},
|
|
1864
|
-
booking
|
|
1865
|
-
})
|
|
1866
|
-
});
|
|
1867
|
-
}
|
|
1868
|
-
|
|
1869
|
-
// ../cli/dist/commands/scan.js
|
|
1870
|
-
import { readdir } from "fs/promises";
|
|
1871
|
-
import { extname, join as join3 } from "path";
|
|
1872
|
-
|
|
1873
|
-
// ../cli/dist/auth/device-login.js
|
|
1874
|
-
import { spawn } from "child_process";
|
|
1875
|
-
import { hostname } from "os";
|
|
1876
|
-
|
|
1877
|
-
// ../cli/dist/config/agent-connections.js
|
|
1878
|
-
import { randomUUID } from "crypto";
|
|
1879
|
-
import { chmod, mkdir as mkdir3, open, readFile as readFile3, rename, rm } from "fs/promises";
|
|
1880
|
-
import { join as join4 } from "path";
|
|
1881
|
-
import { z as z27 } from "zod";
|
|
1882
|
-
var storeSchema = z27.object({
|
|
1883
|
-
connections: z27.array(z27.object({
|
|
1884
|
-
apiOrigin: z27.string().url(),
|
|
1885
|
-
siteId: z27.string().min(1),
|
|
1886
|
-
accessToken: z27.string().min(1),
|
|
1887
|
-
scopes: z27.array(z27.string()),
|
|
1888
|
-
expiresAt: z27.string()
|
|
1889
|
-
}))
|
|
1890
|
-
});
|
|
1891
|
-
|
|
1892
|
-
// ../cli/dist/config/project-config.js
|
|
1893
|
-
import { readFile as readFile4 } from "fs/promises";
|
|
1894
|
-
import { join as join5 } from "path";
|
|
1895
|
-
import { z as z28 } from "zod";
|
|
1896
|
-
var packageVersionSchema = z28.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
|
|
1897
|
-
var projectPackagesSchema = z28.object({
|
|
1898
|
-
siteplane: packageVersionSchema,
|
|
1899
|
-
runtimeNext: packageVersionSchema,
|
|
1900
|
-
analytics: packageVersionSchema.optional()
|
|
1901
|
-
}).strict();
|
|
1902
|
-
var siteplaneProjectConfigSchema = z28.object({
|
|
1903
|
-
version: z28.literal(2),
|
|
1904
|
-
apiBaseUrl: z28.string().url(),
|
|
1905
|
-
siteId: z28.string().uuid(),
|
|
1906
|
-
publicSiteKeyId: z28.string().uuid(),
|
|
1907
|
-
publicSiteKey: z28.string().trim().min(1),
|
|
1908
|
-
runId: z28.string().uuid(),
|
|
1909
|
-
appDirectory: z28.string().min(1),
|
|
1910
|
-
taskContractVersion: z28.literal("siteplane.setup-task.v2"),
|
|
1911
|
-
adminProtocolVersion: z28.literal(2),
|
|
1912
|
-
packages: projectPackagesSchema,
|
|
1913
|
-
fieldContractHash: z28.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
|
|
1914
|
-
}).strict();
|
|
1915
|
-
|
|
1916
|
-
// ../cli/dist/scan/next-source-scan.js
|
|
1917
|
-
import ts2 from "typescript";
|
|
1918
|
-
import { isAbsolute, relative } from "path";
|
|
1919
|
-
var legacyEditableComponentPrefix = "Editable";
|
|
1920
|
-
var editableComponentNames = new Set(["Image", "Text", "LongText", "Link"].map((name) => `${legacyEditableComponentPrefix}${name}`));
|
|
134
|
+
// src/index.ts
|
|
135
|
+
var siteplane = createFieldReaders(cache(loadSiteValues));
|
|
1921
136
|
export {
|
|
1922
|
-
|
|
1923
|
-
bookingInitCommand,
|
|
1924
|
-
bookingSyncCommand,
|
|
1925
|
-
bookingTestCommand
|
|
137
|
+
siteplane
|
|
1926
138
|
};
|