vue3-app-configuration
Version:
A Vue 3 plugin for integrating Azure App Configuration, including feature flags management.
211 lines (210 loc) • 6.8 kB
JavaScript
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/index.ts
import {
AppConfigurationClient,
featureFlagPrefix,
isFeatureFlag,
parseFeatureFlag
} from "@azure/app-configuration";
import { inject, reactive, ref } from "vue";
var FeatureFlagsManagerKey = Symbol(
"FeatureFlagsManager"
);
var featureFlagsManager = (connectionString, cacheEnabled = true, flagsToPrefetchOptmistic = []) => {
let appConfigurationClient = null;
if (connectionString) {
appConfigurationClient = new AppConfigurationClient(connectionString);
}
const cache = {};
function prefetchFeatureFlagsOptimistic(flags) {
if (!appConfigurationClient) {
return;
}
for (const { name, label } of flags) {
appConfigurationClient.getConfigurationSetting({
key: `${featureFlagPrefix}${name}`,
label
}).then((response) => {
var _a;
if (isFeatureFlag(response)) {
const {
value: { enabled, description = "", conditions }
} = parseFeatureFlag(response);
const cacheKey = `cache-${name}-${label != null ? label : "empty-label"}`;
cache[cacheKey] = {
isFeatureEnabled: ref(enabled),
featureDescription: ref(description),
featureConditions: reactive({
clientFilters: (_a = conditions.clientFilters) != null ? _a : []
})
};
}
}).catch((error) => {
console.error(
"[App Configuration Plugin] Error prefetching feature flag.",
error
);
});
}
}
if (flagsToPrefetchOptmistic.length) {
prefetchFeatureFlagsOptimistic(flagsToPrefetchOptmistic);
}
const getFeatureFlag = ({ name, label }) => {
const cacheKey = `cache-${name}-${label != null ? label : "empty-label"}`;
if (cacheEnabled && cache[cacheKey]) {
return cache[cacheKey];
}
const isFeatureEnabled = ref(false);
const featureDescription = ref("");
const featureConditions = reactive({});
if (!appConfigurationClient) {
if (cacheEnabled) {
cache[cacheKey] = { isFeatureEnabled, featureDescription, featureConditions };
}
return { isFeatureEnabled, featureDescription, featureConditions };
}
appConfigurationClient.getConfigurationSetting({
key: `${featureFlagPrefix}${name}`,
label
}).then((response) => {
if (isFeatureFlag(response)) {
const {
value: { enabled, description = "", conditions }
} = parseFeatureFlag(response);
isFeatureEnabled.value = enabled;
featureDescription.value = description;
Object.assign(conditions, featureConditions);
if (cacheEnabled) {
cache[cacheKey] = { isFeatureEnabled, featureDescription, featureConditions };
}
}
}).catch((error) => {
console.error(
"[App Configuration Plugin] Error retrieving feature flag.",
error
);
});
return { isFeatureEnabled, featureDescription, featureConditions };
};
return { getFeatureFlag, appConfigurationClient };
};
var featureFlagsManagerAsync = (_0, ..._1) => __async(void 0, [_0, ..._1], function* (connectionString, flagsToPrefetch = []) {
let appConfigurationClient = null;
if (connectionString) {
appConfigurationClient = new AppConfigurationClient(connectionString);
}
const cache = {};
function prefetchFeatureFlags(flags) {
return __async(this, null, function* () {
if (!appConfigurationClient) {
return;
}
yield Promise.all(
flags.map((_02) => __async(this, [_02], function* ({ name, label }) {
var _a;
try {
const response = yield appConfigurationClient.getConfigurationSetting({
key: `${featureFlagPrefix}${name}`,
label
});
if (isFeatureFlag(response)) {
const {
value: { enabled, description = "", conditions }
} = parseFeatureFlag(response);
const cacheKey = `cache-${name}-${label != null ? label : "empty-label"}`;
cache[cacheKey] = {
isFeatureEnabled: ref(enabled),
featureDescription: ref(description),
featureConditions: reactive({
clientFilters: (_a = conditions.clientFilters) != null ? _a : []
})
};
}
} catch (error) {
console.error(
"[App Configuration Plugin] Error prefetching feature flag.",
error
);
}
}))
);
});
}
yield prefetchFeatureFlags(flagsToPrefetch);
const getFeatureFlag = ({ name, label }) => {
const cacheKey = `cache-${name}-${label != null ? label : "empty-label"}`;
if (cache[cacheKey]) {
return cache[cacheKey];
}
cache[cacheKey] = {
isFeatureEnabled: ref(false),
featureDescription: ref(""),
featureConditions: reactive({
clientFilters: []
})
};
return cache[cacheKey];
};
return { getFeatureFlag, appConfigurationClient };
});
var AppConfigurationPlugin = {
install: (app, options) => {
const manager = featureFlagsManager(
options.connectionString,
options.cacheEnabled,
options.flagsToPrefetchOptmistic
);
app.provide(FeatureFlagsManagerKey, manager);
}
};
var AppConfigurationPluginAsync = {
_installPromise: null,
install: (app, options) => {
AppConfigurationPluginAsync._installPromise = new Promise(
(resolve) => __async(void 0, null, function* () {
const manager = yield featureFlagsManagerAsync(
options.connectionString,
options.flagsToPrefetch
);
app.provide(FeatureFlagsManagerKey, manager);
resolve();
})
);
},
isReady: () => AppConfigurationPluginAsync._installPromise || Promise.resolve()
};
var useFeatureFlags = () => {
const featureFlagsManager2 = inject(FeatureFlagsManagerKey);
if (!featureFlagsManager2) {
throw new Error(
"[App Configuration Plugin] FeatureFlagsManager is not provided."
);
}
return featureFlagsManager2;
};
export {
AppConfigurationPlugin,
AppConfigurationPluginAsync,
useFeatureFlags
};
//# sourceMappingURL=index.mjs.map