@kosdev-code/kos-ui-cli 2.0.8 → 2.0.9
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/package.json +2 -2
- package/src/lib/cli.mjs +59 -109
- package/src/lib/generators/cache/index.mjs +12 -0
- package/src/lib/generators/component/index.mjs +48 -0
- package/src/lib/{env-plopfile.mjs → generators/env/index.mjs} +17 -10
- package/src/lib/generators/i18n/namespace.mjs +55 -0
- package/src/lib/generators/metadata.json +150 -0
- package/src/lib/generators/model/companion.mjs +77 -0
- package/src/lib/generators/model/container.mjs +66 -0
- package/src/lib/generators/model/context.mjs +54 -0
- package/src/lib/generators/model/hook.mjs +54 -0
- package/src/lib/generators/model/model.mjs +63 -0
- package/src/lib/generators/plugin/index.mjs +82 -0
- package/src/lib/generators/project/app.mjs +37 -0
- package/src/lib/generators/project/i18n.mjs +36 -0
- package/src/lib/generators/project/plugin.mjs +36 -0
- package/src/lib/generators/project/splash.mjs +37 -0
- package/src/lib/generators/project/theme.mjs +36 -0
- package/src/lib/generators/workspace/index.mjs +30 -0
- package/src/lib/plopfile.mjs +47 -582
- package/src/lib/routing-plopfile.mjs +31 -63
- package/src/lib/scripts/generate-metadata.mjs +39 -0
- package/src/lib/utils/cache.mjs +128 -0
- package/src/lib/utils/exec.mjs +18 -0
- package/src/lib/utils/generator-loader.mjs +65 -0
- package/src/lib/utils/logger.mjs +0 -0
- package/src/lib/utils/nx-context.mjs +97 -0
- package/src/lib/utils/prompts.mjs +46 -0
- package/src/lib/utils/validators.mjs +10 -0
- package/src/lib/model-aware-plopfile.mjs +0 -274
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// generators/model/context.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import { getAllModels, getAllProjects } from "../../utils/nx-context.mjs";
|
|
4
|
+
export const metadata = {
|
|
5
|
+
key: "context",
|
|
6
|
+
name: "KOS Model React Context",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export default async function (plop) {
|
|
10
|
+
const allProjects = await getAllProjects();
|
|
11
|
+
const allModels = await getAllModels();
|
|
12
|
+
const modelChoices = allModels.map((m) => ({
|
|
13
|
+
name: `${m.model} (${m.project})`,
|
|
14
|
+
value: m.model,
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
plop.setActionType("createContext", async function (answers) {
|
|
18
|
+
const modelProject = allModels.find(
|
|
19
|
+
(m) => m.model === answers.modelName
|
|
20
|
+
)?.project;
|
|
21
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-context \
|
|
22
|
+
--appProject=${answers.componentProject} \
|
|
23
|
+
--modelProject=${modelProject} \
|
|
24
|
+
--name=${answers.modelName} \
|
|
25
|
+
--no-interactive ${answers.dryRun ? "--dryRun" : ""}`;
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
await execute(command);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
throw new Error(error);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return `Context created for ${answers.modelName} in ${answers.componentProject}`;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
plop.setGenerator("context", {
|
|
37
|
+
description: "Create a context for a KOS Model",
|
|
38
|
+
prompts: [
|
|
39
|
+
{
|
|
40
|
+
type: "list",
|
|
41
|
+
name: "modelName",
|
|
42
|
+
message: "Which model to use?",
|
|
43
|
+
choices: modelChoices,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: "list",
|
|
47
|
+
name: "componentProject",
|
|
48
|
+
message: "Which project should the context be created in?",
|
|
49
|
+
choices: allProjects,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
actions: () => [{ type: "createContext" }],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// generators/model/hook.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import { getAllModels, getAllProjects } from "../../utils/nx-context.mjs";
|
|
4
|
+
export const metadata = {
|
|
5
|
+
key: "hook",
|
|
6
|
+
name: "KOS Model React Hook",
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export default async function (plop) {
|
|
10
|
+
const allProjects = await getAllProjects();
|
|
11
|
+
const allModels = await getAllModels();
|
|
12
|
+
const modelChoices = allModels.map((m) => ({
|
|
13
|
+
name: `${m.model} (${m.project})`,
|
|
14
|
+
value: m.model,
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
plop.setActionType("createHook", async function (answers) {
|
|
18
|
+
const modelProject = allModels.find(
|
|
19
|
+
(m) => m.model === answers.modelName
|
|
20
|
+
)?.project;
|
|
21
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-hook \
|
|
22
|
+
--appProject=${answers.componentProject} \
|
|
23
|
+
--modelProject=${modelProject} \
|
|
24
|
+
--name=${answers.modelName} \
|
|
25
|
+
--no-interactive ${answers.dryRun ? "--dryRun" : ""}`;
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
await execute(command);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
throw new Error(error);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return `Hook created for ${answers.modelName} in ${answers.componentProject}`;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
plop.setGenerator("hook", {
|
|
37
|
+
description: "Create a hook for a KOS Model",
|
|
38
|
+
prompts: [
|
|
39
|
+
{
|
|
40
|
+
type: "list",
|
|
41
|
+
name: "modelName",
|
|
42
|
+
message: "Which model to use?",
|
|
43
|
+
choices: modelChoices,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: "list",
|
|
47
|
+
name: "componentProject",
|
|
48
|
+
message: "Which project should the hook be created in?",
|
|
49
|
+
choices: allProjects,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
actions: () => [{ type: "createHook" }],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// generators/model/model.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import {
|
|
4
|
+
getAllProjects,
|
|
5
|
+
getLibraryProjects,
|
|
6
|
+
getProjectDetails,
|
|
7
|
+
} from "../../utils/nx-context.mjs";
|
|
8
|
+
import { DEFAULT_PROMPTS, MODEL_PROMPTS } from "../../utils/prompts.mjs";
|
|
9
|
+
import { required } from "../../utils/validators.mjs";
|
|
10
|
+
|
|
11
|
+
export const metadata = {
|
|
12
|
+
key: "model",
|
|
13
|
+
name: "KOS Model",
|
|
14
|
+
invalidateCache: true,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default async function (plop) {
|
|
18
|
+
const allProjects = await getAllProjects();
|
|
19
|
+
const libraryProjects = await getLibraryProjects();
|
|
20
|
+
|
|
21
|
+
plop.setActionType("createModel", async function (answers) {
|
|
22
|
+
const modelProject = await getProjectDetails(answers.modelProject);
|
|
23
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-model \
|
|
24
|
+
--name=${answers.modelName} \
|
|
25
|
+
--modelProject=${modelProject.name} \
|
|
26
|
+
--skipRegistration=true \
|
|
27
|
+
--container=${!!answers.container} \
|
|
28
|
+
--dataServices=${!!answers.dataServices} \
|
|
29
|
+
--singleton=${!!answers.singleton} \
|
|
30
|
+
--parentAware=${!!answers.parentAware} \
|
|
31
|
+
--no-interactive ${answers.dryRun ? "--dryRun" : ""} --verbose`;
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
await execute(command);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
throw new Error(error);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return `Model ${answers.modelName} created in ${answers.modelProject}`;
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
plop.setGenerator("model", {
|
|
43
|
+
description: "Create a new KOS Model",
|
|
44
|
+
prompts: [
|
|
45
|
+
...DEFAULT_PROMPTS,
|
|
46
|
+
{
|
|
47
|
+
type: "input",
|
|
48
|
+
name: "modelName",
|
|
49
|
+
message: "Enter the name of the model",
|
|
50
|
+
validate: required,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: "list",
|
|
54
|
+
name: "modelProject",
|
|
55
|
+
message: "Which model project to use?",
|
|
56
|
+
validate: required,
|
|
57
|
+
choices: libraryProjects,
|
|
58
|
+
},
|
|
59
|
+
...MODEL_PROMPTS,
|
|
60
|
+
],
|
|
61
|
+
actions: () => [{ type: "createModel" }],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// generators/plugin/plugin.mjs
|
|
2
|
+
|
|
3
|
+
export const metadata = [
|
|
4
|
+
{ key: "pluginComponent", name: "KOS UI Plugin Component" },
|
|
5
|
+
{ key: "plugin:cui", name: "KOS UI Plugin CUI Configuration" },
|
|
6
|
+
{ key: "plugin:setup", name: "KOS UI Plugin Setup Step" },
|
|
7
|
+
{ key: "plugin:utility", name: "KOS UI Plugin Utility" },
|
|
8
|
+
{ key: "plugin:setting", name: "KOS UI Plugin Setting" },
|
|
9
|
+
{ key: "plugin:nav", name: "KOS UI Plugin Navigation View" },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
export default async function (plop) {
|
|
13
|
+
const { required } = await import("../../utils/validators.mjs");
|
|
14
|
+
const { getPluginProjects } = await import("../../utils/nx-context.mjs");
|
|
15
|
+
|
|
16
|
+
const pluginPrompts = [
|
|
17
|
+
{
|
|
18
|
+
type: "input",
|
|
19
|
+
name: "componentName",
|
|
20
|
+
message: "Enter the name of the component",
|
|
21
|
+
validate: required,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
type: "list",
|
|
25
|
+
name: "componentProject",
|
|
26
|
+
message: "Which project should the component be created in?",
|
|
27
|
+
choices: getPluginProjects,
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const pluginTypes = [
|
|
32
|
+
{ key: "plugin:cui", name: "cui" },
|
|
33
|
+
{ key: "plugin:setup", name: "setup" },
|
|
34
|
+
{ key: "plugin:utility", name: "utility" },
|
|
35
|
+
{ key: "plugin:setting", name: "setting" },
|
|
36
|
+
{ key: "plugin:nav", name: "nav" },
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
// Generic plugin component
|
|
40
|
+
plop.setGenerator("pluginComponent", {
|
|
41
|
+
description: "Create a new KOS Plugin Component",
|
|
42
|
+
prompts: [
|
|
43
|
+
...pluginPrompts,
|
|
44
|
+
{
|
|
45
|
+
type: "list",
|
|
46
|
+
name: "extensionPoint",
|
|
47
|
+
message: "What type of extension point is the plugin supporting?",
|
|
48
|
+
choices: pluginTypes.map((pt) => pt.name),
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
actions: [{ type: "createPluginComponent" }],
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Specific plugin type aliases
|
|
55
|
+
for (const { key, name } of pluginTypes) {
|
|
56
|
+
const prompts = [
|
|
57
|
+
...pluginPrompts,
|
|
58
|
+
...(name === "setting"
|
|
59
|
+
? [
|
|
60
|
+
{
|
|
61
|
+
type: "input",
|
|
62
|
+
name: "group",
|
|
63
|
+
message: "Which settings group should the setting be located?",
|
|
64
|
+
},
|
|
65
|
+
]
|
|
66
|
+
: []),
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
plop.setGenerator(key, {
|
|
70
|
+
description: `Create a new KOS ${
|
|
71
|
+
name[0].toUpperCase() + name.slice(1)
|
|
72
|
+
} Plugin Component`,
|
|
73
|
+
prompts,
|
|
74
|
+
actions: [
|
|
75
|
+
(data) => {
|
|
76
|
+
data.extensionPoint = name;
|
|
77
|
+
return { type: "createPluginComponent" };
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// generators/project/app.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import { required } from "../../utils/validators.mjs";
|
|
4
|
+
|
|
5
|
+
export const metadata = {
|
|
6
|
+
key: "project",
|
|
7
|
+
name: "KOS UI App Project",
|
|
8
|
+
invalidateCache: true,
|
|
9
|
+
};
|
|
10
|
+
export default async function (plop) {
|
|
11
|
+
plop.setActionType("createUiProject", async function (answers) {
|
|
12
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-ui-project \
|
|
13
|
+
--name=${answers.name} \
|
|
14
|
+
--no-interactive`;
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
await execute(command);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
throw new Error(error);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return `UI project ${answers.name} created.`;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
plop.setGenerator("project", {
|
|
26
|
+
description: "Create a new KOS UI App project",
|
|
27
|
+
prompts: [
|
|
28
|
+
{
|
|
29
|
+
type: "input",
|
|
30
|
+
name: "name",
|
|
31
|
+
message: "What is the name of the app project?",
|
|
32
|
+
validate: required,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
actions: () => [{ type: "createUiProject" }],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// generators/i18n/index.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import { required } from "../../utils/validators.mjs";
|
|
4
|
+
export const metadata = {
|
|
5
|
+
key: "i18n",
|
|
6
|
+
name: "KOS Localization Project",
|
|
7
|
+
invalidateCache: true,
|
|
8
|
+
};
|
|
9
|
+
export default async function (plop) {
|
|
10
|
+
plop.setActionType("createI18nProject", async function (answers) {
|
|
11
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-i18n-project \
|
|
12
|
+
--name=${answers.name} \
|
|
13
|
+
--no-interactive`;
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
await execute(command);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
throw new Error(error);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return `i18n project ${answers.name} created.`;
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
plop.setGenerator("i18n", {
|
|
25
|
+
description: "Create a new KOS UI i18n project",
|
|
26
|
+
prompts: [
|
|
27
|
+
{
|
|
28
|
+
type: "input",
|
|
29
|
+
name: "name",
|
|
30
|
+
message: "What is the name of the i18n project?",
|
|
31
|
+
validate: required,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
actions: () => [{ type: "createI18nProject" }],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// generators/project/plugin.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import { required } from "../../utils/validators.mjs";
|
|
4
|
+
export const metadata = {
|
|
5
|
+
key: "plugin",
|
|
6
|
+
name: "KOS Plugin Project",
|
|
7
|
+
invalidateCache: true,
|
|
8
|
+
};
|
|
9
|
+
export default async function (plop) {
|
|
10
|
+
plop.setActionType("createPluginProject", async function (answers) {
|
|
11
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-plugin-project \
|
|
12
|
+
--name=${answers.name} \
|
|
13
|
+
--no-interactive`;
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
await execute(command);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
throw new Error(error);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return `Plugin project ${answers.name} created.`;
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
plop.setGenerator("plugin", {
|
|
25
|
+
description: "Create a new KOS UI Plugin project",
|
|
26
|
+
prompts: [
|
|
27
|
+
{
|
|
28
|
+
type: "input",
|
|
29
|
+
name: "name",
|
|
30
|
+
message: "What is the name of the plugin project?",
|
|
31
|
+
validate: required,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
actions: () => [{ type: "createPluginProject" }],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// generators/project/splash.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import { required } from "../../utils/validators.mjs";
|
|
4
|
+
|
|
5
|
+
export const metadata = {
|
|
6
|
+
key: "project:splash",
|
|
7
|
+
name: "KOS Splash Screen Project",
|
|
8
|
+
invalidateCache: true,
|
|
9
|
+
};
|
|
10
|
+
export default async function (plop) {
|
|
11
|
+
plop.setActionType("createSplashProject", async function (answers) {
|
|
12
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-splash-project \
|
|
13
|
+
--name=${answers.name} \
|
|
14
|
+
--no-interactive`;
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
await execute(command);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
throw new Error(error);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return `Splash page project ${answers.name} created.`;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
plop.setGenerator("project:splash", {
|
|
26
|
+
description: "Create a new KOS Splash Page Project",
|
|
27
|
+
prompts: [
|
|
28
|
+
{
|
|
29
|
+
type: "input",
|
|
30
|
+
name: "name",
|
|
31
|
+
message: "What is the name of the splash project?",
|
|
32
|
+
validate: required,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
actions: () => [{ type: "createSplashProject" }],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// generators/project/theme.mjs
|
|
2
|
+
import { execute } from "../../utils/exec.mjs";
|
|
3
|
+
import { required } from "../../utils/validators.mjs";
|
|
4
|
+
export const metadata = {
|
|
5
|
+
key: "theme",
|
|
6
|
+
name: "KOS Theme Project",
|
|
7
|
+
invalidateCache: true,
|
|
8
|
+
};
|
|
9
|
+
export default async function (plop) {
|
|
10
|
+
plop.setActionType("createThemeProject", async function (answers) {
|
|
11
|
+
const command = `npx nx generate @kosdev-code/kos-nx-plugin:kos-theme-project \
|
|
12
|
+
--name=${answers.name} \
|
|
13
|
+
--no-interactive`;
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
await execute(command);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
throw new Error(error);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return `Theme project ${answers.name} created.`;
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
plop.setGenerator("theme", {
|
|
25
|
+
description: "Create a new KOS UI Theme project",
|
|
26
|
+
prompts: [
|
|
27
|
+
{
|
|
28
|
+
type: "input",
|
|
29
|
+
name: "name",
|
|
30
|
+
message: "What is the name of the theme project?",
|
|
31
|
+
validate: required,
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
actions: () => [{ type: "createThemeProject" }],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// generators/workspace/index.mjs
|
|
2
|
+
import { createWorkspace } from "create-nx-workspace";
|
|
3
|
+
import { required } from "../../utils/validators.mjs";
|
|
4
|
+
|
|
5
|
+
export const metadata = {
|
|
6
|
+
key: "workspace",
|
|
7
|
+
name: "Create a new KOS UI Workspace",
|
|
8
|
+
};
|
|
9
|
+
export default async function (plop) {
|
|
10
|
+
plop.setActionType("createWorkspace", async function (answers) {
|
|
11
|
+
await createWorkspace("@kosdev-code/kos-nx-plugin", {
|
|
12
|
+
nxCloud: "skip",
|
|
13
|
+
name: answers.workspaceName,
|
|
14
|
+
});
|
|
15
|
+
return `Workspace ${answers.workspaceName} created.`;
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
plop.setGenerator("workspace", {
|
|
19
|
+
description: "KOS UI Workspace Setup",
|
|
20
|
+
prompts: [
|
|
21
|
+
{
|
|
22
|
+
type: "input",
|
|
23
|
+
name: "workspaceName",
|
|
24
|
+
message: "Enter the workspace name",
|
|
25
|
+
validate: required,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
actions: () => [{ type: "createWorkspace" }],
|
|
29
|
+
});
|
|
30
|
+
}
|