Skip to content

Commit c2060f1

Browse files
Anton LillebyAnton Lilleby
authored andcommitted
feat: option for prefetching before app mount
1 parent 80a42c2 commit c2060f1

File tree

9 files changed

+523
-217
lines changed

9 files changed

+523
-217
lines changed

README.md

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ npm install vue3-app-configuration
1010

1111
## Get started
1212

13-
To use vue3-app-configuration, you need to initialize it in your main application file, typically main.ts or main.js.
13+
To integrate vue3-app-configuration into your application, you'll need to initialize it in your main application file, usually named main.ts or main.js. You can either fetch your feature flags before or after the app has mounted, depending on your specific requirements and preferences.
14+
15+
## After the app has mounted (non-blocking)
16+
17+
In this setup, feature flags are reactive and synchronous.
1418

1519
```ts
1620
import { createApp } from "vue";
@@ -19,54 +23,49 @@ import { AppConfigurationPlugin } from "vue3-app-configuration";
1923

2024
const app = createApp(App);
2125

22-
app.use(
23-
AppConfigurationPlugin,
24-
"your-azure-configuration-readonly-connection-string"
25-
);
26+
app.use(AppConfigurationPlugin, {
27+
connectionString: "your-azure-configuration-readonly-connection-string",
28+
cacheEnabled: true, // optional, defaults to true
29+
flagsToPrefetchOptimistic: [{ name: "featureFlag1" }], // optional
30+
});
2631

2732
app.mount("#app");
2833
```
2934

30-
Replace 'your-azure-configuration-readonly-connection-string' with your actual connection string. For help with setting up a connection string and using feature flags in Azure, check out this guide: [Feature Flags in Vue with Azure App Configuration](https://www.tvaidyan.com/2022/07/14/feature-flags-in-vue-with-azure-app-configuration).
31-
32-
## Using in Vue Components
33-
34-
You can use the `vue3-app-configuration` plugin in your Vue components in two ways: using an async non-reactive method or a non-blocking reactive method.
35+
## Before the app has mounted (blocking)
3536

36-
### Reactive Usage
37+
In this setup, feature flags are also reactive, but fetched before your application mounts.
3738

38-
```html
39-
<script setup lang="ts">
40-
import { useFeatureFlags } from "vue3-app-configuration";
39+
```ts
40+
import { createApp } from "vue";
41+
import App from "./App.vue";
42+
import { AppConfigurationPluginAsync } from "vue3-app-configuration";
4143

42-
const { getFeatureFlag } = useFeatureFlags();
44+
const app = createApp(App);
4345

44-
const { isFeatureEnabled, featureDescription } = getFeatureFlag(
45-
"your-feature-flag-name",
46-
"your-label"
47-
);
48-
</script>
46+
app.use(AppConfigurationPluginAsync, {
47+
connectionString: "your-azure-configuration-readonly-connection-string",
48+
flagsToPrefetch: [{ name: "featureFlag1" }],
49+
});
4950

50-
<template>
51-
<p v-if="isFeatureEnabled">{{ featureDescription }}</p>
52-
<p v-else>This feature is disabled</p>
53-
</template>
51+
AppConfigurationPluginAsync.isReady().then(() => {
52+
app.mount("#app");
53+
});
5454
```
5555

56-
### Non-Reactive Usage
56+
Remember to replace 'your-azure-configuration-readonly-connection-string' with your actual connection string. For help with setting up a connection string and using feature flags in Azure, check out this guide: [Feature Flags in Vue with Azure App Configuration](https://www.tvaidyan.com/2022/07/14/feature-flags-in-vue-with-azure-app-configuration).
57+
58+
## Vue component usage
5759

5860
```html
5961
<script setup lang="ts">
60-
import { onMounted } from "vue";
6162
import { useFeatureFlags } from "vue3-app-configuration";
6263
63-
const { getFeatureFlagAsync } = useFeatureFlags();
64+
const { getFeatureFlag } = useFeatureFlags();
6465
65-
onMounted(async () => {
66-
const { isFeatureEnabled, featureDescription } = await getFeatureFlagAsync(
67-
"your-feature-flag-name",
68-
"your-label"
69-
);
66+
const { isFeatureEnabled, featureDescription } = getFeatureFlag({
67+
name: "your-feature-flag-name",
68+
label: "your-feature-flag-label", // optional
7069
});
7170
</script>
7271
```
@@ -75,7 +74,7 @@ You can use the `vue3-app-configuration` plugin in your Vue components in two wa
7574

7675
The AppConfigurationClient instance is exposed at `this.featureFlagsManager.appConfigurationClient`.
7776

78-
Inspired by
77+
## Inspired by
7978

8079
- [@azure/app-configuration](https://www.npmjs.com/package/@azure/app-configuration)
8180
- [vue3-application-insights](https://www.npmjs.com/package/vue3-application-insights)

dist/index.d.mts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
import { AppConfigurationClient } from '@azure/app-configuration';
22
import { App, Ref } from 'vue';
33

4-
type TypeAppConfigurationClient = AppConfigurationClient | null;
5-
type TypeGetFeatureFlag = (name: string, label?: string) => {
4+
type FlagOptionsType = {
5+
name: string;
6+
label?: string;
7+
};
8+
type GetFeatureFlagType = (params: FlagOptionsType) => {
69
isFeatureEnabled: Ref<boolean>;
710
featureDescription: Ref<string>;
811
};
9-
type TypeGetFeatureFlagAsync = (name: string, label?: string) => Promise<{
10-
isFeatureEnabled: boolean;
11-
featureDescription: string;
12-
}>;
1312
interface IFeatureFlagsManager {
14-
appConfigurationClient: TypeAppConfigurationClient;
15-
getFeatureFlag: TypeGetFeatureFlag;
16-
getFeatureFlagAsync: TypeGetFeatureFlagAsync;
13+
appConfigurationClient: AppConfigurationClientType;
14+
getFeatureFlag: GetFeatureFlagType;
1715
}
18-
declare function AppConfigurationPlugin(app: App, connectionString?: string): void;
16+
type AppConfigurationClientType = AppConfigurationClient | null;
17+
declare const AppConfigurationPlugin: {
18+
install: (app: App, options: {
19+
connectionString?: string;
20+
cacheEnabled?: boolean;
21+
flagsToPrefetchOptmistic?: FlagOptionsType[];
22+
}) => void;
23+
};
24+
declare const AppConfigurationPluginAsync: {
25+
_installPromise: Promise<void> | null;
26+
install: (app: App, options: {
27+
connectionString?: string;
28+
flagsToPrefetch?: FlagOptionsType[];
29+
}) => void;
30+
isReady: () => Promise<void>;
31+
};
1932
declare const useFeatureFlags: () => IFeatureFlagsManager;
2033

21-
export { AppConfigurationPlugin, useFeatureFlags };
34+
export { AppConfigurationPlugin, AppConfigurationPluginAsync, useFeatureFlags };

dist/index.d.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
import { AppConfigurationClient } from '@azure/app-configuration';
22
import { App, Ref } from 'vue';
33

4-
type TypeAppConfigurationClient = AppConfigurationClient | null;
5-
type TypeGetFeatureFlag = (name: string, label?: string) => {
4+
type FlagOptionsType = {
5+
name: string;
6+
label?: string;
7+
};
8+
type GetFeatureFlagType = (params: FlagOptionsType) => {
69
isFeatureEnabled: Ref<boolean>;
710
featureDescription: Ref<string>;
811
};
9-
type TypeGetFeatureFlagAsync = (name: string, label?: string) => Promise<{
10-
isFeatureEnabled: boolean;
11-
featureDescription: string;
12-
}>;
1312
interface IFeatureFlagsManager {
14-
appConfigurationClient: TypeAppConfigurationClient;
15-
getFeatureFlag: TypeGetFeatureFlag;
16-
getFeatureFlagAsync: TypeGetFeatureFlagAsync;
13+
appConfigurationClient: AppConfigurationClientType;
14+
getFeatureFlag: GetFeatureFlagType;
1715
}
18-
declare function AppConfigurationPlugin(app: App, connectionString?: string): void;
16+
type AppConfigurationClientType = AppConfigurationClient | null;
17+
declare const AppConfigurationPlugin: {
18+
install: (app: App, options: {
19+
connectionString?: string;
20+
cacheEnabled?: boolean;
21+
flagsToPrefetchOptmistic?: FlagOptionsType[];
22+
}) => void;
23+
};
24+
declare const AppConfigurationPluginAsync: {
25+
_installPromise: Promise<void> | null;
26+
install: (app: App, options: {
27+
connectionString?: string;
28+
flagsToPrefetch?: FlagOptionsType[];
29+
}) => void;
30+
isReady: () => Promise<void>;
31+
};
1932
declare const useFeatureFlags: () => IFeatureFlagsManager;
2033

21-
export { AppConfigurationPlugin, useFeatureFlags };
34+
export { AppConfigurationPlugin, AppConfigurationPluginAsync, useFeatureFlags };

0 commit comments

Comments
 (0)