yummies 7.19.3 → 7.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/assert.cjs +1 -1
  2. package/assert.cjs.map +1 -1
  3. package/assert.js +1 -1
  4. package/assert.js.map +1 -1
  5. package/async.cjs +147 -137
  6. package/async.cjs.map +1 -1
  7. package/async.d.ts +98 -131
  8. package/async.js +147 -137
  9. package/async.js.map +1 -1
  10. package/common.cjs +3 -1
  11. package/common.cjs.map +1 -1
  12. package/common.d.ts +18 -24
  13. package/common.js +3 -1
  14. package/common.js.map +1 -1
  15. package/complex.cjs +1 -0
  16. package/complex.cjs.map +1 -1
  17. package/complex.js +1 -0
  18. package/complex.js.map +1 -1
  19. package/cookie.cjs +1 -1
  20. package/cookie.cjs.map +1 -1
  21. package/cookie.d.ts +0 -18
  22. package/cookie.js +1 -1
  23. package/cookie.js.map +1 -1
  24. package/css-cx.cjs +78 -0
  25. package/css-cx.cjs.map +1 -0
  26. package/css-cx.d.ts +69 -0
  27. package/css-cx.js +74 -0
  28. package/css-cx.js.map +1 -0
  29. package/css.cjs +32 -111
  30. package/css.cjs.map +1 -1
  31. package/css.d.ts +32 -42
  32. package/css.js +30 -107
  33. package/css.js.map +1 -1
  34. package/data.cjs +60 -50
  35. package/data.cjs.map +1 -1
  36. package/data.d.ts +21 -34
  37. package/data.js +60 -50
  38. package/data.js.map +1 -1
  39. package/date-time.cjs +104 -98
  40. package/date-time.cjs.map +1 -1
  41. package/date-time.d.ts +51 -57
  42. package/date-time.js +104 -97
  43. package/date-time.js.map +1 -1
  44. package/device.cjs +14 -19
  45. package/device.cjs.map +1 -1
  46. package/device.d.ts +15 -26
  47. package/device.js +14 -19
  48. package/device.js.map +1 -1
  49. package/encodings.cjs +1 -1
  50. package/encodings.cjs.map +1 -1
  51. package/encodings.d.ts +0 -17
  52. package/encodings.js +1 -1
  53. package/encodings.js.map +1 -1
  54. package/errors.cjs +1 -18
  55. package/errors.cjs.map +1 -1
  56. package/errors.d.ts +0 -17
  57. package/errors.js +1 -17
  58. package/errors.js.map +1 -1
  59. package/file.cjs +3 -17
  60. package/file.cjs.map +1 -1
  61. package/file.d.ts +1 -16
  62. package/file.js +3 -17
  63. package/file.js.map +1 -1
  64. package/format.cjs +1 -1
  65. package/format.cjs.map +1 -1
  66. package/format.js +1 -1
  67. package/format.js.map +1 -1
  68. package/html.cjs +113 -173
  69. package/html.cjs.map +1 -1
  70. package/html.d.ts +68 -58
  71. package/html.js +112 -170
  72. package/html.js.map +1 -1
  73. package/id-nanoid.cjs +36 -0
  74. package/id-nanoid.cjs.map +1 -0
  75. package/id-nanoid.d.ts +26 -0
  76. package/id-nanoid.js +32 -0
  77. package/id-nanoid.js.map +1 -0
  78. package/id.cjs +10 -45
  79. package/id.cjs.map +1 -1
  80. package/id.d.ts +27 -36
  81. package/id.js +6 -40
  82. package/id.js.map +1 -1
  83. package/imports.cjs +3 -18
  84. package/imports.cjs.map +1 -1
  85. package/imports.d.ts +1 -16
  86. package/imports.js +3 -17
  87. package/imports.js.map +1 -1
  88. package/math.cjs +16 -12
  89. package/math.cjs.map +1 -1
  90. package/math.d.ts +9 -24
  91. package/math.js +16 -12
  92. package/math.js.map +1 -1
  93. package/media.cjs +88 -89
  94. package/media.cjs.map +1 -1
  95. package/media.d.ts +72 -80
  96. package/media.js +88 -88
  97. package/media.js.map +1 -1
  98. package/mobx.cjs +0 -1
  99. package/mobx.cjs.map +1 -1
  100. package/mobx.js.map +1 -1
  101. package/ms.cjs +3 -17
  102. package/ms.cjs.map +1 -1
  103. package/ms.d.ts +1 -16
  104. package/ms.js +3 -17
  105. package/ms.js.map +1 -1
  106. package/number.cjs +1 -17
  107. package/number.cjs.map +1 -1
  108. package/number.d.ts +0 -16
  109. package/number.js +1 -17
  110. package/number.js.map +1 -1
  111. package/package.json +6 -6
  112. package/parser.cjs +1 -1
  113. package/parser.cjs.map +1 -1
  114. package/parser.js +1 -1
  115. package/parser.js.map +1 -1
  116. package/price.cjs +1 -1
  117. package/price.cjs.map +1 -1
  118. package/price.d.ts +0 -16
  119. package/price.js +1 -1
  120. package/price.js.map +1 -1
  121. package/random.cjs +37 -39
  122. package/random.cjs.map +1 -1
  123. package/random.d.ts +31 -40
  124. package/random.js +37 -39
  125. package/random.js.map +1 -1
  126. package/react.cjs +0 -1
  127. package/react.cjs.map +1 -1
  128. package/react.js.map +1 -1
  129. package/sanitize-html.cjs +82 -0
  130. package/sanitize-html.cjs.map +1 -0
  131. package/sanitize-html.d.ts +28 -0
  132. package/sanitize-html.js +79 -0
  133. package/sanitize-html.js.map +1 -0
  134. package/sound.cjs +1 -17
  135. package/sound.cjs.map +1 -1
  136. package/sound.d.ts +0 -16
  137. package/sound.js +1 -17
  138. package/sound.js.map +1 -1
  139. package/storage.cjs +7 -5
  140. package/storage.cjs.map +1 -1
  141. package/storage.d.ts +3 -17
  142. package/storage.js +7 -5
  143. package/storage.js.map +1 -1
  144. package/text.cjs +3 -17
  145. package/text.cjs.map +1 -1
  146. package/text.d.ts +1 -16
  147. package/text.js +3 -17
  148. package/text.js.map +1 -1
  149. package/type-guard.cjs +38 -1
  150. package/type-guard.cjs.map +1 -1
  151. package/type-guard.d.ts +38 -0
  152. package/type-guard.js +38 -1
  153. package/type-guard.js.map +1 -1
  154. package/types.d.ts +10 -1
  155. package/types.global.d.ts +9 -0
  156. package/vibrate.cjs +1 -17
  157. package/vibrate.cjs.map +1 -1
  158. package/vibrate.d.ts +0 -16
  159. package/vibrate.js +1 -17
  160. package/vibrate.js.map +1 -1
  161. /package/{chunk-pbuEa-1d.js → chunk-D7D4PA-g.js} +0 -0
  162. /package/{chunk-CZWwpsFl.cjs → chunk-DakpK96I.cjs} +0 -0
package/sound.cjs CHANGED
@@ -1,21 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/sound.ts
3
- /**
4
- * ---header-docs-section---
5
- * # yummies/sound
6
- *
7
- * ## Description
8
- *
9
- * One-shot HTMLAudio playback for short UI sounds (clicks, success chimes) with volume control.
10
- * The helper creates a temporary `Audio` element, awaits `play()`, then drops references so callers
11
- * do not leak nodes. Autoplay policies may still block sound until a user gesture on some browsers.
12
- *
13
- * ## Usage
14
- *
15
- * ```ts
16
- * import { playSound } from "yummies/sound";
17
- * ```
18
- */
2
+ //#region src/sound/play-sound.ts
19
3
  /**
20
4
  * Plays a sound from a file.
21
5
  */
package/sound.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sound.cjs","names":[],"sources":["../src/sound.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/sound\n *\n * ## Description\n *\n * One-shot HTMLAudio playback for short UI sounds (clicks, success chimes) with volume control.\n * The helper creates a temporary `Audio` element, awaits `play()`, then drops references so callers\n * do not leak nodes. Autoplay policies may still block sound until a user gesture on some browsers.\n *\n * ## Usage\n *\n * ```ts\n * import { playSound } from \"yummies/sound\";\n * ```\n */\n\n/**\n * Plays a sound from a file.\n */\nexport const playSound = async (\n file: string,\n { volume = 1 }: { volume?: number } = {},\n) => {\n let audio = new Audio(file);\n audio.volume = volume;\n audio.muted = !volume;\n await audio.play();\n audio.remove();\n // @ts-expect-error\n audio = null;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoBA,IAAa,YAAY,OACvB,MACA,EAAE,SAAS,MAA2B,EAAE,KACrC;CACH,IAAI,QAAQ,IAAI,MAAM,KAAK;AAC3B,OAAM,SAAS;AACf,OAAM,QAAQ,CAAC;AACf,OAAM,MAAM,MAAM;AAClB,OAAM,QAAQ;AAEd,SAAQ"}
1
+ {"version":3,"file":"sound.cjs","names":[],"sources":["../src/sound/play-sound.ts"],"sourcesContent":["/**\n * Plays a sound from a file.\n */\nexport const playSound = async (\n file: string,\n { volume = 1 }: { volume?: number } = {},\n) => {\n let audio = new Audio(file);\n audio.volume = volume;\n audio.muted = !volume;\n await audio.play();\n audio.remove();\n // @ts-expect-error\n audio = null;\n};\n"],"mappings":";;;;;AAGA,IAAa,YAAY,OACvB,MACA,EAAE,SAAS,MAA2B,CAAC,MACpC;CACH,IAAI,QAAQ,IAAI,MAAM,IAAI;CAC1B,MAAM,SAAS;CACf,MAAM,QAAQ,CAAC;CACf,MAAM,MAAM,KAAK;CACjB,MAAM,OAAO;CAEb,QAAQ;AACV"}
package/sound.d.ts CHANGED
@@ -1,19 +1,3 @@
1
- /**
2
- * ---header-docs-section---
3
- * # yummies/sound
4
- *
5
- * ## Description
6
- *
7
- * One-shot HTMLAudio playback for short UI sounds (clicks, success chimes) with volume control.
8
- * The helper creates a temporary `Audio` element, awaits `play()`, then drops references so callers
9
- * do not leak nodes. Autoplay policies may still block sound until a user gesture on some browsers.
10
- *
11
- * ## Usage
12
- *
13
- * ```ts
14
- * import { playSound } from "yummies/sound";
15
- * ```
16
- */
17
1
  /**
18
2
  * Plays a sound from a file.
19
3
  */
package/sound.js CHANGED
@@ -1,20 +1,4 @@
1
- //#region src/sound.ts
2
- /**
3
- * ---header-docs-section---
4
- * # yummies/sound
5
- *
6
- * ## Description
7
- *
8
- * One-shot HTMLAudio playback for short UI sounds (clicks, success chimes) with volume control.
9
- * The helper creates a temporary `Audio` element, awaits `play()`, then drops references so callers
10
- * do not leak nodes. Autoplay policies may still block sound until a user gesture on some browsers.
11
- *
12
- * ## Usage
13
- *
14
- * ```ts
15
- * import { playSound } from "yummies/sound";
16
- * ```
17
- */
1
+ //#region src/sound/play-sound.ts
18
2
  /**
19
3
  * Plays a sound from a file.
20
4
  */
package/sound.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sound.js","names":[],"sources":["../src/sound.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/sound\n *\n * ## Description\n *\n * One-shot HTMLAudio playback for short UI sounds (clicks, success chimes) with volume control.\n * The helper creates a temporary `Audio` element, awaits `play()`, then drops references so callers\n * do not leak nodes. Autoplay policies may still block sound until a user gesture on some browsers.\n *\n * ## Usage\n *\n * ```ts\n * import { playSound } from \"yummies/sound\";\n * ```\n */\n\n/**\n * Plays a sound from a file.\n */\nexport const playSound = async (\n file: string,\n { volume = 1 }: { volume?: number } = {},\n) => {\n let audio = new Audio(file);\n audio.volume = volume;\n audio.muted = !volume;\n await audio.play();\n audio.remove();\n // @ts-expect-error\n audio = null;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoBA,IAAa,YAAY,OACvB,MACA,EAAE,SAAS,MAA2B,EAAE,KACrC;CACH,IAAI,QAAQ,IAAI,MAAM,KAAK;AAC3B,OAAM,SAAS;AACf,OAAM,QAAQ,CAAC;AACf,OAAM,MAAM,MAAM;AAClB,OAAM,QAAQ;AAEd,SAAQ"}
1
+ {"version":3,"file":"sound.js","names":[],"sources":["../src/sound/play-sound.ts"],"sourcesContent":["/**\n * Plays a sound from a file.\n */\nexport const playSound = async (\n file: string,\n { volume = 1 }: { volume?: number } = {},\n) => {\n let audio = new Audio(file);\n audio.volume = volume;\n audio.muted = !volume;\n await audio.play();\n audio.remove();\n // @ts-expect-error\n audio = null;\n};\n"],"mappings":";;;;AAGA,IAAa,YAAY,OACvB,MACA,EAAE,SAAS,MAA2B,CAAC,MACpC;CACH,IAAI,QAAQ,IAAI,MAAM,IAAI;CAC1B,MAAM,SAAS;CACf,MAAM,QAAQ,CAAC;CACf,MAAM,MAAM,KAAK;CACjB,MAAM,OAAO;CAEb,QAAQ;AACV"}
package/storage.cjs CHANGED
@@ -1,9 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/storage.ts
3
- var storages = {
4
- session: sessionStorage,
5
- local: localStorage
6
- };
2
+ //#region src/storage/create-key.ts
7
3
  /**
8
4
  * Builds a storage key from a prefix, optional namespace and key.
9
5
  *
@@ -13,6 +9,12 @@ var storages = {
13
9
  * ```
14
10
  */
15
11
  var createKey = (prefix, key, namespace) => `${prefix}${namespace ? `/${namespace}` : ""}/${key}`;
12
+ //#endregion
13
+ //#region src/storage/create-storage.ts
14
+ var storages = {
15
+ session: sessionStorage,
16
+ local: localStorage
17
+ };
16
18
  var parseStorageValue = (value) => {
17
19
  if (typeof value !== "string") return value;
18
20
  try {
package/storage.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"storage.cjs","names":[],"sources":["../src/storage.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/storage\n *\n * ## Description\n *\n * Typed helpers around **`sessionStorage`** and **`localStorage`**: key namespacing, JSON parse\n * safety, and small wrappers that avoid repeating `try/catch` around `getItem`/`setItem`. Use it when\n * you need durable client state with predictable serialization, not a full offline database.\n *\n * ## Usage\n *\n * ```ts\n * import { createKey } from \"yummies/storage\";\n * ```\n */\n\nexport type StorageType = 'session' | 'local';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\n/**\n * Builds a storage key from a prefix, optional namespace and key.\n *\n * @example\n * ```ts\n * createKey('app', 'token', 'auth'); // 'app/auth/token'\n * ```\n */\nexport const createKey = (prefix: string, key: string, namespace?: string) =>\n `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface UnsetFromStorageConfig\n extends Omit<GetFromStorageConfig<any>, 'fallback'> {}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Storage key used to retrieve the value.\n * The full key is extended with the project namespace.\n */\n key: string;\n /**\n * Storage type.\n */\n type: StorageType;\n /**\n * Default value used when there is no value in storage.\n */\n fallback?: V;\n /**\n * Optional namespace segment used in the generated key.\n */\n namespace?: string;\n /**\n * Optional key prefix.\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type UnsetFromStorageWrappedConfig<\n BaseConfig extends StorageConfigBase,\n> = Omit<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n> &\n Partial<\n Pick<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof UnsetFromStorageConfig>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n unset(config: UnsetFromStorageWrappedConfig<BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Creates an interface for working with storage (`localStorage`, `sessionStorage`).\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n unset: <Value>(cfg: UnsetFromStorageWrappedConfig<BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n const storage = storages[storageType];\n\n storage.removeItem(\n createKey(storagePrefix, config.key, config.namespace),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"mappings":";;AAmBA,IAAM,WAAyC;CAC7C,SAAS;CACT,OAAO;CACR;;;;;;;;;AAUD,IAAa,aAAa,QAAgB,KAAa,cACrD,GAAG,SAAS,YAAY,IAAI,cAAc,GAAG,GAAG;AAElD,IAAM,qBAAwB,UAA6B;AACzD,KAAI,OAAO,UAAU,SACnB,QAAO;AAGT,KAAI;AAEF,SADe,KAAK,MAAM,MAAM;SAE1B;AACN,SAAO;;;AAIX,IAAM,wBAAwB,UAA2B;AACvD,QAAO,KAAK,UAAU,MAAM;;;;;AA8F9B,SAAgB,cACd,eACwB;AACxB,QAAO;EACL,MAAa,QAAsD;GACjE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtC,YAAS,aAEjB,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,UAAU,EACtD,qBAAqB,OAAO,MAAM,CACnC;;EAEH,QAAe,QAAmD;GAChE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;AACtC,YAAS,aAEjB,WACN,UAAU,eAAe,OAAO,KAAK,OAAO,UAAU,CACvD;;EAEH,MAAa,QAAwD;GACnE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAEtD,MAAM,UAAU,SAAS;AAEzB,UACE,kBACE,QAAQ,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,UAAU,CACvD,CACF,IACD,OAAO,YACP;;EAGL"}
1
+ {"version":3,"file":"storage.cjs","names":[],"sources":["../src/storage/create-key.ts","../src/storage/create-storage.ts"],"sourcesContent":["/**\n * Builds a storage key from a prefix, optional namespace and key.\n *\n * @example\n * ```ts\n * createKey('app', 'token', 'auth'); // 'app/auth/token'\n * ```\n */\nexport const createKey = (prefix: string, key: string, namespace?: string) =>\n `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n","import { createKey } from './create-key.js';\nimport type { StorageType } from './storage-type.js';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface UnsetFromStorageConfig\n extends Omit<GetFromStorageConfig<any>, 'fallback'> {}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Storage key used to retrieve the value.\n * The full key is extended with the project namespace.\n */\n key: string;\n /**\n * Storage type.\n */\n type: StorageType;\n /**\n * Default value used when there is no value in storage.\n */\n fallback?: V;\n /**\n * Optional namespace segment used in the generated key.\n */\n namespace?: string;\n /**\n * Optional key prefix.\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type UnsetFromStorageWrappedConfig<\n BaseConfig extends StorageConfigBase,\n> = Omit<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n> &\n Partial<\n Pick<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof UnsetFromStorageConfig>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n unset(config: UnsetFromStorageWrappedConfig<BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Creates an interface for working with storage (`localStorage`, `sessionStorage`).\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n unset: <Value>(cfg: UnsetFromStorageWrappedConfig<BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n const storage = storages[storageType];\n\n storage.removeItem(\n createKey(storagePrefix, config.key, config.namespace),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"mappings":";;;;;;;;;;AAQA,IAAa,aAAa,QAAgB,KAAa,cACrD,GAAG,SAAS,YAAY,IAAI,cAAc,GAAG,GAAG;;;ACNlD,IAAM,WAAyC;CAC7C,SAAS;CACT,OAAO;AACT;AAEA,IAAM,qBAAwB,UAA6B;CACzD,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,IAAI;EAEF,OADe,KAAK,MAAM,KACnB;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,IAAM,wBAAwB,UAA2B;CACvD,OAAO,KAAK,UAAU,KAAK;AAC7B;;;;AA6FA,SAAgB,cACd,eACwB;CACxB,OAAO;EACL,MAAa,QAAsD;GACjE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAItD,SAFyB,aAEjB,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS,GACrD,qBAAqB,OAAO,KAAK,CACnC;EACF;EACA,QAAe,QAAmD;GAChE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAGtD,SAFyB,aAEjB,WACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS,CACvD;EACF;EACA,MAAa,QAAwD;GACnE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAEtD,MAAM,UAAU,SAAS;GAEzB,OACE,kBACE,QAAQ,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS,CACvD,CACF,KACA,OAAO,YACP;EAEJ;CACF;AACF"}
package/storage.d.ts CHANGED
@@ -1,20 +1,3 @@
1
- /**
2
- * ---header-docs-section---
3
- * # yummies/storage
4
- *
5
- * ## Description
6
- *
7
- * Typed helpers around **`sessionStorage`** and **`localStorage`**: key namespacing, JSON parse
8
- * safety, and small wrappers that avoid repeating `try/catch` around `getItem`/`setItem`. Use it when
9
- * you need durable client state with predictable serialization, not a full offline database.
10
- *
11
- * ## Usage
12
- *
13
- * ```ts
14
- * import { createKey } from "yummies/storage";
15
- * ```
16
- */
17
- type StorageType = 'session' | 'local';
18
1
  /**
19
2
  * Builds a storage key from a prefix, optional namespace and key.
20
3
  *
@@ -24,6 +7,9 @@ type StorageType = 'session' | 'local';
24
7
  * ```
25
8
  */
26
9
  declare const createKey: (prefix: string, key: string, namespace?: string) => string;
10
+
11
+ type StorageType = 'session' | 'local';
12
+
27
13
  interface SetToStorageConfig<V> extends Omit<GetFromStorageConfig<V>, 'fallback'> {
28
14
  value: V;
29
15
  }
package/storage.js CHANGED
@@ -1,8 +1,4 @@
1
- //#region src/storage.ts
2
- var storages = {
3
- session: sessionStorage,
4
- local: localStorage
5
- };
1
+ //#region src/storage/create-key.ts
6
2
  /**
7
3
  * Builds a storage key from a prefix, optional namespace and key.
8
4
  *
@@ -12,6 +8,12 @@ var storages = {
12
8
  * ```
13
9
  */
14
10
  var createKey = (prefix, key, namespace) => `${prefix}${namespace ? `/${namespace}` : ""}/${key}`;
11
+ //#endregion
12
+ //#region src/storage/create-storage.ts
13
+ var storages = {
14
+ session: sessionStorage,
15
+ local: localStorage
16
+ };
15
17
  var parseStorageValue = (value) => {
16
18
  if (typeof value !== "string") return value;
17
19
  try {
package/storage.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","names":[],"sources":["../src/storage.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/storage\n *\n * ## Description\n *\n * Typed helpers around **`sessionStorage`** and **`localStorage`**: key namespacing, JSON parse\n * safety, and small wrappers that avoid repeating `try/catch` around `getItem`/`setItem`. Use it when\n * you need durable client state with predictable serialization, not a full offline database.\n *\n * ## Usage\n *\n * ```ts\n * import { createKey } from \"yummies/storage\";\n * ```\n */\n\nexport type StorageType = 'session' | 'local';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\n/**\n * Builds a storage key from a prefix, optional namespace and key.\n *\n * @example\n * ```ts\n * createKey('app', 'token', 'auth'); // 'app/auth/token'\n * ```\n */\nexport const createKey = (prefix: string, key: string, namespace?: string) =>\n `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface UnsetFromStorageConfig\n extends Omit<GetFromStorageConfig<any>, 'fallback'> {}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Storage key used to retrieve the value.\n * The full key is extended with the project namespace.\n */\n key: string;\n /**\n * Storage type.\n */\n type: StorageType;\n /**\n * Default value used when there is no value in storage.\n */\n fallback?: V;\n /**\n * Optional namespace segment used in the generated key.\n */\n namespace?: string;\n /**\n * Optional key prefix.\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type UnsetFromStorageWrappedConfig<\n BaseConfig extends StorageConfigBase,\n> = Omit<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n> &\n Partial<\n Pick<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof UnsetFromStorageConfig>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n unset(config: UnsetFromStorageWrappedConfig<BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Creates an interface for working with storage (`localStorage`, `sessionStorage`).\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n unset: <Value>(cfg: UnsetFromStorageWrappedConfig<BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n const storage = storages[storageType];\n\n storage.removeItem(\n createKey(storagePrefix, config.key, config.namespace),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"mappings":";AAmBA,IAAM,WAAyC;CAC7C,SAAS;CACT,OAAO;CACR;;;;;;;;;AAUD,IAAa,aAAa,QAAgB,KAAa,cACrD,GAAG,SAAS,YAAY,IAAI,cAAc,GAAG,GAAG;AAElD,IAAM,qBAAwB,UAA6B;AACzD,KAAI,OAAO,UAAU,SACnB,QAAO;AAGT,KAAI;AAEF,SADe,KAAK,MAAM,MAAM;SAE1B;AACN,SAAO;;;AAIX,IAAM,wBAAwB,UAA2B;AACvD,QAAO,KAAK,UAAU,MAAM;;;;;AA8F9B,SAAgB,cACd,eACwB;AACxB,QAAO;EACL,MAAa,QAAsD;GACjE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;AAEtC,YAAS,aAEjB,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,UAAU,EACtD,qBAAqB,OAAO,MAAM,CACnC;;EAEH,QAAe,QAAmD;GAChE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;AACtC,YAAS,aAEjB,WACN,UAAU,eAAe,OAAO,KAAK,OAAO,UAAU,CACvD;;EAEH,MAAa,QAAwD;GACnE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAEtD,MAAM,UAAU,SAAS;AAEzB,UACE,kBACE,QAAQ,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,UAAU,CACvD,CACF,IACD,OAAO,YACP;;EAGL"}
1
+ {"version":3,"file":"storage.js","names":[],"sources":["../src/storage/create-key.ts","../src/storage/create-storage.ts"],"sourcesContent":["/**\n * Builds a storage key from a prefix, optional namespace and key.\n *\n * @example\n * ```ts\n * createKey('app', 'token', 'auth'); // 'app/auth/token'\n * ```\n */\nexport const createKey = (prefix: string, key: string, namespace?: string) =>\n `${prefix}${namespace ? `/${namespace}` : ''}/${key}`;\n","import { createKey } from './create-key.js';\nimport type { StorageType } from './storage-type.js';\n\nconst storages: Record<StorageType, Storage> = {\n session: sessionStorage,\n local: localStorage,\n};\n\nconst parseStorageValue = <V>(value: unknown): V | null => {\n if (typeof value !== 'string') {\n return value as V;\n }\n\n try {\n const parsed = JSON.parse(value);\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst formatValueToStorage = (value: unknown): string => {\n return JSON.stringify(value);\n};\n\nexport interface SetToStorageConfig<V>\n extends Omit<GetFromStorageConfig<V>, 'fallback'> {\n value: V;\n}\n\nexport interface UnsetFromStorageConfig\n extends Omit<GetFromStorageConfig<any>, 'fallback'> {}\n\nexport interface GetFromStorageConfig<V> {\n /**\n * Storage key used to retrieve the value.\n * The full key is extended with the project namespace.\n */\n key: string;\n /**\n * Storage type.\n */\n type: StorageType;\n /**\n * Default value used when there is no value in storage.\n */\n fallback?: V;\n /**\n * Optional namespace segment used in the generated key.\n */\n namespace?: string;\n /**\n * Optional key prefix.\n */\n prefix?: string;\n}\n\nexport type SetToStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n SetToStorageConfig<V>,\n Extract<keyof SetToStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof SetToStorageConfig<V>>>;\n\nexport type UnsetFromStorageWrappedConfig<\n BaseConfig extends StorageConfigBase,\n> = Omit<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n> &\n Partial<\n Pick<\n UnsetFromStorageConfig,\n Extract<keyof UnsetFromStorageConfig, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof UnsetFromStorageConfig>>;\n\nexport type GetFromStorageWrappedConfig<\n V,\n BaseConfig extends StorageConfigBase,\n> = Omit<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n> &\n Partial<\n Pick<\n GetFromStorageConfig<V>,\n Extract<keyof GetFromStorageConfig<V>, keyof BaseConfig>\n >\n > &\n Pick<BaseConfig, Exclude<keyof BaseConfig, keyof GetFromStorageConfig<V>>>;\n\nexport type StorageConfigBase = Partial<\n Pick<GetFromStorageConfig<any>, 'prefix' | 'type'>\n>;\n\nexport interface StorageApi<BaseConfig extends StorageConfigBase> {\n set<Value>(config: SetToStorageWrappedConfig<Value, BaseConfig>): void;\n unset(config: UnsetFromStorageWrappedConfig<BaseConfig>): void;\n get<Value>(\n config: GetFromStorageWrappedConfig<Value, BaseConfig>,\n ): Value | null;\n}\n\n/**\n * Creates an interface for working with storage (`localStorage`, `sessionStorage`).\n */\nexport function createStorage<BaseConfig extends StorageConfigBase>(\n storageConfig: BaseConfig,\n): StorageApi<BaseConfig> {\n return {\n set: <Value>(cfg: SetToStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n storage.setItem(\n createKey(storagePrefix, config.key, config.namespace),\n formatValueToStorage(config.value),\n );\n },\n unset: <Value>(cfg: UnsetFromStorageWrappedConfig<BaseConfig>) => {\n const config = cfg as unknown as SetToStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n const storage = storages[storageType];\n\n storage.removeItem(\n createKey(storagePrefix, config.key, config.namespace),\n );\n },\n get: <Value>(cfg: GetFromStorageWrappedConfig<Value, BaseConfig>) => {\n const config = cfg as unknown as GetFromStorageConfig<Value>;\n const storageType = (config.type ?? storageConfig.type!) as StorageType;\n const storagePrefix = (config.prefix ?? storageConfig.prefix!) as string;\n\n const storage = storages[storageType];\n\n return (\n parseStorageValue<Value>(\n storage.getItem(\n createKey(storagePrefix, config.key, config.namespace),\n ),\n ) ??\n config.fallback ??\n null\n );\n },\n } as const;\n}\n"],"mappings":";;;;;;;;;AAQA,IAAa,aAAa,QAAgB,KAAa,cACrD,GAAG,SAAS,YAAY,IAAI,cAAc,GAAG,GAAG;;;ACNlD,IAAM,WAAyC;CAC7C,SAAS;CACT,OAAO;AACT;AAEA,IAAM,qBAAwB,UAA6B;CACzD,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,IAAI;EAEF,OADe,KAAK,MAAM,KACnB;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,IAAM,wBAAwB,UAA2B;CACvD,OAAO,KAAK,UAAU,KAAK;AAC7B;;;;AA6FA,SAAgB,cACd,eACwB;CACxB,OAAO;EACL,MAAa,QAAsD;GACjE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAItD,SAFyB,aAEjB,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS,GACrD,qBAAqB,OAAO,KAAK,CACnC;EACF;EACA,QAAe,QAAmD;GAChE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAGtD,SAFyB,aAEjB,WACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS,CACvD;EACF;EACA,MAAa,QAAwD;GACnE,MAAM,SAAS;GACf,MAAM,cAAe,OAAO,QAAQ,cAAc;GAClD,MAAM,gBAAiB,OAAO,UAAU,cAAc;GAEtD,MAAM,UAAU,SAAS;GAEzB,OACE,kBACE,QAAQ,QACN,UAAU,eAAe,OAAO,KAAK,OAAO,SAAS,CACvD,CACF,KACA,OAAO,YACP;EAEJ;CACF;AACF"}
package/text.cjs CHANGED
@@ -1,21 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/text.ts
3
- /**
4
- * ---header-docs-section---
5
- * # yummies/text
6
- *
7
- * ## Description
8
- *
9
- * Russian-centric text helpers: **declension** by count (одно слово / два слова / пять слов) and
10
- * utilities for splitting long strings into wrapped lines. Pair with `yummies/date-time` for
11
- * natural language timestamps and labels in Slavic locales.
12
- *
13
- * ## Usage
14
- *
15
- * ```ts
16
- * import { declension } from "yummies/text";
17
- * ```
18
- */
2
+ //#region src/text/declension.ts
19
3
  /**
20
4
  * Returns the correct word form based on the provided count.
21
5
  * @example
@@ -33,6 +17,8 @@ var declension = (count, txt, cases = [
33
17
  1,
34
18
  2
35
19
  ]) => txt[count % 100 > 4 && count % 100 < 20 ? 2 : cases[Math.min(count % 10, 5)]];
20
+ //#endregion
21
+ //#region src/text/split-text-by-lines.ts
36
22
  /**
37
23
  * Splits text into lines with a maximum line length.
38
24
  */
package/text.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"text.cjs","names":[],"sources":["../src/text.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/text\n *\n * ## Description\n *\n * Russian-centric text helpers: **declension** by count (одно слово / два слова / пять слов) and\n * utilities for splitting long strings into wrapped lines. Pair with `yummies/date-time` for\n * natural language timestamps and labels in Slavic locales.\n *\n * ## Usage\n *\n * ```ts\n * import { declension } from \"yummies/text\";\n * ```\n */\n\n/**\n * Returns the correct word form based on the provided count.\n * @example\n * declension(1, ['slovo', 'slova', 'slov']) // 'slovo'\n * @example\n * declension(2, ['slovo', 'slova', 'slov']) // 'slova'\n * @example\n * declension(5, ['slovo', 'slova', 'slov']) // 'slov'\n */\nexport const declension = (\n count: number,\n txt: readonly [one: string, two: string, five: string],\n cases = [2, 0, 1, 1, 1, 2],\n) =>\n txt[count % 100 > 4 && count % 100 < 20 ? 2 : cases[Math.min(count % 10, 5)]];\n\n/**\n * Splits text into lines with a maximum line length.\n */\nexport const splitTextByLines = (\n text: string,\n lineLingth: number = 60,\n): string[] => {\n const words = text.split(/\\s+/).filter((word) => word !== '');\n const lines = [];\n let currentLine = '';\n\n for (const word of words) {\n if (word.length > lineLingth) {\n if (currentLine !== '') {\n lines.push(currentLine);\n currentLine = '';\n }\n\n let start = 0;\n while (start < word.length) {\n const chunk = word.slice(start, start + lineLingth);\n lines.push(chunk);\n start += lineLingth;\n }\n continue;\n }\n\n // Проверка возможности добавления слова в текущую строку\n if (currentLine === '') {\n currentLine = word;\n } else if (currentLine.length + 1 + word.length <= lineLingth) {\n currentLine += ` ${word}`;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine !== '' || lines.length === 0) {\n lines.push(currentLine);\n }\n\n return lines;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,cACX,OACA,KACA,QAAQ;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE,KAE1B,IAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,QAAQ,IAAI,EAAE;;;;AAK7E,IAAa,oBACX,MACA,aAAqB,OACR;CACb,MAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,QAAQ,SAAS,SAAS,GAAG;CAC7D,MAAM,QAAQ,EAAE;CAChB,IAAI,cAAc;AAElB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,KAAK,SAAS,YAAY;AAC5B,OAAI,gBAAgB,IAAI;AACtB,UAAM,KAAK,YAAY;AACvB,kBAAc;;GAGhB,IAAI,QAAQ;AACZ,UAAO,QAAQ,KAAK,QAAQ;IAC1B,MAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,WAAW;AACnD,UAAM,KAAK,MAAM;AACjB,aAAS;;AAEX;;AAIF,MAAI,gBAAgB,GAClB,eAAc;WACL,YAAY,SAAS,IAAI,KAAK,UAAU,WACjD,gBAAe,IAAI;OACd;AACL,SAAM,KAAK,YAAY;AACvB,iBAAc;;;AAIlB,KAAI,gBAAgB,MAAM,MAAM,WAAW,EACzC,OAAM,KAAK,YAAY;AAGzB,QAAO"}
1
+ {"version":3,"file":"text.cjs","names":[],"sources":["../src/text/declension.ts","../src/text/split-text-by-lines.ts"],"sourcesContent":["/**\n * Returns the correct word form based on the provided count.\n * @example\n * declension(1, ['slovo', 'slova', 'slov']) // 'slovo'\n * @example\n * declension(2, ['slovo', 'slova', 'slov']) // 'slova'\n * @example\n * declension(5, ['slovo', 'slova', 'slov']) // 'slov'\n */\nexport const declension = (\n count: number,\n txt: readonly [one: string, two: string, five: string],\n cases = [2, 0, 1, 1, 1, 2],\n) =>\n txt[count % 100 > 4 && count % 100 < 20 ? 2 : cases[Math.min(count % 10, 5)]];\n","/**\n * Splits text into lines with a maximum line length.\n */\nexport const splitTextByLines = (\n text: string,\n lineLingth: number = 60,\n): string[] => {\n const words = text.split(/\\s+/).filter((word) => word !== '');\n const lines = [];\n let currentLine = '';\n\n for (const word of words) {\n if (word.length > lineLingth) {\n if (currentLine !== '') {\n lines.push(currentLine);\n currentLine = '';\n }\n\n let start = 0;\n while (start < word.length) {\n const chunk = word.slice(start, start + lineLingth);\n lines.push(chunk);\n start += lineLingth;\n }\n continue;\n }\n\n // Проверка возможности добавления слова в текущую строку\n if (currentLine === '') {\n currentLine = word;\n } else if (currentLine.length + 1 + word.length <= lineLingth) {\n currentLine += ` ${word}`;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine !== '' || lines.length === 0) {\n lines.push(currentLine);\n }\n\n return lines;\n};\n"],"mappings":";;;;;;;;;;;AASA,IAAa,cACX,OACA,KACA,QAAQ;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC,MAEzB,IAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,QAAQ,IAAI,CAAC;;;;;;ACX5E,IAAa,oBACX,MACA,aAAqB,OACR;CACb,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,QAAQ,SAAS,SAAS,EAAE;CAC5D,MAAM,QAAQ,CAAC;CACf,IAAI,cAAc;CAElB,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,SAAS,YAAY;GAC5B,IAAI,gBAAgB,IAAI;IACtB,MAAM,KAAK,WAAW;IACtB,cAAc;GAChB;GAEA,IAAI,QAAQ;GACZ,OAAO,QAAQ,KAAK,QAAQ;IAC1B,MAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,UAAU;IAClD,MAAM,KAAK,KAAK;IAChB,SAAS;GACX;GACA;EACF;EAGA,IAAI,gBAAgB,IAClB,cAAc;OACT,IAAI,YAAY,SAAS,IAAI,KAAK,UAAU,YACjD,eAAe,IAAI;OACd;GACL,MAAM,KAAK,WAAW;GACtB,cAAc;EAChB;CACF;CAEA,IAAI,gBAAgB,MAAM,MAAM,WAAW,GACzC,MAAM,KAAK,WAAW;CAGxB,OAAO;AACT"}
package/text.d.ts CHANGED
@@ -1,19 +1,3 @@
1
- /**
2
- * ---header-docs-section---
3
- * # yummies/text
4
- *
5
- * ## Description
6
- *
7
- * Russian-centric text helpers: **declension** by count (одно слово / два слова / пять слов) and
8
- * utilities for splitting long strings into wrapped lines. Pair with `yummies/date-time` for
9
- * natural language timestamps and labels in Slavic locales.
10
- *
11
- * ## Usage
12
- *
13
- * ```ts
14
- * import { declension } from "yummies/text";
15
- * ```
16
- */
17
1
  /**
18
2
  * Returns the correct word form based on the provided count.
19
3
  * @example
@@ -24,6 +8,7 @@
24
8
  * declension(5, ['slovo', 'slova', 'slov']) // 'slov'
25
9
  */
26
10
  declare const declension: (count: number, txt: readonly [one: string, two: string, five: string], cases?: number[]) => string;
11
+
27
12
  /**
28
13
  * Splits text into lines with a maximum line length.
29
14
  */
package/text.js CHANGED
@@ -1,20 +1,4 @@
1
- //#region src/text.ts
2
- /**
3
- * ---header-docs-section---
4
- * # yummies/text
5
- *
6
- * ## Description
7
- *
8
- * Russian-centric text helpers: **declension** by count (одно слово / два слова / пять слов) and
9
- * utilities for splitting long strings into wrapped lines. Pair with `yummies/date-time` for
10
- * natural language timestamps and labels in Slavic locales.
11
- *
12
- * ## Usage
13
- *
14
- * ```ts
15
- * import { declension } from "yummies/text";
16
- * ```
17
- */
1
+ //#region src/text/declension.ts
18
2
  /**
19
3
  * Returns the correct word form based on the provided count.
20
4
  * @example
@@ -32,6 +16,8 @@ var declension = (count, txt, cases = [
32
16
  1,
33
17
  2
34
18
  ]) => txt[count % 100 > 4 && count % 100 < 20 ? 2 : cases[Math.min(count % 10, 5)]];
19
+ //#endregion
20
+ //#region src/text/split-text-by-lines.ts
35
21
  /**
36
22
  * Splits text into lines with a maximum line length.
37
23
  */
package/text.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","names":[],"sources":["../src/text.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/text\n *\n * ## Description\n *\n * Russian-centric text helpers: **declension** by count (одно слово / два слова / пять слов) and\n * utilities for splitting long strings into wrapped lines. Pair with `yummies/date-time` for\n * natural language timestamps and labels in Slavic locales.\n *\n * ## Usage\n *\n * ```ts\n * import { declension } from \"yummies/text\";\n * ```\n */\n\n/**\n * Returns the correct word form based on the provided count.\n * @example\n * declension(1, ['slovo', 'slova', 'slov']) // 'slovo'\n * @example\n * declension(2, ['slovo', 'slova', 'slov']) // 'slova'\n * @example\n * declension(5, ['slovo', 'slova', 'slov']) // 'slov'\n */\nexport const declension = (\n count: number,\n txt: readonly [one: string, two: string, five: string],\n cases = [2, 0, 1, 1, 1, 2],\n) =>\n txt[count % 100 > 4 && count % 100 < 20 ? 2 : cases[Math.min(count % 10, 5)]];\n\n/**\n * Splits text into lines with a maximum line length.\n */\nexport const splitTextByLines = (\n text: string,\n lineLingth: number = 60,\n): string[] => {\n const words = text.split(/\\s+/).filter((word) => word !== '');\n const lines = [];\n let currentLine = '';\n\n for (const word of words) {\n if (word.length > lineLingth) {\n if (currentLine !== '') {\n lines.push(currentLine);\n currentLine = '';\n }\n\n let start = 0;\n while (start < word.length) {\n const chunk = word.slice(start, start + lineLingth);\n lines.push(chunk);\n start += lineLingth;\n }\n continue;\n }\n\n // Проверка возможности добавления слова в текущую строку\n if (currentLine === '') {\n currentLine = word;\n } else if (currentLine.length + 1 + word.length <= lineLingth) {\n currentLine += ` ${word}`;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine !== '' || lines.length === 0) {\n lines.push(currentLine);\n }\n\n return lines;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAa,cACX,OACA,KACA,QAAQ;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAE,KAE1B,IAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,QAAQ,IAAI,EAAE;;;;AAK7E,IAAa,oBACX,MACA,aAAqB,OACR;CACb,MAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,QAAQ,SAAS,SAAS,GAAG;CAC7D,MAAM,QAAQ,EAAE;CAChB,IAAI,cAAc;AAElB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,KAAK,SAAS,YAAY;AAC5B,OAAI,gBAAgB,IAAI;AACtB,UAAM,KAAK,YAAY;AACvB,kBAAc;;GAGhB,IAAI,QAAQ;AACZ,UAAO,QAAQ,KAAK,QAAQ;IAC1B,MAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,WAAW;AACnD,UAAM,KAAK,MAAM;AACjB,aAAS;;AAEX;;AAIF,MAAI,gBAAgB,GAClB,eAAc;WACL,YAAY,SAAS,IAAI,KAAK,UAAU,WACjD,gBAAe,IAAI;OACd;AACL,SAAM,KAAK,YAAY;AACvB,iBAAc;;;AAIlB,KAAI,gBAAgB,MAAM,MAAM,WAAW,EACzC,OAAM,KAAK,YAAY;AAGzB,QAAO"}
1
+ {"version":3,"file":"text.js","names":[],"sources":["../src/text/declension.ts","../src/text/split-text-by-lines.ts"],"sourcesContent":["/**\n * Returns the correct word form based on the provided count.\n * @example\n * declension(1, ['slovo', 'slova', 'slov']) // 'slovo'\n * @example\n * declension(2, ['slovo', 'slova', 'slov']) // 'slova'\n * @example\n * declension(5, ['slovo', 'slova', 'slov']) // 'slov'\n */\nexport const declension = (\n count: number,\n txt: readonly [one: string, two: string, five: string],\n cases = [2, 0, 1, 1, 1, 2],\n) =>\n txt[count % 100 > 4 && count % 100 < 20 ? 2 : cases[Math.min(count % 10, 5)]];\n","/**\n * Splits text into lines with a maximum line length.\n */\nexport const splitTextByLines = (\n text: string,\n lineLingth: number = 60,\n): string[] => {\n const words = text.split(/\\s+/).filter((word) => word !== '');\n const lines = [];\n let currentLine = '';\n\n for (const word of words) {\n if (word.length > lineLingth) {\n if (currentLine !== '') {\n lines.push(currentLine);\n currentLine = '';\n }\n\n let start = 0;\n while (start < word.length) {\n const chunk = word.slice(start, start + lineLingth);\n lines.push(chunk);\n start += lineLingth;\n }\n continue;\n }\n\n // Проверка возможности добавления слова в текущую строку\n if (currentLine === '') {\n currentLine = word;\n } else if (currentLine.length + 1 + word.length <= lineLingth) {\n currentLine += ` ${word}`;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine !== '' || lines.length === 0) {\n lines.push(currentLine);\n }\n\n return lines;\n};\n"],"mappings":";;;;;;;;;;AASA,IAAa,cACX,OACA,KACA,QAAQ;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC,MAEzB,IAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI,QAAQ,IAAI,CAAC;;;;;;ACX5E,IAAa,oBACX,MACA,aAAqB,OACR;CACb,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,QAAQ,SAAS,SAAS,EAAE;CAC5D,MAAM,QAAQ,CAAC;CACf,IAAI,cAAc;CAElB,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,SAAS,YAAY;GAC5B,IAAI,gBAAgB,IAAI;IACtB,MAAM,KAAK,WAAW;IACtB,cAAc;GAChB;GAEA,IAAI,QAAQ;GACZ,OAAO,QAAQ,KAAK,QAAQ;IAC1B,MAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,UAAU;IAClD,MAAM,KAAK,KAAK;IAChB,SAAS;GACX;GACA;EACF;EAGA,IAAI,gBAAgB,IAClB,cAAc;OACT,IAAI,YAAY,SAAS,IAAI,KAAK,UAAU,YACjD,eAAe,IAAI;OACd;GACL,MAAM,KAAK,WAAW;GACtB,cAAc;EAChB;CACF;CAEA,IAAI,gBAAgB,MAAM,MAAM,WAAW,GACzC,MAAM,KAAK,WAAW;CAGxB,OAAO;AACT"}
package/type-guard.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/type-guard/_exports.ts
3
- var _exports_exports = /* @__PURE__ */ require("./chunk-CZWwpsFl.cjs").__exportAll({
3
+ var _exports_exports = /* @__PURE__ */ require("./chunk-DakpK96I.cjs").__exportAll({
4
4
  isArray: () => isArray,
5
5
  isBoolean: () => isBoolean,
6
6
  isDefined: () => isDefined,
@@ -12,6 +12,7 @@ var _exports_exports = /* @__PURE__ */ require("./chunk-CZWwpsFl.cjs").__exportA
12
12
  isNull: () => isNull,
13
13
  isNumber: () => isNumber,
14
14
  isObject: () => isObject,
15
+ isObjectLike: () => isObjectLike,
15
16
  isRegExp: () => isRegExp,
16
17
  isString: () => isString,
17
18
  isSymbol: () => isSymbol,
@@ -150,6 +151,42 @@ var isUndefined = createTypeGuard(TYPE.Undefined);
150
151
  */
151
152
  var isObject = createTypeGuard(TYPE.Object);
152
153
  /**
154
+ * Checks whether a value is object-like: non-null and `typeof value === 'object'`.
155
+ *
156
+ * This includes plain objects, arrays, `Date`, `RegExp`, boxed primitives, and other built-ins
157
+ * whose `typeof` is `"object"`. It is broader than `isObject`, which only matches plain objects.
158
+ *
159
+ * @template T Input value type.
160
+ * @param value Value to test.
161
+ * @returns `true` when the value is a non-null object.
162
+ *
163
+ * @example
164
+ * ```ts
165
+ * isObjectLike({ a: 1 }); // true
166
+ * ```
167
+ *
168
+ * @example
169
+ * ```ts
170
+ * isObjectLike([]); // true
171
+ * ```
172
+ *
173
+ * @example
174
+ * ```ts
175
+ * isObjectLike(new Date()); // true
176
+ * ```
177
+ *
178
+ * @example
179
+ * ```ts
180
+ * isObjectLike(null); // false
181
+ * ```
182
+ *
183
+ * @example
184
+ * ```ts
185
+ * isObjectLike(() => {}); // false
186
+ * ```
187
+ */
188
+ var isObjectLike = (value) => typeof value === "object" && !!value;
189
+ /**
153
190
  * Checks whether a value is an array.
154
191
  *
155
192
  * @param value Value to test.
@@ -1 +1 @@
1
- {"version":3,"file":"type-guard.cjs","names":[],"sources":["../src/type-guard/_exports.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/type-guard\n *\n * ## Description\n *\n * Runtime **type guards** and narrowers for primitives, DOM nodes, `NaN`, and common app values.\n * Each helper is implemented once with consistent `typeof` / `Object.prototype.toString` logic so\n * `unknown` from JSON, events, or third-party scripts becomes safe typed branches without ad-hoc\n * checks scattered through the codebase.\n *\n * ## Usage\n *\n * ```ts\n * import { typeGuard } from \"yummies/type-guard\";\n * ```\n */\n\nimport type {\n AnyFunction,\n AnyObject,\n FalsyValues,\n ValueOf,\n} from 'yummies/types';\n\nconst TYPE = {\n Null: 'null',\n Undefined: 'undefined',\n NaN: 'nan',\n Object: '[object Object]',\n Array: '[object Array]',\n String: '[object String]',\n Number: '[object Number]',\n Boolean: '[object Boolean]',\n Function: '[object Function]',\n AsyncFunction: '[object AsyncFunction]',\n RegExp: '[object RegExp]',\n Symbol: '[object Symbol]',\n Infinite: 'infinite',\n Element: 'element',\n};\n\ntype Type = ValueOf<typeof TYPE>;\n\nfunction getType(value: unknown): Type {\n if (value === undefined) {\n return TYPE.Undefined;\n }\n if (value === null) {\n return TYPE.Null;\n }\n\n // handle DOM elements\n // @ts-expect-error\n if (value && (value.nodeType === 1 || value.nodeType === 9)) {\n return TYPE.Element;\n }\n\n const stringifiedValue = Object.prototype.toString.call(value);\n\n // handle NaN and Infinity\n if (stringifiedValue === TYPE.Number) {\n if (Number.isNaN(value as number)) {\n return TYPE.NaN;\n }\n if (!Number.isFinite(value as number)) {\n return TYPE.Infinite;\n }\n }\n\n return stringifiedValue as Type;\n}\n\nconst createTypeGuard =\n <T>(...types: Type[]) =>\n (value: unknown): value is T =>\n types.includes(getType(value));\n\n/**\n * Checks that a value is neither `null` nor `undefined`.\n *\n * @template T Value type without nullish branches.\n * @param value Value to test.\n * @returns `true` when the value is defined.\n *\n * @example\n * ```ts\n * isDefined(0); // true\n * ```\n *\n * @example\n * ```ts\n * isDefined(null); // false\n * ```\n */\nexport const isDefined = <T>(value: T | undefined | null): value is T =>\n value != null;\n\n/**\n * Checks whether a value is truthy (`!!value`).\n *\n * @param value Value to test.\n * @returns `true` when `!!value` is true.\n *\n * @example\n * ```ts\n * isTruthy(1); // true\n * ```\n *\n * @example\n * ```ts\n * isTruthy(0); // false\n * ```\n */\nexport const isTruthy = <T>(value: T): value is Exclude<T, FalsyValues> =>\n !!value;\n\n/**\n * Checks whether a value is falsy (`!Boolean(value)`).\n *\n * @param value Value to test.\n * @returns `true` when `Boolean(value)` is false.\n *\n * @example\n * ```ts\n * isFalsy(null); // true\n * ```\n *\n * @example\n * ```ts\n * isFalsy(\"x\"); // false\n * ```\n */\nexport const isFalsy = <T>(value: T): value is Extract<T, FalsyValues> =>\n !value;\n\n/**\n * Checks whether a value is exactly `null`.\n *\n * @param value Value to test.\n * @returns `true` when the value is `null`.\n *\n * @example\n * ```ts\n * isNull(null); // true\n * ```\n *\n * @example\n * ```ts\n * isNull(undefined); // false\n * ```\n */\nexport const isNull = createTypeGuard<null>(TYPE.Null);\n\n/**\n * Checks whether a value is exactly `undefined`.\n *\n * @param value Value to test.\n * @returns `true` when the value is `undefined`.\n *\n * @example\n * ```ts\n * isUndefined(undefined); // true\n * ```\n *\n * @example\n * ```ts\n * isUndefined('value'); // false\n * ```\n */\nexport const isUndefined = createTypeGuard<undefined>(TYPE.Undefined);\n\n/**\n * Checks whether a value is a plain object.\n *\n * @param value Value to test.\n * @returns `true` when the value matches `[object Object]`.\n *\n * @example\n * ```ts\n * isObject({ id: 1 }); // true\n * ```\n *\n * @example\n * ```ts\n * isObject([]); // false\n * ```\n */\nexport const isObject = createTypeGuard<AnyObject>(TYPE.Object);\n\n/**\n * Checks whether a value is an array.\n *\n * @param value Value to test.\n * @returns `true` when the value is an array.\n *\n * @example\n * ```ts\n * isArray([1, 2, 3]); // true\n * ```\n *\n * @example\n * ```ts\n * isArray({ length: 1 }); // false\n * ```\n */\nexport const isArray = createTypeGuard<unknown[]>(TYPE.Array);\n\n/**\n * Checks whether a value is a string object or primitive string.\n *\n * @param value Value to test.\n * @returns `true` when the value is a string.\n *\n * @example\n * ```ts\n * isString('hello'); // true\n * ```\n *\n * @example\n * ```ts\n * isString(123); // false\n * ```\n */\nexport const isString = createTypeGuard<string>(TYPE.String);\n\n/**\n * Checks whether a value is a finite number.\n *\n * Unlike `isNaN` and `isInfinite`, this guard only matches regular numeric values.\n *\n * @param value Value to test.\n * @returns `true` when the value is a non-NaN finite number.\n *\n * @example\n * ```ts\n * isNumber(123); // true\n * ```\n *\n * @example\n * ```ts\n * isNumber(Number.NaN); // false\n * ```\n */\nexport const isNumber = createTypeGuard<number>(TYPE.Number);\n\n/**\n * Checks whether a value is a boolean.\n *\n * @param value Value to test.\n * @returns `true` when the value is a boolean.\n *\n * @example\n * ```ts\n * isBoolean(true); // true\n * ```\n *\n * @example\n * ```ts\n * isBoolean('true'); // false\n * ```\n */\nexport const isBoolean = createTypeGuard<boolean>(TYPE.Boolean);\n\n/**\n * Checks whether a value is a synchronous or asynchronous function.\n *\n * @param value Value to test.\n * @returns `true` when the value is a function.\n *\n * @example\n * ```ts\n * isFunction(() => {}); // true\n * ```\n *\n * @example\n * ```ts\n * isFunction(async () => {}); // true\n * ```\n */\nexport const isFunction = createTypeGuard<AnyFunction>(\n TYPE.Function,\n TYPE.AsyncFunction,\n);\n\n/**\n * Checks whether a value is a regular expression.\n *\n * @param value Value to test.\n * @returns `true` when the value is a `RegExp`.\n *\n * @example\n * ```ts\n * isRegExp(/foo/); // true\n * ```\n *\n * @example\n * ```ts\n * isRegExp('foo'); // false\n * ```\n */\nexport const isRegExp = createTypeGuard<RegExp>(TYPE.RegExp);\n\n/**\n * Checks whether a value looks like a DOM element or document node.\n *\n * @param value Value to test.\n * @returns `true` when the value has an element-like node type.\n *\n * @example\n * ```ts\n * isElement(document.body); // true\n * ```\n *\n * @example\n * ```ts\n * isElement({ nodeType: 3 }); // false\n * ```\n */\nexport const isElement = createTypeGuard<HTMLElement>(TYPE.Element);\n\n/**\n * Checks whether a value is `NaN`.\n *\n * @param value Value to test.\n * @returns `true` when the value is `NaN`.\n *\n * @example\n * ```ts\n * isNaN(Number.NaN); // true\n * ```\n *\n * @example\n * ```ts\n * isNaN(5); // false\n * ```\n */\nexport const isNaN = createTypeGuard<number>(TYPE.NaN) as (\n value: unknown,\n) => boolean;\n\n/**\n * Checks whether a value is positive or negative infinity.\n *\n * @param value Value to test.\n * @returns `true` when the value is not finite.\n *\n * @example\n * ```ts\n * isInfinite(Infinity); // true\n * ```\n *\n * @example\n * ```ts\n * isInfinite(10); // false\n * ```\n */\nexport const isInfinite = createTypeGuard<number>(TYPE.Infinite) as (\n value: unknown,\n) => boolean;\n\n/**\n * Checks whether a value is a symbol.\n *\n * @param value Value to test.\n * @returns `true` when the value is a symbol.\n *\n * @example\n * ```ts\n * isSymbol(Symbol('id')); // true\n * ```\n *\n * @example\n * ```ts\n * isSymbol('id'); // false\n * ```\n */\nexport const isSymbol = createTypeGuard<symbol>(TYPE.Symbol);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyBA,IAAM,OAAO;CACX,MAAM;CACN,WAAW;CACX,KAAK;CACL,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,UAAU;CACV,eAAe;CACf,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,SAAS;CACV;AAID,SAAS,QAAQ,OAAsB;AACrC,KAAI,UAAU,KAAA,EACZ,QAAO,KAAK;AAEd,KAAI,UAAU,KACZ,QAAO,KAAK;AAKd,KAAI,UAAU,MAAM,aAAa,KAAK,MAAM,aAAa,GACvD,QAAO,KAAK;CAGd,MAAM,mBAAmB,OAAO,UAAU,SAAS,KAAK,MAAM;AAG9D,KAAI,qBAAqB,KAAK,QAAQ;AACpC,MAAI,OAAO,MAAM,MAAgB,CAC/B,QAAO,KAAK;AAEd,MAAI,CAAC,OAAO,SAAS,MAAgB,CACnC,QAAO,KAAK;;AAIhB,QAAO;;AAGT,IAAM,mBACA,GAAG,WACN,UACC,MAAM,SAAS,QAAQ,MAAM,CAAC;;;;;;;;;;;;;;;;;;AAmBlC,IAAa,aAAgB,UAC3B,SAAS;;;;;;;;;;;;;;;;;AAkBX,IAAa,YAAe,UAC1B,CAAC,CAAC;;;;;;;;;;;;;;;;;AAkBJ,IAAa,WAAc,UACzB,CAAC;;;;;;;;;;;;;;;;;AAkBH,IAAa,SAAS,gBAAsB,KAAK,KAAK;;;;;;;;;;;;;;;;;AAkBtD,IAAa,cAAc,gBAA2B,KAAK,UAAU;;;;;;;;;;;;;;;;;AAkBrE,IAAa,WAAW,gBAA2B,KAAK,OAAO;;;;;;;;;;;;;;;;;AAkB/D,IAAa,UAAU,gBAA2B,KAAK,MAAM;;;;;;;;;;;;;;;;;AAkB7D,IAAa,WAAW,gBAAwB,KAAK,OAAO;;;;;;;;;;;;;;;;;;;AAoB5D,IAAa,WAAW,gBAAwB,KAAK,OAAO;;;;;;;;;;;;;;;;;AAkB5D,IAAa,YAAY,gBAAyB,KAAK,QAAQ;;;;;;;;;;;;;;;;;AAkB/D,IAAa,aAAa,gBACxB,KAAK,UACL,KAAK,cACN;;;;;;;;;;;;;;;;;AAkBD,IAAa,WAAW,gBAAwB,KAAK,OAAO;;;;;;;;;;;;;;;;;AAkB5D,IAAa,YAAY,gBAA6B,KAAK,QAAQ;;;;;;;;;;;;;;;;;AAkBnE,IAAa,QAAQ,gBAAwB,KAAK,IAAI;;;;;;;;;;;;;;;;;AAoBtD,IAAa,aAAa,gBAAwB,KAAK,SAAS;;;;;;;;;;;;;;;;;AAoBhE,IAAa,WAAW,gBAAwB,KAAK,OAAO"}
1
+ {"version":3,"file":"type-guard.cjs","names":[],"sources":["../src/type-guard/_exports.ts"],"sourcesContent":["/**\n * ---header-docs-section---\n * # yummies/type-guard\n *\n * ## Description\n *\n * Runtime **type guards** and narrowers for primitives, DOM nodes, `NaN`, and common app values.\n * Each helper is implemented once with consistent `typeof` / `Object.prototype.toString` logic so\n * `unknown` from JSON, events, or third-party scripts becomes safe typed branches without ad-hoc\n * checks scattered through the codebase.\n *\n * ## Usage\n *\n * ```ts\n * import { typeGuard } from \"yummies/type-guard\";\n * ```\n */\n\nimport type {\n AnyFunction,\n AnyObject,\n FalsyValues,\n ValueOf,\n} from 'yummies/types';\n\nconst TYPE = {\n Null: 'null',\n Undefined: 'undefined',\n NaN: 'nan',\n Object: '[object Object]',\n Array: '[object Array]',\n String: '[object String]',\n Number: '[object Number]',\n Boolean: '[object Boolean]',\n Function: '[object Function]',\n AsyncFunction: '[object AsyncFunction]',\n RegExp: '[object RegExp]',\n Symbol: '[object Symbol]',\n Infinite: 'infinite',\n Element: 'element',\n};\n\ntype Type = ValueOf<typeof TYPE>;\n\nfunction getType(value: unknown): Type {\n if (value === undefined) {\n return TYPE.Undefined;\n }\n if (value === null) {\n return TYPE.Null;\n }\n\n // handle DOM elements\n // @ts-expect-error\n if (value && (value.nodeType === 1 || value.nodeType === 9)) {\n return TYPE.Element;\n }\n\n const stringifiedValue = Object.prototype.toString.call(value);\n\n // handle NaN and Infinity\n if (stringifiedValue === TYPE.Number) {\n if (Number.isNaN(value as number)) {\n return TYPE.NaN;\n }\n if (!Number.isFinite(value as number)) {\n return TYPE.Infinite;\n }\n }\n\n return stringifiedValue as Type;\n}\n\nconst createTypeGuard =\n <T>(...types: Type[]) =>\n (value: unknown): value is T =>\n types.includes(getType(value));\n\n/**\n * Checks that a value is neither `null` nor `undefined`.\n *\n * @template T Value type without nullish branches.\n * @param value Value to test.\n * @returns `true` when the value is defined.\n *\n * @example\n * ```ts\n * isDefined(0); // true\n * ```\n *\n * @example\n * ```ts\n * isDefined(null); // false\n * ```\n */\nexport const isDefined = <T>(value: T | undefined | null): value is T =>\n value != null;\n\n/**\n * Checks whether a value is truthy (`!!value`).\n *\n * @param value Value to test.\n * @returns `true` when `!!value` is true.\n *\n * @example\n * ```ts\n * isTruthy(1); // true\n * ```\n *\n * @example\n * ```ts\n * isTruthy(0); // false\n * ```\n */\nexport const isTruthy = <T>(value: T): value is Exclude<T, FalsyValues> =>\n !!value;\n\n/**\n * Checks whether a value is falsy (`!Boolean(value)`).\n *\n * @param value Value to test.\n * @returns `true` when `Boolean(value)` is false.\n *\n * @example\n * ```ts\n * isFalsy(null); // true\n * ```\n *\n * @example\n * ```ts\n * isFalsy(\"x\"); // false\n * ```\n */\nexport const isFalsy = <T>(value: T): value is Extract<T, FalsyValues> =>\n !value;\n\n/**\n * Checks whether a value is exactly `null`.\n *\n * @param value Value to test.\n * @returns `true` when the value is `null`.\n *\n * @example\n * ```ts\n * isNull(null); // true\n * ```\n *\n * @example\n * ```ts\n * isNull(undefined); // false\n * ```\n */\nexport const isNull = createTypeGuard<null>(TYPE.Null);\n\n/**\n * Checks whether a value is exactly `undefined`.\n *\n * @param value Value to test.\n * @returns `true` when the value is `undefined`.\n *\n * @example\n * ```ts\n * isUndefined(undefined); // true\n * ```\n *\n * @example\n * ```ts\n * isUndefined('value'); // false\n * ```\n */\nexport const isUndefined = createTypeGuard<undefined>(TYPE.Undefined);\n\n/**\n * Checks whether a value is a plain object.\n *\n * @param value Value to test.\n * @returns `true` when the value matches `[object Object]`.\n *\n * @example\n * ```ts\n * isObject({ id: 1 }); // true\n * ```\n *\n * @example\n * ```ts\n * isObject([]); // false\n * ```\n */\nexport const isObject = createTypeGuard<AnyObject>(TYPE.Object);\n\n/**\n * Checks whether a value is object-like: non-null and `typeof value === 'object'`.\n *\n * This includes plain objects, arrays, `Date`, `RegExp`, boxed primitives, and other built-ins\n * whose `typeof` is `\"object\"`. It is broader than `isObject`, which only matches plain objects.\n *\n * @template T Input value type.\n * @param value Value to test.\n * @returns `true` when the value is a non-null object.\n *\n * @example\n * ```ts\n * isObjectLike({ a: 1 }); // true\n * ```\n *\n * @example\n * ```ts\n * isObjectLike([]); // true\n * ```\n *\n * @example\n * ```ts\n * isObjectLike(new Date()); // true\n * ```\n *\n * @example\n * ```ts\n * isObjectLike(null); // false\n * ```\n *\n * @example\n * ```ts\n * isObjectLike(() => {}); // false\n * ```\n */\nexport const isObjectLike = <T = never>(\n value: unknown,\n): value is T extends never ? Extract<typeof value, object> : T =>\n typeof value === 'object' && !!value;\n\n/**\n * Checks whether a value is an array.\n *\n * @param value Value to test.\n * @returns `true` when the value is an array.\n *\n * @example\n * ```ts\n * isArray([1, 2, 3]); // true\n * ```\n *\n * @example\n * ```ts\n * isArray({ length: 1 }); // false\n * ```\n */\nexport const isArray = createTypeGuard<unknown[]>(TYPE.Array);\n\n/**\n * Checks whether a value is a string object or primitive string.\n *\n * @param value Value to test.\n * @returns `true` when the value is a string.\n *\n * @example\n * ```ts\n * isString('hello'); // true\n * ```\n *\n * @example\n * ```ts\n * isString(123); // false\n * ```\n */\nexport const isString = createTypeGuard<string>(TYPE.String);\n\n/**\n * Checks whether a value is a finite number.\n *\n * Unlike `isNaN` and `isInfinite`, this guard only matches regular numeric values.\n *\n * @param value Value to test.\n * @returns `true` when the value is a non-NaN finite number.\n *\n * @example\n * ```ts\n * isNumber(123); // true\n * ```\n *\n * @example\n * ```ts\n * isNumber(Number.NaN); // false\n * ```\n */\nexport const isNumber = createTypeGuard<number>(TYPE.Number);\n\n/**\n * Checks whether a value is a boolean.\n *\n * @param value Value to test.\n * @returns `true` when the value is a boolean.\n *\n * @example\n * ```ts\n * isBoolean(true); // true\n * ```\n *\n * @example\n * ```ts\n * isBoolean('true'); // false\n * ```\n */\nexport const isBoolean = createTypeGuard<boolean>(TYPE.Boolean);\n\n/**\n * Checks whether a value is a synchronous or asynchronous function.\n *\n * @param value Value to test.\n * @returns `true` when the value is a function.\n *\n * @example\n * ```ts\n * isFunction(() => {}); // true\n * ```\n *\n * @example\n * ```ts\n * isFunction(async () => {}); // true\n * ```\n */\nexport const isFunction = createTypeGuard<AnyFunction>(\n TYPE.Function,\n TYPE.AsyncFunction,\n);\n\n/**\n * Checks whether a value is a regular expression.\n *\n * @param value Value to test.\n * @returns `true` when the value is a `RegExp`.\n *\n * @example\n * ```ts\n * isRegExp(/foo/); // true\n * ```\n *\n * @example\n * ```ts\n * isRegExp('foo'); // false\n * ```\n */\nexport const isRegExp = createTypeGuard<RegExp>(TYPE.RegExp);\n\n/**\n * Checks whether a value looks like a DOM element or document node.\n *\n * @param value Value to test.\n * @returns `true` when the value has an element-like node type.\n *\n * @example\n * ```ts\n * isElement(document.body); // true\n * ```\n *\n * @example\n * ```ts\n * isElement({ nodeType: 3 }); // false\n * ```\n */\nexport const isElement = createTypeGuard<HTMLElement>(TYPE.Element);\n\n/**\n * Checks whether a value is `NaN`.\n *\n * @param value Value to test.\n * @returns `true` when the value is `NaN`.\n *\n * @example\n * ```ts\n * isNaN(Number.NaN); // true\n * ```\n *\n * @example\n * ```ts\n * isNaN(5); // false\n * ```\n */\nexport const isNaN = createTypeGuard<number>(TYPE.NaN) as (\n value: unknown,\n) => boolean;\n\n/**\n * Checks whether a value is positive or negative infinity.\n *\n * @param value Value to test.\n * @returns `true` when the value is not finite.\n *\n * @example\n * ```ts\n * isInfinite(Infinity); // true\n * ```\n *\n * @example\n * ```ts\n * isInfinite(10); // false\n * ```\n */\nexport const isInfinite = createTypeGuard<number>(TYPE.Infinite) as (\n value: unknown,\n) => boolean;\n\n/**\n * Checks whether a value is a symbol.\n *\n * @param value Value to test.\n * @returns `true` when the value is a symbol.\n *\n * @example\n * ```ts\n * isSymbol(Symbol('id')); // true\n * ```\n *\n * @example\n * ```ts\n * isSymbol('id'); // false\n * ```\n */\nexport const isSymbol = createTypeGuard<symbol>(TYPE.Symbol);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyBA,IAAM,OAAO;CACX,MAAM;CACN,WAAW;CACX,KAAK;CACL,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,UAAU;CACV,eAAe;CACf,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,SAAS;AACX;AAIA,SAAS,QAAQ,OAAsB;CACrC,IAAI,UAAU,KAAA,GACZ,OAAO,KAAK;CAEd,IAAI,UAAU,MACZ,OAAO,KAAK;CAKd,IAAI,UAAU,MAAM,aAAa,KAAK,MAAM,aAAa,IACvD,OAAO,KAAK;CAGd,MAAM,mBAAmB,OAAO,UAAU,SAAS,KAAK,KAAK;CAG7D,IAAI,qBAAqB,KAAK,QAAQ;EACpC,IAAI,OAAO,MAAM,KAAe,GAC9B,OAAO,KAAK;EAEd,IAAI,CAAC,OAAO,SAAS,KAAe,GAClC,OAAO,KAAK;CAEhB;CAEA,OAAO;AACT;AAEA,IAAM,mBACA,GAAG,WACN,UACC,MAAM,SAAS,QAAQ,KAAK,CAAC;;;;;;;;;;;;;;;;;;AAmBjC,IAAa,aAAgB,UAC3B,SAAS;;;;;;;;;;;;;;;;;AAkBX,IAAa,YAAe,UAC1B,CAAC,CAAC;;;;;;;;;;;;;;;;;AAkBJ,IAAa,WAAc,UACzB,CAAC;;;;;;;;;;;;;;;;;AAkBH,IAAa,SAAS,gBAAsB,KAAK,IAAI;;;;;;;;;;;;;;;;;AAkBrD,IAAa,cAAc,gBAA2B,KAAK,SAAS;;;;;;;;;;;;;;;;;AAkBpE,IAAa,WAAW,gBAA2B,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqC9D,IAAa,gBACX,UAEA,OAAO,UAAU,YAAY,CAAC,CAAC;;;;;;;;;;;;;;;;;AAkBjC,IAAa,UAAU,gBAA2B,KAAK,KAAK;;;;;;;;;;;;;;;;;AAkB5D,IAAa,WAAW,gBAAwB,KAAK,MAAM;;;;;;;;;;;;;;;;;;;AAoB3D,IAAa,WAAW,gBAAwB,KAAK,MAAM;;;;;;;;;;;;;;;;;AAkB3D,IAAa,YAAY,gBAAyB,KAAK,OAAO;;;;;;;;;;;;;;;;;AAkB9D,IAAa,aAAa,gBACxB,KAAK,UACL,KAAK,aACP;;;;;;;;;;;;;;;;;AAkBA,IAAa,WAAW,gBAAwB,KAAK,MAAM;;;;;;;;;;;;;;;;;AAkB3D,IAAa,YAAY,gBAA6B,KAAK,OAAO;;;;;;;;;;;;;;;;;AAkBlE,IAAa,QAAQ,gBAAwB,KAAK,GAAG;;;;;;;;;;;;;;;;;AAoBrD,IAAa,aAAa,gBAAwB,KAAK,QAAQ;;;;;;;;;;;;;;;;;AAoB/D,IAAa,WAAW,gBAAwB,KAAK,MAAM"}
package/type-guard.d.ts CHANGED
@@ -121,6 +121,42 @@ declare const isUndefined: (value: unknown) => value is undefined;
121
121
  * ```
122
122
  */
123
123
  declare const isObject: (value: unknown) => value is AnyObject;
124
+ /**
125
+ * Checks whether a value is object-like: non-null and `typeof value === 'object'`.
126
+ *
127
+ * This includes plain objects, arrays, `Date`, `RegExp`, boxed primitives, and other built-ins
128
+ * whose `typeof` is `"object"`. It is broader than `isObject`, which only matches plain objects.
129
+ *
130
+ * @template T Input value type.
131
+ * @param value Value to test.
132
+ * @returns `true` when the value is a non-null object.
133
+ *
134
+ * @example
135
+ * ```ts
136
+ * isObjectLike({ a: 1 }); // true
137
+ * ```
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * isObjectLike([]); // true
142
+ * ```
143
+ *
144
+ * @example
145
+ * ```ts
146
+ * isObjectLike(new Date()); // true
147
+ * ```
148
+ *
149
+ * @example
150
+ * ```ts
151
+ * isObjectLike(null); // false
152
+ * ```
153
+ *
154
+ * @example
155
+ * ```ts
156
+ * isObjectLike(() => {}); // false
157
+ * ```
158
+ */
159
+ declare const isObjectLike: <T = never>(value: unknown) => value is T extends never ? Extract<typeof value, object> : T;
124
160
  /**
125
161
  * Checks whether a value is an array.
126
162
  *
@@ -305,6 +341,7 @@ declare const _exports_isNaN: typeof isNaN;
305
341
  declare const _exports_isNull: typeof isNull;
306
342
  declare const _exports_isNumber: typeof isNumber;
307
343
  declare const _exports_isObject: typeof isObject;
344
+ declare const _exports_isObjectLike: typeof isObjectLike;
308
345
  declare const _exports_isRegExp: typeof isRegExp;
309
346
  declare const _exports_isString: typeof isString;
310
347
  declare const _exports_isSymbol: typeof isSymbol;
@@ -323,6 +360,7 @@ declare namespace _exports {
323
360
  _exports_isNull as isNull,
324
361
  _exports_isNumber as isNumber,
325
362
  _exports_isObject as isObject,
363
+ _exports_isObjectLike as isObjectLike,
326
364
  _exports_isRegExp as isRegExp,
327
365
  _exports_isString as isString,
328
366
  _exports_isSymbol as isSymbol,
package/type-guard.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as __exportAll } from "./chunk-pbuEa-1d.js";
1
+ import { t as __exportAll } from "./chunk-D7D4PA-g.js";
2
2
  //#region src/type-guard/_exports.ts
3
3
  var _exports_exports = /* @__PURE__ */ __exportAll({
4
4
  isArray: () => isArray,
@@ -12,6 +12,7 @@ var _exports_exports = /* @__PURE__ */ __exportAll({
12
12
  isNull: () => isNull,
13
13
  isNumber: () => isNumber,
14
14
  isObject: () => isObject,
15
+ isObjectLike: () => isObjectLike,
15
16
  isRegExp: () => isRegExp,
16
17
  isString: () => isString,
17
18
  isSymbol: () => isSymbol,
@@ -150,6 +151,42 @@ var isUndefined = createTypeGuard(TYPE.Undefined);
150
151
  */
151
152
  var isObject = createTypeGuard(TYPE.Object);
152
153
  /**
154
+ * Checks whether a value is object-like: non-null and `typeof value === 'object'`.
155
+ *
156
+ * This includes plain objects, arrays, `Date`, `RegExp`, boxed primitives, and other built-ins
157
+ * whose `typeof` is `"object"`. It is broader than `isObject`, which only matches plain objects.
158
+ *
159
+ * @template T Input value type.
160
+ * @param value Value to test.
161
+ * @returns `true` when the value is a non-null object.
162
+ *
163
+ * @example
164
+ * ```ts
165
+ * isObjectLike({ a: 1 }); // true
166
+ * ```
167
+ *
168
+ * @example
169
+ * ```ts
170
+ * isObjectLike([]); // true
171
+ * ```
172
+ *
173
+ * @example
174
+ * ```ts
175
+ * isObjectLike(new Date()); // true
176
+ * ```
177
+ *
178
+ * @example
179
+ * ```ts
180
+ * isObjectLike(null); // false
181
+ * ```
182
+ *
183
+ * @example
184
+ * ```ts
185
+ * isObjectLike(() => {}); // false
186
+ * ```
187
+ */
188
+ var isObjectLike = (value) => typeof value === "object" && !!value;
189
+ /**
153
190
  * Checks whether a value is an array.
154
191
  *
155
192
  * @param value Value to test.