Skip to content

Commit a474841

Browse files
authored
fix(astro): Add vue to registerEsmLoaderHooks (#15352)
Makes sure that `vue` is not wrapped and users don't get the error `$haml has already been declared` closes #13982
1 parent c1e76e3 commit a474841

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

packages/astro/src/server/sdk.ts

+21
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,30 @@ import { init as initNodeSdk } from '@sentry/node';
99
export function init(options: NodeOptions): NodeClient | undefined {
1010
const opts = {
1111
...options,
12+
registerEsmLoaderHooks: mergeRegisterEsmLoaderHooks(options),
1213
};
1314

1415
applySdkMetadata(opts, 'astro', ['astro', 'node']);
1516

1617
return initNodeSdk(opts);
1718
}
19+
20+
/**
21+
* Adds /vue/ to the registerEsmLoaderHooks options and merges it with the old values in the array if one is defined.
22+
* If the registerEsmLoaderHooks option is already a boolean, nothing is changed.
23+
*
24+
* Only exported for Testing purposes.
25+
*/
26+
export function mergeRegisterEsmLoaderHooks(options: NodeOptions): NodeOptions['registerEsmLoaderHooks'] {
27+
if (typeof options.registerEsmLoaderHooks === 'object' && options.registerEsmLoaderHooks !== null) {
28+
return {
29+
// eslint-disable-next-line deprecation/deprecation
30+
exclude: Array.isArray(options.registerEsmLoaderHooks.exclude)
31+
? // eslint-disable-next-line deprecation/deprecation
32+
[...options.registerEsmLoaderHooks.exclude, /vue/]
33+
: // eslint-disable-next-line deprecation/deprecation
34+
options.registerEsmLoaderHooks.exclude ?? [/vue/],
35+
};
36+
}
37+
return options.registerEsmLoaderHooks ?? { exclude: [/vue/] };
38+
}

packages/astro/test/server/sdk.test.ts

+41-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as SentryNode from '@sentry/node';
2-
import { SDK_VERSION } from '@sentry/node';
3-
import { vi } from 'vitest';
2+
import { type NodeOptions, SDK_VERSION } from '@sentry/node';
3+
import { afterEach, describe, expect, it, vi } from 'vitest';
44

5-
import { init } from '../../src/server/sdk';
5+
import { init, mergeRegisterEsmLoaderHooks } from '../../src/server/sdk';
66

77
const nodeInit = vi.spyOn(SentryNode, 'init');
88

@@ -43,4 +43,42 @@ describe('Sentry server SDK', () => {
4343
expect(init({})).not.toBeUndefined();
4444
});
4545
});
46+
47+
describe('mergeRegisterEsmLoaderHooks', () => {
48+
it('merges exclude array when registerEsmLoaderHooks is an object with an exclude array', () => {
49+
const options: NodeOptions = {
50+
registerEsmLoaderHooks: { exclude: [/test/] },
51+
};
52+
const result = mergeRegisterEsmLoaderHooks(options);
53+
expect(result).toEqual({ exclude: [/test/, /vue/] });
54+
});
55+
56+
it('sets exclude array when registerEsmLoaderHooks is an object without an exclude array', () => {
57+
const options: NodeOptions = {
58+
registerEsmLoaderHooks: {},
59+
};
60+
const result = mergeRegisterEsmLoaderHooks(options);
61+
expect(result).toEqual({ exclude: [/vue/] });
62+
});
63+
64+
it('returns boolean when registerEsmLoaderHooks is a boolean', () => {
65+
const options1: NodeOptions = {
66+
registerEsmLoaderHooks: true,
67+
};
68+
const result1 = mergeRegisterEsmLoaderHooks(options1);
69+
expect(result1).toBe(true);
70+
71+
const options2: NodeOptions = {
72+
registerEsmLoaderHooks: false,
73+
};
74+
const result2 = mergeRegisterEsmLoaderHooks(options2);
75+
expect(result2).toBe(false);
76+
});
77+
78+
it('sets exclude array when registerEsmLoaderHooks is undefined', () => {
79+
const options: NodeOptions = {};
80+
const result = mergeRegisterEsmLoaderHooks(options);
81+
expect(result).toEqual({ exclude: [/vue/] });
82+
});
83+
});
4684
});

0 commit comments

Comments
 (0)