diff --git a/.gitignore b/.gitignore index 2dced08..be98c26 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,15 @@ **/bin/ **/obj/ **/node_modules/ +.pnpm-store/ **/coverage/ **/.vite/ artifacts/ -src/Umbraco.VercelAnalytics/wwwroot/App_Plugins/ -samples/Umbraco.VercelAnalytics.Example/umbraco/Data/ -samples/Umbraco.VercelAnalytics.Example/umbraco/Logs/ -samples/Umbraco.VercelAnalytics.Example/wwwroot/App_Plugins/ -samples/Umbraco.VercelAnalytics.Example/appsettings-schema.json +src/TheBuilder.WebAnalytics/wwwroot/App_Plugins/ +samples/TheBuilder.WebAnalytics.Example/umbraco/Data/ +samples/TheBuilder.WebAnalytics.Example/umbraco/Logs/ +samples/TheBuilder.WebAnalytics.Example/wwwroot/App_Plugins/ +samples/TheBuilder.WebAnalytics.Example/appsettings-schema.json *.db *.db-shm *.db-wal diff --git a/.impeccable/design.json b/.impeccable/design.json index 9a932af..209c127 100644 --- a/.impeccable/design.json +++ b/.impeccable/design.json @@ -1,7 +1,7 @@ { "schemaVersion": 2, "generatedAt": "2026-07-16T19:48:26Z", - "title": "Design System: Umbraco Vercel Analytics", + "title": "Design System: Web Analytics", "extensions": { "colorMeta": { "backoffice-ink": { @@ -172,7 +172,7 @@ ], "narrative": { "northStar": "The Editorial Instrument", - "overview": "Umbraco Vercel Analytics is a precise but approachable instrument inside the editorial workspace. It should reveal the traffic signal an editor needs, then get out of the way. The visual language is friendly and conversational, but its structure is disciplined: familiar Umbraco controls, clear hierarchy, compact reporting, and feedback close to the action that caused it. The extension belongs to the backoffice rather than merely living inside it. It inherits Umbraco UI Library semantics, Lato typography, spacing, focus treatment, and surface hierarchy. Custom analytics patterns may borrow the clarity of Vercel Analytics, but they must be translated into Umbraco's interaction language. The system explicitly rejects the density, configuration burden, and specialist terminology of an overly dense enterprise analytics platform. It is not Google Analytics, and it must never feel like a separate third-party dashboard embedded in Umbraco.", + "overview": "Web Analytics is a precise but approachable instrument inside the editorial workspace. It should reveal the traffic signal an editor needs, then get out of the way. The visual language is friendly and conversational, but its structure is disciplined: familiar Umbraco controls, clear hierarchy, compact reporting, and feedback close to the action that caused it. The extension belongs to the backoffice rather than merely living inside it. It inherits Umbraco UI Library semantics, Lato typography, spacing, focus treatment, and surface hierarchy. Custom analytics patterns may borrow the clarity of Vercel Analytics, but they must be translated into Umbraco's interaction language. The system explicitly rejects the density, configuration burden, and specialist terminology of an overly dense enterprise analytics platform. It is not Google Analytics, and it must never feel like a separate third-party dashboard embedded in Umbraco.", "keyCharacteristics": [ "Native to Umbraco and visually continuous with the backoffice.", "Compact, calm, and focused on decisions rather than exhaustive data.", diff --git a/DESIGN.md b/DESIGN.md index 626b798..37ed6d4 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -1,5 +1,5 @@ --- -name: Umbraco Vercel Analytics +name: Web Analytics description: A native editorial instrument for clear Vercel traffic insight inside Umbraco. colors: backoffice-ink: "#060606" @@ -82,13 +82,13 @@ components: padding: "6px 9px" --- -# Design System: Umbraco Vercel Analytics +# Design System: Web Analytics ## Overview **Creative North Star: "The Editorial Instrument"** -Umbraco Vercel Analytics is a precise but approachable instrument inside the editorial workspace. It should reveal the traffic signal an editor needs, then get out of the way. The visual language is friendly and conversational, but its structure is disciplined: familiar Umbraco controls, clear hierarchy, compact reporting, and feedback close to the action that caused it. +Web Analytics is a precise but approachable instrument inside the editorial workspace. It should reveal the traffic signal an editor needs, then get out of the way. The visual language is friendly and conversational, but its structure is disciplined: familiar Umbraco controls, clear hierarchy, compact reporting, and feedback close to the action that caused it. The extension belongs to the backoffice rather than merely living inside it. It inherits Umbraco UI Library semantics, Lato typography, spacing, focus treatment, and surface hierarchy. Custom analytics patterns may borrow the clarity of Vercel Analytics, but they must be translated into Umbraco's interaction language. diff --git a/PRODUCT.md b/PRODUCT.md index 0b2392a..d741252 100644 --- a/PRODUCT.md +++ b/PRODUCT.md @@ -14,7 +14,7 @@ The primary users are content editors and marketing staff working in the authent ## Product Purpose -Umbraco Vercel Analytics brings Vercel Web Analytics into the Umbraco backoffice. It helps editors understand site and page traffic where they already manage content, while administrators retain secure control of project connections and server-side credentials. +Web Analytics brings Vercel Web Analytics into the Umbraco backoffice. It helps editors understand site and page traffic where they already manage content, while administrators retain secure control of project connections and server-side credentials. Success means that an editor can open Analytics, understand the important traffic signals quickly, and return to their content work without needing to visit Vercel or a separate analytics suite. diff --git a/README.md b/README.md index 3dfd132..a408c3c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Umbraco Vercel Analytics +# Web Analytics -`Umbraco.VercelAnalytics` displays Vercel Web Analytics in the Umbraco 17 and 18 backoffice. +`TheBuilder.WebAnalytics` displays Vercel Web Analytics in the Umbraco 17 and 18 backoffice. It provides: @@ -23,7 +23,7 @@ The package reads analytics already collected by Vercel. It does not add Vercel Add the package to the Umbraco web project: ```sh -dotnet add path/to/Your.Umbraco.Web.csproj package Umbraco.VercelAnalytics +dotnet add path/to/Your.Umbraco.Web.csproj package TheBuilder.WebAnalytics ``` The package registers its services and backoffice extensions automatically. No changes to `Program.cs` are required. @@ -75,7 +75,7 @@ The shared token is used by every connection. If a project must use a different ### 3. Configure the connection in Umbraco -Sign in as an administrator and open **Settings → Vercel Analytics**. +Sign in as an administrator and open **Settings → Web Analytics**. 1. Select **Add connection**. 2. Enter the Vercel project ID. The project name is loaded from Vercel. @@ -106,7 +106,7 @@ On the first successful package startup, the Analytics section is added to the b To give other users access, add the **Analytics** section to their Umbraco user group. Global reports require Analytics-section access. Document reports additionally require Content-section access and document read permission. -Only administrators can open or update **Settings → Vercel Analytics**. +Only administrators can open or update **Settings → Web Analytics**. ## Configuration-only setup @@ -176,7 +176,7 @@ The default cache duration is five minutes. Each Umbraco instance maintains its After deployment: -1. Open **Settings → Vercel Analytics** and confirm the shared access token says **Configured on the server**. +1. Open **Settings → Web Analytics** and confirm the shared access token says **Configured on the server**. 2. Select **Save settings**, then **Test connection**. 3. Open the global **Analytics** section and confirm totals and history load. 4. If document analytics is enabled, open a mapped published document and select its **Analytics** workspace view. @@ -198,9 +198,9 @@ The available reporting window and some dimensions depend on the Vercel plan and ## Development -When the example host runs with `ASPNETCORE_ENVIRONMENT=Development`, **Settings → Vercel Analytics** includes development data presets for a full demo, UTM campaigns, feature flags, and custom events. Add and save a mock connection like any other connection, then select it in the Analytics dashboard. Mock reports are deterministic, require no access token, and never call Vercel. Persisted mock connections become inactive when the host is not running in Development. +When the example host runs with `ASPNETCORE_ENVIRONMENT=Development`, **Settings → Web Analytics** includes development data presets for a full demo, UTM campaigns, feature flags, and custom events. Add and save a mock connection like any other connection, then select it in the Analytics dashboard. Mock reports are deterministic, require no access token, and never call Vercel. Persisted mock connections become inactive when the host is not running in Development. -The client uses pnpm 11. From `src/Umbraco.VercelAnalytics/Client`: +The client uses pnpm 11. From `src/TheBuilder.WebAnalytics/Client`: ```sh pnpm install @@ -216,12 +216,12 @@ Run the example host against the Umbraco version whose document you want to use: ```sh # Umbraco 17 dotnet run \ - --project samples/Umbraco.VercelAnalytics.Example \ + --project samples/TheBuilder.WebAnalytics.Example \ -p:UmbracoVersion=17.1.0 # Umbraco 18 dotnet run \ - --project samples/Umbraco.VercelAnalytics.Example \ + --project samples/TheBuilder.WebAnalytics.Example \ -p:UmbracoVersion=18.0.0 ``` @@ -230,13 +230,13 @@ Use a separate database for each major when switching the example host between v Then regenerate the client from the matching development endpoint: ```sh -cd src/Umbraco.VercelAnalytics/Client +cd src/TheBuilder.WebAnalytics/Client # Umbraco 17 corepack pnpm generate-client -- \ - https://localhost:44389/umbraco/swagger/umbracovercelanalytics/swagger.json + https://localhost:44389/umbraco/swagger/thebuilderwebanalytics/swagger.json # Umbraco 18 corepack pnpm generate-client -- \ - https://localhost:44389/umbraco/openapi/umbracovercelanalytics.json + https://localhost:44389/umbraco/openapi/thebuilderwebanalytics.json ``` diff --git a/TheBuilder.WebAnalytics.slnx b/TheBuilder.WebAnalytics.slnx new file mode 100644 index 0000000..ea531ca --- /dev/null +++ b/TheBuilder.WebAnalytics.slnx @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Umbraco.VercelAnalytics.slnx b/Umbraco.VercelAnalytics.slnx deleted file mode 100644 index 0d6c13f..0000000 --- a/Umbraco.VercelAnalytics.slnx +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..072f5d7 Binary files /dev/null and b/icon.png differ diff --git a/samples/Umbraco.VercelAnalytics.Example/.gitignore b/samples/TheBuilder.WebAnalytics.Example/.gitignore similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/.gitignore rename to samples/TheBuilder.WebAnalytics.Example/.gitignore diff --git a/samples/Umbraco.VercelAnalytics.Example/Program.cs b/samples/TheBuilder.WebAnalytics.Example/Program.cs similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Program.cs rename to samples/TheBuilder.WebAnalytics.Example/Program.cs diff --git a/samples/Umbraco.VercelAnalytics.Example/Properties/launchSettings.json b/samples/TheBuilder.WebAnalytics.Example/Properties/launchSettings.json similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Properties/launchSettings.json rename to samples/TheBuilder.WebAnalytics.Example/Properties/launchSettings.json diff --git a/samples/Umbraco.VercelAnalytics.Example/Umbraco.VercelAnalytics.Example.csproj b/samples/TheBuilder.WebAnalytics.Example/TheBuilder.WebAnalytics.Example.csproj similarity index 93% rename from samples/Umbraco.VercelAnalytics.Example/Umbraco.VercelAnalytics.Example.csproj rename to samples/TheBuilder.WebAnalytics.Example/TheBuilder.WebAnalytics.Example.csproj index c112aab..012a9c4 100644 --- a/samples/Umbraco.VercelAnalytics.Example/Umbraco.VercelAnalytics.Example.csproj +++ b/samples/TheBuilder.WebAnalytics.Example/TheBuilder.WebAnalytics.Example.csproj @@ -2,7 +2,7 @@ net10.0 enable - enable + enable false 17.1.0 $(DefineConstants);UMBRACO_18_OR_LATER @@ -20,7 +20,7 @@ - + diff --git a/samples/Umbraco.VercelAnalytics.Example/VercelAnalyticsOpenApiComposer.cs b/samples/TheBuilder.WebAnalytics.Example/VercelAnalyticsOpenApiComposer.cs similarity index 89% rename from samples/Umbraco.VercelAnalytics.Example/VercelAnalyticsOpenApiComposer.cs rename to samples/TheBuilder.WebAnalytics.Example/VercelAnalyticsOpenApiComposer.cs index c08b38c..0259a45 100644 --- a/samples/Umbraco.VercelAnalytics.Example/VercelAnalyticsOpenApiComposer.cs +++ b/samples/TheBuilder.WebAnalytics.Example/VercelAnalyticsOpenApiComposer.cs @@ -14,9 +14,9 @@ #endif using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.DependencyInjection; -using Umbraco.VercelAnalytics; +using TheBuilder.WebAnalytics; -namespace Umbraco.VercelAnalytics.Example; +namespace TheBuilder.WebAnalytics.Example; public sealed class VercelAnalyticsOpenApiComposer : IComposer { @@ -26,14 +26,14 @@ public void Compose(IUmbracoBuilder builder) builder.AddBackOfficeOpenApiDocument( Constants.ApiName, document => document - .WithTitle("Umbraco Vercel Analytics Backoffice API") + .WithTitle("Web Analytics Backoffice API") .WithBackOfficeAuthentication() .ConfigureOpenApiOptions(options => options.AddOperationTransformer( (operation, context, _) => { if (context.Description.ActionDescriptor is ControllerActionDescriptor controller && controller.ControllerTypeInfo.Namespace?.StartsWith( - "Umbraco.VercelAnalytics.Controllers", + "TheBuilder.WebAnalytics.Controllers", StringComparison.InvariantCultureIgnoreCase) is true) { operation.OperationId = context.Description.ActionDescriptor.RouteValues["action"]; @@ -49,7 +49,7 @@ public void Compose(IUmbracoBuilder builder) Constants.ApiName, new OpenApiInfo { - Title = "Umbraco Vercel Analytics Backoffice API", + Title = "Web Analytics Backoffice API", Version = "1.0", }); options.OperationFilter(); @@ -70,7 +70,7 @@ protected override bool CanHandle( ApiDescription apiDescription, ControllerActionDescriptor controllerActionDescriptor) => controllerActionDescriptor.ControllerTypeInfo.Namespace?.StartsWith( - "Umbraco.VercelAnalytics.Controllers", + "TheBuilder.WebAnalytics.Controllers", StringComparison.InvariantCultureIgnoreCase) is true; public override string Handle(ApiDescription apiDescription) diff --git a/samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/area.cshtml b/samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/area.cshtml similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/area.cshtml rename to samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/area.cshtml diff --git a/samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/areas.cshtml b/samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/areas.cshtml similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/areas.cshtml rename to samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/areas.cshtml diff --git a/samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/default.cshtml b/samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/default.cshtml similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/default.cshtml rename to samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/default.cshtml diff --git a/samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/items.cshtml b/samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/items.cshtml similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Views/Partials/blockgrid/items.cshtml rename to samples/TheBuilder.WebAnalytics.Example/Views/Partials/blockgrid/items.cshtml diff --git a/samples/Umbraco.VercelAnalytics.Example/Views/Partials/blocklist/default.cshtml b/samples/TheBuilder.WebAnalytics.Example/Views/Partials/blocklist/default.cshtml similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Views/Partials/blocklist/default.cshtml rename to samples/TheBuilder.WebAnalytics.Example/Views/Partials/blocklist/default.cshtml diff --git a/samples/Umbraco.VercelAnalytics.Example/Views/Partials/singleblock/default.cshtml b/samples/TheBuilder.WebAnalytics.Example/Views/Partials/singleblock/default.cshtml similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Views/Partials/singleblock/default.cshtml rename to samples/TheBuilder.WebAnalytics.Example/Views/Partials/singleblock/default.cshtml diff --git a/samples/Umbraco.VercelAnalytics.Example/Views/_ViewImports.cshtml b/samples/TheBuilder.WebAnalytics.Example/Views/_ViewImports.cshtml similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/Views/_ViewImports.cshtml rename to samples/TheBuilder.WebAnalytics.Example/Views/_ViewImports.cshtml diff --git a/samples/Umbraco.VercelAnalytics.Example/appsettings.Development.json b/samples/TheBuilder.WebAnalytics.Example/appsettings.Development.json similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/appsettings.Development.json rename to samples/TheBuilder.WebAnalytics.Example/appsettings.Development.json diff --git a/samples/Umbraco.VercelAnalytics.Example/appsettings.json b/samples/TheBuilder.WebAnalytics.Example/appsettings.json similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/appsettings.json rename to samples/TheBuilder.WebAnalytics.Example/appsettings.json diff --git a/samples/Umbraco.VercelAnalytics.Example/wwwroot/favicon.ico b/samples/TheBuilder.WebAnalytics.Example/wwwroot/favicon.ico similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/wwwroot/favicon.ico rename to samples/TheBuilder.WebAnalytics.Example/wwwroot/favicon.ico diff --git a/samples/Umbraco.VercelAnalytics.Example/wwwroot/media/.gitkeep b/samples/TheBuilder.WebAnalytics.Example/wwwroot/media/.gitkeep similarity index 100% rename from samples/Umbraco.VercelAnalytics.Example/wwwroot/media/.gitkeep rename to samples/TheBuilder.WebAnalytics.Example/wwwroot/media/.gitkeep diff --git a/src/Umbraco.VercelAnalytics/Client/.vscode/extensions.json b/src/TheBuilder.WebAnalytics/Client/.vscode/extensions.json similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/.vscode/extensions.json rename to src/TheBuilder.WebAnalytics/Client/.vscode/extensions.json diff --git a/src/Umbraco.VercelAnalytics/Client/package.json b/src/TheBuilder.WebAnalytics/Client/package.json similarity index 93% rename from src/Umbraco.VercelAnalytics/Client/package.json rename to src/TheBuilder.WebAnalytics/Client/package.json index f8e450a..b08cca0 100644 --- a/src/Umbraco.VercelAnalytics/Client/package.json +++ b/src/TheBuilder.WebAnalytics/Client/package.json @@ -1,5 +1,5 @@ { - "name": "umbraco-vercel-analytics", + "name": "thebuilder-web-analytics", "private": true, "version": "0.1.0", "type": "module", diff --git a/src/Umbraco.VercelAnalytics/Client/pnpm-lock.yaml b/src/TheBuilder.WebAnalytics/Client/pnpm-lock.yaml similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/pnpm-lock.yaml rename to src/TheBuilder.WebAnalytics/Client/pnpm-lock.yaml diff --git a/src/TheBuilder.WebAnalytics/Client/pnpm-workspace.yaml b/src/TheBuilder.WebAnalytics/Client/pnpm-workspace.yaml new file mode 100644 index 0000000..5ed0b5a --- /dev/null +++ b/src/TheBuilder.WebAnalytics/Client/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +allowBuilds: + esbuild: true diff --git a/src/TheBuilder.WebAnalytics/Client/public/umbraco-package.json b/src/TheBuilder.WebAnalytics/Client/public/umbraco-package.json new file mode 100644 index 0000000..afd1af9 --- /dev/null +++ b/src/TheBuilder.WebAnalytics/Client/public/umbraco-package.json @@ -0,0 +1,14 @@ +{ + "id": "TheBuilder.WebAnalytics", + "name": "Web Analytics", + "version": "0.1.0", + "allowTelemetry": false, + "extensions": [ + { + "name": "Web Analytics Bundle", + "alias": "TheBuilder.WebAnalytics.Bundle", + "type": "bundle", + "js": "/App_Plugins/TheBuilder.WebAnalytics/web-analytics.js" + } + ] +} diff --git a/src/Umbraco.VercelAnalytics/Client/scripts/generate-openapi.js b/src/TheBuilder.WebAnalytics/Client/scripts/generate-openapi.js similarity index 90% rename from src/Umbraco.VercelAnalytics/Client/scripts/generate-openapi.js rename to src/TheBuilder.WebAnalytics/Client/scripts/generate-openapi.js index 73d6cd0..64f63cc 100644 --- a/src/Umbraco.VercelAnalytics/Client/scripts/generate-openapi.js +++ b/src/TheBuilder.WebAnalytics/Client/scripts/generate-openapi.js @@ -9,8 +9,8 @@ const swaggerUrl = process.argv.slice(2).find((argument) => argument !== '--'); if (swaggerUrl === undefined) { console.error(chalk.red(`ERROR: Missing URL to OpenAPI spec`)); console.error(`Please provide the URL to the OpenAPI spec as the first argument found in ${chalk.yellow('package.json')}`); - console.error(`Umbraco 17 example: node generate-openapi.js ${chalk.yellow('https://localhost:44389/umbraco/swagger/umbracovercelanalytics/swagger.json')}`); - console.error(`Umbraco 18 example: node generate-openapi.js ${chalk.yellow('https://localhost:44389/umbraco/openapi/umbracovercelanalytics.json')}`); + console.error(`Umbraco 17 example: node generate-openapi.js ${chalk.yellow('https://localhost:44389/umbraco/swagger/thebuilderwebanalytics/swagger.json')}`); + console.error(`Umbraco 18 example: node generate-openapi.js ${chalk.yellow('https://localhost:44389/umbraco/openapi/thebuilderwebanalytics.json')}`); process.exit(); } diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-breakdown-grid.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-breakdown-grid.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-breakdown-grid.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-breakdown-grid.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-components.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-components.test.ts similarity index 99% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-components.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-components.test.ts index ed3cb0b..29ac0e9 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-components.test.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-components.test.ts @@ -11,7 +11,7 @@ const sdk = vi.hoisted(() => ({ eventDetails: vi.fn(), eventPropertyValues: vi.fn(), })); -vi.mock("../api/sdk.gen.js", () => ({ UmbracoVercelAnalyticsService: sdk })); +vi.mock("../api/sdk.gen.js", () => ({ WebAnalyticsService: sdk })); vi.mock("@umbraco-cms/backoffice/element-api", () => ({ UmbElementMixin: (base: T) => class extends base { readonly localize = { diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard-header.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard-header.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard-header.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard-header.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.controller.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.controller.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.controller.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.controller.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.controller.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.controller.ts similarity index 99% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.controller.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.controller.ts index 966d732..8c877a1 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.controller.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.controller.ts @@ -79,8 +79,8 @@ export type DashboardEnvironment = { const defaultEnvironment = (): DashboardEnvironment => ({ currentUrl: () => new URL(window.location.href), replaceUrl: (url) => window.history.replaceState(window.history.state, "", url), - getStoredConnection: () => localStorage.getItem("umbraco-vercel-analytics:connection"), - setStoredConnection: (connection) => localStorage.setItem("umbraco-vercel-analytics:connection", connection), + getStoredConnection: () => localStorage.getItem("thebuilder-web-analytics:connection"), + setStoredConnection: (connection) => localStorage.setItem("thebuilder-web-analytics:connection", connection), languages: navigator.languages, }); diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.styles.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.styles.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-dashboard.styles.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-dashboard.styles.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-summary.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-summary.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/analytics-summary.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/analytics-summary.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/async-state.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/async-state.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/async-state.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/async-state.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-dialog.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-dialog.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-dialog.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-dialog.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-rows.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-rows.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-rows.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-rows.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-rows.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-rows.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-rows.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-rows.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-table.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-table.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/breakdown-table.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/breakdown-table.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/chart-value.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/chart-value.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/chart-value.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/chart-value.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/chart-value.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/chart-value.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/chart-value.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/chart-value.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/country-display.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/country-display.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/country-display.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/country-display.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/country-display.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/country-display.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/country-display.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/country-display.ts diff --git a/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-api.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-api.ts new file mode 100644 index 0000000..b9cb164 --- /dev/null +++ b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-api.ts @@ -0,0 +1,37 @@ +import { WebAnalyticsService } from "../api/sdk.gen.js"; +import type { + AnalyticsBreakdown, + AnalyticsConnectionsResponse, + AnalyticsDocumentRoute, + AnalyticsEventDetails, + AnalyticsEventProperty, + AnalyticsEventsReport, + AnalyticsFlagsReport, + AnalyticsSummary, + FlagsData, +} from "../api/types.gen.js"; + +type ApiResponse = Promise<{ data?: T; error?: unknown; response: Response }>; +type FlagsOptions = { query?: FlagsData["query"]; signal?: AbortSignal }; + +export type DashboardApi = { + connections: (options?: Parameters>[0]) => ApiResponse; + documentRoutes: (options: Parameters>[0]) => ApiResponse; + summary: (options?: Parameters>[0]) => ApiResponse; + events: (options?: Parameters>[0]) => ApiResponse; + flags: (options?: FlagsOptions) => ApiResponse; + breakdown: (options: Parameters>[0]) => ApiResponse; + eventDetails: (options?: Parameters>[0]) => ApiResponse; + eventPropertyValues: (options?: Parameters>[0]) => ApiResponse; +}; + +export const dashboardApi: DashboardApi = { + connections: (options) => WebAnalyticsService.connections(options), + documentRoutes: (options) => WebAnalyticsService.documentRoutes(options), + summary: (options) => WebAnalyticsService.summary(options), + events: (options) => WebAnalyticsService.events(options), + flags: (options) => WebAnalyticsService.flags(options), + breakdown: (options) => WebAnalyticsService.breakdown(options), + eventDetails: (options) => WebAnalyticsService.eventDetails(options), + eventPropertyValues: (options) => WebAnalyticsService.eventPropertyValues(options), +}; diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-cards.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-cards.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-cards.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-cards.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-cards.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-cards.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-cards.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-cards.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-report-loader.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-report-loader.test.ts similarity index 98% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-report-loader.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-report-loader.test.ts index 2bd4103..bffafb8 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-report-loader.test.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-report-loader.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; const sdk = vi.hoisted(() => ({ summary: vi.fn(), events: vi.fn(), flags: vi.fn(), breakdown: vi.fn() })); -vi.mock("../api/sdk.gen.js", () => ({ UmbracoVercelAnalyticsService: sdk })); +vi.mock("../api/sdk.gen.js", () => ({ WebAnalyticsService: sdk })); import { loadDashboardReports, type DashboardReportQuery, type DashboardReportUpdate } from "./dashboard-report-loader.js"; diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-report-loader.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-report-loader.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-report-loader.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-report-loader.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-url-state.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-url-state.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-url-state.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-url-state.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-url-state.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-url-state.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-url-state.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/dashboard-url-state.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/date-range-picker.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/date-range-picker.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/date-range-picker.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/date-range-picker.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/date-range.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/date-range.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/date-range.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/date-range.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/date-range.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/date-range.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/date-range.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/date-range.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/document-route.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/document-route.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/document-route.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/document-route.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/document-route.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/document-route.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/document-route.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/document-route.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/event-details-dialog.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/event-details-dialog.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/event-details-dialog.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/event-details-dialog.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/event-dialog.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/event-dialog.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/event-dialog.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/event-dialog.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/event-rows.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/event-rows.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/event-rows.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/event-rows.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/event-rows.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/event-rows.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/event-rows.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/event-rows.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/event-table.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/event-table.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/event-table.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/event-table.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/flag-card.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/flag-card.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/flag-card.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/flag-card.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/history-chart.element.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/history-chart.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/history-chart.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/history-chart.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/metric-comparison.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/metric-comparison.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/metric-comparison.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/metric-comparison.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/metric-comparison.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/metric-comparison.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/metric-comparison.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/metric-comparison.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/report-error.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/report-error.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/report-error.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/report-error.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/report-error.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/report-error.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/report-error.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/report-error.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/request-coordinator.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/request-coordinator.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/request-coordinator.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/request-coordinator.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/request-coordinator.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/request-coordinator.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/request-coordinator.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/request-coordinator.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/utm-capability.test.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/utm-capability.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/utm-capability.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/utm-capability.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/utm-capability.ts b/src/TheBuilder.WebAnalytics/Client/src/analytics/utm-capability.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/analytics/utm-capability.ts rename to src/TheBuilder.WebAnalytics/Client/src/analytics/utm-capability.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/client.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/client.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/client.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/client.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/client/client.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/client/client.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/client/client.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/client/client.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/client/index.ts b/src/TheBuilder.WebAnalytics/Client/src/api/client/index.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/client/index.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/client/index.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/client/types.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/client/types.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/client/types.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/client/types.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/client/utils.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/client/utils.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/client/utils.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/client/utils.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/auth.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/auth.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/auth.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/auth.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/bodySerializer.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/bodySerializer.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/bodySerializer.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/bodySerializer.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/params.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/params.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/params.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/params.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/pathSerializer.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/pathSerializer.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/pathSerializer.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/pathSerializer.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/queryKeySerializer.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/queryKeySerializer.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/queryKeySerializer.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/queryKeySerializer.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/serverSentEvents.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/serverSentEvents.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/serverSentEvents.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/serverSentEvents.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/types.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/types.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/types.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/types.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/core/utils.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/core/utils.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/core/utils.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/core/utils.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/index.ts b/src/TheBuilder.WebAnalytics/Client/src/api/index.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/index.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/index.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/sdk.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/sdk.gen.ts similarity index 99% rename from src/Umbraco.VercelAnalytics/Client/src/api/sdk.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/sdk.gen.ts index 64c5ac8..c63e797 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/api/sdk.gen.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/api/sdk.gen.ts @@ -18,7 +18,7 @@ export type Options; }; -export class UmbracoVercelAnalyticsService { +export class WebAnalyticsService { public static connections(options?: Options) { return (options?.client ?? client).get({ security: [ diff --git a/src/Umbraco.VercelAnalytics/Client/src/api/types.gen.ts b/src/TheBuilder.WebAnalytics/Client/src/api/types.gen.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/api/types.gen.ts rename to src/TheBuilder.WebAnalytics/Client/src/api/types.gen.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/bundle.manifests.ts b/src/TheBuilder.WebAnalytics/Client/src/bundle.manifests.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/bundle.manifests.ts rename to src/TheBuilder.WebAnalytics/Client/src/bundle.manifests.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/entrypoints/entrypoint.ts b/src/TheBuilder.WebAnalytics/Client/src/entrypoints/entrypoint.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/entrypoints/entrypoint.ts rename to src/TheBuilder.WebAnalytics/Client/src/entrypoints/entrypoint.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/entrypoints/manifest.ts b/src/TheBuilder.WebAnalytics/Client/src/entrypoints/manifest.ts similarity index 57% rename from src/Umbraco.VercelAnalytics/Client/src/entrypoints/manifest.ts rename to src/TheBuilder.WebAnalytics/Client/src/entrypoints/manifest.ts index 09639d2..631aa12 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/entrypoints/manifest.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/entrypoints/manifest.ts @@ -1,7 +1,7 @@ export const manifests: Array = [ { - name: "Umbraco Vercel Analytics Entrypoint", - alias: "Umbraco.VercelAnalytics.Entrypoint", + name: "Web Analytics Entrypoint", + alias: "TheBuilder.WebAnalytics.Entrypoint", type: "backofficeEntryPoint", js: () => import("./entrypoint.js"), }, diff --git a/src/Umbraco.VercelAnalytics/Client/src/manifests.test.ts b/src/TheBuilder.WebAnalytics/Client/src/manifests.test.ts similarity index 61% rename from src/Umbraco.VercelAnalytics/Client/src/manifests.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/manifests.test.ts index c12a72c..e5e6680 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/manifests.test.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/manifests.test.ts @@ -1,14 +1,14 @@ import { describe, expect, it } from "vitest"; import { manifests } from "./manifests.js"; -describe("Vercel Analytics manifests", () => { +describe("Web Analytics manifests", () => { it("only exposes the Analytics section when the package is enabled", () => { - const section = manifests.find((manifest) => manifest.alias === "Umbraco.VercelAnalytics.Section") as + const section = manifests.find((manifest) => manifest.alias === "TheBuilder.WebAnalytics.Section") as | { conditions?: Array<{ alias: string }> } | undefined; - const condition = manifests.find((manifest) => manifest.alias === "Umbraco.VercelAnalytics.Condition.AnalyticsEnabled"); + const condition = manifests.find((manifest) => manifest.alias === "TheBuilder.WebAnalytics.Condition.AnalyticsEnabled"); expect(condition?.type).toBe("condition"); - expect(section?.conditions).toContainEqual({ alias: "Umbraco.VercelAnalytics.Condition.AnalyticsEnabled" }); + expect(section?.conditions).toContainEqual({ alias: "TheBuilder.WebAnalytics.Condition.AnalyticsEnabled" }); }); }); diff --git a/src/Umbraco.VercelAnalytics/Client/src/manifests.ts b/src/TheBuilder.WebAnalytics/Client/src/manifests.ts similarity index 60% rename from src/Umbraco.VercelAnalytics/Client/src/manifests.ts rename to src/TheBuilder.WebAnalytics/Client/src/manifests.ts index 064c01b..e24a8e1 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/manifests.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/manifests.ts @@ -1,32 +1,32 @@ export const manifests: Array = [ { type: "condition", - alias: "Umbraco.VercelAnalytics.Condition.AnalyticsEnabled", - name: "Vercel Analytics Enabled Condition", + alias: "TheBuilder.WebAnalytics.Condition.AnalyticsEnabled", + name: "Web Analytics Enabled Condition", api: () => import("./section/analytics-enabled.condition.js"), }, { type: "section", - alias: "Umbraco.VercelAnalytics.Section", - name: "Vercel Analytics Section", + alias: "TheBuilder.WebAnalytics.Section", + name: "Web Analytics Section", meta: { label: "Analytics", pathname: "analytics" }, - conditions: [{ alias: "Umbraco.VercelAnalytics.Condition.AnalyticsEnabled" }], + conditions: [{ alias: "TheBuilder.WebAnalytics.Condition.AnalyticsEnabled" }], }, { type: "sectionView", - alias: "Umbraco.VercelAnalytics.SectionView", - name: "Vercel Analytics Section View", + alias: "TheBuilder.WebAnalytics.SectionView", + name: "Web Analytics Section View", js: () => import("./section/analytics-section.element.js"), meta: { label: "Analytics", pathname: "overview", icon: "icon-chart-curve" }, - conditions: [{ alias: "Umb.Condition.SectionAlias", match: "Umbraco.VercelAnalytics.Section" }], + conditions: [{ alias: "Umb.Condition.SectionAlias", match: "TheBuilder.WebAnalytics.Section" }], }, { type: "dashboard", - alias: "Umbraco.VercelAnalytics.SettingsDashboard", - name: "Vercel Analytics Settings Dashboard", + alias: "TheBuilder.WebAnalytics.SettingsDashboard", + name: "Web Analytics Settings Dashboard", js: () => import("./settings/settings-dashboard.element.js"), weight: 25, - meta: { label: "Vercel Analytics", pathname: "vercel-analytics" }, + meta: { label: "Web Analytics", pathname: "vercel-analytics" }, conditions: [ { alias: "Umb.Condition.SectionAlias", match: "Umb.Section.Settings" }, { alias: "Umb.Condition.CurrentUser.IsAdmin" }, @@ -34,19 +34,19 @@ export const manifests: Array = [ }, { type: "condition", - alias: "Umbraco.VercelAnalytics.Condition.DocumentAnalytics", + alias: "TheBuilder.WebAnalytics.Condition.DocumentAnalytics", name: "Document Analytics Availability Condition", api: () => import("./workspace/document-analytics.condition.js"), }, { type: "workspaceView", - alias: "Umbraco.VercelAnalytics.DocumentWorkspaceView", - name: "Vercel Analytics Document Workspace View", + alias: "TheBuilder.WebAnalytics.DocumentWorkspaceView", + name: "Web Analytics Document Workspace View", js: () => import("./workspace/analytics-workspace.element.js"), meta: { label: "Analytics", pathname: "analytics", icon: "icon-chart-curve" }, conditions: [ { alias: "Umb.Condition.WorkspaceAlias", match: "Umb.Workspace.Document" }, - { alias: "Umbraco.VercelAnalytics.Condition.DocumentAnalytics" }, + { alias: "TheBuilder.WebAnalytics.Condition.DocumentAnalytics" }, ], }, ]; diff --git a/src/Umbraco.VercelAnalytics/Client/src/section/analytics-availability.ts b/src/TheBuilder.WebAnalytics/Client/src/section/analytics-availability.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/section/analytics-availability.ts rename to src/TheBuilder.WebAnalytics/Client/src/section/analytics-availability.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/section/analytics-enabled.condition.test.ts b/src/TheBuilder.WebAnalytics/Client/src/section/analytics-enabled.condition.test.ts similarity index 90% rename from src/Umbraco.VercelAnalytics/Client/src/section/analytics-enabled.condition.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/section/analytics-enabled.condition.test.ts index 298f450..3759875 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/section/analytics-enabled.condition.test.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/section/analytics-enabled.condition.test.ts @@ -3,7 +3,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; const sdk = vi.hoisted(() => ({ connections: vi.fn() })); -vi.mock("../api/sdk.gen.js", () => ({ UmbracoVercelAnalyticsService: sdk })); +vi.mock("../api/sdk.gen.js", () => ({ WebAnalyticsService: sdk })); vi.mock("@umbraco-cms/backoffice/extension-registry", () => ({ UmbConditionBase: class { #permitted = false; @@ -39,7 +39,7 @@ describe("AnalyticsEnabledCondition", () => { it("permits the section only when saved settings are enabled", async () => { sdk.connections.mockResolvedValue({ data: { enabled: true }, error: undefined }); condition = new AnalyticsEnabledCondition({} as never, { - config: { alias: "Umbraco.VercelAnalytics.Condition.AnalyticsEnabled" }, + config: { alias: "TheBuilder.WebAnalytics.Condition.AnalyticsEnabled" }, onChange: vi.fn(), }); @@ -52,7 +52,7 @@ describe("AnalyticsEnabledCondition", () => { it("fails closed when availability cannot be loaded", async () => { sdk.connections.mockResolvedValue({ data: undefined, error: { status: 403 } }); condition = new AnalyticsEnabledCondition({} as never, { - config: { alias: "Umbraco.VercelAnalytics.Condition.AnalyticsEnabled" }, + config: { alias: "TheBuilder.WebAnalytics.Condition.AnalyticsEnabled" }, onChange: vi.fn(), }); diff --git a/src/Umbraco.VercelAnalytics/Client/src/section/analytics-enabled.condition.ts b/src/TheBuilder.WebAnalytics/Client/src/section/analytics-enabled.condition.ts similarity index 90% rename from src/Umbraco.VercelAnalytics/Client/src/section/analytics-enabled.condition.ts rename to src/TheBuilder.WebAnalytics/Client/src/section/analytics-enabled.condition.ts index 0c60594..abd2ae3 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/section/analytics-enabled.condition.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/section/analytics-enabled.condition.ts @@ -1,6 +1,6 @@ import { UmbConditionBase } from "@umbraco-cms/backoffice/extension-registry"; import type { UmbConditionConfigBase, UmbExtensionCondition } from "@umbraco-cms/backoffice/extension-api"; -import { UmbracoVercelAnalyticsService } from "../api/sdk.gen.js"; +import { WebAnalyticsService } from "../api/sdk.gen.js"; import { ANALYTICS_AVAILABILITY_CHANGED_EVENT, type AnalyticsAvailabilityChangedDetail, @@ -26,7 +26,7 @@ export class AnalyticsEnabledCondition extends UmbConditionBase { const request = ++this.#request; - const { data, error } = await UmbracoVercelAnalyticsService.connections(); + const { data, error } = await WebAnalyticsService.connections(); if (request === this.#request) this.permitted = !error && data?.enabled === true; } diff --git a/src/Umbraco.VercelAnalytics/Client/src/section/analytics-section.element.ts b/src/TheBuilder.WebAnalytics/Client/src/section/analytics-section.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/section/analytics-section.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/section/analytics-section.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/settings/connection-editor.element.ts b/src/TheBuilder.WebAnalytics/Client/src/settings/connection-editor.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/settings/connection-editor.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/settings/connection-editor.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/settings/mock-scenarios.ts b/src/TheBuilder.WebAnalytics/Client/src/settings/mock-scenarios.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/settings/mock-scenarios.ts rename to src/TheBuilder.WebAnalytics/Client/src/settings/mock-scenarios.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/settings/settings-dashboard.element.ts b/src/TheBuilder.WebAnalytics/Client/src/settings/settings-dashboard.element.ts similarity index 96% rename from src/Umbraco.VercelAnalytics/Client/src/settings/settings-dashboard.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/settings/settings-dashboard.element.ts index 81d9d11..6c89fd8 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/settings/settings-dashboard.element.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/settings/settings-dashboard.element.ts @@ -8,7 +8,7 @@ import { import { UmbElementMixin } from "@umbraco-cms/backoffice/element-api"; import { UmbTextStyles } from "@umbraco-cms/backoffice/style"; import type { UUIInputElement, UUIToggleElement } from "@umbraco-cms/backoffice/external/uui"; -import { UmbracoVercelAnalyticsService } from "../api/sdk.gen.js"; +import { WebAnalyticsService } from "../api/sdk.gen.js"; import type { AnalyticsConnectionSettingsResponse, AnalyticsSettingsResponse, @@ -43,7 +43,7 @@ export class VercelAnalyticsSettingsDashboardElement extends UmbElementMixin(Lit async #load(): Promise { this._loading = true; - const { data, error } = await UmbracoVercelAnalyticsService.settings(); + const { data, error } = await WebAnalyticsService.settings(); this._loading = false; if (error || !data) { this._status = { type: "error", message: "Analytics settings could not be loaded. Administrator access is required." }; @@ -126,7 +126,7 @@ export class VercelAnalyticsSettingsDashboardElement extends UmbElementMixin(Lit } this._testingKey = key; this._connectionStatuses = { ...this._connectionStatuses, [key]: { type: "info", message: "Testing the saved connection…" } }; - const { data, error } = await UmbracoVercelAnalyticsService.testConnection({ path: { key } }); + const { data, error } = await WebAnalyticsService.testConnection({ path: { key } }); this._testingKey = undefined; this._connectionStatuses = { ...this._connectionStatuses, @@ -138,7 +138,7 @@ export class VercelAnalyticsSettingsDashboardElement extends UmbElementMixin(Lit async #save(event?: Event): Promise { event?.preventDefault(); - await this.#persistSettings("Vercel Analytics settings saved."); + await this.#persistSettings("Web Analytics settings saved."); } async #persistSettings(successMessage?: string): Promise { @@ -155,7 +155,7 @@ export class VercelAnalyticsSettingsDashboardElement extends UmbElementMixin(Lit this._saving = true; this._status = undefined; const body: UpdateAnalyticsSettingsRequest = createSettingsUpdate(this._settings); - const { data, error } = await UmbracoVercelAnalyticsService.saveSettings({ body }); + const { data, error } = await WebAnalyticsService.saveSettings({ body }); this._saving = false; if (error || !data) { this._status = { type: "error", message: "Settings were not saved. Check the connection fields and mapping values." }; @@ -188,13 +188,13 @@ export class VercelAnalyticsSettingsDashboardElement extends UmbElementMixin(Lit return html`
-

Vercel Analytics

Connect Vercel projects and choose where page analytics appears.

+

Web Analytics

Connect Vercel projects and choose where page analytics appears.

${this._dirty ? html` -
+
Unsaved changes - Save settings + Save settings
` : ""} @@ -205,10 +205,10 @@ export class VercelAnalyticsSettingsDashboardElement extends UmbElementMixin(Lit Package status this.#patch({ enabled: (event.target as UUIToggleElement).checked })}> - Enable Vercel Analytics + Enable Web Analytics diff --git a/src/Umbraco.VercelAnalytics/Client/src/settings/settings-dashboard.test.ts b/src/TheBuilder.WebAnalytics/Client/src/settings/settings-dashboard.test.ts similarity index 98% rename from src/Umbraco.VercelAnalytics/Client/src/settings/settings-dashboard.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/settings/settings-dashboard.test.ts index e228481..6f353a2 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/settings/settings-dashboard.test.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/settings/settings-dashboard.test.ts @@ -7,7 +7,7 @@ const sdk = vi.hoisted(() => ({ testConnection: vi.fn(), })); -vi.mock("../api/sdk.gen.js", () => ({ UmbracoVercelAnalyticsService: sdk })); +vi.mock("../api/sdk.gen.js", () => ({ WebAnalyticsService: sdk })); vi.mock("@umbraco-cms/backoffice/element-api", () => ({ UmbElementMixin: (base: T) => base, })); @@ -58,7 +58,7 @@ describe("analytics settings onboarding", () => { .toBe(`VercelAnalytics__ConnectionAccessTokens__${generatedKey}`); expect(dashboard.shadowRoot?.querySelector(".unsaved-indicator")?.textContent?.trim()).toBe("Unsaved changes"); expect(dashboard.shadowRoot?.querySelector(".save-bar")).not.toBeNull(); - expect(dashboard.shadowRoot?.querySelectorAll('[label="Save Vercel Analytics settings"]')).toHaveLength(1); + expect(dashboard.shadowRoot?.querySelectorAll('[label="Save Web Analytics settings"]')).toHaveLength(1); expect(Array.from(editor?.shadowRoot?.querySelectorAll(".essentials uui-input") ?? []).map((input) => input.getAttribute("name"))).toEqual([ "projectId", "teamReference", diff --git a/src/Umbraco.VercelAnalytics/Client/src/settings/settings-model.test.ts b/src/TheBuilder.WebAnalytics/Client/src/settings/settings-model.test.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/settings/settings-model.test.ts rename to src/TheBuilder.WebAnalytics/Client/src/settings/settings-model.test.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/settings/settings-model.ts b/src/TheBuilder.WebAnalytics/Client/src/settings/settings-model.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/settings/settings-model.ts rename to src/TheBuilder.WebAnalytics/Client/src/settings/settings-model.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/workspace/analytics-workspace.element.ts b/src/TheBuilder.WebAnalytics/Client/src/workspace/analytics-workspace.element.ts similarity index 100% rename from src/Umbraco.VercelAnalytics/Client/src/workspace/analytics-workspace.element.ts rename to src/TheBuilder.WebAnalytics/Client/src/workspace/analytics-workspace.element.ts diff --git a/src/Umbraco.VercelAnalytics/Client/src/workspace/document-analytics.condition.ts b/src/TheBuilder.WebAnalytics/Client/src/workspace/document-analytics.condition.ts similarity index 88% rename from src/Umbraco.VercelAnalytics/Client/src/workspace/document-analytics.condition.ts rename to src/TheBuilder.WebAnalytics/Client/src/workspace/document-analytics.condition.ts index 5238f63..588f117 100644 --- a/src/Umbraco.VercelAnalytics/Client/src/workspace/document-analytics.condition.ts +++ b/src/TheBuilder.WebAnalytics/Client/src/workspace/document-analytics.condition.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from "@umbraco-cms/backoffice/document"; import { UmbConditionBase } from "@umbraco-cms/backoffice/extension-registry"; import type { UmbConditionConfigBase, UmbExtensionCondition } from "@umbraco-cms/backoffice/extension-api"; -import { UmbracoVercelAnalyticsService } from "../api/sdk.gen.js"; +import { WebAnalyticsService } from "../api/sdk.gen.js"; export class DocumentAnalyticsCondition extends UmbConditionBase implements UmbExtensionCondition { #request = 0; @@ -22,7 +22,7 @@ export class DocumentAnalyticsCondition extends UmbConditionBase { diff --git a/src/Umbraco.VercelAnalytics/Configuration/VercelAnalyticsSettings.cs b/src/TheBuilder.WebAnalytics/Configuration/VercelAnalyticsSettings.cs similarity index 97% rename from src/Umbraco.VercelAnalytics/Configuration/VercelAnalyticsSettings.cs rename to src/TheBuilder.WebAnalytics/Configuration/VercelAnalyticsSettings.cs index ec45c78..369fbba 100644 --- a/src/Umbraco.VercelAnalytics/Configuration/VercelAnalyticsSettings.cs +++ b/src/TheBuilder.WebAnalytics/Configuration/VercelAnalyticsSettings.cs @@ -4,9 +4,9 @@ using System.Text.Json; using System.Text.Json.Serialization; using Umbraco.Cms.Core.Services; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Configuration; +namespace TheBuilder.WebAnalytics.Configuration; public sealed class VercelAnalyticsSettings { @@ -46,7 +46,7 @@ public sealed class VercelAnalyticsConnectionSettings public sealed class VercelAnalyticsSettingsStore { - private const string StorageKey = "Umbraco.VercelAnalytics.Settings.v2"; + private const string StorageKey = "TheBuilder.WebAnalytics.Settings.v2"; private static readonly JsonSerializerOptions SerializerOptions = new(JsonSerializerDefaults.Web); private readonly Lock _lock = new(); private readonly IKeyValueService? _keyValueService; diff --git a/src/Umbraco.VercelAnalytics/Configuration/VercelAnalyticsSettingsValidator.cs b/src/TheBuilder.WebAnalytics/Configuration/VercelAnalyticsSettingsValidator.cs similarity index 98% rename from src/Umbraco.VercelAnalytics/Configuration/VercelAnalyticsSettingsValidator.cs rename to src/TheBuilder.WebAnalytics/Configuration/VercelAnalyticsSettingsValidator.cs index 70c4f1d..3ca61b1 100644 --- a/src/Umbraco.VercelAnalytics/Configuration/VercelAnalyticsSettingsValidator.cs +++ b/src/TheBuilder.WebAnalytics/Configuration/VercelAnalyticsSettingsValidator.cs @@ -1,4 +1,4 @@ -namespace Umbraco.VercelAnalytics.Configuration; +namespace TheBuilder.WebAnalytics.Configuration; public static class VercelAnalyticsSettingsValidator { diff --git a/src/TheBuilder.WebAnalytics/Constants.cs b/src/TheBuilder.WebAnalytics/Constants.cs new file mode 100644 index 0000000..a947b04 --- /dev/null +++ b/src/TheBuilder.WebAnalytics/Constants.cs @@ -0,0 +1,7 @@ +namespace TheBuilder.WebAnalytics; + +public static class Constants +{ + public const string ApiName = "thebuilderwebanalytics"; + public const string SectionAlias = "TheBuilder.WebAnalytics.Section"; +} diff --git a/src/Umbraco.VercelAnalytics/Controllers/AnalyticsApiConventions.cs b/src/TheBuilder.WebAnalytics/Controllers/AnalyticsApiConventions.cs similarity index 88% rename from src/Umbraco.VercelAnalytics/Controllers/AnalyticsApiConventions.cs rename to src/TheBuilder.WebAnalytics/Controllers/AnalyticsApiConventions.cs index 9f01cc1..f4499a4 100644 --- a/src/Umbraco.VercelAnalytics/Controllers/AnalyticsApiConventions.cs +++ b/src/TheBuilder.WebAnalytics/Controllers/AnalyticsApiConventions.cs @@ -1,8 +1,8 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Controllers; +namespace TheBuilder.WebAnalytics.Controllers; public static class AnalyticsApiConventions { diff --git a/src/Umbraco.VercelAnalytics/Controllers/VercelAnalyticsExceptionFilter.cs b/src/TheBuilder.WebAnalytics/Controllers/VercelAnalyticsExceptionFilter.cs similarity index 96% rename from src/Umbraco.VercelAnalytics/Controllers/VercelAnalyticsExceptionFilter.cs rename to src/TheBuilder.WebAnalytics/Controllers/VercelAnalyticsExceptionFilter.cs index f202b2d..b35e4dd 100644 --- a/src/Umbraco.VercelAnalytics/Controllers/VercelAnalyticsExceptionFilter.cs +++ b/src/TheBuilder.WebAnalytics/Controllers/VercelAnalyticsExceptionFilter.cs @@ -3,10 +3,10 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Controllers; +namespace TheBuilder.WebAnalytics.Controllers; internal static class VercelAnalyticsProblemCodes { diff --git a/src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsApiController.cs b/src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsApiController.cs similarity index 97% rename from src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsApiController.cs rename to src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsApiController.cs index 063e65a..2d550ab 100644 --- a/src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsApiController.cs +++ b/src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsApiController.cs @@ -3,20 +3,20 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Web.Common.Authorization; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Controllers; +namespace TheBuilder.WebAnalytics.Controllers; [ApiVersion("1.0")] -[ApiExplorerSettings(GroupName = "Umbraco.VercelAnalytics")] -public sealed class UmbracoVercelAnalyticsApiController( +[ApiExplorerSettings(GroupName = "TheBuilder.WebAnalytics")] +public sealed class WebAnalyticsApiController( IAnalyticsAuthorizationService authorizationService, VercelAnalyticsConnectionRegistry registry, VercelAnalyticsReportService reportService, IAnalyticsDocumentRouteService routeService, - IVercelProjectNameService projectNames) : UmbracoVercelAnalyticsApiControllerBase + IVercelProjectNameService projectNames) : WebAnalyticsApiControllerBase { private enum ReportScope { diff --git a/src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsApiControllerBase.cs b/src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsApiControllerBase.cs similarity index 77% rename from src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsApiControllerBase.cs rename to src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsApiControllerBase.cs index 09acaf1..9f6e34e 100644 --- a/src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsApiControllerBase.cs +++ b/src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsApiControllerBase.cs @@ -4,14 +4,14 @@ using Umbraco.Cms.Web.Common.Authorization; using Umbraco.Cms.Web.Common.Routing; -namespace Umbraco.VercelAnalytics.Controllers +namespace TheBuilder.WebAnalytics.Controllers { [ApiController] [BackOfficeRoute("management/api/v{version:apiVersion}/vercel-analytics")] [Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)] [TypeFilter(typeof(VercelAnalyticsExceptionFilter))] [MapToApi(Constants.ApiName)] - public class UmbracoVercelAnalyticsApiControllerBase : ControllerBase + public class WebAnalyticsApiControllerBase : ControllerBase { } } diff --git a/src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsSettingsApiController.cs b/src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsSettingsApiController.cs similarity index 94% rename from src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsSettingsApiController.cs rename to src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsSettingsApiController.cs index 2c9c1ce..1701d22 100644 --- a/src/Umbraco.VercelAnalytics/Controllers/UmbracoVercelAnalyticsSettingsApiController.cs +++ b/src/TheBuilder.WebAnalytics/Controllers/WebAnalyticsSettingsApiController.cs @@ -4,21 +4,21 @@ using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Security; using Umbraco.Extensions; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Controllers; +namespace TheBuilder.WebAnalytics.Controllers; [ApiVersion("1.0")] -[ApiExplorerSettings(GroupName = "Umbraco.VercelAnalytics")] -public sealed class UmbracoVercelAnalyticsSettingsApiController( +[ApiExplorerSettings(GroupName = "TheBuilder.WebAnalytics")] +public sealed class WebAnalyticsSettingsApiController( IBackOfficeSecurityAccessor backOfficeSecurityAccessor, VercelAnalyticsSettingsStore settingsStore, VercelAnalyticsConnectionRegistry registry, IOptions serverOptions, IVercelAnalyticsClient vercelClient, - IVercelProjectNameService projectNames) : UmbracoVercelAnalyticsApiControllerBase + IVercelProjectNameService projectNames) : WebAnalyticsApiControllerBase { [HttpGet("settings")] [ProducesResponseType(StatusCodes.Status200OK)] diff --git a/src/Umbraco.VercelAnalytics/Models/AnalyticsModels.cs b/src/TheBuilder.WebAnalytics/Models/AnalyticsModels.cs similarity index 99% rename from src/Umbraco.VercelAnalytics/Models/AnalyticsModels.cs rename to src/TheBuilder.WebAnalytics/Models/AnalyticsModels.cs index 0d22607..4cb4775 100644 --- a/src/Umbraco.VercelAnalytics/Models/AnalyticsModels.cs +++ b/src/TheBuilder.WebAnalytics/Models/AnalyticsModels.cs @@ -1,7 +1,7 @@ using System.Text.Json.Serialization; using Microsoft.AspNetCore.Mvc; -namespace Umbraco.VercelAnalytics.Models; +namespace TheBuilder.WebAnalytics.Models; public sealed class AnalyticsProblemDetails : ProblemDetails { diff --git a/src/Umbraco.VercelAnalytics/README.txt b/src/TheBuilder.WebAnalytics/README.txt similarity index 93% rename from src/Umbraco.VercelAnalytics/README.txt rename to src/TheBuilder.WebAnalytics/README.txt index 4342ac3..1d82a75 100644 --- a/src/Umbraco.VercelAnalytics/README.txt +++ b/src/TheBuilder.WebAnalytics/README.txt @@ -24,7 +24,7 @@ * Open a terminal inside the `\Client` folder * Run `npm install` to install all the dependencies * Run `npm run build` to build the project -* The build output is copied to `wwwroot\App_Plugins\UmbracoVercelAnalytics\umbraco-vercel-analytics.js` +* The build output is copied to `wwwroot\App_Plugins\TheBuilder.WebAnalytics\web-analytics.js` == File Watching == * Add this Razor Class Library Project as a project reference to an Umbraco Website project diff --git a/src/Umbraco.VercelAnalytics/Services/AnalyticsAuthorizationService.cs b/src/TheBuilder.WebAnalytics/Services/AnalyticsAuthorizationService.cs similarity index 97% rename from src/Umbraco.VercelAnalytics/Services/AnalyticsAuthorizationService.cs rename to src/TheBuilder.WebAnalytics/Services/AnalyticsAuthorizationService.cs index ec5afca..c008173 100644 --- a/src/Umbraco.VercelAnalytics/Services/AnalyticsAuthorizationService.cs +++ b/src/TheBuilder.WebAnalytics/Services/AnalyticsAuthorizationService.cs @@ -3,7 +3,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.AuthorizationStatus; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public interface IAnalyticsAuthorizationService { diff --git a/src/Umbraco.VercelAnalytics/Services/AnalyticsDocumentRouteService.cs b/src/TheBuilder.WebAnalytics/Services/AnalyticsDocumentRouteService.cs similarity index 95% rename from src/Umbraco.VercelAnalytics/Services/AnalyticsDocumentRouteService.cs rename to src/TheBuilder.WebAnalytics/Services/AnalyticsDocumentRouteService.cs index 18a6deb..0252876 100644 --- a/src/Umbraco.VercelAnalytics/Services/AnalyticsDocumentRouteService.cs +++ b/src/TheBuilder.WebAnalytics/Services/AnalyticsDocumentRouteService.cs @@ -1,9 +1,9 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public interface IAnalyticsDocumentRouteService { diff --git a/src/Umbraco.VercelAnalytics/Services/AnalyticsFilterParser.cs b/src/TheBuilder.WebAnalytics/Services/AnalyticsFilterParser.cs similarity index 95% rename from src/Umbraco.VercelAnalytics/Services/AnalyticsFilterParser.cs rename to src/TheBuilder.WebAnalytics/Services/AnalyticsFilterParser.cs index 8d91378..ce3f12e 100644 --- a/src/Umbraco.VercelAnalytics/Services/AnalyticsFilterParser.cs +++ b/src/TheBuilder.WebAnalytics/Services/AnalyticsFilterParser.cs @@ -1,6 +1,6 @@ -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public static class AnalyticsFilterParser { diff --git a/src/Umbraco.VercelAnalytics/Services/AnalyticsPublishedContentAccessor.cs b/src/TheBuilder.WebAnalytics/Services/AnalyticsPublishedContentAccessor.cs similarity index 99% rename from src/Umbraco.VercelAnalytics/Services/AnalyticsPublishedContentAccessor.cs rename to src/TheBuilder.WebAnalytics/Services/AnalyticsPublishedContentAccessor.cs index fe3148e..0f97315 100644 --- a/src/Umbraco.VercelAnalytics/Services/AnalyticsPublishedContentAccessor.cs +++ b/src/TheBuilder.WebAnalytics/Services/AnalyticsPublishedContentAccessor.cs @@ -3,7 +3,7 @@ using Umbraco.Cms.Core.Web; using Umbraco.Extensions; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public interface IAnalyticsPublishedContentAccessor { diff --git a/src/Umbraco.VercelAnalytics/Services/AnalyticsRequestPath.cs b/src/TheBuilder.WebAnalytics/Services/AnalyticsRequestPath.cs similarity index 88% rename from src/Umbraco.VercelAnalytics/Services/AnalyticsRequestPath.cs rename to src/TheBuilder.WebAnalytics/Services/AnalyticsRequestPath.cs index a9120ab..e13964a 100644 --- a/src/Umbraco.VercelAnalytics/Services/AnalyticsRequestPath.cs +++ b/src/TheBuilder.WebAnalytics/Services/AnalyticsRequestPath.cs @@ -1,4 +1,4 @@ -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; internal static class AnalyticsRequestPath { diff --git a/src/Umbraco.VercelAnalytics/Services/AnalyticsSectionAccessInitializer.cs b/src/TheBuilder.WebAnalytics/Services/AnalyticsSectionAccessInitializer.cs similarity index 82% rename from src/Umbraco.VercelAnalytics/Services/AnalyticsSectionAccessInitializer.cs rename to src/TheBuilder.WebAnalytics/Services/AnalyticsSectionAccessInitializer.cs index f9828d0..95a8e63 100644 --- a/src/Umbraco.VercelAnalytics/Services/AnalyticsSectionAccessInitializer.cs +++ b/src/TheBuilder.WebAnalytics/Services/AnalyticsSectionAccessInitializer.cs @@ -4,7 +4,7 @@ using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public sealed class AnalyticsSectionAccessInitializer( IUserGroupService userGroupService, @@ -13,7 +13,7 @@ public sealed class AnalyticsSectionAccessInitializer( ILogger logger) : INotificationAsyncHandler { - private const string InitializationKey = "Umbraco.VercelAnalytics.AdministratorSectionAccess.v1"; + private const string InitializationKey = "TheBuilder.WebAnalytics.AdministratorSectionAccess.v1"; public async Task HandleAsync( UmbracoApplicationStartedNotification notification, @@ -27,7 +27,7 @@ public async Task HandleAsync( var administrators = await userGroupService.GetAsync(Umbraco.Cms.Core.Constants.Security.AdminGroupAlias); if (administrators is null) { - logger.LogWarning("Could not grant the Vercel Analytics section because the Administrators group was not found."); + logger.LogWarning("Could not grant the Web Analytics section because the Administrators group was not found."); return; } @@ -39,7 +39,7 @@ public async Task HandleAsync( Umbraco.Cms.Core.Constants.Security.SuperUserKey); if (!result.Success) { - logger.LogWarning("Could not grant the Vercel Analytics section to the Administrators group."); + logger.LogWarning("Could not grant the Web Analytics section to the Administrators group."); return; } } diff --git a/src/Umbraco.VercelAnalytics/Services/IVercelAnalyticsClient.cs b/src/TheBuilder.WebAnalytics/Services/IVercelAnalyticsClient.cs similarity index 94% rename from src/Umbraco.VercelAnalytics/Services/IVercelAnalyticsClient.cs rename to src/TheBuilder.WebAnalytics/Services/IVercelAnalyticsClient.cs index a9fcbbf..02eb37e 100644 --- a/src/Umbraco.VercelAnalytics/Services/IVercelAnalyticsClient.cs +++ b/src/TheBuilder.WebAnalytics/Services/IVercelAnalyticsClient.cs @@ -1,7 +1,7 @@ -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public interface IVercelAnalyticsClient { diff --git a/src/Umbraco.VercelAnalytics/Services/MockVercelAnalyticsClient.cs b/src/TheBuilder.WebAnalytics/Services/MockVercelAnalyticsClient.cs similarity index 99% rename from src/Umbraco.VercelAnalytics/Services/MockVercelAnalyticsClient.cs rename to src/TheBuilder.WebAnalytics/Services/MockVercelAnalyticsClient.cs index d3ada9f..5c9c851 100644 --- a/src/Umbraco.VercelAnalytics/Services/MockVercelAnalyticsClient.cs +++ b/src/TheBuilder.WebAnalytics/Services/MockVercelAnalyticsClient.cs @@ -1,7 +1,7 @@ -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public sealed class MockVercelAnalyticsClient : IVercelAnalyticsClient { diff --git a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsApiException.cs b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsApiException.cs similarity index 83% rename from src/Umbraco.VercelAnalytics/Services/VercelAnalyticsApiException.cs rename to src/TheBuilder.WebAnalytics/Services/VercelAnalyticsApiException.cs index 1f63cf9..58a9ab4 100644 --- a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsApiException.cs +++ b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsApiException.cs @@ -1,6 +1,6 @@ using System.Net; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public sealed class VercelAnalyticsApiException(HttpStatusCode statusCode) : Exception($"Vercel Analytics returned HTTP {(int)statusCode}.") diff --git a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsClient.cs b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsClient.cs similarity index 99% rename from src/Umbraco.VercelAnalytics/Services/VercelAnalyticsClient.cs rename to src/TheBuilder.WebAnalytics/Services/VercelAnalyticsClient.cs index c0e3537..4a79e04 100644 --- a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsClient.cs +++ b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsClient.cs @@ -3,10 +3,10 @@ using System.Net.Http.Json; using System.Text.Json; using Microsoft.AspNetCore.WebUtilities; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public sealed class VercelAnalyticsClient(HttpClient httpClient) : IVercelAnalyticsClient { diff --git a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsClientRouter.cs b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsClientRouter.cs similarity index 96% rename from src/Umbraco.VercelAnalytics/Services/VercelAnalyticsClientRouter.cs rename to src/TheBuilder.WebAnalytics/Services/VercelAnalyticsClientRouter.cs index 48e72cf..261967f 100644 --- a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsClientRouter.cs +++ b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsClientRouter.cs @@ -1,7 +1,7 @@ -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public sealed class VercelAnalyticsClientRouter( VercelAnalyticsClient vercelClient, diff --git a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsReportService.cs b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsReportService.cs similarity index 98% rename from src/Umbraco.VercelAnalytics/Services/VercelAnalyticsReportService.cs rename to src/TheBuilder.WebAnalytics/Services/VercelAnalyticsReportService.cs index 8816750..a999e9d 100644 --- a/src/Umbraco.VercelAnalytics/Services/VercelAnalyticsReportService.cs +++ b/src/TheBuilder.WebAnalytics/Services/VercelAnalyticsReportService.cs @@ -1,8 +1,8 @@ using Microsoft.Extensions.Caching.Memory; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public sealed class VercelAnalyticsReportService( VercelAnalyticsConnectionRegistry registry, diff --git a/src/Umbraco.VercelAnalytics/Services/VercelProjectNameService.cs b/src/TheBuilder.WebAnalytics/Services/VercelProjectNameService.cs similarity index 95% rename from src/Umbraco.VercelAnalytics/Services/VercelProjectNameService.cs rename to src/TheBuilder.WebAnalytics/Services/VercelProjectNameService.cs index 0364de6..cb86934 100644 --- a/src/Umbraco.VercelAnalytics/Services/VercelProjectNameService.cs +++ b/src/TheBuilder.WebAnalytics/Services/VercelProjectNameService.cs @@ -1,8 +1,8 @@ using System.Text.Json; using Microsoft.Extensions.Caching.Memory; -using Umbraco.VercelAnalytics.Configuration; +using TheBuilder.WebAnalytics.Configuration; -namespace Umbraco.VercelAnalytics.Services; +namespace TheBuilder.WebAnalytics.Services; public interface IVercelProjectNameService { diff --git a/src/Umbraco.VercelAnalytics/Umbraco.VercelAnalytics.csproj b/src/TheBuilder.WebAnalytics/TheBuilder.WebAnalytics.csproj similarity index 63% rename from src/Umbraco.VercelAnalytics/Umbraco.VercelAnalytics.csproj rename to src/TheBuilder.WebAnalytics/TheBuilder.WebAnalytics.csproj index ff6aad2..5cce5d2 100644 --- a/src/Umbraco.VercelAnalytics/Umbraco.VercelAnalytics.csproj +++ b/src/TheBuilder.WebAnalytics/TheBuilder.WebAnalytics.csproj @@ -8,19 +8,24 @@ - Umbraco.VercelAnalytics - Umbraco.VercelAnalytics - Umbraco.VercelAnalytics + TheBuilder.WebAnalytics + Web Analytics + Web Analytics 0.1.0 - Vercel Web Analytics reports inside the Umbraco 17 and 18 backoffice. - umbraco;vercel;analytics;backoffice + Daniel Schmidt + View Vercel Web Analytics directly inside the Umbraco backoffice. + umbraco;umbraco-marketplace;analytics;web analytics;vercel;vercel analytics;traffic;visitors;referrers;utm;dashboard;reporting;content analytics;page analytics;custom events;multi-site + https://github.com/thebuilder/umbraco-vercel-analytics + https://github.com/thebuilder/umbraco-vercel-analytics.git + git + icon.png MIT README.md $(MSBuildProjectDirectory)/Client - wwwroot/App_Plugins/UmbracoVercelAnalytics/**/* - $(MSBuildProjectDirectory)/wwwroot/App_Plugins/UmbracoVercelAnalytics + wwwroot/App_Plugins/TheBuilder.WebAnalytics/**/* + $(MSBuildProjectDirectory)/wwwroot/App_Plugins/TheBuilder.WebAnalytics $(BackofficeAssetsDirectory)/umbraco-package.json - $(BackofficeAssetsDirectory)/umbraco-vercel-analytics.js + $(BackofficeAssetsDirectory)/web-analytics.js @@ -35,21 +40,22 @@ - + + - + - + + Text="Cannot pack TheBuilder.WebAnalytics because the backoffice manifest is missing. Build the client first." /> + Text="Cannot pack TheBuilder.WebAnalytics because the backoffice entry point is missing. Build the client first." /> diff --git a/src/Umbraco.VercelAnalytics/Client/public/umbraco-package.json b/src/Umbraco.VercelAnalytics/Client/public/umbraco-package.json deleted file mode 100644 index 525f73d..0000000 --- a/src/Umbraco.VercelAnalytics/Client/public/umbraco-package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "Umbraco.VercelAnalytics", - "name": "Umbraco.VercelAnalytics", - "version": "0.1.0", - "allowTelemetry": false, - "extensions": [ - { - "name": "Umbraco Vercel Analytics Bundle", - "alias": "Umbraco.VercelAnalytics.Bundle", - "type": "bundle", - "js": "/App_Plugins/UmbracoVercelAnalytics/umbraco-vercel-analytics.js" - } - ] -} diff --git a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-api.ts b/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-api.ts deleted file mode 100644 index fb7e33c..0000000 --- a/src/Umbraco.VercelAnalytics/Client/src/analytics/dashboard-api.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { UmbracoVercelAnalyticsService } from "../api/sdk.gen.js"; -import type { - AnalyticsBreakdown, - AnalyticsConnectionsResponse, - AnalyticsDocumentRoute, - AnalyticsEventDetails, - AnalyticsEventProperty, - AnalyticsEventsReport, - AnalyticsFlagsReport, - AnalyticsSummary, - FlagsData, -} from "../api/types.gen.js"; - -type ApiResponse = Promise<{ data?: T; error?: unknown; response: Response }>; -type FlagsOptions = { query?: FlagsData["query"]; signal?: AbortSignal }; - -export type DashboardApi = { - connections: (options?: Parameters>[0]) => ApiResponse; - documentRoutes: (options: Parameters>[0]) => ApiResponse; - summary: (options?: Parameters>[0]) => ApiResponse; - events: (options?: Parameters>[0]) => ApiResponse; - flags: (options?: FlagsOptions) => ApiResponse; - breakdown: (options: Parameters>[0]) => ApiResponse; - eventDetails: (options?: Parameters>[0]) => ApiResponse; - eventPropertyValues: (options?: Parameters>[0]) => ApiResponse; -}; - -export const dashboardApi: DashboardApi = { - connections: (options) => UmbracoVercelAnalyticsService.connections(options), - documentRoutes: (options) => UmbracoVercelAnalyticsService.documentRoutes(options), - summary: (options) => UmbracoVercelAnalyticsService.summary(options), - events: (options) => UmbracoVercelAnalyticsService.events(options), - flags: (options) => UmbracoVercelAnalyticsService.flags(options), - breakdown: (options) => UmbracoVercelAnalyticsService.breakdown(options), - eventDetails: (options) => UmbracoVercelAnalyticsService.eventDetails(options), - eventPropertyValues: (options) => UmbracoVercelAnalyticsService.eventPropertyValues(options), -}; diff --git a/src/Umbraco.VercelAnalytics/Constants.cs b/src/Umbraco.VercelAnalytics/Constants.cs deleted file mode 100644 index ed70eb8..0000000 --- a/src/Umbraco.VercelAnalytics/Constants.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Umbraco.VercelAnalytics; - -public static class Constants -{ - public const string ApiName = "umbracovercelanalytics"; - public const string SectionAlias = "Umbraco.VercelAnalytics.Section"; -} diff --git a/tasks/plan.md b/tasks/plan.md new file mode 100644 index 0000000..b1a66a1 --- /dev/null +++ b/tasks/plan.md @@ -0,0 +1,52 @@ +# Implementation Plan: Web Analytics Marketplace readiness + +## Overview + +Prepare the installable NuGet package and repository metadata for Umbraco Marketplace discovery, add focused listing copy and a package icon, document a privacy-safe screenshot workflow, and verify the packed artifact before publication. + +## Architecture decisions + +- Keep the GitHub repository as the NuGet project URL so the Marketplace can discover root-level metadata files from the default branch. +- Treat this as an Integration because it connects Umbraco to a third-party Vercel account and service. +- Do not add screenshot URLs until approved files exist on the default branch; broken image URLs are worse than an initially text-only listing. +- Use a disposable browser state or DOM-only label replacement for captures so the package does not gain a production-facing screenshot/demo mode. + +## Task list + +### Phase 1: Discovery metadata + +- [x] Add the `umbraco-marketplace` tag to the installable NuGet project. +- [x] Add NuGet author, project, repository, description, title, and icon metadata. +- [x] Add root-level Marketplace JSON and tailored Marketplace README content. + +### Checkpoint: Metadata + +- [x] The packed nuspec contains the expected Marketplace and NuGet metadata. +- [x] The Marketplace JSON conforms to the published schema. + +### Phase 2: Screenshot preparation + +- [x] Define a five-shot Marketplace story with exact captions and framing. +- [x] Define fictional paths, names, campaigns, and identifiers for anonymization. +- [x] Define capture, review, naming, and Marketplace JSON update steps. + +### Checkpoint: Complete + +- [x] Client tests and build pass. +- [x] .NET tests and NuGet pack pass. +- [x] The final package contains the README, icon, manifest, and backoffice assets. +- [ ] Approved screenshots are captured and added in a follow-up change. + +## Risks and mitigations + +| Risk | Impact | Mitigation | +| --- | --- | --- | +| A screenshot exposes a real route or identifier | High | Use the fixed fictional vocabulary and require a 200% visual review by a second person. | +| Marketplace imports incomplete metadata | Medium | Keep the project URL at the repository root and validate both JSON and the packed nuspec. | +| Screenshot URLs are broken before merge | Medium | Omit `Screenshots` until approved files are committed to the default branch. | +| NuGet package omits its icon or client assets | Medium | Inspect the generated `.nupkg` as part of verification. | + +## Open questions + +- Whether the first public release should remain `0.1.0` or be published as a prerelease version. +- Whether to capture optional event and UTM panels when the connected project's Vercel plan does not provide useful populated examples. diff --git a/tasks/todo.md b/tasks/todo.md new file mode 100644 index 0000000..a35e364 --- /dev/null +++ b/tasks/todo.md @@ -0,0 +1,12 @@ +# Web Analytics Marketplace readiness + +- [x] Audit current Marketplace requirements. +- [x] Add NuGet discovery and presentation metadata. +- [x] Add Marketplace listing metadata and copy. +- [x] Add a package icon source and packed PNG. +- [x] Document the anonymized screenshot plan. +- [x] Validate Marketplace JSON against the published schema. +- [x] Run client checks, tests, and build. +- [x] Run .NET tests and pack the NuGet package. +- [x] Inspect the packed nuspec and file list. +- [ ] Capture and review screenshots in a follow-up change. diff --git a/tests/Umbraco.VercelAnalytics.Tests/Configuration/VercelAnalyticsOptionsValidatorTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Configuration/VercelAnalyticsOptionsValidatorTests.cs similarity index 98% rename from tests/Umbraco.VercelAnalytics.Tests/Configuration/VercelAnalyticsOptionsValidatorTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Configuration/VercelAnalyticsOptionsValidatorTests.cs index 036f782..48b9730 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Configuration/VercelAnalyticsOptionsValidatorTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Configuration/VercelAnalyticsOptionsValidatorTests.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Options; -using Umbraco.VercelAnalytics.Configuration; +using TheBuilder.WebAnalytics.Configuration; -namespace Umbraco.VercelAnalytics.Tests.Configuration; +namespace TheBuilder.WebAnalytics.Tests.Configuration; public sealed class VercelAnalyticsOptionsValidatorTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Configuration/VercelAnalyticsSettingsValidatorTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Configuration/VercelAnalyticsSettingsValidatorTests.cs similarity index 98% rename from tests/Umbraco.VercelAnalytics.Tests/Configuration/VercelAnalyticsSettingsValidatorTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Configuration/VercelAnalyticsSettingsValidatorTests.cs index 6b9d4d2..cf04461 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Configuration/VercelAnalyticsSettingsValidatorTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Configuration/VercelAnalyticsSettingsValidatorTests.cs @@ -1,9 +1,9 @@ -using Umbraco.VercelAnalytics.Configuration; +using TheBuilder.WebAnalytics.Configuration; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Services; -using Umbraco.VercelAnalytics.Models; +using TheBuilder.WebAnalytics.Models; -namespace Umbraco.VercelAnalytics.Tests.Configuration; +namespace TheBuilder.WebAnalytics.Tests.Configuration; public sealed class VercelAnalyticsSettingsValidatorTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Controllers/VercelAnalyticsProblemFactoryTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Controllers/VercelAnalyticsProblemFactoryTests.cs similarity index 95% rename from tests/Umbraco.VercelAnalytics.Tests/Controllers/VercelAnalyticsProblemFactoryTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Controllers/VercelAnalyticsProblemFactoryTests.cs index c321a2e..5204883 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Controllers/VercelAnalyticsProblemFactoryTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Controllers/VercelAnalyticsProblemFactoryTests.cs @@ -5,11 +5,11 @@ using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Routing; -using Umbraco.VercelAnalytics.Controllers; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Controllers; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Controllers; +namespace TheBuilder.WebAnalytics.Tests.Controllers; public sealed class VercelAnalyticsProblemFactoryTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Controllers/UmbracoVercelAnalyticsApiControllerTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Controllers/WebAnalyticsApiControllerTests.cs similarity index 93% rename from tests/Umbraco.VercelAnalytics.Tests/Controllers/UmbracoVercelAnalyticsApiControllerTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Controllers/WebAnalyticsApiControllerTests.cs index f35d7fc..a29d039 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Controllers/UmbracoVercelAnalyticsApiControllerTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Controllers/WebAnalyticsApiControllerTests.cs @@ -5,14 +5,14 @@ using Microsoft.Extensions.Options; using Moq; using Umbraco.Cms.Web.Common.Authorization; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Controllers; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Controllers; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Controllers; +namespace TheBuilder.WebAnalytics.Tests.Controllers; -public sealed class UmbracoVercelAnalyticsApiControllerTests +public sealed class WebAnalyticsApiControllerTests { private static readonly Guid MainKey = Guid.Parse("11111111-1111-1111-1111-111111111110"); private static readonly Guid SecondaryKey = Guid.Parse("22222222-2222-2222-2222-222222222220"); @@ -20,7 +20,7 @@ public sealed class UmbracoVercelAnalyticsApiControllerTests public void Base_controller_requires_authenticated_backoffice_access() { var authorize = Assert.Single( - typeof(UmbracoVercelAnalyticsApiControllerBase) + typeof(WebAnalyticsApiControllerBase) .GetCustomAttributes()); Assert.Equal(AuthorizationPolicies.BackOfficeAccess, authorize.Policy); @@ -31,7 +31,7 @@ public async Task Connections_forbids_users_without_analytics_section_access() { var authorization = new Mock(MockBehavior.Strict); authorization.Setup(service => service.HasAnalyticsSectionAccess()).Returns(false); - var controller = new UmbracoVercelAnalyticsApiController( + var controller = new WebAnalyticsApiController( authorization.Object, null!, null!, @@ -68,7 +68,7 @@ public async Task Connections_resolves_connection_base_urls_concurrently() await release.Task; return "https://example.com"; }); - var controller = new UmbracoVercelAnalyticsApiController( + var controller = new WebAnalyticsApiController( authorization.Object, EnabledRegistry("main", "secondary"), null!, @@ -119,7 +119,7 @@ public async Task Mock_connection_without_token_or_document_mappings_is_ready_wi ] }); var registry = new VercelAnalyticsConnectionRegistry(store, options, mockConnectionsEnabled: true); - var controller = new UmbracoVercelAnalyticsApiController( + var controller = new WebAnalyticsApiController( authorization.Object, registry, null!, @@ -142,7 +142,7 @@ public async Task Document_routes_forbid_users_without_document_browse_permissio authorization .Setup(service => service.CanBrowseDocumentAsync(documentId)) .ReturnsAsync(false); - var controller = new UmbracoVercelAnalyticsApiController( + var controller = new WebAnalyticsApiController( authorization.Object, null!, null!, @@ -177,7 +177,7 @@ public async Task Document_summary_rejects_a_path_not_returned_for_the_document( true, []) ]); - var controller = new UmbracoVercelAnalyticsApiController( + var controller = new WebAnalyticsApiController( authorization.Object, EnabledRegistry(), null!, @@ -208,7 +208,7 @@ public async Task Document_summary_forbids_users_without_content_section_access_ authorization .Setup(service => service.HasContentSectionAccess()) .Returns(false); - var controller = new UmbracoVercelAnalyticsApiController( + var controller = new WebAnalyticsApiController( authorization.Object, EnabledRegistry(), null!, @@ -318,7 +318,7 @@ public async Task Event_property_values_reject_event_name_filter_from_the_shared AssertInvalidQuery(response.Result); } - private static UmbracoVercelAnalyticsApiController CreateBoundaryOnlyController() => + private static WebAnalyticsApiController CreateBoundaryOnlyController() => new(null!, null!, null!, null!, null!); private static DateTimeOffset UtcDate(int year, int month, int day) => diff --git a/tests/Umbraco.VercelAnalytics.Tests/Controllers/UmbracoVercelAnalyticsSettingsApiControllerTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Controllers/WebAnalyticsSettingsApiControllerTests.cs similarity index 86% rename from tests/Umbraco.VercelAnalytics.Tests/Controllers/UmbracoVercelAnalyticsSettingsApiControllerTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Controllers/WebAnalyticsSettingsApiControllerTests.cs index 4421e61..0e3718e 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Controllers/UmbracoVercelAnalyticsSettingsApiControllerTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Controllers/WebAnalyticsSettingsApiControllerTests.cs @@ -3,14 +3,14 @@ using Moq; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Security; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Controllers; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Controllers; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Controllers; +namespace TheBuilder.WebAnalytics.Tests.Controllers; -public sealed class UmbracoVercelAnalyticsSettingsApiControllerTests +public sealed class WebAnalyticsSettingsApiControllerTests { private static readonly Guid MockKey = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); @@ -35,7 +35,7 @@ public async Task Settings_preserve_mock_identity_and_report_runtime_availabilit ] }); var registry = new VercelAnalyticsConnectionRegistry(store, options, mockConnectionsEnabled); - var controller = new UmbracoVercelAnalyticsSettingsApiController( + var controller = new WebAnalyticsSettingsApiController( CreateAdministratorSecurityAccessor(), store, registry, diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsAuthorizationServiceTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsAuthorizationServiceTests.cs similarity index 90% rename from tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsAuthorizationServiceTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsAuthorizationServiceTests.cs index 51714aa..965ce05 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsAuthorizationServiceTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsAuthorizationServiceTests.cs @@ -1,9 +1,9 @@ using Moq; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class AnalyticsAuthorizationServiceTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsDocumentRouteServiceTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsDocumentRouteServiceTests.cs similarity index 98% rename from tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsDocumentRouteServiceTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsDocumentRouteServiceTests.cs index 2c8e2f1..86119f5 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsDocumentRouteServiceTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsDocumentRouteServiceTests.cs @@ -2,10 +2,10 @@ using Moq; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class AnalyticsDocumentRouteServiceTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsFilterParserTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsFilterParserTests.cs similarity index 91% rename from tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsFilterParserTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsFilterParserTests.cs index 14402ba..dc3a3f7 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsFilterParserTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsFilterParserTests.cs @@ -1,7 +1,7 @@ -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class AnalyticsFilterParserTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsPublishedCulturesTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsPublishedCulturesTests.cs similarity index 94% rename from tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsPublishedCulturesTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsPublishedCulturesTests.cs index 5cdc278..d07f950 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsPublishedCulturesTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsPublishedCulturesTests.cs @@ -1,6 +1,6 @@ -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class AnalyticsPublishedCulturesTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsRequestPathTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsRequestPathTests.cs similarity index 82% rename from tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsRequestPathTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsRequestPathTests.cs index 563199d..a639d65 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsRequestPathTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsRequestPathTests.cs @@ -1,6 +1,6 @@ -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class AnalyticsRequestPathTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsSectionAccessInitializerTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsSectionAccessInitializerTests.cs similarity index 86% rename from tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsSectionAccessInitializerTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsSectionAccessInitializerTests.cs index a56de01..672e736 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/AnalyticsSectionAccessInitializerTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/AnalyticsSectionAccessInitializerTests.cs @@ -1,6 +1,6 @@ -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class AnalyticsSectionAccessInitializerTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/MockVercelAnalyticsClientTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/MockVercelAnalyticsClientTests.cs similarity index 97% rename from tests/Umbraco.VercelAnalytics.Tests/Services/MockVercelAnalyticsClientTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/MockVercelAnalyticsClientTests.cs index 402146a..ddd5caa 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/MockVercelAnalyticsClientTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/MockVercelAnalyticsClientTests.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class MockVercelAnalyticsClientTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/VercelAnalyticsClientTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/VercelAnalyticsClientTests.cs similarity index 99% rename from tests/Umbraco.VercelAnalytics.Tests/Services/VercelAnalyticsClientTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/VercelAnalyticsClientTests.cs index dcca8df..201cc07 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/VercelAnalyticsClientTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/VercelAnalyticsClientTests.cs @@ -1,10 +1,10 @@ using System.Net; using System.Text; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class VercelAnalyticsClientTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/VercelAnalyticsReportServiceTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/VercelAnalyticsReportServiceTests.cs similarity index 98% rename from tests/Umbraco.VercelAnalytics.Tests/Services/VercelAnalyticsReportServiceTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/VercelAnalyticsReportServiceTests.cs index 4925d56..dd5cd3a 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/VercelAnalyticsReportServiceTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/VercelAnalyticsReportServiceTests.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class VercelAnalyticsReportServiceTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Services/VercelProjectNameServiceTests.cs b/tests/TheBuilder.WebAnalytics.Tests/Services/VercelProjectNameServiceTests.cs similarity index 95% rename from tests/Umbraco.VercelAnalytics.Tests/Services/VercelProjectNameServiceTests.cs rename to tests/TheBuilder.WebAnalytics.Tests/Services/VercelProjectNameServiceTests.cs index d26efb4..701a085 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Services/VercelProjectNameServiceTests.cs +++ b/tests/TheBuilder.WebAnalytics.Tests/Services/VercelProjectNameServiceTests.cs @@ -1,10 +1,10 @@ using Microsoft.Extensions.Caching.Memory; using Moq; -using Umbraco.VercelAnalytics.Configuration; -using Umbraco.VercelAnalytics.Models; -using Umbraco.VercelAnalytics.Services; +using TheBuilder.WebAnalytics.Configuration; +using TheBuilder.WebAnalytics.Models; +using TheBuilder.WebAnalytics.Services; -namespace Umbraco.VercelAnalytics.Tests.Services; +namespace TheBuilder.WebAnalytics.Tests.Services; public sealed class VercelProjectNameServiceTests { diff --git a/tests/Umbraco.VercelAnalytics.Tests/Umbraco.VercelAnalytics.Tests.csproj b/tests/TheBuilder.WebAnalytics.Tests/TheBuilder.WebAnalytics.Tests.csproj similarity index 87% rename from tests/Umbraco.VercelAnalytics.Tests/Umbraco.VercelAnalytics.Tests.csproj rename to tests/TheBuilder.WebAnalytics.Tests/TheBuilder.WebAnalytics.Tests.csproj index 906c37a..61c3c33 100644 --- a/tests/Umbraco.VercelAnalytics.Tests/Umbraco.VercelAnalytics.Tests.csproj +++ b/tests/TheBuilder.WebAnalytics.Tests/TheBuilder.WebAnalytics.Tests.csproj @@ -20,7 +20,7 @@ - + diff --git a/umbraco-marketplace-readme.md b/umbraco-marketplace-readme.md new file mode 100644 index 0000000..3dc845d --- /dev/null +++ b/umbraco-marketplace-readme.md @@ -0,0 +1,30 @@ +# Web Analytics + +> Vercel Web Analytics inside the Umbraco backoffice. + +**Web Analytics brings Vercel Web Analytics into the Umbraco backoffice.** View traffic, audience, referrers, pages, campaigns, and custom events without leaving Umbraco. + +## Features + +- Analytics section with totals, traffic history, audience, referrers, pages, routes, campaigns, and custom events. +- Page-level analytics in the document workspace, automatically filtered to the published route. +- Clear date controls and drill-down views that follow familiar Umbraco backoffice patterns. + +## Built for real Umbraco installations + +- Map multiple Umbraco sites to different Vercel projects. +- Choose which document types expose page-level analytics. +- Control global Analytics access through Umbraco user groups and preserve normal document permissions. +- Store Vercel access tokens in server-side configuration. Tokens are never sent to the browser or stored in Umbraco. + +The package reads analytics already collected by Vercel. **It does not add tracking scripts to your website.** + +## Requirements + +- Umbraco CMS 17.1–18.x +- A Vercel project with Web Analytics enabled +- A Vercel access token + +Installation, configuration, permissions, and troubleshooting are covered in the [documentation](https://github.com/thebuilder/umbraco-vercel-analytics#readme). + +Web Analytics is open source under the MIT License. Bugs and feature requests are welcome on [GitHub](https://github.com/thebuilder/umbraco-vercel-analytics/issues). diff --git a/umbraco-marketplace.json b/umbraco-marketplace.json new file mode 100644 index 0000000..6c4e142 --- /dev/null +++ b/umbraco-marketplace.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://marketplace.umbraco.com/umbraco-marketplace-schema.json", + "AuthorDetails": { + "Name": "Daniel Schmidt", + "Description": "Open-source Umbraco package developer focused on useful, editor-friendly backoffice integrations.", + "Url": "https://github.com/thebuilder", + "ImageUrl": "https://github.com/thebuilder.png", + "SyncContributorsFromRepository": true + }, + "Category": "Analytics & Insights", + "Title": "Web Analytics", + "Description": "View Vercel Web Analytics inside the Umbraco backoffice. Explore traffic, visitors, referrers, pages, routes, campaigns, UTM parameters, and custom events, with route-filtered analytics available directly on published documents.", + "DocumentationUrl": "https://github.com/thebuilder/umbraco-vercel-analytics#readme", + "IssueTrackerUrl": "https://github.com/thebuilder/umbraco-vercel-analytics/issues", + "LicenseTypes": [ + "Free" + ], + "PackageType": "Integration", + "Tags": [ + "analytics", + "web analytics", + "Vercel", + "Vercel Web Analytics", + "traffic analytics", + "website traffic", + "visitors", + "referrers", + "pages", + "routes", + "campaigns", + "UTM", + "dashboard", + "reporting", + "content analytics", + "page analytics", + "custom events", + "multisite", + "multi-site" + ] +}