@sentry/wizard
Version:
Sentry wizard helping you to configure your project
314 lines (298 loc) • 11.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// @ts-ignore - magicast is ESM and TS complains about that. It works though
const magicast_1 = require("magicast");
const metro_1 = require("../../src/react-native/metro");
describe('patch metro config - sentry serializer', () => {
describe('patchMetroWithSentryConfigInMemory', () => {
it('patches react native 0.72 default metro config', async () => {
const mod = (0, magicast_1.parseModule)(`const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
/**
* Metro configuration
* https://reactnative.dev/docs/metro
*
* @type {import('metro-config').MetroConfig}
*/
const config = {};
module.exports = mergeConfig(getDefaultConfig(__dirname), config);`);
const result = await (0, metro_1.patchMetroWithSentryConfigInMemory)(mod, async () => {
/* noop */
});
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code)
.toBe(`const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
const {
withSentryConfig
} = require("@sentry/react-native/metro");
/**
* Metro configuration
* https://reactnative.dev/docs/metro
*
* @type {import('metro-config').MetroConfig}
*/
const config = {};
module.exports = withSentryConfig(mergeConfig(getDefaultConfig(__dirname), config));`);
});
it('patches react native 0.65 default metro config', async () => {
const mod = (0, magicast_1.parseModule)(`/**
* Metro configuration for React Native
* https://github.com/facebook/react-native
*
* @format
*/
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: true,
},
}),
},
};`);
const result = await (0, metro_1.patchMetroWithSentryConfigInMemory)(mod, async () => {
/* noop */
});
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`const {
withSentryConfig
} = require("@sentry/react-native/metro");
/**
* Metro configuration for React Native
* https://github.com/facebook/react-native
*
* @format
*/
module.exports = withSentryConfig({
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: true,
},
}),
},
});`);
});
it('patches react native metro config exported variable', async () => {
const mod = (0, magicast_1.parseModule)(`const testConfig = {};
module.exports = testConfig;`);
const result = await (0, metro_1.patchMetroWithSentryConfigInMemory)(mod, async () => {
/* noop */
});
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`const {
withSentryConfig
} = require("@sentry/react-native/metro");
const testConfig = {};
module.exports = withSentryConfig(testConfig);`);
});
it('does not patch react native metro config exported as factory function', async () => {
const mod = (0, magicast_1.parseModule)(`module.exports = () => ({});`);
const result = await (0, metro_1.patchMetroWithSentryConfigInMemory)(mod, async () => {
/* noop */
});
expect(result).toBe(false);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`module.exports = () => ({});`);
});
});
describe('addSentrySerializerToMetroConfig', () => {
it('add to empty config', () => {
const mod = (0, magicast_1.parseModule)(`module.exports = {
other: 'config'
}`);
const configObject = getModuleExportsObject(mod);
const result = (0, metro_1.addSentrySerializerToMetroConfig)(configObject);
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`module.exports = {
other: 'config',
serializer: {
customSerializer: createSentryMetroSerializer()
}
}`);
});
it('add to existing serializer config', () => {
const mod = (0, magicast_1.parseModule)(`module.exports = {
other: 'config',
serializer: {
other: 'config'
}
}`);
const configObject = getModuleExportsObject(mod);
const result = (0, metro_1.addSentrySerializerToMetroConfig)(configObject);
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`module.exports = {
other: 'config',
serializer: {
other: 'config',
customSerializer: createSentryMetroSerializer()
}
}`);
});
it('not add to existing customSerializer config', () => {
const mod = (0, magicast_1.parseModule)(`module.exports = {
other: 'config',
serializer: {
other: 'config',
customSerializer: 'existing-serializer'
}
}`);
const configObject = getModuleExportsObject(mod);
const result = (0, metro_1.addSentrySerializerToMetroConfig)(configObject);
expect(result).toBe(false);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`module.exports = {
other: 'config',
serializer: {
other: 'config',
customSerializer: 'existing-serializer'
}
}`);
});
});
describe('addSentrySerializerImportToMetroConfig', () => {
it('add import', () => {
const mod = (0, magicast_1.parseModule)(`const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
module.exports = {
other: 'config'
}`);
const result = (0, metro_1.addSentrySerializerRequireToMetroConfig)(mod.$ast);
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code)
.toBe(`const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
const {
createSentryMetroSerializer
} = require("@sentry/react-native/dist/js/tools/sentryMetroSerializer");
module.exports = {
other: 'config'
}`);
});
});
describe('getMetroConfigObject', () => {
it('get config object from variable called config', () => {
const mod = (0, magicast_1.parseModule)(`var config = { some: 'config' };`);
const configObject = (0, metro_1.getMetroConfigObject)(mod.$ast);
expect((configObject?.properties[0]).key
.name).toBe('some');
expect((configObject?.properties[0])
.value.value).toBe('config');
});
it('get config object from const called config', () => {
const mod = (0, magicast_1.parseModule)(`const config = { some: 'config' };`);
const configObject = (0, metro_1.getMetroConfigObject)(mod.$ast);
expect((configObject?.properties[0]).key
.name).toBe('some');
expect((configObject?.properties[0])
.value.value).toBe('config');
});
it('get config oject from let called config', () => {
const mod = (0, magicast_1.parseModule)(`let config = { some: 'config' };`);
const configObject = (0, metro_1.getMetroConfigObject)(mod.$ast);
expect((configObject?.properties[0]).key
.name).toBe('some');
expect((configObject?.properties[0])
.value.value).toBe('config');
});
it('get config object from module.exports', () => {
const mod = (0, magicast_1.parseModule)(`module.exports = { some: 'config' };`);
const configObject = (0, metro_1.getMetroConfigObject)(mod.$ast);
expect((configObject?.properties[0]).key
.name).toBe('some');
expect((configObject?.properties[0])
.value.value).toBe('config');
});
});
describe('remove @sentry require', () => {
it('nothing to remove', () => {
const mod = (0, magicast_1.parseModule)(`let config = { some: 'config' };`);
const result = (0, metro_1.removeSentryRequire)(mod.$ast);
expect(result).toBe(false);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`let config = { some: 'config' };`);
});
it('remove metro serializer import', () => {
const mod = (0, magicast_1.parseModule)(`const {
createSentryMetroSerializer,
} = require('@sentry/react-native/dist/js/tools/sentryMetroSerializer');
let config = { some: 'config' };`);
const result = (0, metro_1.removeSentryRequire)(mod.$ast);
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`let config = { some: 'config' };`);
});
it('remove all sentry imports', () => {
const mod = (0, magicast_1.parseModule)(`const {
createSentryMetroSerializer,
} = require('@sentry/react-native/dist/js/tools/sentryMetroSerializer');
var Sentry = require('@sentry/react-native');
let SentryIntegrations = require('@sentry/integrations');
let config = { some: 'config' };`);
const result = (0, metro_1.removeSentryRequire)(mod.$ast);
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`let config = { some: 'config' };`);
});
});
describe('remove sentryMetroSerializer', () => {
it('no custom serializer to remove', () => {
const mod = (0, magicast_1.parseModule)(`let config = { some: 'config' };`);
const result = (0, metro_1.removeSentrySerializerFromMetroConfig)(mod.$ast);
expect(result).toBe(false);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`let config = { some: 'config' };`);
});
it('no Sentry custom serializer to remove', () => {
const mod = (0, magicast_1.parseModule)(`let config = {
serializer: {
customSerializer: 'existing-serializer',
other: 'config',
},
other: 'config',
};`);
const result = (0, metro_1.removeSentrySerializerFromMetroConfig)(mod.$ast);
expect(result).toBe(false);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`let config = {
serializer: {
customSerializer: 'existing-serializer',
other: 'config',
},
other: 'config',
};`);
});
it('Sentry serializer to remove', () => {
const mod = (0, magicast_1.parseModule)(`let config = {
serializer: {
customSerializer: createSentryMetroSerializer(),
other: 'config',
},
other: 'config',
};`);
const result = (0, metro_1.removeSentrySerializerFromMetroConfig)(mod.$ast);
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`let config = {
serializer: {
other: 'config'
},
other: 'config',
};`);
});
it('Sentry serializer to remove with wrapped serializer', () => {
const mod = (0, magicast_1.parseModule)(`let config = {
serializer: {
customSerializer: createSentryMetroSerializer(wrappedSerializer()),
other: 'config',
},
other: 'config',
};`);
const result = (0, metro_1.removeSentrySerializerFromMetroConfig)(mod.$ast);
expect(result).toBe(true);
expect((0, magicast_1.generateCode)(mod.$ast).code).toBe(`let config = {
serializer: {
customSerializer: wrappedSerializer(),
other: 'config',
},
other: 'config',
};`);
});
});
});
function getModuleExportsObject(mod, index = 0) {
return mod.$ast.body[index]
.expression.right;
}
//# sourceMappingURL=metro.test.js.map