@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.
Files changed (99) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/e2e-tests/tests/cloudflare-worker.test.js +5 -0
  3. package/dist/e2e-tests/tests/cloudflare-worker.test.js.map +1 -1
  4. package/dist/e2e-tests/tests/pnpm-workspace.test.js +2 -1
  5. package/dist/e2e-tests/tests/pnpm-workspace.test.js.map +1 -1
  6. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.d.ts +1 -0
  7. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js +96 -0
  8. package/dist/e2e-tests/tests/react-router-instrumentation-api.test.js.map +1 -0
  9. package/dist/e2e-tests/tests/react-router.test.js +3 -1
  10. package/dist/e2e-tests/tests/react-router.test.js.map +1 -1
  11. package/dist/e2e-tests/tests/sveltekit-tracing.test.js +2 -1
  12. package/dist/e2e-tests/tests/sveltekit-tracing.test.js.map +1 -1
  13. package/dist/src/apple/code-tools.js +17 -3
  14. package/dist/src/apple/code-tools.js.map +1 -1
  15. package/dist/src/apple/configure-package-manager.js +18 -5
  16. package/dist/src/apple/configure-package-manager.js.map +1 -1
  17. package/dist/src/cloudflare/cloudflare-wizard.js +5 -0
  18. package/dist/src/cloudflare/cloudflare-wizard.js.map +1 -1
  19. package/dist/src/cloudflare/sdk-setup.d.ts +1 -0
  20. package/dist/src/cloudflare/sdk-setup.js.map +1 -1
  21. package/dist/src/cloudflare/templates.d.ts +1 -0
  22. package/dist/src/cloudflare/templates.js +7 -1
  23. package/dist/src/cloudflare/templates.js.map +1 -1
  24. package/dist/src/cloudflare/wrap-worker.d.ts +1 -0
  25. package/dist/src/cloudflare/wrap-worker.js +7 -0
  26. package/dist/src/cloudflare/wrap-worker.js.map +1 -1
  27. package/dist/src/react-native/expo.d.ts +6 -0
  28. package/dist/src/react-native/expo.js +27 -1
  29. package/dist/src/react-native/expo.js.map +1 -1
  30. package/dist/src/react-native/git.d.ts +5 -0
  31. package/dist/src/react-native/git.js +32 -1
  32. package/dist/src/react-native/git.js.map +1 -1
  33. package/dist/src/react-native/javascript.js +3 -1
  34. package/dist/src/react-native/javascript.js.map +1 -1
  35. package/dist/src/react-native/react-native-wizard.js +12 -6
  36. package/dist/src/react-native/react-native-wizard.js.map +1 -1
  37. package/dist/src/react-router/codemods/client.entry.d.ts +1 -1
  38. package/dist/src/react-router/codemods/client.entry.js +69 -12
  39. package/dist/src/react-router/codemods/client.entry.js.map +1 -1
  40. package/dist/src/react-router/codemods/react-router-config.js +1 -1
  41. package/dist/src/react-router/codemods/react-router-config.js.map +1 -1
  42. package/dist/src/react-router/codemods/root.js +1 -2
  43. package/dist/src/react-router/codemods/root.js.map +1 -1
  44. package/dist/src/react-router/codemods/server-entry.d.ts +1 -1
  45. package/dist/src/react-router/codemods/server-entry.js +39 -4
  46. package/dist/src/react-router/codemods/server-entry.js.map +1 -1
  47. package/dist/src/react-router/codemods/vite.js +46 -1
  48. package/dist/src/react-router/codemods/vite.js.map +1 -1
  49. package/dist/src/react-router/react-router-wizard.js +52 -5
  50. package/dist/src/react-router/react-router-wizard.js.map +1 -1
  51. package/dist/src/react-router/sdk-setup.d.ts +4 -2
  52. package/dist/src/react-router/sdk-setup.js +32 -5
  53. package/dist/src/react-router/sdk-setup.js.map +1 -1
  54. package/dist/src/react-router/templates.d.ts +2 -2
  55. package/dist/src/react-router/templates.js +72 -2
  56. package/dist/src/react-router/templates.js.map +1 -1
  57. package/dist/src/sourcemaps/tools/vite.js +1 -1
  58. package/dist/src/sourcemaps/tools/vite.js.map +1 -1
  59. package/dist/src/sveltekit/sdk-setup/vite.js +1 -1
  60. package/dist/src/sveltekit/sdk-setup/vite.js.map +1 -1
  61. package/dist/src/utils/ast-utils.d.ts +10 -0
  62. package/dist/src/utils/ast-utils.js +19 -1
  63. package/dist/src/utils/ast-utils.js.map +1 -1
  64. package/dist/src/version.d.ts +1 -1
  65. package/dist/src/version.js +1 -1
  66. package/dist/src/version.js.map +1 -1
  67. package/dist/test/apple/code-tools.test.js +78 -0
  68. package/dist/test/apple/code-tools.test.js.map +1 -1
  69. package/dist/test/apple/configure-package-manager.test.d.ts +1 -0
  70. package/dist/test/apple/configure-package-manager.test.js +161 -0
  71. package/dist/test/apple/configure-package-manager.test.js.map +1 -0
  72. package/dist/test/cloudflare/sdk-setup.test.js +20 -2
  73. package/dist/test/cloudflare/sdk-setup.test.js.map +1 -1
  74. package/dist/test/cloudflare/templates.test.js +54 -0
  75. package/dist/test/cloudflare/templates.test.js.map +1 -1
  76. package/dist/test/cloudflare/wrap-worker.test.js +74 -11
  77. package/dist/test/cloudflare/wrap-worker.test.js.map +1 -1
  78. package/dist/test/react-native/expo.test.js +140 -0
  79. package/dist/test/react-native/expo.test.js.map +1 -1
  80. package/dist/test/react-native/git.test.d.ts +1 -0
  81. package/dist/test/react-native/git.test.js +160 -0
  82. package/dist/test/react-native/git.test.js.map +1 -0
  83. package/dist/test/react-router/codemods/client-entry.test.js +29 -0
  84. package/dist/test/react-router/codemods/client-entry.test.js.map +1 -1
  85. package/dist/test/react-router/codemods/root.test.js +4 -0
  86. package/dist/test/react-router/codemods/root.test.js.map +1 -1
  87. package/dist/test/react-router/codemods/server-entry.test.js +70 -0
  88. package/dist/test/react-router/codemods/server-entry.test.js.map +1 -1
  89. package/dist/test/react-router/codemods/vite.test.js +89 -0
  90. package/dist/test/react-router/codemods/vite.test.js.map +1 -1
  91. package/dist/test/react-router/sdk-setup.test.js +62 -6
  92. package/dist/test/react-router/sdk-setup.test.js.map +1 -1
  93. package/dist/test/react-router/templates.test.js +50 -0
  94. package/dist/test/react-router/templates.test.js.map +1 -1
  95. package/dist/test/sourcemaps/tools/vite.test.js +12 -8
  96. package/dist/test/sourcemaps/tools/vite.test.js.map +1 -1
  97. package/dist/test/utils/ast-utils.test.js +22 -0
  98. package/dist/test/utils/ast-utils.test.js.map +1 -1
  99. 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;aAClB,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;aACnB,CAAC,CAAC;YAEH,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;OAetC,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;aAClB,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;aACnB,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 });\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 });\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('includes the correct DSN', () => {\n const dsn = 'https://example@sentry.io/123';\n const template = getCloudflareWorkerTemplate(dsn, {\n performance: true,\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 });\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"]}
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', { performance: false });
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', { performance: true });
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', { performance: false });
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', { performance: false });
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', { performance: false });
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', { performance: false });
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', { performance: true });
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', { performance: false });
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, { performance: false });
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', { performance: false });
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', { performance: false })).resolves.not.toThrow();
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":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAyE;AACzE,4CAA8B;AAC9B,gDAAkC;AAClC,4CAA8B;AAC9B,kEAAwE;AAExE,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC/D,IAAI,MAAc,CAAC;IAEnB,SAAS,WAAW,CAAC,WAAmB;QACtC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EACnC,OAAO,CACR,CAAC;QACF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAClD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,SAAS,UAAU;QACjB,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACzB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;SACxC;QAED,WAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,0BAA0B,CAAC,CAAC;YAEzD,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,aAAa,EAAE;gBAClD,WAAW,EAAE,KAAK;aACnB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;YAEnD,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,IAAA,WAAE,EAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YAE1C,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YAE1C,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,WAAE,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;YAEhD,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;YAE/C,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,4BAA4B,CAAC,CAAC;YAE3D,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,IAAA,WAAE,EAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;YACnD,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAC5C,OAAO,CACR,CAAC;YAEF,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,uBAAuB,CAAC,CAAC;YACtD,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAC/C,OAAO,CACR,CAAC;YAEF,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,IAAA,WAAE,EAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YAE1C,MAAM,OAAO,GACX,uFAAuF,CAAC;YAE1F,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAA,WAAE,EAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YAE1C,MAAM,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,sBAAsB,CAAC,CAAC;YAErD,MAAM,IAAA,eAAM,EACV,IAAA,kCAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CACjE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YAEzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAE5B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,eAAe,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","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 {};