@antelopejs/interface-database-decorators 0.0.2

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 (69) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +42 -0
  3. package/dist/antelope.test.d.ts +2 -0
  4. package/dist/antelope.test.js +52 -0
  5. package/dist/antelope.test.js.map +1 -0
  6. package/dist/common.d.ts +22 -0
  7. package/dist/common.js +36 -0
  8. package/dist/common.js.map +1 -0
  9. package/dist/database.d.ts +2 -0
  10. package/dist/database.js +71 -0
  11. package/dist/database.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +24 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/model.d.ts +101 -0
  16. package/dist/model.js +161 -0
  17. package/dist/model.js.map +1 -0
  18. package/dist/modifiers/common.d.ts +87 -0
  19. package/dist/modifiers/common.js +370 -0
  20. package/dist/modifiers/common.js.map +1 -0
  21. package/dist/modifiers/encryption.d.ts +37 -0
  22. package/dist/modifiers/encryption.js +79 -0
  23. package/dist/modifiers/encryption.js.map +1 -0
  24. package/dist/modifiers/hash.d.ts +41 -0
  25. package/dist/modifiers/hash.js +54 -0
  26. package/dist/modifiers/hash.js.map +1 -0
  27. package/dist/modifiers/index.d.ts +4 -0
  28. package/dist/modifiers/index.js +21 -0
  29. package/dist/modifiers/index.js.map +1 -0
  30. package/dist/modifiers/localization.d.ts +43 -0
  31. package/dist/modifiers/localization.js +57 -0
  32. package/dist/modifiers/localization.js.map +1 -0
  33. package/dist/schema.d.ts +4 -0
  34. package/dist/schema.js +21 -0
  35. package/dist/schema.js.map +1 -0
  36. package/dist/table.d.ts +53 -0
  37. package/dist/table.js +63 -0
  38. package/dist/table.js.map +1 -0
  39. package/dist/tests/common.test.d.ts +1 -0
  40. package/dist/tests/common.test.js +52 -0
  41. package/dist/tests/common.test.js.map +1 -0
  42. package/dist/tests/database.test.d.ts +1 -0
  43. package/dist/tests/database.test.js +184 -0
  44. package/dist/tests/database.test.js.map +1 -0
  45. package/dist/tests/integration.test.d.ts +1 -0
  46. package/dist/tests/integration.test.js +399 -0
  47. package/dist/tests/integration.test.js.map +1 -0
  48. package/dist/tests/model.test.d.ts +1 -0
  49. package/dist/tests/model.test.js +186 -0
  50. package/dist/tests/model.test.js.map +1 -0
  51. package/dist/tests/modifiers/common.test.d.ts +1 -0
  52. package/dist/tests/modifiers/common.test.js +165 -0
  53. package/dist/tests/modifiers/common.test.js.map +1 -0
  54. package/dist/tests/modifiers/encryption.test.d.ts +1 -0
  55. package/dist/tests/modifiers/encryption.test.js +161 -0
  56. package/dist/tests/modifiers/encryption.test.js.map +1 -0
  57. package/dist/tests/modifiers/hash.test.d.ts +1 -0
  58. package/dist/tests/modifiers/hash.test.js +126 -0
  59. package/dist/tests/modifiers/hash.test.js.map +1 -0
  60. package/dist/tests/modifiers/localization.test.d.ts +1 -0
  61. package/dist/tests/modifiers/localization.test.js +175 -0
  62. package/dist/tests/modifiers/localization.test.js.map +1 -0
  63. package/dist/tests/schema.test.d.ts +1 -0
  64. package/dist/tests/schema.test.js +102 -0
  65. package/dist/tests/schema.test.js.map +1 -0
  66. package/dist/tests/table.test.d.ts +1 -0
  67. package/dist/tests/table.test.js +112 -0
  68. package/dist/tests/table.test.js.map +1 -0
  69. package/package.json +101 -0
package/dist/model.js ADDED
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Model = void 0;
7
+ exports.BasicDataModel = BasicDataModel;
8
+ exports.GetModel = GetModel;
9
+ const node_assert_1 = __importDefault(require("node:assert"));
10
+ const interface_api_1 = require("@antelopejs/interface-api");
11
+ const decorators_1 = require("@antelopejs/interface-core/decorators");
12
+ const interface_database_1 = require("@antelopejs/interface-database");
13
+ const common_1 = require("./common");
14
+ const common_2 = require("./modifiers/common");
15
+ /**
16
+ * Utility Class factory to create a basic Data Model with 1 table.
17
+ *
18
+ * @param dataType Database Table class
19
+ * @param tableName Table name in Database
20
+ */
21
+ function BasicDataModel(dataType, tableName) {
22
+ const metadata = (0, common_1.getMetadata)(dataType, common_1.DatumStaticMetadata);
23
+ const resolvedName = tableName ?? metadata.tableName;
24
+ (0, node_assert_1.default)(resolvedName, "tableName must be provided or set via @RegisterTable");
25
+ const name = resolvedName;
26
+ const schemaName = metadata.schemaName;
27
+ const primaryKey = metadata.primary;
28
+ return class Model {
29
+ database;
30
+ static schemaName = schemaName;
31
+ /**
32
+ * Converts some plain data into an instance of the Table class.
33
+ *
34
+ * @param obj Plain data object containing the table fields
35
+ * @returns Table class instance
36
+ */
37
+ static fromPlainData(obj) {
38
+ return obj instanceof dataType ? obj : (0, common_2.fromPlainData)(obj, dataType);
39
+ }
40
+ /**
41
+ * Converts an object acquired from the database into a Table class instance.
42
+ *
43
+ * @param obj Object resulting from a database get
44
+ * @returns Table class instance
45
+ */
46
+ static fromDatabase(obj) {
47
+ return obj ? (0, common_2.fromDatabase)(obj, dataType) : undefined;
48
+ }
49
+ /**
50
+ * Converts a Table class instance into an object fit to be inserted in the database.
51
+ *
52
+ * @param obj Table class instance
53
+ * @returns Database-ready data
54
+ */
55
+ static toDatabase(obj) {
56
+ const instance = obj instanceof dataType ? obj : Model.fromPlainData(obj);
57
+ return (0, common_2.toDatabase)(instance);
58
+ }
59
+ /**
60
+ * AQL Table reference.
61
+ */
62
+ table;
63
+ constructor(database) {
64
+ this.database = database;
65
+ this.table = database.table(name);
66
+ }
67
+ /**
68
+ * Get a single element from the table using its primary key.
69
+ *
70
+ * @param id Primary key value
71
+ * @returns Table class instance
72
+ */
73
+ get(id) {
74
+ return this.table.get(id).then(Model.fromDatabase);
75
+ }
76
+ /**
77
+ * Get multiple elements from the table using a given index.
78
+ *
79
+ * @param index Index name
80
+ * @param keys Index value(s)
81
+ * @returns Array of Table class instances.
82
+ */
83
+ getBy(index, ...keys) {
84
+ return this.table
85
+ .getAll(keys.length === 1 ? keys[0] : keys, index)
86
+ .then((dataR) => dataR.map(Model.fromDatabase));
87
+ }
88
+ /**
89
+ * Get all the elements from the table.
90
+ *
91
+ * @returns Array of Table class instances.
92
+ */
93
+ getAll() {
94
+ return this.table.then((dataR) => dataR.map(Model.fromDatabase));
95
+ }
96
+ /**
97
+ * Insert some data into the table.
98
+ *
99
+ * @param obj Table class instance or plain data
100
+ * @param options Insert options
101
+ * @returns Insert result
102
+ */
103
+ insert(obj) {
104
+ const converter = (entry) => {
105
+ const instance = Model.fromPlainData(entry);
106
+ (0, common_2.triggerEvent)(instance, "insert");
107
+ return Model.toDatabase(instance);
108
+ };
109
+ return this.table
110
+ .insert(Array.isArray(obj) ? obj.map(converter) : converter(obj))
111
+ .run();
112
+ }
113
+ update(obj, data) {
114
+ if (typeof obj === "string") {
115
+ const instance = Model.fromPlainData(data);
116
+ (0, common_2.triggerEvent)(instance, "update");
117
+ return this.table.get(obj).update(Model.toDatabase(instance)).run();
118
+ }
119
+ const instance = Model.fromPlainData(obj);
120
+ (0, common_2.triggerEvent)(instance, "update");
121
+ const id = obj[primaryKey];
122
+ (0, node_assert_1.default)(id !== undefined, "Missing primary key in object update.");
123
+ return this.table.get(id).update(Model.toDatabase(instance)).run();
124
+ }
125
+ /**
126
+ * Delete an element from the table.
127
+ *
128
+ * @param id Primary key value
129
+ * @returns Delete result
130
+ */
131
+ delete(id) {
132
+ return this.table.get(id).delete().run();
133
+ }
134
+ };
135
+ }
136
+ const modelCache = new Map();
137
+ function GetModel(cl, instanceId) {
138
+ if (!modelCache.has(cl)) {
139
+ modelCache.set(cl, {});
140
+ }
141
+ const cache = modelCache.get(cl) ?? {};
142
+ const cacheKey = instanceId ?? "";
143
+ if (cache[cacheKey])
144
+ return cache[cacheKey];
145
+ const schema = interface_database_1.Schema.get(cl.schemaName);
146
+ (0, node_assert_1.default)(schema, `Schema not found for '${cl.schemaName}'`);
147
+ const model = new cl(schema.instance(instanceId));
148
+ cache[cacheKey] = model;
149
+ return model;
150
+ }
151
+ exports.Model = (0, decorators_1.MakeParameterAndPropertyDecorator)((target, key, index, cl, instanceIdOrCallback) => {
152
+ if (typeof instanceIdOrCallback === "function") {
153
+ (0, interface_api_1.SetParameterProvider)(target, key, index, (ctx) => {
154
+ return GetModel(cl, instanceIdOrCallback(ctx));
155
+ });
156
+ }
157
+ else {
158
+ (0, interface_api_1.SetParameterProvider)(target, key, index, () => GetModel(cl, instanceIdOrCallback));
159
+ }
160
+ });
161
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":";;;;;;AA0CA,wCAuIC;AAID,4BAeC;AApMD,8DAAiC;AACjC,6DAGmC;AACnC,sEAG+C;AAE/C,uEAAwD;AACxD,qCAKkB;AAClB,+CAK4B;AAc5B;;;;;GAKG;AACH,SAAgB,cAAc,CAC5B,QAA0B,EAC1B,SAAkB;IAElB,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,QAAQ,EAAE,4BAAmB,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;IACrD,IAAA,qBAAM,EAAC,YAAY,EAAE,sDAAsD,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAW,YAAY,CAAC;IAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC;IACpC,OAAO,MAAM,KAAK;QAsCY;QArCrB,MAAM,CAAU,UAAU,GAAG,UAAoB,CAAC;QACzD;;;;;WAKG;QACI,MAAM,CAAC,aAAa,CAAC,GAAQ;YAClC,OAAO,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAA,sBAAa,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtE,CAAC;QAED;;;;;WAKG;QACI,MAAM,CAAC,YAAY,CAAC,GAAQ;YACjC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAA,qBAAY,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,CAAC;QAED;;;;;WAKG;QACI,MAAM,CAAC,UAAU,CAAC,GAAQ;YAC/B,MAAM,QAAQ,GAAG,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC1E,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED;;WAEG;QACa,KAAK,CAAuB;QAE5C,YAA4B,QAAyC;YAAzC,aAAQ,GAAR,QAAQ,CAAiC;YACnE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAED;;;;;WAKG;QACI,GAAG,CAAC,EAAU;YACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;QAED;;;;;;WAMG;QACI,KAAK,CAAC,KAAc,EAAE,GAAG,IAAW;YACzC,OAAO,IAAI,CAAC,KAAK;iBACd,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAU,KAAK,CAAC;iBACzD,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAQ,CAAC,CAAC;QAC3D,CAAC;QAED;;;;WAIG;QACI,MAAM;YACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAQ,CAAC,CAAC;QAC1E,CAAC;QAED;;;;;;WAMG;QACI,MAAM,CAAC,GAA2C;YACvD,MAAM,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;gBAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5C,IAAA,qBAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACjC,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC,CAAC;YACF,OAAO,IAAI,CAAC,KAAK;iBACd,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;iBAChE,GAAG,EAAE,CAAC;QACX,CAAC;QAYM,MAAM,CAAC,GAA4B,EAAE,IAAqB;YAC/D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAiB,IAAI,CAAC,CAAC;gBAC3D,IAAA,qBAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACtE,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAA,qBAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjC,MAAM,EAAE,GAAS,GAAI,CAAC,UAAU,CAAC,CAAC;YAClC,IAAA,qBAAM,EAAC,EAAE,KAAK,SAAS,EAAE,uCAAuC,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACrE,CAAC;QAED;;;;;WAKG;QACI,MAAM,CAAC,EAAU;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkD,CAAC;AAE7E,SAAgB,QAAQ,CACtB,EAAwB,EACxB,UAAmB;IAEnB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACxB,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,UAAU,IAAI,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAM,CAAC;IACjD,MAAM,MAAM,GAAG,2BAAM,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IACzC,IAAA,qBAAM,EAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAClD,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC;AAEY,QAAA,KAAK,GAAG,IAAA,8CAAiC,EACpD,CACE,MAAM,EACN,GAAG,EACH,KAAK,EACL,EAA8C,EAC9C,oBAEiD,EACjD,EAAE;IACF,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;QAC/C,IAAA,oCAAoB,EAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAmB,EAAE,EAAE;YAC/D,OAAO,QAAQ,CAAC,EAAE,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAA,oCAAoB,EAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAC5C,QAAQ,CAAC,EAAE,EAAE,oBAAoB,CAAC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,87 @@
1
+ import type * as DatabaseDev from "@antelopejs/interface-database";
2
+ import { type Constructible } from "../common";
3
+ export declare const MixinSymbol: unique symbol;
4
+ export type MixinType<T> = T extends {
5
+ [MixinSymbol]: infer A;
6
+ } ? A : never;
7
+ export declare class Modifier<Meta extends object = object, Options extends object = object> {
8
+ protected meta: Meta;
9
+ protected options: Options;
10
+ }
11
+ export declare class OneWayModifier<LockedType, Args extends any[] = [], Meta extends object = object, Options extends object = object> extends Modifier<Meta, Options> {
12
+ lock(_locked_value: LockedType | undefined, _value: unknown, ..._args: Args): LockedType;
13
+ test(locked_value: LockedType, value: unknown, ...args: Args): boolean;
14
+ }
15
+ type ProxyOrValArray<T extends any[]> = {
16
+ [K in keyof T]: DatabaseDev.ValueProxyOrValue<T[K]>;
17
+ };
18
+ export declare class TwoWayModifier<LockedType, Args extends any[] = [], Meta extends object = object, Options extends object = object> extends OneWayModifier<LockedType, Args, Meta, Options> {
19
+ unlock(_locked_value: LockedType, ..._args: Args): unknown;
20
+ unlockrequest(_data: DatabaseDev.ValueProxy<LockedType>, _meta: DatabaseDev.ValueProxy<Meta>, ..._args: ProxyOrValArray<Args>): DatabaseDev.ValueProxy<unknown>;
21
+ }
22
+ export declare class ContainerModifier<Meta extends object = object, Options extends object = object> extends TwoWayModifier<Record<string, unknown>, [
23
+ key: string
24
+ ], Meta, Options> {
25
+ lock(locked_value: Record<string, unknown> | undefined, value: unknown, key: string): Record<string, unknown>;
26
+ unlock(locked_value: Record<string, unknown>, key: string): unknown;
27
+ unlockrequest(data: DatabaseDev.ValueProxy<Record<string, unknown>>, _meta: DatabaseDev.ValueProxy<Meta>, key: DatabaseDev.ValueProxyOrValue<string>): DatabaseDev.ValueProxy<unknown>;
28
+ }
29
+ interface InternalType {
30
+ meta: Record<string, object>;
31
+ data: Record<string, any>;
32
+ }
33
+ interface ModifiedField {
34
+ id: string;
35
+ modifier: Modifier;
36
+ metaRef: {
37
+ _ref: any;
38
+ };
39
+ }
40
+ export declare class ModifiersStaticMetadata {
41
+ static key: symbol;
42
+ fields: Record<string, Array<ModifiedField>>;
43
+ events: Map<string, [field: string, modified: ModifiedField][]>;
44
+ }
45
+ export declare class ModifiersDynamicMetadata {
46
+ static key: symbol;
47
+ staticMeta: ModifiersStaticMetadata;
48
+ floating: Record<string, any>;
49
+ fields: Record<string, Record<string, any[]>>;
50
+ constructor(target: any);
51
+ canGet(field: string): boolean;
52
+ get(field: string, internal: InternalType): any;
53
+ canSet(field: string): boolean;
54
+ set(field: string, internal: InternalType, value: unknown): void;
55
+ }
56
+ export declare function fromPlainData<T extends Constructible>(rawObject: Record<string, any>, TableClass: T): InstanceType<T>;
57
+ export declare function toPlainData<T extends {
58
+ constructor: any;
59
+ }>(object: T): Record<string, any>;
60
+ export declare function fromDatabase<T extends Constructible>(rawObject: any, TableClass: T): InstanceType<T>;
61
+ export declare function toDatabase<T extends {
62
+ constructor: any;
63
+ }>(object: T): Record<string, any>;
64
+ type ExtractModifierOptions<T> = T extends Modifier<any, infer Options> ? Options : undefined;
65
+ type ExtractModifierArgs<T> = T extends OneWayModifier<any, infer Args> ? Args : [];
66
+ export declare function attachModifier<T extends Constructible, M extends Constructible<Modifier>>(TableClass: T, Modifier: M, field: keyof InstanceType<T>, options: ExtractModifierOptions<InstanceType<M>>): void;
67
+ export declare function getModifiedFields<T extends {
68
+ constructor: any;
69
+ }, M extends Constructible<Modifier>>(object: T, Modifier: M): (keyof T)[];
70
+ export declare function unlock<T extends {
71
+ constructor: any;
72
+ }, M extends Constructible<Modifier>>(object: T, Modifier: M, fields: Array<keyof T> | undefined, ...args: ExtractModifierArgs<InstanceType<M>>): void;
73
+ type ModifierWithProxyArgs = {
74
+ modifier: Constructible<TwoWayModifier<any, any[], any, any>>;
75
+ args: DatabaseDev.ValueProxyOrValue<any>[];
76
+ };
77
+ export declare function unlockrequest<T extends {}, K extends keyof T>(table: Constructible<T>, object: DatabaseDev.ValueProxy<T>, field: K, modifiers: ModifierWithProxyArgs[]): DatabaseDev.ValueProxy<T[K]>;
78
+ export declare function lock<T extends {
79
+ constructor: any;
80
+ }, M extends Constructible<Modifier>>(object: T, Modifier: M, fields: Array<keyof T> | undefined, ...args: ExtractModifierArgs<InstanceType<M>> | []): void;
81
+ export declare function testValue<T extends {
82
+ constructor: any;
83
+ }, K extends keyof T>(object: T, field: K, value: T[K]): unknown;
84
+ export declare function triggerEvent<T extends {
85
+ constructor: any;
86
+ }>(object: T, event: string, ...args: unknown[]): void;
87
+ export {};
@@ -0,0 +1,370 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModifiersDynamicMetadata = exports.ModifiersStaticMetadata = exports.ContainerModifier = exports.TwoWayModifier = exports.OneWayModifier = exports.Modifier = exports.MixinSymbol = void 0;
4
+ exports.fromPlainData = fromPlainData;
5
+ exports.toPlainData = toPlainData;
6
+ exports.fromDatabase = fromDatabase;
7
+ exports.toDatabase = toDatabase;
8
+ exports.attachModifier = attachModifier;
9
+ exports.getModifiedFields = getModifiedFields;
10
+ exports.unlock = unlock;
11
+ exports.unlockrequest = unlockrequest;
12
+ exports.lock = lock;
13
+ exports.testValue = testValue;
14
+ exports.triggerEvent = triggerEvent;
15
+ const common_1 = require("../common");
16
+ exports.MixinSymbol = Symbol();
17
+ class Modifier {
18
+ meta;
19
+ options;
20
+ }
21
+ exports.Modifier = Modifier;
22
+ class OneWayModifier extends Modifier {
23
+ lock(_locked_value, _value, ..._args) {
24
+ throw new Error("Unimplemented");
25
+ }
26
+ test(locked_value, value, ...args) {
27
+ return this.lock(undefined, value, ...args) === locked_value;
28
+ }
29
+ }
30
+ exports.OneWayModifier = OneWayModifier;
31
+ class TwoWayModifier extends OneWayModifier {
32
+ unlock(_locked_value, ..._args) {
33
+ throw new Error("Unimplemented");
34
+ }
35
+ unlockrequest(_data, _meta, ..._args) {
36
+ throw new Error("Unimplemented");
37
+ }
38
+ }
39
+ exports.TwoWayModifier = TwoWayModifier;
40
+ class ContainerModifier extends TwoWayModifier {
41
+ lock(locked_value, value, key) {
42
+ if (key === "*") {
43
+ return value;
44
+ }
45
+ return locked_value
46
+ ? {
47
+ ...locked_value,
48
+ [key]: value,
49
+ }
50
+ : { [key]: value };
51
+ }
52
+ unlock(locked_value, key) {
53
+ return key === "*" ? locked_value : locked_value[key];
54
+ }
55
+ unlockrequest(data, _meta, key) {
56
+ return data.key(key);
57
+ }
58
+ }
59
+ exports.ContainerModifier = ContainerModifier;
60
+ function isWriteOnly(modifier) {
61
+ return "lock" in modifier && !("unlock" in modifier);
62
+ }
63
+ function isOnlyEvents(modifier) {
64
+ return !("lock" in modifier);
65
+ }
66
+ class ModifiersStaticMetadata {
67
+ static key = Symbol();
68
+ fields = {};
69
+ events = new Map();
70
+ }
71
+ exports.ModifiersStaticMetadata = ModifiersStaticMetadata;
72
+ function withRef(internal, id, modifier, metaRef, callback) {
73
+ metaRef._ref = internal.meta[id];
74
+ const ret = callback(modifier);
75
+ if (metaRef._ref !== internal.meta[id]) {
76
+ internal.meta[id] = metaRef._ref;
77
+ }
78
+ return ret;
79
+ }
80
+ class ModifiersDynamicMetadata {
81
+ static key = Symbol();
82
+ staticMeta;
83
+ floating = {}; // Plain data that has no known lock value
84
+ fields = {};
85
+ constructor(target) {
86
+ this.staticMeta = (0, common_1.getMetadata)(target.constructor, ModifiersStaticMetadata);
87
+ for (const field of Object.keys(this.staticMeta.fields)) {
88
+ this.fields[field] = {};
89
+ }
90
+ }
91
+ canGet(field) {
92
+ const list = this.staticMeta.fields[field];
93
+ const lastModifier = list[list.length - 1].modifier;
94
+ if (lastModifier.autolock) {
95
+ return true;
96
+ }
97
+ return (!isWriteOnly(lastModifier) &&
98
+ !list.some(({ id, modifier }) => !modifier.autounlock &&
99
+ "unlock" in modifier &&
100
+ !(id in this.fields[field])));
101
+ }
102
+ get(field, internal) {
103
+ if (field in this.floating) {
104
+ return this.floating[field];
105
+ }
106
+ if (!this.canGet(field)) {
107
+ return;
108
+ }
109
+ const list = this.staticMeta.fields[field];
110
+ let value = internal.data[field];
111
+ for (const { id, modifier, metaRef } of list) {
112
+ if ("unlock" in modifier && value !== undefined) {
113
+ if (this.fields[field][id]) {
114
+ value = withRef(internal, id, modifier, metaRef, (modifier) => modifier.unlock(value, ...this.fields[field][id]));
115
+ }
116
+ else if (modifier.autounlock) {
117
+ value = withRef(internal, id, modifier, metaRef, (modifier) => modifier.unlock(value));
118
+ }
119
+ }
120
+ }
121
+ return value;
122
+ }
123
+ canSet(field) {
124
+ const list = this.staticMeta.fields[field];
125
+ return !list.some(({ id, modifier }) => !modifier.autolock &&
126
+ "lock" in modifier &&
127
+ !(id in this.fields[field]));
128
+ }
129
+ set(field, internal, value) {
130
+ if (!this.canSet(field)) {
131
+ this.floating[field] = value;
132
+ return;
133
+ }
134
+ const list = this.staticMeta.fields[field];
135
+ // TODO: should maybe cache this
136
+ const prevlist = [];
137
+ let prev = internal.data[field];
138
+ for (let i = 0; i < list.length - 1; ++i) {
139
+ const { id, modifier, metaRef } = list[i];
140
+ prevlist[i] = { id, modifier, metaRef, prev };
141
+ if ("unlock" in modifier) {
142
+ if (this.fields[field][id]) {
143
+ prev = modifier.unlock(prev, ...this.fields[field][id]);
144
+ }
145
+ else {
146
+ prev = undefined;
147
+ }
148
+ }
149
+ }
150
+ prevlist.push({
151
+ ...list[list.length - 1],
152
+ prev,
153
+ });
154
+ for (let i = prevlist.length - 1; i >= 0; --i) {
155
+ const { id, modifier, metaRef, prev } = prevlist[i];
156
+ if ("lock" in modifier) {
157
+ value = withRef(internal, id, modifier, metaRef, (modifier) => modifier.lock(prev, value, ...(this.fields[field][id] || [])));
158
+ }
159
+ }
160
+ internal.data[field] = value;
161
+ delete this.floating[field];
162
+ }
163
+ }
164
+ exports.ModifiersDynamicMetadata = ModifiersDynamicMetadata;
165
+ function getInternal(object) {
166
+ if (!object._internal) {
167
+ object._internal = {
168
+ meta: {},
169
+ data: {},
170
+ };
171
+ }
172
+ return object._internal;
173
+ }
174
+ /* Data stages:
175
+ *
176
+ * - `Database`: locked plain object
177
+ * - Complete data with encoded _internal field
178
+ * - ex: `{ plain: 'value', _internal: { [..] } }`
179
+ * - `Instance`: class instance
180
+ * - Complete data with prototype attached and accessors
181
+ * - ex: `Table { plain: 'value', special: (accessor) }`
182
+ * - `Plaindata`: unlocked plain object
183
+ * - Subset of existing data from locked object
184
+ * - ex: `{ plain: 'value', special: 'data' }`
185
+ */
186
+ function fromPlainData(rawObject, TableClass) {
187
+ const shallowCopy = {};
188
+ // Attach prototype
189
+ Object.setPrototypeOf(shallowCopy, TableClass.prototype);
190
+ for (const [key, val] of Object.entries(rawObject)) {
191
+ shallowCopy[key] = val;
192
+ }
193
+ triggerEvent(shallowCopy, "fromPlainData", rawObject);
194
+ return shallowCopy;
195
+ }
196
+ function toPlainData(object) {
197
+ const metaTable = (0, common_1.getMetadata)(object.constructor, ModifiersStaticMetadata);
198
+ const result = { ...object };
199
+ delete result._internal;
200
+ for (const field of Object.keys(metaTable.fields)) {
201
+ result[field] = object[field]; // Populate unlocked fields
202
+ }
203
+ triggerEvent(object, "toPlainData", result);
204
+ return result;
205
+ }
206
+ function fromDatabase(rawObject, TableClass) {
207
+ // Generate Meta
208
+ const shallowCopy = { ...rawObject };
209
+ // Attach prototype
210
+ Object.setPrototypeOf(shallowCopy, TableClass.prototype);
211
+ triggerEvent(shallowCopy, "fromDatabase", rawObject);
212
+ return shallowCopy;
213
+ }
214
+ function toDatabase(object) {
215
+ const result = { ...object };
216
+ triggerEvent(object, "toDatabase", result);
217
+ return result;
218
+ }
219
+ const ignoredEventNames = {
220
+ constructor: true,
221
+ lock: true,
222
+ unlock: true,
223
+ };
224
+ function attachModifier(TableClass, Modifier, field, options) {
225
+ const entry = {
226
+ id: Modifier.name,
227
+ modifier: new Modifier(),
228
+ metaRef: { _ref: {} },
229
+ };
230
+ entry.modifier.meta = new Proxy(entry.metaRef, {
231
+ get: (self, p) => {
232
+ if (!self._ref)
233
+ return undefined;
234
+ return Reflect.get(self._ref, p, self._ref);
235
+ },
236
+ set: (self, p, v) => {
237
+ if (!self._ref)
238
+ self._ref = {};
239
+ return Reflect.set(self._ref, p, v, self._ref);
240
+ },
241
+ });
242
+ entry.modifier.options = options;
243
+ // Mark TableClass as special
244
+ const metaTable = (0, common_1.getMetadata)(TableClass, ModifiersStaticMetadata);
245
+ if (!isOnlyEvents(entry.modifier)) {
246
+ // Add Modifier to TableClass[field] with options
247
+ if (field in metaTable.fields) {
248
+ const list = metaTable.fields[field];
249
+ const last = list[list.length - 1];
250
+ if (isWriteOnly(last.modifier)) {
251
+ if (isWriteOnly(entry.modifier)) {
252
+ throw new Error(`Attempted adding Modifier ${entry.id} on ${TableClass.name}.${field} but it already has a One-Way Modifier`);
253
+ }
254
+ else {
255
+ throw new Error(`Adding Modifier ${entry.id} on ${TableClass.name}.${field} after a One-Way Modifier, please review your ordering.`);
256
+ }
257
+ }
258
+ else {
259
+ list.splice(list.length - 1, 0, entry);
260
+ }
261
+ }
262
+ else {
263
+ metaTable.fields[field] = [entry];
264
+ Object.defineProperty(TableClass.prototype, field, {
265
+ get: function () {
266
+ return (0, common_1.getMetadata)(this, ModifiersDynamicMetadata).get(field, getInternal(this));
267
+ },
268
+ set: function (value) {
269
+ (0, common_1.getMetadata)(this, ModifiersDynamicMetadata).set(field, getInternal(this), value);
270
+ },
271
+ });
272
+ }
273
+ }
274
+ if (!("toJSON" in TableClass.prototype)) {
275
+ Object.defineProperty(TableClass.prototype, "toJSON", {
276
+ value: function () {
277
+ return toPlainData(this);
278
+ },
279
+ });
280
+ }
281
+ for (const event of Object.getOwnPropertyNames(Modifier.prototype)) {
282
+ if (!(event in ignoredEventNames) &&
283
+ typeof Modifier.prototype[event] === "function") {
284
+ if (!metaTable.events.has(event)) {
285
+ metaTable.events.set(event, []);
286
+ }
287
+ metaTable.events.get(event)?.push([field, entry]);
288
+ }
289
+ }
290
+ }
291
+ function getModifiedFields(object, Modifier) {
292
+ const metaTable = (0, common_1.getMetadata)(object.constructor, ModifiersStaticMetadata);
293
+ return Object.keys(metaTable.fields).filter((field) => metaTable.fields[field]?.find(({ id }) => id === Modifier.name));
294
+ }
295
+ function unlock(object, Modifier, fields, ...args) {
296
+ const metaTable = (0, common_1.getMetadata)(object.constructor, ModifiersStaticMetadata);
297
+ const usedFields = (fields ?? Object.keys(metaTable.fields)).filter((field) => metaTable.fields[field]?.find(({ id }) => id === Modifier.name));
298
+ // Get metadata
299
+ const meta = (0, common_1.getMetadata)(object, ModifiersDynamicMetadata);
300
+ // for each field set metadata[field][Modifier] to args
301
+ for (const field of usedFields) {
302
+ meta.fields[field][Modifier.name] = args;
303
+ if (field in meta.floating) {
304
+ // check floating
305
+ object[field] = meta.floating[field];
306
+ }
307
+ }
308
+ }
309
+ function unlockrequest(table, object, field, modifiers) {
310
+ const args = {};
311
+ for (const { modifier, args: modArgs } of modifiers) {
312
+ args[modifier.name] = modArgs;
313
+ }
314
+ const meta = object.key("_internal").key("meta");
315
+ const metaTable = (0, common_1.getMetadata)(table, ModifiersStaticMetadata);
316
+ return (metaTable.fields[field]?.reduce((data, { id, modifier }) => {
317
+ if (isWriteOnly(modifier)) {
318
+ return data;
319
+ }
320
+ data = modifier.unlockrequest(data, meta.key(id), ...args[id]);
321
+ return data;
322
+ }, object.key("_internal").key("data").key(field)) || object.key(field));
323
+ }
324
+ function lock(object, Modifier, fields, ...args) {
325
+ const metaTable = (0, common_1.getMetadata)(object.constructor, ModifiersStaticMetadata);
326
+ const usedFields = (fields ?? Object.keys(metaTable.fields)).filter((field) => metaTable.fields[field]?.find(({ id }) => id === Modifier.name));
327
+ // Get metadata
328
+ const meta = (0, common_1.getMetadata)(object, ModifiersDynamicMetadata);
329
+ // for each field set metadata[field][Modifier] to args
330
+ for (const field of usedFields) {
331
+ const val = object[field];
332
+ meta.fields[field][Modifier.name] = args;
333
+ object[field] = val;
334
+ }
335
+ }
336
+ function testValue(object, field, value) {
337
+ const metaTable = (0, common_1.getMetadata)(object.constructor, ModifiersStaticMetadata);
338
+ // Get metadata
339
+ const meta = (0, common_1.getMetadata)(object, ModifiersDynamicMetadata);
340
+ const internal = getInternal(object);
341
+ const val = internal.data[field];
342
+ for (const { id, modifier, metaRef } of metaTable.fields[field]) {
343
+ const args = meta.fields[field][id] || (modifier.autolock && []);
344
+ if (!args)
345
+ return false;
346
+ if (isWriteOnly(modifier)) {
347
+ // return OneWayModifier.test(unwrapped, value)
348
+ return withRef(internal, id, modifier, metaRef, (modifier) => modifier.test(val, value, ...args));
349
+ }
350
+ if ("unlock" in modifier && val !== undefined) {
351
+ // unwrap field until the OneWayModifier
352
+ return withRef(internal, id, modifier, metaRef, (modifier) => modifier.unlock(val, ...args));
353
+ }
354
+ }
355
+ return val === value;
356
+ }
357
+ function triggerEvent(object, event, ...args) {
358
+ const metaTable = (0, common_1.getMetadata)(object.constructor, ModifiersStaticMetadata);
359
+ if (!metaTable.events.has(event)) {
360
+ return;
361
+ }
362
+ const internal = getInternal(object);
363
+ const eventEntries = metaTable.events.get(event);
364
+ if (!eventEntries)
365
+ return;
366
+ for (const [field, { id, modifier, metaRef }] of eventEntries) {
367
+ withRef(internal, id, modifier, metaRef, (modifier) => modifier[event](object, field, ...args));
368
+ }
369
+ }
370
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/modifiers/common.ts"],"names":[],"mappings":"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"}