@sima-land/isomorph 11.0.0-alpha.51 → 11.0.0-alpha.53
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/dist/cjs/di/application.js +1 -1
- package/dist/cjs/di/application.js.map +1 -1
- package/dist/cjs/di/container.js +1 -1
- package/dist/cjs/di/container.js.map +1 -1
- package/dist/cjs/di/preset.js +1 -1
- package/dist/cjs/di/preset.js.map +1 -1
- package/dist/cjs/http/utils.js +62 -0
- package/dist/cjs/http/utils.js.map +1 -1
- package/dist/cjs/log/logger.js +1 -1
- package/dist/cjs/log/logger.js.map +1 -1
- package/dist/cjs/package.json +6 -6
- package/dist/cjs/preset/bun/providers/config-source.js +1 -1
- package/dist/cjs/preset/bun/providers/config-source.js.map +1 -1
- package/dist/cjs/preset/bun/providers/log-handler-sentry.js +1 -1
- package/dist/cjs/preset/bun/providers/log-handler-sentry.js.map +1 -1
- package/dist/cjs/preset/bun/providers/logger.js +1 -1
- package/dist/cjs/preset/bun/providers/logger.js.map +1 -1
- package/dist/cjs/preset/bun/providers/serve-metrics.js +1 -1
- package/dist/cjs/preset/bun/providers/serve-metrics.js.map +1 -1
- package/dist/cjs/preset/bun/providers/serve-middleware.js +1 -1
- package/dist/cjs/preset/bun/providers/serve-middleware.js.map +1 -1
- package/dist/cjs/preset/bun/providers/service-routes.js +1 -1
- package/dist/cjs/preset/bun/providers/service-routes.js.map +1 -1
- package/dist/cjs/preset/bun-handler/index.js +0 -2
- package/dist/cjs/preset/bun-handler/index.js.map +1 -1
- package/dist/cjs/preset/bun-handler/providers/fetch-middleware.js +1 -1
- package/dist/cjs/preset/bun-handler/providers/fetch-middleware.js.map +1 -1
- package/dist/cjs/preset/bun-handler/providers/handler-main.js +1 -1
- package/dist/cjs/preset/bun-handler/providers/handler-main.js.map +1 -1
- package/dist/cjs/preset/bun-handler/providers/specific-params.js +1 -1
- package/dist/cjs/preset/bun-handler/providers/specific-params.js.map +1 -1
- package/dist/cjs/preset/isomorphic/types.js.map +1 -1
- package/dist/cjs/preset/isomorphic/utils/axios-logging.js +63 -45
- package/dist/cjs/preset/isomorphic/utils/axios-logging.js.map +1 -1
- package/dist/cjs/preset/isomorphic/utils/fetch-logging.js +29 -0
- package/dist/cjs/preset/isomorphic/utils/fetch-logging.js.map +1 -1
- package/dist/cjs/preset/server/providers/fetch-middleware.js +1 -1
- package/dist/cjs/preset/server/providers/fetch-middleware.js.map +1 -1
- package/dist/cjs/preset/server/providers/known-http-api-hosts.js +3 -1
- package/dist/cjs/preset/server/providers/known-http-api-hosts.js.map +1 -1
- package/dist/cjs/preset/server/providers/serve.js +1 -1
- package/dist/cjs/preset/server/providers/serve.js.map +1 -1
- package/dist/cjs/preset/web/providers/known-http-api-hosts.js +3 -1
- package/dist/cjs/preset/web/providers/known-http-api-hosts.js.map +1 -1
- package/dist/cjs/utils/redux/remote-data.js +1 -1
- package/dist/cjs/utils/redux/remote-data.js.map +1 -1
- package/dist/cjs/utils/redux-saga/middleware.js +1 -1
- package/dist/cjs/utils/redux-saga/middleware.js.map +1 -1
- package/dist/cjs/utils/web/storage/index.js +1 -1
- package/dist/cjs/utils/web/storage/index.js.map +1 -1
- package/dist/cjs/utils/webpack/index.js +6 -0
- package/dist/cjs/utils/webpack/index.js.map +1 -1
- package/dist/esm/di/application.js +1 -1
- package/dist/esm/di/application.js.map +1 -1
- package/dist/esm/di/container.js +1 -1
- package/dist/esm/di/container.js.map +1 -1
- package/dist/esm/di/preset.js +1 -1
- package/dist/esm/di/preset.js.map +1 -1
- package/dist/esm/http/utils.js +60 -0
- package/dist/esm/http/utils.js.map +1 -1
- package/dist/esm/log/logger.js +1 -1
- package/dist/esm/log/logger.js.map +1 -1
- package/dist/esm/package.json +6 -6
- package/dist/esm/preset/bun/providers/config-source.js +1 -1
- package/dist/esm/preset/bun/providers/config-source.js.map +1 -1
- package/dist/esm/preset/bun/providers/log-handler-sentry.js +1 -1
- package/dist/esm/preset/bun/providers/log-handler-sentry.js.map +1 -1
- package/dist/esm/preset/bun/providers/logger.js +1 -1
- package/dist/esm/preset/bun/providers/logger.js.map +1 -1
- package/dist/esm/preset/bun/providers/serve-metrics.js +1 -1
- package/dist/esm/preset/bun/providers/serve-metrics.js.map +1 -1
- package/dist/esm/preset/bun/providers/serve-middleware.js +1 -1
- package/dist/esm/preset/bun/providers/serve-middleware.js.map +1 -1
- package/dist/esm/preset/bun/providers/service-routes.js +1 -1
- package/dist/esm/preset/bun/providers/service-routes.js.map +1 -1
- package/dist/esm/preset/bun-handler/index.js +0 -1
- package/dist/esm/preset/bun-handler/index.js.map +1 -1
- package/dist/esm/preset/bun-handler/providers/fetch-middleware.js +1 -1
- package/dist/esm/preset/bun-handler/providers/fetch-middleware.js.map +1 -1
- package/dist/esm/preset/bun-handler/providers/handler-main.js +1 -1
- package/dist/esm/preset/bun-handler/providers/handler-main.js.map +1 -1
- package/dist/esm/preset/bun-handler/providers/specific-params.js +1 -1
- package/dist/esm/preset/bun-handler/providers/specific-params.js.map +1 -1
- package/dist/esm/preset/isomorphic/types.js.map +1 -1
- package/dist/esm/preset/isomorphic/utils/axios-logging.js +63 -45
- package/dist/esm/preset/isomorphic/utils/axios-logging.js.map +1 -1
- package/dist/esm/preset/isomorphic/utils/fetch-logging.js +29 -0
- package/dist/esm/preset/isomorphic/utils/fetch-logging.js.map +1 -1
- package/dist/esm/preset/server/providers/fetch-middleware.js +1 -1
- package/dist/esm/preset/server/providers/fetch-middleware.js.map +1 -1
- package/dist/esm/preset/server/providers/known-http-api-hosts.js +3 -1
- package/dist/esm/preset/server/providers/known-http-api-hosts.js.map +1 -1
- package/dist/esm/preset/server/providers/serve.js +1 -1
- package/dist/esm/preset/server/providers/serve.js.map +1 -1
- package/dist/esm/preset/web/providers/known-http-api-hosts.js +3 -1
- package/dist/esm/preset/web/providers/known-http-api-hosts.js.map +1 -1
- package/dist/esm/utils/redux/remote-data.js +1 -1
- package/dist/esm/utils/redux/remote-data.js.map +1 -1
- package/dist/esm/utils/redux-saga/middleware.js +1 -1
- package/dist/esm/utils/redux-saga/middleware.js.map +1 -1
- package/dist/esm/utils/web/storage/index.js +1 -1
- package/dist/esm/utils/web/storage/index.js.map +1 -1
- package/dist/esm/utils/webpack/index.js +2 -3
- package/dist/esm/utils/webpack/index.js.map +1 -1
- package/dist/types/http/utils.d.ts +16 -0
- package/dist/types/http/utils.d.ts.map +1 -1
- package/dist/types/preset/bun-handler/index.d.ts.map +1 -1
- package/dist/types/preset/isomorphic/types.d.ts +1 -1
- package/dist/types/preset/isomorphic/types.d.ts.map +1 -1
- package/dist/types/preset/isomorphic/utils/axios-logging.d.ts.map +1 -1
- package/dist/types/preset/isomorphic/utils/fetch-logging.d.ts.map +1 -1
- package/dist/types/preset/server/providers/known-http-api-hosts.d.ts.map +1 -1
- package/dist/types/preset/web/providers/known-http-api-hosts.d.ts.map +1 -1
- package/dist/types/utils/webpack/index.d.ts +4 -6
- package/dist/types/utils/webpack/index.d.ts.map +1 -1
- package/package.json +11 -11
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.AxiosLogging = void 0;
|
|
7
|
+
var _utils = require("../../../http/utils");
|
|
7
8
|
var _log = require("../../../log");
|
|
8
9
|
var _axios = require("../../../utils/axios");
|
|
9
10
|
var _disableable = require("./disableable");
|
|
@@ -93,54 +94,71 @@ class AxiosLogging extends _disableable.Disableable {
|
|
|
93
94
|
if (this.isDisabled()) {
|
|
94
95
|
return;
|
|
95
96
|
}
|
|
96
|
-
if (_axios2.default.isAxiosError(error)) {
|
|
97
|
-
const {
|
|
98
|
-
requestInfo
|
|
99
|
-
} = this;
|
|
100
|
-
const statusCode = error.response?.status || 'UNKNOWN';
|
|
101
97
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
this.logger.error(new _log.DetailedError(`HTTP request failed, status code: ${statusCode}, error message: ${error.message}`, {
|
|
105
|
-
level: (0, _severityFromStatus.severityFromStatus)(error.response?.status),
|
|
106
|
-
context: [{
|
|
107
|
-
key: 'Request details',
|
|
108
|
-
data: {
|
|
109
|
-
url: requestInfo.url,
|
|
110
|
-
baseURL: requestInfo.baseURL,
|
|
111
|
-
method: requestInfo.method,
|
|
112
|
-
headers: requestInfo.headers,
|
|
113
|
-
data: requestInfo.data,
|
|
114
|
-
params: requestInfo.params
|
|
115
|
-
}
|
|
116
|
-
}, {
|
|
117
|
-
key: 'Response details',
|
|
118
|
-
data: {
|
|
119
|
-
data: error.response?.data,
|
|
120
|
-
// копируем так как в Sentry падает ошибка: **non-serializable** (TypeError: Object.getPrototypeOf(...) is null)
|
|
121
|
-
headers: {
|
|
122
|
-
...error.response?.headers
|
|
123
|
-
},
|
|
124
|
-
error: error.toJSON()
|
|
125
|
-
}
|
|
126
|
-
}]
|
|
127
|
-
}));
|
|
128
|
-
if (typeof statusCode === 'number') {
|
|
129
|
-
this.logger.info(new _log.Breadcrumb({
|
|
130
|
-
category: 'http.response',
|
|
131
|
-
type: 'http',
|
|
132
|
-
data: {
|
|
133
|
-
url: requestInfo.readyURL,
|
|
134
|
-
method: requestInfo.method,
|
|
135
|
-
status_code: statusCode,
|
|
136
|
-
params: requestInfo.params
|
|
137
|
-
},
|
|
138
|
-
level: 'error'
|
|
139
|
-
}));
|
|
140
|
-
}
|
|
141
|
-
} else {
|
|
98
|
+
// если это не AxiosError тогда выполняем простое логирование
|
|
99
|
+
if (!_axios2.default.isAxiosError(error)) {
|
|
142
100
|
this.logger.error(error);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const statusCode = error.response?.status ?? 'UNKNOWN';
|
|
104
|
+
const {
|
|
105
|
+
requestInfo
|
|
106
|
+
} = this;
|
|
107
|
+
if (typeof statusCode === 'number') {
|
|
108
|
+
this.logger.info(new _log.Breadcrumb({
|
|
109
|
+
category: 'http.response',
|
|
110
|
+
type: 'http',
|
|
111
|
+
data: {
|
|
112
|
+
url: requestInfo.readyURL,
|
|
113
|
+
method: requestInfo.method,
|
|
114
|
+
status_code: statusCode,
|
|
115
|
+
params: requestInfo.params
|
|
116
|
+
},
|
|
117
|
+
level: 'error'
|
|
118
|
+
}));
|
|
143
119
|
}
|
|
120
|
+
|
|
121
|
+
// по общему соглашению фильтруем сетевые ошибки
|
|
122
|
+
if ((0, _utils.isNetworkError)(error.cause)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// по общему соглашению фильтруем ошибки обрывания
|
|
127
|
+
if ((0, _utils.isAbortError)(error.cause)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// по общему соглашению фильтруем все статусы < 500
|
|
132
|
+
if (typeof statusCode === 'number' && statusCode < 500) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// @todo добавить метод в духе errorStatusFilter(s => s !== 422)
|
|
137
|
+
|
|
138
|
+
this.logger.error(new _log.DetailedError(`HTTP request failed, status code: ${statusCode}, error message: ${error.message}`, {
|
|
139
|
+
level: (0, _severityFromStatus.severityFromStatus)(error.response?.status),
|
|
140
|
+
context: [{
|
|
141
|
+
key: 'Request details',
|
|
142
|
+
data: {
|
|
143
|
+
url: requestInfo.url,
|
|
144
|
+
baseURL: requestInfo.baseURL,
|
|
145
|
+
method: requestInfo.method,
|
|
146
|
+
headers: requestInfo.headers,
|
|
147
|
+
data: requestInfo.data,
|
|
148
|
+
params: requestInfo.params
|
|
149
|
+
}
|
|
150
|
+
}, {
|
|
151
|
+
key: 'Response details',
|
|
152
|
+
data: {
|
|
153
|
+
data: error.response?.data,
|
|
154
|
+
// копируем так как в Sentry падает ошибка: **non-serializable** (TypeError: Object.getPrototypeOf(...) is null)
|
|
155
|
+
headers: {
|
|
156
|
+
...error.response?.headers
|
|
157
|
+
},
|
|
158
|
+
error: error.toJSON()
|
|
159
|
+
}
|
|
160
|
+
}]
|
|
161
|
+
}));
|
|
144
162
|
}
|
|
145
163
|
}
|
|
146
164
|
exports.AxiosLogging = AxiosLogging;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-logging.js","names":["
|
|
1
|
+
{"version":3,"file":"axios-logging.js","names":["_utils","require","_log","_axios","_disableable","_displayUrl","_severityFromStatus","_axios2","_interopRequireDefault","obj","__esModule","default","AxiosLogging","Disableable","constructor","logger","data","config","applyAxiosDefaults","defaults","requestInfo","readyURL","displayUrl","baseURL","url","beforeRequest","isDisabled","method","params","info","Breadcrumb","category","type","level","afterResponse","response","status_code","status","onCatch","error","axios","isAxiosError","statusCode","isNetworkError","cause","isAbortError","DetailedError","message","severityFromStatus","context","key","headers","toJSON","exports"],"sources":["../../../../../src/preset/isomorphic/utils/axios-logging.ts"],"sourcesContent":["import { isAbortError, isNetworkError } from '../../../http/utils';\nimport { Breadcrumb, DetailedError, type Logger } from '../../../log';\nimport {\n type LogMiddlewareHandler,\n applyAxiosDefaults,\n SharedData,\n DoneSharedData,\n FailSharedData,\n} from '../../../utils/axios';\nimport { Disableable } from './disableable';\nimport { displayUrl } from './display-url';\nimport { severityFromStatus } from './severity-from-status';\nimport axios from 'axios';\n\n/**\n * Обработчик для промежуточного слоя логирования исходящих http-запросов.\n * Отправляет хлебные крошки и данные ошибки, пригодные для Sentry.\n */\nexport class AxiosLogging extends Disableable implements LogMiddlewareHandler {\n logger: Logger;\n\n protected readonly requestInfo: ReturnType<typeof applyAxiosDefaults> & {\n readyURL: string;\n };\n\n /**\n * Конструктор.\n * @param logger Logger.\n * @param data Данные запроса.\n */\n constructor(logger: Logger, data: SharedData) {\n super();\n const config = applyAxiosDefaults(data.config, data.defaults);\n\n this.logger = logger;\n\n this.requestInfo = {\n ...config,\n readyURL: displayUrl(config.baseURL, config.url),\n };\n }\n\n /**\n * Отправит хлебные крошки перед запросом.\n */\n beforeRequest() {\n if (this.isDisabled()) {\n return;\n }\n\n const { readyURL, method, params } = this.requestInfo;\n\n this.logger.info(\n new Breadcrumb({\n category: 'http.request',\n type: 'http',\n data: {\n url: readyURL,\n method,\n params,\n },\n level: 'info',\n }),\n );\n }\n\n /**\n * Отправит хлебные крошки после запроса.\n * @param data Данные ответа.\n */\n afterResponse({ response }: DoneSharedData) {\n if (this.isDisabled()) {\n return;\n }\n\n const { readyURL, method, params } = this.requestInfo;\n\n this.logger.info(\n new Breadcrumb({\n category: 'http.response',\n type: 'http',\n data: {\n url: readyURL,\n method,\n status_code: response.status,\n params,\n },\n level: 'info',\n }),\n );\n }\n\n /**\n * Отправит данные ошибки при перехвате.\n * @param data Данные запроса.\n */\n onCatch({ error }: FailSharedData) {\n if (this.isDisabled()) {\n return;\n }\n\n // если это не AxiosError тогда выполняем простое логирование\n if (!axios.isAxiosError(error)) {\n this.logger.error(error);\n return;\n }\n\n const statusCode = error.response?.status ?? 'UNKNOWN';\n const { requestInfo } = this;\n\n if (typeof statusCode === 'number') {\n this.logger.info(\n new Breadcrumb({\n category: 'http.response',\n type: 'http',\n data: {\n url: requestInfo.readyURL,\n method: requestInfo.method,\n status_code: statusCode,\n params: requestInfo.params,\n },\n level: 'error',\n }),\n );\n }\n\n // по общему соглашению фильтруем сетевые ошибки\n if (isNetworkError(error.cause)) {\n return;\n }\n\n // по общему соглашению фильтруем ошибки обрывания\n if (isAbortError(error.cause)) {\n return;\n }\n\n // по общему соглашению фильтруем все статусы < 500\n if (typeof statusCode === 'number' && statusCode < 500) {\n return;\n }\n\n // @todo добавить метод в духе errorStatusFilter(s => s !== 422)\n\n this.logger.error(\n new DetailedError(\n `HTTP request failed, status code: ${statusCode}, error message: ${error.message}`,\n {\n level: severityFromStatus(error.response?.status),\n context: [\n {\n key: 'Request details',\n data: {\n url: requestInfo.url,\n baseURL: requestInfo.baseURL,\n method: requestInfo.method,\n headers: requestInfo.headers,\n data: requestInfo.data,\n params: requestInfo.params,\n },\n },\n {\n key: 'Response details',\n data: {\n data: error.response?.data,\n\n // копируем так как в Sentry падает ошибка: **non-serializable** (TypeError: Object.getPrototypeOf(...) is null)\n headers: { ...error.response?.headers },\n\n error: error.toJSON(),\n },\n },\n ],\n },\n ),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.FetchLogging = void 0;
|
|
7
7
|
var _http = require("../../../http");
|
|
8
|
+
var _utils = require("../../../http/utils");
|
|
8
9
|
var _log = require("../../../log");
|
|
9
10
|
var _disableable = require("./disableable");
|
|
10
11
|
/**
|
|
@@ -55,6 +56,24 @@ class FetchLogging extends _disableable.Disableable {
|
|
|
55
56
|
},
|
|
56
57
|
level: response.ok ? 'info' : 'error'
|
|
57
58
|
}));
|
|
59
|
+
|
|
60
|
+
// по общему соглашению фильтруем все статусы < 500
|
|
61
|
+
if (response.status < 500) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.logger.error(new _log.DetailedError(`HTTP request failed, status code: ${response.status}`, {
|
|
65
|
+
level: 'error',
|
|
66
|
+
context: [{
|
|
67
|
+
key: 'Outgoing request details',
|
|
68
|
+
data: {
|
|
69
|
+
url: _http.FetchUtil.withoutParams(request.url).href,
|
|
70
|
+
method: request.method,
|
|
71
|
+
headers: request.headers,
|
|
72
|
+
params: Object.fromEntries(new URL(request.url).searchParams.entries())
|
|
73
|
+
// @todo data
|
|
74
|
+
}
|
|
75
|
+
}]
|
|
76
|
+
}));
|
|
58
77
|
}
|
|
59
78
|
|
|
60
79
|
/** @inheritdoc */
|
|
@@ -65,6 +84,16 @@ class FetchLogging extends _disableable.Disableable {
|
|
|
65
84
|
if (this.isDisabled()) {
|
|
66
85
|
return;
|
|
67
86
|
}
|
|
87
|
+
|
|
88
|
+
// по общему соглашению фильтруем сетевые ошибки
|
|
89
|
+
if ((0, _utils.isNetworkError)(error)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// по общему соглашению фильтруем ошибки обрывания
|
|
94
|
+
if ((0, _utils.isAbortError)(error)) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
68
97
|
this.logger.error(new _log.DetailedError(String(error), {
|
|
69
98
|
level: 'error',
|
|
70
99
|
context: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-logging.js","names":["_http","require","_log","_disableable","FetchLogging","Disableable","constructor","logger","onRequest","request","isDisabled","info","Breadcrumb","category","type","data","url","FetchUtil","withoutParams","href","method","params","Object","fromEntries","URL","searchParams","entries","level","onResponse","response","status_code","status","ok","
|
|
1
|
+
{"version":3,"file":"fetch-logging.js","names":["_http","require","_utils","_log","_disableable","FetchLogging","Disableable","constructor","logger","onRequest","request","isDisabled","info","Breadcrumb","category","type","data","url","FetchUtil","withoutParams","href","method","params","Object","fromEntries","URL","searchParams","entries","level","onResponse","response","status_code","status","ok","error","DetailedError","context","key","headers","onCatch","isNetworkError","isAbortError","String","exports"],"sources":["../../../../../src/preset/isomorphic/utils/fetch-logging.ts"],"sourcesContent":["import { LogHandler, LogData, DoneLogData, FetchUtil, FailLogData } from '../../../http';\nimport { isAbortError, isNetworkError } from '../../../http/utils';\nimport { Breadcrumb, DetailedError, Logger } from '../../../log';\nimport { Disableable } from './disableable';\n\n/**\n * Обработчик логирования внешних http-запросов.\n */\nexport class FetchLogging extends Disableable implements LogHandler {\n logger: Logger;\n\n /** @inheritdoc */\n constructor(logger: Logger) {\n super();\n this.logger = logger;\n }\n\n /** @inheritdoc */\n onRequest({ request }: LogData) {\n if (this.isDisabled()) {\n return;\n }\n\n this.logger.info(\n new Breadcrumb({\n category: 'http.request',\n type: 'http',\n data: {\n url: FetchUtil.withoutParams(request.url).href,\n method: request.method,\n params: Object.fromEntries(new URL(request.url).searchParams.entries()),\n },\n level: 'info',\n }),\n );\n }\n\n /** @inheritdoc */\n onResponse({ response, request }: DoneLogData) {\n if (this.isDisabled()) {\n return;\n }\n\n this.logger.info(\n new Breadcrumb({\n category: 'http.response',\n type: 'http',\n data: {\n url: FetchUtil.withoutParams(request.url).href,\n method: request.method,\n status_code: response.status,\n params: Object.fromEntries(new URL(request.url).searchParams.entries()),\n },\n level: response.ok ? 'info' : 'error',\n }),\n );\n\n // по общему соглашению фильтруем все статусы < 500\n if (response.status < 500) {\n return;\n }\n\n this.logger.error(\n new DetailedError(`HTTP request failed, status code: ${response.status}`, {\n level: 'error',\n context: [\n {\n key: 'Outgoing request details',\n data: {\n url: FetchUtil.withoutParams(request.url).href,\n method: request.method,\n headers: request.headers,\n params: Object.fromEntries(new URL(request.url).searchParams.entries()),\n // @todo data\n },\n },\n ],\n }),\n );\n }\n\n /** @inheritdoc */\n onCatch({ error, request }: FailLogData) {\n if (this.isDisabled()) {\n return;\n }\n\n // по общему соглашению фильтруем сетевые ошибки\n if (isNetworkError(error)) {\n return;\n }\n\n // по общему соглашению фильтруем ошибки обрывания\n if (isAbortError(error)) {\n return;\n }\n\n this.logger.error(\n new DetailedError(String(error), {\n level: 'error',\n context: [\n {\n key: 'Outgoing request details',\n data: {\n url: FetchUtil.withoutParams(request.url).href,\n method: request.method,\n headers: request.headers,\n params: Object.fromEntries(new URL(request.url).searchParams.entries()),\n // @todo data\n },\n },\n ],\n }),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.provideFetchMiddleware = provideFetchMiddleware;
|
|
7
|
-
/* eslint-disable
|
|
7
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
8
8
|
|
|
9
9
|
function provideFetchMiddleware() {
|
|
10
10
|
// @todo добавить логирование ошибок?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-middleware.js","names":["provideFetchMiddleware"],"sources":["../../../../../src/preset/server/providers/fetch-middleware.ts"],"sourcesContent":["/* eslint-disable
|
|
1
|
+
{"version":3,"file":"fetch-middleware.js","names":["provideFetchMiddleware"],"sources":["../../../../../src/preset/server/providers/fetch-middleware.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport { Middleware } from '../../../http';\n\nexport function provideFetchMiddleware(): Middleware[] {\n // @todo добавить логирование ошибок?\n return [];\n}\n"],"mappings":";;;;;;AAAA;;AAGO,SAASA,sBAAsBA,CAAA,EAAiB;EACrD;EACA,OAAO,EAAE;AACX"}
|
|
@@ -18,7 +18,9 @@ function provideKnownHttpApiHosts(resolve) {
|
|
|
18
18
|
simaV3: 'API_URL_SIMALAND_V3',
|
|
19
19
|
simaV4: 'API_URL_SIMALAND_V4',
|
|
20
20
|
simaV6: 'API_URL_SIMALAND_V6',
|
|
21
|
-
chponkiV2: 'API_URL_CHPONKI_V2'
|
|
21
|
+
chponkiV2: 'API_URL_CHPONKI_V2',
|
|
22
|
+
shuttle: 'API_URL_SHUTTLE',
|
|
23
|
+
fileDispatcher: 'API_URL_FILE_DISPATCHER'
|
|
22
24
|
}, source);
|
|
23
25
|
}
|
|
24
26
|
//# sourceMappingURL=known-http-api-hosts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"known-http-api-hosts.js","names":["_tokens","require","_httpApiHostPool","provideKnownHttpApiHosts","resolve","source","KnownToken","Config","HttpApiHostPool","ilium","simaV3","simaV4","simaV6","chponkiV2"],"sources":["../../../../../src/preset/server/providers/known-http-api-hosts.ts"],"sourcesContent":["import type { Resolve } from '../../../di';\nimport type { KnownHttpApiKey } from '../../isomorphic';\nimport { KnownToken } from '../../../tokens';\nimport { HttpApiHostPool } from '../../isomorphic/utils/http-api-host-pool';\n\n/**\n * Провайдер известных http-хостов.\n * @param resolve Функция для получения зависимости по токену.\n * @return Пул известных http-хостов.\n */\nexport function provideKnownHttpApiHosts(resolve: Resolve): HttpApiHostPool<KnownHttpApiKey> {\n const source = resolve(KnownToken.Config.source);\n\n return new HttpApiHostPool(\n {\n ilium: 'API_URL_ILIUM',\n simaV3: 'API_URL_SIMALAND_V3',\n simaV4: 'API_URL_SIMALAND_V4',\n simaV6: 'API_URL_SIMALAND_V6',\n chponkiV2: 'API_URL_CHPONKI_V2',\n },\n source,\n );\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,wBAAwBA,CAACC,OAAgB,EAAoC;EAC3F,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAEhD,OAAO,IAAIG,gCAAe,CACxB;IACEC,KAAK,EAAE,eAAe;IACtBC,MAAM,EAAE,qBAAqB;IAC7BC,MAAM,EAAE,qBAAqB;IAC7BC,MAAM,EAAE,qBAAqB;IAC7BC,SAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"known-http-api-hosts.js","names":["_tokens","require","_httpApiHostPool","provideKnownHttpApiHosts","resolve","source","KnownToken","Config","HttpApiHostPool","ilium","simaV3","simaV4","simaV6","chponkiV2","shuttle","fileDispatcher"],"sources":["../../../../../src/preset/server/providers/known-http-api-hosts.ts"],"sourcesContent":["import type { Resolve } from '../../../di';\nimport type { KnownHttpApiKey } from '../../isomorphic';\nimport { KnownToken } from '../../../tokens';\nimport { HttpApiHostPool } from '../../isomorphic/utils/http-api-host-pool';\n\n/**\n * Провайдер известных http-хостов.\n * @param resolve Функция для получения зависимости по токену.\n * @return Пул известных http-хостов.\n */\nexport function provideKnownHttpApiHosts(resolve: Resolve): HttpApiHostPool<KnownHttpApiKey> {\n const source = resolve(KnownToken.Config.source);\n\n return new HttpApiHostPool(\n {\n ilium: 'API_URL_ILIUM',\n simaV3: 'API_URL_SIMALAND_V3',\n simaV4: 'API_URL_SIMALAND_V4',\n simaV6: 'API_URL_SIMALAND_V6',\n chponkiV2: 'API_URL_CHPONKI_V2',\n shuttle: 'API_URL_SHUTTLE',\n fileDispatcher: 'API_URL_FILE_DISPATCHER',\n },\n source,\n );\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,wBAAwBA,CAACC,OAAgB,EAAoC;EAC3F,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAEhD,OAAO,IAAIG,gCAAe,CACxB;IACEC,KAAK,EAAE,eAAe;IACtBC,MAAM,EAAE,qBAAqB;IAC7BC,MAAM,EAAE,qBAAqB;IAC7BC,MAAM,EAAE,qBAAqB;IAC7BC,SAAS,EAAE,oBAAoB;IAC/BC,OAAO,EAAE,iBAAiB;IAC1BC,cAAc,EAAE;EAClB,CAAC,EACDV,MACF,CAAC;AACH"}
|
|
@@ -8,7 +8,7 @@ var _tokens = require("../../../tokens");
|
|
|
8
8
|
var _http = require("../../../http");
|
|
9
9
|
var _fetchTools = require("@krutoo/fetch-tools");
|
|
10
10
|
var _applyServerMiddleware = require("../utils/apply-server-middleware");
|
|
11
|
-
/* eslint-disable
|
|
11
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
12
12
|
|
|
13
13
|
function provideServe(resolve) {
|
|
14
14
|
const config = resolve(_tokens.KnownToken.Config.base);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","names":["_tokens","require","_http","_fetchTools","_applyServerMiddleware","provideServe","resolve","config","KnownToken","Config","base","pageRoutes","Http","Serve","serviceRoutes","middleware","proxyConfig","Proxy","enhance","env","applyMiddleware","Array","isArray","map","proxy","identity","builder","router","pattern","handler","path","method","pageHandler","applyServerMiddleware","request","events","EventTarget","build","value"],"sources":["../../../../../src/preset/server/providers/serve.ts"],"sourcesContent":["/* eslint-disable
|
|
1
|
+
{"version":3,"file":"serve.js","names":["_tokens","require","_http","_fetchTools","_applyServerMiddleware","provideServe","resolve","config","KnownToken","Config","base","pageRoutes","Http","Serve","serviceRoutes","middleware","proxyConfig","Proxy","enhance","env","applyMiddleware","Array","isArray","map","proxy","identity","builder","router","pattern","handler","path","method","pageHandler","applyServerMiddleware","request","events","EventTarget","build","value"],"sources":["../../../../../src/preset/server/providers/serve.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport { Handler, proxy } from '../../../http';\nimport { router, applyMiddleware } from '@krutoo/fetch-tools';\nimport { applyServerMiddleware } from '../utils/apply-server-middleware';\n\nexport function provideServe(resolve: Resolve): Handler {\n const config = resolve(KnownToken.Config.base);\n const pageRoutes = resolve(KnownToken.Http.Serve.pageRoutes);\n const serviceRoutes = resolve(KnownToken.Http.Serve.serviceRoutes);\n const middleware = resolve(KnownToken.Http.Serve.middleware);\n const proxyConfig = resolve(KnownToken.Http.Serve.Proxy.config);\n\n const enhance =\n config.env === 'development' && proxyConfig\n ? applyMiddleware(\n ...(Array.isArray(proxyConfig) ? proxyConfig.map(proxy) : [proxy(proxyConfig)]),\n )\n : identity;\n\n const builder = router.builder();\n\n // маршруты с промежуточными слоями\n for (const [pattern, handler] of pageRoutes) {\n const path = typeof pattern === 'string' ? pattern : pattern.path;\n const method = typeof pattern === 'string' ? 'get' : pattern.method;\n const pageHandler = applyServerMiddleware(...middleware)(handler);\n\n builder[method](path, request => pageHandler(request, { events: new EventTarget() }));\n }\n\n // служебные маршруты (к ним не применяются промежуточные слои)\n for (const [pattern, handler] of serviceRoutes) {\n const path = typeof pattern === 'string' ? pattern : pattern.path;\n const method = typeof pattern === 'string' ? 'get' : pattern.method;\n\n builder[method](path, request => handler(request, { events: new EventTarget() }));\n }\n\n // @todo также добавить apiRoutes?\n return enhance(builder.build());\n}\n\nfunction identity<T>(value: T): T {\n return value;\n}\n"],"mappings":";;;;;;AAEA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AALA;;AAOO,SAASI,YAAYA,CAACC,OAAgB,EAAW;EACtD,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACC,IAAI,CAAC;EAC9C,MAAMC,UAAU,GAAGL,OAAO,CAACE,kBAAU,CAACI,IAAI,CAACC,KAAK,CAACF,UAAU,CAAC;EAC5D,MAAMG,aAAa,GAAGR,OAAO,CAACE,kBAAU,CAACI,IAAI,CAACC,KAAK,CAACC,aAAa,CAAC;EAClE,MAAMC,UAAU,GAAGT,OAAO,CAACE,kBAAU,CAACI,IAAI,CAACC,KAAK,CAACE,UAAU,CAAC;EAC5D,MAAMC,WAAW,GAAGV,OAAO,CAACE,kBAAU,CAACI,IAAI,CAACC,KAAK,CAACI,KAAK,CAACV,MAAM,CAAC;EAE/D,MAAMW,OAAO,GACXX,MAAM,CAACY,GAAG,KAAK,aAAa,IAAIH,WAAW,GACvC,IAAAI,2BAAe,EACb,IAAIC,KAAK,CAACC,OAAO,CAACN,WAAW,CAAC,GAAGA,WAAW,CAACO,GAAG,CAACC,WAAK,CAAC,GAAG,CAAC,IAAAA,WAAK,EAACR,WAAW,CAAC,CAAC,CAChF,CAAC,GACDS,QAAQ;EAEd,MAAMC,OAAO,GAAGC,kBAAM,CAACD,OAAO,CAAC,CAAC;;EAEhC;EACA,KAAK,MAAM,CAACE,OAAO,EAAEC,OAAO,CAAC,IAAIlB,UAAU,EAAE;IAC3C,MAAMmB,IAAI,GAAG,OAAOF,OAAO,KAAK,QAAQ,GAAGA,OAAO,GAAGA,OAAO,CAACE,IAAI;IACjE,MAAMC,MAAM,GAAG,OAAOH,OAAO,KAAK,QAAQ,GAAG,KAAK,GAAGA,OAAO,CAACG,MAAM;IACnE,MAAMC,WAAW,GAAG,IAAAC,4CAAqB,EAAC,GAAGlB,UAAU,CAAC,CAACc,OAAO,CAAC;IAEjEH,OAAO,CAACK,MAAM,CAAC,CAACD,IAAI,EAAEI,OAAO,IAAIF,WAAW,CAACE,OAAO,EAAE;MAAEC,MAAM,EAAE,IAAIC,WAAW,CAAC;IAAE,CAAC,CAAC,CAAC;EACvF;;EAEA;EACA,KAAK,MAAM,CAACR,OAAO,EAAEC,OAAO,CAAC,IAAIf,aAAa,EAAE;IAC9C,MAAMgB,IAAI,GAAG,OAAOF,OAAO,KAAK,QAAQ,GAAGA,OAAO,GAAGA,OAAO,CAACE,IAAI;IACjE,MAAMC,MAAM,GAAG,OAAOH,OAAO,KAAK,QAAQ,GAAG,KAAK,GAAGA,OAAO,CAACG,MAAM;IAEnEL,OAAO,CAACK,MAAM,CAAC,CAACD,IAAI,EAAEI,OAAO,IAAIL,OAAO,CAACK,OAAO,EAAE;MAAEC,MAAM,EAAE,IAAIC,WAAW,CAAC;IAAE,CAAC,CAAC,CAAC;EACnF;;EAEA;EACA,OAAOlB,OAAO,CAACQ,OAAO,CAACW,KAAK,CAAC,CAAC,CAAC;AACjC;AAEA,SAASZ,QAAQA,CAAIa,KAAQ,EAAK;EAChC,OAAOA,KAAK;AACd"}
|
|
@@ -18,7 +18,9 @@ function provideKnownHttpApiHosts(resolve) {
|
|
|
18
18
|
simaV3: 'PUBLIC_API_URL_SIMALAND_V3',
|
|
19
19
|
simaV4: 'PUBLIC_API_URL_SIMALAND_V4',
|
|
20
20
|
simaV6: 'PUBLIC_API_URL_SIMALAND_V6',
|
|
21
|
-
chponkiV2: 'PUBLIC_API_URL_CHPONKI_V2'
|
|
21
|
+
chponkiV2: 'PUBLIC_API_URL_CHPONKI_V2',
|
|
22
|
+
shuttle: 'PUBLIC_API_URL_SHUTTLE',
|
|
23
|
+
fileDispatcher: 'PUBLIC_API_URL_FILE_DISPATCHER'
|
|
22
24
|
}, source);
|
|
23
25
|
}
|
|
24
26
|
//# sourceMappingURL=known-http-api-hosts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"known-http-api-hosts.js","names":["_tokens","require","_httpApiHostPool","provideKnownHttpApiHosts","resolve","source","KnownToken","Config","HttpApiHostPool","ilium","simaV3","simaV4","simaV6","chponkiV2"],"sources":["../../../../../src/preset/web/providers/known-http-api-hosts.ts"],"sourcesContent":["import { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport { KnownHttpApiKey } from '../../isomorphic/types';\nimport { HttpApiHostPool } from '../../isomorphic/utils/http-api-host-pool';\n\n/**\n * Провайдер известных http-хостов.\n * @param resolve Функция для получения зависимости по токену.\n * @return Пул известных http-хостов.\n */\nexport function provideKnownHttpApiHosts(resolve: Resolve): HttpApiHostPool<KnownHttpApiKey> {\n const source = resolve(KnownToken.Config.source);\n\n return new HttpApiHostPool<KnownHttpApiKey>(\n {\n ilium: 'PUBLIC_API_URL_ILIUM',\n simaV3: 'PUBLIC_API_URL_SIMALAND_V3',\n simaV4: 'PUBLIC_API_URL_SIMALAND_V4',\n simaV6: 'PUBLIC_API_URL_SIMALAND_V6',\n chponkiV2: 'PUBLIC_API_URL_CHPONKI_V2',\n },\n source,\n );\n}\n"],"mappings":";;;;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,gBAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,wBAAwBA,CAACC,OAAgB,EAAoC;EAC3F,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAEhD,OAAO,IAAIG,gCAAe,CACxB;IACEC,KAAK,EAAE,sBAAsB;IAC7BC,MAAM,EAAE,4BAA4B;IACpCC,MAAM,EAAE,4BAA4B;IACpCC,MAAM,EAAE,4BAA4B;IACpCC,SAAS,EAAE;
|
|
1
|
+
{"version":3,"file":"known-http-api-hosts.js","names":["_tokens","require","_httpApiHostPool","provideKnownHttpApiHosts","resolve","source","KnownToken","Config","HttpApiHostPool","ilium","simaV3","simaV4","simaV6","chponkiV2","shuttle","fileDispatcher"],"sources":["../../../../../src/preset/web/providers/known-http-api-hosts.ts"],"sourcesContent":["import { Resolve } from '../../../di';\nimport { KnownToken } from '../../../tokens';\nimport { KnownHttpApiKey } from '../../isomorphic/types';\nimport { HttpApiHostPool } from '../../isomorphic/utils/http-api-host-pool';\n\n/**\n * Провайдер известных http-хостов.\n * @param resolve Функция для получения зависимости по токену.\n * @return Пул известных http-хостов.\n */\nexport function provideKnownHttpApiHosts(resolve: Resolve): HttpApiHostPool<KnownHttpApiKey> {\n const source = resolve(KnownToken.Config.source);\n\n return new HttpApiHostPool<KnownHttpApiKey>(\n {\n ilium: 'PUBLIC_API_URL_ILIUM',\n simaV3: 'PUBLIC_API_URL_SIMALAND_V3',\n simaV4: 'PUBLIC_API_URL_SIMALAND_V4',\n simaV6: 'PUBLIC_API_URL_SIMALAND_V6',\n chponkiV2: 'PUBLIC_API_URL_CHPONKI_V2',\n shuttle: 'PUBLIC_API_URL_SHUTTLE',\n fileDispatcher: 'PUBLIC_API_URL_FILE_DISPATCHER',\n },\n source,\n );\n}\n"],"mappings":";;;;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,gBAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,SAASE,wBAAwBA,CAACC,OAAgB,EAAoC;EAC3F,MAAMC,MAAM,GAAGD,OAAO,CAACE,kBAAU,CAACC,MAAM,CAACF,MAAM,CAAC;EAEhD,OAAO,IAAIG,gCAAe,CACxB;IACEC,KAAK,EAAE,sBAAsB;IAC7BC,MAAM,EAAE,4BAA4B;IACpCC,MAAM,EAAE,4BAA4B;IACpCC,MAAM,EAAE,4BAA4B;IACpCC,SAAS,EAAE,2BAA2B;IACtCC,OAAO,EAAE,wBAAwB;IACjCC,cAAc,EAAE;EAClB,CAAC,EACDV,MACF,CAAC;AACH"}
|
|
@@ -7,7 +7,7 @@ exports.STATUS = exports.RemoteData = void 0;
|
|
|
7
7
|
var redux = _interopRequireWildcard(require("@reduxjs/toolkit"));
|
|
8
8
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
9
9
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
10
|
-
/* eslint-disable require-jsdoc */
|
|
10
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
11
11
|
|
|
12
12
|
// @todo "* as" сделано для работы в Node.js ESM но есть подозрение что на tree shaking плохо скажется
|
|
13
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-data.js","names":["redux","_interopRequireWildcard","require","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","createAction","createSelector","STATUS","exports","initial","fetching","success","failure","RemoteData","createActions","name","request","createHandlers","state","status","action","data","payload","fetchCount","error","applyHandlers","actions","builder","handlers","addCase","type","createSelectors","selectRoot","isInitial","isFetching","isSuccess","isFailed","wasFetched"],"sources":["../../../../src/utils/redux/remote-data.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\n\n// @todo \"* as\" сделано для работы в Node.js ESM но есть подозрение что на tree shaking плохо скажется\nimport * as redux from '@reduxjs/toolkit';\n\nconst { createAction, createSelector } = redux;\n\ninterface RemoteDataActions<TData, TError = unknown, TPayload = void> {\n request: redux.PayloadActionCreator<TPayload, string>;\n success: redux.PayloadActionCreator<TData, string>;\n failure: redux.PayloadActionCreator<TError, string>;\n}\n\n/**\n * Статус загрузки данных.\n */\nexport type Status = 'initial' | 'fetching' | 'success' | 'failure';\n\n/**\n * Базовая структура хранилища удаленных данных.\n */\nexport interface RemoteDataState<TData, TError> {\n /** Загружаемые данные. */\n readonly data: TData;\n\n /** Данные ошибки запроса. */\n readonly error: TError;\n\n /** Статус загрузки данных. */\n readonly status: Status;\n\n /** Количество запросов. */\n readonly fetchCount?: number;\n}\n\n/**\n * Возможные статусы загрузки данных.\n */\nexport const STATUS: Record<Status, Status> = {\n initial: 'initial',\n fetching: 'fetching',\n success: 'success',\n failure: 'failure',\n} as const;\n\n/** Работа с удаленными данными. */\nexport abstract class RemoteData {\n static get STATUS() {\n return STATUS;\n }\n\n /**\n * Возвращает action'ы для работы с удаленными данными.\n * @param name Префикс имён.\n * @return Набор.\n */\n static createActions<TData = never, TError = never, TPayload = void>(\n name: string,\n ): RemoteDataActions<TData, TError, TPayload> {\n return {\n request: createAction<TPayload>(`${name}/request`),\n success: createAction<TData>(`${name}/success`),\n failure: createAction<TError>(`${name}/failure`),\n } as const;\n }\n\n /**\n * Возвращает набор обработчиков для работы с удаленными данными.\n * @return Набор.\n */\n static createHandlers<\n TData,\n TError,\n S extends RemoteDataState<TData, TError> = RemoteDataState<TData, TError>,\n >() {\n // ВАЖНО: не используем возможности immer здесь чтобы набор можно было использовать без immer.\n return {\n request(state: S | redux.Draft<S>): S | redux.Draft<S> {\n return {\n ...state,\n status: STATUS.fetching,\n };\n },\n\n success(state: S | redux.Draft<S>, action: redux.PayloadAction<TData>): S | redux.Draft<S> {\n return {\n ...state,\n data: action.payload,\n status: STATUS.success,\n fetchCount: (state.fetchCount ?? 0) + 1,\n };\n },\n\n failure(state: S | redux.Draft<S>, action: redux.PayloadAction<TError>): S | redux.Draft<S> {\n return {\n ...state,\n error: action.payload,\n status: STATUS.failure,\n fetchCount: (state.fetchCount ?? 0) + 1,\n };\n },\n } as const;\n }\n\n /**\n * Применяет обработчики для работы с удаленными данными.\n * @param actions Набор action'ов.\n * @param builder Builder.\n */\n static applyHandlers<TData, TError>(\n actions: RemoteDataActions<TData, TError, any | never>,\n builder: Pick<redux.ActionReducerMapBuilder<RemoteDataState<TData, TError>>, 'addCase'>,\n ): void {\n const handlers = RemoteData.createHandlers<TData, TError>();\n\n // @todo разобраться с проблемой когда убираешь \".type\"\n builder.addCase(actions.request.type, handlers.request);\n builder.addCase(actions.success.type, handlers.success);\n builder.addCase(actions.failure.type, handlers.failure);\n }\n\n /**\n * Возвращает новый набор селекторов данных.\n * @param selectRoot Функция получения состояния.\n * @return Набор селекторов.\n */\n static createSelectors<S extends RemoteDataState<unknown, unknown>, R = unknown>(\n selectRoot: (root: R) => S,\n ) {\n return {\n isInitial: createSelector(selectRoot, state => state.status === 'initial'),\n isFetching: createSelector(selectRoot, state => state.status === 'fetching'),\n isSuccess: createSelector(selectRoot, state => state.status === 'success'),\n isFailed: createSelector(selectRoot, state => state.status === 'failure'),\n wasFetched: createSelector(selectRoot, state => (state.fetchCount ?? 0) > 0),\n } as const;\n }\n}\n"],"mappings":";;;;;;AAGA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA0C,SAAAC,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAH,wBAAAO,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAH1C;;AAEA;;AAGA,MAAM;EAAEW,YAAY;EAAEC;AAAe,CAAC,GAAG1B,KAAK;;AAQ9C;AACA;AACA;;AAGA;AACA;AACA;;AAeA;AACA;AACA;AACO,MAAM2B,MAA8B,GAAAC,OAAA,CAAAD,MAAA,GAAG;EAC5CE,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAAU;;AAEV;AACO,MAAeC,UAAU,CAAC;EAC/B,WAAWN,MAAMA,CAAA,EAAG;IAClB,OAAOA,MAAM;EACf;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOO,aAAaA,CAClBC,IAAY,EACgC;IAC5C,OAAO;MACLC,OAAO,EAAEX,YAAY,CAAY,GAAEU,IAAK,UAAS,CAAC;MAClDJ,OAAO,EAAEN,YAAY,CAAS,GAAEU,IAAK,UAAS,CAAC;MAC/CH,OAAO,EAAEP,YAAY,CAAU,GAAEU,IAAK,UAAS;IACjD,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACE,OAAOE,cAAcA,CAAA,EAIjB;IACF;IACA,OAAO;MACLD,OAAOA,CAACE,KAAyB,EAAsB;QACrD,OAAO;UACL,GAAGA,KAAK;UACRC,MAAM,EAAEZ,MAAM,CAACG;QACjB,CAAC;MACH,CAAC;MAEDC,OAAOA,CAACO,KAAyB,EAAEE,MAAkC,EAAsB;QACzF,OAAO;UACL,GAAGF,KAAK;UACRG,IAAI,EAAED,MAAM,CAACE,OAAO;UACpBH,MAAM,EAAEZ,MAAM,CAACI,OAAO;UACtBY,UAAU,EAAE,CAACL,KAAK,CAACK,UAAU,IAAI,CAAC,IAAI;QACxC,CAAC;MACH,CAAC;MAEDX,OAAOA,CAACM,KAAyB,EAAEE,MAAmC,EAAsB;QAC1F,OAAO;UACL,GAAGF,KAAK;UACRM,KAAK,EAAEJ,MAAM,CAACE,OAAO;UACrBH,MAAM,EAAEZ,MAAM,CAACK,OAAO;UACtBW,UAAU,EAAE,CAACL,KAAK,CAACK,UAAU,IAAI,CAAC,IAAI;QACxC,CAAC;MACH;IACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOE,aAAaA,CAClBC,OAAsD,EACtDC,OAAuF,EACjF;IACN,MAAMC,QAAQ,GAAGf,UAAU,CAACI,cAAc,CAAgB,CAAC;;IAE3D;IACAU,OAAO,CAACE,OAAO,CAACH,OAAO,CAACV,OAAO,CAACc,IAAI,EAAEF,QAAQ,CAACZ,OAAO,CAAC;IACvDW,OAAO,CAACE,OAAO,CAACH,OAAO,CAACf,OAAO,CAACmB,IAAI,EAAEF,QAAQ,CAACjB,OAAO,CAAC;IACvDgB,OAAO,CAACE,OAAO,CAACH,OAAO,CAACd,OAAO,CAACkB,IAAI,EAAEF,QAAQ,CAAChB,OAAO,CAAC;EACzD;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOmB,eAAeA,CACpBC,UAA0B,EAC1B;IACA,OAAO;MACLC,SAAS,EAAE3B,cAAc,CAAC0B,UAAU,EAAEd,KAAK,IAAIA,KAAK,CAACC,MAAM,KAAK,SAAS,CAAC;MAC1Ee,UAAU,EAAE5B,cAAc,CAAC0B,UAAU,EAAEd,KAAK,IAAIA,KAAK,CAACC,MAAM,KAAK,UAAU,CAAC;MAC5EgB,SAAS,EAAE7B,cAAc,CAAC0B,UAAU,EAAEd,KAAK,IAAIA,KAAK,CAACC,MAAM,KAAK,SAAS,CAAC;MAC1EiB,QAAQ,EAAE9B,cAAc,CAAC0B,UAAU,EAAEd,KAAK,IAAIA,KAAK,CAACC,MAAM,KAAK,SAAS,CAAC;MACzEkB,UAAU,EAAE/B,cAAc,CAAC0B,UAAU,EAAEd,KAAK,IAAI,CAACA,KAAK,CAACK,UAAU,IAAI,CAAC,IAAI,CAAC;IAC7E,CAAC;EACH;AACF;AAACf,OAAA,CAAAK,UAAA,GAAAA,UAAA"}
|
|
1
|
+
{"version":3,"file":"remote-data.js","names":["redux","_interopRequireWildcard","require","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","createAction","createSelector","STATUS","exports","initial","fetching","success","failure","RemoteData","createActions","name","request","createHandlers","state","status","action","data","payload","fetchCount","error","applyHandlers","actions","builder","handlers","addCase","type","createSelectors","selectRoot","isInitial","isFetching","isSuccess","isFailed","wasFetched"],"sources":["../../../../src/utils/redux/remote-data.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n\n// @todo \"* as\" сделано для работы в Node.js ESM но есть подозрение что на tree shaking плохо скажется\nimport * as redux from '@reduxjs/toolkit';\n\nconst { createAction, createSelector } = redux;\n\ninterface RemoteDataActions<TData, TError = unknown, TPayload = void> {\n request: redux.PayloadActionCreator<TPayload, string>;\n success: redux.PayloadActionCreator<TData, string>;\n failure: redux.PayloadActionCreator<TError, string>;\n}\n\n/**\n * Статус загрузки данных.\n */\nexport type Status = 'initial' | 'fetching' | 'success' | 'failure';\n\n/**\n * Базовая структура хранилища удаленных данных.\n */\nexport interface RemoteDataState<TData, TError> {\n /** Загружаемые данные. */\n readonly data: TData;\n\n /** Данные ошибки запроса. */\n readonly error: TError;\n\n /** Статус загрузки данных. */\n readonly status: Status;\n\n /** Количество запросов. */\n readonly fetchCount?: number;\n}\n\n/**\n * Возможные статусы загрузки данных.\n */\nexport const STATUS: Record<Status, Status> = {\n initial: 'initial',\n fetching: 'fetching',\n success: 'success',\n failure: 'failure',\n} as const;\n\n/** Работа с удаленными данными. */\nexport abstract class RemoteData {\n static get STATUS() {\n return STATUS;\n }\n\n /**\n * Возвращает action'ы для работы с удаленными данными.\n * @param name Префикс имён.\n * @return Набор.\n */\n static createActions<TData = never, TError = never, TPayload = void>(\n name: string,\n ): RemoteDataActions<TData, TError, TPayload> {\n return {\n request: createAction<TPayload>(`${name}/request`),\n success: createAction<TData>(`${name}/success`),\n failure: createAction<TError>(`${name}/failure`),\n } as const;\n }\n\n /**\n * Возвращает набор обработчиков для работы с удаленными данными.\n * @return Набор.\n */\n static createHandlers<\n TData,\n TError,\n S extends RemoteDataState<TData, TError> = RemoteDataState<TData, TError>,\n >() {\n // ВАЖНО: не используем возможности immer здесь чтобы набор можно было использовать без immer.\n return {\n request(state: S | redux.Draft<S>): S | redux.Draft<S> {\n return {\n ...state,\n status: STATUS.fetching,\n };\n },\n\n success(state: S | redux.Draft<S>, action: redux.PayloadAction<TData>): S | redux.Draft<S> {\n return {\n ...state,\n data: action.payload,\n status: STATUS.success,\n fetchCount: (state.fetchCount ?? 0) + 1,\n };\n },\n\n failure(state: S | redux.Draft<S>, action: redux.PayloadAction<TError>): S | redux.Draft<S> {\n return {\n ...state,\n error: action.payload,\n status: STATUS.failure,\n fetchCount: (state.fetchCount ?? 0) + 1,\n };\n },\n } as const;\n }\n\n /**\n * Применяет обработчики для работы с удаленными данными.\n * @param actions Набор action'ов.\n * @param builder Builder.\n */\n static applyHandlers<TData, TError>(\n actions: RemoteDataActions<TData, TError, any | never>,\n builder: Pick<redux.ActionReducerMapBuilder<RemoteDataState<TData, TError>>, 'addCase'>,\n ): void {\n const handlers = RemoteData.createHandlers<TData, TError>();\n\n // @todo разобраться с проблемой когда убираешь \".type\"\n builder.addCase(actions.request.type, handlers.request);\n builder.addCase(actions.success.type, handlers.success);\n builder.addCase(actions.failure.type, handlers.failure);\n }\n\n /**\n * Возвращает новый набор селекторов данных.\n * @param selectRoot Функция получения состояния.\n * @return Набор селекторов.\n */\n static createSelectors<S extends RemoteDataState<unknown, unknown>, R = unknown>(\n selectRoot: (root: R) => S,\n ) {\n return {\n isInitial: createSelector(selectRoot, state => state.status === 'initial'),\n isFetching: createSelector(selectRoot, state => state.status === 'fetching'),\n isSuccess: createSelector(selectRoot, state => state.status === 'success'),\n isFailed: createSelector(selectRoot, state => state.status === 'failure'),\n wasFetched: createSelector(selectRoot, state => (state.fetchCount ?? 0) > 0),\n } as const;\n }\n}\n"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ var _reduxSaga = _interopRequireWildcard(require("redux-saga"));
|
|
|
8
8
|
var _effects = require("redux-saga/effects");
|
|
9
9
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
10
10
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
11
|
-
/* eslint-disable
|
|
11
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Возвращает расширенную версию SagaMiddleware.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","names":["_reduxSaga","_interopRequireWildcard","require","_effects","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","createSagaExtendedMiddleware","handler","MiddlewareControl","toMiddleware","constructor","sagaMiddleware","createSagaMiddleware","onError","error","info","onSagaError","middleware","api","timeout","milliseconds","config","configInterrupt","run","saga","args","interruptTimeout","interruptStrategy","strategy","Number","isFinite","runWithBreakTask","runWithBreakMiddleware","toPromise","data","result","runWithTimeLimit","done","onTimeoutInterrupt","Error","onConfigError","promises","ready","timerId","push","then","finally","undefined","clearTimeout","Promise","resolve","setTimeout","dispatch","END","race","task","fork","needCancel","taskResult","delay","cancel","SagaCancelSignal","value","name"],"sources":["../../../../src/utils/redux-saga/middleware.ts"],"sourcesContent":["/* eslint-disable require-jsdoc, jsdoc/require-jsdoc */\nimport { MiddlewareAPI } from '@reduxjs/toolkit';\nimport {\n SagaExtendedMiddleware,\n SagaInterruptConfig,\n SagaMiddlewareHandler,\n SagaTimeoutRunData,\n} from './types';\nimport createSagaMiddleware, { END, Saga, Task, SagaMiddleware } from 'redux-saga';\nimport { call, cancel, delay, fork, race } from 'redux-saga/effects';\n\n/**\n * Возвращает расширенную версию SagaMiddleware.\n * @param handler Обработчик событий.\n * @return Middleware.\n */\nfunction createSagaExtendedMiddleware(handler: SagaMiddlewareHandler): SagaExtendedMiddleware {\n return new MiddlewareControl(handler).toMiddleware();\n}\n\nclass MiddlewareControl {\n private api?: MiddlewareAPI;\n private interruptTimeout?: number;\n private interruptStrategy?: SagaInterruptConfig['strategy'];\n private handler: SagaMiddlewareHandler;\n private sagaMiddleware: SagaMiddleware;\n\n constructor(handler: SagaMiddlewareHandler) {\n this.handler = handler;\n\n this.sagaMiddleware = createSagaMiddleware({\n onError: (error, info) => {\n handler.onSagaError(error, info);\n },\n });\n }\n\n toMiddleware(): SagaExtendedMiddleware {\n const middleware: SagaExtendedMiddleware = api => {\n this.api = api;\n return this.sagaMiddleware(api);\n };\n\n middleware.timeout = (milliseconds, config) => {\n this.configInterrupt(milliseconds, config);\n return middleware;\n };\n\n middleware.run = async (saga, ...args) => {\n await this.run(saga, ...args);\n };\n\n return middleware;\n }\n\n private configInterrupt(milliseconds: number, config?: SagaInterruptConfig) {\n this.interruptTimeout = milliseconds;\n this.interruptStrategy = config?.strategy ?? 'cancel-task';\n }\n\n private async run<S extends Saga>(saga: S, ...args: Parameters<S>): Promise<void> {\n const { interruptTimeout } = this;\n\n if (typeof interruptTimeout === 'number' && Number.isFinite(interruptTimeout)) {\n switch (this.interruptStrategy) {\n case 'cancel-task':\n await this.runWithBreakTask({ saga, args, timeout: interruptTimeout });\n return;\n case 'dispatch-end':\n await this.runWithBreakMiddleware({ saga, args, timeout: interruptTimeout });\n return;\n }\n }\n\n await this.sagaMiddleware.run(saga, ...args).toPromise();\n }\n\n private async runWithBreakTask<S extends Saga>(data: SagaTimeoutRunData<S>): Promise<void> {\n const result: Either<unknown, unknown> = await this.sagaMiddleware\n .run(runWithTimeLimit, data)\n .toPromise();\n\n if (!result.done) {\n this.handler.onTimeoutInterrupt({ timeout: data.timeout });\n }\n }\n\n private async runWithBreakMiddleware<S extends Saga>(data: SagaTimeoutRunData<S>): Promise<void> {\n const { saga, args, timeout } = data;\n const { api } = this;\n\n if (!api) {\n const error = new Error('Middleware is not applied to the store');\n\n this.handler.onConfigError(error);\n\n throw error;\n }\n\n const promises: Promise<void>[] = [];\n\n let ready = false;\n let timerId: ReturnType<typeof setTimeout>;\n\n promises.push(\n this.sagaMiddleware\n .run(saga, ...args)\n .toPromise()\n .then(() => {\n ready = true;\n })\n .finally(() => {\n // вне зависимости от результата отключаем таймер если он есть\n timerId !== undefined && clearTimeout(timerId);\n }),\n );\n\n promises.push(\n new Promise<void>(resolve => {\n timerId = setTimeout(() => {\n if (!ready) {\n this.handler.onTimeoutInterrupt({ timeout });\n api.dispatch(END);\n }\n\n resolve();\n }, timeout);\n }),\n );\n\n await Promise.race(promises);\n }\n}\n\nfunction* runWithTimeLimit<S extends Saga>(\n data: SagaTimeoutRunData<S>,\n): Generator<any, Either<SagaCancelSignal, ReturnType<S>>, any> {\n const { saga, args, timeout } = data;\n const task: Task = yield fork(saga, ...args);\n\n const [needCancel, taskResult]: [boolean, ReturnType<S>] = yield race([\n delay(timeout, true),\n call(() => task.toPromise()),\n ]);\n\n if (needCancel) {\n yield cancel(task);\n\n // ВАЖНО: если делать throw ... - ошибка попадет в onError (createSagaMiddleware)\n // чтобы не логировать лишний раз возвращаем значение\n return { done: false, error: new SagaCancelSignal() };\n } else {\n return { done: true, value: taskResult };\n }\n}\n\n// @todo в будущем можно заменить все ожидаемые исключения (только внутри фреймворка) на этот тип\ntype Either<E, V> = { done: false; error: E } | { done: true; value: V };\n\nclass SagaCancelSignal {\n name: string;\n\n constructor() {\n this.name = 'SagaCancelSignal';\n }\n}\n\nexport { createSagaExtendedMiddleware as createSagaMiddleware };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware.js","names":["_reduxSaga","_interopRequireWildcard","require","_effects","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","createSagaExtendedMiddleware","handler","MiddlewareControl","toMiddleware","constructor","sagaMiddleware","createSagaMiddleware","onError","error","info","onSagaError","middleware","api","timeout","milliseconds","config","configInterrupt","run","saga","args","interruptTimeout","interruptStrategy","strategy","Number","isFinite","runWithBreakTask","runWithBreakMiddleware","toPromise","data","result","runWithTimeLimit","done","onTimeoutInterrupt","Error","onConfigError","promises","ready","timerId","push","then","finally","undefined","clearTimeout","Promise","resolve","setTimeout","dispatch","END","race","task","fork","needCancel","taskResult","delay","cancel","SagaCancelSignal","value","name"],"sources":["../../../../src/utils/redux-saga/middleware.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport { MiddlewareAPI } from '@reduxjs/toolkit';\nimport {\n SagaExtendedMiddleware,\n SagaInterruptConfig,\n SagaMiddlewareHandler,\n SagaTimeoutRunData,\n} from './types';\nimport createSagaMiddleware, { END, Saga, Task, SagaMiddleware } from 'redux-saga';\nimport { call, cancel, delay, fork, race } from 'redux-saga/effects';\n\n/**\n * Возвращает расширенную версию SagaMiddleware.\n * @param handler Обработчик событий.\n * @return Middleware.\n */\nfunction createSagaExtendedMiddleware(handler: SagaMiddlewareHandler): SagaExtendedMiddleware {\n return new MiddlewareControl(handler).toMiddleware();\n}\n\nclass MiddlewareControl {\n private api?: MiddlewareAPI;\n private interruptTimeout?: number;\n private interruptStrategy?: SagaInterruptConfig['strategy'];\n private handler: SagaMiddlewareHandler;\n private sagaMiddleware: SagaMiddleware;\n\n constructor(handler: SagaMiddlewareHandler) {\n this.handler = handler;\n\n this.sagaMiddleware = createSagaMiddleware({\n onError: (error, info) => {\n handler.onSagaError(error, info);\n },\n });\n }\n\n toMiddleware(): SagaExtendedMiddleware {\n const middleware: SagaExtendedMiddleware = api => {\n this.api = api;\n return this.sagaMiddleware(api);\n };\n\n middleware.timeout = (milliseconds, config) => {\n this.configInterrupt(milliseconds, config);\n return middleware;\n };\n\n middleware.run = async (saga, ...args) => {\n await this.run(saga, ...args);\n };\n\n return middleware;\n }\n\n private configInterrupt(milliseconds: number, config?: SagaInterruptConfig) {\n this.interruptTimeout = milliseconds;\n this.interruptStrategy = config?.strategy ?? 'cancel-task';\n }\n\n private async run<S extends Saga>(saga: S, ...args: Parameters<S>): Promise<void> {\n const { interruptTimeout } = this;\n\n if (typeof interruptTimeout === 'number' && Number.isFinite(interruptTimeout)) {\n switch (this.interruptStrategy) {\n case 'cancel-task':\n await this.runWithBreakTask({ saga, args, timeout: interruptTimeout });\n return;\n case 'dispatch-end':\n await this.runWithBreakMiddleware({ saga, args, timeout: interruptTimeout });\n return;\n }\n }\n\n await this.sagaMiddleware.run(saga, ...args).toPromise();\n }\n\n private async runWithBreakTask<S extends Saga>(data: SagaTimeoutRunData<S>): Promise<void> {\n const result: Either<unknown, unknown> = await this.sagaMiddleware\n .run(runWithTimeLimit, data)\n .toPromise();\n\n if (!result.done) {\n this.handler.onTimeoutInterrupt({ timeout: data.timeout });\n }\n }\n\n private async runWithBreakMiddleware<S extends Saga>(data: SagaTimeoutRunData<S>): Promise<void> {\n const { saga, args, timeout } = data;\n const { api } = this;\n\n if (!api) {\n const error = new Error('Middleware is not applied to the store');\n\n this.handler.onConfigError(error);\n\n throw error;\n }\n\n const promises: Promise<void>[] = [];\n\n let ready = false;\n let timerId: ReturnType<typeof setTimeout>;\n\n promises.push(\n this.sagaMiddleware\n .run(saga, ...args)\n .toPromise()\n .then(() => {\n ready = true;\n })\n .finally(() => {\n // вне зависимости от результата отключаем таймер если он есть\n timerId !== undefined && clearTimeout(timerId);\n }),\n );\n\n promises.push(\n new Promise<void>(resolve => {\n timerId = setTimeout(() => {\n if (!ready) {\n this.handler.onTimeoutInterrupt({ timeout });\n api.dispatch(END);\n }\n\n resolve();\n }, timeout);\n }),\n );\n\n await Promise.race(promises);\n }\n}\n\nfunction* runWithTimeLimit<S extends Saga>(\n data: SagaTimeoutRunData<S>,\n): Generator<any, Either<SagaCancelSignal, ReturnType<S>>, any> {\n const { saga, args, timeout } = data;\n const task: Task = yield fork(saga, ...args);\n\n const [needCancel, taskResult]: [boolean, ReturnType<S>] = yield race([\n delay(timeout, true),\n call(() => task.toPromise()),\n ]);\n\n if (needCancel) {\n yield cancel(task);\n\n // ВАЖНО: если делать throw ... - ошибка попадет в onError (createSagaMiddleware)\n // чтобы не логировать лишний раз возвращаем значение\n return { done: false, error: new SagaCancelSignal() };\n } else {\n return { done: true, value: taskResult };\n }\n}\n\n// @todo в будущем можно заменить все ожидаемые исключения (только внутри фреймворка) на этот тип\ntype Either<E, V> = { done: false; error: E } | { done: true; value: V };\n\nclass SagaCancelSignal {\n name: string;\n\n constructor() {\n this.name = 'SagaCancelSignal';\n }\n}\n\nexport { createSagaExtendedMiddleware as createSagaMiddleware };\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.createSafeStorage = createSafeStorage;
|
|
7
|
-
/* eslint-disable
|
|
7
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Интерфейс объекта-обертки для безопасной работы с WebStorage.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["createSafeStorage","getStorage","isAvailable","testKey","Date","now","setItem","removeItem","clear","getItem","name","key","index","value","getLength","length"],"sources":["../../../../../src/utils/web/storage/index.ts"],"sourcesContent":["/* eslint-disable
|
|
1
|
+
{"version":3,"file":"index.js","names":["createSafeStorage","getStorage","isAvailable","testKey","Date","now","setItem","removeItem","clear","getItem","name","key","index","value","getLength","length"],"sources":["../../../../../src/utils/web/storage/index.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n\n/**\n * Интерфейс объекта-обертки для безопасной работы с WebStorage.\n */\nexport interface SafeStorage extends Storage {\n isAvailable: () => boolean;\n}\n\n/**\n * Возвращает объект для безопасной работы с браузерным хранилищем (LocalStorage, SessionStorage).\n * @param getStorage Функция, которая должна вернуть целевое хранилище.\n * @return Объект-обертка для безопасной работы с браузерным хранилищем.\n */\nexport function createSafeStorage(getStorage: () => Storage): SafeStorage {\n const isAvailable = (): boolean => {\n try {\n const testKey = `storage_test_key::${Date.now()}`;\n\n getStorage().setItem(testKey, testKey);\n getStorage().removeItem(testKey);\n\n return true;\n } catch {\n return false;\n }\n };\n\n const clear = (): void => {\n if (isAvailable()) {\n getStorage().clear();\n }\n };\n\n const getItem = (name: string): string | null => {\n if (isAvailable()) {\n return getStorage().getItem(name);\n }\n\n return null;\n };\n\n const key = (index: number): string | null => {\n if (isAvailable()) {\n return getStorage().key(index);\n }\n\n return null;\n };\n\n const removeItem = (name: string): void => {\n if (isAvailable()) {\n getStorage().removeItem(name);\n }\n };\n\n const setItem = (name: string, value: string): void => {\n if (isAvailable()) {\n getStorage().setItem(name, value);\n }\n };\n\n const getLength = (): number => {\n if (isAvailable()) {\n return getStorage().length;\n }\n\n return 0;\n };\n\n return {\n isAvailable,\n\n clear,\n getItem,\n key,\n removeItem,\n setItem,\n get length() {\n return getLength();\n },\n };\n}\n"],"mappings":";;;;;;AAAA;;AAEA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACO,SAASA,iBAAiBA,CAACC,UAAyB,EAAe;EACxE,MAAMC,WAAW,GAAGA,CAAA,KAAe;IACjC,IAAI;MACF,MAAMC,OAAO,GAAI,qBAAoBC,IAAI,CAACC,GAAG,CAAC,CAAE,EAAC;MAEjDJ,UAAU,CAAC,CAAC,CAACK,OAAO,CAACH,OAAO,EAAEA,OAAO,CAAC;MACtCF,UAAU,CAAC,CAAC,CAACM,UAAU,CAACJ,OAAO,CAAC;MAEhC,OAAO,IAAI;IACb,CAAC,CAAC,MAAM;MACN,OAAO,KAAK;IACd;EACF,CAAC;EAED,MAAMK,KAAK,GAAGA,CAAA,KAAY;IACxB,IAAIN,WAAW,CAAC,CAAC,EAAE;MACjBD,UAAU,CAAC,CAAC,CAACO,KAAK,CAAC,CAAC;IACtB;EACF,CAAC;EAED,MAAMC,OAAO,GAAIC,IAAY,IAAoB;IAC/C,IAAIR,WAAW,CAAC,CAAC,EAAE;MACjB,OAAOD,UAAU,CAAC,CAAC,CAACQ,OAAO,CAACC,IAAI,CAAC;IACnC;IAEA,OAAO,IAAI;EACb,CAAC;EAED,MAAMC,GAAG,GAAIC,KAAa,IAAoB;IAC5C,IAAIV,WAAW,CAAC,CAAC,EAAE;MACjB,OAAOD,UAAU,CAAC,CAAC,CAACU,GAAG,CAACC,KAAK,CAAC;IAChC;IAEA,OAAO,IAAI;EACb,CAAC;EAED,MAAML,UAAU,GAAIG,IAAY,IAAW;IACzC,IAAIR,WAAW,CAAC,CAAC,EAAE;MACjBD,UAAU,CAAC,CAAC,CAACM,UAAU,CAACG,IAAI,CAAC;IAC/B;EACF,CAAC;EAED,MAAMJ,OAAO,GAAGA,CAACI,IAAY,EAAEG,KAAa,KAAW;IACrD,IAAIX,WAAW,CAAC,CAAC,EAAE;MACjBD,UAAU,CAAC,CAAC,CAACK,OAAO,CAACI,IAAI,EAAEG,KAAK,CAAC;IACnC;EACF,CAAC;EAED,MAAMC,SAAS,GAAGA,CAAA,KAAc;IAC9B,IAAIZ,WAAW,CAAC,CAAC,EAAE;MACjB,OAAOD,UAAU,CAAC,CAAC,CAACc,MAAM;IAC5B;IAEA,OAAO,CAAC;EACV,CAAC;EAED,OAAO;IACLb,WAAW;IAEXM,KAAK;IACLC,OAAO;IACPE,GAAG;IACHJ,UAAU;IACVD,OAAO;IACP,IAAIS,MAAMA,CAAA,EAAG;MACX,OAAOD,SAAS,CAAC,CAAC;IACpB;EACF,CAAC;AACH"}
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "DEFAULT_SHARED", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _moduleFederation.DEFAULT_SHARED;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
Object.defineProperty(exports, "EnvPlugin", {
|
|
7
13
|
enumerable: true,
|
|
8
14
|
get: function () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_env","require","_moduleFederation"],"sources":["../../../../src/utils/webpack/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"index.js","names":["_env","require","_moduleFederation"],"sources":["../../../../src/utils/webpack/index.ts"],"sourcesContent":["export type { EnvPluginOptions } from './env/types';\nexport type { ModuleFederationPluginOptions } from './module-federation/types';\nexport { EnvPlugin } from './env';\nexport { ModuleFederationPlugin, DEFAULT_SHARED } from './module-federation';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","names":["AlreadyBoundError","CircularDependencyError","NothingBoundError","createToken","CURRENT_APP","ApplicationImplementation","constructor","providers","Map","components","presets","initialized","toString","bind","token","has","_key","toValue","value","set","toProvider","provider","get","resolve","chain","preset","apply","nextChain","includes","component","otherToken","parent","attach","Error","push","invoke","tokens","fn","map","createApplication"],"sources":["../../../src/di/application.ts"],"sourcesContent":["/* eslint-disable
|
|
1
|
+
{"version":3,"file":"application.js","names":["AlreadyBoundError","CircularDependencyError","NothingBoundError","createToken","CURRENT_APP","ApplicationImplementation","constructor","providers","Map","components","presets","initialized","toString","bind","token","has","_key","toValue","value","set","toProvider","provider","get","resolve","chain","preset","apply","nextChain","includes","component","otherToken","parent","attach","Error","push","invoke","tokens","fn","map","createApplication"],"sources":["../../../src/di/application.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport type { Application, Provider, Token, Binding, ExtractType, Preset } from './types';\nimport { AlreadyBoundError, CircularDependencyError, NothingBoundError } from './errors';\nimport { createToken } from './token';\n\n/**\n * Токен, с помощью которого можно достать из приложения само приложение.\n */\nexport const CURRENT_APP = createToken<Application>('application/self');\n\n/**\n * Реализация Application.\n */\nclass ApplicationImplementation implements Application {\n /** Родительское приложение. */\n private parent?: ApplicationImplementation;\n\n /** Зарегистрированные пресеты. */\n private presets: Preset[];\n\n /** Зарегистрированные провайдеры. */\n private providers: Map<symbol, Provider<unknown>>;\n\n /** Инициализированные компоненты (синглтоны). */\n private components: Map<symbol, unknown>;\n\n /** Инициализировано ли приложение. */\n private initialized: boolean;\n\n constructor() {\n this.providers = new Map();\n this.components = new Map();\n this.presets = [];\n this.initialized = false;\n }\n\n toString() {\n return 'Application';\n }\n\n bind<T>(token: Token<T>): Binding<T> {\n if (this.providers.has(token._key)) {\n throw new AlreadyBoundError(token, this.toString());\n }\n\n return {\n toValue: value => {\n this.providers.set(token._key, () => value);\n },\n toProvider: provider => {\n this.providers.set(token._key, provider);\n },\n };\n }\n\n get<T>(token: Token<T>): T {\n return this.resolve(token, []);\n }\n\n protected resolve<T>(token: Token<T>, chain: Token<any>[]): T {\n if (!this.initialized) {\n this.bind(CURRENT_APP).toValue(this);\n\n for (const preset of this.presets) {\n preset.apply(this);\n }\n\n this.initialized = true;\n }\n\n const nextChain = () => [...chain, token];\n\n if (chain.includes(token)) {\n throw new CircularDependencyError(nextChain(), this.toString());\n }\n\n if (this.components.has(token._key)) {\n return this.components.get(token._key) as T;\n }\n\n if (this.providers.has(token._key)) {\n const provider = this.providers.get(token._key) as Provider<T>;\n\n const component = provider(otherToken => this.resolve(otherToken, nextChain()));\n\n // ВАЖНО: всегда как singleton\n this.components.set(token._key, component);\n\n return component as T;\n }\n\n if (this.parent) {\n // ВАЖНО: передаём именно chain а не nextChain()\n return this.parent.resolve(token, chain);\n }\n\n throw new NothingBoundError(token, this.toString());\n }\n\n attach(parent: ApplicationImplementation): void {\n if (this.parent) {\n throw new Error('Cannot reattach application');\n }\n\n this.parent = parent;\n }\n\n preset(preset: Preset): void {\n this.presets.push(preset);\n }\n\n invoke<Tokens extends readonly Token<any>[]>(\n tokens: [...Tokens],\n fn: (...args: ExtractType<Tokens>) => void,\n ): void {\n fn(...(tokens.map(token => this.get(token)) as any));\n }\n}\n\n/**\n * Возвращает новое DI-приложение.\n * @return DI-приложение.\n */\nexport function createApplication(): Application {\n return new ApplicationImplementation();\n}\n"],"mappings":"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"}
|
package/dist/esm/di/container.js
CHANGED