@nejs/basic-extensions 2.6.0 → 2.8.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 +6129 -1574
  3. package/dist/@nejs/basic-extensions.bundle.2.7.0.js +19 -0
  4. package/dist/@nejs/basic-extensions.bundle.2.7.0.js.map +7 -0
  5. package/dist/cjs/array.extensions.d.ts +39 -0
  6. package/dist/cjs/array.extensions.js +303 -0
  7. package/dist/cjs/array.extensions.js.map +1 -0
  8. package/dist/cjs/big.int.extension.d.ts +31 -0
  9. package/dist/cjs/big.int.extension.js +164 -0
  10. package/dist/cjs/big.int.extension.js.map +1 -0
  11. package/dist/cjs/{newClasses → classes}/asyncIterable.js +32 -44
  12. package/dist/cjs/classes/asyncIterable.js.map +1 -0
  13. package/dist/cjs/{newClasses → classes}/deferred.js +66 -138
  14. package/dist/cjs/classes/deferred.js.map +1 -0
  15. package/dist/cjs/{newClasses → classes}/descriptor.js +56 -90
  16. package/dist/cjs/classes/descriptor.js.map +1 -0
  17. package/dist/cjs/classes/index.d.ts +13 -0
  18. package/dist/cjs/classes/index.js +57 -0
  19. package/dist/cjs/classes/index.js.map +1 -0
  20. package/dist/cjs/classes/introspector.d.ts +20 -0
  21. package/dist/cjs/classes/introspector.js +130 -0
  22. package/dist/cjs/classes/introspector.js.map +1 -0
  23. package/dist/cjs/{newClasses → classes}/iterable.js +42 -63
  24. package/dist/cjs/classes/iterable.js.map +1 -0
  25. package/dist/cjs/classes/param.parser.d.ts +227 -0
  26. package/dist/cjs/classes/param.parser.js +242 -0
  27. package/dist/cjs/classes/param.parser.js.map +1 -0
  28. package/dist/cjs/classes/pluggable.proxy.d.ts +152 -0
  29. package/dist/cjs/classes/pluggable.proxy.js +444 -0
  30. package/dist/cjs/classes/pluggable.proxy.js.map +1 -0
  31. package/dist/cjs/{newClasses → classes}/refmap.js +18 -30
  32. package/dist/cjs/classes/refmap.js.map +1 -0
  33. package/dist/cjs/{newClasses → classes}/refset.js +28 -47
  34. package/dist/cjs/classes/refset.js.map +1 -0
  35. package/dist/cjs/classes/symkeys.d.ts +292 -0
  36. package/dist/cjs/classes/symkeys.js +424 -0
  37. package/dist/cjs/classes/symkeys.js.map +1 -0
  38. package/dist/cjs/classes/type.d.ts +56 -0
  39. package/dist/cjs/classes/type.js +405 -0
  40. package/dist/cjs/classes/type.js.map +1 -0
  41. package/dist/cjs/function.extensions.js +757 -0
  42. package/dist/cjs/function.extensions.js.map +1 -0
  43. package/dist/cjs/global.this.js +261 -0
  44. package/dist/cjs/global.this.js.map +1 -0
  45. package/dist/cjs/index.d.ts +4 -3
  46. package/dist/cjs/index.js +62 -32
  47. package/dist/cjs/index.js.map +1 -1
  48. package/dist/cjs/json.extensions.d.ts +2 -0
  49. package/dist/cjs/json.extensions.js +107 -0
  50. package/dist/cjs/json.extensions.js.map +1 -0
  51. package/dist/{mjs/mapextensions.d.ts → cjs/map.extensions.d.ts} +1 -0
  52. package/dist/cjs/map.extensions.js +142 -0
  53. package/dist/cjs/map.extensions.js.map +1 -0
  54. package/dist/cjs/number.extension.d.ts +44 -0
  55. package/dist/cjs/number.extension.js +260 -0
  56. package/dist/cjs/number.extension.js.map +1 -0
  57. package/dist/cjs/object.extensions.d.ts +62 -0
  58. package/dist/cjs/object.extensions.js +1116 -0
  59. package/dist/cjs/object.extensions.js.map +1 -0
  60. package/dist/cjs/proxy.extensions.d.ts +2 -0
  61. package/dist/cjs/proxy.extensions.js +207 -0
  62. package/dist/cjs/proxy.extensions.js.map +1 -0
  63. package/dist/cjs/reflect.extensions.js +316 -0
  64. package/dist/cjs/reflect.extensions.js.map +1 -0
  65. package/dist/cjs/regular.expression.extensions.d.ts +2 -0
  66. package/dist/cjs/regular.expression.extensions.js +423 -0
  67. package/dist/cjs/regular.expression.extensions.js.map +1 -0
  68. package/dist/cjs/set.extensions.d.ts +40 -0
  69. package/dist/cjs/{setextensions.js → set.extensions.js} +150 -2
  70. package/dist/cjs/set.extensions.js.map +1 -0
  71. package/dist/cjs/string.extensions.js +471 -0
  72. package/dist/cjs/string.extensions.js.map +1 -0
  73. package/dist/{mjs/symbolextensions.d.ts → cjs/symbol.extensions.d.ts} +1 -0
  74. package/dist/cjs/symbol.extensions.js +259 -0
  75. package/dist/cjs/symbol.extensions.js.map +1 -0
  76. package/dist/cjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
  77. package/dist/cjs/weakref.extensions.js.map +1 -0
  78. package/dist/mjs/array.extensions.d.ts +39 -0
  79. package/dist/mjs/array.extensions.js +300 -0
  80. package/dist/mjs/array.extensions.js.map +1 -0
  81. package/dist/mjs/big.int.extension.d.ts +31 -0
  82. package/dist/mjs/big.int.extension.js +161 -0
  83. package/dist/mjs/big.int.extension.js.map +1 -0
  84. package/dist/mjs/classes/asyncIterable.js.map +1 -0
  85. package/dist/mjs/classes/deferred.js.map +1 -0
  86. package/dist/mjs/{newClasses → classes}/descriptor.js +7 -4
  87. package/dist/mjs/classes/descriptor.js.map +1 -0
  88. package/dist/mjs/classes/index.d.ts +13 -0
  89. package/dist/mjs/classes/index.js +40 -0
  90. package/dist/mjs/classes/index.js.map +1 -0
  91. package/dist/mjs/classes/introspector.d.ts +20 -0
  92. package/dist/mjs/classes/introspector.js +126 -0
  93. package/dist/mjs/classes/introspector.js.map +1 -0
  94. package/dist/mjs/classes/iterable.js.map +1 -0
  95. package/dist/mjs/classes/param.parser.d.ts +227 -0
  96. package/dist/mjs/classes/param.parser.js +238 -0
  97. package/dist/mjs/classes/param.parser.js.map +1 -0
  98. package/dist/mjs/classes/pluggable.proxy.d.ts +152 -0
  99. package/dist/mjs/classes/pluggable.proxy.js +438 -0
  100. package/dist/mjs/classes/pluggable.proxy.js.map +1 -0
  101. package/dist/mjs/{newClasses → classes}/refmap.js +3 -3
  102. package/dist/mjs/classes/refmap.js.map +1 -0
  103. package/dist/mjs/classes/refset.js.map +1 -0
  104. package/dist/mjs/classes/symkeys.d.ts +292 -0
  105. package/dist/mjs/classes/symkeys.js +420 -0
  106. package/dist/mjs/classes/symkeys.js.map +1 -0
  107. package/dist/mjs/classes/type.d.ts +56 -0
  108. package/dist/mjs/classes/type.js +401 -0
  109. package/dist/mjs/classes/type.js.map +1 -0
  110. package/dist/mjs/function.extensions.js +754 -0
  111. package/dist/mjs/function.extensions.js.map +1 -0
  112. package/dist/mjs/global.this.js +258 -0
  113. package/dist/mjs/global.this.js.map +1 -0
  114. package/dist/mjs/index.d.ts +4 -3
  115. package/dist/mjs/index.js +49 -19
  116. package/dist/mjs/index.js.map +1 -1
  117. package/dist/mjs/json.extensions.d.ts +2 -0
  118. package/dist/mjs/json.extensions.js +104 -0
  119. package/dist/mjs/json.extensions.js.map +1 -0
  120. package/dist/{cjs/mapextensions.d.ts → mjs/map.extensions.d.ts} +1 -0
  121. package/dist/mjs/map.extensions.js +139 -0
  122. package/dist/mjs/map.extensions.js.map +1 -0
  123. package/dist/mjs/number.extension.d.ts +44 -0
  124. package/dist/mjs/number.extension.js +257 -0
  125. package/dist/mjs/number.extension.js.map +1 -0
  126. package/dist/mjs/object.extensions.d.ts +62 -0
  127. package/dist/mjs/object.extensions.js +1112 -0
  128. package/dist/mjs/object.extensions.js.map +1 -0
  129. package/dist/mjs/proxy.extensions.d.ts +2 -0
  130. package/dist/mjs/proxy.extensions.js +204 -0
  131. package/dist/mjs/proxy.extensions.js.map +1 -0
  132. package/dist/mjs/reflect.extensions.js +313 -0
  133. package/dist/mjs/reflect.extensions.js.map +1 -0
  134. package/dist/mjs/regular.expression.extensions.d.ts +2 -0
  135. package/dist/mjs/regular.expression.extensions.js +420 -0
  136. package/dist/mjs/regular.expression.extensions.js.map +1 -0
  137. package/dist/mjs/set.extensions.d.ts +40 -0
  138. package/dist/mjs/{setextensions.js → set.extensions.js} +149 -1
  139. package/dist/mjs/set.extensions.js.map +1 -0
  140. package/dist/mjs/string.extensions.js +468 -0
  141. package/dist/mjs/string.extensions.js.map +1 -0
  142. package/dist/{cjs/symbolextensions.d.ts → mjs/symbol.extensions.d.ts} +1 -0
  143. package/dist/mjs/symbol.extensions.js +256 -0
  144. package/dist/mjs/symbol.extensions.js.map +1 -0
  145. package/dist/mjs/{weakrefextensions.js → weakref.extensions.js} +1 -1
  146. package/dist/mjs/weakref.extensions.js.map +1 -0
  147. package/docs/index.html +24045 -5805
  148. package/package.json +6 -4
  149. package/repl.bootstrap.js +21 -0
  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 +108 -0
  164. package/src/map.extensions.js +144 -0
  165. package/src/number.extension.js +273 -0
  166. package/src/object.extensions.js +1222 -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 +515 -0
  172. package/src/symbol.extensions.js +268 -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.5.0.js +0 -8
  178. package/dist/@nejs/basic-extensions.bundle.2.5.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
@@ -0,0 +1,485 @@
1
+ import { Extension } from '@nejs/extension'
2
+
3
+ const { toStringTag, hasInstance } = Symbol
4
+
5
+ export class ProxyHandlerResponse {
6
+ constructor(success = false, value = undefined, context = undefined) {
7
+ Object.assign(this, { succes, value, context })
8
+ }
9
+
10
+ /**
11
+ * A getter method for the toStringTag symbol.
12
+ * This method returns the name of the constructor of the instance.
13
+ * It is used to provide a custom string description of the object,
14
+ * which can be useful for debugging or logging purposes.
15
+ *
16
+ * @example
17
+ * const response = new ProxyHandlerResponse();
18
+ * console.log(response[Symbol.toStringTag]); // logs: "ProxyHandlerResponse"
19
+ *
20
+ * @returns {string} The name of the constructor of the instance.
21
+ */
22
+ get [toStringTag]() { return this.constructor.name }
23
+
24
+ /**
25
+ * This static method is a Symbol.hasInstance method implementation.
26
+ * It checks if the provided instance is an instance of the class.
27
+ * It does this by comparing the instance's toStringTag or constructor
28
+ * to the class's name or the class itself respectively.
29
+ *
30
+ * @param {Object} instance - The instance to check.
31
+ * @returns {boolean} True if the instance is of the class, false otherwise.
32
+ *
33
+ * @example
34
+ * // Assuming MyClass has implemented this method
35
+ * const myInstance = new MyClass();
36
+ * // logs: true
37
+ * console.log(MyClass[Symbol.hasInstance](myInstance));
38
+ */
39
+ static [hasInstance](instance) {
40
+ return (
41
+ instance?.[toStringTag] === this.name ||
42
+ instance?.constructor === this
43
+ )
44
+ }
45
+ }
46
+
47
+ export class ProxyHandler {
48
+ constructor(handler, type = ProxyHandler.type.get) {
49
+ this.handler = handler;
50
+ this.typeName = Array.isArray(type)
51
+ ? ProxyHandler.nameFromType(type) ?? 'get'
52
+ : String(type)
53
+ this.type = Array.isArray(type) ? type : ProxyHandler.type[type ?? 'get'];
54
+ }
55
+
56
+ invoke(...args) {
57
+ const context = {
58
+ defaultValue: Reflect[this.typeName](...args),
59
+ proxyHandler: this,
60
+ typeHandler: this.handler,
61
+ }
62
+
63
+ try {
64
+ const result = this.handler.apply(context, args)
65
+
66
+ if (!(result?.[Symbol.toStringTag] === ProxyHandler.ResponseType)) {
67
+ return ProxyHandler.response(!!result, result, context)
68
+ }
69
+
70
+ result.context = context
71
+
72
+ return result
73
+ }
74
+ catch (error) {
75
+ return ProxyHandler.response(false, error)
76
+ }
77
+ }
78
+
79
+ /**
80
+ * This static method is used to create a response object. The response
81
+ * object contains the success status, the value, and the context of the
82
+ * response. It also includes a getter for the Symbol.toStringTag property
83
+ * that returns the ResponseType of the ProxyHandler.
84
+ *
85
+ * @param {boolean} success - The success status of the response.
86
+ * @param {*} value - The value of the response.
87
+ * @param {Object} context - The context of the response.
88
+ * @returns {Object} The response object.
89
+ *
90
+ * @example
91
+ * // Create a response object
92
+ * const response = ProxyHandler.response(
93
+ * true, 'value', { key: 'context' }
94
+ * );
95
+ *
96
+ * // Output: { success: true, value: 'value', context: { key: 'context' },
97
+ * // [Symbol.toStringTag]: 'ProxyHandlerResponse' }
98
+ * console.log(response);
99
+ */
100
+ static response(success, value, context) {
101
+ return {
102
+ success, value, context,
103
+ get [Symbol.toStringTag]() { return this.ResponseType }
104
+ }
105
+ }
106
+
107
+ /**
108
+ * This static getter method is used to retrieve the response type
109
+ * of the ProxyHandler. It returns a string that represents the
110
+ * response type of the ProxyHandler.
111
+ *
112
+ * @property {function} ResponseType - A static getter method that
113
+ * returns the response type of the ProxyHandler.
114
+ * @returns {string} A string representing the response type of the
115
+ * ProxyHandler.
116
+ *
117
+ * @example
118
+ * // Get the response type of the ProxyHandler
119
+ * const responseType = ProxyHandler.ResponseType;
120
+ *
121
+ * // Output: 'ProxyHandlerResponse'
122
+ * console.log(responseType);
123
+ */
124
+ static get ResponseType() { return 'ProxyHandlerResponse' }
125
+
126
+ /**
127
+ * This static method is used to retrieve the name of a ProxyHandler type
128
+ * from a given array of arguments. If the array of arguments matches any
129
+ * of the ProxyHandler types, the name of that type is returned. If no
130
+ * match is found, or if the input is not an array, 'custom' is returned.
131
+ *
132
+ * @param {Array.<*>} proxyHandlerType - An array of arguments to match
133
+ * against the ProxyHandler types.
134
+ * @returns {string} The name of the matching ProxyHandler type, or 'custom'
135
+ * if no match is found.
136
+ *
137
+ * @example
138
+ * // Get the name of a type from its arguments
139
+ * const typeName = ProxyHandler.nameFromType(
140
+ * ['target', 'thisArg', 'argumentsList']
141
+ * );
142
+ *
143
+ * // Output: 'apply'
144
+ * console.log(typeName);
145
+ *
146
+ * @throws {TypeError} If ProxyHandler.type is undefined.
147
+ */
148
+ static nameFromType(proxyHandlerType) {
149
+ if (!Array.isArray(proxyHandlerType)) {
150
+ return 'custom'
151
+ }
152
+
153
+ const names = Object.entries(ProxyHandler.type)
154
+ for (const [name, args] of names) {
155
+ if (proxyHandlerType.every(element => ~args.indexOf(element))) {
156
+ return name
157
+ }
158
+ }
159
+
160
+ return 'custom'
161
+ }
162
+
163
+ /**
164
+ * This method is used to retrieve all the types of ProxyHandler available
165
+ * in the ProxyHandler.type object. It is useful when you need to iterate
166
+ * over all the types or when you need to check if a certain type exists.
167
+ *
168
+ * @property {function} typeNames - A static getter method that returns an
169
+ * array of keys from the ProxyHandler.type object.
170
+ * @returns {Array.<string>} An array of strings representing the keys of
171
+ * the ProxyHandler.type object.
172
+ *
173
+ * @example
174
+ * // Get all type names
175
+ * const types = ProxyHandler.typeNames;
176
+ *
177
+ * // Output: ['apply', 'construct', 'defineProperty', ...]
178
+ * console.log(types);
179
+ *
180
+ * @throws {TypeError} If ProxyHandler.type is undefined.
181
+ */
182
+ static get typeNames() {
183
+ return Object.keys(ProxyHandler.type)
184
+ }
185
+
186
+ /**
187
+ * A static getter method that returns an object containing keyed proxy
188
+ * trap types and their associated expected arguments list by name. A
189
+ * docstring description complete with url shortening links for each entry
190
+ * are provided (links go to the MDN documentation)
191
+ *
192
+ * @property {function} type - A static getter method that returns an object
193
+ * of ProxyHandler types.
194
+ * @returns {Object.<string, function>} An object where each key is a type
195
+ * name and each value is a function that returns an array of strings
196
+ * representing the arguments for that type.
197
+ *
198
+ * @example
199
+ * // Get the 'apply' type
200
+ * const applyType = ProxyHandler.type.apply;
201
+ *
202
+ * // Output: ['target', 'thisArg', 'argumentsList']
203
+ * console.log(applyType());
204
+ *
205
+ * @throws {TypeError} If ProxyHandler.type is undefined.
206
+ */
207
+ static get type() {
208
+ return {
209
+ /**
210
+ * The handler.apply() method is a trap for the [[Call]] object internal
211
+ * method, which is used by operations such as function calls.
212
+ * MDN link: https://t.ly/orBsG
213
+ */
214
+ get apply() { return ['target', 'thisArg', 'argumentsList'] },
215
+
216
+ /**
217
+ * The handler.construct() method is a trap for the [[Construct]] object
218
+ * internal method, which is used by operations such as the new operator.
219
+ * In order for the new operation to be valid on the resulting Proxy
220
+ * object, the target used to initialize the proxy must itself be a
221
+ * valid constructor.
222
+ * MDN link: https://t.ly/1LukS
223
+ */
224
+ get construct() { return ['target', 'args'] },
225
+
226
+ /**
227
+ * The handler.defineProperty() method is a trap for the
228
+ * [[DefineOwnProperty]] object internal method, which is used by
229
+ * operations such as Object.defineProperty().
230
+ * MDN link: https://t.ly/3Ml9y
231
+ */
232
+ get defineProperty() { return ['target', 'key', 'descriptor'] },
233
+
234
+ /**
235
+ * The handler.deleteProperty() method is a trap for the [[Delete]]
236
+ * object internal method, which is used by operations such as the
237
+ * delete operator.
238
+ * MDN link: https://t.ly/neu2H
239
+ */
240
+ get deleteProperty() { return ['target', 'property'] },
241
+
242
+ /**
243
+ * The handler.get() method is a trap for the [[Get]] object internal
244
+ * method, which is used by operations such as property accessors.
245
+ * MDN link: https://t.ly/E419x
246
+ */
247
+ get get() { return ['target', 'property', 'receiver'] },
248
+
249
+ /**
250
+ * The handler.getOwnPropertyDescriptor() method is a trap for the
251
+ * [[GetOwnProperty]] object internal method, which is used by operations
252
+ * such as Object.getOwnPropertyDescriptor().
253
+ * MDN link: https://t.ly/wzPTX
254
+ */
255
+ get getOwnPropertyDescriptor() { return ['target', 'property'] },
256
+
257
+ /**
258
+ * The handler.getPrototypeOf() method is a trap for the
259
+ * [[GetPrototypeOf]] object internal method, which is used by operations
260
+ * such as Object.getPrototypeOf().
261
+ * MDN link: https://t.ly/Ww4S1
262
+ */
263
+ get getPrototypeOf() { return ['target'] },
264
+
265
+ /**
266
+ * The handler.has() method is a trap for the [[HasProperty]] object
267
+ * internal method, which is used by operations such as the in operator.
268
+ * MDN link: https://t.ly/UcJL-
269
+ */
270
+ get has() { return ['target', 'prototype'] },
271
+
272
+ /**
273
+ * The handler.isExtensible() method is a trap for the [[IsExtensible]]
274
+ * object internal method, which is used by operations such as
275
+ * Object.isExtensible().
276
+ * MDN link: https://t.ly/MkdIK
277
+ */
278
+ get isExtensible() { return ['target'] },
279
+
280
+ /**
281
+ * The handler.ownKeys() method is a trap for the [[OwnPropertyKeys]]
282
+ * object internal method, which is used by operations such as
283
+ * Object.keys(), Reflect.ownKeys(), etc.
284
+ * MDN link: https://t.ly/QkiTI
285
+ */
286
+ get ownKeys() { return ['target'] },
287
+
288
+ /**
289
+ * The handler.preventExtensions() method is a trap for the
290
+ * [[PreventExtensions]] object internal method, which is used by
291
+ * operations such as Object.preventExtensions().
292
+ * MDN link: https://t.ly/nvfjJ
293
+ */
294
+ get preventExtensions() { return ['target'] },
295
+
296
+ /**
297
+ * The handler.set() method is a trap for the [[Set]] object internal
298
+ * method, which is used by operations such as using property accessors
299
+ * to set a property's value.
300
+ * MDN link: https://t.ly/FDWcl
301
+ */
302
+ get set() { return ['target', 'property', 'value', 'receiver'] },
303
+
304
+ /**
305
+ * The handler.setPrototypeOf() method is a trap for the
306
+ * [[SetPrototypeOf]] object internal method, which is used by operations
307
+ * such as Object.setPrototypeOf().
308
+ * MDN link: https://t.ly/pS8ej
309
+ */
310
+ get setPrototypeOf() { return ['target', 'prototype'] },
311
+ }
312
+ }
313
+ }
314
+
315
+ export class PluggableProxy {
316
+ constructor(Class, handlers, options = {
317
+ prototype: undefined, // undefined means extract from class
318
+ apply: true,
319
+ }) {
320
+ const validHandlers = handlers.filter(h => h instanceof ProxyHandler)
321
+
322
+ Object.assign(this, {
323
+ class: Class instanceof Function ? Class : Class.constructor,
324
+ instance: Class instanceof Function ? null : Class,
325
+ })
326
+
327
+ this.handlers = new Map()
328
+
329
+ for (let typeName of ProxyHandler.typeNames) {
330
+ const handlersOfType = [].concat(
331
+ validHandlers.filter(h => h.typeName === typeName)
332
+ )
333
+
334
+ this.handlers.set(typeName, handlersOfType)
335
+ }
336
+
337
+ this[PluggableProxy.kOriginal] = (
338
+ options?.prototype ?? Object.getPrototypeOf(this.class)
339
+ )
340
+
341
+ this[PluggableProxy.kCreated] = Object.create(
342
+ this[PluggableProxy.kOriginal],
343
+ this.instance,
344
+ )
345
+
346
+ this[PluggableProxy.kProxy] = new Proxy(this[PluggableProxy.kCreated], this)
347
+
348
+ if (options?.apply != true) {
349
+ const target = this?.instance ?? this.class
350
+ Object.setPrototypeOf(target, this[PluggableProxy.kCreated])
351
+ }
352
+ }
353
+
354
+ handlersOfType(typeName) {
355
+ return this.handlers.get(typeName)
356
+ }
357
+
358
+ tryEachOfType(type, ...args) {
359
+ const types = ProxyHandler.typeNames
360
+ const failures = []
361
+
362
+ for (const handler of types) {
363
+ const result = handler.invoke(...args)
364
+ if (result.success) {
365
+ return [result, failures]
366
+ }
367
+ failures.push(result)
368
+ }
369
+
370
+ return [undefined, failures]
371
+ }
372
+
373
+ apply(target, thisArg, argumentsList) {
374
+ const type = 'apply', args = [target, thisArg, argumentsList]
375
+ const [result, _fails] = tryEachOfType(type, ...args)
376
+ if (result) { return result }
377
+ return Reflect[type](...args)
378
+ }
379
+
380
+ construct(target, args) {
381
+ const type = 'construct', _args = [target, args]
382
+ const [result, _fails] = tryEachOfType(type, ..._args)
383
+ if (result) { return result }
384
+ return Reflect[type](..._args)
385
+ }
386
+
387
+ defineProperty(target, key, descriptor) {
388
+ const type = 'defineProperty', args = [target, key, descriptor]
389
+ const [result, _fails] = tryEachOfType(type, ...args)
390
+ if (result) { return result }
391
+ return Reflect[type](...args)
392
+ }
393
+
394
+ deleteProperty(target, property) {
395
+ const type = 'deleteProperty', args = [target, property]
396
+ const [result, _fails] = tryEachOfType(type, ...args)
397
+ if (result) { return result }
398
+ return Reflect[type](...args)
399
+ }
400
+
401
+ get(target, property, receiver) {
402
+ const type = 'get', args = [target, property, receiver]
403
+ const [result, _fails] = tryEachOfType(type, ...args)
404
+ if (result) { return result }
405
+ return Reflect[type](...args)
406
+ }
407
+
408
+ getOwnPropertyDescriptor(target, property) {
409
+ const type = 'getOwnPropertyDescriptor', args = [target, property]
410
+ const [result, _fails] = tryEachOfType(type, ...args)
411
+ if (result) { return result }
412
+ return Reflect[type](...args)
413
+ }
414
+
415
+ getPrototypeOf(target) {
416
+ const type = 'getPrototypeOf', args = [target]
417
+ const [result, _fails] = tryEachOfType(type, ...args)
418
+ if (result) { return result }
419
+ return Reflect[type](...args)
420
+ }
421
+
422
+ has(target, property) {
423
+ const type = 'has', args = [target, property]
424
+ const [result, _fails] = tryEachOfType(type, ...args)
425
+ if (result) { return result }
426
+ return Reflect[type](...args)
427
+ }
428
+
429
+ isExtensible(target) {
430
+ const type = 'isExtensible', args = [target]
431
+ const [result, _fails] = tryEachOfType(type, ...args)
432
+ if (result) { return result }
433
+ return Reflect[type](...args)
434
+ }
435
+
436
+ ownKeys(target) {
437
+ const type = 'ownKeys', args = [target]
438
+ const [result, _fails] = tryEachOfType(type, ...args)
439
+ if (result) { return result }
440
+ return Reflect[type](...args)
441
+ }
442
+
443
+ preventExtensions(target) {
444
+ const type = 'preventExtensions', args = [target]
445
+ const [result, _fails] = tryEachOfType(type, ...args)
446
+ if (result) { return result }
447
+ return Reflect[type](...args)
448
+ }
449
+
450
+ set(target, property, value, receiver) {
451
+ const type = 'set', args = [target, property, value, receiver]
452
+ const [result, _fails] = tryEachOfType(type, ...args)
453
+ if (result) { return result }
454
+ return Reflect[type](...args)
455
+ }
456
+
457
+ setPrototypeOf(target, prototype) {
458
+ const type = 'setPrototypeOf', args = [target, prototype]
459
+ const [result, _fails] = tryEachOfType(type, ...args)
460
+ if (result) { return result }
461
+ return Reflect[type](...args)
462
+ }
463
+
464
+ static get kCreated() {
465
+ return Symbol.for('pp.prototype.created')
466
+ }
467
+
468
+ static get kOriginal() {
469
+ return Symbol.for('pp.prototype.original')
470
+ }
471
+
472
+ static get kProxy() {
473
+ return Symbol.for('pp.proxy')
474
+ }
475
+ }
476
+
477
+ export const ProxyHandlerExtensions = new Extension(ProxyHandler)
478
+ export const PluggableProxyExtensions = new Extension(PluggableProxy)
479
+
480
+
481
+ export const PluggableProxyExtensionSet = new Extension.ExtensionSet(
482
+ 'PluggableProxyExtensionSet',
483
+ ProxyHandlerExtensions,
484
+ PluggableProxyExtensions
485
+ )
@@ -1,7 +1,9 @@
1
1
  import { Extension } from '@nejs/extension'
2
- import { ObjectExtensions } from '../objectextensions.js'
3
- import { SymbolExtensions } from '../symbolextensions.js'
4
- import { WeakRefExtensions } from '../weakrefextensions.js'
2
+
3
+ import { ObjectExtensions } from '../object.extensions.js'
4
+ import { SymbolExtensions } from '../symbol.extensions.js'
5
+ import { WeakRefExtensions } from '../weakref.extensions.js'
6
+
5
7
  import { Iterable, Iterator } from './iterable.js'
6
8
 
7
9
  const { isObject, isNullDefined, isValidKey } = ObjectExtensions.patches