diff --git a/.github/workflows/agdb_studio.yaml b/.github/workflows/agdb_studio.yaml index e0fdb2259..0e1652361 100644 --- a/.github/workflows/agdb_studio.yaml +++ b/.github/workflows/agdb_studio.yaml @@ -40,7 +40,11 @@ jobs: steps: - uses: actions/checkout@v4 - run: npm ci - - run: npm run test:unit + working-directory: agdb_api/typescript + - run: npm run build + working-directory: agdb_api/typescript + - run: npm ci + - run: npm run test - uses: actions/upload-artifact@v4 if: always() with: @@ -57,6 +61,10 @@ jobs: working-directory: agdb_studio steps: - uses: actions/checkout@v4 + - run: npm ci + working-directory: agdb_api/typescript + - run: npm run build + working-directory: agdb_api/typescript - run: npm ci - run: npx playwright install --with-deps - run: npm run build diff --git a/.vscode/terminals.json b/.vscode/terminals.json index bd0da09a8..dfec5988f 100644 --- a/.vscode/terminals.json +++ b/.vscode/terminals.json @@ -22,6 +22,27 @@ "open": true, "focus": false, "commands": ["cd agdb_web"] + }, + { + "name": "studio SERVER", + "description": "For running web studio server", + "open": true, + "focus": false, + "commands": ["cd agdb_studio", "npm run dev"] + }, + { + "name": "studio SCRIPTS", + "description": "For running studio scripts", + "open": true, + "focus": false, + "commands": ["cd agdb_studio"] + }, + { + "name": "api SCRIPTS", + "description": "For running api/typescript scripts", + "open": true, + "focus": false, + "commands": ["cd agdb_api/typescript"] } ] } diff --git a/agdb_api/typescript/src/client.ts b/agdb_api/typescript/src/client.ts index 10095aad4..f61571287 100644 --- a/agdb_api/typescript/src/client.ts +++ b/agdb_api/typescript/src/client.ts @@ -1,12 +1,13 @@ -import { OpenAPIClientAxios } from "openapi-client-axios"; +import { AxiosRequestConfig, OpenAPIClientAxios } from "openapi-client-axios"; import type { Client } from "./openapi"; type AgdbApi = { - token: string; + token: string | undefined; login: (username: string, password: string) => Promise; // eslint-disable-line no-unused-vars logout: () => Promise; - get_token: () => string; + get_token: () => string | undefined; set_token: (token: string) => void; // eslint-disable-line no-unused-vars + reset_token: () => void; }; async function login(username: string, password: string): Promise { @@ -19,26 +20,30 @@ async function login(username: string, password: string): Promise { return token.data; } -function get_token(): string { +function get_token(): string | undefined { return this.token; } async function logout(): Promise { await this.user_logout(); - this.token = ""; - this.interceptors.request.use((config) => { - return config; - }); + this.reset_token(); } -function set_token(token: string) { +function set_token(token: string): void { this.token = token; - this.interceptors.request.use((config) => { + this.interceptors.request.use((config: AxiosRequestConfig) => { config.headers.Authorization = `Bearer ${token}`; return config; }); } +function reset_token(): void { + this.token = undefined; + this.interceptors.request.use((config: AxiosRequestConfig) => { + return config; + }); +} + export type AgdbApiClient = Client & AgdbApi; export async function client(address: String): Promise { @@ -51,5 +56,6 @@ export async function client(address: String): Promise { client.logout = logout; client.set_token = set_token; client.get_token = get_token; + client.reset_token = reset_token; return client; } diff --git a/agdb_api/typescript/tests/api.test.ts b/agdb_api/typescript/tests/api.test.ts index 18c2b965b..08ddedf64 100644 --- a/agdb_api/typescript/tests/api.test.ts +++ b/agdb_api/typescript/tests/api.test.ts @@ -19,7 +19,7 @@ describe("openapi test", () => { let client = await AgdbApi.client("http://localhost:3000"); await client.login("admin", "admin"); await client.logout(); - expect(client.get_token()).toEqual(""); + expect(client.get_token()).toEqual(undefined); await expect(client.db_list()).rejects.toThrowError( "Request failed with status code 401", diff --git a/agdb_studio/README.md b/agdb_studio/README.md index a323eb896..6e6817cd4 100644 --- a/agdb_studio/README.md +++ b/agdb_studio/README.md @@ -42,7 +42,7 @@ npm run build ### Run Unit Tests with [Vitest](https://vitest.dev/) ```sh -npm run test:unit +npm run test ``` ### Run End-to-End Tests with [Playwright](https://playwright.dev) diff --git a/agdb_studio/e2e/vue.spec.ts b/agdb_studio/e2e/vue.spec.ts index 0a5c3c62c..9a54f1f8d 100644 --- a/agdb_studio/e2e/vue.spec.ts +++ b/agdb_studio/e2e/vue.spec.ts @@ -3,6 +3,6 @@ import { test, expect } from "@playwright/test"; // See here how to get started: // https://playwright.dev/docs/intro test("visits the app root url", async ({ page }) => { - await page.goto("/"); - await expect(page.locator("div.main-wrapper")).toBeVisible(); + await page.goto("/login"); + await expect(page.locator("div.login-form")).toBeVisible(); }); diff --git a/agdb_studio/package-lock.json b/agdb_studio/package-lock.json index 76e345d26..61c815f90 100644 --- a/agdb_studio/package-lock.json +++ b/agdb_studio/package-lock.json @@ -8,6 +8,8 @@ "name": "agdb_studio", "version": "0.0.0", "dependencies": { + "@kalimahapps/vue-icons": "^1.7.1", + "agdb_api": "file:../agdb_api/typescript", "openapi-client-axios": "^7.5.1", "pinia": "^2.1.7", "vue": "^3.3.4", @@ -38,6 +40,30 @@ "vue-tsc": "^2.0.28" } }, + "../../agdb_api/typescript": { + "extraneous": true + }, + "../agdb_api/typescript": { + "name": "@agnesoft/agdb_api", + "version": "0.9.0", + "license": "Apache-2.0", + "dependencies": { + "openapi-client-axios": "^7.5.5" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.10.3", + "@types/node": "^20.14.10", + "@typescript-eslint/parser": "^7.16.0", + "@vitest/coverage-v8": "^2.0.2", + "copyfiles": "^2.4.1", + "eslint": "^8.56.0", + "openapicmd": "^2.4.0", + "prettier": "^3.3.3", + "typescript": "^5.5.3", + "vite": "^5.3.3", + "vitest": "^2.0.2" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -752,6 +778,20 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kalimahapps/vue-icons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@kalimahapps/vue-icons/-/vue-icons-1.7.1.tgz", + "integrity": "sha512-PXMiVTPOZ0LTU8DuIIcuOc1FyC9I9e2SMz9XUzByZZEPN8ruDCdNw2fyVCH8rcNpVSrlMlfqDT7di7tPZgH8XA==", + "dependencies": { + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1713,6 +1753,10 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agdb_api": { + "resolved": "../agdb_api/typescript", + "link": true + }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -4714,6 +4758,11 @@ "node": ">=8" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", diff --git a/agdb_studio/package.json b/agdb_studio/package.json index 748bbf4bb..3737b09b2 100644 --- a/agdb_studio/package.json +++ b/agdb_studio/package.json @@ -6,16 +6,18 @@ "dev": "vite", "build": "run-p type-check \"build-only {@}\" --", "preview": "vite preview", - "test:unit": "vitest run --coverage", + "test": "vitest run --coverage", "test:e2e": "playwright test", "build-only": "vite build", "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", "lint": "eslint --max-warnings=0 . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", "format": "prettier --write src/ e2e/ tests/", "format:check": "prettier --check src/ e2e/ tests/", - "before-commit": "npm run format && npm run lint && npm run test:unit && npm run test:e2e" + "before-commit": "npm run format && npm run lint && npm run test && npm run test:e2e" }, "dependencies": { + "@kalimahapps/vue-icons": "^1.7.1", + "agdb_api": "file:../agdb_api/typescript", "openapi-client-axios": "^7.5.1", "pinia": "^2.1.7", "vue": "^3.3.4", diff --git a/agdb_studio/playwright.config.ts b/agdb_studio/playwright.config.ts index 86c497660..bf1ffcb37 100644 --- a/agdb_studio/playwright.config.ts +++ b/agdb_studio/playwright.config.ts @@ -53,32 +53,32 @@ const config: PlaywrightTestConfig = { ...devices["Desktop Chrome"], }, }, - { - name: "firefox", - use: { - ...devices["Desktop Firefox"], - }, - }, - { - name: "webkit", - use: { - ...devices["Desktop Safari"], - }, - }, + // { + // name: "firefox", + // use: { + // ...devices["Desktop Firefox"], + // }, + // }, + // { + // name: "webkit", + // use: { + // ...devices["Desktop Safari"], + // }, + // }, - /* Test against mobile viewports. */ - { - name: "Mobile Chrome", - use: { - ...devices["Pixel 5"], - }, - }, - { - name: "Mobile Safari", - use: { - ...devices["iPhone 12"], - }, - }, + // /* Test against mobile viewports. */ + // { + // name: "Mobile Chrome", + // use: { + // ...devices["Pixel 5"], + // }, + // }, + // { + // name: "Mobile Safari", + // use: { + // ...devices["iPhone 12"], + // }, + // }, /* Test against branded browsers. */ // { diff --git a/agdb_studio/src/assets/button.less b/agdb_studio/src/assets/button.less index 9d5ac0ea8..9d4ad70a6 100644 --- a/agdb_studio/src/assets/button.less +++ b/agdb_studio/src/assets/button.less @@ -20,8 +20,8 @@ } .button-warning { - background-color: #ffc107; - color: #212529; + background-color: #ff9f2c; + color: #181818; } .button-danger { diff --git a/agdb_studio/src/components/auth/LoginForm.vue b/agdb_studio/src/components/auth/LoginForm.vue index 18ac6bf93..01159ffe3 100644 --- a/agdb_studio/src/components/auth/LoginForm.vue +++ b/agdb_studio/src/components/auth/LoginForm.vue @@ -1,17 +1,37 @@ @@ -38,5 +61,8 @@ const login = async () => { font-size: 1.2rem; margin-top: 0.6rem; } + input { + border-radius: 0.2rem; + } } diff --git a/agdb_studio/src/layouts/MainLayout.vue b/agdb_studio/src/layouts/MainLayout.vue index 23ca2843a..a2289ee5b 100644 --- a/agdb_studio/src/layouts/MainLayout.vue +++ b/agdb_studio/src/layouts/MainLayout.vue @@ -1,5 +1,6 @@