@tileflow/core 0.1.0-alpha.28 → 0.1.0-alpha.29

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 CHANGED
@@ -67,7 +67,7 @@ Omitted fields inherit, but declaring a field does not imply a recursive merge:
67
67
  Spread the parent's list explicitly when composing contributors. Later contributors win for an
68
68
  exact icon ID.
69
69
  - `fonts` and `glyphs` are mutually exclusive text providers. Declaring either replaces the inherited
70
- provider. `data`, `projection`, `terrain`, and `marine` are also atomic.
70
+ provider. `atmosphere`, `data`, `projection`, `terrain`, and `marine` are also atomic.
71
71
 
72
72
  Identity (`id`, `name`, `version`) and tooling `scenes` belong to the leaf map and do not inherit.
73
73
  Module object order does not determine rendering order. See the
@@ -222,8 +222,15 @@ tooling prepare browser resources; direct MapLibre integrations must register re
222
222
  before loading a style. See the
223
223
  [browser runtime contract](https://github.com/tileflow/tileflow-sdk/blob/main/docs/contracts/framework-browser-runtime.md).
224
224
 
225
+ Set `projection: 'globe'` and `atmosphere: true` in `tileflow.config.ts` for a blue globe rim,
226
+ space background, and stars. Use `atmosphere: false` to disable an inherited atmosphere, or an
227
+ options object for theme-aware colors and bounded star brightness/motion. React, Vue, Svelte, and
228
+ standalone capture apply the browser effect automatically. Direct MapLibre integrations call
229
+ `attachTileflowAtmosphere(map)` from `@tileflow/core/browser`. See
230
+ [globe atmosphere](https://github.com/tileflow/tileflow-sdk/blob/main/packages/core/docs/globe-atmosphere.md).
231
+
225
232
  A map with text must declare exactly one text provider. Streets, Ferraris, Härad, Soundings,
226
- Verdant, and San Francisto use URL glyph providers. Baedeker and Siegfried use packaged Cormorant
233
+ and Blueprint use URL glyph providers. Baedeker and Siegfried use packaged Cormorant
227
234
  fonts; Cyberpunk and Matrix use packaged Oxanium fonts. Hosted deployment currently rejects
228
235
  package/local font bundles; use self-hosted output or explicitly replace the provider with compatible
229
236
  public glyphs. Tile URLs and font providers do not establish redistribution rights.
@@ -242,6 +249,7 @@ for exact options. Prefer the installed CLI's generated contracts when using a p
242
249
  These guides are also included in the installed package under `docs/`. They describe this source
243
250
  revision; prefer the installed copy when working with an older release.
244
251
 
252
+ - [Globe atmosphere](https://github.com/tileflow/tileflow-sdk/blob/main/packages/core/docs/globe-atmosphere.md)
245
253
  - [Map and terrain examples](https://github.com/tileflow/tileflow-sdk/blob/main/packages/core/docs/map-and-terrain-examples.md)
246
254
  - [Authoring model](https://github.com/tileflow/tileflow-sdk/blob/main/packages/core/docs/authoring-model.md)
247
255
  - [Shared visual primitives](https://github.com/tileflow/tileflow-sdk/blob/main/packages/core/docs/shared-visual-primitives.md)
package/dist/browser.d.ts CHANGED
@@ -45,6 +45,7 @@ type TileflowLight = {
45
45
  position?: readonly [number, number, number];
46
46
  };
47
47
  type MapLibreStyle = {
48
+ sky?: Record<string, unknown>;
48
49
  version: 8;
49
50
  name: string;
50
51
  glyphs?: string;
@@ -93,6 +94,32 @@ type TileflowStyleFontFace = {
93
94
  weight?: '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';
94
95
  };
95
96
 
97
+ /** Structural MapLibre capabilities; importing this module never loads a renderer. */
98
+ type TileflowAtmosphereMap = {
99
+ getBearing(): number;
100
+ getCanvas(): HTMLCanvasElement;
101
+ getCenter(): {
102
+ lat: number;
103
+ lng: number;
104
+ };
105
+ getContainer(): HTMLElement;
106
+ getPitch(): number;
107
+ getZoom(): number;
108
+ getStyle(): {
109
+ metadata?: unknown;
110
+ projection?: {
111
+ type?: unknown;
112
+ };
113
+ } | undefined;
114
+ on(event: 'move' | 'resize' | 'style.load' | 'remove', listener: () => void): unknown;
115
+ off(event: 'move' | 'resize' | 'style.load' | 'remove', listener: () => void): unknown;
116
+ };
117
+ /**
118
+ * Render compiled globe atmosphere metadata. Call after constructing a browser map.
119
+ * Follows style replacements and releases its canvas, listeners, and pending frame on disposal.
120
+ */
121
+ declare function attachTileflowAtmosphere(map: TileflowAtmosphereMap): () => void;
122
+
96
123
  declare const tileflowMaplibreContourVersion: "0.1.0";
97
124
  type TileflowContourProtocolRequest = Readonly<{
98
125
  url: string;
@@ -243,4 +270,4 @@ declare function createTileflowTransformRequest<TRequest extends TileflowTransfo
243
270
  worldRequestBridge?: TileflowWorldRequestBridge;
244
271
  }): TileflowTransformRequest<TRequest, TResourceType> | undefined;
245
272
 
246
- export { type TileflowAsyncAnalyticsTiming, type TileflowComposedRequest, type TileflowContourProtocolHandler, type TileflowContourProtocolRegistrationOptions, type TileflowContourProtocolRegistry, type TileflowContourProtocolRequest, type TileflowContourProtocolResponse, type TileflowFairUseNotice, type TileflowFairUseNoticeController, type TileflowFairUseNoticeState, type TileflowFrameScheduler, type TileflowMapLifecycleAttachment, type TileflowMapLifecycleEvent, type TileflowMapLifecycleSubscriber, type TileflowMapReadinessState, type TileflowPmtilesProtocolHandler, type TileflowPmtilesProtocolRegistrationOptions, type TileflowPmtilesProtocolRegistry, type TileflowSessionSender, type TileflowSessionStarter, type TileflowStyleFontLoadOptions, type TileflowStyleSwitchMap, type TileflowThemeController, type TileflowThemeTransition, type TileflowThemeTransitionPhase, type TileflowThemeTransitionResult, type TileflowTransformRequest, type TileflowTransformRequestParameters, type TileflowUserTransformRequest, type TileflowWorldProtocolHandler, type TileflowWorldProtocolRequest, type TileflowWorldProtocolResponse, type TileflowWorldRequestBridge, attachTileflowFairUseNotice, attachTileflowMapLifecycle, createTileflowSessionStarter, createTileflowThemeController, createTileflowTransformRequest, getTileflowSystemColorScheme, loadTileflowStyleFonts, registerTileflowContourProtocol, registerTileflowPmtilesProtocol, registerTileflowWorldRequestBridge, subscribeTileflowSystemColorScheme, tileflowFairUseNoticeMessage, tileflowMaplibreContourVersion, tileflowPmtilesMaximumDirectoryDepth, tileflowPmtilesProtocol };
273
+ export { type TileflowAsyncAnalyticsTiming, type TileflowAtmosphereMap, type TileflowComposedRequest, type TileflowContourProtocolHandler, type TileflowContourProtocolRegistrationOptions, type TileflowContourProtocolRegistry, type TileflowContourProtocolRequest, type TileflowContourProtocolResponse, type TileflowFairUseNotice, type TileflowFairUseNoticeController, type TileflowFairUseNoticeState, type TileflowFrameScheduler, type TileflowMapLifecycleAttachment, type TileflowMapLifecycleEvent, type TileflowMapLifecycleSubscriber, type TileflowMapReadinessState, type TileflowPmtilesProtocolHandler, type TileflowPmtilesProtocolRegistrationOptions, type TileflowPmtilesProtocolRegistry, type TileflowSessionSender, type TileflowSessionStarter, type TileflowStyleFontLoadOptions, type TileflowStyleSwitchMap, type TileflowThemeController, type TileflowThemeTransition, type TileflowThemeTransitionPhase, type TileflowThemeTransitionResult, type TileflowTransformRequest, type TileflowTransformRequestParameters, type TileflowUserTransformRequest, type TileflowWorldProtocolHandler, type TileflowWorldProtocolRequest, type TileflowWorldProtocolResponse, type TileflowWorldRequestBridge, attachTileflowAtmosphere, attachTileflowFairUseNotice, attachTileflowMapLifecycle, createTileflowSessionStarter, createTileflowThemeController, createTileflowTransformRequest, getTileflowSystemColorScheme, loadTileflowStyleFonts, registerTileflowContourProtocol, registerTileflowPmtilesProtocol, registerTileflowWorldRequestBridge, subscribeTileflowSystemColorScheme, tileflowFairUseNoticeMessage, tileflowMaplibreContourVersion, tileflowPmtilesMaximumDirectoryDepth, tileflowPmtilesProtocol };
package/dist/browser.js CHANGED
@@ -2201,6 +2201,207 @@ function getTileflowLocationOrigin() {
2201
2201
  return window.location.origin;
2202
2202
  }
2203
2203
 
2204
+ // src/atmosphere.ts
2205
+ var tileflowAtmosphereMetadataKey = "tileflow:atmosphere";
2206
+ function readTileflowAtmosphere(value) {
2207
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
2208
+ const record = value;
2209
+ if (record.version !== 1 || Object.keys(record).length !== 7) return void 0;
2210
+ for (const key of ["skyColor", "horizonColor", "fogColor", "spaceColor"]) {
2211
+ if (typeof record[key] !== "string" || !/^#[0-9a-f]{6}$/i.test(record[key])) return void 0;
2212
+ }
2213
+ for (const key of ["starIntensity", "starParallax"]) {
2214
+ const number = record[key];
2215
+ if (typeof number !== "number" || !Number.isFinite(number) || number < 0 || number > 1)
2216
+ return void 0;
2217
+ }
2218
+ return {
2219
+ skyColor: record.skyColor,
2220
+ horizonColor: record.horizonColor,
2221
+ fogColor: record.fogColor,
2222
+ spaceColor: record.spaceColor,
2223
+ starIntensity: record.starIntensity,
2224
+ starParallax: record.starParallax
2225
+ };
2226
+ }
2227
+ function atmosphereSpaceOpacity(zoom) {
2228
+ const progress = Math.max(0, Math.min(1, (zoom - 3) / 3));
2229
+ return 1 - progress * progress * (3 - 2 * progress);
2230
+ }
2231
+ function atmosphereAngleDelta(next, previous) {
2232
+ return ((next - previous) % 360 + 540) % 360 - 180;
2233
+ }
2234
+ function wrapAtmosphereStar(value, extent) {
2235
+ return (value % extent + extent) % extent;
2236
+ }
2237
+ function createAtmosphereStars(count = 650) {
2238
+ let seed = 7321;
2239
+ const random = () => {
2240
+ seed = Math.imul(seed, 1664525) + 1013904223 >>> 0;
2241
+ return seed / 4294967296;
2242
+ };
2243
+ return Array.from({ length: count }, () => ({
2244
+ x: random(),
2245
+ y: random(),
2246
+ radius: 0.35 + random() ** 5 * 0.95,
2247
+ alpha: 0.18 + random() ** 2 * 0.6
2248
+ }));
2249
+ }
2250
+
2251
+ // src/atmosphere-browser.ts
2252
+ function attachTileflowAtmosphere(map) {
2253
+ const container = map.getContainer();
2254
+ const document2 = container.ownerDocument;
2255
+ const browser = document2.defaultView;
2256
+ if (!browser) return () => {
2257
+ };
2258
+ const mapCanvas = map.getCanvas();
2259
+ const previousFilter = mapCanvas.style.filter;
2260
+ const reducedMotion = browser.matchMedia("(prefers-reduced-motion: reduce)");
2261
+ const stars = createAtmosphereStars();
2262
+ let options;
2263
+ let canvas;
2264
+ let context = null;
2265
+ let frame;
2266
+ let disposed = false;
2267
+ let appliedFilter;
2268
+ let width = 0;
2269
+ let height = 0;
2270
+ let pixelRatio = 0;
2271
+ let previousLongitude = map.getCenter().lng;
2272
+ let previousBearing = map.getBearing();
2273
+ let longitude = previousLongitude;
2274
+ let bearing = previousBearing;
2275
+ function restoreFilter() {
2276
+ if (appliedFilter !== void 0 && mapCanvas.style.filter === appliedFilter)
2277
+ mapCanvas.style.filter = previousFilter;
2278
+ appliedFilter = void 0;
2279
+ }
2280
+ function removeCanvas() {
2281
+ canvas?.remove();
2282
+ canvas = void 0;
2283
+ context = null;
2284
+ width = height = pixelRatio = 0;
2285
+ restoreFilter();
2286
+ }
2287
+ function syncStyle() {
2288
+ if (disposed) return;
2289
+ const style = map.getStyle();
2290
+ const metadata = style?.metadata;
2291
+ options = style?.projection?.type === "globe" && metadata && typeof metadata === "object" ? readTileflowAtmosphere(
2292
+ metadata[tileflowAtmosphereMetadataKey]
2293
+ ) : void 0;
2294
+ if (!options) {
2295
+ if (frame !== void 0) browser.cancelAnimationFrame(frame);
2296
+ frame = void 0;
2297
+ removeCanvas();
2298
+ return;
2299
+ }
2300
+ if (!canvas) {
2301
+ canvas = document2.createElement("canvas");
2302
+ canvas.setAttribute("aria-hidden", "true");
2303
+ canvas.setAttribute("data-tileflow-atmosphere", "");
2304
+ Object.assign(canvas.style, {
2305
+ position: "absolute",
2306
+ inset: "0",
2307
+ width: "100%",
2308
+ height: "100%",
2309
+ opacity: "0",
2310
+ pointerEvents: "none"
2311
+ });
2312
+ context = canvas.getContext("2d");
2313
+ container.insertBefore(canvas, container.firstChild);
2314
+ }
2315
+ canvas.style.background = `radial-gradient(ellipse at 50% 48%, ${options.skyColor} 0%, ${options.spaceColor} 100%)`;
2316
+ schedule();
2317
+ }
2318
+ function draw() {
2319
+ frame = void 0;
2320
+ if (disposed || !options || !canvas) return;
2321
+ const center = map.getCenter();
2322
+ longitude += atmosphereAngleDelta(center.lng, previousLongitude);
2323
+ bearing += atmosphereAngleDelta(map.getBearing(), previousBearing);
2324
+ previousLongitude = center.lng;
2325
+ previousBearing = map.getBearing();
2326
+ const opacity = atmosphereSpaceOpacity(map.getZoom());
2327
+ canvas.style.opacity = String(opacity);
2328
+ if (opacity === 0) {
2329
+ restoreFilter();
2330
+ return;
2331
+ }
2332
+ const baseFilter = previousFilter && previousFilter !== "none" ? `${previousFilter} ` : "";
2333
+ mapCanvas.style.filter = `${baseFilter}drop-shadow(0 0 2px ${withAlpha(options.horizonColor, opacity * 0.65)}) drop-shadow(0 0 12px ${withAlpha(options.horizonColor, opacity * 0.4)})`;
2334
+ appliedFilter = mapCanvas.style.filter;
2335
+ if (!context) return;
2336
+ const nextWidth = container.clientWidth;
2337
+ const nextHeight = container.clientHeight;
2338
+ if (!nextWidth || !nextHeight) return;
2339
+ const nextPixelRatio = Math.min(browser.devicePixelRatio || 1, 2);
2340
+ if (width !== nextWidth || height !== nextHeight || pixelRatio !== nextPixelRatio) {
2341
+ width = nextWidth;
2342
+ height = nextHeight;
2343
+ pixelRatio = nextPixelRatio;
2344
+ canvas.width = Math.round(width * pixelRatio);
2345
+ canvas.height = Math.round(height * pixelRatio);
2346
+ context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
2347
+ }
2348
+ context.clearRect(0, 0, width, height);
2349
+ if (options.starIntensity === 0) return;
2350
+ const motion = reducedMotion.matches ? 0 : options.starParallax / 0.4;
2351
+ const xOffset = motion * (-longitude * 0.8 - bearing * 0.35);
2352
+ const yOffset = motion * (center.lat * 0.6 + map.getPitch() * 0.4);
2353
+ const intensity = options.starIntensity / 0.6;
2354
+ const fieldWidth = 1600;
2355
+ const fieldHeight = 1e3;
2356
+ for (const star of stars) {
2357
+ const x3 = wrapAtmosphereStar(star.x * fieldWidth + xOffset, fieldWidth);
2358
+ const y = wrapAtmosphereStar(star.y * fieldHeight + yOffset, fieldHeight);
2359
+ for (let tileX = -1; tileX * fieldWidth < width; tileX++) {
2360
+ for (let tileY = -1; tileY * fieldHeight < height; tileY++) {
2361
+ const screenX = x3 + tileX * fieldWidth;
2362
+ const screenY = y + tileY * fieldHeight;
2363
+ if (screenX < -3 || screenX > width + 3 || screenY < -3 || screenY > height + 3) continue;
2364
+ if (star.radius > 0.95) {
2365
+ context.fillStyle = withAlpha(options.horizonColor, star.alpha * intensity * 0.12);
2366
+ context.beginPath();
2367
+ context.arc(screenX, screenY, star.radius * 2.5, 0, Math.PI * 2);
2368
+ context.fill();
2369
+ }
2370
+ context.fillStyle = `rgba(208, 227, 255, ${Math.min(1, star.alpha * intensity)})`;
2371
+ context.beginPath();
2372
+ context.arc(screenX, screenY, star.radius, 0, Math.PI * 2);
2373
+ context.fill();
2374
+ }
2375
+ }
2376
+ }
2377
+ }
2378
+ function schedule() {
2379
+ if (!disposed && options && frame === void 0) frame = browser.requestAnimationFrame(draw);
2380
+ }
2381
+ function dispose() {
2382
+ if (disposed) return;
2383
+ disposed = true;
2384
+ if (frame !== void 0) browser.cancelAnimationFrame(frame);
2385
+ map.off("move", schedule);
2386
+ map.off("resize", schedule);
2387
+ map.off("style.load", syncStyle);
2388
+ map.off("remove", dispose);
2389
+ reducedMotion.removeEventListener("change", schedule);
2390
+ removeCanvas();
2391
+ }
2392
+ map.on("move", schedule);
2393
+ map.on("resize", schedule);
2394
+ map.on("style.load", syncStyle);
2395
+ map.on("remove", dispose);
2396
+ reducedMotion.addEventListener("change", schedule);
2397
+ syncStyle();
2398
+ return dispose;
2399
+ }
2400
+ function withAlpha(color, alpha) {
2401
+ const value = Number.parseInt(color.slice(1), 16);
2402
+ return `rgba(${value >> 16}, ${value >> 8 & 255}, ${value & 255}, ${alpha})`;
2403
+ }
2404
+
2204
2405
  // src/data/world-release-id-values.ts
2205
2406
  var tileflowWorldReleaseIdMinimumLength = 12;
2206
2407
  var tileflowWorldReleaseIdMaximumLength = 128;
@@ -4393,6 +4594,7 @@ function isPromiseLike(value) {
4393
4594
  return Boolean(value && typeof value.then === "function");
4394
4595
  }
4395
4596
  export {
4597
+ attachTileflowAtmosphere,
4396
4598
  attachTileflowFairUseNotice,
4397
4599
  attachTileflowMapLifecycle,
4398
4600
  createTileflowSessionStarter,
package/dist/build.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { T as TileflowCaptureScene } from './capture-scene-D6soWztE.js';
2
- import { T as TileflowRenderedIconIdentity, a as TileflowIconCompositionV1, R as ResolvedTileflowMap, b as TileflowDataRequirementsV1, c as TileflowSourceRequirementsV1, d as TileflowMap, e as TileflowStyleOptions, f as TileflowInspectedStyle, g as TileflowPreparedMapAssets } from './icon-composition-D7sBlZZh.js';
3
- export { h as TileflowDataCompatibilityIssue, i as TileflowDataFieldRequirement, j as TileflowDataFieldType, k as TileflowDataLayerRequirement, l as TileflowObservedDataContractV1, m as TileflowStyleInspection, n as TileflowStyleInspectionContribution, o as TileflowStyleInspectionLayer, p as TileflowStyleInspectionRenderOperation, q as collectMapLineage, r as inferTileflowDataRequirements, s as inferTileflowSourceRequirements, t as tileflowStyleInspectionSchemaVersion, v as validateTileflowDataCompatibility } from './icon-composition-D7sBlZZh.js';
4
- import { M as MapLibreStyle, T as TileflowRuntimeManifest } from './manifest-types-BdGjIYy-.js';
2
+ import { T as TileflowRenderedIconIdentity, a as TileflowIconCompositionV1, R as ResolvedTileflowMap, b as TileflowDataRequirementsV1, c as TileflowSourceRequirementsV1, d as TileflowMap, e as TileflowStyleOptions, f as TileflowInspectedStyle, g as TileflowPreparedMapAssets } from './icon-composition-BquPlPPI.js';
3
+ export { h as TileflowDataCompatibilityIssue, i as TileflowDataFieldRequirement, j as TileflowDataFieldType, k as TileflowDataLayerRequirement, l as TileflowObservedDataContractV1, m as TileflowStyleInspection, n as TileflowStyleInspectionContribution, o as TileflowStyleInspectionLayer, p as TileflowStyleInspectionRenderOperation, q as collectMapLineage, r as inferTileflowDataRequirements, s as inferTileflowSourceRequirements, t as tileflowStyleInspectionSchemaVersion, v as validateTileflowDataCompatibility } from './icon-composition-BquPlPPI.js';
4
+ import { M as MapLibreStyle, T as TileflowRuntimeManifest } from './manifest-types-BZU4zbmI.js';
5
5
  import { z } from 'zod';
6
6
 
7
7
  declare const tileflowMapRevisionSchemaVersion: 1;
@@ -258,9 +258,9 @@ declare const tileflowRendererDeploymentArtifactSchema: z.ZodObject<{
258
258
  iconIds: z.ZodArray<z.ZodString>;
259
259
  }, z.core.$strict>], "kind">>;
260
260
  winners: z.ZodArray<z.ZodObject<{
261
- id: z.ZodString;
262
261
  width: z.ZodNumber;
263
262
  height: z.ZodNumber;
263
+ id: z.ZodString;
264
264
  layout: z.ZodOptional<z.ZodObject<{
265
265
  stretchX: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>;
266
266
  stretchY: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>;
@@ -289,8 +289,8 @@ declare const tileflowRendererDeploymentArtifactSchema: z.ZodObject<{
289
289
  }, z.core.$strict>>;
290
290
  themes: z.ZodRecord<z.ZodString, z.ZodObject<{
291
291
  colorScheme: z.ZodEnum<{
292
- dark: "dark";
293
292
  light: "light";
293
+ dark: "dark";
294
294
  }>;
295
295
  dataRequirements: z.ZodRecord<z.ZodString, z.ZodUnknown>;
296
296
  sourceRequirements: z.ZodRecord<z.ZodString, z.ZodUnknown>;
@@ -450,9 +450,9 @@ declare const tileflowRendererDeploymentArtifactSchema: z.ZodObject<{
450
450
  iconIds: z.ZodArray<z.ZodString>;
451
451
  }, z.core.$strict>], "kind">>;
452
452
  winners: z.ZodArray<z.ZodObject<{
453
- id: z.ZodString;
454
453
  width: z.ZodNumber;
455
454
  height: z.ZodNumber;
455
+ id: z.ZodString;
456
456
  layout: z.ZodOptional<z.ZodObject<{
457
457
  stretchX: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>;
458
458
  stretchY: z.ZodOptional<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>;
@@ -481,8 +481,8 @@ declare const tileflowRendererDeploymentArtifactSchema: z.ZodObject<{
481
481
  }, z.core.$strict>>;
482
482
  themes: z.ZodRecord<z.ZodString, z.ZodObject<{
483
483
  colorScheme: z.ZodEnum<{
484
- dark: "dark";
485
484
  light: "light";
485
+ dark: "dark";
486
486
  }>;
487
487
  dataRequirements: z.ZodRecord<z.ZodString, z.ZodUnknown>;
488
488
  sourceRequirements: z.ZodRecord<z.ZodString, z.ZodUnknown>;