Skip to content

Commit

Permalink
Merge pull request #43 from sima-land/38-bun-deno-support
Browse files Browse the repository at this point in the history
Шаг 5 #38
  • Loading branch information
krutoo committed Mar 22, 2023
2 parents 174a551 + fa21337 commit ffa3a37
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 108 deletions.
23 changes: 7 additions & 16 deletions docs/docs/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ sidebar_position: 1

# Конфигурация приложения

Isomorph предоставляет абстракцию "источник конфигурации" поверх переменных окружения в виде интерфейса **ConfigSource** и его реализаций для браузера и Node.js.
Пакет предоставляет абстракцию "источник конфигурации" поверх переменных окружения в виде интерфейса **ConfigSource** и его реализаций для браузера и Node.js.

Эта абстракция может использоваться и с другими источниками данных, например с текстовыми файлами, аргументами командной строки и тд.

Expand All @@ -21,31 +21,22 @@ Isomorph предоставляет абстракцию "источник ко
Для этого используем утилиту из пакета.

```ts
import { createConfigSource } from '@sima-land/isomorph/config/node';
import { createConfigSource } from '@sima-land/isomorph/config';

const source = createConfigSource();
// формируем источник конфигурации
const source = createConfigSource({ environment: process.env });

// определяем порт на основе переменной из конфигурации
const port = source.require('MAIN_HTTP_PORT');
```

Метод `require` выбросит исключение если переменная не задана в среде или .env-файле. Для необязательных переменных можно использовать метод `get`.

Подробнее в документации библиотеки [@humanwhocodes/env](https://github.com/humanwhocodes/env).

Реализация для браузера работает аналогично.

```ts
import { createConfigSource } from '@sima-land/isomorph/config/browser';

const source = createConfigSource();

if (source.get('SOME_FEATURE_STATUS') === 'enabled') {
// do something
}
```

### Особенности реализации

Реализации для сервера и браузера будут пытаться взять все переменные из двух источников: объекта `process.env` (если он существует) и объекта `__ISOMORPH_ENV__` (если он существует). Для браузера эти переменные могут быть предоставлены на этапе сборки.
Реализации в пресетах `PresetBrowser` и `PresetNode` будут пытаться взять все переменные из двух источников: объекта `process.env` (если он существует) и объекта `__ISOMORPH_ENV__` (если он существует). Для браузера эти переменные могут быть предоставлены на этапе сборки.

:::info Важно

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/http-client.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ sidebar_position: 3

В качестве реализации HTTP-клиентов используется `axios` с дополнением в виде пакета `middleware-axios`, позволяющего добавлять промежуточные слои процесса исходящих HTTP-запросов.

## Прозрачные cookies
## "Прозрачные" cookie

На сервере бывает необходимо выполнить HTTP-запрос к публичным API от имени пользователя.

Expand Down
16 changes: 10 additions & 6 deletions docs/docs/metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,20 @@ sidebar_position: 6

Пакет **isomorph** предоставляет реализации базового http-сервера для вывода собранных данных о работе сервиса, а также express-middleware для сбора базовых метрик express-приложения.

## createMetricsHttpApp
## Токен `KnownToken.Metrics.httpApp`

**createMetricsHttpApp** вернет готовое express-приложение для сбора метрик.
Компонент по токену `KnownToken.Metrics.httpApp` вернет готовое express-приложение для сбора метрик.

```ts
import { createMetricsHttpApp } from '@sima-land/isomorph/metrics/node';
import { Resolve } from '@sima-land/isomorph/di';

const metricsApp = createMetricsHttpApp();
declare const resolve: Resolve;

metricsApp.listen(8080);
const metricsHttpApp = resolve(KnownToken.Metrics.httpApp);

metricsHttpApp.listen(8080, () => {
console.log('Server started');
});
```

## Middleware для express-приложений
Expand All @@ -28,7 +32,7 @@ metricsApp.listen(8080);
import {
responseMetricsMiddleware,
renderMetricsMiddleware,
} from '@sima-land/isomorph/http-server/middleware/metrics';
} from '@sima-land/isomorph/http-server/middleware/metrics/node';
import express from 'express';
import * as PromClient from 'prom-client';

Expand Down
2 changes: 1 addition & 1 deletion src/di/__test__/preset.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ describe('Preset', () => {
} as const;

preset.set(TOKEN.hello, () => 'hello');
preset.override(TOKEN.world, () => 'world');
preset.set(TOKEN.world, () => 'world');

const app = createApplication();
app.preset(preset);
Expand Down
5 changes: 0 additions & 5 deletions src/di/preset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,6 @@ class PresetImplementation implements Preset {
this.registry = new Map<Token<any>, Provider<any>>(defaults);
}

override<T>(token: Token<T>, provider: Provider<T>): this {
this.registry.set(token, provider);
return this;
}

set<T>(token: Token<T>, provider: Provider<T>): this {
this.registry.set(token, provider);
return this;
Expand Down
3 changes: 0 additions & 3 deletions src/di/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,6 @@ export interface Application {
* Пресет - набор провайдеров (с возможностью их добавлять/переопределять) который можно применить к DI-приложению.
*/
export interface Preset {
/** @deprecated */
override: <T>(token: Token<T>, provider: Provider<T>) => this;

/** Добавляет провайдер в пресет. */
set: <T>(token: Token<T>, provider: Provider<T>) => this;

Expand Down
50 changes: 1 addition & 49 deletions src/utils/redux/__test__/remote-data.test.ts
Original file line number Diff line number Diff line change
@@ -1,53 +1,5 @@
import { createReducer, createSlice } from '@reduxjs/toolkit';
import { STATUS, RemoteData, RemoteDataState, createRemoteDataReducers } from '..';

interface TestState extends RemoteDataState<number, string> {
foo: 'bar';
}

describe('createGenericSlice', () => {
const initialState: TestState = {
data: 0,
error: '',
status: STATUS.initial,
foo: 'bar',
};

const { reducer, actions } = createSlice({
name: 'user',
initialState,
reducers: createRemoteDataReducers<TestState>(),
});

it('should handle request action', () => {
const actual = reducer(initialState, actions.request());

expect(actual).toEqual({
...initialState,
status: STATUS.fetching,
});
});

it('should handle success action', () => {
const actual = reducer(initialState, actions.success(234));

expect(actual).toEqual({
...initialState,
data: 234,
status: STATUS.success,
});
});

it('should handle failure action', () => {
const actual = reducer(initialState, actions.failure('error message here'));

expect(actual).toEqual({
...initialState,
error: 'error message here',
status: STATUS.failure,
});
});
});
import { STATUS, RemoteData, RemoteDataState } from '..';

type TestSliceState = RemoteDataState<number, string | null>;

Expand Down
10 changes: 2 additions & 8 deletions src/utils/redux/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import {
Status,
RemoteDataState,
STATUS,
RemoteData,
createRemoteDataReducers,
} from './remote-data';
import { Status, RemoteDataState, STATUS, RemoteData } from './remote-data';

export type { Status, RemoteDataState };
export { STATUS, RemoteData, createRemoteDataReducers };
export { STATUS, RemoteData };
19 changes: 0 additions & 19 deletions src/utils/redux/remote-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,22 +139,3 @@ export abstract class RemoteData {
} as const;
}
}

/**
* Возвращает набор обработчиков для работы с удаленными данными.
* @deprecated Теперь нужно использовать RemoteData.createHandlers.
* @return Набор.
*/
export const createRemoteDataReducers = <S extends RemoteDataState<any, any>>() => ({
request: (state: Draft<S>) => {
state.status = STATUS.fetching;
},
success: (state: Draft<S>, action: PayloadAction<S['data']>) => {
state.data = action.payload;
state.status = STATUS.success;
},
failure: (state: Draft<S>, action: PayloadAction<S['error']>) => {
state.error = action.payload;
state.status = STATUS.failure;
},
});

0 comments on commit ffa3a37

Please sign in to comment.