repluggable-core 1.302.77 → 1.302.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/debug/src/API.d.ts +9 -1
- package/dist/debug/src/extensionSlot.d.ts +13 -2
- package/dist/es/src/API.d.ts +9 -1
- package/dist/es/src/API.d.ts.map +1 -1
- package/dist/es/src/IterableWeakMap.d.ts.map +1 -1
- package/dist/es/src/IterableWeakMap.js.map +1 -1
- package/dist/es/src/appHost.d.ts.map +1 -1
- package/dist/es/src/appHost.js +11 -2
- package/dist/es/src/appHost.js.map +1 -1
- package/dist/es/src/extensionSlot.d.ts +13 -2
- package/dist/es/src/extensionSlot.d.ts.map +1 -1
- package/dist/es/src/extensionSlot.js +21 -9
- package/dist/es/src/extensionSlot.js.map +1 -1
- package/dist/es/src/index.d.ts +1 -1
- package/dist/es/src/index.d.ts.map +1 -1
- package/dist/es/src/index.js.map +1 -1
- package/dist/es/src/throttledStore.d.ts.map +1 -1
- package/dist/es/src/throttledStore.js.map +1 -1
- package/dist/es/test/appHost.spec.js +71 -0
- package/dist/es/test/appHost.spec.js.map +1 -1
- package/dist/es/test/createSignalItemsDataStructure.d.ts +16 -0
- package/dist/es/test/createSignalItemsDataStructure.d.ts.map +1 -0
- package/dist/es/test/createSignalItemsDataStructure.js +54 -0
- package/dist/es/test/createSignalItemsDataStructure.js.map +1 -0
- package/dist/es/test/extensionSlot.spec.d.ts +2 -0
- package/dist/es/test/extensionSlot.spec.d.ts.map +1 -0
- package/dist/es/test/extensionSlot.spec.js +136 -0
- package/dist/es/test/extensionSlot.spec.js.map +1 -0
- package/dist/es/testKit/index.d.ts +1 -0
- package/dist/es/testKit/index.d.ts.map +1 -1
- package/dist/es/testKit/index.js +1 -0
- package/dist/es/testKit/index.js.map +1 -1
- package/dist/src/API.d.ts +9 -1
- package/dist/src/API.d.ts.map +1 -1
- package/dist/src/IterableWeakMap.d.ts.map +1 -1
- package/dist/src/IterableWeakMap.js.map +1 -1
- package/dist/src/appHost.d.ts.map +1 -1
- package/dist/src/appHost.js +11 -2
- package/dist/src/appHost.js.map +1 -1
- package/dist/src/extensionSlot.d.ts +13 -2
- package/dist/src/extensionSlot.d.ts.map +1 -1
- package/dist/src/extensionSlot.js +21 -9
- package/dist/src/extensionSlot.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/throttledStore.d.ts.map +1 -1
- package/dist/src/throttledStore.js.map +1 -1
- package/dist/test/appHost.spec.js +71 -0
- package/dist/test/appHost.spec.js.map +1 -1
- package/dist/test/createSignalItemsDataStructure.d.ts +16 -0
- package/dist/test/createSignalItemsDataStructure.d.ts.map +1 -0
- package/dist/test/createSignalItemsDataStructure.js +58 -0
- package/dist/test/createSignalItemsDataStructure.js.map +1 -0
- package/dist/test/extensionSlot.spec.d.ts +2 -0
- package/dist/test/extensionSlot.spec.d.ts.map +1 -0
- package/dist/test/extensionSlot.spec.js +138 -0
- package/dist/test/extensionSlot.spec.js.map +1 -0
- package/dist/testKit/index.d.ts +1 -0
- package/dist/testKit/index.d.ts.map +1 -1
- package/dist/testKit/index.js +3 -1
- package/dist/testKit/index.js.map +1 -1
- package/package.json +3 -2
- package/src/API.ts +12 -4
- package/src/IterableWeakMap.ts +3 -5
- package/src/__internal.ts +1 -1
- package/src/appHost.ts +10 -2
- package/src/extensionSlot.ts +36 -10
- package/src/index.ts +3 -5
- package/src/throttledStore.ts +9 -15
- package/test/appHost.spec.ts +89 -0
- package/test/createSignalItemsDataStructure.ts +65 -0
- package/test/extensionSlot.spec.ts +176 -0
- package/testKit/index.ts +7 -7
package/dist/testKit/index.js
CHANGED
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.mockObservable = exports.addMockShell = exports.createAppHostAndWaitForLoading = exports.createAppHostWithPacts = exports.getPackagesDependencies = exports.createAppHost = exports.withThrowOnError = exports.withConsoleErrors = exports.emptyLoggerOptions = exports.createShellLogger = void 0;
|
|
29
|
+
exports.mockObservable = exports.addMockShell = exports.createAppHostAndWaitForLoading = exports.createAppHostWithPacts = exports.getPackagesDependencies = exports.createAppHost = exports.createSignalItemsDataStructure = exports.withThrowOnError = exports.withConsoleErrors = exports.emptyLoggerOptions = exports.createShellLogger = void 0;
|
|
30
30
|
const lodash_1 = __importDefault(require("lodash"));
|
|
31
31
|
const index_1 = require("../src/index");
|
|
32
32
|
const loggers_1 = require("../src/loggers");
|
|
@@ -38,6 +38,8 @@ Object.defineProperty(exports, "withConsoleErrors", { enumerable: true, get: fun
|
|
|
38
38
|
var withThrowOnError_1 = require("./withThrowOnError");
|
|
39
39
|
Object.defineProperty(exports, "withThrowOnError", { enumerable: true, get: function () { return withThrowOnError_1.withThrowOnError; } });
|
|
40
40
|
__exportStar(require("./mockPackage"), exports);
|
|
41
|
+
var createSignalItemsDataStructure_1 = require("../test/createSignalItemsDataStructure");
|
|
42
|
+
Object.defineProperty(exports, "createSignalItemsDataStructure", { enumerable: true, get: function () { return createSignalItemsDataStructure_1.createSignalItemsDataStructure; } });
|
|
41
43
|
const createAppHost = (packages, options = emptyLoggerOptions_1.emptyLoggerOptions) => {
|
|
42
44
|
return (0, index_1.createAppHost)(packages, options);
|
|
43
45
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../testKit/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAsB;AAEtB,wCAAwH;AACxH,4CAAkD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../testKit/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "repluggable-core",
|
|
3
|
-
"version": "1.302.
|
|
3
|
+
"version": "1.302.79",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Allows composition of a React-with-Redux application entirely from a list of pluggable packages",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"build-es": "tsc --outDir dist/es --module esNext",
|
|
21
21
|
"build-debug": "tsc --project tsconfig.debug.json",
|
|
22
22
|
"test": "jest --coverage",
|
|
23
|
-
"posttest": "tslint --project ."
|
|
23
|
+
"posttest": "tslint --project .",
|
|
24
|
+
"lintfix": "tslint --fix --project ."
|
|
24
25
|
},
|
|
25
26
|
"dependencies": {
|
|
26
27
|
"lodash": "^4.17.20",
|
package/src/API.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as Redux from 'redux'
|
|
2
2
|
import { ThrottledStore } from './throttledStore'
|
|
3
3
|
import { INTERNAL_DONT_USE_SHELL_GET_APP_HOST } from './__internal'
|
|
4
|
-
|
|
4
|
+
import { CustomCreateExtensionSlot } from './extensionSlot'
|
|
5
5
|
|
|
6
6
|
export interface AnySlotKey {
|
|
7
7
|
readonly name: string
|
|
@@ -333,6 +333,14 @@ export interface APILayer {
|
|
|
333
333
|
name: string
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
+
interface AppHostPlugins {
|
|
337
|
+
extensionSlot?: {
|
|
338
|
+
customCreateExtensionSlot: CustomCreateExtensionSlot
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export {CustomCreateExtensionSlot}
|
|
343
|
+
|
|
336
344
|
export interface AppHostOptions {
|
|
337
345
|
readonly logger?: HostLogger
|
|
338
346
|
readonly monitoring: MonitoringOptions
|
|
@@ -343,6 +351,7 @@ export interface AppHostOptions {
|
|
|
343
351
|
readonly enableReduxDevtoolsExtension?: boolean
|
|
344
352
|
readonly experimentalCyclicMode?: boolean
|
|
345
353
|
readonly shouldScopeReducers?: boolean
|
|
354
|
+
readonly plugins?: AppHostPlugins
|
|
346
355
|
}
|
|
347
356
|
|
|
348
357
|
export interface MemoizeMissHit {
|
|
@@ -526,9 +535,8 @@ export interface PrivateShell extends Shell {
|
|
|
526
535
|
setDependencyAPIs(APIs: AnySlotKey[]): void
|
|
527
536
|
setLifecycleState(enableStore: boolean, enableAPIs: boolean, initCompleted: boolean): void
|
|
528
537
|
getBoundaryAspects(): ShellBoundaryAspect[]
|
|
529
|
-
getHostOptions(): AppHostOptions
|
|
530
|
-
|
|
531
|
-
|
|
538
|
+
getHostOptions(): AppHostOptions
|
|
539
|
+
[INTERNAL_DONT_USE_SHELL_GET_APP_HOST](): AppHost
|
|
532
540
|
}
|
|
533
541
|
|
|
534
542
|
export interface EntryPointsInfo {
|
package/src/IterableWeakMap.ts
CHANGED
|
@@ -81,7 +81,7 @@ export class IterableWeakMap<K extends object = object, V = any> implements Map<
|
|
|
81
81
|
|
|
82
82
|
forEach(callbackfn: (value: V, key: K, map: this) => void, thisArg?: any): void {
|
|
83
83
|
for (const [key, value] of this) {
|
|
84
|
-
callbackfn(value, key, this
|
|
84
|
+
callbackfn(value, key, this)
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -107,17 +107,15 @@ export class IterableWeakMap<K extends object = object, V = any> implements Map<
|
|
|
107
107
|
return this[Symbol.iterator]() as unknown as ReturnType<Map<K, V>['entries']>
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
*keys(): ReturnType<Map<K, V>['keys']>
|
|
110
|
+
*keys(): ReturnType<Map<K, V>['keys']> {
|
|
111
111
|
for (const [key] of this) {
|
|
112
112
|
yield key
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
*values():
|
|
116
|
+
*values(): ReturnType<Map<K, V>['values']> {
|
|
117
117
|
for (const [_, value] of this) {
|
|
118
118
|
yield value
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
|
|
123
|
-
|
package/src/__internal.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This symbol is only for internal use of repluggable mono-repo.
|
|
3
3
|
*/
|
|
4
|
-
export const INTERNAL_DONT_USE_SHELL_GET_APP_HOST: unique symbol = Symbol.for('SHELL_GET_APP_HOST')
|
|
4
|
+
export const INTERNAL_DONT_USE_SHELL_GET_APP_HOST: unique symbol = Symbol.for('SHELL_GET_APP_HOST')
|
package/src/appHost.ts
CHANGED
|
@@ -251,7 +251,10 @@ export function createAppHost(initialEntryPointsOrPackages: EntryPointOrPackage[
|
|
|
251
251
|
const memoized = _.memoize(func, resolver)
|
|
252
252
|
|
|
253
253
|
if (options.monitoring.debugMemoization) {
|
|
254
|
-
Object.defineProperty(memoized, 'name', {
|
|
254
|
+
Object.defineProperty(memoized, 'name', {
|
|
255
|
+
value: `${func.name}_memoized`,
|
|
256
|
+
writable: false
|
|
257
|
+
})
|
|
255
258
|
}
|
|
256
259
|
|
|
257
260
|
if (options.monitoring.disableMonitoring) {
|
|
@@ -560,7 +563,12 @@ miss: ${memoizedWithMissHit.miss}
|
|
|
560
563
|
}
|
|
561
564
|
|
|
562
565
|
function declareSlot<TItem>(key: SlotKey<TItem>, declaringShell?: Shell): ExtensionSlot<TItem> {
|
|
563
|
-
const newSlot = registerSlotOrThrow(key, () =>
|
|
566
|
+
const newSlot = registerSlotOrThrow(key, () =>
|
|
567
|
+
createExtensionSlot(key, host, {
|
|
568
|
+
declaringShell,
|
|
569
|
+
customCreateExtensionSlot: options.plugins?.extensionSlot?.customCreateExtensionSlot
|
|
570
|
+
})
|
|
571
|
+
)
|
|
564
572
|
return newSlot
|
|
565
573
|
}
|
|
566
574
|
|
package/src/extensionSlot.ts
CHANGED
|
@@ -21,18 +21,44 @@ const alwaysTrue = () => true
|
|
|
21
21
|
|
|
22
22
|
type Unsubscribe = () => void
|
|
23
23
|
|
|
24
|
+
interface ItemsDataStructure<T> {
|
|
25
|
+
get(): ExtensionItem<T>[]
|
|
26
|
+
add(item: ExtensionItem<T>): void
|
|
27
|
+
discardBy(predicate: (item: ExtensionItem<T>) => boolean): void
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const itemsDataStructure = <T>(): ItemsDataStructure<T> => {
|
|
31
|
+
let items: ExtensionItem<T>[] = []
|
|
32
|
+
return {
|
|
33
|
+
get: () => items,
|
|
34
|
+
add: (item: ExtensionItem<T>) => {
|
|
35
|
+
items.push(item)
|
|
36
|
+
},
|
|
37
|
+
discardBy: (predicate: (item: ExtensionItem<T>) => boolean) => {
|
|
38
|
+
items = items.filter(predicate)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type CustomCreateExtensionSlot = <T>() => ItemsDataStructure<T>
|
|
44
|
+
|
|
45
|
+
export interface CreateExtensionSlotOptions {
|
|
46
|
+
declaringShell?: Shell
|
|
47
|
+
customCreateExtensionSlot?: CustomCreateExtensionSlot
|
|
48
|
+
}
|
|
49
|
+
|
|
24
50
|
export function createExtensionSlot<T>(
|
|
25
51
|
key: SlotKey<T>,
|
|
26
52
|
host: PrivateAppHost,
|
|
27
|
-
|
|
53
|
+
options?: CreateExtensionSlotOptions
|
|
28
54
|
): PrivateExtensionSlot<T> & AnyExtensionSlot {
|
|
29
|
-
|
|
55
|
+
const items = options?.customCreateExtensionSlot ? options.customCreateExtensionSlot<T>() : itemsDataStructure<T>()
|
|
30
56
|
let subscribers: (() => void)[] = []
|
|
31
57
|
const slotUniqueId = _.uniqueId()
|
|
32
58
|
|
|
33
59
|
return {
|
|
34
60
|
host,
|
|
35
|
-
declaringShell,
|
|
61
|
+
declaringShell: options?.declaringShell,
|
|
36
62
|
name: key.name,
|
|
37
63
|
contribute,
|
|
38
64
|
getItems,
|
|
@@ -43,7 +69,7 @@ export function createExtensionSlot<T>(
|
|
|
43
69
|
}
|
|
44
70
|
|
|
45
71
|
function contribute(fromShell: Shell, item: T, condition?: ContributionPredicate): void {
|
|
46
|
-
items.
|
|
72
|
+
items.add({
|
|
47
73
|
shell: fromShell,
|
|
48
74
|
contribution: item,
|
|
49
75
|
condition: condition || alwaysTrue,
|
|
@@ -53,21 +79,21 @@ export function createExtensionSlot<T>(
|
|
|
53
79
|
}
|
|
54
80
|
|
|
55
81
|
function getItems(forceAll: boolean = false): ExtensionItem<T>[] {
|
|
56
|
-
return forceAll ? items : items.filter(item => item.condition())
|
|
82
|
+
return forceAll ? items.get() : items.get().filter(item => item.condition())
|
|
57
83
|
}
|
|
58
84
|
|
|
59
85
|
function getSingleItem(): ExtensionItem<T> | undefined {
|
|
60
|
-
return items.find(item => item.condition())
|
|
86
|
+
return items.get().find(item => item.condition())
|
|
61
87
|
}
|
|
62
88
|
|
|
63
89
|
function getItemByName(name: string): ExtensionItem<T> | undefined {
|
|
64
|
-
return items.find(item => item.name === name && item.condition())
|
|
90
|
+
return items.get().find(item => item.name === name && item.condition())
|
|
65
91
|
}
|
|
66
92
|
|
|
67
93
|
function discardBy(predicate: ExtensionItemFilter<T>) {
|
|
68
|
-
const originalContributionCount = items.length
|
|
69
|
-
items
|
|
70
|
-
if (items.length !== originalContributionCount) {
|
|
94
|
+
const originalContributionCount = items.get().length
|
|
95
|
+
items.discardBy(v => !predicate(v))
|
|
96
|
+
if (items.get().length !== originalContributionCount) {
|
|
71
97
|
subscribers.forEach(func => func())
|
|
72
98
|
}
|
|
73
99
|
}
|
package/src/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ export {
|
|
|
13
13
|
AnySlotKey,
|
|
14
14
|
SlotKey,
|
|
15
15
|
ReactComponentContributor,
|
|
16
|
+
CustomCreateExtensionSlot,
|
|
16
17
|
ReducersMapObjectContributor,
|
|
17
18
|
EntryPointInterceptor,
|
|
18
19
|
ShellLogger,
|
|
@@ -26,13 +27,11 @@ export {
|
|
|
26
27
|
ScopedStore
|
|
27
28
|
} from './API'
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
30
|
export { ConsoleHostLogger } from './loggers'
|
|
32
31
|
|
|
33
32
|
export { createAppHost, makeLazyEntryPoint, mainViewSlotKey, stateSlotKey } from './appHost'
|
|
34
33
|
|
|
35
|
-
export {AppHostServicesProvider} from './appHostServices'
|
|
34
|
+
export { AppHostServicesProvider } from './appHostServices'
|
|
36
35
|
|
|
37
36
|
export { InstalledShellsSelectors, ShellToggleSet } from './installedShellsState'
|
|
38
37
|
|
|
@@ -42,5 +41,4 @@ export { interceptAnyObject } from './interceptAnyObject'
|
|
|
42
41
|
export { monitorAPI } from './monitorAPI'
|
|
43
42
|
export { hot } from './hot'
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
export {INTERNAL_DONT_USE_SHELL_GET_APP_HOST} from './__internal'
|
|
44
|
+
export { INTERNAL_DONT_USE_SHELL_GET_APP_HOST } from './__internal'
|
package/src/throttledStore.ts
CHANGED
|
@@ -16,18 +16,17 @@ interface AnyShellAction extends AnyAction {
|
|
|
16
16
|
__shellName?: string
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
let id : undefined | NodeJS.Timeout = undefined
|
|
19
|
+
function createTimeOutPublisher(notify: () => void) {
|
|
20
|
+
let id: undefined | NodeJS.Timeout = undefined
|
|
22
21
|
return () => {
|
|
23
22
|
if (id === undefined) {
|
|
24
23
|
id = setTimeout(() => {
|
|
25
24
|
id = undefined
|
|
26
25
|
notify()
|
|
27
|
-
},0)
|
|
26
|
+
}, 0)
|
|
28
27
|
}
|
|
29
28
|
return () => {
|
|
30
|
-
if(id === undefined) {
|
|
29
|
+
if (id === undefined) {
|
|
31
30
|
return
|
|
32
31
|
}
|
|
33
32
|
clearTimeout(id)
|
|
@@ -36,8 +35,8 @@ function createTimeOutPublisher ( notify: () => void) {
|
|
|
36
35
|
}
|
|
37
36
|
}
|
|
38
37
|
|
|
39
|
-
function createAnimationFramePublisher
|
|
40
|
-
let id
|
|
38
|
+
function createAnimationFramePublisher(notify: () => void) {
|
|
39
|
+
let id: undefined | number = undefined
|
|
41
40
|
return () => {
|
|
42
41
|
if (id === undefined) {
|
|
43
42
|
id = requestAnimationFrame(() => {
|
|
@@ -46,7 +45,7 @@ function createAnimationFramePublisher ( notify: () => void) {
|
|
|
46
45
|
})
|
|
47
46
|
}
|
|
48
47
|
return () => {
|
|
49
|
-
if(id === undefined) {
|
|
48
|
+
if (id === undefined) {
|
|
50
49
|
return
|
|
51
50
|
}
|
|
52
51
|
cancelAnimationFrame(id)
|
|
@@ -55,9 +54,6 @@ function createAnimationFramePublisher ( notify: () => void) {
|
|
|
55
54
|
}
|
|
56
55
|
}
|
|
57
56
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
57
|
type Subscriber = () => void
|
|
62
58
|
|
|
63
59
|
export interface StateContribution<TState = {}, TAction extends AnyAction = AnyAction> {
|
|
@@ -252,10 +248,8 @@ export const createThrottledStore = (
|
|
|
252
248
|
notifyAll()
|
|
253
249
|
}
|
|
254
250
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
const notifyAllOnPublish = typeof window === 'undefined' ? createTimeOutPublisher(scheduledNotifyAll) : createAnimationFramePublisher(scheduledNotifyAll)
|
|
251
|
+
const notifyAllOnPublish =
|
|
252
|
+
typeof window === 'undefined' ? createTimeOutPublisher(scheduledNotifyAll) : createAnimationFramePublisher(scheduledNotifyAll)
|
|
259
253
|
|
|
260
254
|
let cancelRender = _.noop
|
|
261
255
|
|
package/test/appHost.spec.ts
CHANGED
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
import { AppHostAPI, AppHostServicesEntryPointName, AppHostServicesProvider } from '../src/appHostServices'
|
|
33
33
|
import { ConsoleHostLogger } from '../src/loggers'
|
|
34
34
|
import { createCircularEntryPoints, createDirectCircularEntryPoints } from './appHost.mock'
|
|
35
|
+
import { createSignalItemsDataStructure } from './createSignalItemsDataStructure'
|
|
35
36
|
|
|
36
37
|
const testHostOptions: AppHostOptions = {
|
|
37
38
|
monitoring: { disableMonitoring: true }
|
|
@@ -1792,4 +1793,92 @@ If the API is intended to be public, it should be declared as "public: true" in
|
|
|
1792
1793
|
)
|
|
1793
1794
|
})
|
|
1794
1795
|
})
|
|
1796
|
+
|
|
1797
|
+
describe('Custom Items Data Structure via AppHost Options (plugins)', () => {
|
|
1798
|
+
it('should use customCreateExtensionSlot from appHostOptions when contributing and removing items', async () => {
|
|
1799
|
+
interface SlotItem {
|
|
1800
|
+
value: string
|
|
1801
|
+
}
|
|
1802
|
+
const slotKey: SlotKey<SlotItem> = { name: 'host_options_signal_slot' }
|
|
1803
|
+
|
|
1804
|
+
interface SlotContributionAPI {
|
|
1805
|
+
contributeItem(fromShell: Shell, item: SlotItem): void
|
|
1806
|
+
getItems(): SlotItem[]
|
|
1807
|
+
}
|
|
1808
|
+
const SlotContributionAPIKey: SlotKey<SlotContributionAPI> = {
|
|
1809
|
+
name: 'SLOT_CONTRIBUTION_API'
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1812
|
+
const itemsSpy = jest.fn()
|
|
1813
|
+
|
|
1814
|
+
const { createDataStructure, effect } = createSignalItemsDataStructure()
|
|
1815
|
+
|
|
1816
|
+
const slotOwnerEntryPoint: EntryPoint = {
|
|
1817
|
+
name: 'SLOT_OWNER_ENTRY_POINT',
|
|
1818
|
+
declareAPIs() {
|
|
1819
|
+
return [SlotContributionAPIKey]
|
|
1820
|
+
},
|
|
1821
|
+
attach(shell: Shell) {
|
|
1822
|
+
const slot = shell.declareSlot(slotKey)
|
|
1823
|
+
shell.contributeAPI(SlotContributionAPIKey, () => ({
|
|
1824
|
+
contributeItem(fromShell: Shell, item: SlotItem) {
|
|
1825
|
+
slot.contribute(fromShell, item)
|
|
1826
|
+
},
|
|
1827
|
+
getItems() {
|
|
1828
|
+
return slot.getItems().map(item => item.contribution)
|
|
1829
|
+
}
|
|
1830
|
+
}))
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
|
|
1834
|
+
const ContributorEntryPoint: EntryPoint = {
|
|
1835
|
+
name: 'CONTRIBUTOR_ENTRY_POINT',
|
|
1836
|
+
getDependencyAPIs() {
|
|
1837
|
+
return [SlotContributionAPIKey, ListenerAPI]
|
|
1838
|
+
},
|
|
1839
|
+
extend(shell: Shell) {
|
|
1840
|
+
const api = shell.getAPI(SlotContributionAPIKey)
|
|
1841
|
+
api.contributeItem(shell, { value: 'item1' })
|
|
1842
|
+
api.contributeItem(shell, { value: 'item2' })
|
|
1843
|
+
}
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
const ListenerAPI: SlotKey<{}> = { name: 'LISTENER_API' }
|
|
1847
|
+
|
|
1848
|
+
const ListenerEntryPoint: EntryPoint = {
|
|
1849
|
+
name: 'LISTENER_ENTRY_POINT',
|
|
1850
|
+
declareAPIs() {
|
|
1851
|
+
return [ListenerAPI]
|
|
1852
|
+
},
|
|
1853
|
+
getDependencyAPIs() {
|
|
1854
|
+
return [SlotContributionAPIKey]
|
|
1855
|
+
},
|
|
1856
|
+
// move to attach to make sure
|
|
1857
|
+
attach(shell: Shell) {
|
|
1858
|
+
const slotContributionAPI = shell.getAPI(SlotContributionAPIKey)
|
|
1859
|
+
effect(() => {
|
|
1860
|
+
slotContributionAPI.getItems()
|
|
1861
|
+
itemsSpy()
|
|
1862
|
+
})
|
|
1863
|
+
// contribute an api to make sure that the contribution depends on it and happens after.
|
|
1864
|
+
shell.contributeAPI(ListenerAPI, () => ({}))
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
const host = createAppHost([slotOwnerEntryPoint, ContributorEntryPoint, ListenerEntryPoint], {
|
|
1869
|
+
monitoring: {},
|
|
1870
|
+
plugins: {
|
|
1871
|
+
extensionSlot: {
|
|
1872
|
+
customCreateExtensionSlot: createDataStructure
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
})
|
|
1876
|
+
|
|
1877
|
+
// first was created and then two time
|
|
1878
|
+
expect(itemsSpy).toBeCalledTimes(3)
|
|
1879
|
+
|
|
1880
|
+
await host.removeShells([ContributorEntryPoint.name])
|
|
1881
|
+
expect(itemsSpy).toBeCalledTimes(4)
|
|
1882
|
+
})
|
|
1883
|
+
})
|
|
1795
1884
|
})
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ExtensionItem } from '../src/API'
|
|
2
|
+
|
|
3
|
+
// Naive signals implementation
|
|
4
|
+
interface Signal<T> {
|
|
5
|
+
get(): T
|
|
6
|
+
set(value: T): void
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let currentEffect: (() => void) | null = null
|
|
10
|
+
|
|
11
|
+
const signal = <T>(initialValue: T): Signal<T> => {
|
|
12
|
+
let value = initialValue
|
|
13
|
+
const subscribers = new Set<() => void>()
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
get: () => {
|
|
17
|
+
if (currentEffect) {
|
|
18
|
+
subscribers.add(currentEffect)
|
|
19
|
+
}
|
|
20
|
+
return value
|
|
21
|
+
},
|
|
22
|
+
set: (newValue: T) => {
|
|
23
|
+
value = newValue
|
|
24
|
+
subscribers.forEach(fn => fn())
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const effect = (fn: () => void): (() => void) => {
|
|
30
|
+
const execute = () => {
|
|
31
|
+
currentEffect = execute
|
|
32
|
+
fn()
|
|
33
|
+
currentEffect = null
|
|
34
|
+
}
|
|
35
|
+
execute()
|
|
36
|
+
return () => {
|
|
37
|
+
currentEffect = null
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const createSignalItemsDataStructure = () => {
|
|
42
|
+
let signalToTrack: Signal<ExtensionItem<any>[]> | null = null
|
|
43
|
+
return {
|
|
44
|
+
createDataStructure: <U>() => {
|
|
45
|
+
const itemsSignal = signal<ExtensionItem<U>[]>([])
|
|
46
|
+
signalToTrack = itemsSignal
|
|
47
|
+
return {
|
|
48
|
+
get: () => itemsSignal.get(),
|
|
49
|
+
add: (item: ExtensionItem<U>) => {
|
|
50
|
+
itemsSignal.set([...itemsSignal.get(), item])
|
|
51
|
+
},
|
|
52
|
+
discardBy: (predicate: (item: ExtensionItem<U>) => boolean) => {
|
|
53
|
+
itemsSignal.set(itemsSignal.get().filter(predicate))
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
getSignalToTrack: () => {
|
|
58
|
+
if (!signalToTrack) {
|
|
59
|
+
throw new Error('Signal to track is not set')
|
|
60
|
+
}
|
|
61
|
+
return signalToTrack
|
|
62
|
+
},
|
|
63
|
+
effect
|
|
64
|
+
}
|
|
65
|
+
}
|