diff --git a/packages/script/src/registry.ts b/packages/script/src/registry.ts index fc9b22c9..ddb75384 100644 --- a/packages/script/src/registry.ts +++ b/packages/script/src/registry.ts @@ -301,6 +301,11 @@ export async function registry(resolve?: (path: string) => Promise): Pro envDefaults: { domain: '' }, bundle: { resolve: (options?: PlausibleAnalyticsInput) => { + // Self-hosted Plausible: when a custom `scriptInput.src` is provided, + // bundle from that origin instead of the default plausible.io CDN. + const userSrc = (options as any)?.scriptInput?.src + if (typeof userSrc === 'string' && userSrc.trim().length > 0) + return userSrc.trim() if (options?.scriptId) return `https://plausible.io/js/pa-${options.scriptId}.js` const extensions = Array.isArray(options?.extension) ? options.extension.join('.') : [options?.extension] diff --git a/test/unit/plausible-bundle-resolve.test.ts b/test/unit/plausible-bundle-resolve.test.ts new file mode 100644 index 00000000..4279f09d --- /dev/null +++ b/test/unit/plausible-bundle-resolve.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest' +import { getBundleResolve, registry } from '../../packages/script/src/registry' + +async function getPlausibleResolve() { + const all = await registry() + const script = all.find(s => s.registryKey === 'plausibleAnalytics')! + const resolve = getBundleResolve(script) + if (!resolve) + throw new Error('plausibleAnalytics bundle.resolve missing') + return resolve +} + +describe('plausibleAnalytics bundle.resolve', () => { + it('returns default plausible.io URL with scriptId', async () => { + const resolve = await getPlausibleResolve() + expect(resolve({ scriptId: 'abc123' } as any)).toBe('https://plausible.io/js/pa-abc123.js') + }) + + it('returns default plausible.io URL with legacy extension', async () => { + const resolve = await getPlausibleResolve() + expect(resolve({ extension: 'hash' } as any)).toBe('https://plausible.io/js/script.hash.js') + }) + + it('returns default basic plausible.io URL with no options', async () => { + const resolve = await getPlausibleResolve() + expect(resolve(undefined)).toBe('https://plausible.io/js/script.js') + }) + + it('honors user-supplied scriptInput.src for self-hosted Plausible', async () => { + // Regression test for https://github.com/nuxt/scripts/issues/768 + const resolve = await getPlausibleResolve() + const selfHosted = 'https://my-self-hosted-plausible.io/js/script.js' + expect( + resolve({ scriptId: 'abc123', scriptInput: { src: selfHosted } } as any), + ).toBe(selfHosted) + expect( + resolve({ scriptInput: { src: selfHosted } } as any), + ).toBe(selfHosted) + }) +})