Skip to content

Commit b42664f

Browse files
authored
improve lifecycle management of shared data
1 parent bbd82de commit b42664f

File tree

16 files changed

+433
-106
lines changed

16 files changed

+433
-106
lines changed

bootstrap/src/saga/__tests__/context.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ describe("context", () => {
111111
expect(stepSetShared.done).toEqual(false);
112112
expect(stepSetShared.value.payload.action.type).toEqual(constants.SET_SHARED);
113113
expect(stepSetShared.value.payload.action.payload.data).toEqual(ctx.environment);
114-
expect(stepSetShared.value.payload.action.payload.module).not.toBeDefined();
114+
expect(stepSetShared.value.payload.action.payload.module).toBeUndefined();
115115

116116
const stepEntrypointModule = gen.next();
117117

bootstrap/src/selector/__test__/index.test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe("selector", () => {
3636
it("should return a structure supporting getting i18n keys", () => {
3737
const messages = selectors.getI18nMessages(state);
3838
expect(messages.foo).toEqual(state.env.messages["en-US"].foo);
39-
expect(messages.miss).not.toBeDefined();
39+
expect(messages.miss).toBeUndefined();
4040
});
4141

4242
it("should fallback on DEFAULT_LOCALE when it is missing in current locale", () => {
@@ -48,7 +48,7 @@ describe("selector", () => {
4848
it("should work properly when no messages exist at all", () => {
4949
delete state.env.messages;
5050
const messages = selectors.getI18nMessages(state);
51-
expect(messages.foo).not.toBeDefined();
51+
expect(messages.foo).toBeUndefined();
5252
});
5353
});
5454
});

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@lastui/rocker",
3-
"version": "0.20.0",
3+
"version": "0.20.1",
44
"license": "Apache-2.0",
55
"author": "[email protected]",
66
"homepage": "https://github.com/lastui/rocker#readme",

platform/src/__tests__/register.test.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ describe("register", () => {
4444

4545
register({ BUILD_ID: 1 });
4646
expect(spy).toHaveBeenCalledWith(`implicit attribute "BUILD_ID" provided in registerModule is not string`);
47-
expect(top.__SANDBOX_SCOPE__.BUILD_ID).not.toBeDefined();
47+
expect(top.__SANDBOX_SCOPE__.BUILD_ID).toBeUndefined();
4848
});
4949

5050
it("accepts string", () => {
@@ -60,7 +60,7 @@ describe("register", () => {
6060
const scope = { component: 1 };
6161

6262
register(scope);
63-
expect(top.__SANDBOX_SCOPE__.component).not.toBeDefined();
63+
expect(top.__SANDBOX_SCOPE__.component).toBeUndefined();
6464
expect(spy).toHaveBeenLastCalledWith(`attribute "component" provided in registerModule is not function or React.Component`);
6565
});
6666

@@ -88,7 +88,7 @@ describe("register", () => {
8888
const scope = { fallback: 1 };
8989

9090
register(scope);
91-
expect(top.__SANDBOX_SCOPE__.fallback).not.toBeDefined();
91+
expect(top.__SANDBOX_SCOPE__.fallback).toBeUndefined();
9292
expect(spy).toHaveBeenLastCalledWith(`attribute "fallback" provided in registerModule is not function or React.Component`);
9393
});
9494

@@ -115,7 +115,7 @@ describe("register", () => {
115115
spy.mockImplementation(() => {});
116116

117117
register({ reducers: 1 });
118-
expect(top.__SANDBOX_SCOPE__.reducers).not.toBeDefined();
118+
expect(top.__SANDBOX_SCOPE__.reducers).toBeUndefined();
119119
expect(spy).toHaveBeenLastCalledWith(`attribute \"reducers\" provided in registerModule is not plain object`);
120120
});
121121

@@ -135,7 +135,7 @@ describe("register", () => {
135135
const scope = { middleware: 1 };
136136

137137
register(scope);
138-
expect(top.__SANDBOX_SCOPE__.middleware).not.toBeDefined();
138+
expect(top.__SANDBOX_SCOPE__.middleware).toBeUndefined();
139139
expect(spy).toHaveBeenLastCalledWith(
140140
`attribute \"middleware\" provided in registerModule is not function or async function`,
141141
);
@@ -159,7 +159,7 @@ describe("register", () => {
159159

160160
const middleware = function* () {};
161161
register({ middleware });
162-
expect(top.__SANDBOX_SCOPE__.middleware).not.toBeDefined();
162+
expect(top.__SANDBOX_SCOPE__.middleware).toBeUndefined();
163163
expect(spy).toHaveBeenLastCalledWith(
164164
`attribute \"middleware\" provided in registerModule is not function or async function`,
165165
);
@@ -171,7 +171,7 @@ describe("register", () => {
171171

172172
const middleware = async function* () {};
173173
register({ middleware });
174-
expect(top.__SANDBOX_SCOPE__.middleware).not.toBeDefined();
174+
expect(top.__SANDBOX_SCOPE__.middleware).toBeUndefined();
175175
expect(spy).toHaveBeenLastCalledWith(
176176
`attribute \"middleware\" provided in registerModule is not function or async function`,
177177
);
@@ -185,7 +185,7 @@ describe("register", () => {
185185
const scope = { saga: 1 };
186186

187187
register(scope);
188-
expect(top.__SANDBOX_SCOPE__.saga).not.toBeDefined();
188+
expect(top.__SANDBOX_SCOPE__.saga).toBeUndefined();
189189
expect(spy).toHaveBeenLastCalledWith(
190190
`attribute \"saga\" provided in registerModule is not generator function or async generator function`,
191191
);
@@ -197,7 +197,7 @@ describe("register", () => {
197197

198198
const saga = function () {};
199199
register({ saga });
200-
expect(top.__SANDBOX_SCOPE__.saga).not.toBeDefined();
200+
expect(top.__SANDBOX_SCOPE__.saga).toBeUndefined();
201201
expect(spy).toHaveBeenLastCalledWith(
202202
`attribute \"saga\" provided in registerModule is not generator function or async generator function`,
203203
);
@@ -209,7 +209,7 @@ describe("register", () => {
209209

210210
const saga = async function () {};
211211
register({ saga });
212-
expect(top.__SANDBOX_SCOPE__.saga).not.toBeDefined();
212+
expect(top.__SANDBOX_SCOPE__.saga).toBeUndefined();
213213
expect(spy).toHaveBeenLastCalledWith(
214214
`attribute \"saga\" provided in registerModule is not generator function or async generator function`,
215215
);
@@ -235,7 +235,7 @@ describe("register", () => {
235235
const scope = { props: 1 };
236236

237237
register(scope);
238-
expect(top.__SANDBOX_SCOPE__.props).not.toBeDefined();
238+
expect(top.__SANDBOX_SCOPE__.props).toBeUndefined();
239239
expect(spy).toHaveBeenLastCalledWith(`attribute \"props\" provided in registerModule is not plain object`);
240240
});
241241

platform/src/component/__tests__/Module.test.jsx

+7
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ describe("<Module />", () => {
6060
"my-feature": true,
6161
},
6262
},
63+
shared: {},
6364
});
6465

6566
const { unmount } = render(withRedux(<Module name="my-feature" />, store));
@@ -76,6 +77,7 @@ describe("<Module />", () => {
7677
"my-feature": true,
7778
},
7879
},
80+
shared: {},
7981
});
8082

8183
const { unmount } = render(
@@ -100,6 +102,7 @@ describe("<Module />", () => {
100102
"my-feature": false,
101103
},
102104
},
105+
shared: {},
103106
});
104107

105108
const { unmount } = render(
@@ -123,6 +126,7 @@ describe("<Module />", () => {
123126
"my-feature-without-view": true,
124127
},
125128
},
129+
shared: {},
126130
});
127131

128132
const { unmount } = render(
@@ -146,6 +150,7 @@ describe("<Module />", () => {
146150
"my-loading-feature": false,
147151
},
148152
},
153+
shared: {},
149154
});
150155

151156
const { unmount } = render(
@@ -168,6 +173,7 @@ describe("<Module />", () => {
168173
env: {
169174
readyModules: {},
170175
},
176+
shared: {},
171177
});
172178

173179
const { unmount } = render(
@@ -189,6 +195,7 @@ describe("<Module />", () => {
189195
env: {
190196
readyModules: {},
191197
},
198+
shared: {},
192199
});
193200

194201
const { unmount } = render(

platform/src/kernel/middleware/__tests__/loader.test.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ describe("loader middleware", () => {
5858
type: "non-handled",
5959
};
6060
const loaderMiddleware = createLoaderMiddleware();
61-
const store = configureStore([loaderMiddleware])({});
61+
const store = configureStore([loaderMiddleware])({ env: {}, shared: {} });
6262
store.dispatch(action);
6363
expect(store.getActions()).toEqual([action]);
6464
});
@@ -89,7 +89,7 @@ describe("loader middleware", () => {
8989
describe("SET_AVAILABLE_MODULES", () => {
9090
it("calls setAvailableModules on loader", async () => {
9191
const loaderMiddleware = createLoaderMiddleware();
92-
const store = configureStore([loaderMiddleware])({});
92+
const store = configureStore([loaderMiddleware])({ env: {}, shared: {} });
9393
const action = {
9494
type: constants.SET_AVAILABLE_MODULES,
9595
payload: {
@@ -106,7 +106,7 @@ describe("loader middleware", () => {
106106

107107
it("marks availableLocales", async () => {
108108
const loaderMiddleware = createLoaderMiddleware();
109-
const store = configureStore([loaderMiddleware])({});
109+
const store = configureStore([loaderMiddleware])({ env: {}, shared: {} });
110110
const action = {
111111
type: constants.SET_AVAILABLE_MODULES,
112112
payload: {
@@ -129,7 +129,7 @@ describe("loader middleware", () => {
129129
describe("SET_ENTRYPOINT_MODULE", () => {
130130
it("calls loadModule on loader", async () => {
131131
const loaderMiddleware = createLoaderMiddleware();
132-
const store = configureStore([loaderMiddleware])({});
132+
const store = configureStore([loaderMiddleware])({ env: {}, shared: {} });
133133
const action = {
134134
type: constants.SET_ENTRYPOINT_MODULE,
135135
payload: {
@@ -164,6 +164,7 @@ describe("loader middleware", () => {
164164
env: {
165165
language: null,
166166
},
167+
shared: {},
167168
});
168169

169170
const action = {
@@ -197,6 +198,7 @@ describe("loader middleware", () => {
197198
env: {
198199
language: "en—US",
199200
},
201+
shared: {},
200202
});
201203

202204
const action = {
@@ -230,6 +232,7 @@ describe("loader middleware", () => {
230232
env: {
231233
language: "en—US",
232234
},
235+
shared: {},
233236
});
234237

235238
const setupAvailableLocalesAction = {
@@ -280,6 +283,7 @@ describe("loader middleware", () => {
280283
env: {
281284
language: "en-US",
282285
},
286+
shared: {},
283287
});
284288

285289
const setupAvailableLocalesAction = {
@@ -327,6 +331,7 @@ describe("loader middleware", () => {
327331
env: {
328332
language: "en-US",
329333
},
334+
shared: {},
330335
});
331336

332337
const setupAvailableLocalesAction = {
@@ -346,6 +351,7 @@ describe("loader middleware", () => {
346351
payload: {
347352
module: "my-feature",
348353
},
354+
shared: {},
349355
};
350356

351357
store.dispatch(action);
@@ -374,6 +380,7 @@ describe("loader middleware", () => {
374380
env: {
375381
language: "en-US",
376382
},
383+
shared: {},
377384
});
378385

379386
const setupAvailableLocalesAction = {
@@ -441,6 +448,7 @@ describe("loader middleware", () => {
441448
env: {
442449
language: "en-US",
443450
},
451+
shared: {},
444452
});
445453

446454
const setupAvailableLocalesAction = {
@@ -524,6 +532,7 @@ describe("loader middleware", () => {
524532
env: {
525533
language: "en-US",
526534
},
535+
shared: {},
527536
});
528537

529538
const setupAvailableLocalesAction = {
@@ -621,7 +630,7 @@ describe("loader middleware", () => {
621630
describe("MODULE_UNLOADED", () => {
622631
it("purges availableLocales", () => {
623632
const loaderMiddleware = createLoaderMiddleware();
624-
const store = configureStore([loaderMiddleware])({});
633+
const store = configureStore([loaderMiddleware])({ env: {}, shared: {} });
625634
const action = {
626635
type: constants.MODULE_UNLOADED,
627636
payload: {

platform/src/kernel/middleware/loader.js

+19-11
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { downloadAsset } from "../registry/assets";
44
import loader from "../registry/loader";
55

66
const createLoaderMiddleware = () => {
7-
let availableLocales = {};
7+
const availableLocales = {};
88
const loadedLocales = {};
99

1010
const downloadBatchLocales = async (names, language) => {
@@ -13,18 +13,22 @@ const createLoaderMiddleware = () => {
1313
if (!loadedLocales[name]) {
1414
loadedLocales[name] = {};
1515
}
16-
if (loadedLocales[name][language]) {
16+
if (language in loadedLocales[name]) {
1717
continue;
1818
}
1919
loadedLocales[name][language] = true;
20-
21-
const uri = availableLocales[name] && availableLocales[name][language];
20+
const uri = name in availableLocales && availableLocales[name][language];
2221
if (!uri) {
2322
continue;
2423
}
2524
const promise = downloadAsset(uri)
2625
.then((data) => data.json())
27-
.then((data) => Object.keys(data).length > 0 && { module: name, data });
26+
.then((data) => {
27+
for (const _prop in data) {
28+
return { module: name, data };
29+
}
30+
return null;
31+
});
2832
scheduledAssets.push(promise);
2933
}
3034

@@ -46,10 +50,17 @@ const createLoaderMiddleware = () => {
4650
try {
4751
switch (action.type) {
4852
case constants.SET_AVAILABLE_MODULES: {
49-
availableLocales = {};
53+
/* istanbul ignore next */
54+
for (const key in availableLocales) {
55+
delete availableLocales[key];
56+
}
5057
for (const item of action.payload.modules) {
51-
if (item.locales && Object.keys(item.locales) !== 0) {
58+
if (!item.locales) {
59+
continue;
60+
}
61+
for (const _prop in item.locales) {
5262
availableLocales[item.name] = item.locales;
63+
break;
5364
}
5465
}
5566
return loader.setAvailableModules(action.payload.modules).then(() => next(action));
@@ -100,10 +111,7 @@ const createLoaderMiddleware = () => {
100111
}
101112

102113
case constants.MODULE_UNLOADED: {
103-
const name = action.payload.module;
104-
if (loadedLocales[name]) {
105-
delete loadedLocales[name];
106-
}
114+
delete loadedLocales[action.payload.module];
107115
return next(action);
108116
}
109117

0 commit comments

Comments
 (0)