@actdim/utico 0.9.3 → 0.9.5
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/dist/array.es.js.map +1 -1
- package/dist/arrayExtensions.es.js.map +1 -1
- package/dist/cache/memoryCache.es.js.map +1 -1
- package/dist/cache/persistentCache.d.ts +16 -20
- package/dist/cache/persistentCache.d.ts.map +1 -1
- package/dist/cache/persistentCache.es.js +65 -73
- package/dist/cache/persistentCache.es.js.map +1 -1
- package/dist/dataFormats.es.js.map +1 -1
- package/dist/dateTimeDataFormat.es.js.map +1 -1
- package/dist/gfx/canvasUtils.es.js.map +1 -1
- package/dist/gfx/color.es.js.map +1 -1
- package/dist/i18n/cultures.es.js.map +1 -1
- package/dist/i18n/enUsCulture.es.js.map +1 -1
- package/dist/math.es.js.map +1 -1
- package/dist/metadata.es.js.map +1 -1
- package/dist/mutex.es.js.map +1 -1
- package/dist/patterns.es.js.map +1 -1
- package/dist/store/dataStore.d.ts +33 -0
- package/dist/store/dataStore.d.ts.map +1 -0
- package/dist/store/dataStore.es.js +49 -0
- package/dist/store/dataStore.es.js.map +1 -0
- package/dist/store/persistentStore.d.ts +20 -0
- package/dist/store/persistentStore.d.ts.map +1 -0
- package/dist/store/persistentStore.es.js +96 -0
- package/dist/store/persistentStore.es.js.map +1 -0
- package/dist/store/storeContracts.d.ts +6 -0
- package/dist/store/storeContracts.d.ts.map +1 -0
- package/dist/store/storeContracts.es.js +2 -0
- package/dist/store/storeContracts.es.js.map +1 -0
- package/dist/stringCore.es.js.map +1 -1
- package/dist/structEvent.es.js.map +1 -1
- package/dist/typeCore.es.js.map +1 -1
- package/dist/typeUtils.es.js.map +1 -1
- package/dist/utils.es.js.map +1 -1
- package/dist/watchable.es.js.map +1 -1
- package/package.json +3 -10
- package/dist/cache/cacheDb.d.ts +0 -30
- package/dist/cache/cacheDb.d.ts.map +0 -1
- package/dist/cache/cacheDb.es.js +0 -47
- package/dist/cache/cacheDb.es.js.map +0 -1
- package/dist/storage/persistentStorage.d.ts +0 -11
- package/dist/storage/persistentStorage.d.ts.map +0 -1
- package/dist/storage/persistentStorage.es.js +0 -25
- package/dist/storage/persistentStorage.es.js.map +0 -1
- package/dist/storage/storageContracts.d.ts +0 -6
- package/dist/storage/storageContracts.d.ts.map +0 -1
- package/dist/storage/storageContracts.es.js +0 -2
- package/dist/storage/storageContracts.es.js.map +0 -1
package/dist/gfx/color.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color.es.js","sources":["D:/Src/my/actdim/public/utico/src/gfx/color.ts"],"sourcesContent":["// see also https://css-tricks.com/converting-color-spaces-in-javascript/\r\n\r\n// getRandomColorChannelValue(Number)\r\nfunction getRandomColorChannelNumber(brightness: number) {\r\n const r = 255 - brightness;\r\n return 0 | ((Math.random() * r) + brightness);\r\n}\r\n\r\nexport function getRandomColorChannelString(brightness: number) {\r\n const n = getRandomColorChannelNumber(brightness);\r\n let result = n.toString(16);\r\n // result = ('00' + result).slice(- 2);\r\n if (result.length == 1) {\r\n result = '0' + result;\r\n }\r\n return result;\r\n}\r\n\r\nexport function getRandom32BitColorNumber(alpha: number = null, brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFFFF);\r\n\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n // typeof alpha !== \"number\"\r\n const a = alpha == undefined ? getRandomColorChannelNumber(brightness) : alpha;\r\n return getColorNumberFromRgba(r, g, b, a);\r\n}\r\n\r\n// getRandom24bitColorNumber\r\nexport function getRandomColorNumber(brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFF);\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n return getColorNumberFromRgba(r, g, b);\r\n}\r\n\r\nfunction refineColorHexString(colorHexString: string) {\r\n colorHexString = colorHexString.trim().toUpperCase();\r\n let isNegative = false;\r\n\r\n if (colorHexString.startsWith(\"-\")) {\r\n isNegative = true;\r\n colorHexString = colorHexString.slice(1).trimLeft();\r\n }\r\n\r\n if (colorHexString.startsWith(\"0X\")) {\r\n colorHexString = colorHexString.slice(2);\r\n }\r\n\r\n if (colorHexString.startsWith(\"#\")) {\r\n colorHexString = colorHexString.slice(1);\r\n }\r\n\r\n // colorHexString = \"0x\" + colorHexString;\r\n if (isNegative) {\r\n colorHexString = \"-\" + colorHexString;\r\n }\r\n\r\n return colorHexString;\r\n}\r\n\r\n// colorHexStringToNumber\r\nexport function getColorNumberFromHexString(colorHexString: string) {\r\n if (!colorHexString) {\r\n\r\n return 0;\r\n\r\n } else {\r\n // TODO: detect alpha channel\r\n // const { r, g, b, a } = getColorRgbaFromHexString(colorHexString)\r\n // return getColorNumberFromRgba(r, g, b, a);\r\n\r\n colorHexString = refineColorHexString(colorHexString);\r\n\r\n let result =\r\n // new Number(colorHexString).valueOf();\r\n // parseInt(colorHexString);\r\n parseInt(colorHexString, 16);\r\n\r\n // if (isNegative) {\r\n // result = result >>> 0; // convert to unsigned int32\r\n // }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport function getColorRgbaFromHexString(colorHexString: string) {\r\n\r\n if (!colorHexString) {\r\n return {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n a: 255\r\n };\r\n } else {\r\n\r\n const colorValue = getColorNumberFromHexString(colorHexString); // >>> 0\r\n if (colorValue > 0xFFFFFF) {\r\n return {\r\n r: colorValue >> 24 & 0xFF, // red\r\n // r: (colorValue & 0xFF000000) >> 24,\r\n g: colorValue >> 16 & 0xFF, // green\r\n // g: (colorValue & 0xFF0000) >> 16,\r\n b: colorValue >> 8 & 0xFF, // blue\r\n // b: (colorValue & 0xFF00) >> 8,\r\n a: colorValue & 0xFF // alpha\r\n };\r\n } else {\r\n return {\r\n r: colorValue >> 16 & 0xFF,\r\n // r: (colorValue & 0xFF0000) >> 16,\r\n g: colorValue >> 8 & 0xFF,\r\n // g: (colorValue & 0xFF00) >> 8,\r\n b: colorValue & 0xFF,\r\n // b: colorValue & 0xFF,\r\n a: 255\r\n };\r\n }\r\n\r\n // TODO: compare performance:\r\n // colorHexString = refineColorHexString(colorHexString);\r\n // // no alpha means opaque (non-transparent)\r\n // return {\r\n // r: parseInt(colorHexString.slice(0, 2), 16), // \"0x\" + ...\r\n // g: parseInt(colorHexString.slice(2, 4), 16),\r\n // b: parseInt(colorHexString.slice(4, 6), 16),\r\n // a: colorHexString.length > 6 ? parseInt(colorHexString.slice(6, 8), 16): 255\r\n // };\r\n\r\n // let hexString = input.replace('#', '');\r\n // if (hexString.length === 3) {\r\n // hexString = `${hexString[0]}${hexString[0]}${hexString[1]}${hexString[1]}${hexString[2]}${hexString[2]}`;\r\n // } \r\n // const r = parseInt(hexString.substring(0, 2), 16);\r\n // const g = parseInt(hexString.substring(2, 4), 16);\r\n // const b = parseInt(hexString.substring(4, 6), 16);\r\n }\r\n}\r\n\r\n// colorNumberToHexString\r\nexport function getColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n if (color == null || Number.isNaN(color)) {\r\n // color = 0;\r\n return \"\";\r\n }\r\n return \"#\" + ('000000' + color.toString(16)).slice(-6);\r\n}\r\n\r\nexport function get32BitColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n return \"#\" + ('00000000' + color.toString(16)).slice(-8);\r\n}\r\n\r\n// colorRgbaToNumber/colorRgbaToInt(Number)\r\n// { r: number, g: number, b: number, a?: number }\r\n// use24BitDepthForOpaque\r\nexport function getColorNumberFromRgba(r: number, g: number, b: number, a: number = null, use24BitsForOpaque: boolean = true) {\r\n let result: number;\r\n // typeof a !== \"number\"\r\n if (a == undefined || (a === 255 && use24BitsForOpaque)) { // a === 255?\r\n // 24-bit color number\r\n result = (r << 16) + (g << 8) + b << 0; // '+' can be replaced with '^' or '|' \r\n } else {\r\n // 32-bit color number\r\n result = (r << 24) + (g << 16) + (b << 8) + a;\r\n }\r\n return result >>> 0; // convert to unsigned int32\r\n}\r\n\r\n// colorRgbaToHexString\r\n// { r: number, g: number, b: number, a?: number }\r\nexport function getColorHexStringFromRgba(r: number, g: number, b: number, a: number = null) {\r\n const value = getColorNumberFromRgba(r, g, b, a);\r\n return getColorHexStringFromNumber(value);\r\n}\r\n\r\n// getColorNumberFromControlEvent\r\nexport function getColorNumberFromEvent(e: Event) {\r\n const colorHexString = (e.target as HTMLInputElement)?.value;\r\n return getColorNumberFromHexString(colorHexString);\r\n}\r\n\r\n/*\r\nfunction parse(orig: string) {\r\n if (!orig) {\r\n return {};\r\n }\r\n\r\n const result = orig.match(/(?:((hsl|rgb)a? *\\(([\\d.%]+(?:deg|g?rad|turn)?)[ ,]*([\\d.%]+)[ ,]*([\\d.%]+)[ ,/]*([\\d.%]*)\\))|(#((?:[\\d\\w]{3}){1,2})([\\d\\w]{1,2})?))/i);\r\n if (!result) {\r\n return { color: orig, opacity: 1.0 };\r\n } else if (result[7]) {\r\n let opacity = 1.0;\r\n if (result[9]) {\r\n opacity = parseInt(result[9].length == 1 ? `${result[9]}${result[9]}` : result[9], 16) * inv255;\r\n }\r\n return { color: `#${result[8]}`, opacity };\r\n } else if (result[0]) {\r\n return { color: `${result[2]}(${result[3]},${result[4]},${result[5]})`, opacity: (Number(result[6]) || 1.0) };\r\n }\r\n}\r\n*/"],"names":["getRandomColorChannelNumber","brightness","r","getRandomColorChannelString","result","getRandom32BitColorNumber","alpha","g","b","getColorNumberFromRgba","getRandomColorNumber","refineColorHexString","colorHexString","isNegative","getColorNumberFromHexString","getColorRgbaFromHexString","colorValue","getColorHexStringFromNumber","color","get32BitColorHexStringFromNumber","a","use24BitsForOpaque","getColorHexStringFromRgba","value","getColorNumberFromEvent","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"color.es.js","sources":["../../src/gfx/color.ts"],"sourcesContent":["// see also https://css-tricks.com/converting-color-spaces-in-javascript/\r\n\r\n// getRandomColorChannelValue(Number)\r\nfunction getRandomColorChannelNumber(brightness: number) {\r\n const r = 255 - brightness;\r\n return 0 | ((Math.random() * r) + brightness);\r\n}\r\n\r\nexport function getRandomColorChannelString(brightness: number) {\r\n const n = getRandomColorChannelNumber(brightness);\r\n let result = n.toString(16);\r\n // result = ('00' + result).slice(- 2);\r\n if (result.length == 1) {\r\n result = '0' + result;\r\n }\r\n return result;\r\n}\r\n\r\nexport function getRandom32BitColorNumber(alpha: number = null, brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFFFF);\r\n\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n // typeof alpha !== \"number\"\r\n const a = alpha == undefined ? getRandomColorChannelNumber(brightness) : alpha;\r\n return getColorNumberFromRgba(r, g, b, a);\r\n}\r\n\r\n// getRandom24bitColorNumber\r\nexport function getRandomColorNumber(brightness: number = null) {\r\n // return Math.floor(Math.random() * 0xFFFFFF);\r\n // typeof brightness !== \"number\"\r\n if (brightness == undefined) {\r\n brightness = Math.floor(Math.random() * 0xFF); // 255\r\n }\r\n const r = getRandomColorChannelNumber(brightness);\r\n const g = getRandomColorChannelNumber(brightness);\r\n const b = getRandomColorChannelNumber(brightness);\r\n return getColorNumberFromRgba(r, g, b);\r\n}\r\n\r\nfunction refineColorHexString(colorHexString: string) {\r\n colorHexString = colorHexString.trim().toUpperCase();\r\n let isNegative = false;\r\n\r\n if (colorHexString.startsWith(\"-\")) {\r\n isNegative = true;\r\n colorHexString = colorHexString.slice(1).trimLeft();\r\n }\r\n\r\n if (colorHexString.startsWith(\"0X\")) {\r\n colorHexString = colorHexString.slice(2);\r\n }\r\n\r\n if (colorHexString.startsWith(\"#\")) {\r\n colorHexString = colorHexString.slice(1);\r\n }\r\n\r\n // colorHexString = \"0x\" + colorHexString;\r\n if (isNegative) {\r\n colorHexString = \"-\" + colorHexString;\r\n }\r\n\r\n return colorHexString;\r\n}\r\n\r\n// colorHexStringToNumber\r\nexport function getColorNumberFromHexString(colorHexString: string) {\r\n if (!colorHexString) {\r\n\r\n return 0;\r\n\r\n } else {\r\n // TODO: detect alpha channel\r\n // const { r, g, b, a } = getColorRgbaFromHexString(colorHexString)\r\n // return getColorNumberFromRgba(r, g, b, a);\r\n\r\n colorHexString = refineColorHexString(colorHexString);\r\n\r\n let result =\r\n // new Number(colorHexString).valueOf();\r\n // parseInt(colorHexString);\r\n parseInt(colorHexString, 16);\r\n\r\n // if (isNegative) {\r\n // result = result >>> 0; // convert to unsigned int32\r\n // }\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport function getColorRgbaFromHexString(colorHexString: string) {\r\n\r\n if (!colorHexString) {\r\n return {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n a: 255\r\n };\r\n } else {\r\n\r\n const colorValue = getColorNumberFromHexString(colorHexString); // >>> 0\r\n if (colorValue > 0xFFFFFF) {\r\n return {\r\n r: colorValue >> 24 & 0xFF, // red\r\n // r: (colorValue & 0xFF000000) >> 24,\r\n g: colorValue >> 16 & 0xFF, // green\r\n // g: (colorValue & 0xFF0000) >> 16,\r\n b: colorValue >> 8 & 0xFF, // blue\r\n // b: (colorValue & 0xFF00) >> 8,\r\n a: colorValue & 0xFF // alpha\r\n };\r\n } else {\r\n return {\r\n r: colorValue >> 16 & 0xFF,\r\n // r: (colorValue & 0xFF0000) >> 16,\r\n g: colorValue >> 8 & 0xFF,\r\n // g: (colorValue & 0xFF00) >> 8,\r\n b: colorValue & 0xFF,\r\n // b: colorValue & 0xFF,\r\n a: 255\r\n };\r\n }\r\n\r\n // TODO: compare performance:\r\n // colorHexString = refineColorHexString(colorHexString);\r\n // // no alpha means opaque (non-transparent)\r\n // return {\r\n // r: parseInt(colorHexString.slice(0, 2), 16), // \"0x\" + ...\r\n // g: parseInt(colorHexString.slice(2, 4), 16),\r\n // b: parseInt(colorHexString.slice(4, 6), 16),\r\n // a: colorHexString.length > 6 ? parseInt(colorHexString.slice(6, 8), 16): 255\r\n // };\r\n\r\n // let hexString = input.replace('#', '');\r\n // if (hexString.length === 3) {\r\n // hexString = `${hexString[0]}${hexString[0]}${hexString[1]}${hexString[1]}${hexString[2]}${hexString[2]}`;\r\n // } \r\n // const r = parseInt(hexString.substring(0, 2), 16);\r\n // const g = parseInt(hexString.substring(2, 4), 16);\r\n // const b = parseInt(hexString.substring(4, 6), 16);\r\n }\r\n}\r\n\r\n// colorNumberToHexString\r\nexport function getColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n if (color == null || Number.isNaN(color)) {\r\n // color = 0;\r\n return \"\";\r\n }\r\n return \"#\" + ('000000' + color.toString(16)).slice(-6);\r\n}\r\n\r\nexport function get32BitColorHexStringFromNumber(color: number) {\r\n color = Math.floor(color);\r\n return \"#\" + ('00000000' + color.toString(16)).slice(-8);\r\n}\r\n\r\n// colorRgbaToNumber/colorRgbaToInt(Number)\r\n// { r: number, g: number, b: number, a?: number }\r\n// use24BitDepthForOpaque\r\nexport function getColorNumberFromRgba(r: number, g: number, b: number, a: number = null, use24BitsForOpaque: boolean = true) {\r\n let result: number;\r\n // typeof a !== \"number\"\r\n if (a == undefined || (a === 255 && use24BitsForOpaque)) { // a === 255?\r\n // 24-bit color number\r\n result = (r << 16) + (g << 8) + b << 0; // '+' can be replaced with '^' or '|' \r\n } else {\r\n // 32-bit color number\r\n result = (r << 24) + (g << 16) + (b << 8) + a;\r\n }\r\n return result >>> 0; // convert to unsigned int32\r\n}\r\n\r\n// colorRgbaToHexString\r\n// { r: number, g: number, b: number, a?: number }\r\nexport function getColorHexStringFromRgba(r: number, g: number, b: number, a: number = null) {\r\n const value = getColorNumberFromRgba(r, g, b, a);\r\n return getColorHexStringFromNumber(value);\r\n}\r\n\r\n// getColorNumberFromControlEvent\r\nexport function getColorNumberFromEvent(e: Event) {\r\n const colorHexString = (e.target as HTMLInputElement)?.value;\r\n return getColorNumberFromHexString(colorHexString);\r\n}\r\n\r\n/*\r\nfunction parse(orig: string) {\r\n if (!orig) {\r\n return {};\r\n }\r\n\r\n const result = orig.match(/(?:((hsl|rgb)a? *\\(([\\d.%]+(?:deg|g?rad|turn)?)[ ,]*([\\d.%]+)[ ,]*([\\d.%]+)[ ,/]*([\\d.%]*)\\))|(#((?:[\\d\\w]{3}){1,2})([\\d\\w]{1,2})?))/i);\r\n if (!result) {\r\n return { color: orig, opacity: 1.0 };\r\n } else if (result[7]) {\r\n let opacity = 1.0;\r\n if (result[9]) {\r\n opacity = parseInt(result[9].length == 1 ? `${result[9]}${result[9]}` : result[9], 16) * inv255;\r\n }\r\n return { color: `#${result[8]}`, opacity };\r\n } else if (result[0]) {\r\n return { color: `${result[2]}(${result[3]},${result[4]},${result[5]})`, opacity: (Number(result[6]) || 1.0) };\r\n }\r\n}\r\n*/"],"names":["getRandomColorChannelNumber","brightness","r","getRandomColorChannelString","result","getRandom32BitColorNumber","alpha","g","b","getColorNumberFromRgba","getRandomColorNumber","refineColorHexString","colorHexString","isNegative","getColorNumberFromHexString","getColorRgbaFromHexString","colorValue","getColorHexStringFromNumber","color","get32BitColorHexStringFromNumber","a","use24BitsForOpaque","getColorHexStringFromRgba","value","getColorNumberFromEvent","e"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cultures.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"cultures.es.js","sources":["../../src/i18n/cultures.ts"],"sourcesContent":["import enUsCulture from './enUsCulture';\r\n\r\nconst cultures = {\r\n \"en-US\": enUsCulture,\r\n \"invariant\": enUsCulture // TODO: create invariant culture\r\n};\r\nexport default cultures;\r\n"],"names":["cultures","enUsCulture"],"mappings":";AAEA,MAAMA,IAAW;AAAA,EACb,SAASC;AAAA,EACT,WAAaA;AAAA;AACjB;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enUsCulture.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"enUsCulture.es.js","sources":["../../src/i18n/enUsCulture.ts"],"sourcesContent":["// rename culture to locale?\r\n\r\n/*\r\nTODO:\r\nSorting and String Comparison\r\nString sorting and comparison are language-specific. Even within languages based on the Latin script, there are different composition and sorting rules. Thus do not rely on code points to do proper sorting and string comparison.\r\n\r\nCalendar Differences\r\nThe Gregorian calendar is used in most English speaking countries, but world-ready products should also take into consideration other calendaring systems in use worldwide.\r\n\r\nDate Formatting\r\nDate formatting is not constant through out the world. Although each date basically displays the day, month, and year, their presentation order and separators vary greatly. In fact, there may be many differences between regions within the same country.\r\n\r\nTime Formatting\r\nLike date and calendar formats, time formats are not constant throughout the world.\r\n\r\nCurrency Formatting\r\nCurrency formatting needs to take into consideration the currency symbol and symbol placement, and the number formatting display.\r\n\r\nNumber Formatting\r\nThe number formatting deals with the character used as the decimal and thousands separators.\r\n\r\nAddress Formatting\r\nVarious countries/regions have different address formats.\r\n\r\nTelephone Number Formatting\r\nLike addresses, the format for telephone numbers around the world varies significantly. The input fields and the routines that process information dealing with telephone numbers should be able to handle the variety of formats.\r\n\r\nPaper Size\r\nIt's important to set the paper size correctly if your application supports the print function.\r\n\r\nUnits of Measurement \r\nThroughout the world things are measured using different units and scales. The most popular one used is the metric system (meters, liters, grams, etc). Where as the US still uses the imperial system (feet, inches, pounds, etc).\r\n*/\r\n\r\n// CultureInfo\r\nconst enUsCulture = {\r\n dateTime: {\r\n formats: {\r\n // The leading zero is more commonly used with the 24-hour notation\r\n // especially in computer applications because it can help to maintain column alignment in tables and correct sorting order\r\n\r\n // A -> a?\r\n // YYYY -> YY? (for short formats)\r\n dateTime: \"MM/DD/YYYY hh:mm:ss.SSS A\",\r\n dateTime24: \"MM/DD/YYYY HH:mm:ss.SSS\",\r\n dateTimeShort: \"M/D/YYYY h:mm:ss A\",\r\n dateTime24Short: \"M/D/YYYY HH:mm:ss\",\r\n\r\n dataTimeHM: \"MM/DD/YYYY hh:mm A\",\r\n dataTimeH24M: \"MM/DD/YYYY HH:mm\",\r\n dataTimeHMShort: \"MM/DD/YYYY h:mm A\",\r\n dataTimeH24MShort: \"MM/DD/YYYY H:mm\",\r\n\r\n date: \"MM/DD/YYYY\",\r\n dateShort: \"M/D/YYYY\",\r\n\r\n // timeHMSS\r\n time: \"hh:mm:ss.SSS A\",\r\n // timeH24MSS\r\n time24: \"HH:mm:ss.SSS\",\r\n // timeHMSSShort\r\n timeShort: \"h:mm:ss.SSS A\",\r\n // timeH24MSSShort\r\n time24Short: \"H:mm:ss.SSS\",\r\n\r\n timeHM: \"hh:mm A\",\r\n timeH24M: \"HH:mm\",\r\n timeHMShort: \"h:mm A\",\r\n timeH24MShort: \"H:mm\",\r\n\r\n timeHMS: \"hh:mm:ss A\",\r\n timeH24MS: \"HH:mm:ss\",\r\n timeHMSShort: \"h:mm:ss A\",\r\n timeH24MSShort: \"H:mm:ss\"\r\n }\r\n }\r\n};\r\n\r\nexport default enUsCulture;"],"names":["enUsCulture"],"mappings":"AAoCA,MAAMA,IAAc;AAAA,EAChB,UAAU;AAAA,IACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,MAML,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,iBAAiB;AAAA,MAEjB,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MAEnB,MAAM;AAAA,MACN,WAAW;AAAA;AAAA,MAGX,MAAM;AAAA;AAAA,MAEN,QAAQ;AAAA;AAAA,MAER,WAAW;AAAA;AAAA,MAEX,aAAa;AAAA,MAEb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,eAAe;AAAA,MAEf,SAAS;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,MACd,gBAAgB;AAAA,IAAA;AAAA,EACpB;AAER;"}
|
package/dist/math.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"math.es.js","sources":["../src/math.ts"],"sourcesContent":["export function round(number: number, digits = 0): number {\r\n if (digits < 0) {\r\n throw new Error(\"Invalid argument: digits\");\r\n }\r\n const isNegavite = number < 0;\r\n const epsilon = Number.EPSILON * (isNegavite ? -1 : 1);\r\n\r\n if (digits == 0) {\r\n return Math.round(number + epsilon);\r\n }\r\n\r\n const factor = Math.pow(10, digits);\r\n // const _digits = +padEnd(\"1\", digits + 1, \"0\");\r\n return Math.round((number + epsilon) * factor) / factor;\r\n}\r\n\r\n// toPrecision\r\n// function roundToDecimal(string, decimals) {\r\n// \treturn parseFloat(parseFloat(string).toFixed(decimals));\r\n// }"],"names":["round","number","digits","isNegavite","epsilon","factor"],"mappings":"AAAO,SAASA,EAAMC,GAAgBC,IAAS,GAAW;AACtD,MAAIA,IAAS;AACT,UAAM,IAAI,MAAM,0BAA0B;AAE9C,QAAMC,IAAaF,IAAS,GACtBG,IAAU,OAAO,WAAWD,IAAa,KAAK;AAEpD,MAAID,KAAU;AACV,WAAO,KAAK,MAAMD,IAASG,CAAO;AAGtC,QAAMC,IAAS,KAAK,IAAI,IAAIH,CAAM;AAElC,SAAO,KAAK,OAAOD,IAASG,KAAWC,CAAM,IAAIA;AACrD;"}
|
package/dist/metadata.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"metadata.es.js","sources":["../src/metadata.ts"],"sourcesContent":["export type IPropertyMetadataItem = { [propertyKey: PropertyKey]: any };\r\n\r\nconst propertyMetadataBag = new WeakMap<any, IPropertyMetadataItem>();\r\n\r\n// updateMemberMetadata\r\nexport function updatePropertyMetadata<T extends object>(target: T, propertyName: keyof T, value: any, slotName: string) {\r\n // metadata container\r\n let metadataItem = propertyMetadataBag.get(target);\r\n if (!metadataItem) {\r\n metadataItem = {};\r\n propertyMetadataBag.set(target, metadataItem);\r\n }\r\n const propertyKey = propertyName as PropertyKey;\r\n if (!metadataItem[propertyKey]) {\r\n metadataItem[propertyKey] = {};\r\n }\r\n metadataItem[propertyKey][slotName] = value;\r\n\r\n}\r\n\r\n// getMemberMetadata\r\nexport function getPropertyMetadata<T extends object>(target: T, propertyName: keyof T, slotName?: string) {\r\n // target - obj\r\n if (target && propertyName) {\r\n // metadata container\r\n const metadataItem = getPropertyMetadataItem(propertyMetadataBag, target);\r\n if (metadataItem) {\r\n const propertyKey = propertyName as PropertyKey;\r\n const propertyMetadata = metadataItem[propertyKey];\r\n if (propertyMetadata) {\r\n if (slotName) {\r\n return propertyMetadata[slotName];\r\n } else {\r\n return propertyMetadata;\r\n }\r\n }\r\n }\r\n\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getPropertyMetadataItem<TMetadataItem>(metadata: WeakMap<any, TMetadataItem>, obj: any) {\r\n\r\n // using prototype chain\r\n\r\n let result: TMetadataItem = null;\r\n let prototype;\r\n while (true) {\r\n prototype = Object.getPrototypeOf(prototype || obj);\r\n // actually for the most cases we can stop traversal when prototype === Object.prototype, but it is possible to set metadata for any lavel in prototype chain\r\n if (!prototype) {\r\n break;\r\n }\r\n result = metadata.get(prototype);\r\n if (result) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}"],"names":["propertyMetadataBag","updatePropertyMetadata","target","propertyName","value","slotName","metadataItem","propertyKey","getPropertyMetadata","getPropertyMetadataItem","propertyMetadata","metadata","obj","result","prototype"],"mappings":"AAEA,MAAMA,wBAA0B,QAAA;AAGzB,SAASC,EAAyCC,GAAWC,GAAuBC,GAAYC,GAAkB;AAErH,MAAIC,IAAeN,EAAoB,IAAIE,CAAM;AACjD,EAAKI,MACDA,IAAe,CAAA,GACfN,EAAoB,IAAIE,GAAQI,CAAY;AAEhD,QAAMC,IAAcJ;AACpB,EAAKG,EAAaC,CAAW,MACzBD,EAAaC,CAAW,IAAI,CAAA,IAEhCD,EAAaC,CAAW,EAAEF,CAAQ,IAAID;AAE1C;AAGO,SAASI,EAAsCN,GAAWC,GAAuBE,GAAmB;AAEvG,MAAIH,KAAUC,GAAc;AAExB,UAAMG,IAAeG,EAAwBT,GAAqBE,CAAM;AACxE,QAAII,GAAc;AAEd,YAAMI,IAAmBJ,EADLH,CAC6B;AACjD,UAAIO;AACA,eAAIL,IACOK,EAAiBL,CAAQ,IAEzBK;AAAA,IAGnB;AAAA,EAEJ;AAEJ;AAEO,SAASD,EAAuCE,GAAuCC,GAAU;AAIpG,MAAIC,IAAwB,MACxBC;AACJ,SACIA,IAAY,OAAO,eAAeA,KAAaF,CAAG,GAE9C,GAACE,MAGLD,IAASF,EAAS,IAAIG,CAAS,GAC3BD;AAAJ;AAKJ,SAAOA;AACX;"}
|
package/dist/mutex.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutex.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"mutex.es.js","sources":["../src/mutex.ts"],"sourcesContent":["import { Executor } from \"./typeCore\";\r\n\r\nclass Mutex {\r\n private mutex = Promise.resolve();\r\n\r\n lock(): PromiseLike<() => void> {\r\n let begin: (unlock: () => void) => void = unlock => { };\r\n\r\n this.mutex = this.mutex.then(() => {\r\n return new Promise(begin);\r\n });\r\n\r\n return new Promise(res => {\r\n begin = res;\r\n });\r\n }\r\n\r\n async dispatch<T>(fn: Executor<T>): Promise<T> {\r\n const unlock = await this.lock();\r\n try {\r\n return await Promise.resolve(fn());\r\n } finally {\r\n unlock();\r\n }\r\n }\r\n}\r\n\r\nexport {\r\n Mutex\r\n};"],"names":["Mutex","begin","unlock","res","fn"],"mappings":"AAEA,MAAMA,EAAM;AAAA,EACA,QAAQ,QAAQ,QAAA;AAAA,EAExB,OAAgC;AAC5B,QAAIC,IAAsC,CAAAC,MAAU;AAAA,IAAE;AAEtD,gBAAK,QAAQ,KAAK,MAAM,KAAK,MAClB,IAAI,QAAQD,CAAK,CAC3B,GAEM,IAAI,QAAQ,CAAAE,MAAO;AACtB,MAAAF,IAAQE;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,SAAYC,GAA6B;AAC3C,UAAMF,IAAS,MAAM,KAAK,KAAA;AAC1B,QAAI;AACA,aAAO,MAAM,QAAQ,QAAQE,GAAI;AAAA,IACrC,UAAA;AACI,MAAAF,EAAA;AAAA,IACJ;AAAA,EACJ;AACJ;"}
|
package/dist/patterns.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"patterns.es.js","sources":["../src/patterns.ts"],"sourcesContent":["export const noop = () => {};"],"names":["noop"],"mappings":"AAAO,MAAMA,IAAO,MAAM;AAAC;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { default as Dexie } from 'dexie';
|
|
2
|
+
export interface IDataEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
createdAt: number;
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
accessedAt: number;
|
|
7
|
+
slidingExpiration?: number;
|
|
8
|
+
expiresAt: number;
|
|
9
|
+
}
|
|
10
|
+
export interface IDataItem {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly value: any;
|
|
13
|
+
}
|
|
14
|
+
export declare class DataEntry implements IDataEntry {
|
|
15
|
+
id: string;
|
|
16
|
+
createdAt: number;
|
|
17
|
+
updatedAt: number;
|
|
18
|
+
accessedAt: number;
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
constructor(src: Partial<DataEntry>);
|
|
21
|
+
}
|
|
22
|
+
export declare class DataItem implements IDataItem {
|
|
23
|
+
id: string;
|
|
24
|
+
value: any;
|
|
25
|
+
constructor(src: Partial<DataItem>);
|
|
26
|
+
}
|
|
27
|
+
export declare class DataStore extends Dexie {
|
|
28
|
+
registry: Dexie.Table<IDataEntry, string>;
|
|
29
|
+
data: Dexie.Table<IDataItem, string>;
|
|
30
|
+
constructor(name: string);
|
|
31
|
+
static delete(name: string): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=dataStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataStore.d.ts","sourceRoot":"","sources":["../../src/store/dataStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAK/C,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,EAAE,MAAM,CAAC;CACrB;AAKD,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;CACvB;AAOD,qBAAa,SAAU,YAAW,UAAU;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;gBAEN,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC;CAStC;AAGD,qBAAa,QAAS,YAAW,SAAS;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,GAAG,CAAC;gBAEC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC;CAQrC;AAED,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAEzB,IAAI,EAAE,MAAM;IA0CxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM;CAG7B"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import r from "dexie";
|
|
2
|
+
const i = "registry", a = "data", c = ["id", "createdAt", "accessedAt", "updatedAt", "expiresAt"], n = ["id", "value"];
|
|
3
|
+
class y {
|
|
4
|
+
id;
|
|
5
|
+
createdAt;
|
|
6
|
+
updatedAt;
|
|
7
|
+
accessedAt;
|
|
8
|
+
expiresAt;
|
|
9
|
+
constructor(t) {
|
|
10
|
+
Object.assign(this, t);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
class p {
|
|
14
|
+
id;
|
|
15
|
+
value;
|
|
16
|
+
constructor(t) {
|
|
17
|
+
Object.assign(this, t);
|
|
18
|
+
}
|
|
19
|
+
// constructor(key: string, value: string) {
|
|
20
|
+
// this.key = key;
|
|
21
|
+
// this.value = value;
|
|
22
|
+
// }
|
|
23
|
+
}
|
|
24
|
+
class u extends r {
|
|
25
|
+
// catalog/entries
|
|
26
|
+
registry;
|
|
27
|
+
data;
|
|
28
|
+
constructor(t) {
|
|
29
|
+
if (!t)
|
|
30
|
+
throw new Error("Invalid database name");
|
|
31
|
+
super(t);
|
|
32
|
+
const e = this;
|
|
33
|
+
e.version(1).stores({
|
|
34
|
+
[i]: c.join(", "),
|
|
35
|
+
[a]: n.join(", ")
|
|
36
|
+
}), this.registry = e.table(i), this.data = e.table(a), e.registry.hook("deleting", async (o, l, d) => {
|
|
37
|
+
await d.table(a).delete(o);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
static delete(t) {
|
|
41
|
+
return r.delete(t);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
y as DataEntry,
|
|
46
|
+
p as DataItem,
|
|
47
|
+
u as DataStore
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=dataStore.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataStore.es.js","sources":["../../src/store/dataStore.ts"],"sourcesContent":["import Dexie, { PromiseExtended } from \"dexie\"; // https://dexie.org/docs/Typescript\r\n\r\nconst registryTableName = \"registry\"; // \"catalog\"\r\nconst dataTableName = \"data\";\r\n\r\nexport interface IDataEntry {\r\n id: string; // should be called \"id\" for Dexie!\r\n createdAt: number;\r\n updatedAt: number; // lastModified\r\n accessedAt: number; // lastAccessed/lastAccessTime\r\n slidingExpiration?: number;\r\n // absoluteExpiration?: number;\r\n expiresAt: number; // expiryTime\r\n}\r\n// isValid?\r\n// tags?\r\n\r\n// IDataRecord\r\nexport interface IDataItem {\r\n readonly id: string;\r\n readonly value: any;\r\n}\r\n\r\n// (registry/catalog)PropertyNames\r\nconst entryPropertyNames: (keyof IDataEntry)[] = [\"id\", \"createdAt\", \"accessedAt\", \"updatedAt\", \"expiresAt\"];\r\n\r\nconst dataItemPropertyNames: (keyof IDataItem)[] = [\"id\", \"value\"];\r\n\r\nexport class DataEntry implements IDataEntry {\r\n id: string;\r\n createdAt: number;\r\n updatedAt: number;\r\n accessedAt: number;\r\n expiresAt: number;\r\n\r\n constructor(src: Partial<DataEntry>) {\r\n Object.assign(this, src);\r\n // Define navigation properties.\r\n // Making them non-enumerable will prevent them from being handled by indexedDB\r\n // when doing put() or add().\r\n // Object.defineProperties(this, {\r\n // ...: { value: [], enumerable: false, writable: true }\r\n // });\r\n }\r\n}\r\n\r\n// DataRecord\r\nexport class DataItem implements IDataItem {\r\n id: string;\r\n value: any;\r\n\r\n constructor(src: Partial<DataItem>) {\r\n Object.assign(this, src);\r\n }\r\n\r\n // constructor(key: string, value: string) {\r\n // this.key = key;\r\n // this.value = value;\r\n // }\r\n}\r\n\r\nexport class DataStore extends Dexie {\r\n // catalog/entries\r\n registry: Dexie.Table<IDataEntry, string>;\r\n data: Dexie.Table<IDataItem, string>;\r\n\r\n constructor(name: string) {\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 const db = this;\r\n\r\n // Define tables and indexes \r\n\r\n db.version(1).stores({\r\n [registryTableName]: entryPropertyNames.join(\", \"),\r\n [dataTableName]: dataItemPropertyNames.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: IDataEntry) => {\r\n // \t\t// ...\r\n // \t});\r\n // });\r\n\r\n this.registry = db.table(registryTableName);\r\n this.data = db.table(dataTableName);\r\n\r\n db.registry.hook(\"deleting\", async (key, obj, transaction) => {\r\n await transaction.table(dataTableName).delete(key);\r\n });\r\n\r\n // db.registry.mapToClass(DataEntry);\r\n // db.data.mapToClass(DataItem);\r\n\r\n // db.on('populate', () => db.registry.bulkAdd([\r\n // \t// ...\r\n // ]));\r\n }\r\n\r\n static delete(name: string) {\r\n return Dexie.delete(name);\r\n }\r\n}\r\n"],"names":["registryTableName","dataTableName","entryPropertyNames","dataItemPropertyNames","DataEntry","src","DataItem","DataStore","Dexie","name","db","key","obj","transaction"],"mappings":";AAEA,MAAMA,IAAoB,YACpBC,IAAgB,QAqBhBC,IAA2C,CAAC,MAAM,aAAa,cAAc,aAAa,WAAW,GAErGC,IAA6C,CAAC,MAAM,OAAO;AAE1D,MAAMC,EAAgC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAYC,GAAyB;AACjC,WAAO,OAAO,MAAMA,CAAG;AAAA,EAO3B;AACJ;AAGO,MAAMC,EAA8B;AAAA,EACvC;AAAA,EACA;AAAA,EAEA,YAAYD,GAAwB;AAChC,WAAO,OAAO,MAAMA,CAAG;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAMJ;AAEO,MAAME,UAAkBC,EAAM;AAAA;AAAA,EAEjC;AAAA,EACA;AAAA,EAEA,YAAYC,GAAc;AAItB,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,uBAAuB;AAG3C,UAAMA,CAAI;AAEV,UAAMC,IAAK;AAIX,IAAAA,EAAG,QAAQ,CAAC,EAAE,OAAO;AAAA,MACjB,CAACV,CAAiB,GAAGE,EAAmB,KAAK,IAAI;AAAA,MACjD,CAACD,CAAa,GAAGE,EAAsB,KAAK,IAAI;AAAA,IAAA,CACnD,GAUD,KAAK,WAAWO,EAAG,MAAMV,CAAiB,GAC1C,KAAK,OAAOU,EAAG,MAAMT,CAAa,GAElCS,EAAG,SAAS,KAAK,YAAY,OAAOC,GAAKC,GAAKC,MAAgB;AAC1D,YAAMA,EAAY,MAAMZ,CAAa,EAAE,OAAOU,CAAG;AAAA,IACrD,CAAC;AAAA,EAQL;AAAA,EAEA,OAAO,OAAOF,GAAc;AACxB,WAAOD,EAAM,OAAOC,CAAI;AAAA,EAC5B;AACJ;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { IPersistentStore } from './storeContracts';
|
|
2
|
+
export declare class PersistentStore implements IPersistentStore {
|
|
3
|
+
private _db;
|
|
4
|
+
private _isDisposed;
|
|
5
|
+
private _useEncryption;
|
|
6
|
+
constructor(name: string, useEncryption?: boolean);
|
|
7
|
+
static delete(name: string): Promise<void>;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
private execAsync;
|
|
10
|
+
getKeysAsync(): import('dexie').PromiseExtended<string[]>;
|
|
11
|
+
getAsync<T = any>(key: string): Promise<T>;
|
|
12
|
+
bulkGetAsync(ids: string[]): Promise<Record<string, any>>;
|
|
13
|
+
containsAsync(key: string): Promise<boolean>;
|
|
14
|
+
deleteAsync(id: string): Promise<void>;
|
|
15
|
+
bulkDeleteAsync(ids: string[]): Promise<void>;
|
|
16
|
+
setAsync<T = any>(id: string, value: T): Promise<void>;
|
|
17
|
+
getOrSetAsync(key: string, factory: () => any): Promise<void>;
|
|
18
|
+
clearAsync(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=persistentStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentStore.d.ts","sourceRoot":"","sources":["../../src/store/persistentStore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAuBpD,qBAAa,eAAgB,YAAW,gBAAgB;IAEpD,OAAO,CAAC,GAAG,CAAY;IAEvB,OAAO,CAAC,WAAW,CAAU;IAE7B,OAAO,CAAC,cAAc,CAAU;gBAEpB,IAAI,EAAE,MAAM,EAAE,aAAa,UAAQ;IAQ/C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM;IAI1B,OAAO;YAaO,SAAS;IAevB,YAAY;IAIN,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAc1C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IA+BzD,aAAa,CAAC,GAAG,EAAE,MAAM;IAQzB,WAAW,CAAC,EAAE,EAAE,MAAM;IAOtB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE;IAO7B,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAyBtC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG;IAU7C,UAAU;CAQnB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import c from "dexie";
|
|
2
|
+
import { DataStore as y } from "./dataStore.es.js";
|
|
3
|
+
import { v4 as d } from "uuid";
|
|
4
|
+
class l {
|
|
5
|
+
_db;
|
|
6
|
+
_isDisposed;
|
|
7
|
+
_useEncryption;
|
|
8
|
+
// TODO: support
|
|
9
|
+
constructor(t, e = !1) {
|
|
10
|
+
if (!t)
|
|
11
|
+
throw new Error("Name cannot be empty");
|
|
12
|
+
this._useEncryption = e, this._db = new y(t);
|
|
13
|
+
}
|
|
14
|
+
static delete(t) {
|
|
15
|
+
return c.delete(t);
|
|
16
|
+
}
|
|
17
|
+
dispose() {
|
|
18
|
+
this._isDisposed || (this._isDisposed = !0, this._db && (this._db.isOpen() && this._db.close(), this._db = null));
|
|
19
|
+
}
|
|
20
|
+
async execAsync(t) {
|
|
21
|
+
this._db.isOpen() || await this._db.open();
|
|
22
|
+
try {
|
|
23
|
+
return await t();
|
|
24
|
+
} catch (e) {
|
|
25
|
+
throw this._db.isOpen(), e;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
getKeysAsync() {
|
|
29
|
+
return this._db.registry.filter((t) => !0).primaryKeys();
|
|
30
|
+
}
|
|
31
|
+
async getAsync(t) {
|
|
32
|
+
return await this.execAsync(async () => {
|
|
33
|
+
if (await this._db.registry.get(t))
|
|
34
|
+
return (await this._db.data.get(t))?.value;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// getManyAsync
|
|
38
|
+
async bulkGetAsync(t) {
|
|
39
|
+
const e = {};
|
|
40
|
+
return await this.execAsync(async () => {
|
|
41
|
+
const a = (await this._db.registry.bulkGet(t)).reduce((s, n, h) => (s[n.id] = n, s), {}), r = await this._db.data.bulkGet(t);
|
|
42
|
+
for (const s of r)
|
|
43
|
+
e[s.id] = s.value, delete a[s.id];
|
|
44
|
+
for (const s of Object.keys(a))
|
|
45
|
+
e[s] = void 0;
|
|
46
|
+
return e;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async containsAsync(t) {
|
|
50
|
+
return await this.execAsync(async () => await this._db.registry.get(t) != null);
|
|
51
|
+
}
|
|
52
|
+
async deleteAsync(t) {
|
|
53
|
+
await this.execAsync(async () => {
|
|
54
|
+
await this._db.registry.delete(t);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// deleteManyAsync
|
|
58
|
+
async bulkDeleteAsync(t) {
|
|
59
|
+
await this.execAsync(async () => {
|
|
60
|
+
await this._db.registry.bulkDelete(t);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// upsertAsync
|
|
64
|
+
async setAsync(t, e) {
|
|
65
|
+
return await this.execAsync(async () => {
|
|
66
|
+
const i = await this._db.registry.get(t), a = (/* @__PURE__ */ new Date()).getTime();
|
|
67
|
+
t || (t = d()), await this._db.registry.put({
|
|
68
|
+
id: t,
|
|
69
|
+
createdAt: i ? i.createdAt : a,
|
|
70
|
+
accessedAt: i ? i.accessedAt : null,
|
|
71
|
+
// now
|
|
72
|
+
updatedAt: a,
|
|
73
|
+
expiresAt: void 0,
|
|
74
|
+
slidingExpiration: void 0
|
|
75
|
+
}), await this._db.data.put({
|
|
76
|
+
id: t,
|
|
77
|
+
value: e
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// getOrAddAsync
|
|
82
|
+
async getOrSetAsync(t, e) {
|
|
83
|
+
await this.execAsync(async () => (await this.containsAsync(t) || await this.setAsync(t, e()), await this.getAsync(t)));
|
|
84
|
+
}
|
|
85
|
+
// clearAllAsync
|
|
86
|
+
async clearAsync() {
|
|
87
|
+
await this.execAsync(async () => {
|
|
88
|
+
await this._db.registry.clear(), await this._db.data.clear();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// TODO: support bulkSetAsync
|
|
92
|
+
}
|
|
93
|
+
export {
|
|
94
|
+
l as PersistentStore
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=persistentStore.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentStore.es.js","sources":["../../src/store/persistentStore.ts"],"sourcesContent":["// TODO: implement real encryption:\r\n// https://stackoverflow.com/questions/18279141/javascript-string-encryption-and-decryption\r\n\r\nimport Dexie from \"dexie\";\r\nimport { DataStore, IDataEntry } from \"./dataStore\";\r\nimport { IPersistentStore } from \"./storeContracts\";\r\nimport { v4 as uuid } from \"uuid\";\r\n\r\n/*\r\n(async () => {\r\n const alreadyPersisted = await window.navigator.storage?.persisted()\r\n\r\n if (alreadyPersisted) {\r\n return;\r\n }\r\n\r\n const persistentModeEnabled = await window.navigator.storage?.persist()\r\n\r\n if (!persistentModeEnabled) {\r\n // Storage may be cleared by the UA under storage pressure\r\n } else {\r\n // Storage will be persistent\r\n // Storage will not be cleared except by explicit user action\r\n }\r\n})();\r\n*/\r\n\r\n// TODO: remove class, create factory method\r\nexport class PersistentStore implements IPersistentStore {\r\n\r\n private _db: DataStore;\r\n\r\n private _isDisposed: boolean;\r\n\r\n private _useEncryption: boolean; // TODO: support\r\n\r\n constructor(name: string, useEncryption = false) {\r\n if (!name) {\r\n throw new Error(\"Name cannot be empty\");\r\n }\r\n this._useEncryption = useEncryption;\r\n this._db = new DataStore(name);\r\n }\r\n\r\n static delete(name: string) {\r\n return Dexie.delete(name);\r\n }\r\n\r\n dispose() {\r\n if (!this._isDisposed) {\r\n this._isDisposed = true;\r\n\r\n if (this._db) {\r\n if (this._db.isOpen()) {\r\n this._db.close();\r\n }\r\n this._db = null;\r\n }\r\n }\r\n }\r\n\r\n private async execAsync<T>(action: () => Promise<T>) {\r\n if (!this._db.isOpen()) {\r\n await this._db.open();\r\n }\r\n try {\r\n const result = await action();\r\n return result;\r\n } catch (err) {\r\n if (this._db.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 getKeysAsync() {\r\n return this._db.registry.filter((_) => true).primaryKeys();\r\n }\r\n\r\n async getAsync<T = any>(key: string): Promise<T> {\r\n return await this.execAsync(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n if (entry) {\r\n const data = await this._db.data.get(key);\r\n // const data = await this._db.data.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n return data?.value;\r\n }\r\n return undefined;\r\n });\r\n }\r\n\r\n // getManyAsync\r\n async bulkGetAsync(ids: string[]): Promise<Record<string, any>> {\r\n const result: Record<string, any> = {};\r\n return await this.execAsync(async () => {\r\n // const entries = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).anyOf(ids).toArray();\r\n const entries = await this._db.registry.bulkGet(ids);\r\n const entryMap: { [key: string]: IDataEntry } = entries.reduce((map, entry, i) => {\r\n map[entry.id] = entry;\r\n return map;\r\n }, {});\r\n\r\n // const dataItems = this._db.data.where(keyOf<IDataEntry>(\"id\")).anyOf(ids);\r\n // await dataItems.each((dataItem) => {\r\n // result[dataItem.id] = { ...entryMap[dataItem.id], ...dataItem };\r\n // delete entryMap[dataItem.id];\r\n // });\r\n\r\n const dataItems = await this._db.data.bulkGet(ids);\r\n for (const dataItem of dataItems) {\r\n result[dataItem.id] = dataItem.value;\r\n delete entryMap[dataItem.id];\r\n }\r\n\r\n for (const key of Object.keys(entryMap)) {\r\n // abandoned/orphaned entries:\r\n result[key] = undefined;\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n async containsAsync(key: string) {\r\n return await this.execAsync(async () => {\r\n const entry = await this._db.registry.get(key);\r\n // const entry = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n return entry != undefined;\r\n });\r\n }\r\n\r\n async deleteAsync(id: string) {\r\n await this.execAsync(async () => {\r\n await this._db.registry.delete(id);\r\n });\r\n }\r\n\r\n // deleteManyAsync\r\n async bulkDeleteAsync(ids: string[]) {\r\n await this.execAsync(async () => {\r\n await this._db.registry.bulkDelete(ids);\r\n });\r\n }\r\n\r\n // upsertAsync\r\n async setAsync<T = any>(id: string, value: T) {\r\n return await this.execAsync(async () => {\r\n const entry = await this._db.registry.get(id);\r\n // const entry = await this._db.registry.where(keyOf<IDataEntry>(\"id\")).equals(key).first();\r\n const now = new Date().getTime();\r\n if (!id) {\r\n id = uuid();\r\n }\r\n\r\n await this._db.registry.put({\r\n id: id,\r\n createdAt: entry ? entry.createdAt : now,\r\n accessedAt: entry ? entry.accessedAt : null, // now\r\n updatedAt: now,\r\n expiresAt: undefined,\r\n slidingExpiration: undefined\r\n });\r\n await this._db.data.put({\r\n id: id,\r\n value: value\r\n });\r\n });\r\n }\r\n\r\n // getOrAddAsync\r\n async getOrSetAsync(key: string, factory: () => any) {\r\n await this.execAsync(async () => {\r\n if (!(await this.containsAsync(key))) {\r\n await this.setAsync(key, factory());\r\n }\r\n return await this.getAsync(key);\r\n });\r\n }\r\n\r\n // clearAllAsync\r\n async clearAsync() {\r\n await this.execAsync(async () => {\r\n await this._db.registry.clear();\r\n await this._db.data.clear();\r\n });\r\n }\r\n\r\n // TODO: support bulkSetAsync\r\n}\r\n"],"names":["PersistentStore","name","useEncryption","DataStore","Dexie","action","err","_","key","ids","result","entryMap","map","entry","i","dataItems","dataItem","id","value","now","uuid","factory"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type IPersistentStore = {
|
|
2
|
+
getAsync<T = any>(key: string, useEncryption?: boolean): Promise<T>;
|
|
3
|
+
setAsync<T = any>(key: string, value: T, useEncryption?: boolean): Promise<void>;
|
|
4
|
+
deleteAsync(key: string): Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=storeContracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeContracts.d.ts","sourceRoot":"","sources":["../../src/store/storeContracts.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeContracts.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringCore.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"stringCore.es.js","sources":["../src/stringCore.ts"],"sourcesContent":["// const currentLocale = new Intl.Locale(navigator.language);\r\n// const currentCollator = Intl.Collator(navigator.language);\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 = navigator.language) => {\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 = navigator.language) {\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 = navigator.language) {\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 = navigator.language) {\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 = navigator.language) {\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 = navigator.language) {\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 = navigator.language) {\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).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":["defaulCollator","ciCompare","collatorOptions","strA","strB","locale","compare","ignoreCase","equals","ciStartsWith","str","searchStr","ciEndsWith","ciIndexOf","ciIncludes"],"mappings":"AAEA,MAAMA,IAAiB,KAAK,SAAA,GAEtBC,KAAa,MAAM;AACrB,QAAMC,IAAwC;AAAA,IAC1C,aAAa;AAAA;AAAA,EAAA;AAIjB,SAAO,IAAI,cAAc,KAAK,QAAWA,CAAe,IAAI,CAACC,GAAcC,GAAcC,IAAS,UAAU,aACjGF,EAAK,cAAcC,GAAMC,GAAQH,CAAe,IACvD,CAACC,GAAcC,GAAcC,MAEtBF,EAAK,kBAAkBE,CAAM,EAAE,cAAcD,EAAK,kBAAkBC,CAAM,GAAGA,CAAM;AAElG,GAAA;AAEA,SAASC,EAAQH,GAAcC,GAAcG,IAAa,IAAOF,IAAS,UAAU,UAAU;AAC1F,SAAI,OAAOF,KAAS,YAAY,OAAOC,KAAS,WACrCJ,EAAe,QAAQG,GAAMC,CAAI,IAExCG,IACON,EAAUE,GAAMC,GAAMC,CAAM,IAEhCF,EAAK,cAAcC,GAAMC,CAAM;AAC1C;AAGA,SAASG,EAAOL,GAAcC,GAAcG,IAAa,IAAOF,IAAS,UAAU,UAAU;AACzF,SAAI,OAAOF,KAAS,YAAY,OAAOC,KAAS,WACrCD,MAASC,IAEhBG,IACON,EAAUE,GAAMC,CAAI,MAAM,IAE9BD,EAAK,cAAcC,GAAMC,CAAM,MAAM;AAChD;AAEA,SAASI,EAAaC,GAAaC,GAAmBN,IAAS,UAAU,UAAU;AAC/E,SAAI,OAAOK,KAAQ,YAAY,OAAOC,KAAc,YAAYD,EAAI,SAASC,EAAU,SAC5E,KAEJH,EAAOE,EAAI,UAAU,GAAGC,EAAU,MAAM,GAAGA,GAAW,IAAMN,CAAM;AAC7E;AAEA,SAASO,EAAWF,GAAaC,GAAmBN,IAAS,UAAU,UAAU;AAC7E,SAAI,OAAOK,KAAQ,YAAY,OAAOC,KAAc,YAAYD,EAAI,SAASC,EAAU,SAC5E,KAEJH,EAAOE,EAAI,UAAUA,EAAI,SAASC,EAAU,MAAM,GAAGA,GAAW,IAAMN,CAAM;AACvF;AAEA,SAASQ,EAAUH,GAAaC,GAAmBN,IAAS,UAAU,UAAU;AAC5E,SAAI,OAAOK,KAAQ,YAAY,OAAOC,KAAc,YAAYD,EAAI,SAASC,EAAU,SAC5E,KAEJD,EAAI,kBAAkBL,CAAM,EAAE,QAAQM,EAAU,kBAAkBN,CAAM,CAAC;AACpF;AAEA,SAASS,EAAWJ,GAAaC,GAAmBN,IAAS,UAAU,UAAU;AAC7E,SAAI,OAAOK,KAAQ,YAAY,OAAOC,KAAc,YAAYD,EAAI,SAASC,EAAU,SAC5E,KAEJD,EAAI,kBAAkBL,CAAM,EAAE,SAASM,EAAU,kBAAkBN,CAAM,CAAC;AACrF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structEvent.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"structEvent.es.js","sources":["../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 target: TTarget;\r\n // currentTarget: TTarget;\r\n type: TType;\r\n constructor(type: TType, eventInitDict?: CustomEventInit<TStruct[TType]> & { target: TTarget }) {\r\n super(type, eventInitDict);\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 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 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 super.removeEventListener(type, listener);\r\n }\r\n\r\n dispatchEvent<K extends Extract<keyof TStruct, string>>(event: StructEvent<TStruct, this, 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, this, K>) => void): boolean {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n}\r\n"],"names":["StructEvent","type","eventInitDict","StructEventTarget","listener","options","event"],"mappings":"AAEO,MAAMA,UAIH,YAA4B;AAAA,EAClC;AAAA;AAAA,EAEA;AAAA,EACA,YAAYC,GAAaC,GAAuE;AAC5F,UAAMD,GAAMC,CAAa,GACzB,KAAK,SAASA,EAAc;AAAA,EAChC;AACJ;AAIO,MAAMC,UAA+D,YAAkD;AAAA,EAC1H,cAAc;AACV,UAAA;AAAA,EACJ;AAAA,EAEA,iBACIF,GACAG,GACAC,GACI;AACJ,UAAM,iBAAiBJ,GAAMG,GAAUC,CAAO;AAAA,EAClD;AAAA,EAEA,oBACIJ,GACAG,GACAC,GACI;AACJ,UAAM,oBAAoBJ,GAAMG,CAAQ;AAAA,EAC5C;AAAA,EAEA,cAAwDE,GAA+C;AACnG,WAAO,MAAM,cAAcA,CAAK;AAAA,EACpC;AAAA,EAEA,iBAA2DL,GAASG,GAAmE;AACnI,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AACJ;"}
|
package/dist/typeCore.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeCore.es.js","sources":["
|
|
1
|
+
{"version":3,"file":"typeCore.es.js","sources":["../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\n\r\nexport type Skip<T extends object, 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 extends object, 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 extends object, 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\nexport type Intersection<T, U> = Pick<T, Extract<keyof T, keyof U>>;\r\n\r\nexport type Extend<T extends object, U extends object, K extends keyof U> = T & { [P in K]: U[K] };\r\n\r\n// Validation\r\nexport type ValueOf<T extends object> = 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 extends object, 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 extends object> = {\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\n// export type MaybePromise<T> = T extends undefined ? void : T | PromiseLike<Awaited<T>>; // TODO: check\r\nexport type MaybePromise<T> = T extends undefined ? void : T | PromiseLike<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>;\r\nexport type Executor<T = void, TArgs extends any[] = []> = Func<TArgs, T | PromiseLike<T>>;\r\n\r\nexport type Overwrite<Base extends object, Overrides extends object> = Omit<Base, keyof Overrides> & Overrides;\r\n// or\r\n// export type Overwrite<Base extends object, Overrides extends object> = Pick<Base, Exclude<keyof Base, keyof Overrides>> & Overrides;\r\n\r\nexport type Extends<T extends object, TBase extends object> = T extends TBase ? true : false;\r\n\r\n// more strict than Extract\r\nexport type RequireExtends<T extends TBase, TBase extends object> = T;\r\n\r\nexport type MaybeExtends<T, TShape> = T extends TShape ? T : never;\r\n\r\nexport type KeyOf<T extends object, TKey extends keyof T> = TKey;\r\n\r\nexport type IsKeyOf<T, TKey extends object> = TKey extends keyof T ? true : false;\r\n\r\nexport type KeysOf<T extends object, TKeys extends keyof T | Array<keyof T>> = TKeys extends Array<keyof T> ? TKeys[number] : TKeys;\r\n\r\nexport type SafeKey<T extends object, 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"],"names":["getPrefixer","prefix","value","getValuePrefixer","dict","k","getKeyPrefixer","obj"],"mappings":"AAsGO,MAAMA,IAAc,CAACC,MAAmB,CAACC,MACrC,GAAGD,CAAM,GAAGC,CAAK,IAGfC,IACT,CAAsCF,MACtC,CAACG,MACU,OAAO,YAAY,OAAO,KAAKA,CAAI,EAAE,IAAI,CAACC,MAAM,CAACA,GAAG,GAAGJ,CAAM,GAAGG,EAAKC,CAAC,CAAC,EAAE,CAAC,CAAC,GAG7EC,IACT,CAAmCL,MACnC,CAACM,MACU,OAAO,YAAY,OAAO,KAAKA,CAAG,EAAE,IAAI,CAACF,MAAM,CAAC,GAAGJ,CAAM,GAAGI,CAAC,IAAIE,EAAIF,CAAC,CAAC,CAAC,CAAC;"}
|
package/dist/typeUtils.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeUtils.es.js","sources":["D:/Src/my/actdim/public/utico/src/typeUtils.ts"],"sourcesContent":["import { CallableConstructor, Constructor, ConstructorClass } from \"./typeCore\";\r\n\r\n// @filename: typeUtils.ts\r\n\r\n// typed version of Object.keys\r\nexport function keysOf<T extends object>(obj: T) {\r\n return Object.keys(obj) as Array<keyof T>;\r\n}\r\n\r\nexport function entry<T extends object, TKey extends keyof T>(obj: T, name: TKey, caseInsensitive = true) {\r\n if (!obj || !name) {\r\n return undefined;\r\n }\r\n // name.toString()\r\n let nameStr = String(name).trim();\r\n const keys = keysOf(obj);\r\n let key: keyof T;\r\n if (caseInsensitive) {\r\n nameStr = nameStr.toLowerCase();\r\n key = keys.find((k) => String(k).toLowerCase().trim() === nameStr);\r\n } else {\r\n key = keys.find((k) => String(k).trim() === nameStr);\r\n }\r\n return [key, key == undefined ? undefined : (obj[key] as T[TKey])] as [TKey, T[TKey]];\r\n}\r\n\r\nexport function satisfies<TShape>() {\r\n return <T extends TShape>(obj: T) => obj;\r\n}\r\n\r\n// $keyOf\r\nexport const keyOf = <T extends object, TKey extends keyof T = keyof T>(key: TKey, obj?: T) => key;\r\n\r\n// $nameOf/$n\r\nexport function nameOf<T extends object>(f: (x: T) => T[keyof T]): keyof T;\r\nexport function nameOf(f: (x: any) => any): keyof any {\r\n const p = new Proxy(\r\n {},\r\n {\r\n get: (target, key) => key\r\n }\r\n );\r\n return f(p);\r\n}\r\n\r\ntype $KeyMap<T extends object> = {\r\n [K in keyof T]: K;\r\n};\r\n\r\nexport function $keyMap<T extends object>(obj?: T) {\r\n return new Proxy(\r\n {},\r\n {\r\n get: (target, key) => key\r\n }\r\n ) as $KeyMap<T>;\r\n}\r\n\r\n// $NU\r\ntype $NH<T> = {\r\n nameOf(f: (x: T) => T[keyof T]): keyof T;\r\n};\r\n\r\n// $nu\r\n// usage: $nh(obj).nameOf(x => x.prop) or $NH<ClassName>().nameOf(x => x.prop)\r\nexport function $nh<T>(obj?: T) {\r\n return {\r\n nameOf: (f: (x: any) => any) => {\r\n return nameOf(f);\r\n }\r\n } as $NH<T>;\r\n}\r\n\r\nexport function getPropertyPath<T>(expr: (x: T) => any) {\r\n return getPropertyPathInternal(expr);\r\n}\r\n\r\nfunction getPropertyPathInternal<T>(expr: (x: T) => any, path?: (string | number | symbol)[]) {\r\n if (path == undefined) {\r\n path = [];\r\n }\r\n let createProxy: () => any;\r\n createProxy = () => {\r\n return new Proxy(\r\n {},\r\n {\r\n get: (target, key) => {\r\n path.push(key);\r\n return createProxy();\r\n }\r\n }\r\n );\r\n };\r\n expr(createProxy());\r\n return path;\r\n}\r\n\r\nexport function combinePropertyPath(path?: (string | number | symbol)[]) {\r\n const builder: string[] = [];\r\n for (const key of path) {\r\n builder.push(`[\"${key.toString()}\"]`);\r\n }\r\n return builder.join(\"\");\r\n}\r\n\r\nconst nonObjectTypes: Constructor[] = [String, Number];\r\n\r\n// isNonObjectCtor\r\nfunction isNonObjectType<TConstructor extends Constructor>(type: TConstructor) {\r\n return nonObjectTypes.indexOf(type) >= 0;\r\n}\r\n\r\n// getConstructor\r\nexport function createConstructor<TConstructor extends Constructor>(\r\n type: TConstructor // ctor\r\n): CallableConstructor<TConstructor> {\r\n if (isNonObjectType(type)) {\r\n return type as CallableConstructor<TConstructor>;\r\n } else {\r\n function createInstance(...args: ConstructorParameters<TConstructor>): ConstructorClass<TConstructor> {\r\n // return Reflect.construct(type, args); // works too\r\n return new type(...args);\r\n }\r\n\r\n createInstance.prototype = type.prototype;\r\n return createInstance as CallableConstructor<TConstructor>;\r\n }\r\n}\r\n\r\nexport function getPrototypes(obj: any) {\r\n const result = [];\r\n let prototype;\r\n while (true) {\r\n prototype = Object.getPrototypeOf(prototype || obj);\r\n if (!prototype) {\r\n break;\r\n }\r\n result.push(prototype);\r\n }\r\n return result;\r\n}\r\n\r\nexport function proxify<T extends object>(source: () => T): T {\r\n return new Proxy(\r\n {},\r\n {\r\n get: (target, key) => {\r\n return Reflect.get(source(), key);\r\n // return source()[key];\r\n },\r\n set: (target, key, value) => {\r\n return Reflect.set(source(), key, value);\r\n // source()[key] = value;\r\n // return true;\r\n }\r\n }\r\n ) as T;\r\n}\r\n\r\nexport function getEnumValue<T>(enumType: T, name: string, defaultValue: T[keyof T]): T[keyof T] {\r\n let value = name ? enumType[name as keyof T] : defaultValue;\r\n if (value == undefined) {\r\n value = defaultValue;\r\n }\r\n return value;\r\n}\r\n\r\nexport function getEnumValues<T extends object, K extends keyof T>(enumType: T): Array<T[K]> {\r\n return getEnumKeys<T, K>(enumType).map((x) => enumType[x]);\r\n}\r\n\r\nexport function getEnumKeys<T extends object, K extends keyof T>(enumType: T): Array<K> {\r\n return Object.keys(enumType)\r\n .filter((x) => Number.isNaN(Number(x)))\r\n .map((x) => x as K);\r\n}\r\n\r\n// conditional assign with value factory\r\nexport function assignWith<T extends object, U extends object>(\r\n dst: T,\r\n src: U,\r\n callback?: (key: keyof U, value: U[keyof U], set: (value: U[keyof U]) => void) => any\r\n): T & Partial<U> {\r\n const result: T & Partial<U> = dst;\r\n if (src) {\r\n for (const key in src) {\r\n let value = src[key];\r\n const set = (v: U[keyof U]) => {\r\n // result[key as PropertyKey] = value;\r\n Reflect.set(result, key, v);\r\n };\r\n if (callback) {\r\n callback(key, value, set);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n// constrained and typed assign\r\nexport function update<T extends object, U extends Partial<T>>(dst: T, src: U, props?: [keyof U]): T & Partial<U> {\r\n const propSet = new Set(props);\r\n\r\n return assignWith(dst, src, (key, value, set) => {\r\n if (!propSet.size || propSet.has(key)) {\r\n set(value);\r\n }\r\n });\r\n\r\n // for (const prop of props) {\r\n // // dst[prop as PropertyKey] = src[prop];\r\n // Reflect.set(dst, prop, src[prop]);\r\n // }\r\n // return dst;\r\n}\r\n\r\nexport function copy<T extends object, U extends object>(src: T, dst: U, props?: [keyof T]): U & Partial<T> {\r\n return update(dst, src, props);\r\n}\r\n\r\nexport function isPlainObject(value) {\r\n if (Object.prototype.toString.call(value) !== '[object Object]') return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === null || proto === Object.prototype;\r\n}\r\n\r\nconst sort = (() => {\r\n // It relies on Chrome's and Node's behaviour that the first key assigned to an object is outputted first by JSON.stringify.\r\n const noKeys = []; // emptyKeys\r\n function sortImpl(obj: any, keyCompareFn?: (a: string, b: string) => number) {\r\n const keys = obj ? Object.keys(obj) : noKeys;\r\n // const orderedKeys = desc ? keys.orderByDesc(k => k) : keys.orderBy(k => k);\r\n if (keyCompareFn) {\r\n // array sort method without compare function produces ascending but alphabetical, lexicographic (dictionary) order\r\n keyCompareFn = (a, b) => b.localeCompare(a);\r\n }\r\n const orderedKeys = keys.sort(keyCompareFn);\r\n // result\r\n const container = {}; // sortedObj\r\n for (const key of orderedKeys) {\r\n container[key] = isPlainObject(obj[key]) ? sortImpl(obj[key]) : obj[key];\r\n }\r\n return container;\r\n }\r\n return sortImpl;\r\n})();\r\n\r\n// stableStringify\r\nexport const orderedStringify = (() => {\r\n // https://www.gangofcoders.net/solution/sort-object-properties-and-json-stringify/\r\n // see also: https://www.npmjs.com/package/json-stable-stringify\r\n return (\r\n obj: any,\r\n keyCompareFn?: (a: string, b: string) => number,\r\n replacer?: (this: any, key: string, value: any) => any,\r\n // replacer?: (number | string)[] | null,\r\n space?: string | number\r\n ) => {\r\n return JSON.stringify(sort(obj, keyCompareFn), replacer, space);\r\n };\r\n})();\r\n\r\n// structural comparison helper\r\nexport function jsonEquals<T>(obj1: T, obj2: T) {\r\n // contentEquals\r\n return orderedStringify(obj1) === orderedStringify(obj2);\r\n}\r\n\r\n/** structuredClone alternative */\r\nexport function jsonClone<T extends object>(obj: T): T {\r\n const type = typeof obj;\r\n if (type !== \"object\") {\r\n throw new Error(`Unsupported object type: ${type}`);\r\n }\r\n if (!obj) {\r\n return obj;\r\n }\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n// freeze\r\nexport const lock = Symbol(\"__lock\");\r\n\r\n// IFreezable\r\nexport type ILockable<T = any> = Readonly<T> & { [lock]?: (locked: boolean) => void };\r\n\r\n// deepFreeze/lock\r\nexport function toReadOnly<T extends object>(obj: T, throwOnSet: boolean = false): ILockable<T> {\r\n return toReadOnlyInternal(obj, throwOnSet);\r\n}\r\n\r\nfunction toReadOnlyInternal<T extends object>(obj: T, throwOnSet: boolean = false, lockTest?: () => boolean): ILockable<T> {\r\n if (typeof obj !== \"object\" || !obj) {\r\n return obj;\r\n }\r\n\r\n let locked = true;\r\n if (!lockTest) {\r\n lockTest = () => locked;\r\n }\r\n\r\n const result = new Proxy(obj, {\r\n get: (target, property, receiver) => {\r\n // property in target\r\n if (Reflect.has(target, property)) {\r\n // Reflect.get(target, property)\r\n return toReadOnlyInternal(target[property], throwOnSet, lockTest);\r\n }\r\n return undefined;\r\n },\r\n set: (target, property, value, receiver) => {\r\n if (lockTest()) {\r\n if (throwOnSet) {\r\n throw new Error(\"Cannot set the value of read-only property\"); // read-only object\r\n }\r\n // return false; // will throw a TypeError exception in strict mode\r\n return true;\r\n } else {\r\n // target[property] = value;\r\n return Reflect.set(target, property, value);\r\n }\r\n }\r\n });\r\n\r\n result[lock] = (l: boolean) => {\r\n locked = l;\r\n };\r\n return result as Readonly<T> & { [lock]: (locked: boolean) => void };\r\n}\r\n\r\nexport type DeepPropertyKey = PropertyKey[];\r\n\r\nexport interface DeepProxyHandler<T extends object> {\r\n // getPrototypeOf?(target: T): object | null;\r\n // setPrototypeOf?(target: T, v: any): boolean;\r\n // isExtensible?(target: T): boolean;\r\n // preventExtensions?(target: T): boolean;\r\n // getOwnPropertyDescriptor?(target: T, p: DeepPropertyKey): PropertyDescriptor | undefined;\r\n // has?(target: T, p: DeepPropertyKey): boolean;\r\n // get?(target: T, p: DeepPropertyKey, receiver: any): any;\r\n set?(target: T, p: DeepPropertyKey, value: any, receiver: any): boolean;\r\n\r\n deleteProperty?(target: T, p: DeepPropertyKey): boolean;\r\n\r\n // defineProperty?(target: T, p: DeepPropertyKey, attributes: PropertyDescriptor): boolean;\r\n // enumerate?(target: T): DeepPropertyKey[];\r\n // ownKeys?(target: T): DeepPropertyKey[];\r\n // apply?(target: T, thisArg: any, argArray?: any): any; // assign\r\n // construct?(target: T, argArray: any, newTarget?: any): object;\r\n}\r\n\r\nexport function createDeepProxy<T extends object>(target: T, handler: DeepProxyHandler<T>) {\r\n const proxyMap = new WeakMap();\r\n\r\n function makeHandler(path: DeepPropertyKey) {\r\n return {\r\n set(target: any, propertyKey: PropertyKey, value: any, receiver) {\r\n if (typeof value === \"object\") {\r\n value = proxify(value, [...path, propertyKey]);\r\n }\r\n target[propertyKey] = value;\r\n\r\n if (handler.set) {\r\n handler.set(target, [...path, propertyKey], value, receiver);\r\n }\r\n return true;\r\n },\r\n\r\n deleteProperty(target: any, propertyKey: PropertyKey) {\r\n if (Reflect.has(target, propertyKey)) {\r\n unproxy(target, propertyKey);\r\n let deleted = Reflect.deleteProperty(target, propertyKey);\r\n if (deleted && handler.deleteProperty) {\r\n handler.deleteProperty(target, [...path, propertyKey]);\r\n }\r\n return deleted;\r\n }\r\n return false;\r\n }\r\n };\r\n }\r\n\r\n function unproxy(obj: any, key: PropertyKey) {\r\n if (proxyMap.has(obj[key])) {\r\n // console.log('unproxy',key);\r\n obj[key] = proxyMap.get(obj[key]);\r\n proxyMap.delete(obj[key]);\r\n }\r\n\r\n for (let k of Object.keys(obj[key])) {\r\n if (typeof obj[key][k] === \"object\") {\r\n unproxy(obj[key], k);\r\n }\r\n }\r\n }\r\n\r\n function proxify(obj: any, path: DeepPropertyKey) {\r\n for (let key of Object.keys(obj)) {\r\n if (typeof obj[key] === \"object\") {\r\n obj[key] = proxify(obj[key], [...path, key]);\r\n }\r\n }\r\n let p = new Proxy(obj, makeHandler(path));\r\n proxyMap.set(p, obj);\r\n return p;\r\n }\r\n\r\n return proxify(target, []);\r\n}\r\n"],"names":["keysOf","obj","entry","name","caseInsensitive","nameStr","keys","key","k","satisfies","keyOf","nameOf","f","p","target","$keyMap","$nh","getPropertyPath","expr","getPropertyPathInternal","path","createProxy","combinePropertyPath","builder","nonObjectTypes","isNonObjectType","type","createConstructor","createInstance","args","getPrototypes","result","prototype","proxify","source","value","getEnumValue","enumType","defaultValue","getEnumValues","getEnumKeys","x","assignWith","dst","src","callback","v","update","props","propSet","set","copy","isPlainObject","proto","sort","noKeys","sortImpl","keyCompareFn","a","b","orderedKeys","container","orderedStringify","replacer","space","jsonEquals","obj1","obj2","jsonClone","lock","toReadOnly","throwOnSet","toReadOnlyInternal","lockTest","locked","property","receiver","l","createDeepProxy","handler","proxyMap","makeHandler","propertyKey","unproxy","deleted"],"mappings":"AAKO,SAASA,EAAyBC,GAAQ;AAC7C,SAAO,OAAO,KAAKA,CAAG;AAC1B;AAEO,SAASC,EAA8CD,GAAQE,GAAYC,IAAkB,IAAM;AACtG,MAAI,CAACH,KAAO,CAACE;AACT;AAGJ,MAAIE,IAAU,OAAOF,CAAI,EAAE,KAAA;AAC3B,QAAMG,IAAON,EAAOC,CAAG;AACvB,MAAIM;AACJ,SAAIH,KACAC,IAAUA,EAAQ,YAAA,GAClBE,IAAMD,EAAK,KAAK,CAACE,MAAM,OAAOA,CAAC,EAAE,YAAA,EAAc,KAAA,MAAWH,CAAO,KAEjEE,IAAMD,EAAK,KAAK,CAACE,MAAM,OAAOA,CAAC,EAAE,KAAA,MAAWH,CAAO,GAEhD,CAACE,GAAKA,KAAO,OAAY,SAAaN,EAAIM,CAAG,CAAa;AACrE;AAEO,SAASE,IAAoB;AAChC,SAAO,CAAmBR,MAAWA;AACzC;AAGO,MAAMS,IAAQ,CAAmDH,GAAWN,MAAYM;AAIxF,SAASI,EAAOC,GAA+B;AAClD,QAAMC,IAAI,IAAI;AAAA,IACV,CAAA;AAAA,IACA;AAAA,MACI,KAAK,CAACC,GAAQP,MAAQA;AAAA,IAAA;AAAA,EAC1B;AAEJ,SAAOK,EAAEC,CAAC;AACd;AAMO,SAASE,EAA0Bd,GAAS;AAC/C,SAAO,IAAI;AAAA,IACP,CAAA;AAAA,IACA;AAAA,MACI,KAAK,CAACa,GAAQP,MAAQA;AAAA,IAAA;AAAA,EAC1B;AAER;AASO,SAASS,EAAOf,GAAS;AAC5B,SAAO;AAAA,IACH,QAAQ,CAACW,MACED,EAAOC,CAAC;AAAA,EACnB;AAER;AAEO,SAASK,EAAmBC,GAAqB;AACpD,SAAOC,EAAwBD,CAAI;AACvC;AAEA,SAASC,EAA2BD,GAAqBE,GAAqC;AAC1F,EAAIA,KAAQ,SACRA,IAAO,CAAA;AAEX,MAAIC;AACJ,SAAAA,IAAc,MACH,IAAI;AAAA,IACP,CAAA;AAAA,IACA;AAAA,MACI,KAAK,CAACP,GAAQP,OACVa,EAAK,KAAKb,CAAG,GACNc,EAAA;AAAA,IACX;AAAA,EACJ,GAGRH,EAAKG,GAAa,GACXD;AACX;AAEO,SAASE,EAAoBF,GAAqC;AACrE,QAAMG,IAAoB,CAAA;AAC1B,aAAWhB,KAAOa;AACd,IAAAG,EAAQ,KAAK,KAAKhB,EAAI,SAAA,CAAU,IAAI;AAExC,SAAOgB,EAAQ,KAAK,EAAE;AAC1B;AAEA,MAAMC,IAAgC,CAAC,QAAQ,MAAM;AAGrD,SAASC,EAAkDC,GAAoB;AAC3E,SAAOF,EAAe,QAAQE,CAAI,KAAK;AAC3C;AAGO,SAASC,EACZD,GACiC;AACjC,MAAID,EAAgBC,CAAI;AACpB,WAAOA;AACJ;AACH,QAASE,IAAT,YAA2BC,GAA2E;AAElG,aAAO,IAAIH,EAAK,GAAGG,CAAI;AAAA,IAC3B;AAEA,WAAAD,EAAe,YAAYF,EAAK,WACzBE;AAAA,EACX;AACJ;AAEO,SAASE,EAAc7B,GAAU;AACpC,QAAM8B,IAAS,CAAA;AACf,MAAIC;AACJ,SACIA,IAAY,OAAO,eAAeA,KAAa/B,CAAG,GAC9C,EAAC+B;AAGL,IAAAD,EAAO,KAAKC,CAAS;AAEzB,SAAOD;AACX;AAEO,SAASE,EAA0BC,GAAoB;AAC1D,SAAO,IAAI;AAAA,IACP,CAAA;AAAA,IACA;AAAA,MACI,KAAK,CAACpB,GAAQP,MACH,QAAQ,IAAI2B,EAAA,GAAU3B,CAAG;AAAA,MAGpC,KAAK,CAACO,GAAQP,GAAK4B,MACR,QAAQ,IAAID,EAAA,GAAU3B,GAAK4B,CAAK;AAAA,IAG3C;AAAA,EACJ;AAER;AAEO,SAASC,EAAgBC,GAAalC,GAAcmC,GAAsC;AAC7F,MAAIH,IAAQhC,IAAOkC,EAASlC,CAAe,IAAImC;AAC/C,SAAIH,KAAS,SACTA,IAAQG,IAELH;AACX;AAEO,SAASI,EAAmDF,GAA0B;AACzF,SAAOG,EAAkBH,CAAQ,EAAE,IAAI,CAACI,MAAMJ,EAASI,CAAC,CAAC;AAC7D;AAEO,SAASD,EAAiDH,GAAuB;AACpF,SAAO,OAAO,KAAKA,CAAQ,EACtB,OAAO,CAACI,MAAM,OAAO,MAAM,OAAOA,CAAC,CAAC,CAAC,EACrC,IAAI,CAACA,MAAMA,CAAM;AAC1B;AAGO,SAASC,EACZC,GACAC,GACAC,GACc;AACd,QAAMd,IAAyBY;AAC/B,MAAIC;AACA,eAAWrC,KAAOqC,GAAK;AACnB,UAAIT,IAAQS,EAAIrC,CAAG;AAKnB,MAAIsC,KACAA,EAAStC,GAAK4B,GALN,CAACW,MAAkB;AAE3B,gBAAQ,IAAIf,GAAQxB,GAAKuC,CAAC;AAAA,MAC9B,CAE4B;AAAA,IAEhC;AAEJ,SAAOf;AACX;AAGO,SAASgB,EAA+CJ,GAAQC,GAAQI,GAAmC;AAC9G,QAAMC,IAAU,IAAI,IAAID,CAAK;AAE7B,SAAON,EAAWC,GAAKC,GAAK,CAACrC,GAAK4B,GAAOe,MAAQ;AAC7C,KAAI,CAACD,EAAQ,QAAQA,EAAQ,IAAI1C,CAAG,MAChC2C,EAAIf,CAAK;AAAA,EAEjB,CAAC;AAOL;AAEO,SAASgB,EAAyCP,GAAQD,GAAQK,GAAmC;AACxG,SAAOD,EAAOJ,GAAKC,GAAKI,CAAK;AACjC;AAEO,SAASI,EAAcjB,GAAO;AACnC,MAAI,OAAO,UAAU,SAAS,KAAKA,CAAK,MAAM,kBAAmB,QAAO;AACxE,QAAMkB,IAAQ,OAAO,eAAelB,CAAK;AACzC,SAAOkB,MAAU,QAAQA,MAAU,OAAO;AAC5C;AAEA,MAAMC,IAAQ,uBAAM;AAEhB,QAAMC,IAAS,CAAA;AACf,WAASC,EAASvD,GAAUwD,GAAiD;AACzE,UAAMnD,IAAOL,IAAM,OAAO,KAAKA,CAAG,IAAIsD;AAEtC,IAAIE,MAEAA,IAAe,CAACC,GAAGC,MAAMA,EAAE,cAAcD,CAAC;AAE9C,UAAME,IAActD,EAAK,KAAKmD,CAAY,GAEpCI,IAAY,CAAA;AAClB,eAAWtD,KAAOqD;AACd,MAAAC,EAAUtD,CAAG,IAAI6C,EAAcnD,EAAIM,CAAG,CAAC,IAAIiD,EAASvD,EAAIM,CAAG,CAAC,IAAIN,EAAIM,CAAG;AAE3E,WAAOsD;AAAA,EACX;AACA,SAAOL;AACX,GAAA,GAGaM,IAGF,CACH7D,GACAwD,GACAM,GAEAC,MAEO,KAAK,UAAUV,EAAKrD,GAAKwD,CAAY,GAAGM,GAAUC,CAAK;AAK/D,SAASC,EAAcC,GAASC,GAAS;AAE5C,SAAOL,EAAiBI,CAAI,MAAMJ,EAAiBK,CAAI;AAC3D;AAGO,SAASC,EAA4BnE,GAAW;AACnD,QAAMyB,IAAO,OAAOzB;AACpB,MAAIyB,MAAS;AACT,UAAM,IAAI,MAAM,4BAA4BA,CAAI,EAAE;AAEtD,SAAKzB,KAGE,KAAK,MAAM,KAAK,UAAUA,CAAG,CAAC;AACzC;AAGO,MAAMoE,IAAO,OAAO,QAAQ;AAM5B,SAASC,EAA6BrE,GAAQsE,IAAsB,IAAqB;AAC5F,SAAOC,EAAmBvE,GAAKsE,CAAU;AAC7C;AAEA,SAASC,EAAqCvE,GAAQsE,IAAsB,IAAOE,GAAwC;AACvH,MAAI,OAAOxE,KAAQ,YAAY,CAACA;AAC5B,WAAOA;AAGX,MAAIyE,IAAS;AACb,EAAKD,MACDA,IAAW,MAAMC;AAGrB,QAAM3C,IAAS,IAAI,MAAM9B,GAAK;AAAA,IAC1B,KAAK,CAACa,GAAQ6D,GAAUC,MAAa;AAEjC,UAAI,QAAQ,IAAI9D,GAAQ6D,CAAQ;AAE5B,eAAOH,EAAmB1D,EAAO6D,CAAQ,GAAGJ,GAAYE,CAAQ;AAAA,IAGxE;AAAA,IACA,KAAK,CAAC3D,GAAQ6D,GAAUxC,GAAOyC,MAAa;AACxC,UAAIH,KAAY;AACZ,YAAIF;AACA,gBAAM,IAAI,MAAM,4CAA4C;AAGhE,eAAO;AAAA,MACX;AAEI,eAAO,QAAQ,IAAIzD,GAAQ6D,GAAUxC,CAAK;AAAA,IAElD;AAAA,EAAA,CACH;AAED,SAAAJ,EAAOsC,CAAI,IAAI,CAACQ,MAAe;AAC3B,IAAAH,IAASG;AAAA,EACb,GACO9C;AACX;AAuBO,SAAS+C,EAAkChE,GAAWiE,GAA8B;AACvF,QAAMC,wBAAe,QAAA;AAErB,WAASC,EAAY7D,GAAuB;AACxC,WAAO;AAAA,MACH,IAAIN,GAAaoE,GAA0B/C,GAAYyC,GAAU;AAC7D,eAAI,OAAOzC,KAAU,aACjBA,IAAQF,EAAQE,GAAO,CAAC,GAAGf,GAAM8D,CAAW,CAAC,IAEjDpE,EAAOoE,CAAW,IAAI/C,GAElB4C,EAAQ,OACRA,EAAQ,IAAIjE,GAAQ,CAAC,GAAGM,GAAM8D,CAAW,GAAG/C,GAAOyC,CAAQ,GAExD;AAAA,MACX;AAAA,MAEA,eAAe9D,GAAaoE,GAA0B;AAClD,YAAI,QAAQ,IAAIpE,GAAQoE,CAAW,GAAG;AAClC,UAAAC,EAAQrE,GAAQoE,CAAW;AAC3B,cAAIE,IAAU,QAAQ,eAAetE,GAAQoE,CAAW;AACxD,iBAAIE,KAAWL,EAAQ,kBACnBA,EAAQ,eAAejE,GAAQ,CAAC,GAAGM,GAAM8D,CAAW,CAAC,GAElDE;AAAA,QACX;AACA,eAAO;AAAA,MACX;AAAA,IAAA;AAAA,EAER;AAEA,WAASD,EAAQlF,GAAUM,GAAkB;AACzC,IAAIyE,EAAS,IAAI/E,EAAIM,CAAG,CAAC,MAErBN,EAAIM,CAAG,IAAIyE,EAAS,IAAI/E,EAAIM,CAAG,CAAC,GAChCyE,EAAS,OAAO/E,EAAIM,CAAG,CAAC;AAG5B,aAASC,KAAK,OAAO,KAAKP,EAAIM,CAAG,CAAC;AAC9B,MAAI,OAAON,EAAIM,CAAG,EAAEC,CAAC,KAAM,YACvB2E,EAAQlF,EAAIM,CAAG,GAAGC,CAAC;AAAA,EAG/B;AAEA,WAASyB,EAAQhC,GAAUmB,GAAuB;AAC9C,aAASb,KAAO,OAAO,KAAKN,CAAG;AAC3B,MAAI,OAAOA,EAAIM,CAAG,KAAM,aACpBN,EAAIM,CAAG,IAAI0B,EAAQhC,EAAIM,CAAG,GAAG,CAAC,GAAGa,GAAMb,CAAG,CAAC;AAGnD,QAAIM,IAAI,IAAI,MAAMZ,GAAKgF,EAAY7D,CAAI,CAAC;AACxC,WAAA4D,EAAS,IAAInE,GAAGZ,CAAG,GACZY;AAAA,EACX;AAEA,SAAOoB,EAAQnB,GAAQ,EAAE;AAC7B;"}
|
|
1
|
+
{"version":3,"file":"typeUtils.es.js","sources":["../src/typeUtils.ts"],"sourcesContent":["import { CallableConstructor, Constructor, ConstructorClass } from \"./typeCore\";\r\n\r\n// @filename: typeUtils.ts\r\n\r\n// typed version of Object.keys\r\nexport function keysOf<T extends object>(obj: T) {\r\n return Object.keys(obj) as Array<keyof T>;\r\n}\r\n\r\nexport function entry<T extends object, TKey extends keyof T>(obj: T, name: TKey, caseInsensitive = true) {\r\n if (!obj || !name) {\r\n return undefined;\r\n }\r\n // name.toString()\r\n let nameStr = String(name).trim();\r\n const keys = keysOf(obj);\r\n let key: keyof T;\r\n if (caseInsensitive) {\r\n nameStr = nameStr.toLowerCase();\r\n key = keys.find((k) => String(k).toLowerCase().trim() === nameStr);\r\n } else {\r\n key = keys.find((k) => String(k).trim() === nameStr);\r\n }\r\n return [key, key == undefined ? undefined : (obj[key] as T[TKey])] as [TKey, T[TKey]];\r\n}\r\n\r\nexport function satisfies<TShape>() {\r\n return <T extends TShape>(obj: T) => obj;\r\n}\r\n\r\n// $keyOf\r\nexport const keyOf = <T extends object, TKey extends keyof T = keyof T>(key: TKey, obj?: T) => key;\r\n\r\n// $nameOf/$n\r\nexport function nameOf<T extends object>(f: (x: T) => T[keyof T]): keyof T;\r\nexport function nameOf(f: (x: any) => any): keyof any {\r\n const p = new Proxy(\r\n {},\r\n {\r\n get: (target, key) => key\r\n }\r\n );\r\n return f(p);\r\n}\r\n\r\ntype $KeyMap<T extends object> = {\r\n [K in keyof T]: K;\r\n};\r\n\r\nexport function $keyMap<T extends object>(obj?: T) {\r\n return new Proxy(\r\n {},\r\n {\r\n get: (target, key) => key\r\n }\r\n ) as $KeyMap<T>;\r\n}\r\n\r\n// $NU\r\ntype $NH<T> = {\r\n nameOf(f: (x: T) => T[keyof T]): keyof T;\r\n};\r\n\r\n// $nu\r\n// usage: $nh(obj).nameOf(x => x.prop) or $NH<ClassName>().nameOf(x => x.prop)\r\nexport function $nh<T>(obj?: T) {\r\n return {\r\n nameOf: (f: (x: any) => any) => {\r\n return nameOf(f);\r\n }\r\n } as $NH<T>;\r\n}\r\n\r\nexport function getPropertyPath<T>(expr: (x: T) => any) {\r\n return getPropertyPathInternal(expr);\r\n}\r\n\r\nfunction getPropertyPathInternal<T>(expr: (x: T) => any, path?: (string | number | symbol)[]) {\r\n if (path == undefined) {\r\n path = [];\r\n }\r\n let createProxy: () => any;\r\n createProxy = () => {\r\n return new Proxy(\r\n {},\r\n {\r\n get: (target, key) => {\r\n path.push(key);\r\n return createProxy();\r\n }\r\n }\r\n );\r\n };\r\n expr(createProxy());\r\n return path;\r\n}\r\n\r\nexport function combinePropertyPath(path?: (string | number | symbol)[]) {\r\n const builder: string[] = [];\r\n for (const key of path) {\r\n builder.push(`[\"${key.toString()}\"]`);\r\n }\r\n return builder.join(\"\");\r\n}\r\n\r\nconst nonObjectTypes: Constructor[] = [String, Number];\r\n\r\n// isNonObjectCtor\r\nfunction isNonObjectType<TConstructor extends Constructor>(type: TConstructor) {\r\n return nonObjectTypes.indexOf(type) >= 0;\r\n}\r\n\r\n// getConstructor\r\nexport function createConstructor<TConstructor extends Constructor>(\r\n type: TConstructor // ctor\r\n): CallableConstructor<TConstructor> {\r\n if (isNonObjectType(type)) {\r\n return type as CallableConstructor<TConstructor>;\r\n } else {\r\n function createInstance(...args: ConstructorParameters<TConstructor>): ConstructorClass<TConstructor> {\r\n // return Reflect.construct(type, args); // works too\r\n return new type(...args);\r\n }\r\n\r\n createInstance.prototype = type.prototype;\r\n return createInstance as CallableConstructor<TConstructor>;\r\n }\r\n}\r\n\r\nexport function getPrototypes(obj: any) {\r\n const result = [];\r\n let prototype;\r\n while (true) {\r\n prototype = Object.getPrototypeOf(prototype || obj);\r\n if (!prototype) {\r\n break;\r\n }\r\n result.push(prototype);\r\n }\r\n return result;\r\n}\r\n\r\nexport function proxify<T extends object>(source: () => T): T {\r\n return new Proxy(\r\n {},\r\n {\r\n get: (target, key) => {\r\n return Reflect.get(source(), key);\r\n // return source()[key];\r\n },\r\n set: (target, key, value) => {\r\n return Reflect.set(source(), key, value);\r\n // source()[key] = value;\r\n // return true;\r\n }\r\n }\r\n ) as T;\r\n}\r\n\r\nexport function getEnumValue<T>(enumType: T, name: string, defaultValue: T[keyof T]): T[keyof T] {\r\n let value = name ? enumType[name as keyof T] : defaultValue;\r\n if (value == undefined) {\r\n value = defaultValue;\r\n }\r\n return value;\r\n}\r\n\r\nexport function getEnumValues<T extends object, K extends keyof T>(enumType: T): Array<T[K]> {\r\n return getEnumKeys<T, K>(enumType).map((x) => enumType[x]);\r\n}\r\n\r\nexport function getEnumKeys<T extends object, K extends keyof T>(enumType: T): Array<K> {\r\n return Object.keys(enumType)\r\n .filter((x) => Number.isNaN(Number(x)))\r\n .map((x) => x as K);\r\n}\r\n\r\n// conditional assign with value factory\r\nexport function assignWith<T extends object, U extends object>(\r\n dst: T,\r\n src: U,\r\n callback?: (key: keyof U, value: U[keyof U], set: (value: U[keyof U]) => void) => any\r\n): T & Partial<U> {\r\n const result: T & Partial<U> = dst;\r\n if (src) {\r\n for (const key in src) {\r\n let value = src[key];\r\n const set = (v: U[keyof U]) => {\r\n // result[key as PropertyKey] = value;\r\n Reflect.set(result, key, v);\r\n };\r\n if (callback) {\r\n callback(key, value, set);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n// constrained and typed assign\r\nexport function update<T extends object, U extends Partial<T>>(dst: T, src: U, props?: [keyof U]): T & Partial<U> {\r\n const propSet = new Set(props);\r\n\r\n return assignWith(dst, src, (key, value, set) => {\r\n if (!propSet.size || propSet.has(key)) {\r\n set(value);\r\n }\r\n });\r\n\r\n // for (const prop of props) {\r\n // // dst[prop as PropertyKey] = src[prop];\r\n // Reflect.set(dst, prop, src[prop]);\r\n // }\r\n // return dst;\r\n}\r\n\r\nexport function copy<T extends object, U extends object>(src: T, dst: U, props?: [keyof T]): U & Partial<T> {\r\n return update(dst, src, props);\r\n}\r\n\r\nexport function isPlainObject(value) {\r\n if (Object.prototype.toString.call(value) !== '[object Object]') return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === null || proto === Object.prototype;\r\n}\r\n\r\nconst sort = (() => {\r\n // It relies on Chrome's and Node's behaviour that the first key assigned to an object is outputted first by JSON.stringify.\r\n const noKeys = []; // emptyKeys\r\n function sortImpl(obj: any, keyCompareFn?: (a: string, b: string) => number) {\r\n const keys = obj ? Object.keys(obj) : noKeys;\r\n // const orderedKeys = desc ? keys.orderByDesc(k => k) : keys.orderBy(k => k);\r\n if (keyCompareFn) {\r\n // array sort method without compare function produces ascending but alphabetical, lexicographic (dictionary) order\r\n keyCompareFn = (a, b) => b.localeCompare(a);\r\n }\r\n const orderedKeys = keys.sort(keyCompareFn);\r\n // result\r\n const container = {}; // sortedObj\r\n for (const key of orderedKeys) {\r\n container[key] = isPlainObject(obj[key]) ? sortImpl(obj[key]) : obj[key];\r\n }\r\n return container;\r\n }\r\n return sortImpl;\r\n})();\r\n\r\n// stableStringify\r\nexport const orderedStringify = (() => {\r\n // https://www.gangofcoders.net/solution/sort-object-properties-and-json-stringify/\r\n // see also: https://www.npmjs.com/package/json-stable-stringify\r\n return (\r\n obj: any,\r\n keyCompareFn?: (a: string, b: string) => number,\r\n replacer?: (this: any, key: string, value: any) => any,\r\n // replacer?: (number | string)[] | null,\r\n space?: string | number\r\n ) => {\r\n return JSON.stringify(sort(obj, keyCompareFn), replacer, space);\r\n };\r\n})();\r\n\r\n// structural comparison helper\r\nexport function jsonEquals<T>(obj1: T, obj2: T) {\r\n // contentEquals\r\n return orderedStringify(obj1) === orderedStringify(obj2);\r\n}\r\n\r\n/** structuredClone alternative */\r\nexport function jsonClone<T extends object>(obj: T): T {\r\n const type = typeof obj;\r\n if (type !== \"object\") {\r\n throw new Error(`Unsupported object type: ${type}`);\r\n }\r\n if (!obj) {\r\n return obj;\r\n }\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n// freeze\r\nexport const lock = Symbol(\"__lock\");\r\n\r\n// IFreezable\r\nexport type ILockable<T = any> = Readonly<T> & { [lock]?: (locked: boolean) => void };\r\n\r\n// deepFreeze/lock\r\nexport function toReadOnly<T extends object>(obj: T, throwOnSet: boolean = false): ILockable<T> {\r\n return toReadOnlyInternal(obj, throwOnSet);\r\n}\r\n\r\nfunction toReadOnlyInternal<T extends object>(obj: T, throwOnSet: boolean = false, lockTest?: () => boolean): ILockable<T> {\r\n if (typeof obj !== \"object\" || !obj) {\r\n return obj;\r\n }\r\n\r\n let locked = true;\r\n if (!lockTest) {\r\n lockTest = () => locked;\r\n }\r\n\r\n const result = new Proxy(obj, {\r\n get: (target, property, receiver) => {\r\n // property in target\r\n if (Reflect.has(target, property)) {\r\n // Reflect.get(target, property)\r\n return toReadOnlyInternal(target[property], throwOnSet, lockTest);\r\n }\r\n return undefined;\r\n },\r\n set: (target, property, value, receiver) => {\r\n if (lockTest()) {\r\n if (throwOnSet) {\r\n throw new Error(\"Cannot set the value of read-only property\"); // read-only object\r\n }\r\n // return false; // will throw a TypeError exception in strict mode\r\n return true;\r\n } else {\r\n // target[property] = value;\r\n return Reflect.set(target, property, value);\r\n }\r\n }\r\n });\r\n\r\n result[lock] = (l: boolean) => {\r\n locked = l;\r\n };\r\n return result as Readonly<T> & { [lock]: (locked: boolean) => void };\r\n}\r\n\r\nexport type DeepPropertyKey = PropertyKey[];\r\n\r\nexport interface DeepProxyHandler<T extends object> {\r\n // getPrototypeOf?(target: T): object | null;\r\n // setPrototypeOf?(target: T, v: any): boolean;\r\n // isExtensible?(target: T): boolean;\r\n // preventExtensions?(target: T): boolean;\r\n // getOwnPropertyDescriptor?(target: T, p: DeepPropertyKey): PropertyDescriptor | undefined;\r\n // has?(target: T, p: DeepPropertyKey): boolean;\r\n // get?(target: T, p: DeepPropertyKey, receiver: any): any;\r\n set?(target: T, p: DeepPropertyKey, value: any, receiver: any): boolean;\r\n\r\n deleteProperty?(target: T, p: DeepPropertyKey): boolean;\r\n\r\n // defineProperty?(target: T, p: DeepPropertyKey, attributes: PropertyDescriptor): boolean;\r\n // enumerate?(target: T): DeepPropertyKey[];\r\n // ownKeys?(target: T): DeepPropertyKey[];\r\n // apply?(target: T, thisArg: any, argArray?: any): any; // assign\r\n // construct?(target: T, argArray: any, newTarget?: any): object;\r\n}\r\n\r\nexport function createDeepProxy<T extends object>(target: T, handler: DeepProxyHandler<T>) {\r\n const proxyMap = new WeakMap();\r\n\r\n function makeHandler(path: DeepPropertyKey) {\r\n return {\r\n set(target: any, propertyKey: PropertyKey, value: any, receiver) {\r\n if (typeof value === \"object\") {\r\n value = proxify(value, [...path, propertyKey]);\r\n }\r\n target[propertyKey] = value;\r\n\r\n if (handler.set) {\r\n handler.set(target, [...path, propertyKey], value, receiver);\r\n }\r\n return true;\r\n },\r\n\r\n deleteProperty(target: any, propertyKey: PropertyKey) {\r\n if (Reflect.has(target, propertyKey)) {\r\n unproxy(target, propertyKey);\r\n let deleted = Reflect.deleteProperty(target, propertyKey);\r\n if (deleted && handler.deleteProperty) {\r\n handler.deleteProperty(target, [...path, propertyKey]);\r\n }\r\n return deleted;\r\n }\r\n return false;\r\n }\r\n };\r\n }\r\n\r\n function unproxy(obj: any, key: PropertyKey) {\r\n if (proxyMap.has(obj[key])) {\r\n // console.log('unproxy',key);\r\n obj[key] = proxyMap.get(obj[key]);\r\n proxyMap.delete(obj[key]);\r\n }\r\n\r\n for (let k of Object.keys(obj[key])) {\r\n if (typeof obj[key][k] === \"object\") {\r\n unproxy(obj[key], k);\r\n }\r\n }\r\n }\r\n\r\n function proxify(obj: any, path: DeepPropertyKey) {\r\n for (let key of Object.keys(obj)) {\r\n if (typeof obj[key] === \"object\") {\r\n obj[key] = proxify(obj[key], [...path, key]);\r\n }\r\n }\r\n let p = new Proxy(obj, makeHandler(path));\r\n proxyMap.set(p, obj);\r\n return p;\r\n }\r\n\r\n return proxify(target, []);\r\n}\r\n"],"names":["keysOf","obj","entry","name","caseInsensitive","nameStr","keys","key","k","satisfies","keyOf","nameOf","f","p","target","$keyMap","$nh","getPropertyPath","expr","getPropertyPathInternal","path","createProxy","combinePropertyPath","builder","nonObjectTypes","isNonObjectType","type","createConstructor","createInstance","args","getPrototypes","result","prototype","proxify","source","value","getEnumValue","enumType","defaultValue","getEnumValues","getEnumKeys","x","assignWith","dst","src","callback","v","update","props","propSet","set","copy","isPlainObject","proto","sort","noKeys","sortImpl","keyCompareFn","a","b","orderedKeys","container","orderedStringify","replacer","space","jsonEquals","obj1","obj2","jsonClone","lock","toReadOnly","throwOnSet","toReadOnlyInternal","lockTest","locked","property","receiver","l","createDeepProxy","handler","proxyMap","makeHandler","propertyKey","unproxy","deleted"],"mappings":"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"}
|