@sima-land/isomorph 11.0.0-alpha.3 → 11.0.0-alpha.30

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 (215) hide show
  1. package/cache/types.d.ts +24 -2
  2. package/config/{index.d.ts → base.d.ts} +2 -2
  3. package/config/{index.js → base.js} +3 -3
  4. package/config/base.js.map +1 -0
  5. package/config/browser.d.ts +1 -1
  6. package/config/browser.js +11 -2
  7. package/config/browser.js.map +1 -1
  8. package/config/node.d.ts +1 -1
  9. package/config/node.js +17 -6
  10. package/config/node.js.map +1 -1
  11. package/config/types.d.ts +8 -1
  12. package/di/application.d.ts +10 -0
  13. package/{container → di}/application.js +29 -8
  14. package/di/application.js.map +1 -0
  15. package/di/container.d.ts +6 -0
  16. package/di/container.js +52 -0
  17. package/di/container.js.map +1 -0
  18. package/di/errors.d.ts +32 -0
  19. package/di/errors.js +48 -0
  20. package/di/errors.js.map +1 -0
  21. package/di/index.d.ts +6 -0
  22. package/di/index.js +17 -0
  23. package/di/index.js.map +1 -0
  24. package/di/preset.d.ts +9 -0
  25. package/di/preset.js +31 -0
  26. package/di/preset.js.map +1 -0
  27. package/di/token.d.ts +7 -0
  28. package/di/token.js +39 -0
  29. package/di/token.js.map +1 -0
  30. package/di/types.d.ts +88 -0
  31. package/{container → di}/types.js +0 -0
  32. package/{logger → di}/types.js.map +1 -1
  33. package/error-tracking/index.d.ts +24 -0
  34. package/error-tracking/index.js +32 -0
  35. package/error-tracking/index.js.map +1 -0
  36. package/error-tracking/types.d.ts +20 -0
  37. package/{error-tracker → error-tracking}/types.js +0 -0
  38. package/{container → error-tracking}/types.js.map +1 -1
  39. package/http-client/middleware/cookie.d.ts +1 -0
  40. package/http-client/middleware/cookie.js +4 -2
  41. package/http-client/middleware/cookie.js.map +1 -1
  42. package/http-client/middleware/headers.d.ts +13 -0
  43. package/http-client/middleware/headers.js +24 -0
  44. package/http-client/middleware/headers.js.map +1 -0
  45. package/http-client/middleware/log.d.ts +27 -0
  46. package/http-client/middleware/log.js +26 -0
  47. package/http-client/middleware/log.js.map +1 -0
  48. package/http-client/middleware/tracing.d.ts +3 -3
  49. package/http-client/middleware/tracing.js +22 -9
  50. package/http-client/middleware/tracing.js.map +1 -1
  51. package/http-client/sauce/index.d.ts +20 -5
  52. package/http-client/sauce/index.js +38 -21
  53. package/http-client/sauce/index.js.map +1 -1
  54. package/http-client/types.d.ts +1 -1
  55. package/http-client/utils.d.ts +14 -7
  56. package/http-client/utils.js +43 -12
  57. package/http-client/utils.js.map +1 -1
  58. package/http-server/errors.d.ts +11 -0
  59. package/http-server/errors.js +18 -0
  60. package/http-server/errors.js.map +1 -0
  61. package/http-server/handler/health-check.d.ts +1 -1
  62. package/http-server/handler/health-check.js +1 -1
  63. package/http-server/middleware/{logging.d.ts → log.d.ts} +2 -2
  64. package/http-server/middleware/{logging.js → log.js} +6 -5
  65. package/http-server/middleware/log.js.map +1 -0
  66. package/http-server/middleware/metrics.js +2 -2
  67. package/http-server/middleware/metrics.js.map +1 -1
  68. package/http-server/middleware/tracing.d.ts +7 -1
  69. package/http-server/middleware/tracing.js +20 -2
  70. package/http-server/middleware/tracing.js.map +1 -1
  71. package/http-server/template/index.js +11 -6
  72. package/http-server/template/index.js.map +1 -1
  73. package/http-server/types.d.ts +2 -0
  74. package/http-server/utils.d.ts +14 -5
  75. package/http-server/utils.js +46 -21
  76. package/http-server/utils.js.map +1 -1
  77. package/log/handler/pino.d.ts +8 -0
  78. package/log/handler/pino.js +29 -0
  79. package/log/handler/pino.js.map +1 -0
  80. package/log/handler/sentry.d.ts +8 -0
  81. package/log/handler/sentry.js +50 -0
  82. package/log/handler/sentry.js.map +1 -0
  83. package/log/index.d.ts +2 -0
  84. package/log/index.js +6 -0
  85. package/log/index.js.map +1 -0
  86. package/{logger/index.d.ts → log/logger.d.ts} +0 -0
  87. package/{logger/index.js → log/logger.js} +1 -1
  88. package/log/logger.js.map +1 -0
  89. package/log/types.d.ts +41 -0
  90. package/{logger → log}/types.js +0 -0
  91. package/{preset → log}/types.js.map +1 -1
  92. package/metrics/constants.d.ts +3 -0
  93. package/metrics/constants.js +3 -0
  94. package/metrics/constants.js.map +1 -1
  95. package/metrics/node.d.ts +7 -0
  96. package/metrics/node.js +1 -0
  97. package/metrics/node.js.map +1 -1
  98. package/package.json +35 -30
  99. package/preset/browser/index.d.ts +10 -0
  100. package/preset/browser/index.js +71 -0
  101. package/preset/browser/index.js.map +1 -0
  102. package/preset/node/index.d.ts +16 -11
  103. package/preset/node/index.js +105 -61
  104. package/preset/node/index.js.map +1 -1
  105. package/preset/node/response.d.ts +12 -8
  106. package/preset/node/response.js +98 -28
  107. package/preset/node/response.js.map +1 -1
  108. package/preset/parts/providers.d.ts +7 -0
  109. package/preset/parts/providers.js +26 -0
  110. package/preset/parts/providers.js.map +1 -0
  111. package/preset/parts/types.d.ts +8 -0
  112. package/preset/{types.js → parts/types.js} +0 -0
  113. package/{error-tracker → preset/parts}/types.js.map +1 -1
  114. package/preset/parts/utils.d.ts +110 -0
  115. package/preset/parts/utils.js +261 -0
  116. package/preset/parts/utils.js.map +1 -0
  117. package/tokens.d.ts +39 -21
  118. package/tokens.js +35 -20
  119. package/tokens.js.map +1 -1
  120. package/tracing/index.d.ts +9 -0
  121. package/tracing/index.js +20 -0
  122. package/tracing/index.js.map +1 -0
  123. package/utils/browser/analytics/data-layer.d.ts +2 -2
  124. package/utils/browser/analytics/data-layer.js +4 -5
  125. package/utils/browser/analytics/data-layer.js.map +1 -1
  126. package/utils/browser/analytics/oko.d.ts +3 -2
  127. package/utils/browser/analytics/oko.js +2 -1
  128. package/utils/browser/analytics/oko.js.map +1 -1
  129. package/utils/browser/storage/index.d.ts +8 -0
  130. package/utils/browser/storage/index.js +6 -1
  131. package/utils/browser/storage/index.js.map +1 -1
  132. package/utils/function.d.ts +28 -0
  133. package/utils/function.js +23 -0
  134. package/utils/function.js.map +1 -0
  135. package/utils/react/error-handlers/index.d.ts +11 -8
  136. package/utils/react/error-handlers/index.js +8 -10
  137. package/utils/react/error-handlers/index.js.map +1 -1
  138. package/utils/redux/index.d.ts +3 -0
  139. package/utils/redux/index.js +8 -0
  140. package/utils/redux/index.js.map +1 -0
  141. package/utils/redux/remote-data.d.ts +83 -5
  142. package/utils/redux/remote-data.js +83 -1
  143. package/utils/redux/remote-data.js.map +1 -1
  144. package/utils/redux-saga/index.d.ts +3 -0
  145. package/utils/redux-saga/index.js +8 -0
  146. package/utils/redux-saga/index.js.map +1 -0
  147. package/utils/redux-saga/middleware.d.ts +8 -0
  148. package/utils/redux-saga/middleware.js +84 -0
  149. package/utils/redux-saga/middleware.js.map +1 -0
  150. package/utils/redux-saga/take-chain.d.ts +2 -0
  151. package/utils/redux-saga/take-chain.js +2 -0
  152. package/utils/redux-saga/take-chain.js.map +1 -1
  153. package/utils/redux-saga/types.d.ts +15 -0
  154. package/{saga-runner → utils/redux-saga}/types.js +0 -0
  155. package/utils/redux-saga/types.js.map +1 -0
  156. package/utils/ssr/index.d.ts +41 -0
  157. package/utils/ssr/index.js +54 -0
  158. package/utils/ssr/index.js.map +1 -0
  159. package/utils/webpack/env/index.d.ts +18 -0
  160. package/utils/webpack/env/index.js +76 -0
  161. package/utils/webpack/env/index.js.map +1 -0
  162. package/utils/webpack/env/types.d.ts +11 -0
  163. package/utils/webpack/env/types.js +3 -0
  164. package/utils/webpack/env/types.js.map +1 -0
  165. package/utils/webpack/env/utils.d.ts +15 -0
  166. package/utils/webpack/env/utils.js +52 -0
  167. package/utils/webpack/env/utils.js.map +1 -0
  168. package/utils/webpack/index.d.ts +6 -0
  169. package/utils/webpack/index.js +8 -0
  170. package/utils/webpack/index.js.map +1 -0
  171. package/utils/webpack/module-federation/index.d.ts +7 -1
  172. package/utils/webpack/module-federation/index.js +11 -4
  173. package/utils/webpack/module-federation/index.js.map +1 -1
  174. package/utils/webpack/module-federation/types.d.ts +11 -3
  175. package/utils/webpack/module-federation/utils.d.ts +6 -0
  176. package/utils/webpack/module-federation/utils.js +73 -17
  177. package/utils/webpack/module-federation/utils.js.map +1 -1
  178. package/config/index.js.map +0 -1
  179. package/config/utils.d.ts +0 -5
  180. package/config/utils.js +0 -12
  181. package/config/utils.js.map +0 -1
  182. package/container/application.d.ts +0 -25
  183. package/container/application.js.map +0 -1
  184. package/container/index.d.ts +0 -18
  185. package/container/index.js +0 -74
  186. package/container/index.js.map +0 -1
  187. package/container/types.d.ts +0 -14
  188. package/error-tracker/browser.d.ts +0 -8
  189. package/error-tracker/browser.js +0 -40
  190. package/error-tracker/browser.js.map +0 -1
  191. package/error-tracker/node.d.ts +0 -8
  192. package/error-tracker/node.js +0 -40
  193. package/error-tracker/node.js.map +0 -1
  194. package/error-tracker/types.d.ts +0 -18
  195. package/error-tracker/utils.d.ts +0 -12
  196. package/error-tracker/utils.js +0 -19
  197. package/error-tracker/utils.js.map +0 -1
  198. package/http-server/middleware/logging.js.map +0 -1
  199. package/logger/handler/console.d.ts +0 -8
  200. package/logger/handler/console.js +0 -36
  201. package/logger/handler/console.js.map +0 -1
  202. package/logger/handler/sentry.d.ts +0 -8
  203. package/logger/handler/sentry.js +0 -36
  204. package/logger/handler/sentry.js.map +0 -1
  205. package/logger/index.js.map +0 -1
  206. package/logger/types.d.ts +0 -24
  207. package/preset/index.d.ts +0 -7
  208. package/preset/index.js +0 -25
  209. package/preset/index.js.map +0 -1
  210. package/preset/types.d.ts +0 -7
  211. package/saga-runner/index.d.ts +0 -8
  212. package/saga-runner/index.js +0 -79
  213. package/saga-runner/index.js.map +0 -1
  214. package/saga-runner/types.d.ts +0 -10
  215. package/saga-runner/types.js.map +0 -1
package/cache/types.d.ts CHANGED
@@ -1,7 +1,29 @@
1
+ /**
2
+ * Простейший интерфейс кэша.
3
+ */
1
4
  export interface Cache {
2
- get: (key: string) => void;
5
+ /**
6
+ * Возвращает значение из кэша по ключу.
7
+ * @param key Ключ.
8
+ * @return Значение.
9
+ */
10
+ get: (key: string) => unknown;
11
+ /**
12
+ * Записывает значение в кэш по ключу.
13
+ * @param key Ключ.
14
+ */
3
15
  set: (key: string, value: any) => void;
16
+ /**
17
+ * Удаляет значение из кэша по ключу.
18
+ * @param key Ключ.
19
+ */
4
20
  delete: (key: string) => void;
21
+ /**
22
+ * Полностью очищает кэш.
23
+ */
5
24
  clear: () => void;
6
- has: (key: string) => void;
25
+ /**
26
+ * Возвращает `true` в случае, если значение под переданным ключом присутствует в кэше, `false` в противном случае.
27
+ */
28
+ has: (key: string) => boolean;
7
29
  }
@@ -1,7 +1,7 @@
1
1
  import type { ConfigSource, BaseConfig } from './types';
2
2
  /**
3
- * Возвращает базовую конфигурацию.
4
- * @param source Источник.
3
+ * Возвращает новую базовую конфигурацию.
4
+ * @param source Источник конфигурации.
5
5
  * @return Базовая конфигурация.
6
6
  */
7
7
  export declare function createBaseConfig(source: ConfigSource): BaseConfig;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createBaseConfig = void 0;
4
4
  /**
5
- * Возвращает базовую конфигурацию.
6
- * @param source Источник.
5
+ * Возвращает новую базовую конфигурацию.
6
+ * @param source Источник конфигурации.
7
7
  * @return Базовая конфигурация.
8
8
  */
9
9
  function createBaseConfig(source) {
@@ -17,4 +17,4 @@ function createBaseConfig(source) {
17
17
  };
18
18
  }
19
19
  exports.createBaseConfig = createBaseConfig;
20
- //# sourceMappingURL=index.js.map
20
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/config/base.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEjD,OAAO;QACL,GAAG;QACH,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC;AAVD,4CAUC"}
@@ -1,6 +1,6 @@
1
1
  import type { ConfigSource } from './types';
2
2
  /**
3
- * Возвращает "источник" для конфигурации.
3
+ * Возвращает новый источник конфигурации для браузера.
4
4
  * @return Источник.
5
5
  */
6
6
  export declare function createConfigSource(): ConfigSource;
package/config/browser.js CHANGED
@@ -3,11 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createConfigSource = void 0;
4
4
  const env_1 = require("@humanwhocodes/env");
5
5
  /**
6
- * Возвращает "источник" для конфигурации.
6
+ * Возвращает новый источник конфигурации для браузера.
7
7
  * @return Источник.
8
8
  */
9
9
  function createConfigSource() {
10
- return new env_1.Env(process.env);
10
+ const source = {};
11
+ // докидываем process если он предоставлен сборкой
12
+ if (typeof process !== 'undefined') {
13
+ Object.assign(source, process.env);
14
+ }
15
+ // докидываем зашиваемые переменные окружения
16
+ if (typeof __ISOMORPH_ENV__ !== 'undefined') {
17
+ Object.assign(source, __ISOMORPH_ENV__);
18
+ }
19
+ return new env_1.Env(source);
11
20
  }
12
21
  exports.createConfigSource = createConfigSource;
13
22
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/config/browser.ts"],"names":[],"mappings":";;;AACA,4CAAyC;AAEzC;;;GAGG;AACH,SAAgB,kBAAkB;IAChC,OAAO,IAAI,SAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAFD,gDAEC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/config/browser.ts"],"names":[],"mappings":";;;AACA,4CAAyC;AAIzC;;;GAGG;AACH,SAAgB,kBAAkB;IAChC,MAAM,MAAM,GAAuC,EAAE,CAAC;IAEtD,kDAAkD;IAClD,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;QAClC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;KACpC;IAED,6CAA6C;IAC7C,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;QAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;KACzC;IAED,OAAO,IAAI,SAAG,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAdD,gDAcC"}
package/config/node.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { ConfigSource } from './types';
2
2
  /**
3
- * Возвращает "источник" для конфигурации.
3
+ * Возвращает новый источник конфигурации для Node.js.
4
4
  * @return Источник.
5
5
  */
6
6
  export declare function createConfigSource(): ConfigSource;
package/config/node.js CHANGED
@@ -1,19 +1,30 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.createConfigSource = void 0;
4
7
  const env_1 = require("@humanwhocodes/env");
5
8
  const dotenv_1 = require("dotenv");
6
- const utils_1 = require("./utils");
9
+ const path_1 = __importDefault(require("path"));
7
10
  /**
8
- * Возвращает "источник" для конфигурации.
11
+ * Возвращает новый источник конфигурации для Node.js.
9
12
  * @return Источник.
10
13
  */
11
14
  function createConfigSource() {
12
- // определяем среду
13
- const envName = (0, utils_1.defineEnvironment)();
15
+ const envName = process.env.NODE_ENV;
14
16
  // подключаем соответствующий среде файл со значениями по умолчанию
15
- (0, dotenv_1.config)({ path: `./.env.${envName}` });
16
- return new env_1.Env(process.env);
17
+ if (envName) {
18
+ (0, dotenv_1.config)({ path: path_1.default.resolve(process.cwd(), `./.env.${envName}`) });
19
+ }
20
+ // после подключения env-файла формируем источник данных окружения
21
+ const source = { ...process.env };
22
+ // докидываем зашиваемые переменные окружения
23
+ // @todo возможно стоит делать так чтобы переменные из process.env имели приоритет
24
+ if (typeof __ISOMORPH_ENV__ !== 'undefined') {
25
+ Object.assign(source, __ISOMORPH_ENV__);
26
+ }
27
+ return new env_1.Env(source);
17
28
  }
18
29
  exports.createConfigSource = createConfigSource;
19
30
  //# sourceMappingURL=node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/config/node.ts"],"names":[],"mappings":";;;AACA,4CAAyC;AACzC,mCAAgC;AAChC,mCAA4C;AAE5C;;;GAGG;AACH,SAAgB,kBAAkB;IAChC,mBAAmB;IACnB,MAAM,OAAO,GAAG,IAAA,yBAAiB,GAAE,CAAC;IAEpC,mEAAmE;IACnE,IAAA,eAAM,EAAC,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,CAAC;IAEtC,OAAO,IAAI,SAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AARD,gDAQC"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/config/node.ts"],"names":[],"mappings":";;;;;;AACA,4CAAyC;AACzC,mCAAgC;AAChC,gDAAwB;AAIxB;;;GAGG;AACH,SAAgB,kBAAkB;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAErC,mEAAmE;IACnE,IAAI,OAAO,EAAE;QACX,IAAA,eAAM,EAAC,EAAE,IAAI,EAAE,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;KACpE;IAED,kEAAkE;IAClE,MAAM,MAAM,GAAuC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtE,6CAA6C;IAC7C,kFAAkF;IAClF,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;QAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;KACzC;IAED,OAAO,IAAI,SAAG,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAlBD,gDAkBC"}
package/config/types.d.ts CHANGED
@@ -1,7 +1,14 @@
1
1
  import type { Env } from '@humanwhocodes/env';
2
- export declare type ConfigSource = Env;
2
+ /** Источник конфигурации. */
3
+ export type ConfigSource = Env;
4
+ /**
5
+ * Базовая информация о приложении, необходимая в большинстве мест.
6
+ */
3
7
  export interface BaseConfig {
8
+ /** Строка, характеризующая среду выполнения, например "production". */
4
9
  env: string;
10
+ /** Имя приложения. */
5
11
  appName: string;
12
+ /** Версия приложения. */
6
13
  appVersion: string;
7
14
  }
@@ -0,0 +1,10 @@
1
+ import type { Application, Token } from './types';
2
+ /**
3
+ * Токен, с помощью которого можно достать из приложения само приложение.
4
+ */
5
+ export declare const CURRENT_APP: Token<Application>;
6
+ /**
7
+ * Возвращает новое DI-приложение.
8
+ * @return DI-приложение.
9
+ */
10
+ export declare function createApplication(): Application;
@@ -1,13 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Application = void 0;
4
- const _1 = require(".");
5
- class Application {
3
+ exports.createApplication = exports.CURRENT_APP = void 0;
4
+ const errors_1 = require("./errors");
5
+ const token_1 = require("./token");
6
+ const container_1 = require("./container");
7
+ /**
8
+ * Токен, с помощью которого можно достать из приложения само приложение.
9
+ */
10
+ exports.CURRENT_APP = (0, token_1.createToken)('application/self');
11
+ /**
12
+ * Реализация Application.
13
+ */
14
+ class ApplicationImplementation {
6
15
  constructor() {
7
16
  this.providers = new Map();
8
17
  this.presets = [];
9
18
  }
10
19
  bind(token) {
20
+ if (this.providers.has(token)) {
21
+ throw new errors_1.AlreadyBoundError(token);
22
+ }
11
23
  return {
12
24
  toValue: value => {
13
25
  this.providers.set(token, () => value);
@@ -22,7 +34,7 @@ class Application {
22
34
  return this.getContainer().get(token);
23
35
  }
24
36
  catch (error) {
25
- if (error instanceof _1.NothingBoundError && this.parent) {
37
+ if (error instanceof errors_1.NothingBoundError && error.token === token && this.parent) {
26
38
  return this.parent.get(token);
27
39
  }
28
40
  else {
@@ -37,8 +49,8 @@ class Application {
37
49
  return this.container;
38
50
  }
39
51
  configureContainer() {
40
- const container = (0, _1.createContainer)();
41
- container.set(Application.self, () => this);
52
+ const container = (0, container_1.createContainer)();
53
+ container.set(exports.CURRENT_APP, () => this);
42
54
  for (const preset of this.presets) {
43
55
  preset.apply(this);
44
56
  }
@@ -49,6 +61,9 @@ class Application {
49
61
  return container;
50
62
  }
51
63
  attach(parent) {
64
+ if (this.parent) {
65
+ throw Error('Cannot reattach application');
66
+ }
52
67
  this.parent = parent;
53
68
  }
54
69
  preset(preset) {
@@ -58,6 +73,12 @@ class Application {
58
73
  fn(...tokens.map(token => this.get(token)));
59
74
  }
60
75
  }
61
- exports.Application = Application;
62
- Application.self = (0, _1.createToken)('application/self');
76
+ /**
77
+ * Возвращает новое DI-приложение.
78
+ * @return DI-приложение.
79
+ */
80
+ function createApplication() {
81
+ return new ApplicationImplementation();
82
+ }
83
+ exports.createApplication = createApplication;
63
84
  //# sourceMappingURL=application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/di/application.ts"],"names":[],"mappings":";;;AAWA,qCAAgE;AAChE,mCAAsC;AACtC,2CAA8C;AAE9C;;GAEG;AACU,QAAA,WAAW,GAAG,IAAA,mBAAW,EAAc,kBAAkB,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,yBAAyB;IAM7B;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,CAAI,KAAe;QACrB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC7B,MAAM,IAAI,0BAAiB,CAAC,KAAK,CAAC,CAAC;SACpC;QAED,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,EAAE;gBACf,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,GAAG,CAAI,KAAe;QACpB,IAAI;YACF,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACvC;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,0BAAiB,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;gBAC9E,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC/B;iBAAM;gBACL,MAAM,KAAK,CAAC;aACb;SACF;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAC5C;QAED,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,kBAAkB;QACxB,MAAM,SAAS,GAAG,IAAA,2BAAe,GAAE,CAAC;QAEpC,SAAS,CAAC,GAAG,CAAC,mBAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEvC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACpB;QAED,MAAM,OAAO,GAAY,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAElD,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;YAC9C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;SAC/C;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,MAAmB;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,MAAM,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAC5C;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CACJ,MAAmB,EACnB,EAA0C;QAE1C,EAAE,CAAC,GAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAS,CAAC,CAAC;IACvD,CAAC;CACF;AAED;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,IAAI,yBAAyB,EAAE,CAAC;AACzC,CAAC;AAFD,8CAEC"}
@@ -0,0 +1,6 @@
1
+ import type { Container } from './types';
2
+ /**
3
+ * Возвращает новый DI-контейнер.
4
+ * @return DI-контейнер.
5
+ */
6
+ export declare function createContainer(): Container;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createContainer = void 0;
4
+ const errors_1 = require("./errors");
5
+ class ContainerImplementation {
6
+ constructor() {
7
+ this.cache = new Map();
8
+ this.registry = new Map();
9
+ }
10
+ set(token, provider) {
11
+ if (this.registry.has(token._key)) {
12
+ throw new errors_1.AlreadyBoundError(token);
13
+ }
14
+ this.registry.set(token._key, provider);
15
+ }
16
+ get(token) {
17
+ return this.resolve(token, []);
18
+ }
19
+ resolve(token, chain) {
20
+ if (chain.includes(token)) {
21
+ throw new errors_1.CircularDependencyError([...chain, token]);
22
+ }
23
+ else {
24
+ chain.push(token);
25
+ }
26
+ if (this.cache.has(token._key)) {
27
+ return this.cache.get(token._key);
28
+ }
29
+ else if (this.registry.has(token._key)) {
30
+ const provider = this.registry.get(token._key);
31
+ if (typeof provider !== 'function') {
32
+ throw new Error('Provider is not a function');
33
+ }
34
+ const value = provider(otherToken => this.resolve(otherToken, chain));
35
+ // всегда как singleton
36
+ this.cache.set(token._key, value);
37
+ return value;
38
+ }
39
+ else {
40
+ throw new errors_1.NothingBoundError(token);
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * Возвращает новый DI-контейнер.
46
+ * @return DI-контейнер.
47
+ */
48
+ function createContainer() {
49
+ return new ContainerImplementation();
50
+ }
51
+ exports.createContainer = createContainer;
52
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":";;;AAEA,qCAAyF;AAEzF,MAAM,uBAAuB;IAI3B;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAe,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IACnD,CAAC;IAED,GAAG,CAAI,KAAe,EAAE,QAAqB;QAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACjC,MAAM,IAAI,0BAAiB,CAAC,KAAK,CAAC,CAAC;SACpC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAI,KAAe;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAEO,OAAO,CAAI,KAAe,EAAE,KAAmB;QACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,gCAAuB,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;SACtD;aAAM;YACL,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnB;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACnC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE/C,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;gBAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;aAC/C;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YAEtE,uBAAuB;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAElC,OAAO,KAAK,CAAC;SACd;aAAM;YACL,MAAM,IAAI,0BAAiB,CAAC,KAAK,CAAC,CAAC;SACpC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,SAAgB,eAAe;IAC7B,OAAO,IAAI,uBAAuB,EAAE,CAAC;AACvC,CAAC;AAFD,0CAEC"}
package/di/errors.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ import type { Token } from './types';
2
+ /**
3
+ * Ошибка, сообщающая, что в контейнере нет сервиса по заданному ключу.
4
+ */
5
+ export declare class NothingBoundError extends Error {
6
+ readonly token: Token<any>;
7
+ /**
8
+ * Конструктор.
9
+ * @param token Токен.
10
+ */
11
+ constructor(token: Token<any>);
12
+ }
13
+ /**
14
+ * Ошибка, сообщающая, что в контейнере уже зарегистрирован компонент под таким токеном.
15
+ */
16
+ export declare class AlreadyBoundError extends Error {
17
+ /**
18
+ * Конструктор.
19
+ * @param token Токен.
20
+ */
21
+ constructor(token: Token<any>);
22
+ }
23
+ /**
24
+ * Ошибка, сообщающая, что обнаружена циклическая зависимость.
25
+ */
26
+ export declare class CircularDependencyError extends Error {
27
+ /**
28
+ * Конструктор.
29
+ * @param trace Список токенов, в котором обнаружен цикл.
30
+ */
31
+ constructor(trace: Token<any>[]);
32
+ }
package/di/errors.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CircularDependencyError = exports.AlreadyBoundError = exports.NothingBoundError = void 0;
4
+ /**
5
+ * Ошибка, сообщающая, что в контейнере нет сервиса по заданному ключу.
6
+ */
7
+ class NothingBoundError extends Error {
8
+ /**
9
+ * Конструктор.
10
+ * @param token Токен.
11
+ */
12
+ constructor(token) {
13
+ super(`Nothing bound to ${String(token)}`);
14
+ this.name = 'NothingBoundError';
15
+ this.token = token;
16
+ }
17
+ }
18
+ exports.NothingBoundError = NothingBoundError;
19
+ /**
20
+ * Ошибка, сообщающая, что в контейнере уже зарегистрирован компонент под таким токеном.
21
+ */
22
+ class AlreadyBoundError extends Error {
23
+ /**
24
+ * Конструктор.
25
+ * @param token Токен.
26
+ */
27
+ constructor(token) {
28
+ super(`Cannot rebind token, already bound: ${String(token)}`);
29
+ this.name = 'AlreadyBoundError';
30
+ }
31
+ }
32
+ exports.AlreadyBoundError = AlreadyBoundError;
33
+ /**
34
+ * Ошибка, сообщающая, что обнаружена циклическая зависимость.
35
+ */
36
+ class CircularDependencyError extends Error {
37
+ /**
38
+ * Конструктор.
39
+ * @param trace Список токенов, в котором обнаружен цикл.
40
+ */
41
+ constructor(trace) {
42
+ const names = trace.map(token => String(token._key)).join(' >> ');
43
+ super(`Circular dependency found, trace: ${names}`);
44
+ this.name = 'CircularDependencyError';
45
+ }
46
+ }
47
+ exports.CircularDependencyError = CircularDependencyError;
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/di/errors.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,iBAAkB,SAAQ,KAAK;IAG1C;;;OAGG;IACH,YAAY,KAAiB;QAC3B,KAAK,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAZD,8CAYC;AAED;;GAEG;AACH,MAAa,iBAAkB,SAAQ,KAAK;IAC1C;;;OAGG;IACH,YAAY,KAAiB;QAC3B,KAAK,CAAC,uCAAuC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AATD,8CASC;AAED;;GAEG;AACH,MAAa,uBAAwB,SAAQ,KAAK;IAChD;;;OAGG;IACH,YAAY,KAAmB;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAVD,0DAUC"}
package/di/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export { Token, Resolve, Provider, Container, Application, Preset } from './types';
2
+ export { NothingBoundError, CircularDependencyError, AlreadyBoundError } from './errors';
3
+ export { createToken } from './token';
4
+ export { createContainer } from './container';
5
+ export { createPreset } from './preset';
6
+ export { createApplication, CURRENT_APP } from './application';
package/di/index.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CURRENT_APP = exports.createApplication = exports.createPreset = exports.createContainer = exports.createToken = exports.AlreadyBoundError = exports.CircularDependencyError = exports.NothingBoundError = void 0;
4
+ var errors_1 = require("./errors");
5
+ Object.defineProperty(exports, "NothingBoundError", { enumerable: true, get: function () { return errors_1.NothingBoundError; } });
6
+ Object.defineProperty(exports, "CircularDependencyError", { enumerable: true, get: function () { return errors_1.CircularDependencyError; } });
7
+ Object.defineProperty(exports, "AlreadyBoundError", { enumerable: true, get: function () { return errors_1.AlreadyBoundError; } });
8
+ var token_1 = require("./token");
9
+ Object.defineProperty(exports, "createToken", { enumerable: true, get: function () { return token_1.createToken; } });
10
+ var container_1 = require("./container");
11
+ Object.defineProperty(exports, "createContainer", { enumerable: true, get: function () { return container_1.createContainer; } });
12
+ var preset_1 = require("./preset");
13
+ Object.defineProperty(exports, "createPreset", { enumerable: true, get: function () { return preset_1.createPreset; } });
14
+ var application_1 = require("./application");
15
+ Object.defineProperty(exports, "createApplication", { enumerable: true, get: function () { return application_1.createApplication; } });
16
+ Object.defineProperty(exports, "CURRENT_APP", { enumerable: true, get: function () { return application_1.CURRENT_APP; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/di/index.ts"],"names":[],"mappings":";;;AACA,mCAAyF;AAAhF,2GAAA,iBAAiB,OAAA;AAAE,iHAAA,uBAAuB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AACtE,iCAAsC;AAA7B,oGAAA,WAAW,OAAA;AACpB,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AACxB,mCAAwC;AAA/B,sGAAA,YAAY,OAAA;AACrB,6CAA+D;AAAtD,gHAAA,iBAAiB,OAAA;AAAE,0GAAA,WAAW,OAAA"}
package/di/preset.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { Provider, Token, Preset } from './types';
2
+ type PresetEntry<T = any> = [Token<T>, Provider<T>];
3
+ /**
4
+ * Возвращает новый "preset" для DI-приложения - набор предустановленных компонентов которые можно переопределять.
5
+ * @param defaults Предустановленные зависимости.
6
+ * @return Preset.
7
+ */
8
+ export declare function createPreset(defaults: PresetEntry[]): Preset;
9
+ export {};
package/di/preset.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPreset = void 0;
4
+ class PresetImplementation {
5
+ constructor(defaults) {
6
+ this.registry = new Map(defaults);
7
+ }
8
+ override(token, provider) {
9
+ this.registry.set(token, provider);
10
+ return this;
11
+ }
12
+ set(token, provider) {
13
+ this.registry.set(token, provider);
14
+ return this;
15
+ }
16
+ apply(app) {
17
+ for (const [token, provider] of this.registry) {
18
+ app.bind(token).toProvider(provider);
19
+ }
20
+ }
21
+ }
22
+ /**
23
+ * Возвращает новый "preset" для DI-приложения - набор предустановленных компонентов которые можно переопределять.
24
+ * @param defaults Предустановленные зависимости.
25
+ * @return Preset.
26
+ */
27
+ function createPreset(defaults) {
28
+ return new PresetImplementation(defaults);
29
+ }
30
+ exports.createPreset = createPreset;
31
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/di/preset.ts"],"names":[],"mappings":";;;AAKA,MAAM,oBAAoB;IAGxB,YAAY,QAA+B;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAA4B,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,QAAQ,CAAI,KAAe,EAAE,QAAqB;QAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAI,KAAe,EAAE,QAAqB;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAgB;QACpB,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;SACtC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,QAAuB;IAClD,OAAO,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAFD,oCAEC"}
package/di/token.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { Token } from './types';
2
+ /**
3
+ * Возвращает новый токен.
4
+ * @param name Имя токена для отладки в случае ошибок.
5
+ * @return Токен.
6
+ */
7
+ export declare function createToken<T = never>(name?: string): Token<T>;
package/di/token.js ADDED
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToken = void 0;
4
+ /**
5
+ * Реализация токена.
6
+ */
7
+ class TokenImplementation {
8
+ /**
9
+ * Конструктор.
10
+ * @param name Имя для отладки.
11
+ */
12
+ constructor(name) {
13
+ this._key = Symbol(name);
14
+ }
15
+ /**
16
+ * Получив реестр вернет из него нужный компонент.
17
+ * @param registry Реестр.
18
+ * @return Компонент.
19
+ */
20
+ _resolve(registry) {
21
+ return registry.get(this._key);
22
+ }
23
+ /**
24
+ * @inheritdoc
25
+ */
26
+ toString() {
27
+ return `Token(${this._key.description})`;
28
+ }
29
+ }
30
+ /**
31
+ * Возвращает новый токен.
32
+ * @param name Имя токена для отладки в случае ошибок.
33
+ * @return Токен.
34
+ */
35
+ function createToken(name) {
36
+ return new TokenImplementation(name);
37
+ }
38
+ exports.createToken = createToken;
39
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/di/token.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAM,mBAAmB;IAGvB;;;OAGG;IACH,YAAY,IAAa;QACvB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,QAA0B;QACjC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC;IAC3C,CAAC;CACF;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAY,IAAa;IAClD,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAFD,kCAEC"}
package/di/types.d.ts ADDED
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Токен - ключ который можно использовать для привязки реализации и получения компонента из контейнера.
3
+ * За токеном можно закрепить интерфейс. В дальнейшем это поможет нне ошибиться при привязке реализации.
4
+ */
5
+ export interface Token<T> {
6
+ readonly _key: symbol;
7
+ readonly _resolve: (registry: Map<symbol, any>) => T;
8
+ }
9
+ /**
10
+ * Резолвер. Получив токен вернет реализацию интерфейса, который за ним закреплён.
11
+ */
12
+ export interface Resolve {
13
+ <T>(token: Token<T>): T;
14
+ }
15
+ /**
16
+ * Провайдер - функция, которая, получив резолвер, должна вернуть реализацию интерфейса.
17
+ */
18
+ export interface Provider<T> {
19
+ (resolve: Resolve): T;
20
+ }
21
+ /**
22
+ * DI-контейнер.
23
+ * Позволяет зарегистрировать за токеном компонент в виде функции-провайдера и в дальнейшем получить его по токену.
24
+ */
25
+ export interface Container {
26
+ /**
27
+ * Регистрирует провайдер.
28
+ */
29
+ set: <T = never>(token: Token<T>, provider: Provider<T>) => void;
30
+ get: Resolve;
31
+ }
32
+ /**
33
+ * Интерфейс привязки компонента к токену.
34
+ */
35
+ export interface Binding<T> {
36
+ /**
37
+ * Привязывает к токену конкретное "статическое" значение.
38
+ */
39
+ toValue: (value: T) => void;
40
+ /**
41
+ * Привязывает к токену функцию-провайдер.
42
+ */
43
+ toProvider: (provider: Provider<T>) => void;
44
+ }
45
+ /** @internal */
46
+ export type ExtractType<T extends readonly Token<any>[]> = {
47
+ [index in keyof T]: T[index] extends T[number] ? ReturnType<T[index]['_resolve']> : never;
48
+ };
49
+ /**
50
+ * DI-Приложение. Расширенная версия DI-контейнера.
51
+ * Позволяет применять пресеты, задавать "родительские" приложения, вызывать callback-функции с инъекцией компонентов.
52
+ */
53
+ export interface Application {
54
+ /**
55
+ * Добавляет пресет к приложению. Пресет будет применен в момент первой попытки получить компонент или вызвать функцию.
56
+ */
57
+ preset(preset: Preset): void;
58
+ /**
59
+ * Получив приложение, пометит его как "родительское".
60
+ * При попытке достать компонент, в случае если его нет в текущем приложении, будет произведена попытка найти его в "родительском".
61
+ */
62
+ attach(parent: Application): void;
63
+ /**
64
+ * Аналог метода set у Container. Получив токен вернет интерфейс привязки реализации.
65
+ * @param token Токен.
66
+ */
67
+ bind<T>(token: Token<T>): Binding<T>;
68
+ /**
69
+ * Получив токен, вернет его реализацию если она была зарегистрирована.
70
+ * @param token Токен.
71
+ */
72
+ get<T>(token: Token<T>): T;
73
+ /**
74
+ * Получив список токенов и callback-функцию, вызовет функцию с компонентами по соответствующим токенам.
75
+ */
76
+ invoke<Tokens extends readonly Token<any>[]>(tokens: [...Tokens], fn: (...args: ExtractType<Tokens>) => void): void;
77
+ }
78
+ /**
79
+ * Пресет - набор провайдеров (с возможностью их добавлять/переопределять) который можно применить к DI-приложению.
80
+ */
81
+ export interface Preset {
82
+ /** @deprecated */
83
+ override: <T>(token: Token<T>, provider: Provider<T>) => this;
84
+ /** Добавляет провайдер в пресет. */
85
+ set: <T>(token: Token<T>, provider: Provider<T>) => this;
86
+ /** Применяет пресет к переданному приложению. */
87
+ apply: (app: Application) => void;
88
+ }
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/logger/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/di/types.ts"],"names":[],"mappings":""}