@xylabs/object 4.14.6 → 4.15.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/dist/neutral/JsonObject.d.ts +10 -1
- package/dist/neutral/JsonObject.d.ts.map +1 -1
- package/dist/neutral/OmitStartsWith.d.ts +4 -0
- package/dist/neutral/OmitStartsWith.d.ts.map +1 -1
- package/dist/neutral/index.d.ts +1 -1
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +77 -17
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/toSafeJson.d.ts +7 -0
- package/dist/neutral/toSafeJson.d.ts.map +1 -0
- package/package.json +5 -5
- package/src/JsonObject.ts +70 -3
- package/src/OmitStartsWith.ts +12 -0
- package/src/index.ts +1 -1
- package/src/toSafeJson.ts +50 -0
- package/dist/neutral/toJson.d.ts +0 -7
- package/dist/neutral/toJson.d.ts.map +0 -1
- package/src/toJson.ts +0 -50
|
@@ -1,10 +1,19 @@
|
|
|
1
|
+
import type { EmptyObject } from './EmptyObject.ts';
|
|
2
|
+
import type { DeepRestrictToStringKeys } from './OmitStartsWith.ts';
|
|
3
|
+
export type JsonFieldPair = [key: string, value: JsonValue];
|
|
1
4
|
export type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
|
|
2
5
|
export type JsonObject = {
|
|
3
6
|
[key: string]: JsonValue;
|
|
4
7
|
};
|
|
8
|
+
export type JsonTypedObject<T extends EmptyObject = EmptyObject> = DeepRestrictToStringKeys<T>;
|
|
5
9
|
export type JsonArray = JsonValue[];
|
|
6
10
|
export declare const isJsonValue: (value: unknown) => value is JsonValue;
|
|
7
11
|
export declare const isJsonArray: (value: unknown) => value is JsonArray;
|
|
8
|
-
export declare const
|
|
12
|
+
export declare const asJsonArray: (value: unknown) => JsonArray;
|
|
13
|
+
export declare const isValidJsonFieldPair: (value: unknown) => value is JsonFieldPair;
|
|
9
14
|
export declare const isJsonObject: (value: unknown) => value is JsonObject;
|
|
15
|
+
export declare const toJsonObject: (value: unknown) => JsonObject;
|
|
16
|
+
export declare const toJsonValue: (value: unknown) => JsonValue;
|
|
17
|
+
export declare const toJsonArray: (value: unknown) => JsonArray;
|
|
18
|
+
export declare const toValidJsonFieldPair: (pair: [key: unknown, value: unknown]) => JsonFieldPair;
|
|
10
19
|
//# sourceMappingURL=JsonObject.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonObject.d.ts","sourceRoot":"","sources":["../../src/JsonObject.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAAA;AACjF,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AACrD,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAA;AAEnC,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAWrD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAErD,CAAA;AAED,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"JsonObject.d.ts","sourceRoot":"","sources":["../../src/JsonObject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAEnE,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;AAC3D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAAA;AACjF,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AACrD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,wBAAwB,CAAC,CAAC,CAAC,CAAA;AAC9F,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAA;AAEnC,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAWrD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAErD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,SAM5C,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,aAM9D,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,UAMtD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,UAe7C,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,SAS5C,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,SAK5C,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAG,aAa3E,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JsonValue } from './index.ts';
|
|
1
2
|
export type OmitStartsWith<T, Prefix extends string> = {
|
|
2
3
|
[K in keyof T as K extends `${Prefix}${string}` ? never : K]: T[K];
|
|
3
4
|
};
|
|
@@ -7,4 +8,7 @@ export type DeepOmitStartsWith<T, Prefix extends string> = T extends (infer U)[]
|
|
|
7
8
|
export type DeepRestrictToStringKeys<T> = {
|
|
8
9
|
[K in keyof T as K extends string ? K : never]: T[K] extends (infer U)[] ? DeepRestrictToStringKeys<U>[] : T[K] extends object ? DeepRestrictToStringKeys<T[K]> : T[K];
|
|
9
10
|
};
|
|
11
|
+
export type DeepRestrictToJson<T> = {
|
|
12
|
+
[K in keyof T as K extends string ? K : never]: T[K] extends (infer U)[] ? DeepRestrictToJson<U>[] : T[K] extends object ? DeepRestrictToJson<T[K]> : T[K] extends JsonValue ? T[K] : never;
|
|
13
|
+
};
|
|
10
14
|
//# sourceMappingURL=OmitStartsWith.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OmitStartsWith.d.ts","sourceRoot":"","sources":["../../src/OmitStartsWith.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI;KACpD,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACnE,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAC5E,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,GAC/B,CAAC,SAAS,MAAM,GACd;KACG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAC7B,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,GAC5B,KAAK,GACL,CAAC,GACH,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;CACzC,GACD,CAAC,CAAA;AAEP,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI;KACvC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACpE,wBAAwB,CAAC,CAAC,CAAC,EAAE,GAC7B,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GACjB,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC9B,CAAC,CAAC,CAAC,CAAC;CACX,CAAA"}
|
|
1
|
+
{"version":3,"file":"OmitStartsWith.d.ts","sourceRoot":"","sources":["../../src/OmitStartsWith.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI;KACpD,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACnE,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAC5E,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,GAC/B,CAAC,SAAS,MAAM,GACd;KACG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAC7B,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE,GAC5B,KAAK,GACL,CAAC,GACH,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;CACzC,GACD,CAAC,CAAA;AAEP,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI;KACvC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACpE,wBAAwB,CAAC,CAAC,CAAC,EAAE,GAC7B,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GACjB,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC9B,CAAC,CAAC,CAAC,CAAC;CACX,CAAA;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI;KACjC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACpE,kBAAkB,CAAC,CAAC,CAAC,EAAE,GACvB,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GACjB,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACxB,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,GACpB,CAAC,CAAC,CAAC,CAAC,GACJ,KAAK;CACd,CAAA"}
|
package/dist/neutral/index.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export * from './pickBy.ts';
|
|
|
17
17
|
export * from './PickStartsWith.ts';
|
|
18
18
|
export * from './removeFields.ts';
|
|
19
19
|
export * from './StringKeyObject.ts';
|
|
20
|
-
export * from './
|
|
20
|
+
export * from './toSafeJson.ts';
|
|
21
21
|
export * from './Validator.ts';
|
|
22
22
|
export * from './WithAdditional.ts';
|
|
23
23
|
export * from '@xylabs/object-model';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -138,7 +138,7 @@ var IsObjectFactory = class {
|
|
|
138
138
|
};
|
|
139
139
|
|
|
140
140
|
// src/JsonObject.ts
|
|
141
|
-
import { isObject as isObject3 } from "@xylabs/typeof";
|
|
141
|
+
import { isObject as isObject3, isString } from "@xylabs/typeof";
|
|
142
142
|
var isJsonValue = (value) => {
|
|
143
143
|
switch (typeof value) {
|
|
144
144
|
case "string":
|
|
@@ -154,12 +154,67 @@ var isJsonValue = (value) => {
|
|
|
154
154
|
var isJsonArray = (value) => {
|
|
155
155
|
return Array.isArray(value) && !value.some((item) => !isJsonValue(item));
|
|
156
156
|
};
|
|
157
|
-
var
|
|
158
|
-
|
|
157
|
+
var asJsonArray = (value) => {
|
|
158
|
+
if (Array.isArray(value)) {
|
|
159
|
+
return value.filter(isJsonValue);
|
|
160
|
+
} else {
|
|
161
|
+
throw new TypeError(`Expected an array, got ${typeof value}`);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
var isValidJsonFieldPair = (value) => {
|
|
165
|
+
if (!Array.isArray(value) || value.length !== 2) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
const [key, val] = value;
|
|
169
|
+
return isString(key) && isJsonValue(val);
|
|
159
170
|
};
|
|
160
171
|
var isJsonObject = (value) => {
|
|
161
172
|
return isObject3(value) && !Object.entries(value).some((item) => !isValidJsonFieldPair(item));
|
|
162
173
|
};
|
|
174
|
+
var toJsonObject = (value) => {
|
|
175
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
176
|
+
throw new TypeError(`Expected an object, got ${typeof value}`);
|
|
177
|
+
}
|
|
178
|
+
if (isJsonObject(value)) {
|
|
179
|
+
return value;
|
|
180
|
+
}
|
|
181
|
+
const result = {};
|
|
182
|
+
for (const [k, v] of Object.entries(value)) {
|
|
183
|
+
if (v !== void 0) {
|
|
184
|
+
const [key, jsonValue] = toValidJsonFieldPair([k, v]);
|
|
185
|
+
result[key] = jsonValue;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
};
|
|
190
|
+
var toJsonValue = (value) => {
|
|
191
|
+
if (isObject3(value)) {
|
|
192
|
+
return toJsonObject(value);
|
|
193
|
+
} else if (Array.isArray(value)) {
|
|
194
|
+
return toJsonArray(value);
|
|
195
|
+
} else if (isJsonValue(value)) {
|
|
196
|
+
return value;
|
|
197
|
+
}
|
|
198
|
+
throw new TypeError(`Unable to coerce ${typeof value} to a JSON value`);
|
|
199
|
+
};
|
|
200
|
+
var toJsonArray = (value) => {
|
|
201
|
+
if (Array.isArray(value)) {
|
|
202
|
+
return value.map((item) => toJsonValue(item));
|
|
203
|
+
}
|
|
204
|
+
throw new TypeError(`Unable to coerce ${typeof value} to a JSON array`);
|
|
205
|
+
};
|
|
206
|
+
var toValidJsonFieldPair = (pair) => {
|
|
207
|
+
const [key, value] = pair;
|
|
208
|
+
if (!isString(key)) {
|
|
209
|
+
throw new TypeError(`Expected a string key, got ${typeof key}`);
|
|
210
|
+
}
|
|
211
|
+
if (isJsonValue(value)) {
|
|
212
|
+
return [key, value];
|
|
213
|
+
} else if (isObject3(value)) {
|
|
214
|
+
return [key, toJsonObject(value)];
|
|
215
|
+
}
|
|
216
|
+
throw new TypeError(`Expected a valid JSON value, got ${typeof value}`);
|
|
217
|
+
};
|
|
163
218
|
|
|
164
219
|
// src/ObjectWrapper.ts
|
|
165
220
|
var ObjectWrapper = class {
|
|
@@ -247,18 +302,18 @@ var removeFields = (obj, fields) => {
|
|
|
247
302
|
return clone;
|
|
248
303
|
};
|
|
249
304
|
|
|
250
|
-
// src/
|
|
251
|
-
var
|
|
252
|
-
return value.map((item) =>
|
|
305
|
+
// src/toSafeJson.ts
|
|
306
|
+
var toSafeJsonArray = (value, cycleList, maxDepth = 3) => {
|
|
307
|
+
return value.map((item) => toSafeJsonValue(item, cycleList, maxDepth));
|
|
253
308
|
};
|
|
254
|
-
var
|
|
309
|
+
var toSafeJsonObject = (value, cycleList, maxDepth = 3) => {
|
|
255
310
|
const result = {};
|
|
256
311
|
for (const [key, entry] of Object.entries(value)) {
|
|
257
|
-
result[key] = value === void 0 ? "[Undefined]" :
|
|
312
|
+
result[key] = value === void 0 ? "[Undefined]" : toSafeJsonValue(entry, cycleList, maxDepth);
|
|
258
313
|
}
|
|
259
314
|
return result;
|
|
260
315
|
};
|
|
261
|
-
var
|
|
316
|
+
var toSafeJsonValue = (value, cycleList, maxDepth = 3) => {
|
|
262
317
|
if (maxDepth <= 0 && typeof value === "object") {
|
|
263
318
|
return "[MaxDepth]";
|
|
264
319
|
}
|
|
@@ -277,18 +332,18 @@ var toJsonValue = (value, cycleList, maxDepth = 3) => {
|
|
|
277
332
|
}
|
|
278
333
|
const newCycleList = cycleList ?? [];
|
|
279
334
|
newCycleList.push(value);
|
|
280
|
-
return Array.isArray(value) ?
|
|
335
|
+
return Array.isArray(value) ? toSafeJsonArray(value, newCycleList, maxDepth - 1) : toSafeJsonObject(value, newCycleList, maxDepth - 1);
|
|
281
336
|
}
|
|
282
337
|
default: {
|
|
283
338
|
return `[${typeof value}]`;
|
|
284
339
|
}
|
|
285
340
|
}
|
|
286
341
|
};
|
|
287
|
-
var
|
|
288
|
-
return JSON.stringify(
|
|
342
|
+
var toSafeJsonString = (value, maxDepth = 3) => {
|
|
343
|
+
return JSON.stringify(toSafeJson(value, maxDepth), null, 2);
|
|
289
344
|
};
|
|
290
|
-
var
|
|
291
|
-
return
|
|
345
|
+
var toSafeJson = (value, maxDepth = 3) => {
|
|
346
|
+
return toSafeJsonValue(value, void 0, maxDepth);
|
|
292
347
|
};
|
|
293
348
|
|
|
294
349
|
// src/Validator.ts
|
|
@@ -304,6 +359,7 @@ export {
|
|
|
304
359
|
ObjectWrapper,
|
|
305
360
|
ValidatorBase,
|
|
306
361
|
asAnyObject,
|
|
362
|
+
asJsonArray,
|
|
307
363
|
createDeepMerge,
|
|
308
364
|
deepMerge,
|
|
309
365
|
isJsonArray,
|
|
@@ -317,10 +373,14 @@ export {
|
|
|
317
373
|
pickBy,
|
|
318
374
|
pickByPrefix,
|
|
319
375
|
removeFields,
|
|
320
|
-
toJson,
|
|
321
376
|
toJsonArray,
|
|
322
377
|
toJsonObject,
|
|
323
|
-
|
|
324
|
-
|
|
378
|
+
toJsonValue,
|
|
379
|
+
toSafeJson,
|
|
380
|
+
toSafeJsonArray,
|
|
381
|
+
toSafeJsonObject,
|
|
382
|
+
toSafeJsonString,
|
|
383
|
+
toSafeJsonValue,
|
|
384
|
+
toValidJsonFieldPair
|
|
325
385
|
};
|
|
326
386
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/AsTypeFactory.ts","../../src/AsObjectFactory.ts","../../src/isType.ts","../../src/isObject.ts","../../src/asObject.ts","../../src/deepMerge.ts","../../src/IsObjectFactory.ts","../../src/JsonObject.ts","../../src/ObjectWrapper.ts","../../src/omitBy.ts","../../src/pickBy.ts","../../src/removeFields.ts","../../src/toJson.ts","../../src/Validator.ts","../../src/index.ts"],"sourcesContent":["import { assertDefinedEx } from '@xylabs/assert'\nimport type {\n AsTypeFunction,\n StringOrAlertFunction, TypeCheck, TypeCheckConfig,\n TypeCheckRequiredConfig,\n} from '@xylabs/object-model'\nimport type { AnyNonPromise } from '@xylabs/promise'\nimport { isPromise } from '@xylabs/promise'\nimport { isTruthy } from '@xylabs/typeof'\n\nexport const AsTypeFactory = {\n create: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>): AsTypeFunction<T> => {\n const func = (\n value: AnyNonPromise,\n assertOrConfig?: StringOrAlertFunction<T> | TypeCheckConfig,\n config?: TypeCheckConfig,\n ): T | undefined => {\n // when used as a predicate, it seems that the index is passed as the second parameter (filter,map)\n const isPredicate = typeof assertOrConfig === 'number'\n const resolvedAssert = isPredicate\n ? undefined\n : (typeof assertOrConfig === 'object' ? undefined : assertOrConfig) as (StringOrAlertFunction<T> | undefined)\n const resolvedConfig = isPredicate ? undefined : typeof assertOrConfig === 'object' ? assertOrConfig : config\n\n // only return undefined if not required\n const required = isTruthy((resolvedConfig as (TypeCheckRequiredConfig | undefined))?.required)\n if (!required && (value === undefined || value === null)) {\n return undefined\n }\n\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n\n const result = typeCheck(value, resolvedConfig) ? (value as T) : undefined\n\n if (resolvedAssert !== undefined) {\n return typeof resolvedAssert === 'function' ? assertDefinedEx<T>(result, resolvedAssert) : assertDefinedEx<T>(result, () => resolvedAssert)\n }\n return result\n }\n return func\n },\n createOptional: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>) => {\n const func = (value: AnyNonPromise): T | undefined => {\n if (value === undefined || value === null) return undefined\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n return typeCheck(value) ? (value as T) : undefined\n }\n return func\n },\n}\n","import type { TypeCheck } from '@xylabs/object-model'\nimport type { TypedObject } from '@xylabs/typeof'\n\nimport { AsTypeFactory } from './AsTypeFactory.ts'\n\nexport const AsObjectFactory = {\n create: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.create<T>(typeCheck)\n },\n createOptional: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.createOptional<T>(typeCheck)\n },\n}\n","import type { FieldType } from '@xylabs/typeof'\n\nexport const isType = (value: unknown, expectedType: FieldType) => {\n const typeofValue = typeof value\n switch (expectedType) {\n case 'array': {\n return Array.isArray(value)\n }\n case 'null': {\n return value === null\n }\n case 'undefined': {\n return value === undefined\n }\n case 'object': {\n // nulls resolve to objects, so exclude them\n if (value === null) {\n return false\n }\n // arrays resolve to objects, so exclude them\n return typeofValue === 'object' && !Array.isArray(value)\n }\n default: {\n return typeofValue === expectedType\n }\n }\n}\n","import { isType } from './isType.ts'\n\nexport const isObject = <T>(value: T): value is T & object => {\n return isType(value, 'object')\n}\n","import type { AnyObject } from '@xylabs/object-model'\n\nimport { AsObjectFactory } from './AsObjectFactory.ts'\nimport { isObject } from './isObject.ts'\n\nexport const asAnyObject = (() => AsObjectFactory.create<AnyObject>(<T extends AnyObject>(obj: unknown): obj is T => isObject(obj)))()\n","import type { AnyObject } from '@xylabs/object-model'\n\n/**\n * Deeply merges two types into a new type.\n */\ntype DeepMerge<A, B> = {\n [K in keyof A | keyof B]:\n K extends keyof B\n ? K extends keyof A\n ? A[K] extends object\n ? B[K] extends object\n ? DeepMerge<A[K], B[K]>\n : B[K]\n : B[K]\n : B[K]\n : K extends keyof A\n ? A[K]\n : never;\n}\n\n/**\n * Merges multiple types into a new type.\n */\ntype MergeAll<T extends object[], R = {}>\n = T extends [infer First extends object, ...infer Rest extends object[]]\n ? MergeAll<Rest, DeepMerge<R, First>>\n : R\n\n/**\n * Options for merging objects in the deep merge function.\n */\ntype MergeOptions = {\n /**\n * Strategy for merging arrays.\n * - 'overwrite': Overwrites the array with the last object's value.\n * - 'concat': Concatenates arrays from all objects.\n * @default 'overwrite'\n */\n arrayStrategy?: 'overwrite' | 'concat'\n /**\n * Mutate the first object in the list instead of creating a new one.\n * @default false\n */\n mutate?: boolean\n}\n\nconst isUnsafeKey = (key: string | symbol): boolean =>\n key === '__proto__' || key === 'constructor' || key === 'prototype'\n\nfunction merge<T extends AnyObject>(target: AnyObject, source?: AnyObject, options?: MergeOptions): T {\n if (!source || typeof source !== 'object') return target as T\n\n for (const key of Reflect.ownKeys(source)) {\n const value = source[key]\n if (isUnsafeKey(key)) {\n continue\n } else if (Array.isArray(value)) {\n target[key]\n // If the value is an array, handle it based on the configured array strategy\n = options?.arrayStrategy === 'concat' && Array.isArray(target[key])\n ? [...target[key], ...value]\n : value\n } else if (value !== null && typeof value === 'object') {\n // Recursively merge nested objects\n if (!target[key] || typeof target[key] !== 'object') {\n target[key] = {}\n }\n merge(target[key] as AnyObject, value as AnyObject, options)\n } else {\n // Overwrite with non-object values\n target[key] = value\n }\n }\n\n return target as T\n}\n\n/**\n * Creates a deep merge function with the specified options.\n * @param options Options for merging.\n * @returns A deep merge function configured for the specified options.\n */\nexport function createDeepMerge(options: MergeOptions) {\n return function deepMerge<T extends AnyObject[]>(...objects: T): MergeAll<T> {\n const result = (options.mutate ? objects[0] ?? {} : {}) as MergeAll<T>\n for (const obj of objects) {\n merge(result, obj, options)\n }\n return result\n }\n}\n\n/**\n * Deeply merges multiple objects into a new object.\n * @param objects Multiple objects to merge deeply.\n * The function merges properties from all objects into a new object.\n * If a property exists in multiple objects, the last object's value will be used.\n * If a property is an object, it will be merged recursively.\n * If a property is an array, it will be overwritten by the last object's value.\n * If a property is a primitive value, it will be overwritten by the last object's value.\n * If a property is undefined in the source, it will be skipped.\n * If a property is a symbol, it will be merged as well.\n * @returns A new object with the merged properties.\n */\nexport const deepMerge = createDeepMerge({ arrayStrategy: 'overwrite', mutate: false })\n","import type { TypeCheck, TypeCheckConfig } from '@xylabs/object-model'\nimport {\n isObject, isTruthy,\n type ObjectTypeShape, type TypedObject,\n} from '@xylabs/typeof'\n\nimport { isType } from './isType.ts'\n\nexport interface ObjectTypeConfig extends TypeCheckConfig {}\n\nexport class IsObjectFactory<T extends TypedObject> {\n create(shape?: ObjectTypeShape, additionalChecks?: TypeCheck<TypedObject>[]): TypeCheck<T> {\n return (obj: unknown, config?: TypeCheckConfig | number): obj is T => {\n if (!isObject(obj)) {\n return false\n }\n const log = (typeof config === 'object') ? config.log : undefined\n return (\n // do primary check\n Object.entries(shape ?? {}).filter(([key, type]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = isType((obj as any)[key], type)\n if (!result && isTruthy(log)) {\n const logger = typeof log === 'object' ? log : console\n logger.warn(`isType Failed: ${key}: ${type}`)\n }\n return !result\n }).length === 0\n // perform additional checks\n && (additionalChecks?.reduce((prev, check) => prev && check(obj, { log }), true) ?? true)\n )\n }\n }\n}\n","import { isObject } from '@xylabs/typeof'\n\nexport type JsonValue = string | number | boolean | null | JsonObject | JsonArray\nexport type JsonObject = { [key: string]: JsonValue }\nexport type JsonArray = JsonValue[]\n\nexport const isJsonValue = (value: unknown): value is JsonValue => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean': {\n return true\n }\n default: {\n return value === null || isJsonObject(value) || isJsonArray(value)\n }\n }\n}\n\nexport const isJsonArray = (value: unknown): value is JsonArray => {\n return Array.isArray(value) && !value.some(item => !isJsonValue(item))\n}\n\nexport const isValidJsonFieldPair = ([key, value]: [key: unknown, value: unknown]) => {\n return typeof key === 'string' && isJsonValue(value)\n}\n\nexport const isJsonObject = (value: unknown): value is JsonObject => {\n return (\n isObject(value)\n // check if all keys are strings\n && !Object.entries(value).some(item => !isValidJsonFieldPair(item))\n )\n}\n","import type { EmptyObject } from './EmptyObject.ts'\nimport type { StringKeyObject } from './StringKeyObject.ts'\n\nexport abstract class ObjectWrapper<T extends EmptyObject = EmptyObject> {\n readonly obj: T\n constructor(obj: T) {\n this.obj = obj\n }\n\n protected get stringKeyObj() {\n return this.obj as StringKeyObject\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepOmitStartsWith } from './OmitStartsWith.ts'\n\nexport type OmitByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst omitByArray = <T>(\n obj: T[],\n predicate: OmitByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst omitByObject = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (!predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const omitBy = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? omitByArray(obj, predicate, maxDepth - 1) as T : omitByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst omitByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const omitByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepOmitStartsWith<T, P> => {\n return omitBy(payload, omitByPrefixPredicate(prefix), maxDepth) as unknown as DeepOmitStartsWith<T, P>\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepPickStartsWith } from './PickStartsWith.ts'\n\nexport type PickByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst pickByArray = <T>(\n obj: T[],\n predicate: PickByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst pickByObject = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const pickBy = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? pickByArray(obj, predicate, maxDepth - 1) as T : pickByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst pickByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const pickByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepPickStartsWith<T, P> => {\n return pickBy(payload, pickByPrefixPredicate(prefix), maxDepth) as unknown as DeepPickStartsWith<T, P>\n}\n","import type { EmptyObject } from './EmptyObject.ts'\n\nexport const removeFields = <T extends EmptyObject, K extends keyof T>(obj: T, fields: K[]): Omit<T, K> => {\n const clone = { ...obj }\n for (const field of fields) {\n delete clone[field]\n }\n return clone\n}\n","import type {\n JsonArray, JsonObject, JsonValue,\n} from './JsonObject.ts'\n\nexport const toJsonArray = (value: unknown[], cycleList?: unknown[], maxDepth = 3): JsonArray => {\n return value.map(item => toJsonValue(item, cycleList, maxDepth))\n}\n\nexport const toJsonObject = (value: object, cycleList?: unknown[], maxDepth = 3): JsonObject => {\n const result: JsonObject = {}\n for (const [key, entry] of Object.entries(value)) {\n result[key] = value === undefined ? '[Undefined]' : toJsonValue(entry, cycleList, maxDepth)\n }\n return result\n}\n\nexport const toJsonValue = (value: unknown, cycleList?: unknown[], maxDepth = 3): JsonValue => {\n if (maxDepth <= 0 && typeof value === 'object') {\n return '[MaxDepth]'\n }\n if (cycleList?.includes(value)) {\n return '[Circular]'\n }\n switch (typeof value) {\n case 'string':\n case 'boolean':\n case 'number': {\n return value\n }\n case 'object': {\n if (value === null) {\n return null\n }\n const newCycleList = cycleList ?? []\n newCycleList.push(value)\n return Array.isArray(value) ? toJsonArray(value, newCycleList, maxDepth - 1) : toJsonObject(value, newCycleList, maxDepth - 1)\n }\n default: {\n return `[${typeof value}]`\n }\n }\n}\n\nexport const toJsonString = (value: unknown, maxDepth = 3) => {\n return JSON.stringify(toJson(value, maxDepth), null, 2)\n}\n\nexport const toJson = (value: unknown, maxDepth = 3): JsonValue => {\n return toJsonValue(value, undefined, maxDepth)\n}\n","import type { AnyObject } from '@xylabs/object-model'\nimport type { Promisable } from '@xylabs/promise'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport { ObjectWrapper } from './ObjectWrapper.ts'\n\nexport interface Validator<T extends EmptyObject = AnyObject> {\n validate(payload: T): Promisable<Error[]>\n}\n\nexport abstract class ValidatorBase<T extends EmptyObject = AnyObject> extends ObjectWrapper<Partial<T>> implements Validator<T> {\n abstract validate(payload: T): Promisable<Error[]>\n}\n","export * from './asObject.ts'\nexport * from './AsObjectFactory.ts'\nexport * from './AsTypeFactory.ts'\nexport * from './deepMerge.ts'\nexport * from './EmptyObject.ts'\nexport * from './isObject.ts'\nexport * from './IsObjectFactory.ts'\nexport * from './isType.ts'\nexport * from './JsonObject.ts'\nexport * from './ObjectWrapper.ts'\nexport * from './omitBy.ts'\nexport * from './OmitStartsWith.ts'\nexport * from './Optional.ts'\nexport * from './Override.ts'\nexport * from './PartialRecord.ts'\nexport * from './pickBy.ts'\nexport * from './PickStartsWith.ts'\nexport * from './removeFields.ts'\nexport * from './StringKeyObject.ts'\nexport * from './toJson.ts'\nexport * from './Validator.ts'\nexport * from './WithAdditional.ts'\nexport * from '@xylabs/object-model'\n"],"mappings":";AAAA,SAAS,uBAAuB;AAOhC,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AAElB,IAAM,gBAAgB;AAAA,EAC3B,QAAQ,CAA0B,cAA+C;AAC/E,UAAM,OAAO,CACX,OACA,gBACA,WACkB;AAElB,YAAM,cAAc,OAAO,mBAAmB;AAC9C,YAAM,iBAAiB,cACnB,SACC,OAAO,mBAAmB,WAAW,SAAY;AACtD,YAAM,iBAAiB,cAAc,SAAY,OAAO,mBAAmB,WAAW,iBAAiB;AAGvG,YAAM,WAAW,SAAU,gBAA0D,QAAQ;AAC7F,UAAI,CAAC,aAAa,UAAU,UAAa,UAAU,OAAO;AACxD,eAAO;AAAA,MACT;AAEA,UAAI,UAAU,KAAK,GAAG;AACpB,cAAM,IAAI,UAAU,uDAAuD;AAAA,MAC7E;AAEA,YAAM,SAAS,UAAU,OAAO,cAAc,IAAK,QAAc;AAEjE,UAAI,mBAAmB,QAAW;AAChC,eAAO,OAAO,mBAAmB,aAAa,gBAAmB,QAAQ,cAAc,IAAI,gBAAmB,QAAQ,MAAM,cAAc;AAAA,MAC5I;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EACA,gBAAgB,CAA0B,cAA4B;AACpE,UAAM,OAAO,CAAC,UAAwC;AACpD,UAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,UAAI,UAAU,KAAK,GAAG;AACpB,cAAM,IAAI,UAAU,uDAAuD;AAAA,MAC7E;AACA,aAAO,UAAU,KAAK,IAAK,QAAc;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACF;;;AChDO,IAAM,kBAAkB;AAAA,EAC7B,QAAQ,CAAwB,cAA4B;AAC1D,WAAO,cAAc,OAAU,SAAS;AAAA,EAC1C;AAAA,EACA,gBAAgB,CAAwB,cAA4B;AAClE,WAAO,cAAc,eAAkB,SAAS;AAAA,EAClD;AACF;;;ACVO,IAAM,SAAS,CAAC,OAAgB,iBAA4B;AACjE,QAAM,cAAc,OAAO;AAC3B,UAAQ,cAAc;AAAA,IACpB,KAAK,SAAS;AACZ,aAAO,MAAM,QAAQ,KAAK;AAAA,IAC5B;AAAA,IACA,KAAK,QAAQ;AACX,aAAO,UAAU;AAAA,IACnB;AAAA,IACA,KAAK,aAAa;AAChB,aAAO,UAAU;AAAA,IACnB;AAAA,IACA,KAAK,UAAU;AAEb,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AAEA,aAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,KAAK;AAAA,IACzD;AAAA,IACA,SAAS;AACP,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF;AACF;;;ACxBO,IAAM,WAAW,CAAI,UAAkC;AAC5D,SAAO,OAAO,OAAO,QAAQ;AAC/B;;;ACCO,IAAM,eAAe,MAAM,gBAAgB,OAAkB,CAAsB,QAA2B,SAAS,GAAG,CAAC,GAAG;;;ACyCrI,IAAM,cAAc,CAAC,QACnB,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ;AAE1D,SAAS,MAA2B,QAAmB,QAAoB,SAA2B;AACpG,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAElD,aAAW,OAAO,QAAQ,QAAQ,MAAM,GAAG;AACzC,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,YAAY,GAAG,GAAG;AACpB;AAAA,IACF,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,aAAO,GAAG,IAEN,SAAS,kBAAkB,YAAY,MAAM,QAAQ,OAAO,GAAG,CAAC,IAC9D,CAAC,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,IACzB;AAAA,IACR,WAAW,UAAU,QAAQ,OAAO,UAAU,UAAU;AAEtD,UAAI,CAAC,OAAO,GAAG,KAAK,OAAO,OAAO,GAAG,MAAM,UAAU;AACnD,eAAO,GAAG,IAAI,CAAC;AAAA,MACjB;AACA,YAAM,OAAO,GAAG,GAAgB,OAAoB,OAAO;AAAA,IAC7D,OAAO;AAEL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,gBAAgB,SAAuB;AACrD,SAAO,SAASA,cAAoC,SAAyB;AAC3E,UAAM,SAAU,QAAQ,SAAS,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AACrD,eAAW,OAAO,SAAS;AACzB,YAAM,QAAQ,KAAK,OAAO;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AACF;AAcO,IAAM,YAAY,gBAAgB,EAAE,eAAe,aAAa,QAAQ,MAAM,CAAC;;;ACvGtF;AAAA,EACE,YAAAC;AAAA,EAAU,YAAAC;AAAA,OAEL;AAMA,IAAM,kBAAN,MAA6C;AAAA,EAClD,OAAO,OAAyB,kBAA2D;AACzF,WAAO,CAAC,KAAc,WAAgD;AACpE,UAAI,CAACC,UAAS,GAAG,GAAG;AAClB,eAAO;AAAA,MACT;AACA,YAAM,MAAO,OAAO,WAAW,WAAY,OAAO,MAAM;AACxD;AAAA;AAAA,QAEE,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,MAAM;AAElD,gBAAM,SAAS,OAAQ,IAAY,GAAG,GAAG,IAAI;AAC7C,cAAI,CAAC,UAAUC,UAAS,GAAG,GAAG;AAC5B,kBAAM,SAAS,OAAO,QAAQ,WAAW,MAAM;AAC/C,mBAAO,KAAK,kBAAkB,GAAG,KAAK,IAAI,EAAE;AAAA,UAC9C;AACA,iBAAO,CAAC;AAAA,QACV,CAAC,EAAE,WAAW,MAEV,kBAAkB,OAAO,CAAC,MAAM,UAAU,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,KAAK;AAAA;AAAA,IAExF;AAAA,EACF;AACF;;;ACjCA,SAAS,YAAAC,iBAAgB;AAMlB,IAAM,cAAc,CAAC,UAAuC;AACjE,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IACA,SAAS;AACP,aAAO,UAAU,QAAQ,aAAa,KAAK,KAAK,YAAY,KAAK;AAAA,IACnE;AAAA,EACF;AACF;AAEO,IAAM,cAAc,CAAC,UAAuC;AACjE,SAAO,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,KAAK,UAAQ,CAAC,YAAY,IAAI,CAAC;AACvE;AAEO,IAAM,uBAAuB,CAAC,CAAC,KAAK,KAAK,MAAsC;AACpF,SAAO,OAAO,QAAQ,YAAY,YAAY,KAAK;AACrD;AAEO,IAAM,eAAe,CAAC,UAAwC;AACnE,SACEA,UAAS,KAAK,KAEX,CAAC,OAAO,QAAQ,KAAK,EAAE,KAAK,UAAQ,CAAC,qBAAqB,IAAI,CAAC;AAEtE;;;AC9BO,IAAe,gBAAf,MAAkE;AAAA,EAC9D;AAAA,EACT,YAAY,KAAQ;AAClB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,IAAc,eAAe;AAC3B,WAAO,KAAK;AAAA,EACd;AACF;;;ACZA,SAAS,gBAAgB;AAQzB,IAAM,cAAc,CAClB,KACA,WACA,aACQ;AACR,SAAO,IAAI,IAAI,CAAC,UAAU;AACxB,WAAQ,UAAU,QAAQ,OAAO,UAAU,WAAY,OAAO,OAAO,WAAW,QAAQ,IAAI;AAAA,EAC9F,CAAC;AACH;AAEA,IAAM,eAAe,CACnB,KACA,WACA,aACe;AACf,QAAM,SAAqB,CAAC;AAE5B,aAAW,OAAO,KAAK;AACrB,QAAI,OAAO,OAAO,KAAK,GAAG,GAAG;AAC3B,YAAM,QAAQ,IAAI,GAAG;AACrB,UAAI,CAAC,UAAU,OAAO,GAAG,GAAG;AAC1B,eAAO,GAAG,IAAM,UAAU,QAAQ,OAAO,UAAU,WAAY,OAAO,OAAO,WAAW,WAAW,CAAC,IAAI;AAAA,MAC1G;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,SAAS,CACpB,KACA,WACA,WAAW,MACI;AACf,MAAI,YAAY,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAQ,GAAG,IAAI,YAAY,KAAK,WAAW,WAAW,CAAC,IAAS,aAAa,KAAK,WAAW,WAAW,CAAC;AACxH;AAEA,IAAM,wBAAwB,CAAC,WAAmB,CAAC,GAAY,QAAgB;AAC7E,WAAS,OAAO,QAAQ,UAAU,MAAM,qBAAqB,GAAG,KAAK,OAAO,GAAG,GAAG;AAClF,SAAO,IAAI,WAAW,MAAM;AAC9B;AAEO,IAAM,eAAe,CAA0C,SAAY,QAAW,WAAW,QAAkC;AACxI,SAAO,OAAO,SAAS,sBAAsB,MAAM,GAAG,QAAQ;AAChE;;;ACxDA,SAAS,YAAAC,iBAAgB;AAQzB,IAAM,cAAc,CAClB,KACA,WACA,aACQ;AACR,SAAO,IAAI,IAAI,CAAC,UAAU;AACxB,WAAQ,UAAU,QAAQ,OAAO,UAAU,WAAY,OAAO,OAAO,WAAW,QAAQ,IAAI;AAAA,EAC9F,CAAC;AACH;AAEA,IAAM,eAAe,CACnB,KACA,WACA,aACe;AACf,QAAM,SAAqB,CAAC;AAE5B,aAAW,OAAO,KAAK;AACrB,QAAI,OAAO,OAAO,KAAK,GAAG,GAAG;AAC3B,YAAM,QAAQ,IAAI,GAAG;AACrB,UAAI,UAAU,OAAO,GAAG,GAAG;AACzB,eAAO,GAAG,IAAM,UAAU,QAAQ,OAAO,UAAU,WAAY,OAAO,OAAO,WAAW,WAAW,CAAC,IAAI;AAAA,MAC1G;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,SAAS,CACpB,KACA,WACA,WAAW,MACI;AACf,MAAI,YAAY,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAQ,GAAG,IAAI,YAAY,KAAK,WAAW,WAAW,CAAC,IAAS,aAAa,KAAK,WAAW,WAAW,CAAC;AACxH;AAEA,IAAM,wBAAwB,CAAC,WAAmB,CAAC,GAAY,QAAgB;AAC7E,EAAAA,UAAS,OAAO,QAAQ,UAAU,MAAM,qBAAqB,GAAG,KAAK,OAAO,GAAG,GAAG;AAClF,SAAO,IAAI,WAAW,MAAM;AAC9B;AAEO,IAAM,eAAe,CAA0C,SAAY,QAAW,WAAW,QAAkC;AACxI,SAAO,OAAO,SAAS,sBAAsB,MAAM,GAAG,QAAQ;AAChE;;;ACtDO,IAAM,eAAe,CAA2C,KAAQ,WAA4B;AACzG,QAAM,QAAQ,EAAE,GAAG,IAAI;AACvB,aAAW,SAAS,QAAQ;AAC1B,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,SAAO;AACT;;;ACJO,IAAM,cAAc,CAAC,OAAkB,WAAuB,WAAW,MAAiB;AAC/F,SAAO,MAAM,IAAI,UAAQ,YAAY,MAAM,WAAW,QAAQ,CAAC;AACjE;AAEO,IAAM,eAAe,CAAC,OAAe,WAAuB,WAAW,MAAkB;AAC9F,QAAM,SAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,WAAO,GAAG,IAAI,UAAU,SAAY,gBAAgB,YAAY,OAAO,WAAW,QAAQ;AAAA,EAC5F;AACA,SAAO;AACT;AAEO,IAAM,cAAc,CAAC,OAAgB,WAAuB,WAAW,MAAiB;AAC7F,MAAI,YAAY,KAAK,OAAO,UAAU,UAAU;AAC9C,WAAO;AAAA,EACT;AACA,MAAI,WAAW,SAAS,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,UAAU;AACb,aAAO;AAAA,IACT;AAAA,IACA,KAAK,UAAU;AACb,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AACA,YAAM,eAAe,aAAa,CAAC;AACnC,mBAAa,KAAK,KAAK;AACvB,aAAO,MAAM,QAAQ,KAAK,IAAI,YAAY,OAAO,cAAc,WAAW,CAAC,IAAI,aAAa,OAAO,cAAc,WAAW,CAAC;AAAA,IAC/H;AAAA,IACA,SAAS;AACP,aAAO,IAAI,OAAO,KAAK;AAAA,IACzB;AAAA,EACF;AACF;AAEO,IAAM,eAAe,CAAC,OAAgB,WAAW,MAAM;AAC5D,SAAO,KAAK,UAAU,OAAO,OAAO,QAAQ,GAAG,MAAM,CAAC;AACxD;AAEO,IAAM,SAAS,CAAC,OAAgB,WAAW,MAAiB;AACjE,SAAO,YAAY,OAAO,QAAW,QAAQ;AAC/C;;;ACvCO,IAAe,gBAAf,cAAwE,cAAkD;AAEjI;;;ACUA,cAAc;","names":["deepMerge","isObject","isTruthy","isObject","isTruthy","isObject","assertEx"]}
|
|
1
|
+
{"version":3,"sources":["../../src/AsTypeFactory.ts","../../src/AsObjectFactory.ts","../../src/isType.ts","../../src/isObject.ts","../../src/asObject.ts","../../src/deepMerge.ts","../../src/IsObjectFactory.ts","../../src/JsonObject.ts","../../src/ObjectWrapper.ts","../../src/omitBy.ts","../../src/pickBy.ts","../../src/removeFields.ts","../../src/toSafeJson.ts","../../src/Validator.ts","../../src/index.ts"],"sourcesContent":["import { assertDefinedEx } from '@xylabs/assert'\nimport type {\n AsTypeFunction,\n StringOrAlertFunction, TypeCheck, TypeCheckConfig,\n TypeCheckRequiredConfig,\n} from '@xylabs/object-model'\nimport type { AnyNonPromise } from '@xylabs/promise'\nimport { isPromise } from '@xylabs/promise'\nimport { isTruthy } from '@xylabs/typeof'\n\nexport const AsTypeFactory = {\n create: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>): AsTypeFunction<T> => {\n const func = (\n value: AnyNonPromise,\n assertOrConfig?: StringOrAlertFunction<T> | TypeCheckConfig,\n config?: TypeCheckConfig,\n ): T | undefined => {\n // when used as a predicate, it seems that the index is passed as the second parameter (filter,map)\n const isPredicate = typeof assertOrConfig === 'number'\n const resolvedAssert = isPredicate\n ? undefined\n : (typeof assertOrConfig === 'object' ? undefined : assertOrConfig) as (StringOrAlertFunction<T> | undefined)\n const resolvedConfig = isPredicate ? undefined : typeof assertOrConfig === 'object' ? assertOrConfig : config\n\n // only return undefined if not required\n const required = isTruthy((resolvedConfig as (TypeCheckRequiredConfig | undefined))?.required)\n if (!required && (value === undefined || value === null)) {\n return undefined\n }\n\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n\n const result = typeCheck(value, resolvedConfig) ? (value as T) : undefined\n\n if (resolvedAssert !== undefined) {\n return typeof resolvedAssert === 'function' ? assertDefinedEx<T>(result, resolvedAssert) : assertDefinedEx<T>(result, () => resolvedAssert)\n }\n return result\n }\n return func\n },\n createOptional: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>) => {\n const func = (value: AnyNonPromise): T | undefined => {\n if (value === undefined || value === null) return undefined\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n return typeCheck(value) ? (value as T) : undefined\n }\n return func\n },\n}\n","import type { TypeCheck } from '@xylabs/object-model'\nimport type { TypedObject } from '@xylabs/typeof'\n\nimport { AsTypeFactory } from './AsTypeFactory.ts'\n\nexport const AsObjectFactory = {\n create: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.create<T>(typeCheck)\n },\n createOptional: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.createOptional<T>(typeCheck)\n },\n}\n","import type { FieldType } from '@xylabs/typeof'\n\nexport const isType = (value: unknown, expectedType: FieldType) => {\n const typeofValue = typeof value\n switch (expectedType) {\n case 'array': {\n return Array.isArray(value)\n }\n case 'null': {\n return value === null\n }\n case 'undefined': {\n return value === undefined\n }\n case 'object': {\n // nulls resolve to objects, so exclude them\n if (value === null) {\n return false\n }\n // arrays resolve to objects, so exclude them\n return typeofValue === 'object' && !Array.isArray(value)\n }\n default: {\n return typeofValue === expectedType\n }\n }\n}\n","import { isType } from './isType.ts'\n\nexport const isObject = <T>(value: T): value is T & object => {\n return isType(value, 'object')\n}\n","import type { AnyObject } from '@xylabs/object-model'\n\nimport { AsObjectFactory } from './AsObjectFactory.ts'\nimport { isObject } from './isObject.ts'\n\nexport const asAnyObject = (() => AsObjectFactory.create<AnyObject>(<T extends AnyObject>(obj: unknown): obj is T => isObject(obj)))()\n","import type { AnyObject } from '@xylabs/object-model'\n\n/**\n * Deeply merges two types into a new type.\n */\ntype DeepMerge<A, B> = {\n [K in keyof A | keyof B]:\n K extends keyof B\n ? K extends keyof A\n ? A[K] extends object\n ? B[K] extends object\n ? DeepMerge<A[K], B[K]>\n : B[K]\n : B[K]\n : B[K]\n : K extends keyof A\n ? A[K]\n : never;\n}\n\n/**\n * Merges multiple types into a new type.\n */\ntype MergeAll<T extends object[], R = {}>\n = T extends [infer First extends object, ...infer Rest extends object[]]\n ? MergeAll<Rest, DeepMerge<R, First>>\n : R\n\n/**\n * Options for merging objects in the deep merge function.\n */\ntype MergeOptions = {\n /**\n * Strategy for merging arrays.\n * - 'overwrite': Overwrites the array with the last object's value.\n * - 'concat': Concatenates arrays from all objects.\n * @default 'overwrite'\n */\n arrayStrategy?: 'overwrite' | 'concat'\n /**\n * Mutate the first object in the list instead of creating a new one.\n * @default false\n */\n mutate?: boolean\n}\n\nconst isUnsafeKey = (key: string | symbol): boolean =>\n key === '__proto__' || key === 'constructor' || key === 'prototype'\n\nfunction merge<T extends AnyObject>(target: AnyObject, source?: AnyObject, options?: MergeOptions): T {\n if (!source || typeof source !== 'object') return target as T\n\n for (const key of Reflect.ownKeys(source)) {\n const value = source[key]\n if (isUnsafeKey(key)) {\n continue\n } else if (Array.isArray(value)) {\n target[key]\n // If the value is an array, handle it based on the configured array strategy\n = options?.arrayStrategy === 'concat' && Array.isArray(target[key])\n ? [...target[key], ...value]\n : value\n } else if (value !== null && typeof value === 'object') {\n // Recursively merge nested objects\n if (!target[key] || typeof target[key] !== 'object') {\n target[key] = {}\n }\n merge(target[key] as AnyObject, value as AnyObject, options)\n } else {\n // Overwrite with non-object values\n target[key] = value\n }\n }\n\n return target as T\n}\n\n/**\n * Creates a deep merge function with the specified options.\n * @param options Options for merging.\n * @returns A deep merge function configured for the specified options.\n */\nexport function createDeepMerge(options: MergeOptions) {\n return function deepMerge<T extends AnyObject[]>(...objects: T): MergeAll<T> {\n const result = (options.mutate ? objects[0] ?? {} : {}) as MergeAll<T>\n for (const obj of objects) {\n merge(result, obj, options)\n }\n return result\n }\n}\n\n/**\n * Deeply merges multiple objects into a new object.\n * @param objects Multiple objects to merge deeply.\n * The function merges properties from all objects into a new object.\n * If a property exists in multiple objects, the last object's value will be used.\n * If a property is an object, it will be merged recursively.\n * If a property is an array, it will be overwritten by the last object's value.\n * If a property is a primitive value, it will be overwritten by the last object's value.\n * If a property is undefined in the source, it will be skipped.\n * If a property is a symbol, it will be merged as well.\n * @returns A new object with the merged properties.\n */\nexport const deepMerge = createDeepMerge({ arrayStrategy: 'overwrite', mutate: false })\n","import type { TypeCheck, TypeCheckConfig } from '@xylabs/object-model'\nimport {\n isObject, isTruthy,\n type ObjectTypeShape, type TypedObject,\n} from '@xylabs/typeof'\n\nimport { isType } from './isType.ts'\n\nexport interface ObjectTypeConfig extends TypeCheckConfig {}\n\nexport class IsObjectFactory<T extends TypedObject> {\n create(shape?: ObjectTypeShape, additionalChecks?: TypeCheck<TypedObject>[]): TypeCheck<T> {\n return (obj: unknown, config?: TypeCheckConfig | number): obj is T => {\n if (!isObject(obj)) {\n return false\n }\n const log = (typeof config === 'object') ? config.log : undefined\n return (\n // do primary check\n Object.entries(shape ?? {}).filter(([key, type]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = isType((obj as any)[key], type)\n if (!result && isTruthy(log)) {\n const logger = typeof log === 'object' ? log : console\n logger.warn(`isType Failed: ${key}: ${type}`)\n }\n return !result\n }).length === 0\n // perform additional checks\n && (additionalChecks?.reduce((prev, check) => prev && check(obj, { log }), true) ?? true)\n )\n }\n }\n}\n","import { isObject, isString } from '@xylabs/typeof'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { DeepRestrictToStringKeys } from './OmitStartsWith.ts'\n\nexport type JsonFieldPair = [key: string, value: JsonValue]\nexport type JsonValue = string | number | boolean | null | JsonObject | JsonArray\nexport type JsonObject = { [key: string]: JsonValue }\nexport type JsonTypedObject<T extends EmptyObject = EmptyObject> = DeepRestrictToStringKeys<T>\nexport type JsonArray = JsonValue[]\n\nexport const isJsonValue = (value: unknown): value is JsonValue => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean': {\n return true\n }\n default: {\n return value === null || isJsonObject(value) || isJsonArray(value)\n }\n }\n}\n\nexport const isJsonArray = (value: unknown): value is JsonArray => {\n return Array.isArray(value) && !value.some(item => !isJsonValue(item))\n}\n\nexport const asJsonArray = (value: unknown): JsonArray => {\n if (Array.isArray(value)) {\n return value.filter(isJsonValue)\n } else {\n throw new TypeError(`Expected an array, got ${typeof value}`)\n }\n}\n\nexport const isValidJsonFieldPair = (value: unknown): value is JsonFieldPair => {\n if (!Array.isArray(value) || value.length !== 2) {\n return false\n }\n const [key, val] = value\n return isString(key) && isJsonValue(val)\n}\n\nexport const isJsonObject = (value: unknown): value is JsonObject => {\n return (\n isObject(value)\n // check if all keys are strings\n && !Object.entries(value).some(item => !isValidJsonFieldPair(item))\n )\n}\n\nexport const toJsonObject = (value: unknown): JsonObject => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new TypeError(`Expected an object, got ${typeof value}`)\n }\n if (isJsonObject(value)) {\n return value\n }\n const result: JsonObject = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n const [key, jsonValue] = toValidJsonFieldPair([k, v])\n result[key] = jsonValue\n }\n }\n return result\n}\n\nexport const toJsonValue = (value: unknown): JsonValue => {\n if (isObject(value)) {\n return toJsonObject(value)\n } else if (Array.isArray(value)) {\n return toJsonArray(value)\n } else if (isJsonValue(value)) {\n return value\n }\n throw new TypeError(`Unable to coerce ${typeof value} to a JSON value`)\n}\n\nexport const toJsonArray = (value: unknown): JsonArray => {\n if (Array.isArray(value)) {\n return value.map(item => toJsonValue(item))\n }\n throw new TypeError(`Unable to coerce ${typeof value} to a JSON array`)\n}\n\nexport const toValidJsonFieldPair = (pair: [key: unknown, value: unknown]): JsonFieldPair => {\n const [key, value] = pair\n if (!isString(key)) {\n throw new TypeError(`Expected a string key, got ${typeof key}`)\n }\n\n if (isJsonValue(value)) {\n return [key, value]\n } else if (isObject(value)) {\n return [key, toJsonObject(value)]\n }\n\n throw new TypeError(`Expected a valid JSON value, got ${typeof value}`)\n}\n","import type { EmptyObject } from './EmptyObject.ts'\nimport type { StringKeyObject } from './StringKeyObject.ts'\n\nexport abstract class ObjectWrapper<T extends EmptyObject = EmptyObject> {\n readonly obj: T\n constructor(obj: T) {\n this.obj = obj\n }\n\n protected get stringKeyObj() {\n return this.obj as StringKeyObject\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepOmitStartsWith } from './OmitStartsWith.ts'\n\nexport type OmitByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst omitByArray = <T>(\n obj: T[],\n predicate: OmitByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst omitByObject = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (!predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const omitBy = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? omitByArray(obj, predicate, maxDepth - 1) as T : omitByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst omitByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const omitByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepOmitStartsWith<T, P> => {\n return omitBy(payload, omitByPrefixPredicate(prefix), maxDepth) as unknown as DeepOmitStartsWith<T, P>\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepPickStartsWith } from './PickStartsWith.ts'\n\nexport type PickByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst pickByArray = <T>(\n obj: T[],\n predicate: PickByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst pickByObject = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const pickBy = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? pickByArray(obj, predicate, maxDepth - 1) as T : pickByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst pickByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const pickByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepPickStartsWith<T, P> => {\n return pickBy(payload, pickByPrefixPredicate(prefix), maxDepth) as unknown as DeepPickStartsWith<T, P>\n}\n","import type { EmptyObject } from './EmptyObject.ts'\n\nexport const removeFields = <T extends EmptyObject, K extends keyof T>(obj: T, fields: K[]): Omit<T, K> => {\n const clone = { ...obj }\n for (const field of fields) {\n delete clone[field]\n }\n return clone\n}\n","import type {\n JsonArray, JsonObject, JsonValue,\n} from './JsonObject.ts'\n\nexport const toSafeJsonArray = (value: unknown[], cycleList?: unknown[], maxDepth = 3): JsonArray => {\n return value.map(item => toSafeJsonValue(item, cycleList, maxDepth))\n}\n\nexport const toSafeJsonObject = (value: object, cycleList?: unknown[], maxDepth = 3): JsonObject => {\n const result: JsonObject = {}\n for (const [key, entry] of Object.entries(value)) {\n result[key] = value === undefined ? '[Undefined]' : toSafeJsonValue(entry, cycleList, maxDepth)\n }\n return result\n}\n\nexport const toSafeJsonValue = (value: unknown, cycleList?: unknown[], maxDepth = 3): JsonValue => {\n if (maxDepth <= 0 && typeof value === 'object') {\n return '[MaxDepth]'\n }\n if (cycleList?.includes(value)) {\n return '[Circular]'\n }\n switch (typeof value) {\n case 'string':\n case 'boolean':\n case 'number': {\n return value\n }\n case 'object': {\n if (value === null) {\n return null\n }\n const newCycleList = cycleList ?? []\n newCycleList.push(value)\n return Array.isArray(value) ? toSafeJsonArray(value, newCycleList, maxDepth - 1) : toSafeJsonObject(value, newCycleList, maxDepth - 1)\n }\n default: {\n return `[${typeof value}]`\n }\n }\n}\n\nexport const toSafeJsonString = (value: unknown, maxDepth = 3) => {\n return JSON.stringify(toSafeJson(value, maxDepth), null, 2)\n}\n\nexport const toSafeJson = (value: unknown, maxDepth = 3): JsonValue => {\n return toSafeJsonValue(value, undefined, maxDepth)\n}\n","import type { AnyObject } from '@xylabs/object-model'\nimport type { Promisable } from '@xylabs/promise'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport { ObjectWrapper } from './ObjectWrapper.ts'\n\nexport interface Validator<T extends EmptyObject = AnyObject> {\n validate(payload: T): Promisable<Error[]>\n}\n\nexport abstract class ValidatorBase<T extends EmptyObject = AnyObject> extends ObjectWrapper<Partial<T>> implements Validator<T> {\n abstract validate(payload: T): Promisable<Error[]>\n}\n","export * from './asObject.ts'\nexport * from './AsObjectFactory.ts'\nexport * from './AsTypeFactory.ts'\nexport * from './deepMerge.ts'\nexport * from './EmptyObject.ts'\nexport * from './isObject.ts'\nexport * from './IsObjectFactory.ts'\nexport * from './isType.ts'\nexport * from './JsonObject.ts'\nexport * from './ObjectWrapper.ts'\nexport * from './omitBy.ts'\nexport * from './OmitStartsWith.ts'\nexport * from './Optional.ts'\nexport * from './Override.ts'\nexport * from './PartialRecord.ts'\nexport * from './pickBy.ts'\nexport * from './PickStartsWith.ts'\nexport * from './removeFields.ts'\nexport * from './StringKeyObject.ts'\nexport * from './toSafeJson.ts'\nexport * from './Validator.ts'\nexport * from './WithAdditional.ts'\nexport * from '@xylabs/object-model'\n"],"mappings":"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","names":["deepMerge","isObject","isTruthy","isObject","isTruthy","isObject","assertEx"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JsonArray, JsonObject, JsonValue } from './JsonObject.ts';
|
|
2
|
+
export declare const toSafeJsonArray: (value: unknown[], cycleList?: unknown[], maxDepth?: number) => JsonArray;
|
|
3
|
+
export declare const toSafeJsonObject: (value: object, cycleList?: unknown[], maxDepth?: number) => JsonObject;
|
|
4
|
+
export declare const toSafeJsonValue: (value: unknown, cycleList?: unknown[], maxDepth?: number) => JsonValue;
|
|
5
|
+
export declare const toSafeJsonString: (value: unknown, maxDepth?: number) => string;
|
|
6
|
+
export declare const toSafeJson: (value: unknown, maxDepth?: number) => JsonValue;
|
|
7
|
+
//# sourceMappingURL=toSafeJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toSafeJson.d.ts","sourceRoot":"","sources":["../../src/toSafeJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAAE,UAAU,EAAE,SAAS,EACjC,MAAM,iBAAiB,CAAA;AAExB,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,EAAE,EAAE,YAAY,OAAO,EAAE,EAAE,iBAAY,KAAG,SAEvF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,EAAE,YAAY,OAAO,EAAE,EAAE,iBAAY,KAAG,UAMrF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,EAAE,YAAY,OAAO,EAAE,EAAE,iBAAY,KAAG,SAyBrF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,EAAE,iBAAY,WAE5D,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,EAAE,iBAAY,KAAG,SAEzD,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xylabs/object",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.15.0",
|
|
4
4
|
"description": "Base functionality used throughout XY Labs TypeScript/JavaScript libraries",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"src"
|
|
36
36
|
],
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@xylabs/assert": "^4.
|
|
39
|
-
"@xylabs/object-model": "^4.
|
|
40
|
-
"@xylabs/promise": "^4.
|
|
41
|
-
"@xylabs/typeof": "^4.
|
|
38
|
+
"@xylabs/assert": "^4.15.0",
|
|
39
|
+
"@xylabs/object-model": "^4.15.0",
|
|
40
|
+
"@xylabs/promise": "^4.15.0",
|
|
41
|
+
"@xylabs/typeof": "^4.15.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@xylabs/ts-scripts-yarn3": "^7.0.1",
|
package/src/JsonObject.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import { isObject } from '@xylabs/typeof'
|
|
1
|
+
import { isObject, isString } from '@xylabs/typeof'
|
|
2
2
|
|
|
3
|
+
import type { EmptyObject } from './EmptyObject.ts'
|
|
4
|
+
import type { DeepRestrictToStringKeys } from './OmitStartsWith.ts'
|
|
5
|
+
|
|
6
|
+
export type JsonFieldPair = [key: string, value: JsonValue]
|
|
3
7
|
export type JsonValue = string | number | boolean | null | JsonObject | JsonArray
|
|
4
8
|
export type JsonObject = { [key: string]: JsonValue }
|
|
9
|
+
export type JsonTypedObject<T extends EmptyObject = EmptyObject> = DeepRestrictToStringKeys<T>
|
|
5
10
|
export type JsonArray = JsonValue[]
|
|
6
11
|
|
|
7
12
|
export const isJsonValue = (value: unknown): value is JsonValue => {
|
|
@@ -21,8 +26,20 @@ export const isJsonArray = (value: unknown): value is JsonArray => {
|
|
|
21
26
|
return Array.isArray(value) && !value.some(item => !isJsonValue(item))
|
|
22
27
|
}
|
|
23
28
|
|
|
24
|
-
export const
|
|
25
|
-
|
|
29
|
+
export const asJsonArray = (value: unknown): JsonArray => {
|
|
30
|
+
if (Array.isArray(value)) {
|
|
31
|
+
return value.filter(isJsonValue)
|
|
32
|
+
} else {
|
|
33
|
+
throw new TypeError(`Expected an array, got ${typeof value}`)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const isValidJsonFieldPair = (value: unknown): value is JsonFieldPair => {
|
|
38
|
+
if (!Array.isArray(value) || value.length !== 2) {
|
|
39
|
+
return false
|
|
40
|
+
}
|
|
41
|
+
const [key, val] = value
|
|
42
|
+
return isString(key) && isJsonValue(val)
|
|
26
43
|
}
|
|
27
44
|
|
|
28
45
|
export const isJsonObject = (value: unknown): value is JsonObject => {
|
|
@@ -32,3 +49,53 @@ export const isJsonObject = (value: unknown): value is JsonObject => {
|
|
|
32
49
|
&& !Object.entries(value).some(item => !isValidJsonFieldPair(item))
|
|
33
50
|
)
|
|
34
51
|
}
|
|
52
|
+
|
|
53
|
+
export const toJsonObject = (value: unknown): JsonObject => {
|
|
54
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
55
|
+
throw new TypeError(`Expected an object, got ${typeof value}`)
|
|
56
|
+
}
|
|
57
|
+
if (isJsonObject(value)) {
|
|
58
|
+
return value
|
|
59
|
+
}
|
|
60
|
+
const result: JsonObject = {}
|
|
61
|
+
for (const [k, v] of Object.entries(value)) {
|
|
62
|
+
if (v !== undefined) {
|
|
63
|
+
const [key, jsonValue] = toValidJsonFieldPair([k, v])
|
|
64
|
+
result[key] = jsonValue
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const toJsonValue = (value: unknown): JsonValue => {
|
|
71
|
+
if (isObject(value)) {
|
|
72
|
+
return toJsonObject(value)
|
|
73
|
+
} else if (Array.isArray(value)) {
|
|
74
|
+
return toJsonArray(value)
|
|
75
|
+
} else if (isJsonValue(value)) {
|
|
76
|
+
return value
|
|
77
|
+
}
|
|
78
|
+
throw new TypeError(`Unable to coerce ${typeof value} to a JSON value`)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export const toJsonArray = (value: unknown): JsonArray => {
|
|
82
|
+
if (Array.isArray(value)) {
|
|
83
|
+
return value.map(item => toJsonValue(item))
|
|
84
|
+
}
|
|
85
|
+
throw new TypeError(`Unable to coerce ${typeof value} to a JSON array`)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const toValidJsonFieldPair = (pair: [key: unknown, value: unknown]): JsonFieldPair => {
|
|
89
|
+
const [key, value] = pair
|
|
90
|
+
if (!isString(key)) {
|
|
91
|
+
throw new TypeError(`Expected a string key, got ${typeof key}`)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (isJsonValue(value)) {
|
|
95
|
+
return [key, value]
|
|
96
|
+
} else if (isObject(value)) {
|
|
97
|
+
return [key, toJsonObject(value)]
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
throw new TypeError(`Expected a valid JSON value, got ${typeof value}`)
|
|
101
|
+
}
|
package/src/OmitStartsWith.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { JsonValue } from './index.ts'
|
|
2
|
+
|
|
1
3
|
export type OmitStartsWith<T, Prefix extends string> = {
|
|
2
4
|
[K in keyof T as K extends `${Prefix}${string}` ? never : K]: T[K];
|
|
3
5
|
}
|
|
@@ -21,3 +23,13 @@ export type DeepRestrictToStringKeys<T> = {
|
|
|
21
23
|
? DeepRestrictToStringKeys<T[K]> // Handle objects recursively
|
|
22
24
|
: T[K]; // Leave other types untouched
|
|
23
25
|
}
|
|
26
|
+
|
|
27
|
+
export type DeepRestrictToJson<T> = {
|
|
28
|
+
[K in keyof T as K extends string ? K : never]: T[K] extends (infer U)[]
|
|
29
|
+
? DeepRestrictToJson<U>[] // Handle arrays recursively
|
|
30
|
+
: T[K] extends object
|
|
31
|
+
? DeepRestrictToJson<T[K]> // Handle objects recursively
|
|
32
|
+
: T[K] extends JsonValue
|
|
33
|
+
? T[K] // Leave JsonValue types untouched
|
|
34
|
+
: never; // Exclude other types
|
|
35
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -17,7 +17,7 @@ export * from './pickBy.ts'
|
|
|
17
17
|
export * from './PickStartsWith.ts'
|
|
18
18
|
export * from './removeFields.ts'
|
|
19
19
|
export * from './StringKeyObject.ts'
|
|
20
|
-
export * from './
|
|
20
|
+
export * from './toSafeJson.ts'
|
|
21
21
|
export * from './Validator.ts'
|
|
22
22
|
export * from './WithAdditional.ts'
|
|
23
23
|
export * from '@xylabs/object-model'
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
JsonArray, JsonObject, JsonValue,
|
|
3
|
+
} from './JsonObject.ts'
|
|
4
|
+
|
|
5
|
+
export const toSafeJsonArray = (value: unknown[], cycleList?: unknown[], maxDepth = 3): JsonArray => {
|
|
6
|
+
return value.map(item => toSafeJsonValue(item, cycleList, maxDepth))
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const toSafeJsonObject = (value: object, cycleList?: unknown[], maxDepth = 3): JsonObject => {
|
|
10
|
+
const result: JsonObject = {}
|
|
11
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
12
|
+
result[key] = value === undefined ? '[Undefined]' : toSafeJsonValue(entry, cycleList, maxDepth)
|
|
13
|
+
}
|
|
14
|
+
return result
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const toSafeJsonValue = (value: unknown, cycleList?: unknown[], maxDepth = 3): JsonValue => {
|
|
18
|
+
if (maxDepth <= 0 && typeof value === 'object') {
|
|
19
|
+
return '[MaxDepth]'
|
|
20
|
+
}
|
|
21
|
+
if (cycleList?.includes(value)) {
|
|
22
|
+
return '[Circular]'
|
|
23
|
+
}
|
|
24
|
+
switch (typeof value) {
|
|
25
|
+
case 'string':
|
|
26
|
+
case 'boolean':
|
|
27
|
+
case 'number': {
|
|
28
|
+
return value
|
|
29
|
+
}
|
|
30
|
+
case 'object': {
|
|
31
|
+
if (value === null) {
|
|
32
|
+
return null
|
|
33
|
+
}
|
|
34
|
+
const newCycleList = cycleList ?? []
|
|
35
|
+
newCycleList.push(value)
|
|
36
|
+
return Array.isArray(value) ? toSafeJsonArray(value, newCycleList, maxDepth - 1) : toSafeJsonObject(value, newCycleList, maxDepth - 1)
|
|
37
|
+
}
|
|
38
|
+
default: {
|
|
39
|
+
return `[${typeof value}]`
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const toSafeJsonString = (value: unknown, maxDepth = 3) => {
|
|
45
|
+
return JSON.stringify(toSafeJson(value, maxDepth), null, 2)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const toSafeJson = (value: unknown, maxDepth = 3): JsonValue => {
|
|
49
|
+
return toSafeJsonValue(value, undefined, maxDepth)
|
|
50
|
+
}
|
package/dist/neutral/toJson.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { JsonArray, JsonObject, JsonValue } from './JsonObject.ts';
|
|
2
|
-
export declare const toJsonArray: (value: unknown[], cycleList?: unknown[], maxDepth?: number) => JsonArray;
|
|
3
|
-
export declare const toJsonObject: (value: object, cycleList?: unknown[], maxDepth?: number) => JsonObject;
|
|
4
|
-
export declare const toJsonValue: (value: unknown, cycleList?: unknown[], maxDepth?: number) => JsonValue;
|
|
5
|
-
export declare const toJsonString: (value: unknown, maxDepth?: number) => string;
|
|
6
|
-
export declare const toJson: (value: unknown, maxDepth?: number) => JsonValue;
|
|
7
|
-
//# sourceMappingURL=toJson.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toJson.d.ts","sourceRoot":"","sources":["../../src/toJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAAE,UAAU,EAAE,SAAS,EACjC,MAAM,iBAAiB,CAAA;AAExB,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,EAAE,EAAE,YAAY,OAAO,EAAE,EAAE,iBAAY,KAAG,SAEnF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,EAAE,YAAY,OAAO,EAAE,EAAE,iBAAY,KAAG,UAMjF,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,EAAE,YAAY,OAAO,EAAE,EAAE,iBAAY,KAAG,SAyBjF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,EAAE,iBAAY,WAExD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,EAAE,iBAAY,KAAG,SAErD,CAAA"}
|
package/src/toJson.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
JsonArray, JsonObject, JsonValue,
|
|
3
|
-
} from './JsonObject.ts'
|
|
4
|
-
|
|
5
|
-
export const toJsonArray = (value: unknown[], cycleList?: unknown[], maxDepth = 3): JsonArray => {
|
|
6
|
-
return value.map(item => toJsonValue(item, cycleList, maxDepth))
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const toJsonObject = (value: object, cycleList?: unknown[], maxDepth = 3): JsonObject => {
|
|
10
|
-
const result: JsonObject = {}
|
|
11
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
12
|
-
result[key] = value === undefined ? '[Undefined]' : toJsonValue(entry, cycleList, maxDepth)
|
|
13
|
-
}
|
|
14
|
-
return result
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const toJsonValue = (value: unknown, cycleList?: unknown[], maxDepth = 3): JsonValue => {
|
|
18
|
-
if (maxDepth <= 0 && typeof value === 'object') {
|
|
19
|
-
return '[MaxDepth]'
|
|
20
|
-
}
|
|
21
|
-
if (cycleList?.includes(value)) {
|
|
22
|
-
return '[Circular]'
|
|
23
|
-
}
|
|
24
|
-
switch (typeof value) {
|
|
25
|
-
case 'string':
|
|
26
|
-
case 'boolean':
|
|
27
|
-
case 'number': {
|
|
28
|
-
return value
|
|
29
|
-
}
|
|
30
|
-
case 'object': {
|
|
31
|
-
if (value === null) {
|
|
32
|
-
return null
|
|
33
|
-
}
|
|
34
|
-
const newCycleList = cycleList ?? []
|
|
35
|
-
newCycleList.push(value)
|
|
36
|
-
return Array.isArray(value) ? toJsonArray(value, newCycleList, maxDepth - 1) : toJsonObject(value, newCycleList, maxDepth - 1)
|
|
37
|
-
}
|
|
38
|
-
default: {
|
|
39
|
-
return `[${typeof value}]`
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export const toJsonString = (value: unknown, maxDepth = 3) => {
|
|
45
|
-
return JSON.stringify(toJson(value, maxDepth), null, 2)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export const toJson = (value: unknown, maxDepth = 3): JsonValue => {
|
|
49
|
-
return toJsonValue(value, undefined, maxDepth)
|
|
50
|
-
}
|