frontend-harness 0.6.3 → 0.6.5
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/CHANGELOG.md +8 -0
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/runtime/knowledge.js +18 -7
- package/dist/runtime/knowledge.js.map +1 -1
- package/dist/runtime/policy-provenance.js +13 -1
- package/dist/runtime/policy-provenance.js.map +1 -1
- package/dist/runtime/scaffold/template-renderer.d.ts +26 -0
- package/dist/runtime/scaffold/template-renderer.js +28 -0
- package/dist/runtime/scaffold/template-renderer.js.map +1 -0
- package/dist/runtime/scaffold/vue-template.d.ts +1 -5
- package/dist/runtime/scaffold/vue-template.js +43 -95
- package/dist/runtime/scaffold/vue-template.js.map +1 -1
- package/dist/runtime/scaffold.d.ts +1 -0
- package/dist/runtime/scaffold.js +13 -3
- package/dist/runtime/scaffold.js.map +1 -1
- package/package.json +2 -1
- package/templates/scaffold/vue/.husky/pre-commit +1 -0
- package/templates/scaffold/vue/README.md.tpl +50 -0
- package/templates/scaffold/vue/eslint.config.mjs +49 -0
- package/templates/scaffold/vue/gitignore.tpl +23 -0
- package/templates/scaffold/vue/index.html.tpl +12 -0
- package/templates/scaffold/vue/playwright.config.mjs +29 -0
- package/templates/scaffold/vue/postcss.config.mjs +5 -0
- package/templates/scaffold/vue/src/App.vue +7 -0
- package/templates/scaffold/vue/src/env.d.ts +7 -0
- package/templates/scaffold/vue/src/features/home/HomeView.vue +86 -0
- package/templates/scaffold/vue/src/main.ts +5 -0
- package/templates/scaffold/vue/src/service/http.ts +18 -0
- package/templates/scaffold/vue/src/service/index.ts +1 -0
- package/templates/scaffold/vue/src/storage/index.ts +31 -0
- package/templates/scaffold/vue/src/styles/main.scss +21 -0
- package/templates/scaffold/vue/src/styles/tokens.scss +20 -0
- package/templates/scaffold/vue/src/utils/index.ts +11 -0
- package/templates/scaffold/vue/tests/e2e/app-desktop.spec.ts +10 -0
- package/templates/scaffold/vue/tests/e2e/app-mobile.spec.ts +9 -0
- package/templates/scaffold/vue/tests/integration/app.test.ts +15 -0
- package/templates/scaffold/vue/tests/render.ts +6 -0
- package/templates/scaffold/vue/tests/setup.ts +7 -0
- package/templates/scaffold/vue/vite.config.mjs +33 -0
- package/templates/scaffold/vue/vitest.config.mjs +34 -0
|
@@ -1,45 +1,53 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
|
-
import {
|
|
2
|
+
import { escapeHtml, json, renderScaffoldTemplateFiles } from "./template-renderer.js";
|
|
3
|
+
const VUE_TEMPLATE_ROOT = new URL("../../../templates/scaffold/vue/", import.meta.url);
|
|
4
|
+
const VUE_TEMPLATE_FILES = [
|
|
5
|
+
{ source: "gitignore.tpl", target: ".gitignore" },
|
|
6
|
+
{ source: ".husky/pre-commit", target: ".husky/pre-commit", mode: 0o755 },
|
|
7
|
+
{ source: "eslint.config.mjs", target: "eslint.config.mjs" },
|
|
8
|
+
{ source: "index.html.tpl", target: "index.html" },
|
|
9
|
+
{ source: "postcss.config.mjs", target: "postcss.config.mjs" },
|
|
10
|
+
{ source: "README.md.tpl", target: "README.md" },
|
|
11
|
+
{ source: "vite.config.mjs", target: "vite.config.mjs" },
|
|
12
|
+
{ source: "vitest.config.mjs", target: "vitest.config.mjs" },
|
|
13
|
+
{ source: "playwright.config.mjs", target: "playwright.config.mjs" },
|
|
14
|
+
{ source: "src/App.vue", target: "src/App.vue" },
|
|
15
|
+
{ source: "src/main.ts", target: "src/main.ts" },
|
|
16
|
+
{ source: "src/env.d.ts", target: "src/env.d.ts" },
|
|
17
|
+
{ source: "src/features/home/HomeView.vue", target: "src/features/home/HomeView.vue" },
|
|
18
|
+
{ source: "src/styles/main.scss", target: "src/styles/main.scss" },
|
|
19
|
+
{ source: "src/styles/tokens.scss", target: "src/styles/tokens.scss" },
|
|
20
|
+
{ source: "src/utils/index.ts", target: "src/utils/index.ts" },
|
|
21
|
+
{ source: "src/storage/index.ts", target: "src/storage/index.ts" },
|
|
22
|
+
{ source: "src/service/http.ts", target: "src/service/http.ts" },
|
|
23
|
+
{ source: "src/service/index.ts", target: "src/service/index.ts" },
|
|
24
|
+
{ source: "tests/setup.ts", target: "tests/setup.ts" },
|
|
25
|
+
{ source: "tests/render.ts", target: "tests/render.ts" },
|
|
26
|
+
{ source: "tests/integration/app.test.ts", target: "tests/integration/app.test.ts" },
|
|
27
|
+
{ source: "tests/e2e/app-desktop.spec.ts", target: "tests/e2e/app-desktop.spec.ts" },
|
|
28
|
+
{ source: "tests/e2e/app-mobile.spec.ts", target: "tests/e2e/app-mobile.spec.ts" }
|
|
29
|
+
];
|
|
3
30
|
export function buildVueScaffoldFiles(projectName) {
|
|
4
|
-
return
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
{ path: "src/App.vue", content: appVue() },
|
|
20
|
-
{ path: "src/main.ts", content: lines("import { createApp } from \"vue\";", "import App from \"./App.vue\";", "import \"./styles/main.scss\";", "", "createApp(App).mount(\"#app\");") },
|
|
21
|
-
{ path: "src/env.d.ts", content: envDts() },
|
|
22
|
-
{ path: "src/features/.gitkeep", content: "" },
|
|
23
|
-
{ path: "src/styles/main.scss", content: mainScss() },
|
|
24
|
-
{ path: "src/styles/tokens.scss", content: styleTokens() },
|
|
25
|
-
{ path: "src/utils/index.ts", content: utilsIndex() },
|
|
26
|
-
{ path: "src/storage/index.ts", content: storageIndex() },
|
|
27
|
-
{ path: "src/service/http.ts", content: serviceHttp() },
|
|
28
|
-
{ path: "src/service/index.ts", content: lines("export { http, normalizeHttpError } from \"./http\";") },
|
|
29
|
-
{ path: "tests/setup.ts", content: testSetup() },
|
|
30
|
-
{ path: "tests/render.ts", content: testRender() },
|
|
31
|
-
{ path: "tests/integration/app.test.ts", content: appIntegrationTest() },
|
|
32
|
-
{ path: "tests/e2e/app-desktop.spec.ts", content: appDesktopE2eTest() },
|
|
33
|
-
{ path: "tests/e2e/app-mobile.spec.ts", content: appMobileE2eTest() }
|
|
34
|
-
];
|
|
31
|
+
return renderScaffoldTemplateFiles({
|
|
32
|
+
templateRoot: VUE_TEMPLATE_ROOT,
|
|
33
|
+
context: {
|
|
34
|
+
projectName,
|
|
35
|
+
projectNameHtml: escapeHtml(projectName)
|
|
36
|
+
},
|
|
37
|
+
staticFiles: [
|
|
38
|
+
{ path: "package.json", content: packageJson(projectName) },
|
|
39
|
+
{ path: ".prettierrc.json", content: json({ semi: true, singleQuote: false, trailingComma: "none" }) },
|
|
40
|
+
{ path: ".frontend-harness/config.json", content: harnessConfig() },
|
|
41
|
+
{ path: "tsconfig.json", content: tsconfig() },
|
|
42
|
+
{ path: "tsconfig.node.json", content: tsconfigNode() }
|
|
43
|
+
],
|
|
44
|
+
manifestFiles: VUE_TEMPLATE_FILES
|
|
45
|
+
});
|
|
35
46
|
}
|
|
36
47
|
export function toPackageName(value) {
|
|
37
48
|
const normalized = value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
38
49
|
return normalized || "vue-scaffold";
|
|
39
50
|
}
|
|
40
|
-
function gitignore() {
|
|
41
|
-
return lines("node_modules", "dist", "coverage", ".DS_Store", "*.log", ".vite", "playwright-report", "test-results", "src/types/auto-imports.d.ts", "src/types/components.d.ts", "", "# frontend-harness generated runtime evidence", ".frontend-harness/context/", ".frontend-harness/plans/", ".frontend-harness/execution-units/", ".frontend-harness/component-graph/", ".frontend-harness/guidance/", ".frontend-harness/state.json", ".frontend-harness/verification/", ".frontend-harness/logs/", ".frontend-harness/repair/", ".frontend-harness/repair-decision/", ".frontend-harness/state-explain/");
|
|
42
|
-
}
|
|
43
51
|
function packageJson(projectName) {
|
|
44
52
|
return json({
|
|
45
53
|
name: projectName,
|
|
@@ -119,15 +127,6 @@ function harnessConfig() {
|
|
|
119
127
|
}
|
|
120
128
|
});
|
|
121
129
|
}
|
|
122
|
-
function eslintConfig() {
|
|
123
|
-
return lines("import js from \"@eslint/js\";", "import prettier from \"eslint-config-prettier\";", "import vue from \"eslint-plugin-vue\";", "import vueParser from \"vue-eslint-parser\";", "import tsParser from \"@typescript-eslint/parser\";", "", "export default [", " {", " ignores: [\"dist/**\", \"node_modules/**\"]", " },", " js.configs.recommended,", " ...vue.configs[\"flat/essential\"],", " prettier,", " {", " languageOptions: {", " globals: {", " document: \"readonly\",", " localStorage: \"readonly\",", " sessionStorage: \"readonly\",", " Storage: \"readonly\",", " window: \"readonly\"", " }", " }", " },", " {", " files: [\"**/*.{ts,tsx}\"],", " languageOptions: {", " parser: tsParser,", " parserOptions: {", " ecmaVersion: \"latest\",", " sourceType: \"module\"", " }", " }", " },", " {", " files: [\"**/*.vue\"],", " languageOptions: {", " parser: vueParser,", " parserOptions: {", " parser: tsParser,", " ecmaVersion: \"latest\",", " sourceType: \"module\"", " }", " },", " rules: {", " \"vue/multi-word-component-names\": \"off\"", " }", " }", "];");
|
|
124
|
-
}
|
|
125
|
-
function indexHtml(projectName) {
|
|
126
|
-
return lines("<!doctype html>", "<html lang=\"zh-CN\">", " <head>", " <meta charset=\"UTF-8\" />", " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />", ` <title>${escapeHtml(projectName)}</title>`, " </head>", " <body>", " <div id=\"app\"></div>", " <script type=\"module\" src=\"/src/main.ts\"></script>", " </body>", "</html>");
|
|
127
|
-
}
|
|
128
|
-
function readme(projectName) {
|
|
129
|
-
return lines(`# ${projectName}`, "", "Vue 3 + Vite engineering scaffold.", "", "This preset is based on the company Vue stack shape used in freight-admin, but it only includes engineering infrastructure.", "It intentionally avoids business pages, admin routes, dashboards, permissions, and domain components.", "", "## Scripts", "", "- `npm run dev`", "- `npm run build`", "- `npm run preview`", "- `npm run lint`", "- `npm run typecheck`", "- `npm test`", "- `npm run test:e2e`", "- `npm run format`", "- `npm run harness -- <command>`", "- `npm run harness:init`", "- `npm run harness:check`", "- `npm run harness:clean`", "", "## Base layers", "", "- `src/utils` for shared helpers", "- `src/storage` for browser storage wrappers", "- `src/service` for API client setup", "- `src/styles` for project-wide styles", "- `src/styles/tokens.scss` for reusable UI restoration tokens", "- `src/features/<feature>` for page-specific types, fixtures, columns, calculations, and components", "- `tests/integration` for Vitest + Testing Library behavior tests", "- `tests/e2e` for Playwright browser smoke tests", "", "## UI restoration workflow", "", "Use the injected `ui-implementation` project skill and `.frontend-harness/guidance/latest.md` for the current harness plan.", "Use selected `.frontend-harness/knowledge` cards for project semantics, interactions, and visible states; keep provider design output as evidence.", "When visual restoration is required, follow the evidence contract in `.frontend-harness/guidance/latest.md`: keep design, actual, and diff artifacts plus comparison metadata and matching hashes under `.frontend-harness/`.", "Place project-native UI work under `src/features/<feature>` and verify it with the commands named by the harness plan.", "", "## Harness onboarding", "", "This scaffold includes `.frontend-harness/config.json` so verification commands are explicit.", "Run `npm run harness:init` after installing dependencies to inject the agent protocol into `AGENTS.md` and `CLAUDE.md`.", "Use `npm run harness -- <command>` for other harness commands so the project-local `frontend-harness` dependency is used.", "", "## Testing", "", "`npm test` runs Vitest in jsdom with Testing Library helpers from `tests/render.ts` and `tests/setup.ts`.", "`npm run test:e2e` runs Playwright against `npm run preview`; install Playwright browsers in environments that need browser smoke coverage.");
|
|
130
|
-
}
|
|
131
130
|
function tsconfig() {
|
|
132
131
|
return json({
|
|
133
132
|
compilerOptions: {
|
|
@@ -166,55 +165,4 @@ function tsconfigNode() {
|
|
|
166
165
|
include: ["vite.config.mjs", "vitest.config.mjs", "playwright.config.mjs", "eslint.config.mjs", "postcss.config.mjs"]
|
|
167
166
|
});
|
|
168
167
|
}
|
|
169
|
-
function viteConfig() {
|
|
170
|
-
return lines("import { defineConfig } from \"vite\";", "import vue from \"@vitejs/plugin-vue\";", "import AutoImport from \"unplugin-auto-import/vite\";", "import Components from \"unplugin-vue-components/vite\";", "import { ElementPlusResolver } from \"unplugin-vue-components/resolvers\";", "import path from \"node:path\";", "import { fileURLToPath } from \"node:url\";", "", "const __dirname = path.dirname(fileURLToPath(import.meta.url));", "", "export default defineConfig({", " plugins: [", " vue(),", " AutoImport({", " imports: [\"vue\"],", " dts: \"src/types/auto-imports.d.ts\",", " resolvers: [ElementPlusResolver()]", " }),", " Components({", " dts: \"src/types/components.d.ts\",", " resolvers: [ElementPlusResolver()]", " })", " ],", " resolve: {", " alias: {", " \"@\": path.resolve(__dirname, \"src\")", " }", " },", " server: {", " host: true,", " hmr: { overlay: false }", " }", "});");
|
|
171
|
-
}
|
|
172
|
-
function vitestConfig() {
|
|
173
|
-
return lines("import { defineConfig } from \"vitest/config\";", "import vue from \"@vitejs/plugin-vue\";", "import AutoImport from \"unplugin-auto-import/vite\";", "import Components from \"unplugin-vue-components/vite\";", "import { ElementPlusResolver } from \"unplugin-vue-components/resolvers\";", "import path from \"node:path\";", "import { fileURLToPath } from \"node:url\";", "", "const __dirname = path.dirname(fileURLToPath(import.meta.url));", "", "export default defineConfig({", " plugins: [", " vue(),", " AutoImport({", " imports: [\"vue\"],", " dts: false,", " resolvers: [ElementPlusResolver()]", " }),", " Components({", " dts: false,", " resolvers: [ElementPlusResolver()]", " })", " ],", " resolve: {", " alias: {", " \"@\": path.resolve(__dirname, \"src\")", " }", " },", " test: {", " environment: \"jsdom\",", " include: [\"tests/**/*.test.ts\"],", " setupFiles: [\"tests/setup.ts\"]", " }", "});");
|
|
174
|
-
}
|
|
175
|
-
function playwrightConfig() {
|
|
176
|
-
return lines("import { defineConfig, devices } from \"@playwright/test\";", "", "export default defineConfig({", " testDir: \"./tests/e2e\",", " fullyParallel: true,", " reporter: [[\"list\"]],", " use: {", " baseURL: \"http://127.0.0.1:4173\",", " trace: \"retain-on-failure\"", " },", " webServer: {", " command: \"npm run preview -- --host 127.0.0.1 --port 4173 --strictPort\",", " url: \"http://127.0.0.1:4173\",", " reuseExistingServer: !process.env.CI,", " timeout: 120_000", " },", " projects: [", " {", " name: \"chromium-desktop\",", " testMatch: /desktop\\.spec\\.ts/,", " use: { ...devices[\"Desktop Chrome\"] }", " },", " {", " name: \"mobile-chrome\",", " testMatch: /mobile\\.spec\\.ts/,", " use: { ...devices[\"Pixel 7\"] }", " }", " ]", "});");
|
|
177
|
-
}
|
|
178
|
-
function appVue() {
|
|
179
|
-
return lines("<template>", " <main class=\"app-shell\">", " <section class=\"hero\">", " <p class=\"eyebrow\">Vue scaffold</p>", " <h1>Engineering base is ready</h1>", " <p class=\"lead\">", " This scaffold carries the company Vue engineering baseline: Vite, TypeScript, Element Plus, auto imports, storage, utility, and service layers.", " </p>", " </section>", " <section class=\"grid\">", " <article>", " <h2>utils</h2>", " <p>Shared helpers and data shaping utilities.</p>", " </article>", " <article>", " <h2>storage</h2>", " <p>Browser storage wrappers with JSON handling.</p>", " </article>", " <article>", " <h2>service</h2>", " <p>API client setup and error normalization.</p>", " </article>", " </section>", " </main>", "</template>", "", "<style scoped lang=\"scss\">", ".app-shell {", " min-height: 100vh;", " padding: 48px 24px;", " background: #f6f8fb;", " color: #102030;", "}", "", ".hero {", " max-width: 960px;", " margin: 0 auto 32px;", "}", "", ".eyebrow {", " margin: 0 0 12px;", " font-size: 12px;", " letter-spacing: 0.12em;", " text-transform: uppercase;", " color: #5f6b7a;", "}", "", "h1 {", " margin: 0;", " font-size: 40px;", " line-height: 1.1;", "}", "", ".lead {", " max-width: 680px;", " margin: 16px 0 0;", " font-size: 16px;", " line-height: 1.75;", " color: #425466;", "}", "", ".grid {", " display: grid;", " grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));", " gap: 16px;", " max-width: 960px;", " margin: 0 auto;", "}", "", "article {", " padding: 20px;", " border: 1px solid #d7deea;", " border-radius: 8px;", " background: #fff;", "}", "", "h2 {", " margin: 0 0 8px;", " font-size: 18px;", "}", "", "p {", " margin: 0;", " line-height: 1.7;", "}", "</style>");
|
|
180
|
-
}
|
|
181
|
-
function envDts() {
|
|
182
|
-
return lines("/// <reference types=\"vite/client\" />", "", "declare module \"*.vue\" {", " import type { DefineComponent } from \"vue\";", " const component: DefineComponent<{}, {}, any>;", " export default component;", "}");
|
|
183
|
-
}
|
|
184
|
-
function mainScss() {
|
|
185
|
-
return lines("@use \"./tokens\" as *;", "", ":root {", " color-scheme: light;", " font-family: Inter, \"PingFang SC\", \"Microsoft YaHei\", sans-serif;", " line-height: 1.5;", " font-weight: 400;", " font-synthesis: none;", " text-rendering: optimizeLegibility;", " -webkit-font-smoothing: antialiased;", " -moz-osx-font-smoothing: grayscale;", "}", "", "* { box-sizing: border-box; }", "", "html, body, #app {", " min-height: 100%;", " margin: 0;", "}", "", "body { background: $color-surface-muted; }");
|
|
186
|
-
}
|
|
187
|
-
function styleTokens() {
|
|
188
|
-
return lines("$color-surface: #ffffff;", "$color-surface-muted: #f6f8fb;", "$color-border: #d7deea;", "$color-text: #102030;", "$color-text-muted: #5f6b7a;", "$color-primary: #2563eb;", "$color-success: #16a34a;", "$color-warning: #d97706;", "$color-danger: #dc2626;", "", "$space-1: 4px;", "$space-2: 8px;", "$space-3: 12px;", "$space-4: 16px;", "$space-5: 20px;", "$space-6: 24px;", "", "$radius-control: 6px;", "$radius-card: 8px;", "$table-min-width: 960px;");
|
|
189
|
-
}
|
|
190
|
-
function utilsIndex() {
|
|
191
|
-
return lines("export function isNil(value: unknown): value is null | undefined {", " return value === null || value === undefined;", "}", "", "export function isBlank(value: unknown): value is string {", " return typeof value === \"string\" && value.trim().length === 0;", "}", "", "export function pickDefined<T extends Record<string, unknown>>(value: T): Partial<T> {", " return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== undefined)) as Partial<T>;", "}");
|
|
192
|
-
}
|
|
193
|
-
function storageIndex() {
|
|
194
|
-
return lines("type StorageKind = \"local\" | \"session\";", "", "function resolveStorage(kind: StorageKind): Storage {", " return kind === \"session\" ? sessionStorage : localStorage;", "}", "", "export function createStorage(kind: StorageKind = \"local\") {", " const storage = resolveStorage(kind);", "", " return {", " get<T>(key: string): T | null {", " const raw = storage.getItem(key);", " if (raw === null) return null;", " try {", " return JSON.parse(raw) as T;", " } catch (error) {", " const message = error instanceof Error ? error.message : String(error);", " throw new Error(`Storage value for ${key} is not valid JSON: ${message}`);", " }", " },", " set<T>(key: string, value: T): void {", " storage.setItem(key, JSON.stringify(value));", " },", " remove(key: string): void {", " storage.removeItem(key);", " },", " clear(): void {", " storage.clear();", " }", " };", "}");
|
|
195
|
-
}
|
|
196
|
-
function serviceHttp() {
|
|
197
|
-
return lines("import axios from \"axios\";", "", "export const http = axios.create({", " baseURL: import.meta.env.VITE_API_BASE_URL || \"/api\",", " timeout: 15_000", "});", "", "http.interceptors.response.use(", " (response) => response,", " (error) => Promise.reject(normalizeHttpError(error))", ");", "", "export function normalizeHttpError(error: unknown): Error {", " if (axios.isAxiosError(error)) {", " return new Error(error.response?.data?.message || error.message || \"Request failed\");", " }", " return error instanceof Error ? error : new Error(String(error));", "}");
|
|
198
|
-
}
|
|
199
|
-
function testSetup() {
|
|
200
|
-
return lines("import \"@testing-library/jest-dom/vitest\";", "import { cleanup } from \"@testing-library/vue\";", "import { afterEach } from \"vitest\";", "", "afterEach(() => {", " cleanup();", "});");
|
|
201
|
-
}
|
|
202
|
-
function testRender() {
|
|
203
|
-
return lines("import { render } from \"@testing-library/vue\";", "import type { Component } from \"vue\";", "", "export function renderPage(component: Component) {", " return render(component);", "}");
|
|
204
|
-
}
|
|
205
|
-
function appIntegrationTest() {
|
|
206
|
-
return lines("import { screen } from \"@testing-library/vue\";", "import { describe, expect, it } from \"vitest\";", "import App from \"../../src/App.vue\";", "import { renderPage } from \"../render\";", "", "describe(\"scaffold app\", () => {", " it(\"renders the engineering baseline sections\", () => {", " renderPage(App);", "", " expect(screen.getByRole(\"heading\", { level: 1, name: \"Engineering base is ready\" })).toBeInTheDocument();", " expect(screen.getByRole(\"heading\", { level: 2, name: \"utils\" })).toBeInTheDocument();", " expect(screen.getByRole(\"heading\", { level: 2, name: \"storage\" })).toBeInTheDocument();", " expect(screen.getByRole(\"heading\", { level: 2, name: \"service\" })).toBeInTheDocument();", " });", "});");
|
|
207
|
-
}
|
|
208
|
-
function appDesktopE2eTest() {
|
|
209
|
-
return lines("import { expect, test } from \"@playwright/test\";", "", "test(\"desktop smoke renders the scaffold shell\", async ({ page }) => {", " await page.goto(\"/\");", "", " await expect(page.getByRole(\"heading\", { level: 1, name: \"Engineering base is ready\" })).toBeVisible();", " await expect(page.getByRole(\"heading\", { level: 2, name: \"utils\" })).toBeVisible();", " await expect(page.getByRole(\"heading\", { level: 2, name: \"storage\" })).toBeVisible();", " await expect(page.getByRole(\"heading\", { level: 2, name: \"service\" })).toBeVisible();", "});");
|
|
210
|
-
}
|
|
211
|
-
function appMobileE2eTest() {
|
|
212
|
-
return lines("import { expect, test } from \"@playwright/test\";", "", "test(\"mobile smoke keeps scaffold content in the viewport\", async ({ page }) => {", " await page.goto(\"/\");", "", " await expect(page.getByRole(\"heading\", { level: 1, name: \"Engineering base is ready\" })).toBeVisible();", " const documentOverflow = await page.evaluate(() => document.documentElement.scrollWidth > document.documentElement.clientWidth);", " expect(documentOverflow).toBe(false);", "});");
|
|
213
|
-
}
|
|
214
|
-
function escapeHtml(value) {
|
|
215
|
-
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
216
|
-
}
|
|
217
|
-
function json(value) {
|
|
218
|
-
return `${JSON.stringify(value, null, 2)}\n`;
|
|
219
|
-
}
|
|
220
168
|
//# sourceMappingURL=vue-template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-template.js","sourceRoot":"","sources":["../../../src/runtime/scaffold/vue-template.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vue-template.js","sourceRoot":"","sources":["../../../src/runtime/scaffold/vue-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,4 +18,5 @@ export interface ScaffoldResult {
|
|
|
18
18
|
force: boolean;
|
|
19
19
|
files: ScaffoldFileResult[];
|
|
20
20
|
}
|
|
21
|
+
export declare function isScaffoldPresetName(value: string): value is ScaffoldPresetName;
|
|
21
22
|
export declare function scaffoldProject(projectRoot: string, options: ScaffoldOptions): ScaffoldResult;
|
package/dist/runtime/scaffold.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { buildVueScaffoldFiles, toPackageName } from "./scaffold/vue-template.js";
|
|
4
|
+
const SCAFFOLD_PRESETS = {
|
|
5
|
+
vue: {
|
|
6
|
+
name: "vue",
|
|
7
|
+
buildFiles: buildVueScaffoldFiles
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
export function isScaffoldPresetName(value) {
|
|
11
|
+
return value in SCAFFOLD_PRESETS;
|
|
12
|
+
}
|
|
4
13
|
export function scaffoldProject(projectRoot, options) {
|
|
5
|
-
|
|
14
|
+
const preset = SCAFFOLD_PRESETS[options.preset];
|
|
15
|
+
if (!preset) {
|
|
6
16
|
throw new Error(`Unsupported scaffold preset: ${options.preset}`);
|
|
7
17
|
}
|
|
8
18
|
if (!options.target.trim()) {
|
|
@@ -29,7 +39,7 @@ export function scaffoldProject(projectRoot, options) {
|
|
|
29
39
|
}
|
|
30
40
|
const projectName = toPackageName(path.basename(targetPath));
|
|
31
41
|
const results = [];
|
|
32
|
-
for (const file of
|
|
42
|
+
for (const file of preset.buildFiles(projectName)) {
|
|
33
43
|
const fullPath = path.join(targetPath, file.path);
|
|
34
44
|
assertSafeScaffoldFilePath(projectRoot, fullPath, file.path);
|
|
35
45
|
const current = fs.existsSync(fullPath) ? fs.readFileSync(fullPath, "utf8") : null;
|
|
@@ -46,7 +56,7 @@ export function scaffoldProject(projectRoot, options) {
|
|
|
46
56
|
}
|
|
47
57
|
return {
|
|
48
58
|
status: options.dryRun ? "dry-run" : "passed",
|
|
49
|
-
preset:
|
|
59
|
+
preset: preset.name,
|
|
50
60
|
target: targetRelative ? targetRelative.split(path.sep).join("/") : ".",
|
|
51
61
|
projectName,
|
|
52
62
|
dryRun: Boolean(options.dryRun),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/runtime/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/runtime/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAgClF,MAAM,gBAAgB,GAAyD;IAC7E,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,qBAAqB;KAClC;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,IAAI,gBAAgB,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,OAAwB;IAC3E,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,+BAA+B,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,wBAAwB,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,wCAAwC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,CAAC,MAAM,6CAA6C,CAAC,CAAC;IAChH,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,0BAA0B,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnF,MAAM,MAAM,GAAiC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/H,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC9C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,wBAAwB,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9G,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/C,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;QAC7C,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;QACvE,WAAW;QACX,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7B,KAAK,EAAE,OAAO;KACf,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,WAAmB,EAAE,QAAgB,EAAE,YAAoB;IAC7F,MAAM,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,IAAI,QAAQ,EAAE,cAAc,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2DAA2D,YAAY,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,wBAAwB,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,+BAA+B,CAAC,WAAmB,EAAE,UAAkB;IAC9E,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;IAChG,wBAAwB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,wBAAwB,CAAC,eAAuB,EAAE,UAAkB;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAChE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,IAAI,OAAO,GAAG,UAAU,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
npx lint-staged
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# {{projectName}}
|
|
2
|
+
|
|
3
|
+
Vue 3 + Vite engineering scaffold.
|
|
4
|
+
|
|
5
|
+
This preset is based on the company Vue stack shape used in freight-admin, but it only includes engineering infrastructure.
|
|
6
|
+
It intentionally avoids business pages, admin routes, dashboards, permissions, and domain components.
|
|
7
|
+
|
|
8
|
+
## Scripts
|
|
9
|
+
|
|
10
|
+
- `npm run dev`
|
|
11
|
+
- `npm run build`
|
|
12
|
+
- `npm run preview`
|
|
13
|
+
- `npm run lint`
|
|
14
|
+
- `npm run typecheck`
|
|
15
|
+
- `npm test`
|
|
16
|
+
- `npm run test:e2e`
|
|
17
|
+
- `npm run format`
|
|
18
|
+
- `npm run harness -- <command>`
|
|
19
|
+
- `npm run harness:init`
|
|
20
|
+
- `npm run harness:check`
|
|
21
|
+
- `npm run harness:clean`
|
|
22
|
+
|
|
23
|
+
## Base layers
|
|
24
|
+
|
|
25
|
+
- `src/utils` for shared helpers
|
|
26
|
+
- `src/storage` for browser storage wrappers
|
|
27
|
+
- `src/service` for API client setup
|
|
28
|
+
- `src/styles` for project-wide styles
|
|
29
|
+
- `src/styles/tokens.scss` for reusable UI restoration tokens
|
|
30
|
+
- `src/features/<feature>` for page-specific types, fixtures, columns, calculations, and components
|
|
31
|
+
- `tests/integration` for Vitest + Testing Library behavior tests
|
|
32
|
+
- `tests/e2e` for Playwright browser smoke tests
|
|
33
|
+
|
|
34
|
+
## UI restoration workflow
|
|
35
|
+
|
|
36
|
+
Use the injected `ui-implementation` project skill and `.frontend-harness/guidance/latest.md` for the current harness plan.
|
|
37
|
+
Use selected `.frontend-harness/knowledge` cards for project semantics, interactions, and visible states; keep provider design output as evidence.
|
|
38
|
+
When visual restoration is required, follow the evidence contract in `.frontend-harness/guidance/latest.md`: keep design, actual, and diff artifacts plus comparison metadata and matching hashes under `.frontend-harness/`.
|
|
39
|
+
Place project-native UI work under `src/features/<feature>` and verify it with the commands named by the harness plan.
|
|
40
|
+
|
|
41
|
+
## Harness onboarding
|
|
42
|
+
|
|
43
|
+
This scaffold includes `.frontend-harness/config.json` so verification commands are explicit.
|
|
44
|
+
Run `npm run harness:init` after installing dependencies to inject the agent protocol into `AGENTS.md` and `CLAUDE.md`.
|
|
45
|
+
Use `npm run harness -- <command>` for other harness commands so the project-local `frontend-harness` dependency is used.
|
|
46
|
+
|
|
47
|
+
## Testing
|
|
48
|
+
|
|
49
|
+
`npm test` runs Vitest in jsdom with Testing Library helpers from `tests/render.ts` and `tests/setup.ts`.
|
|
50
|
+
`npm run test:e2e` runs Playwright against `npm run preview`; install Playwright browsers in environments that need browser smoke coverage.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import js from "@eslint/js";
|
|
2
|
+
import prettier from "eslint-config-prettier";
|
|
3
|
+
import vue from "eslint-plugin-vue";
|
|
4
|
+
import vueParser from "vue-eslint-parser";
|
|
5
|
+
import tsParser from "@typescript-eslint/parser";
|
|
6
|
+
|
|
7
|
+
export default [
|
|
8
|
+
{
|
|
9
|
+
ignores: ["dist/**", "node_modules/**"]
|
|
10
|
+
},
|
|
11
|
+
js.configs.recommended,
|
|
12
|
+
...vue.configs["flat/essential"],
|
|
13
|
+
prettier,
|
|
14
|
+
{
|
|
15
|
+
languageOptions: {
|
|
16
|
+
globals: {
|
|
17
|
+
document: "readonly",
|
|
18
|
+
localStorage: "readonly",
|
|
19
|
+
sessionStorage: "readonly",
|
|
20
|
+
Storage: "readonly",
|
|
21
|
+
window: "readonly"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
files: ["**/*.{ts,tsx}"],
|
|
27
|
+
languageOptions: {
|
|
28
|
+
parser: tsParser,
|
|
29
|
+
parserOptions: {
|
|
30
|
+
ecmaVersion: "latest",
|
|
31
|
+
sourceType: "module"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
files: ["**/*.vue"],
|
|
37
|
+
languageOptions: {
|
|
38
|
+
parser: vueParser,
|
|
39
|
+
parserOptions: {
|
|
40
|
+
parser: tsParser,
|
|
41
|
+
ecmaVersion: "latest",
|
|
42
|
+
sourceType: "module"
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
rules: {
|
|
46
|
+
"vue/multi-word-component-names": "off"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
node_modules
|
|
2
|
+
dist
|
|
3
|
+
coverage
|
|
4
|
+
.DS_Store
|
|
5
|
+
*.log
|
|
6
|
+
.vite
|
|
7
|
+
playwright-report
|
|
8
|
+
test-results
|
|
9
|
+
src/types/auto-imports.d.ts
|
|
10
|
+
src/types/components.d.ts
|
|
11
|
+
|
|
12
|
+
# frontend-harness generated runtime evidence
|
|
13
|
+
.frontend-harness/context/
|
|
14
|
+
.frontend-harness/plans/
|
|
15
|
+
.frontend-harness/execution-units/
|
|
16
|
+
.frontend-harness/component-graph/
|
|
17
|
+
.frontend-harness/guidance/
|
|
18
|
+
.frontend-harness/state.json
|
|
19
|
+
.frontend-harness/verification/
|
|
20
|
+
.frontend-harness/logs/
|
|
21
|
+
.frontend-harness/repair/
|
|
22
|
+
.frontend-harness/repair-decision/
|
|
23
|
+
.frontend-harness/state-explain/
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>{{projectNameHtml}}</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="app"></div>
|
|
10
|
+
<script type="module" src="/src/main.ts"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineConfig, devices } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
testDir: "./tests/e2e",
|
|
5
|
+
fullyParallel: true,
|
|
6
|
+
reporter: [["list"]],
|
|
7
|
+
use: {
|
|
8
|
+
baseURL: "http://127.0.0.1:4173",
|
|
9
|
+
trace: "retain-on-failure"
|
|
10
|
+
},
|
|
11
|
+
webServer: {
|
|
12
|
+
command: "npm run preview -- --host 127.0.0.1 --port 4173 --strictPort",
|
|
13
|
+
url: "http://127.0.0.1:4173",
|
|
14
|
+
reuseExistingServer: !process.env.CI,
|
|
15
|
+
timeout: 120_000
|
|
16
|
+
},
|
|
17
|
+
projects: [
|
|
18
|
+
{
|
|
19
|
+
name: "chromium-desktop",
|
|
20
|
+
testMatch: /desktop\.spec\.ts/,
|
|
21
|
+
use: { ...devices["Desktop Chrome"] }
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "mobile-chrome",
|
|
25
|
+
testMatch: /mobile\.spec\.ts/,
|
|
26
|
+
use: { ...devices["Pixel 7"] }
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
});
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<main class="app-shell">
|
|
3
|
+
<section class="hero">
|
|
4
|
+
<p class="eyebrow">Vue scaffold</p>
|
|
5
|
+
<h1>Engineering base is ready</h1>
|
|
6
|
+
<p class="lead">
|
|
7
|
+
This scaffold carries the company Vue engineering baseline: Vite, TypeScript, Element Plus, auto imports, storage, utility, and service layers.
|
|
8
|
+
</p>
|
|
9
|
+
</section>
|
|
10
|
+
<section class="grid">
|
|
11
|
+
<article>
|
|
12
|
+
<h2>utils</h2>
|
|
13
|
+
<p>Shared helpers and data shaping utilities.</p>
|
|
14
|
+
</article>
|
|
15
|
+
<article>
|
|
16
|
+
<h2>storage</h2>
|
|
17
|
+
<p>Browser storage wrappers with JSON handling.</p>
|
|
18
|
+
</article>
|
|
19
|
+
<article>
|
|
20
|
+
<h2>service</h2>
|
|
21
|
+
<p>API client setup and error normalization.</p>
|
|
22
|
+
</article>
|
|
23
|
+
</section>
|
|
24
|
+
</main>
|
|
25
|
+
</template>
|
|
26
|
+
|
|
27
|
+
<style scoped lang="scss">
|
|
28
|
+
.app-shell {
|
|
29
|
+
min-height: 100vh;
|
|
30
|
+
padding: 48px 24px;
|
|
31
|
+
background: #f6f8fb;
|
|
32
|
+
color: #102030;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.hero {
|
|
36
|
+
max-width: 960px;
|
|
37
|
+
margin: 0 auto 32px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.eyebrow {
|
|
41
|
+
margin: 0 0 12px;
|
|
42
|
+
font-size: 12px;
|
|
43
|
+
letter-spacing: 0.12em;
|
|
44
|
+
text-transform: uppercase;
|
|
45
|
+
color: #5f6b7a;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
h1 {
|
|
49
|
+
margin: 0;
|
|
50
|
+
font-size: 40px;
|
|
51
|
+
line-height: 1.1;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.lead {
|
|
55
|
+
max-width: 680px;
|
|
56
|
+
margin: 16px 0 0;
|
|
57
|
+
font-size: 16px;
|
|
58
|
+
line-height: 1.75;
|
|
59
|
+
color: #425466;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.grid {
|
|
63
|
+
display: grid;
|
|
64
|
+
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
|
65
|
+
gap: 16px;
|
|
66
|
+
max-width: 960px;
|
|
67
|
+
margin: 0 auto;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
article {
|
|
71
|
+
padding: 20px;
|
|
72
|
+
border: 1px solid #d7deea;
|
|
73
|
+
border-radius: 8px;
|
|
74
|
+
background: #fff;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
h2 {
|
|
78
|
+
margin: 0 0 8px;
|
|
79
|
+
font-size: 18px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
p {
|
|
83
|
+
margin: 0;
|
|
84
|
+
line-height: 1.7;
|
|
85
|
+
}
|
|
86
|
+
</style>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
|
|
3
|
+
export const http = axios.create({
|
|
4
|
+
baseURL: import.meta.env.VITE_API_BASE_URL || "/api",
|
|
5
|
+
timeout: 15_000
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
http.interceptors.response.use(
|
|
9
|
+
(response) => response,
|
|
10
|
+
(error) => Promise.reject(normalizeHttpError(error))
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export function normalizeHttpError(error: unknown): Error {
|
|
14
|
+
if (axios.isAxiosError(error)) {
|
|
15
|
+
return new Error(error.response?.data?.message || error.message || "Request failed");
|
|
16
|
+
}
|
|
17
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { http, normalizeHttpError } from "./http";
|