@palantir/pack.schema 0.7.0 → 0.8.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.
- package/.turbo/turbo-lint.log +5 -5
- package/.turbo/turbo-transpileBrowser.log +1 -1
- package/.turbo/turbo-transpileCjs.log +1 -1
- package/.turbo/turbo-transpileEsm.log +1 -1
- package/.turbo/turbo-transpileTypes.log +1 -1
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +7 -0
- package/build/browser/index.js +79 -29
- package/build/browser/index.js.map +1 -1
- package/build/cjs/index.cjs +79 -29
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/index.d.cts +23 -11
- package/build/esm/index.js +79 -29
- package/build/esm/index.js.map +1 -1
- package/build/types/defineMigration.d.ts +16 -10
- package/build/types/defineMigration.d.ts.map +1 -1
- package/build/types/defineSchemaUpdate.d.ts +6 -0
- package/build/types/defineSchemaUpdate.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/addFieldOptions.test.ts +27 -105
- package/src/defineMigration.ts +85 -33
- package/src/defineSchemaUpdate.ts +78 -23
package/.turbo/turbo-lint.log
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
> @palantir/pack.schema@0.
|
|
2
|
+
> @palantir/pack.schema@0.8.0 lint /home/runner/work/pack/pack/packages/schema
|
|
3
3
|
> eslint ./src && dprint check --config $(find-up dprint.json) --allow-no-files
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
/home/runner/work/pack/pack/packages/schema/src/defineMigration.ts
|
|
7
7
|
60:39 warning keyof TOld is overridden by string in this intersection type @typescript-eslint/no-redundant-type-constituents
|
|
8
|
-
120:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
120:28 warning keyof T is overridden by string in this intersection type @typescript-eslint/no-redundant-type-constituents
|
|
9
|
+
132:23 warning { [k in K]: Ref; } is overridden by S in this intersection type @typescript-eslint/no-redundant-type-constituents
|
|
10
|
+
148:23 warning Record<K, Ref> is overridden by S in this intersection type @typescript-eslint/no-redundant-type-constituents
|
|
11
|
+
236:28 warning keyof T is overridden by string in this intersection type @typescript-eslint/no-redundant-type-constituents
|
|
12
12
|
|
|
13
13
|
✖ 5 problems (0 errors, 5 warnings)
|
|
14
14
|
|
package/CHANGELOG.md
CHANGED
package/build/browser/index.js
CHANGED
|
@@ -158,16 +158,19 @@ var UnionBuilderImpl = class _UnionBuilderImpl {
|
|
|
158
158
|
}
|
|
159
159
|
};
|
|
160
160
|
var UPGRADE_OPTIONS_CARRIER = "__pack_upgrade_options__";
|
|
161
|
+
var DEPRECATED_FIELDS_CARRIER = "__pack_deprecated_fields__";
|
|
161
162
|
var RecordBuilderImpl = class _RecordBuilderImpl {
|
|
162
163
|
name;
|
|
163
164
|
fields;
|
|
164
165
|
upgradeOptions;
|
|
165
|
-
|
|
166
|
+
deprecatedFields;
|
|
167
|
+
constructor(initialRecordDef, upgradeOptions, deprecatedFields) {
|
|
166
168
|
this.name = initialRecordDef.name;
|
|
167
169
|
this.fields = {
|
|
168
170
|
...initialRecordDef.fields
|
|
169
171
|
};
|
|
170
172
|
this.upgradeOptions = new Map(upgradeOptions ?? []);
|
|
173
|
+
this.deprecatedFields = new Map(deprecatedFields ?? []);
|
|
171
174
|
}
|
|
172
175
|
// TODO: resolve field value from arg instead
|
|
173
176
|
addField(name, value, options) {
|
|
@@ -186,21 +189,21 @@ var RecordBuilderImpl = class _RecordBuilderImpl {
|
|
|
186
189
|
[name]: value
|
|
187
190
|
},
|
|
188
191
|
docs: ""
|
|
189
|
-
}, next);
|
|
192
|
+
}, next, this.deprecatedFields);
|
|
190
193
|
}
|
|
191
|
-
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
const next = new Map(this.upgradeOptions);
|
|
197
|
-
next.delete(name);
|
|
194
|
+
deprecateField(name, message) {
|
|
195
|
+
const next = new Map(this.deprecatedFields);
|
|
196
|
+
next.set(name, {
|
|
197
|
+
message
|
|
198
|
+
});
|
|
198
199
|
return new _RecordBuilderImpl({
|
|
199
200
|
type: ModelDefType.RECORD,
|
|
200
201
|
name: this.name,
|
|
201
|
-
fields:
|
|
202
|
+
fields: {
|
|
203
|
+
...this.fields
|
|
204
|
+
},
|
|
202
205
|
docs: ""
|
|
203
|
-
}, next);
|
|
206
|
+
}, this.upgradeOptions, next);
|
|
204
207
|
}
|
|
205
208
|
build() {
|
|
206
209
|
const result = {
|
|
@@ -217,6 +220,14 @@ var RecordBuilderImpl = class _RecordBuilderImpl {
|
|
|
217
220
|
writable: false
|
|
218
221
|
});
|
|
219
222
|
}
|
|
223
|
+
if (this.deprecatedFields.size > 0) {
|
|
224
|
+
Object.defineProperty(result, DEPRECATED_FIELDS_CARRIER, {
|
|
225
|
+
value: this.deprecatedFields,
|
|
226
|
+
enumerable: false,
|
|
227
|
+
configurable: true,
|
|
228
|
+
writable: false
|
|
229
|
+
});
|
|
230
|
+
}
|
|
220
231
|
return result;
|
|
221
232
|
}
|
|
222
233
|
};
|
|
@@ -239,25 +250,39 @@ function applyMigration(models, migration) {
|
|
|
239
250
|
...migration(builders)
|
|
240
251
|
};
|
|
241
252
|
const upgrades = {};
|
|
253
|
+
const deprecations = {};
|
|
242
254
|
for (const [modelKey, def] of Object.entries(merged)) {
|
|
243
255
|
if (!isRecordDef(def)) continue;
|
|
244
256
|
const carrier = def;
|
|
245
257
|
const opts = carrier[UPGRADE_OPTIONS_CARRIER];
|
|
246
|
-
if (opts
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
258
|
+
if (opts != null) {
|
|
259
|
+
delete carrier[UPGRADE_OPTIONS_CARRIER];
|
|
260
|
+
const fieldEntries = {};
|
|
261
|
+
for (const [fieldName, options] of opts) {
|
|
262
|
+
if ("derivedFrom" in options) {
|
|
263
|
+
fieldEntries[fieldName] = options;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (Object.keys(fieldEntries).length > 0) {
|
|
267
|
+
upgrades[modelKey] = fieldEntries;
|
|
252
268
|
}
|
|
253
269
|
}
|
|
254
|
-
|
|
255
|
-
|
|
270
|
+
const deprecated = carrier[DEPRECATED_FIELDS_CARRIER];
|
|
271
|
+
if (deprecated != null) {
|
|
272
|
+
delete carrier[DEPRECATED_FIELDS_CARRIER];
|
|
273
|
+
const fieldEntries = {};
|
|
274
|
+
for (const [fieldName, info] of deprecated) {
|
|
275
|
+
fieldEntries[fieldName] = info;
|
|
276
|
+
}
|
|
277
|
+
if (Object.keys(fieldEntries).length > 0) {
|
|
278
|
+
deprecations[modelKey] = fieldEntries;
|
|
279
|
+
}
|
|
256
280
|
}
|
|
257
281
|
}
|
|
258
282
|
return {
|
|
259
283
|
models: merged,
|
|
260
|
-
upgrades: Object.keys(upgrades).length > 0 ? upgrades : void 0
|
|
284
|
+
upgrades: Object.keys(upgrades).length > 0 ? upgrades : void 0,
|
|
285
|
+
deprecations: Object.keys(deprecations).length > 0 ? deprecations : void 0
|
|
261
286
|
};
|
|
262
287
|
}
|
|
263
288
|
function defineMigration(models, migration) {
|
|
@@ -297,7 +322,7 @@ function defineSchemaUpdate(name, migration) {
|
|
|
297
322
|
migration
|
|
298
323
|
};
|
|
299
324
|
}
|
|
300
|
-
function
|
|
325
|
+
function mergeByModelField(base, override) {
|
|
301
326
|
if (base == null) return override;
|
|
302
327
|
if (override == null) return base;
|
|
303
328
|
const result = {
|
|
@@ -316,7 +341,7 @@ function pruneMigrations(migrations, models) {
|
|
|
316
341
|
const result = {};
|
|
317
342
|
for (const [modelKey, fields] of Object.entries(migrations)) {
|
|
318
343
|
const def = models[modelKey];
|
|
319
|
-
if (def
|
|
344
|
+
if (!isRecordDef(def)) continue;
|
|
320
345
|
const recordFields = def.fields;
|
|
321
346
|
const kept = {};
|
|
322
347
|
for (const [fieldName, migration] of Object.entries(fields)) {
|
|
@@ -330,30 +355,50 @@ function pruneMigrations(migrations, models) {
|
|
|
330
355
|
}
|
|
331
356
|
return Object.keys(result).length > 0 ? result : void 0;
|
|
332
357
|
}
|
|
358
|
+
function stampDeprecationVersions(deprecations, version) {
|
|
359
|
+
if (deprecations == null) return void 0;
|
|
360
|
+
const result = {};
|
|
361
|
+
for (const [modelKey, fields] of Object.entries(deprecations)) {
|
|
362
|
+
const out = {};
|
|
363
|
+
for (const [fieldName, info] of Object.entries(fields)) {
|
|
364
|
+
out[fieldName] = {
|
|
365
|
+
fromVersion: version,
|
|
366
|
+
...info
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
result[modelKey] = out;
|
|
370
|
+
}
|
|
371
|
+
return result;
|
|
372
|
+
}
|
|
333
373
|
var SchemaVersionBuilderImpl = class _SchemaVersionBuilderImpl {
|
|
334
374
|
models;
|
|
335
375
|
version;
|
|
336
376
|
previous;
|
|
337
377
|
_migrations;
|
|
338
|
-
|
|
378
|
+
_deprecations;
|
|
379
|
+
constructor(models, version, previous, migrations, deprecations) {
|
|
339
380
|
this.models = models;
|
|
340
381
|
this.version = version;
|
|
341
382
|
this.previous = previous;
|
|
342
383
|
this._migrations = migrations;
|
|
384
|
+
this._deprecations = deprecations;
|
|
343
385
|
}
|
|
344
386
|
addSchemaUpdate(update) {
|
|
345
387
|
const {
|
|
346
388
|
models,
|
|
347
|
-
upgrades
|
|
389
|
+
upgrades,
|
|
390
|
+
deprecations
|
|
348
391
|
} = applyMigration(this.models, update.migration);
|
|
349
|
-
const merged =
|
|
392
|
+
const merged = mergeByModelField(this._migrations, upgrades);
|
|
350
393
|
const pruned = pruneMigrations(merged, models);
|
|
351
|
-
|
|
394
|
+
const thisVersionDeprecations = stampDeprecationVersions(deprecations, this.version);
|
|
395
|
+
const mergedDeprecations = mergeByModelField(this._deprecations, thisVersionDeprecations);
|
|
396
|
+
return new _SchemaVersionBuilderImpl(models, this.version, this.previous, pruned, mergedDeprecations);
|
|
352
397
|
}
|
|
353
398
|
withMigrations(migrations) {
|
|
354
|
-
const merged =
|
|
399
|
+
const merged = mergeByModelField(this._migrations, migrations);
|
|
355
400
|
const pruned = pruneMigrations(merged, this.models);
|
|
356
|
-
return new _SchemaVersionBuilderImpl(this.models, this.version, this.previous, pruned);
|
|
401
|
+
return new _SchemaVersionBuilderImpl(this.models, this.version, this.previous, pruned, this._deprecations);
|
|
357
402
|
}
|
|
358
403
|
build() {
|
|
359
404
|
return {
|
|
@@ -365,12 +410,17 @@ var SchemaVersionBuilderImpl = class _SchemaVersionBuilderImpl {
|
|
|
365
410
|
previous: this.previous,
|
|
366
411
|
...this._migrations != null ? {
|
|
367
412
|
migrations: this._migrations
|
|
413
|
+
} : {},
|
|
414
|
+
...this._deprecations != null ? {
|
|
415
|
+
deprecations: this._deprecations
|
|
368
416
|
} : {}
|
|
369
417
|
};
|
|
370
418
|
}
|
|
371
419
|
};
|
|
372
420
|
function nextSchema(previous) {
|
|
373
|
-
|
|
421
|
+
const version = previous.version + 1;
|
|
422
|
+
const deprecations = "deprecations" in previous ? previous.deprecations : void 0;
|
|
423
|
+
return new SchemaVersionBuilderImpl(previous.models, version, previous, void 0, deprecations);
|
|
374
424
|
}
|
|
375
425
|
|
|
376
426
|
export { Array2 as Array, Boolean, Double, ModelDefType, Optional, String, TypeKind, Unknown, applyMigration, createRef, defineMigration, defineRecord, defineSchema, defineSchemaUpdate, defineUnion, isRecordDef, isUnionDef, modelToRef, nextSchema, resolveUnionVariantArg };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/defs.ts","../../src/primitives.ts","../../src/utils.ts","../../src/defineUnion.ts","../../src/defineMigration.ts","../../src/defineRecord.ts","../../src/defineSchemaUpdate.ts"],"names":["Array"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const ModelDefType = {\n RECORD: \"record\",\n UNION: \"union\"\n};","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const TypeKind = {\n ARRAY: \"array\",\n BOOLEAN: \"boolean\",\n DOC_REF: \"docRef\",\n DOUBLE: \"double\",\n MEDIA_REF: \"mediaRef\",\n OBJECT_REF: \"objectRef\",\n OPTIONAL: \"optional\",\n REF: \"ref\",\n STRING: \"string\",\n UNKNOWN: \"unknown\",\n USER_REF: \"userRef\"\n};\n\n// Forward declaration to avoid circular reference\n\n// A reference to a record or a union type\n\nexport const String = {\n type: TypeKind.STRING\n};\nexport const Double = {\n type: TypeKind.DOUBLE\n};\nexport const Boolean = {\n type: TypeKind.BOOLEAN\n};\nexport const Unknown = {\n type: TypeKind.UNKNOWN\n};\nfunction unwrapOneOptional(t) {\n return t.type === TypeKind.OPTIONAL && \"item\" in t ? t.item : t;\n}\nexport const Array = item => {\n if (unwrapOneOptional(item).type === TypeKind.ARRAY) {\n throw new Error(\"Nested arrays (Array(Array(...)) or Array(Optional(Array(...)))) are not supported. \" + \"Wrap the inner array in a record instead.\");\n }\n return {\n type: TypeKind.ARRAY,\n items: item\n };\n};\nexport const Optional = item => {\n if (item.type === TypeKind.OPTIONAL) {\n throw new Error(\"Nested optionals (Optional(Optional(...))) are not supported.\");\n }\n return {\n type: TypeKind.OPTIONAL,\n item\n };\n};","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ModelDefType } from \"./defs.js\";\nimport { TypeKind } from \"./primitives.js\";\n\n/**\n * Helper function to safely transform a record definition to a reference.\n * This function helps TypeScript track type transformations better.\n */\nexport function modelToRef(model) {\n return createRef(model.name, model.type);\n}\n\n/**\n * Helper function to create a reference with proper typing.\n * This avoids type assertions in multiple places.\n */\nexport function createRef(name, refType) {\n return {\n type: TypeKind.REF,\n name,\n refType\n };\n}\n\n/**\n * Type guard to check if a value is a RecordDef\n */\nexport function isRecordDef(value) {\n return value != null && typeof value === \"object\" && \"type\" in value && value.type === ModelDefType.RECORD && \"fields\" in value;\n}\n\n/**\n * Type guard to check if a value is a UnionDef\n */\nexport function isUnionDef(value) {\n return value != null && typeof value === \"object\" && \"type\" in value && value.type === ModelDefType.UNION && \"variants\" in value;\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ModelDefType } from \"./defs.js\";\nimport { TypeKind } from \"./primitives.js\";\nimport { modelToRef } from \"./utils.js\";\nexport function defineUnion(name, {\n discriminant = \"type\",\n docs,\n variants\n}) {\n const entries = Object.entries(variants).map(([key, value]) => [key, resolveUnionVariantArg(value)]);\n const resolvedVariants = Object.fromEntries(entries);\n return {\n type: ModelDefType.UNION,\n discriminant,\n name,\n docs,\n variants: resolvedVariants\n };\n}\nexport function resolveUnionVariantArg(arg) {\n const resolved = typeof arg === \"function\" ? arg() : arg;\n return resolved.type === TypeKind.REF ? resolved : modelToRef(resolved);\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolveUnionVariantArg } from \"./defineUnion.js\";\nimport { ModelDefType } from \"./defs.js\";\nimport { isRecordDef, isUnionDef } from \"./utils.js\";\n\n/** Soon to be deprecated - Use `ModelDefs` instead. */\n\n/** Soon to be deprecated - use `ModelDefs` instead. */\n\n/**\n * Recursive literal-JSON type. Constrains schema-time `default` values to\n * data that JSON-serializes losslessly — no `Date`, `RegExp`, functions, class\n * instances, or `undefined`. Mirrors the `JsonValue` exported by\n * `@palantir/pack.document-schema.model-types`; kept local here to avoid a\n * package dependency from `pack.schema`.\n */\n\n/**\n * Upgrade options for a field whose value is derived from prior-version fields.\n * Supplied as the third argument to `addField`; surfaced by `applyMigration`\n * as part of `MigrationResult.upgrades`. Declares the structural dependency\n * (`derivedFrom`) and an optional literal JSON `default` used when no source\n * data exists. The runtime forward function is supplied separately via the\n * generated `DocumentModel(...)` factory's `UpgradeFns` parameter.\n */\n\n/**\n * Options for a purely additive field. `default` is literal JSON only;\n * validated at `addField()` call time.\n */\n\n/**\n * Recursively assert `value` is representable as literal JSON. Rejects `Date`,\n * `RegExp`, functions, class instances, symbol-keyed properties, `undefined`\n * (anywhere — top-level or nested), `symbol`, and `bigint`. Throws on the\n * first offending value, naming the path for debuggability.\n */\nfunction assertJsonDefault(value, path) {\n // eslint-disable-next-line eqeqeq -- need to distinguish null (valid JSON) from undefined (not).\n if (value === null) return;\n const t = typeof value;\n if (t === \"undefined\") {\n throw new Error(`Invalid JSON default at ${path}: undefined is not valid JSON`);\n }\n if (t === \"string\" || t === \"number\" || t === \"boolean\") return;\n if (t === \"function\" || t === \"symbol\" || t === \"bigint\") {\n throw new Error(`Invalid JSON default at ${path}: ${t} is not valid JSON`);\n }\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n assertJsonDefault(value[i], `${path}[${i}]`);\n }\n return;\n }\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto != null) {\n const ctorName = value.constructor?.name ?? \"non-plain object\";\n throw new Error(`Invalid JSON default at ${path}: ${ctorName} is not valid JSON`);\n }\n if (Object.getOwnPropertySymbols(value).length > 0) {\n throw new Error(`Invalid JSON default at ${path}: symbol-keyed properties are not valid JSON`);\n }\n for (const [k, v] of Object.entries(value)) {\n assertJsonDefault(v, `${path}.${k}`);\n }\n}\nclass UnionBuilderImpl {\n name;\n docs;\n variants;\n constructor({\n name,\n docs,\n variants\n }) {\n this.name = name;\n this.docs = docs;\n this.variants = {\n ...variants\n };\n }\n addVariant(variantName, modelDefOrRef) {\n const ref = resolveUnionVariantArg(modelDefOrRef);\n const newVariants = {\n ...this.variants,\n [variantName]: ref\n };\n return new UnionBuilderImpl({\n type: ModelDefType.UNION,\n name: this.name,\n variants: newVariants,\n discriminant: \"type\"\n });\n }\n build() {\n return {\n type: ModelDefType.UNION,\n variants: this.variants,\n discriminant: \"type\",\n name: this.name\n };\n }\n}\n\n/**\n * Non-enumerable carrier property attached to a `RecordDef` by\n * `RecordBuilderImpl.build()` when the builder has collected one or more\n * `FieldOptions`. `applyMigration` reads this and then deletes the property,\n * so the `RecordDef` it returns is structurally clean (no extra keys, no\n * symbol-keyed metadata).\n */\nconst UPGRADE_OPTIONS_CARRIER = \"__pack_upgrade_options__\";\nclass RecordBuilderImpl {\n name;\n fields;\n upgradeOptions;\n constructor(initialRecordDef, upgradeOptions) {\n this.name = initialRecordDef.name;\n this.fields = {\n ...initialRecordDef.fields\n };\n // Upgrade options only flow forward within a single migration callback —\n // they are NOT inherited from the prior version's RecordDef, because each\n // version's upgrades describe a specific version transition.\n this.upgradeOptions = new Map(upgradeOptions ?? []);\n }\n\n // TODO: resolve field value from arg instead\n addField(name, value, options) {\n if (options != null && \"default\" in options && options.default !== undefined) {\n assertJsonDefault(options.default, `addField(\"${name}\").default`);\n }\n const next = new Map(this.upgradeOptions);\n if (options != null) {\n next.set(name, options);\n }\n return new RecordBuilderImpl({\n type: ModelDefType.RECORD,\n name: this.name,\n fields: {\n ...this.fields,\n [name]: value\n },\n docs: \"\"\n }, next);\n }\n removeField(name) {\n const {\n [name]: _removed,\n ...rest\n } = this.fields;\n const next = new Map(this.upgradeOptions);\n next.delete(name);\n return new RecordBuilderImpl({\n type: ModelDefType.RECORD,\n name: this.name,\n fields: rest,\n docs: \"\"\n }, next);\n }\n build() {\n const result = {\n type: ModelDefType.RECORD,\n name: this.name,\n fields: this.fields,\n docs: \"\"\n };\n if (this.upgradeOptions.size > 0) {\n Object.defineProperty(result, UPGRADE_OPTIONS_CARRIER, {\n value: this.upgradeOptions,\n enumerable: false,\n configurable: true,\n writable: false\n });\n }\n return result;\n }\n}\nfunction makeBuilders(models) {\n const builders = {};\n for (const key in models) {\n const v = models[key];\n if (isRecordDef(v)) {\n builders[key] = new RecordBuilderImpl(v);\n } else if (isUnionDef(v)) {\n builders[key] = new UnionBuilderImpl(v);\n }\n }\n return builders;\n}\n\n/** Per-model field migrations: `[modelKey][fieldName]` → upgrade options. */\n\n/**\n * Lower-level entry point that returns both the merged models AND any\n * `UpgradeFieldOptions` collected via `addField(name, type, options)` during\n * the migration callback. Used by `addSchemaUpdate` to fold sugar-form\n * upgrades into a `VersionedSchema`'s migrations map.\n *\n * Each `RecordBuilderImpl.build()` attaches its collected options to the\n * produced `RecordDef` via a non-enumerable carrier property; this function\n * walks the merged result, extracts the options keyed by the user's chosen\n * output key (so renames are handled), and strips the carrier so the returned\n * `RecordDef`s are structurally clean.\n */\nexport function applyMigration(models, migration) {\n const builders = makeBuilders(models);\n const merged = {\n ...models,\n ...migration(builders)\n };\n const upgrades = {};\n for (const [modelKey, def] of Object.entries(merged)) {\n if (!isRecordDef(def)) continue;\n const carrier = def;\n const opts = carrier[UPGRADE_OPTIONS_CARRIER];\n if (opts == null) continue;\n // Strip the carrier so the returned RecordDef is structurally clean.\n delete carrier[UPGRADE_OPTIONS_CARRIER];\n const fieldEntries = {};\n for (const [fieldName, options] of opts) {\n // Only `UpgradeFieldOptions` (which declare `derivedFrom`) flow into the\n // upgrades map; `AdditiveFieldOptions` carry only a literal `default`\n // and have no read-time lens effect.\n if (\"derivedFrom\" in options) {\n fieldEntries[fieldName] = options;\n }\n }\n if (Object.keys(fieldEntries).length > 0) {\n upgrades[modelKey] = fieldEntries;\n }\n }\n return {\n models: merged,\n upgrades: Object.keys(upgrades).length > 0 ? upgrades : undefined\n };\n}\nexport function defineMigration(models, migration) {\n return applyMigration(models, migration).models;\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ModelDefType } from \"./defs.js\";\nimport { isRecordDef, isUnionDef, modelToRef } from \"./utils.js\";\n/**\n * Helper function to resolve a field value, handling functions and transforming\n * types as needed.\n */\nfunction resolveFieldArg(value) {\n // Handle function values\n const resolved = typeof value === \"function\" ? value() : value;\n if (isRecordDef(resolved) || isUnionDef(resolved)) {\n return modelToRef(resolved);\n }\n\n // For primitive types and other Types\n return resolved;\n}\nexport function defineRecord(name, record) {\n const entries = Object.entries(record.fields).map(([key, value]) => [key, resolveFieldArg(value)]);\n const fields = Object.fromEntries(entries);\n return {\n type: ModelDefType.RECORD,\n name: name,\n docs: record.docs,\n fields\n };\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { applyMigration } from \"./defineMigration.js\";\nexport function defineSchema(models) {\n return {\n type: \"initial\",\n version: 1,\n models\n };\n}\nexport function defineSchemaUpdate(name, migration) {\n return {\n name,\n migration\n };\n}\n/**\n * Merge two `VersionMigrations` records. Per-model field migrations from\n * `override` take precedence over `base` for the same field, but the maps are\n * combined at both the model and field level so explicit `withMigrations`\n * calls can supplement (not just replace) the sugar from `addField` options.\n */\nfunction mergeMigrations(base, override) {\n if (base == null) return override;\n if (override == null) return base;\n const result = {\n ...base\n };\n for (const [modelKey, fields] of Object.entries(override)) {\n result[modelKey] = {\n ...result[modelKey],\n ...fields\n };\n }\n return result;\n}\n\n/**\n * Drop migration entries that no longer correspond to a field on a record in\n * `models`. Required because `mergeMigrations` is monotonic — a later\n * `addSchemaUpdate` that removes or retypes a field would otherwise leave a\n * stale entry in the accumulator. Entries are dropped when:\n * - the model key is no longer present,\n * - the model is no longer a record (e.g. replaced by a union), or\n * - the field name is no longer one of the record's fields.\n */\nfunction pruneMigrations(migrations, models) {\n if (migrations == null) return undefined;\n const result = {};\n for (const [modelKey, fields] of Object.entries(migrations)) {\n const def = models[modelKey];\n if (def == null || def.type !== \"record\") continue;\n const recordFields = def.fields;\n const kept = {};\n for (const [fieldName, migration] of Object.entries(fields)) {\n if (fieldName in recordFields) {\n kept[fieldName] = migration;\n }\n }\n if (Object.keys(kept).length > 0) {\n result[modelKey] = kept;\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\nclass SchemaVersionBuilderImpl {\n models;\n version;\n previous;\n _migrations;\n constructor(models, version, previous, migrations) {\n this.models = models;\n this.version = version;\n this.previous = previous;\n this._migrations = migrations;\n }\n addSchemaUpdate(update) {\n // applyMigration returns both the merged models and any sugar-form\n // upgrades collected via `addField(name, type, { derivedFrom, forward })`.\n const {\n models,\n upgrades\n } = applyMigration(this.models, update.migration);\n const merged = mergeMigrations(this._migrations, upgrades);\n // Reconcile against the new models: a later update that removes or\n // retypes a field must drop the prior step's stale migration entry.\n const pruned = pruneMigrations(merged, models);\n return new SchemaVersionBuilderImpl(models, this.version, this.previous, pruned);\n }\n withMigrations(migrations) {\n const merged = mergeMigrations(this._migrations, migrations);\n const pruned = pruneMigrations(merged, this.models);\n return new SchemaVersionBuilderImpl(this.models, this.version, this.previous, pruned);\n }\n build() {\n return {\n type: \"versioned\",\n models: {\n ...this.models\n },\n version: this.version,\n previous: this.previous,\n ...(this._migrations != null ? {\n migrations: this._migrations\n } : {})\n };\n }\n}\nexport function nextSchema(previous) {\n return new SchemaVersionBuilderImpl(previous.models, previous.version + 1, previous);\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/defs.ts","../../src/primitives.ts","../../src/utils.ts","../../src/defineUnion.ts","../../src/defineMigration.ts","../../src/defineRecord.ts","../../src/defineSchemaUpdate.ts"],"names":["Array"],"mappings":"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","file":"index.js","sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const ModelDefType = {\n RECORD: \"record\",\n UNION: \"union\"\n};","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const TypeKind = {\n ARRAY: \"array\",\n BOOLEAN: \"boolean\",\n DOC_REF: \"docRef\",\n DOUBLE: \"double\",\n MEDIA_REF: \"mediaRef\",\n OBJECT_REF: \"objectRef\",\n OPTIONAL: \"optional\",\n REF: \"ref\",\n STRING: \"string\",\n UNKNOWN: \"unknown\",\n USER_REF: \"userRef\"\n};\n\n// Forward declaration to avoid circular reference\n\n// A reference to a record or a union type\n\nexport const String = {\n type: TypeKind.STRING\n};\nexport const Double = {\n type: TypeKind.DOUBLE\n};\nexport const Boolean = {\n type: TypeKind.BOOLEAN\n};\nexport const Unknown = {\n type: TypeKind.UNKNOWN\n};\nfunction unwrapOneOptional(t) {\n return t.type === TypeKind.OPTIONAL && \"item\" in t ? t.item : t;\n}\nexport const Array = item => {\n if (unwrapOneOptional(item).type === TypeKind.ARRAY) {\n throw new Error(\"Nested arrays (Array(Array(...)) or Array(Optional(Array(...)))) are not supported. \" + \"Wrap the inner array in a record instead.\");\n }\n return {\n type: TypeKind.ARRAY,\n items: item\n };\n};\nexport const Optional = item => {\n if (item.type === TypeKind.OPTIONAL) {\n throw new Error(\"Nested optionals (Optional(Optional(...))) are not supported.\");\n }\n return {\n type: TypeKind.OPTIONAL,\n item\n };\n};","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ModelDefType } from \"./defs.js\";\nimport { TypeKind } from \"./primitives.js\";\n\n/**\n * Helper function to safely transform a record definition to a reference.\n * This function helps TypeScript track type transformations better.\n */\nexport function modelToRef(model) {\n return createRef(model.name, model.type);\n}\n\n/**\n * Helper function to create a reference with proper typing.\n * This avoids type assertions in multiple places.\n */\nexport function createRef(name, refType) {\n return {\n type: TypeKind.REF,\n name,\n refType\n };\n}\n\n/**\n * Type guard to check if a value is a RecordDef\n */\nexport function isRecordDef(value) {\n return value != null && typeof value === \"object\" && \"type\" in value && value.type === ModelDefType.RECORD && \"fields\" in value;\n}\n\n/**\n * Type guard to check if a value is a UnionDef\n */\nexport function isUnionDef(value) {\n return value != null && typeof value === \"object\" && \"type\" in value && value.type === ModelDefType.UNION && \"variants\" in value;\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ModelDefType } from \"./defs.js\";\nimport { TypeKind } from \"./primitives.js\";\nimport { modelToRef } from \"./utils.js\";\nexport function defineUnion(name, {\n discriminant = \"type\",\n docs,\n variants\n}) {\n const entries = Object.entries(variants).map(([key, value]) => [key, resolveUnionVariantArg(value)]);\n const resolvedVariants = Object.fromEntries(entries);\n return {\n type: ModelDefType.UNION,\n discriminant,\n name,\n docs,\n variants: resolvedVariants\n };\n}\nexport function resolveUnionVariantArg(arg) {\n const resolved = typeof arg === \"function\" ? arg() : arg;\n return resolved.type === TypeKind.REF ? resolved : modelToRef(resolved);\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { resolveUnionVariantArg } from \"./defineUnion.js\";\nimport { ModelDefType } from \"./defs.js\";\nimport { isRecordDef, isUnionDef } from \"./utils.js\";\n\n/** Soon to be deprecated - Use `ModelDefs` instead. */\n\n/** Soon to be deprecated - use `ModelDefs` instead. */\n\n/**\n * Recursive literal-JSON type. Constrains schema-time `default` values to\n * data that JSON-serializes losslessly — no `Date`, `RegExp`, functions, class\n * instances, or `undefined`. Mirrors the `JsonValue` exported by\n * `@palantir/pack.document-schema.model-types`; kept local here to avoid a\n * package dependency from `pack.schema`.\n */\n\n/**\n * Upgrade options for a field whose value is derived from prior-version fields.\n * Supplied as the third argument to `addField`; surfaced by `applyMigration`\n * as part of `MigrationResult.upgrades`. Declares the structural dependency\n * (`derivedFrom`) and an optional literal JSON `default` used when no source\n * data exists. The runtime forward function is supplied separately via the\n * generated `DocumentModel(...)` factory's `UpgradeFns` parameter.\n */\n\n/**\n * Options for a purely additive field. `default` is literal JSON only;\n * validated at `addField()` call time.\n */\n\n/**\n * Recursively assert `value` is representable as literal JSON. Rejects `Date`,\n * `RegExp`, functions, class instances, symbol-keyed properties, `undefined`\n * (anywhere — top-level or nested), `symbol`, and `bigint`. Throws on the\n * first offending value, naming the path for debuggability.\n */\nfunction assertJsonDefault(value, path) {\n // eslint-disable-next-line eqeqeq -- need to distinguish null (valid JSON) from undefined (not).\n if (value === null) return;\n const t = typeof value;\n if (t === \"undefined\") {\n throw new Error(`Invalid JSON default at ${path}: undefined is not valid JSON`);\n }\n if (t === \"string\" || t === \"number\" || t === \"boolean\") return;\n if (t === \"function\" || t === \"symbol\" || t === \"bigint\") {\n throw new Error(`Invalid JSON default at ${path}: ${t} is not valid JSON`);\n }\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n assertJsonDefault(value[i], `${path}[${i}]`);\n }\n return;\n }\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto != null) {\n const ctorName = value.constructor?.name ?? \"non-plain object\";\n throw new Error(`Invalid JSON default at ${path}: ${ctorName} is not valid JSON`);\n }\n if (Object.getOwnPropertySymbols(value).length > 0) {\n throw new Error(`Invalid JSON default at ${path}: symbol-keyed properties are not valid JSON`);\n }\n for (const [k, v] of Object.entries(value)) {\n assertJsonDefault(v, `${path}.${k}`);\n }\n}\nclass UnionBuilderImpl {\n name;\n docs;\n variants;\n constructor({\n name,\n docs,\n variants\n }) {\n this.name = name;\n this.docs = docs;\n this.variants = {\n ...variants\n };\n }\n addVariant(variantName, modelDefOrRef) {\n const ref = resolveUnionVariantArg(modelDefOrRef);\n const newVariants = {\n ...this.variants,\n [variantName]: ref\n };\n return new UnionBuilderImpl({\n type: ModelDefType.UNION,\n name: this.name,\n variants: newVariants,\n discriminant: \"type\"\n });\n }\n build() {\n return {\n type: ModelDefType.UNION,\n variants: this.variants,\n discriminant: \"type\",\n name: this.name\n };\n }\n}\n\n/**\n * Non-enumerable carrier property attached to a `RecordDef` by\n * `RecordBuilderImpl.build()` when the builder has collected one or more\n * `FieldOptions`. `applyMigration` reads this and then deletes the property,\n * so the `RecordDef` it returns is structurally clean (no extra keys, no\n * symbol-keyed metadata).\n */\nconst UPGRADE_OPTIONS_CARRIER = \"__pack_upgrade_options__\";\n\n/**\n * Non-enumerable carrier property attached to a `RecordDef` by\n * `RecordBuilderImpl.build()` when the builder has collected one or more\n * `deprecateField` calls. `applyMigration` reads this and then deletes the\n * property, so the returned `RecordDef` is structurally clean. Maps field name\n * → its deprecation info.\n */\nconst DEPRECATED_FIELDS_CARRIER = \"__pack_deprecated_fields__\";\nclass RecordBuilderImpl {\n name;\n fields;\n upgradeOptions;\n deprecatedFields;\n constructor(initialRecordDef, upgradeOptions, deprecatedFields) {\n this.name = initialRecordDef.name;\n this.fields = {\n ...initialRecordDef.fields\n };\n // Upgrade options only flow forward within a single migration callback —\n // they are NOT inherited from the prior version's RecordDef, because each\n // version's upgrades describe a specific version transition.\n this.upgradeOptions = new Map(upgradeOptions ?? []);\n this.deprecatedFields = new Map(deprecatedFields ?? []);\n }\n\n // TODO: resolve field value from arg instead\n addField(name, value, options) {\n if (options != null && \"default\" in options && options.default !== undefined) {\n assertJsonDefault(options.default, `addField(\"${name}\").default`);\n }\n const next = new Map(this.upgradeOptions);\n if (options != null) {\n next.set(name, options);\n }\n return new RecordBuilderImpl({\n type: ModelDefType.RECORD,\n name: this.name,\n fields: {\n ...this.fields,\n [name]: value\n },\n docs: \"\"\n }, next, this.deprecatedFields);\n }\n deprecateField(name, message) {\n const next = new Map(this.deprecatedFields);\n next.set(name, {\n message\n });\n return new RecordBuilderImpl({\n type: ModelDefType.RECORD,\n name: this.name,\n fields: {\n ...this.fields\n },\n docs: \"\"\n }, this.upgradeOptions, next);\n }\n build() {\n const result = {\n type: ModelDefType.RECORD,\n name: this.name,\n fields: this.fields,\n docs: \"\"\n };\n if (this.upgradeOptions.size > 0) {\n Object.defineProperty(result, UPGRADE_OPTIONS_CARRIER, {\n value: this.upgradeOptions,\n enumerable: false,\n configurable: true,\n writable: false\n });\n }\n if (this.deprecatedFields.size > 0) {\n Object.defineProperty(result, DEPRECATED_FIELDS_CARRIER, {\n value: this.deprecatedFields,\n enumerable: false,\n configurable: true,\n writable: false\n });\n }\n return result;\n }\n}\nfunction makeBuilders(models) {\n const builders = {};\n for (const key in models) {\n const v = models[key];\n if (isRecordDef(v)) {\n builders[key] = new RecordBuilderImpl(v);\n } else if (isUnionDef(v)) {\n builders[key] = new UnionBuilderImpl(v);\n }\n }\n return builders;\n}\n\n/** Per-model field migrations: `[modelKey][fieldName]` → upgrade options. */\n\n/**\n * Lower-level entry point that returns the merged models plus the per-field\n * metadata collected during the migration callback: `UpgradeFieldOptions` from\n * `addField(name, type, options)` and deprecations from `deprecateField(name)`.\n * Used by `addSchemaUpdate` to fold sugar-form upgrades into a\n * `VersionedSchema`'s migrations map and deprecations into its deprecations map.\n *\n * Each `RecordBuilderImpl.build()` attaches its collected upgrade options and\n * deprecations to the produced `RecordDef` via two non-enumerable carrier\n * properties; this function walks the merged result, extracts both keyed by the\n * user's chosen output key (so renames are handled), and strips the carriers so\n * the returned `RecordDef`s are structurally clean.\n */\nexport function applyMigration(models, migration) {\n const builders = makeBuilders(models);\n const merged = {\n ...models,\n ...migration(builders)\n };\n const upgrades = {};\n const deprecations = {};\n for (const [modelKey, def] of Object.entries(merged)) {\n if (!isRecordDef(def)) continue;\n const carrier = def;\n const opts = carrier[UPGRADE_OPTIONS_CARRIER];\n if (opts != null) {\n // Strip the carrier so the returned RecordDef is structurally clean.\n delete carrier[UPGRADE_OPTIONS_CARRIER];\n const fieldEntries = {};\n for (const [fieldName, options] of opts) {\n // Only `UpgradeFieldOptions` (which declare `derivedFrom`) flow into the\n // upgrades map; `AdditiveFieldOptions` carry only a literal `default`\n // and have no read-time lens effect.\n if (\"derivedFrom\" in options) {\n fieldEntries[fieldName] = options;\n }\n }\n if (Object.keys(fieldEntries).length > 0) {\n upgrades[modelKey] = fieldEntries;\n }\n }\n const deprecated = carrier[DEPRECATED_FIELDS_CARRIER];\n if (deprecated != null) {\n // Strip the carrier so the returned RecordDef is structurally clean.\n delete carrier[DEPRECATED_FIELDS_CARRIER];\n const fieldEntries = {};\n for (const [fieldName, info] of deprecated) {\n fieldEntries[fieldName] = info;\n }\n if (Object.keys(fieldEntries).length > 0) {\n deprecations[modelKey] = fieldEntries;\n }\n }\n }\n return {\n models: merged,\n upgrades: Object.keys(upgrades).length > 0 ? upgrades : undefined,\n deprecations: Object.keys(deprecations).length > 0 ? deprecations : undefined\n };\n}\nexport function defineMigration(models, migration) {\n return applyMigration(models, migration).models;\n}","/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ModelDefType } from \"./defs.js\";\nimport { isRecordDef, isUnionDef, modelToRef } from \"./utils.js\";\n/**\n * Helper function to resolve a field value, handling functions and transforming\n * types as needed.\n */\nfunction resolveFieldArg(value) {\n // Handle function values\n const resolved = typeof value === \"function\" ? value() : value;\n if (isRecordDef(resolved) || isUnionDef(resolved)) {\n return modelToRef(resolved);\n }\n\n // For primitive types and other Types\n return resolved;\n}\nexport function defineRecord(name, record) {\n const entries = Object.entries(record.fields).map(([key, value]) => [key, resolveFieldArg(value)]);\n const fields = Object.fromEntries(entries);\n return {\n type: ModelDefType.RECORD,\n name: name,\n docs: record.docs,\n fields\n };\n}","/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { applyMigration } from \"./defineMigration.js\";\nimport { isRecordDef } from \"./utils.js\";\nexport function defineSchema(models) {\n return {\n type: \"initial\",\n version: 1,\n models\n };\n}\nexport function defineSchemaUpdate(name, migration) {\n return {\n name,\n migration\n };\n}\n/**\n * Shallow-merge two `[modelKey][fieldName]` maps; `override` wins per field.\n * Used for both migrations (so `withMigrations` supplements `addField` sugar)\n * and deprecations (so each version's deprecations accumulate forward). The\n * maps are combined at both the model and field level.\n */\nfunction mergeByModelField(base, override) {\n if (base == null) return override;\n if (override == null) return base;\n const result = {\n ...base\n };\n for (const [modelKey, fields] of Object.entries(override)) {\n result[modelKey] = {\n ...result[modelKey],\n ...fields\n };\n }\n return result;\n}\n\n/**\n * Drop migration entries that no longer correspond to a field on a record in\n * `models`. Required because `mergeByModelField` is monotonic — a later\n * `addSchemaUpdate` that removes or retypes a field would otherwise leave a\n * stale entry in the accumulator. Entries are dropped when:\n * - the model key is no longer present,\n * - the model is no longer a record (e.g. replaced by a union), or\n * - the field name is no longer one of the record's fields.\n */\nfunction pruneMigrations(migrations, models) {\n if (migrations == null) return undefined;\n const result = {};\n for (const [modelKey, fields] of Object.entries(migrations)) {\n const def = models[modelKey];\n if (!isRecordDef(def)) continue;\n const recordFields = def.fields;\n const kept = {};\n for (const [fieldName, migration] of Object.entries(fields)) {\n if (fieldName in recordFields) {\n kept[fieldName] = migration;\n }\n }\n if (Object.keys(kept).length > 0) {\n result[modelKey] = kept;\n }\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Convert the version-agnostic `FieldDeprecations` collected by `applyMigration`\n * (just `{ message? }`) into `VersionDeprecations` by stamping `fromVersion`.\n */\nfunction stampDeprecationVersions(deprecations, version) {\n if (deprecations == null) return undefined;\n const result = {};\n for (const [modelKey, fields] of Object.entries(deprecations)) {\n const out = {};\n for (const [fieldName, info] of Object.entries(fields)) {\n out[fieldName] = {\n fromVersion: version,\n ...info\n };\n }\n result[modelKey] = out;\n }\n return result;\n}\nclass SchemaVersionBuilderImpl {\n models;\n version;\n previous;\n _migrations;\n _deprecations;\n constructor(models, version, previous, migrations, deprecations) {\n this.models = models;\n this.version = version;\n this.previous = previous;\n this._migrations = migrations;\n this._deprecations = deprecations;\n }\n addSchemaUpdate(update) {\n // applyMigration returns the merged models, any sugar-form upgrades from\n // `addField(name, type, { derivedFrom })`, and any `deprecateField` calls.\n const {\n models,\n upgrades,\n deprecations\n } = applyMigration(this.models, update.migration);\n const merged = mergeByModelField(this._migrations, upgrades);\n // Reconcile against the new models: a later update that retypes a field\n // must drop the prior step's stale migration entry.\n const pruned = pruneMigrations(merged, models);\n // Attach this version to each freshly-deprecated field, then merge forward.\n const thisVersionDeprecations = stampDeprecationVersions(deprecations, this.version);\n const mergedDeprecations = mergeByModelField(this._deprecations, thisVersionDeprecations);\n return new SchemaVersionBuilderImpl(models, this.version, this.previous, pruned, mergedDeprecations);\n }\n withMigrations(migrations) {\n const merged = mergeByModelField(this._migrations, migrations);\n const pruned = pruneMigrations(merged, this.models);\n return new SchemaVersionBuilderImpl(this.models, this.version, this.previous, pruned, this._deprecations);\n }\n build() {\n return {\n type: \"versioned\",\n models: {\n ...this.models\n },\n version: this.version,\n previous: this.previous,\n ...(this._migrations != null ? {\n migrations: this._migrations\n } : {}),\n ...(this._deprecations != null ? {\n deprecations: this._deprecations\n } : {})\n };\n }\n}\nexport function nextSchema(previous) {\n const version = previous.version + 1;\n const deprecations = \"deprecations\" in previous ? previous.deprecations : undefined;\n return new SchemaVersionBuilderImpl(previous.models, version, previous, undefined, deprecations);\n}"]}
|