@application-kit/feature-flags 0.1.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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @application-kit/feature-flags
2
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
+
3
9
  ## 0.1.0
4
10
 
5
11
  ### Minor Changes
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;
@@ -1,2 +1,3 @@
1
+ export * from './feature-flag-channel.js';
1
2
  export * from './parse-feature-flag-state.js';
2
3
  export * from './use-feature-flag.js';
@@ -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
+ });
@@ -1,2 +1,3 @@
1
+ export * from './feature-flag-channel.js';
1
2
  export * from './parse-feature-flag-state.js';
2
3
  export * from './use-feature-flag.js';
@@ -1,2 +1,3 @@
1
+ export * from './feature-flag-channel.js';
1
2
  export * from './parse-feature-flag-state.js';
2
3
  export * from './use-feature-flag.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@application-kit/feature-flags",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Фичефлаги из окружения: набор флагов параметром, порт с адаптером окружения, SSR-состояние для Vue и фейк для спек",
5
5
  "keywords": [
6
6
  "feature-flags",