@zk-tech/bedrock 0.0.1

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 (390) hide show
  1. package/README.md +24 -0
  2. package/dist/array/index.cjs +22 -0
  3. package/dist/array/index.cjs.map +1 -0
  4. package/dist/array/index.d.cts +13 -0
  5. package/dist/array/index.d.ts +13 -0
  6. package/dist/array/index.js +19 -0
  7. package/dist/array/index.js.map +1 -0
  8. package/dist/assert/index.cjs +29 -0
  9. package/dist/assert/index.cjs.map +1 -0
  10. package/dist/assert/index.d.cts +25 -0
  11. package/dist/assert/index.d.ts +25 -0
  12. package/dist/assert/index.js +24 -0
  13. package/dist/assert/index.js.map +1 -0
  14. package/dist/async/index.cjs +746 -0
  15. package/dist/async/index.cjs.map +1 -0
  16. package/dist/async/index.d.cts +47 -0
  17. package/dist/async/index.d.ts +47 -0
  18. package/dist/async/index.js +738 -0
  19. package/dist/async/index.js.map +1 -0
  20. package/dist/barrier-316Xonfd.d.cts +18 -0
  21. package/dist/barrier-316Xonfd.d.ts +18 -0
  22. package/dist/byte/index.cjs +59 -0
  23. package/dist/byte/index.cjs.map +1 -0
  24. package/dist/byte/index.d.cts +12 -0
  25. package/dist/byte/index.d.ts +12 -0
  26. package/dist/byte/index.js +49 -0
  27. package/dist/byte/index.js.map +1 -0
  28. package/dist/cache/index.cjs +418 -0
  29. package/dist/cache/index.cjs.map +1 -0
  30. package/dist/cache/index.d.cts +40 -0
  31. package/dist/cache/index.d.ts +40 -0
  32. package/dist/cache/index.js +415 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/cancellation-BIIv2UJm.d.cts +25 -0
  35. package/dist/cancellation-ClqPPsV1.d.ts +25 -0
  36. package/dist/context/index.cjs +59 -0
  37. package/dist/context/index.cjs.map +1 -0
  38. package/dist/context/index.d.cts +33 -0
  39. package/dist/context/index.d.ts +33 -0
  40. package/dist/context/index.js +51 -0
  41. package/dist/context/index.js.map +1 -0
  42. package/dist/di/index.cjs +1965 -0
  43. package/dist/di/index.cjs.map +1 -0
  44. package/dist/di/index.d.cts +140 -0
  45. package/dist/di/index.d.ts +140 -0
  46. package/dist/di/index.js +1949 -0
  47. package/dist/di/index.js.map +1 -0
  48. package/dist/disposable-t-B15Nu57y.d.ts +93 -0
  49. package/dist/disposable-t-CVsiyHPL.d.cts +93 -0
  50. package/dist/dispose/index.cjs +356 -0
  51. package/dist/dispose/index.cjs.map +1 -0
  52. package/dist/dispose/index.d.cts +26 -0
  53. package/dist/dispose/index.d.ts +26 -0
  54. package/dist/dispose/index.js +340 -0
  55. package/dist/dispose/index.js.map +1 -0
  56. package/dist/dispose-base-CAeXDpjg.d.cts +6 -0
  57. package/dist/dispose-base-CAeXDpjg.d.ts +6 -0
  58. package/dist/emitter-CAfCtSTg.d.cts +35 -0
  59. package/dist/emitter-DeM5mlEm.d.ts +35 -0
  60. package/dist/error/index.cjs +145 -0
  61. package/dist/error/index.cjs.map +1 -0
  62. package/dist/error/index.d.cts +45 -0
  63. package/dist/error/index.d.ts +45 -0
  64. package/dist/error/index.js +126 -0
  65. package/dist/error/index.js.map +1 -0
  66. package/dist/error-base-B4zaiJ5m.d.cts +32 -0
  67. package/dist/error-base-B4zaiJ5m.d.ts +32 -0
  68. package/dist/event/index.cjs +550 -0
  69. package/dist/event/index.cjs.map +1 -0
  70. package/dist/event/index.d.cts +139 -0
  71. package/dist/event/index.d.ts +139 -0
  72. package/dist/event/index.js +538 -0
  73. package/dist/event/index.js.map +1 -0
  74. package/dist/function/index.cjs +132 -0
  75. package/dist/function/index.cjs.map +1 -0
  76. package/dist/function/index.d.cts +26 -0
  77. package/dist/function/index.d.ts +26 -0
  78. package/dist/function/index.js +129 -0
  79. package/dist/function/index.js.map +1 -0
  80. package/dist/graph-BGbNOniY.d.cts +23 -0
  81. package/dist/graph-BGbNOniY.d.ts +23 -0
  82. package/dist/hash/index.cjs +54 -0
  83. package/dist/hash/index.cjs.map +1 -0
  84. package/dist/hash/index.d.cts +5 -0
  85. package/dist/hash/index.d.ts +5 -0
  86. package/dist/hash/index.js +50 -0
  87. package/dist/hash/index.js.map +1 -0
  88. package/dist/instantiation-service.interface-CVFMBUUD.d.cts +78 -0
  89. package/dist/instantiation-service.interface-CVFMBUUD.d.ts +78 -0
  90. package/dist/json/index.cjs +28 -0
  91. package/dist/json/index.cjs.map +1 -0
  92. package/dist/json/index.d.cts +8 -0
  93. package/dist/json/index.d.ts +8 -0
  94. package/dist/json/index.js +26 -0
  95. package/dist/json/index.js.map +1 -0
  96. package/dist/launch/index.cjs +213 -0
  97. package/dist/launch/index.cjs.map +1 -0
  98. package/dist/launch/index.d.cts +46 -0
  99. package/dist/launch/index.d.ts +46 -0
  100. package/dist/launch/index.js +211 -0
  101. package/dist/launch/index.js.map +1 -0
  102. package/dist/linked-list-CUkue5DZ.d.cts +24 -0
  103. package/dist/linked-list-CUkue5DZ.d.ts +24 -0
  104. package/dist/lock/index.cjs +662 -0
  105. package/dist/lock/index.cjs.map +1 -0
  106. package/dist/lock/index.d.cts +145 -0
  107. package/dist/lock/index.d.ts +145 -0
  108. package/dist/lock/index.js +656 -0
  109. package/dist/lock/index.js.map +1 -0
  110. package/dist/lodash-es/index.cjs +14 -0
  111. package/dist/lodash-es/index.cjs.map +1 -0
  112. package/dist/lodash-es/index.d.cts +1 -0
  113. package/dist/lodash-es/index.d.ts +1 -0
  114. package/dist/lodash-es/index.js +3 -0
  115. package/dist/lodash-es/index.js.map +1 -0
  116. package/dist/math/index.cjs +161 -0
  117. package/dist/math/index.cjs.map +1 -0
  118. package/dist/math/index.d.cts +76 -0
  119. package/dist/math/index.d.ts +76 -0
  120. package/dist/math/index.js +156 -0
  121. package/dist/math/index.js.map +1 -0
  122. package/dist/network/index.cjs +91 -0
  123. package/dist/network/index.cjs.map +1 -0
  124. package/dist/network/index.d.cts +62 -0
  125. package/dist/network/index.d.ts +62 -0
  126. package/dist/network/index.js +82 -0
  127. package/dist/network/index.js.map +1 -0
  128. package/dist/objects/index.cjs +80 -0
  129. package/dist/objects/index.cjs.map +1 -0
  130. package/dist/objects/index.d.cts +11 -0
  131. package/dist/objects/index.d.ts +11 -0
  132. package/dist/objects/index.js +77 -0
  133. package/dist/objects/index.js.map +1 -0
  134. package/dist/platform/index.cjs +62 -0
  135. package/dist/platform/index.cjs.map +1 -0
  136. package/dist/platform/index.d.cts +21 -0
  137. package/dist/platform/index.d.ts +21 -0
  138. package/dist/platform/index.js +48 -0
  139. package/dist/platform/index.js.map +1 -0
  140. package/dist/promise/index.cjs +639 -0
  141. package/dist/promise/index.cjs.map +1 -0
  142. package/dist/promise/index.d.cts +63 -0
  143. package/dist/promise/index.d.ts +63 -0
  144. package/dist/promise/index.js +633 -0
  145. package/dist/promise/index.js.map +1 -0
  146. package/dist/scheduler/index.cjs +599 -0
  147. package/dist/scheduler/index.cjs.map +1 -0
  148. package/dist/scheduler/index.d.cts +57 -0
  149. package/dist/scheduler/index.d.ts +57 -0
  150. package/dist/scheduler/index.js +594 -0
  151. package/dist/scheduler/index.js.map +1 -0
  152. package/dist/sprintf/index.cjs +101 -0
  153. package/dist/sprintf/index.cjs.map +1 -0
  154. package/dist/sprintf/index.d.cts +3 -0
  155. package/dist/sprintf/index.d.ts +3 -0
  156. package/dist/sprintf/index.js +99 -0
  157. package/dist/sprintf/index.js.map +1 -0
  158. package/dist/structure/index.cjs +300 -0
  159. package/dist/structure/index.cjs.map +1 -0
  160. package/dist/structure/index.d.cts +21 -0
  161. package/dist/structure/index.d.ts +21 -0
  162. package/dist/structure/index.js +296 -0
  163. package/dist/structure/index.js.map +1 -0
  164. package/dist/type/index.cjs +4 -0
  165. package/dist/type/index.cjs.map +1 -0
  166. package/dist/type/index.d.cts +20 -0
  167. package/dist/type/index.d.ts +20 -0
  168. package/dist/type/index.js +3 -0
  169. package/dist/type/index.js.map +1 -0
  170. package/dist/undo-redo-stack/index.cjs +545 -0
  171. package/dist/undo-redo-stack/index.cjs.map +1 -0
  172. package/dist/undo-redo-stack/index.d.cts +130 -0
  173. package/dist/undo-redo-stack/index.d.ts +130 -0
  174. package/dist/undo-redo-stack/index.js +542 -0
  175. package/dist/undo-redo-stack/index.js.map +1 -0
  176. package/dist/uuid/index.cjs +67 -0
  177. package/dist/uuid/index.cjs.map +1 -0
  178. package/dist/uuid/index.d.cts +17 -0
  179. package/dist/uuid/index.d.ts +17 -0
  180. package/dist/uuid/index.js +61 -0
  181. package/dist/uuid/index.js.map +1 -0
  182. package/dist/worker/index.cjs +271 -0
  183. package/dist/worker/index.cjs.map +1 -0
  184. package/dist/worker/index.d.cts +66 -0
  185. package/dist/worker/index.d.ts +66 -0
  186. package/dist/worker/index.js +267 -0
  187. package/dist/worker/index.js.map +1 -0
  188. package/package.json +285 -0
  189. package/src/_internal/logger.ts +59 -0
  190. package/src/array/array.test.ts +35 -0
  191. package/src/array/array.ts +25 -0
  192. package/src/array/index.ts +1 -0
  193. package/src/assert/assert.test.ts +86 -0
  194. package/src/assert/assert.ts +42 -0
  195. package/src/assert/index.ts +2 -0
  196. package/src/async/barrier.test.ts +90 -0
  197. package/src/async/barrier.ts +58 -0
  198. package/src/async/cancellation.test.ts +85 -0
  199. package/src/async/cancellation.ts +193 -0
  200. package/src/async/index.ts +18 -0
  201. package/src/async/queue/queue.test.ts +70 -0
  202. package/src/async/queue/queue.ts +56 -0
  203. package/src/async/queue/task.test.ts +155 -0
  204. package/src/async/queue/task.ts +67 -0
  205. package/src/async/utils.test.ts +28 -0
  206. package/src/async/utils.ts +8 -0
  207. package/src/async/wait.ts +9 -0
  208. package/src/byte/format.test.ts +64 -0
  209. package/src/byte/format.ts +44 -0
  210. package/src/byte/index.ts +2 -0
  211. package/src/byte/node_modules/.vitest/results.json +1 -0
  212. package/src/byte/var.ts +11 -0
  213. package/src/cache/index.ts +2 -0
  214. package/src/cache/lru-with-timeout.test.ts +88 -0
  215. package/src/cache/lru-with-timeout.ts +85 -0
  216. package/src/cache/lru.test.ts +56 -0
  217. package/src/cache/lru.ts +59 -0
  218. package/src/context/context.test.ts +17 -0
  219. package/src/context/context.ts +60 -0
  220. package/src/context/index.ts +8 -0
  221. package/src/di/base.ts +73 -0
  222. package/src/di/container-service.test.ts +179 -0
  223. package/src/di/context.web.tsx +41 -0
  224. package/src/di/descriptor.ts +31 -0
  225. package/src/di/idle-value.test.ts +73 -0
  226. package/src/di/idle-value.ts +63 -0
  227. package/src/di/index.common.ts +32 -0
  228. package/src/di/index.ts +2 -0
  229. package/src/di/instantiation-service.interface.ts +46 -0
  230. package/src/di/instantiation-service.test.ts +337 -0
  231. package/src/di/instantiation-service.ts +468 -0
  232. package/src/di/lazy/foo.mock.ts +28 -0
  233. package/src/di/lazy/idle-load.ts +39 -0
  234. package/src/di/lazy/index.ts +4 -0
  235. package/src/di/lazy/lazy-service.test.ts +65 -0
  236. package/src/di/lazy/lazy-service.ts +71 -0
  237. package/src/di/lazy/type.ts +5 -0
  238. package/src/di/node_modules/.vitest/results.json +1 -0
  239. package/src/di/proxy-builder.test.ts +45 -0
  240. package/src/di/proxy-builder.ts +38 -0
  241. package/src/di/service-collection.test.ts +27 -0
  242. package/src/di/service-collection.ts +46 -0
  243. package/src/di/service-ownership-collection.test.ts +39 -0
  244. package/src/di/service-ownership-collection.ts +38 -0
  245. package/src/di/service-registry.test.ts +66 -0
  246. package/src/di/service-registry.ts +99 -0
  247. package/src/di/trace.ts +85 -0
  248. package/src/dispose/disposable-store.test.ts +57 -0
  249. package/src/dispose/disposable-store.ts +80 -0
  250. package/src/dispose/disposable-t.test.ts +123 -0
  251. package/src/dispose/disposable-t.ts +238 -0
  252. package/src/dispose/disposable-utils.test.ts +15 -0
  253. package/src/dispose/disposable-utils.ts +28 -0
  254. package/src/dispose/dispose-base.ts +9 -0
  255. package/src/dispose/index.ts +34 -0
  256. package/src/dispose/logger.test.ts +65 -0
  257. package/src/dispose/logger.ts +39 -0
  258. package/src/dispose/timer.test.ts +30 -0
  259. package/src/dispose/timer.ts +16 -0
  260. package/src/dispose/tracker.test.ts +51 -0
  261. package/src/dispose/tracker.ts +105 -0
  262. package/src/error/error-base.ts +45 -0
  263. package/src/error/error-code.ts +39 -0
  264. package/src/error/error-const.test.ts +30 -0
  265. package/src/error/error-const.ts +16 -0
  266. package/src/error/error-or.test.ts +44 -0
  267. package/src/error/error-or.ts +2 -0
  268. package/src/error/error-t.test.ts +116 -0
  269. package/src/error/error-t.ts +100 -0
  270. package/src/error/index.ts +24 -0
  271. package/src/error/node_modules/.vitest/results.json +1 -0
  272. package/src/event/disposable-linked-list.ts +29 -0
  273. package/src/event/emitter.test.ts +191 -0
  274. package/src/event/emitter.ts +162 -0
  275. package/src/event/error-handler.ts +22 -0
  276. package/src/event/index.ts +34 -0
  277. package/src/event/once.ts +29 -0
  278. package/src/event/phase-emitter.test.ts +212 -0
  279. package/src/event/phase-emitter.ts +209 -0
  280. package/src/event/shortcut-event-utils.ts +33 -0
  281. package/src/event/utils.ts +6 -0
  282. package/src/event/when.ts +40 -0
  283. package/src/function/debounce.test.ts +274 -0
  284. package/src/function/debounce.ts +168 -0
  285. package/src/function/index.ts +2 -0
  286. package/src/function/node_modules/.vitest/results.json +1 -0
  287. package/src/function/throttle.test.ts +179 -0
  288. package/src/function/throttle.ts +26 -0
  289. package/src/hash/hash-t.test.ts +100 -0
  290. package/src/hash/hash-t.ts +51 -0
  291. package/src/hash/index.ts +3 -0
  292. package/src/json/index.ts +1 -0
  293. package/src/json/node_modules/.vitest/results.json +1 -0
  294. package/src/json/parse.ts +19 -0
  295. package/src/launch/abstract-job.ts +45 -0
  296. package/src/launch/cost-recorder.ts +22 -0
  297. package/src/launch/index.ts +2 -0
  298. package/src/launch/job-scheduler.test.ts +122 -0
  299. package/src/launch/job-scheduler.ts +118 -0
  300. package/src/launch/node_modules/.vitest/deps/_metadata.json +8 -0
  301. package/src/launch/node_modules/.vitest/deps/package.json +3 -0
  302. package/src/launch/node_modules/.vitest/results.json +1 -0
  303. package/src/lock/README.md +11 -0
  304. package/src/lock/capability.test.ts +110 -0
  305. package/src/lock/capability.ts +89 -0
  306. package/src/lock/index.ts +15 -0
  307. package/src/lock/node_modules/.vitest/results.json +1 -0
  308. package/src/lock/semaphore.ts +21 -0
  309. package/src/lock/shared-mutex.test.ts +537 -0
  310. package/src/lock/shared-mutex.ts +242 -0
  311. package/src/lock/utils.test.ts +165 -0
  312. package/src/lock/utils.ts +135 -0
  313. package/src/lodash-es/index.ts +1 -0
  314. package/src/math/degree.ts +16 -0
  315. package/src/math/index.ts +7 -0
  316. package/src/math/math.test.ts +40 -0
  317. package/src/math/math.ts +64 -0
  318. package/src/math/node_modules/.vitest/results.json +1 -0
  319. package/src/math/vector.test.ts +73 -0
  320. package/src/math/vector.ts +114 -0
  321. package/src/network/client.interface.ts +104 -0
  322. package/src/network/client.web.ts +24 -0
  323. package/src/network/index.common.ts +10 -0
  324. package/src/network/index.ts +2 -0
  325. package/src/network/plugins/retry.ts +98 -0
  326. package/src/objects/deep-clone.test.ts +40 -0
  327. package/src/objects/deep-clone.ts +13 -0
  328. package/src/objects/deep-equal.test.ts +86 -0
  329. package/src/objects/deep-equal.ts +60 -0
  330. package/src/objects/index.ts +4 -0
  331. package/src/platform/index.ts +64 -0
  332. package/src/promise/index.ts +16 -0
  333. package/src/promise/promise.test.ts +254 -0
  334. package/src/promise/promise.ts +212 -0
  335. package/src/scheduler/callback-token.ts +31 -0
  336. package/src/scheduler/core/actuator-args.test.ts +47 -0
  337. package/src/scheduler/core/actuator.test.ts +82 -0
  338. package/src/scheduler/core/actuator.ts +58 -0
  339. package/src/scheduler/core/chunk-scheduler.test.ts +54 -0
  340. package/src/scheduler/core/chunk-scheduler.ts +28 -0
  341. package/src/scheduler/core/node_modules/.vitest/results.json +1 -0
  342. package/src/scheduler/core/scheduler.test.ts +328 -0
  343. package/src/scheduler/core/scheduler.ts +172 -0
  344. package/src/scheduler/core/task-queue.test.ts +78 -0
  345. package/src/scheduler/core/task-queue.ts +44 -0
  346. package/src/scheduler/core/task.test.ts +34 -0
  347. package/src/scheduler/core/task.ts +52 -0
  348. package/src/scheduler/core/utils.ts +48 -0
  349. package/src/scheduler/executor/abstract-executor.test.ts +44 -0
  350. package/src/scheduler/executor/abstract-executor.ts +38 -0
  351. package/src/scheduler/executor/executor.interface.ts +39 -0
  352. package/src/scheduler/executor/idle-callback-executor.test.ts +70 -0
  353. package/src/scheduler/executor/idle-callback-executor.ts +98 -0
  354. package/src/scheduler/executor/make-executor.ts +18 -0
  355. package/src/scheduler/executor/post-message-executor.test.ts +66 -0
  356. package/src/scheduler/executor/post-message-executor.ts +52 -0
  357. package/src/scheduler/index.ts +15 -0
  358. package/src/scheduler/lv-scheduler-callback.ts +19 -0
  359. package/src/scheduler/lv-scheduler-config.ts +17 -0
  360. package/src/scheduler/type.ts +48 -0
  361. package/src/sprintf/index.ts +2 -0
  362. package/src/sprintf/sprintf.test.ts +95 -0
  363. package/src/sprintf/sprintf.ts +97 -0
  364. package/src/structure/graph.test.ts +181 -0
  365. package/src/structure/graph.ts +105 -0
  366. package/src/structure/index.ts +8 -0
  367. package/src/structure/linked-list.test.ts +74 -0
  368. package/src/structure/linked-list.ts +145 -0
  369. package/src/structure/min-heap.test.ts +71 -0
  370. package/src/structure/min-heap.ts +91 -0
  371. package/src/type/REAME.md +2 -0
  372. package/src/type/distributive-omit.interface.ts +4 -0
  373. package/src/type/index.ts +3 -0
  374. package/src/type/object-key-paths.interface.ts +40 -0
  375. package/src/undo-redo-stack/README.md +61 -0
  376. package/src/undo-redo-stack/action-stack.test.ts +330 -0
  377. package/src/undo-redo-stack/action-stack.ts +150 -0
  378. package/src/undo-redo-stack/element.ts +4 -0
  379. package/src/undo-redo-stack/index.ts +7 -0
  380. package/src/undo-redo-stack/state-stack.test.ts +118 -0
  381. package/src/undo-redo-stack/state-stack.ts +133 -0
  382. package/src/uuid/index.ts +7 -0
  383. package/src/uuid/uuid.ts +86 -0
  384. package/src/worker/cors-worker.ts +38 -0
  385. package/src/worker/index.ts +4 -0
  386. package/src/worker/node_modules/.vitest/results.json +1 -0
  387. package/src/worker/promise-worker-main-thread.test.ts +91 -0
  388. package/src/worker/promise-worker-main-thread.ts +76 -0
  389. package/src/worker/promise-worker-worker-thread.ts +64 -0
  390. package/src/worker/promise-worker.interface.ts +15 -0
@@ -0,0 +1,63 @@
1
+ import { lvSchedulerCallback, PriorityLevel } from '@/scheduler';
2
+ import type { IDisposable } from '@/dispose';
3
+ import { Emitter, type Event } from '@/event';
4
+
5
+ //
6
+ // 容器类型,存放一个可以延迟初始化的值
7
+ //
8
+ export class IdleValue<T> implements IDisposable {
9
+ private readonly _executor: () => void;
10
+ private readonly _handle: IDisposable;
11
+ private _executorEmitter?: Emitter<[]>;
12
+
13
+ private _didRun = false;
14
+ private _value?: T;
15
+ private _error: unknown;
16
+
17
+ constructor(executor: () => T) {
18
+ this._executor = () => {
19
+ try {
20
+ this._value = executor();
21
+ } catch (err) {
22
+ this._error = err;
23
+ throw err;
24
+ } finally {
25
+ this._didRun = true;
26
+ if (this._value && this._executorEmitter) {
27
+ this._executorEmitter.fire();
28
+ }
29
+ }
30
+ };
31
+ this._handle = lvSchedulerCallback(() => this._executor(), {
32
+ priorityLevel: PriorityLevel.IdlePriority,
33
+ });
34
+ }
35
+
36
+ get value(): T {
37
+ // 如果没有run过,dispose之后再立刻执行
38
+ if (!this._didRun) {
39
+ this._handle.dispose();
40
+ this._executor();
41
+ }
42
+ if (this._error) {
43
+ // eslint-disable-next-line @typescript-eslint/no-throw-literal
44
+ throw this._error;
45
+ }
46
+ return this._value!;
47
+ }
48
+
49
+ get isInitialized(): boolean {
50
+ return this._didRun;
51
+ }
52
+
53
+ get onExecutor(): Event<[]> {
54
+ if (!this._executorEmitter) {
55
+ this._executorEmitter = new Emitter<[]>();
56
+ }
57
+ return this._executorEmitter.event;
58
+ }
59
+
60
+ dispose(): void {
61
+ this._handle.dispose();
62
+ }
63
+ }
@@ -0,0 +1,32 @@
1
+ export type { BrandedService } from './base';
2
+ export type { ServiceIdentifier } from './base';
3
+ export type { ServicesAccessor } from './base';
4
+ export { createDecorator } from './base';
5
+ export { refineServiceDecorator } from './base';
6
+
7
+ export { SyncDescriptor } from './descriptor';
8
+
9
+ export type { GetLeadingNonServiceArgs } from './instantiation-service.interface';
10
+ export { IInstantiationService } from './instantiation-service.interface';
11
+ export { InstantiationService } from './instantiation-service';
12
+
13
+ // alias进行历史命名兼容
14
+ export { InstantiationService as ContainerService } from './instantiation-service';
15
+ export { IInstantiationService as IContainerService } from './instantiation-service.interface';
16
+
17
+ export { getService } from './instantiation-service';
18
+ export { InstantiationErrorType } from './instantiation-service';
19
+
20
+ export type { IServiceCollection } from './service-collection';
21
+ export { ServiceCollection } from './service-collection';
22
+
23
+ export { ServiceOwnership } from './service-ownership-collection';
24
+
25
+ export { ServiceRegistry } from './service-registry';
26
+
27
+ export type { LazyService } from './lazy/type';
28
+
29
+ export type { ILazyServiceLoader } from './lazy/lazy-service';
30
+ export { LazyServiceLoader } from './lazy/lazy-service';
31
+
32
+ export { makeLazyServiceIdleLoad } from './lazy/idle-load';
@@ -0,0 +1,2 @@
1
+ export * from './index.common';
2
+ export { InstantiationContext, useService } from './context.web';
@@ -0,0 +1,46 @@
1
+ import type { BrandedService, ServicesAccessor } from './base';
2
+ import { createDecorator } from './base';
3
+ import type { SyncDescriptor0 } from './descriptor';
4
+ import type { ServiceCollection } from './service-collection';
5
+
6
+ export type GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends []
7
+ ? []
8
+ : TArgs extends [...infer TFirst, BrandedService]
9
+ ? GetLeadingNonServiceArgs<TFirst>
10
+ : TArgs;
11
+
12
+ export interface IInstantiationService {
13
+ readonly _serviceBrand: undefined;
14
+
15
+ /**
16
+ * Synchronously creates an instance that is denoted by the descriptor
17
+ */
18
+ createInstance: {
19
+ <T>(descriptor: SyncDescriptor0<T>): T;
20
+ <Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(
21
+ ctor: Ctor,
22
+ ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>
23
+ ): R;
24
+ };
25
+
26
+ /**
27
+ * Calls a function with a service accessor.
28
+ */
29
+ invokeFunction: <R, TS extends any[] = []>(
30
+ fn: (accessor: ServicesAccessor, ...args: TS) => R,
31
+ ...args: TS
32
+ ) => R;
33
+
34
+ /**
35
+ * Creates a child of this service which inherits all current services
36
+ * and adds/overwrites the given services.
37
+ */
38
+ createChild: (services: ServiceCollection) => IInstantiationService;
39
+
40
+ /**
41
+ * 生命周期归属该DI上下文的服务进行销毁
42
+ */
43
+ dispose: () => void;
44
+ }
45
+
46
+ export const IInstantiationService = createDecorator<IInstantiationService>('instantiation');
@@ -0,0 +1,337 @@
1
+ import { createDecorator } from './base';
2
+ import { SyncDescriptor } from './descriptor';
3
+ import { getService, InstantiationService } from './instantiation-service';
4
+ import { IInstantiationService } from './instantiation-service.interface';
5
+ import { ServiceRegistry } from './service-registry';
6
+
7
+ let serviceRegistry: ServiceRegistry;
8
+
9
+ const IA = createDecorator<A>('a');
10
+ const IB = createDecorator<B>('b');
11
+ const IC = createDecorator<C>('c');
12
+ const IX = createDecorator<X>('x');
13
+ const IY = createDecorator<Y>('y');
14
+
15
+ class Y {
16
+ _serviceBrand: undefined;
17
+ name = 'Y';
18
+ }
19
+
20
+ class X {
21
+ _serviceBrand: undefined;
22
+ name = 'X';
23
+ y: Y;
24
+
25
+ constructor(@IY y: Y) {
26
+ this.y = y;
27
+ }
28
+ }
29
+
30
+ class C {
31
+ _serviceBrand: undefined;
32
+ name = 'C';
33
+ x: X;
34
+
35
+ constructor(@IX x: X) {
36
+ this.x = x;
37
+ }
38
+ }
39
+
40
+ class B {
41
+ _serviceBrand: undefined;
42
+ name = 'B';
43
+ c: C;
44
+
45
+ constructor(@IC c: C) {
46
+ this.c = c;
47
+ }
48
+ }
49
+
50
+ class A {
51
+ _serviceBrand: undefined;
52
+ name = 'A';
53
+ b: B;
54
+ x: X;
55
+
56
+ constructor(@IB b: B, @IX x: X) {
57
+ this.b = b;
58
+ this.x = x;
59
+ }
60
+ }
61
+
62
+ describe('createInstance fail', () => {
63
+ beforeEach(() => {
64
+ serviceRegistry = new ServiceRegistry();
65
+ });
66
+
67
+ // 出现重复创建服务
68
+ // Bar -> Foo
69
+ // 当时Foo在创建过程中,动态的创建了Bar
70
+ it('repeat', () => {
71
+ const IFoo = createDecorator<Foo>('foo');
72
+ const IBar = createDecorator<Bar>('bar');
73
+
74
+ interface IFoo {
75
+ _serviceBrand: undefined;
76
+ name: string;
77
+ }
78
+
79
+ class Bar {
80
+ _serviceBrand: undefined;
81
+ name = 'Bar';
82
+ foo: IFoo;
83
+
84
+ constructor(@IFoo foo: IFoo) {
85
+ this.foo = foo;
86
+ }
87
+ }
88
+ serviceRegistry.register(IBar, Bar);
89
+
90
+ class Foo implements IFoo {
91
+ _serviceBrand: undefined;
92
+ name = 'Foo';
93
+ instantiationService: IInstantiationService;
94
+
95
+ constructor(@IInstantiationService instantiationService: IInstantiationService) {
96
+ this.instantiationService = instantiationService;
97
+ instantiationService.createInstance(Bar);
98
+ }
99
+ }
100
+ serviceRegistry.register(IFoo, Foo);
101
+
102
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
103
+
104
+ expect(() => {
105
+ instantiationService.createInstance(Bar);
106
+ }).toThrow(`illegal state - RECURSIVELY instantiating service 'foo'`);
107
+ });
108
+
109
+ // 服务创建过程中出现环
110
+ // Bar -> Foo -> Bar
111
+ it('has cyclicDependency', () => {
112
+ const IFoo = createDecorator<Foo>('foo');
113
+ const IBar = createDecorator<Bar>('bar');
114
+
115
+ interface IFoo {
116
+ _serviceBrand: undefined;
117
+ name: string;
118
+ }
119
+
120
+ interface IBar {
121
+ _serviceBrand: undefined;
122
+ name: string;
123
+ }
124
+
125
+ class Foo implements IFoo {
126
+ _serviceBrand: undefined;
127
+ name = 'Foo';
128
+ bar: IBar;
129
+
130
+ constructor(@IBar bar: IBar) {
131
+ this.bar = bar;
132
+ }
133
+ }
134
+ serviceRegistry.register(IFoo, Foo);
135
+
136
+ class Bar implements IBar {
137
+ _serviceBrand: undefined;
138
+ name = 'Bar';
139
+ foo: IFoo;
140
+
141
+ constructor(@IFoo foo: IFoo) {
142
+ this.foo = foo;
143
+ }
144
+ }
145
+ serviceRegistry.register(IBar, Bar);
146
+
147
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
148
+ expect(() => {
149
+ instantiationService.createInstance(Bar);
150
+ }).toThrow('foo -> bar -> foo');
151
+ });
152
+
153
+ // 依赖的服务没有注册
154
+ it('service unregister', () => {
155
+ serviceRegistry.register(IX, X);
156
+
157
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
158
+ expect(() => {
159
+ instantiationService.createInstance(X);
160
+ }).toThrow('[createInstance] X depends on UNKNOWN service y.');
161
+ });
162
+ });
163
+
164
+ describe('createInstance success1', () => {
165
+ beforeEach(() => {
166
+ serviceRegistry = new ServiceRegistry();
167
+ });
168
+
169
+ // 没有依赖
170
+ it('no dependency', () => {
171
+ serviceRegistry.register(IY, Y);
172
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
173
+ let y: undefined | Y;
174
+ expect(() => {
175
+ y = instantiationService.createInstance(Y);
176
+ }).not.toThrow('Cannot register a disposable on itself.');
177
+ expect(y).not.toBeUndefined();
178
+ expect(y!.name).toBe('Y');
179
+ });
180
+ });
181
+
182
+ describe('createInstance success2', () => {
183
+ beforeEach(() => {
184
+ serviceRegistry = new ServiceRegistry();
185
+ });
186
+
187
+ // 存在依赖
188
+ // X -> Y
189
+ it('has dependency', () => {
190
+ serviceRegistry.register(IX, X);
191
+ serviceRegistry.register(IY, Y);
192
+
193
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
194
+ let x: undefined | X;
195
+ expect(() => {
196
+ x = instantiationService.createInstance(X);
197
+ }).not.toThrow('Cannot register a disposable on itself.');
198
+ expect(x).not.toBeUndefined();
199
+ expect(x!.name).toBe('X');
200
+ expect(x!.y.name).toBe('Y');
201
+ });
202
+
203
+ // 较为复杂的依赖情况
204
+ // A -> B -> C -> X -> Y
205
+ // A -> X -> Y
206
+ it('has dependency2', () => {
207
+ serviceRegistry.register(IA, A);
208
+ serviceRegistry.register(IB, B);
209
+ serviceRegistry.register(IC, C);
210
+ serviceRegistry.register(IX, X);
211
+ serviceRegistry.register(IY, Y);
212
+
213
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
214
+ let a: undefined | A;
215
+ expect(() => {
216
+ a = instantiationService.createInstance(A);
217
+ }).not.toThrowError();
218
+ expect(a).not.toBeUndefined();
219
+ expect(a!.name).toBe('A');
220
+ expect(a!.b.name).toBe('B');
221
+ expect(a!.b.c.name).toBe('C');
222
+ expect(a!.b.c.x.name).toBe('X');
223
+ expect(a!.b.c.x.y.name).toBe('Y');
224
+ expect(a!.x.name).toBe('X');
225
+ expect(a!.x.y.name).toBe('Y');
226
+ });
227
+
228
+ // 底层依赖了上层
229
+ // J(child) -> B(parent)
230
+ it('has dependency3', () => {
231
+ serviceRegistry.register(IY, Y);
232
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
233
+
234
+ const IJ = createDecorator<J>('j');
235
+
236
+ class J {
237
+ _serviceBrand: undefined;
238
+ name = 'J';
239
+ y: Y;
240
+
241
+ constructor(@IY y: Y) {
242
+ this.y = y;
243
+ }
244
+ }
245
+ const childRegister = new ServiceRegistry();
246
+ childRegister.register(IJ, J);
247
+ const childInstantiationService = instantiationService.createChild(childRegister.makeCollection());
248
+ let j: undefined | J;
249
+ expect(() => {
250
+ j = childInstantiationService.createInstance(J);
251
+ }).not.toThrowError();
252
+ expect(j).not.toBeUndefined();
253
+ expect(j!.name).toBe('J');
254
+ expect(j!.y.name).toBe('Y');
255
+ });
256
+ });
257
+
258
+ describe('createInstance success3', () => {
259
+ beforeEach(() => {
260
+ serviceRegistry = new ServiceRegistry();
261
+ });
262
+
263
+ // 支持静态参数,动态参数,注入的服务参数
264
+ it('arguments', () => {
265
+ class Foo {
266
+ _serviceBrand: undefined;
267
+ name = 'Foo';
268
+ }
269
+ const IFoo = createDecorator<Foo>('foo');
270
+ serviceRegistry.register(IFoo, Foo);
271
+
272
+ class Bar {
273
+ _serviceBrand: undefined;
274
+ name = 'Bar';
275
+ foo: Foo;
276
+ a1: number;
277
+ a2: string;
278
+
279
+ constructor(a1: number, a2: string, @IFoo foo: Foo) {
280
+ this.a1 = a1;
281
+ this.a2 = a2;
282
+ this.foo = foo;
283
+ }
284
+ }
285
+ const IBar = createDecorator<Bar>('bar');
286
+ const descriptor = new SyncDescriptor(Bar, [100]);
287
+ serviceRegistry.register(IBar, descriptor);
288
+
289
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
290
+ let bar: undefined | Bar;
291
+ expect(() => {
292
+ bar = instantiationService.createInstance(descriptor, '123');
293
+ }).not.toThrow('Cannot register a disposable on itself.');
294
+ expect(bar).not.toBeUndefined();
295
+ expect(bar!.foo.name).toBe('Foo');
296
+ expect(bar!.a1).toBe(100);
297
+ expect(bar!.a2).toBe('123');
298
+ });
299
+ });
300
+
301
+ describe('get service success', () => {
302
+ beforeEach(() => {
303
+ serviceRegistry = new ServiceRegistry();
304
+ });
305
+
306
+ it('get', () => {
307
+ const IFoo = createDecorator<Foo>('foo');
308
+ const IBar = createDecorator<Bar>('bar');
309
+
310
+ interface IFoo {
311
+ _serviceBrand: undefined;
312
+ name: string;
313
+ }
314
+
315
+ class Bar {
316
+ _serviceBrand: undefined;
317
+ name = 'Bar';
318
+ foo: IFoo;
319
+
320
+ constructor(@IFoo foo: IFoo) {
321
+ this.foo = foo;
322
+ }
323
+ }
324
+ serviceRegistry.register(IBar, Bar);
325
+
326
+ class Foo implements IFoo {
327
+ _serviceBrand: undefined;
328
+ name = 'Foo';
329
+ }
330
+ const foo = new Foo();
331
+ serviceRegistry.registerInstance(IFoo, foo);
332
+
333
+ const instantiationService = new InstantiationService(serviceRegistry.makeCollection());
334
+ expect(getService(instantiationService, IBar)).not.toBeUndefined();
335
+ expect(getService(instantiationService, IFoo)).toBe(foo);
336
+ });
337
+ });