@gscdump/lakehouse 5.2.0 → 5.6.0

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.
@@ -108,6 +108,12 @@ export declare function connectIcebergCatalog(config: IcebergCatalogConfig, opts
108
108
  * exact keys readers populate — see {@link invalidateSnapshotRef}.
109
109
  */
110
110
  export declare function catalogCacheScope(config: Pick<IcebergCatalogConfig, 'catalogUri' | 'warehouse'>): string;
111
+ /** An existing namespace cannot prove this caller created or owns its contents. */
112
+ export declare function createIcebergNamespace(conn: IcebergConnection): Promise<{
113
+ _tag: 'Created';
114
+ } | {
115
+ _tag: 'Exists';
116
+ }>;
111
117
  /**
112
118
  * Ensure the catalog namespace exists. Idempotent — an "already exists"
113
119
  * response from the REST catalog is swallowed.
package/dist/catalog.mjs CHANGED
@@ -163,6 +163,12 @@ function isNamespaceAlreadyExistsError(err) {
163
163
  const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
164
164
  return msg.includes("already exists") || msg.includes("409") || msg.includes("conflict");
165
165
  }
166
+ async function createIcebergNamespace(conn) {
167
+ return restCatalogCreateNamespace(conn.catalog, { namespace: conn.namespace }).then(() => ({ _tag: "Created" })).catch((error) => {
168
+ if (error && typeof error === "object" && "status" in error && error.status === 409) return { _tag: "Exists" };
169
+ throw error;
170
+ });
171
+ }
166
172
  async function ensureIcebergNamespace(conn) {
167
173
  await restCatalogCreateNamespace(conn.catalog, { namespace: conn.namespace }).catch((err) => {
168
174
  if (!isNamespaceAlreadyExistsError(err)) throw err;
@@ -459,6 +465,144 @@ async function loadSnapshotIdUnshared(conn, namespace, table, cache, now) {
459
465
  metadata
460
466
  };
461
467
  }
468
+ async function resolveIcebergAppendFiles(conn, table, appendId, matches) {
469
+ return (await createIcebergAppendFileResolver(conn, table))(appendId, matches);
470
+ }
471
+ async function createIcebergAppendFileResolver(conn, table, dateColumn) {
472
+ const { metadata, metadataLocation } = await restCatalogLoadTable(conn.catalog, {
473
+ namespace: conn.namespace,
474
+ table
475
+ });
476
+ const dateFieldId = dateColumnFieldId(metadata, dateColumn);
477
+ const manifestCache = {
478
+ lists: /* @__PURE__ */ new Map(),
479
+ entries: /* @__PURE__ */ new Map()
480
+ };
481
+ const immutableBytes = /* @__PURE__ */ new Map();
482
+ const maxRetainedBytes = 4194304;
483
+ const budgetFailure = { _tag: "ManifestBudgetExceeded" };
484
+ let retainedBytes = 0;
485
+ let unavailable = false;
486
+ const resolver = {
487
+ ...conn.resolver,
488
+ reader: async (url) => {
489
+ let bytes = immutableBytes.get(url);
490
+ if (!bytes) {
491
+ bytes = Promise.resolve(conn.resolver.reader(url)).then(async (buffer) => {
492
+ if (!Number.isSafeInteger(buffer.byteLength) || buffer.byteLength < 0 || retainedBytes + buffer.byteLength > maxRetainedBytes) {
493
+ unavailable = true;
494
+ throw budgetFailure;
495
+ }
496
+ retainedBytes += buffer.byteLength;
497
+ const content = await buffer.slice(0, buffer.byteLength);
498
+ if (content.byteLength !== buffer.byteLength) {
499
+ unavailable = true;
500
+ throw budgetFailure;
501
+ }
502
+ return content;
503
+ });
504
+ immutableBytes.set(url, bytes);
505
+ }
506
+ const buffer = await bytes;
507
+ return {
508
+ byteLength: buffer.byteLength,
509
+ slice: async (start, end) => buffer.slice(start, end)
510
+ };
511
+ }
512
+ };
513
+ const budgetUnavailable = (error) => {
514
+ if (error !== budgetFailure) throw error;
515
+ return [];
516
+ };
517
+ const current = metadata["current-snapshot-id"] == null ? [] : await icebergManifests({
518
+ metadata,
519
+ resolver,
520
+ manifestCache
521
+ }).catch(budgetUnavailable);
522
+ const currentFiles = /* @__PURE__ */ new Map();
523
+ for (const manifest of current) for (const entry of manifest.entries) if (entry.status !== 2 && entry.data_file.content === 0) currentFiles.set(entry.data_file.file_path, entry.data_file);
524
+ const resolve = async (appendId, matches) => {
525
+ if (unavailable) return {
526
+ _tag: "Err",
527
+ reason: "append-unavailable"
528
+ };
529
+ const snapshots = metadata.snapshots?.filter((snapshot) => snapshot.summary?.[APPEND_ID_SUMMARY_KEY] === appendId) ?? [];
530
+ if (!appendId || snapshots.length !== 1) return {
531
+ _tag: "Err",
532
+ reason: "append-unavailable"
533
+ };
534
+ if (snapshots[0].summary?.operation !== "append") return {
535
+ _tag: "Err",
536
+ reason: "append-unavailable"
537
+ };
538
+ const snapshotId = snapshots[0]["snapshot-id"];
539
+ const manifests = await icebergManifests({
540
+ metadata,
541
+ resolver,
542
+ snapshotId,
543
+ manifestCache
544
+ }).catch(budgetUnavailable);
545
+ if (unavailable) return {
546
+ _tag: "Err",
547
+ reason: "append-unavailable"
548
+ };
549
+ const files = [];
550
+ for (const manifest of manifests) for (const entry of manifest.entries) {
551
+ if (entry.status === 2 || entry.data_file.content !== 0) return {
552
+ _tag: "Err",
553
+ reason: "append-unavailable"
554
+ };
555
+ if (entry.status !== 1 || entry.snapshot_id == null || String(entry.snapshot_id) !== String(snapshotId)) continue;
556
+ const file = toListedFile(entry, matches, void 0, /* @__PURE__ */ new Set(), null);
557
+ if (file) {
558
+ const member = currentFiles.get(file.filePath);
559
+ if (!member || Number(member.record_count) !== file.rowCount || Number(member.file_size_in_bytes) !== file.bytes) return {
560
+ _tag: "Err",
561
+ reason: "append-unavailable"
562
+ };
563
+ files.push(file);
564
+ }
565
+ }
566
+ if (files.length === 0) return {
567
+ _tag: "Err",
568
+ reason: "append-unavailable"
569
+ };
570
+ return {
571
+ _tag: "Ok",
572
+ snapshotId: String(snapshotId),
573
+ files
574
+ };
575
+ };
576
+ return Object.assign(resolve, {
577
+ confirmCurrent: async () => {
578
+ if (unavailable) return false;
579
+ const fresh = await restCatalogLoadTable(conn.catalog, {
580
+ namespace: conn.namespace,
581
+ table
582
+ });
583
+ return fresh.metadataLocation === metadataLocation && fresh.metadata["table-uuid"] === metadata["table-uuid"] && String(fresh.metadata["current-snapshot-id"]) === String(metadata["current-snapshot-id"]);
584
+ },
585
+ currentFiles: (matches) => {
586
+ if (unavailable) return {
587
+ _tag: "Err",
588
+ reason: "append-unavailable"
589
+ };
590
+ const files = [];
591
+ for (const manifest of current) for (const entry of manifest.entries) {
592
+ if (entry.status !== 2 && entry.data_file.content !== 0) return {
593
+ _tag: "Err",
594
+ reason: "append-unavailable"
595
+ };
596
+ const file = toListedFile(entry, matches, void 0, /* @__PURE__ */ new Set(), dateFieldId);
597
+ if (file) files.push(file);
598
+ }
599
+ return {
600
+ _tag: "Ok",
601
+ files
602
+ };
603
+ }
604
+ });
605
+ }
462
606
  function toListedFile(entry, matches, monthFieldName, wantedMonths, dateFieldId) {
463
607
  if (entry.status === 2) return null;
464
608
  const df = entry.data_file;
@@ -639,4 +783,4 @@ async function resolveIcebergDataFilesInBatch(conn, opts) {
639
783
  }
640
784
  return out;
641
785
  }
642
- export { catalogCacheScope, connectIcebergCatalog, dropIcebergTables, ensureIcebergNamespace, icebergAppendBatchesRetrying, icebergAppendRetrying, invalidateSnapshotRef, isCommitRateLimited, isCommitServerError, isCommitTransient, listIcebergTables, resolveIcebergDataFiles };
786
+ export { catalogCacheScope, connectIcebergCatalog, createIcebergAppendFileResolver, createIcebergNamespace, dropIcebergTables, ensureIcebergNamespace, icebergAppendBatchesRetrying, icebergAppendRetrying, invalidateSnapshotRef, isCommitRateLimited, isCommitServerError, isCommitTransient, listIcebergTables, resolveIcebergAppendFiles, resolveIcebergDataFiles };
@@ -1,5 +1,23 @@
1
- import { connectIcebergCatalog, ensureIcebergNamespace, icebergAppendBatchesRetrying, icebergAppendRetrying, resolveIcebergDataFiles } from "./catalog.mjs";
1
+ import { restCatalogLoadTable } from "./_virtual/node_modules/.pnpm/icebird@0.8.30_patch_hash=a400e343a199b1ca18601f96348011745ac6518fc07ffa71d5adfdd2ccc7d14f/node_modules/icebird/src/catalog/rest.mjs";
2
+ import { connectIcebergCatalog, createIcebergAppendFileResolver, ensureIcebergNamespace, icebergAppendBatchesRetrying, icebergAppendRetrying, resolveIcebergAppendFiles, resolveIcebergDataFiles } from "./catalog.mjs";
2
3
  import { icebergCreateTable } from "./_virtual/node_modules/.pnpm/icebird@0.8.30_patch_hash=a400e343a199b1ca18601f96348011745ac6518fc07ffa71d5adfdd2ccc7d14f/node_modules/icebird/src/write/write.mjs";
4
+ async function verifyDatasetTable(conn, table, schema, partitionSpec) {
5
+ const { metadata } = await restCatalogLoadTable(conn.catalog, {
6
+ namespace: conn.namespace,
7
+ table
8
+ });
9
+ const currentSchema = metadata.schemas?.find((s) => s["schema-id"] === metadata["current-schema-id"]);
10
+ if (!currentSchema || currentSchema.fields.length !== schema.fields.length || !schema.fields.every((expected) => currentSchema.fields.some((actual) => actual.id === expected.id && actual.name === expected.name && actual.type === expected.type && actual.required === expected.required))) return {
11
+ _tag: "Err",
12
+ reason: "schema-mismatch"
13
+ };
14
+ const currentSpec = metadata["partition-specs"]?.find((s) => s["spec-id"] === metadata["default-spec-id"]);
15
+ if (!currentSpec || currentSpec.fields.length !== partitionSpec.fields.length || !partitionSpec.fields.every((expected) => currentSpec.fields.some((actual) => actual["source-id"] === expected["source-id"] && actual["field-id"] === expected["field-id"] && actual.name === expected.name && actual.transform === expected.transform))) return {
16
+ _tag: "Err",
17
+ reason: "partition-mismatch"
18
+ };
19
+ return { _tag: "Ok" };
20
+ }
3
21
  async function createDatasetTable(conn, table, schema, partitionSpec, sortOrder) {
4
22
  const results = [];
5
23
  await icebergCreateTable({
@@ -65,4 +83,4 @@ async function connectDatasetCatalog(config, opts) {
65
83
  async function resolveDatasetDataFiles(conn, opts) {
66
84
  return resolveIcebergDataFiles(conn, opts);
67
85
  }
68
- export { appendDatasetBatches, appendDatasetRows, connectDatasetCatalog, createDatasetTable, resolveDatasetDataFiles };
86
+ export { appendDatasetBatches, appendDatasetRows, connectDatasetCatalog, createIcebergAppendFileResolver as createDatasetAppendFileResolver, createDatasetTable, resolveIcebergAppendFiles as resolveDatasetAppendFiles, resolveDatasetDataFiles, verifyDatasetTable };
@@ -105,6 +105,13 @@ export interface IcebergDataset {
105
105
  icebergPartitionSpec: () => IcebergPartitionSpec;
106
106
  icebergSortOrder: () => IcebergSortOrder | undefined;
107
107
  createTable: (conn: IcebergConnection) => Promise<IcebergTableOpResult[]>;
108
+ /** Inspect current metadata without caches before admitting a provisioned table. */
109
+ verifyTable: (conn: IcebergConnection) => Promise<{
110
+ _tag: 'Ok';
111
+ } | {
112
+ _tag: 'Err';
113
+ reason: 'schema-mismatch' | 'partition-mismatch';
114
+ }>;
108
115
  /**
109
116
  * One-shot append over an EXISTING connection: identity INT32 guard, dedupe
110
117
  * by identity+dims+naturalKey (last-wins), cluster pre-sort (if
@@ -120,6 +127,26 @@ export interface IcebergDataset {
120
127
  * across source batches.
121
128
  */
122
129
  appendBatches: (conn: IcebergConnection, source: AppendBatchSource, opts: AppendBatchesOptions) => Promise<AppendBatchesResult>;
130
+ /** Fresh, exact snapshot membership. Missing evidence never falls back to current files. */
131
+ resolveAppendFiles: (conn: IcebergConnection, appendId: string, identity: string | number, dims?: Record<string, string>) => Promise<{
132
+ _tag: 'Ok';
133
+ snapshotId: string;
134
+ files: IcebergListedDataFile[];
135
+ } | {
136
+ _tag: 'Err';
137
+ reason: 'append-unavailable';
138
+ }>;
139
+ /** Create once per request. The next request must create a fresh resolver. */
140
+ createAppendFileResolver: (conn: IcebergConnection) => Promise<((appendId: string, identity: string | number, dims?: Record<string, string>) => ReturnType<IcebergDataset['resolveAppendFiles']>) & {
141
+ currentFiles: (identity: string | number, dims?: Record<string, string>) => {
142
+ _tag: 'Ok';
143
+ files: IcebergListedDataFile[];
144
+ } | {
145
+ _tag: 'Err';
146
+ reason: 'append-unavailable';
147
+ };
148
+ confirmCurrent: () => Promise<boolean>;
149
+ }>;
123
150
  /**
124
151
  * PURE row processing — the identity INT32 guard, dedupe (identity+dims+
125
152
  * naturalKey, last-wins) and cluster pre-sort `appendRows`/`appendSink`
package/dist/dataset.mjs CHANGED
@@ -180,6 +180,10 @@ function defineIcebergDataset(def) {
180
180
  const { createDatasetTable } = await import("./dataset-runtime.mjs");
181
181
  return createDatasetTable(conn, def.table, schema, partitionSpecIcebird, sortOrder);
182
182
  }
183
+ async function verifyTable(conn) {
184
+ const { verifyDatasetTable } = await import("./dataset-runtime.mjs");
185
+ return verifyDatasetTable(conn, def.table, schema, partitionSpecIcebird);
186
+ }
183
187
  function process(rows) {
184
188
  const guarded = [];
185
189
  let skipped = 0;
@@ -280,6 +284,20 @@ function defineIcebergDataset(def) {
280
284
  function partitionBoundFilter(identity, months, dims) {
281
285
  return buildManifestPartitionFilter(def.partition, readerPredicate(identity, dims), months);
282
286
  }
287
+ async function resolveAppendFiles(conn, appendId, identity, dims) {
288
+ const { resolveDatasetAppendFiles } = await import("./dataset-runtime.mjs");
289
+ return resolveDatasetAppendFiles(conn, def.table, appendId, readerPredicate(identity, dims));
290
+ }
291
+ async function createAppendFileResolver(conn) {
292
+ const { createDatasetAppendFileResolver } = await import("./dataset-runtime.mjs");
293
+ const dates = def.columns.filter((column) => column.type === "DATE");
294
+ const dateColumn = def.partition.find((field) => field.transform === "month")?.sourceColumn ?? (dates.length === 1 ? dates[0]?.name : void 0);
295
+ const resolve = await createDatasetAppendFileResolver(conn, def.table, dateColumn);
296
+ return Object.assign((appendId, identity, dims) => resolve(appendId, readerPredicate(identity, dims)), {
297
+ currentFiles: (identity, dims) => resolve.currentFiles(readerPredicate(identity, dims)),
298
+ confirmCurrent: resolve.confirmCurrent
299
+ });
300
+ }
283
301
  async function resolveDataFiles(conn, identity, range, dims, opts = {}) {
284
302
  const { resolveDatasetDataFiles } = await import("./dataset-runtime.mjs");
285
303
  return resolveDatasetDataFiles(conn, {
@@ -300,8 +318,11 @@ function defineIcebergDataset(def) {
300
318
  icebergPartitionSpec: () => partitionSpecIcebird,
301
319
  icebergSortOrder: () => sortOrder,
302
320
  createTable,
321
+ verifyTable,
303
322
  appendRows,
304
323
  appendBatches,
324
+ resolveAppendFiles,
325
+ createAppendFileResolver,
305
326
  prepareRows: process,
306
327
  appendSink,
307
328
  readerPredicate,
package/dist/index.d.mts CHANGED
@@ -2,7 +2,7 @@ import { bigintJsonReplacer, coerceBigIntToNumber, encodeJsonBigintSafe, stringi
2
2
  import { CatalogCache, CatalogCacheGetOutcome, cacheGet, cachePut } from "./catalog-cache.mjs";
3
3
  import { DEFAULT_PARTITION_KEY_ENCODING, ICEBERG_TYPE_MAP, IcebergColumn, IcebergColumnType, IcebergPartitionField, IcebergPartitionTransform, IcebergPrimitiveType, IcebergS3Config, IcebergTableSpec, PartitionKeyEncoding } from "./schema.mjs";
4
4
  import { IcebergFieldSummary, ManifestPartitionFilter, PartitionValueMatch, buildManifestPartitionFilter } from "./partition-prune.mjs";
5
- import { CommitRetryOptions, ConnectIcebergOptions, IcebergCatalogConfig, IcebergConnection, IcebergDataFileDateBounds, IcebergListedDataFile, IcebergPartitionSpec, IcebergPartitionSpecField, IcebergSchema, IcebergSchemaField, IcebergSortOrder, IcebergSortOrderField, IcebergTableOpResult, QueryProfiler, ResolveIcebergDataFilesOptions, catalogCacheScope, connectIcebergCatalog, dropIcebergTables, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles } from "./catalog.mjs";
5
+ import { CommitRetryOptions, ConnectIcebergOptions, IcebergCatalogConfig, IcebergConnection, IcebergDataFileDateBounds, IcebergListedDataFile, IcebergPartitionSpec, IcebergPartitionSpecField, IcebergSchema, IcebergSchemaField, IcebergSortOrder, IcebergSortOrderField, IcebergTableOpResult, QueryProfiler, ResolveIcebergDataFilesOptions, catalogCacheScope, connectIcebergCatalog, createIcebergNamespace, dropIcebergTables, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles } from "./catalog.mjs";
6
6
  import { AppendBatchSource, AppendBatchesOptions, AppendBatchesResult, AppendCommitOptions, AppendResult, AppendSink, AppendSinkCloseResult, AppendSinkOptions, DatasetDim, DatasetIdentity, IcebergDataset, IcebergDatasetColumnDef, IcebergDatasetDef, IcebergDatasetLedger, ResolveDataFilesOptions, defineIcebergDataset, deriveTableSpec } from "./dataset.mjs";
7
7
  import { toIcebergDayCount } from "./date.mjs";
8
- export { type AppendBatchSource, type AppendBatchesOptions, type AppendBatchesResult, type AppendCommitOptions, type AppendResult, type AppendSink, type AppendSinkCloseResult, type AppendSinkOptions, type CatalogCache, type CatalogCacheGetOutcome, type CommitRetryOptions, type ConnectIcebergOptions, DEFAULT_PARTITION_KEY_ENCODING, type DatasetDim, type DatasetIdentity, ICEBERG_TYPE_MAP, type IcebergCatalogConfig, type IcebergColumn, type IcebergColumnType, type IcebergConnection, type IcebergDataFileDateBounds, type IcebergDataset, type IcebergDatasetColumnDef, type IcebergDatasetDef, type IcebergDatasetLedger, type IcebergFieldSummary, type IcebergListedDataFile, type IcebergPartitionField, type IcebergPartitionSpec, type IcebergPartitionSpecField, type IcebergPartitionTransform, type IcebergPrimitiveType, type IcebergS3Config, type IcebergSchema, type IcebergSchemaField, type IcebergSortOrder, type IcebergSortOrderField, type IcebergTableOpResult, type IcebergTableSpec, type ManifestPartitionFilter, type PartitionKeyEncoding, type PartitionValueMatch, type QueryProfiler, type ResolveDataFilesOptions, type ResolveIcebergDataFilesOptions, bigintJsonReplacer, buildManifestPartitionFilter, cacheGet, cachePut, catalogCacheScope, coerceBigIntToNumber, connectIcebergCatalog, defineIcebergDataset, deriveTableSpec, dropIcebergTables, encodeJsonBigintSafe, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles, stringifyBigintSafe, toIcebergDayCount };
8
+ export { type AppendBatchSource, type AppendBatchesOptions, type AppendBatchesResult, type AppendCommitOptions, type AppendResult, type AppendSink, type AppendSinkCloseResult, type AppendSinkOptions, type CatalogCache, type CatalogCacheGetOutcome, type CommitRetryOptions, type ConnectIcebergOptions, DEFAULT_PARTITION_KEY_ENCODING, type DatasetDim, type DatasetIdentity, ICEBERG_TYPE_MAP, type IcebergCatalogConfig, type IcebergColumn, type IcebergColumnType, type IcebergConnection, type IcebergDataFileDateBounds, type IcebergDataset, type IcebergDatasetColumnDef, type IcebergDatasetDef, type IcebergDatasetLedger, type IcebergFieldSummary, type IcebergListedDataFile, type IcebergPartitionField, type IcebergPartitionSpec, type IcebergPartitionSpecField, type IcebergPartitionTransform, type IcebergPrimitiveType, type IcebergS3Config, type IcebergSchema, type IcebergSchemaField, type IcebergSortOrder, type IcebergSortOrderField, type IcebergTableOpResult, type IcebergTableSpec, type ManifestPartitionFilter, type PartitionKeyEncoding, type PartitionValueMatch, type QueryProfiler, type ResolveDataFilesOptions, type ResolveIcebergDataFilesOptions, bigintJsonReplacer, buildManifestPartitionFilter, cacheGet, cachePut, catalogCacheScope, coerceBigIntToNumber, connectIcebergCatalog, createIcebergNamespace, defineIcebergDataset, deriveTableSpec, dropIcebergTables, encodeJsonBigintSafe, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles, stringifyBigintSafe, toIcebergDayCount };
package/dist/index.mjs CHANGED
@@ -2,7 +2,7 @@ import { bigintJsonReplacer, coerceBigIntToNumber, encodeJsonBigintSafe, stringi
2
2
  import { cacheGet, cachePut } from "./catalog-cache.mjs";
3
3
  import { toIcebergDayCount } from "./date.mjs";
4
4
  import { buildManifestPartitionFilter } from "./partition-prune.mjs";
5
- import { catalogCacheScope, connectIcebergCatalog, dropIcebergTables, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles } from "./catalog.mjs";
5
+ import { catalogCacheScope, connectIcebergCatalog, createIcebergNamespace, dropIcebergTables, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles } from "./catalog.mjs";
6
6
  import { DEFAULT_PARTITION_KEY_ENCODING, ICEBERG_TYPE_MAP } from "./schema.mjs";
7
7
  import { defineIcebergDataset, deriveTableSpec } from "./dataset.mjs";
8
- export { DEFAULT_PARTITION_KEY_ENCODING, ICEBERG_TYPE_MAP, bigintJsonReplacer, buildManifestPartitionFilter, cacheGet, cachePut, catalogCacheScope, coerceBigIntToNumber, connectIcebergCatalog, defineIcebergDataset, deriveTableSpec, dropIcebergTables, encodeJsonBigintSafe, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles, stringifyBigintSafe, toIcebergDayCount };
8
+ export { DEFAULT_PARTITION_KEY_ENCODING, ICEBERG_TYPE_MAP, bigintJsonReplacer, buildManifestPartitionFilter, cacheGet, cachePut, catalogCacheScope, coerceBigIntToNumber, connectIcebergCatalog, createIcebergNamespace, defineIcebergDataset, deriveTableSpec, dropIcebergTables, encodeJsonBigintSafe, ensureIcebergNamespace, invalidateSnapshotRef, listIcebergTables, resolveIcebergDataFiles, stringifyBigintSafe, toIcebergDayCount };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gscdump/lakehouse",
3
3
  "type": "module",
4
- "version": "5.2.0",
4
+ "version": "5.6.0",
5
5
  "description": "Dataset-agnostic Iceberg lakehouse layer + dataset registry for R2 Data Catalog producers (ADR-0021).",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",