@appsemble/cli 0.35.11-test.3 → 0.35.14

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 CHANGED
@@ -1,9 +1,9 @@
1
- # ![](https://gitlab.com/appsemble/appsemble/-/raw/0.35.11-test.3/config/assets/logo.svg) Appsemble CLI
1
+ # ![](https://gitlab.com/appsemble/appsemble/-/raw/0.35.14/config/assets/logo.svg) Appsemble CLI
2
2
 
3
3
  > Manage apps and blocks from the command line.
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/@appsemble/cli)](https://www.npmjs.com/package/@appsemble/cli)
6
- [![GitLab CI](https://gitlab.com/appsemble/appsemble/badges/0.35.11-test.3/pipeline.svg)](https://gitlab.com/appsemble/appsemble/-/releases/0.35.11-test.3)
6
+ [![GitLab CI](https://gitlab.com/appsemble/appsemble/badges/0.35.14/pipeline.svg)](https://gitlab.com/appsemble/appsemble/-/releases/0.35.14)
7
7
  [![Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://prettier.io)
8
8
 
9
9
  ## Table of Contents
@@ -323,5 +323,5 @@ appsemble run-cronjobs --interval 30
323
323
 
324
324
  ## License
325
325
 
326
- [LGPL-3.0-only](https://gitlab.com/appsemble/appsemble/-/blob/0.35.11-test.3/LICENSE.md) ©
326
+ [LGPL-3.0-only](https://gitlab.com/appsemble/appsemble/-/blob/0.35.14/LICENSE.md) ©
327
327
  [Appsemble](https://appsemble.com)
@@ -1,5 +1,4 @@
1
1
  import { type ReadStream } from 'node:fs';
2
- import { type PaymentProvider } from '@appsemble/types';
3
2
  import { type Argv } from 'yargs';
4
3
  import { type BaseArguments } from '../../types.js';
5
4
  interface CreateOrganizationArguments extends BaseArguments {
@@ -9,7 +8,6 @@ interface CreateOrganizationArguments extends BaseArguments {
9
8
  name: string;
10
9
  website: string;
11
10
  icon: ReadStream;
12
- preferredPaymentProvider: PaymentProvider;
13
11
  vatIdNumber: string;
14
12
  streetName: string;
15
13
  houseNumber: string;
@@ -21,5 +19,5 @@ interface CreateOrganizationArguments extends BaseArguments {
21
19
  export declare const command = "create <id>";
22
20
  export declare const description = "Register a new organization. You will be the owner of the new organization.";
23
21
  export declare function builder(yargs: Argv): Argv<any>;
24
- export declare function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, remote, streetName, vatIdNumber, website, zipCode, }: CreateOrganizationArguments): Promise<void>;
22
+ export declare function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, remote, streetName, vatIdNumber, website, zipCode, }: CreateOrganizationArguments): Promise<void>;
25
23
  export {};
@@ -23,9 +23,6 @@ export function builder(yargs) {
23
23
  .option('icon', {
24
24
  describe: 'The file location of the icon representing the organization.',
25
25
  coerce: coerceFile,
26
- })
27
- .option('preferredPaymentProvider', {
28
- describe: 'The preferred payment provider of the organization.',
29
26
  })
30
27
  .option('vatIdNumber', {
31
28
  describe: 'The VAT id number of the organization.',
@@ -49,7 +46,7 @@ export function builder(yargs) {
49
46
  describe: 'Optional reference the organization can set to appear on the invoice.',
50
47
  });
51
48
  }
52
- export async function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, remote, streetName, vatIdNumber, website, zipCode, }) {
49
+ export async function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, remote, streetName, vatIdNumber, website, zipCode, }) {
53
50
  await authenticate(remote, 'organizations:write', clientCredentials);
54
51
  await createOrganization({
55
52
  description: desc,
@@ -58,7 +55,6 @@ export async function handler({ city, clientCredentials, countryCode, descriptio
58
55
  icon,
59
56
  id,
60
57
  name,
61
- preferredPaymentProvider,
62
58
  website,
63
59
  streetName,
64
60
  houseNumber,
@@ -1,5 +1,4 @@
1
1
  import { type ReadStream } from 'node:fs';
2
- import { type PaymentProvider } from '@appsemble/types';
3
2
  import { type Argv } from 'yargs';
4
3
  import { type BaseArguments } from '../../types.js';
5
4
  interface UpdateOrganizationArguments extends BaseArguments {
@@ -9,7 +8,6 @@ interface UpdateOrganizationArguments extends BaseArguments {
9
8
  icon: ReadStream;
10
9
  name: string;
11
10
  website: string;
12
- preferredPaymentProvider: PaymentProvider;
13
11
  vatIdNumber: string;
14
12
  streetName: string;
15
13
  houseNumber: string;
@@ -21,5 +19,5 @@ interface UpdateOrganizationArguments extends BaseArguments {
21
19
  export declare const command = "update <id>";
22
20
  export declare const description = "Update an existing organization. You must be an owner of the organization.";
23
21
  export declare function builder(yargs: Argv): Argv<any>;
24
- export declare function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, remote, streetName, vatIdNumber, website, zipCode, }: UpdateOrganizationArguments): Promise<void>;
22
+ export declare function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, remote, streetName, vatIdNumber, website, zipCode, }: UpdateOrganizationArguments): Promise<void>;
25
23
  export {};
@@ -23,9 +23,6 @@ export function builder(yargs) {
23
23
  .option('icon', {
24
24
  describe: 'The file location of the icon representing the organization.',
25
25
  coerce: coerceFile,
26
- })
27
- .option('preferredPaymentProvider', {
28
- describe: 'The preferred payment provider of the organization.',
29
26
  })
30
27
  .option('vatIdNumber', {
31
28
  describe: 'The VAT id number of the organization.',
@@ -49,7 +46,7 @@ export function builder(yargs) {
49
46
  describe: 'Optional reference the organization can set to appear on the invoice.',
50
47
  });
51
48
  }
52
- export async function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, remote, streetName, vatIdNumber, website, zipCode, }) {
49
+ export async function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, remote, streetName, vatIdNumber, website, zipCode, }) {
53
50
  await authenticate(remote, 'organizations:write', clientCredentials);
54
51
  await updateOrganization({
55
52
  description: desc,
@@ -58,7 +55,6 @@ export async function handler({ city, clientCredentials, countryCode, descriptio
58
55
  icon,
59
56
  id,
60
57
  name,
61
- preferredPaymentProvider,
62
58
  website,
63
59
  streetName,
64
60
  houseNumber,
@@ -1,5 +1,4 @@
1
1
  import { type ReadStream } from 'node:fs';
2
- import { type PaymentProvider } from '@appsemble/types';
3
2
  import { type Argv } from 'yargs';
4
3
  import { type BaseArguments } from '../../types.js';
5
4
  interface UpsertOrganizationArguments extends BaseArguments {
@@ -9,7 +8,6 @@ interface UpsertOrganizationArguments extends BaseArguments {
9
8
  name: string;
10
9
  website: string;
11
10
  icon: ReadStream;
12
- preferredPaymentProvider: PaymentProvider;
13
11
  vatIdNumber: string;
14
12
  streetName: string;
15
13
  houseNumber: string;
@@ -21,5 +19,5 @@ interface UpsertOrganizationArguments extends BaseArguments {
21
19
  export declare const command = "upsert <id>";
22
20
  export declare const description = "Create a new organization for the given id or update if there exists one already.";
23
21
  export declare function builder(yargs: Argv): Argv<any>;
24
- export declare function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, remote, streetName, vatIdNumber, website, zipCode, }: UpsertOrganizationArguments): Promise<void>;
22
+ export declare function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, remote, streetName, vatIdNumber, website, zipCode, }: UpsertOrganizationArguments): Promise<void>;
25
23
  export {};
@@ -23,9 +23,6 @@ export function builder(yargs) {
23
23
  .option('icon', {
24
24
  describe: 'The file location of the icon representing the organization.',
25
25
  coerce: coerceFile,
26
- })
27
- .option('preferredPaymentProvider', {
28
- describe: 'The preferred payment provider of the organization.',
29
26
  })
30
27
  .option('vatIdNumber', {
31
28
  describe: 'The VAT id number of the organization.',
@@ -49,7 +46,7 @@ export function builder(yargs) {
49
46
  describe: 'Optional reference the organization can set to appear on the invoice.',
50
47
  });
51
48
  }
52
- export async function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, remote, streetName, vatIdNumber, website, zipCode, }) {
49
+ export async function handler({ city, clientCredentials, countryCode, description: desc, email, houseNumber, icon, id, invoiceReference, name, remote, streetName, vatIdNumber, website, zipCode, }) {
53
50
  await authenticate(remote, 'organizations:write', clientCredentials);
54
51
  await upsertOrganization({
55
52
  description: desc,
@@ -58,7 +55,6 @@ export async function handler({ city, clientCredentials, countryCode, descriptio
58
55
  icon,
59
56
  id,
60
57
  name,
61
- preferredPaymentProvider,
62
58
  website,
63
59
  streetName,
64
60
  houseNumber,
package/lib/app.d.ts CHANGED
@@ -120,6 +120,10 @@ interface PublishAppParams {
120
120
  * Whether to publish seed members from `members/index.json` after publishing the app.
121
121
  */
122
122
  members?: boolean;
123
+ /**
124
+ * Languages officially supported by the app
125
+ */
126
+ supportedLanguages?: string[];
123
127
  /**
124
128
  * Whether assets from the `assets` directory should be published after publishing the app.
125
129
  */
@@ -221,6 +225,10 @@ interface UpdateAppParams {
221
225
  * Whether to publish seed members from `members/index.json` after publishing the app.
222
226
  */
223
227
  members?: boolean;
228
+ /**
229
+ * Languages officially supported by the app
230
+ */
231
+ supportedLanguages?: string[];
224
232
  /**
225
233
  * Whether assets from the `assets` directory should be published after publishing the app.
226
234
  */
@@ -337,6 +345,10 @@ interface PatchAppParams {
337
345
  * Whether to prompt the app users to display the installation prompts
338
346
  */
339
347
  displayInstallationPrompt?: boolean;
348
+ /**
349
+ * Languages officially supported by the app
350
+ */
351
+ supportedLanguages?: string[];
340
352
  /**
341
353
  * Whether the Appsemble OAuth2 login method should be shown.
342
354
  */
package/lib/app.js CHANGED
@@ -808,6 +808,7 @@ export async function publishApp({ clientCredentials, context, dryRun, modifyCon
808
808
  const assets = appsembleContext.assets ?? options.assets;
809
809
  const resources = appsembleContext.resources ?? options.resources;
810
810
  const members = appsembleContext.members ?? options.members;
811
+ const supportedLanguages = appsembleContext.supportedLanguages ?? options.supportedLanguages;
811
812
  const appLock = appsembleContext.appLock || 'unlocked';
812
813
  const dbName = appsembleContext.dbName ?? options.dbName;
813
814
  const dbHost = appsembleContext.dbHost ?? options.dbHost;
@@ -843,6 +844,9 @@ export async function publishApp({ clientCredentials, context, dryRun, modifyCon
843
844
  if (dbPassword) {
844
845
  formData.append('dbPassword', dbPassword);
845
846
  }
847
+ if (supportedLanguages?.length) {
848
+ formData.append('supportedLanguages', JSON.stringify(supportedLanguages));
849
+ }
846
850
  if (icon) {
847
851
  const realIcon = typeof icon === 'string' ? createReadStream(icon) : icon;
848
852
  logger.info(`Using icon from ${realIcon.path ?? 'stdin'}`);
@@ -1010,6 +1014,7 @@ export async function updateApp({ clientCredentials, context, force, path, ...op
1010
1014
  const metaPixelId = appsembleContext.metaPixelId ?? options.metaPixelId;
1011
1015
  const resources = appsembleContext.resources ?? options.resources;
1012
1016
  const members = appsembleContext.members ?? options.members;
1017
+ const supportedLanguages = appsembleContext.supportedLanguages ?? options.supportedLanguages;
1013
1018
  const assets = appsembleContext.assets ?? options.assets;
1014
1019
  const { appLock } = appsembleContext;
1015
1020
  const dbName = appsembleContext.dbName ?? options.dbName;
@@ -1046,6 +1051,9 @@ export async function updateApp({ clientCredentials, context, force, path, ...op
1046
1051
  if (dbPassword) {
1047
1052
  formData.append('dbPassword', dbPassword);
1048
1053
  }
1054
+ if (supportedLanguages?.length) {
1055
+ formData.append('supportedLanguages', JSON.stringify(supportedLanguages));
1056
+ }
1049
1057
  if (icon) {
1050
1058
  const realIcon = typeof icon === 'string' ? createReadStream(icon) : icon;
1051
1059
  logger.info(`Using icon from ${realIcon.path ?? 'stdin'}`);
@@ -1135,6 +1143,9 @@ export async function updateApp({ clientCredentials, context, force, path, ...op
1135
1143
  }
1136
1144
  export async function patchApp({ id, remote, ...options }) {
1137
1145
  const formData = new FormData();
1146
+ if (options.supportedLanguages?.length) {
1147
+ formData.append('supportedLanguages', JSON.stringify(options.supportedLanguages));
1148
+ }
1138
1149
  if (options.path !== undefined) {
1139
1150
  logger.info(`Setting app path to ${options.path}`);
1140
1151
  formData.append('path', options.path);
@@ -1,5 +1,4 @@
1
1
  import { type ReadStream } from 'node:fs';
2
- import { type PaymentProvider } from '@appsemble/types';
3
2
  interface OrganizationArguments {
4
3
  description: string;
5
4
  email: string;
@@ -7,7 +6,6 @@ interface OrganizationArguments {
7
6
  icon: ReadStream;
8
7
  name: string;
9
8
  website: string;
10
- preferredPaymentProvider: PaymentProvider;
11
9
  vatIdNumber: string | null;
12
10
  streetName: string | null;
13
11
  houseNumber: string | null;
@@ -16,7 +14,7 @@ interface OrganizationArguments {
16
14
  countryCode: string | null;
17
15
  invoiceReference: string | null;
18
16
  }
19
- export declare function createOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, streetName, vatIdNumber, website, zipCode, }: OrganizationArguments): Promise<void>;
20
- export declare function updateOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, streetName, vatIdNumber, website, zipCode, }: OrganizationArguments): Promise<void>;
21
- export declare function upsertOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, streetName, vatIdNumber, website, zipCode, }: OrganizationArguments): Promise<void>;
17
+ export declare function createOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, streetName, vatIdNumber, website, zipCode, }: OrganizationArguments): Promise<void>;
18
+ export declare function updateOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, streetName, vatIdNumber, website, zipCode, }: OrganizationArguments): Promise<void>;
19
+ export declare function upsertOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, streetName, vatIdNumber, website, zipCode, }: OrganizationArguments): Promise<void>;
22
20
  export {};
@@ -1,7 +1,7 @@
1
1
  import { logger } from '@appsemble/node-utils';
2
2
  import axios from 'axios';
3
3
  import FormData from 'form-data';
4
- export async function createOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, streetName, vatIdNumber, website, zipCode, }) {
4
+ export async function createOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, streetName, vatIdNumber, website, zipCode, }) {
5
5
  const formData = new FormData();
6
6
  formData.append('id', id);
7
7
  if (description) {
@@ -24,10 +24,6 @@ export async function createOrganization({ city, countryCode, description, email
24
24
  logger.info(`Setting website to ${website}`);
25
25
  formData.append('website', website);
26
26
  }
27
- if (preferredPaymentProvider) {
28
- logger.info(`Setting preferred payment provider to ${preferredPaymentProvider}`);
29
- formData.append('preferredPaymentProvider', preferredPaymentProvider);
30
- }
31
27
  if (vatIdNumber) {
32
28
  logger.info(`Setting vatIdNumber to ${vatIdNumber}`);
33
29
  formData.append('vatIdNumber', vatIdNumber);
@@ -66,7 +62,7 @@ export async function createOrganization({ city, countryCode, description, email
66
62
  throw error;
67
63
  }
68
64
  }
69
- export async function updateOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, streetName, vatIdNumber, website, zipCode, }) {
65
+ export async function updateOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, streetName, vatIdNumber, website, zipCode, }) {
70
66
  logger.info(`Updating organization ${id}${name ? ` (${name})` : ''}`);
71
67
  const formData = new FormData();
72
68
  if (description) {
@@ -89,10 +85,6 @@ export async function updateOrganization({ city, countryCode, description, email
89
85
  logger.info(`Setting website to ${website}`);
90
86
  formData.append('website', website);
91
87
  }
92
- if (preferredPaymentProvider) {
93
- logger.info(`Setting preferred payment provider to ${preferredPaymentProvider}`);
94
- formData.append('preferredPaymentProvider', preferredPaymentProvider);
95
- }
96
88
  if (vatIdNumber) {
97
89
  logger.info(`Setting vat id number to ${vatIdNumber}`);
98
90
  formData.append('vatIdNumber', vatIdNumber);
@@ -130,7 +122,7 @@ export async function updateOrganization({ city, countryCode, description, email
130
122
  throw error;
131
123
  }
132
124
  }
133
- export async function upsertOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, preferredPaymentProvider, streetName, vatIdNumber, website, zipCode, }) {
125
+ export async function upsertOrganization({ city, countryCode, description, email, houseNumber, icon, id, invoiceReference, name, streetName, vatIdNumber, website, zipCode, }) {
134
126
  try {
135
127
  await axios.get(`/api/organizations/${id}`);
136
128
  await updateOrganization({
@@ -140,7 +132,6 @@ export async function upsertOrganization({ city, countryCode, description, email
140
132
  id,
141
133
  name,
142
134
  website,
143
- preferredPaymentProvider,
144
135
  vatIdNumber,
145
136
  streetName,
146
137
  houseNumber,
@@ -159,7 +150,6 @@ export async function upsertOrganization({ city, countryCode, description, email
159
150
  id,
160
151
  name,
161
152
  website,
162
- preferredPaymentProvider,
163
153
  vatIdNumber,
164
154
  streetName,
165
155
  houseNumber,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appsemble/cli",
3
- "version": "0.35.11-test.3",
3
+ "version": "0.35.14",
4
4
  "description": "The CLI for developing with Appsemble apps and blocks",
5
5
  "keywords": [
6
6
  "app",
@@ -44,10 +44,10 @@
44
44
  "test": "vitest"
45
45
  },
46
46
  "dependencies": {
47
- "@appsemble/node-utils": "0.35.11-test.3",
48
- "@appsemble/types": "0.35.11-test.3",
49
- "@appsemble/lang-sdk": "0.35.11-test.3",
50
- "@appsemble/utils": "0.35.11-test.3",
47
+ "@appsemble/node-utils": "0.35.14",
48
+ "@appsemble/types": "0.35.14",
49
+ "@appsemble/lang-sdk": "0.35.14",
50
+ "@appsemble/utils": "0.35.14",
51
51
  "@fortawesome/fontawesome-common-types": "^6.0.0",
52
52
  "@koa/cors": "^5.0.0",
53
53
  "@odata/parser": "^0.2.0",
@@ -58,7 +58,7 @@
58
58
  "csvtojson": "^2.0.0",
59
59
  "esbuild": "^0.21.5",
60
60
  "fast-glob": "^3.0.0",
61
- "form-data": "^4.0.0",
61
+ "form-data": "^4.0.4",
62
62
  "global-cache-dir": "^6.0.0",
63
63
  "inquirer": "^9.0.0",
64
64
  "jsonschema": "~1.4.1",
@@ -90,8 +90,8 @@
90
90
  "yargs": "^17.0.0"
91
91
  },
92
92
  "devDependencies": {
93
- "@appsemble/types": "0.35.11-test.3",
94
- "@appsemble/server": "0.35.11-test.3",
93
+ "@appsemble/types": "0.35.14",
94
+ "@appsemble/server": "0.35.14",
95
95
  "bcrypt": "5.1.1",
96
96
  "axios-test-instance": "7.0.0",
97
97
  "@types/concat-stream": "2.0.3",
@@ -103,7 +103,7 @@
103
103
  "concat-stream": "2.0.0",
104
104
  "vitest": "2.1.9",
105
105
  "sequelize": "6.37.7",
106
- "minio": "8.0.5"
106
+ "minio": "8.0.6"
107
107
  },
108
108
  "optionalDependencies": {
109
109
  "keytar": "^7.0.0"
@@ -25,6 +25,7 @@ export async function createSettings({ context, host, languages, }) {
25
25
  appUpdated: appsembleApp.$updated,
26
26
  logins: [],
27
27
  development: true,
28
+ supportedLanguages: ['en'],
28
29
  });
29
30
  }
30
31
  //# sourceMappingURL=createSettings.js.map
@@ -6,7 +6,7 @@ pages:
6
6
  - name: Example Page A
7
7
  blocks:
8
8
  - type: action-button
9
- version: 0.35.11-test.3
9
+ version: 0.35.14
10
10
  parameters:
11
11
  icon: arrow-right
12
12
  actions:
@@ -17,7 +17,7 @@ pages:
17
17
  - name: Example Page B
18
18
  blocks:
19
19
  - type: action-button
20
- version: 0.35.11-test.3
20
+ version: 0.35.14
21
21
  parameters:
22
22
  icon: arrow-left
23
23
  actions:
@@ -5,7 +5,7 @@
5
5
  "*.css"
6
6
  ],
7
7
  "dependencies": {
8
- "@appsemble/sdk": "0.35.11-test.3",
8
+ "@appsemble/sdk": "0.35.14",
9
9
  "mini-jsx": "^4.0.0"
10
10
  }
11
11
  }
@@ -5,8 +5,8 @@
5
5
  "*.css"
6
6
  ],
7
7
  "dependencies": {
8
- "@appsemble/preact": "0.35.11-test.3",
9
- "@appsemble/sdk": "0.35.11-test.3",
8
+ "@appsemble/preact": "0.35.14",
9
+ "@appsemble/sdk": "0.35.14",
10
10
  "preact": "^10.0.0"
11
11
  }
12
12
  }
@@ -5,6 +5,6 @@
5
5
  "*.css"
6
6
  ],
7
7
  "dependencies": {
8
- "@appsemble/sdk": "0.35.11-test.3"
8
+ "@appsemble/sdk": "0.35.14"
9
9
  }
10
10
  }