feat: update demo app and documentation (#255)

## This PR

Update k8s end to end example, update app by removing deprecated
packages and fix docker image as it was failing with python requirement.

While doing the update, had to do extra lint fixes and CI fixes

---------

Signed-off-by: Kavindu Dodanduwa <kavindudodanduwa@gmail.com>
This commit is contained in:
Kavindu Dodanduwa 2023-11-30 12:48:31 -08:00 committed by GitHub
parent d4d0a38ccb
commit eaa770db6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 8140 additions and 21184 deletions

View File

@ -16,13 +16,11 @@ jobs:
with:
# We need to fetch all branches and commits so that Nx affected has a base to compare against.
fetch-depth: 0
- uses: nrwl/nx-set-shas@v3
- uses: actions/setup-node@v3
- uses: nrwl/nx-set-shas@v4
- uses: actions/setup-node@v4
with:
node-version: 16
node-version: 18
cache: 'npm'
- run: npm ci
- run: npx nx workspace-lint
- run: if ! npx nx format:check ; then echo "Format check failed. Please run 'npx nx format:write'."; fi
- run: npx nx affected --target=lint --parallel=3
- run: npx nx affected --target=test --parallel=3 --ci --code-coverage

3
.gitignore vendored
View File

@ -33,6 +33,7 @@ npm-debug.log
yarn-error.log
testem.log
/typings
.nx
# System Files
.DS_Store
@ -43,4 +44,4 @@ Thumbs.db
# yalc stuff
.yalc
yalc.lock
yalc.lock

View File

@ -2,3 +2,4 @@
/dist
/coverage
/.nx

View File

@ -1,12 +1,12 @@
# A basic flag custom resource
apiVersion: core.openfeature.dev/v1alpha2
kind: FeatureFlagConfiguration
apiVersion: core.openfeature.dev/v1beta1
kind: FeatureFlag
metadata:
name: end-to-end
labels:
app: open-feature-demo
spec:
featureFlagSpec:
flagSpec:
flags:
new-welcome-message:
state: ENABLED
@ -53,6 +53,19 @@ spec:
'off': false
defaultVariant: 'off'
---
# Feature flag source custom resource, configuring flagd to source flags from FeatureFlag crd
apiVersion: core.openfeature.dev/v1beta1
kind: FeatureFlagSource
metadata:
name: end-to-end
labels:
app: open-feature-demo
spec:
sources:
- source: end-to-end
provider: kubernetes
---
# Deployment of a demo-app using our custom resource
apiVersion: apps/v1
kind: Deployment
@ -71,7 +84,7 @@ spec:
app: open-feature-demo
annotations:
openfeature.dev/enabled: "true"
openfeature.dev/featureflagconfiguration: "end-to-end"
openfeature.dev/featureflagsource: "end-to-end"
spec:
containers:
- name: open-feature-demo

View File

@ -24,7 +24,6 @@ services:
- FIB_SERVICE_URL=http://fib-service:30001
- FIB_SERVICE_USER
- FIB_SERVICE_PASS
- ENABLED_SPAN_BASED_TRACES
# Provider values come from the .env
- NEW_WELCOME_MESSAGE
- FIB_ALGO
@ -60,7 +59,6 @@ services:
- OTEL_SERVICE_NAME=fibonacci-service
- FIB_SERVICE_USER
- FIB_SERVICE_PASS
- ENABLED_SPAN_BASED_TRACES
# Provider values come from the .env
- NEW_WELCOME_MESSAGE
- FIB_ALGO

View File

@ -2,171 +2,87 @@
"migrations": [
{
"cli": "nx",
"version": "16.0.0-beta.0",
"description": "Remove @nrwl/cli.",
"implementation": "./src/migrations/update-16-0-0/remove-nrwl-cli",
"package": "nx",
"name": "16.0.0-remove-nrwl-cli"
},
{
"cli": "nx",
"version": "16.0.0-beta.9",
"description": "Replace `dependsOn.projects` and `inputs` definitions with new configuration format.",
"implementation": "./src/migrations/update-16-0-0/update-depends-on-to-tokens",
"package": "nx",
"name": "16.0.0-tokens-for-depends-on"
},
{
"cli": "nx",
"version": "16.0.0-beta.0",
"description": "Replace @nrwl/nx-cloud with nx-cloud",
"implementation": "./src/migrations/update-16-0-0/update-nx-cloud-runner",
"package": "nx",
"name": "16.0.0-update-nx-cloud-runner"
},
{
"cli": "nx",
"version": "16.2.0-beta.0",
"description": "Remove outputPath from run commands",
"implementation": "./src/migrations/update-16-2-0/remove-run-commands-output-path",
"package": "nx",
"name": "16.2.0-remove-output-path-from-run-commands"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/devkit with @nx/devkit",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/devkit",
"name": "update-16-0-0-add-nx-packages"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/workspace with @nx/workspace",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/workspace",
"name": "update-16-0-0-add-nx-packages"
},
{
"version": "16.0.0-beta.4",
"description": "Generates a plugin called 'workspace-plugin' containing your workspace generators.",
"cli": "nx",
"implementation": "./src/migrations/update-16-0-0/move-workspace-generators-to-local-plugin",
"package": "@nx/workspace",
"name": "16-0-0-move-workspace-generators-into-local-plugin"
},
{
"version": "16.0.0-beta.9",
"description": "Fix .babelrc presets if it contains an invalid entry for @nx/web/babel.",
"cli": "nx",
"implementation": "./src/migrations/update-16-0-0/fix-invalid-babelrc",
"package": "@nx/workspace",
"name": "16-0-0-fix-invalid-babelrc"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/js with @nx/js",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/js",
"name": "update-16-0-0-add-nx-packages"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/linter with @nx/linter",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/linter",
"name": "update-16-0-0-add-nx-packages"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/web with @nx/web",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/web",
"name": "update-16-0-0-add-nx-packages"
},
{
"cli": "nx",
"version": "16.0.0-beta.4",
"description": "Replace @nx/web executors with @nx/webpack and @nx/rollup",
"implementation": "./src/migrations/update-16-0-0-update-executors/update-16-0-0-update-executors",
"package": "@nx/web",
"name": "update-16-0-0-update-executors"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/eslint-plugin with @nx/eslint-plugin",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/eslint-plugin",
"name": "update-16-0-0-add-nx-packages"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/react with @nx/react",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"version": "16.7.0-beta.2",
"description": "Add @babel/core to package.json if @babel/preset-react is present",
"implementation": "./src/migrations/update-16-7-0/add-babel-core",
"package": "@nx/react",
"name": "update-16-0-0-add-nx-packages"
"name": "add-babel-core"
},
{
"cli": "nx",
"version": "16.2.0-beta.0",
"description": "Remove react-test-renderer from package.json",
"implementation": "./src/migrations/update-16-2-0-remove-package/update-16-2-0-remove-package",
"version": "16.7.0-beta.2",
"description": "Add @nx/react types to tsconfig types array",
"implementation": "./src/migrations/update-16-7-0-add-typings/update-16-7-0-add-typings",
"package": "@nx/react",
"name": "update-16-2-0-remove-package"
"name": "update-16-7-0-add-typings"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/jest with @nx/jest",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"version": "16.5.0-beta.2",
"description": "Add test-setup.ts to ignored files in production input",
"implementation": "./src/migrations/update-16-5-0/add-test-setup-to-inputs-ignore",
"package": "@nx/jest",
"name": "update-16-0-0-add-nx-packages"
"name": "add-test-setup-to-inputs-ignore"
},
{
"version": "17.1.0-beta.2",
"description": "Move jest executor options to nx.json targetDefaults",
"implementation": "./src/migrations/update-17-1-0/move-options-to-target-defaults",
"package": "@nx/jest",
"name": "move-options-to-target-defaults"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/node with @nx/node",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/node",
"name": "update-16-0-0-add-nx-packages"
"version": "16.6.0-beta.0",
"description": "Explicitly set 'updateBuildableProjectDepsInPackageJson' to 'true' in targets that rely on that value as the default.",
"factory": "./src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps",
"package": "@nx/js",
"name": "explicitly-set-projects-to-update-buildable-deps"
},
{
"cli": "nx",
"version": "16.0.0-beta.5",
"description": "Replace @nx/node:webpack with @nx/node:webpack",
"implementation": "./src/migrations/update-16-0-0/update-webpack-executor",
"package": "@nx/node",
"name": "update-16-0-0-update-executor"
"version": "16.8.2-beta.0",
"description": "Remove invalid options (strict, noInterop) for ES6 type modules.",
"factory": "./src/migrations/update-16-8-2/update-swcrc",
"package": "@nx/js",
"name": "16-8-2-update-swcrc"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/express with @nx/express",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/express",
"name": "update-16-0-0-add-nx-packages"
"version": "17.0.2",
"description": "Remove deprecated build options",
"implementation": "./src/migrations/update-17-0-0/remove-deprecated-build-options",
"package": "@nx/js",
"name": "update-17-0-0-remove-deprecated-build-options"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/nest with @nx/nest",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/nest",
"name": "update-16-0-0-add-nx-packages"
"version": "16.9.0-beta.1",
"description": "Replace imports of Module Federation utils frm @nx/devkit to @nx/webpack",
"implementation": "./src/migrations/update-16-9-0/migrate-mf-util-usage",
"package": "@nx/devkit",
"name": "update-16-9-0-migrate-mf-usage-to-webpack"
},
{
"cli": "nx",
"version": "16.0.0-beta.1",
"description": "Replace @nx/webpack with @nx/webpack",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages",
"package": "@nx/webpack",
"name": "update-16-0-0-add-nx-packages"
"version": "16.8.0",
"description": "update-16-8-0-add-ignored-files",
"implementation": "./src/migrations/update-16-8-0-add-ignored-files/update-16-8-0-add-ignored-files",
"package": "@nx/linter",
"name": "update-16-8-0-add-ignored-files"
},
{
"version": "17.0.0-beta.7",
"description": "update-17-0-0-rename-to-eslint",
"implementation": "./src/migrations/update-17-0-0-rename-to-eslint/update-17-0-0-rename-to-eslint",
"package": "@nx/linter",
"name": "update-17-0-0-rename-to-eslint"
},
{
"version": "17.1.0-beta.1",
"description": "Updates for @typescript-utils/utils v6.9.1+",
"implementation": "./src/migrations/update-17-1-0/update-typescript-eslint",
"package": "@nx/linter",
"name": "update-typescript-eslint"
}
]
}

27
nx.json
View File

@ -2,9 +2,7 @@
"tasksRunnerOptions": {
"default": {
"runner": "@nx/workspace/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "lint", "test", "e2e"]
}
"options": {}
}
},
"extends": "nx/presets/core.json",
@ -12,13 +10,9 @@
"libsDir": "packages",
"appsDir": "packages"
},
"npmScope": "openfeature",
"affected": {
"defaultBase": "main"
},
"cli": {
"defaultCollection": "@nx/express"
},
"defaultProject": "app",
"generators": {
"@nx/react": {
@ -39,12 +33,29 @@
"$schema": "./node_modules/nx/schemas/nx-schema.json",
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
"dependsOn": ["^build"],
"inputs": ["production", "^production"],
"cache": true
},
"lint": {
"cache": true
},
"test": {
"cache": true
},
"e2e": {
"cache": true
}
},
"pluginsConfig": {
"@nx/js": {
"analyzeSourceFiles": true
}
},
"nxCloudAccessToken": "MzczOGQ0MDAtNTU1MC00NzMzLTk0YmMtMzQ5ZWYyMTQzNmRjfHJlYWQtd3JpdGU=",
"namedInputs": {
"default": ["{projectRoot}/**/*", "sharedGlobals"],
"sharedGlobals": [],
"production": ["default"]
}
}

28771
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,6 @@
"@openfeature/flagd-web-provider": "^0.4.0",
"@openfeature/go-feature-flag-provider": "^0.5.14",
"@openfeature/js-sdk": "^1.4.1",
"@openfeature/open-telemetry-hook": "^5.1.1",
"@openfeature/open-telemetry-hooks": "^0.2.3",
"@openfeature/web-sdk": "0.4.0",
"@opentelemetry/api": "~1.6.0",
@ -69,19 +68,19 @@
"@mui/material": "^5.11.3",
"@nestjs/schematics": "9.2.0",
"@nestjs/testing": "9.4.3",
"@nrwl/tao": "16.4.0",
"@nx/devkit": "16.4.0",
"@nx/eslint-plugin": "16.4.0",
"@nx/express": "16.4.0",
"@nx/jest": "16.4.0",
"@nx/js": "16.4.0",
"@nx/linter": "16.4.0",
"@nx/nest": "16.4.0",
"@nx/node": "16.4.0",
"@nx/react": "16.4.0",
"@nx/web": "16.4.0",
"@nx/webpack": "16.4.0",
"@nx/workspace": "16.4.0",
"@nrwl/tao": "17.1.3",
"@nx/devkit": "17.1.3",
"@nx/eslint-plugin": "17.1.3",
"@nx/express": "17.1.3",
"@nx/jest": "17.1.3",
"@nx/js": "17.1.3",
"@nx/linter": "17.1.3",
"@nx/nest": "17.1.3",
"@nx/node": "17.1.3",
"@nx/react": "17.1.3",
"@nx/web": "17.1.3",
"@nx/webpack": "17.1.3",
"@nx/workspace": "17.1.3",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.10",
"@reactour/tour": "^3.1.8",
"@svgr/webpack": "^8.0.0",
@ -90,19 +89,19 @@
"@types/express": "4.17.21",
"@types/jest": "^29.2.5",
"@types/node": "18.18.9",
"@types/react": "18.2.37",
"@types/react-dom": "18.2.15",
"@types/react": "18.2.24",
"@types/react-dom": "18.2.9",
"@types/react-json-editor-ajrm": "^2.5.3",
"@types/react-modal": "^3.13.1",
"@types/rox-node": "^5.0.1",
"@typescript-eslint/eslint-plugin": "5.60.1",
"@typescript-eslint/parser": "5.60.1",
"@typescript-eslint/eslint-plugin": "6.13.1",
"@typescript-eslint/parser": "6.13.1",
"ajv": "^8.12.0",
"babel-jest": "^29.3.1",
"core-js": "^3.27.1",
"css-loader": "^6.7.3",
"eslint": "8.43.0",
"eslint-config-prettier": "8.8.0",
"eslint": "8.46.0",
"eslint-config-prettier": "9.0.0",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-jsx-a11y": "6.7.1",
"eslint-plugin-react": "7.32.2",
@ -127,9 +126,9 @@
"ts-jest": "29.1.1",
"ts-node": "10.9.1",
"tslib": "^2.4.1",
"typescript": "5.1.6",
"typescript": "5.2.2",
"url-loader": "^4.1.1",
"webpack": "^5.75.0",
"webpack": "5.89.0",
"webpack-merge": "^5.8.0"
}
}

View File

@ -1,4 +1,4 @@
FROM node:20.3-bullseye-slim AS builder
FROM node:20.3-bullseye AS builder
WORKDIR /tmp/playground/
COPY package*.json workspace.json tsconfig*.json nx.json babel.config.json ./
COPY schemas/ ./schemas/

View File

@ -50,7 +50,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/app"],
"outputs": ["{workspaceRoot}/coverage/packages/app"],
"options": {
"jestConfig": "packages/app/jest.config.ts",
"passWithNoTests": true

View File

@ -1,23 +1,22 @@
import { HttpModule } from '@nestjs/axios';
import { MiddlewareConsumer, Module, NestModule, Scope } from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { ServeStaticModule } from '@nestjs/serve-static';
import { AsyncLocalStorageTransactionContext, LoggingHook, OpenFeatureLogger } from '@openfeature/extra';
import { FlagMetadata, OpenFeature } from '@openfeature/js-sdk';
import { TracingHook as SpanEventBasedTracingHook, MetricsHook } from '@openfeature/open-telemetry-hooks';
import { OpenTelemetryHook as SpanBasedTracingHook } from '@openfeature/open-telemetry-hook';
import { ProviderService } from '@openfeature/provider';
import { Request } from 'express';
import { Agent } from 'http';
import { LoggerModule } from 'nestjs-pino';
import { join } from 'path';
import { OPENFEATURE_CLIENT, REQUEST_DATA } from './constants';
import { FibonacciAsAServiceController } from './fibonacci-as-a-service.controller';
import { FibonacciService } from './fibonacci/fibonacci.service';
import { ProvidersController } from './providers.controller';
import { TransactionContextMiddleware } from './transaction-context.middleware';
import { RequestData } from './types';
import { UtilsController } from './utils.controller';
import {HttpModule} from '@nestjs/axios';
import {MiddlewareConsumer, Module, NestModule, Scope} from '@nestjs/common';
import {REQUEST} from '@nestjs/core';
import {ServeStaticModule} from '@nestjs/serve-static';
import {AsyncLocalStorageTransactionContext, LoggingHook, OpenFeatureLogger} from '@openfeature/extra';
import {FlagMetadata, OpenFeature} from '@openfeature/js-sdk';
import {MetricsHook, TracingHook as SpanEventBasedTracingHook} from '@openfeature/open-telemetry-hooks';
import {ProviderService} from '@openfeature/provider';
import {Request} from 'express';
import {Agent} from 'http';
import {LoggerModule} from 'nestjs-pino';
import {join} from 'path';
import {OPENFEATURE_CLIENT, REQUEST_DATA} from './constants';
import {FibonacciAsAServiceController} from './fibonacci-as-a-service.controller';
import {FibonacciService} from './fibonacci/fibonacci.service';
import {ProvidersController} from './providers.controller';
import {TransactionContextMiddleware} from './transaction-context.middleware';
import {RequestData} from './types';
import {UtilsController} from './utils.controller';
/**
* Set a global logger for OpenFeature. This is logger will available in hooks.
@ -30,16 +29,14 @@ function attributeMapper(flagMetadata: FlagMetadata) {
};
}
const traceHook =
process.env.ENABLED_SPAN_BASED_TRACES === 'true'
? new SpanBasedTracingHook()
: new SpanEventBasedTracingHook({ attributeMapper });
/**
* Adding hooks to at the global level will ensure they always run
* as part of a flag evaluation lifecycle.
*/
OpenFeature.addHooks(new LoggingHook(), traceHook, new MetricsHook({ attributeMapper }));
OpenFeature.addHooks(
new LoggingHook(),
new SpanEventBasedTracingHook({attributeMapper}),
new MetricsHook({attributeMapper}));
/**
* The transaction context propagator is an experimental feature

View File

@ -61,7 +61,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/fibonacci-service"],
"outputs": ["{workspaceRoot}/coverage/packages/fibonacci-service"],
"options": {
"jestConfig": "packages/fibonacci-service/jest.config.ts",
"passWithNoTests": true

View File

@ -1,14 +1,12 @@
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { LoggerModule } from 'nestjs-pino';
import { FlagMetadata, OpenFeature } from '@openfeature/js-sdk';
import { AsyncLocalStorageTransactionContext, LoggingHook, OpenFeatureLogger } from '@openfeature/extra';
import { TracingHook as SpanEventBasedTracingHook, MetricsHook } from '@openfeature/open-telemetry-hooks';
import { OpenTelemetryHook as SpanBasedTracingHook } from '@openfeature/open-telemetry-hook';
import { TransactionContextMiddleware } from './transaction-context.middleware';
import { ProviderService } from '@openfeature/provider';
import { ProvidersController } from './providers.controller';
import {MiddlewareConsumer, Module, NestModule} from '@nestjs/common';
import {AppController} from './app.controller';
import {LoggerModule} from 'nestjs-pino';
import {FlagMetadata, OpenFeature} from '@openfeature/js-sdk';
import {AsyncLocalStorageTransactionContext, LoggingHook, OpenFeatureLogger} from '@openfeature/extra';
import {MetricsHook, TracingHook as SpanEventBasedTracingHook} from '@openfeature/open-telemetry-hooks';
import {TransactionContextMiddleware} from './transaction-context.middleware';
import {ProviderService} from '@openfeature/provider';
import {ProvidersController} from './providers.controller';
/**
* Set a global logger for OpenFeature. This is logger will available in hooks.
@ -21,16 +19,14 @@ function attributeMapper(flagMetadata: FlagMetadata) {
};
}
const traceHook =
process.env.ENABLED_SPAN_BASED_TRACES === 'true'
? new SpanBasedTracingHook()
: new SpanEventBasedTracingHook({ attributeMapper });
/**
* Adding hooks to at the global level will ensure they always run
* as part of a flag evaluation lifecycle.
*/
OpenFeature.addHooks(new LoggingHook(), traceHook, new MetricsHook({ attributeMapper }));
OpenFeature.addHooks(
new LoggingHook(),
new SpanEventBasedTracingHook({attributeMapper}),
new MetricsHook({ attributeMapper }));
/**
* The transaction context propagator is an experimental feature

View File

@ -30,7 +30,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/fibonacci"],
"outputs": ["{workspaceRoot}/coverage/packages/fibonacci"],
"options": {
"jestConfig": "packages/fibonacci/jest.config.ts",
"passWithNoTests": true

View File

@ -31,7 +31,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/js-flagsmith-provider"],
"outputs": ["{workspaceRoot}/coverage/packages/js-flagsmith-provider"],
"options": {
"jestConfig": "packages/js-flagsmith-provider/jest.config.ts",
"passWithNoTests": true

View File

@ -23,7 +23,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/js-harness-provider"],
"outputs": ["{workspaceRoot}/coverage/packages/js-harness-provider"],
"options": {
"jestConfig": "packages/js-harness-provider/jest.config.ts",
"passWithNoTests": true

View File

@ -30,7 +30,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/js-launchdarkly-provider"],
"outputs": ["{workspaceRoot}/coverage/packages/js-launchdarkly-provider"],
"options": {
"jestConfig": "packages/js-launchdarkly-provider/jest.config.ts",
"passWithNoTests": true

View File

@ -30,7 +30,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/js-split-provider"],
"outputs": ["{workspaceRoot}/coverage/packages/js-split-provider"],
"options": {
"jestConfig": "packages/js-split-provider/jest.config.ts",
"passWithNoTests": true

View File

@ -30,7 +30,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/openfeature-extra"],
"outputs": ["{workspaceRoot}/coverage/packages/openfeature-extra"],
"options": {
"jestConfig": "packages/openfeature-extra/jest.config.ts",
"passWithNoTests": true

View File

@ -1,6 +1,7 @@
import { EvaluationDetails, Hook, HookContext, JsonObject } from '@openfeature/js-sdk';
import { validateSync } from 'class-validator';
/* eslint-disable @typescript-eslint/no-explicit-any */
type Class = { new (data: any): any };
/**

View File

@ -66,6 +66,7 @@ export class ProviderService {
if (!appKey) {
throw new Error('"CLOUDBEES_APP_KEY" must be defined.');
} else {
/* eslint-disable @typescript-eslint/no-explicit-any */
return CloudbeesProvider.build(appKey) as any;
}
},

View File

@ -71,7 +71,7 @@
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["coverage/packages/ui"],
"outputs": ["{workspaceRoot}/coverage/packages/ui"],
"options": {
"jestConfig": "packages/ui/jest.config.ts",
"passWithNoTests": true

View File

@ -40,6 +40,7 @@ type ProviderMap = Record<
export class Demos extends Component<
Readonly<Record<string, never>>,
{
/* eslint-disable @typescript-eslint/no-explicit-any */
json: any;
editorOn: boolean;
editorAccess: boolean;

View File

@ -36,6 +36,7 @@ export class CloudbeesWebProvider implements Provider {
name: 'CloudBees web provider',
};
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async initialize(context: EvaluationContext): Promise<void> {
await setup(this.options.key, {
configurationFetchedHandler: this.changedHandler,
@ -47,6 +48,7 @@ export class CloudbeesWebProvider implements Provider {
flagKey: string,
defaultValue: boolean,
context: EvaluationContext,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
logger: Logger
): ResolutionDetails<boolean> {
return {
@ -58,6 +60,7 @@ export class CloudbeesWebProvider implements Provider {
flagKey: string,
defaultValue: string,
context: EvaluationContext,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
logger: Logger
): ResolutionDetails<string> {
return {
@ -69,6 +72,7 @@ export class CloudbeesWebProvider implements Provider {
flagKey: string,
defaultValue: number,
context: EvaluationContext,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
logger: Logger
): ResolutionDetails<number> {
return {
@ -76,12 +80,8 @@ export class CloudbeesWebProvider implements Provider {
};
}
resolveObjectEvaluation<T extends JsonValue>(
flagKey: string,
defaultValue: T,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<T> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger): ResolutionDetails<T> {
throw new Error('not implemented');
}

View File

@ -51,6 +51,7 @@ export class FlagsmithProvider implements Provider {
.init({
environmentID: this.options.environmentID,
realtime: true,
/* eslint-disable @typescript-eslint/no-explicit-any */
traits: context as any,
identity: context.targetingKey || 'anon',
onChange: (oldFlags, params) => {
@ -78,6 +79,7 @@ export class FlagsmithProvider implements Provider {
flagsmith.stopListening();
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveBooleanEvaluation(flagKey: string, _: boolean, context: EvaluationContext): ResolutionDetails<boolean> {
const details = this.evaluate(flagKey);
if (typeof details.value === 'boolean') {
@ -88,6 +90,7 @@ export class FlagsmithProvider implements Provider {
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveStringEvaluation(flagKey: string, _: string, context: EvaluationContext): ResolutionDetails<string> {
const details = this.evaluate(flagKey);
if (typeof details.value === 'string') {
@ -98,6 +101,7 @@ export class FlagsmithProvider implements Provider {
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveNumberEvaluation(flagKey: string, _: number, context: EvaluationContext): ResolutionDetails<number> {
const details = this.evaluate(flagKey);
if (typeof details.value === 'number') {
@ -108,11 +112,8 @@ export class FlagsmithProvider implements Provider {
}
}
resolveObjectEvaluation<U extends JsonValue>(
flagKey: string,
_: U,
context: EvaluationContext
): ResolutionDetails<U> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveObjectEvaluation<U extends JsonValue>(flagKey: string, _: U, context: EvaluationContext): ResolutionDetails<U> {
const details = this.evaluate(flagKey);
if (typeof details.value === 'string') {
// we may want to allow the parsing to be customized.
@ -135,4 +136,4 @@ export class FlagsmithProvider implements Provider {
private getFlagTypeErrorMessage(flagKey: string, value: unknown, expectedType: string) {
return `Flag value ${flagKey} had unexpected type ${typeof value}, expected ${expectedType}.`;
}
}
}

View File

@ -12,7 +12,7 @@ import {
ProviderStatus,
} from '@openfeature/web-sdk';
type ValueTypes = 'boolean' | 'string' | 'number' | 'object';
type ValueTypes = 'boolean' | 'string' | 'number' | 'object';
/**
* NOTE: This is an unofficial provider that was created for demonstration
@ -53,6 +53,7 @@ export class HarnessWebProvider implements Provider {
const oldClient = this._client;
const client = initialize(this.apiKey, { identifier: newContext.targetingKey || 'anon', attributes: newContext });
// needed?
// eslint-disable-next-line @typescript-eslint/no-unused-vars
return new Promise((resolve, reject) => {
client.on(HarnessEvent.READY, () => {
oldClient.close();
@ -67,39 +68,23 @@ export class HarnessWebProvider implements Provider {
return Promise.resolve(this._client.close());
}
resolveBooleanEvaluation(
flagKey: string,
defaultValue: boolean,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<boolean> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext, logger: Logger): ResolutionDetails<boolean> {
return this.resolve(flagKey, defaultValue, 'boolean');
}
resolveStringEvaluation(
flagKey: string,
defaultValue: string,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<string> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext, logger: Logger): ResolutionDetails<string> {
return this.resolve(flagKey, defaultValue, 'string');
}
resolveNumberEvaluation(
flagKey: string,
defaultValue: number,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<number> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext, logger: Logger): ResolutionDetails<number> {
return this.resolve(flagKey, defaultValue, 'number');
}
resolveObjectEvaluation<T extends JsonValue>(
flagKey: string,
defaultValue: T,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<T> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger): ResolutionDetails<T> {
return this.resolve(flagKey, defaultValue, 'object');
}

View File

@ -68,11 +68,8 @@ export class LaunchDarklyProvider implements Provider {
this.client.close();
}
resolveBooleanEvaluation(
flagKey: string,
defaultValue: boolean,
context: EvaluationContext
): ResolutionDetails<boolean> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext): ResolutionDetails<boolean> {
const details = this.evaluateFlag<boolean>(flagKey, defaultValue);
if (typeof details.value === 'boolean') {
return details;
@ -81,11 +78,8 @@ export class LaunchDarklyProvider implements Provider {
}
}
resolveStringEvaluation(
flagKey: string,
defaultValue: string,
context: EvaluationContext
): ResolutionDetails<string> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext): ResolutionDetails<string> {
const details = this.evaluateFlag<string>(flagKey, defaultValue);
if (typeof details.value === 'string') {
return details;
@ -94,11 +88,8 @@ export class LaunchDarklyProvider implements Provider {
}
}
resolveNumberEvaluation(
flagKey: string,
defaultValue: number,
context: EvaluationContext
): ResolutionDetails<number> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext): ResolutionDetails<number> {
const details = this.evaluateFlag<number>(flagKey, defaultValue);
if (typeof details.value === 'number') {
return details;
@ -107,11 +98,8 @@ export class LaunchDarklyProvider implements Provider {
}
}
resolveObjectEvaluation<U extends JsonValue>(
flagKey: string,
defaultValue: U,
context: EvaluationContext
): ResolutionDetails<U> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveObjectEvaluation<U extends JsonValue>(flagKey: string, defaultValue: U, context: EvaluationContext): ResolutionDetails<U> {
const details = this.evaluateFlag<unknown>(flagKey, JSON.stringify(defaultValue));
if (typeof details.value === 'string') {
// we may want to allow the parsing to be customized.

View File

@ -67,12 +67,8 @@ export class SplitWebProvider implements Provider {
this.client.setAttributes(JSON.parse(JSON.stringify(newContext)));
}
resolveBooleanEvaluation(
flagKey: string,
defaultValue: boolean,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<boolean> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext, logger: Logger): ResolutionDetails<boolean> {
const treatment = this.resolve(flagKey);
let value: boolean;
switch (treatment as unknown) {
@ -99,32 +95,20 @@ export class SplitWebProvider implements Provider {
}
return { value };
}
resolveStringEvaluation(
flagKey: string,
defaultValue: string,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<string> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext, logger: Logger): ResolutionDetails<string> {
return {
value: this.resolve(flagKey),
};
}
resolveNumberEvaluation(
flagKey: string,
defaultValue: number,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<number> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext, logger: Logger): ResolutionDetails<number> {
return {
value: parseValidNumber(this.resolve(flagKey)),
};
}
resolveObjectEvaluation<T extends JsonValue>(
flagKey: string,
defaultValue: T,
context: EvaluationContext,
logger: Logger
): ResolutionDetails<T> {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger): ResolutionDetails<T> {
return {
value: parseValidJsonObject(this.resolve(flagKey)),
};

View File

@ -9,7 +9,8 @@
"bump-minor-pre-major": false,
"bump-patch-for-minor-pre-major": false,
"extra-files": [
"docker-compose.yaml"
"docker-compose.yaml",
"config/k8s/end-to-end.yaml"
]
}
},

View File

@ -1,23 +0,0 @@
{
"version": 2,
"projects": {
"app": "packages/app",
"fibonacci": "packages/fibonacci",
"fibonacci-service": "packages/fibonacci-service",
"js-flagsmith-provider": "packages/js-flagsmith-provider",
"js-harness-provider": "packages/js-harness-provider",
"js-launchdarkly-provider": "packages/js-launchdarkly-provider",
"js-split-provider": "packages/js-split-provider",
"openfeature-extra": "packages/openfeature-extra",
"openfeature-propagator": "packages/openfeature-propagator",
"provider": "packages/provider",
"ui": "packages/ui",
"utils": "packages/utils",
"web-cloudbees-provider": "packages/web-cloudbees-provider",
"web-flagsmith-provider": "packages/web-flagsmith-provider",
"web-harness-provider": "packages/web-harness-provider",
"web-launchdarkly-provider": "packages/web-launchdarkly-provider",
"web-split-provider": "packages/web-split-provider"
},
"$schema": "./node_modules/nx/schemas/workspace-schema.json"
}