@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
|
@@ -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":["KnownToken","provideAxiosFactory","provideFetch","provideBaseConfig","createPreset","healthCheck","provideConfigSource","provideExpressErrorMiddleware","provideExpressFactory","provideExpressLogMiddleware","provideExpressMetricsMiddleware","provideExpressRequestMiddleware","provideExpressTracingMiddleware","provideKnownHttpApiHosts","provideLogger","provideMetricsExpressApp","provideTracer","provideSpanExporter","provideSsrBridgeServerSide","provideTracingProvider","provideTracingResource","provideMainExpressApp","providePublicEnvs","PresetNode","customize","preset","set","Config","source","base","publicEnvs","logger","Tracing","tracer","spanExporter","provider","resource","Metrics","expressApp","Http","fetch","Fetch","middleware","Serve","Proxy","config","Axios","factory","Express","app","pageRoutes","serviceRoutes","resolve","Handlers","Middleware","request","log","metrics","tracing","endMiddleware","error","Api","knownHosts","SsrBridge","serverSide","override","bind","getClientIp","getForwardedHeaders","getPageResponseFormat","HandlerProvider"],"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":["KnownToken","provideAxiosFactory","provideFetch","provideBaseConfig","createPreset","healthCheck","provideConfigSource","provideExpressErrorMiddleware","provideExpressFactory","provideExpressLogMiddleware","provideExpressMetricsMiddleware","provideExpressRequestMiddleware","provideExpressTracingMiddleware","provideKnownHttpApiHosts","provideLogger","provideMetricsExpressApp","provideTracer","provideSpanExporter","provideSsrBridgeServerSide","provideTracingProvider","provideTracingResource","provideMainExpressApp","providePublicEnvs","PresetNode","customize","preset","set","Config","source","base","publicEnvs","logger","Tracing","tracer","spanExporter","provider","resource","Metrics","expressApp","Http","fetch","Fetch","middleware","Serve","Proxy","config","Axios","factory","Express","app","pageRoutes","serviceRoutes","resolve","Handlers","Middleware","request","log","metrics","tracing","endMiddleware","error","Api","knownHosts","SsrBridge","serverSide","override","bind","getClientIp","getForwardedHeaders","getPageResponseFormat","HandlerProvider"],"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":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SpanStatusCode } from '@opentelemetry/api';
|
|
2
|
-
import { ATTR_HTTP_REQUEST_METHOD, ATTR_URL_FULL } from '@opentelemetry/semantic-conventions/incubating';
|
|
2
|
+
import { ATTR_HTTP_REQUEST_METHOD, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_URL_FULL } from '@opentelemetry/semantic-conventions/incubating';
|
|
3
3
|
import { displayUrl } from "../../isomorphic/utils/display-url.js";
|
|
4
|
-
import { getSemanticHeaders } from "./telemetry.js";
|
|
4
|
+
import { getSemanticHeaders, getUrlQueryAttributes } from "./telemetry.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Возвращает новый middleware для трассировки исходящих запросов.
|
|
@@ -13,13 +13,15 @@ export function axiosTracingMiddleware(tracer, rootContext) {
|
|
|
13
13
|
return async function trace(config, next, defaults) {
|
|
14
14
|
const {
|
|
15
15
|
method,
|
|
16
|
-
urlStr
|
|
16
|
+
urlStr,
|
|
17
|
+
params
|
|
17
18
|
} = getRequestInfo(config, defaults);
|
|
18
19
|
const url = new URL(urlStr);
|
|
19
20
|
const span = tracer.startSpan(`axios ${method} ${url}`, undefined, rootContext);
|
|
20
21
|
span.setAttributes({
|
|
21
22
|
[ATTR_URL_FULL]: url.href,
|
|
22
23
|
[ATTR_HTTP_REQUEST_METHOD]: method,
|
|
24
|
+
...getUrlQueryAttributes(params),
|
|
23
25
|
...getSemanticHeaders({
|
|
24
26
|
// @todo непонятно как доставать заголовки из defaults потому что там на одном уровне заголовки и таблицы заголовков
|
|
25
27
|
...defaults.headers.common,
|
|
@@ -28,12 +30,18 @@ export function axiosTracingMiddleware(tracer, rootContext) {
|
|
|
28
30
|
})
|
|
29
31
|
});
|
|
30
32
|
try {
|
|
31
|
-
await next(config);
|
|
33
|
+
const response = await next(config);
|
|
34
|
+
span.setAttributes({
|
|
35
|
+
[ATTR_HTTP_RESPONSE_STATUS_CODE]: response.status
|
|
36
|
+
});
|
|
32
37
|
} catch (error) {
|
|
33
38
|
span.setStatus({
|
|
34
39
|
code: SpanStatusCode.ERROR,
|
|
35
40
|
message: 'HTTP Request failed'
|
|
36
41
|
});
|
|
42
|
+
span.setAttributes({
|
|
43
|
+
[ATTR_HTTP_RESPONSE_STATUS_CODE]: error.status
|
|
44
|
+
});
|
|
37
45
|
span.end();
|
|
38
46
|
|
|
39
47
|
// не прячем ошибку
|
|
@@ -52,9 +60,11 @@ export function axiosTracingMiddleware(tracer, rootContext) {
|
|
|
52
60
|
export function getRequestInfo(config, defaults) {
|
|
53
61
|
const method = (config.method || 'GET').toUpperCase();
|
|
54
62
|
const baseURL = config.baseURL || defaults.baseURL || '';
|
|
63
|
+
const params = config.params || new URLSearchParams();
|
|
55
64
|
return {
|
|
56
65
|
method,
|
|
57
|
-
urlStr: displayUrl(baseURL, config.url || defaults.url || '')
|
|
66
|
+
urlStr: displayUrl(baseURL, config.url || defaults.url || ''),
|
|
67
|
+
params
|
|
58
68
|
};
|
|
59
69
|
}
|
|
60
70
|
//# sourceMappingURL=axios-tracing-middleware.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axios-tracing-middleware.js","names":["SpanStatusCode","ATTR_HTTP_REQUEST_METHOD","ATTR_URL_FULL","displayUrl","getSemanticHeaders","axiosTracingMiddleware","tracer","rootContext","trace","config","next","defaults","method","urlStr","getRequestInfo","url","URL","span","startSpan","undefined","setAttributes","href","headers","common","toLowerCase","error","setStatus","code","ERROR","message","end","toUpperCase","baseURL"],"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,SAA0BA,cAAc,QAAQ,oBAAoB;AACpE,SACEC,wBAAwB,EACxBC,aAAa,QACR,gDAAgD;AACvD,SAASC,UAAU,QAAQ,uCAAoC;AAC/D,SAASC,kBAAkB,QAAQ,gBAAa;;
|
|
1
|
+
{"version":3,"file":"axios-tracing-middleware.js","names":["SpanStatusCode","ATTR_HTTP_REQUEST_METHOD","ATTR_HTTP_RESPONSE_STATUS_CODE","ATTR_URL_FULL","displayUrl","getSemanticHeaders","getUrlQueryAttributes","axiosTracingMiddleware","tracer","rootContext","trace","config","next","defaults","method","urlStr","params","getRequestInfo","url","URL","span","startSpan","undefined","setAttributes","href","headers","common","toLowerCase","response","status","error","setStatus","code","ERROR","message","end","toUpperCase","baseURL","URLSearchParams"],"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,SAA0BA,cAAc,QAAQ,oBAAoB;AACpE,SACEC,wBAAwB,EACxBC,8BAA8B,EAC9BC,aAAa,QACR,gDAAgD;AACvD,SAASC,UAAU,QAAQ,uCAAoC;AAC/D,SAASC,kBAAkB,EAAEC,qBAAqB,QAAQ,gBAAa;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,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,CAACpB,aAAa,GAAGe,GAAG,CAACM,IAAI;MACzB,CAACvB,wBAAwB,GAAGa,MAAM;MAClC,GAAGR,qBAAqB,CAACU,MAAM,CAAC;MAChC,GAAGX,kBAAkB,CAAC;QACpB;QACA,GAAGQ,QAAQ,CAACY,OAAO,CAACC,MAAM;QAC1B,GAAGb,QAAQ,CAACY,OAAO,CAACX,MAAM,CAACa,WAAW,CAAC,CAAC,CAA0B;QAClE,GAAGhB,MAAM,CAACc;MACZ,CAAC;IACH,CAAC,CAAC;IAEF,IAAI;MACF,MAAMG,QAAQ,GAAG,MAAMhB,IAAI,CAACD,MAAM,CAAC;MACnCS,IAAI,CAACG,aAAa,CAAC;QACjB,CAACrB,8BAA8B,GAAG0B,QAAQ,CAACC;MAC7C,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdV,IAAI,CAACW,SAAS,CAAC;QACbC,IAAI,EAAEhC,cAAc,CAACiC,KAAK;QAC1BC,OAAO,EAAE;MACX,CAAC,CAAC;MACFd,IAAI,CAACG,aAAa,CAAC;QACjB,CAACrB,8BAA8B,GAAI4B,KAAK,CAASD;MACnD,CAAC,CAAC;MAEFT,IAAI,CAACe,GAAG,CAAC,CAAC;;MAEV;MACA,MAAML,KAAK;IACb;IAEAV,IAAI,CAACe,GAAG,CAAC,CAAC;EACZ,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASlB,cAAcA,CAC5BN,MAA0B,EAC1BE,QAAmC,EAKnC;EACA,MAAMC,MAAM,GAAG,CAACH,MAAM,CAACG,MAAM,IAAI,KAAK,EAAEsB,WAAW,CAAC,CAAC;EACrD,MAAMC,OAAO,GAAG1B,MAAM,CAAC0B,OAAO,IAAIxB,QAAQ,CAACwB,OAAO,IAAI,EAAE;EACxD,MAAMrB,MAAuB,GAAGL,MAAM,CAACK,MAAM,IAAI,IAAIsB,eAAe,CAAC,CAAC;EAEtE,OAAO;IACLxB,MAAM;IACNC,MAAM,EAAEX,UAAU,CAACiC,OAAO,EAAE1B,MAAM,CAACO,GAAG,IAAIL,QAAQ,CAACK,GAAG,IAAI,EAAE,CAAC;IAC7DF;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ATTR_HTTP_REQUEST_HEADER } from '@opentelemetry/semantic-conventions';
|
|
1
|
+
import { ATTR_HTTP_REQUEST_HEADER, ATTR_URL_QUERY } from '@opentelemetry/semantic-conventions';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Формирует данные заголовков согласно семантике.
|
|
@@ -15,4 +15,22 @@ export function getSemanticHeaders(headers) {
|
|
|
15
15
|
}, {});
|
|
16
16
|
return Object.keys(result).length ? result : null;
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Формирует данные параметров запроса.
|
|
21
|
+
* @param params Объект URLSearchParams c параметрами запроса.
|
|
22
|
+
* @return Данные параметров запроса.
|
|
23
|
+
*/
|
|
24
|
+
export function getUrlQueryAttributes(params) {
|
|
25
|
+
const urlParams = {};
|
|
26
|
+
for (const [param, value] of params.entries()) {
|
|
27
|
+
const currentKey = `${ATTR_URL_QUERY}.${param}`;
|
|
28
|
+
if (urlParams[currentKey]) {
|
|
29
|
+
urlParams[currentKey] = `${urlParams[currentKey]},${value}`;
|
|
30
|
+
} else {
|
|
31
|
+
urlParams[currentKey] = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return urlParams;
|
|
35
|
+
}
|
|
18
36
|
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","names":["ATTR_HTTP_REQUEST_HEADER","getSemanticHeaders","headers","result","Object","entries","reduce","acc","key","value","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":"AAAA,SAASA,wBAAwB,QAAQ,qCAAqC;;
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["ATTR_HTTP_REQUEST_HEADER","ATTR_URL_QUERY","getSemanticHeaders","headers","result","Object","entries","reduce","acc","key","value","keys","length","getUrlQueryAttributes","params","urlParams","param","currentKey"],"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,SAASA,wBAAwB,EAAEC,cAAc,QAAQ,qCAAqC;;AAE9F;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,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,CAACR,wBAAwB,CAACS,GAAG,CAAC,CAAC,GAAGC,KAAK;IAC5C;IACA,OAAOF,GAAG;EACZ,CAAC,EAAE,CAAC,CAAC,CAAC;EAEN,OAAOH,MAAM,CAACM,IAAI,CAACP,MAAM,CAAC,CAACQ,MAAM,GAAGR,MAAM,GAAG,IAAI;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASS,qBAAqBA,CAACC,MAAuB,EAA0B;EACrF,MAAMC,SAAiC,GAAG,CAAC,CAAC;EAC5C,KAAK,MAAM,CAACC,KAAK,EAAEN,KAAK,CAAC,IAAII,MAAM,CAACR,OAAO,CAAC,CAAC,EAAE;IAC7C,MAAMW,UAAU,GAAG,GAAGhB,cAAc,IAAIe,KAAK,EAAE;IAC/C,IAAID,SAAS,CAACE,UAAU,CAAC,EAAE;MACzBF,SAAS,CAACE,UAAU,CAAC,GAAG,GAAGF,SAAS,CAACE,UAAU,CAAC,IAAIP,KAAK,EAAE;IAC7D,CAAC,MAAM;MACLK,SAAS,CAACE,UAAU,CAAC,GAAGP,KAAK;IAC/B;EACF;EACA,OAAOK,SAAS;AAClB","ignoreList":[]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { KnownToken } from "../../../tokens.js";
|
|
3
2
|
import { HelmetContext } from "../../server/utils/regular-helmet.js";
|
|
4
3
|
import { formatHandlerError } from "../../server/utils/format-handler-error.js";
|
|
@@ -8,6 +7,7 @@ import { formatHandlerError } from "../../server/utils/format-handler-error.js";
|
|
|
8
7
|
* @param resolve Функция для получения зависимости по токену.
|
|
9
8
|
* @return Главная функция.
|
|
10
9
|
*/
|
|
10
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
11
|
export function provideHandlerMain(resolve) {
|
|
12
12
|
const config = resolve(KnownToken.Config.base);
|
|
13
13
|
const logger = resolve(KnownToken.logger);
|
|
@@ -21,12 +21,15 @@ export function provideHandlerMain(resolve) {
|
|
|
21
21
|
return async () => {
|
|
22
22
|
try {
|
|
23
23
|
const assets = await getAssets();
|
|
24
|
-
const jsx = /*#__PURE__*/
|
|
24
|
+
const jsx = /*#__PURE__*/_jsx(HelmetContext.Provider, {
|
|
25
25
|
value: {
|
|
26
26
|
title: config.appName,
|
|
27
27
|
assets
|
|
28
|
-
}
|
|
29
|
-
|
|
28
|
+
},
|
|
29
|
+
children: /*#__PURE__*/_jsx(Helmet, {
|
|
30
|
+
children: await render()
|
|
31
|
+
})
|
|
32
|
+
});
|
|
30
33
|
const {
|
|
31
34
|
body,
|
|
32
35
|
headers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler-main.js","names":["KnownToken","HelmetContext","formatHandlerError","provideHandlerMain","resolve","config","Config","base","logger","context","ExpressHandler","render","Http","Handler","Page","assetsInit","assets","Helmet","helmet","abortController","Fetch","formatResponse","getAssets","
|
|
1
|
+
{"version":3,"file":"handler-main.js","names":["KnownToken","HelmetContext","formatHandlerError","jsx","_jsx","provideHandlerMain","resolve","config","Config","base","logger","context","ExpressHandler","render","Http","Handler","Page","assetsInit","assets","Helmet","helmet","abortController","Fetch","formatResponse","getAssets","Provider","value","title","appName","children","body","headers","forEach","hValue","hName","res","setHeader","send","error","response","log","status","redirectLocation","redirect","level","abort"],"sources":["../../../../../src/preset/node-handler/providers/handler-main.tsx"],"sourcesContent":["import type { Resolve } from '../../../di';\nimport type express from 'express';\nimport { KnownToken } from '../../../tokens';\nimport { HelmetContext } from '../../server/utils/regular-helmet';\nimport { formatHandlerError } from '../../server/utils/format-handler-error';\n\n/**\n * Провайдер главной функции обработчика входящего http-запроса.\n * @param resolve Функция для получения зависимости по токену.\n * @return Главная функция.\n */\nexport function provideHandlerMain(resolve: Resolve): express.Handler {\n const config = resolve(KnownToken.Config.base);\n const logger = resolve(KnownToken.logger);\n const context = resolve(KnownToken.ExpressHandler.context);\n const render = resolve(KnownToken.Http.Handler.Page.render);\n const assetsInit = resolve(KnownToken.Http.Handler.Page.assets);\n const Helmet = resolve(KnownToken.Http.Handler.Page.helmet);\n const abortController = resolve(KnownToken.Http.Fetch.abortController);\n const formatResponse = resolve(KnownToken.Http.Handler.Page.formatResponse);\n\n const getAssets = typeof assetsInit === 'function' ? assetsInit : () => assetsInit;\n\n return async () => {\n try {\n const assets = await getAssets();\n\n const jsx = (\n <HelmetContext.Provider value={{ title: config.appName, assets }}>\n <Helmet>{await render()}</Helmet>\n </HelmetContext.Provider>\n );\n\n const { body, headers } = await formatResponse(jsx, assets);\n\n headers.forEach((hValue, hName) => context.res.setHeader(hName, hValue));\n context.res.send(body);\n } catch (error) {\n const { response, log } = formatHandlerError(error);\n\n if (response.status > 299 && response.status < 400 && response.redirectLocation) {\n context.res.redirect(response.status, response.redirectLocation);\n } else {\n context.res.status(response.status).send(response.body);\n }\n\n if (log.level && logger[log.level]) {\n logger[log.level](error);\n }\n }\n\n // ВАЖНО: прерываем исходящие в рамках обработчика http-запросы\n abortController.abort();\n };\n}\n\n// @todo а что если привести все зависимости к виду:\n// const getAppConfig = resolve.lazy(KnownToken.Config.base);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* Провайдер render-функции.
|
|
4
4
|
* @return Render-Функция.
|
|
5
5
|
*/
|
|
6
6
|
export function providePageRender() {
|
|
7
|
-
return () => /*#__PURE__*/
|
|
7
|
+
return () => /*#__PURE__*/_jsxs(_Fragment, {
|
|
8
|
+
children: [/*#__PURE__*/_jsx("h1", {
|
|
9
|
+
children: "Hello, world!"
|
|
10
|
+
}), /*#__PURE__*/_jsx("p", {
|
|
11
|
+
children: "This is a stub page. Define the render component in your handler app"
|
|
12
|
+
})]
|
|
13
|
+
});
|
|
8
14
|
}
|
|
9
15
|
//# sourceMappingURL=page-render.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-render.js","names":["providePageRender","
|
|
1
|
+
{"version":3,"file":"page-render.js","names":["providePageRender","_jsxs","_Fragment","children","_jsx"],"sources":["../../../../../src/preset/server/providers/page-render.tsx"],"sourcesContent":["/**\n * Провайдер render-функции.\n * @return Render-Функция.\n */\nexport function providePageRender() {\n return () => (\n <>\n <h1>Hello, world!</h1>\n <p>This is a stub page. Define the render component in your handler app</p>\n </>\n );\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAAA,EAAG;EAClC,OAAO,mBACLC,KAAA,CAAAC,SAAA;IAAAC,QAAA,gBACEC,IAAA;MAAAD,QAAA,EAAI;IAAa,CAAI,CAAC,eACtBC,IAAA;MAAAD,QAAA,EAAG;IAAoE,CAAG,CAAC;EAAA,CAC3E,CACH;AACH","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":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { createContext, useContext } from 'react';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
export const HelmetContext = /*#__PURE__*/createContext({});
|
|
4
4
|
const resetCSS = `
|
|
5
5
|
* {
|
|
@@ -23,31 +23,39 @@ export function RegularHelmet({
|
|
|
23
23
|
title,
|
|
24
24
|
assets
|
|
25
25
|
} = useContext(HelmetContext);
|
|
26
|
-
return /*#__PURE__*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
26
|
+
return /*#__PURE__*/_jsxs("html", {
|
|
27
|
+
children: [/*#__PURE__*/_jsxs("head", {
|
|
28
|
+
children: [/*#__PURE__*/_jsx("meta", {
|
|
29
|
+
charSet: "UTF-8"
|
|
30
|
+
}), /*#__PURE__*/_jsx("meta", {
|
|
31
|
+
httpEquiv: "X-UA-Compatible",
|
|
32
|
+
content: "IE=edge"
|
|
33
|
+
}), /*#__PURE__*/_jsx("meta", {
|
|
34
|
+
name: "viewport",
|
|
35
|
+
content: "width=device-width, initial-scale=1"
|
|
36
|
+
}), /*#__PURE__*/_jsx("title", {
|
|
37
|
+
children: title ?? 'Document'
|
|
38
|
+
}), /*#__PURE__*/_jsx("link", {
|
|
39
|
+
href: "https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700;1,900&display=swap",
|
|
40
|
+
rel: "stylesheet"
|
|
41
|
+
}), /*#__PURE__*/_jsx("style", {
|
|
42
|
+
dangerouslySetInnerHTML: {
|
|
43
|
+
__html: resetCSS
|
|
44
|
+
}
|
|
45
|
+
}), assets?.criticalCss && /*#__PURE__*/_jsx("link", {
|
|
46
|
+
rel: "stylesheet",
|
|
47
|
+
href: assets.criticalCss
|
|
48
|
+
}), assets?.css && /*#__PURE__*/_jsx("link", {
|
|
49
|
+
rel: "stylesheet",
|
|
50
|
+
href: assets.css
|
|
51
|
+
}), assets?.criticalJs && /*#__PURE__*/_jsx("script", {
|
|
52
|
+
src: assets.criticalJs
|
|
53
|
+
})]
|
|
54
|
+
}), /*#__PURE__*/_jsxs("body", {
|
|
55
|
+
children: [children, assets?.js && /*#__PURE__*/_jsx("script", {
|
|
56
|
+
src: assets.js
|
|
57
|
+
})]
|
|
58
|
+
})]
|
|
59
|
+
});
|
|
52
60
|
}
|
|
53
61
|
//# sourceMappingURL=regular-helmet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regular-helmet.js","names":["createContext","useContext","HelmetContext","resetCSS","RegularHelmet","children","title","assets","
|
|
1
|
+
{"version":3,"file":"regular-helmet.js","names":["createContext","useContext","jsx","_jsx","jsxs","_jsxs","HelmetContext","resetCSS","RegularHelmet","children","title","assets","charSet","httpEquiv","content","name","href","rel","dangerouslySetInnerHTML","__html","criticalCss","css","criticalJs","src","js"],"sources":["../../../../../src/preset/server/utils/regular-helmet.tsx"],"sourcesContent":["import { ReactNode, createContext, useContext } from 'react';\nimport { PageAssets } from '../../isomorphic/types';\n\nexport const HelmetContext = createContext<{ title?: string; assets?: PageAssets }>({});\n\nconst resetCSS = `\n* {\n box-sizing: border-box;\n}\nbody {\n font-family: -apple-system,BlinkMacSystemFont,'Source Sans Pro',\"Segoe UI\",Roboto,\"Helvetica Neue\",Ubuntu,Arial,sans-serif;\n margin: 0;\n}\n`;\n\n/**\n * Простой Helmet-компонент. Выведет html, head и body.\n * @param props Свойства.\n * @return Элемент.\n */\nexport function RegularHelmet({ children }: { children?: ReactNode }) {\n const { title, assets } = useContext(HelmetContext);\n\n return (\n <html>\n <head>\n <meta charSet='UTF-8' />\n <meta httpEquiv='X-UA-Compatible' content='IE=edge' />\n <meta name='viewport' content='width=device-width, initial-scale=1' />\n <title>{title ?? 'Document'}</title>\n <link\n href='https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700;1,900&display=swap'\n rel='stylesheet'\n />\n <style dangerouslySetInnerHTML={{ __html: resetCSS }} />\n\n {assets?.criticalCss && <link rel='stylesheet' href={assets.criticalCss} />}\n {assets?.css && <link rel='stylesheet' href={assets.css} />}\n {assets?.criticalJs && <script src={assets.criticalJs} />}\n </head>\n <body>\n {children}\n {assets?.js && <script src={assets.js} />}\n </body>\n </html>\n );\n}\n"],"mappings":"AAAA,SAAoBA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAG7D,OAAO,MAAMC,aAAa,gBAAGN,aAAa,CAA0C,CAAC,CAAC,CAAC;AAEvF,MAAMO,QAAQ,GAAG;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAC;EAAEC;AAAmC,CAAC,EAAE;EACpE,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGV,UAAU,CAACK,aAAa,CAAC;EAEnD,oBACED,KAAA;IAAAI,QAAA,gBACEJ,KAAA;MAAAI,QAAA,gBACEN,IAAA;QAAMS,OAAO,EAAC;MAAO,CAAE,CAAC,eACxBT,IAAA;QAAMU,SAAS,EAAC,iBAAiB;QAACC,OAAO,EAAC;MAAS,CAAE,CAAC,eACtDX,IAAA;QAAMY,IAAI,EAAC,UAAU;QAACD,OAAO,EAAC;MAAqC,CAAE,CAAC,eACtEX,IAAA;QAAAM,QAAA,EAAQC,KAAK,IAAI;MAAU,CAAQ,CAAC,eACpCP,IAAA;QACEa,IAAI,EAAC,yJAA6J;QAClKC,GAAG,EAAC;MAAY,CACjB,CAAC,eACFd,IAAA;QAAOe,uBAAuB,EAAE;UAAEC,MAAM,EAAEZ;QAAS;MAAE,CAAE,CAAC,EAEvDI,MAAM,EAAES,WAAW,iBAAIjB,IAAA;QAAMc,GAAG,EAAC,YAAY;QAACD,IAAI,EAAEL,MAAM,CAACS;MAAY,CAAE,CAAC,EAC1ET,MAAM,EAAEU,GAAG,iBAAIlB,IAAA;QAAMc,GAAG,EAAC,YAAY;QAACD,IAAI,EAAEL,MAAM,CAACU;MAAI,CAAE,CAAC,EAC1DV,MAAM,EAAEW,UAAU,iBAAInB,IAAA;QAAQoB,GAAG,EAAEZ,MAAM,CAACW;MAAW,CAAE,CAAC;IAAA,CACrD,CAAC,eACPjB,KAAA;MAAAI,QAAA,GACGA,QAAQ,EACRE,MAAM,EAAEa,EAAE,iBAAIrB,IAAA;QAAQoB,GAAG,EAAEZ,MAAM,CAACa;MAAG,CAAE,CAAC;IAAA,CACrC,CAAC;EAAA,CACH,CAAC;AAEX","ignoreList":[]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Component, Suspense } from 'react';
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* Опции компонентов ErrorBoundary и SafeSuspense.
|
|
6
5
|
*/
|
|
7
|
-
|
|
6
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
8
7
|
/**
|
|
9
8
|
* Компонент-предохранитель. Обработчик ошибок в React-компонентах.
|
|
10
9
|
*/
|
|
@@ -44,7 +43,9 @@ export class ErrorBoundary extends Component {
|
|
|
44
43
|
children,
|
|
45
44
|
fallback
|
|
46
45
|
} = this.props;
|
|
47
|
-
return /*#__PURE__*/
|
|
46
|
+
return /*#__PURE__*/_jsx(_Fragment, {
|
|
47
|
+
children: this.state.hasError ? fallback : children
|
|
48
|
+
});
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
|
|
@@ -59,11 +60,13 @@ export function SafeSuspense({
|
|
|
59
60
|
fallback,
|
|
60
61
|
onError
|
|
61
62
|
}) {
|
|
62
|
-
return /*#__PURE__*/
|
|
63
|
-
fallback: fallback
|
|
64
|
-
}, /*#__PURE__*/React.createElement(ErrorBoundary, {
|
|
63
|
+
return /*#__PURE__*/_jsx(Suspense, {
|
|
65
64
|
fallback: fallback,
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
children: /*#__PURE__*/_jsx(ErrorBoundary, {
|
|
66
|
+
fallback: fallback,
|
|
67
|
+
onError: onError,
|
|
68
|
+
children: children
|
|
69
|
+
})
|
|
70
|
+
});
|
|
68
71
|
}
|
|
69
72
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Component","Suspense","ErrorBoundary","constructor","props","state","hasError","getDerivedStateFromError","componentDidCatch","error","errorInfo","onError","render","children","fallback","
|
|
1
|
+
{"version":3,"file":"index.js","names":["Component","Suspense","Fragment","_Fragment","jsx","_jsx","ErrorBoundary","constructor","props","state","hasError","getDerivedStateFromError","componentDidCatch","error","errorInfo","onError","render","children","fallback","SafeSuspense"],"sources":["../../../../../src/utils/react/error-handlers/index.tsx"],"sourcesContent":["import { Component, ErrorInfo, ReactNode, Suspense } from 'react';\n\n/**\n * Опции компонентов ErrorBoundary и SafeSuspense.\n */\nexport interface Props {\n /** Дочерний элемент. */\n children: NonNullable<ReactNode> | null;\n\n /** Содержимое, которое будет выведено если возникла ошибка. */\n fallback: NonNullable<ReactNode> | null;\n\n /** Функция для логирования ошибок. */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\n/**\n * Компонент-предохранитель. Обработчик ошибок в React-компонентах.\n */\nexport class ErrorBoundary extends Component<Props, { hasError: boolean }> {\n /**\n * @param props Свойства.\n */\n constructor(props: Props) {\n super(props);\n\n this.state = { hasError: false };\n }\n\n /** @inheritDoc */\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n /** @inheritDoc */\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // @todo добавить возможность брать onError из специального контекста (это упростит передачу из di-контейнера)\n const { onError } = this.props;\n\n onError?.(error, errorInfo);\n }\n\n /**\n * Рендер.\n * @return Дочерний элемент либо запасное значение.\n */\n render() {\n const { children, fallback } = this.props;\n\n return <>{this.state.hasError ? fallback : children}</>;\n }\n}\n\n/**\n * Обертка над Suspense c перехватом ошибок.\n * @todo Возможно этот компонент не нужен...\n * @param props Свойства.\n * @return Элемент.\n */\nexport function SafeSuspense({ children, fallback, onError }: Props) {\n return (\n <Suspense fallback={fallback}>\n <ErrorBoundary fallback={fallback} onError={onError}>\n {children}\n </ErrorBoundary>\n </Suspense>\n );\n}\n"],"mappings":"AAAA,SAASA,SAAS,EAAwBC,QAAQ,QAAQ,OAAO;;AAEjE;AACA;AACA;AAFA,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAcA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,SAASN,SAAS,CAA+B;EACzE;AACF;AACA;EACEO,WAAWA,CAACC,KAAY,EAAE;IACxB,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,KAAK,GAAG;MAAEC,QAAQ,EAAE;IAAM,CAAC;EAClC;;EAEA;EACA,OAAOC,wBAAwBA,CAAA,EAAG;IAChC,OAAO;MAAED,QAAQ,EAAE;IAAK,CAAC;EAC3B;;EAEA;EACAE,iBAAiBA,CAACC,KAAY,EAAEC,SAAoB,EAAE;IACpD;IACA,MAAM;MAAEC;IAAQ,CAAC,GAAG,IAAI,CAACP,KAAK;IAE9BO,OAAO,GAAGF,KAAK,EAAEC,SAAS,CAAC;EAC7B;;EAEA;AACF;AACA;AACA;EACEE,MAAMA,CAAA,EAAG;IACP,MAAM;MAAEC,QAAQ;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACV,KAAK;IAEzC,oBAAOH,IAAA,CAAAF,SAAA;MAAAc,QAAA,EAAG,IAAI,CAACR,KAAK,CAACC,QAAQ,GAAGQ,QAAQ,GAAGD;IAAQ,CAAG,CAAC;EACzD;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,YAAYA,CAAC;EAAEF,QAAQ;EAAEC,QAAQ;EAAEH;AAAe,CAAC,EAAE;EACnE,oBACEV,IAAA,CAACJ,QAAQ;IAACiB,QAAQ,EAAEA,QAAS;IAAAD,QAAA,eAC3BZ,IAAA,CAACC,aAAa;MAACY,QAAQ,EAAEA,QAAS;MAACH,OAAO,EAAEA,OAAQ;MAAAE,QAAA,EACjDA;IAAQ,CACI;EAAC,CACR,CAAC;AAEf","ignoreList":[]}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
/* eslint-disable jsdoc/require-jsdoc */
|
|
2
|
-
|
|
3
|
-
// @todo "* as" сделано для работы в Node.js ESM но есть подозрение что на tree shaking плохо скажется
|
|
4
|
-
import * as redux from '@reduxjs/toolkit';
|
|
5
|
-
const {
|
|
6
|
-
createAction,
|
|
7
|
-
createSelector
|
|
8
|
-
} = redux;
|
|
2
|
+
import { createAction, createSelector } from '@reduxjs/toolkit';
|
|
9
3
|
|
|
10
4
|
/**
|
|
11
5
|
* Статус загрузки данных.
|
|
@@ -99,10 +93,10 @@ export class RemoteData {
|
|
|
99
93
|
*/
|
|
100
94
|
static createSelectors(selectRoot) {
|
|
101
95
|
return {
|
|
102
|
-
isInitial: createSelector(selectRoot, state => state.status ===
|
|
103
|
-
isFetching: createSelector(selectRoot, state => state.status ===
|
|
104
|
-
isSuccess: createSelector(selectRoot, state => state.status ===
|
|
105
|
-
isFailed: createSelector(selectRoot, state => state.status ===
|
|
96
|
+
isInitial: createSelector(selectRoot, state => state.status === STATUS.initial),
|
|
97
|
+
isFetching: createSelector(selectRoot, state => state.status === STATUS.fetching),
|
|
98
|
+
isSuccess: createSelector(selectRoot, state => state.status === STATUS.success),
|
|
99
|
+
isFailed: createSelector(selectRoot, state => state.status === STATUS.failure),
|
|
106
100
|
wasFetched: createSelector(selectRoot, state => (state.fetchCount ?? 0) > 0)
|
|
107
101
|
};
|
|
108
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-data.js","names":["
|
|
1
|
+
{"version":3,"file":"remote-data.js","names":["createAction","createSelector","STATUS","initial","fetching","success","failure","RemoteData","createActions","name","request","createHandlers","state","_action","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 */\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":"AAAA;AACA,SACEA,YAAY,EACZC,cAAc,QAKT,kBAAkB;;AAQzB;AACA;AACA;;AAGA;AACA;AACA;;AAeA;AACA;AACA;AACA,OAAO,MAAMC,MAAM,GAAG;EACpBC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAA2C;;AAE3C;AACA,OAAO,MAAeC,UAAU,CAAC;EAC/B,WAAWL,MAAMA,CAAA,EAAG;IAClB,OAAOA,MAAM;EACf;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOM,aAAaA,CAClBC,IAAY,EACgC;IAC5C,OAAO;MACLC,OAAO,EAAEV,YAAY,CAAW,GAAGS,IAAI,UAAU,CAAC;MAClDJ,OAAO,EAAEL,YAAY,CAAQ,GAAGS,IAAI,UAAU,CAAC;MAC/CH,OAAO,EAAEN,YAAY,CAAS,GAAGS,IAAI,UAAU;IACjD,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACE,OAAOE,cAAcA,CAAA,EAKjB;IACF;IACA,OAAO;MACLD,OAAOA,CACLE,KAAmB;MACnB;MACAC,OAAgC,EAClB;QACd,OAAO;UACL,GAAGD,KAAK;UACRE,MAAM,EAAEZ,MAAM,CAACE;QACjB,CAAC;MACH,CAAC;MAEDC,OAAOA,CAACO,KAAmB,EAAEG,MAA4B,EAAgB;QACvE,OAAO;UACL,GAAGH,KAAK;UACRI,IAAI,EAAED,MAAM,CAACE,OAAO;UACpBH,MAAM,EAAEZ,MAAM,CAACG,OAAO;UACtBa,UAAU,EAAE,CAACN,KAAK,CAACM,UAAU,IAAI,CAAC,IAAI;QACxC,CAAC;MACH,CAAC;MAEDZ,OAAOA,CAACM,KAAmB,EAAEG,MAA6B,EAAgB;QACxE,OAAO;UACL,GAAGH,KAAK;UACRO,KAAK,EAAEJ,MAAM,CAACE,OAAO;UACrBH,MAAM,EAAEZ,MAAM,CAACI,OAAO;UACtBY,UAAU,EAAE,CAACN,KAAK,CAACM,UAAU,IAAI,CAAC,IAAI;QACxC,CAAC;MACH;IACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOE,aAAaA,CAClBC,OAAmD,EACnDC,OAAoD,EAC9C;IACN,MAAMC,QAAQ,GAAGhB,UAAU,CAACI,cAAc,CAA6B,CAAC;;IAExE;IACAW,OAAO,CAACE,OAAO,CAACH,OAAO,CAACX,OAAO,CAACe,IAAI,EAAEF,QAAQ,CAACb,OAAO,CAAC;IACvDY,OAAO,CAACE,OAAO,CAACH,OAAO,CAAChB,OAAO,CAACoB,IAAI,EAAEF,QAAQ,CAAClB,OAAO,CAAC;IACvDiB,OAAO,CAACE,OAAO,CAACH,OAAO,CAACf,OAAO,CAACmB,IAAI,EAAEF,QAAQ,CAACjB,OAAO,CAAC;EACzD;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOoB,eAAeA,CACpBC,UAA0B,EAC1B;IACA,OAAO;MACLC,SAAS,EAAE3B,cAAc,CAAC0B,UAAU,EAAEf,KAAK,IAAIA,KAAK,CAACE,MAAM,KAAKZ,MAAM,CAACC,OAAO,CAAC;MAC/E0B,UAAU,EAAE5B,cAAc,CAAC0B,UAAU,EAAEf,KAAK,IAAIA,KAAK,CAACE,MAAM,KAAKZ,MAAM,CAACE,QAAQ,CAAC;MACjF0B,SAAS,EAAE7B,cAAc,CAAC0B,UAAU,EAAEf,KAAK,IAAIA,KAAK,CAACE,MAAM,KAAKZ,MAAM,CAACG,OAAO,CAAC;MAC/E0B,QAAQ,EAAE9B,cAAc,CAAC0B,UAAU,EAAEf,KAAK,IAAIA,KAAK,CAACE,MAAM,KAAKZ,MAAM,CAACI,OAAO,CAAC;MAC9E0B,UAAU,EAAE/B,cAAc,CAAC0B,UAAU,EAAEf,KAAK,IAAI,CAACA,KAAK,CAACM,UAAU,IAAI,CAAC,IAAI,CAAC;IAC7E,CAAC;EACH;AACF","ignoreList":[]}
|
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { shallowEqual } from 'react-redux';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Опции для включения внутреннего кэша,
|
|
6
|
-
* чтобы селектор с параметрами запоминал вычисления при смене значения параметра.
|
|
7
|
-
*/
|
|
8
|
-
const MEMOIZE_OPTIONS = {
|
|
9
|
-
equalityCheck: shallowEqual,
|
|
10
|
-
resultEqualityCheck: shallowEqual,
|
|
11
|
-
maxSize: 10
|
|
12
|
-
};
|
|
13
|
-
const createCashedSelector = createSelectorCreator(defaultMemoize, MEMOIZE_OPTIONS);
|
|
14
|
-
|
|
1
|
+
import { createSelector } from '@reduxjs/toolkit';
|
|
15
2
|
/**
|
|
16
3
|
* Возвращает каррированную версию селектора.
|
|
17
4
|
* По мотивам https://reselect.js.org/FAQ#how-can-i-make-a-curried-selector.
|
|
@@ -31,5 +18,5 @@ const currySelector = selector => {
|
|
|
31
18
|
* По мотивам https://reselect.js.org/FAQ#how-can-i-make-a-curried-selector.
|
|
32
19
|
* @inheritdoc
|
|
33
20
|
*/
|
|
34
|
-
export const createCurriedSelector = (...args) => currySelector(
|
|
21
|
+
export const createCurriedSelector = (...args) => currySelector(createSelector(...args));
|
|
35
22
|
//# 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":["createSelector","currySelector","selector","curriedSelector","args","state","Object","assign","uncurried","createCurriedSelector"],"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,SAASA,cAAc,QAAkB,kBAAkB;AAM3D;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;AACA,OAAO,MAAMO,qBAAqB,GAAGA,CACnC,GAAGL,IAA+D,KAElEH,aAAa,CAACD,cAAc,CAAC,GAAGI,IAAI,CAAC,CAAC","ignoreList":[]}
|