@application-kit/feature-flags 0.0.0 → 0.2.0
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/CHANGELOG.md +16 -0
- package/README.md +15 -1
- package/dist/cjs/vue/feature-flag-channel.d.ts +14 -0
- package/dist/cjs/vue/feature-flag-channel.js +20 -0
- package/dist/cjs/vue/index.d.ts +1 -0
- package/dist/cjs/vue/index.js +1 -0
- package/dist/esm/vue/feature-flag-channel.d.ts +14 -0
- package/dist/esm/vue/feature-flag-channel.js +16 -0
- package/dist/esm/vue/index.d.ts +1 -0
- package/dist/esm/vue/index.js +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# @application-kit/feature-flags
|
|
2
|
+
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 2a51c82: Каналы значений «сервер → клиент». `vue-ssr`: опция `channels` у `createSsrEntry` и `hydrateSsrApplication`, контракт `SsrChannelInterface`, `PiniaPlugin`. Ломает: `describePage` заменена на `resolveLang`, значения `window.*` идут только каналами; `channels` обязательна у обеих функций, `beforeMount` стал необязательным. `i18n/vue`: `createLocaleChannel`. `feature-flags/vue`: `createFeatureFlagChannel`.
|
|
8
|
+
|
|
9
|
+
## 0.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 5b3aacf: Первый выпуск: набор флагов `defineFeatureFlags` с реестром имён `FeatureFlagRegistryInterface` (module augmentation),
|
|
14
|
+
разбор окружения с отказом на незнакомой и пропущенной переменной, порт `FeatureFlagsInterface`, токен `FEATURE_FLAGS` и
|
|
15
|
+
адаптер `EnvironmentFeatureFlags` (корень, изоморфно); `useFeatureFlag`, ключ `FEATURE_FLAG_STATE` и разбор SSR-состояния
|
|
16
|
+
`parseFeatureFlagState` (вход `/vue`); фейк порта `FakeFeatureFlags` (вход `/testing`).
|
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ Peer: `@libs-for-dev/nestjs-config-module` (подпуть `/parse-boolean` —
|
|
|
25
25
|
| Вход | Что внутри | Зависимости |
|
|
26
26
|
|---|---|---|
|
|
27
27
|
| `@application-kit/feature-flags` | `defineFeatureFlags`, реестр `FeatureFlagRegistryInterface`, порт `FeatureFlagsInterface`, токен `FEATURE_FLAGS`, адаптер `EnvironmentFeatureFlags`, ошибки | изоморфно, без Nest и DOM |
|
|
28
|
-
| `@application-kit/feature-flags/vue` | `useFeatureFlag`, ключ `FEATURE_FLAG_STATE`, `parseFeatureFlagState` | `vue` |
|
|
28
|
+
| `@application-kit/feature-flags/vue` | `useFeatureFlag`, ключ `FEATURE_FLAG_STATE`, `parseFeatureFlagState`, `createFeatureFlagChannel` | `vue` |
|
|
29
29
|
| `@application-kit/feature-flags/testing` | `FakeFeatureFlags` | — |
|
|
30
30
|
|
|
31
31
|
Корень грузится и в клиентском бандле (набор нужен разбору SSR-состояния), поэтому связки с Nest в пакете нет:
|
|
@@ -129,6 +129,20 @@ Vue, где `await` в разметке невозможен. Адаптер с
|
|
|
129
129
|
|
|
130
130
|
Публичный срез уезжает на страницу SSR-состоянием:
|
|
131
131
|
|
|
132
|
+
С `@application-kit/vue-ssr` состояние едет каналом — ставится до рендера и уезжает на страницу одним значением:
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
const featureFlagChannel = createFeatureFlagChannel(featureFlags)
|
|
136
|
+
|
|
137
|
+
// сервер, опция createSsrEntry
|
|
138
|
+
channels: () => [featureFlagChannel.withValue(featureFlagsPort.publicState())],
|
|
139
|
+
|
|
140
|
+
// клиент, опция hydrateSsrApplication
|
|
141
|
+
channels: [featureFlagChannel],
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Без него — те же шаги руками:
|
|
145
|
+
|
|
132
146
|
```ts
|
|
133
147
|
// сервер, перед renderToString
|
|
134
148
|
const state = featureFlagsPort.publicState()
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { App } from 'vue';
|
|
2
|
+
import type { FeatureFlagSetInterface } from '../define-feature-flags.js';
|
|
3
|
+
import type { FeatureFlagState } from '../feature-flag-registry.js';
|
|
4
|
+
export interface FeatureFlagChannelInterface {
|
|
5
|
+
readonly key: string;
|
|
6
|
+
restore(app: App, serialized: string | undefined): void;
|
|
7
|
+
withValue(state: FeatureFlagState): FeatureFlagChannelValueInterface;
|
|
8
|
+
}
|
|
9
|
+
export interface FeatureFlagChannelValueInterface {
|
|
10
|
+
apply(app: App): void;
|
|
11
|
+
readonly key: string;
|
|
12
|
+
readonly serialized: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const createFeatureFlagChannel: (featureFlags: FeatureFlagSetInterface) => FeatureFlagChannelInterface;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFeatureFlagChannel = void 0;
|
|
4
|
+
const parse_feature_flag_state_js_1 = require("./parse-feature-flag-state.js");
|
|
5
|
+
const use_feature_flag_js_1 = require("./use-feature-flag.js");
|
|
6
|
+
const FEATURE_FLAG_CHANNEL_KEY = 'ssrFeatureFlags';
|
|
7
|
+
const createFeatureFlagChannel = (featureFlags) => ({
|
|
8
|
+
key: FEATURE_FLAG_CHANNEL_KEY,
|
|
9
|
+
restore: (app, serialized) => {
|
|
10
|
+
app.provide(use_feature_flag_js_1.FEATURE_FLAG_STATE, (0, parse_feature_flag_state_js_1.parseFeatureFlagState)(featureFlags, serialized));
|
|
11
|
+
},
|
|
12
|
+
withValue: (state) => ({
|
|
13
|
+
apply: (app) => {
|
|
14
|
+
app.provide(use_feature_flag_js_1.FEATURE_FLAG_STATE, state);
|
|
15
|
+
},
|
|
16
|
+
key: FEATURE_FLAG_CHANNEL_KEY,
|
|
17
|
+
serialized: JSON.stringify(state),
|
|
18
|
+
}),
|
|
19
|
+
});
|
|
20
|
+
exports.createFeatureFlagChannel = createFeatureFlagChannel;
|
package/dist/cjs/vue/index.d.ts
CHANGED
package/dist/cjs/vue/index.js
CHANGED
|
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./feature-flag-channel.js"), exports);
|
|
17
18
|
__exportStar(require("./parse-feature-flag-state.js"), exports);
|
|
18
19
|
__exportStar(require("./use-feature-flag.js"), exports);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { App } from 'vue';
|
|
2
|
+
import type { FeatureFlagSetInterface } from '../define-feature-flags.js';
|
|
3
|
+
import type { FeatureFlagState } from '../feature-flag-registry.js';
|
|
4
|
+
export interface FeatureFlagChannelInterface {
|
|
5
|
+
readonly key: string;
|
|
6
|
+
restore(app: App, serialized: string | undefined): void;
|
|
7
|
+
withValue(state: FeatureFlagState): FeatureFlagChannelValueInterface;
|
|
8
|
+
}
|
|
9
|
+
export interface FeatureFlagChannelValueInterface {
|
|
10
|
+
apply(app: App): void;
|
|
11
|
+
readonly key: string;
|
|
12
|
+
readonly serialized: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const createFeatureFlagChannel: (featureFlags: FeatureFlagSetInterface) => FeatureFlagChannelInterface;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { parseFeatureFlagState } from './parse-feature-flag-state.js';
|
|
2
|
+
import { FEATURE_FLAG_STATE } from './use-feature-flag.js';
|
|
3
|
+
const FEATURE_FLAG_CHANNEL_KEY = 'ssrFeatureFlags';
|
|
4
|
+
export const createFeatureFlagChannel = (featureFlags) => ({
|
|
5
|
+
key: FEATURE_FLAG_CHANNEL_KEY,
|
|
6
|
+
restore: (app, serialized) => {
|
|
7
|
+
app.provide(FEATURE_FLAG_STATE, parseFeatureFlagState(featureFlags, serialized));
|
|
8
|
+
},
|
|
9
|
+
withValue: (state) => ({
|
|
10
|
+
apply: (app) => {
|
|
11
|
+
app.provide(FEATURE_FLAG_STATE, state);
|
|
12
|
+
},
|
|
13
|
+
key: FEATURE_FLAG_CHANNEL_KEY,
|
|
14
|
+
serialized: JSON.stringify(state),
|
|
15
|
+
}),
|
|
16
|
+
});
|
package/dist/esm/vue/index.d.ts
CHANGED
package/dist/esm/vue/index.js
CHANGED
package/package.json
CHANGED