@verdant-web/common 2.0.3 → 2.1.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.
Files changed (39) hide show
  1. package/dist/cjs/schema/defaults.test.js +16 -3
  2. package/dist/cjs/schema/defaults.test.js.map +1 -1
  3. package/dist/cjs/schema/fieldHelpers.d.ts +35 -0
  4. package/dist/cjs/schema/fieldHelpers.js +38 -0
  5. package/dist/cjs/schema/fieldHelpers.js.map +1 -0
  6. package/dist/cjs/schema/fields.js +13 -2
  7. package/dist/cjs/schema/fields.js.map +1 -1
  8. package/dist/cjs/schema/index.d.ts +44 -0
  9. package/dist/cjs/schema/index.js +10 -0
  10. package/dist/cjs/schema/index.js.map +1 -1
  11. package/dist/cjs/schema/types/compounds.d.ts +1 -1
  12. package/dist/cjs/schema/types/fields.d.ts +9 -8
  13. package/dist/cjs/schema/types/shapes.d.ts +5 -2
  14. package/dist/cjs/schema/validation.js.map +1 -1
  15. package/dist/esm/schema/defaults.test.js +16 -3
  16. package/dist/esm/schema/defaults.test.js.map +1 -1
  17. package/dist/esm/schema/fieldHelpers.d.ts +35 -0
  18. package/dist/esm/schema/fieldHelpers.js +35 -0
  19. package/dist/esm/schema/fieldHelpers.js.map +1 -0
  20. package/dist/esm/schema/fields.js +13 -2
  21. package/dist/esm/schema/fields.js.map +1 -1
  22. package/dist/esm/schema/index.d.ts +44 -0
  23. package/dist/esm/schema/index.js +7 -0
  24. package/dist/esm/schema/index.js.map +1 -1
  25. package/dist/esm/schema/types/compounds.d.ts +1 -1
  26. package/dist/esm/schema/types/fields.d.ts +9 -8
  27. package/dist/esm/schema/types/shapes.d.ts +5 -2
  28. package/dist/esm/schema/validation.js.map +1 -1
  29. package/dist/tsconfig-cjs.tsbuildinfo +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +1 -1
  32. package/src/schema/defaults.test.ts +18 -4
  33. package/src/schema/fieldHelpers.ts +106 -0
  34. package/src/schema/fields.ts +23 -3
  35. package/src/schema/index.ts +7 -0
  36. package/src/schema/types/compounds.ts +2 -2
  37. package/src/schema/types/fields.ts +15 -13
  38. package/src/schema/types/shapes.ts +9 -5
  39. package/src/schema/validation.ts +8 -2
@@ -21,19 +21,21 @@ export type StorageBooleanFieldSchema = {
21
21
  /** @deprecated - add an index to indexes with this field name. */
22
22
  indexed?: boolean;
23
23
  };
24
- export type StorageArrayFieldSchema = {
24
+ export type StorageArrayFieldSchema<TItems extends NestedStorageFieldSchema> = {
25
25
  type: 'array';
26
- items: NestedStorageFieldSchema;
26
+ items: TItems;
27
27
  nullable?: boolean;
28
28
  };
29
- export type StorageObjectFieldSchema = {
30
- type: 'object';
31
- properties: NestedStorageFieldsSchema;
32
- nullable?: boolean;
33
- };
34
- export type StorageAnyFieldSchema = {
29
+ export type StorageObjectFieldSchema<Props extends NestedStorageFieldsSchema> =
30
+ {
31
+ type: 'object';
32
+ properties: Props;
33
+ nullable?: boolean;
34
+ default?: Record<string, any> | (() => Record<string, any>);
35
+ };
36
+ export type StorageAnyFieldSchema<TShape = any> = {
35
37
  type: 'any';
36
- default?: any;
38
+ default?: TShape;
37
39
  };
38
40
  export type StorageMapFieldSchema<V extends NestedStorageFieldSchema> = {
39
41
  type: 'map';
@@ -54,8 +56,8 @@ export type StorageFieldSchema =
54
56
  | StorageStringFieldSchema
55
57
  | StorageNumberFieldSchema
56
58
  | StorageBooleanFieldSchema
57
- | StorageArrayFieldSchema
58
- | StorageObjectFieldSchema
59
+ | StorageArrayFieldSchema<any>
60
+ | StorageObjectFieldSchema<any>
59
61
  | StorageAnyFieldSchema
60
62
  | StorageMapFieldSchema<any>
61
63
  | StorageFileFieldSchema;
@@ -81,8 +83,8 @@ export type NestedStorageFieldSchema =
81
83
  | NestedStorageStringFieldSchema
82
84
  | NestedStorageNumberFieldSchema
83
85
  | NestedStorageBooleanFieldSchema
84
- | StorageArrayFieldSchema
85
- | StorageObjectFieldSchema
86
+ | StorageArrayFieldSchema<any>
87
+ | StorageObjectFieldSchema<any>
86
88
  | StorageAnyFieldSchema
87
89
  | StorageMapFieldSchema<any>
88
90
  | StorageFileFieldSchema;
@@ -25,10 +25,10 @@ export type BaseShapeFromProperty<T extends StorageFieldSchema> =
25
25
  ? number
26
26
  : T['type'] extends 'boolean'
27
27
  ? boolean
28
- : T extends StorageArrayFieldSchema
29
- ? ShapeFromProperty<T['items']>[]
30
- : T extends StorageObjectFieldSchema
31
- ? ShapeFromFields<T['properties']>
28
+ : T extends StorageArrayFieldSchema<infer U>
29
+ ? ShapeFromProperty<U>[]
30
+ : T extends StorageObjectFieldSchema<infer U>
31
+ ? ShapeFromFields<U>
32
32
  : T extends StorageMapFieldSchema<any>
33
33
  ? Record<string, ShapeFromProperty<T['values']>>
34
34
  : T['type'] extends 'any'
@@ -65,7 +65,7 @@ type StoragePropertyIsOptional<T extends StorageFieldSchema> =
65
65
  ? true
66
66
  : false;
67
67
 
68
- type ShapeFromFieldsWithDefaults<
68
+ export type ShapeFromFieldsWithDefaults<
69
69
  T extends StorageFieldsSchema | NestedStorageFieldsSchema,
70
70
  > = {
71
71
  [K in keyof T as StoragePropertyIsOptional<T[K]> extends true
@@ -80,3 +80,7 @@ type ShapeFromFieldsWithDefaults<
80
80
  export type StorageDocumentInit<
81
81
  Collection extends StorageCollectionSchema<any, any, any>,
82
82
  > = ShapeFromFieldsWithDefaults<Collection['fields']>;
83
+
84
+ export type FieldsFromShape<Shape extends Record<string, unknown>> = {
85
+ [K in keyof Shape]: StorageFieldSchema;
86
+ };
@@ -1,7 +1,11 @@
1
1
  import { OID_KEY } from '../oids.js';
2
2
  import { isObject } from '../utils.js';
3
3
  import { hasDefault, isNullable } from './fields.js';
4
- import { StorageFieldSchema, StorageFieldsSchema } from './types.js';
4
+ import {
5
+ NestedStorageFieldsSchema,
6
+ StorageFieldSchema,
7
+ StorageFieldsSchema,
8
+ } from './types.js';
5
9
 
6
10
  export function validateEntity(
7
11
  schema: StorageFieldsSchema,
@@ -76,7 +80,9 @@ export function validateEntityField({
76
80
  } for field ${formatField(fieldPath)}, got ${value}`,
77
81
  };
78
82
  }
79
- for (const [key, subField] of Object.entries(field.properties)) {
83
+ for (const [key, subField] of Object.entries(
84
+ field.properties as NestedStorageFieldsSchema,
85
+ )) {
80
86
  // legacy -- old objects sometimes accidentally include this key
81
87
  if (key === OID_KEY) continue;
82
88
  if (value[key]) {