@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.
Files changed (156) hide show
  1. package/README.md +10 -10
  2. package/commands/app/create.d.ts +1 -1
  3. package/commands/app/create.js +5 -5
  4. package/commands/{team → group}/create.d.ts +3 -3
  5. package/commands/{team → group}/create.js +5 -5
  6. package/commands/{team → group}/delete.d.ts +3 -3
  7. package/commands/{team → group}/delete.js +5 -5
  8. package/commands/{team → group}/index.d.ts +2 -2
  9. package/commands/{team → group}/index.js +4 -4
  10. package/commands/{team → group}/member/delete.d.ts +3 -3
  11. package/commands/{team → group}/member/delete.js +5 -5
  12. package/commands/{team → group}/member/index.d.ts +1 -1
  13. package/commands/{team → group}/member/index.js +1 -3
  14. package/commands/{team → group}/member/invite.d.ts +3 -3
  15. package/commands/{team → group}/member/invite.js +5 -5
  16. package/commands/{team → group}/update.d.ts +3 -3
  17. package/commands/{team → group}/update.js +7 -7
  18. package/commands/migrateAppDefinitions.d.ts +13 -0
  19. package/commands/migrateAppDefinitions.js +73 -0
  20. package/commands/serve.d.ts +1 -1
  21. package/commands/serve.js +16 -16
  22. package/index.js +4 -2
  23. package/lib/app.js +13 -3
  24. package/lib/app.test.js +1266 -1262
  25. package/lib/asset.js +4 -2
  26. package/lib/asset.test.js +70 -67
  27. package/lib/block.test.js +144 -142
  28. package/lib/config.test.js +205 -203
  29. package/lib/createServers.js +3 -1
  30. package/lib/group.d.ts +61 -0
  31. package/lib/group.js +55 -0
  32. package/lib/group.test.js +610 -0
  33. package/lib/organization.test.js +189 -187
  34. package/lib/resource.js +3 -1
  35. package/lib/resource.test.js +322 -320
  36. package/lib/serverImport.d.ts +1 -1
  37. package/package.json +8 -7
  38. package/server/argv.d.ts +4 -4
  39. package/server/argv.js +1 -1
  40. package/server/controllers/apps/actions/index.d.ts +5 -0
  41. package/server/controllers/apps/actions/index.js +6 -0
  42. package/server/controllers/apps/actions/proxyDelete.d.ts +2 -0
  43. package/server/controllers/apps/actions/proxyDelete.js +4 -0
  44. package/server/controllers/apps/actions/proxyGet.d.ts +2 -0
  45. package/server/controllers/apps/actions/proxyGet.js +4 -0
  46. package/server/controllers/apps/actions/proxyPatch.d.ts +2 -0
  47. package/server/controllers/apps/actions/proxyPatch.js +4 -0
  48. package/server/controllers/apps/actions/proxyPost.d.ts +2 -0
  49. package/server/controllers/apps/actions/proxyPost.js +4 -0
  50. package/server/controllers/apps/actions/proxyPut.d.ts +2 -0
  51. package/server/controllers/apps/actions/proxyPut.js +4 -0
  52. package/server/controllers/apps/index.d.ts +2 -0
  53. package/server/controllers/apps/index.js +3 -0
  54. package/server/controllers/apps/members/current/getCurrentAppMember.d.ts +2 -0
  55. package/server/controllers/apps/members/current/getCurrentAppMember.js +4 -0
  56. package/server/controllers/apps/members/current/index.d.ts +1 -0
  57. package/server/controllers/apps/members/current/index.js +2 -0
  58. package/server/controllers/apps/members/index.d.ts +1 -0
  59. package/server/controllers/apps/members/index.js +2 -0
  60. package/server/controllers/common/apps/assets/getAppAssetById.d.ts +2 -0
  61. package/server/controllers/common/apps/assets/getAppAssetById.js +4 -0
  62. package/server/controllers/common/apps/assets/index.d.ts +1 -0
  63. package/server/controllers/common/apps/assets/index.js +2 -0
  64. package/server/controllers/common/apps/groups/getAppGroups.d.ts +2 -0
  65. package/server/controllers/common/apps/groups/getAppGroups.js +4 -0
  66. package/server/controllers/common/apps/groups/index.d.ts +1 -0
  67. package/server/controllers/common/apps/groups/index.js +2 -0
  68. package/server/controllers/common/apps/index.d.ts +5 -0
  69. package/server/controllers/common/apps/index.js +6 -0
  70. package/server/controllers/common/apps/messages/getAppMessages.d.ts +2 -0
  71. package/server/controllers/common/apps/messages/getAppMessages.js +4 -0
  72. package/server/controllers/common/apps/messages/index.d.ts +1 -0
  73. package/server/controllers/common/apps/messages/index.js +2 -0
  74. package/server/controllers/common/apps/resources/countAppResources.d.ts +2 -0
  75. package/server/controllers/common/apps/resources/countAppResources.js +4 -0
  76. package/server/controllers/common/apps/resources/createAppResource.d.ts +2 -0
  77. package/server/controllers/common/apps/resources/createAppResource.js +4 -0
  78. package/server/controllers/common/apps/resources/deleteAppResource.d.ts +2 -0
  79. package/server/controllers/common/apps/resources/deleteAppResource.js +4 -0
  80. package/server/controllers/common/apps/resources/getAppResourceById.d.ts +2 -0
  81. package/server/controllers/common/apps/resources/getAppResourceById.js +4 -0
  82. package/server/controllers/common/apps/resources/index.d.ts +6 -0
  83. package/server/controllers/common/apps/resources/index.js +7 -0
  84. package/server/controllers/common/apps/resources/queryAppResources.d.ts +2 -0
  85. package/server/controllers/common/apps/resources/queryAppResources.js +4 -0
  86. package/server/controllers/common/apps/resources/updateAppResource.d.ts +2 -0
  87. package/server/controllers/common/apps/resources/updateAppResource.js +4 -0
  88. package/server/controllers/common/apps/variables/getAppVariables.js +4 -0
  89. package/server/controllers/common/apps/variables/index.d.ts +1 -0
  90. package/server/controllers/common/apps/variables/index.js +2 -0
  91. package/server/controllers/common/index.d.ts +1 -0
  92. package/server/controllers/common/index.js +2 -0
  93. package/server/controllers/index.d.ts +3 -8
  94. package/server/controllers/index.js +3 -8
  95. package/server/controllers/main/apps/assets/createAppAsset.d.ts +2 -0
  96. package/server/controllers/main/apps/assets/createAppAsset.js +4 -0
  97. package/server/controllers/main/apps/assets/index.d.ts +1 -0
  98. package/server/controllers/main/apps/assets/index.js +2 -0
  99. package/server/controllers/main/apps/index.d.ts +1 -0
  100. package/server/controllers/main/apps/index.js +2 -0
  101. package/server/controllers/main/index.d.ts +1 -0
  102. package/server/controllers/main/index.js +2 -0
  103. package/server/options/checkAppMemberAppPermissions.d.ts +1 -0
  104. package/server/options/checkAppMemberAppPermissions.js +4 -0
  105. package/server/options/checkAppPermissions.d.ts +1 -0
  106. package/server/options/checkAppPermissions.js +4 -0
  107. package/server/options/checkAuthSubjectAppPermissions.d.ts +1 -0
  108. package/server/options/checkAuthSubjectAppPermissions.js +4 -0
  109. package/server/options/checkUserOrganizationPermissions.d.ts +1 -0
  110. package/server/options/checkUserOrganizationPermissions.js +4 -0
  111. package/server/options/getAppGroups.d.ts +2 -0
  112. package/server/options/getAppGroups.js +4 -0
  113. package/server/options/getCurrentAppMember.d.ts +3 -0
  114. package/server/options/getCurrentAppMember.js +4 -0
  115. package/server/options/index.d.ts +6 -5
  116. package/server/options/index.js +6 -5
  117. package/server/options/options.js +7 -6
  118. package/templates/apps/empty/app-definition.yaml +2 -2
  119. package/templates/blocks/mini-jsx/package.json +1 -1
  120. package/templates/blocks/preact/package.json +2 -2
  121. package/templates/blocks/vanilla/package.json +1 -1
  122. package/vitest.setup.js +11 -0
  123. package/commands/team/member/update.d.ts +0 -16
  124. package/commands/team/member/update.js +0 -46
  125. package/lib/team.d.ts +0 -61
  126. package/lib/team.js +0 -83
  127. package/lib/team.test.js +0 -625
  128. package/server/controllers/action.d.ts +0 -6
  129. package/server/controllers/action.js +0 -8
  130. package/server/controllers/appMembers.d.ts +0 -2
  131. package/server/controllers/appMembers.js +0 -4
  132. package/server/controllers/appMessages.d.ts +0 -2
  133. package/server/controllers/appMessages.js +0 -4
  134. package/server/controllers/appVariables.js +0 -4
  135. package/server/controllers/assets.d.ts +0 -4
  136. package/server/controllers/assets.js +0 -6
  137. package/server/controllers/oauth2Provider.d.ts +0 -2
  138. package/server/controllers/oauth2Provider.js +0 -4
  139. package/server/controllers/resources.d.ts +0 -7
  140. package/server/controllers/resources.js +0 -9
  141. package/server/controllers/teams.d.ts +0 -2
  142. package/server/controllers/teams.js +0 -4
  143. package/server/options/checkRole.d.ts +0 -1
  144. package/server/options/checkRole.js +0 -2
  145. package/server/options/checkRole.test.d.ts +0 -1
  146. package/server/options/checkRole.test.js +0 -13
  147. package/server/options/getAppMembers.d.ts +0 -3
  148. package/server/options/getAppMembers.js +0 -4
  149. package/server/options/getAppTeams.d.ts +0 -2
  150. package/server/options/getAppTeams.js +0 -4
  151. package/server/options/getAppUserInfo.d.ts +0 -3
  152. package/server/options/getAppUserInfo.js +0 -4
  153. package/server/options/verifyResourceActionPermission.d.ts +0 -1
  154. package/server/options/verifyResourceActionPermission.js +0 -2
  155. /package/lib/{team.test.d.ts → group.test.d.ts} +0 -0
  156. /package/server/controllers/{appVariables.d.ts → common/apps/variables/getAppVariables.d.ts} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { createFixtureStream, readFixture } from '@appsemble/node-utils';
2
- import { createServer, createTestUser, models, setArgv, useTestDatabase } from '@appsemble/server';
2
+ import { createServer, createTestUser, models, setArgv } from '@appsemble/server';
3
+ import { PredefinedOrganizationRole } from '@appsemble/types';
3
4
  import { setTestApp } from 'axios-test-instance';
4
5
  import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
5
6
  import { initAxios } from './initAxios.js';
@@ -9,85 +10,85 @@ const argv = { host: 'http://localhost', secret: 'test', aesSecret: 'testSecret'
9
10
  let user;
10
11
  let testApp;
11
12
  const { Organization, OrganizationMember } = models;
12
- useTestDatabase(import.meta);
13
- beforeAll(() => {
14
- vi.useFakeTimers();
15
- setArgv(argv);
16
- });
17
- beforeEach(async () => {
18
- vi.clearAllTimers();
19
- vi.setSystemTime(0);
20
- const server = await createServer();
21
- testApp = await setTestApp(server);
22
- initAxios({ remote: testApp.defaults.baseURL });
23
- user = await createTestUser();
24
- });
25
- afterAll(() => {
26
- vi.useRealTimers();
27
- });
28
- describe('createOrganization', () => {
29
- it('should create a new organization', async () => {
30
- await authorizeCLI('organizations:write', testApp);
31
- await createOrganization({
32
- description: 'test description',
33
- id: 'test',
34
- name: 'Test',
35
- email: 'test@example.com',
36
- icon: createFixtureStream('apps/tux.png'),
37
- website: 'https://example.com',
38
- });
39
- const organization = await Organization.findOne();
40
- expect(organization).toMatchObject({
41
- description: 'test description',
42
- email: 'test@example.com',
43
- icon: await readFixture('apps/tux.png'),
44
- id: 'test',
45
- name: 'Test',
46
- website: 'https://example.com',
47
- });
13
+ describe('organization', () => {
14
+ beforeAll(() => {
15
+ vi.useFakeTimers();
16
+ setArgv(argv);
48
17
  });
49
- it('should not create a new organization with duplicate id', async () => {
50
- const organization = await Organization.create({
51
- id: 'test',
52
- name: 'Test',
53
- });
18
+ beforeEach(async () => {
19
+ vi.clearAllTimers();
20
+ vi.setSystemTime(0);
21
+ const server = await createServer();
22
+ testApp = await setTestApp(server);
23
+ initAxios({ remote: testApp.defaults.baseURL });
24
+ user = await createTestUser();
25
+ });
26
+ afterAll(() => {
54
27
  vi.useRealTimers();
55
- await authorizeCLI('organizations:write', testApp);
56
- await expect(() => createOrganization({
57
- description: 'test description',
58
- id: organization.id,
59
- name: 'Test',
60
- email: 'test@example.com',
61
- icon: null,
62
- website: 'https://example.com',
63
- })).rejects.toThrow('Request failed with status code 409');
64
- vi.useFakeTimers();
65
28
  });
66
- });
67
- describe('updateOrganization', () => {
68
- it('should update an existing organization', async () => {
69
- const organization = await Organization.create({
70
- id: 'test',
71
- name: 'Test',
72
- });
73
- await OrganizationMember.create({
74
- OrganizationId: organization.id,
75
- UserId: user.id,
76
- role: 'Owner',
29
+ describe('createOrganization', () => {
30
+ it('should create a new organization', async () => {
31
+ await authorizeCLI('organizations:write', testApp);
32
+ await createOrganization({
33
+ description: 'test description',
34
+ id: 'test',
35
+ name: 'Test',
36
+ email: 'test@example.com',
37
+ icon: createFixtureStream('apps/tux.png'),
38
+ website: 'https://example.com',
39
+ });
40
+ const organization = await Organization.findOne();
41
+ expect(organization).toMatchObject({
42
+ description: 'test description',
43
+ email: 'test@example.com',
44
+ icon: await readFixture('apps/tux.png'),
45
+ id: 'test',
46
+ name: 'Test',
47
+ website: 'https://example.com',
48
+ });
49
+ });
50
+ it('should not create a new organization with duplicate id', async () => {
51
+ const organization = await Organization.create({
52
+ id: 'test',
53
+ name: 'Test',
54
+ });
55
+ vi.useRealTimers();
56
+ await authorizeCLI('organizations:write', testApp);
57
+ await expect(() => createOrganization({
58
+ description: 'test description',
59
+ id: organization.id,
60
+ name: 'Test',
61
+ email: 'test@example.com',
62
+ icon: null,
63
+ website: 'https://example.com',
64
+ })).rejects.toThrow('Request failed with status code 409');
65
+ vi.useFakeTimers();
77
66
  });
78
- await authorizeCLI('organizations:write', testApp);
79
- await updateOrganization({
80
- id: organization.id,
81
- name: 'Test changed',
82
- description: 'Description Changed',
83
- email: 'test@example.com',
84
- website: null,
85
- icon: createFixtureStream('apps/tux.png'),
86
- });
87
- await organization.reload();
88
- expect(organization.dataValues).toMatchInlineSnapshot({
89
- icon: expect.any(Buffer),
90
- }, `
67
+ });
68
+ describe('updateOrganization', () => {
69
+ it('should update an existing organization', async () => {
70
+ const organization = await Organization.create({
71
+ id: 'test',
72
+ name: 'Test',
73
+ });
74
+ await OrganizationMember.create({
75
+ OrganizationId: organization.id,
76
+ UserId: user.id,
77
+ role: PredefinedOrganizationRole.Owner,
78
+ });
79
+ await authorizeCLI('organizations:write', testApp);
80
+ await updateOrganization({
81
+ id: organization.id,
82
+ name: 'Test changed',
83
+ description: 'Description Changed',
84
+ email: 'test@example.com',
85
+ website: null,
86
+ icon: createFixtureStream('apps/tux.png'),
87
+ });
88
+ await organization.reload();
89
+ expect(organization.dataValues).toMatchInlineSnapshot({
90
+ icon: expect.any(Buffer),
91
+ }, `
91
92
  {
92
93
  "created": 1970-01-01T00:00:00.000Z,
93
94
  "deleted": null,
@@ -100,120 +101,121 @@ describe('updateOrganization', () => {
100
101
  "website": null,
101
102
  }
102
103
  `);
103
- });
104
- it('should throw if the organization does not exist', async () => {
105
- const organization = await Organization.create({
106
- id: 'test',
107
- name: 'Test',
108
104
  });
109
- await OrganizationMember.create({
110
- OrganizationId: organization.id,
111
- UserId: user.id,
112
- role: 'Owner',
105
+ it('should throw if the organization does not exist', async () => {
106
+ const organization = await Organization.create({
107
+ id: 'test',
108
+ name: 'Test',
109
+ });
110
+ await OrganizationMember.create({
111
+ OrganizationId: organization.id,
112
+ UserId: user.id,
113
+ role: PredefinedOrganizationRole.Owner,
114
+ });
115
+ await organization.destroy();
116
+ await authorizeCLI('organizations:write', testApp);
117
+ await expect(() => updateOrganization({
118
+ id: organization.id,
119
+ name: 'Test changed',
120
+ description: null,
121
+ email: 'test@example.com',
122
+ website: null,
123
+ icon: null,
124
+ })).rejects.toThrow('Request failed with status code 404');
125
+ });
126
+ it('should throw if the user is not authorized', async () => {
127
+ const organization = await Organization.create({
128
+ id: 'test',
129
+ name: 'Test',
130
+ });
131
+ await OrganizationMember.create({
132
+ OrganizationId: organization.id,
133
+ UserId: user.id,
134
+ role: PredefinedOrganizationRole.Owner,
135
+ });
136
+ await expect(() => updateOrganization({
137
+ id: organization.id,
138
+ name: 'Test changed',
139
+ description: null,
140
+ email: 'test@example.com',
141
+ website: null,
142
+ icon: null,
143
+ })).rejects.toThrow('Request failed with status code 401');
113
144
  });
114
- await organization.destroy();
115
- await authorizeCLI('organizations:write', testApp);
116
- await expect(() => updateOrganization({
117
- id: organization.id,
118
- name: 'Test changed',
119
- description: null,
120
- email: 'test@example.com',
121
- website: null,
122
- icon: null,
123
- })).rejects.toThrow('Request failed with status code 404');
124
145
  });
125
- it('should throw if the user is not authorized', async () => {
126
- const organization = await Organization.create({
127
- id: 'test',
128
- name: 'Test',
129
- });
130
- await OrganizationMember.create({
131
- OrganizationId: organization.id,
132
- UserId: user.id,
133
- role: 'Owner',
134
- });
135
- await expect(() => updateOrganization({
136
- id: organization.id,
137
- name: 'Test changed',
138
- description: null,
139
- email: 'test@example.com',
140
- website: null,
141
- icon: null,
142
- })).rejects.toThrow('Request failed with status code 401');
143
- });
144
- });
145
- describe('upsertOrganization', () => {
146
- it('should create a new organization if doesn’t exist already', async () => {
147
- await authorizeCLI('organizations:write', testApp);
148
- await upsertOrganization({
149
- description: 'test description',
150
- id: 'test',
151
- name: 'Test',
152
- email: 'test@example.com',
153
- icon: null,
154
- website: 'https://example.com',
155
- });
156
- const organization = await Organization.findOne();
157
- expect(organization).toMatchObject({
158
- id: 'test',
159
- description: 'test description',
160
- name: 'Test',
161
- email: 'test@example.com',
162
- icon: null,
163
- website: 'https://example.com',
164
- });
165
- });
166
- it('should update an existing organization', async () => {
167
- const organization = await Organization.create({
168
- id: 'test',
169
- name: 'Test',
170
- });
171
- await OrganizationMember.create({
172
- OrganizationId: organization.id,
173
- UserId: user.id,
174
- role: 'Owner',
175
- });
176
- await authorizeCLI('organizations:write', testApp);
177
- await upsertOrganization({
178
- id: organization.id,
179
- name: 'Test changed',
180
- description: null,
181
- email: 'test@example.com',
182
- website: null,
183
- icon: null,
184
- });
185
- expect(organization).toMatchObject({
186
- id: 'test',
187
- name: 'Test',
188
- });
189
- await organization.reload();
190
- expect(organization).toMatchObject({
191
- id: organization.id,
192
- name: 'Test changed',
193
- description: null,
194
- email: 'test@example.com',
195
- website: null,
196
- icon: null,
197
- });
198
- });
199
- it('should throw if there is an error', async () => {
200
- const organization = await Organization.create({
201
- id: 'test',
202
- name: 'Test',
203
- });
204
- await authorizeCLI('organizations:write', testApp);
205
- // Fails because the organization member does not exist.
206
- await expect(() => upsertOrganization({
207
- id: organization.id,
208
- name: 'Test changed',
209
- description: null,
210
- email: 'test@example.com',
211
- website: 'https://www.example.com',
212
- icon: null,
213
- })).rejects.toThrow('Request failed with status code 403');
214
- expect(organization).toMatchObject({
215
- id: 'test',
216
- name: 'Test',
146
+ describe('upsertOrganization', () => {
147
+ it('should create a new organization if doesn’t exist already', async () => {
148
+ await authorizeCLI('organizations:write', testApp);
149
+ await upsertOrganization({
150
+ description: 'test description',
151
+ id: 'test',
152
+ name: 'Test',
153
+ email: 'test@example.com',
154
+ icon: null,
155
+ website: 'https://example.com',
156
+ });
157
+ const organization = await Organization.findOne();
158
+ expect(organization).toMatchObject({
159
+ id: 'test',
160
+ description: 'test description',
161
+ name: 'Test',
162
+ email: 'test@example.com',
163
+ icon: null,
164
+ website: 'https://example.com',
165
+ });
166
+ });
167
+ it('should update an existing organization', async () => {
168
+ const organization = await Organization.create({
169
+ id: 'test',
170
+ name: 'Test',
171
+ });
172
+ await OrganizationMember.create({
173
+ OrganizationId: organization.id,
174
+ UserId: user.id,
175
+ role: PredefinedOrganizationRole.Owner,
176
+ });
177
+ await authorizeCLI('organizations:write', testApp);
178
+ await upsertOrganization({
179
+ id: organization.id,
180
+ name: 'Test changed',
181
+ description: null,
182
+ email: 'test@example.com',
183
+ website: null,
184
+ icon: null,
185
+ });
186
+ expect(organization).toMatchObject({
187
+ id: 'test',
188
+ name: 'Test',
189
+ });
190
+ await organization.reload();
191
+ expect(organization).toMatchObject({
192
+ id: organization.id,
193
+ name: 'Test changed',
194
+ description: null,
195
+ email: 'test@example.com',
196
+ website: null,
197
+ icon: null,
198
+ });
199
+ });
200
+ it('should throw if there is an error', async () => {
201
+ const organization = await Organization.create({
202
+ id: 'test',
203
+ name: 'Test',
204
+ });
205
+ await authorizeCLI('organizations:write', testApp);
206
+ // Fails because the organization member does not exist.
207
+ await expect(() => upsertOrganization({
208
+ id: organization.id,
209
+ name: 'Test changed',
210
+ description: null,
211
+ email: 'test@example.com',
212
+ website: 'https://www.example.com',
213
+ icon: null,
214
+ })).rejects.toThrow('Request failed with status code 403');
215
+ expect(organization).toMatchObject({
216
+ id: 'test',
217
+ name: 'Test',
218
+ });
217
219
  });
218
220
  });
219
221
  });
package/lib/resource.js CHANGED
@@ -16,12 +16,13 @@ export async function publishResource({ appId, definition, path, publishedResour
16
16
  }
17
17
  logger.info(`Publishing resource(s) from ${path}`);
18
18
  let data;
19
- const endpoint = `/api/apps/${appId}/${seed ? 'seed-' : ''}resources/${type}`;
19
+ const endpoint = `/api/apps/${appId}/resources/${type}`;
20
20
  try {
21
21
  if (csv) {
22
22
  const response = await axios.post(endpoint, resources, {
23
23
  baseURL: remote,
24
24
  headers: { 'content-type': 'text/csv' },
25
+ params: { seed },
25
26
  });
26
27
  data = response.data;
27
28
  }
@@ -37,6 +38,7 @@ export async function publishResource({ appId, definition, path, publishedResour
37
38
  }), {
38
39
  baseURL: remote,
39
40
  headers: { 'content-type': 'application/json' },
41
+ params: { seed },
40
42
  });
41
43
  data = response.data;
42
44
  }