diff --git a/.eslintrc.json b/.eslintrc.json index 9d747b87..cabeaf06 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -22,26 +22,15 @@ "plugins": ["@typescript-eslint", "prettier"], "settings": { "import/resolver": { - "alias": { - "map": [ - ["assets", "./src/assets"], - ["components", "./src/components"], - ["db", "./db"], - ["hooks", "./src/components/hooks"], - ["lang", "./src/lang"], - ["lib", "./src/lib"], - ["public", "./public"], - ["queries", "./src/queries"], - ["store", "./src/store"], - ["styles", "./src/styles"] - ], - "extensions": [".ts", ".tsx", ".js", ".jsx", ".json"] + "node": { + "moduleDirectory": ["node_modules", "src/"] } } }, "rules": { "no-console": "error", "react/display-name": "off", + "react-hooks/exhaustive-deps": "off", "react/react-in-jsx-scope": "off", "react/prop-types": "off", "import/no-anonymous-default-export": "off", diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml index db8be210..711468f2 100644 --- a/.github/ISSUE_TEMPLATE/1.bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml @@ -1,4 +1,4 @@ -name: "🐛 Bug Report" +name: '🐛 Bug Report' description: Create a bug report for Umami. body: - type: textarea @@ -22,6 +22,10 @@ body: label: Relevant log output description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. render: shell + - type: input + attributes: + label: Which Umami version are you using? (if relevant) + description: 'For example: Chrome, Edge, Firefox, etc' - type: input attributes: label: Which browser are you using? (if relevant) @@ -29,4 +33,4 @@ body: - type: input attributes: label: How are you deploying your application? (if relevant) - description: 'For example: Vercel, Railway, Docker, etc' \ No newline at end of file + description: 'For example: Vercel, Railway, Docker, etc' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66e16a03..5dbc613d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,15 +16,15 @@ jobs: strategy: matrix: include: - - node-version: 18.x + - node-version: 18.17 db-type: postgresql - - node-version: 18.x + - node-version: 18.17 db-type: mysql steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' diff --git a/README.md b/README.md index 32e78e31..9426642a 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ mysql://username:mypassword@localhost:3306/mydb yarn build ``` -The build step will also create tables in your database if you ae installing for the first time. It will also create a login user with username **admin** and password **umami**. +The build step will also create tables in your database if you are installing for the first time. It will also create a login user with username **admin** and password **umami**. ### Start the application diff --git a/db/clickhouse/schema.sql b/db/clickhouse/schema.sql index 44428e94..741f06ad 100644 --- a/db/clickhouse/schema.sql +++ b/db/clickhouse/schema.sql @@ -1,5 +1,3 @@ -SET allow_experimental_object_type = 1; - -- Create Event CREATE TABLE umami.website_event ( @@ -34,82 +32,6 @@ CREATE TABLE umami.website_event ORDER BY (website_id, session_id, created_at) SETTINGS index_granularity = 8192; -CREATE TABLE umami.website_event_queue ( - website_id UUID, - session_id UUID, - event_id UUID, - --sessions - hostname LowCardinality(String), - browser LowCardinality(String), - os LowCardinality(String), - device LowCardinality(String), - screen LowCardinality(String), - language LowCardinality(String), - country LowCardinality(String), - subdivision1 LowCardinality(String), - subdivision2 LowCardinality(String), - city String, - --pageviews - url_path String, - url_query String, - referrer_path String, - referrer_query String, - referrer_domain String, - page_title String, - --events - event_type UInt32, - event_name String, - created_at DateTime('UTC'), - --virtual columns - _error String, - _raw_message String -) -ENGINE = Kafka -SETTINGS kafka_broker_list = 'domain:9092,domain:9093,domain:9094', -- input broker list - kafka_topic_list = 'event', - kafka_group_name = 'event_consumer_group', - kafka_format = 'JSONEachRow', - kafka_max_block_size = 1048576, - kafka_handle_error_mode = 'stream'; - -CREATE MATERIALIZED VIEW umami.website_event_queue_mv TO umami.website_event AS -SELECT website_id, - session_id, - event_id, - hostname, - browser, - os, - device, - screen, - language, - country, - subdivision1, - subdivision2, - city, - url_path, - url_query, - referrer_path, - referrer_query, - referrer_domain, - page_title, - event_type, - event_name, - created_at -FROM umami.website_event_queue; - -CREATE MATERIALIZED VIEW umami.website_event_errors_mv -( - error String, - raw String -) -ENGINE = MergeTree -ORDER BY (error, raw) -SETTINGS index_granularity = 8192 AS -SELECT _error AS error, - _raw_message AS raw -FROM umami.website_event_queue -WHERE length(_error) > 0; - CREATE TABLE umami.event_data ( website_id UUID, @@ -127,55 +49,4 @@ CREATE TABLE umami.event_data ) engine = MergeTree ORDER BY (website_id, event_id, event_key, created_at) - SETTINGS index_granularity = 8192; - -CREATE TABLE umami.event_data_queue ( - website_id UUID, - session_id UUID, - event_id UUID, - url_path String, - event_name String, - event_key String, - string_value Nullable(String), - number_value Nullable(Decimal64(4)), --922337203685477.5625 - date_value Nullable(DateTime('UTC')), - data_type UInt32, - created_at DateTime('UTC'), - --virtual columns - _error String, - _raw_message String -) -ENGINE = Kafka -SETTINGS kafka_broker_list = 'domain:9092,domain:9093,domain:9094', -- input broker list - kafka_topic_list = 'event_data', - kafka_group_name = 'event_data_consumer_group', - kafka_format = 'JSONEachRow', - kafka_max_block_size = 1048576, - kafka_handle_error_mode = 'stream'; - -CREATE MATERIALIZED VIEW umami.event_data_queue_mv TO umami.event_data AS -SELECT website_id, - session_id, - event_id, - url_path, - event_name, - event_key, - string_value, - number_value, - date_value, - data_type, - created_at -FROM umami.event_data_queue; - -CREATE MATERIALIZED VIEW umami.event_data_errors_mv -( - error String, - raw String -) -ENGINE = MergeTree -ORDER BY (error, raw) -SETTINGS index_granularity = 8192 AS -SELECT _error AS error, - _raw_message AS raw -FROM umami.event_data_queue -WHERE length(_error) > 0; \ No newline at end of file + SETTINGS index_granularity = 8192; \ No newline at end of file diff --git a/db/mysql/migrations/04_team_redesign/migration.sql b/db/mysql/migrations/04_team_redesign/migration.sql new file mode 100644 index 00000000..57f8dc93 --- /dev/null +++ b/db/mysql/migrations/04_team_redesign/migration.sql @@ -0,0 +1,29 @@ +/* + Warnings: + + - You are about to drop the `team_website` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- AlterTable +ALTER TABLE `team` ADD COLUMN `deleted_at` TIMESTAMP(0) NULL, + ADD COLUMN `logo_url` VARCHAR(2183) NULL; + +-- AlterTable +ALTER TABLE `user` ADD COLUMN `display_name` VARCHAR(255) NULL, + ADD COLUMN `logo_url` VARCHAR(2183) NULL; + +-- AlterTable +ALTER TABLE `website` ADD COLUMN `created_by` VARCHAR(36) NULL, + ADD COLUMN `team_id` VARCHAR(36) NULL; + +-- MigrateData +UPDATE "website" SET created_by = user_id WHERE team_id IS NULL; + +-- DropTable +DROP TABLE `team_website`; + +-- CreateIndex +CREATE INDEX `website_team_id_idx` ON `website`(`team_id`); + +-- CreateIndex +CREATE INDEX `website_created_by_idx` ON `website`(`created_by`); diff --git a/db/mysql/schema.prisma b/db/mysql/schema.prisma index 38bb91f4..8e5cbbc3 100644 --- a/db/mysql/schema.prisma +++ b/db/mysql/schema.prisma @@ -9,15 +9,18 @@ datasource db { } model User { - id String @id @unique @map("user_id") @db.VarChar(36) - username String @unique @db.VarChar(255) - password String @db.VarChar(60) - role String @map("role") @db.VarChar(50) - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) - updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0) - deletedAt DateTime? @map("deleted_at") @db.Timestamp(0) + id String @id @unique @map("user_id") @db.VarChar(36) + username String @unique @db.VarChar(255) + password String @db.VarChar(60) + role String @map("role") @db.VarChar(50) + logoUrl String? @map("logo_url") @db.VarChar(2183) + displayName String? @map("display_name") @db.VarChar(255) + createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) + updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0) + deletedAt DateTime? @map("deleted_at") @db.Timestamp(0) - website Website[] + websiteUser Website[] @relation("user") + websiteCreateUser Website[] @relation("createUser") teamUser TeamUser[] report Report[] @@ -64,19 +67,24 @@ model Website { shareId String? @unique @map("share_id") @db.VarChar(50) resetAt DateTime? @map("reset_at") @db.Timestamp(0) userId String? @map("user_id") @db.VarChar(36) + teamId String? @map("team_id") @db.VarChar(36) + createdBy String? @map("created_by") @db.VarChar(36) createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0) deletedAt DateTime? @map("deleted_at") @db.Timestamp(0) - user User? @relation(fields: [userId], references: [id]) - teamWebsite TeamWebsite[] + user User? @relation("user", fields: [userId], references: [id]) + createUser User? @relation("createUser", fields: [createdBy], references: [id]) + team Team? @relation(fields: [teamId], references: [id]) eventData EventData[] report Report[] sessionData SessionData[] @@index([userId]) + @@index([teamId]) @@index([createdAt]) @@index([shareId]) + @@index([createdBy]) @@map("website") } @@ -157,11 +165,13 @@ model Team { id String @id() @unique() @map("team_id") @db.VarChar(36) name String @db.VarChar(50) accessCode String? @unique @map("access_code") @db.VarChar(50) + logoUrl String? @map("logo_url") @db.VarChar(2183) createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamp(0) + deletedAt DateTime? @map("deleted_at") @db.Timestamp(0) + website Website[] teamUser TeamUser[] - teamWebsite TeamWebsite[] @@index([accessCode]) @@map("team") @@ -183,20 +193,6 @@ model TeamUser { @@map("team_user") } -model TeamWebsite { - id String @id() @unique() @map("team_website_id") @db.VarChar(36) - teamId String @map("team_id") @db.VarChar(36) - websiteId String @map("website_id") @db.VarChar(36) - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamp(0) - - team Team @relation(fields: [teamId], references: [id]) - website Website @relation(fields: [websiteId], references: [id]) - - @@index([teamId]) - @@index([websiteId]) - @@map("team_website") -} - model Report { id String @id() @unique() @map("report_id") @db.VarChar(36) userId String @map("user_id") @db.VarChar(36) diff --git a/db/postgresql/migrations/04_team_redesign/migration.sql b/db/postgresql/migrations/04_team_redesign/migration.sql new file mode 100644 index 00000000..91726316 --- /dev/null +++ b/db/postgresql/migrations/04_team_redesign/migration.sql @@ -0,0 +1,29 @@ +/* + Warnings: + + - You are about to drop the `team_website` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- AlterTable +ALTER TABLE "team" ADD COLUMN "deleted_at" TIMESTAMPTZ(6), +ADD COLUMN "logo_url" VARCHAR(2183); + +-- AlterTable +ALTER TABLE "user" ADD COLUMN "display_name" VARCHAR(255), +ADD COLUMN "logo_url" VARCHAR(2183); + +-- AlterTable +ALTER TABLE "website" ADD COLUMN "created_by" UUID, +ADD COLUMN "team_id" UUID; + +-- MigrateData +UPDATE "website" SET created_by = user_id WHERE team_id IS NULL; + +-- DropTable +DROP TABLE "team_website"; + +-- CreateIndex +CREATE INDEX "website_team_id_idx" ON "website"("team_id"); + +-- CreateIndex +CREATE INDEX "website_created_by_idx" ON "website"("created_by"); \ No newline at end of file diff --git a/db/postgresql/schema.prisma b/db/postgresql/schema.prisma index d7a70ab0..31cc7616 100644 --- a/db/postgresql/schema.prisma +++ b/db/postgresql/schema.prisma @@ -9,17 +9,20 @@ datasource db { } model User { - id String @id @unique @map("user_id") @db.Uuid - username String @unique @db.VarChar(255) - password String @db.VarChar(60) - role String @map("role") @db.VarChar(50) - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) - deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6) + id String @id @unique @map("user_id") @db.Uuid + username String @unique @db.VarChar(255) + password String @db.VarChar(60) + role String @map("role") @db.VarChar(50) + logoUrl String? @map("logo_url") @db.VarChar(2183) + displayName String? @map("display_name") @db.VarChar(255) + createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) + updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) + deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6) - website Website[] - teamUser TeamUser[] - report Report[] + websiteUser Website[] @relation("user") + websiteCreateUser Website[] @relation("createUser") + teamUser TeamUser[] + report Report[] @@map("user") } @@ -64,19 +67,24 @@ model Website { shareId String? @unique @map("share_id") @db.VarChar(50) resetAt DateTime? @map("reset_at") @db.Timestamptz(6) userId String? @map("user_id") @db.Uuid + teamId String? @map("team_id") @db.Uuid + createdBy String? @map("created_by") @db.Uuid createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6) - user User? @relation(fields: [userId], references: [id]) - teamWebsite TeamWebsite[] + user User? @relation("user", fields: [userId], references: [id]) + createUser User? @relation("createUser", fields: [createdBy], references: [id]) + team Team? @relation(fields: [teamId], references: [id]) eventData EventData[] report Report[] sessionData SessionData[] @@index([userId]) + @@index([teamId]) @@index([createdAt]) @@index([shareId]) + @@index([createdBy]) @@map("website") } @@ -157,11 +165,13 @@ model Team { id String @id() @unique() @map("team_id") @db.Uuid name String @db.VarChar(50) accessCode String? @unique @map("access_code") @db.VarChar(50) + logoUrl String? @map("logo_url") @db.VarChar(2183) createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) + deletedAt DateTime? @map("deleted_at") @db.Timestamptz(6) - teamUser TeamUser[] - teamWebsite TeamWebsite[] + website Website[] + teamUser TeamUser[] @@index([accessCode]) @@map("team") @@ -183,20 +193,6 @@ model TeamUser { @@map("team_user") } -model TeamWebsite { - id String @id() @unique() @map("team_website_id") @db.Uuid - teamId String @map("team_id") @db.Uuid - websiteId String @map("website_id") @db.Uuid - createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) - - team Team @relation(fields: [teamId], references: [id]) - website Website @relation(fields: [websiteId], references: [id]) - - @@index([teamId]) - @@index([websiteId]) - @@map("team_website") -} - model Report { id String @id() @unique() @map("report_id") @db.Uuid userId String @map("user_id") @db.Uuid diff --git a/jsconfig.json b/jsconfig.json index 738e8a46..5875dc5b 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { - "baseUrl": "./src" - } + "baseUrl": "src" + }, + "include": ["src"] } diff --git a/lang-ignore.json b/lang-ignore.json index 4a0f9d41..e278a52e 100644 --- a/lang-ignore.json +++ b/lang-ignore.json @@ -36,6 +36,7 @@ "metrics.referrers", "message.powered-by" ], + "mn-MN": ["label.max", "label.min", "label.os", "label.query", "label.url", "label.urls"], "nb-NO": ["label.administrator", "label.dashboard"], "nl-NL": [ "label.analytics", diff --git a/next.config.js b/next.config.js index a155ece7..dce49100 100644 --- a/next.config.js +++ b/next.config.js @@ -3,13 +3,25 @@ require('dotenv').config(); const path = require('path'); const pkg = require('./package.json'); +const basePath = process.env.BASE_PATH || ''; +const forceSSL = process.env.FORCE_SSL || ''; +const collectApiEndpoint = process.env.COLLECT_API_ENDPOINT || ''; +const defaultLocale = process.env.DEFAULT_LOCALE || ''; +const trackerScriptName = process.env.TRACKER_SCRIPT_NAME || ''; +const cloudMode = process.env.CLOUD_MODE || ''; +const cloudUrl = process.env.CLOUD_URL || ''; +const frameAncestors = process.env.ALLOWED_FRAME_URLS || ''; +const disableLogin = process.env.DISABLE_LOGIN || ''; +const disableUI = process.env.DISABLE_UI || ''; +const hostURL = process.env.HOST_URL || ''; + const contentSecurityPolicy = [ `default-src 'self'`, `img-src *`, `script-src 'self' 'unsafe-eval' 'unsafe-inline'`, `style-src 'self' 'unsafe-inline'`, - `connect-src 'self' api.umami.is`, - `frame-ancestors 'self' ${process.env.ALLOWED_FRAME_URLS || ''}`, + `connect-src 'self' api.umami.is cloud.umami.is`, + `frame-ancestors 'self' ${frameAncestors}`, ]; const headers = [ @@ -26,7 +38,7 @@ const headers = [ }, ]; -if (process.env.FORCE_SSL) { +if (forceSSL) { headers.push({ key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload', @@ -35,15 +47,15 @@ if (process.env.FORCE_SSL) { const rewrites = []; -if (process.env.COLLECT_API_ENDPOINT) { +if (collectApiEndpoint) { rewrites.push({ - source: process.env.COLLECT_API_ENDPOINT, + source: collectApiEndpoint, destination: '/api/send', }); } -if (process.env.TRACKER_SCRIPT_NAME) { - const names = process.env.TRACKER_SCRIPT_NAME?.split(',').map(name => name.trim()); +if (trackerScriptName) { + const names = trackerScriptName?.split(',').map(name => name.trim()); if (names) { names.forEach(name => { @@ -58,36 +70,56 @@ if (process.env.TRACKER_SCRIPT_NAME) { const redirects = [ { source: '/settings', - destination: process.env.CLOUD_MODE - ? `${process.env.CLOUD_URL}/settings/websites` - : '/settings/websites', + destination: '/settings/websites', + permanent: true, + }, + { + source: '/teams/:id', + destination: '/teams/:id/dashboard', + permanent: true, + }, + { + source: '/teams/:id/settings', + destination: '/teams/:id/settings/team', permanent: true, }, ]; -if (process.env.CLOUD_MODE && process.env.CLOUD_URL && process.env.DISABLE_LOGIN) { +if (cloudMode && cloudUrl) { redirects.push({ - source: '/login', - destination: process.env.CLOUD_URL, + source: '/settings/:path*', + destination: `${cloudUrl}/settings/:path*`, permanent: false, }); -} -const basePath = process.env.BASE_PATH; + redirects.push({ + source: '/teams/:id/settings/:path*', + destination: `${cloudUrl}/teams/:id/settings/:path*`, + permanent: false, + }); + + if (disableLogin) { + redirects.push({ + source: '/login', + destination: cloudUrl, + permanent: false, + }); + } +} /** @type {import('next').NextConfig} */ const config = { reactStrictMode: false, env: { - basePath: basePath || '', - cloudMode: process.env.CLOUD_MODE || '', - cloudUrl: process.env.CLOUD_URL || '', + basePath, + cloudMode, + cloudUrl, configUrl: '/config', currentVersion: pkg.version, - defaultLocale: process.env.DEFAULT_LOCALE || '', - disableLogin: process.env.DISABLE_LOGIN || '', - disableUI: process.env.DISABLE_UI || '', - hostUrl: process.env.HOST_URL || '', + defaultLocale, + disableLogin, + disableUI, + hostURL, }, basePath, output: 'standalone', diff --git a/package.json b/package.json index 0f437c35..e84f8e24 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "umami", - "version": "2.9.0", + "version": "2.10.0", "description": "A simple, fast, privacy-focused alternative to Google Analytics.", "author": "Mike Cao ", "license": "MIT", @@ -63,11 +63,11 @@ "dependencies": { "@clickhouse/client": "^0.2.2", "@fontsource/inter": "^4.5.15", - "@prisma/client": "5.6.0", + "@prisma/client": "5.7.0", "@prisma/extension-read-replicas": "^0.3.0", "@react-spring/web": "^9.7.3", "@tanstack/react-query": "^5.12.2", - "@umami/prisma-client": "^0.8.0", + "@umami/prisma-client": "^0.14.0", "@umami/redis-client": "^0.18.0", "chalk": "^4.1.1", "chart.js": "^4.2.1", @@ -92,14 +92,15 @@ "isbot": "^3.4.5", "kafkajs": "^2.1.0", "maxmind": "^4.3.6", + "md5": "^2.3.0", "moment-timezone": "^0.5.35", "next": "14.0.4", "next-basics": "^0.39.0", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", - "prisma": "5.6.0", + "prisma": "5.7.0", "react": "^18.2.0", - "react-basics": "^0.114.0", + "react-basics": "^0.122.0", "react-beautiful-dnd": "^13.1.0", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.4", @@ -117,9 +118,8 @@ }, "devDependencies": { "@formatjs/cli": "^4.2.29", - "@netlify/plugin-nextjs": "^4.27.3", + "@netlify/plugin-nextjs": "^4.41.3", "@rollup/plugin-alias": "^5.0.0", - "@rollup/plugin-buble": "^1.0.2", "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.2.0", @@ -135,7 +135,7 @@ "cross-env": "^7.0.3", "esbuild": "^0.17.17", "eslint": "^8.33.0", - "eslint-config-next": "^12.2.4", + "eslint-config-next": "^14.0.4", "eslint-config-prettier": "^8.5.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.26.0", diff --git a/public/intl/messages/en-US.json b/public/intl/messages/en-US.json index 0ee5b1e6..60044243 100644 --- a/public/intl/messages/en-US.json +++ b/public/intl/messages/en-US.json @@ -1382,7 +1382,7 @@ "message.share-url": [ { "type": 0, - "value": "Your website stats are publically available at the following URL:" + "value": "Your website stats are publicly available at the following URL:" } ], "message.team-already-member": [ diff --git a/rollup.tracker.config.mjs b/rollup.tracker.config.mjs index 465e1af3..6a692efa 100644 --- a/rollup.tracker.config.mjs +++ b/rollup.tracker.config.mjs @@ -1,5 +1,4 @@ import 'dotenv/config'; -import buble from '@rollup/plugin-buble'; import replace from '@rollup/plugin-replace'; import { terser } from 'rollup-plugin-terser'; @@ -15,7 +14,6 @@ export default { delimiters: ['', ''], preventAssignment: true, }), - buble({ objectAssign: true }), terser({ compress: { evaluate: false } }), ], }; diff --git a/src/app/(main)/App.tsx b/src/app/(main)/App.tsx index 4b093165..74be8292 100644 --- a/src/app/(main)/App.tsx +++ b/src/app/(main)/App.tsx @@ -27,7 +27,7 @@ export function App({ children }) { {children} {process.env.NODE_ENV === 'production' && !pathname.includes('/share/') && ( - `; - - return ( - <> -

{formatMessage(messages.trackingCode)}

-