@nejs/basic-extensions 2.7.0 → 2.9.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 (271) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/README.md +6250 -1574
  3. package/bin/version +100 -0
  4. package/dist/@nejs/basic-extensions.bundle.2.8.0.js +19 -0
  5. package/dist/@nejs/basic-extensions.bundle.2.8.0.js.map +7 -0
  6. package/dist/cjs/array.extensions.d.ts +39 -0
  7. package/dist/cjs/array.extensions.js +303 -0
  8. package/dist/cjs/array.extensions.js.map +1 -0
  9. package/dist/cjs/big.int.extension.d.ts +31 -0
  10. package/dist/cjs/big.int.extension.js +164 -0
  11. package/dist/cjs/big.int.extension.js.map +1 -0
  12. package/dist/cjs/{newClasses → classes}/asyncIterable.js +32 -44
  13. package/dist/cjs/classes/asyncIterable.js.map +1 -0
  14. package/dist/cjs/{newClasses → classes}/deferred.js +66 -138
  15. package/dist/cjs/classes/deferred.js.map +1 -0
  16. package/dist/cjs/{newClasses → classes}/descriptor.js +56 -90
  17. package/dist/cjs/classes/descriptor.js.map +1 -0
  18. package/dist/cjs/classes/index.d.ts +13 -0
  19. package/dist/cjs/classes/index.js +57 -0
  20. package/dist/cjs/classes/index.js.map +1 -0
  21. package/dist/cjs/classes/introspector.d.ts +20 -0
  22. package/dist/cjs/classes/introspector.js +130 -0
  23. package/dist/cjs/classes/introspector.js.map +1 -0
  24. package/dist/cjs/{newClasses → classes}/iterable.js +42 -63
  25. package/dist/cjs/classes/iterable.js.map +1 -0
  26. package/dist/cjs/classes/param.parser.d.ts +227 -0
  27. package/dist/cjs/classes/param.parser.js +242 -0
  28. package/dist/cjs/classes/param.parser.js.map +1 -0
  29. package/dist/cjs/classes/pluggable.proxy.d.ts +152 -0
  30. package/dist/cjs/classes/pluggable.proxy.js +444 -0
  31. package/dist/cjs/classes/pluggable.proxy.js.map +1 -0
  32. package/dist/cjs/{newClasses → classes}/refmap.js +18 -30
  33. package/dist/cjs/classes/refmap.js.map +1 -0
  34. package/dist/cjs/{newClasses → classes}/refset.js +28 -47
  35. package/dist/cjs/classes/refset.js.map +1 -0
  36. package/dist/cjs/classes/symkeys.d.ts +292 -0
  37. package/dist/cjs/classes/symkeys.js +424 -0
  38. package/dist/cjs/classes/symkeys.js.map +1 -0
  39. package/dist/cjs/classes/type.d.ts +56 -0
  40. package/dist/cjs/classes/type.js +405 -0
  41. package/dist/cjs/classes/type.js.map +1 -0
  42. package/dist/cjs/function.extensions.js +757 -0
  43. package/dist/cjs/function.extensions.js.map +1 -0
  44. package/dist/cjs/global.this.js +261 -0
  45. package/dist/cjs/global.this.js.map +1 -0
  46. package/dist/cjs/index.d.ts +4 -3
  47. package/dist/cjs/index.js +62 -32
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/json.extensions.d.ts +2 -0
  50. package/dist/cjs/json.extensions.js +108 -0
  51. package/dist/cjs/json.extensions.js.map +1 -0
  52. package/dist/{mjs/mapextensions.d.ts → cjs/map.extensions.d.ts} +1 -0
  53. package/dist/cjs/map.extensions.js +142 -0
  54. package/dist/cjs/map.extensions.js.map +1 -0
  55. package/dist/cjs/number.extension.d.ts +44 -0
  56. package/dist/cjs/number.extension.js +260 -0
  57. package/dist/cjs/number.extension.js.map +1 -0
  58. package/dist/cjs/object.extensions.d.ts +62 -0
  59. package/dist/cjs/object.extensions.js +1128 -0
  60. package/dist/cjs/object.extensions.js.map +1 -0
  61. package/dist/cjs/proxy.extensions.d.ts +2 -0
  62. package/dist/cjs/proxy.extensions.js +207 -0
  63. package/dist/cjs/proxy.extensions.js.map +1 -0
  64. package/dist/cjs/reflect.extensions.js +316 -0
  65. package/dist/cjs/reflect.extensions.js.map +1 -0
  66. package/dist/cjs/regular.expression.extensions.d.ts +2 -0
  67. package/dist/cjs/regular.expression.extensions.js +423 -0
  68. package/dist/cjs/regular.expression.extensions.js.map +1 -0
  69. package/dist/cjs/set.extensions.d.ts +40 -0
  70. package/dist/cjs/{setextensions.js → set.extensions.js} +150 -2
  71. package/dist/cjs/set.extensions.js.map +1 -0
  72. package/dist/cjs/string.extensions.js +661 -0
  73. package/dist/cjs/string.extensions.js.map +1 -0
  74. package/dist/{mjs/symbolextensions.d.ts → cjs/symbol.extensions.d.ts} +1 -0
  75. package/dist/cjs/symbol.extensions.js +380 -0
  76. package/dist/cjs/symbol.extensions.js.map +1 -0
  77. package/dist/cjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
  78. package/dist/cjs/weakref.extensions.js.map +1 -0
  79. package/dist/mjs/array.extensions.d.ts +39 -0
  80. package/dist/mjs/array.extensions.js +300 -0
  81. package/dist/mjs/array.extensions.js.map +1 -0
  82. package/dist/mjs/big.int.extension.d.ts +31 -0
  83. package/dist/mjs/big.int.extension.js +161 -0
  84. package/dist/mjs/big.int.extension.js.map +1 -0
  85. package/dist/mjs/classes/asyncIterable.js.map +1 -0
  86. package/dist/mjs/classes/deferred.js.map +1 -0
  87. package/dist/mjs/{newClasses → classes}/descriptor.js +7 -4
  88. package/dist/mjs/classes/descriptor.js.map +1 -0
  89. package/dist/mjs/classes/index.d.ts +13 -0
  90. package/dist/mjs/classes/index.js +40 -0
  91. package/dist/mjs/classes/index.js.map +1 -0
  92. package/dist/mjs/classes/introspector.d.ts +20 -0
  93. package/dist/mjs/classes/introspector.js +126 -0
  94. package/dist/mjs/classes/introspector.js.map +1 -0
  95. package/dist/mjs/classes/iterable.js.map +1 -0
  96. package/dist/mjs/classes/param.parser.d.ts +227 -0
  97. package/dist/mjs/classes/param.parser.js +238 -0
  98. package/dist/mjs/classes/param.parser.js.map +1 -0
  99. package/dist/mjs/classes/pluggable.proxy.d.ts +152 -0
  100. package/dist/mjs/classes/pluggable.proxy.js +438 -0
  101. package/dist/mjs/classes/pluggable.proxy.js.map +1 -0
  102. package/dist/mjs/{newClasses → classes}/refmap.js +3 -3
  103. package/dist/mjs/classes/refmap.js.map +1 -0
  104. package/dist/mjs/classes/refset.js.map +1 -0
  105. package/dist/mjs/classes/symkeys.d.ts +292 -0
  106. package/dist/mjs/classes/symkeys.js +420 -0
  107. package/dist/mjs/classes/symkeys.js.map +1 -0
  108. package/dist/mjs/classes/type.d.ts +56 -0
  109. package/dist/mjs/classes/type.js +401 -0
  110. package/dist/mjs/classes/type.js.map +1 -0
  111. package/dist/mjs/function.extensions.js +754 -0
  112. package/dist/mjs/function.extensions.js.map +1 -0
  113. package/dist/mjs/global.this.js +258 -0
  114. package/dist/mjs/global.this.js.map +1 -0
  115. package/dist/mjs/index.d.ts +4 -3
  116. package/dist/mjs/index.js +49 -19
  117. package/dist/mjs/index.js.map +1 -1
  118. package/dist/mjs/json.extensions.d.ts +2 -0
  119. package/dist/mjs/json.extensions.js +105 -0
  120. package/dist/mjs/json.extensions.js.map +1 -0
  121. package/dist/{cjs/mapextensions.d.ts → mjs/map.extensions.d.ts} +1 -0
  122. package/dist/mjs/map.extensions.js +139 -0
  123. package/dist/mjs/map.extensions.js.map +1 -0
  124. package/dist/mjs/number.extension.d.ts +44 -0
  125. package/dist/mjs/number.extension.js +257 -0
  126. package/dist/mjs/number.extension.js.map +1 -0
  127. package/dist/mjs/object.extensions.d.ts +62 -0
  128. package/dist/mjs/object.extensions.js +1124 -0
  129. package/dist/mjs/object.extensions.js.map +1 -0
  130. package/dist/mjs/proxy.extensions.d.ts +2 -0
  131. package/dist/mjs/proxy.extensions.js +204 -0
  132. package/dist/mjs/proxy.extensions.js.map +1 -0
  133. package/dist/mjs/reflect.extensions.js +313 -0
  134. package/dist/mjs/reflect.extensions.js.map +1 -0
  135. package/dist/mjs/regular.expression.extensions.d.ts +2 -0
  136. package/dist/mjs/regular.expression.extensions.js +420 -0
  137. package/dist/mjs/regular.expression.extensions.js.map +1 -0
  138. package/dist/mjs/set.extensions.d.ts +40 -0
  139. package/dist/mjs/{setextensions.js → set.extensions.js} +149 -1
  140. package/dist/mjs/set.extensions.js.map +1 -0
  141. package/dist/mjs/string.extensions.js +658 -0
  142. package/dist/mjs/string.extensions.js.map +1 -0
  143. package/dist/{cjs/symbolextensions.d.ts → mjs/symbol.extensions.d.ts} +1 -0
  144. package/dist/mjs/symbol.extensions.js +377 -0
  145. package/dist/mjs/symbol.extensions.js.map +1 -0
  146. package/dist/mjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
  147. package/dist/mjs/weakref.extensions.js.map +1 -0
  148. package/docs/index.html +24452 -5692
  149. package/package.json +7 -5
  150. package/src/array.extensions.js +322 -0
  151. package/src/big.int.extension.js +163 -0
  152. package/src/{newClasses → classes}/descriptor.js +16 -12
  153. package/src/classes/index.js +51 -0
  154. package/src/classes/introspector.js +167 -0
  155. package/src/classes/param.parser.js +253 -0
  156. package/src/classes/pluggable.proxy.js +485 -0
  157. package/src/{newClasses → classes}/refmap.js +5 -3
  158. package/src/classes/symkeys.js +464 -0
  159. package/src/classes/type.js +427 -0
  160. package/src/function.extensions.js +818 -0
  161. package/src/global.this.js +304 -0
  162. package/src/index.js +56 -23
  163. package/src/json.extensions.js +109 -0
  164. package/src/map.extensions.js +144 -0
  165. package/src/number.extension.js +273 -0
  166. package/src/object.extensions.js +1237 -0
  167. package/src/proxy.extensions.js +229 -0
  168. package/src/reflect.extensions.js +346 -0
  169. package/src/regular.expression.extensions.js +451 -0
  170. package/src/{setextensions.js → set.extensions.js} +151 -2
  171. package/src/string.extensions.js +734 -0
  172. package/src/symbol.extensions.js +389 -0
  173. package/tests/newClasses/refmap.test.js +3 -2
  174. package/tsconfig.base.json +5 -3
  175. package/tsconfig.cjs.json +2 -2
  176. package/tsconfig.esm.json +2 -2
  177. package/dist/@nejs/basic-extensions.bundle.2.6.0.js +0 -17
  178. package/dist/@nejs/basic-extensions.bundle.2.6.0.js.map +0 -7
  179. package/dist/cjs/arrayextensions.d.ts +0 -10
  180. package/dist/cjs/arrayextensions.js +0 -73
  181. package/dist/cjs/arrayextensions.js.map +0 -1
  182. package/dist/cjs/functionextensions.js +0 -202
  183. package/dist/cjs/functionextensions.js.map +0 -1
  184. package/dist/cjs/globals.js +0 -166
  185. package/dist/cjs/globals.js.map +0 -1
  186. package/dist/cjs/mapextensions.js +0 -32
  187. package/dist/cjs/mapextensions.js.map +0 -1
  188. package/dist/cjs/newClasses/asyncIterable.js.map +0 -1
  189. package/dist/cjs/newClasses/deferred.js.map +0 -1
  190. package/dist/cjs/newClasses/descriptor.js.map +0 -1
  191. package/dist/cjs/newClasses/iterable.js.map +0 -1
  192. package/dist/cjs/newClasses/refmap.js.map +0 -1
  193. package/dist/cjs/newClasses/refset.js.map +0 -1
  194. package/dist/cjs/objectextensions.d.ts +0 -11
  195. package/dist/cjs/objectextensions.js +0 -232
  196. package/dist/cjs/objectextensions.js.map +0 -1
  197. package/dist/cjs/reflectextensions.js +0 -111
  198. package/dist/cjs/reflectextensions.js.map +0 -1
  199. package/dist/cjs/setextensions.d.ts +0 -2
  200. package/dist/cjs/setextensions.js.map +0 -1
  201. package/dist/cjs/stringextensions.js +0 -158
  202. package/dist/cjs/stringextensions.js.map +0 -1
  203. package/dist/cjs/symbolextensions.js +0 -69
  204. package/dist/cjs/symbolextensions.js.map +0 -1
  205. package/dist/cjs/weakrefextensions.js.map +0 -1
  206. package/dist/mjs/arrayextensions.d.ts +0 -10
  207. package/dist/mjs/arrayextensions.js +0 -70
  208. package/dist/mjs/arrayextensions.js.map +0 -1
  209. package/dist/mjs/functionextensions.js +0 -199
  210. package/dist/mjs/functionextensions.js.map +0 -1
  211. package/dist/mjs/globals.js +0 -163
  212. package/dist/mjs/globals.js.map +0 -1
  213. package/dist/mjs/mapextensions.js +0 -29
  214. package/dist/mjs/mapextensions.js.map +0 -1
  215. package/dist/mjs/newClasses/asyncIterable.js.map +0 -1
  216. package/dist/mjs/newClasses/deferred.js.map +0 -1
  217. package/dist/mjs/newClasses/descriptor.js.map +0 -1
  218. package/dist/mjs/newClasses/iterable.js.map +0 -1
  219. package/dist/mjs/newClasses/refmap.js.map +0 -1
  220. package/dist/mjs/newClasses/refset.js.map +0 -1
  221. package/dist/mjs/objectextensions.d.ts +0 -11
  222. package/dist/mjs/objectextensions.js +0 -229
  223. package/dist/mjs/objectextensions.js.map +0 -1
  224. package/dist/mjs/reflectextensions.js +0 -108
  225. package/dist/mjs/reflectextensions.js.map +0 -1
  226. package/dist/mjs/setextensions.d.ts +0 -2
  227. package/dist/mjs/setextensions.js.map +0 -1
  228. package/dist/mjs/stringextensions.js +0 -155
  229. package/dist/mjs/stringextensions.js.map +0 -1
  230. package/dist/mjs/symbolextensions.js +0 -66
  231. package/dist/mjs/symbolextensions.js.map +0 -1
  232. package/dist/mjs/weakrefextensions.js.map +0 -1
  233. package/src/arrayextensions.js +0 -75
  234. package/src/functionextensions.js +0 -225
  235. package/src/globals.js +0 -196
  236. package/src/mapextensions.js +0 -32
  237. package/src/objectextensions.js +0 -256
  238. package/src/reflectextensions.js +0 -118
  239. package/src/stringextensions.js +0 -166
  240. package/src/symbolextensions.js +0 -69
  241. /package/dist/cjs/{newClasses → classes}/asyncIterable.d.ts +0 -0
  242. /package/dist/cjs/{newClasses → classes}/deferred.d.ts +0 -0
  243. /package/dist/cjs/{newClasses → classes}/descriptor.d.ts +0 -0
  244. /package/dist/cjs/{newClasses → classes}/iterable.d.ts +0 -0
  245. /package/dist/cjs/{newClasses → classes}/refmap.d.ts +0 -0
  246. /package/dist/cjs/{newClasses → classes}/refset.d.ts +0 -0
  247. /package/dist/cjs/{functionextensions.d.ts → function.extensions.d.ts} +0 -0
  248. /package/dist/cjs/{globals.d.ts → global.this.d.ts} +0 -0
  249. /package/dist/cjs/{reflectextensions.d.ts → reflect.extensions.d.ts} +0 -0
  250. /package/dist/cjs/{stringextensions.d.ts → string.extensions.d.ts} +0 -0
  251. /package/dist/cjs/{weakrefextensions.d.ts → weakref.extensions.d.ts} +0 -0
  252. /package/dist/mjs/{newClasses → classes}/asyncIterable.d.ts +0 -0
  253. /package/dist/mjs/{newClasses → classes}/asyncIterable.js +0 -0
  254. /package/dist/mjs/{newClasses → classes}/deferred.d.ts +0 -0
  255. /package/dist/mjs/{newClasses → classes}/deferred.js +0 -0
  256. /package/dist/mjs/{newClasses → classes}/descriptor.d.ts +0 -0
  257. /package/dist/mjs/{newClasses → classes}/iterable.d.ts +0 -0
  258. /package/dist/mjs/{newClasses → classes}/iterable.js +0 -0
  259. /package/dist/mjs/{newClasses → classes}/refmap.d.ts +0 -0
  260. /package/dist/mjs/{newClasses → classes}/refset.d.ts +0 -0
  261. /package/dist/mjs/{newClasses → classes}/refset.js +0 -0
  262. /package/dist/mjs/{functionextensions.d.ts → function.extensions.d.ts} +0 -0
  263. /package/dist/mjs/{globals.d.ts → global.this.d.ts} +0 -0
  264. /package/dist/mjs/{reflectextensions.d.ts → reflect.extensions.d.ts} +0 -0
  265. /package/dist/mjs/{stringextensions.d.ts → string.extensions.d.ts} +0 -0
  266. /package/dist/mjs/{weakrefextensions.d.ts → weakref.extensions.d.ts} +0 -0
  267. /package/src/{newClasses → classes}/asyncIterable.js +0 -0
  268. /package/src/{newClasses → classes}/deferred.js +0 -0
  269. /package/src/{newClasses → classes}/iterable.js +0 -0
  270. /package/src/{newClasses → classes}/refset.js +0 -0
  271. /package/src/{weakrefextensions.js → weakref.extensions.js} +0 -0
@@ -7,4 +7,5 @@
7
7
  * utility functions.
8
8
  */
9
9
  export const SymbolExtensions: Patch;
10
+ export const SymbolPrototypeExtensions: Patch;
10
11
  import { Patch } from '@nejs/extension';
@@ -0,0 +1,377 @@
1
+ import { Patch, PatchToggle } from '@nejs/extension';
2
+ import { Symkeys } from './classes/symkeys.js';
3
+ import { JSONExtensions } from './json.extensions.js';
4
+ const JSONToggle = new PatchToggle(JSONExtensions);
5
+ /**
6
+ * `SymbolExtensions` is a patch for the JavaScript built-in `Symbol` class. It
7
+ * adds utility methods to the `Symbol` class without modifying the global namespace
8
+ * directly. This patch includes methods for key validation, object type checking,
9
+ * and retrieving the string tag of an object. These methods are useful for
10
+ * enhancing the capabilities of the standard `Symbol` class with additional
11
+ * utility functions.
12
+ */
13
+ export const SymbolExtensions = new Patch(Symbol, {
14
+ add(named, associatedData = {}) {
15
+ return this.keys.add(named, associatedData);
16
+ },
17
+ deleteData(forSymbol, replaceWith = undefined) {
18
+ return this.keys.deleteData(forSymbol, replaceWith);
19
+ },
20
+ hasData(forSymbol) {
21
+ return this.keys.hasData(forSymbol);
22
+ },
23
+ /**
24
+ * The `isSymbol` method does exactly what one would it expect. It returns
25
+ * true if the string matches typeof or instanceof as a symbol.
26
+ *
27
+ * @param {*} value checks to see if the `value` is a string
28
+ * @returns {boolean} `true` if it is a `Symbol`, `false` otherwise
29
+ */
30
+ isSymbol(value) {
31
+ return value && (typeof value === 'symbol');
32
+ },
33
+ /**
34
+ * Returns true if the supplied value is a Symbol created using
35
+ * `Symbol.for()`.
36
+ *
37
+ * @param {any} value assumption is that the supplied value is of type
38
+ * 'symbol' however, unless `allowOnlySymbols` is set to `true`, `false`
39
+ * will be returned for any non-symbol values.
40
+ * @param {boolean} allowOnlySymbols true if an error should be thrown
41
+ * if the supplied value is not of type 'symbol'
42
+ * @returns true if the symbol is registered, meaning, none of the spec
43
+ * static symbols (`toStringTag`, `iterator`, etc...), and no symbols
44
+ * created by passing a value directly to the Symbol function, such as
45
+ * `Symbol('name')`
46
+ */
47
+ isRegistered(value, allowOnlySymbols = false) {
48
+ if (!Symbol.isSymbol(value)) {
49
+ if (allowOnlySymbols) {
50
+ throw new TypeError('allowOnlySymbols specified; value is not a symbol');
51
+ }
52
+ return false;
53
+ }
54
+ return Symbol.keyFor(value) !== undefined;
55
+ },
56
+ /**
57
+ * A function that returns true if the symbol is not registered, meaning,
58
+ * any of the spec static symbols (`toStringTag`, `iterator`, etc...), and
59
+ * any symbols created by passing a value directly to the `Symbol` function,
60
+ * such as `Symbol('name')`.
61
+ *
62
+ * @param {any} value assumption is that the supplied value is of type
63
+ * 'symbol' however, unless allowOnlySymbols is set to true, false will
64
+ * be returned for any non-symbol values.
65
+ * @param {boolean} allowOnlySymbols true if an error should be thrown
66
+ * if the supplied value is not of type 'symbol'
67
+ * @returns true if the symbol is not registered, meaning, any of the
68
+ * spec static symbols (`toStringTag`, `iterator`, etc...), and any symbols
69
+ * created by passing a value directly to the `Symbol` function, such as
70
+ * `Symbol('name')`
71
+ * @returns true if the `value` in question is both a `symbol` and has
72
+ * returns `undefined` if passed to `Symbol.keyFor`
73
+ */
74
+ isNonRegistered(value, allowOnlySymbols = false) {
75
+ return !Symbol.isRegistered(value, allowOnlySymbols);
76
+ },
77
+ /**
78
+ * `keys` is an instance of the `Symkeys` class, initialized with the
79
+ * domain 'nejs'. The `Symkeys` class provides a way to easily generate
80
+ * Symbol.for elements that follow particular pattern. Symkeys also
81
+ * allows associated data storage with each generated key.
82
+ *
83
+ * @type {Symkeys}
84
+ * @see {@link SymKeys}
85
+ * @example
86
+ * // Returns something like Symbol.for('@nejs.prototype #rwiy2o905d')
87
+ * const kOriginal = Symbol.keys.add('prototypes')
88
+ *
89
+ * // Which can be used to retrieve and fetch data associated with that key
90
+ * // The value stored is an array by default, but can be anything. It can
91
+ * // be accessed one property at a time
92
+ * Symbol.keys[kOriginal].original = Object.prototype
93
+ * Symbol.keys[kOriginal].modified = Object.create(Object.prototype, ...)
94
+ *
95
+ * // Or wholesale replaced
96
+ * Symbol.keys[kOriginal] = [Object.prototype, Array.prototype]
97
+ *
98
+ * // But if all Symbol Extensions are in place, including prototype add-ons
99
+ * kOriginal.data.original = Object.prototype // ...and...
100
+ * kOriginal.data = [Object.prototype, Array.prototype] // ...both work
101
+ */
102
+ keys: new Symkeys('nejs'),
103
+ setData(forSymbol, value) {
104
+ this.keys.setData(forSymbol, value);
105
+ },
106
+ /**
107
+ * Creates a new Symbol with the given name and optional data. If data
108
+ * is provided, it will be stringified and appended to the symbol's
109
+ * name. This method is useful for creating unique symbols that carry
110
+ * additional metadata.
111
+ *
112
+ * @param {string} name The name of the symbol.
113
+ * @param {*} [data] Optional data to be associated with the symbol.
114
+ * @returns {symbol} A new symbol created with Symbol.for(), using the
115
+ * provided name and stringified data (if provided).
116
+ *
117
+ * @example
118
+ * const symbolWithData = Symbol.withData('mySymbol', { foo: 'bar' })
119
+ * console.log(symbolWithData.toString())
120
+ * // Output: "Symbol(mySymbol {"foo":"bar"})"
121
+ *
122
+ * @example
123
+ * const symbolWithoutData = Symbol.withData('mySymbol')
124
+ * console.log(symbolWithoutData.toString())
125
+ * // Output: "Symbol(mySymbol)"
126
+ */
127
+ withData(name, data) {
128
+ return data !== undefined
129
+ ? Symbol.for(`${name} ${JSON.stringify(data)}`)
130
+ : Symbol.for(name);
131
+ },
132
+ });
133
+ export const SymbolPrototypeExtensions = new Patch(Symbol.prototype, {
134
+ [Patch.kMutablyHidden]: {
135
+ /**
136
+ * Returns an object representation of the symbol instance.
137
+ *
138
+ * This getter method creates and returns an object that wraps the
139
+ * symbol instance, allowing it to be treated as an object. The
140
+ * returned object is created using the `Object()` constructor,
141
+ * which takes the symbol instance as its argument.
142
+ *
143
+ * @type {Object}
144
+ * @readonly
145
+ *
146
+ * @example
147
+ * const sym = Symbol('example')
148
+ * console.log(typeof sym) // 'symbol'
149
+ * console.log(typeof sym.instance) // 'object'
150
+ */
151
+ get instance() {
152
+ return Object(this);
153
+ },
154
+ /**
155
+ * Getter method for retrieving the data associated with a symbol.
156
+ *
157
+ * This method first checks if the symbol is a Symkey created symbol
158
+ * by checking the existence of Symbol.keys and if the symbol's
159
+ * description matches the Symkey pattern. If it is a Symkey symbol,
160
+ * it attempts to fetch its associated data.
161
+ *
162
+ * NOTE: Symkey data is returned as its value directly, this is because
163
+ * it is stored in a {@link Map}. Embedded JSON data might be expensive
164
+ * to parse and as such a function is returned when data is accessed that
165
+ * needs to be invoked in order to decode its contents. See
166
+ * `{@link mightHaveEmbeddedJSON}` for more information.
167
+ *
168
+ * If the symbol is not a Symkey symbol or if no data is associated
169
+ * with it, the method attempts to parse the symbol's description as
170
+ * JSON and returns the first valid JSON object found.
171
+ *
172
+ * If no valid JSON object is found in the description, the method
173
+ * returns undefined.
174
+ *
175
+ * @type {Object|Function}
176
+ * @readonly
177
+ *
178
+ * @example
179
+ * const keys = new Symkeys
180
+ * const key = keys.add('example', {count: 0})
181
+ * const data = key.data // note this isn't function!!
182
+ * const count = data.count
183
+ *
184
+ * @example
185
+ * const sym = Symbol.for('fun {"name":"Brie"}')
186
+ * let json = sym.data() // {name: 'Brie'} JS object
187
+ *
188
+ * @example
189
+ * const sym = Symbol('mySymbol')
190
+ * let data = sym.data() // undefined
191
+ */
192
+ get data() {
193
+ if (Symbol?.keys && Symkeys.isSymkey(this)) {
194
+ const possibleData = Symbol.keys[this];
195
+ if (possibleData) {
196
+ return possibleData;
197
+ }
198
+ }
199
+ let result = undefined;
200
+ let revertToggle = false;
201
+ if (!JSONExtensions.applied) {
202
+ JSONToggle.start();
203
+ revertToggle = true;
204
+ }
205
+ if (JSON.mightContain(this.description)) {
206
+ try {
207
+ result = JSON.extractFrom(this.description);
208
+ }
209
+ catch (ignore) { }
210
+ }
211
+ if (revertToggle) {
212
+ JSONToggle.stop();
213
+ }
214
+ return result;
215
+ },
216
+ /**
217
+ * Sets the data associated with a symbol.
218
+ *
219
+ * This setter method checks if the symbol is a Symkey and if it has
220
+ * associated data. If both conditions are met, it sets the data of the
221
+ * symbol to the provided value and returns true. If the conditions are
222
+ * not met, it simply returns false.
223
+ *
224
+ * While Symbols have been upgraded to also support embedded JSON data
225
+ * with this extension, symbol descriptions are static. Non Symkey symbols
226
+ * do not associated their data outside of a symbol, and cannot be changed,
227
+ * there new data cannot be set on them.
228
+ *
229
+ * @param {any} value - The value to be set as the symbol's data.
230
+ * @returns {boolean} - Returns true if the data was successfully set,
231
+ * false otherwise.
232
+ *
233
+ * @example
234
+ * const sym = Symbol.for('fun {"name":"Brie"}')
235
+ * Symkeys.isSymkey(sym) // false; not in Symkey format
236
+ * let json = sym.data() // {name: 'Brie'} JS object
237
+ * sym.data = JSON.stringify({name: 'Jane'}) // fails silently
238
+ * json = sym.data() // {name: 'Brie'} is hard-coded in description
239
+ *
240
+ * @example
241
+ * const sym = Symbol('mySymbol')
242
+ * Symkeys.isSymkey(sym) // false; not in Symkey format
243
+ * Symkeys.hasData(sym) // false
244
+ * sym.data = { name: 'John', age: 30 } // will fail silently
245
+ * Symkeys.hasData(sym) // still false
246
+ *
247
+ * // Now let's create a Symkey with data
248
+ * const symWithData = Symkeys.create('mySymbolWithData',
249
+ * { name: 'Jane', age: 25 })
250
+ * Symkeys.isSymkey(symWithData) // true
251
+ * Symkeys.hasData(symWithData) // true
252
+ * symWithData.data = { name: 'Jane', age: 26 } // will succeed
253
+ * Symkeys.getData(symWithData) // returns { name: 'Jane', age: 26 }
254
+ */
255
+ set data(value) {
256
+ if (Symkeys.isSymkey(this) && Symkeys.hasData(this)) {
257
+ Symbol.keys.setData(this, value);
258
+ }
259
+ },
260
+ /**
261
+ * Checks if the symbol might have embedded JSON data.
262
+ *
263
+ * This getter method checks if the symbol's description might contain
264
+ * JSON data and if the data property of the symbol is a function. If both
265
+ * conditions are met, it returns true, otherwise it returns false.
266
+ *
267
+ * @returns {boolean} - Returns true if the symbol might have embedded
268
+ * JSON, false otherwise.
269
+ *
270
+ * @example
271
+ * const sym = Symbol.for('fun {"name":"Brie"}')
272
+ * console.log(sym.mightHaveEmbeddedJSON) // Output: true
273
+ *
274
+ * @example
275
+ * const sym = Symbol('mySymbol')
276
+ * console.log(sym.mightHaveEmbeddedJSON) // Output: false
277
+ */
278
+ get mightHaveEmbeddedJSON() {
279
+ return mightContain(this.description);
280
+ },
281
+ get sgrString() {
282
+ let revert = false;
283
+ let detail = undefined;
284
+ let { sgr } = String;
285
+ if (!sgr) {
286
+ sgr = (string, ...args) => string;
287
+ }
288
+ if (!JSONExtensions.applied) {
289
+ JSONToggle.start();
290
+ revert = true;
291
+ }
292
+ if ((detail = JSON.mightContain(this.description, true))) {
293
+ let jsonText = detail[2][0];
294
+ let index = detail[1];
295
+ if (~index && jsonText && jsonText.length > 30) {
296
+ let desc = this.description;
297
+ let newDescription = [
298
+ sgr(`Symbol.for(${desc.slice(0, index)}`, 'green'),
299
+ sgr(jsonText.slice(0, 10), 'di'),
300
+ '...',
301
+ sgr(jsonText.slice(-5), 'di'),
302
+ sgr(`${desc.slice(index + jsonText.length + 1)})`, 'green'),
303
+ ].join('');
304
+ if (revert) {
305
+ JSONToggle.stop();
306
+ }
307
+ return `${newDescription}`;
308
+ }
309
+ }
310
+ if (revert) {
311
+ JSONToggle.stop();
312
+ }
313
+ return newDescription;
314
+ },
315
+ /**
316
+ * Custom inspect method for Node.js util.inspect.
317
+ *
318
+ * NOTE: this will only apply if looking at an instance of Symbol,
319
+ * sadly; {@see SymbolPrototypeExtensions.instance}
320
+ *
321
+ * This method is used by Node.js util.inspect to provide a custom
322
+ * representation of the symbol when inspected. It checks if the
323
+ * symbol's description might contain JSON data and if so, it
324
+ * truncates the JSON data in the description to a maximum of 30
325
+ * characters and formats the output with colors using the `sgr`
326
+ * function from the `String` object.
327
+ *
328
+ * @param {number} depth - The current depth of the recursive
329
+ * inspection.
330
+ * @param {Object} options - The options object passed to
331
+ * util.inspect.
332
+ * @param {Function} inspect - The original util.inspect function.
333
+ *
334
+ * @returns {string} - The formatted representation of the symbol.
335
+ *
336
+ * @example
337
+ * const sym = Symbol.for('fun {"name":"John Doe"}')
338
+ * console.log(util.inspect(sym))
339
+ * // Output: Symbol.for(fun {"name":"John ...hn Doe"})
340
+ */
341
+ [Symbol.for('nodejs.util.inspect.custom')](depth, options, inspect) {
342
+ let revert = false;
343
+ let detail = undefined;
344
+ let { sgr } = String;
345
+ if (!sgr) {
346
+ sgr = (string, ...args) => string;
347
+ }
348
+ if (!JSONExtensions.applied) {
349
+ JSONToggle.start();
350
+ revert = true;
351
+ }
352
+ if ((detail = JSON.mightContain(this.description, true))) {
353
+ let jsonText = detail[2][0];
354
+ let index = detail[1];
355
+ if (~index && jsonText && jsonText.length > 30) {
356
+ let desc = this.description;
357
+ let newDescription = [
358
+ sgr(`Symbol.for(${desc.slice(0, index)}`, 'green'),
359
+ sgr(jsonText.slice(0, 10), 'di'),
360
+ '...',
361
+ sgr(jsonText.slice(-5), 'di'),
362
+ sgr(`${desc.slice(index + jsonText.length + 1)})`, 'green'),
363
+ ].join('');
364
+ if (revert) {
365
+ JSONToggle.stop();
366
+ }
367
+ return `${newDescription}`;
368
+ }
369
+ }
370
+ if (revert) {
371
+ JSONToggle.stop();
372
+ }
373
+ return inspect(this, { colors: true });
374
+ },
375
+ },
376
+ });
377
+ //# sourceMappingURL=symbol.extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol.extensions.js","sourceRoot":"","sources":["../../src/symbol.extensions.js"],"names":[],"mappings":"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"}
@@ -13,4 +13,4 @@ export const WeakRefExtensions = new Patch(WeakRef, {
13
13
  (value === null || value === undefined));
14
14
  },
15
15
  });
16
- //# sourceMappingURL=weakrefextensions.js.map
16
+ //# sourceMappingURL=weakref.extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weakref.extensions.js","sourceRoot":"","sources":["../../src/weakref.extensions.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;IAClD;;;;;;OAMG;IACH,gBAAgB,CAAC,KAAK;QACpB,OAAO,CAAC,CACN,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;YACjE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;YACxD,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CACxC,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}