Skip to content

Commit 8643504

Browse files
authored
Merge branch 'release/11.5' into bugfix/vscode-deprecated-eslint-config
2 parents 8b359cd + 1668f71 commit 8643504

File tree

7 files changed

+49
-54
lines changed

7 files changed

+49
-54
lines changed

packages/@o3r/core/src/utils/deep-fill/deep-fill.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@ describe('Deep fill function', () => {
1212
expect(deepFill(base, source)).toEqual(base);
1313
});
1414

15+
it('should support "null" value in source', () => {
16+
const base = { selection: { field: 'test-field' }, a: 'string' };
17+
const source = { selection: null } as any;
18+
19+
expect(deepFill(base, source)).toEqual({ selection: null, a: 'string' });
20+
});
21+
22+
it('should support "null" value in base', () => {
23+
const base = { selection: null, a: 'string' } as any;
24+
const source = { selection: { field: 'test-field' } };
25+
26+
expect(deepFill(base, source)).toEqual({ selection: { field: 'test-field' }, a: 'string' });
27+
});
28+
1529
it('should keep properties from base not present in the source', () => {
1630
const base = Object.freeze({a: 1, b: '2', c: true});
1731
const source = Object.freeze({c: false, a: 3});

packages/@o3r/core/src/utils/deep-fill/deep-fill.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ export function deepFill<T extends { [x: string]: any }>(base: T, source?: { [x:
6666
}
6767
const newObj = {...base};
6868
for (const key in base) {
69-
if (key in source && typeof base[key] === typeof source[key]) {
69+
if (source[key] === null) {
70+
newObj[key] = immutablePrimitive(null, additionalMappers);
71+
} else if (key in source && typeof base[key] === typeof source[key]) {
7072
const keyOfSource = source[key];
71-
newObj[key] = typeof keyOfSource === 'undefined' ? immutablePrimitive(base[key], additionalMappers) : deepFill(base[key], source[key], additionalMappers);
73+
newObj[key] = typeof keyOfSource === 'undefined' ? immutablePrimitive(base[key], additionalMappers) : deepFill(base[key], keyOfSource, additionalMappers);
7274
} else {
7375
newObj[key] = immutablePrimitive(base[key], additionalMappers);
7476
}

packages/@o3r/design/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@
5353
"tslib": "^2.6.2"
5454
},
5555
"peerDependencies": {
56-
"@angular-devkit/architect": "~0.1802.0",
57-
"@angular-devkit/schematics": "~18.2.0",
56+
"@angular-devkit/architect": "~0.1802.0 || >=0.1900.0",
57+
"@angular-devkit/schematics": "~18.2.0 || >=19.0.0",
5858
"@o3r/core": "workspace:^",
5959
"@o3r/schematics": "workspace:^",
6060
"@o3r/styling": "workspace:^",

packages/@o3r/rules-engine/src/engine/helpers/filter-ruleset-event.operator.spec.ts

+18-41
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { BehaviorSubject, of } from 'rxjs';
1+
import { BehaviorSubject, firstValueFrom, of } from 'rxjs';
22
import { Operator } from '../operator/operator.interface';
33
import { operatorList } from '../operator/operators/index';
44
import { RulesetExecutor } from '../ruleset-executor';
5-
import { ActionBlock, Ruleset } from '../structure';
5+
import { Ruleset } from '../structure';
66
import { filterRulesetsEventStream } from './filter-ruleset-event.operator';
77

88
describe('Filter rulesets event operator', () => {
@@ -134,68 +134,45 @@ describe('Filter rulesets event operator', () => {
134134
}, {});
135135

136136
const firstValue = rulesets.reduce<Record<string, RulesetExecutor>>((accRuleset, ruleset) => {
137-
accRuleset[ruleset.id] = new RulesetExecutor(ruleset, {retrieveOrCreateFactStream: () => of(undefined), operators} as any);
137+
accRuleset[ruleset.id] = new RulesetExecutor(ruleset, { retrieveOrCreateFactStream: () => of(undefined), operators } as any);
138138
return accRuleset;
139139
}, {});
140140

141141
const rulesetsMapSubject$ = new BehaviorSubject<Record<string, RulesetExecutor>>(firstValue);
142142

143-
test('should consider only first ruleset', (done) => {
143+
test('should consider only first ruleset', async () => {
144144

145-
rulesetsMapSubject$.pipe(
146-
filterRulesetsEventStream(['ruleset1'])
147-
).subscribe(data => {
148-
expect(data.length).toBe(2);
149-
done();
150-
});
145+
const data = await firstValueFrom(rulesetsMapSubject$.pipe(filterRulesetsEventStream(['ruleset1'])));
146+
expect(data.length).toBe(2);
151147

152148
});
153149

154-
test('should consider only second ruleset', (done) => {
150+
test('should consider only second ruleset', async () => {
155151

156-
rulesetsMapSubject$.pipe(
157-
filterRulesetsEventStream(['ruleset2'])
158-
).subscribe(data => {
159-
expect(data.length).toBe(1);
160-
done();
161-
});
152+
const data = await firstValueFrom(rulesetsMapSubject$.pipe(filterRulesetsEventStream(['ruleset2'])));
153+
expect(data.length).toBe(1);
162154

163155
});
164156

165-
test('should consider all rulesets by not passing any filter', (done) => {
157+
test('should consider all rulesets by not passing any filter', async () => {
166158

167-
rulesetsMapSubject$.pipe(
168-
filterRulesetsEventStream()
169-
).subscribe(data => {
170-
expect(data.length).toBe(3);
171-
done();
172-
});
159+
const data = await firstValueFrom(rulesetsMapSubject$.pipe(filterRulesetsEventStream()));
160+
expect(data.length).toBe(3);
173161

174162
});
175163

176-
test('should consider all rulesets ids passed', (done) => {
164+
test('should consider all rulesets ids passed', async () => {
177165

178-
rulesetsMapSubject$.pipe(
179-
filterRulesetsEventStream(['ruleset1', 'ruleset2'])
180-
).subscribe(data => {
181-
expect(data.length).toBe(3);
182-
done();
183-
});
166+
const data = await firstValueFrom(rulesetsMapSubject$.pipe(filterRulesetsEventStream(['ruleset1', 'ruleset2'])));
167+
expect(data.length).toBe(3);
184168

185169
});
186170

187-
test('should not emit if ruleset id does not match any registered ruleset', async () => {
171+
test('should emit an empty array when no rulesets remain active', async () => {
188172

189-
let emittedActions: ActionBlock[] | undefined;
173+
const data = await firstValueFrom(rulesetsMapSubject$.pipe(filterRulesetsEventStream(['ruleset3'])));
174+
expect(data.length).toBe(0);
190175

191-
rulesetsMapSubject$.pipe(
192-
filterRulesetsEventStream(['ruleset3'])
193-
).subscribe(data => {
194-
emittedActions = data;
195-
});
196-
197-
await jest.advanceTimersByTimeAsync(500);
198-
expect(emittedActions).toBe(undefined);
199176
});
200177

201178
});

packages/@o3r/rules-engine/src/engine/helpers/filter-ruleset-event.operator.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { combineLatest, Observable } from 'rxjs';
1+
import { combineLatest, Observable, of } from 'rxjs';
22
import { map, shareReplay, switchMap } from 'rxjs/operators';
33
import { RulesetExecutor } from '../ruleset-executor';
44

@@ -14,11 +14,13 @@ export function filterRulesetsEventStream(restrictiveRuleSets?: string[]) {
1414
Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.indexOf(ruleSet.id) > -1) :
1515
Object.values(rulesets);
1616

17-
return combineLatest(activeRulesets.map((ruleset) => ruleset.rulesResultsSubject$)).pipe(
18-
map((item) => item.reduce((acc, currentValue) => {
19-
acc.push(...currentValue);
20-
return acc;
21-
}, [])));
17+
return activeRulesets?.length > 0
18+
? combineLatest(activeRulesets.map((ruleset) => ruleset.rulesResultsSubject$)).pipe(
19+
map((item) => item.reduce((acc, currentValue) => {
20+
acc.push(...currentValue);
21+
return acc;
22+
}, [])))
23+
: of([]);
2224
}),
2325
shareReplay(1)
2426
);

packages/@o3r/rules-engine/src/services/runner/rules-engine.runner.service.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ describe('Rules engine service', () => {
273273
next: value => nextFn(value)
274274
});
275275
// should output no actions as all rulesets are on demand
276-
expect(nextFn).not.toHaveBeenCalled();
276+
expect(nextFn).toHaveBeenCalledWith([]);
277277
sub.unsubscribe();
278278

279279
// activate ruleset 1 via his own linked component

yarn.lock

+2-2
Original file line numberDiff line numberDiff line change
@@ -8178,8 +8178,8 @@ __metadata:
81788178
typescript: "npm:~5.5.4"
81798179
zone.js: "npm:~0.14.2"
81808180
peerDependencies:
8181-
"@angular-devkit/architect": ~0.1802.0
8182-
"@angular-devkit/schematics": ~18.2.0
8181+
"@angular-devkit/architect": ~0.1802.0 || >=0.1900.0
8182+
"@angular-devkit/schematics": ~18.2.0 || >=19.0.0
81838183
"@o3r/core": "workspace:^"
81848184
"@o3r/schematics": "workspace:^"
81858185
"@o3r/styling": "workspace:^"

0 commit comments

Comments
 (0)