@antelopejs/interface-database-decorators 0.2.1 → 0.3.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/README.md +1 -0
- package/dist/common.js +7 -5
- package/dist/common.js.map +1 -1
- package/dist/model.js +21 -11
- package/dist/model.js.map +1 -1
- package/dist/modifiers/common.d.ts +49 -29
- package/dist/modifiers/common.js +57 -66
- package/dist/modifiers/common.js.map +1 -1
- package/dist/modifiers/encryption.js +32 -1
- package/dist/modifiers/encryption.js.map +1 -1
- package/dist/modifiers/hash.d.ts +29 -2
- package/dist/modifiers/hash.js +66 -7
- package/dist/modifiers/hash.js.map +1 -1
- package/dist/modifiers/internal/classes.d.ts +45 -0
- package/dist/modifiers/internal/classes.js +131 -0
- package/dist/modifiers/internal/classes.js.map +1 -0
- package/dist/modifiers/internal/records.d.ts +6 -0
- package/dist/modifiers/internal/records.js +12 -1
- package/dist/modifiers/internal/records.js.map +1 -1
- package/dist/modifiers/localization.d.ts +30 -4
- package/dist/modifiers/localization.js +8 -20
- package/dist/modifiers/localization.js.map +1 -1
- package/dist/tests/hash_upgrade.test.js +25 -2
- package/dist/tests/hash_upgrade.test.js.map +1 -1
- package/dist/tests/localized_query_keys.test.d.ts +1 -0
- package/dist/tests/localized_query_keys.test.js +63 -0
- package/dist/tests/localized_query_keys.test.js.map +1 -0
- package/dist/tests/metadata_inheritance.test.js +63 -0
- package/dist/tests/metadata_inheritance.test.js.map +1 -1
- package/dist/tests/modifiers/common.test.js +6 -0
- package/dist/tests/modifiers/common.test.js.map +1 -1
- package/dist/tests/modifiers/encryption_date_marker.test.js +22 -0
- package/dist/tests/modifiers/encryption_date_marker.test.js.map +1 -1
- package/dist/tests/modifiers/hash.test.js +10 -4
- package/dist/tests/modifiers/hash.test.js.map +1 -1
- package/dist/tests/modifiers/hash_async_set.test.d.ts +1 -0
- package/dist/tests/modifiers/hash_async_set.test.js +135 -0
- package/dist/tests/modifiers/hash_async_set.test.js.map +1 -0
- package/dist/tests/modifiers/localization.test.js +134 -0
- package/dist/tests/modifiers/localization.test.js.map +1 -1
- package/dist/tests/modifiers/symbol_fields.test.d.ts +1 -0
- package/dist/tests/modifiers/symbol_fields.test.js +62 -0
- package/dist/tests/modifiers/symbol_fields.test.js.map +1 -0
- package/dist/tests/partial_update.test.js +79 -6
- package/dist/tests/partial_update.test.js.map +1 -1
- package/docs/3.table-modifiers.md +35 -9
- package/docs/4.data-models.md +2 -0
- package/package.json +5 -5
- package/skills/database-decorators-interface/SKILL.md +6 -2
package/dist/modifiers/hash.js
CHANGED
|
@@ -40,6 +40,24 @@ function scryptAsync(...[password, salt, keylen, options]) {
|
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
+
/** A new salt and the scrypt arguments that derive the current hash of `candidate` with it. */
|
|
44
|
+
function currentScrypt(candidate) {
|
|
45
|
+
const salt = (0, node_crypto_1.randomBytes)(SALT_BYTES);
|
|
46
|
+
return {
|
|
47
|
+
salt,
|
|
48
|
+
run: scryptArgs(candidate, salt, KEY_BYTES, SCRYPT_COST),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function storedScrypt(salt, key) {
|
|
52
|
+
return `${CURRENT_PREFIX}${unpaddedBase64(salt)}$${unpaddedBase64(key)}`;
|
|
53
|
+
}
|
|
54
|
+
/** A stored hash derived ahead of the setter, which `lock` keeps as it is. */
|
|
55
|
+
class PrecomputedHash {
|
|
56
|
+
stored;
|
|
57
|
+
constructor(stored) {
|
|
58
|
+
this.stored = stored;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
43
61
|
function parseScrypt(stored) {
|
|
44
62
|
const match = STORED_SCRYPT.exec(stored);
|
|
45
63
|
if (!match)
|
|
@@ -97,13 +115,14 @@ function storedText(stored) {
|
|
|
97
115
|
}
|
|
98
116
|
function withHashedField(row, field, use) {
|
|
99
117
|
const metaTable = (0, common_1.getMetadata)(row.constructor, common_2.ModifiersStaticMetadata);
|
|
100
|
-
const
|
|
118
|
+
const list = (0, records_1.fieldsByKey)(metaTable)[field];
|
|
119
|
+
const entry = list?.find(({ modifier }) => modifier instanceof HashModifier);
|
|
101
120
|
if (!entry || !(entry.modifier instanceof HashModifier)) {
|
|
102
121
|
throw new Error(`Field ${String(field)} is not hashed`);
|
|
103
122
|
}
|
|
104
123
|
const internal = (0, records_1.getInternal)(row);
|
|
105
124
|
const stored = (0, records_1.dataByKey)(internal)[field];
|
|
106
|
-
return (0, records_1.withRef)(internal, entry.id, entry.modifier, entry.metaRef, (modifier) => use(modifier, (0, kinds_1.isString)(stored) ? stored : ""));
|
|
125
|
+
return (0, records_1.withRef)(internal, entry.id, entry.modifier, entry.metaRef, (modifier) => use(modifier, (0, kinds_1.isString)(stored) ? stored : "", list.length === 1));
|
|
107
126
|
}
|
|
108
127
|
/**
|
|
109
128
|
* Hash modifier. enables the use of {@link Hashed} on table fields.
|
|
@@ -118,13 +137,17 @@ class HashModifier extends common_2.OneWayModifier {
|
|
|
118
137
|
/**
|
|
119
138
|
* Hashes a new value. Assigning the stored hash back keeps it as it is.
|
|
120
139
|
* Blocks the event loop for one scrypt run: a setter and the conversions
|
|
121
|
-
* behind `insert` and `update` are synchronous.
|
|
140
|
+
* behind `insert` and `update` are synchronous. `setHashAsync` runs it on
|
|
141
|
+
* the thread pool instead.
|
|
122
142
|
*/
|
|
123
143
|
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- overrides OneWayModifier.lock; a modified field's value has its table class's type, which the shared modifier chain cannot name
|
|
124
144
|
lock(locked_value, value) {
|
|
125
145
|
if (value === undefined) {
|
|
126
146
|
return value;
|
|
127
147
|
}
|
|
148
|
+
if (value instanceof PrecomputedHash) {
|
|
149
|
+
return value.stored;
|
|
150
|
+
}
|
|
128
151
|
if (value === locked_value) {
|
|
129
152
|
return locked_value;
|
|
130
153
|
}
|
|
@@ -136,9 +159,24 @@ class HashModifier extends common_2.OneWayModifier {
|
|
|
136
159
|
}
|
|
137
160
|
return digestOf(algorithm, this.meta.salt, candidate);
|
|
138
161
|
}
|
|
139
|
-
const salt = (
|
|
140
|
-
|
|
141
|
-
|
|
162
|
+
const { salt, run } = currentScrypt(candidate);
|
|
163
|
+
return storedScrypt(salt, (0, node_crypto_1.scryptSync)(...run));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* What to assign to the field so that its setter stores the hash of `value`
|
|
167
|
+
* without running scrypt: the scrypt run happens here, on the thread pool.
|
|
168
|
+
* A value the setter handles without scrypt comes back as it is: nothing,
|
|
169
|
+
* the stored hash itself (`locked_value`, empty when nothing is stored), or
|
|
170
|
+
* any value of a field with an `algorithm`.
|
|
171
|
+
*/
|
|
172
|
+
async lockAsync(locked_value, value) {
|
|
173
|
+
if (value === undefined ||
|
|
174
|
+
(locked_value !== "" && value === locked_value) ||
|
|
175
|
+
this.options.algorithm) {
|
|
176
|
+
return value;
|
|
177
|
+
}
|
|
178
|
+
const { salt, run } = currentScrypt(JSON.stringify(value));
|
|
179
|
+
return new PrecomputedHash(storedScrypt(salt, await scryptAsync(...run)));
|
|
142
180
|
}
|
|
143
181
|
test(locked_value, value) {
|
|
144
182
|
const check = this.plan(storedText(locked_value), value);
|
|
@@ -172,9 +210,11 @@ class HashModifier extends common_2.OneWayModifier {
|
|
|
172
210
|
* @param value - Value to hash and test.
|
|
173
211
|
*
|
|
174
212
|
* @returns Whether the new value is identical to the original or not.
|
|
213
|
+
*
|
|
214
|
+
* @throws Error when `field` has no {@link Hashed} decorator.
|
|
175
215
|
*/
|
|
176
216
|
testHash(field, value) {
|
|
177
|
-
return (
|
|
217
|
+
return withHashedField(this, field, (modifier, stored) => modifier.test(stored, value));
|
|
178
218
|
}
|
|
179
219
|
/**
|
|
180
220
|
* Test a value against the stored hash on the thread pool.
|
|
@@ -187,6 +227,25 @@ class HashModifier extends common_2.OneWayModifier {
|
|
|
187
227
|
async testHashAsync(field, value) {
|
|
188
228
|
return withHashedField(this, field, (modifier, stored) => modifier.testAsync(stored, value));
|
|
189
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* Hash a value on the thread pool, then assign it to the field. The row
|
|
232
|
+
* stores what `this[field] = value` stores, in the same format, without
|
|
233
|
+
* blocking the event loop for the scrypt run. On a server, prefer it to
|
|
234
|
+
* assigning a hashed field. A field with another modifier beside
|
|
235
|
+
* {@link Hashed} is assigned at once, on the event loop. Calls on one row
|
|
236
|
+
* that overlap settle in the order their scrypt runs end: await each one.
|
|
237
|
+
*
|
|
238
|
+
* @param field - Name of the field to set.
|
|
239
|
+
* @param value - Value to hash and store.
|
|
240
|
+
*
|
|
241
|
+
* @returns Once the field holds the hash of `value`.
|
|
242
|
+
*
|
|
243
|
+
* @throws Error when `field` has no {@link Hashed} decorator.
|
|
244
|
+
*/
|
|
245
|
+
async setHashAsync(field, value) {
|
|
246
|
+
const assigned = await withHashedField(this, field, (modifier, stored, alone) => alone ? modifier.lockAsync(stored, value) : value);
|
|
247
|
+
Reflect.set(this, field, assigned);
|
|
248
|
+
}
|
|
190
249
|
/**
|
|
191
250
|
* Tell whether a stored hash needs writing again: it uses an older format
|
|
192
251
|
* or cost. After a successful test, assign the tested value to the field
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/modifiers/hash.ts"],"names":[],"mappings":";;;AAAA,+CAAwC;AACxC,6CAOqB;AACrB,sEAA8E;AAE9E,sCAAwC;AACxC,
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/modifiers/hash.ts"],"names":[],"mappings":";;;AAAA,+CAAwC;AACxC,6CAOqB;AACrB,sEAA8E;AAE9E,sCAAwC;AACxC,qCAKkB;AAClB,gDAK4B;AAC5B,4CAA4C;AA4B5C,MAAM,WAAW,GAAe,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACvD,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B,wEAAwE;AACxE,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,MAAM,cAAc,GAAG,cAAc,WAAW,CAAC,EAAE,MAAM,WAAW,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,GAAG,CAAC;AAE7F,gEAAgE;AAChE,MAAM,aAAa,GACjB,qGAAqG,CAAC;AAExG,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,UAAU,CACjB,QAAgB,EAChB,IAAY,EACZ,MAAc,EACd,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAc;IAExB,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,MAAM;QACN,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,iBAAiB,EAAE;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAa;IACnE,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,IAAA,oBAAM,EAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACrD,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACpB,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,IAAI,GAAG,IAAA,yBAAW,EAAC,UAAU,CAAC,CAAC;IACrC,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,GAAW;IAC7C,OAAO,GAAG,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,8EAA8E;AAC9E,MAAM,eAAe;IACgB;IAAnC,YAAmC,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;CACtD;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACpB,CAAC;IACF,IACE,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,GAAG,iBAAiB;QAC/C,IAAI,CAAC,CAAC,GAAG,YAAY;QACrB,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,EACtB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;QACrC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB,EAAE,IAAY,EAAE,SAAiB;IAClE,OAAO,IAAA,wBAAU,EAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,aAAa,CACpB,MAAc,EACd,IAAwB,EACxB,SAAiB,EACjB,SAA6B;IAE7B,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACjE,OAAO,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,IAAA,6BAAe,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAChB,GAAiD,EACjD,SAA6B,EAC7B,SAA6B;IAE7B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;YACjE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,KAAK,SAAS,IAAI,IAAA,6BAAe,EAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC;SAC9D,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAC3B,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,IAAI,EACR,SAAS,IAAI,aAAa,EAC1B,SAAS,CACV,CAAC;IACF,OAAO;QACL,GAAG,EAAE,SAAS;YACZ,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC;QACnE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,UAAU,CAAC,MAA0B;IAC5C,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,eAAe,CACtB,GAAyB,EACzB,KAAkB,EAClB,GAAkE;IAElE,MAAM,SAAS,GAAG,IAAA,oBAAW,EAAC,GAAG,CAAC,WAAW,EAAE,gCAAuB,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAA,qBAAW,EAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,YAAY,YAAY,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,YAAY,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,QAAQ,GAAG,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAY,IAAA,mBAAS,EAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,IAAA,iBAAO,EACZ,QAAQ,EACR,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,OAAO,EACb,CAAC,QAAQ,EAAE,EAAE,CACX,GAAG,CAAC,QAAQ,EAAE,IAAA,gBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CACnE,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAa,YAAa,SAAQ,uBAKjC;IACiB,QAAQ,GAAG,IAAI,CAAC;IAEhC;;;;;OAKG;IACH,8LAA8L;IAC9K,IAAI,CAAC,YAAgC,EAAE,KAAc;QACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC,MAAM,CAAC;QACtB,CAAC;QACD,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAA,uBAAQ,GAAE,CAAC;YAC9B,CAAC;YACD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC,IAAI,EAAE,IAAA,wBAAU,EAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,SAAS,CAAC,YAAoB,EAAE,KAAgB;QAC5D,IACE,KAAK,KAAK,SAAS;YACnB,CAAC,YAAY,KAAK,EAAE,IAAI,KAAK,KAAK,YAAY,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,OAAO,IAAI,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAEe,IAAI,CAAC,YAAgC,EAAE,KAAgB;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,IAAA,wBAAU,EAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,wEAAwE;IACjE,KAAK,CAAC,SAAS,CAAC,YAAoB,EAAE,KAAgB;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,WAAW,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,YAAoB;QACpC,OAAO,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS;YACvB,YAAY,KAAK,EAAE;YACnB,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CACzC,CAAC;IACJ,CAAC;IAED,4EAA4E;IACpE,IAAI,CAAC,YAAoB,EAAE,KAAgB;QACjD,OAAO,SAAS,CACd,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAC9C,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CACxD,CAAC;IACJ,CAAC;IAED,CAAC,oBAAW,CAAC,GAAG;QACd;;;;;;;;;;WAUG;QACH,QAAQ,CAEN,KAAQ,EACR,KAAc;YAEd,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CACvD,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAC7B,CAAC;QACJ,CAAC;QAED;;;;;;;WAOG;QACH,KAAK,CAAC,aAAa,CAEjB,KAAQ,EACR,KAAc;YAEd,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CACvD,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAClC,CAAC;QACJ,CAAC;QAED;;;;;;;;;;;;;;WAcG;QACH,KAAK,CAAC,YAAY,CAEhB,KAAQ,EACR,KAAc;YAEd,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,IAAI,EACJ,KAAK,EACL,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAC1B,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CACpD,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;QAED;;;;;;;;WAQG;QACH,cAAc,CAA8B,KAAiB;YAC3D,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CACvD,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAC5B,CAAC;QACJ,CAAC;KACF,CAAC;CACH;AA7KD,oCA6KC;AAED;;;;;;GAMG;AACU,QAAA,MAAM,GAAG,IAAA,kCAAqB,EACzC,CAAC,MAAM,EAAE,WAAW,EAAE,OAAiB,EAAE,EAAE;IACzC,IAAA,uBAAc,EACZ,MAAM,CAAC,WAAW,EAClB,YAAY,EACZ,WAAW,EACX,OAAO,IAAI,EAAE,CACd,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** @internal @packageDocumentation */
|
|
2
|
+
import * as DatabaseDev from "@antelopejs/interface-database";
|
|
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
|
+
/**
|
|
23
|
+
* A modifier that holds a field's values in a record by key, as
|
|
24
|
+
* `LocalizationModifier` holds one text per locale.
|
|
25
|
+
*
|
|
26
|
+
* The key `"*"` addresses the whole record. The key `undefined` is no key:
|
|
27
|
+
* `lock` stores nothing under it, and `unlock` and `unlockrequest` find no
|
|
28
|
+
* value. A key given as a `ValueProxy` goes to the database as it is.
|
|
29
|
+
*/
|
|
30
|
+
export declare class ContainerModifier<Meta extends object = object, Options extends object = object> extends TwoWayModifier<Record<string, unknown>, [
|
|
31
|
+
key: string | undefined
|
|
32
|
+
], Meta, Options> {
|
|
33
|
+
/**
|
|
34
|
+
* Stores `value` under `key`. The wildcard key `"*"` replaces the whole
|
|
35
|
+
* container, so it takes a record of values by key; `undefined` or `null`
|
|
36
|
+
* clears it.
|
|
37
|
+
*
|
|
38
|
+
* @throws TypeError when `key` is `"*"` and `value` is neither a record,
|
|
39
|
+
* `undefined` nor `null`
|
|
40
|
+
*/
|
|
41
|
+
lock(locked_value: Record<string, unknown> | undefined, value: unknown, key: string | undefined): Record<string, unknown>;
|
|
42
|
+
unlock(locked_value: Record<string, unknown>, key: string | undefined): unknown;
|
|
43
|
+
unlockrequest(data: DatabaseDev.ValueProxy<Record<string, unknown>>, _meta: DatabaseDev.ValueProxy<Meta>, key: DatabaseDev.ValueProxyOrValue<string | undefined>): DatabaseDev.ValueProxy<unknown>;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ContainerModifier = exports.TwoWayModifier = exports.OneWayModifier = exports.Modifier = exports.MixinSymbol = void 0;
|
|
37
|
+
/** @internal @packageDocumentation */
|
|
38
|
+
const DatabaseDev = __importStar(require("@antelopejs/interface-database"));
|
|
39
|
+
const kinds_1 = require("./kinds");
|
|
40
|
+
exports.MixinSymbol = Symbol();
|
|
41
|
+
class Modifier {
|
|
42
|
+
meta;
|
|
43
|
+
options;
|
|
44
|
+
}
|
|
45
|
+
exports.Modifier = Modifier;
|
|
46
|
+
class OneWayModifier extends Modifier {
|
|
47
|
+
lock(_locked_value,
|
|
48
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- the published override point of every modifier; a modified field's value has its table class's type, which the shared modifier chain cannot name
|
|
49
|
+
_value, ..._args) {
|
|
50
|
+
throw new Error("Unimplemented");
|
|
51
|
+
}
|
|
52
|
+
test(locked_value,
|
|
53
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- a modified field's value has its table class's type, which the shared modifier chain cannot name
|
|
54
|
+
value, ...args) {
|
|
55
|
+
return this.lock(undefined, value, ...args) === locked_value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.OneWayModifier = OneWayModifier;
|
|
59
|
+
class TwoWayModifier extends OneWayModifier {
|
|
60
|
+
// oxlint-disable-next-line anti-slop/no-unknown-returns -- the unlocked value has its table class's type, which the shared modifier chain cannot name
|
|
61
|
+
unlock(_locked_value, ..._args) {
|
|
62
|
+
throw new Error("Unimplemented");
|
|
63
|
+
}
|
|
64
|
+
unlockrequest(_data, _meta, ..._args) {
|
|
65
|
+
throw new Error("Unimplemented");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.TwoWayModifier = TwoWayModifier;
|
|
69
|
+
/**
|
|
70
|
+
* A modifier that holds a field's values in a record by key, as
|
|
71
|
+
* `LocalizationModifier` holds one text per locale.
|
|
72
|
+
*
|
|
73
|
+
* The key `"*"` addresses the whole record. The key `undefined` is no key:
|
|
74
|
+
* `lock` stores nothing under it, and `unlock` and `unlockrequest` find no
|
|
75
|
+
* value. A key given as a `ValueProxy` goes to the database as it is.
|
|
76
|
+
*/
|
|
77
|
+
class ContainerModifier extends TwoWayModifier {
|
|
78
|
+
/**
|
|
79
|
+
* Stores `value` under `key`. The wildcard key `"*"` replaces the whole
|
|
80
|
+
* container, so it takes a record of values by key; `undefined` or `null`
|
|
81
|
+
* clears it.
|
|
82
|
+
*
|
|
83
|
+
* @throws TypeError when `key` is `"*"` and `value` is neither a record,
|
|
84
|
+
* `undefined` nor `null`
|
|
85
|
+
*/
|
|
86
|
+
lock(
|
|
87
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- the container holds the field's values by key, typed by the table class, not by the modifier
|
|
88
|
+
locked_value,
|
|
89
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- a modified field's value has its table class's type, which the shared modifier chain cannot name
|
|
90
|
+
value, key) {
|
|
91
|
+
if (key === undefined) {
|
|
92
|
+
return locked_value ?? {};
|
|
93
|
+
}
|
|
94
|
+
if (key === "*") {
|
|
95
|
+
if (value === undefined || value === null) {
|
|
96
|
+
return {};
|
|
97
|
+
}
|
|
98
|
+
if (!(0, kinds_1.isRecord)(value)) {
|
|
99
|
+
throw new TypeError('The "*" key takes a record of values by key');
|
|
100
|
+
}
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
return locked_value
|
|
104
|
+
? {
|
|
105
|
+
...locked_value,
|
|
106
|
+
[key]: value,
|
|
107
|
+
}
|
|
108
|
+
: { [key]: value };
|
|
109
|
+
}
|
|
110
|
+
unlock(
|
|
111
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- the container holds the field's values by key, typed by the table class, not by the modifier
|
|
112
|
+
locked_value, key) {
|
|
113
|
+
if (key === undefined) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
if (key === "*") {
|
|
117
|
+
return locked_value;
|
|
118
|
+
}
|
|
119
|
+
return Object.hasOwn(locked_value, key) ? locked_value[key] : undefined;
|
|
120
|
+
}
|
|
121
|
+
unlockrequest(
|
|
122
|
+
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- the container holds the field's values by key, typed by the table class, not by the modifier
|
|
123
|
+
data, _meta, key) {
|
|
124
|
+
if (key === undefined) {
|
|
125
|
+
return DatabaseDev.ValueProxy.constant(null);
|
|
126
|
+
}
|
|
127
|
+
return data.key(key instanceof DatabaseDev.ValueProxy ? key.cast() : key);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.ContainerModifier = ContainerModifier;
|
|
131
|
+
//# sourceMappingURL=classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classes.js","sourceRoot":"","sources":["../../../src/modifiers/internal/classes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAAsC;AACtC,4EAA8D;AAE9D,mCAAmC;AAEtB,QAAA,WAAW,GAAG,MAAM,EAAE,CAAC;AAIpC,MAAa,QAAQ;IAMT,IAAI,CAAQ;IACZ,OAAO,CAAW;CAC7B;AARD,4BAQC;AAED,MAAa,cAKX,SAAQ,QAAuB;IACxB,IAAI,CACT,aAAqC;IACrC,+MAA+M;IAC/M,MAAe,EACf,GAAG,KAAW;QAEd,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IACM,IAAI,CACT,YAAwB;IACxB,+JAA+J;IAC/J,KAAc,EACd,GAAG,IAAU;QAEb,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,YAAY,CAAC;IAC/D,CAAC;CACF;AAtBD,wCAsBC;AAMD,MAAa,cAKX,SAAQ,cAA+C;IACvD,sJAAsJ;IAC/I,MAAM,CAAC,aAAyB,EAAE,GAAG,KAAW;QACrD,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IACM,aAAa,CAClB,KAAyC,EACzC,KAAmC,EACnC,GAAG,KAA4B;QAE/B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;CACF;AAjBD,wCAiBC;AAED;;;;;;;GAOG;AACH,MAAa,iBAGX,SAAQ,cAMT;IACC;;;;;;;OAOG;IACa,IAAI;IAClB,+JAA+J;IAC/J,YAAiD;IACjD,+JAA+J;IAC/J,KAAc,EACd,GAAuB;QAEvB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,YAAY,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,YAAY;YACjB,CAAC,CAAC;gBACE,GAAG,YAAY;gBACf,CAAC,GAAG,CAAC,EAAE,KAAK;aACb;YACH,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;IACe,MAAM;IACpB,+JAA+J;IAC/J,YAAqC,EACrC,GAAuB;QAEvB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;IACe,aAAa;IAC3B,+JAA+J;IAC/J,IAAqD,EACrD,KAAmC,EACnC,GAAsD;QAEtD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAU,IAAI,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CACb,GAAG,YAAY,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAU,CAAC,CAAC,CAAC,GAAG,CACjE,CAAC;IACJ,CAAC;CACF;AAtED,8CAsEC"}
|
|
@@ -34,6 +34,12 @@ export declare function assertModifiableField(tableName: string, modifierId: str
|
|
|
34
34
|
export declare function fieldsByKey(meta: ModifiersStaticMetadata): {
|
|
35
35
|
[field: PropertyKey]: ModifiedFieldList;
|
|
36
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Whether a value assigned from plain data to a field with these modifiers is
|
|
39
|
+
* locked: every modifier that locks does so without arguments. Otherwise the
|
|
40
|
+
* value stays floating until `localize()` or `unlock()` gives them.
|
|
41
|
+
*/
|
|
42
|
+
export declare function locksPlainData(list: ModifiedFieldList): boolean;
|
|
37
43
|
export declare function eventsByKey(meta: ModifiersStaticMetadata): Map<string, Array<[
|
|
38
44
|
field: PropertyKey,
|
|
39
45
|
modified: ModifiedFieldList[number],
|
|
@@ -4,6 +4,7 @@ exports.getInternal = getInternal;
|
|
|
4
4
|
exports.isEmptyInternal = isEmptyInternal;
|
|
5
5
|
exports.assertModifiableField = assertModifiableField;
|
|
6
6
|
exports.fieldsByKey = fieldsByKey;
|
|
7
|
+
exports.locksPlainData = locksPlainData;
|
|
7
8
|
exports.eventsByKey = eventsByKey;
|
|
8
9
|
exports.unlockArgsOf = unlockArgsOf;
|
|
9
10
|
exports.fieldTypesByKey = fieldTypesByKey;
|
|
@@ -44,6 +45,15 @@ function assertModifiableField(tableName, modifierId, field) {
|
|
|
44
45
|
function fieldsByKey(meta) {
|
|
45
46
|
return meta.fields;
|
|
46
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Whether a value assigned from plain data to a field with these modifiers is
|
|
50
|
+
* locked: every modifier that locks does so without arguments. Otherwise the
|
|
51
|
+
* value stays floating until `localize()` or `unlock()` gives them.
|
|
52
|
+
*/
|
|
53
|
+
function locksPlainData(list) {
|
|
54
|
+
return list.every(({ modifier }) => !("lock" in modifier) ||
|
|
55
|
+
("autolock" in modifier && Boolean(modifier.autolock)));
|
|
56
|
+
}
|
|
47
57
|
function eventsByKey(meta) {
|
|
48
58
|
return meta.events;
|
|
49
59
|
}
|
|
@@ -104,7 +114,8 @@ function listsCopied(entries) {
|
|
|
104
114
|
}
|
|
105
115
|
/** Fills `copy` with the modified fields and events of `parent`, every list copied. */
|
|
106
116
|
function copyModifierLists(copy, parent) {
|
|
107
|
-
|
|
117
|
+
const fields = fieldsByKey(parent);
|
|
118
|
+
copy.fields = Object.fromEntries(listsCopied(Reflect.ownKeys(fields).map((field) => [field, fields[field]])));
|
|
108
119
|
copy.events = new Map(listsCopied(parent.events));
|
|
109
120
|
return copy;
|
|
110
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/modifiers/internal/records.ts"],"names":[],"mappings":";;AAiCA,kCAQC;AAGD,0CAEC;AAMD,sDAgBC;AAED,kCAIC;AAED,kCAaC;AAED,oCAWC;AAED,0CAIC;AAED,gCAMC;AAED,sCAIC;AAED,8BAIC;AAGD,4CAqBC;AAED,0BAaC;AAUD,
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/modifiers/internal/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,21 @@ type Options = {
|
|
|
8
8
|
*/
|
|
9
9
|
fallbackLocale?: string;
|
|
10
10
|
};
|
|
11
|
+
/** The keys of the methods of `This`. */
|
|
12
|
+
type MethodKey<This> = {
|
|
13
|
+
[P in keyof This]-?: This[P] extends (...args: never[]) => void ? P : never;
|
|
14
|
+
}[keyof This];
|
|
15
|
+
/**
|
|
16
|
+
* A row read through `localize("*", fields)`: each listed field `K` holds its
|
|
17
|
+
* values by locale, and every other field keeps its type. A listed method
|
|
18
|
+
* stays callable. Its `localize` selects a locale again and gives back the
|
|
19
|
+
* row type.
|
|
20
|
+
*/
|
|
21
|
+
export type LocalizedRecords<This, K extends keyof This> = Omit<This, K | "localize"> & {
|
|
22
|
+
[P in Exclude<K, "localize">]: Record<string, Exclude<This[P], undefined>>;
|
|
23
|
+
} & Pick<This, Extract<Exclude<K, "localize">, MethodKey<This>>> & {
|
|
24
|
+
localize(locale: string, fields?: ReadonlyArray<keyof This>): This;
|
|
25
|
+
};
|
|
11
26
|
/**
|
|
12
27
|
* Localization modifier. enables the use of {@link Localized} on table fields.
|
|
13
28
|
*
|
|
@@ -31,11 +46,22 @@ export declare class LocalizationModifier extends ContainerModifier<Record<strin
|
|
|
31
46
|
* Stores an empty text as no text, so that the fallback locale answers for
|
|
32
47
|
* it in queries too (`unlockrequest`).
|
|
33
48
|
*/
|
|
34
|
-
lock(locked_value: Record<string, unknown> | undefined, value: unknown, key: string): Record<string, unknown>;
|
|
35
|
-
unlock(locked_value: Record<string, unknown>, key: string): unknown;
|
|
36
|
-
unlockrequest(data: DatabaseDev.ValueProxy<Record<string, unknown>>,
|
|
49
|
+
lock(locked_value: Record<string, unknown> | undefined, value: unknown, key: string | undefined): Record<string, unknown>;
|
|
50
|
+
unlock(locked_value: Record<string, unknown>, key: string | undefined): unknown;
|
|
51
|
+
unlockrequest(data: DatabaseDev.ValueProxy<Record<string, unknown>>, meta: DatabaseDev.ValueProxy<Record<string, never>>, key: DatabaseDev.ValueProxyOrValue<string | undefined>): DatabaseDev.ValueProxy<unknown>;
|
|
37
52
|
[MixinSymbol]: {
|
|
38
53
|
new (): {
|
|
54
|
+
/**
|
|
55
|
+
* Read or write every locale of the listed localized fields at once.
|
|
56
|
+
*
|
|
57
|
+
* @param locale - The wildcard key `"*"`.
|
|
58
|
+
* @param fields - Localized field names to unlock. Picks from the fields of the object this function is mixed into.
|
|
59
|
+
*
|
|
60
|
+
* @returns `this`, typed with each listed field as its values by locale
|
|
61
|
+
*/
|
|
62
|
+
localize<This extends {
|
|
63
|
+
constructor: any;
|
|
64
|
+
}, K extends keyof This>(this: This, locale: "*", fields: readonly K[]): LocalizedRecords<This, K>;
|
|
39
65
|
/**
|
|
40
66
|
* Specify which locale to use for accessing some or all localized fields.
|
|
41
67
|
*
|
|
@@ -46,7 +72,7 @@ export declare class LocalizationModifier extends ContainerModifier<Record<strin
|
|
|
46
72
|
*/
|
|
47
73
|
localize<This extends {
|
|
48
74
|
constructor: any;
|
|
49
|
-
}>(this: This, locale: string, fields?:
|
|
75
|
+
}>(this: This, locale: string, fields?: ReadonlyArray<keyof This>): This;
|
|
50
76
|
};
|
|
51
77
|
};
|
|
52
78
|
}
|
|
@@ -4,7 +4,6 @@ exports.Localized = exports.LocalizationModifier = void 0;
|
|
|
4
4
|
const decorators_1 = require("@antelopejs/interface-core/decorators");
|
|
5
5
|
const common_1 = require("../common");
|
|
6
6
|
const common_2 = require("./common");
|
|
7
|
-
const kinds_1 = require("./internal/kinds");
|
|
8
7
|
/** A text left empty in one language counts as no text in that language. */
|
|
9
8
|
const EMPTY_TEXT = "";
|
|
10
9
|
function withoutEmptyTexts(values) {
|
|
@@ -43,15 +42,11 @@ class LocalizationModifier extends common_2.ContainerModifier {
|
|
|
43
42
|
locked_value,
|
|
44
43
|
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- overrides ContainerModifier.lock; a modified field's value has its table class's type, which the shared modifier chain cannot name
|
|
45
44
|
value, key) {
|
|
46
|
-
if (key === "*") {
|
|
47
|
-
return (0, kinds_1.isRecord)(value)
|
|
48
|
-
? withoutEmptyTexts(value)
|
|
49
|
-
: super.lock(locked_value, value, key);
|
|
50
|
-
}
|
|
51
45
|
return withoutEmptyTexts(super.lock(locked_value, value, key));
|
|
52
46
|
}
|
|
47
|
+
unlock(
|
|
53
48
|
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- the container modifier leaves the values by locale untyped
|
|
54
|
-
|
|
49
|
+
locked_value, key) {
|
|
55
50
|
const unlocked = super.unlock(locked_value, key);
|
|
56
51
|
if (unlocked !== undefined && unlocked !== EMPTY_TEXT) {
|
|
57
52
|
return unlocked;
|
|
@@ -62,21 +57,14 @@ class LocalizationModifier extends common_2.ContainerModifier {
|
|
|
62
57
|
}
|
|
63
58
|
unlockrequest(
|
|
64
59
|
// oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- the container modifier leaves the values by locale untyped
|
|
65
|
-
data,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
60
|
+
data, meta, key) {
|
|
61
|
+
const unlocked = super.unlockrequest(data, meta, key);
|
|
62
|
+
const { fallbackLocale } = this.options;
|
|
63
|
+
return fallbackLocale
|
|
64
|
+
? unlocked.default(data.key(fallbackLocale))
|
|
65
|
+
: unlocked;
|
|
70
66
|
}
|
|
71
67
|
[common_2.MixinSymbol] = class {
|
|
72
|
-
/**
|
|
73
|
-
* Specify which locale to use for accessing some or all localized fields.
|
|
74
|
-
*
|
|
75
|
-
* @param locale - Locale to use to unlock the field(s).
|
|
76
|
-
* @param fields - Field names to unlock. Picks from the fields of the object this function is mixed into.
|
|
77
|
-
*
|
|
78
|
-
* @returns `this`
|
|
79
|
-
*/
|
|
80
68
|
localize(locale, fields) {
|
|
81
69
|
(0, common_2.unlock)(this, LocalizationModifier, fields, locale);
|
|
82
70
|
return this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localization.js","sourceRoot":"","sources":["../../src/modifiers/localization.ts"],"names":[],"mappings":";;;AACA,sEAA8E;AAE9E,sCAA4D;AAC5D,qCAMkB;
|
|
1
|
+
{"version":3,"file":"localization.js","sourceRoot":"","sources":["../../src/modifiers/localization.ts"],"names":[],"mappings":";;;AACA,sEAA8E;AAE9E,sCAA4D;AAC5D,qCAMkB;AA8BlB,4EAA4E;AAC5E,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,SAAS,iBAAiB,CAAI,MAAyB;IACrD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU,CAAC,CACnE,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAa,oBAAqB,SAAQ,0BAGzC;IACC;;;;;;;OAOG;IACI,MAAM,CAAC,gBAAgB,CAC5B,UAAyB,EACzB,KAAa;QAEb,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,UAAU,EAAE,gCAAuB,CAAC,CAAC,MAAM,CACtE,KAAK,CACN,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtD,0QAA0Q;QAC1Q,OAAQ,QAAQ,EAAE,QAA6C,EAAE,OAAO;aACrE,cAAc,CAAC;IACpB,CAAC;IAED;;;OAGG;IACa,IAAI;IAClB,6HAA6H;IAC7H,YAAiD;IACjD,iMAAiM;IACjM,KAAc,EACd,GAAuB;QAEvB,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;IAEe,MAAM;IACpB,6HAA6H;IAC7H,YAAqC,EACrC,GAAuB;QAEvB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YACtD,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAEe,aAAa;IAC3B,6HAA6H;IAC7H,IAAqD,EACrD,IAAmD,EACnD,GAAsD;QAEtD,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACxC,OAAO,cAAc;YACnB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC,CAAC,QAAQ,CAAC;IACf,CAAC;IAED,CAAC,oBAAW,CAAC,GAAG;QA2Bd,QAAQ,CAEN,MAAc,EACd,MAAkC;YAElC,IAAA,eAAM,EAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;CACH;AArGD,oDAqGC;AAED;;;;;;GAMG;AACU,QAAA,SAAS,GAAG,IAAA,kCAAqB,EAC5C,CAAC,MAAM,EAAE,WAAW,EAAE,OAAiB,EAAE,EAAE;IACzC,IAAA,uBAAc,EACZ,MAAM,CAAC,WAAW,EAClB,oBAAoB,EACpB,WAAW,EACX,OAAO,IAAI,EAAE,CACd,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -67,11 +67,15 @@ const AccountModel = (0, model_1.BasicDataModel)(Account, "hash_upgrade_accounts
|
|
|
67
67
|
throw new Error(`Row ${id} not found`);
|
|
68
68
|
return account;
|
|
69
69
|
}
|
|
70
|
+
/** Starts both async tests before the sync ones, so their scrypt runs overlap. */
|
|
70
71
|
async function expectVerifies(account) {
|
|
72
|
+
const pending = Promise.all([
|
|
73
|
+
account.testHashAsync("password", hash_rows_1.PASSWORD),
|
|
74
|
+
account.testHashAsync("password", WRONG_PASSWORD),
|
|
75
|
+
]);
|
|
71
76
|
(0, chai_1.expect)(account.testHash("password", hash_rows_1.PASSWORD)).to.equal(true);
|
|
72
|
-
(0, chai_1.expect)(await account.testHashAsync("password", hash_rows_1.PASSWORD)).to.equal(true);
|
|
73
77
|
(0, chai_1.expect)(account.testHash("password", WRONG_PASSWORD)).to.equal(false);
|
|
74
|
-
(0, chai_1.expect)(await
|
|
78
|
+
(0, chai_1.expect)(await pending).to.deep.equal([true, false]);
|
|
75
79
|
}
|
|
76
80
|
it("verifies, flags, re-hashes and saves a row written by 0.1.11", async () => {
|
|
77
81
|
const id = await storedRowFrom0_1_11();
|
|
@@ -85,6 +89,25 @@ const AccountModel = (0, model_1.BasicDataModel)(Account, "hash_upgrade_accounts
|
|
|
85
89
|
await expectVerifies(after);
|
|
86
90
|
(0, chai_1.expect)(after.isHashOutdated("password")).to.equal(false);
|
|
87
91
|
});
|
|
92
|
+
it("re-hashes with setHashAsync and saves it through a whole-row update", async () => {
|
|
93
|
+
const id = await storedRowFrom0_1_11();
|
|
94
|
+
const before = await reload(id);
|
|
95
|
+
await before.setHashAsync("password", hash_rows_1.PASSWORD);
|
|
96
|
+
await model.update(before);
|
|
97
|
+
const after = await reload(id);
|
|
98
|
+
(0, chai_1.expect)(after.password).to.match(/^\$scrypt\$ln=15,r=8,p=3\$/);
|
|
99
|
+
await expectVerifies(after);
|
|
100
|
+
(0, chai_1.expect)(after.isHashOutdated("password")).to.equal(false);
|
|
101
|
+
});
|
|
102
|
+
it("inserts a row whose hash setHashAsync wrote", async () => {
|
|
103
|
+
const account = new Account();
|
|
104
|
+
account.name = "Async";
|
|
105
|
+
await account.setHashAsync("password", hash_rows_1.PASSWORD);
|
|
106
|
+
const [id] = await model.insert(account);
|
|
107
|
+
const after = await reload(id);
|
|
108
|
+
(0, chai_1.expect)(after.password).to.equal(account.password);
|
|
109
|
+
await expectVerifies(after);
|
|
110
|
+
});
|
|
88
111
|
it("re-hashes through a partial update of the hashed field", async () => {
|
|
89
112
|
const id = await storedRowFrom0_1_11();
|
|
90
113
|
await model.update(id, { password: hash_rows_1.PASSWORD });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash_upgrade.test.js","sourceRoot":"","sources":["../../src/tests/hash_upgrade.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA8B;AAC9B,uEAAwD;AACxD,0CAA6C;AAC7C,oCAA0C;AAC1C,oDAAmD;AACnD,gDAA2C;AAC3C,4CAAyD;AACzD,sCAA0C;AAC1C,oCAAwC;AACxC,mDAA6E;AAE7E,MAAM,SAAS,GAAG,qBAAqB,CAAC;AACxC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAG1C,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,aAAK,CAAC,IAAI,CAAC,mBAAY,CAAC;CAa7C,CAAA;AATS;IADP,IAAA,aAAK,EAAC,QAAQ,CAAC;;qCACK;AAIb;IAFP,IAAA,qBAAU,GAAE;IACZ,IAAA,aAAK,EAAC,MAAM,CAAC;8BACK,IAAI;0CAAC;AAIhB;IAFP,IAAA,aAAM,GAAE;IACR,IAAA,aAAK,EAAC,QAAQ,CAAC;;yCACS;AAZrB,OAAO;IADZ,IAAA,sBAAa,EAAC,uBAAuB,EAAE,SAAS,CAAC;GAC5C,OAAO,CAaZ;AAED,MAAM,YAAY,GAAG,IAAA,sBAAc,EAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;AAEtE,IAAA,uBAAW,EAAC,wCAAwC,EAAE,GAAG,EAAE;IACzD,IAAI,KAAwC,CAAC;IAE7C,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,IAAA,yBAAc,EAAC,SAAS,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,2BAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAChE,KAAK,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,mBAAmB;QAChC,MAAM,GAAG,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,CAAC,KAAK;aACd,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,2BAAe,EAAE,GAAG,EAAE,CAAC,CAAC;aACpD,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,UAAU,gBAAgB;QAC7B,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAQ,EAAE,CAAC,CAAC;QACzE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,EAAU;QAC9B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,OAAgB;QAC5C,
|
|
1
|
+
{"version":3,"file":"hash_upgrade.test.js","sourceRoot":"","sources":["../../src/tests/hash_upgrade.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA8B;AAC9B,uEAAwD;AACxD,0CAA6C;AAC7C,oCAA0C;AAC1C,oDAAmD;AACnD,gDAA2C;AAC3C,4CAAyD;AACzD,sCAA0C;AAC1C,oCAAwC;AACxC,mDAA6E;AAE7E,MAAM,SAAS,GAAG,qBAAqB,CAAC;AACxC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAG1C,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,aAAK,CAAC,IAAI,CAAC,mBAAY,CAAC;CAa7C,CAAA;AATS;IADP,IAAA,aAAK,EAAC,QAAQ,CAAC;;qCACK;AAIb;IAFP,IAAA,qBAAU,GAAE;IACZ,IAAA,aAAK,EAAC,MAAM,CAAC;8BACK,IAAI;0CAAC;AAIhB;IAFP,IAAA,aAAM,GAAE;IACR,IAAA,aAAK,EAAC,QAAQ,CAAC;;yCACS;AAZrB,OAAO;IADZ,IAAA,sBAAa,EAAC,uBAAuB,EAAE,SAAS,CAAC;GAC5C,OAAO,CAaZ;AAED,MAAM,YAAY,GAAG,IAAA,sBAAc,EAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;AAEtE,IAAA,uBAAW,EAAC,wCAAwC,EAAE,GAAG,EAAE;IACzD,IAAI,KAAwC,CAAC;IAE7C,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,IAAA,yBAAc,EAAC,SAAS,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,2BAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAChE,KAAK,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,mBAAmB;QAChC,MAAM,GAAG,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,CAAC,KAAK;aACd,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,2BAAe,EAAE,GAAG,EAAE,CAAC,CAAC;aACpD,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,UAAU,gBAAgB;QAC7B,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAQ,EAAE,CAAC,CAAC;QACzE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,EAAU;QAC9B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kFAAkF;IAClF,KAAK,UAAU,cAAc,CAAC,OAAgB;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;YAC1B,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,oBAAQ,CAAC;YAC3C,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC;SAClD,CAAC,CAAC;QACH,IAAA,aAAM,EAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,oBAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAA,aAAM,EAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrE,IAAA,aAAM,EAAC,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAA,aAAM,EAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEzD,MAAM,CAAC,QAAQ,GAAG,oBAAQ,CAAC;QAC3B,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9D,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,oBAAQ,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9D,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;QACvB,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,oBAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAEvC,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,oBAAQ,EAAE,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzD,IAAA,aAAM,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,2BAAe,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI;QAC1B,CAAC,aAAa,EAAE,mBAAmB,CAAC;QACpC,CAAC,SAAS,EAAE,gBAAgB,CAAC;KACrB,EAAE,CAAC;QACX,EAAE,CAAC,yDAAyD,IAAI,MAAM,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAE3C,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAE5C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAA,aAAM,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvC,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,IAAI,MAAM,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YAEhC,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;YACzB,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE5B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAA,aAAM,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvC,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,IAAI,MAAM,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YAEhC,IAAA,aAAI,EAAC,OAAO,EAAE,mBAAY,EAAE,SAAS,CAAC,CAAC;YACvC,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE5B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|