siteplane 0.1.44 → 0.1.46
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 +7 -0
- package/dist/bin/siteplane.js +1072 -810
- package/dist/index.js +1016 -785
- package/dist/next.d.ts +25 -0
- package/dist/next.js +1113 -790
- package/package.json +1 -1
package/dist/next.js
CHANGED
|
@@ -100,12 +100,41 @@ var analyticsProviderImportSchema = z3.object({
|
|
|
100
100
|
rows: z3.array(analyticsProviderImportRowSchema).min(1).max(1e3)
|
|
101
101
|
}).strict();
|
|
102
102
|
|
|
103
|
-
// ../shared/dist/analytics-
|
|
103
|
+
// ../shared/dist/analytics-config.js
|
|
104
104
|
import { z as z4 } from "zod";
|
|
105
|
+
var ANALYTICS_CONFIG_LEASE_MS = 6e4;
|
|
106
|
+
var analyticsMeasurementConfigSchema = z4.object({
|
|
107
|
+
version: z4.literal(1),
|
|
108
|
+
installationGeneration: z4.number().int().positive(),
|
|
109
|
+
configRevision: z4.number().int().positive(),
|
|
110
|
+
effectiveSiteMode: z4.enum(["disabled", "session_only", "full_analytics"]),
|
|
111
|
+
measurementEnabled: z4.boolean(),
|
|
112
|
+
issuedAt: z4.string().datetime({ offset: true }),
|
|
113
|
+
expiresAt: z4.string().datetime({ offset: true })
|
|
114
|
+
}).strict().superRefine((config, context) => {
|
|
115
|
+
const lifetime = Date.parse(config.expiresAt) - Date.parse(config.issuedAt);
|
|
116
|
+
if (lifetime <= 0 || lifetime > ANALYTICS_CONFIG_LEASE_MS) {
|
|
117
|
+
context.addIssue({
|
|
118
|
+
code: "custom",
|
|
119
|
+
path: ["expiresAt"],
|
|
120
|
+
message: "Measurement permission must expire within 60 seconds."
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (config.measurementEnabled !== (config.effectiveSiteMode !== "disabled")) {
|
|
124
|
+
context.addIssue({
|
|
125
|
+
code: "custom",
|
|
126
|
+
path: ["measurementEnabled"],
|
|
127
|
+
message: "Measurement permission must match the effective site mode."
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// ../shared/dist/analytics-events.js
|
|
133
|
+
import { z as z5 } from "zod";
|
|
105
134
|
var ANALYTICS_SCHEMA_VERSION = "analytics.v1";
|
|
106
|
-
var analyticsSessionIdSchema =
|
|
107
|
-
var analyticsVisitorIdSchema =
|
|
108
|
-
var analyticsPersistedIdentityHashSchema =
|
|
135
|
+
var analyticsSessionIdSchema = z5.string().regex(/^cpa_s_[a-f0-9]{32}$/u);
|
|
136
|
+
var analyticsVisitorIdSchema = z5.string().regex(/^cpa_v_[a-f0-9]{32}$/u);
|
|
137
|
+
var analyticsPersistedIdentityHashSchema = z5.string().regex(/^[a-f0-9]{64}$/u);
|
|
109
138
|
var analyticsEventNames = [
|
|
110
139
|
"page_view",
|
|
111
140
|
"section_view",
|
|
@@ -185,41 +214,43 @@ var analyticsValidityStatuses = [
|
|
|
185
214
|
"rejected",
|
|
186
215
|
"ignored"
|
|
187
216
|
];
|
|
188
|
-
var analyticsEventNameSchema =
|
|
189
|
-
var serverOnlyAnalyticsEventSchema =
|
|
190
|
-
var analyticsEventSourceSchema =
|
|
191
|
-
var analyticsIngestionChannelSchema =
|
|
192
|
-
var analyticsTargetTypeSchema =
|
|
193
|
-
var analyticsDataAttributeEventSchema =
|
|
194
|
-
var analyticsDeviceTypeSchema =
|
|
195
|
-
var analyticsBotClassificationSchema =
|
|
196
|
-
var analyticsValidityStatusSchema =
|
|
197
|
-
var analyticsPropertiesSchema =
|
|
198
|
-
var analyticsTimestampSchema =
|
|
199
|
-
var analyticsBrowserEventSchema =
|
|
200
|
-
eventId:
|
|
217
|
+
var analyticsEventNameSchema = z5.enum(analyticsEventNames);
|
|
218
|
+
var serverOnlyAnalyticsEventSchema = z5.enum(serverOnlyAnalyticsEvents);
|
|
219
|
+
var analyticsEventSourceSchema = z5.enum(analyticsEventSources);
|
|
220
|
+
var analyticsIngestionChannelSchema = z5.enum(analyticsIngestionChannels);
|
|
221
|
+
var analyticsTargetTypeSchema = z5.enum(analyticsTargetTypes);
|
|
222
|
+
var analyticsDataAttributeEventSchema = z5.enum(analyticsDataAttributeEvents);
|
|
223
|
+
var analyticsDeviceTypeSchema = z5.enum(analyticsDeviceTypes);
|
|
224
|
+
var analyticsBotClassificationSchema = z5.enum(analyticsBotClassifications);
|
|
225
|
+
var analyticsValidityStatusSchema = z5.enum(analyticsValidityStatuses);
|
|
226
|
+
var analyticsPropertiesSchema = z5.record(z5.string(), z5.unknown());
|
|
227
|
+
var analyticsTimestampSchema = z5.string().datetime({ offset: true });
|
|
228
|
+
var analyticsBrowserEventSchema = z5.object({
|
|
229
|
+
eventId: z5.string().min(1).max(160),
|
|
230
|
+
installationGeneration: z5.number().int().positive().optional(),
|
|
231
|
+
measurementMode: z5.enum(["session_only", "full_analytics"]).optional(),
|
|
201
232
|
eventName: analyticsEventNameSchema,
|
|
202
233
|
eventSource: analyticsEventSourceSchema.optional().default("browser"),
|
|
203
|
-
targetId:
|
|
234
|
+
targetId: z5.string().min(1).max(160).optional(),
|
|
204
235
|
targetType: analyticsTargetTypeSchema.optional(),
|
|
205
236
|
visitorId: analyticsVisitorIdSchema.optional(),
|
|
206
237
|
sessionId: analyticsSessionIdSchema,
|
|
207
|
-
idempotencyKey:
|
|
238
|
+
idempotencyKey: z5.string().min(1).max(240).optional(),
|
|
208
239
|
occurredAt: analyticsTimestampSchema,
|
|
209
|
-
pageUrl:
|
|
210
|
-
pagePath:
|
|
211
|
-
routeTemplate:
|
|
212
|
-
referrer:
|
|
213
|
-
utmSource:
|
|
214
|
-
utmMedium:
|
|
215
|
-
utmCampaign:
|
|
216
|
-
utmContent:
|
|
217
|
-
utmTerm:
|
|
240
|
+
pageUrl: z5.string().url().max(2048).optional(),
|
|
241
|
+
pagePath: z5.string().min(1).max(1024).optional(),
|
|
242
|
+
routeTemplate: z5.string().min(1).max(1024).optional(),
|
|
243
|
+
referrer: z5.string().url().max(2048).optional(),
|
|
244
|
+
utmSource: z5.string().min(1).max(200).optional(),
|
|
245
|
+
utmMedium: z5.string().min(1).max(200).optional(),
|
|
246
|
+
utmCampaign: z5.string().min(1).max(200).optional(),
|
|
247
|
+
utmContent: z5.string().min(1).max(200).optional(),
|
|
248
|
+
utmTerm: z5.string().min(1).max(200).optional(),
|
|
218
249
|
deviceType: analyticsDeviceTypeSchema.optional(),
|
|
219
|
-
browserName:
|
|
220
|
-
osName:
|
|
221
|
-
country:
|
|
222
|
-
region:
|
|
250
|
+
browserName: z5.string().min(1).max(120).optional(),
|
|
251
|
+
osName: z5.string().min(1).max(120).optional(),
|
|
252
|
+
country: z5.string().min(1).max(80).optional(),
|
|
253
|
+
region: z5.string().min(1).max(120).optional(),
|
|
223
254
|
properties: analyticsPropertiesSchema.optional().default({})
|
|
224
255
|
}).superRefine((event, context) => {
|
|
225
256
|
if (isServerOnlyAnalyticsEvent(event.eventName)) {
|
|
@@ -244,44 +275,44 @@ var analyticsBrowserEventSchema = z4.object({
|
|
|
244
275
|
});
|
|
245
276
|
}
|
|
246
277
|
});
|
|
247
|
-
var analyticsBrowserEventPayloadSchema =
|
|
248
|
-
siteKey:
|
|
249
|
-
schemaVersion:
|
|
250
|
-
mode:
|
|
251
|
-
events:
|
|
278
|
+
var analyticsBrowserEventPayloadSchema = z5.object({
|
|
279
|
+
siteKey: z5.string().min(1),
|
|
280
|
+
schemaVersion: z5.literal(ANALYTICS_SCHEMA_VERSION),
|
|
281
|
+
mode: z5.enum(["live", "test"]).optional().default("live"),
|
|
282
|
+
events: z5.array(analyticsBrowserEventSchema).min(1).max(50)
|
|
252
283
|
});
|
|
253
|
-
var analyticsNormalizedEventBaseSchema =
|
|
254
|
-
site_id:
|
|
255
|
-
event_id:
|
|
256
|
-
schema_version:
|
|
284
|
+
var analyticsNormalizedEventBaseSchema = z5.object({
|
|
285
|
+
site_id: z5.string().uuid(),
|
|
286
|
+
event_id: z5.string().min(1).max(160),
|
|
287
|
+
schema_version: z5.literal(ANALYTICS_SCHEMA_VERSION),
|
|
257
288
|
event_name: analyticsEventNameSchema,
|
|
258
289
|
event_source: analyticsEventSourceSchema,
|
|
259
290
|
ingestion_channel: analyticsIngestionChannelSchema,
|
|
260
|
-
target_id:
|
|
291
|
+
target_id: z5.string().min(1).max(160).nullable().optional(),
|
|
261
292
|
target_type: analyticsTargetTypeSchema.nullable().optional(),
|
|
262
|
-
dedupe_key:
|
|
263
|
-
idempotency_key:
|
|
293
|
+
dedupe_key: z5.string().regex(/^analytics_dedupe_v1_[a-f0-9]{64}$/u).nullable().optional(),
|
|
294
|
+
idempotency_key: z5.string().min(1).max(240).nullable().optional(),
|
|
264
295
|
bot_classification: analyticsBotClassificationSchema,
|
|
265
296
|
validity_status: analyticsValidityStatusSchema,
|
|
266
|
-
rejection_reason:
|
|
297
|
+
rejection_reason: z5.string().min(1).max(240).nullable().optional(),
|
|
267
298
|
occurred_at: analyticsTimestampSchema,
|
|
268
299
|
received_at: analyticsTimestampSchema,
|
|
269
|
-
page_url:
|
|
270
|
-
page_path:
|
|
271
|
-
route_template:
|
|
272
|
-
referrer:
|
|
273
|
-
utm_source:
|
|
274
|
-
utm_medium:
|
|
275
|
-
utm_campaign:
|
|
276
|
-
utm_content:
|
|
277
|
-
utm_term:
|
|
278
|
-
country:
|
|
279
|
-
region:
|
|
300
|
+
page_url: z5.string().url().max(2048).nullable().optional(),
|
|
301
|
+
page_path: z5.string().min(1).max(1024).nullable().optional(),
|
|
302
|
+
route_template: z5.string().min(1).max(1024).nullable().optional(),
|
|
303
|
+
referrer: z5.string().url().max(2048).nullable().optional(),
|
|
304
|
+
utm_source: z5.string().min(1).max(200).nullable().optional(),
|
|
305
|
+
utm_medium: z5.string().min(1).max(200).nullable().optional(),
|
|
306
|
+
utm_campaign: z5.string().min(1).max(200).nullable().optional(),
|
|
307
|
+
utm_content: z5.string().min(1).max(200).nullable().optional(),
|
|
308
|
+
utm_term: z5.string().min(1).max(200).nullable().optional(),
|
|
309
|
+
country: z5.string().min(1).max(80).nullable().optional(),
|
|
310
|
+
region: z5.string().min(1).max(120).nullable().optional(),
|
|
280
311
|
device_type: analyticsDeviceTypeSchema,
|
|
281
|
-
browser_name:
|
|
282
|
-
os_name:
|
|
283
|
-
provider:
|
|
284
|
-
provider_event_id:
|
|
312
|
+
browser_name: z5.string().min(1).max(120).nullable().optional(),
|
|
313
|
+
os_name: z5.string().min(1).max(120).nullable().optional(),
|
|
314
|
+
provider: z5.string().min(1).max(120).nullable().optional(),
|
|
315
|
+
provider_event_id: z5.string().min(1).max(240).nullable().optional(),
|
|
285
316
|
properties: analyticsPropertiesSchema
|
|
286
317
|
});
|
|
287
318
|
var analyticsRawNormalizedEventSchema = analyticsNormalizedEventBaseSchema.extend({
|
|
@@ -297,11 +328,11 @@ function isServerOnlyAnalyticsEvent(eventName) {
|
|
|
297
328
|
}
|
|
298
329
|
|
|
299
330
|
// ../shared/dist/analytics-manifest.js
|
|
300
|
-
import { z as
|
|
301
|
-
var analyticsTargetIdSchema =
|
|
331
|
+
import { z as z6 } from "zod";
|
|
332
|
+
var analyticsTargetIdSchema = z6.string().min(1).max(120).regex(/^[a-zA-Z][a-zA-Z0-9]*(?:[._-][a-zA-Z0-9]+)*$/u, {
|
|
302
333
|
message: "Analytics target IDs must be stable identifiers without whitespace or visible copy."
|
|
303
334
|
});
|
|
304
|
-
var analyticsManifestRecordSchema =
|
|
335
|
+
var analyticsManifestRecordSchema = z6.record(z6.string(), z6.unknown());
|
|
305
336
|
var analyticsFormPurposes = [
|
|
306
337
|
"contact",
|
|
307
338
|
"lead",
|
|
@@ -310,21 +341,21 @@ var analyticsFormPurposes = [
|
|
|
310
341
|
"login",
|
|
311
342
|
"other"
|
|
312
343
|
];
|
|
313
|
-
var analyticsFormPurposeSchema =
|
|
314
|
-
var analyticsManifestRouteSchema =
|
|
315
|
-
path:
|
|
316
|
-
pageType:
|
|
317
|
-
label:
|
|
344
|
+
var analyticsFormPurposeSchema = z6.enum(analyticsFormPurposes);
|
|
345
|
+
var analyticsManifestRouteSchema = z6.object({
|
|
346
|
+
path: z6.string().min(1).max(1024),
|
|
347
|
+
pageType: z6.string().min(1).max(120).optional(),
|
|
348
|
+
label: z6.string().min(1).max(200).optional()
|
|
318
349
|
}).passthrough();
|
|
319
|
-
var analyticsManifestTargetSchema =
|
|
350
|
+
var analyticsManifestTargetSchema = z6.object({
|
|
320
351
|
id: analyticsTargetIdSchema,
|
|
321
352
|
type: analyticsTargetTypeSchema,
|
|
322
353
|
event: analyticsEventNameSchema.optional(),
|
|
323
|
-
events:
|
|
324
|
-
route:
|
|
325
|
-
label:
|
|
326
|
-
description:
|
|
327
|
-
autoActive:
|
|
354
|
+
events: z6.array(analyticsEventNameSchema).min(1).max(20).optional(),
|
|
355
|
+
route: z6.string().min(1).max(1024).optional(),
|
|
356
|
+
label: z6.string().min(1).max(200).optional(),
|
|
357
|
+
description: z6.string().min(1).max(1e3).optional(),
|
|
358
|
+
autoActive: z6.boolean().optional(),
|
|
328
359
|
sourceHints: analyticsManifestRecordSchema.optional()
|
|
329
360
|
}).passthrough().superRefine((target, context) => {
|
|
330
361
|
if (target.event === void 0 && target.events === void 0) {
|
|
@@ -349,21 +380,21 @@ var analyticsManifestTargetSchema = z5.object({
|
|
|
349
380
|
});
|
|
350
381
|
}
|
|
351
382
|
});
|
|
352
|
-
var analyticsManifestSchema =
|
|
353
|
-
schemaVersion:
|
|
354
|
-
siteId:
|
|
355
|
-
siteKeyRef:
|
|
383
|
+
var analyticsManifestSchema = z6.object({
|
|
384
|
+
schemaVersion: z6.literal(ANALYTICS_SCHEMA_VERSION),
|
|
385
|
+
siteId: z6.string().min(1),
|
|
386
|
+
siteKeyRef: z6.string().regex(/^env:[A-Z][A-Z0-9_]*$/u, {
|
|
356
387
|
message: "siteKeyRef must be an environment-variable reference."
|
|
357
388
|
}),
|
|
358
|
-
siteKeyLookup:
|
|
359
|
-
routes:
|
|
360
|
-
targets:
|
|
389
|
+
siteKeyLookup: z6.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}$/),
|
|
390
|
+
routes: z6.array(analyticsManifestRouteSchema),
|
|
391
|
+
targets: z6.array(analyticsManifestTargetSchema),
|
|
361
392
|
metadata: analyticsManifestRecordSchema.optional(),
|
|
362
|
-
siteKey:
|
|
363
|
-
secretKey:
|
|
364
|
-
rawKey:
|
|
365
|
-
token:
|
|
366
|
-
accessToken:
|
|
393
|
+
siteKey: z6.string().optional(),
|
|
394
|
+
secretKey: z6.string().optional(),
|
|
395
|
+
rawKey: z6.string().optional(),
|
|
396
|
+
token: z6.string().optional(),
|
|
397
|
+
accessToken: z6.string().optional()
|
|
367
398
|
}).passthrough().superRefine((manifest, context) => {
|
|
368
399
|
const targetIds = /* @__PURE__ */ new Set();
|
|
369
400
|
for (const [index, target] of manifest.targets.entries()) {
|
|
@@ -407,9 +438,9 @@ function isPlainRecord(value) {
|
|
|
407
438
|
}
|
|
408
439
|
|
|
409
440
|
// ../shared/dist/analytics-metrics.js
|
|
410
|
-
import { z as
|
|
441
|
+
import { z as z7 } from "zod";
|
|
411
442
|
var analyticsVisitorQualities = ["exact", "estimated"];
|
|
412
|
-
var analyticsVisitorQualitySchema =
|
|
443
|
+
var analyticsVisitorQualitySchema = z7.enum(analyticsVisitorQualities);
|
|
413
444
|
var analyticsKpiKeys = [
|
|
414
445
|
"pageViews",
|
|
415
446
|
"sessions",
|
|
@@ -421,7 +452,7 @@ var analyticsKpiKeys = [
|
|
|
421
452
|
"conversionRate",
|
|
422
453
|
"inquiryRate"
|
|
423
454
|
];
|
|
424
|
-
var analyticsKpiKeySchema =
|
|
455
|
+
var analyticsKpiKeySchema = z7.enum(analyticsKpiKeys);
|
|
425
456
|
|
|
426
457
|
// ../shared/dist/analytics-privacy.js
|
|
427
458
|
var serverPropertySchemas = {
|
|
@@ -459,7 +490,7 @@ function revenuePropertySchema() {
|
|
|
459
490
|
}
|
|
460
491
|
|
|
461
492
|
// ../shared/dist/assets.js
|
|
462
|
-
import { z as
|
|
493
|
+
import { z as z8 } from "zod";
|
|
463
494
|
var ASSET_STAGES = ["staging", "final", "deleted"];
|
|
464
495
|
var ASSET_VISIBILITIES = ["private", "public", "deleted"];
|
|
465
496
|
var ASSET_USAGE_ENTITY_TYPES = [
|
|
@@ -468,13 +499,13 @@ var ASSET_USAGE_ENTITY_TYPES = [
|
|
|
468
499
|
"change_set",
|
|
469
500
|
"published_value"
|
|
470
501
|
];
|
|
471
|
-
var assetStageSchema =
|
|
472
|
-
var assetVisibilitySchema =
|
|
473
|
-
var assetUsageEntityTypeSchema =
|
|
474
|
-
var brandingAccentColorSchema =
|
|
502
|
+
var assetStageSchema = z8.enum(ASSET_STAGES);
|
|
503
|
+
var assetVisibilitySchema = z8.enum(ASSET_VISIBILITIES);
|
|
504
|
+
var assetUsageEntityTypeSchema = z8.enum(ASSET_USAGE_ENTITY_TYPES);
|
|
505
|
+
var brandingAccentColorSchema = z8.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);
|
|
475
506
|
|
|
476
507
|
// ../shared/dist/booking-contracts.js
|
|
477
|
-
import { z as
|
|
508
|
+
import { z as z9 } from "zod";
|
|
478
509
|
var bookingStatuses = [
|
|
479
510
|
"pending_payment",
|
|
480
511
|
"confirmed",
|
|
@@ -529,30 +560,30 @@ var bookingResourceKinds = [
|
|
|
529
560
|
"equipment",
|
|
530
561
|
"other"
|
|
531
562
|
];
|
|
532
|
-
var bookingStatusSchema =
|
|
533
|
-
var bookingPaymentStatusSchema =
|
|
534
|
-
var bookingAccountReadinessStatusSchema =
|
|
535
|
-
var bookingRefundStatusSchema =
|
|
536
|
-
var bookingDisputeStatusSchema =
|
|
537
|
-
var bookingPaymentModeSchema =
|
|
538
|
-
var bookingPaymentCollectionTypeSchema =
|
|
539
|
-
var bookingPaymentCollectionSchema =
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
type:
|
|
543
|
-
depositPercent:
|
|
563
|
+
var bookingStatusSchema = z9.enum(bookingStatuses);
|
|
564
|
+
var bookingPaymentStatusSchema = z9.enum(bookingPaymentStatuses);
|
|
565
|
+
var bookingAccountReadinessStatusSchema = z9.enum(bookingAccountReadinessStatuses);
|
|
566
|
+
var bookingRefundStatusSchema = z9.enum(bookingRefundStatuses);
|
|
567
|
+
var bookingDisputeStatusSchema = z9.enum(bookingDisputeStatuses);
|
|
568
|
+
var bookingPaymentModeSchema = z9.enum(bookingPaymentModes);
|
|
569
|
+
var bookingPaymentCollectionTypeSchema = z9.enum(bookingPaymentCollectionTypes);
|
|
570
|
+
var bookingPaymentCollectionSchema = z9.discriminatedUnion("type", [
|
|
571
|
+
z9.object({ type: z9.literal("full_amount") }).strict(),
|
|
572
|
+
z9.object({
|
|
573
|
+
type: z9.literal("deposit_percent"),
|
|
574
|
+
depositPercent: z9.number().int().min(10).max(90)
|
|
544
575
|
}).strict()
|
|
545
576
|
]);
|
|
546
577
|
var bookingPaymentChoices = ["onsite", "online"];
|
|
547
|
-
var bookingPaymentChoiceSchema =
|
|
548
|
-
var bookingPaymentSnapshotSchema =
|
|
549
|
-
snapshotId:
|
|
550
|
-
snapshotVersion:
|
|
551
|
-
currency:
|
|
552
|
-
totalAmountCents:
|
|
553
|
-
onlineAmountCents:
|
|
554
|
-
onsiteRemainderCents:
|
|
555
|
-
maxStripeRefundAmountCents:
|
|
578
|
+
var bookingPaymentChoiceSchema = z9.enum(bookingPaymentChoices);
|
|
579
|
+
var bookingPaymentSnapshotSchema = z9.object({
|
|
580
|
+
snapshotId: z9.string().uuid(),
|
|
581
|
+
snapshotVersion: z9.number().int().positive(),
|
|
582
|
+
currency: z9.literal("EUR"),
|
|
583
|
+
totalAmountCents: z9.number().int().min(0),
|
|
584
|
+
onlineAmountCents: z9.number().int().min(0),
|
|
585
|
+
onsiteRemainderCents: z9.number().int().min(0),
|
|
586
|
+
maxStripeRefundAmountCents: z9.number().int().min(0)
|
|
556
587
|
}).strict().superRefine((snapshot, context) => {
|
|
557
588
|
if (snapshot.onlineAmountCents + snapshot.onsiteRemainderCents !== snapshot.totalAmountCents) {
|
|
558
589
|
context.addIssue({
|
|
@@ -567,17 +598,17 @@ var bookingPaymentSnapshotSchema = z8.object({
|
|
|
567
598
|
});
|
|
568
599
|
}
|
|
569
600
|
});
|
|
570
|
-
var bookingServiceVariantSchema =
|
|
571
|
-
id:
|
|
572
|
-
name:
|
|
573
|
-
durationMinutes:
|
|
574
|
-
priceCents:
|
|
601
|
+
var bookingServiceVariantSchema = z9.object({
|
|
602
|
+
id: z9.string().uuid(),
|
|
603
|
+
name: z9.string().trim().min(1).max(120),
|
|
604
|
+
durationMinutes: z9.number().int().min(1).max(1440),
|
|
605
|
+
priceCents: z9.number().int().min(0).nullable()
|
|
575
606
|
}).strict();
|
|
576
|
-
var bookingServiceVariantsSchema =
|
|
577
|
-
var isoDateSchema =
|
|
578
|
-
var utcDateTimeSchema =
|
|
579
|
-
var bookingLocalTimeSchema =
|
|
580
|
-
var bookingAvailabilityIntervalsSchema =
|
|
607
|
+
var bookingServiceVariantsSchema = z9.array(bookingServiceVariantSchema).min(1).max(20);
|
|
608
|
+
var isoDateSchema = z9.string().regex(/^\d{4}-\d{2}-\d{2}$/);
|
|
609
|
+
var utcDateTimeSchema = z9.string().datetime();
|
|
610
|
+
var bookingLocalTimeSchema = z9.string().regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/);
|
|
611
|
+
var bookingAvailabilityIntervalsSchema = z9.array(z9.object({
|
|
581
612
|
start: bookingLocalTimeSchema,
|
|
582
613
|
end: bookingLocalTimeSchema
|
|
583
614
|
}).strict().refine((interval) => interval.end > interval.start)).superRefine((intervals, context) => {
|
|
@@ -592,75 +623,75 @@ var bookingAvailabilityIntervalsSchema = z8.array(z8.object({
|
|
|
592
623
|
}
|
|
593
624
|
}
|
|
594
625
|
});
|
|
595
|
-
var bookingPublicConfigSchema =
|
|
596
|
-
site:
|
|
597
|
-
displayName:
|
|
598
|
-
timezone:
|
|
599
|
-
locale:
|
|
600
|
-
bookingPageSlug:
|
|
601
|
-
privacyUrl:
|
|
626
|
+
var bookingPublicConfigSchema = z9.object({
|
|
627
|
+
site: z9.object({
|
|
628
|
+
displayName: z9.string().trim().min(1),
|
|
629
|
+
timezone: z9.string().trim().min(1),
|
|
630
|
+
locale: z9.string().trim().min(2),
|
|
631
|
+
bookingPageSlug: z9.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
|
|
632
|
+
privacyUrl: z9.string().url().nullable()
|
|
602
633
|
}),
|
|
603
|
-
branding:
|
|
604
|
-
logoUrl:
|
|
605
|
-
accentColor:
|
|
634
|
+
branding: z9.object({
|
|
635
|
+
logoUrl: z9.string().url().nullable(),
|
|
636
|
+
accentColor: z9.string().trim().min(1).nullable()
|
|
606
637
|
}),
|
|
607
|
-
settings:
|
|
608
|
-
slotIntervalMinutes:
|
|
609
|
-
minLeadMinutes:
|
|
610
|
-
maxAdvanceDays:
|
|
611
|
-
requirePhone:
|
|
612
|
-
collectNote:
|
|
613
|
-
confirmationMessage:
|
|
638
|
+
settings: z9.object({
|
|
639
|
+
slotIntervalMinutes: z9.number().int().positive(),
|
|
640
|
+
minLeadMinutes: z9.number().int().min(0),
|
|
641
|
+
maxAdvanceDays: z9.number().int().min(1),
|
|
642
|
+
requirePhone: z9.boolean(),
|
|
643
|
+
collectNote: z9.boolean(),
|
|
644
|
+
confirmationMessage: z9.string().nullable()
|
|
614
645
|
}),
|
|
615
646
|
/** Freitexte des Salons, im Kassen-Schritt vor der Bestaetigung sichtbar. */
|
|
616
|
-
policies:
|
|
617
|
-
cancellation:
|
|
618
|
-
lateArrival:
|
|
647
|
+
policies: z9.object({
|
|
648
|
+
cancellation: z9.string().nullable(),
|
|
649
|
+
lateArrival: z9.string().nullable()
|
|
619
650
|
}),
|
|
620
|
-
payment:
|
|
651
|
+
payment: z9.object({
|
|
621
652
|
mode: bookingPaymentModeSchema,
|
|
622
653
|
collection: bookingPaymentCollectionSchema,
|
|
623
|
-
onlinePaymentsReady:
|
|
654
|
+
onlinePaymentsReady: z9.boolean()
|
|
624
655
|
}).strict(),
|
|
625
|
-
serviceCategories:
|
|
626
|
-
id:
|
|
627
|
-
name:
|
|
628
|
-
sortOrder:
|
|
656
|
+
serviceCategories: z9.array(z9.object({
|
|
657
|
+
id: z9.string().uuid(),
|
|
658
|
+
name: z9.string().trim().min(1),
|
|
659
|
+
sortOrder: z9.number().int()
|
|
629
660
|
})),
|
|
630
|
-
serviceSubcategories:
|
|
631
|
-
id:
|
|
632
|
-
categoryId:
|
|
633
|
-
name:
|
|
634
|
-
sortOrder:
|
|
661
|
+
serviceSubcategories: z9.array(z9.object({
|
|
662
|
+
id: z9.string().uuid(),
|
|
663
|
+
categoryId: z9.string().uuid(),
|
|
664
|
+
name: z9.string().trim().min(1),
|
|
665
|
+
sortOrder: z9.number().int()
|
|
635
666
|
})),
|
|
636
|
-
services:
|
|
637
|
-
id:
|
|
638
|
-
name:
|
|
639
|
-
durationMinutes:
|
|
640
|
-
priceCents:
|
|
641
|
-
currency:
|
|
642
|
-
description:
|
|
643
|
-
categoryId:
|
|
644
|
-
subcategoryId:
|
|
667
|
+
services: z9.array(z9.object({
|
|
668
|
+
id: z9.string().trim().min(1),
|
|
669
|
+
name: z9.string().trim().min(1),
|
|
670
|
+
durationMinutes: z9.number().int().positive(),
|
|
671
|
+
priceCents: z9.number().int().min(0).nullable(),
|
|
672
|
+
currency: z9.string().regex(/^[A-Z]{3}$/),
|
|
673
|
+
description: z9.string().nullable(),
|
|
674
|
+
categoryId: z9.string().uuid(),
|
|
675
|
+
subcategoryId: z9.string().uuid().nullable(),
|
|
645
676
|
variants: bookingServiceVariantsSchema,
|
|
646
|
-
allowsAnyResource:
|
|
647
|
-
sortOrder:
|
|
677
|
+
allowsAnyResource: z9.boolean(),
|
|
678
|
+
sortOrder: z9.number().int()
|
|
648
679
|
})),
|
|
649
|
-
resources:
|
|
650
|
-
id:
|
|
651
|
-
name:
|
|
652
|
-
kind:
|
|
680
|
+
resources: z9.array(z9.object({
|
|
681
|
+
id: z9.string().trim().min(1),
|
|
682
|
+
name: z9.string().trim().min(1),
|
|
683
|
+
kind: z9.enum(bookingResourceKinds)
|
|
653
684
|
})),
|
|
654
|
-
serviceResources:
|
|
655
|
-
serviceId:
|
|
656
|
-
resourceId:
|
|
685
|
+
serviceResources: z9.array(z9.object({
|
|
686
|
+
serviceId: z9.string().trim().min(1),
|
|
687
|
+
resourceId: z9.string().trim().min(1)
|
|
657
688
|
}))
|
|
658
689
|
});
|
|
659
|
-
var bookingItemSchema =
|
|
660
|
-
serviceId:
|
|
661
|
-
variantId:
|
|
690
|
+
var bookingItemSchema = z9.object({
|
|
691
|
+
serviceId: z9.string().trim().min(1),
|
|
692
|
+
variantId: z9.string().trim().min(1)
|
|
662
693
|
}).strict();
|
|
663
|
-
var bookingItemsSchema =
|
|
694
|
+
var bookingItemsSchema = z9.array(bookingItemSchema).min(1).max(10);
|
|
664
695
|
function parseBookingItemsParam(value) {
|
|
665
696
|
const items = value.split(",").map((entry) => entry.trim()).filter((entry) => entry !== "").map((entry) => {
|
|
666
697
|
const [serviceId, variantId, ...rest] = entry.split(":");
|
|
@@ -668,36 +699,36 @@ function parseBookingItemsParam(value) {
|
|
|
668
699
|
});
|
|
669
700
|
return items.every((item) => item !== null) ? items : null;
|
|
670
701
|
}
|
|
671
|
-
var bookingSlotsQuerySchema =
|
|
672
|
-
items:
|
|
673
|
-
resourceId:
|
|
702
|
+
var bookingSlotsQuerySchema = z9.object({
|
|
703
|
+
items: z9.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
|
|
704
|
+
resourceId: z9.string().trim().min(1).optional(),
|
|
674
705
|
fromDate: isoDateSchema,
|
|
675
706
|
toDate: isoDateSchema
|
|
676
707
|
});
|
|
677
|
-
var bookingSlotsResponseSchema =
|
|
678
|
-
timezone:
|
|
708
|
+
var bookingSlotsResponseSchema = z9.object({
|
|
709
|
+
timezone: z9.string().trim().min(1),
|
|
679
710
|
items: bookingItemsSchema,
|
|
680
711
|
// Reine Behandlungsdauer ohne Puffer: das UI zeigt damit die Terminspanne,
|
|
681
712
|
// ohne selbst rechnen zu muessen.
|
|
682
|
-
totalDurationMinutes:
|
|
683
|
-
mode:
|
|
684
|
-
slots:
|
|
713
|
+
totalDurationMinutes: z9.number().int().min(1),
|
|
714
|
+
mode: z9.enum(["any", "resource"]),
|
|
715
|
+
slots: z9.array(z9.object({
|
|
685
716
|
startUtc: utcDateTimeSchema,
|
|
686
|
-
resourceId:
|
|
717
|
+
resourceId: z9.string().trim().min(1).optional()
|
|
687
718
|
}))
|
|
688
719
|
});
|
|
689
|
-
var bookingAvailabilityQuerySchema =
|
|
690
|
-
items:
|
|
691
|
-
resourceId:
|
|
720
|
+
var bookingAvailabilityQuerySchema = z9.object({
|
|
721
|
+
items: z9.preprocess((value) => typeof value === "string" ? parseBookingItemsParam(value) : value, bookingItemsSchema),
|
|
722
|
+
resourceId: z9.string().trim().min(1).optional(),
|
|
692
723
|
fromDate: isoDateSchema,
|
|
693
724
|
toDate: isoDateSchema
|
|
694
725
|
});
|
|
695
|
-
var bookingAvailabilityResponseSchema =
|
|
696
|
-
timezone:
|
|
697
|
-
totalDurationMinutes:
|
|
698
|
-
days:
|
|
726
|
+
var bookingAvailabilityResponseSchema = z9.object({
|
|
727
|
+
timezone: z9.string().trim().min(1),
|
|
728
|
+
totalDurationMinutes: z9.number().int().min(1),
|
|
729
|
+
days: z9.array(z9.object({
|
|
699
730
|
date: isoDateSchema,
|
|
700
|
-
hasSlots:
|
|
731
|
+
hasSlots: z9.boolean()
|
|
701
732
|
})),
|
|
702
733
|
/** Erster Tag mit Slot ab `fromDate`, auch ausserhalb des Fensters. */
|
|
703
734
|
nextAvailableDate: isoDateSchema.nullable()
|
|
@@ -715,72 +746,72 @@ var bookingPublicErrorCodes = [
|
|
|
715
746
|
"too_late",
|
|
716
747
|
"not_found"
|
|
717
748
|
];
|
|
718
|
-
var bookingPublicErrorSchema =
|
|
719
|
-
error:
|
|
720
|
-
message:
|
|
721
|
-
requestId:
|
|
749
|
+
var bookingPublicErrorSchema = z9.object({
|
|
750
|
+
error: z9.enum(bookingPublicErrorCodes),
|
|
751
|
+
message: z9.string().optional(),
|
|
752
|
+
requestId: z9.string().optional()
|
|
722
753
|
}).strict();
|
|
723
|
-
var bookingCreateRequestSchema =
|
|
754
|
+
var bookingCreateRequestSchema = z9.object({
|
|
724
755
|
items: bookingItemsSchema,
|
|
725
|
-
resourceId:
|
|
756
|
+
resourceId: z9.string().min(1).nullable(),
|
|
726
757
|
startUtc: utcDateTimeSchema,
|
|
727
|
-
customer:
|
|
728
|
-
name:
|
|
729
|
-
email:
|
|
730
|
-
phone:
|
|
731
|
-
note:
|
|
758
|
+
customer: z9.object({
|
|
759
|
+
name: z9.string().min(1).max(120),
|
|
760
|
+
email: z9.string().email().max(254),
|
|
761
|
+
phone: z9.string().max(32).optional(),
|
|
762
|
+
note: z9.string().max(1e3).optional()
|
|
732
763
|
}).strict(),
|
|
733
|
-
hp:
|
|
734
|
-
clientToken:
|
|
764
|
+
hp: z9.string().optional(),
|
|
765
|
+
clientToken: z9.string().uuid(),
|
|
735
766
|
paymentChoice: bookingPaymentChoiceSchema,
|
|
736
767
|
// Werbe-Einwilligung. Bestaetigung, Erinnerung und Storno-Link sind davon
|
|
737
768
|
// unabhaengig und werden immer versendet.
|
|
738
|
-
consent:
|
|
739
|
-
marketingEmail:
|
|
740
|
-
marketingSms:
|
|
769
|
+
consent: z9.object({
|
|
770
|
+
marketingEmail: z9.boolean(),
|
|
771
|
+
marketingSms: z9.boolean()
|
|
741
772
|
}).strict().optional()
|
|
742
773
|
}).strict();
|
|
743
|
-
var bookingPublicPaymentResponseSchema =
|
|
744
|
-
clientSecret:
|
|
745
|
-
stripeAccountId:
|
|
774
|
+
var bookingPublicPaymentResponseSchema = z9.object({
|
|
775
|
+
clientSecret: z9.string().min(1),
|
|
776
|
+
stripeAccountId: z9.string().startsWith("acct_")
|
|
746
777
|
}).strict();
|
|
747
|
-
var bookingCreateResponseSchema =
|
|
748
|
-
|
|
749
|
-
status:
|
|
750
|
-
booking:
|
|
751
|
-
id:
|
|
778
|
+
var bookingCreateResponseSchema = z9.union([
|
|
779
|
+
z9.object({
|
|
780
|
+
status: z9.literal("confirmed"),
|
|
781
|
+
booking: z9.object({
|
|
782
|
+
id: z9.string().min(1),
|
|
752
783
|
startUtc: utcDateTimeSchema,
|
|
753
784
|
endUtc: utcDateTimeSchema,
|
|
754
|
-
timezone:
|
|
755
|
-
serviceName:
|
|
756
|
-
resourceName:
|
|
785
|
+
timezone: z9.string().trim().min(1),
|
|
786
|
+
serviceName: z9.string().trim().min(1),
|
|
787
|
+
resourceName: z9.string().trim().min(1)
|
|
757
788
|
}).strict(),
|
|
758
|
-
manageUrl:
|
|
759
|
-
confirmationMessage:
|
|
789
|
+
manageUrl: z9.string().url(),
|
|
790
|
+
confirmationMessage: z9.string().nullable()
|
|
760
791
|
}).strict(),
|
|
761
|
-
|
|
762
|
-
status:
|
|
763
|
-
bookingId:
|
|
792
|
+
z9.object({
|
|
793
|
+
status: z9.literal("pending_payment"),
|
|
794
|
+
bookingId: z9.string().min(1),
|
|
764
795
|
holdExpiresAt: utcDateTimeSchema,
|
|
765
796
|
payment: bookingPublicPaymentResponseSchema,
|
|
766
|
-
statusToken:
|
|
767
|
-
manageUrl:
|
|
797
|
+
statusToken: z9.string().min(20),
|
|
798
|
+
manageUrl: z9.string().url().optional()
|
|
768
799
|
}).strict(),
|
|
769
800
|
bookingPublicErrorSchema
|
|
770
801
|
]);
|
|
771
|
-
var bookingStatusResponseSchema =
|
|
802
|
+
var bookingStatusResponseSchema = z9.object({
|
|
772
803
|
bookingStatus: bookingStatusSchema,
|
|
773
804
|
paymentStatus: bookingPaymentStatusSchema,
|
|
774
805
|
refundStatus: bookingRefundStatusSchema,
|
|
775
806
|
disputeStatus: bookingDisputeStatusSchema,
|
|
776
807
|
holdExpiresAt: utcDateTimeSchema.nullable()
|
|
777
808
|
}).strict();
|
|
778
|
-
var bookingCancelRequestSchema =
|
|
779
|
-
token:
|
|
809
|
+
var bookingCancelRequestSchema = z9.object({
|
|
810
|
+
token: z9.string().min(20)
|
|
780
811
|
});
|
|
781
|
-
var bookingCancelResponseSchema =
|
|
782
|
-
|
|
783
|
-
status:
|
|
812
|
+
var bookingCancelResponseSchema = z9.union([
|
|
813
|
+
z9.object({
|
|
814
|
+
status: z9.enum(["cancelled", "already_cancelled", "too_late", "not_found"])
|
|
784
815
|
}),
|
|
785
816
|
bookingPublicErrorSchema
|
|
786
817
|
]);
|
|
@@ -789,57 +820,57 @@ var bookingMoveErrorCodes = [
|
|
|
789
820
|
"booking_not_movable",
|
|
790
821
|
"not_found"
|
|
791
822
|
];
|
|
792
|
-
var bookingMoveRequestSchema =
|
|
793
|
-
bookingId:
|
|
823
|
+
var bookingMoveRequestSchema = z9.object({
|
|
824
|
+
bookingId: z9.string().uuid(),
|
|
794
825
|
newStartUtc: utcDateTimeSchema,
|
|
795
|
-
newResourceId:
|
|
796
|
-
notifyCustomer:
|
|
797
|
-
reason:
|
|
798
|
-
});
|
|
799
|
-
var bookingMoveResponseSchema =
|
|
800
|
-
|
|
801
|
-
status:
|
|
802
|
-
bookingId:
|
|
826
|
+
newResourceId: z9.string().uuid().optional(),
|
|
827
|
+
notifyCustomer: z9.boolean().default(false),
|
|
828
|
+
reason: z9.string().max(500).optional()
|
|
829
|
+
});
|
|
830
|
+
var bookingMoveResponseSchema = z9.union([
|
|
831
|
+
z9.object({
|
|
832
|
+
status: z9.literal("moved"),
|
|
833
|
+
bookingId: z9.string().uuid(),
|
|
803
834
|
startUtc: utcDateTimeSchema,
|
|
804
835
|
endUtc: utcDateTimeSchema,
|
|
805
|
-
resourceId:
|
|
836
|
+
resourceId: z9.string().uuid()
|
|
806
837
|
}),
|
|
807
|
-
|
|
808
|
-
error:
|
|
809
|
-
message:
|
|
810
|
-
requestId:
|
|
838
|
+
z9.object({
|
|
839
|
+
error: z9.enum(bookingMoveErrorCodes),
|
|
840
|
+
message: z9.string().optional(),
|
|
841
|
+
requestId: z9.string().optional()
|
|
811
842
|
})
|
|
812
843
|
]);
|
|
813
|
-
var bookingManifestSchema =
|
|
814
|
-
schemaVersion:
|
|
815
|
-
siteId:
|
|
816
|
-
siteKeyPrefix:
|
|
817
|
-
bookingPageSlug:
|
|
818
|
-
embedMode:
|
|
819
|
-
productionOrigin:
|
|
844
|
+
var bookingManifestSchema = z9.object({
|
|
845
|
+
schemaVersion: z9.number().int().positive(),
|
|
846
|
+
siteId: z9.string().trim().min(1),
|
|
847
|
+
siteKeyPrefix: z9.string().startsWith("bk_pub_"),
|
|
848
|
+
bookingPageSlug: z9.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).min(2).max(64),
|
|
849
|
+
embedMode: z9.enum(["script", "web_component", "iframe"]).optional(),
|
|
850
|
+
productionOrigin: z9.string().url().optional()
|
|
820
851
|
}).passthrough();
|
|
821
852
|
|
|
822
853
|
// ../shared/dist/booking-defaults.js
|
|
823
854
|
var BOOKING_CREATE_PAYLOAD_LIMIT_BYTES = 16 * 1024;
|
|
824
855
|
|
|
825
856
|
// ../shared/dist/bridge-protocol.js
|
|
826
|
-
import { z as
|
|
857
|
+
import { z as z17 } from "zod";
|
|
827
858
|
|
|
828
859
|
// ../shared/dist/field-id.js
|
|
829
|
-
import { z as
|
|
860
|
+
import { z as z10 } from "zod";
|
|
830
861
|
var FIELD_ID_PATTERN = /^[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+$/;
|
|
831
|
-
var fieldIdSchema =
|
|
862
|
+
var fieldIdSchema = z10.string().regex(FIELD_ID_PATTERN, "Invalid field id");
|
|
832
863
|
function isFieldId(value) {
|
|
833
864
|
return typeof value === "string" && fieldIdSchema.safeParse(value).success;
|
|
834
865
|
}
|
|
835
866
|
|
|
836
867
|
// ../shared/dist/field-types.js
|
|
837
|
-
import { z as
|
|
868
|
+
import { z as z11 } from "zod";
|
|
838
869
|
var FIELD_TYPES = ["text", "longText", "image", "link"];
|
|
839
|
-
var fieldTypeSchema =
|
|
870
|
+
var fieldTypeSchema = z11.enum(FIELD_TYPES);
|
|
840
871
|
|
|
841
872
|
// ../shared/dist/image-value.js
|
|
842
|
-
import { z as
|
|
873
|
+
import { z as z12 } from "zod";
|
|
843
874
|
var SUPPORTED_IMAGE_CONTENT_TYPES = [
|
|
844
875
|
"image/jpeg",
|
|
845
876
|
"image/png",
|
|
@@ -848,21 +879,21 @@ var SUPPORTED_IMAGE_CONTENT_TYPES = [
|
|
|
848
879
|
];
|
|
849
880
|
var maxImageUploadBytes = 10 * 1024 * 1024;
|
|
850
881
|
var largeImageWarningBytes = 2 * 1024 * 1024;
|
|
851
|
-
var imageContentTypeSchema =
|
|
852
|
-
var imageCropSchema =
|
|
853
|
-
x:
|
|
854
|
-
y:
|
|
855
|
-
zoom:
|
|
856
|
-
aspectRatio:
|
|
857
|
-
});
|
|
858
|
-
var imageValueSchema =
|
|
859
|
-
src:
|
|
860
|
-
alt:
|
|
861
|
-
width:
|
|
862
|
-
height:
|
|
882
|
+
var imageContentTypeSchema = z12.enum(SUPPORTED_IMAGE_CONTENT_TYPES);
|
|
883
|
+
var imageCropSchema = z12.object({
|
|
884
|
+
x: z12.number().min(0).max(100),
|
|
885
|
+
y: z12.number().min(0).max(100),
|
|
886
|
+
zoom: z12.number().min(1).max(4),
|
|
887
|
+
aspectRatio: z12.number().positive().max(10)
|
|
888
|
+
});
|
|
889
|
+
var imageValueSchema = z12.object({
|
|
890
|
+
src: z12.string().trim().min(1),
|
|
891
|
+
alt: z12.string().trim().min(1).max(300),
|
|
892
|
+
width: z12.number().int().positive().optional(),
|
|
893
|
+
height: z12.number().int().positive().optional(),
|
|
863
894
|
crop: imageCropSchema.optional(),
|
|
864
|
-
assetId:
|
|
865
|
-
finalStorageProvider:
|
|
895
|
+
assetId: z12.string().uuid().optional(),
|
|
896
|
+
finalStorageProvider: z12.enum([
|
|
866
897
|
"repo_static_assets",
|
|
867
898
|
"repo_handoff",
|
|
868
899
|
"site_owned_storage",
|
|
@@ -871,31 +902,36 @@ var imageValueSchema = z11.object({
|
|
|
871
902
|
});
|
|
872
903
|
|
|
873
904
|
// ../shared/dist/setup-deployment.js
|
|
874
|
-
import { z as
|
|
875
|
-
var version =
|
|
876
|
-
var
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
905
|
+
import { z as z13 } from "zod";
|
|
906
|
+
var version = z13.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u);
|
|
907
|
+
var siteSetupPackagesSchema = z13.object({
|
|
908
|
+
siteplane: version,
|
|
909
|
+
runtimeNext: version,
|
|
910
|
+
analytics: version.optional()
|
|
911
|
+
}).strict();
|
|
912
|
+
var hash = z13.string().regex(/^sha256:[0-9a-f]{64}$/u);
|
|
913
|
+
var setupDeploymentRecordSchema = z13.object({
|
|
914
|
+
version: z13.literal(1),
|
|
915
|
+
operationId: z13.string().uuid(),
|
|
916
|
+
provider: z13.literal("vercel"),
|
|
917
|
+
projectId: z13.string().regex(/^prj_[A-Za-z0-9]+$/u),
|
|
918
|
+
teamId: z13.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u),
|
|
919
|
+
origin: z13.string().url().refine((value) => {
|
|
884
920
|
const url = new URL(value);
|
|
885
921
|
return url.protocol === "https:" && url.origin === value && !url.username && !url.password;
|
|
886
922
|
}),
|
|
887
|
-
deploymentId:
|
|
888
|
-
revision:
|
|
923
|
+
deploymentId: z13.string().regex(/^dpl_[A-Za-z0-9]+$/u).nullable(),
|
|
924
|
+
revision: z13.string().regex(/^[0-9a-f]{40}$/u),
|
|
889
925
|
fieldContractHash: hash,
|
|
890
|
-
packages:
|
|
926
|
+
packages: siteSetupPackagesSchema,
|
|
891
927
|
configurationFingerprint: hash,
|
|
892
|
-
adminSecretGeneration:
|
|
893
|
-
revalidationGeneration:
|
|
894
|
-
startedAt:
|
|
895
|
-
environmentWrittenAt:
|
|
896
|
-
deployRequestedAt:
|
|
897
|
-
deadline:
|
|
898
|
-
phase:
|
|
928
|
+
adminSecretGeneration: z13.string().uuid(),
|
|
929
|
+
revalidationGeneration: z13.number().int().positive(),
|
|
930
|
+
startedAt: z13.string().datetime(),
|
|
931
|
+
environmentWrittenAt: z13.string().datetime().nullable(),
|
|
932
|
+
deployRequestedAt: z13.string().datetime().nullable(),
|
|
933
|
+
deadline: z13.string().datetime(),
|
|
934
|
+
phase: z13.enum([
|
|
899
935
|
"planned",
|
|
900
936
|
"environment_written",
|
|
901
937
|
"deploy_requested",
|
|
@@ -903,37 +939,37 @@ var setupDeploymentRecordSchema = z12.object({
|
|
|
903
939
|
"verified",
|
|
904
940
|
"failed"
|
|
905
941
|
]),
|
|
906
|
-
build:
|
|
942
|
+
build: z13.object({
|
|
907
943
|
node: version,
|
|
908
|
-
packageManager:
|
|
944
|
+
packageManager: z13.enum(["npm", "pnpm"]),
|
|
909
945
|
packageManagerVersion: version,
|
|
910
946
|
lockfileHash: hash
|
|
911
947
|
}).strict().nullable()
|
|
912
948
|
}).strict();
|
|
913
|
-
var setupDeploymentInputSchema =
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
action:
|
|
917
|
-
expectedOperationId:
|
|
949
|
+
var setupDeploymentInputSchema = z13.discriminatedUnion("action", [
|
|
950
|
+
z13.object({ action: z13.literal("read") }).strict(),
|
|
951
|
+
z13.object({
|
|
952
|
+
action: z13.literal("record"),
|
|
953
|
+
expectedOperationId: z13.string().uuid().nullable(),
|
|
918
954
|
record: setupDeploymentRecordSchema
|
|
919
955
|
}).strict()
|
|
920
956
|
]);
|
|
921
957
|
|
|
922
958
|
// ../shared/dist/site-setup.js
|
|
923
|
-
import { z as
|
|
959
|
+
import { z as z16 } from "zod";
|
|
924
960
|
|
|
925
961
|
// ../shared/dist/site-field-contract.js
|
|
926
|
-
import { z as
|
|
962
|
+
import { z as z15 } from "zod";
|
|
927
963
|
|
|
928
964
|
// ../shared/dist/fallback-hash.js
|
|
929
|
-
import { z as
|
|
965
|
+
import { z as z14 } from "zod";
|
|
930
966
|
var SAFE_REPRESENTATION_REASONS = [
|
|
931
967
|
"asset_import_rewritten",
|
|
932
968
|
"relative_url_normalized",
|
|
933
969
|
"line_endings_normalized",
|
|
934
970
|
"image_value_serialized"
|
|
935
971
|
];
|
|
936
|
-
var safeRepresentationReasonSchema =
|
|
972
|
+
var safeRepresentationReasonSchema = z14.enum(SAFE_REPRESENTATION_REASONS);
|
|
937
973
|
function canonicalizeFallbackValue(input) {
|
|
938
974
|
const fieldType = fieldTypeSchema.parse(input.fieldType);
|
|
939
975
|
if (input.safeRepresentationReason !== void 0) {
|
|
@@ -969,10 +1005,10 @@ function createCanonicalFallbackHash(input) {
|
|
|
969
1005
|
const payload = stableJsonStringify(canonical);
|
|
970
1006
|
return `sha256:${sha256Hex(payload)}`;
|
|
971
1007
|
}
|
|
972
|
-
var linkFallbackSchema =
|
|
973
|
-
href:
|
|
974
|
-
label:
|
|
975
|
-
target:
|
|
1008
|
+
var linkFallbackSchema = z14.object({
|
|
1009
|
+
href: z14.string().trim().min(1),
|
|
1010
|
+
label: z14.string().trim().min(1).optional(),
|
|
1011
|
+
target: z14.enum(["_self", "_blank"]).optional()
|
|
976
1012
|
}).passthrough();
|
|
977
1013
|
function normalizeLineEndings(value) {
|
|
978
1014
|
return value.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
@@ -1150,67 +1186,67 @@ var SHA256_CONSTANTS = [
|
|
|
1150
1186
|
// ../shared/dist/site-field-contract.js
|
|
1151
1187
|
var fieldContractVersion = "1.0.0";
|
|
1152
1188
|
var scannerContractVersion = "1.0.0";
|
|
1153
|
-
var siteFieldStatusSchema =
|
|
1154
|
-
var semanticVersionSchema =
|
|
1155
|
-
var siteFieldRouteKeySchema =
|
|
1156
|
-
var repositoryRelativePosixPathSchema =
|
|
1157
|
-
var sourceMappingSchema =
|
|
1158
|
-
kind:
|
|
1189
|
+
var siteFieldStatusSchema = z15.enum(["hidden", "active"]);
|
|
1190
|
+
var semanticVersionSchema = z15.string().regex(/^\d+\.\d+\.\d+$/u);
|
|
1191
|
+
var siteFieldRouteKeySchema = z15.string().trim().refine((value) => value === "$global" || value.startsWith("/") && !value.includes("?") && !value.includes("#") && (value === "/" || !value.endsWith("/")), "Route keys must be canonical paths or $global.");
|
|
1192
|
+
var repositoryRelativePosixPathSchema = z15.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.");
|
|
1193
|
+
var sourceMappingSchema = z15.object({
|
|
1194
|
+
kind: z15.literal("function"),
|
|
1159
1195
|
filePath: repositoryRelativePosixPathSchema,
|
|
1160
|
-
exportName:
|
|
1161
|
-
sourcePath:
|
|
1196
|
+
exportName: z15.string().trim().min(1).optional(),
|
|
1197
|
+
sourcePath: z15.string().trim().min(1).optional(),
|
|
1162
1198
|
editTarget: fieldIdSchema.optional()
|
|
1163
1199
|
}).strict();
|
|
1164
|
-
var domMappingSchema =
|
|
1165
|
-
attribute:
|
|
1166
|
-
previewStrategy:
|
|
1200
|
+
var domMappingSchema = z15.object({
|
|
1201
|
+
attribute: z15.literal("data-siteplane-field-id"),
|
|
1202
|
+
previewStrategy: z15.enum(["dom", "event"])
|
|
1167
1203
|
}).strict();
|
|
1168
|
-
var fieldBaseSchema =
|
|
1204
|
+
var fieldBaseSchema = z15.object({
|
|
1169
1205
|
fieldId: fieldIdSchema,
|
|
1170
1206
|
routeKey: siteFieldRouteKeySchema,
|
|
1171
1207
|
source: sourceMappingSchema,
|
|
1172
1208
|
dom: domMappingSchema.optional()
|
|
1173
1209
|
}).strict();
|
|
1174
|
-
var linkFallbackSchema2 =
|
|
1175
|
-
href:
|
|
1176
|
-
label:
|
|
1177
|
-
target:
|
|
1210
|
+
var linkFallbackSchema2 = z15.object({
|
|
1211
|
+
href: z15.string().trim().min(1),
|
|
1212
|
+
label: z15.string().trim().min(1).optional(),
|
|
1213
|
+
target: z15.enum(["_self", "_blank"]).optional()
|
|
1178
1214
|
}).strict();
|
|
1179
|
-
var imageFallbackSchema =
|
|
1180
|
-
src:
|
|
1181
|
-
alt:
|
|
1182
|
-
width:
|
|
1183
|
-
height:
|
|
1184
|
-
crop:
|
|
1185
|
-
x:
|
|
1186
|
-
y:
|
|
1187
|
-
zoom:
|
|
1188
|
-
aspectRatio:
|
|
1215
|
+
var imageFallbackSchema = z15.object({
|
|
1216
|
+
src: z15.string().trim().min(1),
|
|
1217
|
+
alt: z15.string().trim().max(300),
|
|
1218
|
+
width: z15.number().int().positive().optional(),
|
|
1219
|
+
height: z15.number().int().positive().optional(),
|
|
1220
|
+
crop: z15.object({
|
|
1221
|
+
x: z15.number().min(0).max(100),
|
|
1222
|
+
y: z15.number().min(0).max(100),
|
|
1223
|
+
zoom: z15.number().min(1).max(4),
|
|
1224
|
+
aspectRatio: z15.number().positive().max(10)
|
|
1189
1225
|
}).strict().optional()
|
|
1190
1226
|
}).strict();
|
|
1191
|
-
var siteFieldContractFieldSchema =
|
|
1227
|
+
var siteFieldContractFieldSchema = z15.discriminatedUnion("fieldType", [
|
|
1192
1228
|
fieldBaseSchema.extend({
|
|
1193
|
-
fieldType:
|
|
1194
|
-
fallback:
|
|
1229
|
+
fieldType: z15.literal("text"),
|
|
1230
|
+
fallback: z15.string()
|
|
1195
1231
|
}),
|
|
1196
1232
|
fieldBaseSchema.extend({
|
|
1197
|
-
fieldType:
|
|
1198
|
-
fallback:
|
|
1233
|
+
fieldType: z15.literal("longText"),
|
|
1234
|
+
fallback: z15.string()
|
|
1199
1235
|
}),
|
|
1200
1236
|
fieldBaseSchema.extend({
|
|
1201
|
-
fieldType:
|
|
1237
|
+
fieldType: z15.literal("link"),
|
|
1202
1238
|
fallback: linkFallbackSchema2
|
|
1203
1239
|
}),
|
|
1204
1240
|
fieldBaseSchema.extend({
|
|
1205
|
-
fieldType:
|
|
1241
|
+
fieldType: z15.literal("image"),
|
|
1206
1242
|
fallback: imageFallbackSchema
|
|
1207
1243
|
})
|
|
1208
1244
|
]);
|
|
1209
|
-
var siteFieldContractV1Schema =
|
|
1210
|
-
version:
|
|
1245
|
+
var siteFieldContractV1Schema = z15.object({
|
|
1246
|
+
version: z15.literal(1),
|
|
1211
1247
|
fieldContractVersion: semanticVersionSchema,
|
|
1212
1248
|
scannerContractVersion: semanticVersionSchema,
|
|
1213
|
-
fields:
|
|
1249
|
+
fields: z15.array(siteFieldContractFieldSchema)
|
|
1214
1250
|
}).strict().superRefine((contract, context) => {
|
|
1215
1251
|
const seen = /* @__PURE__ */ new Set();
|
|
1216
1252
|
for (const [index, field] of contract.fields.entries()) {
|
|
@@ -1270,20 +1306,20 @@ var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH = 2e3;
|
|
|
1270
1306
|
var SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES = 8e3;
|
|
1271
1307
|
var CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES = 32 * 1024;
|
|
1272
1308
|
var CONTINUE_SITE_SETUP_HTTP_BODY_MAX_BYTES = 64 * 1024;
|
|
1273
|
-
var siteSetupRunStatusSchema =
|
|
1274
|
-
var siteSetupRunModeSchema =
|
|
1275
|
-
var siteSetupErrorCodeSchema =
|
|
1276
|
-
var editorFieldSchema =
|
|
1309
|
+
var siteSetupRunStatusSchema = z16.enum(SITE_SETUP_RUN_STATUSES);
|
|
1310
|
+
var siteSetupRunModeSchema = z16.enum(SITE_SETUP_RUN_MODES);
|
|
1311
|
+
var siteSetupErrorCodeSchema = z16.enum(SITE_SETUP_ERROR_CODES);
|
|
1312
|
+
var editorFieldSchema = z16.object({
|
|
1277
1313
|
fieldId: fieldIdSchema,
|
|
1278
|
-
label:
|
|
1279
|
-
subsection:
|
|
1280
|
-
description:
|
|
1281
|
-
required:
|
|
1282
|
-
maxLength:
|
|
1314
|
+
label: z16.string().trim().min(1),
|
|
1315
|
+
subsection: z16.string().trim().min(1).optional(),
|
|
1316
|
+
description: z16.string().trim().min(1).optional(),
|
|
1317
|
+
required: z16.boolean().optional(),
|
|
1318
|
+
maxLength: z16.number().int().positive().optional()
|
|
1283
1319
|
}).strict();
|
|
1284
|
-
var editorSectionSchema =
|
|
1285
|
-
label:
|
|
1286
|
-
fields:
|
|
1320
|
+
var editorSectionSchema = z16.object({
|
|
1321
|
+
label: z16.string().trim().min(1),
|
|
1322
|
+
fields: z16.array(editorFieldSchema).min(1)
|
|
1287
1323
|
}).strict().superRefine((section, context) => {
|
|
1288
1324
|
const closedSubsections = /* @__PURE__ */ new Set();
|
|
1289
1325
|
let currentSubsection;
|
|
@@ -1302,10 +1338,10 @@ var editorSectionSchema = z15.object({
|
|
|
1302
1338
|
}
|
|
1303
1339
|
}
|
|
1304
1340
|
});
|
|
1305
|
-
var editorRouteSchema =
|
|
1341
|
+
var editorRouteSchema = z16.object({
|
|
1306
1342
|
routeKey: siteFieldRouteKeySchema,
|
|
1307
|
-
label:
|
|
1308
|
-
sections:
|
|
1343
|
+
label: z16.string().trim().min(1),
|
|
1344
|
+
sections: z16.array(editorSectionSchema).min(1)
|
|
1309
1345
|
}).strict().superRefine((route, context) => {
|
|
1310
1346
|
const sections = /* @__PURE__ */ new Set();
|
|
1311
1347
|
for (const [index, section] of route.sections.entries()) {
|
|
@@ -1319,9 +1355,9 @@ var editorRouteSchema = z15.object({
|
|
|
1319
1355
|
sections.add(section.label);
|
|
1320
1356
|
}
|
|
1321
1357
|
});
|
|
1322
|
-
var editorDefinitionV1Schema =
|
|
1323
|
-
version:
|
|
1324
|
-
routes:
|
|
1358
|
+
var editorDefinitionV1Schema = z16.object({
|
|
1359
|
+
version: z16.literal(1),
|
|
1360
|
+
routes: z16.array(editorRouteSchema).min(1)
|
|
1325
1361
|
}).strict().superRefine((definition, context) => {
|
|
1326
1362
|
const routes = /* @__PURE__ */ new Set();
|
|
1327
1363
|
const fields = /* @__PURE__ */ new Set();
|
|
@@ -1359,7 +1395,7 @@ var editorDefinitionV1Schema = z15.object({
|
|
|
1359
1395
|
var forbiddenControlOrBidi = /[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
|
|
1360
1396
|
var forbiddenOwnerNoteControlOrBidi = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/u;
|
|
1361
1397
|
var unsafeLocator = /<\/?[a-z][^>]*>|\b(?:javascript|data:text\/html)\s*:|\bon[a-z]+\s*=/iu;
|
|
1362
|
-
var renderedPathSchema =
|
|
1398
|
+
var renderedPathSchema = z16.string().trim().transform((value) => value !== "/" ? value.replace(/\/+$/u, "") : value).superRefine((value, context) => {
|
|
1363
1399
|
if (!value.startsWith("/") || value === "$global" || value.includes("?") || value.includes("#")) {
|
|
1364
1400
|
context.addIssue({
|
|
1365
1401
|
code: "custom",
|
|
@@ -1369,7 +1405,7 @@ var renderedPathSchema = z15.string().trim().transform((value) => value !== "/"
|
|
|
1369
1405
|
addSafeByteIssues(value, CONTINUE_SITE_SETUP_RENDERED_PATH_MAX_BYTES, "renderedPath", context);
|
|
1370
1406
|
});
|
|
1371
1407
|
function normalizedSafeTextSchema(maxBytes, label) {
|
|
1372
|
-
return
|
|
1408
|
+
return z16.string().transform((value) => value.trim().replace(new RegExp("\\p{White_Space}+", "gu"), " ")).pipe(z16.string().min(1)).superRefine((value, context) => {
|
|
1373
1409
|
addSafeByteIssues(value, maxBytes, label, context);
|
|
1374
1410
|
if (label === "locatorHint" && unsafeLocator.test(value)) {
|
|
1375
1411
|
context.addIssue({
|
|
@@ -1386,12 +1422,12 @@ var correctionItemBase = {
|
|
|
1386
1422
|
requestedLabel: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_LABEL_MAX_BYTES, "requestedLabel").optional(),
|
|
1387
1423
|
requestedSection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SECTION_MAX_BYTES, "requestedSection").optional(),
|
|
1388
1424
|
requestedSubsection: normalizedSafeTextSchema(CONTINUE_SITE_SETUP_REQUESTED_SUBSECTION_MAX_BYTES, "requestedSubsection").optional(),
|
|
1389
|
-
requestedSortOrder:
|
|
1425
|
+
requestedSortOrder: z16.number().int().nonnegative().optional()
|
|
1390
1426
|
};
|
|
1391
|
-
var setupCorrectionItemSchema =
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1427
|
+
var setupCorrectionItemSchema = z16.discriminatedUnion("kind", [
|
|
1428
|
+
z16.object({ kind: z16.literal("text"), ...correctionItemBase }).strict(),
|
|
1429
|
+
z16.object({ kind: z16.literal("link"), ...correctionItemBase }).strict(),
|
|
1430
|
+
z16.object({ kind: z16.literal("image"), ...correctionItemBase }).strict()
|
|
1395
1431
|
]).superRefine((item, context) => {
|
|
1396
1432
|
if (item.requestedSubsection && !item.requestedSection) {
|
|
1397
1433
|
context.addIssue({
|
|
@@ -1401,7 +1437,7 @@ var setupCorrectionItemSchema = z15.discriminatedUnion("kind", [
|
|
|
1401
1437
|
});
|
|
1402
1438
|
}
|
|
1403
1439
|
});
|
|
1404
|
-
var setupCorrectionItemsSchema =
|
|
1440
|
+
var setupCorrectionItemsSchema = z16.array(setupCorrectionItemSchema).max(CONTINUE_SITE_SETUP_MAX_ITEMS).superRefine((items, context) => {
|
|
1405
1441
|
const bytes = utf8Bytes(stableJsonStringify(items));
|
|
1406
1442
|
if (bytes > CONTINUE_SITE_SETUP_ITEMS_MAX_BYTES) {
|
|
1407
1443
|
context.addIssue({
|
|
@@ -1410,7 +1446,7 @@ var setupCorrectionItemsSchema = z15.array(setupCorrectionItemSchema).max(CONTIN
|
|
|
1410
1446
|
});
|
|
1411
1447
|
}
|
|
1412
1448
|
});
|
|
1413
|
-
var siteSetupOwnerEditabilityNoteSchema =
|
|
1449
|
+
var siteSetupOwnerEditabilityNoteSchema = z16.string().max(SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_LENGTH).superRefine((value, context) => {
|
|
1414
1450
|
if (utf8Bytes(value) > SITE_SETUP_OWNER_EDITABILITY_NOTE_MAX_BYTES) {
|
|
1415
1451
|
context.addIssue({
|
|
1416
1452
|
code: "custom",
|
|
@@ -1435,7 +1471,7 @@ var SITE_SETUP_MODULE_SCOPES = {
|
|
|
1435
1471
|
"analytics:public_key_read"
|
|
1436
1472
|
]
|
|
1437
1473
|
};
|
|
1438
|
-
var siteSetupModulesSchema =
|
|
1474
|
+
var siteSetupModulesSchema = z16.array(z16.enum(["editing", "analytics"])).min(1).max(2).refine((modules) => modules[0] === "editing" && (modules.length === 1 || modules[1] === "analytics"), "Choose Editing with optional Analytics.");
|
|
1439
1475
|
function siteSetupScopes(modules) {
|
|
1440
1476
|
return modules.flatMap((module) => [...SITE_SETUP_MODULE_SCOPES[module]]);
|
|
1441
1477
|
}
|
|
@@ -1443,15 +1479,15 @@ function hasExactSiteSetupScopes(scopes, modules) {
|
|
|
1443
1479
|
const matches = (expected) => scopes.length === expected.length && expected.every((scope) => scopes.includes(scope));
|
|
1444
1480
|
return modules ? matches(siteSetupScopes(modules)) : matches(siteSetupScopes(["editing"])) || matches(siteSetupScopes(["editing", "analytics"]));
|
|
1445
1481
|
}
|
|
1446
|
-
var siteSetupActivityInputSchema =
|
|
1447
|
-
phase:
|
|
1482
|
+
var siteSetupActivityInputSchema = z16.object({
|
|
1483
|
+
phase: z16.enum([
|
|
1448
1484
|
"inspecting",
|
|
1449
1485
|
"integrating",
|
|
1450
1486
|
"deploying",
|
|
1451
1487
|
"verifying",
|
|
1452
1488
|
"repairing"
|
|
1453
1489
|
]),
|
|
1454
|
-
textId:
|
|
1490
|
+
textId: z16.enum([
|
|
1455
1491
|
"inspecting",
|
|
1456
1492
|
"integrating",
|
|
1457
1493
|
"deploying",
|
|
@@ -1460,8 +1496,8 @@ var siteSetupActivityInputSchema = z15.object({
|
|
|
1460
1496
|
])
|
|
1461
1497
|
}).strict().refine((value) => value.phase === value.textId, "Activity text must describe its phase.");
|
|
1462
1498
|
var nextActionFields = {
|
|
1463
|
-
actor:
|
|
1464
|
-
boundary:
|
|
1499
|
+
actor: z16.enum(["agent", "user", "siteplane"]),
|
|
1500
|
+
boundary: z16.enum([
|
|
1465
1501
|
"source",
|
|
1466
1502
|
"environment",
|
|
1467
1503
|
"deployment",
|
|
@@ -1469,33 +1505,33 @@ var nextActionFields = {
|
|
|
1469
1505
|
"authorization",
|
|
1470
1506
|
"review"
|
|
1471
1507
|
]),
|
|
1472
|
-
precondition:
|
|
1473
|
-
instruction:
|
|
1474
|
-
expectedEvidence:
|
|
1508
|
+
precondition: z16.string().min(1).max(1e3),
|
|
1509
|
+
instruction: z16.string().min(1).max(2e3),
|
|
1510
|
+
expectedEvidence: z16.string().min(1).max(1e3)
|
|
1475
1511
|
};
|
|
1476
|
-
var siteSetupNextActionSchema =
|
|
1477
|
-
|
|
1512
|
+
var siteSetupNextActionSchema = z16.discriminatedUnion("kind", [
|
|
1513
|
+
z16.object({
|
|
1478
1514
|
...nextActionFields,
|
|
1479
|
-
kind:
|
|
1480
|
-
command:
|
|
1515
|
+
kind: z16.literal("run_command"),
|
|
1516
|
+
command: z16.string().min(1).max(500)
|
|
1481
1517
|
}).strict(),
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1518
|
+
z16.object({ ...nextActionFields, kind: z16.literal("agent_edit") }).strict(),
|
|
1519
|
+
z16.object({ ...nextActionFields, kind: z16.literal("needs_user_action") }).strict(),
|
|
1520
|
+
z16.object({ ...nextActionFields, kind: z16.literal("wait") }).strict(),
|
|
1521
|
+
z16.object({ ...nextActionFields, kind: z16.literal("done") }).strict()
|
|
1486
1522
|
]);
|
|
1487
|
-
var siteSetupTaskRunSchema =
|
|
1488
|
-
runId:
|
|
1523
|
+
var siteSetupTaskRunSchema = z16.object({
|
|
1524
|
+
runId: z16.string().uuid(),
|
|
1489
1525
|
mode: siteSetupRunModeSchema,
|
|
1490
1526
|
status: siteSetupRunStatusSchema,
|
|
1491
|
-
fieldContractHash:
|
|
1492
|
-
deploymentOrigin:
|
|
1493
|
-
deploymentRevision:
|
|
1494
|
-
publicRuntimeKeyId:
|
|
1495
|
-
reviewVersion:
|
|
1527
|
+
fieldContractHash: z16.string().nullable(),
|
|
1528
|
+
deploymentOrigin: z16.string().url().nullable(),
|
|
1529
|
+
deploymentRevision: z16.string().nullable(),
|
|
1530
|
+
publicRuntimeKeyId: z16.string().uuid().nullable(),
|
|
1531
|
+
reviewVersion: z16.number().int().positive()
|
|
1496
1532
|
}).strict();
|
|
1497
|
-
var siteSetupTaskProgressSchema =
|
|
1498
|
-
progressStage:
|
|
1533
|
+
var siteSetupTaskProgressSchema = z16.object({
|
|
1534
|
+
progressStage: z16.enum([
|
|
1499
1535
|
"waiting_for_connection",
|
|
1500
1536
|
"agent_connected",
|
|
1501
1537
|
"project_context_loaded",
|
|
@@ -1505,73 +1541,70 @@ var siteSetupTaskProgressSchema = z15.object({
|
|
|
1505
1541
|
"action_required",
|
|
1506
1542
|
"completed"
|
|
1507
1543
|
]),
|
|
1508
|
-
lastVerifiedAt:
|
|
1509
|
-
lastActivityAt:
|
|
1510
|
-
activitySource:
|
|
1544
|
+
lastVerifiedAt: z16.string().datetime().nullable(),
|
|
1545
|
+
lastActivityAt: z16.string().datetime(),
|
|
1546
|
+
activitySource: z16.enum(["user", "server", "agent"]),
|
|
1511
1547
|
activityPhase: siteSetupActivityInputSchema.shape.phase.nullable(),
|
|
1512
1548
|
activityTextId: siteSetupActivityInputSchema.shape.textId.nullable()
|
|
1513
1549
|
}).strict();
|
|
1514
|
-
var siteSetupTaskSchema =
|
|
1515
|
-
contractVersion:
|
|
1516
|
-
workflow:
|
|
1517
|
-
goal:
|
|
1550
|
+
var siteSetupTaskSchema = z16.object({
|
|
1551
|
+
contractVersion: z16.literal("siteplane.setup-task.v2"),
|
|
1552
|
+
workflow: z16.enum(["initial_setup", "structure_update"]),
|
|
1553
|
+
goal: z16.string().min(1),
|
|
1518
1554
|
modules: siteSetupModulesSchema,
|
|
1519
|
-
authorizationVersion:
|
|
1520
|
-
authorizedScopes:
|
|
1521
|
-
site:
|
|
1522
|
-
siteId:
|
|
1523
|
-
portalPath:
|
|
1524
|
-
adminOrigin:
|
|
1555
|
+
authorizationVersion: z16.number().int().positive(),
|
|
1556
|
+
authorizedScopes: z16.array(z16.string()).min(2),
|
|
1557
|
+
site: z16.object({
|
|
1558
|
+
siteId: z16.string().uuid(),
|
|
1559
|
+
portalPath: z16.string(),
|
|
1560
|
+
adminOrigin: z16.string().url()
|
|
1525
1561
|
}).strict().nullable(),
|
|
1526
1562
|
run: siteSetupTaskRunSchema.nullable(),
|
|
1527
1563
|
progress: siteSetupTaskProgressSchema.nullable(),
|
|
1528
1564
|
deployment: setupDeploymentRecordSchema.nullable(),
|
|
1529
|
-
revalidationGeneration:
|
|
1530
|
-
assignment:
|
|
1531
|
-
deadline:
|
|
1532
|
-
userInstructions:
|
|
1565
|
+
revalidationGeneration: z16.number().int().positive(),
|
|
1566
|
+
assignment: z16.literal("owned"),
|
|
1567
|
+
deadline: z16.string().datetime().nullable(),
|
|
1568
|
+
userInstructions: z16.object({
|
|
1533
1569
|
text: siteSetupOwnerEditabilityNoteSchema,
|
|
1534
|
-
source:
|
|
1535
|
-
trust:
|
|
1570
|
+
source: z16.literal("user"),
|
|
1571
|
+
trust: z16.literal("untrusted")
|
|
1536
1572
|
}).strict(),
|
|
1537
1573
|
corrections: setupCorrectionItemsSchema,
|
|
1538
|
-
contentSelectionSummary:
|
|
1574
|
+
contentSelectionSummary: z16.object({
|
|
1539
1575
|
text: siteSetupOwnerEditabilityNoteSchema,
|
|
1540
|
-
source:
|
|
1541
|
-
trust:
|
|
1576
|
+
source: z16.literal("agent"),
|
|
1577
|
+
trust: z16.literal("untrusted")
|
|
1542
1578
|
}).strict().nullable(),
|
|
1543
|
-
environmentBindings:
|
|
1544
|
-
name:
|
|
1545
|
-
source:
|
|
1546
|
-
sensitivity:
|
|
1547
|
-
usage:
|
|
1548
|
-
evidence:
|
|
1579
|
+
environmentBindings: z16.array(z16.object({
|
|
1580
|
+
name: z16.string().regex(/^[A-Z][A-Z0-9_]+$/u),
|
|
1581
|
+
source: z16.string().min(1),
|
|
1582
|
+
sensitivity: z16.enum(["public", "secret"]),
|
|
1583
|
+
usage: z16.enum(["build", "server", "build_and_server"]),
|
|
1584
|
+
evidence: z16.string().min(1)
|
|
1549
1585
|
}).strict()),
|
|
1550
1586
|
nextAction: siteSetupNextActionSchema,
|
|
1551
|
-
error:
|
|
1552
|
-
code:
|
|
1587
|
+
error: z16.object({
|
|
1588
|
+
code: z16.string().regex(/^[a-z0-9_.]+$/u).max(160),
|
|
1553
1589
|
boundary: nextActionFields.boundary,
|
|
1554
1590
|
responsibleActor: nextActionFields.actor,
|
|
1555
|
-
retryable:
|
|
1556
|
-
retryAfter:
|
|
1557
|
-
requestId:
|
|
1591
|
+
retryable: z16.boolean(),
|
|
1592
|
+
retryAfter: z16.number().int().nonnegative().nullable(),
|
|
1593
|
+
requestId: z16.string().regex(/^[A-Za-z0-9_-]+$/u).max(128)
|
|
1558
1594
|
}).strict().nullable(),
|
|
1559
|
-
packages:
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
beforeSourceChanges: z15.string().min(1),
|
|
1565
|
-
updates: z15.array(z15.string().min(1)).min(1),
|
|
1566
|
-
blocker: z15.string().min(1)
|
|
1595
|
+
packages: siteSetupPackagesSchema,
|
|
1596
|
+
communication: z16.object({
|
|
1597
|
+
beforeSourceChanges: z16.string().min(1),
|
|
1598
|
+
updates: z16.array(z16.string().min(1)).min(1),
|
|
1599
|
+
blocker: z16.string().min(1)
|
|
1567
1600
|
}).strict(),
|
|
1568
|
-
discovery:
|
|
1569
|
-
inspectPublicRoutes:
|
|
1570
|
-
contentKinds:
|
|
1571
|
-
rules:
|
|
1601
|
+
discovery: z16.object({
|
|
1602
|
+
inspectPublicRoutes: z16.boolean(),
|
|
1603
|
+
contentKinds: z16.array(z16.enum(["text", "longText", "link", "image"])).min(1),
|
|
1604
|
+
rules: z16.array(z16.string().min(1)).min(1)
|
|
1572
1605
|
}).strict(),
|
|
1573
|
-
steps:
|
|
1574
|
-
id:
|
|
1606
|
+
steps: z16.array(z16.object({
|
|
1607
|
+
id: z16.enum([
|
|
1575
1608
|
"inspect_repository",
|
|
1576
1609
|
"install_packages",
|
|
1577
1610
|
"instrument_fields",
|
|
@@ -1579,32 +1612,52 @@ var siteSetupTaskSchema = z15.object({
|
|
|
1579
1612
|
"deploy_production",
|
|
1580
1613
|
"verify_deployment"
|
|
1581
1614
|
]),
|
|
1582
|
-
instruction:
|
|
1615
|
+
instruction: z16.string().min(1)
|
|
1583
1616
|
}).strict()).length(6),
|
|
1584
|
-
completion:
|
|
1585
|
-
verifiedStatus:
|
|
1586
|
-
instruction:
|
|
1617
|
+
completion: z16.object({
|
|
1618
|
+
verifiedStatus: z16.literal("ready_for_review"),
|
|
1619
|
+
instruction: z16.string().min(1)
|
|
1587
1620
|
}).strict()
|
|
1588
|
-
}).strict().refine((task) => hasExactSiteSetupScopes(task.authorizedScopes, task.modules), "Task scopes must exactly match its modules.");
|
|
1589
|
-
var canonicalHashSchema =
|
|
1621
|
+
}).strict().refine((task) => hasExactSiteSetupScopes(task.authorizedScopes, task.modules), "Task scopes must exactly match its modules.").refine((task) => task.modules.includes("analytics") === (task.packages.analytics !== void 0), "The Analytics package pin must be present exactly when Analytics is selected.");
|
|
1622
|
+
var canonicalHashSchema = z16.string().regex(/^sha256:[0-9a-f]{64}$/iu);
|
|
1590
1623
|
var deploymentRevisionSchema = normalizedSafeTextSchema(256, "deploymentRevision");
|
|
1591
|
-
var continueSiteSetupInputSchema =
|
|
1592
|
-
siteId:
|
|
1593
|
-
runId:
|
|
1624
|
+
var continueSiteSetupInputSchema = z16.object({
|
|
1625
|
+
siteId: z16.string().uuid(),
|
|
1626
|
+
runId: z16.string().uuid(),
|
|
1627
|
+
expectedReviewVersion: z16.number().int().positive(),
|
|
1628
|
+
mutationId: z16.string().uuid(),
|
|
1629
|
+
intent: z16.enum(["continue_review", "correct_completed_review"]),
|
|
1594
1630
|
expectedFieldContractHash: canonicalHashSchema,
|
|
1595
1631
|
expectedDeploymentRevision: deploymentRevisionSchema,
|
|
1596
1632
|
correctionItems: setupCorrectionItemsSchema,
|
|
1597
1633
|
ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema.optional()
|
|
1598
1634
|
}).strict();
|
|
1599
|
-
var saveSiteSetupOwnerNoteInputSchema =
|
|
1600
|
-
siteId:
|
|
1601
|
-
runId:
|
|
1635
|
+
var saveSiteSetupOwnerNoteInputSchema = z16.object({
|
|
1636
|
+
siteId: z16.string().uuid(),
|
|
1637
|
+
runId: z16.string().uuid(),
|
|
1638
|
+
expectedReviewVersion: z16.number().int().positive(),
|
|
1602
1639
|
expectedFieldContractHash: canonicalHashSchema,
|
|
1603
1640
|
expectedDeploymentRevision: deploymentRevisionSchema,
|
|
1604
1641
|
ownerEditabilityNote: siteSetupOwnerEditabilityNoteSchema
|
|
1605
1642
|
}).strict();
|
|
1606
|
-
var
|
|
1607
|
-
|
|
1643
|
+
var setupReviewPreferenceSelectionSchema = z16.object({
|
|
1644
|
+
analyticsMode: z16.enum(["disabled", "session_only"]).nullable(),
|
|
1645
|
+
assetTargetType: z16.enum(["repo_static_assets", "siteplane_managed_fallback"]).nullable(),
|
|
1646
|
+
assetTargetId: z16.string().uuid().nullable()
|
|
1647
|
+
}).strict().refine((value) => value.assetTargetType !== null || value.assetTargetId === null, {
|
|
1648
|
+
message: "An asset target requires its delivery type."
|
|
1649
|
+
});
|
|
1650
|
+
var setupReviewPreferencesSchema = setupReviewPreferenceSelectionSchema.safeExtend({
|
|
1651
|
+
managedHostingApproved: z16.boolean()
|
|
1652
|
+
});
|
|
1653
|
+
var saveSetupReviewPreferencesInputSchema = z16.object({
|
|
1654
|
+
siteId: z16.string().uuid(),
|
|
1655
|
+
runId: z16.string().uuid(),
|
|
1656
|
+
expectedReviewVersion: z16.number().int().positive(),
|
|
1657
|
+
preferences: setupReviewPreferenceSelectionSchema
|
|
1658
|
+
}).strict();
|
|
1659
|
+
var siteSetupContextInputSchema = z16.object({}).strict();
|
|
1660
|
+
var siteSetupApplyInputSchema = z16.object({
|
|
1608
1661
|
fieldContract: siteFieldContractV1Schema,
|
|
1609
1662
|
editorDefinition: editorDefinitionV1Schema,
|
|
1610
1663
|
contentSelectionSummary: siteSetupOwnerEditabilityNoteSchema.refine((text) => text.trim().length > 0, "Describe the selected content, important exclusions and any open gaps.")
|
|
@@ -1671,37 +1724,44 @@ var siteSetupApplyInputSchema = z15.object({
|
|
|
1671
1724
|
}
|
|
1672
1725
|
}
|
|
1673
1726
|
});
|
|
1674
|
-
var siteSetupVerifyInputSchema =
|
|
1675
|
-
deploymentUrl:
|
|
1727
|
+
var siteSetupVerifyInputSchema = z16.object({
|
|
1728
|
+
deploymentUrl: z16.string().url().refine((value) => value.startsWith("https://")),
|
|
1676
1729
|
deploymentRevision: deploymentRevisionSchema,
|
|
1677
|
-
wait:
|
|
1730
|
+
wait: z16.boolean().optional()
|
|
1678
1731
|
}).strict();
|
|
1679
|
-
var siteSetupEvidenceInputSchema =
|
|
1680
|
-
siteId:
|
|
1681
|
-
runId:
|
|
1732
|
+
var siteSetupEvidenceInputSchema = z16.object({
|
|
1733
|
+
siteId: z16.string().uuid(),
|
|
1734
|
+
runId: z16.string().uuid(),
|
|
1682
1735
|
expectedFieldContractHash: canonicalHashSchema,
|
|
1683
|
-
expectedDeploymentOrigin:
|
|
1736
|
+
expectedDeploymentOrigin: z16.string().url().refine((value) => value.startsWith("https://")),
|
|
1684
1737
|
expectedDeploymentRevision: deploymentRevisionSchema,
|
|
1685
|
-
publicRuntimeKeyId:
|
|
1738
|
+
publicRuntimeKeyId: z16.string().uuid(),
|
|
1686
1739
|
bridgeSessionId: normalizedSafeTextSchema(256, "bridgeSessionId"),
|
|
1687
|
-
observations:
|
|
1740
|
+
observations: z16.array(z16.object({
|
|
1688
1741
|
fieldId: fieldIdSchema,
|
|
1689
1742
|
routeKey: siteFieldRouteKeySchema,
|
|
1690
1743
|
renderedPath: renderedPathSchema,
|
|
1691
|
-
targetResolved:
|
|
1692
|
-
previewAck:
|
|
1744
|
+
targetResolved: z16.boolean(),
|
|
1745
|
+
previewAck: z16.boolean()
|
|
1693
1746
|
}).strict().refine((value) => !value.previewAck || value.targetResolved, "Preview ACK requires a resolved target.")).min(1).max(200)
|
|
1694
1747
|
}).strict();
|
|
1695
|
-
var
|
|
1696
|
-
siteId:
|
|
1697
|
-
runId:
|
|
1748
|
+
var completeSetupReviewInputSchema = z16.object({
|
|
1749
|
+
siteId: z16.string().uuid(),
|
|
1750
|
+
runId: z16.string().uuid(),
|
|
1751
|
+
expectedReviewVersion: z16.number().int().positive(),
|
|
1698
1752
|
expectedFieldContractHash: canonicalHashSchema,
|
|
1699
1753
|
expectedDeploymentRevision: deploymentRevisionSchema,
|
|
1700
1754
|
expectedReadyFingerprint: canonicalHashSchema
|
|
1701
1755
|
}).strict();
|
|
1702
|
-
var
|
|
1703
|
-
siteId:
|
|
1704
|
-
|
|
1756
|
+
var activateSiteSetupInputSchema = z16.object({
|
|
1757
|
+
siteId: z16.string().uuid(),
|
|
1758
|
+
runId: z16.string().uuid(),
|
|
1759
|
+
expectedReviewVersion: z16.number().int().positive(),
|
|
1760
|
+
expectedSnapshotHash: canonicalHashSchema
|
|
1761
|
+
}).strict();
|
|
1762
|
+
var refreshSiteSetupDeploymentInputSchema = z16.object({
|
|
1763
|
+
siteId: z16.string().uuid(),
|
|
1764
|
+
deploymentUrl: z16.string().url().refine((value) => value.startsWith("https://")),
|
|
1705
1765
|
deploymentRevision: deploymentRevisionSchema
|
|
1706
1766
|
}).strict();
|
|
1707
1767
|
function addSafeByteIssues(value, maxBytes, label, context) {
|
|
@@ -1721,37 +1781,61 @@ function addSafeByteIssues(value, maxBytes, label, context) {
|
|
|
1721
1781
|
function utf8Bytes(value) {
|
|
1722
1782
|
return new TextEncoder().encode(value).byteLength;
|
|
1723
1783
|
}
|
|
1784
|
+
var setupActivationApprovalSchema = z16.object({
|
|
1785
|
+
reviewVersion: z16.number().int().positive(),
|
|
1786
|
+
snapshotHash: canonicalHashSchema,
|
|
1787
|
+
analytics: z16.object({
|
|
1788
|
+
status: z16.enum(["active", "skipped"]),
|
|
1789
|
+
reviewVersion: z16.number().int().positive(),
|
|
1790
|
+
generation: z16.number().int().nonnegative()
|
|
1791
|
+
}).optional()
|
|
1792
|
+
});
|
|
1793
|
+
var activateSetupModulesInputSchema = activateSiteSetupInputSchema.extend({
|
|
1794
|
+
analytics: z16.discriminatedUnion("decision", [
|
|
1795
|
+
z16.object({ decision: z16.literal("pending") }).strict(),
|
|
1796
|
+
z16.object({
|
|
1797
|
+
decision: z16.literal("enable"),
|
|
1798
|
+
expectedInstallationGeneration: z16.number().int().positive(),
|
|
1799
|
+
measurementApproved: z16.literal(true)
|
|
1800
|
+
}).strict(),
|
|
1801
|
+
z16.object({
|
|
1802
|
+
decision: z16.literal("skip"),
|
|
1803
|
+
expectedInstallationGeneration: z16.number().int().nonnegative(),
|
|
1804
|
+
continueWithoutAnalytics: z16.literal(true)
|
|
1805
|
+
}).strict()
|
|
1806
|
+
])
|
|
1807
|
+
}).strict();
|
|
1724
1808
|
|
|
1725
1809
|
// ../shared/dist/bridge-protocol.js
|
|
1726
1810
|
var BRIDGE_PROTOCOL_VERSION = 2;
|
|
1727
|
-
var bridgeRectSchema =
|
|
1728
|
-
x:
|
|
1729
|
-
y:
|
|
1730
|
-
width:
|
|
1731
|
-
height:
|
|
1732
|
-
});
|
|
1733
|
-
var previewTextValueSchema =
|
|
1734
|
-
fieldType:
|
|
1735
|
-
value:
|
|
1736
|
-
});
|
|
1737
|
-
var previewLinkValueSchema =
|
|
1738
|
-
fieldType:
|
|
1739
|
-
value:
|
|
1740
|
-
href:
|
|
1741
|
-
label:
|
|
1811
|
+
var bridgeRectSchema = z17.object({
|
|
1812
|
+
x: z17.number(),
|
|
1813
|
+
y: z17.number(),
|
|
1814
|
+
width: z17.number().nonnegative(),
|
|
1815
|
+
height: z17.number().nonnegative()
|
|
1816
|
+
});
|
|
1817
|
+
var previewTextValueSchema = z17.object({
|
|
1818
|
+
fieldType: z17.enum(["text", "longText"]),
|
|
1819
|
+
value: z17.string()
|
|
1820
|
+
});
|
|
1821
|
+
var previewLinkValueSchema = z17.object({
|
|
1822
|
+
fieldType: z17.literal("link"),
|
|
1823
|
+
value: z17.object({
|
|
1824
|
+
href: z17.string().trim().min(1),
|
|
1825
|
+
label: z17.string().trim().min(1).optional()
|
|
1742
1826
|
})
|
|
1743
1827
|
});
|
|
1744
|
-
var previewImageValueSchema =
|
|
1745
|
-
fieldType:
|
|
1828
|
+
var previewImageValueSchema = z17.object({
|
|
1829
|
+
fieldType: z17.literal("image"),
|
|
1746
1830
|
value: imageValueSchema
|
|
1747
1831
|
});
|
|
1748
|
-
var bridgePreviewValueSchema =
|
|
1832
|
+
var bridgePreviewValueSchema = z17.discriminatedUnion("fieldType", [
|
|
1749
1833
|
previewTextValueSchema,
|
|
1750
1834
|
previewLinkValueSchema,
|
|
1751
1835
|
previewImageValueSchema
|
|
1752
1836
|
]);
|
|
1753
|
-
var fieldSelectionModeSchema =
|
|
1754
|
-
var fieldBridgeMissingContentActionSchema =
|
|
1837
|
+
var fieldSelectionModeSchema = z17.enum(["replace", "range", "toggle"]);
|
|
1838
|
+
var fieldBridgeMissingContentActionSchema = z17.enum([
|
|
1755
1839
|
"add",
|
|
1756
1840
|
"select",
|
|
1757
1841
|
"remove"
|
|
@@ -1768,79 +1852,81 @@ var FIELD_BRIDGE_MESSAGE_TYPES = [
|
|
|
1768
1852
|
"siteplane:field-bridge:set-visual-control-state",
|
|
1769
1853
|
"siteplane:field-bridge:missing-content",
|
|
1770
1854
|
"siteplane:field-bridge:preview-scrolled",
|
|
1855
|
+
"siteplane:field-bridge:analytics-probe",
|
|
1856
|
+
"siteplane:field-bridge:analytics-probe-result",
|
|
1771
1857
|
"siteplane:field-bridge:error"
|
|
1772
1858
|
];
|
|
1773
|
-
var canonicalFieldContractHashSchema =
|
|
1774
|
-
var bridgeSectionSchema =
|
|
1775
|
-
var realRenderedPathSchema =
|
|
1776
|
-
var fieldBridgeIdentitySchema =
|
|
1777
|
-
publicRuntimeKeyId:
|
|
1859
|
+
var canonicalFieldContractHashSchema = z17.string().regex(/^sha256:[0-9a-f]{64}$/u);
|
|
1860
|
+
var bridgeSectionSchema = z17.string().trim().min(1).max(256);
|
|
1861
|
+
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.");
|
|
1862
|
+
var fieldBridgeIdentitySchema = z17.object({
|
|
1863
|
+
publicRuntimeKeyId: z17.string().uuid(),
|
|
1778
1864
|
fieldContractHash: canonicalFieldContractHashSchema,
|
|
1779
|
-
deploymentRevision:
|
|
1865
|
+
deploymentRevision: z17.string().trim().min(1).max(256)
|
|
1780
1866
|
}).strict();
|
|
1781
|
-
var fieldBridgeBaseSchema =
|
|
1782
|
-
version:
|
|
1783
|
-
type:
|
|
1784
|
-
siteId:
|
|
1785
|
-
sessionId:
|
|
1786
|
-
publicRuntimeKeyId:
|
|
1867
|
+
var fieldBridgeBaseSchema = z17.object({
|
|
1868
|
+
version: z17.literal(BRIDGE_PROTOCOL_VERSION),
|
|
1869
|
+
type: z17.enum(FIELD_BRIDGE_MESSAGE_TYPES),
|
|
1870
|
+
siteId: z17.string().uuid(),
|
|
1871
|
+
sessionId: z17.string().trim().min(1),
|
|
1872
|
+
publicRuntimeKeyId: z17.string().uuid(),
|
|
1787
1873
|
fieldContractHash: canonicalFieldContractHashSchema,
|
|
1788
|
-
deploymentRevision:
|
|
1789
|
-
requestId:
|
|
1790
|
-
sentAt:
|
|
1874
|
+
deploymentRevision: z17.string().trim().min(1).max(256),
|
|
1875
|
+
requestId: z17.string().trim().min(1),
|
|
1876
|
+
sentAt: z17.string().datetime()
|
|
1791
1877
|
}).strict();
|
|
1792
|
-
var fieldBridgeFieldSchema =
|
|
1878
|
+
var fieldBridgeFieldSchema = z17.object({
|
|
1793
1879
|
fieldId: fieldIdSchema,
|
|
1794
1880
|
fieldType: fieldTypeSchema,
|
|
1795
1881
|
routeKey: siteFieldRouteKeySchema,
|
|
1796
1882
|
renderedPath: realRenderedPathSchema,
|
|
1797
|
-
sourcePath:
|
|
1883
|
+
sourcePath: z17.string().trim().min(1).optional(),
|
|
1798
1884
|
editTarget: fieldIdSchema,
|
|
1799
1885
|
rect: bridgeRectSchema,
|
|
1800
|
-
targetResolved:
|
|
1886
|
+
targetResolved: z17.literal(true),
|
|
1801
1887
|
currentValue: bridgePreviewValueSchema.optional()
|
|
1802
1888
|
}).strict();
|
|
1803
1889
|
var fieldBridgeInitMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1804
|
-
type:
|
|
1805
|
-
payload:
|
|
1806
|
-
adminOrigin:
|
|
1807
|
-
customerOrigin:
|
|
1890
|
+
type: z17.literal("siteplane:field-bridge:init"),
|
|
1891
|
+
payload: z17.object({
|
|
1892
|
+
adminOrigin: z17.string().url(),
|
|
1893
|
+
customerOrigin: z17.string().url(),
|
|
1808
1894
|
renderedPath: realRenderedPathSchema
|
|
1809
1895
|
}).strict()
|
|
1810
1896
|
});
|
|
1811
1897
|
var fieldBridgeReadyMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1812
|
-
type:
|
|
1813
|
-
payload:
|
|
1898
|
+
type: z17.literal("siteplane:field-bridge:ready"),
|
|
1899
|
+
payload: z17.object({
|
|
1814
1900
|
renderedPath: realRenderedPathSchema,
|
|
1815
|
-
fieldCount:
|
|
1816
|
-
capabilities:
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
])
|
|
1901
|
+
fieldCount: z17.number().int().nonnegative(),
|
|
1902
|
+
capabilities: z17.tuple([
|
|
1903
|
+
z17.literal("field_selection"),
|
|
1904
|
+
z17.literal("preview_values"),
|
|
1905
|
+
z17.literal("field_evidence"),
|
|
1906
|
+
z17.literal("visual_field_control")
|
|
1907
|
+
]).rest(z17.literal("analytics_preview_readiness")).refine((capabilities) => capabilities.length <= 5)
|
|
1822
1908
|
}).strict()
|
|
1823
1909
|
});
|
|
1824
1910
|
var fieldBridgeFieldsMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1825
|
-
type:
|
|
1826
|
-
payload:
|
|
1911
|
+
type: z17.literal("siteplane:field-bridge:fields"),
|
|
1912
|
+
payload: z17.object({
|
|
1827
1913
|
renderedPath: realRenderedPathSchema,
|
|
1828
|
-
fields:
|
|
1914
|
+
fields: z17.array(fieldBridgeFieldSchema)
|
|
1829
1915
|
}).strict()
|
|
1830
1916
|
});
|
|
1831
1917
|
var fieldBridgeSelectFieldMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1832
|
-
type:
|
|
1833
|
-
payload:
|
|
1918
|
+
type: z17.literal("siteplane:field-bridge:select-field"),
|
|
1919
|
+
payload: z17.object({
|
|
1834
1920
|
fieldId: fieldIdSchema,
|
|
1835
1921
|
selectionMode: fieldSelectionModeSchema
|
|
1836
1922
|
}).strict()
|
|
1837
1923
|
});
|
|
1838
1924
|
var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1839
|
-
type:
|
|
1840
|
-
payload:
|
|
1841
|
-
fieldIds:
|
|
1925
|
+
type: z17.literal("siteplane:field-bridge:set-selected-field"),
|
|
1926
|
+
payload: z17.object({
|
|
1927
|
+
fieldIds: z17.array(fieldIdSchema).max(200),
|
|
1842
1928
|
primaryFieldId: fieldIdSchema.nullable(),
|
|
1843
|
-
scrollIntoView:
|
|
1929
|
+
scrollIntoView: z17.boolean().optional()
|
|
1844
1930
|
}).strict().superRefine((value, context) => {
|
|
1845
1931
|
if (value.fieldIds.length > 0 && value.primaryFieldId === null) {
|
|
1846
1932
|
context.addIssue({
|
|
@@ -1859,58 +1945,76 @@ var fieldBridgeSetSelectedFieldMessageSchema = fieldBridgeBaseSchema.extend({
|
|
|
1859
1945
|
})
|
|
1860
1946
|
});
|
|
1861
1947
|
var fieldBridgeApplyPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1862
|
-
type:
|
|
1863
|
-
payload:
|
|
1948
|
+
type: z17.literal("siteplane:field-bridge:apply-preview-values"),
|
|
1949
|
+
payload: z17.object({ values: z17.record(fieldIdSchema, bridgePreviewValueSchema) }).strict()
|
|
1864
1950
|
});
|
|
1865
1951
|
var fieldBridgeTestPreviewValuesMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1866
|
-
type:
|
|
1867
|
-
payload:
|
|
1952
|
+
type: z17.literal("siteplane:field-bridge:test-preview-values"),
|
|
1953
|
+
payload: z17.object({ fieldIds: z17.array(fieldIdSchema).min(1).max(200) }).strict()
|
|
1868
1954
|
});
|
|
1869
1955
|
var fieldBridgePreviewAckMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1870
|
-
type:
|
|
1871
|
-
payload:
|
|
1872
|
-
ackRequestId:
|
|
1873
|
-
kind:
|
|
1956
|
+
type: z17.literal("siteplane:field-bridge:preview-ack"),
|
|
1957
|
+
payload: z17.object({
|
|
1958
|
+
ackRequestId: z17.string().trim().min(1),
|
|
1959
|
+
kind: z17.enum(["apply", "test"]),
|
|
1874
1960
|
renderedPath: realRenderedPathSchema,
|
|
1875
|
-
fieldIds:
|
|
1961
|
+
fieldIds: z17.array(fieldIdSchema).max(200)
|
|
1876
1962
|
}).strict()
|
|
1877
1963
|
});
|
|
1878
1964
|
var fieldBridgeSetVisualControlStateMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1879
|
-
type:
|
|
1880
|
-
payload:
|
|
1881
|
-
enabled:
|
|
1882
|
-
fieldProximityEnabled:
|
|
1883
|
-
pendingKeys:
|
|
1884
|
-
activeFieldIds:
|
|
1885
|
-
fieldSections:
|
|
1886
|
-
selectedPending:
|
|
1887
|
-
key:
|
|
1888
|
-
locatorHint:
|
|
1965
|
+
type: z17.literal("siteplane:field-bridge:set-visual-control-state"),
|
|
1966
|
+
payload: z17.object({
|
|
1967
|
+
enabled: z17.boolean(),
|
|
1968
|
+
fieldProximityEnabled: z17.boolean(),
|
|
1969
|
+
pendingKeys: z17.array(z17.string().trim().min(1).max(2048)).max(50),
|
|
1970
|
+
activeFieldIds: z17.array(fieldIdSchema),
|
|
1971
|
+
fieldSections: z17.record(fieldIdSchema, bridgeSectionSchema),
|
|
1972
|
+
selectedPending: z17.array(z17.object({
|
|
1973
|
+
key: z17.string().trim().min(1).max(2048),
|
|
1974
|
+
locatorHint: z17.string().trim().min(1).max(2048)
|
|
1889
1975
|
}).strict()).max(50),
|
|
1890
|
-
scrollPendingIntoView:
|
|
1976
|
+
scrollPendingIntoView: z17.boolean().optional()
|
|
1891
1977
|
}).strict()
|
|
1892
1978
|
});
|
|
1893
1979
|
var fieldBridgeMissingContentMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1894
|
-
type:
|
|
1895
|
-
payload:
|
|
1980
|
+
type: z17.literal("siteplane:field-bridge:missing-content"),
|
|
1981
|
+
payload: z17.object({
|
|
1896
1982
|
action: fieldBridgeMissingContentActionSchema,
|
|
1897
1983
|
item: setupCorrectionItemSchema,
|
|
1898
1984
|
suggestedSection: bridgeSectionSchema.optional()
|
|
1899
1985
|
}).strict()
|
|
1900
1986
|
});
|
|
1901
1987
|
var fieldBridgePreviewScrolledMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1902
|
-
type:
|
|
1903
|
-
payload:
|
|
1988
|
+
type: z17.literal("siteplane:field-bridge:preview-scrolled"),
|
|
1989
|
+
payload: z17.object({ renderedPath: realRenderedPathSchema }).strict()
|
|
1990
|
+
});
|
|
1991
|
+
var analyticsPreviewChallengeSchema = z17.object({
|
|
1992
|
+
bridgeSessionId: z17.string().uuid(),
|
|
1993
|
+
challenge: z17.string().min(32).max(512),
|
|
1994
|
+
testRunId: z17.string().trim().min(1).max(160),
|
|
1995
|
+
expiresAt: z17.string().datetime()
|
|
1996
|
+
}).strict();
|
|
1997
|
+
var fieldBridgeAnalyticsProbeSchema = fieldBridgeBaseSchema.extend({
|
|
1998
|
+
type: z17.literal("siteplane:field-bridge:analytics-probe"),
|
|
1999
|
+
requestId: z17.string().min(1).max(256),
|
|
2000
|
+
payload: analyticsPreviewChallengeSchema
|
|
2001
|
+
});
|
|
2002
|
+
var fieldBridgeAnalyticsProbeResultSchema = fieldBridgeBaseSchema.extend({
|
|
2003
|
+
type: z17.literal("siteplane:field-bridge:analytics-probe-result"),
|
|
2004
|
+
payload: z17.object({
|
|
2005
|
+
ackRequestId: z17.string().min(1).max(256),
|
|
2006
|
+
status: z17.enum(["recorded", "failed"])
|
|
2007
|
+
}).strict()
|
|
1904
2008
|
});
|
|
1905
2009
|
var fieldBridgeErrorMessageSchema = fieldBridgeBaseSchema.extend({
|
|
1906
|
-
type:
|
|
1907
|
-
payload:
|
|
1908
|
-
code:
|
|
1909
|
-
message:
|
|
1910
|
-
recoverable:
|
|
2010
|
+
type: z17.literal("siteplane:field-bridge:error"),
|
|
2011
|
+
payload: z17.object({
|
|
2012
|
+
code: z17.string().trim().min(1),
|
|
2013
|
+
message: z17.string().trim().min(1),
|
|
2014
|
+
recoverable: z17.boolean().default(false)
|
|
1911
2015
|
}).strict()
|
|
1912
2016
|
});
|
|
1913
|
-
var fieldBridgeMessageSchema =
|
|
2017
|
+
var fieldBridgeMessageSchema = z17.discriminatedUnion("type", [
|
|
1914
2018
|
fieldBridgeInitMessageSchema,
|
|
1915
2019
|
fieldBridgeReadyMessageSchema,
|
|
1916
2020
|
fieldBridgeFieldsMessageSchema,
|
|
@@ -1922,55 +2026,57 @@ var fieldBridgeMessageSchema = z16.discriminatedUnion("type", [
|
|
|
1922
2026
|
fieldBridgeSetVisualControlStateMessageSchema,
|
|
1923
2027
|
fieldBridgeMissingContentMessageSchema,
|
|
1924
2028
|
fieldBridgePreviewScrolledMessageSchema,
|
|
1925
|
-
fieldBridgeErrorMessageSchema
|
|
2029
|
+
fieldBridgeErrorMessageSchema,
|
|
2030
|
+
fieldBridgeAnalyticsProbeSchema,
|
|
2031
|
+
fieldBridgeAnalyticsProbeResultSchema
|
|
1926
2032
|
]);
|
|
1927
2033
|
|
|
1928
2034
|
// ../shared/dist/commands.js
|
|
1929
|
-
import { z as
|
|
2035
|
+
import { z as z19 } from "zod";
|
|
1930
2036
|
|
|
1931
2037
|
// ../shared/dist/errors.js
|
|
1932
|
-
import { z as
|
|
2038
|
+
import { z as z18 } from "zod";
|
|
1933
2039
|
var UI_ERROR_CATEGORIES = [
|
|
1934
2040
|
"site_member",
|
|
1935
2041
|
"workspace_member",
|
|
1936
2042
|
"internal"
|
|
1937
2043
|
];
|
|
1938
|
-
var uiErrorCategorySchema =
|
|
1939
|
-
var commandErrorPayloadSchema =
|
|
1940
|
-
code:
|
|
1941
|
-
message:
|
|
2044
|
+
var uiErrorCategorySchema = z18.enum(UI_ERROR_CATEGORIES);
|
|
2045
|
+
var commandErrorPayloadSchema = z18.object({
|
|
2046
|
+
code: z18.string().min(1),
|
|
2047
|
+
message: z18.string().min(1),
|
|
1942
2048
|
category: uiErrorCategorySchema,
|
|
1943
|
-
details:
|
|
2049
|
+
details: z18.record(z18.string(), z18.unknown()).optional()
|
|
1944
2050
|
});
|
|
1945
2051
|
|
|
1946
2052
|
// ../shared/dist/commands.js
|
|
1947
|
-
var commandSuccessSchema =
|
|
1948
|
-
ok:
|
|
1949
|
-
data:
|
|
2053
|
+
var commandSuccessSchema = z19.object({
|
|
2054
|
+
ok: z19.literal(true),
|
|
2055
|
+
data: z19.unknown()
|
|
1950
2056
|
});
|
|
1951
|
-
var commandErrorSchema =
|
|
1952
|
-
ok:
|
|
2057
|
+
var commandErrorSchema = z19.object({
|
|
2058
|
+
ok: z19.literal(false),
|
|
1953
2059
|
error: commandErrorPayloadSchema
|
|
1954
2060
|
});
|
|
1955
|
-
var commandResultSchema =
|
|
2061
|
+
var commandResultSchema = z19.discriminatedUnion("ok", [
|
|
1956
2062
|
commandSuccessSchema,
|
|
1957
2063
|
commandErrorSchema
|
|
1958
2064
|
]);
|
|
1959
2065
|
|
|
1960
2066
|
// ../shared/dist/editor-settings.js
|
|
1961
|
-
import { z as
|
|
1962
|
-
var editorColorSchemeSchema =
|
|
2067
|
+
import { z as z20 } from "zod";
|
|
2068
|
+
var editorColorSchemeSchema = z20.enum([
|
|
1963
2069
|
"paper",
|
|
1964
2070
|
"slate",
|
|
1965
2071
|
"siteplane",
|
|
1966
2072
|
"bloom"
|
|
1967
2073
|
]);
|
|
1968
2074
|
var editorColorSchemes = editorColorSchemeSchema.options;
|
|
1969
|
-
var editorColorModeSchema =
|
|
2075
|
+
var editorColorModeSchema = z20.enum(["light", "dark"]);
|
|
1970
2076
|
var editorColorModes = editorColorModeSchema.options;
|
|
1971
2077
|
|
|
1972
2078
|
// ../shared/dist/site-slug.js
|
|
1973
|
-
import { z as
|
|
2079
|
+
import { z as z21 } from "zod";
|
|
1974
2080
|
var SITE_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
1975
2081
|
var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
|
|
1976
2082
|
"account",
|
|
@@ -1987,31 +2093,31 @@ var RESERVED_SITE_SLUGS = /* @__PURE__ */ new Set([
|
|
|
1987
2093
|
"support",
|
|
1988
2094
|
"workspace"
|
|
1989
2095
|
]);
|
|
1990
|
-
var siteSlugSchema =
|
|
2096
|
+
var siteSlugSchema = z21.string().regex(SITE_SLUG_PATTERN, "Invalid site slug").refine((value) => !RESERVED_SITE_SLUGS.has(value), "Reserved site slug");
|
|
1991
2097
|
|
|
1992
2098
|
// ../shared/dist/entitlements.js
|
|
1993
|
-
import { z as
|
|
1994
|
-
var entitlementSnapshotSchema =
|
|
1995
|
-
planKey:
|
|
1996
|
-
sitesLimit:
|
|
1997
|
-
siteMembersPerSiteLimit:
|
|
1998
|
-
customAdminDomainsEnabled:
|
|
1999
|
-
agentMcpEnabled:
|
|
2000
|
-
emailNotificationsEnabled:
|
|
2001
|
-
analyticsEnabled:
|
|
2002
|
-
analyticsSitesLimit:
|
|
2003
|
-
analyticsPortalPerformanceEnabled:
|
|
2004
|
-
analyticsMonthlyReportsEnabled:
|
|
2005
|
-
analyticsAiSummaryEnabled:
|
|
2006
|
-
analyticsRawEventRetentionDays:
|
|
2007
|
-
analyticsMonthlyEventLimit:
|
|
2008
|
-
bookingEnabled:
|
|
2009
|
-
bookingSitesLimit:
|
|
2010
|
-
bookingPortalManagementEnabled:
|
|
2011
|
-
bookingResourcesPerSiteLimit:
|
|
2012
|
-
bookingServicesPerSiteLimit:
|
|
2013
|
-
bookingMonthlyBookingsLimit:
|
|
2014
|
-
bookingRemindersEnabled:
|
|
2099
|
+
import { z as z22 } from "zod";
|
|
2100
|
+
var entitlementSnapshotSchema = z22.object({
|
|
2101
|
+
planKey: z22.string().trim().min(1),
|
|
2102
|
+
sitesLimit: z22.number().int().positive(),
|
|
2103
|
+
siteMembersPerSiteLimit: z22.number().int().positive(),
|
|
2104
|
+
customAdminDomainsEnabled: z22.boolean(),
|
|
2105
|
+
agentMcpEnabled: z22.boolean(),
|
|
2106
|
+
emailNotificationsEnabled: z22.boolean(),
|
|
2107
|
+
analyticsEnabled: z22.boolean(),
|
|
2108
|
+
analyticsSitesLimit: z22.number().int().min(0),
|
|
2109
|
+
analyticsPortalPerformanceEnabled: z22.boolean(),
|
|
2110
|
+
analyticsMonthlyReportsEnabled: z22.boolean(),
|
|
2111
|
+
analyticsAiSummaryEnabled: z22.boolean(),
|
|
2112
|
+
analyticsRawEventRetentionDays: z22.number().int().min(1).max(ANALYTICS_RETENTION_DEFAULTS.maxRawEventRetentionDaysWithoutAdr),
|
|
2113
|
+
analyticsMonthlyEventLimit: z22.number().int().min(0),
|
|
2114
|
+
bookingEnabled: z22.boolean().default(false),
|
|
2115
|
+
bookingSitesLimit: z22.number().int().min(0).default(0),
|
|
2116
|
+
bookingPortalManagementEnabled: z22.boolean().default(false),
|
|
2117
|
+
bookingResourcesPerSiteLimit: z22.number().int().min(0).default(0),
|
|
2118
|
+
bookingServicesPerSiteLimit: z22.number().int().min(0).default(0),
|
|
2119
|
+
bookingMonthlyBookingsLimit: z22.number().int().min(0).default(0),
|
|
2120
|
+
bookingRemindersEnabled: z22.boolean().default(false)
|
|
2015
2121
|
});
|
|
2016
2122
|
var EARLY_ACCESS_PLAN = {
|
|
2017
2123
|
planKey: "early_access_2026",
|
|
@@ -2037,7 +2143,7 @@ var EARLY_ACCESS_PLAN = {
|
|
|
2037
2143
|
};
|
|
2038
2144
|
|
|
2039
2145
|
// ../shared/dist/readiness.js
|
|
2040
|
-
import { z as
|
|
2146
|
+
import { z as z23 } from "zod";
|
|
2041
2147
|
var READINESS_CHECK_KEYS = [
|
|
2042
2148
|
"agent_instructions_installed",
|
|
2043
2149
|
"runtime_package_connected",
|
|
@@ -2052,19 +2158,80 @@ var READINESS_STATUSES = [
|
|
|
2052
2158
|
"failing",
|
|
2053
2159
|
"warning"
|
|
2054
2160
|
];
|
|
2055
|
-
var readinessCheckKeySchema =
|
|
2056
|
-
var readinessStatusSchema =
|
|
2161
|
+
var readinessCheckKeySchema = z23.enum(READINESS_CHECK_KEYS);
|
|
2162
|
+
var readinessStatusSchema = z23.enum(READINESS_STATUSES);
|
|
2057
2163
|
|
|
2058
2164
|
// ../shared/dist/site.js
|
|
2059
|
-
import { z as
|
|
2165
|
+
import { z as z24 } from "zod";
|
|
2060
2166
|
var SITE_STATUSES = [
|
|
2061
2167
|
"setup",
|
|
2062
2168
|
"active",
|
|
2063
2169
|
"disabled",
|
|
2064
2170
|
"archived"
|
|
2065
2171
|
];
|
|
2066
|
-
var siteStatusSchema =
|
|
2067
|
-
var websiteUrlSchema =
|
|
2172
|
+
var siteStatusSchema = z24.enum(SITE_STATUSES);
|
|
2173
|
+
var websiteUrlSchema = z24.string().trim().url().refine((value) => value.startsWith("https://") || value.startsWith("http://"), "Website URL must use http or https");
|
|
2174
|
+
|
|
2175
|
+
// ../shared/dist/setup-assets.js
|
|
2176
|
+
import { z as z25 } from "zod";
|
|
2177
|
+
var configureSetupAssetTargetInputSchema = z25.object({
|
|
2178
|
+
siteId: z25.string().uuid(),
|
|
2179
|
+
runId: z25.string().uuid(),
|
|
2180
|
+
expectedReviewVersion: z25.number().int().positive(),
|
|
2181
|
+
expectedSnapshotHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/u),
|
|
2182
|
+
mutationId: z25.string().uuid(),
|
|
2183
|
+
expectedApprovalId: z25.string().uuid().nullable(),
|
|
2184
|
+
targetId: z25.string().uuid().nullable(),
|
|
2185
|
+
targetType: z25.enum(["repo_static_assets", "siteplane_managed_fallback"]),
|
|
2186
|
+
approveManagedHosting: z25.boolean()
|
|
2187
|
+
}).strict().refine((value) => value.targetType === "siteplane_managed_fallback" || !value.approveManagedHosting);
|
|
2188
|
+
var setupAssetTargetApprovalSchema = z25.object({
|
|
2189
|
+
id: z25.string().uuid(),
|
|
2190
|
+
runId: z25.string().uuid(),
|
|
2191
|
+
reviewVersion: z25.number().int().positive(),
|
|
2192
|
+
snapshotHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/u),
|
|
2193
|
+
targetId: z25.string().uuid(),
|
|
2194
|
+
targetType: z25.enum(["repo_static_assets", "siteplane_managed_fallback"]),
|
|
2195
|
+
targetRevision: z25.number().int().positive(),
|
|
2196
|
+
deploymentOrigin: z25.string().url(),
|
|
2197
|
+
gitConnectionId: z25.string().uuid().nullable(),
|
|
2198
|
+
gitRevision: z25.number().int().positive().nullable(),
|
|
2199
|
+
managedHostingApproved: z25.boolean(),
|
|
2200
|
+
actorUserId: z25.string().uuid(),
|
|
2201
|
+
approvedAt: z25.string().datetime({ offset: true })
|
|
2202
|
+
}).strict();
|
|
2203
|
+
var setupAssetReadinessSchema = z25.union([
|
|
2204
|
+
z25.object({
|
|
2205
|
+
status: z25.enum([
|
|
2206
|
+
"not_required",
|
|
2207
|
+
"needs_choice",
|
|
2208
|
+
"stale_setup_review",
|
|
2209
|
+
"permission_denied"
|
|
2210
|
+
])
|
|
2211
|
+
}).strict(),
|
|
2212
|
+
z25.object({
|
|
2213
|
+
status: z25.literal("stale_approval"),
|
|
2214
|
+
approval: setupAssetTargetApprovalSchema.optional()
|
|
2215
|
+
}).strict(),
|
|
2216
|
+
z25.object({
|
|
2217
|
+
status: z25.literal("not_verified"),
|
|
2218
|
+
approval: setupAssetTargetApprovalSchema,
|
|
2219
|
+
jobId: z25.string().uuid().optional(),
|
|
2220
|
+
checkedAt: z25.string().datetime({ offset: true }).nullable().optional()
|
|
2221
|
+
}).strict(),
|
|
2222
|
+
z25.object({
|
|
2223
|
+
status: z25.enum(["ready", "checking", "retrying"]),
|
|
2224
|
+
approval: setupAssetTargetApprovalSchema,
|
|
2225
|
+
jobId: z25.string().uuid(),
|
|
2226
|
+
checkedAt: z25.string().datetime({ offset: true }).nullable()
|
|
2227
|
+
}).strict().refine((value) => value.status !== "ready" || value.checkedAt !== null)
|
|
2228
|
+
]);
|
|
2229
|
+
var checkSetupAssetTargetInputSchema = z25.object({
|
|
2230
|
+
siteId: z25.string().uuid(),
|
|
2231
|
+
runId: z25.string().uuid(),
|
|
2232
|
+
approvalId: z25.string().uuid(),
|
|
2233
|
+
intent: z25.enum(["start", "poll"])
|
|
2234
|
+
}).strict();
|
|
2068
2235
|
|
|
2069
2236
|
// ../cli/dist/analytics/static-scan.js
|
|
2070
2237
|
import ts from "typescript";
|
|
@@ -2088,6 +2255,9 @@ Analytics contract hash: ${ANALYTICS_CONTRACT_HASH}
|
|
|
2088
2255
|
- Use stable data-siteplane-target-id values that do not depend on visible copy.
|
|
2089
2256
|
- Use public site keys only through environment references.
|
|
2090
2257
|
- Do not write secret analytics keys, setup tokens or project CLI tokens into source files.
|
|
2258
|
+
- Mount the SDK once in the existing client lifecycle. Wire installDataAttributeTracking and createNextAppRouterNavigationAdapter to analytics.track/getRouteViewId/setPageContext, feed initial and subsequent Next.js pathname changes, and refresh attribute targets after navigation. Dispose attribute tracking and the SDK on unmount.
|
|
2259
|
+
- Inspect existing consent management. Pass consentAdapter with getConsent and subscribe to initSiteplaneAnalytics for an existing CMP; return unknown while unresolved, disabled for denial and a permitted mode only for its actual visitor grant. Subscribe returns cleanup. Do not mirror CMP snapshots with setConsent or replace stored opt-outs.
|
|
2260
|
+
- Omit consentAdapter only after confirming no existing CMP. An unrecognized CMP blocks Analytics with a concrete repair diagnostic; do not invent a grant or a no-op adapter to pass a check.
|
|
2091
2261
|
- Suppress editor-preview traffic from live analytics.
|
|
2092
2262
|
- Run npx siteplane analytics check, npx siteplane analytics sync and npx siteplane analytics test after setup.
|
|
2093
2263
|
`;
|
|
@@ -2101,19 +2271,70 @@ ${analyticsRulesTemplate}`;
|
|
|
2101
2271
|
// ../cli/dist/commands/analytics/import.js
|
|
2102
2272
|
import { createHash } from "crypto";
|
|
2103
2273
|
|
|
2274
|
+
// ../cli/dist/commands/analytics/sync.js
|
|
2275
|
+
function createAnalyticsCliRequestHeaders(config) {
|
|
2276
|
+
const headers = {
|
|
2277
|
+
authorization: `Bearer ${config.accessToken}`,
|
|
2278
|
+
"content-type": "application/json"
|
|
2279
|
+
};
|
|
2280
|
+
const bypassSecret = config.vercelAutomationBypassSecret?.trim();
|
|
2281
|
+
if (bypassSecret) {
|
|
2282
|
+
headers["x-vercel-protection-bypass"] = bypassSecret;
|
|
2283
|
+
}
|
|
2284
|
+
return headers;
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2104
2287
|
// ../cli/dist/commands/analytics/public-key.js
|
|
2105
|
-
import { z as
|
|
2106
|
-
var responseSchema =
|
|
2107
|
-
ok:
|
|
2108
|
-
data:
|
|
2109
|
-
rawPublicKey:
|
|
2288
|
+
import { z as z26 } from "zod";
|
|
2289
|
+
var responseSchema = z26.object({
|
|
2290
|
+
ok: z26.literal(true),
|
|
2291
|
+
data: z26.object({
|
|
2292
|
+
rawPublicKey: z26.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/)
|
|
2110
2293
|
})
|
|
2111
2294
|
});
|
|
2112
|
-
var errorResponseSchema =
|
|
2113
|
-
error:
|
|
2114
|
-
code:
|
|
2295
|
+
var errorResponseSchema = z26.object({
|
|
2296
|
+
error: z26.object({
|
|
2297
|
+
code: z26.string().regex(/^[a-z][a-z0-9_.-]+$/u)
|
|
2115
2298
|
})
|
|
2116
2299
|
});
|
|
2300
|
+
async function analyticsPublicKeyCommand(input) {
|
|
2301
|
+
const fetcher = input.fetchImpl ?? fetch;
|
|
2302
|
+
const response = await fetcher(`${input.config.apiBaseUrl.replace(/\/$/u, "")}/api/cli/analytics/public-key`, {
|
|
2303
|
+
method: "POST",
|
|
2304
|
+
redirect: "error",
|
|
2305
|
+
signal: AbortSignal.timeout(2e4),
|
|
2306
|
+
headers: createAnalyticsCliRequestHeaders(input.config),
|
|
2307
|
+
body: JSON.stringify({ siteId: input.config.siteId })
|
|
2308
|
+
});
|
|
2309
|
+
const payload = await response.json().catch(() => null);
|
|
2310
|
+
const parsed = responseSchema.safeParse(payload);
|
|
2311
|
+
if (!response.ok || !parsed.success) {
|
|
2312
|
+
const error = errorResponseSchema.safeParse(payload);
|
|
2313
|
+
throw new Error(`${error.success ? error.data.error.code : "analytics_public_key.invalid_response"}: Unable to read the active Analytics public key.`);
|
|
2314
|
+
}
|
|
2315
|
+
return parsed.data.data.rawPublicKey;
|
|
2316
|
+
}
|
|
2317
|
+
|
|
2318
|
+
// ../cli/dist/commands/analytics/prepare.js
|
|
2319
|
+
import { z as z27 } from "zod";
|
|
2320
|
+
var resultSchema = z27.object({
|
|
2321
|
+
ok: z27.literal(true),
|
|
2322
|
+
data: z27.object({
|
|
2323
|
+
rawPublicKey: z27.string().regex(/^pk_siteplane_[A-Za-z0-9_-]{16}_[A-Za-z0-9_-]{43}$/u),
|
|
2324
|
+
generation: z27.number().int().positive(),
|
|
2325
|
+
status: z27.enum([
|
|
2326
|
+
"setup_started",
|
|
2327
|
+
"test_mode",
|
|
2328
|
+
"active",
|
|
2329
|
+
"paused",
|
|
2330
|
+
"error",
|
|
2331
|
+
"deleting"
|
|
2332
|
+
])
|
|
2333
|
+
}).strict()
|
|
2334
|
+
}).strict();
|
|
2335
|
+
var errorSchema = z27.object({
|
|
2336
|
+
error: z27.object({ code: z27.string().regex(/^[a-z][a-z0-9_.-]+$/u) })
|
|
2337
|
+
});
|
|
2117
2338
|
|
|
2118
2339
|
// ../cli/dist/commands/analytics/test.js
|
|
2119
2340
|
import { randomUUID } from "crypto";
|
|
@@ -2145,22 +2366,19 @@ ${bookingRulesTemplate}`;
|
|
|
2145
2366
|
import { access, chmod, open, readFile as readFile5, rename, rm } from "fs/promises";
|
|
2146
2367
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
2147
2368
|
import { join as join3 } from "path";
|
|
2148
|
-
import { z as
|
|
2149
|
-
var siteplaneProjectConfigSchema =
|
|
2150
|
-
version:
|
|
2151
|
-
apiBaseUrl:
|
|
2152
|
-
siteId:
|
|
2153
|
-
publicSiteKeyId:
|
|
2154
|
-
publicSiteKey:
|
|
2155
|
-
runId:
|
|
2156
|
-
appDirectory:
|
|
2157
|
-
taskContractVersion:
|
|
2158
|
-
adminProtocolVersion:
|
|
2159
|
-
packages:
|
|
2160
|
-
|
|
2161
|
-
runtimeNext: z25.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
|
|
2162
|
-
}).strict(),
|
|
2163
|
-
fieldContractHash: z25.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
|
|
2369
|
+
import { z as z28 } from "zod";
|
|
2370
|
+
var siteplaneProjectConfigSchema = z28.object({
|
|
2371
|
+
version: z28.literal(2),
|
|
2372
|
+
apiBaseUrl: z28.string().url(),
|
|
2373
|
+
siteId: z28.string().uuid(),
|
|
2374
|
+
publicSiteKeyId: z28.string().uuid(),
|
|
2375
|
+
publicSiteKey: z28.string().trim().min(1),
|
|
2376
|
+
runId: z28.string().uuid(),
|
|
2377
|
+
appDirectory: z28.string().min(1),
|
|
2378
|
+
taskContractVersion: z28.literal("siteplane.setup-task.v2"),
|
|
2379
|
+
adminProtocolVersion: z28.literal(2),
|
|
2380
|
+
packages: siteSetupPackagesSchema,
|
|
2381
|
+
fieldContractHash: z28.string().regex(/^sha256:[0-9a-f]{64}$/iu).optional()
|
|
2164
2382
|
}).strict();
|
|
2165
2383
|
async function readProjectConfig(projectDir) {
|
|
2166
2384
|
return siteplaneProjectConfigSchema.parse(JSON.parse(await readFile5(join3(projectDir, "siteplane.config.json"), "utf8")));
|
|
@@ -2172,13 +2390,13 @@ import { randomUUID as randomUUID3 } from "crypto";
|
|
|
2172
2390
|
import { chmod as chmod2, lstat, mkdir as mkdir5, open as open2, readFile as readFile6, rename as rename2, rm as rm2 } from "fs/promises";
|
|
2173
2391
|
import { dirname as dirname5, join as join4, relative } from "path";
|
|
2174
2392
|
import { promisify } from "util";
|
|
2175
|
-
import { z as
|
|
2176
|
-
var siteplaneCredentialsSchema =
|
|
2177
|
-
accessToken:
|
|
2178
|
-
siteRevalidationSecret:
|
|
2179
|
-
adminSession:
|
|
2180
|
-
secret:
|
|
2181
|
-
generation:
|
|
2393
|
+
import { z as z29 } from "zod";
|
|
2394
|
+
var siteplaneCredentialsSchema = z29.object({
|
|
2395
|
+
accessToken: z29.string().trim().min(1),
|
|
2396
|
+
siteRevalidationSecret: z29.string().trim().min(1),
|
|
2397
|
+
adminSession: z29.object({
|
|
2398
|
+
secret: z29.string().regex(/^[A-Za-z0-9_-]{43}$/u),
|
|
2399
|
+
generation: z29.string().uuid()
|
|
2182
2400
|
}).strict().optional()
|
|
2183
2401
|
}).strict();
|
|
2184
2402
|
async function assertLocalCredentialsPathSafe(projectDir, options = {}) {
|
|
@@ -2233,7 +2451,7 @@ async function gitPathMatches(projectDir, path, command) {
|
|
|
2233
2451
|
// ../cli/dist/commands/init.js
|
|
2234
2452
|
import { access as access3 } from "fs/promises";
|
|
2235
2453
|
import { join as join7, relative as relative3 } from "path";
|
|
2236
|
-
import { z as
|
|
2454
|
+
import { z as z32 } from "zod";
|
|
2237
2455
|
|
|
2238
2456
|
// ../cli/dist/commands/setup-preflight.js
|
|
2239
2457
|
import { createHash as createHash2 } from "crypto";
|
|
@@ -2245,11 +2463,11 @@ import { parse as parseYaml } from "yaml";
|
|
|
2245
2463
|
import { createRequire } from "module";
|
|
2246
2464
|
import { readFile as readFile7 } from "fs/promises";
|
|
2247
2465
|
import { join as join5 } from "path";
|
|
2248
|
-
import { z as
|
|
2249
|
-
var packageSchema =
|
|
2250
|
-
name:
|
|
2251
|
-
version:
|
|
2252
|
-
peerDependencies:
|
|
2466
|
+
import { z as z30 } from "zod";
|
|
2467
|
+
var packageSchema = z30.object({
|
|
2468
|
+
name: z30.string().optional(),
|
|
2469
|
+
version: z30.string(),
|
|
2470
|
+
peerDependencies: z30.record(z30.string(), z30.string()).optional()
|
|
2253
2471
|
});
|
|
2254
2472
|
async function readInstalledPackage(projectDir, name2) {
|
|
2255
2473
|
const require2 = createRequire(join5(projectDir, "package.json"));
|
|
@@ -2267,7 +2485,7 @@ async function readInstalledPackage(projectDir, name2) {
|
|
|
2267
2485
|
// ../cli/dist/commands/setup-preflight.js
|
|
2268
2486
|
import { access as access2, readFile as readFile8, realpath, readdir, readlink } from "fs/promises";
|
|
2269
2487
|
import { dirname as dirname6, join as join6, relative as relative2, resolve, sep } from "path";
|
|
2270
|
-
import { z as
|
|
2488
|
+
import { z as z31 } from "zod";
|
|
2271
2489
|
|
|
2272
2490
|
// ../cli/dist/commands/setup-process.js
|
|
2273
2491
|
import { spawn } from "child_process";
|
|
@@ -2368,29 +2586,29 @@ async function setupVercelApi(cwd, endpoint, body, method, options) {
|
|
|
2368
2586
|
}
|
|
2369
2587
|
|
|
2370
2588
|
// ../cli/dist/commands/setup-preflight.js
|
|
2371
|
-
var manifestSchema =
|
|
2372
|
-
packageManager:
|
|
2373
|
-
engines:
|
|
2374
|
-
dependencies:
|
|
2375
|
-
devDependencies:
|
|
2376
|
-
scripts:
|
|
2377
|
-
workspaces:
|
|
2378
|
-
});
|
|
2379
|
-
var vercelProjectSchema =
|
|
2380
|
-
id:
|
|
2381
|
-
accountId:
|
|
2382
|
-
name:
|
|
2383
|
-
nodeVersion:
|
|
2384
|
-
rootDirectory:
|
|
2385
|
-
framework:
|
|
2386
|
-
installCommand:
|
|
2387
|
-
buildCommand:
|
|
2388
|
-
link:
|
|
2389
|
-
type:
|
|
2390
|
-
repo:
|
|
2391
|
-
repoId:
|
|
2392
|
-
org:
|
|
2393
|
-
productionBranch:
|
|
2589
|
+
var manifestSchema = z31.object({
|
|
2590
|
+
packageManager: z31.string().optional(),
|
|
2591
|
+
engines: z31.object({ node: z31.string().optional() }).optional(),
|
|
2592
|
+
dependencies: z31.record(z31.string(), z31.string()).optional(),
|
|
2593
|
+
devDependencies: z31.record(z31.string(), z31.string()).optional(),
|
|
2594
|
+
scripts: z31.record(z31.string(), z31.string()).optional(),
|
|
2595
|
+
workspaces: z31.unknown().optional()
|
|
2596
|
+
});
|
|
2597
|
+
var vercelProjectSchema = z31.object({
|
|
2598
|
+
id: z31.string(),
|
|
2599
|
+
accountId: z31.string(),
|
|
2600
|
+
name: z31.string(),
|
|
2601
|
+
nodeVersion: z31.string().nullable().optional(),
|
|
2602
|
+
rootDirectory: z31.string().nullable().optional(),
|
|
2603
|
+
framework: z31.string().nullable().optional(),
|
|
2604
|
+
installCommand: z31.string().nullable().optional(),
|
|
2605
|
+
buildCommand: z31.string().nullable().optional(),
|
|
2606
|
+
link: z31.object({
|
|
2607
|
+
type: z31.string(),
|
|
2608
|
+
repo: z31.string().optional(),
|
|
2609
|
+
repoId: z31.union([z31.string(), z31.number()]).optional(),
|
|
2610
|
+
org: z31.string().optional(),
|
|
2611
|
+
productionBranch: z31.string().optional()
|
|
2394
2612
|
}).nullable().optional()
|
|
2395
2613
|
});
|
|
2396
2614
|
var exists = async (path) => access2(path).then(() => true, () => false);
|
|
@@ -2447,9 +2665,9 @@ async function inspectSetupLocalProject(projectDir) {
|
|
|
2447
2665
|
const rootManifest = manifestSchema.parse(JSON.parse(await readFile8(join6(lockfileRoot, "package.json"), "utf8")));
|
|
2448
2666
|
if (lockfileRoot !== projectDirectory) {
|
|
2449
2667
|
const workspaceFile = join6(lockfileRoot, "pnpm-workspace.yaml");
|
|
2450
|
-
const workspace = lockName === "pnpm-lock.yaml" && await exists(workspaceFile) ?
|
|
2451
|
-
|
|
2452
|
-
|
|
2668
|
+
const workspace = lockName === "pnpm-lock.yaml" && await exists(workspaceFile) ? z31.object({ packages: z31.array(z31.string()) }).parse(parseYaml(await readFile8(workspaceFile, "utf8"))).packages : z31.union([
|
|
2669
|
+
z31.array(z31.string()),
|
|
2670
|
+
z31.object({ packages: z31.array(z31.string()) }).transform((value) => value.packages)
|
|
2453
2671
|
]).parse(rootManifest.workspaces);
|
|
2454
2672
|
const selected = relative2(lockfileRoot, projectDirectory).split(sep).join("/");
|
|
2455
2673
|
if (!workspace.some((pattern) => !pattern.startsWith("!") && minimatch(selected, pattern)) || workspace.some((pattern) => pattern.startsWith("!") && minimatch(selected, pattern.slice(1))))
|
|
@@ -2463,11 +2681,11 @@ async function inspectSetupLocalProject(projectDir) {
|
|
|
2463
2681
|
break;
|
|
2464
2682
|
}
|
|
2465
2683
|
const lockText = await readFile8(join6(lockfileRoot, lockName), "utf8");
|
|
2466
|
-
const npmLock = lockName === "package-lock.json" ?
|
|
2467
|
-
lockfileVersion:
|
|
2468
|
-
packages:
|
|
2469
|
-
version:
|
|
2470
|
-
peerDependencies:
|
|
2684
|
+
const npmLock = lockName === "package-lock.json" ? z31.object({
|
|
2685
|
+
lockfileVersion: z31.number(),
|
|
2686
|
+
packages: z31.record(z31.string(), z31.object({
|
|
2687
|
+
version: z31.string().optional(),
|
|
2688
|
+
peerDependencies: z31.record(z31.string(), z31.string()).optional()
|
|
2471
2689
|
})).optional()
|
|
2472
2690
|
}).parse(JSON.parse(lockText)) : null;
|
|
2473
2691
|
async function version2(name3) {
|
|
@@ -2522,8 +2740,12 @@ async function inspectSetupLocalProject(projectDir) {
|
|
|
2522
2740
|
sourceConflicts.push("static_export");
|
|
2523
2741
|
if (/\bbasePath\s*:/u.test(source))
|
|
2524
2742
|
sourceConflicts.push("base_path");
|
|
2743
|
+
if (/\bloaderFile\s*:|\bloader\s*:\s*['"](?:custom|imgix|cloudinary|akamai)['"]/u.test(source))
|
|
2744
|
+
sourceConflicts.push(`inspect_image_loader:${file}`);
|
|
2745
|
+
if (/\bmaximumRedirects\s*:\s*[1-9]/u.test(source))
|
|
2746
|
+
sourceConflicts.push(`inspect_image_redirects:${file}`);
|
|
2525
2747
|
}
|
|
2526
|
-
if (sourceConflicts.
|
|
2748
|
+
if (sourceConflicts.some((conflict) => conflict === "static_export" || conflict === "base_path"))
|
|
2527
2749
|
fail("unsupported_server_configuration", "Resolve static export/basePath configuration explicitly; Siteplane requires its server-side admin and revalidation handlers.");
|
|
2528
2750
|
for (const name3 of [
|
|
2529
2751
|
"middleware.ts",
|
|
@@ -2535,8 +2757,14 @@ async function inspectSetupLocalProject(projectDir) {
|
|
|
2535
2757
|
"src/proxy.ts",
|
|
2536
2758
|
"src/proxy.js"
|
|
2537
2759
|
]) {
|
|
2538
|
-
if (await exists(join6(projectDirectory, name3)))
|
|
2760
|
+
if (await exists(join6(projectDirectory, name3))) {
|
|
2539
2761
|
sourceConflicts.push(`inspect_routing:${name3}`);
|
|
2762
|
+
if (await readlink(join6(projectDirectory, name3)).catch(() => null))
|
|
2763
|
+
continue;
|
|
2764
|
+
const policySource = await readFile8(join6(projectDirectory, name3), "utf8");
|
|
2765
|
+
if (/Content-Security-Policy|img-src|default-src/iu.test(policySource))
|
|
2766
|
+
sourceConflicts.push(`inspect_image_csp:${name3}`);
|
|
2767
|
+
}
|
|
2540
2768
|
}
|
|
2541
2769
|
async function inspectSource(directory) {
|
|
2542
2770
|
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
@@ -2550,6 +2778,8 @@ async function inspectSetupLocalProject(projectDir) {
|
|
|
2550
2778
|
if (!/\.[cm]?[jt]sx?$/u.test(entry.name))
|
|
2551
2779
|
continue;
|
|
2552
2780
|
const source = await readFile8(path, "utf8");
|
|
2781
|
+
if (/Content-Security-Policy|img-src|default-src/iu.test(source))
|
|
2782
|
+
sourceConflicts.push(`inspect_image_csp:${relative2(projectDirectory, path)}`);
|
|
2553
2783
|
if (/from\s*["']next\/image["']/u.test(source))
|
|
2554
2784
|
sourceConflicts.push(`inspect_image_policy:${relative2(projectDirectory, path)}`);
|
|
2555
2785
|
if (/\b(?:Cookiebot|OneTrust|cookieyes|consentManager|cookieConsent)\b/iu.test(source))
|
|
@@ -2595,9 +2825,9 @@ async function setupPreflightCommand(input) {
|
|
|
2595
2825
|
linkDirectory = dirname6(linkDirectory);
|
|
2596
2826
|
if (!await exists(join6(linkDirectory, ".vercel/project.json")))
|
|
2597
2827
|
fail("vercel_project_not_linked", "Link this application to its intended Vercel project before setup; Siteplane will not guess a target.");
|
|
2598
|
-
const linked =
|
|
2599
|
-
projectId:
|
|
2600
|
-
orgId:
|
|
2828
|
+
const linked = z31.object({
|
|
2829
|
+
projectId: z31.string().regex(/^prj_[A-Za-z0-9]+$/u),
|
|
2830
|
+
orgId: z31.string().regex(/^(?:team|user)_[A-Za-z0-9]+$/u)
|
|
2601
2831
|
}).parse(JSON.parse(await readFile8(join6(linkDirectory, ".vercel/project.json"), "utf8")));
|
|
2602
2832
|
const project = vercelProjectSchema.parse(await setupVercelApi(linkDirectory, `/v9/projects/${linked.projectId}?teamId=${linked.orgId}`));
|
|
2603
2833
|
if (project.id !== linked.projectId || project.accountId !== linked.orgId)
|
|
@@ -2611,11 +2841,11 @@ async function setupPreflightCommand(input) {
|
|
|
2611
2841
|
fail("vercel_production_branch_conflict", "The local branch differs from the bound Vercel Production branch.");
|
|
2612
2842
|
if (project.link?.repo && project.link.org && !local.git.remote?.replace(/\.git$/u, "").endsWith(`${project.link.org}/${project.link.repo}`))
|
|
2613
2843
|
fail("vercel_git_conflict", "The local origin repository differs from the Vercel Git connection.");
|
|
2614
|
-
const env =
|
|
2615
|
-
envs:
|
|
2616
|
-
key:
|
|
2617
|
-
value:
|
|
2618
|
-
target:
|
|
2844
|
+
const env = z31.object({
|
|
2845
|
+
envs: z31.array(z31.object({
|
|
2846
|
+
key: z31.string(),
|
|
2847
|
+
value: z31.string().optional(),
|
|
2848
|
+
target: z31.array(z31.string()).optional()
|
|
2619
2849
|
}))
|
|
2620
2850
|
}).parse(await setupVercelApi(linkDirectory, `/v10/projects/${linked.projectId}/env?teamId=${linked.orgId}`));
|
|
2621
2851
|
const corepack = env.envs.some((item) => item.key === "ENABLE_EXPERIMENTAL_COREPACK" && item.value === "1" && item.target?.includes("production"));
|
|
@@ -2677,29 +2907,26 @@ function safeGitRemote(value) {
|
|
|
2677
2907
|
}
|
|
2678
2908
|
|
|
2679
2909
|
// ../cli/dist/commands/init.js
|
|
2680
|
-
var siteSetupBootstrapDataSchema =
|
|
2681
|
-
credentialPurpose:
|
|
2682
|
-
apiBaseUrl:
|
|
2683
|
-
siteId:
|
|
2684
|
-
publicSiteKeyId:
|
|
2685
|
-
publicSiteKey:
|
|
2686
|
-
accessToken:
|
|
2687
|
-
siteRevalidationSecret:
|
|
2688
|
-
runId:
|
|
2689
|
-
packages:
|
|
2690
|
-
siteplane: z29.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u),
|
|
2691
|
-
runtimeNext: z29.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u)
|
|
2692
|
-
}).strict()
|
|
2910
|
+
var siteSetupBootstrapDataSchema = z32.object({
|
|
2911
|
+
credentialPurpose: z32.literal("site_setup"),
|
|
2912
|
+
apiBaseUrl: z32.string().url(),
|
|
2913
|
+
siteId: z32.string().uuid(),
|
|
2914
|
+
publicSiteKeyId: z32.string().uuid(),
|
|
2915
|
+
publicSiteKey: z32.string().trim().min(1),
|
|
2916
|
+
accessToken: z32.string().trim().min(1),
|
|
2917
|
+
siteRevalidationSecret: z32.string().regex(/^[A-Za-z0-9_-]{43}$/u),
|
|
2918
|
+
runId: z32.string().uuid(),
|
|
2919
|
+
packages: siteSetupPackagesSchema
|
|
2693
2920
|
}).strict();
|
|
2694
|
-
var featureBootstrapDataSchema =
|
|
2695
|
-
credentialPurpose:
|
|
2696
|
-
apiBaseUrl:
|
|
2697
|
-
siteId:
|
|
2698
|
-
accessToken:
|
|
2921
|
+
var featureBootstrapDataSchema = z32.object({
|
|
2922
|
+
credentialPurpose: z32.enum(["analytics", "booking"]),
|
|
2923
|
+
apiBaseUrl: z32.string().url(),
|
|
2924
|
+
siteId: z32.string().uuid(),
|
|
2925
|
+
accessToken: z32.string().trim().min(1)
|
|
2699
2926
|
}).strict();
|
|
2700
|
-
var bootstrapResponseSchema =
|
|
2701
|
-
ok:
|
|
2702
|
-
data:
|
|
2927
|
+
var bootstrapResponseSchema = z32.object({
|
|
2928
|
+
ok: z32.literal(true),
|
|
2929
|
+
data: z32.discriminatedUnion("credentialPurpose", [
|
|
2703
2930
|
siteSetupBootstrapDataSchema,
|
|
2704
2931
|
featureBootstrapDataSchema
|
|
2705
2932
|
])
|
|
@@ -2750,7 +2977,7 @@ async function collectSourceFiles(directory) {
|
|
|
2750
2977
|
import { execFile as execFile2 } from "child_process";
|
|
2751
2978
|
import { readFile as readFile9 } from "fs/promises";
|
|
2752
2979
|
import { promisify as promisify2 } from "util";
|
|
2753
|
-
import { z as
|
|
2980
|
+
import { z as z33 } from "zod";
|
|
2754
2981
|
|
|
2755
2982
|
// ../cli/dist/scan/next-source-scan.js
|
|
2756
2983
|
import ts2 from "typescript";
|
|
@@ -3417,30 +3644,32 @@ function isPositionalFieldReference(value) {
|
|
|
3417
3644
|
|
|
3418
3645
|
// ../cli/dist/commands/site-setup.js
|
|
3419
3646
|
var execFileAsync2 = promisify2(execFile2);
|
|
3420
|
-
var safeErrorSchema =
|
|
3421
|
-
code:
|
|
3422
|
-
message:
|
|
3647
|
+
var safeErrorSchema = z33.object({
|
|
3648
|
+
code: z33.string().trim().min(1),
|
|
3649
|
+
message: z33.string().trim().min(1)
|
|
3423
3650
|
}).passthrough();
|
|
3424
|
-
var errorResponseSchema2 =
|
|
3425
|
-
var contextDataSchema =
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
|
|
3432
|
-
|
|
3433
|
-
|
|
3434
|
-
|
|
3651
|
+
var errorResponseSchema2 = z33.object({ ok: z33.literal(false), error: safeErrorSchema }).passthrough();
|
|
3652
|
+
var contextDataSchema = z33.object({
|
|
3653
|
+
task: siteSetupTaskSchema.refine((task) => task.run !== null)
|
|
3654
|
+
}).strict();
|
|
3655
|
+
var contextResponseSchema = z33.object({ ok: z33.literal(true), data: contextDataSchema }).strict();
|
|
3656
|
+
var applyDataSchema = z33.object({
|
|
3657
|
+
status: z33.enum(["applied", "ready_for_review"]),
|
|
3658
|
+
runId: z33.string().uuid().optional(),
|
|
3659
|
+
contractVersionId: z33.string().uuid().optional(),
|
|
3660
|
+
fieldContractHash: z33.string().regex(/^sha256:[0-9a-f]{64}$/u),
|
|
3661
|
+
editorDefinitionHash: z33.string().regex(/^sha256:[0-9a-f]{64}$/u).optional(),
|
|
3662
|
+
fieldCount: z33.number().int().nonnegative().optional(),
|
|
3663
|
+
routeCount: z33.number().int().nonnegative().optional()
|
|
3435
3664
|
}).strict();
|
|
3436
|
-
var applyResponseSchema =
|
|
3437
|
-
var verifyDataSchema =
|
|
3438
|
-
status:
|
|
3439
|
-
runId:
|
|
3440
|
-
deploymentOrigin:
|
|
3441
|
-
deploymentRevision:
|
|
3665
|
+
var applyResponseSchema = z33.object({ ok: z33.literal(true), data: applyDataSchema }).strict();
|
|
3666
|
+
var verifyDataSchema = z33.object({
|
|
3667
|
+
status: z33.literal("ready_for_review"),
|
|
3668
|
+
runId: z33.string().uuid().optional(),
|
|
3669
|
+
deploymentOrigin: z33.string().url().optional(),
|
|
3670
|
+
deploymentRevision: z33.string().optional()
|
|
3442
3671
|
}).strict();
|
|
3443
|
-
var verifyResponseSchema =
|
|
3672
|
+
var verifyResponseSchema = z33.object({ ok: z33.literal(true), data: verifyDataSchema }).strict();
|
|
3444
3673
|
async function siteSetupContextCommand(input) {
|
|
3445
3674
|
const response = await postSiteSetup(input, "context", {});
|
|
3446
3675
|
const parsed = contextResponseSchema.safeParse(response.payload);
|
|
@@ -3543,8 +3772,8 @@ import ts3 from "typescript";
|
|
|
3543
3772
|
import { randomUUID as randomUUID5 } from "crypto";
|
|
3544
3773
|
import { lstat as lstat3, mkdir as mkdir7, open as open4, readFile as readFile11, rm as rm4, rmdir } from "fs/promises";
|
|
3545
3774
|
import { resolve as resolve2 } from "path";
|
|
3546
|
-
import { z as
|
|
3547
|
-
var ownerSchema =
|
|
3775
|
+
import { z as z34 } from "zod";
|
|
3776
|
+
var ownerSchema = z34.object({ pid: z34.number().int().positive(), nonce: z34.string().uuid() }).strict();
|
|
3548
3777
|
|
|
3549
3778
|
// ../cli/dist/config/build-provenance.js
|
|
3550
3779
|
import { createHash as createHash3 } from "crypto";
|
|
@@ -3552,23 +3781,23 @@ import { execFile as execFile3 } from "child_process";
|
|
|
3552
3781
|
import { lstat as lstat4, readFile as readFile12, writeFile as writeFile5, mkdir as mkdir8 } from "fs/promises";
|
|
3553
3782
|
import { dirname as dirname8, isAbsolute as isAbsolute2, join as join10, relative as relative6, resolve as resolve3, sep as sep3 } from "path";
|
|
3554
3783
|
import { isDeepStrictEqual, promisify as promisify3 } from "util";
|
|
3555
|
-
import { z as
|
|
3784
|
+
import { z as z35 } from "zod";
|
|
3556
3785
|
var execute = promisify3(execFile3);
|
|
3557
3786
|
var name = ".siteplane/build-source.json";
|
|
3558
|
-
var oid =
|
|
3559
|
-
var entrySchema =
|
|
3560
|
-
path:
|
|
3561
|
-
mode:
|
|
3787
|
+
var oid = z35.string().regex(/^[0-9a-f]{40}$/u);
|
|
3788
|
+
var entrySchema = z35.object({
|
|
3789
|
+
path: z35.string().min(1).max(4096),
|
|
3790
|
+
mode: z35.enum(["100644", "100755", "120000"]),
|
|
3562
3791
|
oid
|
|
3563
3792
|
}).strict();
|
|
3564
|
-
var schema =
|
|
3565
|
-
version:
|
|
3793
|
+
var schema = z35.object({
|
|
3794
|
+
version: z35.literal(2),
|
|
3566
3795
|
revision: oid,
|
|
3567
|
-
commit:
|
|
3568
|
-
entries:
|
|
3569
|
-
providerConfigurations:
|
|
3570
|
-
path:
|
|
3571
|
-
source:
|
|
3796
|
+
commit: z35.string().min(1).max(1048576),
|
|
3797
|
+
entries: z35.array(entrySchema).min(1).max(1e5),
|
|
3798
|
+
providerConfigurations: z35.array(z35.object({
|
|
3799
|
+
path: z35.string().max(4096).regex(/(?:^|\/)vercel\.json$/u),
|
|
3800
|
+
source: z35.string().max(1048576)
|
|
3572
3801
|
}).strict()).max(1e3)
|
|
3573
3802
|
}).strict();
|
|
3574
3803
|
var gitHash = (type, content) => createHash3("sha1").update(`${type} ${content.length}\0`).update(content).digest("hex");
|
|
@@ -3668,7 +3897,7 @@ async function readBuildProvenance(projectDirectory) {
|
|
|
3668
3897
|
const original = configurations.get(entry.path);
|
|
3669
3898
|
if (contents && original && entry.mode !== "120000") {
|
|
3670
3899
|
try {
|
|
3671
|
-
const object =
|
|
3900
|
+
const object = z35.record(z35.string(), z35.unknown());
|
|
3672
3901
|
const actual = object.parse(JSON.parse(contents.toString("utf8")));
|
|
3673
3902
|
const expected = object.parse(JSON.parse(original));
|
|
3674
3903
|
if (!Object.hasOwn(expected, "version") && actual.version === 2)
|
|
@@ -3722,37 +3951,38 @@ import { createHash as createHash4, randomBytes, randomUUID as randomUUID6 } fro
|
|
|
3722
3951
|
import { access as access5, mkdir as mkdir9, mkdtemp, rm as rm5, writeFile as writeFile6 } from "fs/promises";
|
|
3723
3952
|
import { tmpdir } from "os";
|
|
3724
3953
|
import { join as join11 } from "path";
|
|
3725
|
-
import { z as
|
|
3726
|
-
var envSchema =
|
|
3727
|
-
id:
|
|
3728
|
-
key:
|
|
3729
|
-
target:
|
|
3730
|
-
type:
|
|
3731
|
-
comment:
|
|
3732
|
-
updatedAt:
|
|
3733
|
-
});
|
|
3734
|
-
var deploymentSchema =
|
|
3735
|
-
id:
|
|
3736
|
-
projectId:
|
|
3737
|
-
ownerId:
|
|
3738
|
-
target:
|
|
3739
|
-
readyState:
|
|
3740
|
-
createdAt:
|
|
3741
|
-
url:
|
|
3742
|
-
meta:
|
|
3743
|
-
gitSource:
|
|
3744
|
-
});
|
|
3745
|
-
var buildProofSchema =
|
|
3746
|
-
node:
|
|
3747
|
-
packageManager:
|
|
3748
|
-
packageManagerVersion:
|
|
3749
|
-
lockfileHash:
|
|
3750
|
-
revision:
|
|
3751
|
-
fieldContractHash:
|
|
3752
|
-
siteplane:
|
|
3753
|
-
runtimeNext:
|
|
3754
|
-
|
|
3755
|
-
|
|
3954
|
+
import { z as z36 } from "zod";
|
|
3955
|
+
var envSchema = z36.object({
|
|
3956
|
+
id: z36.string(),
|
|
3957
|
+
key: z36.string(),
|
|
3958
|
+
target: z36.array(z36.string()),
|
|
3959
|
+
type: z36.string(),
|
|
3960
|
+
comment: z36.string().optional(),
|
|
3961
|
+
updatedAt: z36.number().optional()
|
|
3962
|
+
});
|
|
3963
|
+
var deploymentSchema = z36.object({
|
|
3964
|
+
id: z36.string(),
|
|
3965
|
+
projectId: z36.string(),
|
|
3966
|
+
ownerId: z36.string().optional(),
|
|
3967
|
+
target: z36.string().nullable(),
|
|
3968
|
+
readyState: z36.string(),
|
|
3969
|
+
createdAt: z36.number(),
|
|
3970
|
+
url: z36.string(),
|
|
3971
|
+
meta: z36.record(z36.string(), z36.unknown()).optional(),
|
|
3972
|
+
gitSource: z36.object({ sha: z36.string().optional() }).nullable().optional()
|
|
3973
|
+
});
|
|
3974
|
+
var buildProofSchema = z36.object({
|
|
3975
|
+
node: z36.string(),
|
|
3976
|
+
packageManager: z36.enum(["npm", "pnpm"]),
|
|
3977
|
+
packageManagerVersion: z36.string(),
|
|
3978
|
+
lockfileHash: z36.string(),
|
|
3979
|
+
revision: z36.string(),
|
|
3980
|
+
fieldContractHash: z36.string(),
|
|
3981
|
+
siteplane: z36.string(),
|
|
3982
|
+
runtimeNext: z36.string(),
|
|
3983
|
+
analytics: z36.string().optional(),
|
|
3984
|
+
next: z36.string(),
|
|
3985
|
+
react: z36.string()
|
|
3756
3986
|
}).strict();
|
|
3757
3987
|
var defaults = {
|
|
3758
3988
|
preflight: setupPreflightCommand,
|
|
@@ -3762,6 +3992,7 @@ var defaults = {
|
|
|
3762
3992
|
verify: siteSetupVerifyCommand,
|
|
3763
3993
|
post: postSiteSetup,
|
|
3764
3994
|
writeBuildProvenance,
|
|
3995
|
+
analyticsPublicKey: analyticsPublicKeyCommand,
|
|
3765
3996
|
now: Date.now,
|
|
3766
3997
|
pause: (milliseconds) => new Promise((resolve5) => setTimeout(resolve5, milliseconds))
|
|
3767
3998
|
};
|
|
@@ -3836,11 +4067,17 @@ async function withSiteplane(nextConfig, options = {}) {
|
|
|
3836
4067
|
buildRevision,
|
|
3837
4068
|
scan.fieldContractHash
|
|
3838
4069
|
);
|
|
4070
|
+
const hasImages = scan.contract.fields.some(
|
|
4071
|
+
(field) => field.fieldType === "image"
|
|
4072
|
+
);
|
|
4073
|
+
const imageOrigin = hasImages ? readImageWebsiteOrigin() : null;
|
|
3839
4074
|
return {
|
|
3840
4075
|
...nextConfig,
|
|
4076
|
+
...imageOrigin ? { images: prepareImagePatterns(nextConfig.images, imageOrigin) } : {},
|
|
3841
4077
|
headers: async () => frameHeaders(
|
|
3842
4078
|
await nextConfig.headers?.() ?? [],
|
|
3843
|
-
new URL(config.apiBaseUrl).origin
|
|
4079
|
+
new URL(config.apiBaseUrl).origin,
|
|
4080
|
+
imageOrigin
|
|
3844
4081
|
),
|
|
3845
4082
|
env: {
|
|
3846
4083
|
...nextConfig.env ?? {},
|
|
@@ -3861,7 +4098,7 @@ async function readGitRevision2(projectDir) {
|
|
|
3861
4098
|
return "";
|
|
3862
4099
|
}
|
|
3863
4100
|
}
|
|
3864
|
-
function frameHeaders(rules, adminOrigin) {
|
|
4101
|
+
function frameHeaders(rules, adminOrigin, imageOrigin) {
|
|
3865
4102
|
const policy = `frame-ancestors 'self' ${adminOrigin}`;
|
|
3866
4103
|
const prepared = rules.map((rule) => ({
|
|
3867
4104
|
...rule,
|
|
@@ -3880,9 +4117,10 @@ function frameHeaders(rules, adminOrigin) {
|
|
|
3880
4117
|
"frame_policy_conflict",
|
|
3881
4118
|
"Keep the existing CSP directives and explicitly allow only the canonical Siteplane admin origin in frame-ancestors."
|
|
3882
4119
|
);
|
|
4120
|
+
const value = ancestors ? header.value : `${header.value.replace(/;\s*$/u, "")}; ${policy}`;
|
|
3883
4121
|
return {
|
|
3884
4122
|
...header,
|
|
3885
|
-
value:
|
|
4123
|
+
value: imageOrigin ? prepareImageCsp(value, imageOrigin) : value
|
|
3886
4124
|
};
|
|
3887
4125
|
})
|
|
3888
4126
|
}));
|
|
@@ -3894,13 +4132,98 @@ function frameHeaders(rules, adminOrigin) {
|
|
|
3894
4132
|
...prepared
|
|
3895
4133
|
];
|
|
3896
4134
|
}
|
|
4135
|
+
var managedImageOrigin = "https://siteplane.io";
|
|
4136
|
+
function readImageWebsiteOrigin() {
|
|
4137
|
+
try {
|
|
4138
|
+
const value = process.env.SITEPLANE_SITE_ORIGIN;
|
|
4139
|
+
const url = new URL(value ?? "");
|
|
4140
|
+
if (url.protocol !== "https:" || url.username || url.password || url.port || url.pathname !== "/" || url.search || url.hash || !url.hostname.includes(".") || /(?:^|\.)(?:localhost|local|internal)$/iu.test(url.hostname) || /^[\d.]+$/u.test(url.hostname) || url.hostname.includes(":"))
|
|
4141
|
+
throw new Error("Invalid image origin");
|
|
4142
|
+
return url.origin;
|
|
4143
|
+
} catch {
|
|
4144
|
+
throw new SiteplaneNextContractError(
|
|
4145
|
+
"image_origin_missing",
|
|
4146
|
+
"Image fields require SITEPLANE_SITE_ORIGIN to be the exact public HTTPS website origin. setup deploy sets it from the verified provider domain; use that same origin for local builds. Never substitute a wildcard or private host."
|
|
4147
|
+
);
|
|
4148
|
+
}
|
|
4149
|
+
}
|
|
4150
|
+
function prepareImagePatterns(images, websiteOrigin) {
|
|
4151
|
+
if (images?.loaderFile || images?.loader && images.loader !== "default")
|
|
4152
|
+
throw new SiteplaneNextContractError(
|
|
4153
|
+
"image_policy_conflict",
|
|
4154
|
+
"The website uses a custom image loader. Reconcile its handling of Siteplane and repository image URLs while preserving existing images; do not bypass optimization globally."
|
|
4155
|
+
);
|
|
4156
|
+
if (images?.maximumRedirects !== void 0 && images.maximumRedirects !== 0)
|
|
4157
|
+
throw new SiteplaneNextContractError(
|
|
4158
|
+
"image_policy_conflict",
|
|
4159
|
+
"The website explicitly follows image redirects. Resolve redirecting sources before setting maximumRedirects to 0; Siteplane image destinations must be fetched directly."
|
|
4160
|
+
);
|
|
4161
|
+
const remotePatterns = [...images?.remotePatterns ?? []];
|
|
4162
|
+
for (const [origin, pathname] of [
|
|
4163
|
+
[managedImageOrigin, "/api/assets/*/content"],
|
|
4164
|
+
[websiteOrigin, "/siteplane-assets/**"]
|
|
4165
|
+
]) {
|
|
4166
|
+
const pattern = {
|
|
4167
|
+
protocol: "https",
|
|
4168
|
+
hostname: new URL(origin).hostname,
|
|
4169
|
+
port: "",
|
|
4170
|
+
pathname,
|
|
4171
|
+
search: ""
|
|
4172
|
+
};
|
|
4173
|
+
if (!remotePatterns.some(
|
|
4174
|
+
(existing) => existing.protocol === pattern.protocol && existing.hostname === pattern.hostname && existing.port === "" && existing.pathname === pathname && existing.search === ""
|
|
4175
|
+
))
|
|
4176
|
+
remotePatterns.push(pattern);
|
|
4177
|
+
}
|
|
4178
|
+
const localPatterns = images?.localPatterns ? [...images.localPatterns] : void 0;
|
|
4179
|
+
if (localPatterns && !localPatterns.some(
|
|
4180
|
+
(pattern) => pattern.pathname === "/siteplane-assets/**" && pattern.search === ""
|
|
4181
|
+
))
|
|
4182
|
+
localPatterns.push({ pathname: "/siteplane-assets/**", search: "" });
|
|
4183
|
+
return {
|
|
4184
|
+
...images,
|
|
4185
|
+
remotePatterns,
|
|
4186
|
+
...localPatterns ? { localPatterns } : {},
|
|
4187
|
+
maximumRedirects: 0
|
|
4188
|
+
};
|
|
4189
|
+
}
|
|
4190
|
+
function prepareImageCsp(policy, websiteOrigin) {
|
|
4191
|
+
if (policy.includes(","))
|
|
4192
|
+
throw new SiteplaneNextContractError(
|
|
4193
|
+
"image_policy_conflict",
|
|
4194
|
+
"Split combined CSP policies into separate header rules before image preparation; preserve every existing directive."
|
|
4195
|
+
);
|
|
4196
|
+
const directives = policy.split(";").map((part) => part.trim()).filter(Boolean);
|
|
4197
|
+
const find = (name2) => directives.map((part, index) => ({ index, tokens: part.split(/\s+/u) })).filter((part) => part.tokens[0]?.toLowerCase() === name2);
|
|
4198
|
+
const image = find("img-src"), defaults2 = find("default-src");
|
|
4199
|
+
if (image.length > 1 || defaults2.length > 1)
|
|
4200
|
+
throw new SiteplaneNextContractError(
|
|
4201
|
+
"image_policy_conflict",
|
|
4202
|
+
"Remove ambiguous duplicate img-src/default-src directives before image preparation without changing unrelated policies."
|
|
4203
|
+
);
|
|
4204
|
+
const existing = image[0] ?? defaults2[0];
|
|
4205
|
+
if (!existing) return policy;
|
|
4206
|
+
const sources = existing.tokens.slice(1).filter((source) => source !== "'none'");
|
|
4207
|
+
for (const source of [
|
|
4208
|
+
`${managedImageOrigin}/api/assets/`,
|
|
4209
|
+
`${websiteOrigin}/siteplane-assets/`,
|
|
4210
|
+
`${websiteOrigin}/_next/image`
|
|
4211
|
+
]) {
|
|
4212
|
+
if (!sources.includes(source)) sources.push(source);
|
|
4213
|
+
}
|
|
4214
|
+
const value = `img-src ${sources.join(" ")}`;
|
|
4215
|
+
if (image[0]) directives[image[0].index] = value;
|
|
4216
|
+
else directives.push(value);
|
|
4217
|
+
return directives.join("; ");
|
|
4218
|
+
}
|
|
3897
4219
|
async function emitBuildProof(projectDir, packages, revision, fieldContractHash) {
|
|
3898
4220
|
const [cli, runtime, next, react] = await Promise.all(
|
|
3899
4221
|
["siteplane", "@siteplane/runtime-next", "next", "react"].map(
|
|
3900
4222
|
(name2) => readInstalledPackage(projectDir, name2)
|
|
3901
4223
|
)
|
|
3902
4224
|
);
|
|
3903
|
-
|
|
4225
|
+
const analytics = packages.analytics ? await readInstalledPackage(projectDir, "@siteplane/analytics") : void 0;
|
|
4226
|
+
if (analytics?.version !== packages.analytics || cli.version !== packages.siteplane || runtime.version !== packages.runtimeNext)
|
|
3904
4227
|
throw new SiteplaneNextContractError(
|
|
3905
4228
|
"build_identity_missing",
|
|
3906
4229
|
"The provider installed different Siteplane package versions than the task requires."
|
|
@@ -3937,7 +4260,7 @@ async function emitBuildProof(projectDir, packages, revision, fieldContractHash)
|
|
|
3937
4260
|
"The provider build is missing the selected canonical lockfile."
|
|
3938
4261
|
);
|
|
3939
4262
|
console.info(
|
|
3940
|
-
`SITEPLANE_BUILD_PROOF=${JSON.stringify({ node: process.versions.node, packageManager, packageManagerVersion, lockfileHash: `sha256:${createHash5("sha256").update(lock).digest("hex")}`, revision, fieldContractHash, siteplane: cli.version, runtimeNext: runtime.version, next: next.version, react: react.version })}`
|
|
4263
|
+
`SITEPLANE_BUILD_PROOF=${JSON.stringify({ node: process.versions.node, packageManager, packageManagerVersion, lockfileHash: `sha256:${createHash5("sha256").update(lock).digest("hex")}`, revision, fieldContractHash, siteplane: cli.version, runtimeNext: runtime.version, ...analytics ? { analytics: analytics.version } : {}, next: next.version, react: react.version })}`
|
|
3941
4264
|
);
|
|
3942
4265
|
}
|
|
3943
4266
|
export {
|