@atlassian/clientside-extensions 2.4.0-e0cce94-kuewz5ow
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/LICENSE.txt +30 -0
- package/README.md +7 -0
- package/dist/cjs/AbstractExtension.js +22 -0
- package/dist/cjs/AbstractExtension.js.map +1 -0
- package/dist/cjs/AsyncPanelExtension.js +19 -0
- package/dist/cjs/AsyncPanelExtension.js.map +1 -0
- package/dist/cjs/AsyncPanelExtension.test.js +121 -0
- package/dist/cjs/AsyncPanelExtension.test.js.map +1 -0
- package/dist/cjs/ButtonExtension.js +13 -0
- package/dist/cjs/ButtonExtension.js.map +1 -0
- package/dist/cjs/ButtonExtension.test.js +49 -0
- package/dist/cjs/ButtonExtension.test.js.map +1 -0
- package/dist/cjs/LinkExtension.js +14 -0
- package/dist/cjs/LinkExtension.js.map +1 -0
- package/dist/cjs/LinkExtension.test.js +49 -0
- package/dist/cjs/LinkExtension.test.js.map +1 -0
- package/dist/cjs/ModalExtension.js +121 -0
- package/dist/cjs/ModalExtension.js.map +1 -0
- package/dist/cjs/ModalExtension.test.js +121 -0
- package/dist/cjs/ModalExtension.test.js.map +1 -0
- package/dist/cjs/PageExtension.js +13 -0
- package/dist/cjs/PageExtension.js.map +1 -0
- package/dist/cjs/PageExtension.test.js +34 -0
- package/dist/cjs/PageExtension.test.js.map +1 -0
- package/dist/cjs/PanelExtension.js +36 -0
- package/dist/cjs/PanelExtension.js.map +1 -0
- package/dist/cjs/PanelExtension.test.js +112 -0
- package/dist/cjs/PanelExtension.test.js.map +1 -0
- package/dist/cjs/SectionExtension.js +13 -0
- package/dist/cjs/SectionExtension.js.map +1 -0
- package/dist/cjs/SectionExtension.test.js +46 -0
- package/dist/cjs/SectionExtension.test.js.map +1 -0
- package/dist/cjs/extension-type.js +15 -0
- package/dist/cjs/extension-type.js.map +1 -0
- package/dist/cjs/index.js +21 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/AbstractExtension.js +18 -0
- package/dist/esm/AbstractExtension.js.map +1 -0
- package/dist/esm/AsyncPanelExtension.js +16 -0
- package/dist/esm/AsyncPanelExtension.js.map +1 -0
- package/dist/esm/AsyncPanelExtension.test.js +118 -0
- package/dist/esm/AsyncPanelExtension.test.js.map +1 -0
- package/dist/esm/ButtonExtension.js +10 -0
- package/dist/esm/ButtonExtension.js.map +1 -0
- package/dist/esm/ButtonExtension.test.js +46 -0
- package/dist/esm/ButtonExtension.test.js.map +1 -0
- package/dist/esm/LinkExtension.js +11 -0
- package/dist/esm/LinkExtension.js.map +1 -0
- package/dist/esm/LinkExtension.test.js +46 -0
- package/dist/esm/LinkExtension.test.js.map +1 -0
- package/dist/esm/ModalExtension.js +117 -0
- package/dist/esm/ModalExtension.js.map +1 -0
- package/dist/esm/ModalExtension.test.js +118 -0
- package/dist/esm/ModalExtension.test.js.map +1 -0
- package/dist/esm/PageExtension.js +10 -0
- package/dist/esm/PageExtension.js.map +1 -0
- package/dist/esm/PageExtension.test.js +31 -0
- package/dist/esm/PageExtension.test.js.map +1 -0
- package/dist/esm/PanelExtension.js +32 -0
- package/dist/esm/PanelExtension.js.map +1 -0
- package/dist/esm/PanelExtension.test.js +109 -0
- package/dist/esm/PanelExtension.test.js.map +1 -0
- package/dist/esm/SectionExtension.js +10 -0
- package/dist/esm/SectionExtension.js.map +1 -0
- package/dist/esm/SectionExtension.test.js +43 -0
- package/dist/esm/SectionExtension.test.js.map +1 -0
- package/dist/esm/extension-type.js +12 -0
- package/dist/esm/extension-type.js.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/AbstractExtension.d.ts +11 -0
- package/dist/types/AbstractExtension.d.ts.map +1 -0
- package/dist/types/AsyncPanelExtension.d.ts +18 -0
- package/dist/types/AsyncPanelExtension.d.ts.map +1 -0
- package/dist/types/AsyncPanelExtension.test.d.ts +2 -0
- package/dist/types/AsyncPanelExtension.test.d.ts.map +1 -0
- package/dist/types/ButtonExtension.d.ts +10 -0
- package/dist/types/ButtonExtension.d.ts.map +1 -0
- package/dist/types/ButtonExtension.test.d.ts +2 -0
- package/dist/types/ButtonExtension.test.d.ts.map +1 -0
- package/dist/types/LinkExtension.d.ts +11 -0
- package/dist/types/LinkExtension.d.ts.map +1 -0
- package/dist/types/LinkExtension.test.d.ts +2 -0
- package/dist/types/LinkExtension.test.d.ts.map +1 -0
- package/dist/types/ModalExtension.d.ts +60 -0
- package/dist/types/ModalExtension.d.ts.map +1 -0
- package/dist/types/ModalExtension.test.d.ts +2 -0
- package/dist/types/ModalExtension.test.d.ts.map +1 -0
- package/dist/types/PageExtension.d.ts +11 -0
- package/dist/types/PageExtension.d.ts.map +1 -0
- package/dist/types/PageExtension.test.d.ts +5 -0
- package/dist/types/PageExtension.test.d.ts.map +1 -0
- package/dist/types/PanelExtension.d.ts +19 -0
- package/dist/types/PanelExtension.d.ts.map +1 -0
- package/dist/types/PanelExtension.test.d.ts +2 -0
- package/dist/types/PanelExtension.test.d.ts.map +1 -0
- package/dist/types/SectionExtension.d.ts +8 -0
- package/dist/types/SectionExtension.d.ts.map +1 -0
- package/dist/types/SectionExtension.test.d.ts +2 -0
- package/dist/types/SectionExtension.test.d.ts.map +1 -0
- package/dist/types/extension-type.d.ts +10 -0
- package/dist/types/extension-type.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/lib/AbstractExtension.ts +31 -0
- package/lib/AsyncPanelExtension.test.ts +145 -0
- package/lib/AsyncPanelExtension.ts +34 -0
- package/lib/ButtonExtension.test.ts +61 -0
- package/lib/ButtonExtension.ts +20 -0
- package/lib/LinkExtension.test.ts +61 -0
- package/lib/LinkExtension.ts +22 -0
- package/lib/ModalExtension.test.ts +147 -0
- package/lib/ModalExtension.ts +188 -0
- package/lib/PageExtension.test.ts +38 -0
- package/lib/PageExtension.ts +21 -0
- package/lib/PanelExtension.test.ts +134 -0
- package/lib/PanelExtension.ts +51 -0
- package/lib/SectionExtension.test.ts +57 -0
- package/lib/SectionExtension.ts +18 -0
- package/lib/extension-type.ts +10 -0
- package/lib/index.ts +21 -0
- package/package.json +79 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Copyright (c) 2019 - Atlassian Software Systems Pty Ltd
|
|
2
|
+
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions
|
|
7
|
+
are met:
|
|
8
|
+
|
|
9
|
+
* Redistributions of source code must retain the above copyright notice,
|
|
10
|
+
this list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
* Neither the name of Atlassian Software Systems Pty Ltd nor the names of
|
|
17
|
+
its contributors may be used to endorse or promote products derived from
|
|
18
|
+
this software without specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
21
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
22
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
23
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
24
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
25
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
26
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
27
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
28
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
29
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
30
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Client-side Extensions
|
|
2
|
+
|
|
3
|
+
## Extension Factories
|
|
4
|
+
|
|
5
|
+
Collection of function factories to simplify the consumption of extension points.
|
|
6
|
+
|
|
7
|
+
Refer to the [official documentation](https://developer.atlassian.com/server/framework/clientside-extensions) for more information.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.safeguard = void 0;
|
|
4
|
+
const clientside_extensions_debug_1 = require("@atlassian/clientside-extensions-debug");
|
|
5
|
+
function safeguard(callbackDebugName, callback) {
|
|
6
|
+
return (...args) => {
|
|
7
|
+
let result;
|
|
8
|
+
try {
|
|
9
|
+
result = callback(...args);
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
clientside_extensions_debug_1.onDebug(({ error }) => ({
|
|
13
|
+
level: error,
|
|
14
|
+
message: `Failed to execute ${callbackDebugName} callback.
|
|
15
|
+
Error: ${e}`,
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
exports.safeguard = safeguard;
|
|
22
|
+
//# sourceMappingURL=AbstractExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractExtension.js","sourceRoot":"","sources":["../../lib/AbstractExtension.ts"],"names":[],"mappings":";;;AAAA,wFAAiE;AAgBjE,SAAgB,SAAS,CAAqB,iBAAyB,EAAE,QAAW;IAChF,OAAO,CAAC,GAAG,IAAmB,EAAE,EAAE;QAC9B,IAAI,MAAM,CAAC;QACX,IAAI;YACA,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;SAC9B;QAAC,OAAO,CAAC,EAAE;YACR,qCAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,qBAAqB,iBAAiB;aAClD,CAAC,EAAE;aACH,CAAC,CAAC,CAAC;SACP;QACD,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC;AAdD,8BAcC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Api = exports.factory = void 0;
|
|
4
|
+
const PanelExtension_1 = require("./PanelExtension");
|
|
5
|
+
Object.defineProperty(exports, "Api", { enumerable: true, get: function () { return PanelExtension_1.Api; } });
|
|
6
|
+
const extension_type_1 = require("./extension-type");
|
|
7
|
+
exports.factory = (provider) => {
|
|
8
|
+
return (extensionApi, context) => {
|
|
9
|
+
return {
|
|
10
|
+
...provider(extensionApi, context),
|
|
11
|
+
// We are passing the context provider function reference into the <AsyncPanelHandler.AsyncPanelRenderer> component
|
|
12
|
+
contextProvider() {
|
|
13
|
+
return context;
|
|
14
|
+
},
|
|
15
|
+
type: extension_type_1.ExtensionType.asyncPanel,
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=AsyncPanelExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncPanelExtension.js","sourceRoot":"","sources":["../../lib/AsyncPanelExtension.ts"],"names":[],"mappings":";;;AAEA,qDAAuC;AA+B9B,oFA/BA,oBAAG,OA+BA;AA9BZ,qDAAiD;AAiBpC,QAAA,OAAO,GAAG,CAAW,QAAgD,EAAqD,EAAE;IACrI,OAAO,CAAC,YAAY,EAAE,OAAO,EAAmC,EAAE;QAC9D,OAAO;YACH,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;YAClC,mHAAmH;YACnH,eAAe;gBACX,OAAO,OAAO,CAAC;YACnB,CAAC;YACD,IAAI,EAAE,8BAAa,CAAC,UAAU;SACjC,CAAC;IACN,CAAC,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const clientside_extensions_debug_1 = require("@atlassian/clientside-extensions-debug");
|
|
5
|
+
const AsyncPanelExtension = tslib_1.__importStar(require("./AsyncPanelExtension"));
|
|
6
|
+
jest.mock('@atlassian/clientside-extensions-debug');
|
|
7
|
+
describe('AsyncPanelExtension', () => {
|
|
8
|
+
// @ts-expect-error - invalid values for contextProvider and type. Factory should overwrite them.
|
|
9
|
+
const testAttributesProvider = (api, context) => {
|
|
10
|
+
api.onCleanup(jest.fn());
|
|
11
|
+
api.updateAttributes({});
|
|
12
|
+
return {
|
|
13
|
+
type: 'not-valid',
|
|
14
|
+
contextProvider: 'not-valid-context-provider',
|
|
15
|
+
label: context.value === 42 ? 'The meaning of life' : 'A label',
|
|
16
|
+
onAction: jest.fn(),
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
const testAPI = {
|
|
20
|
+
onCleanup: jest.fn(),
|
|
21
|
+
updateAttributes: jest.fn(),
|
|
22
|
+
};
|
|
23
|
+
it('should generate the extension descriptor with the correct type and contextProvider', () => {
|
|
24
|
+
const extensionProvider = AsyncPanelExtension.factory(testAttributesProvider);
|
|
25
|
+
const extension = extensionProvider(testAPI, {});
|
|
26
|
+
// expect all attributes to be merged, type and contextProvider to be overwritten with the correct values.
|
|
27
|
+
expect(extension).toEqual({
|
|
28
|
+
type: 'async-panel',
|
|
29
|
+
label: 'A label',
|
|
30
|
+
onAction: expect.any(Function),
|
|
31
|
+
contextProvider: expect.any(Function),
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
it('should provide a extensionAPI object to the extension provider', () => {
|
|
35
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(0);
|
|
36
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(0);
|
|
37
|
+
const extensionProvider = AsyncPanelExtension.factory(testAttributesProvider);
|
|
38
|
+
extensionProvider(testAPI, {});
|
|
39
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(1);
|
|
40
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(1);
|
|
41
|
+
});
|
|
42
|
+
it('should share any provided context with the attributes provider', () => {
|
|
43
|
+
const extensionProvider = AsyncPanelExtension.factory(testAttributesProvider);
|
|
44
|
+
const extension = extensionProvider(testAPI, { value: 42 });
|
|
45
|
+
// expect label to change because of context
|
|
46
|
+
expect(extension).toEqual({
|
|
47
|
+
type: 'async-panel',
|
|
48
|
+
label: 'The meaning of life',
|
|
49
|
+
onAction: expect.any(Function),
|
|
50
|
+
contextProvider: expect.any(Function),
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
it('should add a contextProvider method to retreive the shared context', () => {
|
|
54
|
+
const extensionProvider = AsyncPanelExtension.factory(testAttributesProvider);
|
|
55
|
+
const testContext = { value: 42 };
|
|
56
|
+
const extension = extensionProvider(testAPI, testContext);
|
|
57
|
+
expect(extension.contextProvider()).toBe(testContext);
|
|
58
|
+
});
|
|
59
|
+
describe('API', () => {
|
|
60
|
+
let api;
|
|
61
|
+
const el = document.createElement('div');
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
api = new AsyncPanelExtension.Api();
|
|
64
|
+
});
|
|
65
|
+
it('#onMount callback used in getRenderCallback', () => {
|
|
66
|
+
const cb = jest.fn();
|
|
67
|
+
api.onMount(cb);
|
|
68
|
+
api.getRenderCallback()(el);
|
|
69
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
70
|
+
});
|
|
71
|
+
it('#onMount does nothing if not set', () => {
|
|
72
|
+
expect(() => {
|
|
73
|
+
api.getRenderCallback()(el);
|
|
74
|
+
}).not.toThrow();
|
|
75
|
+
});
|
|
76
|
+
it('#onMount does nothing if callback is not function', () => {
|
|
77
|
+
// @ts-expect-error checking that non-TS consumers don't shoot themselves (or others) in the foot
|
|
78
|
+
api.onMount(null);
|
|
79
|
+
expect(() => {
|
|
80
|
+
api.getRenderCallback()(el);
|
|
81
|
+
}).not.toThrow();
|
|
82
|
+
});
|
|
83
|
+
it('#onMount fails gracefully if callback throws error', () => {
|
|
84
|
+
api.onMount(() => {
|
|
85
|
+
throw Error('whoops');
|
|
86
|
+
});
|
|
87
|
+
expect(() => {
|
|
88
|
+
api.getRenderCallback()(el);
|
|
89
|
+
}).not.toThrow();
|
|
90
|
+
});
|
|
91
|
+
it('#onUnmount callback used in getCleanupCallback', () => {
|
|
92
|
+
const cb = jest.fn();
|
|
93
|
+
api.onUnmount(cb);
|
|
94
|
+
api.getCleanupCallback()(el);
|
|
95
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
96
|
+
});
|
|
97
|
+
it('#onUnmount does nothing if not set', () => {
|
|
98
|
+
expect(() => {
|
|
99
|
+
api.getCleanupCallback()(el);
|
|
100
|
+
}).not.toThrow();
|
|
101
|
+
});
|
|
102
|
+
it('#onUnmount does nothing if callback is not function', () => {
|
|
103
|
+
// @ts-expect-error checking that non-TS consumers don't shoot themselves (or others) in the foot
|
|
104
|
+
api.onUnmount(null);
|
|
105
|
+
expect(() => {
|
|
106
|
+
api.getCleanupCallback()(el);
|
|
107
|
+
}).not.toThrow();
|
|
108
|
+
expect(clientside_extensions_debug_1.onDebug).toHaveBeenCalledTimes(1);
|
|
109
|
+
});
|
|
110
|
+
it('#onUnmount fails gracefully if callback throws error', () => {
|
|
111
|
+
api.onUnmount(() => {
|
|
112
|
+
throw Error('whoops');
|
|
113
|
+
});
|
|
114
|
+
expect(() => {
|
|
115
|
+
api.getCleanupCallback()(el);
|
|
116
|
+
}).not.toThrow();
|
|
117
|
+
expect(clientside_extensions_debug_1.onDebug).toHaveBeenCalledTimes(1);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=AsyncPanelExtension.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncPanelExtension.test.js","sourceRoot":"","sources":["../../lib/AsyncPanelExtension.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.factory = void 0;
|
|
4
|
+
const extension_type_1 = require("./extension-type");
|
|
5
|
+
exports.factory = (provider) => {
|
|
6
|
+
return (...args) => {
|
|
7
|
+
return {
|
|
8
|
+
...provider(...args),
|
|
9
|
+
type: extension_type_1.ExtensionType.button,
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=ButtonExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonExtension.js","sourceRoot":"","sources":["../../lib/ButtonExtension.ts"],"names":[],"mappings":";;;AAEA,qDAAiD;AAUpC,QAAA,OAAO,GAAG,CAAW,QAA4C,EAAsC,EAAE;IAClH,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACf,OAAO;YACH,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;YACpB,IAAI,EAAE,8BAAa,CAAC,MAAM;SAC7B,CAAC;IACN,CAAC,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const ButtonExtension = tslib_1.__importStar(require("./ButtonExtension"));
|
|
5
|
+
describe('ButtonExtension', () => {
|
|
6
|
+
// @ts-expect-error We set the invalid type
|
|
7
|
+
const testAttributesProvider = (api, context) => {
|
|
8
|
+
api.onCleanup(jest.fn());
|
|
9
|
+
api.updateAttributes({});
|
|
10
|
+
return {
|
|
11
|
+
type: 'not-valid',
|
|
12
|
+
label: context.value === 42 ? 'The meaning of life' : 'A label',
|
|
13
|
+
onAction: jest.fn(),
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const testAPI = {
|
|
17
|
+
onCleanup: jest.fn(),
|
|
18
|
+
updateAttributes: jest.fn(),
|
|
19
|
+
};
|
|
20
|
+
it('should generate the extension descriptor with the correct type', () => {
|
|
21
|
+
const extensionProvider = ButtonExtension.factory(testAttributesProvider);
|
|
22
|
+
const extension = extensionProvider(testAPI, {});
|
|
23
|
+
// expect all atributes to be merged, and type to be overwritten with the correct value.
|
|
24
|
+
expect(extension).toEqual({
|
|
25
|
+
type: 'button',
|
|
26
|
+
label: 'A label',
|
|
27
|
+
onAction: expect.any(Function),
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it('should provide a extensionAPI object to the extension provider', () => {
|
|
31
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(0);
|
|
32
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(0);
|
|
33
|
+
const extensionProvider = ButtonExtension.factory(testAttributesProvider);
|
|
34
|
+
extensionProvider(testAPI, {});
|
|
35
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(1);
|
|
36
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(1);
|
|
37
|
+
});
|
|
38
|
+
it('should share any provided context with the attributes provider', () => {
|
|
39
|
+
const extensionProvider = ButtonExtension.factory(testAttributesProvider);
|
|
40
|
+
const extension = extensionProvider(testAPI, { value: 42 });
|
|
41
|
+
// expect label to change because of context
|
|
42
|
+
expect(extension).toEqual({
|
|
43
|
+
type: 'button',
|
|
44
|
+
label: 'The meaning of life',
|
|
45
|
+
onAction: expect.any(Function),
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=ButtonExtension.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonExtension.test.js","sourceRoot":"","sources":["../../lib/ButtonExtension.test.ts"],"names":[],"mappings":";;;AACA,2EAAqD;AAOrD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,2CAA2C;IAC3C,MAAM,sBAAsB,GAA6B,CAAC,GAAG,EAAE,OAAoB,EAAE,EAAE;QACnF,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAEzB,OAAO;YACH,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS;YAC/D,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;SACtB,CAAC;IACN,CAAC,CAAC;IAEF,MAAM,OAAO,GAAgD;QACzD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;QACpB,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;KAC9B,CAAC;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEjD,wFAAwF;QACxF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SACjC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE1D,MAAM,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC1E,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE/B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,iBAAiB,GAAG,eAAe,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5D,4CAA4C;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,qBAAqB;YAC5B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;SACjC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.factory = void 0;
|
|
4
|
+
const extension_type_1 = require("./extension-type");
|
|
5
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
6
|
+
exports.factory = (provider) => {
|
|
7
|
+
return (...args) => {
|
|
8
|
+
return {
|
|
9
|
+
...provider(...args),
|
|
10
|
+
type: extension_type_1.ExtensionType.link,
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=LinkExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkExtension.js","sourceRoot":"","sources":["../../lib/LinkExtension.ts"],"names":[],"mappings":";;;AAEA,qDAAiD;AAWjD,wDAAwD;AAC3C,QAAA,OAAO,GAAG,CAAW,QAA0C,EAAoC,EAAE;IAC9G,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE;QACf,OAAO;YACH,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;YACpB,IAAI,EAAE,8BAAa,CAAC,IAAI;SAC3B,CAAC;IACN,CAAC,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const LinkExtension = tslib_1.__importStar(require("./LinkExtension"));
|
|
5
|
+
describe('LinkExtension', () => {
|
|
6
|
+
// @ts-expect-error we set the invalid type
|
|
7
|
+
const testAttributesProvider = (api, context) => {
|
|
8
|
+
api.onCleanup(jest.fn());
|
|
9
|
+
api.updateAttributes({});
|
|
10
|
+
return {
|
|
11
|
+
type: 'not-valid',
|
|
12
|
+
label: context.value === 42 ? 'The meaning of life' : 'A label',
|
|
13
|
+
link: 'https://go.atlassian.com/clientside-extensions',
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const testAPI = {
|
|
17
|
+
onCleanup: jest.fn(),
|
|
18
|
+
updateAttributes: jest.fn(),
|
|
19
|
+
};
|
|
20
|
+
it('should generate the extension descriptor with the correct type', () => {
|
|
21
|
+
const extensionProvider = LinkExtension.factory(testAttributesProvider);
|
|
22
|
+
const extension = extensionProvider(testAPI, {});
|
|
23
|
+
// expect all attributes to be merged, and type to be overwritten with the correct value.
|
|
24
|
+
expect(extension).toEqual({
|
|
25
|
+
type: 'link',
|
|
26
|
+
label: 'A label',
|
|
27
|
+
link: 'https://go.atlassian.com/clientside-extensions',
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it('should provide a extensionAPI object to the extension provider', () => {
|
|
31
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(0);
|
|
32
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(0);
|
|
33
|
+
const extensionProvider = LinkExtension.factory(testAttributesProvider);
|
|
34
|
+
extensionProvider(testAPI, {});
|
|
35
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(1);
|
|
36
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(1);
|
|
37
|
+
});
|
|
38
|
+
it('should share any provided context with the attributes provider', () => {
|
|
39
|
+
const extensionProvider = LinkExtension.factory(testAttributesProvider);
|
|
40
|
+
const extension = extensionProvider(testAPI, { value: 42 });
|
|
41
|
+
// expect label to change because of context
|
|
42
|
+
expect(extension).toEqual({
|
|
43
|
+
type: 'link',
|
|
44
|
+
label: 'The meaning of life',
|
|
45
|
+
link: 'https://go.atlassian.com/clientside-extensions',
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=LinkExtension.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkExtension.test.js","sourceRoot":"","sources":["../../lib/LinkExtension.test.ts"],"names":[],"mappings":";;;AACA,uEAAiD;AAOjD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,2CAA2C;IAC3C,MAAM,sBAAsB,GAA2B,CAAC,GAAG,EAAE,OAAoB,EAAE,EAAE;QACjF,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAEzB,OAAO;YACH,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS;YAC/D,IAAI,EAAE,gDAAgD;SACzD,CAAC;IACN,CAAC,CAAC;IAEF,MAAM,OAAO,GAAgD;QACzD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;QACpB,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;KAC9B,CAAC;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEjD,yFAAyF;QACzF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,gDAAgD;SACzD,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE1D,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACxE,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE/B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5D,4CAA4C;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,qBAAqB;YAC5B,IAAI,EAAE,gDAAgD;SACzD,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Api = exports.Width = exports.Appearance = exports.factory = void 0;
|
|
4
|
+
const clientside_extensions_debug_1 = require("@atlassian/clientside-extensions-debug");
|
|
5
|
+
const extension_type_1 = require("./extension-type");
|
|
6
|
+
const AbstractExtension_1 = require("./AbstractExtension");
|
|
7
|
+
exports.factory = (provider) => {
|
|
8
|
+
return (...args) => {
|
|
9
|
+
const attributes = provider(...args);
|
|
10
|
+
return {
|
|
11
|
+
...attributes,
|
|
12
|
+
type: extension_type_1.ExtensionType.modal,
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const noop = () => { };
|
|
17
|
+
var Appearance;
|
|
18
|
+
(function (Appearance) {
|
|
19
|
+
Appearance["danger"] = "danger";
|
|
20
|
+
Appearance["warning"] = "warning";
|
|
21
|
+
})(Appearance = exports.Appearance || (exports.Appearance = {}));
|
|
22
|
+
var Width;
|
|
23
|
+
(function (Width) {
|
|
24
|
+
Width["small"] = "small";
|
|
25
|
+
Width["medium"] = "medium";
|
|
26
|
+
Width["large"] = "large";
|
|
27
|
+
Width["x-large"] = "x-large";
|
|
28
|
+
})(Width = exports.Width || (exports.Width = {}));
|
|
29
|
+
class Api {
|
|
30
|
+
constructor(closeModalFn, setActions) {
|
|
31
|
+
this.title = '';
|
|
32
|
+
this.renderCallback = noop;
|
|
33
|
+
this.cleanupCallback = noop;
|
|
34
|
+
this.closeModalFn = noop;
|
|
35
|
+
this.onCloseCallback = () => true;
|
|
36
|
+
this.setTitle = (title) => {
|
|
37
|
+
this.title = title;
|
|
38
|
+
return this;
|
|
39
|
+
};
|
|
40
|
+
this.setWidth = (width) => {
|
|
41
|
+
// Runtime checking for 'non-ts' usage
|
|
42
|
+
if (!(width in Width)) {
|
|
43
|
+
clientside_extensions_debug_1.onDebug(({ error }) => ({
|
|
44
|
+
level: error,
|
|
45
|
+
message: `Invalid value specified as "width" of modal. Please make sure to use one of the supported values.`,
|
|
46
|
+
meta: {
|
|
47
|
+
value: width,
|
|
48
|
+
supported: Object.keys(Width).concat(),
|
|
49
|
+
},
|
|
50
|
+
}));
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
this.width = width;
|
|
54
|
+
return this;
|
|
55
|
+
};
|
|
56
|
+
this.setAppearance = (appearance) => {
|
|
57
|
+
// Runtime checking for 'non-ts' usage
|
|
58
|
+
if (!(appearance in Appearance)) {
|
|
59
|
+
clientside_extensions_debug_1.onDebug(({ error }) => ({
|
|
60
|
+
level: error,
|
|
61
|
+
message: `Invalid value specified as "appearance" of modal. Please make sure to use one of the supported values.`,
|
|
62
|
+
meta: {
|
|
63
|
+
value: appearance,
|
|
64
|
+
supported: Object.keys(Appearance).concat(),
|
|
65
|
+
},
|
|
66
|
+
}));
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
this.appearance = appearance;
|
|
70
|
+
return this;
|
|
71
|
+
};
|
|
72
|
+
this.onMount = (callback) => {
|
|
73
|
+
this.renderCallback = AbstractExtension_1.safeguard('onMount', callback);
|
|
74
|
+
return this;
|
|
75
|
+
};
|
|
76
|
+
this.onUnmount = (callback) => {
|
|
77
|
+
this.cleanupCallback = AbstractExtension_1.safeguard('onUnmount', callback);
|
|
78
|
+
return this;
|
|
79
|
+
};
|
|
80
|
+
this.closeModal = () => {
|
|
81
|
+
this.closeModalFn();
|
|
82
|
+
};
|
|
83
|
+
this.closeModalFn = AbstractExtension_1.safeguard('onClose', closeModalFn);
|
|
84
|
+
this.setActions = (actions) => {
|
|
85
|
+
setActions(Api.filterActionProps(actions));
|
|
86
|
+
return this;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
getTitle() {
|
|
90
|
+
return this.title;
|
|
91
|
+
}
|
|
92
|
+
getWidth() {
|
|
93
|
+
return this.width;
|
|
94
|
+
}
|
|
95
|
+
getAppearance() {
|
|
96
|
+
return this.appearance;
|
|
97
|
+
}
|
|
98
|
+
getRenderCallback() {
|
|
99
|
+
return this.renderCallback;
|
|
100
|
+
}
|
|
101
|
+
getCleanupCallback() {
|
|
102
|
+
return this.cleanupCallback;
|
|
103
|
+
}
|
|
104
|
+
onClose(callback) {
|
|
105
|
+
this.onCloseCallback = AbstractExtension_1.safeguard('onClose', callback);
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
getOnCloseCallback() {
|
|
109
|
+
return this.onCloseCallback;
|
|
110
|
+
}
|
|
111
|
+
static filterActionProps(actions) {
|
|
112
|
+
if (!Array.isArray(actions)) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
return actions.map(({ text, onClick, isDisabled, isLoading, testId }) => {
|
|
116
|
+
return { text, onClick, isDisabled, isLoading, testId };
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.Api = Api;
|
|
121
|
+
//# sourceMappingURL=ModalExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModalExtension.js","sourceRoot":"","sources":["../../lib/ModalExtension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const clientside_extensions_debug_1 = require("@atlassian/clientside-extensions-debug");
|
|
5
|
+
const ModalExtension = tslib_1.__importStar(require("./ModalExtension"));
|
|
6
|
+
jest.mock('@atlassian/clientside-extensions-debug');
|
|
7
|
+
describe('ModalExtension', () => {
|
|
8
|
+
// @ts-expect-error - invalid values for type. Factory should overwrite it.
|
|
9
|
+
const testAttributesProvider = (api, context) => {
|
|
10
|
+
api.onCleanup(jest.fn());
|
|
11
|
+
api.updateAttributes({});
|
|
12
|
+
return {
|
|
13
|
+
type: 'not-valid',
|
|
14
|
+
label: context.value === 42 ? 'The meaning of life' : 'A label',
|
|
15
|
+
onAction: jest.fn(),
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
const testAPI = {
|
|
19
|
+
onCleanup: jest.fn(),
|
|
20
|
+
updateAttributes: jest.fn(),
|
|
21
|
+
};
|
|
22
|
+
it('should generate the extension descriptor with the correct type', () => {
|
|
23
|
+
const extensionProvider = ModalExtension.factory(testAttributesProvider);
|
|
24
|
+
const extension = extensionProvider(testAPI, {});
|
|
25
|
+
// expect all attributes to be merged, and type to be overwritten with the correct value.
|
|
26
|
+
expect(extension).toEqual({
|
|
27
|
+
type: 'modal',
|
|
28
|
+
label: 'A label',
|
|
29
|
+
onAction: expect.any(Function),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
it('should provide a extensionAPI object to the extension provider', () => {
|
|
33
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(0);
|
|
34
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(0);
|
|
35
|
+
const extensionProvider = ModalExtension.factory(testAttributesProvider);
|
|
36
|
+
extensionProvider(testAPI, {});
|
|
37
|
+
expect(testAPI.onCleanup).toHaveBeenCalledTimes(1);
|
|
38
|
+
expect(testAPI.updateAttributes).toHaveBeenCalledTimes(1);
|
|
39
|
+
});
|
|
40
|
+
it('should share any provided context with the attributes provider', () => {
|
|
41
|
+
const extensionProvider = ModalExtension.factory(testAttributesProvider);
|
|
42
|
+
const extension = extensionProvider(testAPI, { value: 42 });
|
|
43
|
+
// expect label to change because of context
|
|
44
|
+
expect(extension).toEqual({
|
|
45
|
+
type: 'modal',
|
|
46
|
+
label: 'The meaning of life',
|
|
47
|
+
onAction: expect.any(Function),
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it('should export all the supported appreanace for modals', () => {
|
|
51
|
+
expect(ModalExtension.Appearance).toBeTruthy();
|
|
52
|
+
});
|
|
53
|
+
it('should export all the supported sizes for modals', () => {
|
|
54
|
+
expect(ModalExtension.Width).toBeTruthy();
|
|
55
|
+
});
|
|
56
|
+
describe('API', () => {
|
|
57
|
+
let closeFn;
|
|
58
|
+
let api;
|
|
59
|
+
const el = document.createElement('div');
|
|
60
|
+
const setStateFn = () => { };
|
|
61
|
+
beforeEach(() => {
|
|
62
|
+
closeFn = jest.fn();
|
|
63
|
+
api = new ModalExtension.Api(closeFn, setStateFn);
|
|
64
|
+
});
|
|
65
|
+
it('#onMount callback used in getRenderCallback', () => {
|
|
66
|
+
const cb = jest.fn();
|
|
67
|
+
api.onMount(cb);
|
|
68
|
+
api.getRenderCallback()(el);
|
|
69
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
70
|
+
});
|
|
71
|
+
it('#onMount does nothing if not set', () => {
|
|
72
|
+
expect(() => {
|
|
73
|
+
api.getRenderCallback()(el);
|
|
74
|
+
}).not.toThrow();
|
|
75
|
+
});
|
|
76
|
+
it('#onMount does nothing if callback is not function', () => {
|
|
77
|
+
// @ts-expect-error checking that non-TS consumers don't shoot themselves (or others) in the foot
|
|
78
|
+
api.onMount(null);
|
|
79
|
+
expect(() => {
|
|
80
|
+
api.getRenderCallback()(el);
|
|
81
|
+
}).not.toThrow();
|
|
82
|
+
});
|
|
83
|
+
it('#onMount fails gracefully if callback throws error', () => {
|
|
84
|
+
api.onMount(() => {
|
|
85
|
+
throw Error('whoops');
|
|
86
|
+
});
|
|
87
|
+
expect(() => {
|
|
88
|
+
api.getRenderCallback()(el);
|
|
89
|
+
}).not.toThrow();
|
|
90
|
+
});
|
|
91
|
+
it('#onUnmount callback used in getCleanupCallback', () => {
|
|
92
|
+
const cb = jest.fn();
|
|
93
|
+
api.onUnmount(cb);
|
|
94
|
+
api.getCleanupCallback()(el);
|
|
95
|
+
expect(cb).toHaveBeenCalledTimes(1);
|
|
96
|
+
});
|
|
97
|
+
it('#onUnmount does nothing if not set', () => {
|
|
98
|
+
expect(() => {
|
|
99
|
+
api.getCleanupCallback()(el);
|
|
100
|
+
}).not.toThrow();
|
|
101
|
+
});
|
|
102
|
+
it('#onUnmount does nothing if callback is not function', () => {
|
|
103
|
+
// @ts-expect-error checking that non-TS consumers don't shoot themselves (or others) in the foot
|
|
104
|
+
api.onUnmount(null);
|
|
105
|
+
expect(() => {
|
|
106
|
+
api.getCleanupCallback()(el);
|
|
107
|
+
}).not.toThrow();
|
|
108
|
+
expect(clientside_extensions_debug_1.onDebug).toHaveBeenCalledTimes(1);
|
|
109
|
+
});
|
|
110
|
+
it('#onUnmount fails gracefully if callback throws error', () => {
|
|
111
|
+
api.onUnmount(() => {
|
|
112
|
+
throw Error('whoops');
|
|
113
|
+
});
|
|
114
|
+
expect(() => {
|
|
115
|
+
api.getCleanupCallback()(el);
|
|
116
|
+
}).not.toThrow();
|
|
117
|
+
expect(clientside_extensions_debug_1.onDebug).toHaveBeenCalledTimes(1);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=ModalExtension.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModalExtension.test.js","sourceRoot":"","sources":["../../lib/ModalExtension.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.factory = void 0;
|
|
4
|
+
const extension_type_1 = require("./extension-type");
|
|
5
|
+
exports.factory = (renderCallback) => {
|
|
6
|
+
return () => ({
|
|
7
|
+
type: extension_type_1.ExtensionType.page,
|
|
8
|
+
onAction: (node, data) => {
|
|
9
|
+
renderCallback(node, data);
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=PageExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageExtension.js","sourceRoot":"","sources":["../../lib/PageExtension.ts"],"names":[],"mappings":";;;AAEA,qDAAiD;AAWpC,QAAA,OAAO,GAAG,CAAgB,cAA6C,EAAyC,EAAE;IAC3H,OAAO,GAAG,EAAE,CAAC,CAAC;QACV,IAAI,EAAE,8BAAa,CAAC,IAAI;QACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACrB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;KACJ,CAAC,CAAC;AACP,CAAC,CAAC"}
|