Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create LaunchDarkly adapter #2

Merged
merged 34 commits into from
Mar 8, 2025
Merged
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
5a0cdd1
Create LaunchDarkly adapter
AndyBitz Dec 12, 2024
57c6df2
Update example to include a LaunchDarkly flag
AndyBitz Dec 12, 2024
3005d5e
Add missing env to turbo
AndyBitz Dec 13, 2024
8dad467
Rename to defaultLaunchDarklyAdapter
AndyBitz Dec 16, 2024
fda8ffe
Add winter sale example for providers
AndyBitz Dec 16, 2024
eaec3e4
Update winter-sale
AndyBitz Dec 16, 2024
7d79635
Document usage in readme
AndyBitz Dec 16, 2024
a61b43e
Allow to set the default value through the adapter
AndyBitz Dec 17, 2024
03aec1e
Fix readme
AndyBitz Dec 17, 2024
5700ea6
Add default value for adapter
AndyBitz Dec 17, 2024
e6ff6fc
Make argument optional
AndyBitz Dec 17, 2024
9af38a7
Add @ts-expect-error
AndyBitz Dec 18, 2024
26b12ae
Add a LaunchDarkly adapter (#10)
dferber90 Jan 24, 2025
0c2079c
remove winter-sale example
dferber90 Jan 24, 2025
d371749
remove defaultValue
dferber90 Jan 24, 2025
1a4bb69
use @flags-sdk/launchdarkly
dferber90 Jan 24, 2025
7a70576
add install steps
dferber90 Jan 24, 2025
4e19b9f
add changeset
dferber90 Jan 24, 2025
723207a
move @vercel/edge-config to peer deps
dferber90 Jan 24, 2025
7c7b392
add more secrets
dferber90 Jan 27, 2025
90de7db
spell out name
dferber90 Jan 27, 2025
0672606
remove unused env var
dferber90 Jan 27, 2025
dd9e48a
rename properties
dferber90 Jan 27, 2025
c1259f6
Merge branch 'main' of github.com:vercel/flags into add-launch-darkly…
AndyBitz Feb 25, 2025
04e2faa
Capitalize
AndyBitz Feb 25, 2025
4ef97cc
Change import
AndyBitz Feb 25, 2025
45a7a31
Fix more imports
AndyBitz Feb 25, 2025
2b647f8
Merge branch 'main' into add-launch-darkly-adapter
dferber90 Mar 8, 2025
c4be1ea
expose ldClient
dferber90 Mar 8, 2025
44c5810
move peerDeps to real deps
dferber90 Mar 8, 2025
1fa4aea
clarify Edge Config requirement in README
dferber90 Mar 8, 2025
ff51af2
remove adapter-launchdarkly snippet
dferber90 Mar 8, 2025
34eee7e
upgrade next@canary
dferber90 Mar 8, 2025
b4fda10
polish @flags-sdk/launchdarkly README
dferber90 Mar 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add a LaunchDarkly adapter (#10)
* add ld example

* reword
dferber90 committed Jan 24, 2025
commit 26b12ae647de8eb6726be5c2e18cc92ae1d1bc8e
71 changes: 71 additions & 0 deletions examples/snippets/app/examples/adapter-launchdarkly/adapter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import type { Adapter } from '@vercel/flags';
import { createClient } from '@vercel/edge-config';
import { init, type LDContext } from '@launchdarkly/vercel-server-sdk';

export type { LDContext };

interface AdapterOptions<ValueType> {
defaultValue?: ValueType;
}

let defaultLaunchDarklyAdapter:
| ReturnType<typeof createLaunchDarklyAdapter>
| undefined;

function assertEnv(name: string): string {
const value = process.env[name];
if (!value) {
throw new Error(
`LaunchDarkly Adapter: Missing ${name} environment variable`,
);
}
return value;
}

export function createLaunchDarklyAdapter({
ldProject,
ldClientSideKey,
edgeConfigConnectionString,
}: {
ldProject: string;
ldClientSideKey: string;
edgeConfigConnectionString: string;
}) {
const edgeConfigClient = createClient(edgeConfigConnectionString);
const ldClient = init(ldClientSideKey, edgeConfigClient);

return function launchDarklyAdapter<ValueType>(
options: AdapterOptions<ValueType> = {},
): Adapter<ValueType, LDContext> {
return {
origin(key) {
return `https://app.launchdarkly.com/projects/${ldProject}/flags/${key}/`;
},
async decide({ key, entities }): Promise<ValueType> {
await ldClient.waitForInitialization();
return ldClient.variation(
key,
entities!,
options.defaultValue,
) as ValueType;
},
};
};
}

export function launchDarkly<ValueType>(
options?: AdapterOptions<ValueType>,
): Adapter<ValueType, LDContext> {
if (!defaultLaunchDarklyAdapter) {
const edgeConfigConnectionString = assertEnv('EDGE_CONFIG');
const ldClientSideKey = assertEnv('LD_CLIENT_SIDE_KEY');
const ldProject = assertEnv('LD_PROJECT_SLUG');
defaultLaunchDarklyAdapter = createLaunchDarklyAdapter({
ldProject,
ldClientSideKey,
edgeConfigConnectionString,
});
}

return defaultLaunchDarklyAdapter(options);
}
12 changes: 12 additions & 0 deletions examples/snippets/app/examples/adapter-launchdarkly/flags.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { flag } from '@vercel/flags/next';
import { launchDarkly } from './adapter';

export const summerSaleFlag = flag({
key: 'summer-sale',
defaultValue: false,
description: 'Whether the summer sale is active',
adapter: launchDarkly(),
async identify() {
return { key: 'uid1' };
},
});
6 changes: 6 additions & 0 deletions examples/snippets/app/examples/adapter-launchdarkly/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { summerSaleFlag } from './flags';

export default async function Page() {
const summerSale = await summerSaleFlag();
return <div>Flag is on {summerSale ? 'Yes' : 'No'}</div>;
}
1 change: 1 addition & 0 deletions examples/snippets/package.json
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
"start": "next start"
},
"dependencies": {
"@launchdarkly/vercel-server-sdk": "1.3.21",
"@radix-ui/react-dialog": "1.1.2",
"@radix-ui/react-separator": "1.1.0",
"@radix-ui/react-slot": "1.1.0",
7 changes: 5 additions & 2 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.