diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ac0650510..82281df36 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,9 +17,9 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: 16 - - name: Audit dependencies - run: npm audit --audit-level low + node-version: 18 + # - name: Audit dependencies + # run: npm audit --audit-level low - name: Install dependencies run: npm ci - name: Build Console @@ -30,7 +30,3 @@ jobs: run: npm run lint - name: Unit Tests run: npm test - # - name: E2E Tests - # run: | - # npx playwright install - # npm run e2e diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 512e71552..a723620ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,7 +33,21 @@ If you are worried about or don’t know where to start, check out the next sect ## Development -Once you've created a project and installed dependencies with `npm install`, create a `.env` file using `.env.example` as a template. +### 1. Clone the repository with git + +```bash +git clone https://github.com/appwrite/console.git appwrite-console +``` + +### 2. Install dependencies with npm + +```bash +npm install +``` + +### 3. Setup environment variables + +Add a `.env` file by copying the `.env.example` file as a template in the project's root directory. Finally, start a development server: diff --git a/package-lock.json b/package-lock.json index 052e88534..56621b2b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@sentry/tracing": "^7.36.0", "analytics": "^0.8.1", "echarts": "^5.4.1", + "logrocket": "^3.0.1", "pretty-bytes": "^6.1.0", "prismjs": "^1.29.0", "tippy.js": "^6.3.7", @@ -24,7 +25,7 @@ "devDependencies": { "@playwright/test": "^1.30.0", "@sveltejs/adapter-static": "1.0.6", - "@sveltejs/kit": "1.3.10", + "@sveltejs/kit": "^1.3.10", "@sveltejs/vite-plugin-svelte": "^2.0.2", "@testing-library/dom": "^8.20.0", "@testing-library/jest-dom": "^5.16.5", @@ -33,7 +34,7 @@ "@types/prismjs": "^1.26.0", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", - "@vitest/ui": "^0.28.4", + "@vitest/ui": "^0.28.5", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-svelte3": "^4.0.0", @@ -49,7 +50,7 @@ "tslib": "^2.5.0", "typescript": "^4.9.5", "vite": "^4.1.1", - "vitest": "^0.28.4" + "vitest": "^0.28.5" }, "engines": { "node": ">=16" @@ -1982,17 +1983,17 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.2.tgz", - "integrity": "sha512-xCEan0/NNpQuL0l5aS42FjwQ6wwskdxC3pW1OeFtEKNZwRg7Evro9lac9HesGP6TdFsTv2xMes5ASQVKbCacxg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.3.tgz", + "integrity": "sha512-o+cguBFdwIGtRbNkYOyqTM7KvRUffxh5bfK4oJsWKG2obu+v/cbpT03tJrGl58C7tRXo/aEC0/axN5FVHBj0nA==", "dev": true, "dependencies": { "debug": "^4.3.4", - "deepmerge": "^4.2.2", + "deepmerge": "^4.3.0", "kleur": "^4.1.5", - "magic-string": "^0.27.0", + "magic-string": "^0.29.0", "svelte-hmr": "^0.15.1", - "vitefu": "^0.2.3" + "vitefu": "^0.2.4" }, "engines": { "node": "^14.18.0 || >= 16" @@ -2003,9 +2004,9 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" @@ -6261,6 +6262,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/logrocket": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/logrocket/-/logrocket-3.0.1.tgz", + "integrity": "sha512-jOWG+jEzobKVxGytzZ+4KGm2kiMQMRTHab2uDWQyVZcHfEF38BlCH1yjQVY4LCmuQUwZitP9biMzJZnyUQ0dtQ==" + }, "node_modules/loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -6449,15 +6455,15 @@ } }, "node_modules/mlly": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz", - "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", + "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", "dev": true, "dependencies": { - "acorn": "^8.8.1", - "pathe": "^1.0.0", + "acorn": "^8.8.2", + "pathe": "^1.1.0", "pkg-types": "^1.0.1", - "ufo": "^1.0.1" + "ufo": "^1.1.0" } }, "node_modules/mri": { @@ -6934,14 +6940,14 @@ } }, "node_modules/pkg-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", - "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", + "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", "dev": true, "dependencies": { "jsonc-parser": "^3.2.0", - "mlly": "^1.0.0", - "pathe": "^1.0.0" + "mlly": "^1.1.1", + "pathe": "^1.1.0" } }, "node_modules/playwright-core": { @@ -8286,9 +8292,9 @@ } }, "node_modules/ufo": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz", - "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.0.tgz", + "integrity": "sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==", "dev": true }, "node_modules/undici": { @@ -8387,9 +8393,9 @@ "peer": true }, "node_modules/vite": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", - "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", + "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", "dev": true, "dependencies": { "esbuild": "^0.16.14", diff --git a/package.json b/package.json index 4b994a866..d7ff6e7d1 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@sentry/tracing": "^7.36.0", "analytics": "^0.8.1", "echarts": "^5.4.1", + "logrocket": "^3.0.1", "pretty-bytes": "^6.1.0", "prismjs": "^1.29.0", "tippy.js": "^6.3.7", @@ -35,7 +36,7 @@ "devDependencies": { "@playwright/test": "^1.30.0", "@sveltejs/adapter-static": "1.0.6", - "@sveltejs/kit": "1.3.10", + "@sveltejs/kit": "^1.3.10", "@sveltejs/vite-plugin-svelte": "^2.0.2", "@testing-library/dom": "^8.20.0", "@testing-library/jest-dom": "^5.16.5", @@ -44,7 +45,7 @@ "@types/prismjs": "^1.26.0", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", - "@vitest/ui": "^0.28.4", + "@vitest/ui": "^0.28.5", "eslint": "^8.33.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-svelte3": "^4.0.0", @@ -60,7 +61,7 @@ "tslib": "^2.5.0", "typescript": "^4.9.5", "vite": "^4.1.1", - "vitest": "^0.28.4" + "vitest": "^0.28.5" }, "type": "module", "pre-commit": [ diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index cad336312..c4324b970 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -1,18 +1,16 @@ -import Analytics from 'analytics'; -import googleAnalytics from '@analytics/google-analytics'; -import { get } from 'svelte/store'; import { page } from '$app/stores'; import { user } from '$lib/stores/user'; -import { growthEndpoint, Mode } from '$lib/constants'; +import { ENV, MODE, VARS } from '$lib/system'; +import googleAnalytics from '@analytics/google-analytics'; import { AppwriteException } from '@aw-labs/appwrite-console'; +import Analytics from 'analytics'; +import { get } from 'svelte/store'; -const isDevelopment = - import.meta.env.DEV || import.meta.env?.VITE_VERCEL_ENV?.toString() === 'preview'; const analytics = Analytics({ app: 'appwrite', plugins: [ googleAnalytics({ - measurementIds: [import.meta.env.VITE_GA_PROJECT?.toString() || 'G-R4YJ9JN8L4'] + measurementIds: [VARS.GOOGLE_ANALYTICS || 'G-R4YJ9JN8L4'] }) ] }); @@ -32,7 +30,7 @@ export function trackEvent(name: string, data: object = null): void { }; } - if (isDevelopment) { + if (ENV.DEV || ENV.PREVIEW) { console.debug(`[Analytics] Event ${name} ${path}`, data); } else { analytics.track(name, { ...data, path }); @@ -54,7 +52,7 @@ export function trackPageView(path: string) { return; } - if (isDevelopment) { + if (ENV.DEV || ENV.PREVIEW) { console.debug(`[Analytics] Pageview ${path}`); } else { analytics.page({ @@ -64,14 +62,14 @@ export function trackPageView(path: string) { } function sendEventToGrowth(event: string, path: string, data: object = null): void { - if (!growthEndpoint) return; + if (!VARS.GROWTH_ENDPOINT) return; const userStore = get(user); let email: string, name: string; if (userStore) { email = userStore.email; name = userStore.name; } - fetch(`${growthEndpoint}/analytics`, { + fetch(`${VARS.GROWTH_ENDPOINT}/analytics`, { method: 'POST', headers: { 'Content-Type': 'application/json' @@ -80,7 +78,7 @@ function sendEventToGrowth(event: string, path: string, data: object = null): vo action: event, label: event, url: window.location.origin + path, - account: import.meta.env.VITE_CONSOLE_MODE?.toString() || Mode.SELF_HOSTED, + account: MODE, data: { email, name, @@ -90,8 +88,8 @@ function sendEventToGrowth(event: string, path: string, data: object = null): vo }); } -function isTrackingAllowed() { - if (import.meta.env?.VITEST) { +export function isTrackingAllowed() { + if (ENV.TEST) { return; } if (window.navigator?.doNotTrack) { diff --git a/src/lib/components/alert.svelte b/src/lib/components/alert.svelte index 6d67c8378..599d6b9e9 100644 --- a/src/lib/components/alert.svelte +++ b/src/lib/components/alert.svelte @@ -32,7 +32,7 @@ class:icon-exclamation={type === 'warning'} class:icon-exclamation-circle={type === 'error'} aria-hidden="true" /> -