@appsemble/cli 0.29.11 → 0.30.2
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/README.md +10 -10
- package/commands/app/create.d.ts +1 -1
- package/commands/app/create.js +5 -5
- package/commands/{team → group}/create.d.ts +3 -3
- package/commands/{team → group}/create.js +5 -5
- package/commands/{team → group}/delete.d.ts +3 -3
- package/commands/{team → group}/delete.js +5 -5
- package/commands/{team → group}/index.d.ts +2 -2
- package/commands/{team → group}/index.js +4 -4
- package/commands/{team → group}/member/delete.d.ts +3 -3
- package/commands/{team → group}/member/delete.js +5 -5
- package/commands/{team → group}/member/index.d.ts +1 -1
- package/commands/{team → group}/member/index.js +1 -3
- package/commands/{team → group}/member/invite.d.ts +3 -3
- package/commands/{team → group}/member/invite.js +5 -5
- package/commands/{team → group}/update.d.ts +3 -3
- package/commands/{team → group}/update.js +7 -7
- package/commands/migrateAppDefinitions.d.ts +13 -0
- package/commands/migrateAppDefinitions.js +73 -0
- package/commands/serve.d.ts +1 -1
- package/commands/serve.js +16 -16
- package/index.js +4 -2
- package/lib/app.js +13 -3
- package/lib/app.test.js +1266 -1262
- package/lib/asset.js +4 -2
- package/lib/asset.test.js +70 -67
- package/lib/block.test.js +144 -142
- package/lib/config.test.js +205 -203
- package/lib/createServers.js +3 -1
- package/lib/group.d.ts +61 -0
- package/lib/group.js +55 -0
- package/lib/group.test.js +610 -0
- package/lib/organization.test.js +189 -187
- package/lib/resource.js +3 -1
- package/lib/resource.test.js +322 -320
- package/lib/serverImport.d.ts +1 -1
- package/package.json +8 -7
- package/server/argv.d.ts +4 -4
- package/server/argv.js +1 -1
- package/server/controllers/apps/actions/index.d.ts +5 -0
- package/server/controllers/apps/actions/index.js +6 -0
- package/server/controllers/apps/actions/proxyDelete.d.ts +2 -0
- package/server/controllers/apps/actions/proxyDelete.js +4 -0
- package/server/controllers/apps/actions/proxyGet.d.ts +2 -0
- package/server/controllers/apps/actions/proxyGet.js +4 -0
- package/server/controllers/apps/actions/proxyPatch.d.ts +2 -0
- package/server/controllers/apps/actions/proxyPatch.js +4 -0
- package/server/controllers/apps/actions/proxyPost.d.ts +2 -0
- package/server/controllers/apps/actions/proxyPost.js +4 -0
- package/server/controllers/apps/actions/proxyPut.d.ts +2 -0
- package/server/controllers/apps/actions/proxyPut.js +4 -0
- package/server/controllers/apps/index.d.ts +2 -0
- package/server/controllers/apps/index.js +3 -0
- package/server/controllers/apps/members/current/getCurrentAppMember.d.ts +2 -0
- package/server/controllers/apps/members/current/getCurrentAppMember.js +4 -0
- package/server/controllers/apps/members/current/index.d.ts +1 -0
- package/server/controllers/apps/members/current/index.js +2 -0
- package/server/controllers/apps/members/index.d.ts +1 -0
- package/server/controllers/apps/members/index.js +2 -0
- package/server/controllers/common/apps/assets/getAppAssetById.d.ts +2 -0
- package/server/controllers/common/apps/assets/getAppAssetById.js +4 -0
- package/server/controllers/common/apps/assets/index.d.ts +1 -0
- package/server/controllers/common/apps/assets/index.js +2 -0
- package/server/controllers/common/apps/groups/getAppGroups.d.ts +2 -0
- package/server/controllers/common/apps/groups/getAppGroups.js +4 -0
- package/server/controllers/common/apps/groups/index.d.ts +1 -0
- package/server/controllers/common/apps/groups/index.js +2 -0
- package/server/controllers/common/apps/index.d.ts +5 -0
- package/server/controllers/common/apps/index.js +6 -0
- package/server/controllers/common/apps/messages/getAppMessages.d.ts +2 -0
- package/server/controllers/common/apps/messages/getAppMessages.js +4 -0
- package/server/controllers/common/apps/messages/index.d.ts +1 -0
- package/server/controllers/common/apps/messages/index.js +2 -0
- package/server/controllers/common/apps/resources/countAppResources.d.ts +2 -0
- package/server/controllers/common/apps/resources/countAppResources.js +4 -0
- package/server/controllers/common/apps/resources/createAppResource.d.ts +2 -0
- package/server/controllers/common/apps/resources/createAppResource.js +4 -0
- package/server/controllers/common/apps/resources/deleteAppResource.d.ts +2 -0
- package/server/controllers/common/apps/resources/deleteAppResource.js +4 -0
- package/server/controllers/common/apps/resources/getAppResourceById.d.ts +2 -0
- package/server/controllers/common/apps/resources/getAppResourceById.js +4 -0
- package/server/controllers/common/apps/resources/index.d.ts +6 -0
- package/server/controllers/common/apps/resources/index.js +7 -0
- package/server/controllers/common/apps/resources/queryAppResources.d.ts +2 -0
- package/server/controllers/common/apps/resources/queryAppResources.js +4 -0
- package/server/controllers/common/apps/resources/updateAppResource.d.ts +2 -0
- package/server/controllers/common/apps/resources/updateAppResource.js +4 -0
- package/server/controllers/common/apps/variables/getAppVariables.js +4 -0
- package/server/controllers/common/apps/variables/index.d.ts +1 -0
- package/server/controllers/common/apps/variables/index.js +2 -0
- package/server/controllers/common/index.d.ts +1 -0
- package/server/controllers/common/index.js +2 -0
- package/server/controllers/index.d.ts +3 -8
- package/server/controllers/index.js +3 -8
- package/server/controllers/main/apps/assets/createAppAsset.d.ts +2 -0
- package/server/controllers/main/apps/assets/createAppAsset.js +4 -0
- package/server/controllers/main/apps/assets/index.d.ts +1 -0
- package/server/controllers/main/apps/assets/index.js +2 -0
- package/server/controllers/main/apps/index.d.ts +1 -0
- package/server/controllers/main/apps/index.js +2 -0
- package/server/controllers/main/index.d.ts +1 -0
- package/server/controllers/main/index.js +2 -0
- package/server/options/checkAppMemberAppPermissions.d.ts +1 -0
- package/server/options/checkAppMemberAppPermissions.js +4 -0
- package/server/options/checkAppPermissions.d.ts +1 -0
- package/server/options/checkAppPermissions.js +4 -0
- package/server/options/checkAuthSubjectAppPermissions.d.ts +1 -0
- package/server/options/checkAuthSubjectAppPermissions.js +4 -0
- package/server/options/checkUserOrganizationPermissions.d.ts +1 -0
- package/server/options/checkUserOrganizationPermissions.js +4 -0
- package/server/options/getAppGroups.d.ts +2 -0
- package/server/options/getAppGroups.js +4 -0
- package/server/options/getCurrentAppMember.d.ts +3 -0
- package/server/options/getCurrentAppMember.js +4 -0
- package/server/options/index.d.ts +6 -5
- package/server/options/index.js +6 -5
- package/server/options/options.js +7 -6
- package/templates/apps/empty/app-definition.yaml +2 -2
- package/templates/blocks/mini-jsx/package.json +1 -1
- package/templates/blocks/preact/package.json +2 -2
- package/templates/blocks/vanilla/package.json +1 -1
- package/vitest.setup.js +11 -0
- package/commands/team/member/update.d.ts +0 -16
- package/commands/team/member/update.js +0 -46
- package/lib/team.d.ts +0 -61
- package/lib/team.js +0 -83
- package/lib/team.test.js +0 -625
- package/server/controllers/action.d.ts +0 -6
- package/server/controllers/action.js +0 -8
- package/server/controllers/appMembers.d.ts +0 -2
- package/server/controllers/appMembers.js +0 -4
- package/server/controllers/appMessages.d.ts +0 -2
- package/server/controllers/appMessages.js +0 -4
- package/server/controllers/appVariables.js +0 -4
- package/server/controllers/assets.d.ts +0 -4
- package/server/controllers/assets.js +0 -6
- package/server/controllers/oauth2Provider.d.ts +0 -2
- package/server/controllers/oauth2Provider.js +0 -4
- package/server/controllers/resources.d.ts +0 -7
- package/server/controllers/resources.js +0 -9
- package/server/controllers/teams.d.ts +0 -2
- package/server/controllers/teams.js +0 -4
- package/server/options/checkRole.d.ts +0 -1
- package/server/options/checkRole.js +0 -2
- package/server/options/checkRole.test.d.ts +0 -1
- package/server/options/checkRole.test.js +0 -13
- package/server/options/getAppMembers.d.ts +0 -3
- package/server/options/getAppMembers.js +0 -4
- package/server/options/getAppTeams.d.ts +0 -2
- package/server/options/getAppTeams.js +0 -4
- package/server/options/getAppUserInfo.d.ts +0 -3
- package/server/options/getAppUserInfo.js +0 -4
- package/server/options/verifyResourceActionPermission.d.ts +0 -1
- package/server/options/verifyResourceActionPermission.js +0 -2
- /package/lib/{team.test.d.ts → group.test.d.ts} +0 -0
- /package/server/controllers/{appVariables.d.ts → common/apps/variables/getAppVariables.d.ts} +0 -0
package/lib/config.test.js
CHANGED
|
@@ -5,232 +5,234 @@ import { AppsembleError, resolveFixture } from '@appsemble/node-utils';
|
|
|
5
5
|
import { ts } from 'ts-json-schema-generator';
|
|
6
6
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
7
|
import { getProjectImplementations } from './config.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
8
|
+
describe('config', () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.spyOn(process, 'cwd').mockReturnValue(resolveFixture('.'));
|
|
11
|
+
});
|
|
12
|
+
describe('getProjectImplementations', () => {
|
|
13
|
+
it('should extract configuration from a TypeScript project', () => {
|
|
14
|
+
const result = getProjectImplementations({
|
|
15
|
+
name: '',
|
|
16
|
+
layout: 'float',
|
|
17
|
+
version: '1.33.7',
|
|
18
|
+
webpack: '',
|
|
19
|
+
output: '',
|
|
20
|
+
dir: resolveFixture('getProjectImplementations/valid'),
|
|
21
|
+
});
|
|
22
|
+
expect(result).toStrictEqual({
|
|
23
|
+
actions: { testAction: { description: undefined } },
|
|
24
|
+
events: {
|
|
25
|
+
emit: { testEmit: { description: undefined } },
|
|
26
|
+
listen: { testListener: { description: undefined } },
|
|
27
|
+
},
|
|
28
|
+
messages: undefined,
|
|
29
|
+
parameters: {
|
|
30
|
+
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
properties: {
|
|
33
|
+
param1: { type: 'string' },
|
|
34
|
+
param2: { type: 'number' },
|
|
35
|
+
param3: { type: 'boolean' },
|
|
36
|
+
param4: { type: 'string' },
|
|
37
|
+
param5: {
|
|
38
|
+
additionalProperties: false,
|
|
39
|
+
properties: {
|
|
40
|
+
nested1: { type: 'string' },
|
|
41
|
+
nested2: { type: 'number' },
|
|
42
|
+
nested3: { type: 'boolean' },
|
|
43
|
+
},
|
|
44
|
+
required: ['nested1', 'nested2', 'nested3'],
|
|
45
|
+
type: 'object',
|
|
42
46
|
},
|
|
43
|
-
|
|
44
|
-
type: 'object',
|
|
47
|
+
param6: { items: { type: 'string' }, type: 'array' },
|
|
45
48
|
},
|
|
46
|
-
|
|
49
|
+
required: ['param1', 'param2', 'param3', 'param5', 'param6'],
|
|
50
|
+
type: 'object',
|
|
47
51
|
},
|
|
48
|
-
|
|
49
|
-
type: 'object',
|
|
50
|
-
},
|
|
52
|
+
});
|
|
51
53
|
});
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
expect(ts.createProgram).not.toHaveBeenCalled();
|
|
71
|
-
});
|
|
72
|
-
it('should prefer actions overrides over TypeScript actions', () => {
|
|
73
|
-
const result = getProjectImplementations({
|
|
74
|
-
actions: {},
|
|
75
|
-
version: '1.33.7',
|
|
76
|
-
webpack: '',
|
|
77
|
-
output: '',
|
|
78
|
-
dir: resolveFixture('getProjectImplementations/valid'),
|
|
79
|
-
name: '',
|
|
54
|
+
// Spying on TypeScript functions no longer works.
|
|
55
|
+
// eslint-disable-next-line vitest/no-disabled-tests
|
|
56
|
+
it.skip('should not use TypeScript if all metadata is present in the original config', () => {
|
|
57
|
+
vi.spyOn(ts, 'createProgram');
|
|
58
|
+
const input = {
|
|
59
|
+
actions: {},
|
|
60
|
+
events: { emit: { foo: {} }, listen: { bar: {} } },
|
|
61
|
+
layout: 'float',
|
|
62
|
+
parameters: { type: 'object' },
|
|
63
|
+
version: '1.33.7',
|
|
64
|
+
webpack: '',
|
|
65
|
+
output: '',
|
|
66
|
+
dir: resolveFixture('getProjectImplementations/valid'),
|
|
67
|
+
name: '',
|
|
68
|
+
};
|
|
69
|
+
const result = getProjectImplementations(input);
|
|
70
|
+
expect(result).toBe(input);
|
|
71
|
+
expect(ts.createProgram).not.toHaveBeenCalled();
|
|
80
72
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
73
|
+
it('should prefer actions overrides over TypeScript actions', () => {
|
|
74
|
+
const result = getProjectImplementations({
|
|
75
|
+
actions: {},
|
|
76
|
+
version: '1.33.7',
|
|
77
|
+
webpack: '',
|
|
78
|
+
output: '',
|
|
79
|
+
dir: resolveFixture('getProjectImplementations/valid'),
|
|
80
|
+
name: '',
|
|
81
|
+
});
|
|
82
|
+
expect(result.actions).toStrictEqual({});
|
|
91
83
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
84
|
+
it('should prefer events overrides over TypeScript events', () => {
|
|
85
|
+
const result = getProjectImplementations({
|
|
86
|
+
events: { emit: { onSuccess: {} } },
|
|
87
|
+
version: '1.33.7',
|
|
88
|
+
webpack: '',
|
|
89
|
+
output: '',
|
|
90
|
+
dir: resolveFixture('getProjectImplementations/valid'),
|
|
91
|
+
name: '',
|
|
92
|
+
});
|
|
93
|
+
expect(result.events).toStrictEqual({ emit: { onSuccess: {} } });
|
|
102
94
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
});
|
|
132
|
-
it('should throw if duplicate Parameters are found', () => {
|
|
133
|
-
expect(() => getProjectImplementations({
|
|
134
|
-
webpack: '',
|
|
135
|
-
output: '',
|
|
136
|
-
dir: resolveFixture('getProjectImplementations/duplicateParameters'),
|
|
137
|
-
name: '',
|
|
138
|
-
version: '1.33.7',
|
|
139
|
-
})).toThrow(new AppsembleError("Found duplicate interface 'Parameters' in 'getProjectImplementations/duplicateParameters/index.ts:31'"));
|
|
140
|
-
});
|
|
141
|
-
it('should handle fontawesome icons', () => {
|
|
142
|
-
const result = getProjectImplementations({
|
|
143
|
-
webpack: '',
|
|
144
|
-
output: '',
|
|
145
|
-
dir: resolveFixture('getProjectImplementations/fontawesomeParameters'),
|
|
146
|
-
name: '',
|
|
147
|
-
version: '1.33.7',
|
|
95
|
+
it('should prefer parameters overrides over TypeScript parameters', () => {
|
|
96
|
+
const result = getProjectImplementations({
|
|
97
|
+
parameters: { type: 'object' },
|
|
98
|
+
version: '1.33.7',
|
|
99
|
+
webpack: '',
|
|
100
|
+
output: '',
|
|
101
|
+
dir: resolveFixture('getProjectImplementations/valid'),
|
|
102
|
+
name: '',
|
|
103
|
+
});
|
|
104
|
+
expect(result.parameters).toStrictEqual({ type: 'object' });
|
|
105
|
+
});
|
|
106
|
+
it('should throw if duplicate Actions are found', () => {
|
|
107
|
+
expect(() => getProjectImplementations({
|
|
108
|
+
webpack: '',
|
|
109
|
+
output: '',
|
|
110
|
+
dir: resolveFixture('getProjectImplementations/duplicateActions'),
|
|
111
|
+
name: '',
|
|
112
|
+
version: '1.33.7',
|
|
113
|
+
})).toThrow(new AppsembleError("Found duplicate interface 'Actions' in 'getProjectImplementations/duplicateActions/index.ts:31'"));
|
|
114
|
+
});
|
|
115
|
+
it('should throw if duplicate EventEmitters are found', () => {
|
|
116
|
+
expect(() => getProjectImplementations({
|
|
117
|
+
webpack: '',
|
|
118
|
+
output: '',
|
|
119
|
+
dir: resolveFixture('getProjectImplementations/duplicateEventEmitters'),
|
|
120
|
+
name: '',
|
|
121
|
+
version: '1.33.7',
|
|
122
|
+
})).toThrow(new AppsembleError("Found duplicate interface 'EventEmitters' in 'getProjectImplementations/duplicateEventEmitters/index.ts:31'"));
|
|
148
123
|
});
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
124
|
+
it('should throw if duplicate EventListeners are found', () => {
|
|
125
|
+
expect(() => getProjectImplementations({
|
|
126
|
+
webpack: '',
|
|
127
|
+
output: '',
|
|
128
|
+
dir: resolveFixture('getProjectImplementations/duplicateEventListeners'),
|
|
129
|
+
name: '',
|
|
130
|
+
version: '1.33.7',
|
|
131
|
+
})).toThrow(new AppsembleError("Found duplicate interface 'EventListeners' in 'getProjectImplementations/duplicateEventListeners/index.ts:31'"));
|
|
132
|
+
});
|
|
133
|
+
it('should throw if duplicate Parameters are found', () => {
|
|
134
|
+
expect(() => getProjectImplementations({
|
|
135
|
+
webpack: '',
|
|
136
|
+
output: '',
|
|
137
|
+
dir: resolveFixture('getProjectImplementations/duplicateParameters'),
|
|
138
|
+
name: '',
|
|
139
|
+
version: '1.33.7',
|
|
140
|
+
})).toThrow(new AppsembleError("Found duplicate interface 'Parameters' in 'getProjectImplementations/duplicateParameters/index.ts:31'"));
|
|
141
|
+
});
|
|
142
|
+
it('should handle fontawesome icons', () => {
|
|
143
|
+
const result = getProjectImplementations({
|
|
144
|
+
webpack: '',
|
|
145
|
+
output: '',
|
|
146
|
+
dir: resolveFixture('getProjectImplementations/fontawesomeParameters'),
|
|
147
|
+
name: '',
|
|
148
|
+
version: '1.33.7',
|
|
149
|
+
});
|
|
150
|
+
expect(result).toStrictEqual({
|
|
151
|
+
actions: undefined,
|
|
152
|
+
events: undefined,
|
|
153
|
+
messages: undefined,
|
|
154
|
+
parameters: {
|
|
155
|
+
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
156
|
+
additionalProperties: false,
|
|
157
|
+
properties: {
|
|
158
|
+
icon: { description: 'This is an icon.', format: 'fontawesome', type: 'string' },
|
|
159
|
+
},
|
|
160
|
+
type: 'object',
|
|
158
161
|
},
|
|
159
|
-
|
|
160
|
-
},
|
|
162
|
+
});
|
|
161
163
|
});
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
it('should handle TypeScript pre emit diagnostics', () => {
|
|
165
|
+
function fn() {
|
|
166
|
+
getProjectImplementations({
|
|
167
|
+
name: '',
|
|
168
|
+
layout: 'float',
|
|
169
|
+
version: '1.33.7',
|
|
170
|
+
webpack: '',
|
|
171
|
+
output: '',
|
|
172
|
+
dir: resolveFixture('getProjectImplementations/tsError'),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
expect(fn).toThrow(AppsembleError);
|
|
176
|
+
expect(fn).toThrow(/'unused' is declared but its value is never read/);
|
|
177
|
+
});
|
|
178
|
+
it('should extract comments', () => {
|
|
179
|
+
const result = getProjectImplementations({
|
|
166
180
|
name: '',
|
|
167
181
|
layout: 'float',
|
|
168
182
|
version: '1.33.7',
|
|
169
183
|
webpack: '',
|
|
170
184
|
output: '',
|
|
171
|
-
dir: resolveFixture('getProjectImplementations/
|
|
185
|
+
dir: resolveFixture('getProjectImplementations/comments'),
|
|
172
186
|
});
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
output: '',
|
|
184
|
-
dir: resolveFixture('getProjectImplementations/comments'),
|
|
185
|
-
});
|
|
186
|
-
expect(result).toStrictEqual({
|
|
187
|
-
actions: {
|
|
188
|
-
comment: {
|
|
189
|
-
description: 'Valid action comment',
|
|
190
|
-
},
|
|
191
|
-
duplicate: {
|
|
192
|
-
description: 'Expected comment',
|
|
193
|
-
},
|
|
194
|
-
line: {
|
|
195
|
-
description: undefined,
|
|
196
|
-
},
|
|
197
|
-
},
|
|
198
|
-
events: {
|
|
199
|
-
emit: {
|
|
200
|
-
testEmit: {
|
|
201
|
-
description: 'Test event emitter.',
|
|
187
|
+
expect(result).toStrictEqual({
|
|
188
|
+
actions: {
|
|
189
|
+
comment: {
|
|
190
|
+
description: 'Valid action comment',
|
|
191
|
+
},
|
|
192
|
+
duplicate: {
|
|
193
|
+
description: 'Expected comment',
|
|
194
|
+
},
|
|
195
|
+
line: {
|
|
196
|
+
description: undefined,
|
|
202
197
|
},
|
|
203
198
|
},
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
199
|
+
events: {
|
|
200
|
+
emit: {
|
|
201
|
+
testEmit: {
|
|
202
|
+
description: 'Test event emitter.',
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
listen: {
|
|
206
|
+
testListener: {
|
|
207
|
+
description: 'Test event listener.',
|
|
208
|
+
},
|
|
207
209
|
},
|
|
208
210
|
},
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
211
|
+
messages: undefined,
|
|
212
|
+
parameters: {
|
|
213
|
+
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
214
|
+
additionalProperties: false,
|
|
215
|
+
properties: {
|
|
216
|
+
param: {},
|
|
217
|
+
},
|
|
218
|
+
required: ['param'],
|
|
219
|
+
type: 'object',
|
|
216
220
|
},
|
|
217
|
-
|
|
218
|
-
type: 'object',
|
|
219
|
-
},
|
|
221
|
+
});
|
|
220
222
|
});
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
223
|
+
describe('official blocks', () => {
|
|
224
|
+
const blocksDir = new URL('../../../blocks/', import.meta.url);
|
|
225
|
+
it.each(readdirSync(blocksDir))('%s', (name) => {
|
|
226
|
+
const dir = fileURLToPath(new URL(name, blocksDir));
|
|
227
|
+
const result = getProjectImplementations({
|
|
228
|
+
name,
|
|
229
|
+
version: '',
|
|
230
|
+
output: '',
|
|
231
|
+
webpack: undefined,
|
|
232
|
+
dir,
|
|
233
|
+
});
|
|
234
|
+
expect(result).toMatchSnapshot();
|
|
232
235
|
});
|
|
233
|
-
expect(result).toMatchSnapshot();
|
|
234
236
|
});
|
|
235
237
|
});
|
|
236
238
|
});
|
package/lib/createServers.js
CHANGED
|
@@ -36,7 +36,9 @@ export function createApiServer({ context }) {
|
|
|
36
36
|
app.use(compress());
|
|
37
37
|
}
|
|
38
38
|
app.use(compose([
|
|
39
|
-
conditional((ctx) => ctx.path.startsWith('/api') ||
|
|
39
|
+
conditional((ctx) => ctx.path.startsWith('/api') ||
|
|
40
|
+
ctx.path === '/auth/oauth2/token' ||
|
|
41
|
+
/\/apps\/\d+\/auth\/oauth2\/token/.test(ctx.path), cors()),
|
|
40
42
|
koas(api(version, argv), [
|
|
41
43
|
parameters(),
|
|
42
44
|
bodyParser(),
|
package/lib/group.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type AppRole } from '@appsemble/types';
|
|
2
|
+
interface SharedGroupParams {
|
|
3
|
+
/**
|
|
4
|
+
* The ID of the app to create the group for.
|
|
5
|
+
*/
|
|
6
|
+
appId: number;
|
|
7
|
+
/**
|
|
8
|
+
* The remote server to create the group on.
|
|
9
|
+
*/
|
|
10
|
+
remote: string;
|
|
11
|
+
/**
|
|
12
|
+
* The client credentials used to authenticate
|
|
13
|
+
*/
|
|
14
|
+
clientCredentials?: string;
|
|
15
|
+
}
|
|
16
|
+
interface SharedExistingGroupParams extends SharedGroupParams {
|
|
17
|
+
/**
|
|
18
|
+
* The ID of the group.
|
|
19
|
+
*/
|
|
20
|
+
id: number;
|
|
21
|
+
}
|
|
22
|
+
interface SharedGroupMemberParams extends SharedExistingGroupParams {
|
|
23
|
+
/**
|
|
24
|
+
* The ID or email address of the group member.
|
|
25
|
+
*/
|
|
26
|
+
user: string;
|
|
27
|
+
}
|
|
28
|
+
interface UpdateGroupMemberParams extends SharedGroupMemberParams {
|
|
29
|
+
/**
|
|
30
|
+
* The new role of the group member.
|
|
31
|
+
*/
|
|
32
|
+
role: AppRole;
|
|
33
|
+
}
|
|
34
|
+
interface UpdateGroupParams extends SharedExistingGroupParams {
|
|
35
|
+
/**
|
|
36
|
+
* The new name of the group.
|
|
37
|
+
*/
|
|
38
|
+
name?: string;
|
|
39
|
+
/**
|
|
40
|
+
* The list of annotations to apply in key=value format.
|
|
41
|
+
*/
|
|
42
|
+
annotations?: string[];
|
|
43
|
+
}
|
|
44
|
+
interface CreateGroupParams extends SharedGroupParams {
|
|
45
|
+
/**
|
|
46
|
+
* The name of the group.
|
|
47
|
+
*/
|
|
48
|
+
name: string;
|
|
49
|
+
/**
|
|
50
|
+
* The list of annotations to apply in key=value format.
|
|
51
|
+
*/
|
|
52
|
+
annotations?: string[];
|
|
53
|
+
}
|
|
54
|
+
export declare function resolveAnnotations(annotations: string[]): Record<string, string>;
|
|
55
|
+
export declare function createGroup({ annotations, appId, clientCredentials, name, remote, }: CreateGroupParams): Promise<void>;
|
|
56
|
+
export declare function deleteGroup({ clientCredentials, id, remote, }: SharedExistingGroupParams): Promise<void>;
|
|
57
|
+
export declare function updateGroup({ annotations, id, name, remote, }: UpdateGroupParams): Promise<void>;
|
|
58
|
+
export declare function inviteMember({ id, remote, user }: SharedGroupMemberParams): Promise<void>;
|
|
59
|
+
export declare function updateMember({ id, remote, role, user, }: UpdateGroupMemberParams): Promise<void>;
|
|
60
|
+
export declare function deleteMember({ id, user }: SharedGroupMemberParams): Promise<void>;
|
|
61
|
+
export {};
|
package/lib/group.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { AppsembleError, authenticate, logger } from '@appsemble/node-utils';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
export function resolveAnnotations(annotations) {
|
|
4
|
+
const annotationRegex = /^\w+=.+$/;
|
|
5
|
+
if (annotations.some((a) => !annotationRegex.test(a))) {
|
|
6
|
+
throw new AppsembleError('One of the annotations did not follow the pattern of key=value');
|
|
7
|
+
}
|
|
8
|
+
return annotations.length
|
|
9
|
+
? Object.fromEntries(annotations.map((annotation) => {
|
|
10
|
+
const [key, ...value] = annotation.split('=');
|
|
11
|
+
return [key, value.join('=')];
|
|
12
|
+
}))
|
|
13
|
+
: undefined;
|
|
14
|
+
}
|
|
15
|
+
export async function createGroup({ annotations = [], appId, clientCredentials, name, remote, }) {
|
|
16
|
+
logger.info(`Creating group ${name}`);
|
|
17
|
+
await authenticate(remote, 'groups:write', clientCredentials);
|
|
18
|
+
const { data: { id }, } = await axios.post(`/api/apps/${appId}/groups`, {
|
|
19
|
+
name,
|
|
20
|
+
annotations: resolveAnnotations(annotations),
|
|
21
|
+
}, { baseURL: remote });
|
|
22
|
+
logger.info(`Successfully created group ${name} with ID ${id}`);
|
|
23
|
+
}
|
|
24
|
+
export async function deleteGroup({ clientCredentials, id, remote, }) {
|
|
25
|
+
await authenticate(remote, 'groups:write', clientCredentials);
|
|
26
|
+
logger.info(`Deleting group ${id}`);
|
|
27
|
+
await axios.delete(`/api/groups/${id}`, { baseURL: remote });
|
|
28
|
+
logger.info(`Successfully deleted group ${id}`);
|
|
29
|
+
}
|
|
30
|
+
export async function updateGroup({ annotations = [], id, name, remote, }) {
|
|
31
|
+
logger.info(`Updating group ${id}`);
|
|
32
|
+
await axios.patch(`/api/groups/${id}`, {
|
|
33
|
+
name,
|
|
34
|
+
annotations: resolveAnnotations(annotations),
|
|
35
|
+
}, { baseURL: remote });
|
|
36
|
+
logger.info(`Successfully updated group ${id}`);
|
|
37
|
+
}
|
|
38
|
+
export async function inviteMember({ id, remote, user }) {
|
|
39
|
+
logger.info(`Inviting ${user} to group ${id}`);
|
|
40
|
+
await axios.post(`/api/groups/${id}/invites`, [{ email: user, role: 'Member' }], {
|
|
41
|
+
baseURL: remote,
|
|
42
|
+
});
|
|
43
|
+
logger.info(`Successfully invited ${user} to group ${id}`);
|
|
44
|
+
}
|
|
45
|
+
export async function updateMember({ id, remote, role, user, }) {
|
|
46
|
+
logger.info(`Updating ${user}’s role in group ${id} to ${role}`);
|
|
47
|
+
await axios.put(`/api/group-members/${user}/role`, { role }, { baseURL: remote });
|
|
48
|
+
logger.info(`Successfully updated ${user} in group ${id}`);
|
|
49
|
+
}
|
|
50
|
+
export async function deleteMember({ id, user }) {
|
|
51
|
+
logger.info(`Deleting ${user} to group ${id}`);
|
|
52
|
+
await axios.delete(`/api/group-members/${user}?selectedGroupId=${id}`);
|
|
53
|
+
logger.info(`Successfully deleted ${user} from group ${id}`);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=group.js.map
|