@webda/models 0.0.0-stage → 4.0.0-beta.3

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 (51) hide show
  1. package/LICENSE +166 -0
  2. package/README.md +146 -2
  3. package/lib/index.d.ts +11 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +11 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/mock.d.ts +72 -0
  8. package/lib/mock.d.ts.map +1 -0
  9. package/lib/mock.js +83 -0
  10. package/lib/mock.js.map +1 -0
  11. package/lib/model.model.d.ts +247 -0
  12. package/lib/model.model.d.ts.map +1 -0
  13. package/lib/model.model.js +277 -0
  14. package/lib/model.model.js.map +1 -0
  15. package/lib/relations.d.ts +705 -0
  16. package/lib/relations.d.ts.map +1 -0
  17. package/lib/relations.js +938 -0
  18. package/lib/relations.js.map +1 -0
  19. package/lib/repositories/abstract.d.ts +124 -0
  20. package/lib/repositories/abstract.d.ts.map +1 -0
  21. package/lib/repositories/abstract.js +249 -0
  22. package/lib/repositories/abstract.js.map +1 -0
  23. package/lib/repositories/conformance.d.ts +40 -0
  24. package/lib/repositories/conformance.d.ts.map +1 -0
  25. package/lib/repositories/conformance.js +38 -0
  26. package/lib/repositories/conformance.js.map +1 -0
  27. package/lib/repositories/event.d.ts +100 -0
  28. package/lib/repositories/event.d.ts.map +1 -0
  29. package/lib/repositories/event.js +226 -0
  30. package/lib/repositories/event.js.map +1 -0
  31. package/lib/repositories/hooks.d.ts +88 -0
  32. package/lib/repositories/hooks.d.ts.map +1 -0
  33. package/lib/repositories/hooks.js +105 -0
  34. package/lib/repositories/hooks.js.map +1 -0
  35. package/lib/repositories/memory.d.ts +208 -0
  36. package/lib/repositories/memory.d.ts.map +1 -0
  37. package/lib/repositories/memory.js +446 -0
  38. package/lib/repositories/memory.js.map +1 -0
  39. package/lib/repositories/repository.d.ts +238 -0
  40. package/lib/repositories/repository.d.ts.map +1 -0
  41. package/lib/repositories/repository.js +19 -0
  42. package/lib/repositories/repository.js.map +1 -0
  43. package/lib/storable.d.ts +200 -0
  44. package/lib/storable.d.ts.map +1 -0
  45. package/lib/storable.js +66 -0
  46. package/lib/storable.js.map +1 -0
  47. package/lib/types.d.ts +230 -0
  48. package/lib/types.d.ts.map +1 -0
  49. package/lib/types.js +12 -0
  50. package/lib/types.js.map +1 -0
  51. package/package.json +60 -3
@@ -0,0 +1,238 @@
1
+ import type { ArrayElement } from "@webda/tsc-esm";
2
+ import type { QueryParameters, WebdaQLString } from "@webda/ql";
3
+ import type { PrimaryKey, PrimaryKeyType, SettablePrimaryKey, WEBDA_EVENTS, ModelClass, PrimaryKeyAttributes } from "../storable.js";
4
+ import type { Helpers, JSONed, NumericPropertyPaths, PropertyPaths, PropertyPathType } from "../types.js";
5
+ import type { ModelRefWithCreate } from "../relations.js";
6
+ /** Symbol key for test utilities on a repository (e.g. `clear()`). */
7
+ export declare const WEBDA_TEST: unique symbol;
8
+ /**
9
+ * Core repository interface - every repository must implement this
10
+ *
11
+ * Contains only the essential CRUD operations that work across
12
+ * all storage backends (SQL, NoSQL, in-memory, etc.)
13
+ */
14
+ export interface CoreRepository<T extends ModelClass = ModelClass> {
15
+ /**
16
+ * Get the root model class for this repository
17
+ * @returns
18
+ */
19
+ getRootModel(): T;
20
+ /**
21
+ * In REST API, composite keys are represented as a string with the format "key1#key2#key3"
22
+ * We need a way to convert this string to the object
23
+ *
24
+ * @param uid serialized primary key
25
+ * @param forceObject if true, the result will be an object with the primary key fields
26
+ */
27
+ fromUID(uid: string, forceObject?: boolean): ModelRefWithCreate<InstanceType<T>>;
28
+ /**
29
+ * Parse the UID into the primary key
30
+ * @param uid
31
+ * @param forceObject
32
+ */
33
+ parseUID(uid: string, forceObject?: boolean): PrimaryKeyType<InstanceType<T>> | PrimaryKey<InstanceType<T>>;
34
+ /**
35
+ * Extract the primary key from the object
36
+ * @param object to extract the primary key from
37
+ * @param forceObject if true, the result will be an object with the primary key fields
38
+ */
39
+ getPrimaryKey<K>(object: any, forceObject?: boolean): K extends false ? PrimaryKeyType<InstanceType<T>> : PrimaryKey<InstanceType<T>>;
40
+ /**
41
+ * Get the UID of the object
42
+ * @param object to extract the primary key from
43
+ */
44
+ getUID(object: any): string;
45
+ /**
46
+ * Remove the primary key from the object
47
+ * @param object
48
+ */
49
+ excludePrimaryKey(object: any): any;
50
+ /**
51
+ * Refers to the object in the store
52
+ * @param pk primary key
53
+ */
54
+ ref(pk: SettablePrimaryKey<InstanceType<T>>): ModelRefWithCreate<InstanceType<T>>;
55
+ /**
56
+ * Get data from the store
57
+ * @param primaryKey
58
+ * @returns
59
+ */
60
+ get(primaryKey: PrimaryKeyType<InstanceType<T>>): Promise<Helpers<InstanceType<T>>>;
61
+ /**
62
+ * Create data in the store
63
+ * @param data
64
+ * @param save if false, create in-memory object without saving
65
+ * @returns
66
+ */
67
+ create(data: Helpers<InstanceType<T>>, save?: boolean): Promise<InstanceType<T>>;
68
+ /**
69
+ * Delete data from the store
70
+ * @param uid - Primary key or UID string
71
+ * @param conditionField - Field to check for condition (optional)
72
+ * @param condition - Value to check for condition (optional)
73
+ * @returns
74
+ */
75
+ delete<K extends PropertyPaths<InstanceType<T>>>(uid: PrimaryKeyType<InstanceType<T>> | string, conditionField?: K | null, condition?: PropertyPathType<InstanceType<T>, K> | JSONed<PropertyPathType<InstanceType<T>, K>>): Promise<void>;
76
+ /**
77
+ * Verify if the object exists
78
+ * @param uid
79
+ * @returns
80
+ */
81
+ exists(uid: PrimaryKeyType<InstanceType<T>> | string): Promise<boolean>;
82
+ /**
83
+ * Query the store
84
+ * @param query - the WebdaQL query, optionally with `?` or `:name` placeholders
85
+ * @param params - values for the placeholders: an array for `?`, an object for `:name`
86
+ * @returns
87
+ */
88
+ query(query: WebdaQLString<InstanceType<T>>, params?: QueryParameters): Promise<{
89
+ results: InstanceType<T>[];
90
+ continuationToken?: string;
91
+ }>;
92
+ /**
93
+ * Iterate over the store
94
+ * @param query - the WebdaQL query, optionally with `?` or `:name` placeholders
95
+ * @param params - values for the placeholders: an array for `?`, an object for `:name`
96
+ * @returns
97
+ */
98
+ iterate(query: WebdaQLString<InstanceType<T>>, params?: QueryParameters): AsyncGenerator<InstanceType<T>>;
99
+ /**
100
+ * Event listeners
101
+ */
102
+ on<K extends keyof InstanceType<T>[typeof WEBDA_EVENTS]>(event: K, listener: (data: InstanceType<T>[typeof WEBDA_EVENTS][K]) => void): void;
103
+ once<K extends keyof InstanceType<T>[typeof WEBDA_EVENTS]>(event: K, listener: (data: InstanceType<T>[typeof WEBDA_EVENTS][K]) => void): void;
104
+ off<K extends keyof InstanceType<T>[typeof WEBDA_EVENTS]>(event: K, listener: (data: InstanceType<T>[typeof WEBDA_EVENTS][K]) => void): void;
105
+ emit<K extends keyof InstanceType<T>[typeof WEBDA_EVENTS]>(event: K, payload: InstanceType<T>[typeof WEBDA_EVENTS][K]): Promise<void>;
106
+ [WEBDA_TEST]?: {
107
+ clear(): Promise<void>;
108
+ };
109
+ }
110
+ /**
111
+ * Update operations with optimistic locking support
112
+ *
113
+ * Most repositories should implement this to support updates
114
+ */
115
+ export interface Updatable<T extends ModelClass = ModelClass> {
116
+ /**
117
+ * Replace entire object (full update)
118
+ * @param data - Complete object data including primary key
119
+ * @param conditionField - Field to check for optimistic locking (null = no check)
120
+ * @param condition - Expected value for condition field
121
+ */
122
+ update<K extends PropertyPaths<InstanceType<T>>>(data: Helpers<InstanceType<T>>, conditionField?: K | null, condition?: PropertyPathType<InstanceType<T>, K>): Promise<void>;
123
+ /**
124
+ * Partially update object (only specified fields)
125
+ * @param uid - Primary key of object to update
126
+ * @param data - Partial object data (only fields to update)
127
+ * @param conditionField - Field to check for optimistic locking (null = no check)
128
+ * @param condition - Expected value for condition field
129
+ */
130
+ patch<K extends PropertyPaths<InstanceType<T>>>(uid: PrimaryKeyType<InstanceType<T>> | string, data: Partial<Omit<InstanceType<T>, PrimaryKeyAttributes<InstanceType<T>>>>, conditionField?: K | null, condition?: PropertyPathType<InstanceType<T>, K> | JSONed<PropertyPathType<InstanceType<T>, K>>): Promise<void>;
131
+ /**
132
+ * Create or update object (insert if not exists, update if exists)
133
+ */
134
+ upsert(data: Helpers<InstanceType<T>>): Promise<InstanceType<T>>;
135
+ }
136
+ /**
137
+ * Atomic operations for NoSQL databases
138
+ *
139
+ * Only implement this for storage backends that support atomic updates
140
+ * (DynamoDB, MongoDB, Redis, etc.)
141
+ *
142
+ * SQL databases should NOT implement this - use transactions instead
143
+ */
144
+ export interface AtomicOperations<T extends ModelClass = ModelClass> {
145
+ /**
146
+ * Atomically increment numeric field(s)
147
+ * @param primaryKeyOrUid - Primary key of object to update
148
+ * @param info - Fields to increment with optional values (default: 1)
149
+ * @param conditionField - Field to check for condition
150
+ * @param condition - Expected value for condition field
151
+ */
152
+ incrementAttributes<K extends PropertyPaths<InstanceType<T>>, L extends NumericPropertyPaths<InstanceType<T>>>(primaryKeyOrUid: PrimaryKeyType<InstanceType<T>> | string, info: ({
153
+ property: L;
154
+ value?: number;
155
+ } | L)[] | Record<L, number>, conditionField?: K | null, condition?: PropertyPathType<InstanceType<T>, K> | JSONed<PropertyPathType<InstanceType<T>, K>>): Promise<void>;
156
+ /**
157
+ * Atomically increment a single numeric field
158
+ * @param primaryKeyOrUid - Primary key of object to update
159
+ * @param info - Field to increment with optional value (default: 1)
160
+ * @param conditionField - Field to check for condition
161
+ * @param condition - Expected value for condition field
162
+ */
163
+ incrementAttribute<K extends PropertyPaths<InstanceType<T>>, L extends NumericPropertyPaths<InstanceType<T>>>(primaryKeyOrUid: PrimaryKeyType<InstanceType<T>> | string, info: {
164
+ property: L;
165
+ value?: number;
166
+ } | L, conditionField?: K | null, condition?: PropertyPathType<InstanceType<T>, K> | JSONed<PropertyPathType<InstanceType<T>, K>>): Promise<void>;
167
+ /**
168
+ * Atomically set a single attribute value
169
+ * @param primaryKeyOrUid - Primary key of object to update
170
+ * @param attribute - Attribute name to set
171
+ * @param value - New value for attribute
172
+ * @param conditionField - Field to check for condition
173
+ * @param condition - Expected value for condition field
174
+ */
175
+ setAttribute<K extends PropertyPaths<InstanceType<T>>, L extends PropertyPaths<InstanceType<T>>>(primaryKeyOrUid: PrimaryKeyType<InstanceType<T>> | string, attribute: K, value: PropertyPathType<InstanceType<T>, K>, conditionField?: L | null, condition?: PropertyPathType<InstanceType<T>, L> | JSONed<PropertyPathType<InstanceType<T>, L>>): Promise<void>;
176
+ /**
177
+ * Atomically remove an attribute
178
+ * @param primaryKeyOrUid - Primary key of object to update
179
+ * @param attribute - Attribute name to remove
180
+ * @param conditionField - Field to check for condition
181
+ * @param condition - Expected value for condition field
182
+ */
183
+ removeAttribute<L extends PropertyPaths<InstanceType<T>>, K extends PropertyPaths<InstanceType<T>>>(primaryKeyOrUid: PrimaryKeyType<InstanceType<T>> | string, attribute: K, conditionField?: L | null, condition?: PropertyPathType<InstanceType<T>, L> | JSONed<PropertyPathType<InstanceType<T>, L>>): Promise<void>;
184
+ }
185
+ /**
186
+ * Collection operations for nested arrays
187
+ *
188
+ * Only implement this for storage backends that support atomic array operations
189
+ * (DynamoDB, MongoDB, etc.)
190
+ */
191
+ export interface CollectionOperations<T extends ModelClass = ModelClass> {
192
+ /**
193
+ * Add or update item in a collection (array field)
194
+ * @param primaryKeyOrUid - Primary key of object containing the collection
195
+ * @param collection - Name of the array field
196
+ * @param item - Item to add/update
197
+ * @param index - Position to insert (undefined = append to end)
198
+ * @param itemWriteConditionField - Field to check for condition on item
199
+ * @param itemWriteCondition - Expected value for condition field on item
200
+ */
201
+ upsertItemToCollection<K extends Extract<PropertyPaths<InstanceType<T>, any[]>, keyof InstanceType<T>>, L extends keyof ArrayElement<InstanceType<T>[K]>>(primaryKeyOrUid: PrimaryKeyType<InstanceType<T>> | string, collection: K, item: ArrayElement<InstanceType<T>[K]> | JSONed<ArrayElement<InstanceType<T>[K]>>, index?: number, itemWriteConditionField?: ArrayElement<InstanceType<T>[K]> extends object ? L : never, itemWriteCondition?: ArrayElement<InstanceType<T>[K]> extends object ? ArrayElement<InstanceType<T>[K]>[L] : ArrayElement<InstanceType<T>[K]> | null): Promise<void>;
202
+ /**
203
+ * Remove item from a collection by index
204
+ * @param primaryKeyOrUid - Primary key of object containing the collection
205
+ * @param collection - Name of the array field
206
+ * @param index - Position of item to remove
207
+ * @param itemWriteConditionField - Field to check for condition on item
208
+ * @param itemWriteCondition - Expected value for condition field on item
209
+ */
210
+ deleteItemFromCollection<K extends Extract<PropertyPaths<InstanceType<T>, any[]>, keyof InstanceType<T>>, L extends keyof ArrayElement<InstanceType<T>[K]>>(primaryKeyOrUid: PrimaryKeyType<InstanceType<T>> | string, collection: K, index: number, itemWriteConditionField?: L, itemWriteCondition?: ArrayElement<InstanceType<T>[K]>[L]): Promise<void>;
211
+ }
212
+ /**
213
+ * Type guard to check if repository supports atomic operations
214
+ * @param repo - the repository to check
215
+ * @returns true if atomic operations are supported
216
+ */
217
+ export declare function supportsAtomicOperations<T extends ModelClass>(repo: CoreRepository<T>): repo is CoreRepository<T> & AtomicOperations<T>;
218
+ /**
219
+ * Type guard to check if repository supports collection operations
220
+ * @param repo - the repository to check
221
+ * @returns true if collection operations are supported
222
+ */
223
+ export declare function supportsCollectionOperations<T extends ModelClass>(repo: CoreRepository<T>): repo is CoreRepository<T> & CollectionOperations<T>;
224
+ /**
225
+ * Full-featured repository combining all capabilities (backward compatible)
226
+ *
227
+ * This is the main interface that most code will interact with.
228
+ * It extends all specialized interfaces for backward compatibility.
229
+ *
230
+ * Note: All methods are inherited from:
231
+ * - CoreRepository: Basic CRUD, query, and key management
232
+ * - Updatable: Update, patch, and upsert operations
233
+ * - AtomicOperations: Atomic increment, setAttribute, removeAttribute
234
+ * - CollectionOperations: Array/collection manipulation
235
+ */
236
+ export interface Repository<T extends ModelClass = ModelClass> extends CoreRepository<T>, Updatable<T>, AtomicOperations<T>, CollectionOperations<T> {
237
+ }
238
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repositories/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Symbol key for test utilities on a repository (e.g. `clear()`). */
2
+ export const WEBDA_TEST = Symbol("webda_test");
3
+ /**
4
+ * Type guard to check if repository supports atomic operations
5
+ * @param repo - the repository to check
6
+ * @returns true if atomic operations are supported
7
+ */
8
+ export function supportsAtomicOperations(repo) {
9
+ return typeof repo.incrementAttribute === "function";
10
+ }
11
+ /**
12
+ * Type guard to check if repository supports collection operations
13
+ * @param repo - the repository to check
14
+ * @returns true if collection operations are supported
15
+ */
16
+ export function supportsCollectionOperations(repo) {
17
+ return typeof repo.upsertItemToCollection === "function";
18
+ }
19
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repositories/repository.ts"],"names":[],"mappings":"AAaA,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAyS/C;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAuB;IAEvB,OAAO,OAAQ,IAAY,CAAC,kBAAkB,KAAK,UAAU,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAAuB;IAEvB,OAAO,OAAQ,IAAY,CAAC,sBAAsB,KAAK,UAAU,CAAC;AACpE,CAAC"}
@@ -0,0 +1,200 @@
1
+ import type { FilterAttributes, IsUnion, ReadonlyKeys } from "@webda/tsc-esm";
2
+ import type { QueryParameters } from "@webda/ql";
3
+ import { WEBDA_DIRTY } from "@webda/utils";
4
+ import type { ModelRefWithCreate, ModelRelated } from "./relations.js";
5
+ import type { JSONed, Settable } from "./types.js";
6
+ /**
7
+ * Define the model primary key
8
+ */
9
+ export declare const WEBDA_PRIMARY_KEY: unique symbol;
10
+ /**
11
+ * REST API and other system may require a string representation of the primary key
12
+ * We concatenate the primary key fields with the separator '_'
13
+ *
14
+ * If one of these fields can contain a _ you can pick a different separator
15
+ */
16
+ export declare const WEBDA_PRIMARY_KEY_SEPARATOR: unique symbol;
17
+ /**
18
+ * Define the model plural key
19
+ * We might go back to a JSDoc @WebdaPlural annotation later
20
+ * @default <modelName>s
21
+ */
22
+ export declare const WEBDA_PLURAL: unique symbol;
23
+ /**
24
+ * Define the model events key
25
+ */
26
+ export declare const WEBDA_EVENTS: unique symbol;
27
+ /**
28
+ * Symbol for internal storage of model properties that require custom getters/setters (e.g. for handling multiple input types like Date).
29
+ */
30
+ export declare const WEBDA_STORAGE: unique symbol;
31
+ /**
32
+ * Define the events for the model
33
+ */
34
+ export type Eventable = {
35
+ [WEBDA_EVENTS]?: any;
36
+ };
37
+ /**
38
+ * A Storable object is an object that can be stored in a database or anywhere else
39
+ * and can be retrieved later
40
+ *
41
+ * It has a primary key, a toJSON method and an Events object
42
+ *
43
+ */
44
+ export interface Storable<T = any, PrimaryKeyProperties extends keyof T = any> extends Eventable {
45
+ /**
46
+ * Define the primary key for your model
47
+ */
48
+ [WEBDA_PRIMARY_KEY]: readonly PrimaryKeyProperties[];
49
+ /**
50
+ * Define the separator to use when concatenating primary key fields (for UUID generation)
51
+ */
52
+ [WEBDA_PRIMARY_KEY_SEPARATOR]?: string;
53
+ /**
54
+ * Define the plural for your model
55
+ */
56
+ [WEBDA_PLURAL]?: string;
57
+ /**
58
+ * Properties that are dirty and need to be saved
59
+ */
60
+ [WEBDA_DIRTY]?: Set<string>;
61
+ /**
62
+ * Return the primary key
63
+ */
64
+ getPrimaryKey(): IsUnion<PrimaryKeyProperties> extends true ? Pick<T, PrimaryKeyProperties> : T[PrimaryKeyProperties];
65
+ /**
66
+ * Return the string version of the primary key
67
+ */
68
+ getUUID(): string;
69
+ /**
70
+ * Load the serialized version of itself
71
+ */
72
+ load(params: any): this;
73
+ }
74
+ /**
75
+ * A concrete storable is a storable that has a constructor that can be used to create a new instance
76
+ */
77
+ export type ConcreteStorable<T = any, K extends keyof T = any> = Storable<T, K> & (new (arg: any) => any);
78
+ /**
79
+ * Constructor interface for Model classes.
80
+ *
81
+ * Provides static methods for CRUD operations, querying, and serialization.
82
+ */
83
+ export interface ModelClass<S extends Storable = Storable> {
84
+ new (arg: any): S;
85
+ prototype: S;
86
+ ref<T extends ModelClass>(this: T, key: SettablePrimaryKey<InstanceType<T>>): ModelRefWithCreate<InstanceType<T>>;
87
+ iterate<T extends ModelClass>(this: T, query: string, params?: QueryParameters): AsyncGenerator<InstanceType<T>, any, any>;
88
+ create<T extends ModelClass>(this: T, data: ConstructorParameters<T>[0], save?: boolean): Promise<InstanceType<T>>;
89
+ query<T extends ModelClass>(this: T, query: string, params?: QueryParameters): Promise<{
90
+ results: InstanceType<T>[];
91
+ continuationToken?: string;
92
+ }>;
93
+ registerSerializer(overwrite?: boolean, identifier?: string): void;
94
+ getDeserializers<T extends ModelClass>(): Partial<Record<keyof InstanceType<T>, (value: any) => any>> | undefined;
95
+ }
96
+ /**
97
+ * Check if the object is a Model class
98
+ * @param object - the value to check
99
+ * @returns true if it is a ModelClass
100
+ */
101
+ export declare function isModelClass(object: any): object is ModelClass;
102
+ /**
103
+ * All storable need to have a constructor that take an object as argument
104
+ */
105
+ export type StorableConstructor<T extends new (arg: any) => any = any> = new (arg: ConstructorParameters<T>[0]) => T;
106
+ /** Extract the first parameter type of a `set` method, if present. */
107
+ type FirstSetArg<X> = X extends {
108
+ set: (...args: infer A) => any;
109
+ } ? A[0] : never;
110
+ /** Resolve the accepted value type for an attribute: uses `set` arg if available, otherwise `JSONed<X> | X`. */
111
+ type AttributeValue<X> = X extends {
112
+ set: Function;
113
+ } ? FirstSetArg<X> : JSONed<X> | X;
114
+ /** Keys where the `set` method's first arg is optional or includes undefined. */
115
+ type OptionalArgKeys<T extends Storable> = {
116
+ [P in StorableAttributes<T>]-?: T[P] extends {
117
+ set: any;
118
+ } ? (undefined extends FirstSetArg<T[P]> ? P : never) : never;
119
+ }[StorableAttributes<T>];
120
+ /** Keys whose `set` arg is required (complement of OptionalArgKeys). */
121
+ type RequiredArgKeys<T extends Storable> = Exclude<StorableAttributes<T>, OptionalArgKeys<T>>;
122
+ /**
123
+ * Build the argument type for creating/updating a Storable.
124
+ *
125
+ * Properties with a required `set` arg are required; those with an optional `set` arg are optional.
126
+ */
127
+ export type AttributesArgument<T extends Storable> = {
128
+ [P in Extract<RequiredArgKeys<T>, string | number>]: AttributeValue<T[P]>;
129
+ } & {
130
+ [P in Extract<OptionalArgKeys<T>, string | number>]?: AttributeValue<T[P]>;
131
+ };
132
+ /**
133
+ * Resolve the primary key type: if T is a union of keys, returns `Pick<K, T>`;
134
+ * if T is a single key, returns `K[T]` directly.
135
+ */
136
+ export type PK<K, T extends keyof K> = IsUnion<T> extends true ? Pick<K, T> : K[T];
137
+ /**
138
+ * Get the primary key type of the object
139
+ *
140
+ * The main difference with the PrimaryKey<T> type is that if the primary key is a not union type, it will
141
+ * be returned as a single type, otherwise it will be returned as a Pick type
142
+ *
143
+ * The PrimaryKey<T> will always return a Pick type
144
+ */
145
+ export type PrimaryKeyType<T extends Storable<any, any>> = PK<T, T[typeof WEBDA_PRIMARY_KEY][number]> & {
146
+ toString(): string;
147
+ };
148
+ /**
149
+ * A widened version of PrimaryKeyType that accepts setter-compatible values.
150
+ *
151
+ * For composite keys (objects), applies Settable to widen properties that have
152
+ * a `set()` method (e.g. ModelLink accepts string).
153
+ * For single keys (string/number), returns the type as-is.
154
+ */
155
+ export type SettablePrimaryKey<T extends Storable<any, any>> = PrimaryKeyType<T> extends object ? Settable<PrimaryKeyType<T>> | PrimaryKeyType<T> : PrimaryKeyType<T>;
156
+ /**
157
+ * Get the primary key of the object
158
+ *
159
+ * The main difference with the PrimaryKeyType<T> type is that it will always return a Pick type
160
+ *
161
+ * The PrimaryKeyType<T> will return a Pick type only if the primary key is a union type
162
+ */
163
+ export type PrimaryKey<T extends Storable<any, any>> = Pick<T, T[typeof WEBDA_PRIMARY_KEY][number]> & {
164
+ toString(): string;
165
+ };
166
+ /**
167
+ * Get the primary key attributes of the object
168
+ */
169
+ export type PrimaryKeyAttributes<T extends Storable<any, any>> = keyof PrimaryKey<T>;
170
+ /**
171
+ * Compare two primary keys for equality
172
+ * @param a - the first primary key or storable
173
+ * @param b - the second primary key or storable
174
+ * @returns true if the keys are equal
175
+ */
176
+ export declare function PrimaryKeyEquals(a: PrimaryKeyType<any> | Storable, b: PrimaryKeyType<any> | Storable): boolean;
177
+ /**
178
+ * Check if the object is a Storable object
179
+ * @param object - the value to check
180
+ * @returns true if it is a Storable
181
+ */
182
+ export declare function isStorable<T = any>(object: any): object is Storable<T>;
183
+ /** Remove symbol-keyed properties from a type. */
184
+ type ExcludeSymbols<T> = {
185
+ [P in keyof T as P extends symbol ? never : P]: T[P];
186
+ };
187
+ /**
188
+ * Get the model attributes without the internal properties
189
+ *
190
+ * Used for the create method
191
+ */
192
+ export type StorableAttributes<T extends Storable, U = any> = FilterAttributes<Omit<ExcludeSymbols<T>, FilterAttributes<T, Function> | FilterAttributes<T, ModelRelated<any, any, any>> | ReadonlyKeys<T> | Extract<keyof T, symbol>>, U>;
193
+ /**
194
+ * Get the model attributes without the primary key properties
195
+ *
196
+ * Used for the update method
197
+ */
198
+ export type UpdatableAttributes<T extends Storable, U = any> = Exclude<StorableAttributes<T, U>, PrimaryKeyAttributes<T> | ReadonlyKeys<T>>;
199
+ export {};
200
+ //# sourceMappingURL=storable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storable.d.ts","sourceRoot":"","sources":["../src/storable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { WEBDA_DIRTY } from "@webda/utils";
2
+ /**
3
+ * Define the model primary key
4
+ */
5
+ export const WEBDA_PRIMARY_KEY = Symbol("Primary key");
6
+ /**
7
+ * REST API and other system may require a string representation of the primary key
8
+ * We concatenate the primary key fields with the separator '_'
9
+ *
10
+ * If one of these fields can contain a _ you can pick a different separator
11
+ */
12
+ export const WEBDA_PRIMARY_KEY_SEPARATOR = Symbol("Primary key separator");
13
+ /**
14
+ * Define the model plural key
15
+ * We might go back to a JSDoc @WebdaPlural annotation later
16
+ * @default <modelName>s
17
+ */
18
+ export const WEBDA_PLURAL = Symbol("Plural definition");
19
+ /**
20
+ * Define the model events key
21
+ */
22
+ export const WEBDA_EVENTS = Symbol("Events definition");
23
+ /**
24
+ * Symbol for internal storage of model properties that require custom getters/setters (e.g. for handling multiple input types like Date).
25
+ */
26
+ export const WEBDA_STORAGE = Symbol("Storage definition");
27
+ /**
28
+ * Check if the object is a Model class
29
+ * @param object - the value to check
30
+ * @returns true if it is a ModelClass
31
+ */
32
+ export function isModelClass(object) {
33
+ return (typeof object === "function" &&
34
+ typeof object.prototype?.getPrimaryKey === "function" &&
35
+ typeof object.getDeserializers === "function");
36
+ }
37
+ /**
38
+ * Compare two primary keys for equality
39
+ * @param a - the first primary key or storable
40
+ * @param b - the second primary key or storable
41
+ * @returns true if the keys are equal
42
+ */
43
+ export function PrimaryKeyEquals(a, b) {
44
+ if (isStorable(a)) {
45
+ a = a.getPrimaryKey();
46
+ }
47
+ if (isStorable(b)) {
48
+ b = b.getPrimaryKey();
49
+ }
50
+ if (a instanceof Object && b instanceof Object) {
51
+ return (a.constructor === b.constructor &&
52
+ Object.keys(a)
53
+ .filter(k => typeof a[k] !== "function")
54
+ .every(key => a[key] === b[key]));
55
+ }
56
+ return a === b;
57
+ }
58
+ /**
59
+ * Check if the object is a Storable object
60
+ * @param object - the value to check
61
+ * @returns true if it is a Storable
62
+ */
63
+ export function isStorable(object) {
64
+ return typeof object.getPrimaryKey === "function" && Array.isArray(object[WEBDA_PRIMARY_KEY]);
65
+ }
66
+ //# sourceMappingURL=storable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storable.js","sourceRoot":"","sources":["../src/storable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI3C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAkB,MAAM,CAAC,aAAa,CAAC,CAAC;AACtE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAkB,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAC1F;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AACvE;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,MAAM,CAAC,mBAAmB,CAAC,CAAC;AACvE;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAkB,MAAM,CAAC,oBAAoB,CAAC,CAAC;AA+EzE;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAW;IACtC,OAAO,CACL,OAAO,MAAM,KAAK,UAAU;QAC5B,OAAO,MAAM,CAAC,SAAS,EAAE,aAAa,KAAK,UAAU;QACrD,OAAO,MAAM,CAAC,gBAAgB,KAAK,UAAU,CAC9C,CAAC;AACJ,CAAC;AA8ED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAiC,EAAE,CAAiC;IACnG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC;QAC/C,OAAO,CACL,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;YAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;iBACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC;iBACvC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CACnC,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAU,MAAW;IAC7C,OAAO,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAChG,CAAC"}