@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.
- package/cache/types.d.ts +24 -2
- package/config/{index.d.ts → base.d.ts} +2 -2
- package/config/{index.js → base.js} +3 -3
- package/config/base.js.map +1 -0
- package/config/browser.d.ts +1 -1
- package/config/browser.js +11 -2
- package/config/browser.js.map +1 -1
- package/config/node.d.ts +1 -1
- package/config/node.js +17 -6
- package/config/node.js.map +1 -1
- package/config/types.d.ts +8 -1
- package/di/application.d.ts +10 -0
- package/{container → di}/application.js +29 -8
- package/di/application.js.map +1 -0
- package/di/container.d.ts +6 -0
- package/di/container.js +52 -0
- package/di/container.js.map +1 -0
- package/di/errors.d.ts +32 -0
- package/di/errors.js +48 -0
- package/di/errors.js.map +1 -0
- package/di/index.d.ts +6 -0
- package/di/index.js +17 -0
- package/di/index.js.map +1 -0
- package/di/preset.d.ts +9 -0
- package/di/preset.js +31 -0
- package/di/preset.js.map +1 -0
- package/di/token.d.ts +7 -0
- package/di/token.js +39 -0
- package/di/token.js.map +1 -0
- package/di/types.d.ts +88 -0
- package/{container → di}/types.js +0 -0
- package/{logger → di}/types.js.map +1 -1
- package/error-tracking/index.d.ts +24 -0
- package/error-tracking/index.js +32 -0
- package/error-tracking/index.js.map +1 -0
- package/error-tracking/types.d.ts +20 -0
- package/{error-tracker → error-tracking}/types.js +0 -0
- package/{container → error-tracking}/types.js.map +1 -1
- package/http-client/middleware/cookie.d.ts +1 -0
- package/http-client/middleware/cookie.js +4 -2
- package/http-client/middleware/cookie.js.map +1 -1
- package/http-client/middleware/headers.d.ts +13 -0
- package/http-client/middleware/headers.js +24 -0
- package/http-client/middleware/headers.js.map +1 -0
- package/http-client/middleware/log.d.ts +27 -0
- package/http-client/middleware/log.js +26 -0
- package/http-client/middleware/log.js.map +1 -0
- package/http-client/middleware/tracing.d.ts +3 -3
- package/http-client/middleware/tracing.js +22 -9
- package/http-client/middleware/tracing.js.map +1 -1
- package/http-client/sauce/index.d.ts +20 -5
- package/http-client/sauce/index.js +38 -21
- package/http-client/sauce/index.js.map +1 -1
- package/http-client/types.d.ts +1 -1
- package/http-client/utils.d.ts +14 -7
- package/http-client/utils.js +43 -12
- package/http-client/utils.js.map +1 -1
- package/http-server/errors.d.ts +11 -0
- package/http-server/errors.js +18 -0
- package/http-server/errors.js.map +1 -0
- package/http-server/handler/health-check.d.ts +1 -1
- package/http-server/handler/health-check.js +1 -1
- package/http-server/middleware/{logging.d.ts → log.d.ts} +2 -2
- package/http-server/middleware/{logging.js → log.js} +6 -5
- package/http-server/middleware/log.js.map +1 -0
- package/http-server/middleware/metrics.js +2 -2
- package/http-server/middleware/metrics.js.map +1 -1
- package/http-server/middleware/tracing.d.ts +7 -1
- package/http-server/middleware/tracing.js +20 -2
- package/http-server/middleware/tracing.js.map +1 -1
- package/http-server/template/index.js +11 -6
- package/http-server/template/index.js.map +1 -1
- package/http-server/types.d.ts +2 -0
- package/http-server/utils.d.ts +14 -5
- package/http-server/utils.js +46 -21
- package/http-server/utils.js.map +1 -1
- package/log/handler/pino.d.ts +8 -0
- package/log/handler/pino.js +29 -0
- package/log/handler/pino.js.map +1 -0
- package/log/handler/sentry.d.ts +8 -0
- package/log/handler/sentry.js +50 -0
- package/log/handler/sentry.js.map +1 -0
- package/log/index.d.ts +2 -0
- package/log/index.js +6 -0
- package/log/index.js.map +1 -0
- package/{logger/index.d.ts → log/logger.d.ts} +0 -0
- package/{logger/index.js → log/logger.js} +1 -1
- package/log/logger.js.map +1 -0
- package/log/types.d.ts +41 -0
- package/{logger → log}/types.js +0 -0
- package/{preset → log}/types.js.map +1 -1
- package/metrics/constants.d.ts +3 -0
- package/metrics/constants.js +3 -0
- package/metrics/constants.js.map +1 -1
- package/metrics/node.d.ts +7 -0
- package/metrics/node.js +1 -0
- package/metrics/node.js.map +1 -1
- package/package.json +35 -30
- package/preset/browser/index.d.ts +10 -0
- package/preset/browser/index.js +71 -0
- package/preset/browser/index.js.map +1 -0
- package/preset/node/index.d.ts +16 -11
- package/preset/node/index.js +105 -61
- package/preset/node/index.js.map +1 -1
- package/preset/node/response.d.ts +12 -8
- package/preset/node/response.js +98 -28
- package/preset/node/response.js.map +1 -1
- package/preset/parts/providers.d.ts +7 -0
- package/preset/parts/providers.js +26 -0
- package/preset/parts/providers.js.map +1 -0
- package/preset/parts/types.d.ts +8 -0
- package/preset/{types.js → parts/types.js} +0 -0
- package/{error-tracker → preset/parts}/types.js.map +1 -1
- package/preset/parts/utils.d.ts +110 -0
- package/preset/parts/utils.js +261 -0
- package/preset/parts/utils.js.map +1 -0
- package/tokens.d.ts +39 -21
- package/tokens.js +35 -20
- package/tokens.js.map +1 -1
- package/tracing/index.d.ts +9 -0
- package/tracing/index.js +20 -0
- package/tracing/index.js.map +1 -0
- package/utils/browser/analytics/data-layer.d.ts +2 -2
- package/utils/browser/analytics/data-layer.js +4 -5
- package/utils/browser/analytics/data-layer.js.map +1 -1
- package/utils/browser/analytics/oko.d.ts +3 -2
- package/utils/browser/analytics/oko.js +2 -1
- package/utils/browser/analytics/oko.js.map +1 -1
- package/utils/browser/storage/index.d.ts +8 -0
- package/utils/browser/storage/index.js +6 -1
- package/utils/browser/storage/index.js.map +1 -1
- package/utils/function.d.ts +28 -0
- package/utils/function.js +23 -0
- package/utils/function.js.map +1 -0
- package/utils/react/error-handlers/index.d.ts +11 -8
- package/utils/react/error-handlers/index.js +8 -10
- package/utils/react/error-handlers/index.js.map +1 -1
- package/utils/redux/index.d.ts +3 -0
- package/utils/redux/index.js +8 -0
- package/utils/redux/index.js.map +1 -0
- package/utils/redux/remote-data.d.ts +83 -5
- package/utils/redux/remote-data.js +83 -1
- package/utils/redux/remote-data.js.map +1 -1
- package/utils/redux-saga/index.d.ts +3 -0
- package/utils/redux-saga/index.js +8 -0
- package/utils/redux-saga/index.js.map +1 -0
- package/utils/redux-saga/middleware.d.ts +8 -0
- package/utils/redux-saga/middleware.js +84 -0
- package/utils/redux-saga/middleware.js.map +1 -0
- package/utils/redux-saga/take-chain.d.ts +2 -0
- package/utils/redux-saga/take-chain.js +2 -0
- package/utils/redux-saga/take-chain.js.map +1 -1
- package/utils/redux-saga/types.d.ts +15 -0
- package/{saga-runner → utils/redux-saga}/types.js +0 -0
- package/utils/redux-saga/types.js.map +1 -0
- package/utils/ssr/index.d.ts +41 -0
- package/utils/ssr/index.js +54 -0
- package/utils/ssr/index.js.map +1 -0
- package/utils/webpack/env/index.d.ts +18 -0
- package/utils/webpack/env/index.js +76 -0
- package/utils/webpack/env/index.js.map +1 -0
- package/utils/webpack/env/types.d.ts +11 -0
- package/utils/webpack/env/types.js +3 -0
- package/utils/webpack/env/types.js.map +1 -0
- package/utils/webpack/env/utils.d.ts +15 -0
- package/utils/webpack/env/utils.js +52 -0
- package/utils/webpack/env/utils.js.map +1 -0
- package/utils/webpack/index.d.ts +6 -0
- package/utils/webpack/index.js +8 -0
- package/utils/webpack/index.js.map +1 -0
- package/utils/webpack/module-federation/index.d.ts +7 -1
- package/utils/webpack/module-federation/index.js +11 -4
- package/utils/webpack/module-federation/index.js.map +1 -1
- package/utils/webpack/module-federation/types.d.ts +11 -3
- package/utils/webpack/module-federation/utils.d.ts +6 -0
- package/utils/webpack/module-federation/utils.js +73 -17
- package/utils/webpack/module-federation/utils.js.map +1 -1
- package/config/index.js.map +0 -1
- package/config/utils.d.ts +0 -5
- package/config/utils.js +0 -12
- package/config/utils.js.map +0 -1
- package/container/application.d.ts +0 -25
- package/container/application.js.map +0 -1
- package/container/index.d.ts +0 -18
- package/container/index.js +0 -74
- package/container/index.js.map +0 -1
- package/container/types.d.ts +0 -14
- package/error-tracker/browser.d.ts +0 -8
- package/error-tracker/browser.js +0 -40
- package/error-tracker/browser.js.map +0 -1
- package/error-tracker/node.d.ts +0 -8
- package/error-tracker/node.js +0 -40
- package/error-tracker/node.js.map +0 -1
- package/error-tracker/types.d.ts +0 -18
- package/error-tracker/utils.d.ts +0 -12
- package/error-tracker/utils.js +0 -19
- package/error-tracker/utils.js.map +0 -1
- package/http-server/middleware/logging.js.map +0 -1
- package/logger/handler/console.d.ts +0 -8
- package/logger/handler/console.js +0 -36
- package/logger/handler/console.js.map +0 -1
- package/logger/handler/sentry.d.ts +0 -8
- package/logger/handler/sentry.js +0 -36
- package/logger/handler/sentry.js.map +0 -1
- package/logger/index.js.map +0 -1
- package/logger/types.d.ts +0 -24
- package/preset/index.d.ts +0 -7
- package/preset/index.js +0 -25
- package/preset/index.js.map +0 -1
- package/preset/types.d.ts +0 -7
- package/saga-runner/index.d.ts +0 -8
- package/saga-runner/index.js +0 -79
- package/saga-runner/index.js.map +0 -1
- package/saga-runner/types.d.ts +0 -10
- 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
|
-
|
|
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
|
-
|
|
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=
|
|
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"}
|
package/config/browser.d.ts
CHANGED
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
|
-
|
|
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
|
package/config/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/config/browser.ts"],"names":[],"mappings":";;;AACA,4CAAyC;
|
|
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
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
|
|
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
|
-
(
|
|
16
|
-
|
|
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
|
package/config/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/config/node.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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.
|
|
4
|
-
const
|
|
5
|
-
|
|
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
|
|
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,
|
|
41
|
-
container.set(
|
|
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
|
-
|
|
62
|
-
|
|
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"}
|
package/di/container.js
ADDED
|
@@ -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
|
package/di/errors.js.map
ADDED
|
@@ -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
|
package/di/index.js.map
ADDED
|
@@ -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
|
package/di/preset.js.map
ADDED
|
@@ -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
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
|
package/di/token.js.map
ADDED
|
@@ -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/
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/di/types.ts"],"names":[],"mappings":""}
|