Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
e6a4d76
feat: add FDv2 types, refined validators, and DataManager interface e…
kinyoklion Mar 19, 2026
a4d5ad0
feat: add FlagManager.applyChanges for FDv2 full/partial/none semantics
kinyoklion Mar 19, 2026
cb9d6b6
feat: add SourceFactoryProvider for declarative data source creation
kinyoklion Mar 19, 2026
c33790c
Merge branch 'rlamb/fdv2-flag-manager-apply-changes' into rlamb/fdv2-…
kinyoklion Mar 19, 2026
455e057
feat: add FDv2DataManagerBase for mode switching and data source life…
kinyoklion Mar 19, 2026
20f3d28
Merge branch 'main' into rlamb/fdv2-source-factory-provider
kinyoklion Mar 20, 2026
97568e4
fix: address PR review feedback on SourceFactoryProvider
kinyoklion Mar 20, 2026
25121e3
Merge branch 'rlamb/fdv2-source-factory-provider' into rlamb/fdv2-dat…
kinyoklion Mar 20, 2026
b1ca6c1
fix: update FDv2DataManagerBase for restructured SourceFactoryContext
kinyoklion Mar 20, 2026
de39213
fix: increase bundle size limits for common and sdk-client packages
kinyoklion Mar 20, 2026
d9711c4
Merge branch 'rlamb/fdv2-source-factory-provider' into rlamb/fdv2-dat…
kinyoklion Mar 20, 2026
a343b8b
fix: add applyChanges to FlagUpdater/FlagStore to bypass FDv1 version…
kinyoklion Mar 20, 2026
a076479
Merge branch 'rlamb/fdv2-flag-manager-apply-changes' into rlamb/fdv2-…
kinyoklion Mar 20, 2026
95dabe4
Merge remote-tracking branch 'origin/main' into rlamb/fdv2-flag-manag…
kinyoklion Mar 20, 2026
83cb188
Merge remote-tracking branch 'origin/main' into rlamb/fdv2-data-manag…
kinyoklion Mar 20, 2026
80852ff
fix: increase browser SDK bundle size limit
kinyoklion Mar 20, 2026
01bb153
Merge branch 'rlamb/fdv2-flag-manager-apply-changes' into rlamb/fdv2-…
kinyoklion Mar 20, 2026
eeea559
fix: delegate full applyChanges to init to avoid duplication
kinyoklion Mar 20, 2026
806b12a
Merge branch 'rlamb/fdv2-flag-manager-apply-changes' into rlamb/fdv2-…
kinyoklion Mar 20, 2026
b5e5dc3
fix: unify applyChanges at FlagStore layer for future FDv1 removal
kinyoklion Mar 20, 2026
fece197
Merge branch 'rlamb/fdv2-flag-manager-apply-changes' into rlamb/fdv2-…
kinyoklion Mar 20, 2026
a78c26e
Merge remote-tracking branch 'origin/main' into rlamb/fdv2-data-manag…
kinyoklion Mar 20, 2026
ecc301d
feat: refactor mode switching to discriminated union with foregroundC…
kinyoklion Mar 23, 2026
76f795c
fix: add ManualModeSwitching to LDClientDataSystemOptions union type
kinyoklion Mar 23, 2026
a39bdb4
fix: rename initialForegroundMode to foregroundMode
kinyoklion Mar 24, 2026
a9ac466
fix: simplify dataCallback by using ?? [] for transfer-none updates
kinyoklion Mar 24, 2026
659ff40
fix: unconditionally assign selector from payload state
kinyoklion Mar 24, 2026
63a0ac9
fix: remove unnecessary as any cast for bootstrap check
kinyoklion Mar 25, 2026
ad9a304
fix: re-check closed state after await in identify to prevent resourc…
kinyoklion Mar 25, 2026
68b4baf
fix: update doc comments to match discriminated union API
kinyoklion Mar 25, 2026
5233983
feat: add setConnectionMode as top-level override bypassing transitio…
kinyoklion Mar 25, 2026
f91a28f
fix: add .catch to flagManager.applyChanges to prevent unhandled reje…
kinyoklion Mar 25, 2026
0786b64
feat: add custom is predicate to validatorOf for discriminated unions
kinyoklion Mar 25, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ describe('dataSystem validation', () => {
getImplementationHooks: () => [],
credentialType: 'clientSideId',
dataSystemDefaults: {
initialConnectionMode: 'one-shot',
foregroundConnectionMode: 'one-shot',
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is now the platform specific default, and not the same thing as the initial connection mode.

automaticModeSwitching: false,
},
},
Expand All @@ -203,61 +203,69 @@ describe('dataSystem validation', () => {
getImplementationHooks: () => [],
credentialType: 'clientSideId',
dataSystemDefaults: {
initialConnectionMode: 'one-shot',
foregroundConnectionMode: 'one-shot',
automaticModeSwitching: false,
},
},
);
expect(config.dataSystem).toBeDefined();
expect(config.dataSystem!.initialConnectionMode).toBe('one-shot');
expect(config.dataSystem!.automaticModeSwitching).toBe(false);
});

it('validates dataSystem with user overrides applied over platform defaults', () => {
const config = new ConfigurationImpl(
// @ts-ignore dataSystem is @internal
{ dataSystem: { initialConnectionMode: 'polling' } },
{
dataSystem: {
automaticModeSwitching: { type: 'manual', initialConnectionMode: 'polling' },
},
},
{
getImplementationHooks: () => [],
credentialType: 'mobileKey',
dataSystemDefaults: {
initialConnectionMode: 'streaming',
foregroundConnectionMode: 'streaming',
backgroundConnectionMode: 'background',
automaticModeSwitching: true,
},
},
);
expect(config.dataSystem).toBeDefined();
expect(config.dataSystem!.initialConnectionMode).toBe('polling');
expect(config.dataSystem!.automaticModeSwitching).toEqual({
type: 'manual',
initialConnectionMode: 'polling',
});
expect(config.dataSystem!.backgroundConnectionMode).toBe('background');
expect(config.dataSystem!.automaticModeSwitching).toBe(true);
});

it('warns and falls back to default for invalid dataSystem sub-fields', () => {
console.error = jest.fn();
const config = new ConfigurationImpl(
// @ts-ignore dataSystem is @internal
{ dataSystem: { initialConnectionMode: 'turbo' } },
{ dataSystem: { backgroundConnectionMode: 'turbo' } },
{
getImplementationHooks: () => [],
credentialType: 'clientSideId',
dataSystemDefaults: {
initialConnectionMode: 'one-shot',
foregroundConnectionMode: 'one-shot',
automaticModeSwitching: false,
},
},
);
expect(config.dataSystem).toBeDefined();
expect(config.dataSystem!.initialConnectionMode).toBe('one-shot');
expect(console.error).toHaveBeenCalledWith(
expect.stringContaining('dataSystem.initialConnectionMode'),
expect.stringContaining('dataSystem.backgroundConnectionMode'),
);
});

it('does not deep-validate dataSystem when dataSystemDefaults is not provided', () => {
const config = new ConfigurationImpl(
// @ts-ignore dataSystem is @internal
{ dataSystem: { initialConnectionMode: 'polling' } },
{
dataSystem: {
automaticModeSwitching: { type: 'manual', initialConnectionMode: 'polling' },
},
},
{
getImplementationHooks: () => [],
credentialType: 'clientSideId',
Expand All @@ -276,7 +284,7 @@ describe('dataSystem validation', () => {
getImplementationHooks: () => [],
credentialType: 'clientSideId',
dataSystemDefaults: {
initialConnectionMode: 'one-shot',
foregroundConnectionMode: 'one-shot',
automaticModeSwitching: false,
},
},
Expand All @@ -288,18 +296,23 @@ describe('dataSystem validation', () => {
it('validates automaticModeSwitching as a granular config object', () => {
const config = new ConfigurationImpl(
// @ts-ignore dataSystem is @internal
{ dataSystem: { automaticModeSwitching: { lifecycle: true, network: false } } },
{
dataSystem: {
automaticModeSwitching: { type: 'automatic', lifecycle: true, network: false },
},
},
{
getImplementationHooks: () => [],
credentialType: 'mobileKey',
dataSystemDefaults: {
initialConnectionMode: 'streaming',
foregroundConnectionMode: 'streaming',
automaticModeSwitching: true,
},
},
);
expect(config.dataSystem).toBeDefined();
expect(config.dataSystem!.automaticModeSwitching).toEqual({
type: 'automatic',
lifecycle: true,
network: false,
});
Expand All @@ -312,7 +325,7 @@ describe('dataSystem validation', () => {
getImplementationHooks: () => [],
credentialType: 'clientSideId',
dataSystemDefaults: {
initialConnectionMode: 'one-shot',
foregroundConnectionMode: 'one-shot',
automaticModeSwitching: false,
},
},
Expand Down
Loading
Loading