Skip to content

Commit 28449b3

Browse files
committed
bump plugin to 3.2.0
1 parent 85a8e11 commit 28449b3

File tree

4 files changed

+103
-88
lines changed

4 files changed

+103
-88
lines changed

packages/sveltekit/package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99
"engines": {
1010
"node": ">=18"
1111
},
12-
"files": [
13-
"/build"
14-
],
12+
"files": ["/build"],
1513
"main": "build/cjs/index.server.js",
1614
"module": "build/esm/index.server.js",
1715
"browser": "build/esm/index.client.js",
@@ -44,7 +42,7 @@
4442
"@sentry/node": "9.1.0",
4543
"@sentry/opentelemetry": "9.1.0",
4644
"@sentry/svelte": "9.1.0",
47-
"@sentry/vite-plugin": "2.22.6",
45+
"@sentry/vite-plugin": "3.2.0",
4846
"magic-string": "0.30.7",
4947
"magicast": "0.2.8",
5048
"sorcery": "1.0.0"

packages/sveltekit/src/vite/sourceMaps.ts

Lines changed: 53 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
6161
},
6262
};
6363

64-
const { promise: filesToDeleteAfterUpload, resolve: reportFilesToDeleteAfterUpload } =
64+
const { promise: filesToDeleteAfterUpload, resolve: resolveFilesToDeleteAfterUpload } =
6565
createFilesToDeleteAfterUploadPromise();
6666

6767
const mergedOptions = {
@@ -99,6 +99,10 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
9999
console.warn(
100100
'sentry-vite-debug-id-upload-plugin not found in sentryPlugins! Cannot modify plugin - returning default Sentry Vite plugins',
101101
);
102+
103+
// resolving filesToDeleteAfterUpload here, because we return the original deletion plugin which awaits the promise
104+
resolveFilesToDeleteAfterUpload(undefined);
105+
102106
return sentryPlugins;
103107
}
104108

@@ -108,6 +112,10 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
108112
console.warn(
109113
'sentry-file-deletion-plugin not found in sentryPlugins! Cannot modify plugin - returning default Sentry Vite plugins',
110114
);
115+
116+
// resolving filesToDeleteAfterUpload here, because we return the original deletion plugin which awaits the promise
117+
resolveFilesToDeleteAfterUpload(undefined);
118+
111119
return sentryPlugins;
112120
}
113121

@@ -117,6 +125,10 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
117125
console.warn(
118126
'sentry-release-management-plugin not found in sentryPlugins! Cannot modify plugin - returning default Sentry Vite plugins',
119127
);
128+
129+
// resolving filesToDeleteAfterUpload here, because we return the original deletion plugin which awaits the promise
130+
resolveFilesToDeleteAfterUpload(undefined);
131+
120132
return sentryPlugins;
121133
}
122134

@@ -141,11 +153,13 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
141153
const sourceMapSettingsPlugin: Plugin = {
142154
name: 'sentry-sveltekit-update-source-map-setting-plugin',
143155
apply: 'build', // only apply this plugin at build time
144-
config: (config: UserConfig) => {
156+
config: async (config: UserConfig) => {
145157
const settingKey = 'build.sourcemap';
146158

147159
const { updatedSourceMapSetting, previousSourceMapSetting } = getUpdatedSourceMapSetting(config);
148160

161+
const userProvidedFilesToDeleteAfterUpload = await options?.sourcemaps?.filesToDeleteAfterUpload;
162+
149163
if (previousSourceMapSetting === 'unset') {
150164
consoleSandbox(() => {
151165
// eslint-disable-next-line no-console
@@ -157,24 +171,30 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
157171
// dir which could be a non-hidden directory, like `build` for the Node adapter.
158172
const defaultFileDeletionGlob = ['./.*/**/*.map', `./${adapterOutputDir}/**/*.map`];
159173

160-
consoleSandbox(() => {
161-
// eslint-disable-next-line no-console
162-
console.warn(
163-
`[Sentry] Automatically setting \`sourceMapsUploadOptions.sourcemaps.filesToDeleteAfterUpload: [${defaultFileDeletionGlob
164-
.map(file => `"${file}"`)
165-
.join(', ')}]\` to delete generated source maps after they were uploaded to Sentry.`,
166-
);
167-
});
174+
if (userProvidedFilesToDeleteAfterUpload) {
175+
resolveFilesToDeleteAfterUpload(userProvidedFilesToDeleteAfterUpload);
176+
} else {
177+
consoleSandbox(() => {
178+
// eslint-disable-next-line no-console
179+
console.warn(
180+
`[Sentry] Automatically setting \`sourceMapsUploadOptions.sourcemaps.filesToDeleteAfterUpload: [${defaultFileDeletionGlob
181+
.map(file => `"${file}"`)
182+
.join(', ')}]\` to delete generated source maps after they were uploaded to Sentry.`,
183+
);
184+
});
168185

169-
// In case we enabled source map, we also want to delete them.
170-
// So either use the glob(s) that users specified, or the default one!
171-
reportFilesToDeleteAfterUpload(options?.sourcemaps?.filesToDeleteAfterUpload ?? defaultFileDeletionGlob);
186+
// In case we enabled source map, we also want to delete them.
187+
// So either use the glob(s) that users specified, or the default one!
188+
resolveFilesToDeleteAfterUpload(defaultFileDeletionGlob);
189+
}
172190

173191
return {
174192
...config,
175193
build: { ...config.build, sourcemap: updatedSourceMapSetting },
176194
};
177-
} else if (previousSourceMapSetting === 'disabled') {
195+
}
196+
197+
if (previousSourceMapSetting === 'disabled') {
178198
consoleSandbox(() => {
179199
// eslint-disable-next-line no-console
180200
console.warn(
@@ -186,13 +206,13 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
186206
consoleSandbox(() => {
187207
// eslint-disable-next-line no-console
188208
console.log(
189-
`[Sentry] We discovered you enabled source map generation in your Vite configuration (\`${settingKey}\`). Sentry will keep this source map setting. This will un-minify the code snippet on the Sentry Issue page.`,
209+
`[Sentry] We discovered you enabled source map generation in your Vite configuration (\`${settingKey}\`). Sentry will keep this source map setting. This will un-minify the code snippet on the Sentry Issue page.`,
190210
);
191211
});
192212
}
193213
}
194214

195-
reportFilesToDeleteAfterUpload(options?.sourcemaps?.filesToDeleteAfterUpload);
215+
resolveFilesToDeleteAfterUpload(userProvidedFilesToDeleteAfterUpload);
196216

197217
return config;
198218
},
@@ -345,7 +365,7 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
345365
const outDir = path.resolve(process.cwd(), adapterOutputDir);
346366
try {
347367
// @ts-expect-error - the writeBundle hook expects two args we can't pass in here (they're only available in `writeBundle`)
348-
await writeBundleFn({ dir: outDir, _sentryFilesToDelete });
368+
await writeBundleFn({ dir: outDir });
349369
} catch (e) {
350370
// eslint-disable-next-line no-console
351371
console.warn('Failed to delete source maps:', e);
@@ -381,7 +401,7 @@ export async function makeCustomSentryVitePlugins(options?: CustomSentryVitePlug
381401
/**
382402
* Whether the user enabled (true, 'hidden', 'inline') or disabled (false) source maps
383403
*/
384-
export type UserSourceMapSetting = 'enabled' | 'disabled' | 'unset' | undefined;
404+
type UserSourceMapSetting = 'enabled' | 'disabled' | 'unset' | undefined;
385405

386406
/** There are 3 ways to set up source map generation (https://github.com/getsentry/sentry-javascript/issues/13993)
387407
*
@@ -403,25 +423,25 @@ export function getUpdatedSourceMapSetting(viteConfig: {
403423
sourcemap?: boolean | 'inline' | 'hidden';
404424
};
405425
}): { updatedSourceMapSetting: boolean | 'inline' | 'hidden'; previousSourceMapSetting: UserSourceMapSetting } {
406-
let previousSourceMapSetting: UserSourceMapSetting;
407-
let updatedSourceMapSetting: boolean | 'inline' | 'hidden' | undefined;
408-
409426
viteConfig.build = viteConfig.build || {};
410427

411-
const viteSourceMap = viteConfig.build.sourcemap;
412-
413-
if (viteSourceMap === false) {
414-
previousSourceMapSetting = 'disabled';
415-
updatedSourceMapSetting = viteSourceMap;
416-
} else if (viteSourceMap && ['hidden', 'inline', true].includes(viteSourceMap)) {
417-
previousSourceMapSetting = 'enabled';
418-
updatedSourceMapSetting = viteSourceMap;
419-
} else {
420-
previousSourceMapSetting = 'unset';
421-
updatedSourceMapSetting = 'hidden';
428+
const originalSourcemapSetting = viteConfig.build.sourcemap;
429+
430+
if (originalSourcemapSetting === false) {
431+
return {
432+
previousSourceMapSetting: 'disabled',
433+
updatedSourceMapSetting: originalSourcemapSetting,
434+
};
422435
}
423436

424-
return { previousSourceMapSetting, updatedSourceMapSetting };
437+
if (originalSourcemapSetting && ['hidden', 'inline', true].includes(originalSourcemapSetting)) {
438+
return { previousSourceMapSetting: 'enabled', updatedSourceMapSetting: originalSourcemapSetting };
439+
}
440+
441+
return {
442+
previousSourceMapSetting: 'unset',
443+
updatedSourceMapSetting: 'hidden',
444+
};
425445
}
426446

427447
function getFiles(dir: string): string[] {

packages/sveltekit/test/vite/sourceMaps.test.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { beforeEach, describe, expect, it, vi } from 'vitest';
2-
import { makeCustomSentryVitePlugins } from '../../src/vite/sourceMaps';
2+
import { getUpdatedSourceMapSetting, makeCustomSentryVitePlugins } from '../../src/vite/sourceMaps';
33

44
import type { Plugin } from 'vite';
55

@@ -113,7 +113,7 @@ describe('makeCustomSentryVitePlugins()', () => {
113113
const plugin = await getSentryViteSubPlugin('sentry-sveltekit-update-source-map-setting-plugin');
114114

115115
// @ts-expect-error this function exists!
116-
const sentryConfig = plugin.config(originalConfig);
116+
const sentryConfig = await plugin.config(originalConfig);
117117

118118
expect(sentryConfig).toEqual(originalConfig);
119119
});
@@ -132,7 +132,7 @@ describe('makeCustomSentryVitePlugins()', () => {
132132
const plugin = await getSentryViteSubPlugin('sentry-sveltekit-update-source-map-setting-plugin');
133133

134134
// @ts-expect-error this function exists!
135-
const sentryConfig = plugin.config(originalConfig);
135+
const sentryConfig = await plugin.config(originalConfig);
136136

137137
expect(sentryConfig).toEqual({
138138
build: {
@@ -155,7 +155,7 @@ describe('makeCustomSentryVitePlugins()', () => {
155155

156156
const plugin = await getSentryViteSubPlugin('sentry-sveltekit-update-source-map-setting-plugin');
157157
// @ts-expect-error this function exists!
158-
const sentryConfig = plugin.config(originalConfig);
158+
const sentryConfig = await plugin.config(originalConfig);
159159
expect(sentryConfig).toEqual({
160160
...originalConfig,
161161
build: {
@@ -320,22 +320,23 @@ describe('makeCustomSentryVitePlugins()', () => {
320320
describe('changeViteSourceMapSettings()', () => {
321321
const cases = [
322322
{ sourcemap: false, expectedSourcemap: false, expectedPrevious: 'disabled' },
323-
{ sourcemap: 'hidden', expectedSourcemap: 'hidden', expectedPrevious: 'enabled' },
324-
{ sourcemap: 'inline', expectedSourcemap: 'inline', expectedPrevious: 'enabled' },
323+
{ sourcemap: 'hidden' as const, expectedSourcemap: 'hidden', expectedPrevious: 'enabled' },
324+
{ sourcemap: 'inline' as const, expectedSourcemap: 'inline', expectedPrevious: 'enabled' },
325325
{ sourcemap: true, expectedSourcemap: true, expectedPrevious: 'enabled' },
326326
{ sourcemap: undefined, expectedSourcemap: 'hidden', expectedPrevious: 'unset' },
327327
];
328328

329-
it.each(cases)('handles vite source map settings $1', async ({ sourcemap, expectedSourcemap, expectedPrevious }) => {
330-
const viteConfig = { build: { sourcemap } };
329+
it.each(cases)(
330+
'handles vite source map setting `build.sourcemap: $sourcemap`',
331+
async ({ sourcemap, expectedSourcemap, expectedPrevious }) => {
332+
const viteConfig = { build: { sourcemap } };
331333

332-
const { getUpdatedSourceMapSetting } = await import('../../src/vite/sourceMaps');
334+
const result = getUpdatedSourceMapSetting(viteConfig);
333335

334-
const result = getUpdatedSourceMapSetting(viteConfig);
335-
336-
expect(result).toEqual({
337-
updatedSourceMapSetting: expectedSourcemap,
338-
previousSourceMapSetting: expectedPrevious,
339-
});
340-
});
336+
expect(result).toEqual({
337+
updatedSourceMapSetting: expectedSourcemap,
338+
previousSourceMapSetting: expectedPrevious,
339+
});
340+
},
341+
);
341342
});

yarn.lock

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6592,6 +6592,11 @@
65926592
resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.1.2.tgz#5497ca5adbe775955e96c566511a0bed3ab0a3ce"
65936593
integrity sha512-5h2WXRJ6swKA0TwxHHryC8M2QyOfS9QhTAL6ElPfkEYe9HhJieXmxsDpyspbqAa26ccnCUcmwE5vL34jAjt4sQ==
65946594

6595+
"@sentry/babel-plugin-component-annotate@3.2.0":
6596+
version "3.2.0"
6597+
resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.2.0.tgz#17c000cf6cc315bb620eddbd95c88dfb2471cfb9"
6598+
integrity sha512-Sg7nLRP1yiJYl/KdGGxYGbjvLq5rswyeB5yESgfWX34XUNZaFgmNvw4pU/QEKVeYgcPyOulgJ+y80ewujyffTA==
6599+
65956600
"@sentry/bundler-plugin-core@2.22.6":
65966601
version "2.22.6"
65976602
resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.6.tgz#a1ea1fd43700a3ece9e7db016997e79a2782b87d"
@@ -6620,6 +6625,20 @@
66206625
magic-string "0.30.8"
66216626
unplugin "1.0.1"
66226627

6628+
"@sentry/bundler-plugin-core@3.2.0":
6629+
version "3.2.0"
6630+
resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.2.0.tgz#023ec92530a35fbec7c7077b7a8be2e79f0f9dd5"
6631+
integrity sha512-Q/ogVylue3XaFawyIxzuiic+7Dp4w63eJtRtVH8VBebNURyJ/re4GVoP1QNGccE1R243tXY1y2GiwqiJkAONOg==
6632+
dependencies:
6633+
"@babel/core" "^7.18.5"
6634+
"@sentry/babel-plugin-component-annotate" "3.2.0"
6635+
"@sentry/cli" "2.41.1"
6636+
dotenv "^16.3.1"
6637+
find-up "^5.0.0"
6638+
glob "^9.3.2"
6639+
magic-string "0.30.8"
6640+
unplugin "1.0.1"
6641+
66236642
"@sentry/cli-darwin@2.41.1":
66246643
version "2.41.1"
66256644
resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.41.1.tgz#ca7e12bf1ad59bc2df35868ae98abc8869108efa"
@@ -6690,6 +6709,14 @@
66906709
"@sentry/bundler-plugin-core" "2.22.6"
66916710
unplugin "1.0.1"
66926711

6712+
"@sentry/vite-plugin@3.2.0":
6713+
version "3.2.0"
6714+
resolved "https://registry.yarnpkg.com/@sentry/vite-plugin/-/vite-plugin-3.2.0.tgz#0785b6e04e0aed8a4d6b57a433a2da11c14e6cd0"
6715+
integrity sha512-IVBoAzZmpoX9+mnmIMq2ndxlFPoWMuYSE5Mek5zOWpYh+GbPxvkrxvM+vg0HeLH4r5v9Tm0FWcEZDgDIZqtoSg==
6716+
dependencies:
6717+
"@sentry/bundler-plugin-core" "3.2.0"
6718+
unplugin "1.0.1"
6719+
66936720
"@sentry/webpack-plugin@3.1.2":
66946721
version "3.1.2"
66956722
resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-3.1.2.tgz#e7cf2b10b6d2fb2d6106e692469d02b6ab684bba"
@@ -7903,12 +7930,7 @@
79037930
dependencies:
79047931
"@types/unist" "*"
79057932

7906-
"@types/history-4@npm:@types/history@4.7.8":
7907-
version "4.7.8"
7908-
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934"
7909-
integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==
7910-
7911-
"@types/history-5@npm:@types/history@4.7.8":
7933+
"@types/history-4@npm:@types/history@4.7.8", "@types/history-5@npm:@types/history@4.7.8":
79127934
version "4.7.8"
79137935
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934"
79147936
integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==
@@ -27443,16 +27465,7 @@ string-template@~0.2.1:
2744327465
resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
2744427466
integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
2744527467

27446-
"string-width-cjs@npm:string-width@^4.2.0":
27447-
version "4.2.3"
27448-
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
27449-
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
27450-
dependencies:
27451-
emoji-regex "^8.0.0"
27452-
is-fullwidth-code-point "^3.0.0"
27453-
strip-ansi "^6.0.1"
27454-
27455-
string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
27468+
"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
2745627469
version "4.2.3"
2745727470
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
2745827471
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -27555,14 +27568,7 @@ stringify-object@^3.2.1:
2755527568
is-obj "^1.0.1"
2755627569
is-regexp "^1.0.0"
2755727570

27558-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
27559-
version "6.0.1"
27560-
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
27561-
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
27562-
dependencies:
27563-
ansi-regex "^5.0.1"
27564-
27565-
strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1:
27571+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1:
2756627572
version "6.0.1"
2756727573
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
2756827574
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -27727,7 +27733,6 @@ stylus@0.59.0, stylus@^0.59.0:
2772727733

2772827734
sucrase@^3.27.0, sucrase@^3.35.0, sucrase@getsentry/sucrase#es2020-polyfills:
2772927735
version "3.36.0"
27730-
uid fd682f6129e507c00bb4e6319cc5d6b767e36061
2773127736
resolved "https://codeload.github.com/getsentry/sucrase/tar.gz/fd682f6129e507c00bb4e6319cc5d6b767e36061"
2773227737
dependencies:
2773327738
"@jridgewell/gen-mapping" "^0.3.2"
@@ -30363,16 +30368,7 @@ wrangler@^3.67.1:
3036330368
optionalDependencies:
3036430369
fsevents "~2.3.2"
3036530370

30366-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
30367-
version "7.0.0"
30368-
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
30369-
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
30370-
dependencies:
30371-
ansi-styles "^4.0.0"
30372-
string-width "^4.1.0"
30373-
strip-ansi "^6.0.0"
30374-
30375-
wrap-ansi@7.0.0, wrap-ansi@^7.0.0:
30371+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^7.0.0:
3037630372
version "7.0.0"
3037730373
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
3037830374
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==

0 commit comments

Comments
 (0)