@actdim/utico 1.2.5 → 1.2.7
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 +73 -3
- package/dist/arrayExtensions.es.js +64 -38
- package/dist/arrayExtensions.es.js.map +1 -1
- package/dist/asyncLock.es.js +45 -30
- package/dist/asyncLock.es.js.map +1 -1
- package/dist/cache/cacheContracts.es.js +8 -4
- package/dist/cache/cacheContracts.es.js.map +1 -1
- package/dist/cache/memoryCache.es.js +28 -13
- package/dist/cache/memoryCache.es.js.map +1 -1
- package/dist/cache/persistentCache.es.js +174 -97
- package/dist/cache/persistentCache.es.js.map +1 -1
- package/dist/dataFormats.es.js +4 -4
- package/dist/dataFormats.es.js.map +1 -1
- package/dist/dateTimeDataFormat.es.js +211 -130
- package/dist/dateTimeDataFormat.es.js.map +1 -1
- package/dist/decorators.es.js +15 -11
- package/dist/decorators.es.js.map +1 -1
- package/dist/gfx/canvasUtils.es.js +197 -114
- package/dist/gfx/canvasUtils.es.js.map +1 -1
- package/dist/gfx/color.es.js +134 -68
- package/dist/gfx/color.es.js.map +1 -1
- package/dist/i18n/cultures.es.js +8 -8
- package/dist/i18n/cultures.es.js.map +1 -1
- package/dist/i18n/enUsCulture.es.js +2 -2
- package/dist/i18n/enUsCulture.es.js.map +1 -1
- package/dist/i18n/euCulture.es.js +2 -2
- package/dist/i18n/euCulture.es.js.map +1 -1
- package/dist/i18n/invariantCulture.es.js +2 -2
- package/dist/i18n/invariantCulture.es.js.map +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/math.es.js +14 -8
- package/dist/math.es.js.map +1 -1
- package/dist/metadata.es.js +53 -25
- package/dist/metadata.es.js.map +1 -1
- package/dist/patterns.es.js +5 -3
- package/dist/patterns.es.js.map +1 -1
- package/dist/store/dataStore.es.js +241 -157
- package/dist/store/dataStore.es.js.map +1 -1
- package/dist/store/persistentStore.es.js +23 -17
- package/dist/store/persistentStore.es.js.map +1 -1
- package/dist/store/storeContracts.es.js +7 -3
- package/dist/store/storeContracts.es.js.map +1 -1
- package/dist/store/storeDb.es.js +87 -50
- package/dist/store/storeDb.es.js.map +1 -1
- package/dist/stringCore.es.js +60 -22
- package/dist/stringCore.es.js.map +1 -1
- package/dist/structEvent.es.js +30 -17
- package/dist/structEvent.es.js.map +1 -1
- package/dist/typeCore.es.js +25 -11
- package/dist/typeCore.es.js.map +1 -1
- package/dist/typeUtils.es.js +292 -182
- package/dist/typeUtils.es.js.map +1 -1
- package/dist/utils.d.ts +3 -3
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.es.js +138 -81
- package/dist/utils.es.js.map +1 -1
- package/dist/watchable.es.js +50 -27
- package/dist/watchable.es.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const _MetadataRecord = class _MetadataRecord {
|
|
2
4
|
key;
|
|
3
5
|
createdAt;
|
|
4
6
|
updatedAt;
|
|
@@ -9,8 +11,10 @@ class a {
|
|
|
9
11
|
// score?: number;
|
|
10
12
|
// startDate?/endDate?
|
|
11
13
|
// validFrom?/validTo?
|
|
12
|
-
}
|
|
14
|
+
};
|
|
15
|
+
__name(_MetadataRecord, "MetadataRecord");
|
|
16
|
+
let MetadataRecord = _MetadataRecord;
|
|
13
17
|
export {
|
|
14
|
-
|
|
18
|
+
MetadataRecord
|
|
15
19
|
};
|
|
16
20
|
//# sourceMappingURL=storeContracts.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeContracts.es.js","sources":["D:/Src/my/actdim/public/utico/src/store/storeContracts.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"storeContracts.es.js","sources":["D:/Src/my/actdim/public/utico/src/store/storeContracts.ts"],"sourcesContent":["import { CommonPartFromSchema, KeyPathValueMap } from \"@/typeCore\";\r\nimport * as Dexie from \"dexie\";\r\n\r\n// Making some navigation properties non-enumerable will prevent them from being handled by IndexedDB\r\n// when doing put() or add().\r\n// Object.defineProperties(obj, {\r\n// ...: { value: [], enumerable: false, writable: true }\r\n// });\r\n\r\n// MetadataEntry\r\nexport class MetadataRecord {\r\n key?: string;\r\n createdAt?: number;\r\n updatedAt?: number; // lastModified\r\n tags?: string[];\r\n // timestamp?: number; \r\n // magnitude?: number;\r\n // score?: number;\r\n // startDate?/endDate?\r\n // validFrom?/validTo?\r\n}\r\n\r\n// DataEntry\r\nexport type DataRecord<TValue = unknown> = {\r\n key: string;\r\n value: TValue;\r\n}\r\n\r\nexport type StoreItem<T extends MetadataRecord = MetadataRecord, TValue = unknown> = {\r\n metadata?: T,\r\n data?: DataRecord<TValue>;\r\n}\r\n\r\nexport type ChangeSet<T, TKey = string> = {\r\n key: TKey;\r\n changes: KeyPathValueMap<T, false>;\r\n}\r\n\r\nexport type BaseMetadataField = keyof MetadataRecord;\r\n// ++: auto-increment primary key\r\n// &: unique\r\n// *: array\r\nexport type FieldDef<T extends string> = T | `&${T}` | `*${T}` | `++${T}`;\r\nexport type BaseFieldDef = FieldDef<BaseMetadataField>;\r\n\r\n// DbFieldTemplate\r\nexport type FieldDefTemplate<T extends string> = FieldDef<T>[];\r\n\r\nexport type IndexableType = Dexie.IndexableTypePart;\r\nexport type IndexableTypeArray = Dexie.IndexableTypeArray;\r\nexport type TransactionMode = Dexie.TransactionMode;\r\nexport type OrderDirection = \"asc\" | \"desc\";\r\n\r\nexport type WhereFilter<T extends IndexableType, TResult = unknown> = {\r\n above(value: T): TResult;\r\n aboveOrEqual(value: T): TResult;\r\n anyOf(values: ReadonlyArray<T>): TResult;\r\n anyOfIgnoreCase(keys: T extends string ? T[] : never): T extends string ? TResult : never;\r\n below(value: T): TResult;\r\n belowOrEqual(value: T): TResult;\r\n between(lower: T, upper: T, includeLower?: boolean, includeUpper?: boolean): TResult;\r\n equals(value: T): TResult;\r\n equalsIgnoreCase(value: string): TResult;\r\n inAnyRange(ranges: ReadonlyArray<{\r\n 0: T;\r\n 1: T;\r\n }>, options?: {\r\n includeLowers?: boolean;\r\n includeUppers?: boolean;\r\n }): TResult;\r\n startsWith(prefix: T extends string ? T : never): T extends string ? TResult : never;\r\n startsWithAnyOf(prefixes: T extends string ? T[] : never): T extends string ? TResult : never;\r\n startsWithIgnoreCase(prefix: T extends string ? T : never): T extends string ? TResult : never;\r\n startsWithAnyOfIgnoreCase(prefixes: T extends string ? T[] : never): T extends string ? TResult : never;\r\n noneOf(values: ReadonlyArray<T>): TResult;\r\n notEqual(value: T): TResult;\r\n}\r\n\r\nexport type StoreBase = {\r\n open(): PromiseLike<void>;\r\n}\r\n\r\nexport interface IStoreCollection<T extends MetadataRecord = MetadataRecord, TValue = unknown> {\r\n toArray(orderBy?: keyof T, orderDirection?: OrderDirection, transactionMode?: TransactionMode): Promise<StoreItem<T, TValue>[]>;\r\n orderBy(field: keyof T, direction: OrderDirection, transactionMode?: TransactionMode): Promise<StoreItem<T, TValue>[]>;\r\n filter(filter: (x: T) => boolean): IStoreCollection<T, TValue>;\r\n limit(n: number): IStoreCollection<T, TValue>;\r\n offset(n: number): IStoreCollection<T, TValue>;\r\n getKeys(): Promise<T[\"key\"][]>;\r\n getCount(): Promise<number>;\r\n modifyMetadata(callback: (metadataRecord: T) => void, transactionMode?: TransactionMode): Promise<number>;\r\n modifyData(callback: (dataRecord: DataRecord) => void, transactionMode?: TransactionMode): Promise<number>;\r\n modify(metadataCallback: (metadataRecord: T) => void, dataCallback: (dataRecord: DataRecord) => void, transactionMode?: TransactionMode): Promise<number>;\r\n}\r\n\r\n// IKVStore\r\nexport interface IPersistentStore<T extends MetadataRecord = MetadataRecord> {\r\n\r\n open(): Promise<void>;\r\n\r\n getKeys(): Promise<string[]>;\r\n\r\n contains(key: string): Promise<boolean>;\r\n\r\n delete(key: string): Promise<void>;\r\n\r\n bulkDelete(keys: string[]): Promise<void>;\r\n\r\n clear(): Promise<void>;\r\n\r\n get<TValue = unknown>(key: string): Promise<StoreItem<T, TValue> | undefined>;\r\n\r\n set<TValue = unknown>(metadataRecord: T, value: TValue): Promise<string>;\r\n\r\n getOrSet<TValue = unknown>(metadataRecord: MetadataRecord, factory: (metadataRecord: MetadataRecord) => TValue): Promise<StoreItem<T, TValue>>\r\n\r\n bulkGet<TValue = unknown>(keys: string[]): Promise<StoreItem<T, TValue>[]>;\r\n\r\n bulkSet<TValue = unknown>(metadataRecords: MetadataRecord[], dataRecords: DataRecord<TValue>[]): Promise<string[]>;\r\n\r\n orderBy(field: keyof T, direction: OrderDirection, distinct?: boolean): IStoreCollection<T>;\r\n\r\n distinct(field: keyof T): IStoreCollection<T>;\r\n\r\n query<TValue = unknown>(): IStoreCollection<T, TValue>;\r\n\r\n // filter\r\n where<K extends keyof T, TValue = unknown>(field: K extends string ? K : never): WhereFilter<T[K] extends IndexableType ? T[K] : never, IStoreCollection<T, TValue>>;\r\n\r\n update<TValue = unknown>(key: string, metadataChanges: KeyPathValueMap<T, false>, valueChanges?: KeyPathValueMap<TValue, false>, transactionMode?: TransactionMode): Promise<number>;\r\n\r\n bulkUpdate(metadataChangeSets: ChangeSet<T>[], dataChangeSets?: ChangeSet<DataRecord>[], transactionMode?: TransactionMode): Promise<number>;\r\n\r\n [Symbol.dispose]: () => void;\r\n}"],"names":[],"mappings":";;AAUO,MAAM,kBAAN,MAAM,gBAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMJ;AAV4B;AAArB,IAAM,iBAAN;"}
|
package/dist/store/storeDb.es.js
CHANGED
|
@@ -1,91 +1,128 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { AsyncLock } from "../asyncLock.es.js";
|
|
4
|
+
import * as Dexie from "dexie";
|
|
5
|
+
const metadataTableName = "metadata";
|
|
6
|
+
const dataTableName = "data";
|
|
7
|
+
const dataFieldDefTemplate = ["&key", "value"];
|
|
8
|
+
const lock = new AsyncLock();
|
|
9
|
+
const _StoreDb = class _StoreDb extends Dexie.Dexie {
|
|
5
10
|
// catalog/registry
|
|
6
11
|
metadata;
|
|
7
12
|
data;
|
|
8
13
|
_isDisposed;
|
|
9
|
-
constructor(
|
|
10
|
-
if (!
|
|
14
|
+
constructor(name, metadataFieldDefTemplate) {
|
|
15
|
+
if (!name) {
|
|
11
16
|
throw new Error("Invalid database name.");
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
})
|
|
17
|
+
}
|
|
18
|
+
super(name);
|
|
19
|
+
this._isDisposed = false;
|
|
20
|
+
const db = this;
|
|
21
|
+
db.version(1).stores({
|
|
22
|
+
[metadataTableName]: metadataFieldDefTemplate.join(", "),
|
|
23
|
+
[dataTableName]: dataFieldDefTemplate.join(", ")
|
|
24
|
+
});
|
|
25
|
+
this.metadata = db.table(metadataTableName);
|
|
26
|
+
this.data = db.table(dataTableName);
|
|
27
|
+
this.metadata.hook("creating", (key, obj) => {
|
|
28
|
+
obj.createdAt = Date.now();
|
|
29
|
+
});
|
|
30
|
+
this.metadata.hook("updating", (mods, key, obj) => {
|
|
31
|
+
return { ...mods, updatedAt: Date.now() };
|
|
32
|
+
});
|
|
20
33
|
}
|
|
21
34
|
[Symbol.dispose]() {
|
|
22
|
-
|
|
35
|
+
if (!this._isDisposed) {
|
|
36
|
+
if (this.isOpen()) {
|
|
37
|
+
this.close();
|
|
38
|
+
}
|
|
39
|
+
this._isDisposed = true;
|
|
40
|
+
}
|
|
23
41
|
}
|
|
24
42
|
async open() {
|
|
25
|
-
if (this.isOpen())
|
|
43
|
+
if (this.isOpen()) {
|
|
26
44
|
return this;
|
|
45
|
+
}
|
|
27
46
|
try {
|
|
28
47
|
return await super.open();
|
|
29
|
-
} catch (
|
|
30
|
-
if (
|
|
48
|
+
} catch (err) {
|
|
49
|
+
if (err instanceof Dexie.Dexie.OpenFailedError) {
|
|
31
50
|
return await super.open();
|
|
32
|
-
|
|
51
|
+
} else {
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
33
54
|
}
|
|
34
55
|
}
|
|
35
|
-
async exec(
|
|
56
|
+
async exec(action, transactionMode = "r!") {
|
|
36
57
|
await this.open();
|
|
37
58
|
try {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
59
|
+
const result = await this.transaction(transactionMode, this.metadata, this.data, async () => {
|
|
60
|
+
return await action();
|
|
61
|
+
});
|
|
62
|
+
return result;
|
|
63
|
+
} catch (err) {
|
|
64
|
+
if (this.isOpen()) ;
|
|
65
|
+
throw err;
|
|
41
66
|
}
|
|
42
67
|
}
|
|
43
68
|
async getKeys() {
|
|
44
69
|
return this.metadata.toCollection().primaryKeys();
|
|
45
70
|
}
|
|
46
|
-
async contains(
|
|
47
|
-
return await this.exec(async () =>
|
|
71
|
+
async contains(key, transactionMode = "r") {
|
|
72
|
+
return await this.exec(async () => {
|
|
73
|
+
const metadataRecord = await this.metadata.get(key);
|
|
74
|
+
return metadataRecord !== void 0;
|
|
75
|
+
}, transactionMode);
|
|
48
76
|
}
|
|
49
|
-
async deleteOne(
|
|
77
|
+
async deleteOne(key, transactionMode = "rw") {
|
|
50
78
|
await this.exec(async () => {
|
|
51
|
-
await this.metadata.delete(
|
|
52
|
-
|
|
79
|
+
await this.metadata.delete(key);
|
|
80
|
+
await this.data.delete(key);
|
|
81
|
+
}, transactionMode);
|
|
53
82
|
}
|
|
54
83
|
// deleteManyAsync
|
|
55
|
-
async bulkDelete(
|
|
84
|
+
async bulkDelete(keys, transactionMode = "rw") {
|
|
56
85
|
await this.exec(async () => {
|
|
57
|
-
await this.metadata.bulkDelete(
|
|
58
|
-
|
|
86
|
+
await this.metadata.bulkDelete(keys);
|
|
87
|
+
await this.data.bulkDelete(keys);
|
|
88
|
+
}, transactionMode);
|
|
59
89
|
}
|
|
60
90
|
// clearAll
|
|
61
|
-
async clear(
|
|
91
|
+
async clear(transactionMode = "rw") {
|
|
62
92
|
await this.exec(async () => {
|
|
63
|
-
await this.metadata.clear()
|
|
64
|
-
|
|
93
|
+
await this.metadata.clear();
|
|
94
|
+
await this.data.clear();
|
|
95
|
+
}, transactionMode);
|
|
65
96
|
}
|
|
66
|
-
static async delete(
|
|
97
|
+
static async delete(name) {
|
|
67
98
|
try {
|
|
68
|
-
await
|
|
69
|
-
await
|
|
99
|
+
await lock.dispatch(async () => {
|
|
100
|
+
if (await _StoreDb.exists(name)) {
|
|
101
|
+
await Dexie.Dexie.delete(name);
|
|
102
|
+
}
|
|
70
103
|
});
|
|
71
|
-
} catch (
|
|
72
|
-
if (
|
|
73
|
-
console.warn(`[DataStore] delete(${
|
|
74
|
-
else
|
|
75
|
-
throw
|
|
104
|
+
} catch (err) {
|
|
105
|
+
if (err instanceof Dexie.Dexie.InvalidStateError || err instanceof Dexie.Dexie.VersionError) {
|
|
106
|
+
console.warn(`[DataStore] delete(${name}) failed:`, err);
|
|
107
|
+
} else {
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
76
110
|
}
|
|
77
111
|
}
|
|
78
|
-
static exists(
|
|
79
|
-
return
|
|
112
|
+
static exists(name) {
|
|
113
|
+
return Dexie.Dexie.exists(name);
|
|
80
114
|
}
|
|
81
|
-
static async open(
|
|
82
|
-
return await
|
|
83
|
-
const
|
|
84
|
-
|
|
115
|
+
static async open(name, factory) {
|
|
116
|
+
return await lock.dispatch(async () => {
|
|
117
|
+
const store = factory(name);
|
|
118
|
+
await store.open();
|
|
119
|
+
return store;
|
|
85
120
|
});
|
|
86
121
|
}
|
|
87
|
-
}
|
|
122
|
+
};
|
|
123
|
+
__name(_StoreDb, "StoreDb");
|
|
124
|
+
let StoreDb = _StoreDb;
|
|
88
125
|
export {
|
|
89
|
-
|
|
126
|
+
StoreDb
|
|
90
127
|
};
|
|
91
128
|
//# sourceMappingURL=storeDb.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeDb.es.js","sources":["D:/Src/my/actdim/public/utico/src/store/storeDb.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"storeDb.es.js","sources":["D:/Src/my/actdim/public/utico/src/store/storeDb.ts"],"sourcesContent":["import { AsyncLock } from \"@/asyncLock\";\r\nimport { DataRecord, FieldDefTemplate, MetadataRecord, StoreBase, TransactionMode } from \"./storeContracts\";\r\nimport * as Dexie from \"dexie\";\r\n\r\nconst metadataTableName = \"metadata\";\r\nconst dataTableName = \"data\";\r\nconst dataFieldDefTemplate: FieldDefTemplate<keyof DataRecord> = [\"&key\", \"value\"];\r\n\r\nconst lock = new AsyncLock();\r\n\r\nexport class StoreDb<T extends MetadataRecord = MetadataRecord, TValue = unknown> extends Dexie.Dexie {\r\n // catalog/registry\r\n metadata: Dexie.Table<T, string>;\r\n data: Dexie.Table<DataRecord<TValue>, string>;\r\n\r\n protected _isDisposed: boolean;\r\n\r\n constructor(name: string, metadataFieldDefTemplate: keyof T extends string ? FieldDefTemplate<keyof T> : never) {\r\n // navigator.storage.estimate()\r\n // navigator.webkitTemporaryStorage.queryUsageAndQuota()\r\n\r\n if (!name) {\r\n throw new Error(\"Invalid database name.\"); // cannot be empty\r\n }\r\n\r\n super(name); // {autoOpen: false}\r\n\r\n this._isDisposed = false;\r\n\r\n const db = this;\r\n\r\n db.version(1).stores({\r\n [metadataTableName]: metadataFieldDefTemplate.join(\", \"),\r\n [dataTableName]: dataFieldDefTemplate.join(\", \")\r\n });\r\n\r\n // db.version(2).stores({\r\n // \t// ...\r\n // }).upgrade(trans => {\r\n // \treturn trans.table(dataTableName).toCollection().modify((entry: MetadataRecord) => {\r\n // \t\t// ...\r\n // \t});\r\n // });\r\n\r\n this.metadata = db.table(metadataTableName);\r\n this.data = db.table(dataTableName);\r\n\r\n this.metadata.hook('creating', (key, obj) => {\r\n obj.createdAt = Date.now();\r\n });\r\n\r\n this.metadata.hook('updating', (mods, key, obj) => {\r\n return { ...mods, updatedAt: Date.now() };\r\n });\r\n\r\n // additional way to handle relationships\r\n // this.metadata.hook(\"deleting\", (key, obj, transaction) => {\r\n // // only synchronous code!\r\n // transaction.table(dataTableName).delete(key);\r\n // });\r\n\r\n // this.metadata.mapToClass(MetadataRecord);\r\n // this.data.mapToClass(DataRecord);\r\n\r\n // this.on('populate', () => db.metadata.bulkAdd([\r\n // \t// ...\r\n // ]));\r\n }\r\n\r\n [Symbol.dispose]() {\r\n if (!this._isDisposed) {\r\n if (this.isOpen()) {\r\n this.close();\r\n }\r\n this._isDisposed = true;\r\n }\r\n }\r\n\r\n async open() {\r\n if (this.isOpen()) {\r\n return this;\r\n }\r\n try {\r\n return await super.open();\r\n } catch (err) {\r\n if (err instanceof Dexie.Dexie.OpenFailedError) {\r\n return await super.open();\r\n } else {\r\n throw err;\r\n }\r\n }\r\n // TODO: log (this.verno, this._dbSchema etc)\r\n\r\n }\r\n\r\n async exec<T>(\r\n action: () => Promise<T>, // scope\r\n transactionMode: TransactionMode = \"r!\") {\r\n await this.open();\r\n try {\r\n const result = await this.transaction(transactionMode, this.metadata, this.data, async () => {\r\n return await action();\r\n });\r\n return result;\r\n } catch (err) {\r\n if (this.isOpen()) {\r\n // this._db.close(); // generally speaking: we don't (never) need to close a connection\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n async getKeys() {\r\n return this.metadata.toCollection().primaryKeys();\r\n }\r\n\r\n async contains(key: string, transactionMode: TransactionMode = \"r\") {\r\n return await this.exec(async () => {\r\n const metadataRecord = await this.metadata.get(key);\r\n return metadataRecord !== undefined;\r\n }, transactionMode);\r\n }\r\n\r\n async deleteOne(key: string, transactionMode: TransactionMode = \"rw\") {\r\n await this.exec(async () => {\r\n await this.metadata.delete(key);\r\n await this.data.delete(key);\r\n }, transactionMode);\r\n }\r\n\r\n // deleteManyAsync\r\n async bulkDelete(keys: string[], transactionMode: TransactionMode = \"rw\") {\r\n await this.exec(async () => {\r\n await this.metadata.bulkDelete(keys);\r\n await this.data.bulkDelete(keys);\r\n }, transactionMode);\r\n }\r\n\r\n // clearAll\r\n async clear(transactionMode: TransactionMode = \"rw\") {\r\n await this.exec(async () => {\r\n await this.metadata.clear();\r\n await this.data.clear();\r\n }, transactionMode);\r\n }\r\n\r\n static async delete(name: string) {\r\n try {\r\n await lock.dispatch(async () => {\r\n if (await StoreDb.exists(name)) {\r\n await Dexie.Dexie.delete(name);\r\n }\r\n });\r\n } catch (err) {\r\n if (err instanceof Dexie.Dexie.InvalidStateError || err instanceof Dexie.Dexie.VersionError) {\r\n console.warn(`[DataStore] delete(${name}) failed:`, err);\r\n } else {\r\n throw err;\r\n }\r\n }\r\n }\r\n\r\n static exists(name: string) {\r\n return Dexie.Dexie.exists(name);\r\n }\r\n\r\n static async open<T extends StoreBase>(name: string, factory: (name: string) => T) {\r\n return await lock.dispatch(async () => {\r\n const store = factory(name);\r\n await store.open();\r\n return store;\r\n });\r\n }\r\n}"],"names":[],"mappings":"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"}
|
package/dist/stringCore.es.js
CHANGED
|
@@ -1,35 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const defaultLocale = typeof navigator !== "undefined" ? navigator.language : "en-US";
|
|
4
|
+
const defaulCollator = Intl.Collator();
|
|
5
|
+
const ciCompare = (() => {
|
|
6
|
+
const collatorOptions = {
|
|
3
7
|
sensitivity: "accent"
|
|
4
8
|
// or "base"
|
|
5
9
|
};
|
|
6
|
-
return "A".localeCompare("a", void 0,
|
|
10
|
+
return "A".localeCompare("a", void 0, collatorOptions) ? (strA, strB, locale = defaultLocale) => {
|
|
11
|
+
return strA.localeCompare(strB, locale, collatorOptions);
|
|
12
|
+
} : (strA, strB, locale) => {
|
|
13
|
+
return strA.toLocaleUpperCase(locale).localeCompare(strB.toLocaleUpperCase(locale), locale);
|
|
14
|
+
};
|
|
7
15
|
})();
|
|
8
|
-
function
|
|
9
|
-
|
|
16
|
+
function compare(strA, strB, ignoreCase = false, locale = defaultLocale) {
|
|
17
|
+
if (typeof strA !== "string" || typeof strB !== "string") {
|
|
18
|
+
return defaulCollator.compare(strA, strB);
|
|
19
|
+
}
|
|
20
|
+
if (ignoreCase) {
|
|
21
|
+
return ciCompare(strA, strB, locale);
|
|
22
|
+
}
|
|
23
|
+
return strA.localeCompare(strB, locale);
|
|
10
24
|
}
|
|
11
|
-
|
|
12
|
-
|
|
25
|
+
__name(compare, "compare");
|
|
26
|
+
function equals(strA, strB, ignoreCase = false, locale = defaultLocale) {
|
|
27
|
+
if (typeof strA !== "string" || typeof strB !== "string") {
|
|
28
|
+
return strA === strB;
|
|
29
|
+
}
|
|
30
|
+
if (ignoreCase) {
|
|
31
|
+
return ciCompare(strA, strB) === 0;
|
|
32
|
+
}
|
|
33
|
+
return strA.localeCompare(strB, locale) === 0;
|
|
13
34
|
}
|
|
14
|
-
|
|
15
|
-
|
|
35
|
+
__name(equals, "equals");
|
|
36
|
+
function ciStartsWith(str, searchStr, locale = defaultLocale) {
|
|
37
|
+
if (typeof str !== "string" || typeof searchStr !== "string" || str.length < searchStr.length) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return equals(str.substring(0, searchStr.length), searchStr, true, locale);
|
|
16
41
|
}
|
|
17
|
-
|
|
18
|
-
|
|
42
|
+
__name(ciStartsWith, "ciStartsWith");
|
|
43
|
+
function ciEndsWith(str, searchStr, locale = defaultLocale) {
|
|
44
|
+
if (typeof str !== "string" || typeof searchStr !== "string" || str.length < searchStr.length) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return equals(str.substring(str.length - searchStr.length), searchStr, true, locale);
|
|
19
48
|
}
|
|
20
|
-
|
|
21
|
-
|
|
49
|
+
__name(ciEndsWith, "ciEndsWith");
|
|
50
|
+
function ciIndexOf(str, searchStr, locale = defaultLocale) {
|
|
51
|
+
if (typeof str !== "string" || typeof searchStr !== "string" || str.length < searchStr.length) {
|
|
52
|
+
return -1;
|
|
53
|
+
}
|
|
54
|
+
return str.toLocaleUpperCase(locale).indexOf(searchStr.toLocaleUpperCase(locale));
|
|
22
55
|
}
|
|
23
|
-
|
|
24
|
-
|
|
56
|
+
__name(ciIndexOf, "ciIndexOf");
|
|
57
|
+
function ciIncludes(str, searchStr, locale = defaultLocale) {
|
|
58
|
+
if (typeof str !== "string" || typeof searchStr !== "string" || str.length < searchStr.length) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return str.toLocaleUpperCase(locale).includes(searchStr.toLocaleUpperCase(locale));
|
|
25
62
|
}
|
|
63
|
+
__name(ciIncludes, "ciIncludes");
|
|
26
64
|
export {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
65
|
+
ciCompare,
|
|
66
|
+
ciEndsWith,
|
|
67
|
+
ciIncludes,
|
|
68
|
+
ciIndexOf,
|
|
69
|
+
ciStartsWith,
|
|
70
|
+
compare,
|
|
71
|
+
equals
|
|
34
72
|
};
|
|
35
73
|
//# sourceMappingURL=stringCore.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringCore.es.js","sources":["D:/Src/my/actdim/public/utico/src/stringCore.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"stringCore.es.js","sources":["D:/Src/my/actdim/public/utico/src/stringCore.ts"],"sourcesContent":["const defaultLocale = typeof navigator !== 'undefined' ? navigator.language : 'en-US';\r\nconst defaulCollator = Intl.Collator();\r\n\r\nconst ciCompare = (() => {\r\n const collatorOptions: Intl.CollatorOptions = {\r\n sensitivity: \"accent\" // or \"base\"\r\n };\r\n ;\r\n // feature detection\r\n return 'A'.localeCompare('a', undefined, collatorOptions) ? (strA: string, strB: string, locale = defaultLocale) => {\r\n return strA.localeCompare(strB, locale, collatorOptions)\r\n } : (strA: string, strB: string, locale?: string) => {\r\n // fallback approach\r\n return strA.toLocaleUpperCase(locale).localeCompare(strB.toLocaleUpperCase(locale), locale);\r\n };\r\n})();\r\n\r\nfunction compare(strA: string, strB: string, ignoreCase = false, locale = defaultLocale) {\r\n if (typeof strA !== 'string' || typeof strB !== 'string') {\r\n return defaulCollator.compare(strA, strB);\r\n }\r\n if (ignoreCase) {\r\n return ciCompare(strA, strB, locale);\r\n }\r\n return strA.localeCompare(strB, locale);\r\n}\r\n\r\n// isEqual\r\nfunction equals(strA: string, strB: string, ignoreCase = false, locale = defaultLocale) {\r\n if (typeof strA !== 'string' || typeof strB !== 'string') {\r\n return strA === strB;\r\n }\r\n if (ignoreCase) {\r\n return ciCompare(strA, strB) === 0;\r\n }\r\n return strA.localeCompare(strB, locale) === 0;\r\n}\r\n\r\nfunction ciStartsWith(str: string, searchStr: string, locale = defaultLocale) {\r\n if (typeof str !== 'string' || typeof searchStr !== 'string' || str.length < searchStr.length) {\r\n return false;\r\n }\r\n return equals(str.substring(0, searchStr.length), searchStr, true, locale);\r\n}\r\n\r\nfunction ciEndsWith(str: string, searchStr: string, locale = defaultLocale) {\r\n if (typeof str !== 'string' || typeof searchStr !== 'string' || str.length < searchStr.length) {\r\n return false;\r\n }\r\n return equals(str.substring(str.length - searchStr.length), searchStr, true, locale);\r\n}\r\n\r\nfunction ciIndexOf(str: string, searchStr: string, locale = defaultLocale) {\r\n if (typeof str !== 'string' || typeof searchStr !== 'string' || str.length < searchStr.length) {\r\n return -1;\r\n }\r\n return str.toLocaleUpperCase(locale).indexOf(searchStr.toLocaleUpperCase(locale));\r\n}\r\n\r\nfunction ciIncludes(str: string, searchStr: string, locale = defaultLocale) {\r\n if (typeof str !== 'string' || typeof searchStr !== 'string' || str.length < searchStr.length) {\r\n return false;\r\n }\r\n return str.toLocaleUpperCase(locale).includes(searchStr.toLocaleUpperCase(locale));\r\n}\r\n\r\nexport {\r\n equals,\r\n compare,\r\n ciCompare,\r\n ciStartsWith,\r\n ciEndsWith,\r\n ciIndexOf,\r\n ciIncludes\r\n};"],"names":[],"mappings":";;AAAA,MAAM,gBAAgB,OAAO,cAAc,cAAc,UAAU,WAAW;AAC9E,MAAM,iBAAiB,KAAK,SAAA;AAE5B,MAAM,aAAa,MAAM;AACrB,QAAM,kBAAwC;AAAA,IAC1C,aAAa;AAAA;AAAA,EAAA;AAIjB,SAAO,IAAI,cAAc,KAAK,QAAW,eAAe,IAAI,CAAC,MAAc,MAAc,SAAS,kBAAkB;AAChH,WAAO,KAAK,cAAc,MAAM,QAAQ,eAAe;AAAA,EAC3D,IAAI,CAAC,MAAc,MAAc,WAAoB;AAEjD,WAAO,KAAK,kBAAkB,MAAM,EAAE,cAAc,KAAK,kBAAkB,MAAM,GAAG,MAAM;AAAA,EAC9F;AACJ,GAAA;AAEA,SAAS,QAAQ,MAAc,MAAc,aAAa,OAAO,SAAS,eAAe;AACrF,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACtD,WAAO,eAAe,QAAQ,MAAM,IAAI;AAAA,EAC5C;AACA,MAAI,YAAY;AACZ,WAAO,UAAU,MAAM,MAAM,MAAM;AAAA,EACvC;AACA,SAAO,KAAK,cAAc,MAAM,MAAM;AAC1C;AARS;AAWT,SAAS,OAAO,MAAc,MAAc,aAAa,OAAO,SAAS,eAAe;AACpF,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACtD,WAAO,SAAS;AAAA,EACpB;AACA,MAAI,YAAY;AACZ,WAAO,UAAU,MAAM,IAAI,MAAM;AAAA,EACrC;AACA,SAAO,KAAK,cAAc,MAAM,MAAM,MAAM;AAChD;AARS;AAUT,SAAS,aAAa,KAAa,WAAmB,SAAS,eAAe;AAC1E,MAAI,OAAO,QAAQ,YAAY,OAAO,cAAc,YAAY,IAAI,SAAS,UAAU,QAAQ;AAC3F,WAAO;AAAA,EACX;AACA,SAAO,OAAO,IAAI,UAAU,GAAG,UAAU,MAAM,GAAG,WAAW,MAAM,MAAM;AAC7E;AALS;AAOT,SAAS,WAAW,KAAa,WAAmB,SAAS,eAAe;AACxE,MAAI,OAAO,QAAQ,YAAY,OAAO,cAAc,YAAY,IAAI,SAAS,UAAU,QAAQ;AAC3F,WAAO;AAAA,EACX;AACA,SAAO,OAAO,IAAI,UAAU,IAAI,SAAS,UAAU,MAAM,GAAG,WAAW,MAAM,MAAM;AACvF;AALS;AAOT,SAAS,UAAU,KAAa,WAAmB,SAAS,eAAe;AACvE,MAAI,OAAO,QAAQ,YAAY,OAAO,cAAc,YAAY,IAAI,SAAS,UAAU,QAAQ;AAC3F,WAAO;AAAA,EACX;AACA,SAAO,IAAI,kBAAkB,MAAM,EAAE,QAAQ,UAAU,kBAAkB,MAAM,CAAC;AACpF;AALS;AAOT,SAAS,WAAW,KAAa,WAAmB,SAAS,eAAe;AACxE,MAAI,OAAO,QAAQ,YAAY,OAAO,cAAc,YAAY,IAAI,SAAS,UAAU,QAAQ;AAC3F,WAAO;AAAA,EACX;AACA,SAAO,IAAI,kBAAkB,MAAM,EAAE,SAAS,UAAU,kBAAkB,MAAM,CAAC;AACrF;AALS;"}
|
package/dist/structEvent.es.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const _StructEvent = class _StructEvent extends CustomEvent {
|
|
2
4
|
// with useDefineForClassFields: false (in tsconfig), TypeScript compiles class fields using legacy assignment semantics
|
|
3
5
|
// instead of native ES2022 Object.defineProperty.
|
|
4
6
|
// declare readonly type: TType;
|
|
@@ -7,31 +9,42 @@ class i extends CustomEvent {
|
|
|
7
9
|
}
|
|
8
10
|
// readonly type: TType;
|
|
9
11
|
target;
|
|
10
|
-
constructor(
|
|
11
|
-
super(
|
|
12
|
+
constructor(type, eventInitDict) {
|
|
13
|
+
super(type, eventInitDict);
|
|
14
|
+
this.target = eventInitDict.target;
|
|
12
15
|
}
|
|
13
|
-
}
|
|
14
|
-
|
|
16
|
+
};
|
|
17
|
+
__name(_StructEvent, "StructEvent");
|
|
18
|
+
let StructEvent = _StructEvent;
|
|
19
|
+
const _StructEventTarget = class _StructEventTarget extends EventTarget {
|
|
15
20
|
_listenerRegistry = /* @__PURE__ */ new Map();
|
|
16
21
|
constructor() {
|
|
17
22
|
super();
|
|
18
23
|
}
|
|
19
|
-
addEventListener(
|
|
20
|
-
let
|
|
21
|
-
|
|
24
|
+
addEventListener(type, listener, options) {
|
|
25
|
+
let set = this._listenerRegistry.get(type);
|
|
26
|
+
if (!set) {
|
|
27
|
+
set = /* @__PURE__ */ new Set();
|
|
28
|
+
this._listenerRegistry.set(type, set);
|
|
29
|
+
}
|
|
30
|
+
set.add(listener);
|
|
31
|
+
super.addEventListener(type, listener, options);
|
|
22
32
|
}
|
|
23
|
-
removeEventListener(
|
|
24
|
-
this._listenerRegistry.get(
|
|
33
|
+
removeEventListener(type, listener, options) {
|
|
34
|
+
this._listenerRegistry.get(type)?.delete(listener);
|
|
35
|
+
super.removeEventListener(type, listener);
|
|
25
36
|
}
|
|
26
|
-
dispatchEvent(
|
|
27
|
-
return super.dispatchEvent(
|
|
37
|
+
dispatchEvent(event) {
|
|
38
|
+
return super.dispatchEvent(event);
|
|
28
39
|
}
|
|
29
|
-
hasEventListener(
|
|
30
|
-
return this._listenerRegistry.get(
|
|
40
|
+
hasEventListener(type, listener) {
|
|
41
|
+
return this._listenerRegistry.get(type)?.has(listener) ?? false;
|
|
31
42
|
}
|
|
32
|
-
}
|
|
43
|
+
};
|
|
44
|
+
__name(_StructEventTarget, "StructEventTarget");
|
|
45
|
+
let StructEventTarget = _StructEventTarget;
|
|
33
46
|
export {
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
StructEvent,
|
|
48
|
+
StructEventTarget
|
|
36
49
|
};
|
|
37
50
|
//# sourceMappingURL=structEvent.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structEvent.es.js","sources":["D:/Src/my/actdim/public/utico/src/structEvent.ts"],"sourcesContent":
|
|
1
|
+
{"version":3,"file":"structEvent.es.js","sources":["D:/Src/my/actdim/public/utico/src/structEvent.ts"],"sourcesContent":["import { Struct } from \"./typeCore\";\r\n\r\nexport class StructEvent<\r\n TStruct extends Record<string, any>,\r\n TTarget extends StructEventTarget<TStruct>,\r\n TType extends Extract<keyof TStruct, string> = Extract<keyof TStruct, string>\r\n> extends CustomEvent<TStruct[TType]> {\r\n // with useDefineForClassFields: false (in tsconfig), TypeScript compiles class fields using legacy assignment semantics \r\n // instead of native ES2022 Object.defineProperty.\r\n // declare readonly type: TType; \r\n get type() {\r\n return super.type as TType;\r\n }\r\n // readonly type: TType;\r\n target: TTarget;\r\n constructor(type: TType, eventInitDict?: CustomEventInit<TStruct[TType]> & { target: TTarget }) {\r\n super(type, eventInitDict);\r\n // this.type = type; // without declare\r\n this.target = eventInitDict.target;\r\n }\r\n}\r\n\r\n// TKeys extends Extract<keyof TStruct, string> = Extract<keyof TStruct, string>>\r\n// StructEventDispatcher\r\nexport class StructEventTarget<TStruct extends Record<string, any>> extends EventTarget implements StructEventTarget<TStruct> {\r\n private _listenerRegistry = new Map<string, Set<Function>>();\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n addEventListener<K extends Extract<keyof TStruct, string>>(\r\n type: K,\r\n listener: (event: StructEvent<TStruct, this, K>) => void,\r\n options?: boolean | AddEventListenerOptions\r\n ): void {\r\n let set = this._listenerRegistry.get(type);\r\n if (!set) {\r\n set = new Set();\r\n this._listenerRegistry.set(type, set);\r\n }\r\n set.add(listener);\r\n super.addEventListener(type, listener, options);\r\n }\r\n\r\n removeEventListener<K extends Extract<keyof TStruct, string>>(\r\n type: K,\r\n listener: (event: StructEvent<TStruct, this, K>) => void,\r\n options?: boolean | EventListenerOptions\r\n ): void {\r\n this._listenerRegistry.get(type)?.delete(listener);\r\n super.removeEventListener(type, listener);\r\n }\r\n\r\n dispatchEvent<K extends Extract<keyof TStruct, string>>(event: StructEvent<TStruct, StructEventTarget<TStruct>, K>): boolean {\r\n return super.dispatchEvent(event);\r\n }\r\n\r\n hasEventListener<K extends Extract<keyof TStruct, string>>(type: K, listener: (event: StructEvent<TStruct, StructEventTarget<TStruct>, K>) => void): boolean {\r\n return this._listenerRegistry.get(type)?.has(listener) ?? false;\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAEO,MAAM,eAAN,MAAM,qBAIH,YAA4B;AAAA;AAAA;AAAA;AAAA,EAIlC,IAAI,OAAO;AACP,WAAO,MAAM;AAAA,EACjB;AAAA;AAAA,EAEA;AAAA,EACA,YAAY,MAAa,eAAuE;AAC5F,UAAM,MAAM,aAAa;AAEzB,SAAK,SAAS,cAAc;AAAA,EAChC;AACJ;AAdsC;AAJ/B,IAAM,cAAN;AAsBA,MAAM,qBAAN,MAAM,2BAA+D,YAAkD;AAAA,EAClH,wCAAwB,IAAA;AAAA,EAEhC,cAAc;AACV,UAAA;AAAA,EACJ;AAAA,EAEA,iBACI,MACA,UACA,SACI;AACJ,QAAI,MAAM,KAAK,kBAAkB,IAAI,IAAI;AACzC,QAAI,CAAC,KAAK;AACN,gCAAU,IAAA;AACV,WAAK,kBAAkB,IAAI,MAAM,GAAG;AAAA,IACxC;AACA,QAAI,IAAI,QAAQ;AAChB,UAAM,iBAAiB,MAAM,UAAU,OAAO;AAAA,EAClD;AAAA,EAEA,oBACI,MACA,UACA,SACI;AACJ,SAAK,kBAAkB,IAAI,IAAI,GAAG,OAAO,QAAQ;AACjD,UAAM,oBAAoB,MAAM,QAAQ;AAAA,EAC5C;AAAA,EAEA,cAAwD,OAAqE;AACzH,WAAO,MAAM,cAAc,KAAK;AAAA,EACpC;AAAA,EAEA,iBAA2D,MAAS,UAAyF;AACzJ,WAAO,KAAK,kBAAkB,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;AAAA,EAC9D;AACJ;AArC8H;AAAvH,IAAM,oBAAN;"}
|
package/dist/typeCore.es.js
CHANGED
|
@@ -1,16 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const getPrefixer = /* @__PURE__ */ __name((prefix) => (value) => {
|
|
4
|
+
return `${prefix}${value}`;
|
|
5
|
+
}, "getPrefixer");
|
|
6
|
+
const getValuePrefixer = /* @__PURE__ */ __name((prefix) => (dict) => {
|
|
7
|
+
return Object.fromEntries(Object.keys(dict).map((k) => [k, `${prefix}${dict[k]}`]));
|
|
8
|
+
}, "getValuePrefixer");
|
|
9
|
+
const getKeyPrefixer = /* @__PURE__ */ __name((prefix) => (obj) => {
|
|
10
|
+
return Object.fromEntries(Object.keys(obj).map((k) => [`${prefix}${k}`, obj[k]]));
|
|
11
|
+
}, "getKeyPrefixer");
|
|
12
|
+
function getByKeyPath(obj, path) {
|
|
13
|
+
return path.split(".").reduce((acc, key) => acc?.[key], obj);
|
|
4
14
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
15
|
+
__name(getByKeyPath, "getByKeyPath");
|
|
16
|
+
function setByKeyPath(obj, path, value) {
|
|
17
|
+
const keys = path.split(".");
|
|
18
|
+
const last = keys.pop();
|
|
19
|
+
const target = keys.reduce((acc, key) => acc?.[key], obj);
|
|
20
|
+
if (target != null) target[last] = value;
|
|
8
21
|
}
|
|
22
|
+
__name(setByKeyPath, "setByKeyPath");
|
|
9
23
|
export {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
getByKeyPath,
|
|
25
|
+
getKeyPrefixer,
|
|
26
|
+
getPrefixer,
|
|
27
|
+
getValuePrefixer,
|
|
28
|
+
setByKeyPath
|
|
15
29
|
};
|
|
16
30
|
//# sourceMappingURL=typeCore.es.js.map
|
package/dist/typeCore.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeCore.es.js","sources":["D:/Src/my/actdim/public/utico/src/typeCore.ts"],"sourcesContent":null,"names":["getPrefixer","prefix","value","getValuePrefixer","dict","k","getKeyPrefixer","obj","getByKeyPath","path","acc","key","setByKeyPath","keys","last","target"],"mappings":"AAoIO,MAAMA,IAAc,CAACC,MAAmB,CAACC,MACrC,GAAGD,CAAM,GAAGC,CAAK,IAGfC,IACT,CAAsCF,MAClC,CAACG,MACU,OAAO,YAAY,OAAO,KAAKA,CAAI,EAAE,IAAI,CAACC,MAAM,CAACA,GAAG,GAAGJ,CAAM,GAAGG,EAAKC,CAAC,CAAC,EAAE,CAAC,CAAC,GAGjFC,IACT,CAAmCL,MAC/B,CAACM,MACU,OAAO,YAAY,OAAO,KAAKA,CAAG,EAAE,IAAI,CAACF,MAAM,CAAC,GAAGJ,CAAM,GAAGI,CAAC,IAAIE,EAAIF,CAAC,CAAC,CAAC,CAAC;AA+KrF,SAASG,EAA4HD,GAAQE,GAA6B;AAC7K,SAAOA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACC,GAAUC,MAAQD,IAAMC,CAAG,GAAGJ,CAAG;AACpE;AAEO,SAASK,EAA4HL,GAAQE,GAASP,GAAiC;AAC1L,QAAMW,IAAOJ,EAAK,MAAM,GAAG,GACrBK,IAAOD,EAAK,IAAA,GACZE,IAASF,EAAK,OAAO,CAACH,GAAUC,MAAQD,IAAMC,CAAG,GAAGJ,CAAG;AAC7D,EAAIQ,KAAU,SAAMA,EAAOD,CAAI,IAAIZ;AACvC;"}
|
|
1
|
+
{"version":3,"file":"typeCore.es.js","sources":["D:/Src/my/actdim/public/utico/src/typeCore.ts"],"sourcesContent":["// @filename: typeCore.ts\r\n\r\n// type SplitStringToUnion<T extends string, Separator extends string> = T extends `${infer First}${Separator}${infer Rest}`\r\n// ? First | SplitStringToUnion<Rest, Separator>\r\n// : T;\r\n\r\n/** more useful version of Omit */\r\nexport type Skip<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; // FilterOut\r\n// export type Skip<T, K extends keyof T> = {\r\n// [P in keyof T as P extends K ? never : P]: T[P];\r\n// };\r\n\r\n// export type PickEx<T, TKeys extends keyof T | Array<keyof T>> = {\r\n// [K in TKeys extends Array<keyof T> ? TKeys[number] : TKeys]: T[K];\r\n// };\r\n\r\nexport type Filter<T, V> = {\r\n [K in keyof T as T[K] extends V ? K : never]: T[K];\r\n};\r\n\r\nexport type Diff<T, U> = Omit<T, keyof U>;\r\nexport type StrictDiff<T, U> = {\r\n [K in keyof T as K extends keyof U ? (T[K] extends U[K] ? (U[K] extends T[K] ? never : K) : K) : K]: T[K];\r\n};\r\n\r\n/** Mathematical (real) intersection */\r\nexport type CommonPart<T, U> = Pick<T, CommonKeys<T, U>>;\r\nexport type CommonPartEx<T extends object[]> =\r\n T extends [infer A extends object, infer B extends object, ...infer Rest extends object[]]\r\n ? CommonPartEx<[Pick<A, Extract<keyof A, keyof B>>, ...Rest]>\r\n : T extends [infer Only extends object]\r\n ? Only\r\n : unknown;\r\n\r\nexport type CommonPartFromSchema<T extends Record<string, object>> =\r\n keyof T extends infer K ?\r\n K extends any ?\r\n CommonPart<T[K & keyof T], CommonPartFromSchema<Omit<T, K & keyof T>>>\r\n : unknown\r\n : unknown;\r\n\r\nexport type CommonKeys<T, U> = Extract<keyof T, keyof U>;\r\nexport type CommonKeysEx<T extends object[]> =\r\n T extends [infer A extends object, infer B extends object, ...infer Rest extends object[]]\r\n ? CommonKeysEx<[{ [K in Extract<keyof A, keyof B>]: any }, ...Rest]>\r\n : T extends [infer Only extends object]\r\n ? keyof Only\r\n : never;\r\n\r\nexport type UnionToIntersection<U> =\r\n (U extends any ? (x: U) => void : never) extends (x: infer R) => void ? R : never;\r\n\r\nexport type ValueUnion<T> = T[keyof T];\r\n\r\nexport type TupleFromKeys<T, K extends readonly (keyof T)[]> = {\r\n [I in keyof K]: K[I] extends keyof T ? T[K[I]] : never\r\n};\r\n\r\nexport type Extend<T, U, K extends keyof U> = T & { [P in K]: U[K] };\r\n\r\n// Validation\r\nexport type ValueOf<T> = T[keyof T];\r\nexport type OneOnly<T, Key extends keyof T> = { [key in Exclude<keyof T, Key>]: null } & Pick<T, Key>;\r\nexport type OneOfByKey<T> = { [key in keyof T]: OneOnly<T, key> };\r\nexport type OneOfType<T> = ValueOf<OneOfByKey<T>>;\r\n\r\n// Extract version\r\nexport type KeyOfType<FromType, KeepType = any, Include = true> = {\r\n [K in keyof FromType]: FromType[K] extends KeepType ? (Include extends true ? K : never) : Include extends true ? never : K;\r\n}[keyof FromType];\r\n\r\nexport type Weaken<T, K extends keyof T> = {\r\n [P in keyof T]: P extends K ? any : T[P];\r\n};\r\n\r\nexport type Mutable<T> = {\r\n -readonly [K in keyof T]: T[K];\r\n};\r\n\r\nexport type Constructor = new (...args: any[]) => any;\r\n// export type ConstructorParameters<TConstructor extends Constructor> = TConstructor extends new (...args: infer TArgs) => any ? TArgs : never;\r\n\r\n// Extracts class instance type from class constructor\r\nexport type ConstructorClass<TConstructor extends Constructor> = TConstructor extends new (...args: any[]) => infer TClass ? TClass : never;\r\n\r\n// This is what we want: to be able to create new class instances\r\n// either with or without \"new\" keyword\r\nexport type CallableConstructor<TConstructor extends Constructor> = TConstructor &\r\n ((...args: ConstructorParameters<TConstructor>) => ConstructorClass<TConstructor>);\r\n\r\n// ToUpperCase\r\nexport type ToUpper<T> = T extends string\r\n ? Uppercase<T>\r\n : {\r\n [K in keyof T as K extends string ? Uppercase<K> : K]: T[K];\r\n };\r\n\r\n// ToLowerCase\r\nexport type ToLower<T> = T extends string\r\n ? Lowercase<T>\r\n : {\r\n [K in keyof T as K extends string ? Lowercase<K> : K]: T[K];\r\n };\r\n\r\nexport type AddPrefix<T, TPrefix extends string> = T extends string\r\n ? `${TPrefix}${T}`\r\n : {\r\n [K in keyof T as AddPrefix<K, TPrefix>]: T[K];\r\n };\r\n\r\nexport type AddSuffix<T, TSuffix extends string> = T extends string\r\n ? `${T}${TSuffix}`\r\n : {\r\n [K in keyof T as AddSuffix<K, TSuffix>]: T[K];\r\n };\r\n\r\nexport type RemovePrefix<T, TPrefix extends string> = T extends string\r\n ? T extends `${TPrefix}${infer Tail}`\r\n ? RemovePrefix<Tail, TPrefix>\r\n : T // never?\r\n : {\r\n [K in keyof T as RemovePrefix<K, TPrefix>]: T[K];\r\n };\r\n\r\nexport type RemoveSuffix<T, TSuffix extends string> = T extends string\r\n ? T extends `${infer Head}${TSuffix}`\r\n ? RemoveSuffix<Head, TSuffix>\r\n : T // never?\r\n : {\r\n [K in keyof T as RemoveSuffix<K, TSuffix>]: T[K];\r\n };\r\n\r\nexport const getPrefixer = (prefix: string) => (value: string) => {\r\n return `${prefix}${value}`;\r\n};\r\n\r\nexport const getValuePrefixer =\r\n <T extends { [key: string]: string }>(prefix: string) =>\r\n (dict: T): T => {\r\n return Object.fromEntries(Object.keys(dict).map((k) => [k, `${prefix}${dict[k]}`])) as T;\r\n };\r\n\r\nexport const getKeyPrefixer =\r\n <T extends { [key: string]: any }>(prefix: string) =>\r\n (obj: T): object => {\r\n return Object.fromEntries(Object.keys(obj).map((k) => [`${prefix}${k}`, obj[k]]));\r\n };\r\n\r\nexport type MaybePromise<T = void> = [T] extends [undefined] ? void | PromiseLike<void> : T | PromiseLike<Awaited<T>>;\r\n\r\nexport type Func<TArgs extends any[] = any[], T = any> = {\r\n (...args: TArgs): T;\r\n name?: string;\r\n};\r\n\r\nexport type Action<TArgs extends any[] = any[]> = Func<TArgs, void>;\r\n\r\nexport type AsyncFunc<TArgs extends any[] = any[], T = any> = Func<TArgs, PromiseLike<T>>;\r\n\r\n// use built-in ReturnType:\r\n// type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;\r\n// my version:\r\n// export type ReturnType<TFunc> = TFunc extends Func<infer TArgs, infer TResult> ? TResult : never;\r\n\r\n// use built-in Awaited type:\r\n/*\r\n// Recursively unwraps the \"awaited type\" of a type. \r\n// Non-promise \"thenables\" should resolve to `never`. \r\n// This emulates the behavior of `await`.\r\ntype Awaited<T> = T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` mode\r\n T extends object & { then(onfulfilled: infer F, ...args: infer _): any; } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped\r\n F extends ((value: infer V, ...args: infer _) => any) ? // if the argument to `then` is callable, extracts the first argument\r\n Awaited<V> : // recursively unwrap the value\r\n never : // the argument to `then` was not callable\r\n T; // non-object or non-thenable\r\n*/\r\n\r\n// my simple version (PromiseType):\r\n// export type Awaited<TPromise> = TPromise extends PromiseLike<infer TResult> ? TResult : TPromise;\r\n\r\n// AsyncReturnType\r\nexport type AwaitedReturnType<TFunc extends Func> = Awaited<ReturnType<TFunc>>;\r\n\r\nexport type Factory<T = any, TArgs extends any[] = []> = Func<TArgs, T>;\r\n\r\nexport type IProvider<TFactory = Factory> = {\r\n get: TFactory;\r\n};\r\n\r\n// (Func)ParameterType\r\n// type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;\r\n/** see also built-in Parameters type */\r\nexport type ParameterType<TFunc, TParamIndex extends number> = TFunc extends Func<infer TArgs extends any[], infer TResult>\r\n ? TArgs[TParamIndex]\r\n : never;\r\n\r\n// Lambda?\r\n// export type Executor<T = void, TArgs extends any[] = []> = Func<TArgs, T> | AsyncFunc<[], T>; // same\r\nexport type Executor<T = void, TArgs extends any[] = []> = Func<TArgs, T | PromiseLike<T>>;\r\n\r\nexport type Overwrite<Base, Overrides> = Omit<Base, keyof Overrides> & Overrides;\r\n// or\r\n// export type Overwrite<Base, Overrides> = Pick<Base, Exclude<keyof Base, keyof Overrides>> & Overrides;\r\n\r\nexport type Extends<T, TShape> = T extends TShape ? true : false;\r\n\r\n// more strict than Extract\r\nexport type RequireExtends<T extends TShape, TShape> = T;\r\n\r\nexport type KeyOf<T, TKey extends keyof T> = TKey;\r\n\r\nexport type HasKeys<T> = keyof T extends never ? false : true;\r\n\r\nexport type IsEmpty<T> = HasKeys<T> extends false ? true : false;\r\n\r\nexport type Require<T, TCondition extends boolean> = TCondition extends true ? T : never;\r\n\r\nexport type If<TCondition extends boolean, Then, Else = never> = TCondition extends true ? Then : Else;\r\n\r\nexport type IsKeyOf<T, TKey> = TKey extends keyof T ? true : false;\r\n\r\nexport type KeysOf<T, TKeys extends keyof T | Array<keyof T>> = TKeys extends Array<keyof T> ? TKeys[number] : TKeys;\r\n\r\nexport type MaybeKeyOf<T, K extends PropertyKey> = K extends keyof T ? K : never;\r\n\r\nexport type IsTuple<T> = T extends readonly [...infer Elements] ? (number extends Elements[\"length\"] ? false : true) : false;\r\n\r\n// for classes only:\r\n// export type ExtractInterface<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R\r\n// ? { [K in keyof R]: R[K] }\r\n// : never;\r\n\r\n// Struct(Copy), Shape, Interface \r\nexport type Struct<T> = { [K in keyof T]: T[K] };\r\n\r\ntype NonFunctionPropertyKeys<T> = {\r\n [K in keyof T]: T[K] extends (...args: any[]) => any ? never : K\r\n}[keyof T];\r\n\r\n// Types that are treated as leaves — recursing into them causes exponential expansion\r\n// (e.g. EventTarget covers all DOM elements; Date/Map/Promise are class instances, not plain data)\r\nexport type DefaultKeyPathLeaf =\r\n | Function\r\n | Date\r\n | RegExp\r\n | Error\r\n | Map<any, any>\r\n | Set<any>\r\n | WeakMap<any, any>\r\n | WeakSet<any>\r\n | Promise<any>\r\n | ArrayBuffer\r\n | SharedArrayBuffer\r\n | ArrayBufferView // covers all TypedArrays + DataView\r\n | Blob\r\n | CryptoKey\r\n | ImageBitmap\r\n | ImageData\r\n | FileList\r\n | FileSystemFileHandle\r\n | FileSystemDirectoryHandle\r\n | ReadableStream<any>\r\n | ReadableStreamDefaultReader<any>\r\n | ReadableStreamDefaultController<any>\r\n | EventTarget; // covers all DOM types: HTMLElement, Node, Document, XHR…\r\n\r\ntype NextDepthMap = {\r\n 0: 1;\r\n 1: 2;\r\n 2: 3;\r\n 3: 4;\r\n 4: 5;\r\n 5: 5;\r\n};\r\ntype NextDepth<D extends number> = D extends keyof NextDepthMap ? NextDepthMap[D] : 5;\r\n\r\ntype PropertyKeys<T, IncludeFunctions extends boolean> =\r\n IncludeFunctions extends true ? keyof T : NonFunctionPropertyKeys<T>;\r\n\r\nexport type KeyPath<T, IncludeFunctions extends boolean = true, MaxDepth extends number = 3, D extends number = 0, TLeaf = DefaultKeyPathLeaf> =\r\n D extends MaxDepth ? never :\r\n T extends readonly any[]\r\n ? `${number}` | `${number}.${KeyPath<T[number], IncludeFunctions, MaxDepth, NextDepth<D>, TLeaf>}`\r\n : T extends object\r\n ? {\r\n [K in PropertyKeys<T, IncludeFunctions> & (string | number)]:\r\n T[K] extends readonly any[]\r\n ? `${K}` |\r\n `${K}.${number}` |\r\n `${K}.${number}.${KeyPath<T[K][number], IncludeFunctions, MaxDepth, NextDepth<D>, TLeaf>}`\r\n : T[K] extends TLeaf\r\n ? `${K}`\r\n : T[K] extends object\r\n ? `${K}` | `${K}.${KeyPath<T[K], IncludeFunctions, MaxDepth, NextDepth<D>, TLeaf>}`\r\n : `${K}`;\r\n }[PropertyKeys<T, IncludeFunctions> & (string | number)]\r\n : never;\r\n\r\nexport type KeyPathValue<T, P extends string> =\r\n P extends `${infer K}.${infer Rest}`\r\n ? K extends keyof T\r\n ? KeyPathValue<T[K], Rest>\r\n : T extends readonly any[]\r\n ? K extends `${number}`\r\n ? KeyPathValue<T[number], Rest>\r\n : never\r\n : never\r\n : P extends keyof T\r\n ? T[P]\r\n : T extends readonly any[]\r\n ? P extends `${number}`\r\n ? T[number]\r\n : never\r\n : never;\r\n\r\n// Slice\r\nexport type KeyPathValueMap<T, IncludeFunctions extends boolean = true, TLeaf = DefaultKeyPathLeaf> = {\r\n [K in KeyPath<T, IncludeFunctions, 3, 0, TLeaf>]?: KeyPathValue<T, K>;\r\n};\r\n\r\nexport function getByKeyPath<T, P extends KeyPath<T, boolean, MaxDepth, 0, TLeaf>, MaxDepth extends number = 3, TLeaf = DefaultKeyPathLeaf>(obj: T, path: P): KeyPathValue<T, P> {\r\n return path.split('.').reduce((acc: any, key) => acc?.[key], obj) as KeyPathValue<T, P>;\r\n}\r\n\r\nexport function setByKeyPath<T, P extends KeyPath<T, boolean, MaxDepth, 0, TLeaf>, MaxDepth extends number = 3, TLeaf = DefaultKeyPathLeaf>(obj: T, path: P, value: KeyPathValue<T, P>): void {\r\n const keys = path.split('.');\r\n const last = keys.pop()!;\r\n const target = keys.reduce((acc: any, key) => acc?.[key], obj);\r\n if (target != null) target[last] = value;\r\n}"],"names":[],"mappings":";;AAoIO,MAAM,cAAc,wBAAC,WAAmB,CAAC,UAAkB;AAC9D,SAAO,GAAG,MAAM,GAAG,KAAK;AAC5B,GAF2B;AAIpB,MAAM,mBACT,wBAAsC,WAClC,CAAC,SAAe;AACZ,SAAO,OAAO,YAAY,OAAO,KAAK,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACtF,GAHJ;AAKG,MAAM,iBACT,wBAAmC,WAC/B,CAAC,QAAmB;AAChB,SAAO,OAAO,YAAY,OAAO,KAAK,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AACpF,GAHJ;AAiLG,SAAS,aAA4H,KAAQ,MAA6B;AAC7K,SAAO,KAAK,MAAM,GAAG,EAAE,OAAO,CAAC,KAAU,QAAQ,MAAM,GAAG,GAAG,GAAG;AACpE;AAFgB;AAIT,SAAS,aAA4H,KAAQ,MAAS,OAAiC;AAC1L,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAM,OAAO,KAAK,IAAA;AAClB,QAAM,SAAS,KAAK,OAAO,CAAC,KAAU,QAAQ,MAAM,GAAG,GAAG,GAAG;AAC7D,MAAI,UAAU,KAAM,QAAO,IAAI,IAAI;AACvC;AALgB;"}
|