@jskit-ai/create-app 0.1.93 → 0.1.95
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/server/index.js +8 -1
- package/templates/base-shell/.jskit/lock.json +229 -0
- package/templates/base-shell/package.json +4 -2
- package/templates/base-shell/packages/main/src/client/providers/MainClientProvider.js +8 -0
- package/templates/base-shell/src/App.vue +7 -9
- package/templates/base-shell/src/components/ShellLayout.vue +12 -0
- package/templates/base-shell/src/components/menus/MenuLinkItem.vue +30 -0
- package/templates/base-shell/src/components/menus/SurfaceAwareMenuLinkItem.vue +42 -0
- package/templates/base-shell/src/components/menus/TabLinkItem.vue +42 -0
- package/templates/base-shell/src/error.js +19 -0
- package/templates/base-shell/src/pages/home/index.vue +85 -21
- package/templates/base-shell/src/pages/home/settings/general/index.vue +40 -0
- package/templates/base-shell/src/pages/home/settings/index.vue +7 -0
- package/templates/base-shell/src/pages/home/settings.vue +109 -0
- package/templates/base-shell/src/pages/home.vue +8 -1
- package/templates/base-shell/src/placement.js +56 -0
- package/templates/base-shell/src/placementTopology.js +149 -0
- package/templates/base-shell/tests/e2e/adaptive-shell.spec.ts +4 -0
- package/templates/base-shell/tests/e2e/base-shell.spec.ts +1 -1
- package/templates/base-shell/vite.config.mjs +14 -0
- package/templates/minimal-shell/.github/workflows/verify.yml +29 -0
- package/templates/minimal-shell/.jskit/lock.json +31 -0
- package/templates/minimal-shell/AGENTS.md +10 -0
- package/templates/minimal-shell/Procfile +2 -0
- package/templates/minimal-shell/app.json +14 -0
- package/templates/minimal-shell/bin/server.js +8 -0
- package/templates/minimal-shell/config/public.js +41 -0
- package/templates/minimal-shell/config/server.js +1 -0
- package/templates/minimal-shell/config/surfaceAccessPolicies.js +3 -0
- package/templates/minimal-shell/eslint.config.mjs +19 -0
- package/templates/minimal-shell/favicon.svg +7 -0
- package/templates/minimal-shell/gitignore +8 -0
- package/templates/minimal-shell/index.html +13 -0
- package/templates/minimal-shell/jsconfig.json +8 -0
- package/templates/minimal-shell/package.json +55 -0
- package/templates/minimal-shell/packages/main/package.descriptor.mjs +69 -0
- package/templates/minimal-shell/packages/main/package.json +12 -0
- package/templates/minimal-shell/packages/main/src/client/index.js +13 -0
- package/templates/minimal-shell/packages/main/src/client/providers/MainClientProvider.js +20 -0
- package/templates/minimal-shell/packages/main/src/server/MainServiceProvider.js +20 -0
- package/templates/minimal-shell/packages/main/src/server/index.js +1 -0
- package/templates/minimal-shell/packages/main/src/server/loadAppConfig.js +9 -0
- package/templates/minimal-shell/packages/main/src/shared/index.js +10 -0
- package/templates/minimal-shell/packages/main/src/shared/schemas/index.js +22 -0
- package/templates/minimal-shell/scripts/dokku-set-remote-envs-via-ssh.sh +210 -0
- package/templates/minimal-shell/server/lib/runtimeEnv.js +45 -0
- package/templates/minimal-shell/server/lib/surfaceRuntime.js +10 -0
- package/templates/minimal-shell/server.js +189 -0
- package/templates/minimal-shell/src/App.vue +13 -0
- package/templates/minimal-shell/src/main.js +85 -0
- package/templates/minimal-shell/src/pages/home/index.vue +48 -0
- package/templates/minimal-shell/src/pages/home.vue +13 -0
- package/templates/minimal-shell/src/views/NotFound.vue +13 -0
- package/templates/minimal-shell/tests/client/smoke.vitest.js +7 -0
- package/templates/minimal-shell/tests/e2e/base-shell.spec.ts +57 -0
- package/templates/minimal-shell/tests/server/minimalShell.validator.test.js +131 -0
- package/templates/minimal-shell/tests/server/smoke.test.js +16 -0
- package/templates/minimal-shell/vite.config.mjs +84 -0
- package/templates/minimal-shell/vite.shared.mjs +59 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import ShellOutlet from "@jskit-ai/shell-web/client/components/ShellOutlet";
|
|
3
|
+
import { RouterView } from "vue-router";
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<section class="generated-ui-screen generated-ui-screen--settings settings-shell d-flex flex-column ga-4">
|
|
8
|
+
<header>
|
|
9
|
+
<p class="text-overline text-medium-emphasis mb-1">Settings</p>
|
|
10
|
+
<h1 class="settings-shell__title">Home settings</h1>
|
|
11
|
+
<p class="text-body-2 text-medium-emphasis mb-0">Configure shell behavior for this surface.</p>
|
|
12
|
+
</header>
|
|
13
|
+
|
|
14
|
+
<v-sheet rounded="lg" border class="settings-shell__panel">
|
|
15
|
+
<div class="settings-shell__body">
|
|
16
|
+
<nav class="settings-shell__nav" aria-label="Home settings sections">
|
|
17
|
+
<v-list nav density="compact" rounded="lg">
|
|
18
|
+
<ShellOutlet target="home-settings:primary-menu" />
|
|
19
|
+
</v-list>
|
|
20
|
+
</nav>
|
|
21
|
+
|
|
22
|
+
<main class="settings-shell__content">
|
|
23
|
+
<RouterView />
|
|
24
|
+
</main>
|
|
25
|
+
</div>
|
|
26
|
+
</v-sheet>
|
|
27
|
+
</section>
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<style scoped>
|
|
31
|
+
.generated-ui-screen {
|
|
32
|
+
--generated-ui-screen-title-size: 1.85rem;
|
|
33
|
+
--generated-ui-screen-panel-padding: 1rem;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.settings-shell__title {
|
|
37
|
+
font-size: var(--generated-ui-screen-title-size);
|
|
38
|
+
font-weight: 650;
|
|
39
|
+
letter-spacing: 0;
|
|
40
|
+
line-height: 1.15;
|
|
41
|
+
margin: 0 0 0.35rem;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.settings-shell__panel {
|
|
45
|
+
overflow: hidden;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.settings-shell__body {
|
|
49
|
+
display: grid;
|
|
50
|
+
gap: 1rem;
|
|
51
|
+
grid-template-columns: minmax(12rem, 16rem) minmax(0, 1fr);
|
|
52
|
+
padding: var(--generated-ui-screen-panel-padding);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.settings-shell__content {
|
|
56
|
+
border-left: 1px solid rgba(var(--v-theme-on-surface), 0.18);
|
|
57
|
+
min-width: 0;
|
|
58
|
+
padding-left: 1rem;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.settings-shell__nav :deep(.v-list) {
|
|
62
|
+
padding: 0.35rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.settings-shell__nav :deep(.v-list-item) {
|
|
66
|
+
min-height: 48px;
|
|
67
|
+
padding-inline: 0.6rem 0.7rem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.settings-shell__nav :deep(.v-list-item__prepend) {
|
|
71
|
+
margin-inline-end: 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.settings-shell__nav :deep(.v-list-item__spacer) {
|
|
75
|
+
min-width: 0.5rem;
|
|
76
|
+
width: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.settings-shell__nav :deep(.v-list-item-title) {
|
|
80
|
+
line-height: 1.2;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@media (max-width: 960px) {
|
|
84
|
+
.generated-ui-screen {
|
|
85
|
+
--generated-ui-screen-title-size: 1.35rem;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.settings-shell__body {
|
|
89
|
+
grid-template-columns: 1fr;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.settings-shell__nav :deep(.v-list) {
|
|
93
|
+
display: flex;
|
|
94
|
+
gap: 0.25rem;
|
|
95
|
+
overflow-x: auto;
|
|
96
|
+
scrollbar-width: thin;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.settings-shell__nav :deep(.v-list-item) {
|
|
100
|
+
flex: 0 0 auto;
|
|
101
|
+
min-height: 48px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.settings-shell__content {
|
|
105
|
+
border-left: 0;
|
|
106
|
+
padding-left: 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
</style>
|
|
@@ -8,6 +8,13 @@
|
|
|
8
8
|
}
|
|
9
9
|
</route>
|
|
10
10
|
|
|
11
|
+
<script setup>
|
|
12
|
+
import ShellLayout from "@/components/ShellLayout.vue";
|
|
13
|
+
import { RouterView } from "vue-router";
|
|
14
|
+
</script>
|
|
15
|
+
|
|
11
16
|
<template>
|
|
12
|
-
<
|
|
17
|
+
<ShellLayout title="" subtitle="">
|
|
18
|
+
<RouterView />
|
|
19
|
+
</ShellLayout>
|
|
13
20
|
</template>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createPlacementRegistry } from "@jskit-ai/shell-web/client/placement";
|
|
2
|
+
|
|
3
|
+
const registry = createPlacementRegistry();
|
|
4
|
+
const { addPlacement } = registry;
|
|
5
|
+
|
|
6
|
+
export { addPlacement };
|
|
7
|
+
|
|
8
|
+
// Keep the default export near the top so module installers can append addPlacement(...)
|
|
9
|
+
// blocks at the bottom of this file without changing the export section.
|
|
10
|
+
export default function getPlacements() {
|
|
11
|
+
return registry.build();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
addPlacement({
|
|
15
|
+
id: "shell-web.home.menu.home",
|
|
16
|
+
target: "shell.primary-nav",
|
|
17
|
+
kind: "link",
|
|
18
|
+
surfaces: ["home"],
|
|
19
|
+
order: 50,
|
|
20
|
+
props: {
|
|
21
|
+
label: "Home",
|
|
22
|
+
surface: "home",
|
|
23
|
+
scopedSuffix: "/",
|
|
24
|
+
unscopedSuffix: "/",
|
|
25
|
+
exact: true
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
addPlacement({
|
|
30
|
+
id: "shell-web.home.menu.settings",
|
|
31
|
+
target: "shell.primary-nav",
|
|
32
|
+
kind: "link",
|
|
33
|
+
surfaces: ["home"],
|
|
34
|
+
order: 100,
|
|
35
|
+
props: {
|
|
36
|
+
label: "Settings",
|
|
37
|
+
surface: "home",
|
|
38
|
+
scopedSuffix: "/settings",
|
|
39
|
+
unscopedSuffix: "/settings"
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
addPlacement({
|
|
44
|
+
id: "shell-web.home.settings.general",
|
|
45
|
+
target: "page.section-nav",
|
|
46
|
+
owner: "home-settings",
|
|
47
|
+
kind: "link",
|
|
48
|
+
surfaces: ["home"],
|
|
49
|
+
order: 100,
|
|
50
|
+
props: {
|
|
51
|
+
label: "General",
|
|
52
|
+
surface: "home",
|
|
53
|
+
scopedSuffix: "/settings/general",
|
|
54
|
+
unscopedSuffix: "/settings/general"
|
|
55
|
+
}
|
|
56
|
+
});
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const placements = [];
|
|
2
|
+
|
|
3
|
+
function addPlacementTopology(value = {}) {
|
|
4
|
+
placements.push(value);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export { addPlacementTopology };
|
|
8
|
+
export default { placements };
|
|
9
|
+
|
|
10
|
+
const menuLinkRenderers = Object.freeze({
|
|
11
|
+
link: "local.main.ui.surface-aware-menu-link-item"
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const bottomNavLinkRenderers = Object.freeze({
|
|
15
|
+
link: "local.main.ui.tab-link-item"
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
addPlacementTopology({
|
|
19
|
+
id: "shell.primary-nav",
|
|
20
|
+
description: "Primary top-level navigation for the current surface.",
|
|
21
|
+
surfaces: ["*"],
|
|
22
|
+
default: true,
|
|
23
|
+
variants: {
|
|
24
|
+
compact: {
|
|
25
|
+
outlet: "shell-layout:primary-bottom-nav",
|
|
26
|
+
renderers: bottomNavLinkRenderers
|
|
27
|
+
},
|
|
28
|
+
medium: {
|
|
29
|
+
outlet: "shell-layout:primary-menu",
|
|
30
|
+
renderers: menuLinkRenderers
|
|
31
|
+
},
|
|
32
|
+
expanded: {
|
|
33
|
+
outlet: "shell-layout:primary-menu",
|
|
34
|
+
renderers: menuLinkRenderers
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
addPlacementTopology({
|
|
40
|
+
id: "shell.secondary-nav",
|
|
41
|
+
description: "Secondary navigation for the current surface.",
|
|
42
|
+
surfaces: ["*"],
|
|
43
|
+
variants: {
|
|
44
|
+
compact: {
|
|
45
|
+
outlet: "shell-layout:secondary-menu",
|
|
46
|
+
renderers: menuLinkRenderers
|
|
47
|
+
},
|
|
48
|
+
medium: {
|
|
49
|
+
outlet: "shell-layout:secondary-menu",
|
|
50
|
+
renderers: menuLinkRenderers
|
|
51
|
+
},
|
|
52
|
+
expanded: {
|
|
53
|
+
outlet: "shell-layout:secondary-menu",
|
|
54
|
+
renderers: menuLinkRenderers
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
addPlacementTopology({
|
|
60
|
+
id: "shell.identity",
|
|
61
|
+
description: "Current surface identity and switcher controls.",
|
|
62
|
+
surfaces: ["*"],
|
|
63
|
+
variants: {
|
|
64
|
+
compact: {
|
|
65
|
+
outlet: "shell-layout:top-left"
|
|
66
|
+
},
|
|
67
|
+
medium: {
|
|
68
|
+
outlet: "shell-layout:top-left"
|
|
69
|
+
},
|
|
70
|
+
expanded: {
|
|
71
|
+
outlet: "shell-layout:top-left"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
addPlacementTopology({
|
|
77
|
+
id: "shell.status",
|
|
78
|
+
description: "Surface status, connection, and utility indicators.",
|
|
79
|
+
surfaces: ["*"],
|
|
80
|
+
variants: {
|
|
81
|
+
compact: {
|
|
82
|
+
outlet: "shell-layout:top-right"
|
|
83
|
+
},
|
|
84
|
+
medium: {
|
|
85
|
+
outlet: "shell-layout:top-right"
|
|
86
|
+
},
|
|
87
|
+
expanded: {
|
|
88
|
+
outlet: "shell-layout:top-right"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
addPlacementTopology({
|
|
94
|
+
id: "shell.global-actions",
|
|
95
|
+
description: "Global surface actions that should stay outside primary navigation.",
|
|
96
|
+
surfaces: ["*"],
|
|
97
|
+
variants: {
|
|
98
|
+
compact: {
|
|
99
|
+
outlet: "shell-layout:top-right",
|
|
100
|
+
renderers: menuLinkRenderers
|
|
101
|
+
},
|
|
102
|
+
medium: {
|
|
103
|
+
outlet: "shell-layout:top-right",
|
|
104
|
+
renderers: menuLinkRenderers
|
|
105
|
+
},
|
|
106
|
+
expanded: {
|
|
107
|
+
outlet: "shell-layout:top-right",
|
|
108
|
+
renderers: menuLinkRenderers
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
addPlacementTopology({
|
|
114
|
+
id: "page.supporting-content",
|
|
115
|
+
description: "Supporting page content that opens as a bottom sheet on compact layouts and a side panel on wider layouts.",
|
|
116
|
+
surfaces: ["*"],
|
|
117
|
+
variants: {
|
|
118
|
+
compact: {
|
|
119
|
+
outlet: "shell-layout:supporting-bottom-sheet"
|
|
120
|
+
},
|
|
121
|
+
medium: {
|
|
122
|
+
outlet: "shell-layout:supporting-side-panel"
|
|
123
|
+
},
|
|
124
|
+
expanded: {
|
|
125
|
+
outlet: "shell-layout:supporting-side-panel"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
addPlacementTopology({
|
|
131
|
+
id: "page.section-nav",
|
|
132
|
+
owner: "home-settings",
|
|
133
|
+
description: "Navigation between child pages in the home settings section.",
|
|
134
|
+
surfaces: ["home"],
|
|
135
|
+
variants: {
|
|
136
|
+
compact: {
|
|
137
|
+
outlet: "home-settings:primary-menu",
|
|
138
|
+
renderers: menuLinkRenderers
|
|
139
|
+
},
|
|
140
|
+
medium: {
|
|
141
|
+
outlet: "home-settings:primary-menu",
|
|
142
|
+
renderers: menuLinkRenderers
|
|
143
|
+
},
|
|
144
|
+
expanded: {
|
|
145
|
+
outlet: "home-settings:primary-menu",
|
|
146
|
+
renderers: menuLinkRenderers
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
@@ -48,7 +48,7 @@ test.describe("generated base app responsive smoke", () => {
|
|
|
48
48
|
await page.setViewportSize({ width: viewport.width, height: viewport.height });
|
|
49
49
|
await page.goto(`${BASE_URL}${SMOKE_PATH}`);
|
|
50
50
|
await expect(page.locator("body")).toBeVisible();
|
|
51
|
-
await expect(page.getByText("
|
|
51
|
+
await expect(page.getByText("Ready")).toBeVisible();
|
|
52
52
|
await expectGeneratedScreenContract(page);
|
|
53
53
|
await expectVisibleTapTargets(page);
|
|
54
54
|
await expectNoHorizontalOverflow(page);
|
|
@@ -57,8 +57,22 @@ export default defineConfig({
|
|
|
57
57
|
test: {
|
|
58
58
|
include: ["tests/client/**/*.vitest.js"]
|
|
59
59
|
},
|
|
60
|
+
optimizeDeps: {
|
|
61
|
+
entries: [
|
|
62
|
+
"index.html",
|
|
63
|
+
"src/**/*.{js,ts,vue}"
|
|
64
|
+
]
|
|
65
|
+
},
|
|
60
66
|
server: {
|
|
61
67
|
port: devPort,
|
|
68
|
+
warmup: {
|
|
69
|
+
clientFiles: [
|
|
70
|
+
"src/main.{js,ts}",
|
|
71
|
+
"src/router/**/*.{js,ts}",
|
|
72
|
+
"src/pages/**/*.{js,ts,vue}",
|
|
73
|
+
"src/components/**/*.{js,ts,vue}"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
62
76
|
proxy: {
|
|
63
77
|
"/api": {
|
|
64
78
|
target: apiProxyTarget,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Verify
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
verify:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout
|
|
17
|
+
uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Setup Node
|
|
20
|
+
uses: actions/setup-node@v4
|
|
21
|
+
with:
|
|
22
|
+
node-version: 20
|
|
23
|
+
cache: npm
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: npm ci
|
|
27
|
+
|
|
28
|
+
- name: Run verify
|
|
29
|
+
run: npm run verify
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockVersion": 1,
|
|
3
|
+
"installedPackages": {
|
|
4
|
+
"@local/main": {
|
|
5
|
+
"packageId": "@local/main",
|
|
6
|
+
"version": "0.1.0",
|
|
7
|
+
"source": {
|
|
8
|
+
"type": "local-package",
|
|
9
|
+
"packagePath": "packages/main",
|
|
10
|
+
"descriptorPath": "packages/main/package.descriptor.mjs"
|
|
11
|
+
},
|
|
12
|
+
"managed": {
|
|
13
|
+
"packageJson": {
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@local/main": {
|
|
16
|
+
"hadPrevious": false,
|
|
17
|
+
"previousValue": "",
|
|
18
|
+
"value": "file:packages/main"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {},
|
|
22
|
+
"scripts": {}
|
|
23
|
+
},
|
|
24
|
+
"text": {},
|
|
25
|
+
"files": []
|
|
26
|
+
},
|
|
27
|
+
"options": {},
|
|
28
|
+
"installedAt": "1970-01-01T00:00:00.000Z"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# App Agent Instructions
|
|
2
|
+
|
|
3
|
+
Use the JSKIT agent docs and the local app scaffold as the source of truth for app work.
|
|
4
|
+
|
|
5
|
+
Recommended references:
|
|
6
|
+
|
|
7
|
+
- `node_modules/@jskit-ai/agent-docs/guide/agent/index.md`
|
|
8
|
+
- `node_modules/@jskit-ai/agent-docs/patterns/INDEX.md`
|
|
9
|
+
|
|
10
|
+
Keep changes scoped to the user request and verify runtime behavior with tests or explicit checks.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { surfaceAccessPolicies } from "./surfaceAccessPolicies.js";
|
|
2
|
+
|
|
3
|
+
export const config = {};
|
|
4
|
+
__TENANCY_MODE_LINE__
|
|
5
|
+
|
|
6
|
+
config.surfaceModeAll = "all";
|
|
7
|
+
config.surfaceDefaultId = "home";
|
|
8
|
+
config.webRootAllowed = "no";
|
|
9
|
+
config.surfaceAccessPolicies = surfaceAccessPolicies;
|
|
10
|
+
config.mobile = {
|
|
11
|
+
enabled: false,
|
|
12
|
+
strategy: "",
|
|
13
|
+
appId: "",
|
|
14
|
+
appName: "",
|
|
15
|
+
assetMode: "bundled",
|
|
16
|
+
devServerUrl: "",
|
|
17
|
+
apiBaseUrl: "",
|
|
18
|
+
auth: {
|
|
19
|
+
callbackPath: "/auth/login",
|
|
20
|
+
customScheme: "",
|
|
21
|
+
appLinkDomains: []
|
|
22
|
+
},
|
|
23
|
+
android: {
|
|
24
|
+
packageName: "",
|
|
25
|
+
minSdk: 26,
|
|
26
|
+
targetSdk: 35,
|
|
27
|
+
versionCode: 1,
|
|
28
|
+
versionName: "1.0.0"
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
config.surfaceDefinitions = {};
|
|
32
|
+
config.surfaceDefinitions.home = {
|
|
33
|
+
id: "home",
|
|
34
|
+
label: "Home",
|
|
35
|
+
pagesRoot: "home",
|
|
36
|
+
enabled: true,
|
|
37
|
+
requiresAuth: false,
|
|
38
|
+
requiresWorkspace: false,
|
|
39
|
+
accessPolicyId: "public",
|
|
40
|
+
origin: ""
|
|
41
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const config = {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { baseConfig, nodeConfig, vueConfig, webConfig } from "@jskit-ai/config-eslint/server";
|
|
2
|
+
|
|
3
|
+
export default [
|
|
4
|
+
{
|
|
5
|
+
ignores: ["dist/**", "node_modules/**", "coverage/**", "test-results/**", ".jskit/**"]
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
files: ["src/pages/**/*.vue"],
|
|
9
|
+
languageOptions: {
|
|
10
|
+
globals: {
|
|
11
|
+
definePage: "readonly"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
...baseConfig,
|
|
16
|
+
...vueConfig,
|
|
17
|
+
...webConfig,
|
|
18
|
+
...nodeConfig
|
|
19
|
+
];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
7
|
+
<title>__APP_TITLE__</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="app"></div>
|
|
11
|
+
<script type="module" src="/src/main.js"></script>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__APP_NAME__",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Minimal JSKIT base app (Fastify + Vue)",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=20 <23"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"server": "node ./bin/server.js",
|
|
12
|
+
"server:all": "node ./bin/server.js",
|
|
13
|
+
"server:home": "SERVER_SURFACE=home node ./bin/server.js",
|
|
14
|
+
"start": "node ./bin/server.js",
|
|
15
|
+
"devlinks": "jskit app link-local-packages",
|
|
16
|
+
"dev": "vite",
|
|
17
|
+
"dev:all": "vite",
|
|
18
|
+
"dev:home": "VITE_SURFACE=home vite",
|
|
19
|
+
"build": "vite build",
|
|
20
|
+
"build:all": "vite build",
|
|
21
|
+
"build:home": "VITE_SURFACE=home vite build",
|
|
22
|
+
"preview": "vite preview",
|
|
23
|
+
"lint": "eslint .",
|
|
24
|
+
"test": "node --test",
|
|
25
|
+
"test:client": "vitest run tests/client",
|
|
26
|
+
"test:e2e": "playwright test tests/e2e",
|
|
27
|
+
"verify": "jskit app verify && npm run --if-present verify:app",
|
|
28
|
+
"release": "jskit app release",
|
|
29
|
+
"jskit:update": "jskit app update-packages"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@local/main": "file:packages/main",
|
|
33
|
+
"@fastify/static": "^9.1.1",
|
|
34
|
+
"@jskit-ai/kernel": "0.x",
|
|
35
|
+
"@tanstack/vue-query": "^5.90.5",
|
|
36
|
+
"fastify": "^5.7.4",
|
|
37
|
+
"json-rest-schema": "^1.0.13",
|
|
38
|
+
"pinia": "^3.0.4",
|
|
39
|
+
"vue": "^3.5.13",
|
|
40
|
+
"vue-router": "^5.0.4",
|
|
41
|
+
"vuetify": "^4.0.0",
|
|
42
|
+
"@jskit-ai/http-runtime": "0.x"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@jskit-ai/agent-docs": "0.x",
|
|
46
|
+
"@jskit-ai/config-eslint": "0.x",
|
|
47
|
+
"@jskit-ai/jskit-cli": "0.x",
|
|
48
|
+
"@playwright/test": "^1.57.0",
|
|
49
|
+
"@vitejs/plugin-vue": "^5.2.1",
|
|
50
|
+
"eslint": "^9.39.1",
|
|
51
|
+
"vite": "^6.1.0",
|
|
52
|
+
"vite-plugin-vuetify": "^2.1.3",
|
|
53
|
+
"vitest": "^4.0.18"
|
|
54
|
+
}
|
|
55
|
+
}
|