@naturalcycles/js-lib 15.33.3 → 15.34.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.
@@ -21,9 +21,9 @@ export declare const j: {
21
21
  unixTimestamp2000(): JsonSchemaNumberBuilder<UnixTimestamp>;
22
22
  string<T extends string = string>(): JsonSchemaStringBuilder<T>;
23
23
  isoDate(): JsonSchemaStringBuilder<IsoDate>;
24
- object<T extends AnyObject>(props: { [K in keyof T]: JsonSchemaAnyBuilder<T[K]>; }): JsonSchemaObjectBuilder<T>;
24
+ object: typeof object;
25
25
  rootObject<T extends AnyObject>(props: { [K in keyof T]: JsonSchemaAnyBuilder<T[K]>; }): JsonSchemaObjectBuilder<T>;
26
- array<ITEM = unknown>(itemSchema: JsonSchemaAnyBuilder<ITEM>): JsonSchemaArrayBuilder<ITEM>;
26
+ array<T extends JsonSchemaAnyBuilder<any>>(itemSchema: T): JsonSchemaArrayBuilder<T["infer"]>;
27
27
  tuple<T extends any[] = unknown[]>(items: JsonSchemaAnyBuilder[]): JsonSchemaTupleBuilder<T>;
28
28
  oneOf<T = unknown>(items: JsonSchemaAnyBuilder[]): JsonSchemaAnyBuilder<T, JsonSchemaOneOf<T>>;
29
29
  allOf<T = unknown>(items: JsonSchemaAnyBuilder[]): JsonSchemaAnyBuilder<T, JsonSchemaAllOf<T>>;
@@ -46,7 +46,9 @@ export declare class JsonSchemaAnyBuilder<T = unknown, SCHEMA_TYPE extends JsonS
46
46
  oneOf(schemas: JsonSchema[]): this;
47
47
  allOf(schemas: JsonSchema[]): this;
48
48
  instanceof(of: string): this;
49
- optional(optional?: boolean): this;
49
+ optional(): JsonSchemaAnyBuilder<T | undefined, JsonSchema<T | undefined>>;
50
+ optional(optional: true): JsonSchemaAnyBuilder<T | undefined, JsonSchema<T | undefined>>;
51
+ optional(optional: false): JsonSchemaAnyBuilder<Exclude<T, undefined>, JsonSchema<Exclude<T, undefined>>>;
50
52
  /**
51
53
  * Produces a "clean schema object" without methods.
52
54
  * Same as if it would be JSON.stringified.
@@ -81,6 +83,7 @@ export declare class JsonSchemaNumberBuilder<T extends number = number> extends
81
83
  unixTimestampMillis2000: () => this;
82
84
  utcOffset: () => this;
83
85
  utcOffsetHours: () => this;
86
+ branded<B extends number>(): JsonSchemaNumberBuilder<B>;
84
87
  }
85
88
  export declare class JsonSchemaStringBuilder<T extends string = string> extends JsonSchemaAnyBuilder<T, JsonSchemaString<T>> {
86
89
  constructor();
@@ -104,6 +107,7 @@ export declare class JsonSchemaStringBuilder<T extends string = string> extends
104
107
  trim: (trim?: boolean) => this;
105
108
  toLowerCase: (toLowerCase?: boolean) => this;
106
109
  toUpperCase: (toUpperCase?: boolean) => this;
110
+ branded<B extends string>(): JsonSchemaStringBuilder<B>;
107
111
  private transformModify;
108
112
  }
109
113
  export declare class JsonSchemaObjectBuilder<T extends AnyObject> extends JsonSchemaAnyBuilder<T, JsonSchemaObject<T>> {
@@ -131,3 +135,10 @@ export declare class JsonSchemaArrayBuilder<ITEM> extends JsonSchemaAnyBuilder<I
131
135
  export declare class JsonSchemaTupleBuilder<T extends any[]> extends JsonSchemaAnyBuilder<T, JsonSchemaTuple<T>> {
132
136
  constructor(items: JsonSchemaBuilder[]);
133
137
  }
138
+ declare function object<P extends Record<string, JsonSchemaAnyBuilder<any, any>>>(props: P): JsonSchemaObjectBuilder<{
139
+ [K in keyof P]: P[K] extends JsonSchemaAnyBuilder<infer U, any> ? U : never;
140
+ }>;
141
+ declare function object<T extends AnyObject>(props: {
142
+ [K in keyof T]: JsonSchemaAnyBuilder<T[K]>;
143
+ }): JsonSchemaObjectBuilder<T>;
144
+ export {};
@@ -61,9 +61,7 @@ export const j = {
61
61
  },
62
62
  // email: () => new JsonSchemaStringBuilder().email(),
63
63
  // complex types
64
- object(props) {
65
- return new JsonSchemaObjectBuilder().addProperties(props);
66
- },
64
+ object,
67
65
  rootObject(props) {
68
66
  return new JsonSchemaObjectBuilder().addProperties(props).$schemaDraft7();
69
67
  },
@@ -214,6 +212,9 @@ export class JsonSchemaNumberBuilder extends JsonSchemaAnyBuilder {
214
212
  unixTimestampMillis2000 = () => this.format('unixTimestampMillis2000').description('UnixTimestampMillis2000');
215
213
  utcOffset = () => this.format('utcOffset');
216
214
  utcOffsetHours = () => this.format('utcOffsetHours');
215
+ branded() {
216
+ return this;
217
+ }
217
218
  }
218
219
  export class JsonSchemaStringBuilder extends JsonSchemaAnyBuilder {
219
220
  constructor() {
@@ -256,6 +257,9 @@ export class JsonSchemaStringBuilder extends JsonSchemaAnyBuilder {
256
257
  trim = (trim = true) => this.transformModify('trim', trim);
257
258
  toLowerCase = (toLowerCase = true) => this.transformModify('toLowerCase', toLowerCase);
258
259
  toUpperCase = (toUpperCase = true) => this.transformModify('toUpperCase', toUpperCase);
260
+ branded() {
261
+ return this;
262
+ }
259
263
  transformModify(t, add) {
260
264
  if (add) {
261
265
  this.schema.transform = _uniq([...(this.schema.transform || []), t]);
@@ -357,3 +361,6 @@ export class JsonSchemaTupleBuilder extends JsonSchemaAnyBuilder {
357
361
  });
358
362
  }
359
363
  }
364
+ function object(props) {
365
+ return new JsonSchemaObjectBuilder().addProperties(props);
366
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/js-lib",
3
3
  "type": "module",
4
- "version": "15.33.3",
4
+ "version": "15.34.0",
5
5
  "dependencies": {
6
6
  "tslib": "^2",
7
7
  "undici": "^7",
@@ -86,18 +86,14 @@ export const j = {
86
86
  },
87
87
  // email: () => new JsonSchemaStringBuilder().email(),
88
88
  // complex types
89
- object<T extends AnyObject>(props: {
90
- [K in keyof T]: JsonSchemaAnyBuilder<T[K]>
91
- }) {
92
- return new JsonSchemaObjectBuilder<T>().addProperties(props)
93
- },
89
+ object,
94
90
  rootObject<T extends AnyObject>(props: {
95
91
  [K in keyof T]: JsonSchemaAnyBuilder<T[K]>
96
92
  }) {
97
93
  return new JsonSchemaObjectBuilder<T>().addProperties(props).$schemaDraft7()
98
94
  },
99
- array<ITEM = unknown>(itemSchema: JsonSchemaAnyBuilder<ITEM>) {
100
- return new JsonSchemaArrayBuilder<ITEM>(itemSchema)
95
+ array<T extends JsonSchemaAnyBuilder<any>>(itemSchema: T) {
96
+ return new JsonSchemaArrayBuilder<T['infer']>(itemSchema)
101
97
  },
102
98
  tuple<T extends any[] = unknown[]>(items: JsonSchemaAnyBuilder[]) {
103
99
  return new JsonSchemaTupleBuilder<T>(items)
@@ -181,7 +177,12 @@ export class JsonSchemaAnyBuilder<T = unknown, SCHEMA_TYPE extends JsonSchema<T>
181
177
  return this
182
178
  }
183
179
 
184
- optional(optional = true): this {
180
+ optional(): JsonSchemaAnyBuilder<T | undefined, JsonSchema<T | undefined>>
181
+ optional(optional: true): JsonSchemaAnyBuilder<T | undefined, JsonSchema<T | undefined>>
182
+ optional(
183
+ optional: false,
184
+ ): JsonSchemaAnyBuilder<Exclude<T, undefined>, JsonSchema<Exclude<T, undefined>>>
185
+ optional(optional = true): JsonSchemaAnyBuilder<any, JsonSchema<any>> {
185
186
  if (optional) {
186
187
  this.schema.optionalField = true
187
188
  } else {
@@ -275,6 +276,10 @@ export class JsonSchemaNumberBuilder<T extends number = number> extends JsonSche
275
276
 
276
277
  utcOffset = (): this => this.format('utcOffset')
277
278
  utcOffsetHours = (): this => this.format('utcOffsetHours')
279
+
280
+ branded<B extends number>(): JsonSchemaNumberBuilder<B> {
281
+ return this as unknown as JsonSchemaNumberBuilder<B>
282
+ }
278
283
  }
279
284
 
280
285
  export class JsonSchemaStringBuilder<T extends string = string> extends JsonSchemaAnyBuilder<
@@ -329,6 +334,10 @@ export class JsonSchemaStringBuilder<T extends string = string> extends JsonSche
329
334
  toLowerCase = (toLowerCase = true): this => this.transformModify('toLowerCase', toLowerCase)
330
335
  toUpperCase = (toUpperCase = true): this => this.transformModify('toUpperCase', toUpperCase)
331
336
 
337
+ branded<B extends string>(): JsonSchemaStringBuilder<B> {
338
+ return this as unknown as JsonSchemaStringBuilder<B>
339
+ }
340
+
332
341
  private transformModify(t: 'trim' | 'toLowerCase' | 'toUpperCase', add: boolean): this {
333
342
  if (add) {
334
343
  this.schema.transform = _uniq([...(this.schema.transform || []), t])
@@ -457,3 +466,21 @@ export class JsonSchemaTupleBuilder<T extends any[]> extends JsonSchemaAnyBuilde
457
466
  })
458
467
  }
459
468
  }
469
+
470
+ // TODO and Notes
471
+ // The issue is that in `j` we mix two approaches:
472
+ // 1) the builder driven approach
473
+ // 2) the type driven approach.
474
+
475
+ function object<P extends Record<string, JsonSchemaAnyBuilder<any, any>>>(
476
+ props: P,
477
+ ): JsonSchemaObjectBuilder<{
478
+ [K in keyof P]: P[K] extends JsonSchemaAnyBuilder<infer U, any> ? U : never
479
+ }>
480
+ function object<T extends AnyObject>(props: {
481
+ [K in keyof T]: JsonSchemaAnyBuilder<T[K]>
482
+ }): JsonSchemaObjectBuilder<T>
483
+
484
+ function object(props: any): any {
485
+ return new JsonSchemaObjectBuilder<any>().addProperties(props)
486
+ }