@sima-land/isomorph 11.0.0-alpha.71 → 11.0.0-alpha.73
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/http/utils.js +2 -3
- package/dist/cjs/http/utils.js.map +1 -1
- package/dist/cjs/package.json +16 -20
- package/dist/cjs/preset/isomorphic/types.js.map +1 -1
- package/dist/cjs/preset/node/index.js.map +1 -1
- package/dist/cjs/preset/node/utils/axios-tracing-middleware.js +13 -3
- package/dist/cjs/preset/node/utils/axios-tracing-middleware.js.map +1 -1
- package/dist/cjs/preset/node/utils/telemetry.js +19 -0
- package/dist/cjs/preset/node/utils/telemetry.js.map +1 -1
- package/dist/cjs/preset/server/types.js.map +1 -1
- package/dist/cjs/utils/redux/remote-data.js +9 -17
- package/dist/cjs/utils/redux/remote-data.js.map +1 -1
- package/dist/cjs/utils/selectors/create-curried-selector.js +2 -14
- package/dist/cjs/utils/selectors/create-curried-selector.js.map +1 -1
- package/dist/esm/http/utils.js +2 -3
- package/dist/esm/http/utils.js.map +1 -1
- package/dist/esm/package.json +16 -20
- package/dist/esm/preset/isomorphic/types.js.map +1 -1
- package/dist/esm/preset/node/index.js.map +1 -1
- package/dist/esm/preset/node/utils/axios-tracing-middleware.js +15 -5
- package/dist/esm/preset/node/utils/axios-tracing-middleware.js.map +1 -1
- package/dist/esm/preset/node/utils/telemetry.js +19 -1
- package/dist/esm/preset/node/utils/telemetry.js.map +1 -1
- package/dist/esm/preset/node-handler/providers/handler-main.js +7 -4
- package/dist/esm/preset/node-handler/providers/handler-main.js.map +1 -1
- package/dist/esm/preset/server/providers/page-render.js +8 -2
- package/dist/esm/preset/server/providers/page-render.js.map +1 -1
- package/dist/esm/preset/server/types.js.map +1 -1
- package/dist/esm/preset/server/utils/regular-helmet.js +35 -27
- package/dist/esm/preset/server/utils/regular-helmet.js.map +1 -1
- package/dist/esm/utils/react/error-handlers/index.js +11 -8
- package/dist/esm/utils/react/error-handlers/index.js.map +1 -1
- package/dist/esm/utils/redux/remote-data.js +5 -11
- package/dist/esm/utils/redux/remote-data.js.map +1 -1
- package/dist/esm/utils/selectors/create-curried-selector.js +2 -15
- package/dist/esm/utils/selectors/create-curried-selector.js.map +1 -1
- package/dist/esm/utils/ssr/index.js +2 -3
- package/dist/esm/utils/ssr/index.js.map +1 -1
- package/dist/types/preset/isomorphic/types.d.ts.map +1 -1
- package/dist/types/preset/node/index.d.ts.map +1 -1
- package/dist/types/preset/node/utils/axios-tracing-middleware.d.ts +1 -0
- package/dist/types/preset/node/utils/axios-tracing-middleware.d.ts.map +1 -1
- package/dist/types/preset/node/utils/telemetry.d.ts +6 -0
- package/dist/types/preset/node/utils/telemetry.d.ts.map +1 -1
- package/dist/types/preset/server/providers/page-helmet.d.ts +1 -3
- package/dist/types/preset/server/providers/page-helmet.d.ts.map +1 -1
- package/dist/types/preset/server/providers/page-render.d.ts +1 -1
- package/dist/types/preset/server/providers/page-render.d.ts.map +1 -1
- package/dist/types/preset/server/types.d.ts +1 -0
- package/dist/types/preset/server/types.d.ts.map +1 -1
- package/dist/types/preset/server/utils/regular-helmet.d.ts +1 -1
- package/dist/types/preset/server/utils/regular-helmet.d.ts.map +1 -1
- package/dist/types/utils/react/error-handlers/index.d.ts +2 -2
- package/dist/types/utils/react/error-handlers/index.d.ts.map +1 -1
- package/dist/types/utils/redux/remote-data.d.ts +103 -23
- package/dist/types/utils/redux/remote-data.d.ts.map +1 -1
- package/dist/types/utils/redux-saga/take-chain.d.ts +1 -1
- package/dist/types/utils/redux-saga/take-chain.d.ts.map +1 -1
- package/dist/types/utils/selectors/create-curried-selector.d.ts +6 -16
- package/dist/types/utils/selectors/create-curried-selector.d.ts.map +1 -1
- package/dist/types/utils/ssr/index.d.ts +1 -1
- package/dist/types/utils/ssr/index.d.ts.map +1 -1
- package/package.json +43 -43
package/dist/cjs/http/utils.js
CHANGED
|
@@ -141,13 +141,12 @@ function isNetworkError(value) {
|
|
|
141
141
|
return false;
|
|
142
142
|
}
|
|
143
143
|
const {
|
|
144
|
-
message
|
|
145
|
-
stack
|
|
144
|
+
message
|
|
146
145
|
} = value;
|
|
147
146
|
|
|
148
147
|
// ВАЖНО: в Safari 17+ ошибки имеют определенное сообщение и не имеют свойства stack
|
|
149
148
|
if (message === 'Load failed' || message.startsWith('Load failed (') && message.endsWith(')')) {
|
|
150
|
-
return
|
|
149
|
+
return true;
|
|
151
150
|
}
|
|
152
151
|
|
|
153
152
|
// Chrome
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["FetchUtil","exports","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","parse","ok","data","error","Error","status","statusText","headers","isError","value","prototype","toString","call","networkErrorMessages","Set","isNetworkError","isValid","name","message","
|
|
1
|
+
{"version":3,"file":"utils.js","names":["FetchUtil","exports","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","parse","ok","data","error","Error","status","statusText","headers","isError","value","prototype","toString","call","networkErrorMessages","Set","isNetworkError","isValid","name","message","startsWith","endsWith","has","isAbortError"],"sources":["../../../src/http/utils.ts"],"sourcesContent":["import type { URLSearchParamsInit, ResponseDone, ResponseFail } from './types';\n\n/**\n * Утилиты для работы с URL, URLSearchParams, Headers, Request, Response.\n */\nexport const FetchUtil = {\n /**\n * Получив параметры применит их к переданному URL.\n * @param url URL.\n * @param params Параметры.\n */\n setParams(url: URL, params: URLSearchParamsInit): void {\n for (const [paramName, paramValue] of Object.entries(params)) {\n if (paramValue === null) {\n url.searchParams.delete(paramName);\n continue;\n }\n\n if (paramValue !== undefined) {\n url.searchParams.set(paramName, String(paramValue));\n continue;\n }\n }\n },\n\n // @todo resetPrams?\n\n /**\n * Получив URL и параметры вернет новый URL с примененными параметрами.\n * @param url URL.\n * @param params Параметры.\n * @return URL.\n */\n withParams(url: string | URL, params: URLSearchParamsInit): URL {\n const resultUrl = new URL(url);\n\n FetchUtil.setParams(resultUrl, params);\n\n return resultUrl;\n },\n\n /**\n * Получив URL вернет его копию но без параметров.\n * @param url URL.\n * @return URL.\n */\n withoutParams(url: string | URL): URL {\n const resultUrl = new URL(url);\n\n resultUrl.search = '';\n\n return resultUrl;\n },\n\n /**\n * Возвращает кортеж обработчиков для Promise из fetch.\n * Полученный Promise никогда не уйдет в состояние rejected.\n * @param options Опции.\n * @return Кортеж.\n */\n eitherResponse<T = unknown>({\n parseBody = response => response.json(),\n }: {\n /** Парсер body. */\n parseBody?: (response: Response) => Promise<T>;\n } = {}) {\n /** @inheritdoc */\n const parse = async (response: Response): Promise<T | null> => {\n try {\n return await parseBody(response);\n } catch {\n return null;\n }\n };\n\n return [\n // then\n async (response: Response): Promise<ResponseDone<T> | ResponseFail<T>> => {\n if (!response.ok) {\n return {\n ok: false,\n data: (await parse(response)) as T,\n error: new Error(`Request failed with status code ${response.status}`),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n return {\n ok: true,\n data: (await parse(response)) as T,\n error: null,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n },\n\n // catch\n async (error: unknown): Promise<ResponseFail<T>> => ({\n ok: false,\n error,\n }),\n ] as const;\n },\n} as const;\n\n/**\n * Проверяет, является ли переданное значение ошибкой.\n * @param value Значение.\n * @return Является ли значение ошибкой.\n */\nfunction isError(value: unknown): value is Error {\n return Object.prototype.toString.call(value) === '[object Error]';\n}\n\n// Основано на исходном коде пакета https://github.com/sindresorhus/is-network-error\nconst networkErrorMessages = new Set([\n 'network error', // Chrome\n 'Failed to fetch', // Chrome\n 'NetworkError when attempting to fetch resource.', // Firefox\n 'The Internet connection appears to be offline.', // Safari 16\n 'Load failed', // Safari 17+\n 'Network request failed', // `cross-fetch`\n 'fetch failed', // Undici (Node.js)\n 'terminated', // Undici (Node.js)\n\n // дальше идут наши наработки (основано на данных из Sentry)\n 'Network Error', // Safari 17.4\n]);\n\n/**\n * Проверяет, является ли переданное значение ошибкой сети.\n * Основано на исходном коде пакета https://github.com/sindresorhus/is-network-error.\n * Нет возможности использовать пакет is-network-error по причине того что он - ESM only.\n * @param value Проверяемое значение.\n * @return Является ли значение TypeError о том что произошла ошибка сети.\n */\nexport function isNetworkError(value: unknown): value is TypeError {\n const isValid = isError(value) && value.name === 'TypeError' && typeof value.message === 'string';\n\n if (!isValid) {\n return false;\n }\n\n const { message } = value;\n\n // ВАЖНО: в Safari 17+ ошибки имеют определенное сообщение и не имеют свойства stack\n if (message === 'Load failed' || (message.startsWith('Load failed (') && message.endsWith(')'))) {\n return true;\n }\n\n // Chrome\n if (\n message === 'Failed to fetch' ||\n (message.startsWith('Failed to fetch (') && message.endsWith(')'))\n ) {\n return true;\n }\n\n return networkErrorMessages.has(value.message);\n}\n\n/**\n * Проверяет является ли переданное значение ошибкой обрывания с помощью AbortController.\n * @param value Проверяемое значение.\n * @return Является ли значение ошибкой обрывания.\n */\nexport function isAbortError(value: unknown): value is { name: 'AbortError' } {\n return typeof value === 'object' && value !== null && (value as any).name === 'AbortError';\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/cjs/package.json
CHANGED
|
@@ -3,36 +3,32 @@
|
|
|
3
3
|
"name": "@sima-land/isomorph",
|
|
4
4
|
"version": "0.0.0",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@humanwhocodes/env": "4.0.1",
|
|
6
|
+
"@humanwhocodes/env": "^4.0.1",
|
|
7
7
|
"@krutoo/fetch-tools": "^0.1.1",
|
|
8
8
|
"@opentelemetry/api": "^1.9.1",
|
|
9
|
-
"@opentelemetry/exporter-
|
|
10
|
-
"@opentelemetry/
|
|
11
|
-
"@opentelemetry/
|
|
12
|
-
"@opentelemetry/sdk-
|
|
13
|
-
"@opentelemetry/
|
|
14
|
-
"@
|
|
15
|
-
"@
|
|
16
|
-
"@sentry/browser": "^10.39.0",
|
|
17
|
-
"@sentry/node": "^10.39.0",
|
|
9
|
+
"@opentelemetry/exporter-trace-otlp-grpc": "^0.221.0",
|
|
10
|
+
"@opentelemetry/resources": "^2.10.0",
|
|
11
|
+
"@opentelemetry/sdk-trace-base": "^2.10.0",
|
|
12
|
+
"@opentelemetry/sdk-trace-node": "^2.10.0",
|
|
13
|
+
"@opentelemetry/semantic-conventions": "^1.43.0",
|
|
14
|
+
"@sentry/browser": "10.47.0",
|
|
15
|
+
"@sentry/node": "10.47.0",
|
|
18
16
|
"accepts": "^1.3.8",
|
|
19
|
-
"dotenv": "^17.
|
|
17
|
+
"dotenv": "^17.4.2",
|
|
20
18
|
"express": "^5.2.1",
|
|
21
|
-
"http-proxy-middleware": "^
|
|
19
|
+
"http-proxy-middleware": "^4.2.0",
|
|
22
20
|
"jsesc": "^3.1.0",
|
|
23
21
|
"middleware-axios": "^3.0.0",
|
|
24
22
|
"pino": "^10.3.1",
|
|
25
23
|
"pino-pretty": "^13.1.3",
|
|
26
24
|
"prom-client": "^15.1.3",
|
|
27
|
-
"
|
|
28
|
-
"webpack": "^5.105.2"
|
|
25
|
+
"webpack": "^5.108.4"
|
|
29
26
|
},
|
|
30
27
|
"peerDependencies": {
|
|
31
|
-
"@reduxjs/toolkit": "
|
|
32
|
-
"axios": "1.
|
|
33
|
-
"react": "^18.0",
|
|
34
|
-
"react-dom": "^18.0",
|
|
35
|
-
"
|
|
36
|
-
"redux-saga": "1.5.0"
|
|
28
|
+
"@reduxjs/toolkit": "^2.0.0",
|
|
29
|
+
"axios": "^1.18.1",
|
|
30
|
+
"react": "^18.0 || ^19.0",
|
|
31
|
+
"react-dom": "^18.0 || ^19.0",
|
|
32
|
+
"redux-saga": "^1.5.0"
|
|
37
33
|
}
|
|
38
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/preset/isomorphic/types.ts"],"sourcesContent":["import type { Provider, Token } from '../../di';\n\nexport interface PresetTuner {\n (tools: { override: <T>(token: Token<T>, provider: Provider<T>) => void }): void;\n}\n\nexport type KnownHttpApiKey =\n
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/preset/isomorphic/types.ts"],"sourcesContent":["import type { Provider, Token } from '../../di';\n\nexport interface PresetTuner {\n (tools: { override: <T>(token: Token<T>, provider: Provider<T>) => void }): void;\n}\n\nexport type KnownHttpApiKey =\n 'ilium' | 'simaV3' | 'simaV4' | 'simaV6' | 'chponkiV2' | 'shuttle' | 'fileDispatcher';\n\n/**\n * Строгая версия Map без возможности добавлять/удалять.\n */\nexport interface StrictMap<Key extends string> {\n /** Возвращает значение по ключу. */\n get(key: Key): string;\n}\n\n/**\n * Внутренний интерфейс для хранения ссылок на ассеты.\n */\nexport interface PageAssets {\n js: string;\n css: string;\n criticalJs?: string;\n criticalCss?: string;\n}\n\n/**\n * Структура ответа от frontend-микросервиса в формате JSON по соглашению.\n */\nexport interface ConventionalJson {\n markup: string;\n bundle_js: string;\n bundle_css: string;\n critical_js?: string;\n critical_css?: string;\n meta?: any;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_tokens","require","_axiosFactory","_fetch","_baseConfig","_di","_healthCheck","_configSource","_expressErrorMiddleware","_expressFactory","_expressLogMiddleware","_expressMetricsMiddleware","_expressRequestMiddleware","_expressTracingMiddleware","_knownHttpApiHosts","_logger","_metricsExpressApp","_telemetryTracer","_telemetryTracerSpanExporter","_ssrBridgeServerSide","_telemetryTracerProvider","_telemetryTracerResource","_mainExpressApp","_publicEnvs","_getClientIp","_getForwardedHeaders","_getPageResponseFormat","_handlerProvider","PresetNode","customize","preset","createPreset","set","KnownToken","Config","source","provideConfigSource","base","provideBaseConfig","publicEnvs","providePublicEnvs","logger","provideLogger","Tracing","tracer","provideTracer","spanExporter","provideSpanExporter","provider","provideTracingProvider","resource","provideTracingResource","Metrics","expressApp","provideMetricsExpressApp","Http","fetch","provideFetch","Fetch","middleware","Serve","Proxy","config","Axios","factory","provideAxiosFactory","Express","app","provideMainExpressApp","pageRoutes","serviceRoutes","resolve","Handlers","healthCheck","Middleware","request","log","metrics","tracing","endMiddleware","error","provideExpressFactory","provideExpressRequestMiddleware","provideExpressLogMiddleware","provideExpressMetricsMiddleware","provideExpressTracingMiddleware","provideExpressErrorMiddleware","Api","knownHosts","provideKnownHttpApiHosts","SsrBridge","serverSide","provideSsrBridgeServerSide","override","bind"],"sources":["../../../../src/preset/node/index.ts"],"sourcesContent":["import { KnownToken } from '../../tokens';\nimport { provideAxiosFactory } from '../isomorphic/providers/axios-factory';\nimport { provideFetch } from '../isomorphic/providers/fetch';\nimport { provideBaseConfig } from '../isomorphic/providers/base-config';\nimport { Preset, createPreset } from '../../di';\nimport { PresetTuner } from '../isomorphic/types';\nimport { healthCheck } from '../../utils/express/handler/health-check';\nimport { provideConfigSource } from './providers/config-source';\nimport { provideExpressErrorMiddleware } from './providers/express-error-middleware';\nimport { provideExpressFactory } from './providers/express-factory';\nimport { provideExpressLogMiddleware } from './providers/express-log-middleware';\nimport { provideExpressMetricsMiddleware } from './providers/express-metrics-middleware';\nimport { provideExpressRequestMiddleware } from './providers/express-request-middleware';\nimport { provideExpressTracingMiddleware } from './providers/express-tracing-middleware';\nimport { provideKnownHttpApiHosts } from '../server/providers/known-http-api-hosts';\nimport { provideLogger } from './providers/logger';\nimport { provideMetricsExpressApp } from './providers/metrics-express-app';\nimport { provideTracer } from './providers/telemetry-tracer';\nimport { provideSpanExporter } from './providers/telemetry-tracer-span-exporter';\nimport { provideSsrBridgeServerSide } from '../server/providers/ssr-bridge-server-side';\nimport { provideTracingProvider } from './providers/telemetry-tracer-provider';\nimport { provideTracingResource } from './providers/telemetry-tracer-resource';\nimport { provideMainExpressApp } from './providers/main-express-app';\nimport { ExpressRouteList } from './types';\nimport { providePublicEnvs } from './providers/public-envs';\n\n/**\n * Возвращает preset с зависимостями по умолчанию для frontend-микросервисов на Node.js.\n * @param customize Получит функцию с помощью которой можно переопределить предустановленные провайдеры.\n * @return Preset.\n */\nexport function PresetNode(customize?: PresetTuner): Preset {\n // ВАЖНО: используем .set() вместо аргумента defaults функции createPreset из-за скорости\n const preset = createPreset();\n\n // config\n preset.set(KnownToken.Config.source, provideConfigSource);\n preset.set(KnownToken.Config.base, provideBaseConfig);\n preset.set(KnownToken.Config.publicEnvs, providePublicEnvs);\n\n // log\n preset.set(KnownToken.logger, provideLogger);\n\n // tracing\n preset.set(KnownToken.Tracing.tracer, provideTracer);\n preset.set(KnownToken.Tracing.spanExporter, provideSpanExporter);\n preset.set(KnownToken.Tracing.provider, provideTracingProvider);\n preset.set(KnownToken.Tracing.resource, provideTracingResource);\n\n // metrics\n preset.set(KnownToken.Metrics.expressApp, provideMetricsExpressApp);\n\n // fetch\n preset.set(KnownToken.Http.fetch, provideFetch);\n preset.set(KnownToken.Http.Fetch.middleware, () => []);\n preset.set(KnownToken.Http.Serve.Proxy.config, () => null);\n\n // axios\n preset.set(KnownToken.Axios.factory, provideAxiosFactory);\n preset.set(KnownToken.Axios.middleware, () => []);\n\n // express\n preset.set(KnownToken.Express.app, provideMainExpressApp);\n preset.set(KnownToken.Express.pageRoutes, () => []);\n preset.set(\n KnownToken.Express.serviceRoutes,\n (resolve): ExpressRouteList => [\n ['/healthcheck', resolve(KnownToken.Express.Handlers.healthCheck)],\n ],\n );\n preset.set(KnownToken.Express.middleware, resolve => [\n resolve(KnownToken.Express.Middleware.request),\n resolve(KnownToken.Express.Middleware.log),\n resolve(KnownToken.Express.Middleware.metrics),\n resolve(KnownToken.Express.Middleware.tracing),\n ]);\n preset.set(KnownToken.Express.endMiddleware, resolve => [\n resolve(KnownToken.Express.Middleware.error),\n ]);\n preset.set(KnownToken.Express.factory, provideExpressFactory);\n preset.set(KnownToken.Express.Handlers.healthCheck, healthCheck);\n preset.set(KnownToken.Express.Middleware.request, provideExpressRequestMiddleware);\n preset.set(KnownToken.Express.Middleware.log, provideExpressLogMiddleware);\n preset.set(KnownToken.Express.Middleware.metrics, provideExpressMetricsMiddleware);\n preset.set(KnownToken.Express.Middleware.tracing, provideExpressTracingMiddleware);\n preset.set(KnownToken.Express.Middleware.error, provideExpressErrorMiddleware);\n\n // http api\n preset.set(KnownToken.Http.Api.knownHosts, provideKnownHttpApiHosts);\n\n // ssr bridge\n preset.set(KnownToken.SsrBridge.serverSide, provideSsrBridgeServerSide);\n\n if (customize) {\n customize({ override: preset.set.bind(preset) });\n }\n\n return preset;\n}\n\nexport type { ExpressHandlerContext, ExpressRouteList } from './types';\n\n// доступные утилиты\nexport { getClientIp } from './utils/get-client-ip';\nexport { getForwardedHeaders } from './utils/get-forwarded-headers';\nexport { getPageResponseFormat } from './utils/get-page-response-format';\nexport { HandlerProvider } from './utils/handler-provider';\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_tokens","require","_axiosFactory","_fetch","_baseConfig","_di","_healthCheck","_configSource","_expressErrorMiddleware","_expressFactory","_expressLogMiddleware","_expressMetricsMiddleware","_expressRequestMiddleware","_expressTracingMiddleware","_knownHttpApiHosts","_logger","_metricsExpressApp","_telemetryTracer","_telemetryTracerSpanExporter","_ssrBridgeServerSide","_telemetryTracerProvider","_telemetryTracerResource","_mainExpressApp","_publicEnvs","_getClientIp","_getForwardedHeaders","_getPageResponseFormat","_handlerProvider","PresetNode","customize","preset","createPreset","set","KnownToken","Config","source","provideConfigSource","base","provideBaseConfig","publicEnvs","providePublicEnvs","logger","provideLogger","Tracing","tracer","provideTracer","spanExporter","provideSpanExporter","provider","provideTracingProvider","resource","provideTracingResource","Metrics","expressApp","provideMetricsExpressApp","Http","fetch","provideFetch","Fetch","middleware","Serve","Proxy","config","Axios","factory","provideAxiosFactory","Express","app","provideMainExpressApp","pageRoutes","serviceRoutes","resolve","Handlers","healthCheck","Middleware","request","log","metrics","tracing","endMiddleware","error","provideExpressFactory","provideExpressRequestMiddleware","provideExpressLogMiddleware","provideExpressMetricsMiddleware","provideExpressTracingMiddleware","provideExpressErrorMiddleware","Api","knownHosts","provideKnownHttpApiHosts","SsrBridge","serverSide","provideSsrBridgeServerSide","override","bind"],"sources":["../../../../src/preset/node/index.ts"],"sourcesContent":["import { KnownToken } from '../../tokens';\nimport { provideAxiosFactory } from '../isomorphic/providers/axios-factory';\nimport { provideFetch } from '../isomorphic/providers/fetch';\nimport { provideBaseConfig } from '../isomorphic/providers/base-config';\nimport { Preset, createPreset } from '../../di';\nimport { PresetTuner } from '../isomorphic/types';\nimport { healthCheck } from '../../utils/express/handler/health-check';\nimport { provideConfigSource } from './providers/config-source';\nimport { provideExpressErrorMiddleware } from './providers/express-error-middleware';\nimport { provideExpressFactory } from './providers/express-factory';\nimport { provideExpressLogMiddleware } from './providers/express-log-middleware';\nimport { provideExpressMetricsMiddleware } from './providers/express-metrics-middleware';\nimport { provideExpressRequestMiddleware } from './providers/express-request-middleware';\nimport { provideExpressTracingMiddleware } from './providers/express-tracing-middleware';\nimport { provideKnownHttpApiHosts } from '../server/providers/known-http-api-hosts';\nimport { provideLogger } from './providers/logger';\nimport { provideMetricsExpressApp } from './providers/metrics-express-app';\nimport { provideTracer } from './providers/telemetry-tracer';\nimport { provideSpanExporter } from './providers/telemetry-tracer-span-exporter';\nimport { provideSsrBridgeServerSide } from '../server/providers/ssr-bridge-server-side';\nimport { provideTracingProvider } from './providers/telemetry-tracer-provider';\nimport { provideTracingResource } from './providers/telemetry-tracer-resource';\nimport { provideMainExpressApp } from './providers/main-express-app';\nimport { ExpressRouteList } from './types';\nimport { providePublicEnvs } from './providers/public-envs';\n\n/**\n * Возвращает preset с зависимостями по умолчанию для frontend-микросервисов на Node.js.\n * @param customize Получит функцию с помощью которой можно переопределить предустановленные провайдеры.\n * @return Preset.\n */\nexport function PresetNode(customize?: PresetTuner): Preset {\n // ВАЖНО: используем .set() вместо аргумента defaults функции createPreset из-за скорости\n const preset = createPreset();\n\n // config\n preset.set(KnownToken.Config.source, provideConfigSource);\n preset.set(KnownToken.Config.base, provideBaseConfig);\n preset.set(KnownToken.Config.publicEnvs, providePublicEnvs);\n\n // log\n preset.set(KnownToken.logger, provideLogger);\n\n // tracing\n preset.set(KnownToken.Tracing.tracer, provideTracer);\n preset.set(KnownToken.Tracing.spanExporter, provideSpanExporter);\n preset.set(KnownToken.Tracing.provider, provideTracingProvider);\n preset.set(KnownToken.Tracing.resource, provideTracingResource);\n\n // metrics\n preset.set(KnownToken.Metrics.expressApp, provideMetricsExpressApp);\n\n // fetch\n preset.set(KnownToken.Http.fetch, provideFetch);\n preset.set(KnownToken.Http.Fetch.middleware, () => []);\n preset.set(KnownToken.Http.Serve.Proxy.config, () => null);\n\n // axios\n preset.set(KnownToken.Axios.factory, provideAxiosFactory);\n preset.set(KnownToken.Axios.middleware, () => []);\n\n // express\n preset.set(KnownToken.Express.app, provideMainExpressApp);\n preset.set(KnownToken.Express.pageRoutes, () => []);\n preset.set(KnownToken.Express.serviceRoutes, (resolve): ExpressRouteList => [\n ['/healthcheck', resolve(KnownToken.Express.Handlers.healthCheck)],\n ]);\n preset.set(KnownToken.Express.middleware, resolve => [\n resolve(KnownToken.Express.Middleware.request),\n resolve(KnownToken.Express.Middleware.log),\n resolve(KnownToken.Express.Middleware.metrics),\n resolve(KnownToken.Express.Middleware.tracing),\n ]);\n preset.set(KnownToken.Express.endMiddleware, resolve => [\n resolve(KnownToken.Express.Middleware.error),\n ]);\n preset.set(KnownToken.Express.factory, provideExpressFactory);\n preset.set(KnownToken.Express.Handlers.healthCheck, healthCheck);\n preset.set(KnownToken.Express.Middleware.request, provideExpressRequestMiddleware);\n preset.set(KnownToken.Express.Middleware.log, provideExpressLogMiddleware);\n preset.set(KnownToken.Express.Middleware.metrics, provideExpressMetricsMiddleware);\n preset.set(KnownToken.Express.Middleware.tracing, provideExpressTracingMiddleware);\n preset.set(KnownToken.Express.Middleware.error, provideExpressErrorMiddleware);\n\n // http api\n preset.set(KnownToken.Http.Api.knownHosts, provideKnownHttpApiHosts);\n\n // ssr bridge\n preset.set(KnownToken.SsrBridge.serverSide, provideSsrBridgeServerSide);\n\n if (customize) {\n customize({ override: preset.set.bind(preset) });\n }\n\n return preset;\n}\n\nexport type { ExpressHandlerContext, ExpressRouteList } from './types';\n\n// доступные утилиты\nexport { getClientIp } from './utils/get-client-ip';\nexport { getForwardedHeaders } from './utils/get-forwarded-headers';\nexport { getPageResponseFormat } from './utils/get-page-response-format';\nexport { HandlerProvider } from './utils/handler-provider';\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -19,13 +19,15 @@ function axiosTracingMiddleware(tracer, rootContext) {
|
|
|
19
19
|
return async function trace(config, next, defaults) {
|
|
20
20
|
const {
|
|
21
21
|
method,
|
|
22
|
-
urlStr
|
|
22
|
+
urlStr,
|
|
23
|
+
params
|
|
23
24
|
} = getRequestInfo(config, defaults);
|
|
24
25
|
const url = new URL(urlStr);
|
|
25
26
|
const span = tracer.startSpan(`axios ${method} ${url}`, undefined, rootContext);
|
|
26
27
|
span.setAttributes({
|
|
27
28
|
[_incubating.ATTR_URL_FULL]: url.href,
|
|
28
29
|
[_incubating.ATTR_HTTP_REQUEST_METHOD]: method,
|
|
30
|
+
...(0, _telemetry.getUrlQueryAttributes)(params),
|
|
29
31
|
...(0, _telemetry.getSemanticHeaders)({
|
|
30
32
|
// @todo непонятно как доставать заголовки из defaults потому что там на одном уровне заголовки и таблицы заголовков
|
|
31
33
|
...defaults.headers.common,
|
|
@@ -34,12 +36,18 @@ function axiosTracingMiddleware(tracer, rootContext) {
|
|
|
34
36
|
})
|
|
35
37
|
});
|
|
36
38
|
try {
|
|
37
|
-
await next(config);
|
|
39
|
+
const response = await next(config);
|
|
40
|
+
span.setAttributes({
|
|
41
|
+
[_incubating.ATTR_HTTP_RESPONSE_STATUS_CODE]: response.status
|
|
42
|
+
});
|
|
38
43
|
} catch (error) {
|
|
39
44
|
span.setStatus({
|
|
40
45
|
code: _api.SpanStatusCode.ERROR,
|
|
41
46
|
message: 'HTTP Request failed'
|
|
42
47
|
});
|
|
48
|
+
span.setAttributes({
|
|
49
|
+
[_incubating.ATTR_HTTP_RESPONSE_STATUS_CODE]: error.status
|
|
50
|
+
});
|
|
43
51
|
span.end();
|
|
44
52
|
|
|
45
53
|
// не прячем ошибку
|
|
@@ -58,9 +66,11 @@ function axiosTracingMiddleware(tracer, rootContext) {
|
|
|
58
66
|
function getRequestInfo(config, defaults) {
|
|
59
67
|
const method = (config.method || 'GET').toUpperCase();
|
|
60
68
|
const baseURL = config.baseURL || defaults.baseURL || '';
|
|
69
|
+
const params = config.params || new URLSearchParams();
|
|
61
70
|
return {
|
|
62
71
|
method,
|
|
63
|
-
urlStr: (0, _displayUrl.displayUrl)(baseURL, config.url || defaults.url || '')
|
|
72
|
+
urlStr: (0, _displayUrl.displayUrl)(baseURL, config.url || defaults.url || ''),
|
|
73
|
+
params
|
|
64
74
|
};
|
|
65
75
|
}
|
|
66
76
|
//# sourceMappingURL=axios-tracing-middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-tracing-middleware.js","names":["_api","require","_incubating","_displayUrl","_telemetry","axiosTracingMiddleware","tracer","rootContext","trace","config","next","defaults","method","urlStr","getRequestInfo","url","URL","span","startSpan","undefined","setAttributes","ATTR_URL_FULL","href","ATTR_HTTP_REQUEST_METHOD","getSemanticHeaders","headers","common","toLowerCase","error","setStatus","code","SpanStatusCode","ERROR","message","end","toUpperCase","baseURL","displayUrl"],"sources":["../../../../../src/preset/node/utils/axios-tracing-middleware.ts"],"sourcesContent":["import type { AxiosInstance, AxiosRequestConfig, HeadersDefaults } from 'axios';\nimport type { Middleware } from 'middleware-axios';\nimport { Context, Tracer, SpanStatusCode } from '@opentelemetry/api';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { displayUrl } from '../../isomorphic/utils/display-url';\nimport { getSemanticHeaders } from './telemetry';\n\n/**\n * Возвращает новый middleware для трассировки исходящих запросов.\n * @param tracer Трейсер.\n * @param rootContext Контекст.\n * @return Middleware.\n */\nexport function axiosTracingMiddleware(tracer: Tracer, rootContext: Context): Middleware<any> {\n return async function trace(config, next, defaults) {\n const { method, urlStr } = getRequestInfo(config, defaults);\n const url = new URL(urlStr);\n const span = tracer.startSpan(`axios ${method} ${url}`, undefined, rootContext);\n\n span.setAttributes({\n [ATTR_URL_FULL]: url.href,\n [ATTR_HTTP_REQUEST_METHOD]: method,\n ...getSemanticHeaders({\n // @todo непонятно как доставать заголовки из defaults потому что там на одном уровне заголовки и таблицы заголовков\n ...defaults.headers.common,\n ...defaults.headers[method.toLowerCase() as keyof HeadersDefaults],\n ...config.headers,\n }),\n });\n\n try {\n await next(config);\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'HTTP Request failed',\n });\n\n span.end();\n\n // не прячем ошибку\n throw error;\n }\n\n span.end();\n };\n}\n\n/**\n * Формирует базовые данные запроса.\n * @param config Axios-конфиг запроса.\n * @param defaults Базовый конфиг экземпляра Axios.\n * @return Базовые данные запроса.\n */\nexport function getRequestInfo(\n config: AxiosRequestConfig,\n defaults: AxiosInstance['defaults'],\n): {\n method: string;\n urlStr: string;\n} {\n const method = (config.method || 'GET').toUpperCase();\n const baseURL = config.baseURL || defaults.baseURL || '';\n\n return {\n method,\n urlStr: displayUrl(baseURL, config.url || defaults.url || ''),\n };\n}\n"],"mappings":";;;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;
|
|
1
|
+
{"version":3,"file":"axios-tracing-middleware.js","names":["_api","require","_incubating","_displayUrl","_telemetry","axiosTracingMiddleware","tracer","rootContext","trace","config","next","defaults","method","urlStr","params","getRequestInfo","url","URL","span","startSpan","undefined","setAttributes","ATTR_URL_FULL","href","ATTR_HTTP_REQUEST_METHOD","getUrlQueryAttributes","getSemanticHeaders","headers","common","toLowerCase","response","ATTR_HTTP_RESPONSE_STATUS_CODE","status","error","setStatus","code","SpanStatusCode","ERROR","message","end","toUpperCase","baseURL","URLSearchParams","displayUrl"],"sources":["../../../../../src/preset/node/utils/axios-tracing-middleware.ts"],"sourcesContent":["import type { AxiosInstance, AxiosRequestConfig, HeadersDefaults } from 'axios';\nimport type { Middleware } from 'middleware-axios';\nimport { Context, Tracer, SpanStatusCode } from '@opentelemetry/api';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_URL_FULL,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { displayUrl } from '../../isomorphic/utils/display-url';\nimport { getSemanticHeaders, getUrlQueryAttributes } from './telemetry';\n\n/**\n * Возвращает новый middleware для трассировки исходящих запросов.\n * @param tracer Трейсер.\n * @param rootContext Контекст.\n * @return Middleware.\n */\nexport function axiosTracingMiddleware(tracer: Tracer, rootContext: Context): Middleware<any> {\n return async function trace(config, next, defaults) {\n const { method, urlStr, params } = getRequestInfo(config, defaults);\n const url = new URL(urlStr);\n const span = tracer.startSpan(`axios ${method} ${url}`, undefined, rootContext);\n\n span.setAttributes({\n [ATTR_URL_FULL]: url.href,\n [ATTR_HTTP_REQUEST_METHOD]: method,\n ...getUrlQueryAttributes(params),\n ...getSemanticHeaders({\n // @todo непонятно как доставать заголовки из defaults потому что там на одном уровне заголовки и таблицы заголовков\n ...defaults.headers.common,\n ...defaults.headers[method.toLowerCase() as keyof HeadersDefaults],\n ...config.headers,\n }),\n });\n\n try {\n const response = await next(config);\n span.setAttributes({\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: response.status,\n });\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: 'HTTP Request failed',\n });\n span.setAttributes({\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: (error as any).status,\n });\n\n span.end();\n\n // не прячем ошибку\n throw error;\n }\n\n span.end();\n };\n}\n\n/**\n * Формирует базовые данные запроса.\n * @param config Axios-конфиг запроса.\n * @param defaults Базовый конфиг экземпляра Axios.\n * @return Базовые данные запроса.\n */\nexport function getRequestInfo(\n config: AxiosRequestConfig,\n defaults: AxiosInstance['defaults'],\n): {\n method: string;\n urlStr: string;\n params: URLSearchParams;\n} {\n const method = (config.method || 'GET').toUpperCase();\n const baseURL = config.baseURL || defaults.baseURL || '';\n const params: URLSearchParams = config.params || new URLSearchParams();\n\n return {\n method,\n urlStr: displayUrl(baseURL, config.url || defaults.url || ''),\n params,\n };\n}\n"],"mappings":";;;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAKA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASI,sBAAsBA,CAACC,MAAc,EAAEC,WAAoB,EAAmB;EAC5F,OAAO,eAAeC,KAAKA,CAACC,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAE;IAClD,MAAM;MAAEC,MAAM;MAAEC,MAAM;MAAEC;IAAO,CAAC,GAAGC,cAAc,CAACN,MAAM,EAAEE,QAAQ,CAAC;IACnE,MAAMK,GAAG,GAAG,IAAIC,GAAG,CAACJ,MAAM,CAAC;IAC3B,MAAMK,IAAI,GAAGZ,MAAM,CAACa,SAAS,CAAC,SAASP,MAAM,IAAII,GAAG,EAAE,EAAEI,SAAS,EAAEb,WAAW,CAAC;IAE/EW,IAAI,CAACG,aAAa,CAAC;MACjB,CAACC,yBAAa,GAAGN,GAAG,CAACO,IAAI;MACzB,CAACC,oCAAwB,GAAGZ,MAAM;MAClC,GAAG,IAAAa,gCAAqB,EAACX,MAAM,CAAC;MAChC,GAAG,IAAAY,6BAAkB,EAAC;QACpB;QACA,GAAGf,QAAQ,CAACgB,OAAO,CAACC,MAAM;QAC1B,GAAGjB,QAAQ,CAACgB,OAAO,CAACf,MAAM,CAACiB,WAAW,CAAC,CAAC,CAA0B;QAClE,GAAGpB,MAAM,CAACkB;MACZ,CAAC;IACH,CAAC,CAAC;IAEF,IAAI;MACF,MAAMG,QAAQ,GAAG,MAAMpB,IAAI,CAACD,MAAM,CAAC;MACnCS,IAAI,CAACG,aAAa,CAAC;QACjB,CAACU,0CAA8B,GAAGD,QAAQ,CAACE;MAC7C,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdf,IAAI,CAACgB,SAAS,CAAC;QACbC,IAAI,EAAEC,mBAAc,CAACC,KAAK;QAC1BC,OAAO,EAAE;MACX,CAAC,CAAC;MACFpB,IAAI,CAACG,aAAa,CAAC;QACjB,CAACU,0CAA8B,GAAIE,KAAK,CAASD;MACnD,CAAC,CAAC;MAEFd,IAAI,CAACqB,GAAG,CAAC,CAAC;;MAEV;MACA,MAAMN,KAAK;IACb;IAEAf,IAAI,CAACqB,GAAG,CAAC,CAAC;EACZ,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASxB,cAAcA,CAC5BN,MAA0B,EAC1BE,QAAmC,EAKnC;EACA,MAAMC,MAAM,GAAG,CAACH,MAAM,CAACG,MAAM,IAAI,KAAK,EAAE4B,WAAW,CAAC,CAAC;EACrD,MAAMC,OAAO,GAAGhC,MAAM,CAACgC,OAAO,IAAI9B,QAAQ,CAAC8B,OAAO,IAAI,EAAE;EACxD,MAAM3B,MAAuB,GAAGL,MAAM,CAACK,MAAM,IAAI,IAAI4B,eAAe,CAAC,CAAC;EAEtE,OAAO;IACL9B,MAAM;IACNC,MAAM,EAAE,IAAA8B,sBAAU,EAACF,OAAO,EAAEhC,MAAM,CAACO,GAAG,IAAIL,QAAQ,CAACK,GAAG,IAAI,EAAE,CAAC;IAC7DF;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getSemanticHeaders = getSemanticHeaders;
|
|
7
|
+
exports.getUrlQueryAttributes = getUrlQueryAttributes;
|
|
7
8
|
var _semanticConventions = require("@opentelemetry/semantic-conventions");
|
|
8
9
|
/**
|
|
9
10
|
* Формирует данные заголовков согласно семантике.
|
|
@@ -20,4 +21,22 @@ function getSemanticHeaders(headers) {
|
|
|
20
21
|
}, {});
|
|
21
22
|
return Object.keys(result).length ? result : null;
|
|
22
23
|
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Формирует данные параметров запроса.
|
|
27
|
+
* @param params Объект URLSearchParams c параметрами запроса.
|
|
28
|
+
* @return Данные параметров запроса.
|
|
29
|
+
*/
|
|
30
|
+
function getUrlQueryAttributes(params) {
|
|
31
|
+
const urlParams = {};
|
|
32
|
+
for (const [param, value] of params.entries()) {
|
|
33
|
+
const currentKey = `${_semanticConventions.ATTR_URL_QUERY}.${param}`;
|
|
34
|
+
if (urlParams[currentKey]) {
|
|
35
|
+
urlParams[currentKey] = `${urlParams[currentKey]},${value}`;
|
|
36
|
+
} else {
|
|
37
|
+
urlParams[currentKey] = value;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return urlParams;
|
|
41
|
+
}
|
|
23
42
|
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","names":["_semanticConventions","require","getSemanticHeaders","headers","result","Object","entries","reduce","acc","key","value","ATTR_HTTP_REQUEST_HEADER","keys","length"],"sources":["../../../../../src/preset/node/utils/telemetry.ts"],"sourcesContent":["import { ATTR_HTTP_REQUEST_HEADER } from '@opentelemetry/semantic-conventions';\n\n/**\n * Формирует данные заголовков согласно семантике.\n * @todo Возможно стоит убрать cookie/Cookie.\n * @param headers Объект заголовков запроса.\n * @return Данные заголовков.\n */\nexport function getSemanticHeaders(headers: Record<string, any>): Record<string, string> | null {\n const result = Object.entries(headers).reduce<Record<string, string>>((acc, [key, value]) => {\n if (value || typeof value === 'number') {\n acc[ATTR_HTTP_REQUEST_HEADER(key)] = value;\n }\n return acc;\n }, {});\n\n return Object.keys(result).length ? result : null;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["_semanticConventions","require","getSemanticHeaders","headers","result","Object","entries","reduce","acc","key","value","ATTR_HTTP_REQUEST_HEADER","keys","length","getUrlQueryAttributes","params","urlParams","param","currentKey","ATTR_URL_QUERY"],"sources":["../../../../../src/preset/node/utils/telemetry.ts"],"sourcesContent":["import { ATTR_HTTP_REQUEST_HEADER, ATTR_URL_QUERY } from '@opentelemetry/semantic-conventions';\n\n/**\n * Формирует данные заголовков согласно семантике.\n * @todo Возможно стоит убрать cookie/Cookie.\n * @param headers Объект заголовков запроса.\n * @return Данные заголовков.\n */\nexport function getSemanticHeaders(headers: Record<string, any>): Record<string, string> | null {\n const result = Object.entries(headers).reduce<Record<string, string>>((acc, [key, value]) => {\n if (value || typeof value === 'number') {\n acc[ATTR_HTTP_REQUEST_HEADER(key)] = value;\n }\n return acc;\n }, {});\n\n return Object.keys(result).length ? result : null;\n}\n\n/**\n * Формирует данные параметров запроса.\n * @param params Объект URLSearchParams c параметрами запроса.\n * @return Данные параметров запроса.\n */\nexport function getUrlQueryAttributes(params: URLSearchParams): Record<string, string> {\n const urlParams: Record<string, string> = {};\n for (const [param, value] of params.entries()) {\n const currentKey = `${ATTR_URL_QUERY}.${param}`;\n if (urlParams[currentKey]) {\n urlParams[currentKey] = `${urlParams[currentKey]},${value}`;\n } else {\n urlParams[currentKey] = value;\n }\n }\n return urlParams;\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,kBAAkBA,CAACC,OAA4B,EAAiC;EAC9F,MAAMC,MAAM,GAAGC,MAAM,CAACC,OAAO,CAACH,OAAO,CAAC,CAACI,MAAM,CAAyB,CAACC,GAAG,EAAE,CAACC,GAAG,EAAEC,KAAK,CAAC,KAAK;IAC3F,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MACtCF,GAAG,CAAC,IAAAG,6CAAwB,EAACF,GAAG,CAAC,CAAC,GAAGC,KAAK;IAC5C;IACA,OAAOF,GAAG;EACZ,CAAC,EAAE,CAAC,CAAC,CAAC;EAEN,OAAOH,MAAM,CAACO,IAAI,CAACR,MAAM,CAAC,CAACS,MAAM,GAAGT,MAAM,GAAG,IAAI;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASU,qBAAqBA,CAACC,MAAuB,EAA0B;EACrF,MAAMC,SAAiC,GAAG,CAAC,CAAC;EAC5C,KAAK,MAAM,CAACC,KAAK,EAAEP,KAAK,CAAC,IAAIK,MAAM,CAACT,OAAO,CAAC,CAAC,EAAE;IAC7C,MAAMY,UAAU,GAAG,GAAGC,mCAAc,IAAIF,KAAK,EAAE;IAC/C,IAAID,SAAS,CAACE,UAAU,CAAC,EAAE;MACzBF,SAAS,CAACE,UAAU,CAAC,GAAG,GAAGF,SAAS,CAACE,UAAU,CAAC,IAAIR,KAAK,EAAE;IAC7D,CAAC,MAAM;MACLM,SAAS,CAACE,UAAU,CAAC,GAAGR,KAAK;IAC/B;EACF;EACA,OAAOM,SAAS;AAClB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/preset/server/types.ts"],"sourcesContent":["import type { PageAssets } from '../isomorphic';\n\n/**\n * На сервере между промежуточными слоями надо обмениваться данными поэтому появился такой интерфейс.\n * Возможно в будущем он перейдет в `@krutoo/fetch-tools`.\n */\nexport interface ServerHandlerContext {\n events: EventTarget;\n}\n\nexport interface ServerHandler {\n (request: Request, context: ServerHandlerContext): Response | Promise<Response>;\n}\n\nexport interface ServerEnhancer {\n (request: ServerHandler): ServerHandler;\n}\n\nexport interface ServerMiddleware {\n (\n request: Request,\n next: (req: Request, ctx?: ServerHandlerContext) => Response | Promise<Response>,\n context: ServerHandlerContext,\n ): Response | Promise<Response>;\n}\n\nexport interface PageResponseFormatResult {\n body: string;\n headers: Headers;\n}\n\nexport interface PageResponseFormatter {\n (\n jsx: JSX.Element,\n assets: PageAssets,\n ): PageResponseFormatResult | Promise<PageResponseFormatResult>;\n}\n\nexport interface RenderToString {\n (jsx: JSX.Element): string | Promise<string>;\n}\n\nexport interface RouteInfo {\n method: 'all' | 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head';\n path: string;\n}\n\nexport type RouteList = Array<[string | RouteInfo, ServerHandler]>;\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/preset/server/types.ts"],"sourcesContent":["import type { JSX } from 'react';\nimport type { PageAssets } from '../isomorphic';\n\n/**\n * На сервере между промежуточными слоями надо обмениваться данными поэтому появился такой интерфейс.\n * Возможно в будущем он перейдет в `@krutoo/fetch-tools`.\n */\nexport interface ServerHandlerContext {\n events: EventTarget;\n}\n\nexport interface ServerHandler {\n (request: Request, context: ServerHandlerContext): Response | Promise<Response>;\n}\n\nexport interface ServerEnhancer {\n (request: ServerHandler): ServerHandler;\n}\n\nexport interface ServerMiddleware {\n (\n request: Request,\n next: (req: Request, ctx?: ServerHandlerContext) => Response | Promise<Response>,\n context: ServerHandlerContext,\n ): Response | Promise<Response>;\n}\n\nexport interface PageResponseFormatResult {\n body: string;\n headers: Headers;\n}\n\nexport interface PageResponseFormatter {\n (\n jsx: JSX.Element,\n assets: PageAssets,\n ): PageResponseFormatResult | Promise<PageResponseFormatResult>;\n}\n\nexport interface RenderToString {\n (jsx: JSX.Element): string | Promise<string>;\n}\n\nexport interface RouteInfo {\n method: 'all' | 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head';\n path: string;\n}\n\nexport type RouteList = Array<[string | RouteInfo, ServerHandler]>;\n"],"mappings":"","ignoreList":[]}
|
|
@@ -4,17 +4,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.STATUS = exports.RemoteData = void 0;
|
|
7
|
-
var
|
|
8
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
7
|
+
var _toolkit = require("@reduxjs/toolkit");
|
|
9
8
|
/* eslint-disable jsdoc/require-jsdoc */
|
|
10
9
|
|
|
11
|
-
// @todo "* as" сделано для работы в Node.js ESM но есть подозрение что на tree shaking плохо скажется
|
|
12
|
-
|
|
13
|
-
const {
|
|
14
|
-
createAction,
|
|
15
|
-
createSelector
|
|
16
|
-
} = redux;
|
|
17
|
-
|
|
18
10
|
/**
|
|
19
11
|
* Статус загрузки данных.
|
|
20
12
|
*/
|
|
@@ -46,9 +38,9 @@ class RemoteData {
|
|
|
46
38
|
*/
|
|
47
39
|
static createActions(name) {
|
|
48
40
|
return {
|
|
49
|
-
request: createAction(`${name}/request`),
|
|
50
|
-
success: createAction(`${name}/success`),
|
|
51
|
-
failure: createAction(`${name}/failure`)
|
|
41
|
+
request: (0, _toolkit.createAction)(`${name}/request`),
|
|
42
|
+
success: (0, _toolkit.createAction)(`${name}/success`),
|
|
43
|
+
failure: (0, _toolkit.createAction)(`${name}/failure`)
|
|
52
44
|
};
|
|
53
45
|
}
|
|
54
46
|
|
|
@@ -107,11 +99,11 @@ class RemoteData {
|
|
|
107
99
|
*/
|
|
108
100
|
static createSelectors(selectRoot) {
|
|
109
101
|
return {
|
|
110
|
-
isInitial: createSelector(selectRoot, state => state.status ===
|
|
111
|
-
isFetching: createSelector(selectRoot, state => state.status ===
|
|
112
|
-
isSuccess: createSelector(selectRoot, state => state.status ===
|
|
113
|
-
isFailed: createSelector(selectRoot, state => state.status ===
|
|
114
|
-
wasFetched: createSelector(selectRoot, state => (state.fetchCount ?? 0) > 0)
|
|
102
|
+
isInitial: (0, _toolkit.createSelector)(selectRoot, state => state.status === STATUS.initial),
|
|
103
|
+
isFetching: (0, _toolkit.createSelector)(selectRoot, state => state.status === STATUS.fetching),
|
|
104
|
+
isSuccess: (0, _toolkit.createSelector)(selectRoot, state => state.status === STATUS.success),
|
|
105
|
+
isFailed: (0, _toolkit.createSelector)(selectRoot, state => state.status === STATUS.failure),
|
|
106
|
+
wasFetched: (0, _toolkit.createSelector)(selectRoot, state => (state.fetchCount ?? 0) > 0)
|
|
115
107
|
};
|
|
116
108
|
}
|
|
117
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-data.js","names":["
|
|
1
|
+
{"version":3,"file":"remote-data.js","names":["_toolkit","require","STATUS","exports","initial","fetching","success","failure","RemoteData","createActions","name","request","createAction","createHandlers","state","_action","status","action","data","payload","fetchCount","error","applyHandlers","actions","builder","handlers","addCase","type","createSelectors","selectRoot","isInitial","createSelector","isFetching","isSuccess","isFailed","wasFetched"],"sources":["../../../../src/utils/redux/remote-data.ts"],"sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\nimport {\n createAction,\n createSelector,\n type ActionReducerMapBuilder,\n type Draft,\n type PayloadAction,\n type PayloadActionCreator,\n} from '@reduxjs/toolkit';\n\ninterface RemoteDataActions<TData, TError = unknown, TPayload = void> {\n request: PayloadActionCreator<TPayload, string>;\n success: PayloadActionCreator<TData, string>;\n failure: 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 = {\n initial: 'initial',\n fetching: 'fetching',\n success: 'success',\n failure: 'failure',\n} as const satisfies Record<Status, Status>;\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 TPayload = void,\n >() {\n // ВАЖНО: не используем возможности immer здесь чтобы набор можно было использовать без immer.\n return {\n request(\n state: S | Draft<S>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _action: PayloadAction<TPayload>,\n ): S | Draft<S> {\n return {\n ...state,\n status: STATUS.fetching,\n };\n },\n\n success(state: S | Draft<S>, action: PayloadAction<TData>): S | 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 | Draft<S>, action: PayloadAction<TError>): S | 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, S extends RemoteDataState<TData, TError>, TPayload>(\n actions: RemoteDataActions<TData, TError, TPayload>,\n builder: Pick<ActionReducerMapBuilder<S>, 'addCase'>,\n ): void {\n const handlers = RemoteData.createHandlers<TData, TError, S, TPayload>();\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 === STATUS.initial),\n isFetching: createSelector(selectRoot, state => state.status === STATUS.fetching),\n isSuccess: createSelector(selectRoot, state => state.status === STATUS.success),\n isFailed: createSelector(selectRoot, state => state.status === STATUS.failure),\n wasFetched: createSelector(selectRoot, state => (state.fetchCount ?? 0) > 0),\n } as const;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,19 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.createCurriedSelector = void 0;
|
|
7
|
-
var
|
|
8
|
-
var _reactRedux = require("react-redux");
|
|
9
|
-
/**
|
|
10
|
-
* Опции для включения внутреннего кэша,
|
|
11
|
-
* чтобы селектор с параметрами запоминал вычисления при смене значения параметра.
|
|
12
|
-
*/
|
|
13
|
-
const MEMOIZE_OPTIONS = {
|
|
14
|
-
equalityCheck: _reactRedux.shallowEqual,
|
|
15
|
-
resultEqualityCheck: _reactRedux.shallowEqual,
|
|
16
|
-
maxSize: 10
|
|
17
|
-
};
|
|
18
|
-
const createCashedSelector = (0, _reselect.createSelectorCreator)(_reselect.defaultMemoize, MEMOIZE_OPTIONS);
|
|
19
|
-
|
|
7
|
+
var _toolkit = require("@reduxjs/toolkit");
|
|
20
8
|
/**
|
|
21
9
|
* Возвращает каррированную версию селектора.
|
|
22
10
|
* По мотивам https://reselect.js.org/FAQ#how-can-i-make-a-curried-selector.
|
|
@@ -36,6 +24,6 @@ const currySelector = selector => {
|
|
|
36
24
|
* По мотивам https://reselect.js.org/FAQ#how-can-i-make-a-curried-selector.
|
|
37
25
|
* @inheritdoc
|
|
38
26
|
*/
|
|
39
|
-
const createCurriedSelector = (...args) => currySelector(
|
|
27
|
+
const createCurriedSelector = (...args) => currySelector((0, _toolkit.createSelector)(...args));
|
|
40
28
|
exports.createCurriedSelector = createCurriedSelector;
|
|
41
29
|
//# sourceMappingURL=create-curried-selector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-curried-selector.js","names":["
|
|
1
|
+
{"version":3,"file":"create-curried-selector.js","names":["_toolkit","require","currySelector","selector","curriedSelector","args","state","Object","assign","uncurried","createCurriedSelector","createSelector","exports"],"sources":["../../../../src/utils/selectors/create-curried-selector.ts"],"sourcesContent":["import { createSelector, Selector } from '@reduxjs/toolkit';\n\ntype CurriedSelectorFrom<F> = F extends (state: infer State, ...args: infer Params) => infer R\n ? ((...args: Params) => (state: State) => R) & F & { uncurried: F }\n : never;\n\n/**\n * Возвращает каррированную версию селектора.\n * По мотивам https://reselect.js.org/FAQ#how-can-i-make-a-curried-selector.\n * @param selector Исходный селектор.\n * @return Каррированный селектор.\n */\nconst currySelector = <S extends (...args: any[]) => any>(selector: S) => {\n /** @inheritdoc */\n const curriedSelector =\n (...args: any[]) =>\n (state: any) =>\n selector(state, ...args);\n return Object.assign(curriedSelector, selector, { uncurried: selector });\n};\n\n/**\n * Тот же createSelector, но возвращает каррированный селектор с кэшем параметров.\n * По мотивам https://reselect.js.org/FAQ#how-can-i-make-a-curried-selector.\n * @inheritdoc\n */\nexport const createCurriedSelector = <InputSelectors extends Selector[], Result>(\n ...args: Parameters<typeof createSelector<InputSelectors, Result>>\n): CurriedSelectorFrom<ReturnType<typeof createSelector<InputSelectors, Result>>> =>\n currySelector(createSelector(...args));\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,aAAa,GAAuCC,QAAW,IAAK;EACxE;EACA,MAAMC,eAAe,GACnBA,CAAC,GAAGC,IAAW,KACdC,KAAU,IACTH,QAAQ,CAACG,KAAK,EAAE,GAAGD,IAAI,CAAC;EAC5B,OAAOE,MAAM,CAACC,MAAM,CAACJ,eAAe,EAAED,QAAQ,EAAE;IAAEM,SAAS,EAAEN;EAAS,CAAC,CAAC;AAC1E,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,MAAMO,qBAAqB,GAAGA,CACnC,GAAGL,IAA+D,KAElEH,aAAa,CAAC,IAAAS,uBAAc,EAAC,GAAGN,IAAI,CAAC,CAAC;AAACO,OAAA,CAAAF,qBAAA,GAAAA,qBAAA","ignoreList":[]}
|
package/dist/esm/http/utils.js
CHANGED
|
@@ -133,13 +133,12 @@ export function isNetworkError(value) {
|
|
|
133
133
|
return false;
|
|
134
134
|
}
|
|
135
135
|
const {
|
|
136
|
-
message
|
|
137
|
-
stack
|
|
136
|
+
message
|
|
138
137
|
} = value;
|
|
139
138
|
|
|
140
139
|
// ВАЖНО: в Safari 17+ ошибки имеют определенное сообщение и не имеют свойства stack
|
|
141
140
|
if (message === 'Load failed' || message.startsWith('Load failed (') && message.endsWith(')')) {
|
|
142
|
-
return
|
|
141
|
+
return true;
|
|
143
142
|
}
|
|
144
143
|
|
|
145
144
|
// Chrome
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["FetchUtil","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","parse","ok","data","error","Error","status","statusText","headers","isError","value","prototype","toString","call","networkErrorMessages","Set","isNetworkError","isValid","name","message","
|
|
1
|
+
{"version":3,"file":"utils.js","names":["FetchUtil","setParams","url","params","paramName","paramValue","Object","entries","searchParams","delete","undefined","set","String","withParams","resultUrl","URL","withoutParams","search","eitherResponse","parseBody","response","json","parse","ok","data","error","Error","status","statusText","headers","isError","value","prototype","toString","call","networkErrorMessages","Set","isNetworkError","isValid","name","message","startsWith","endsWith","has","isAbortError"],"sources":["../../../src/http/utils.ts"],"sourcesContent":["import type { URLSearchParamsInit, ResponseDone, ResponseFail } from './types';\n\n/**\n * Утилиты для работы с URL, URLSearchParams, Headers, Request, Response.\n */\nexport const FetchUtil = {\n /**\n * Получив параметры применит их к переданному URL.\n * @param url URL.\n * @param params Параметры.\n */\n setParams(url: URL, params: URLSearchParamsInit): void {\n for (const [paramName, paramValue] of Object.entries(params)) {\n if (paramValue === null) {\n url.searchParams.delete(paramName);\n continue;\n }\n\n if (paramValue !== undefined) {\n url.searchParams.set(paramName, String(paramValue));\n continue;\n }\n }\n },\n\n // @todo resetPrams?\n\n /**\n * Получив URL и параметры вернет новый URL с примененными параметрами.\n * @param url URL.\n * @param params Параметры.\n * @return URL.\n */\n withParams(url: string | URL, params: URLSearchParamsInit): URL {\n const resultUrl = new URL(url);\n\n FetchUtil.setParams(resultUrl, params);\n\n return resultUrl;\n },\n\n /**\n * Получив URL вернет его копию но без параметров.\n * @param url URL.\n * @return URL.\n */\n withoutParams(url: string | URL): URL {\n const resultUrl = new URL(url);\n\n resultUrl.search = '';\n\n return resultUrl;\n },\n\n /**\n * Возвращает кортеж обработчиков для Promise из fetch.\n * Полученный Promise никогда не уйдет в состояние rejected.\n * @param options Опции.\n * @return Кортеж.\n */\n eitherResponse<T = unknown>({\n parseBody = response => response.json(),\n }: {\n /** Парсер body. */\n parseBody?: (response: Response) => Promise<T>;\n } = {}) {\n /** @inheritdoc */\n const parse = async (response: Response): Promise<T | null> => {\n try {\n return await parseBody(response);\n } catch {\n return null;\n }\n };\n\n return [\n // then\n async (response: Response): Promise<ResponseDone<T> | ResponseFail<T>> => {\n if (!response.ok) {\n return {\n ok: false,\n data: (await parse(response)) as T,\n error: new Error(`Request failed with status code ${response.status}`),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n return {\n ok: true,\n data: (await parse(response)) as T,\n error: null,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n },\n\n // catch\n async (error: unknown): Promise<ResponseFail<T>> => ({\n ok: false,\n error,\n }),\n ] as const;\n },\n} as const;\n\n/**\n * Проверяет, является ли переданное значение ошибкой.\n * @param value Значение.\n * @return Является ли значение ошибкой.\n */\nfunction isError(value: unknown): value is Error {\n return Object.prototype.toString.call(value) === '[object Error]';\n}\n\n// Основано на исходном коде пакета https://github.com/sindresorhus/is-network-error\nconst networkErrorMessages = new Set([\n 'network error', // Chrome\n 'Failed to fetch', // Chrome\n 'NetworkError when attempting to fetch resource.', // Firefox\n 'The Internet connection appears to be offline.', // Safari 16\n 'Load failed', // Safari 17+\n 'Network request failed', // `cross-fetch`\n 'fetch failed', // Undici (Node.js)\n 'terminated', // Undici (Node.js)\n\n // дальше идут наши наработки (основано на данных из Sentry)\n 'Network Error', // Safari 17.4\n]);\n\n/**\n * Проверяет, является ли переданное значение ошибкой сети.\n * Основано на исходном коде пакета https://github.com/sindresorhus/is-network-error.\n * Нет возможности использовать пакет is-network-error по причине того что он - ESM only.\n * @param value Проверяемое значение.\n * @return Является ли значение TypeError о том что произошла ошибка сети.\n */\nexport function isNetworkError(value: unknown): value is TypeError {\n const isValid = isError(value) && value.name === 'TypeError' && typeof value.message === 'string';\n\n if (!isValid) {\n return false;\n }\n\n const { message } = value;\n\n // ВАЖНО: в Safari 17+ ошибки имеют определенное сообщение и не имеют свойства stack\n if (message === 'Load failed' || (message.startsWith('Load failed (') && message.endsWith(')'))) {\n return true;\n }\n\n // Chrome\n if (\n message === 'Failed to fetch' ||\n (message.startsWith('Failed to fetch (') && message.endsWith(')'))\n ) {\n return true;\n }\n\n return networkErrorMessages.has(value.message);\n}\n\n/**\n * Проверяет является ли переданное значение ошибкой обрывания с помощью AbortController.\n * @param value Проверяемое значение.\n * @return Является ли значение ошибкой обрывания.\n */\nexport function isAbortError(value: unknown): value is { name: 'AbortError' } {\n return typeof value === 'object' && value !== null && (value as any).name === 'AbortError';\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/esm/package.json
CHANGED
|
@@ -3,36 +3,32 @@
|
|
|
3
3
|
"name": "@sima-land/isomorph",
|
|
4
4
|
"version": "0.0.0",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@humanwhocodes/env": "4.0.1",
|
|
6
|
+
"@humanwhocodes/env": "^4.0.1",
|
|
7
7
|
"@krutoo/fetch-tools": "^0.1.1",
|
|
8
8
|
"@opentelemetry/api": "^1.9.1",
|
|
9
|
-
"@opentelemetry/exporter-
|
|
10
|
-
"@opentelemetry/
|
|
11
|
-
"@opentelemetry/
|
|
12
|
-
"@opentelemetry/sdk-
|
|
13
|
-
"@opentelemetry/
|
|
14
|
-
"@
|
|
15
|
-
"@
|
|
16
|
-
"@sentry/browser": "^10.39.0",
|
|
17
|
-
"@sentry/node": "^10.39.0",
|
|
9
|
+
"@opentelemetry/exporter-trace-otlp-grpc": "^0.221.0",
|
|
10
|
+
"@opentelemetry/resources": "^2.10.0",
|
|
11
|
+
"@opentelemetry/sdk-trace-base": "^2.10.0",
|
|
12
|
+
"@opentelemetry/sdk-trace-node": "^2.10.0",
|
|
13
|
+
"@opentelemetry/semantic-conventions": "^1.43.0",
|
|
14
|
+
"@sentry/browser": "10.47.0",
|
|
15
|
+
"@sentry/node": "10.47.0",
|
|
18
16
|
"accepts": "^1.3.8",
|
|
19
|
-
"dotenv": "^17.
|
|
17
|
+
"dotenv": "^17.4.2",
|
|
20
18
|
"express": "^5.2.1",
|
|
21
|
-
"http-proxy-middleware": "^
|
|
19
|
+
"http-proxy-middleware": "^4.2.0",
|
|
22
20
|
"jsesc": "^3.1.0",
|
|
23
21
|
"middleware-axios": "^3.0.0",
|
|
24
22
|
"pino": "^10.3.1",
|
|
25
23
|
"pino-pretty": "^13.1.3",
|
|
26
24
|
"prom-client": "^15.1.3",
|
|
27
|
-
"
|
|
28
|
-
"webpack": "^5.105.2"
|
|
25
|
+
"webpack": "^5.108.4"
|
|
29
26
|
},
|
|
30
27
|
"peerDependencies": {
|
|
31
|
-
"@reduxjs/toolkit": "
|
|
32
|
-
"axios": "1.
|
|
33
|
-
"react": "^18.0",
|
|
34
|
-
"react-dom": "^18.0",
|
|
35
|
-
"
|
|
36
|
-
"redux-saga": "1.5.0"
|
|
28
|
+
"@reduxjs/toolkit": "^2.0.0",
|
|
29
|
+
"axios": "^1.18.1",
|
|
30
|
+
"react": "^18.0 || ^19.0",
|
|
31
|
+
"react-dom": "^18.0 || ^19.0",
|
|
32
|
+
"redux-saga": "^1.5.0"
|
|
37
33
|
}
|
|
38
34
|
}
|