@appsemble/cli 0.21.2 → 0.22.0

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 (67) hide show
  1. package/README.md +46 -11
  2. package/commands/app/create.d.ts +11 -24
  3. package/commands/app/create.js +98 -62
  4. package/commands/app/index.js +2 -0
  5. package/commands/app/publish.d.ts +27 -0
  6. package/commands/app/publish.js +75 -0
  7. package/commands/asset/index.js +2 -2
  8. package/commands/asset/{create.d.ts → publish.d.ts} +4 -4
  9. package/commands/asset/{create.js → publish.js} +8 -8
  10. package/commands/block/create.d.ts +12 -0
  11. package/commands/block/create.js +66 -0
  12. package/commands/block/delete.d.ts +11 -0
  13. package/commands/block/delete.js +22 -0
  14. package/commands/block/index.js +4 -0
  15. package/commands/migrate.js +2 -2
  16. package/commands/resource/index.js +2 -2
  17. package/commands/resource/{create.d.ts → publish.d.ts} +4 -4
  18. package/commands/resource/{create.js → publish.js} +8 -8
  19. package/commands/serve.js +20 -14
  20. package/index.js +2 -3
  21. package/lib/app.d.ts +8 -9
  22. package/lib/app.js +8 -8
  23. package/lib/asset.d.ts +4 -4
  24. package/lib/asset.js +2 -2
  25. package/lib/block.d.ts +8 -0
  26. package/lib/block.js +6 -6
  27. package/lib/createServers.js +13 -9
  28. package/lib/getBlockConfigFromTypeScript.test.js +3 -1
  29. package/lib/initAxios.js +2 -3
  30. package/lib/resource.d.ts +5 -5
  31. package/lib/resource.js +3 -3
  32. package/package.json +14 -7
  33. package/server/db/methods.js +5 -1
  34. package/server/options/getAppBlockStyles.js +17 -17
  35. package/server/options/parseQuery.js +13 -9
  36. package/templates/apps/empty/.appsemblerc.yaml +15 -0
  37. package/templates/apps/empty/app-definition.yaml +26 -0
  38. package/templates/apps/empty/assets/.gitkeep +0 -0
  39. package/templates/apps/empty/i18n/en.json +0 -0
  40. package/templates/apps/empty/resources/.gitkeep +0 -0
  41. package/templates/apps/empty/themes/@appsemble/.gitkeep +0 -0
  42. package/templates/apps/empty/themes/core/index.css +3 -0
  43. package/templates/apps/empty/themes/shared/index.css +3 -0
  44. package/templates/blocks/mini-jsx/.appsemblerc.yaml +1 -0
  45. package/templates/blocks/mini-jsx/README.md +11 -0
  46. package/templates/blocks/mini-jsx/block.ts +48 -0
  47. package/templates/blocks/mini-jsx/i18n/en.json +3 -0
  48. package/templates/blocks/mini-jsx/package.json +8 -0
  49. package/templates/blocks/mini-jsx/src/index.module.css +19 -0
  50. package/templates/blocks/mini-jsx/src/index.tsx +61 -0
  51. package/templates/blocks/mini-jsx/tsconfig.json +9 -0
  52. package/templates/blocks/preact/.appsemblerc.yaml +1 -0
  53. package/templates/blocks/preact/README.md +11 -0
  54. package/templates/blocks/preact/block.ts +37 -0
  55. package/templates/blocks/preact/i18n/en.json +5 -0
  56. package/templates/blocks/preact/package.json +9 -0
  57. package/templates/blocks/preact/src/index.tsx +99 -0
  58. package/templates/blocks/preact/tsconfig.json +9 -0
  59. package/templates/blocks/vanilla/.appsemblerc.yaml +1 -0
  60. package/templates/blocks/vanilla/README.md +10 -0
  61. package/templates/blocks/vanilla/block.ts +20 -0
  62. package/templates/blocks/vanilla/i18n/en.json +3 -0
  63. package/templates/blocks/vanilla/package.json +7 -0
  64. package/templates/blocks/vanilla/src/index.ts +25 -0
  65. package/templates/blocks/vanilla/tsconfig.json +7 -0
  66. package/types.d.ts +0 -46
  67. package/vitest.config.d.ts +0 -2
@@ -1,26 +1,26 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
+ import { opendirSafe, } from '@appsemble/node-utils';
3
4
  import { parseBlockName } from '@appsemble/utils';
4
- import globalCacheDir from 'global-cache-dir';
5
5
  import { processCss } from '../../lib/processCss.js';
6
6
  export async function getAppBlockStyles({ context, name, }) {
7
- const { appBlocks, blockConfigs } = context;
8
- const block = appBlocks.find((appBlock) => appBlock.name === name);
9
- const filename = block.files.find((file) => file.endsWith('.css'));
10
- const [organization, blockName] = parseBlockName(name);
11
- if (filename) {
12
- let stylePath;
13
- if (existsSync(join(process.cwd(), 'blocks', blockName))) {
14
- const blockConfig = blockConfigs.find((config) => config.name === name);
15
- stylePath = `${blockConfig.dir}/${blockConfig.output}/${filename}`;
16
- }
17
- else {
18
- const cacheDir = await globalCacheDir('appsemble');
19
- stylePath = join(cacheDir, 'blocks', organization, blockName, block.version, 'assets', filename);
20
- }
21
- const style = await processCss(stylePath);
7
+ const { appPath } = context;
8
+ const [, blockName] = parseBlockName(name);
9
+ let style = '';
10
+ const themeDirPath = join(appPath, 'theme');
11
+ if (!existsSync(themeDirPath)) {
22
12
  return [{ style }];
23
13
  }
24
- return [];
14
+ await opendirSafe(join(appPath, 'theme'), async (themeDir, themeStat) => {
15
+ const blockDir = join(themeDir, blockName);
16
+ if (themeStat.name.startsWith('@') && existsSync(blockDir)) {
17
+ await opendirSafe(blockDir, async (file) => {
18
+ if (file.endsWith('.css')) {
19
+ style = await processCss(join(file));
20
+ }
21
+ });
22
+ }
23
+ });
24
+ return [{ style }];
25
25
  }
26
26
  //# sourceMappingURL=getAppBlockStyles.js.map
@@ -10,10 +10,8 @@ const operators = new Map([
10
10
  ]);
11
11
  function renameOData(name) {
12
12
  switch (name) {
13
- case '$author':
13
+ case '$author/id':
14
14
  return 'AuthorId';
15
- case 'id':
16
- return name;
17
15
  default:
18
16
  return name;
19
17
  }
@@ -61,8 +59,15 @@ function parseOdataFilter(query) {
61
59
  if (!query) {
62
60
  return {};
63
61
  }
64
- const ast = typeof query === 'string' ? defaultParser.filter(query) : query;
65
- return processLogicalExpression(ast);
62
+ if (typeof query === 'string') {
63
+ const renamedQuery = query
64
+ .split(' ')
65
+ .map((queryItem) => renameOData(queryItem))
66
+ .join(' ');
67
+ const ast = defaultParser.filter(renamedQuery);
68
+ return processLogicalExpression(ast);
69
+ }
70
+ return processLogicalExpression(query);
66
71
  }
67
72
  function parseOdataOrder(query) {
68
73
  if (!query) {
@@ -74,9 +79,8 @@ function parseOdataOrder(query) {
74
79
  });
75
80
  }
76
81
  export function parseQuery({ $filter, $orderby }) {
77
- return {
78
- where: parseOdataFilter($filter),
79
- order: parseOdataOrder($orderby ? $orderby.replaceAll(/(^|\B)\$author\/id(\b|$)/g, '$author') : undefined),
80
- };
82
+ const where = parseOdataFilter($filter);
83
+ const order = parseOdataOrder($orderby);
84
+ return { where, order };
81
85
  }
82
86
  //# sourceMappingURL=parseQuery.js.map
@@ -0,0 +1,15 @@
1
+ context:
2
+ development:
3
+ organization: appsemble
4
+ remote: http://localhost:9999
5
+ visibility: public
6
+ production:
7
+ remote: https://appsemble.app
8
+ visibility: public
9
+ review:
10
+ organization: appsemble
11
+ visibility: public
12
+ staging:
13
+ visibility: public
14
+ remote: https://staging.appsemble.review
15
+ organization: appsemble
@@ -0,0 +1,26 @@
1
+ name: Empty
2
+ description: Empty App is a bare-bones app with two pages and buttons switching between them.
3
+ defaultPage: Example Page A
4
+
5
+ pages:
6
+ - name: Example Page A
7
+ blocks:
8
+ - type: action-button
9
+ version: 0.22.0
10
+ parameters:
11
+ icon: arrow-right
12
+ actions:
13
+ onClick:
14
+ type: link
15
+ to: Example Page B
16
+
17
+ - name: Example Page B
18
+ blocks:
19
+ - type: action-button
20
+ version: 0.22.0
21
+ parameters:
22
+ icon: arrow-left
23
+ actions:
24
+ onClick:
25
+ type: link
26
+ to: Example Page A
File without changes
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ /*
2
+ * Core styling gets applied to any part of an Appsemble application not related to a block, such as the navigation bar, side menu, login view, message toasts, etc. The styling applied to the core modules do not get applied to blocks.
3
+ */
@@ -0,0 +1,3 @@
1
+ /*
2
+ * Shared styling gets applied to each individual block, as well as the Appsemble core. This is useful for applying styles to elements that can appear in both the core modules and blocks such as input fields. It can also be used to apply CSS variables.
3
+ */
@@ -0,0 +1 @@
1
+ output: dist
@@ -0,0 +1,11 @@
1
+ This block was bootstrapped using the following command:
2
+
3
+ ```sh
4
+ npm init appsemble block
5
+ ```
6
+
7
+ This block renders a single data entity that is emitted through an Appsemble block event. It uses
8
+ [`mini-jsx`](https://gitlab.com/appsemble/mini-jsx) to define raw DOM nodes using JSX syntax.
9
+
10
+ This readme will be rendered on <https://appsemble.app> when the block is published. Replace the
11
+ contents of this document with a useful block description.
@@ -0,0 +1,48 @@
1
+ // Blocks can actions, parameters, messages, and event listeners and emitters. These can be defined
2
+ // by augmenting the @appsemble/sdk module. Typically this happens in a file named block.ts. When a
3
+ // block is published, the CLI will process the augmented interfaces and validate the app definition
4
+ // complies with them. The JSDoc will be used to render documentation.
5
+ import { type IconName, type Remapper } from '@appsemble/sdk';
6
+
7
+ /**
8
+ * A field to display.
9
+ */
10
+ export interface Field {
11
+ /**
12
+ * The value of the property to render.
13
+ */
14
+ value: Remapper;
15
+
16
+ /**
17
+ * The fontawesome icon to render.
18
+ */
19
+ icon: IconName;
20
+
21
+ /**
22
+ * The label to render.
23
+ */
24
+ label?: Remapper;
25
+ }
26
+
27
+ declare module '@appsemble/sdk' {
28
+ interface EventListeners {
29
+ /**
30
+ * The event to listen on for data to display.
31
+ */
32
+ data: never;
33
+ }
34
+
35
+ interface Messages {
36
+ /**
37
+ * This message is displayed when there was an error loading data.
38
+ */
39
+ error: never;
40
+ }
41
+
42
+ interface Parameters {
43
+ /**
44
+ * The fields to display.
45
+ */
46
+ fields: Field[];
47
+ }
48
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "error": "There was a problem loading the data."
3
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "private": true,
3
+ "type": "module",
4
+ "dependencies": {
5
+ "@appsemble/sdk": "0.22.0",
6
+ "mini-jsx": "^3.0.0"
7
+ }
8
+ }
@@ -0,0 +1,19 @@
1
+ .wrapper {
2
+ display: flex;
3
+ margin: 10px auto;
4
+ max-width: 640px;
5
+ }
6
+
7
+ .field {
8
+ display: inline;
9
+ flex: 1 1;
10
+ text-align: center;
11
+ }
12
+
13
+ .icon {
14
+ font-size: calc(min(3em, 10vw));
15
+ }
16
+
17
+ .value {
18
+ margin: 8px 0 2px;
19
+ }
@@ -0,0 +1,61 @@
1
+ // `src/index.tsx` is the initial entry point of the block source code run. For small blocks this
2
+ // often contains the entire logic of the block. Bigger blocks are often split into smaller modules.
3
+ import { bootstrap } from '@appsemble/sdk';
4
+
5
+ import styles from './index.module.css';
6
+
7
+ // The bootstrap function injects various properties that can be destructured. You can use your
8
+ // editor’s autocomplete to see which variables are available.
9
+ bootstrap(({ events, parameters: { fields }, utils: { fa, formatMessage, remap } }) => {
10
+ /**
11
+ * The wrapper element is used to assign data to when it has loaded asynchronously.
12
+ */
13
+ const wrapper = (
14
+ // In this template the JSX is handled by mini-jsx (https://gitlab.com/appsemble/mini-jsx).
15
+ // This is a small library that turns JSX into plain DOM nodes. Unlike React or Preact, no
16
+ // virtual DOM or state management is involved.
17
+ <div className={styles.wrapper}>
18
+ <div className={styles.loader} />
19
+ </div>
20
+ );
21
+
22
+ // The preferred way to listen for handling data is using event listeners. At first it may seem
23
+ // simpler to use actions, but event handlers give users the ability to do additional processing
24
+ // in another block, or to render the same data in different blocks. Typically user data is loaded
25
+ // using the data-loader block.
26
+ events.on.data((data, error) => {
27
+ while (wrapper.lastChild) {
28
+ wrapper.lastChild.remove();
29
+ }
30
+
31
+ if (error) {
32
+ // It’s always important to handle errors. Events may emit errors for various reasons that are
33
+ // out of control for this block.
34
+ wrapper.append(formatMessage('error'));
35
+ } else {
36
+ wrapper.append(
37
+ ...fields.map(({ icon, label, value }) => {
38
+ // The remap utility is a powerful tool to transform user data. A full reference is found
39
+ // on https://appsemble.app/docs/reference/remapper. However, for the block all that
40
+ // matters is we can pass in a user defined remapper and a value, and get the value the
41
+ // user wants to use.
42
+ const remappedLabel = remap(label, data) as string;
43
+
44
+ return (
45
+ <div className={styles.field}>
46
+ <i className={`${fa(icon)} ${styles.icon}`} />
47
+ {/* Bulma classes are supported. See https://bulma.io/documentation */}
48
+ <div className={`has-text-weight-bold ${styles.value}`}>
49
+ {remap(value, data) as string}
50
+ </div>
51
+ {remappedLabel ? <div>{remappedLabel}</div> : null}
52
+ </div>
53
+ );
54
+ }),
55
+ );
56
+ }
57
+ });
58
+
59
+ // If a DOM node is returned by the bootstrap function, it will be rendered in the shadow root.
60
+ return <div>{wrapper}</div>;
61
+ });
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig",
3
+ "compilerOptions": {
4
+ "jsx": "react-jsx",
5
+ "jsxImportSource": "mini-jsx",
6
+ "lib": ["dom", "dom.iterable", "esnext"],
7
+ "types": ["@appsemble/webpack-config/types"]
8
+ }
9
+ }
@@ -0,0 +1 @@
1
+ output: dist
@@ -0,0 +1,11 @@
1
+ This block was bootstrapped using the following command:
2
+
3
+ ```sh
4
+ npm init appsemble block
5
+ ```
6
+
7
+ This block renders a list of data entities that is emitted through an Appsemble block event. It uses
8
+ [`preact`](https://preactjs.com) to define a block.
9
+
10
+ This readme will be rendered on <https://appsemble.app> when the block is published. Replace the
11
+ contents of this document with a useful block description.
@@ -0,0 +1,37 @@
1
+ // Blocks can actions, parameters, messages, and event listeners and emitters. These can be defined
2
+ // by augmenting the @appsemble/sdk module. Typically this happens in a file named block.ts. When a
3
+ // block is published, the CLI will process the augmented interfaces and validate the app definition
4
+ // complies with them. The JSDoc will be used to render documentation.
5
+
6
+ declare module '@appsemble/sdk' {
7
+ interface EventListeners {
8
+ /**
9
+ * This event can be used to receive incoming data to display.
10
+ */
11
+ data: never;
12
+ }
13
+
14
+ interface Messages {
15
+ /**
16
+ * This message is displayed if the data is empty.
17
+ */
18
+ empty: never;
19
+
20
+ /**
21
+ * This message is displayed if there was a problem loading the data.
22
+ */
23
+ error: never;
24
+
25
+ /**
26
+ * This message is displayed if no data has been loaded yet.
27
+ */
28
+ loading: never;
29
+ }
30
+
31
+ interface Parameters {
32
+ /**
33
+ * A list of fields to render out in a table.
34
+ */
35
+ fields: string[];
36
+ }
37
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "empty": "There is no data to display",
3
+ "error": "There was a problem loading the data.",
4
+ "loading": "Loading…"
5
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "private": true,
3
+ "type": "module",
4
+ "dependencies": {
5
+ "@appsemble/preact": "0.22.0",
6
+ "@appsemble/sdk": "0.22.0",
7
+ "preact": "^10.0.0"
8
+ }
9
+ }
@@ -0,0 +1,99 @@
1
+ // `src/index.tsx` is the initial entry point of the block source code run. For small blocks this
2
+ // often contains the entire logic of the block. Bigger blocks are often split into smaller modules.
3
+
4
+ // Normally bootstrap is imported from @appsemble/sdk. When using preact, it must be imported from
5
+ // @appsemble/preact instead.
6
+ import { bootstrap, FormattedMessage } from '@appsemble/preact';
7
+ import { useEffect, useState } from 'preact/hooks';
8
+
9
+ // The bootstrap function injects various properties that can be destructured. You can use your
10
+ // editor’s autocomplete to see which variables are available. These properties can also be accessed
11
+ // from anywhere in a preact component using the useBlock() hook.
12
+ bootstrap(({ events, parameters: { fields }, ready }) => {
13
+ // The @appsemble/preact bootstrap function renders a component. This means preact hooks such as
14
+ // useState and useEffect can be used.
15
+ const [data, setData] = useState<any[]>();
16
+ const [error, setError] = useState(false);
17
+
18
+ // The block needs to call ready() once when it’s ready. Appsemble waits for all blocks to be
19
+ // ready before it dispatches any actions or events.
20
+ useEffect(() => {
21
+ ready();
22
+ }, [ready]);
23
+
24
+ // The preferred way to listen for handling data is using event listeners. At first it may seem
25
+ // simpler to use actions, but event handlers give users the ability to do additional processing
26
+ // in another block, or to render the same data in different blocks. Typically user data is loaded
27
+ // using the data-loader block.
28
+ useEffect(() => {
29
+ const onData = (newData: unknown[], newError: unknown): void => {
30
+ if (newError) {
31
+ setError(true);
32
+ // @ts-expect-error this is valid.
33
+ setData();
34
+ } else {
35
+ setData(newData);
36
+ setError(false);
37
+ }
38
+ };
39
+
40
+ events.on.data(onData);
41
+
42
+ return () => {
43
+ events.off.data(onData);
44
+ };
45
+ }, [events]);
46
+
47
+ // It’s always important to handle errors. Events may emit errors for various reasons that are
48
+ // out of control for this block.
49
+ if (error) {
50
+ return (
51
+ <p>
52
+ <FormattedMessage id="error" />
53
+ </p>
54
+ );
55
+ }
56
+
57
+ // It’s always important to handle the loading state.
58
+ if (!data) {
59
+ return (
60
+ <p>
61
+ <FormattedMessage id="loading" />
62
+ </p>
63
+ );
64
+ }
65
+
66
+ // It’s always important to handle an empty state
67
+ if (!data.length) {
68
+ return (
69
+ <p>
70
+ <FormattedMessage id="empty" />
71
+ </p>
72
+ );
73
+ }
74
+
75
+ return (
76
+ // Bulma classes are supported in Appsemble blocks. See https://bulma.io/documentation
77
+ <table className="table">
78
+ <thead>
79
+ <tr>
80
+ {fields.map((field) => (
81
+ <th key={field}>{field}</th>
82
+ ))}
83
+ </tr>
84
+ </thead>
85
+ <tbody>
86
+ {data.map((item, dataIndex) => (
87
+ // Because any data may be emitted, it’s often hard to determine the correct key to use.
88
+ // Often an id property is known, at least this handles the use case of Appsemble
89
+ // resources.
90
+ <tr key={item.id || dataIndex}>
91
+ {fields.map((field) => (
92
+ <td key={field}>{item[field]}</td>
93
+ ))}
94
+ </tr>
95
+ ))}
96
+ </tbody>
97
+ </table>
98
+ );
99
+ });
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig",
3
+ "compilerOptions": {
4
+ "jsx": "react-jsx",
5
+ "jsxImportSource": "preact",
6
+ "lib": ["dom", "dom.iterable", "esnext"],
7
+ "types": ["@appsemble/webpack-config/types"]
8
+ }
9
+ }
@@ -0,0 +1 @@
1
+ output: dist
@@ -0,0 +1,10 @@
1
+ This block was bootstrapped using the following command:
2
+
3
+ ```sh
4
+ npm init appsemble block
5
+ ```
6
+
7
+ This block displays a button that dispatches an action when clicked.
8
+
9
+ This readme will be rendered on <https://appsemble.app> when the block is published. Replace the
10
+ contents of this document with a useful block description.
@@ -0,0 +1,20 @@
1
+ // Blocks can actions, parameters, messages, and event listeners and emitters. These can be defined
2
+ // by augmenting the @appsemble/sdk module. Typically this happens in a file named block.ts. When a
3
+ // block is published, the CLI will process the augmented interfaces and validate the app definition
4
+ // complies with them. The JSDoc will be used to render documentation.
5
+
6
+ declare module '@appsemble/sdk' {
7
+ interface Actions {
8
+ /**
9
+ * What happens if the button is clicked.
10
+ */
11
+ onClick: never;
12
+ }
13
+
14
+ interface Messages {
15
+ /**
16
+ * The button label.
17
+ */
18
+ label: never;
19
+ }
20
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "Click me"
3
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "private": true,
3
+ "type": "module",
4
+ "dependencies": {
5
+ "@appsemble/sdk": "0.22.0"
6
+ }
7
+ }
@@ -0,0 +1,25 @@
1
+ // `src/index.ts` is the initial entry point of the block source code run. For small blocks this
2
+ // often contains the entire logic of the block. Bigger blocks are often split into smaller modules.
3
+ import { bootstrap } from '@appsemble/sdk';
4
+
5
+ // The bootstrap function injects various properties that can be destructured. You can use your
6
+ // editor’s autocomplete to see which variables are available.
7
+ bootstrap(({ actions, utils }) => {
8
+ const button = document.createElement('button');
9
+ button.type = 'button';
10
+
11
+ // Using utils.formatMessage we can provide internationalized messages.
12
+ button.textContent = utils.formatMessage('label');
13
+
14
+ // Bulma classes are supported. See https://bulma.io/documentation
15
+ button.classList.add('button');
16
+
17
+ button.addEventListener('click', (event) => {
18
+ event.preventDefault();
19
+ // This dispatches a user defined action.
20
+ actions.onClick();
21
+ });
22
+
23
+ // If a DOM node is returned by the bootstrap function, it will be rendered in the shadow root.
24
+ return button;
25
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../../tsconfig",
3
+ "compilerOptions": {
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "types": ["@appsemble/webpack-config/types", "vitest/globals"]
6
+ }
7
+ }
package/types.d.ts CHANGED
@@ -42,49 +42,3 @@ export interface UpdateAppArguments extends BaseArguments {
42
42
  export interface MonoRepoPackageJson extends PackageJson {
43
43
  appsembleServer?: JsonObject;
44
44
  }
45
- export interface AppsembleContext {
46
- /**
47
- * If `remote` is specified, this will override `--remote` passed by the command line.
48
- */
49
- remote?: string;
50
- /**
51
- * If `organization` is specified, this will override `--organization` passed by the command line
52
- * when creating apps.
53
- */
54
- organization?: string;
55
- icon?: string;
56
- iconBackground?: string;
57
- maskableIcon?: string;
58
- /**
59
- * If `id` is specified, this will override `--id` passed by the command line when
60
- * updating an app.
61
- */
62
- id?: number;
63
- /**
64
- * The Google Analytics ID that should be used for the app.
65
- */
66
- googleAnalyticsId?: string;
67
- /**
68
- * The custom Sentry DSN for the app.
69
- */
70
- sentryDsn?: string;
71
- /**
72
- * The environment for the custom Sentry DSN for the app.
73
- */
74
- sentryEnvironment?: string;
75
- /**
76
- * If `visibility` is specified, this will override `--visibility` passed on the command line.
77
- */
78
- visibility?: AppVisibility;
79
- /**
80
- * If `template` is specified, this will override `--template` passed on the command line.
81
- */
82
- template?: boolean;
83
- }
84
- export interface AppsembleRC {
85
- /**
86
- * The background color to use for maskable icons.
87
- */
88
- iconBackground?: string;
89
- context?: Record<string, AppsembleContext>;
90
- }
@@ -1,2 +0,0 @@
1
- declare const _default: import("vitest/dist/config.js").UserProjectConfigExport;
2
- export default _default;