@sentry/wizard 6.11.0 → 6.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js +5 -0
- package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js +2 -1
- package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.d.ts +1 -0
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
- package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
- package/dist/e2e-tests/tests/react-router.test.js +3 -1
- package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js +2 -1
- package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
- package/dist/src/apple/code-tools.js +17 -3
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/configure-package-manager.js +18 -5
- package/dist/src/apple/configure-package-manager.js.map +1 -1
- package/dist/src/cloudflare/cloudflare-wizard.js +5 -0
- package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -1
- package/dist/src/cloudflare/sdk-setup.d.ts +1 -0
- package/dist/src/cloudflare/sdk-setup.js.map +1 -1
- package/dist/src/cloudflare/templates.d.ts +1 -0
- package/dist/src/cloudflare/templates.js +7 -1
- package/dist/src/cloudflare/templates.js.map +1 -1
- package/dist/src/cloudflare/wrap-worker.d.ts +1 -0
- package/dist/src/cloudflare/wrap-worker.js +7 -0
- package/dist/src/cloudflare/wrap-worker.js.map +1 -1
- package/dist/src/react-native/expo.d.ts +6 -0
- package/dist/src/react-native/expo.js +27 -1
- package/dist/src/react-native/expo.js.map +1 -1
- package/dist/src/react-native/git.d.ts +5 -0
- package/dist/src/react-native/git.js +32 -1
- package/dist/src/react-native/git.js.map +1 -1
- package/dist/src/react-native/javascript.js +3 -1
- package/dist/src/react-native/javascript.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +12 -6
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
- package/dist/src/react-router/codemods/client.entry.js +69 -12
- package/dist/src/react-router/codemods/client.entry.js.map +1 -1
- package/dist/src/react-router/codemods/react-router-config.js +1 -1
- package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
- package/dist/src/react-router/codemods/root.js +1 -2
- package/dist/src/react-router/codemods/root.js.map +1 -1
- package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
- package/dist/src/react-router/codemods/server-entry.js +39 -4
- package/dist/src/react-router/codemods/server-entry.js.map +1 -1
- package/dist/src/react-router/codemods/vite.js +46 -1
- package/dist/src/react-router/codemods/vite.js.map +1 -1
- package/dist/src/react-router/react-router-wizard.js +52 -5
- package/dist/src/react-router/react-router-wizard.js.map +1 -1
- package/dist/src/react-router/sdk-setup.d.ts +4 -2
- package/dist/src/react-router/sdk-setup.js +32 -5
- package/dist/src/react-router/sdk-setup.js.map +1 -1
- package/dist/src/react-router/templates.d.ts +2 -2
- package/dist/src/react-router/templates.js +72 -2
- package/dist/src/react-router/templates.js.map +1 -1
- package/dist/src/sourcemaps/tools/vite.js +1 -1
- package/dist/src/sourcemaps/tools/vite.js.map +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
- package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
- package/dist/src/utils/ast-utils.d.ts +10 -0
- package/dist/src/utils/ast-utils.js +19 -1
- package/dist/src/utils/ast-utils.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/test/apple/code-tools.test.js +78 -0
- package/dist/test/apple/code-tools.test.js.map +1 -1
- package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
- package/dist/test/apple/configure-package-manager.test.js +161 -0
- package/dist/test/apple/configure-package-manager.test.js.map +1 -0
- package/dist/test/cloudflare/sdk-setup.test.js +20 -2
- package/dist/test/cloudflare/sdk-setup.test.js.map +1 -1
- package/dist/test/cloudflare/templates.test.js +54 -0
- package/dist/test/cloudflare/templates.test.js.map +1 -1
- package/dist/test/cloudflare/wrap-worker.test.js +74 -11
- package/dist/test/cloudflare/wrap-worker.test.js.map +1 -1
- package/dist/test/react-native/expo.test.js +140 -0
- package/dist/test/react-native/expo.test.js.map +1 -1
- package/dist/test/react-native/git.test.d.ts +1 -0
- package/dist/test/react-native/git.test.js +160 -0
- package/dist/test/react-native/git.test.js.map +1 -0
- package/dist/test/react-router/codemods/client-entry.test.js +29 -0
- package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/root.test.js +4 -0
- package/dist/test/react-router/codemods/root.test.js.map +1 -1
- package/dist/test/react-router/codemods/server-entry.test.js +70 -0
- package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
- package/dist/test/react-router/codemods/vite.test.js +89 -0
- package/dist/test/react-router/codemods/vite.test.js.map +1 -1
- package/dist/test/react-router/sdk-setup.test.js +62 -6
- package/dist/test/react-router/sdk-setup.test.js.map +1 -1
- package/dist/test/react-router/templates.test.js +50 -0
- package/dist/test/react-router/templates.test.js.map +1 -1
- package/dist/test/sourcemaps/tools/vite.test.js +12 -8
- package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
- package/dist/test/utils/ast-utils.test.js +22 -0
- package/dist/test/utils/ast-utils.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -7,6 +7,7 @@ const templates_1 = require("../../src/cloudflare/templates");
|
|
|
7
7
|
(0, vitest_1.it)('generates worker template with performance monitoring enabled', () => {
|
|
8
8
|
const template = (0, templates_1.getCloudflareWorkerTemplate)('my-dsn', {
|
|
9
9
|
performance: true,
|
|
10
|
+
logs: false,
|
|
10
11
|
});
|
|
11
12
|
(0, vitest_1.expect)(template).toMatchInlineSnapshot(`
|
|
12
13
|
"import * as Sentry from '@sentry/cloudflare';
|
|
@@ -30,6 +31,7 @@ const templates_1 = require("../../src/cloudflare/templates");
|
|
|
30
31
|
(0, vitest_1.it)('generates worker template with performance monitoring disabled', () => {
|
|
31
32
|
const template = (0, templates_1.getCloudflareWorkerTemplate)('my-dsn', {
|
|
32
33
|
performance: false,
|
|
34
|
+
logs: false,
|
|
33
35
|
});
|
|
34
36
|
(0, vitest_1.expect)(template).toMatchInlineSnapshot(`
|
|
35
37
|
"import * as Sentry from '@sentry/cloudflare';
|
|
@@ -46,18 +48,70 @@ const templates_1 = require("../../src/cloudflare/templates");
|
|
|
46
48
|
} satisfies ExportedHandler<Env>,
|
|
47
49
|
);
|
|
48
50
|
"
|
|
51
|
+
`);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('generates worker template with logs enabled', () => {
|
|
54
|
+
const template = (0, templates_1.getCloudflareWorkerTemplate)('my-dsn', {
|
|
55
|
+
performance: false,
|
|
56
|
+
logs: true,
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.expect)(template).toMatchInlineSnapshot(`
|
|
59
|
+
"import * as Sentry from '@sentry/cloudflare';
|
|
60
|
+
|
|
61
|
+
export default Sentry.withSentry(
|
|
62
|
+
(env) => ({
|
|
63
|
+
dsn: 'my-dsn',
|
|
64
|
+
// Enable logs to be sent to Sentry
|
|
65
|
+
enableLogs: true,
|
|
66
|
+
}),
|
|
67
|
+
{
|
|
68
|
+
async fetch(request, env, ctx): Promise<Response> {
|
|
69
|
+
// Your worker logic here
|
|
70
|
+
return new Response('Hello World!');
|
|
71
|
+
},
|
|
72
|
+
} satisfies ExportedHandler<Env>,
|
|
73
|
+
);
|
|
74
|
+
"
|
|
75
|
+
`);
|
|
76
|
+
});
|
|
77
|
+
(0, vitest_1.it)('generates worker template with both performance and logs enabled', () => {
|
|
78
|
+
const template = (0, templates_1.getCloudflareWorkerTemplate)('my-dsn', {
|
|
79
|
+
performance: true,
|
|
80
|
+
logs: true,
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.expect)(template).toMatchInlineSnapshot(`
|
|
83
|
+
"import * as Sentry from '@sentry/cloudflare';
|
|
84
|
+
|
|
85
|
+
export default Sentry.withSentry(
|
|
86
|
+
(env) => ({
|
|
87
|
+
dsn: 'my-dsn',
|
|
88
|
+
// Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.
|
|
89
|
+
tracesSampleRate: 1,
|
|
90
|
+
// Enable logs to be sent to Sentry
|
|
91
|
+
enableLogs: true,
|
|
92
|
+
}),
|
|
93
|
+
{
|
|
94
|
+
async fetch(request, env, ctx): Promise<Response> {
|
|
95
|
+
// Your worker logic here
|
|
96
|
+
return new Response('Hello World!');
|
|
97
|
+
},
|
|
98
|
+
} satisfies ExportedHandler<Env>,
|
|
99
|
+
);
|
|
100
|
+
"
|
|
49
101
|
`);
|
|
50
102
|
});
|
|
51
103
|
(0, vitest_1.it)('includes the correct DSN', () => {
|
|
52
104
|
const dsn = 'https://example@sentry.io/123';
|
|
53
105
|
const template = (0, templates_1.getCloudflareWorkerTemplate)(dsn, {
|
|
54
106
|
performance: true,
|
|
107
|
+
logs: false,
|
|
55
108
|
});
|
|
56
109
|
(0, vitest_1.expect)(template).toContain(`dsn: '${dsn}'`);
|
|
57
110
|
});
|
|
58
111
|
(0, vitest_1.it)('wraps handler with Sentry.withSentry', () => {
|
|
59
112
|
const template = (0, templates_1.getCloudflareWorkerTemplate)('my-dsn', {
|
|
60
113
|
performance: false,
|
|
114
|
+
logs: false,
|
|
61
115
|
});
|
|
62
116
|
(0, vitest_1.expect)(template).toContain('Sentry.withSentry');
|
|
63
117
|
(0, vitest_1.expect)(template).toContain('async fetch(request, env, ctx)');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/cloudflare/templates.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,8DAA6E;AAE7E,IAAA,iBAAQ,EAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAA,iBAAQ,EAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,QAAQ,GAAG,IAAA,uCAA2B,EAAC,QAAQ,EAAE;gBACrD,WAAW,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../../test/cloudflare/templates.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,8DAA6E;AAE7E,IAAA,iBAAQ,EAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAA,iBAAQ,EAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,QAAQ,GAAG,IAAA,uCAA2B,EAAC,QAAQ,EAAE;gBACrD,WAAW,EAAE,IAAI;gBACjB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;OAiBtC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,QAAQ,GAAG,IAAA,uCAA2B,EAAC,QAAQ,EAAE;gBACrD,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;OAetC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,QAAQ,GAAG,IAAA,uCAA2B,EAAC,QAAQ,EAAE;gBACrD,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;OAiBtC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,QAAQ,GAAG,IAAA,uCAA2B,EAAC,QAAQ,EAAE;gBACrD,WAAW,EAAE,IAAI;gBACjB,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;OAmBtC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,GAAG,GAAG,+BAA+B,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAA,uCAA2B,EAAC,GAAG,EAAE;gBAChD,WAAW,EAAE,IAAI;gBACjB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,QAAQ,GAAG,IAAA,uCAA2B,EAAC,QAAQ,EAAE;gBACrD,WAAW,EAAE,KAAK;gBAClB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAChD,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;YAC7D,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { getCloudflareWorkerTemplate } from '../../src/cloudflare/templates';\n\ndescribe('Cloudflare code templates', () => {\n describe('getCloudflareWorkerTemplate', () => {\n it('generates worker template with performance monitoring enabled', () => {\n const template = getCloudflareWorkerTemplate('my-dsn', {\n performance: true,\n logs: false,\n });\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from '@sentry/cloudflare';\n\n export default Sentry.withSentry(\n \t(env) => ({\n \t\tdsn: 'my-dsn',\n \t\t// Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.\n \t\ttracesSampleRate: 1,\n \t}),\n \t{\n \t\tasync fetch(request, env, ctx): Promise<Response> {\n \t\t\t// Your worker logic here\n \t\t\treturn new Response('Hello World!');\n \t\t},\n \t} satisfies ExportedHandler<Env>,\n );\n \"\n `);\n });\n\n it('generates worker template with performance monitoring disabled', () => {\n const template = getCloudflareWorkerTemplate('my-dsn', {\n performance: false,\n logs: false,\n });\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from '@sentry/cloudflare';\n\n export default Sentry.withSentry(\n \t(env) => ({\n \t\tdsn: 'my-dsn',\n \t}),\n \t{\n \t\tasync fetch(request, env, ctx): Promise<Response> {\n \t\t\t// Your worker logic here\n \t\t\treturn new Response('Hello World!');\n \t\t},\n \t} satisfies ExportedHandler<Env>,\n );\n \"\n `);\n });\n\n it('generates worker template with logs enabled', () => {\n const template = getCloudflareWorkerTemplate('my-dsn', {\n performance: false,\n logs: true,\n });\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from '@sentry/cloudflare';\n\n export default Sentry.withSentry(\n \t(env) => ({\n \t\tdsn: 'my-dsn',\n \t\t// Enable logs to be sent to Sentry\n \t\tenableLogs: true,\n \t}),\n \t{\n \t\tasync fetch(request, env, ctx): Promise<Response> {\n \t\t\t// Your worker logic here\n \t\t\treturn new Response('Hello World!');\n \t\t},\n \t} satisfies ExportedHandler<Env>,\n );\n \"\n `);\n });\n\n it('generates worker template with both performance and logs enabled', () => {\n const template = getCloudflareWorkerTemplate('my-dsn', {\n performance: true,\n logs: true,\n });\n\n expect(template).toMatchInlineSnapshot(`\n \"import * as Sentry from '@sentry/cloudflare';\n\n export default Sentry.withSentry(\n \t(env) => ({\n \t\tdsn: 'my-dsn',\n \t\t// Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control.\n \t\ttracesSampleRate: 1,\n \t\t// Enable logs to be sent to Sentry\n \t\tenableLogs: true,\n \t}),\n \t{\n \t\tasync fetch(request, env, ctx): Promise<Response> {\n \t\t\t// Your worker logic here\n \t\t\treturn new Response('Hello World!');\n \t\t},\n \t} satisfies ExportedHandler<Env>,\n );\n \"\n `);\n });\n\n it('includes the correct DSN', () => {\n const dsn = 'https://example@sentry.io/123';\n const template = getCloudflareWorkerTemplate(dsn, {\n performance: true,\n logs: false,\n });\n\n expect(template).toContain(`dsn: '${dsn}'`);\n });\n\n it('wraps handler with Sentry.withSentry', () => {\n const template = getCloudflareWorkerTemplate('my-dsn', {\n performance: false,\n logs: false,\n });\n\n expect(template).toContain('Sentry.withSentry');\n expect(template).toContain('async fetch(request, env, ctx)');\n expect(template).toContain('satisfies ExportedHandler<Env>');\n });\n });\n});\n"]}
|
|
@@ -55,13 +55,17 @@ const wrap_worker_1 = require("../../src/cloudflare/wrap-worker");
|
|
|
55
55
|
const filePath = copyFixture('simple-with-satisfies.ts');
|
|
56
56
|
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-test-dsn', {
|
|
57
57
|
performance: false,
|
|
58
|
+
logs: false,
|
|
58
59
|
});
|
|
59
60
|
const result = readResult();
|
|
60
61
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
61
62
|
});
|
|
62
63
|
(0, vitest_1.it)('preserves complex handler logic', async () => {
|
|
63
64
|
const filePath = copyFixture('complex-handler.ts');
|
|
64
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
65
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
66
|
+
performance: false,
|
|
67
|
+
logs: false,
|
|
68
|
+
});
|
|
65
69
|
const result = readResult();
|
|
66
70
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
67
71
|
});
|
|
@@ -69,13 +73,48 @@ const wrap_worker_1 = require("../../src/cloudflare/wrap-worker");
|
|
|
69
73
|
(0, vitest_1.describe)('performance monitoring', () => {
|
|
70
74
|
(0, vitest_1.it)('includes tracesSampleRate when performance is enabled', async () => {
|
|
71
75
|
const filePath = copyFixture('simple.ts');
|
|
72
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
76
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
77
|
+
performance: true,
|
|
78
|
+
logs: false,
|
|
79
|
+
});
|
|
73
80
|
const result = readResult();
|
|
74
81
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
75
82
|
});
|
|
76
83
|
(0, vitest_1.it)('omits tracesSampleRate when performance is disabled', async () => {
|
|
77
84
|
const filePath = copyFixture('simple.ts');
|
|
78
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
85
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
86
|
+
performance: false,
|
|
87
|
+
logs: false,
|
|
88
|
+
});
|
|
89
|
+
const result = readResult();
|
|
90
|
+
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.describe)('logs', () => {
|
|
94
|
+
(0, vitest_1.it)('includes enableLogs when logs is enabled', async () => {
|
|
95
|
+
const filePath = copyFixture('simple.ts');
|
|
96
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
97
|
+
performance: false,
|
|
98
|
+
logs: true,
|
|
99
|
+
});
|
|
100
|
+
const result = readResult();
|
|
101
|
+
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.it)('omits enableLogs when logs is disabled', async () => {
|
|
104
|
+
const filePath = copyFixture('simple.ts');
|
|
105
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
106
|
+
performance: false,
|
|
107
|
+
logs: false,
|
|
108
|
+
});
|
|
109
|
+
const result = readResult();
|
|
110
|
+
(0, vitest_1.expect)(result).not.toContain('enableLogs');
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)('includes both tracesSampleRate and enableLogs when both are enabled', async () => {
|
|
113
|
+
const filePath = copyFixture('simple.ts');
|
|
114
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
115
|
+
performance: true,
|
|
116
|
+
logs: true,
|
|
117
|
+
});
|
|
79
118
|
const result = readResult();
|
|
80
119
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
81
120
|
});
|
|
@@ -83,19 +122,28 @@ const wrap_worker_1 = require("../../src/cloudflare/wrap-worker");
|
|
|
83
122
|
(0, vitest_1.describe)('import handling', () => {
|
|
84
123
|
(0, vitest_1.it)('adds Sentry import at the beginning of the file', async () => {
|
|
85
124
|
const filePath = copyFixture('with-comment.ts');
|
|
86
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
125
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
126
|
+
performance: false,
|
|
127
|
+
logs: false,
|
|
128
|
+
});
|
|
87
129
|
const result = readResult();
|
|
88
130
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
89
131
|
});
|
|
90
132
|
(0, vitest_1.it)('preserves existing imports', async () => {
|
|
91
133
|
const filePath = copyFixture('with-import.ts');
|
|
92
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
134
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
135
|
+
performance: false,
|
|
136
|
+
logs: false,
|
|
137
|
+
});
|
|
93
138
|
const result = readResult();
|
|
94
139
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
95
140
|
});
|
|
96
141
|
(0, vitest_1.it)('preserves an external default export', async () => {
|
|
97
142
|
const filePath = copyFixture('external-default-export.ts');
|
|
98
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
143
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
144
|
+
performance: false,
|
|
145
|
+
logs: false,
|
|
146
|
+
});
|
|
99
147
|
const result = readResult();
|
|
100
148
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
101
149
|
});
|
|
@@ -104,14 +152,20 @@ const wrap_worker_1 = require("../../src/cloudflare/wrap-worker");
|
|
|
104
152
|
(0, vitest_1.it)('does not wrap again if Sentry is already present', async () => {
|
|
105
153
|
const filePath = copyFixture('already-wrapped.ts');
|
|
106
154
|
const originalContent = fs.readFileSync(path.join(fixturesDir, 'already-wrapped.ts'), 'utf-8');
|
|
107
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'new-dsn', {
|
|
155
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'new-dsn', {
|
|
156
|
+
performance: true,
|
|
157
|
+
logs: false,
|
|
158
|
+
});
|
|
108
159
|
const result = readResult();
|
|
109
160
|
(0, vitest_1.expect)(result).toBe(originalContent);
|
|
110
161
|
});
|
|
111
162
|
(0, vitest_1.it)('does not modify if @sentry/cloudflare is imported', async () => {
|
|
112
163
|
const filePath = copyFixture('with-sentry-import.ts');
|
|
113
164
|
const originalContent = fs.readFileSync(path.join(fixturesDir, 'with-sentry-import.ts'), 'utf-8');
|
|
114
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
165
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
166
|
+
performance: false,
|
|
167
|
+
logs: false,
|
|
168
|
+
});
|
|
115
169
|
const result = readResult();
|
|
116
170
|
(0, vitest_1.expect)(result).toBe(originalContent);
|
|
117
171
|
});
|
|
@@ -120,7 +174,10 @@ const wrap_worker_1 = require("../../src/cloudflare/wrap-worker");
|
|
|
120
174
|
(0, vitest_1.it)('uses the provided DSN', async () => {
|
|
121
175
|
const filePath = copyFixture('simple.ts');
|
|
122
176
|
const testDsn = 'https://d7a9abbecd95ed7d0f5b6c965f5fb6ba@o447951.ingest.us.sentry.io/4510147615391744';
|
|
123
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, testDsn, {
|
|
177
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, testDsn, {
|
|
178
|
+
performance: false,
|
|
179
|
+
logs: false,
|
|
180
|
+
});
|
|
124
181
|
const result = readResult();
|
|
125
182
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
126
183
|
});
|
|
@@ -128,13 +185,19 @@ const wrap_worker_1 = require("../../src/cloudflare/wrap-worker");
|
|
|
128
185
|
(0, vitest_1.describe)('edge cases', () => {
|
|
129
186
|
(0, vitest_1.it)('handles worker without satisfies clause', async () => {
|
|
130
187
|
const filePath = copyFixture('simple.ts');
|
|
131
|
-
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
188
|
+
await (0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
189
|
+
performance: false,
|
|
190
|
+
logs: false,
|
|
191
|
+
});
|
|
132
192
|
const result = readResult();
|
|
133
193
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
134
194
|
});
|
|
135
195
|
(0, vitest_1.it)('handles files with no default export gracefully', async () => {
|
|
136
196
|
const filePath = copyFixture('no-default-export.ts');
|
|
137
|
-
await (0, vitest_1.expect)((0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
197
|
+
await (0, vitest_1.expect)((0, wrap_worker_1.wrapWorkerWithSentry)(filePath, 'my-dsn', {
|
|
198
|
+
performance: false,
|
|
199
|
+
logs: false,
|
|
200
|
+
})).resolves.not.toThrow();
|
|
138
201
|
const result = readResult();
|
|
139
202
|
(0, vitest_1.expect)(result).toMatchSnapshot();
|
|
140
203
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-worker.test.js","sourceRoot":"","sources":["../../../test/cloudflare/wrap-worker.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { wrapWorkerWithSentry } from '../../src/cloudflare/wrap-worker';\n\ndescribe('wrapWorkerWithSentry', () => {\n const fixturesDir = path.join(__dirname, 'fixtures', 'worker');\n let tmpDir: string;\n\n function copyFixture(fixtureName: string): string {\n const content = fs.readFileSync(\n path.join(fixturesDir, fixtureName),\n 'utf-8',\n );\n const targetPath = path.join(tmpDir, 'worker.ts');\n fs.writeFileSync(targetPath, content);\n return targetPath;\n }\n\n function readResult(): string {\n return fs.readFileSync(path.join(tmpDir, 'worker.ts'), 'utf-8');\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wrap-worker-'));\n });\n\n afterEach(() => {\n if (fs.existsSync(tmpDir)) {\n fs.rmSync(tmpDir, { recursive: true });\n }\n\n vi.restoreAllMocks();\n });\n\n describe('basic wrapping', () => {\n it('wraps a simple worker export with Sentry', async () => {\n const filePath = copyFixture('simple-with-satisfies.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-test-dsn', {\n performance: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves complex handler logic', async () => {\n const filePath = copyFixture('complex-handler.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('performance monitoring', () => {\n it('includes tracesSampleRate when performance is enabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: true });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('omits tracesSampleRate when performance is disabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('import handling', () => {\n it('adds Sentry import at the beginning of the file', async () => {\n const filePath = copyFixture('with-comment.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves existing imports', async () => {\n const filePath = copyFixture('with-import.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves an external default export', async () => {\n const filePath = copyFixture('external-default-export.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('idempotency', () => {\n it('does not wrap again if Sentry is already present', async () => {\n const filePath = copyFixture('already-wrapped.ts');\n const originalContent = fs.readFileSync(\n path.join(fixturesDir, 'already-wrapped.ts'),\n 'utf-8',\n );\n\n await wrapWorkerWithSentry(filePath, 'new-dsn', { performance: true });\n\n const result = readResult();\n\n expect(result).toBe(originalContent);\n });\n\n it('does not modify if @sentry/cloudflare is imported', async () => {\n const filePath = copyFixture('with-sentry-import.ts');\n const originalContent = fs.readFileSync(\n path.join(fixturesDir, 'with-sentry-import.ts'),\n 'utf-8',\n );\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false });\n\n const result = readResult();\n\n expect(result).toBe(originalContent);\n });\n });\n\n describe('DSN handling', () => {\n it('uses the provided DSN', async () => {\n const filePath = copyFixture('simple.ts');\n\n const testDsn =\n 'https://d7a9abbecd95ed7d0f5b6c965f5fb6ba@o447951.ingest.us.sentry.io/4510147615391744';\n\n await wrapWorkerWithSentry(filePath, testDsn, { performance: false });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('edge cases', () => {\n it('handles worker without satisfies clause', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('handles files with no default export gracefully', async () => {\n const filePath = copyFixture('no-default-export.ts');\n\n await expect(\n wrapWorkerWithSentry(filePath, 'my-dsn', { performance: false }),\n ).resolves.not.toThrow();\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"wrap-worker.test.js","sourceRoot":"","sources":["../../../test/cloudflare/wrap-worker.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { wrapWorkerWithSentry } from '../../src/cloudflare/wrap-worker';\n\ndescribe('wrapWorkerWithSentry', () => {\n const fixturesDir = path.join(__dirname, 'fixtures', 'worker');\n let tmpDir: string;\n\n function copyFixture(fixtureName: string): string {\n const content = fs.readFileSync(\n path.join(fixturesDir, fixtureName),\n 'utf-8',\n );\n const targetPath = path.join(tmpDir, 'worker.ts');\n fs.writeFileSync(targetPath, content);\n return targetPath;\n }\n\n function readResult(): string {\n return fs.readFileSync(path.join(tmpDir, 'worker.ts'), 'utf-8');\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'wrap-worker-'));\n });\n\n afterEach(() => {\n if (fs.existsSync(tmpDir)) {\n fs.rmSync(tmpDir, { recursive: true });\n }\n\n vi.restoreAllMocks();\n });\n\n describe('basic wrapping', () => {\n it('wraps a simple worker export with Sentry', async () => {\n const filePath = copyFixture('simple-with-satisfies.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-test-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves complex handler logic', async () => {\n const filePath = copyFixture('complex-handler.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('performance monitoring', () => {\n it('includes tracesSampleRate when performance is enabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: true,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('omits tracesSampleRate when performance is disabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('logs', () => {\n it('includes enableLogs when logs is enabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: true,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('omits enableLogs when logs is disabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).not.toContain('enableLogs');\n });\n\n it('includes both tracesSampleRate and enableLogs when both are enabled', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: true,\n logs: true,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('import handling', () => {\n it('adds Sentry import at the beginning of the file', async () => {\n const filePath = copyFixture('with-comment.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves existing imports', async () => {\n const filePath = copyFixture('with-import.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('preserves an external default export', async () => {\n const filePath = copyFixture('external-default-export.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('idempotency', () => {\n it('does not wrap again if Sentry is already present', async () => {\n const filePath = copyFixture('already-wrapped.ts');\n const originalContent = fs.readFileSync(\n path.join(fixturesDir, 'already-wrapped.ts'),\n 'utf-8',\n );\n\n await wrapWorkerWithSentry(filePath, 'new-dsn', {\n performance: true,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toBe(originalContent);\n });\n\n it('does not modify if @sentry/cloudflare is imported', async () => {\n const filePath = copyFixture('with-sentry-import.ts');\n const originalContent = fs.readFileSync(\n path.join(fixturesDir, 'with-sentry-import.ts'),\n 'utf-8',\n );\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toBe(originalContent);\n });\n });\n\n describe('DSN handling', () => {\n it('uses the provided DSN', async () => {\n const filePath = copyFixture('simple.ts');\n\n const testDsn =\n 'https://d7a9abbecd95ed7d0f5b6c965f5fb6ba@o447951.ingest.us.sentry.io/4510147615391744';\n\n await wrapWorkerWithSentry(filePath, testDsn, {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n\n describe('edge cases', () => {\n it('handles worker without satisfies clause', async () => {\n const filePath = copyFixture('simple.ts');\n\n await wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n });\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n\n it('handles files with no default export gracefully', async () => {\n const filePath = copyFixture('no-default-export.ts');\n\n await expect(\n wrapWorkerWithSentry(filePath, 'my-dsn', {\n performance: false,\n logs: false,\n }),\n ).resolves.not.toThrow();\n\n const result = readResult();\n\n expect(result).toMatchSnapshot();\n });\n });\n});\n"]}
|
|
@@ -1,7 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
const vitest_1 = require("vitest");
|
|
4
27
|
const expo_1 = require("../../src/react-native/expo");
|
|
28
|
+
const fs = __importStar(require("fs"));
|
|
29
|
+
const git = __importStar(require("../../src/react-native/git"));
|
|
30
|
+
// Mock modules
|
|
31
|
+
vitest_1.vi.mock('fs');
|
|
32
|
+
vitest_1.vi.mock('../../src/react-native/git');
|
|
5
33
|
(0, vitest_1.describe)('expo', () => {
|
|
6
34
|
const MOCK_CONFIG = {
|
|
7
35
|
url: 'https://sentry.mock/',
|
|
@@ -9,6 +37,12 @@ const expo_1 = require("../../src/react-native/expo");
|
|
|
9
37
|
project: 'project-mock',
|
|
10
38
|
authToken: 'authToken-mock',
|
|
11
39
|
};
|
|
40
|
+
(0, vitest_1.beforeEach)(() => {
|
|
41
|
+
vitest_1.vi.clearAllMocks();
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.afterEach)(() => {
|
|
44
|
+
vitest_1.vi.restoreAllMocks();
|
|
45
|
+
});
|
|
12
46
|
(0, vitest_1.describe)('addWithSentryToAppConfigJson', () => {
|
|
13
47
|
(0, vitest_1.test)('do not add if sentry-expo present', () => {
|
|
14
48
|
const appConfigJson = `{
|
|
@@ -74,5 +108,111 @@ const expo_1 = require("../../src/react-native/expo");
|
|
|
74
108
|
});
|
|
75
109
|
});
|
|
76
110
|
});
|
|
111
|
+
(0, vitest_1.describe)('isExpoCNG', () => {
|
|
112
|
+
(0, vitest_1.test)('returns true when neither ios nor android folders exist', async () => {
|
|
113
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(false);
|
|
114
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
115
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
116
|
+
// Should check for ios folder existence
|
|
117
|
+
(0, vitest_1.expect)(fs.existsSync).toHaveBeenCalled();
|
|
118
|
+
// Should not check gitignore if folders don't exist
|
|
119
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).not.toHaveBeenCalled();
|
|
120
|
+
});
|
|
121
|
+
(0, vitest_1.test)('returns true when only ios exists and is in gitignore (android considered ignored)', async () => {
|
|
122
|
+
vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');
|
|
123
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
|
|
124
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
125
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
126
|
+
// Should only check ios since android doesn't exist (auto-resolves to true)
|
|
127
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
|
|
128
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
|
|
129
|
+
});
|
|
130
|
+
(0, vitest_1.test)('returns true when only android exists and is in gitignore (ios considered ignored)', async () => {
|
|
131
|
+
vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'android');
|
|
132
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
|
|
133
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
134
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
135
|
+
// Should only check android since ios doesn't exist (auto-resolves to true)
|
|
136
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
|
|
137
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
|
|
138
|
+
});
|
|
139
|
+
(0, vitest_1.test)('returns false when only ios exists but is NOT in gitignore', async () => {
|
|
140
|
+
vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');
|
|
141
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(false);
|
|
142
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
143
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
144
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
|
|
145
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
|
|
146
|
+
});
|
|
147
|
+
(0, vitest_1.test)('returns true when both folders exist AND both are in gitignore', async () => {
|
|
148
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
149
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
|
|
150
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
151
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
152
|
+
(0, vitest_1.expect)(fs.existsSync).toHaveBeenCalledWith('ios');
|
|
153
|
+
(0, vitest_1.expect)(fs.existsSync).toHaveBeenCalledWith('android');
|
|
154
|
+
// Should check both folders with Promise.all
|
|
155
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
|
|
156
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
|
|
157
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
|
|
158
|
+
});
|
|
159
|
+
(0, vitest_1.test)('returns false when both folders exist BUT neither is in gitignore', async () => {
|
|
160
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
161
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(false);
|
|
162
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
163
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
164
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
|
|
165
|
+
});
|
|
166
|
+
(0, vitest_1.test)('returns false when both folders exist but only ios is in gitignore', async () => {
|
|
167
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
168
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockImplementation((folder) => Promise.resolve(folder === 'ios'));
|
|
169
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
170
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
171
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
|
|
172
|
+
});
|
|
173
|
+
(0, vitest_1.test)('returns false when both folders exist but only android is in gitignore', async () => {
|
|
174
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
175
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockImplementation((folder) => Promise.resolve(folder === 'android'));
|
|
176
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
177
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
178
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
|
|
179
|
+
});
|
|
180
|
+
(0, vitest_1.test)('uses Promise.all to check both folders in parallel when both exist', async () => {
|
|
181
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
182
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
|
|
183
|
+
await (0, expo_1.isExpoCNG)();
|
|
184
|
+
// Should check both folders
|
|
185
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(2);
|
|
186
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
|
|
187
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
|
|
188
|
+
});
|
|
189
|
+
(0, vitest_1.test)('only checks existing folders', async () => {
|
|
190
|
+
// Test when only ios exists
|
|
191
|
+
vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');
|
|
192
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
|
|
193
|
+
await (0, expo_1.isExpoCNG)();
|
|
194
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
|
|
195
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('ios');
|
|
196
|
+
// Reset and test when only android exists
|
|
197
|
+
vitest_1.vi.clearAllMocks();
|
|
198
|
+
vitest_1.vi.mocked(fs.existsSync).mockImplementation((path) => path === 'android');
|
|
199
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);
|
|
200
|
+
await (0, expo_1.isExpoCNG)();
|
|
201
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledTimes(1);
|
|
202
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).toHaveBeenCalledWith('android');
|
|
203
|
+
// Reset and test when neither exists
|
|
204
|
+
vitest_1.vi.clearAllMocks();
|
|
205
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(false);
|
|
206
|
+
await (0, expo_1.isExpoCNG)();
|
|
207
|
+
(0, vitest_1.expect)(git.isFolderInGitignore).not.toHaveBeenCalled();
|
|
208
|
+
});
|
|
209
|
+
(0, vitest_1.test)('handles errors from isFolderInGitignore gracefully', async () => {
|
|
210
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
211
|
+
vitest_1.vi.mocked(git.isFolderInGitignore).mockRejectedValue(new Error('File system error'));
|
|
212
|
+
const result = await (0, expo_1.isExpoCNG)();
|
|
213
|
+
// Should catch error and return false instead of throwing
|
|
214
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
77
217
|
});
|
|
78
218
|
//# sourceMappingURL=expo.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expo.test.js","sourceRoot":"","sources":["../../../test/react-native/expo.test.ts"],"names":[],"mappings":";;AAAA,mCAAgD;AAChD,sDAA2E;AAG3E,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;IACpB,MAAM,WAAW,GAA4B;QAC3C,GAAG,EAAE,sBAAsB;QAC3B,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,gBAAgB;KAC5B,CAAC;IAEF,IAAA,iBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,IAAA,aAAI,EAAC,mCAAmC,EAAE,GAAG,EAAE;YAC7C,MAAM,aAAa,GAAG;;;;QAIpB,CAAC;YACH,IAAA,eAAM,EACJ,IAAA,mCAA4B,EAAC,aAAa,EAAE,WAAW,CAAC,CACzD,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAA,aAAI,EAAC,gDAAgD,EAAE,GAAG,EAAE;YAC1D,MAAM,aAAa,GAAG;;;;QAIpB,CAAC;YACH,IAAA,eAAM,EACJ,IAAA,mCAA4B,EAAC,aAAa,EAAE,WAAW,CAAC,CACzD,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,aAAI,CAAC,IAAI,CAAC;YACR;gBACE;;;;UAIE;aACH;YACD;gBACE;;UAEE;aACH;SACF,CAAC,CAAC,uCAAuC,EAAE,CAAC,aAAa,EAAE,EAAE;YAC5D,IAAA,eAAM,EACJ,IAAA,mCAA4B,EAAC,aAAa,EAAE,WAAW,CAAC,CACzD,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,aAAI,CAAC,IAAI,CAAC;YACR;gBACE;;;;UAIE;aACH;YACD,CAAC,IAAI,CAAC;YACN;gBACE;;UAEE;aACH;SACF,CAAC,CAAC,mDAAmD,EAAE,CAAC,aAAa,EAAE,EAAE;YACxE,MAAM,MAAM,GAAG,IAAA,mCAA4B,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YACxE,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC/C,IAAI,EAAE;oBACJ,OAAO,EAAE;wBACP;4BACE,2BAA2B;4BAC3B;gCACE,GAAG,EAAE,sBAAsB;gCAC3B,YAAY,EAAE,aAAa;gCAC3B,OAAO,EAAE,cAAc;6BACxB;yBACF;qBACF;iBACF;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from 'vitest';\nimport { addWithSentryToAppConfigJson } from '../../src/react-native/expo';\nimport { RNCliSetupConfigContent } from '../../src/react-native/react-native-wizard';\n\ndescribe('expo', () => {\n const MOCK_CONFIG: RNCliSetupConfigContent = {\n url: 'https://sentry.mock/',\n org: 'sentry-mock',\n project: 'project-mock',\n authToken: 'authToken-mock',\n };\n\n describe('addWithSentryToAppConfigJson', () => {\n test('do not add if sentry-expo present', () => {\n const appConfigJson = `{\n \"expo\": {\n \"plugins\": [\"sentry-expo\"]\n }\n }`;\n expect(\n addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG),\n ).toBeNull();\n });\n\n test('do not add if sentry-react-native/expo present', () => {\n const appConfigJson = `{\n \"expo\": {\n \"plugins\": [\"@sentry/react-native/expo\"]\n }\n }`;\n expect(\n addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG),\n ).toBeNull();\n });\n\n test.each([\n [\n `{\n \"expo\": {\n \"plugins\": \"should be an array, but it is not\"\n }\n }`,\n ],\n [\n `{\n \"expo\": [\"should be an object, but it is not\"]\n }`,\n ],\n ])('do not add if plugins is not an array', (appConfigJson) => {\n expect(\n addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG),\n ).toBeNull();\n });\n\n test.each([\n [\n `{\n \"expo\": {\n \"plugins\": []\n }\n }`,\n ],\n [`{}`],\n [\n `{\n \"expo\": {}\n }`,\n ],\n ])('add sentry react native expo plugin configuration', (appConfigJson) => {\n const result = addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG);\n expect(JSON.parse(result ?? '{}')).toStrictEqual({\n expo: {\n plugins: [\n [\n '@sentry/react-native/expo',\n {\n url: 'https://sentry.mock/',\n organization: 'sentry-mock',\n project: 'project-mock',\n },\n ],\n ],\n },\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"expo.test.js","sourceRoot":"","sources":["../../../test/react-native/expo.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, test, vi, beforeEach, afterEach } from 'vitest';\nimport {\n addWithSentryToAppConfigJson,\n isExpoCNG,\n} from '../../src/react-native/expo';\nimport { RNCliSetupConfigContent } from '../../src/react-native/react-native-wizard';\nimport * as fs from 'fs';\nimport * as git from '../../src/react-native/git';\n\n// Mock modules\nvi.mock('fs');\nvi.mock('../../src/react-native/git');\n\ndescribe('expo', () => {\n const MOCK_CONFIG: RNCliSetupConfigContent = {\n url: 'https://sentry.mock/',\n org: 'sentry-mock',\n project: 'project-mock',\n authToken: 'authToken-mock',\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n describe('addWithSentryToAppConfigJson', () => {\n test('do not add if sentry-expo present', () => {\n const appConfigJson = `{\n \"expo\": {\n \"plugins\": [\"sentry-expo\"]\n }\n }`;\n expect(\n addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG),\n ).toBeNull();\n });\n\n test('do not add if sentry-react-native/expo present', () => {\n const appConfigJson = `{\n \"expo\": {\n \"plugins\": [\"@sentry/react-native/expo\"]\n }\n }`;\n expect(\n addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG),\n ).toBeNull();\n });\n\n test.each([\n [\n `{\n \"expo\": {\n \"plugins\": \"should be an array, but it is not\"\n }\n }`,\n ],\n [\n `{\n \"expo\": [\"should be an object, but it is not\"]\n }`,\n ],\n ])('do not add if plugins is not an array', (appConfigJson) => {\n expect(\n addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG),\n ).toBeNull();\n });\n\n test.each([\n [\n `{\n \"expo\": {\n \"plugins\": []\n }\n }`,\n ],\n [`{}`],\n [\n `{\n \"expo\": {}\n }`,\n ],\n ])('add sentry react native expo plugin configuration', (appConfigJson) => {\n const result = addWithSentryToAppConfigJson(appConfigJson, MOCK_CONFIG);\n expect(JSON.parse(result ?? '{}')).toStrictEqual({\n expo: {\n plugins: [\n [\n '@sentry/react-native/expo',\n {\n url: 'https://sentry.mock/',\n organization: 'sentry-mock',\n project: 'project-mock',\n },\n ],\n ],\n },\n });\n });\n });\n\n describe('isExpoCNG', () => {\n test('returns true when neither ios nor android folders exist', async () => {\n vi.mocked(fs.existsSync).mockReturnValue(false);\n\n const result = await isExpoCNG();\n\n expect(result).toBe(true);\n // Should check for ios folder existence\n expect(fs.existsSync).toHaveBeenCalled();\n // Should not check gitignore if folders don't exist\n expect(git.isFolderInGitignore).not.toHaveBeenCalled();\n });\n\n test('returns true when only ios exists and is in gitignore (android considered ignored)', async () => {\n vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);\n\n const result = await isExpoCNG();\n\n expect(result).toBe(true);\n // Should only check ios since android doesn't exist (auto-resolves to true)\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(1);\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('ios');\n });\n\n test('returns true when only android exists and is in gitignore (ios considered ignored)', async () => {\n vi.mocked(fs.existsSync).mockImplementation((path) => path === 'android');\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);\n\n const result = await isExpoCNG();\n\n expect(result).toBe(true);\n // Should only check android since ios doesn't exist (auto-resolves to true)\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(1);\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('android');\n });\n\n test('returns false when only ios exists but is NOT in gitignore', async () => {\n vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(false);\n\n const result = await isExpoCNG();\n\n expect(result).toBe(false);\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(1);\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('ios');\n });\n\n test('returns true when both folders exist AND both are in gitignore', async () => {\n vi.mocked(fs.existsSync).mockReturnValue(true);\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);\n\n const result = await isExpoCNG();\n\n expect(result).toBe(true);\n expect(fs.existsSync).toHaveBeenCalledWith('ios');\n expect(fs.existsSync).toHaveBeenCalledWith('android');\n // Should check both folders with Promise.all\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(2);\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('ios');\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('android');\n });\n\n test('returns false when both folders exist BUT neither is in gitignore', async () => {\n vi.mocked(fs.existsSync).mockReturnValue(true);\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(false);\n\n const result = await isExpoCNG();\n\n expect(result).toBe(false);\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(2);\n });\n\n test('returns false when both folders exist but only ios is in gitignore', async () => {\n vi.mocked(fs.existsSync).mockReturnValue(true);\n vi.mocked(git.isFolderInGitignore).mockImplementation((folder) =>\n Promise.resolve(folder === 'ios'),\n );\n\n const result = await isExpoCNG();\n\n expect(result).toBe(false);\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(2);\n });\n\n test('returns false when both folders exist but only android is in gitignore', async () => {\n vi.mocked(fs.existsSync).mockReturnValue(true);\n vi.mocked(git.isFolderInGitignore).mockImplementation((folder) =>\n Promise.resolve(folder === 'android'),\n );\n\n const result = await isExpoCNG();\n\n expect(result).toBe(false);\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(2);\n });\n\n test('uses Promise.all to check both folders in parallel when both exist', async () => {\n vi.mocked(fs.existsSync).mockReturnValue(true);\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);\n\n await isExpoCNG();\n\n // Should check both folders\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(2);\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('ios');\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('android');\n });\n\n test('only checks existing folders', async () => {\n // Test when only ios exists\n vi.mocked(fs.existsSync).mockImplementation((path) => path === 'ios');\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);\n\n await isExpoCNG();\n\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(1);\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('ios');\n\n // Reset and test when only android exists\n vi.clearAllMocks();\n vi.mocked(fs.existsSync).mockImplementation((path) => path === 'android');\n vi.mocked(git.isFolderInGitignore).mockResolvedValue(true);\n\n await isExpoCNG();\n\n expect(git.isFolderInGitignore).toHaveBeenCalledTimes(1);\n expect(git.isFolderInGitignore).toHaveBeenCalledWith('android');\n\n // Reset and test when neither exists\n vi.clearAllMocks();\n vi.mocked(fs.existsSync).mockReturnValue(false);\n\n await isExpoCNG();\n\n expect(git.isFolderInGitignore).not.toHaveBeenCalled();\n });\n\n test('handles errors from isFolderInGitignore gracefully', async () => {\n vi.mocked(fs.existsSync).mockReturnValue(true);\n vi.mocked(git.isFolderInGitignore).mockRejectedValue(\n new Error('File system error'),\n );\n\n const result = await isExpoCNG();\n\n // Should catch error and return false instead of throwing\n expect(result).toBe(false);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|