@sentry/react 10.37.0 → 10.39.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/hoist-non-react-statics.js +4 -4
- package/build/cjs/hoist-non-react-statics.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/instrumentation.js +67 -35
- package/build/cjs/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/lazy-routes.js +19 -10
- package/build/cjs/reactrouter-compat-utils/lazy-routes.js.map +1 -1
- package/build/cjs/reactrouter-compat-utils/route-manifest.js +194 -0
- package/build/cjs/reactrouter-compat-utils/route-manifest.js.map +1 -0
- package/build/cjs/reactrouter-compat-utils/utils.js +16 -31
- package/build/cjs/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/esm/hoist-non-react-statics.js +4 -4
- package/build/esm/hoist-non-react-statics.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/reactrouter-compat-utils/instrumentation.js +68 -36
- package/build/esm/reactrouter-compat-utils/instrumentation.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/lazy-routes.js +20 -11
- package/build/esm/reactrouter-compat-utils/lazy-routes.js.map +1 -1
- package/build/esm/reactrouter-compat-utils/route-manifest.js +191 -0
- package/build/esm/reactrouter-compat-utils/route-manifest.js.map +1 -0
- package/build/esm/reactrouter-compat-utils/utils.js +12 -27
- package/build/esm/reactrouter-compat-utils/utils.js.map +1 -1
- package/build/esm/reactrouter.js +1 -1
- package/build/esm/reactrouterv6.js +1 -1
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts +18 -0
- package/build/types/reactrouter-compat-utils/instrumentation.d.ts.map +1 -1
- package/build/types/reactrouter-compat-utils/lazy-routes.d.ts.map +1 -1
- package/build/types/reactrouter-compat-utils/route-manifest.d.ts +13 -0
- package/build/types/reactrouter-compat-utils/route-manifest.d.ts.map +1 -0
- package/build/types/reactrouter-compat-utils/utils.d.ts +1 -1
- package/build/types/reactrouter-compat-utils/utils.d.ts.map +1 -1
- package/build/types-ts3.8/reactrouter-compat-utils/instrumentation.d.ts +18 -0
- package/build/types-ts3.8/reactrouter-compat-utils/route-manifest.d.ts +13 -0
- package/build/types-ts3.8/reactrouter-compat-utils/utils.d.ts +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const core = require('@sentry/core');
|
|
4
|
+
const debugBuild = require('../debug-build.js');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Strip the basename from a pathname if exists.
|
|
8
|
+
*
|
|
9
|
+
* Vendored and modified from `react-router`
|
|
10
|
+
* https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038
|
|
11
|
+
*/
|
|
12
|
+
function stripBasenameFromPathname(pathname, basename) {
|
|
13
|
+
if (!basename || basename === '/') {
|
|
14
|
+
return pathname;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {
|
|
18
|
+
return pathname;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// We want to leave trailing slash behavior in the user's control, so if they
|
|
22
|
+
// specify a basename with a trailing slash, we should support it
|
|
23
|
+
const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;
|
|
24
|
+
const nextChar = pathname.charAt(startIndex);
|
|
25
|
+
if (nextChar && nextChar !== '/') {
|
|
26
|
+
// pathname does not start with basename/
|
|
27
|
+
return pathname;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return pathname.slice(startIndex) || '/';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Cache for sorted manifests - keyed by manifest array reference
|
|
34
|
+
const SORTED_MANIFEST_CACHE = new WeakMap();
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Matches a pathname against a route manifest and returns the matching pattern.
|
|
38
|
+
* Optionally strips a basename prefix before matching.
|
|
39
|
+
*/
|
|
40
|
+
function matchRouteManifest(pathname, manifest, basename) {
|
|
41
|
+
if (!pathname || !manifest || !manifest.length) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const normalizedPathname = basename ? stripBasenameFromPathname(pathname, basename) : pathname;
|
|
46
|
+
|
|
47
|
+
let sorted = SORTED_MANIFEST_CACHE.get(manifest);
|
|
48
|
+
if (!sorted) {
|
|
49
|
+
sorted = sortBySpecificity(manifest);
|
|
50
|
+
SORTED_MANIFEST_CACHE.set(manifest, sorted);
|
|
51
|
+
debugBuild.DEBUG_BUILD && core.debug.log('[React Router] Sorted route manifest by specificity:', sorted.length, 'patterns');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
for (const pattern of sorted) {
|
|
55
|
+
if (matchesPattern(normalizedPathname, pattern)) {
|
|
56
|
+
debugBuild.DEBUG_BUILD && core.debug.log('[React Router] Matched pathname', normalizedPathname, 'to pattern', pattern);
|
|
57
|
+
return pattern;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
debugBuild.DEBUG_BUILD && core.debug.log('[React Router] No manifest match found for pathname:', normalizedPathname);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Checks if a pathname matches a route pattern.
|
|
67
|
+
*/
|
|
68
|
+
function matchesPattern(pathname, pattern) {
|
|
69
|
+
// Handle root path special case
|
|
70
|
+
if (pattern === '/') {
|
|
71
|
+
return pathname === '/' || pathname === '';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const pathSegments = splitPath(pathname);
|
|
75
|
+
const patternSegments = splitPath(pattern);
|
|
76
|
+
|
|
77
|
+
// Handle wildcard at end
|
|
78
|
+
const hasWildcard = patternSegments.length > 0 && patternSegments[patternSegments.length - 1] === '*';
|
|
79
|
+
|
|
80
|
+
if (hasWildcard) {
|
|
81
|
+
// Pattern with wildcard: path must have at least as many segments as pattern (minus wildcard)
|
|
82
|
+
const patternSegmentsWithoutWildcard = patternSegments.slice(0, -1);
|
|
83
|
+
if (pathSegments.length < patternSegmentsWithoutWildcard.length) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
for (const [i, patternSegment] of patternSegmentsWithoutWildcard.entries()) {
|
|
87
|
+
if (!segmentMatches(pathSegments[i], patternSegment)) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Exact segment count match required
|
|
95
|
+
if (pathSegments.length !== patternSegments.length) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
for (const [i, patternSegment] of patternSegments.entries()) {
|
|
100
|
+
if (!segmentMatches(pathSegments[i], patternSegment)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Checks if a path segment matches a pattern segment.
|
|
110
|
+
*/
|
|
111
|
+
function segmentMatches(pathSegment, patternSegment) {
|
|
112
|
+
if (pathSegment === undefined || patternSegment === undefined) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
// Parameter matches anything
|
|
116
|
+
if (PARAM_RE.test(patternSegment)) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
// Literal must match exactly
|
|
120
|
+
return pathSegment === patternSegment;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Splits a path into segments, filtering out empty strings.
|
|
125
|
+
*/
|
|
126
|
+
function splitPath(path) {
|
|
127
|
+
return path.split('/').filter(Boolean);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* React Router scoring weights and param detection.
|
|
132
|
+
* https://github.com/remix-run/react-router/blob/main/packages/react-router/lib/router/utils.ts
|
|
133
|
+
*/
|
|
134
|
+
const PARAM_RE = /^:[\w-]+$/;
|
|
135
|
+
const STATIC_SEGMENT_SCORE = 10;
|
|
136
|
+
const DYNAMIC_SEGMENT_SCORE = 3;
|
|
137
|
+
const EMPTY_SEGMENT_SCORE = 1;
|
|
138
|
+
const SPLAT_PENALTY = -2;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Computes a specificity score for a route pattern.
|
|
142
|
+
* Matches React Router's computeScore() algorithm exactly.
|
|
143
|
+
*/
|
|
144
|
+
function computeScore(pattern) {
|
|
145
|
+
const segments = pattern.split('/');
|
|
146
|
+
|
|
147
|
+
// Base score is segment count (including empty segment from leading slash)
|
|
148
|
+
let score = segments.length;
|
|
149
|
+
|
|
150
|
+
// Apply splat penalty once if pattern contains wildcard
|
|
151
|
+
if (segments.includes('*')) {
|
|
152
|
+
score += SPLAT_PENALTY;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
for (const segment of segments) {
|
|
156
|
+
if (segment === '*') {
|
|
157
|
+
// Splat penalty already applied globally above
|
|
158
|
+
continue;
|
|
159
|
+
} else if (PARAM_RE.test(segment)) {
|
|
160
|
+
score += DYNAMIC_SEGMENT_SCORE;
|
|
161
|
+
} else if (segment === '') {
|
|
162
|
+
score += EMPTY_SEGMENT_SCORE;
|
|
163
|
+
} else {
|
|
164
|
+
score += STATIC_SEGMENT_SCORE;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return score;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Sorts route patterns by specificity (most specific first).
|
|
173
|
+
* Implements React Router's ranking algorithm from computeScore():
|
|
174
|
+
* https://github.com/remix-run/react-router/blob/main/packages/react-router/lib/router/utils.ts
|
|
175
|
+
*
|
|
176
|
+
* React Router scoring: base=segments.length, static=+10, dynamic=+3, empty=+1, splat=-2 (once)
|
|
177
|
+
* Higher score = more specific pattern.
|
|
178
|
+
* Equal scores preserve manifest order (same as React Router).
|
|
179
|
+
*
|
|
180
|
+
* Note: Users should order their manifest from most specific to least specific
|
|
181
|
+
* when patterns have equal specificity (e.g., `/users/:id/settings` and `/:type/123/settings`).
|
|
182
|
+
*/
|
|
183
|
+
function sortBySpecificity(manifest) {
|
|
184
|
+
return [...manifest].sort((a, b) => {
|
|
185
|
+
const aScore = computeScore(a);
|
|
186
|
+
const bScore = computeScore(b);
|
|
187
|
+
|
|
188
|
+
return bScore - aScore;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
exports.matchRouteManifest = matchRouteManifest;
|
|
193
|
+
exports.stripBasenameFromPathname = stripBasenameFromPathname;
|
|
194
|
+
//# sourceMappingURL=route-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-manifest.js","sources":["../../../src/reactrouter-compat-utils/route-manifest.ts"],"sourcesContent":["import { debug } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nexport function stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\n}\n\n// Cache for sorted manifests - keyed by manifest array reference\nconst SORTED_MANIFEST_CACHE = new WeakMap<string[], string[]>();\n\n/**\n * Matches a pathname against a route manifest and returns the matching pattern.\n * Optionally strips a basename prefix before matching.\n */\nexport function matchRouteManifest(pathname: string, manifest: string[], basename?: string): string | null {\n if (!pathname || !manifest || !manifest.length) {\n return null;\n }\n\n const normalizedPathname = basename ? stripBasenameFromPathname(pathname, basename) : pathname;\n\n let sorted = SORTED_MANIFEST_CACHE.get(manifest);\n if (!sorted) {\n sorted = sortBySpecificity(manifest);\n SORTED_MANIFEST_CACHE.set(manifest, sorted);\n DEBUG_BUILD && debug.log('[React Router] Sorted route manifest by specificity:', sorted.length, 'patterns');\n }\n\n for (const pattern of sorted) {\n if (matchesPattern(normalizedPathname, pattern)) {\n DEBUG_BUILD && debug.log('[React Router] Matched pathname', normalizedPathname, 'to pattern', pattern);\n return pattern;\n }\n }\n\n DEBUG_BUILD && debug.log('[React Router] No manifest match found for pathname:', normalizedPathname);\n return null;\n}\n\n/**\n * Checks if a pathname matches a route pattern.\n */\nfunction matchesPattern(pathname: string, pattern: string): boolean {\n // Handle root path special case\n if (pattern === '/') {\n return pathname === '/' || pathname === '';\n }\n\n const pathSegments = splitPath(pathname);\n const patternSegments = splitPath(pattern);\n\n // Handle wildcard at end\n const hasWildcard = patternSegments.length > 0 && patternSegments[patternSegments.length - 1] === '*';\n\n if (hasWildcard) {\n // Pattern with wildcard: path must have at least as many segments as pattern (minus wildcard)\n const patternSegmentsWithoutWildcard = patternSegments.slice(0, -1);\n if (pathSegments.length < patternSegmentsWithoutWildcard.length) {\n return false;\n }\n for (const [i, patternSegment] of patternSegmentsWithoutWildcard.entries()) {\n if (!segmentMatches(pathSegments[i], patternSegment)) {\n return false;\n }\n }\n return true;\n }\n\n // Exact segment count match required\n if (pathSegments.length !== patternSegments.length) {\n return false;\n }\n\n for (const [i, patternSegment] of patternSegments.entries()) {\n if (!segmentMatches(pathSegments[i], patternSegment)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Checks if a path segment matches a pattern segment.\n */\nfunction segmentMatches(pathSegment: string | undefined, patternSegment: string | undefined): boolean {\n if (pathSegment === undefined || patternSegment === undefined) {\n return false;\n }\n // Parameter matches anything\n if (PARAM_RE.test(patternSegment)) {\n return true;\n }\n // Literal must match exactly\n return pathSegment === patternSegment;\n}\n\n/**\n * Splits a path into segments, filtering out empty strings.\n */\nfunction splitPath(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\n/**\n * React Router scoring weights and param detection.\n * https://github.com/remix-run/react-router/blob/main/packages/react-router/lib/router/utils.ts\n */\nconst PARAM_RE = /^:[\\w-]+$/;\nconst STATIC_SEGMENT_SCORE = 10;\nconst DYNAMIC_SEGMENT_SCORE = 3;\nconst EMPTY_SEGMENT_SCORE = 1;\nconst SPLAT_PENALTY = -2;\n\n/**\n * Computes a specificity score for a route pattern.\n * Matches React Router's computeScore() algorithm exactly.\n */\nfunction computeScore(pattern: string): number {\n const segments = pattern.split('/');\n\n // Base score is segment count (including empty segment from leading slash)\n let score = segments.length;\n\n // Apply splat penalty once if pattern contains wildcard\n if (segments.includes('*')) {\n score += SPLAT_PENALTY;\n }\n\n for (const segment of segments) {\n if (segment === '*') {\n // Splat penalty already applied globally above\n continue;\n } else if (PARAM_RE.test(segment)) {\n score += DYNAMIC_SEGMENT_SCORE;\n } else if (segment === '') {\n score += EMPTY_SEGMENT_SCORE;\n } else {\n score += STATIC_SEGMENT_SCORE;\n }\n }\n\n return score;\n}\n\n/**\n * Sorts route patterns by specificity (most specific first).\n * Implements React Router's ranking algorithm from computeScore():\n * https://github.com/remix-run/react-router/blob/main/packages/react-router/lib/router/utils.ts\n *\n * React Router scoring: base=segments.length, static=+10, dynamic=+3, empty=+1, splat=-2 (once)\n * Higher score = more specific pattern.\n * Equal scores preserve manifest order (same as React Router).\n *\n * Note: Users should order their manifest from most specific to least specific\n * when patterns have equal specificity (e.g., `/users/:id/settings` and `/:type/123/settings`).\n */\nfunction sortBySpecificity(manifest: string[]): string[] {\n return [...manifest].sort((a, b) => {\n const aScore = computeScore(a);\n const bScore = computeScore(b);\n\n return bScore - aScore;\n });\n}\n"],"names":["DEBUG_BUILD","debug"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2
2
|
|
|
3
3
|
const core = require('@sentry/core');
|
|
4
4
|
const debugBuild = require('../debug-build.js');
|
|
5
|
+
const routeManifest = require('./route-manifest.js');
|
|
5
6
|
|
|
6
7
|
// Global variables that these utilities depend on
|
|
7
8
|
let _matchRoutes;
|
|
@@ -102,7 +103,7 @@ function sendIndexPath(pathBuilder, pathname, basename) {
|
|
|
102
103
|
pathBuilder && pathBuilder.length > 0
|
|
103
104
|
? pathBuilder
|
|
104
105
|
: _stripBasename
|
|
105
|
-
? stripBasenameFromPathname(pathname, basename)
|
|
106
|
+
? routeManifest.stripBasenameFromPathname(pathname, basename)
|
|
106
107
|
: pathname;
|
|
107
108
|
|
|
108
109
|
let formattedPath =
|
|
@@ -129,33 +130,6 @@ function getNumberOfUrlSegments(url) {
|
|
|
129
130
|
return url.split(/\\?\//).filter(s => s.length > 0 && s !== ',').length;
|
|
130
131
|
}
|
|
131
132
|
|
|
132
|
-
/**
|
|
133
|
-
* Strip the basename from a pathname if exists.
|
|
134
|
-
*
|
|
135
|
-
* Vendored and modified from `react-router`
|
|
136
|
-
* https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038
|
|
137
|
-
*/
|
|
138
|
-
function stripBasenameFromPathname(pathname, basename) {
|
|
139
|
-
if (!basename || basename === '/') {
|
|
140
|
-
return pathname;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {
|
|
144
|
-
return pathname;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// We want to leave trailing slash behavior in the user's control, so if they
|
|
148
|
-
// specify a basename with a trailing slash, we should support it
|
|
149
|
-
const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;
|
|
150
|
-
const nextChar = pathname.charAt(startIndex);
|
|
151
|
-
if (nextChar && nextChar !== '/') {
|
|
152
|
-
// pathname does not start with basename/
|
|
153
|
-
return pathname;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return pathname.slice(startIndex) || '/';
|
|
157
|
-
}
|
|
158
|
-
|
|
159
133
|
// Exported utility functions
|
|
160
134
|
|
|
161
135
|
/**
|
|
@@ -178,7 +152,7 @@ function rebuildRoutePathFromAllRoutes(allRoutes, location) {
|
|
|
178
152
|
for (const match of matchedRoutes) {
|
|
179
153
|
if (match.route.path && match.route.path !== '*') {
|
|
180
154
|
const path = pickPath(match);
|
|
181
|
-
const strippedPath = stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));
|
|
155
|
+
const strippedPath = routeManifest.stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));
|
|
182
156
|
|
|
183
157
|
if (location.pathname === strippedPath) {
|
|
184
158
|
return trimSlash(strippedPath);
|
|
@@ -222,7 +196,7 @@ function locationIsInsideDescendantRoute(location, routes) {
|
|
|
222
196
|
* Returns a fallback transaction name from location pathname.
|
|
223
197
|
*/
|
|
224
198
|
function getFallbackTransactionName(location, basename) {
|
|
225
|
-
return _stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';
|
|
199
|
+
return _stripBasename ? routeManifest.stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';
|
|
226
200
|
}
|
|
227
201
|
|
|
228
202
|
/**
|
|
@@ -235,7 +209,7 @@ function getNormalizedName(
|
|
|
235
209
|
basename = '',
|
|
236
210
|
) {
|
|
237
211
|
if (!routes || routes.length === 0) {
|
|
238
|
-
return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];
|
|
212
|
+
return [_stripBasename ? routeManifest.stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];
|
|
239
213
|
}
|
|
240
214
|
|
|
241
215
|
if (!branches) {
|
|
@@ -298,7 +272,18 @@ function resolveRouteNameAndSource(
|
|
|
298
272
|
allRoutes,
|
|
299
273
|
branches,
|
|
300
274
|
basename = '',
|
|
275
|
+
lazyRouteManifest,
|
|
276
|
+
enableAsyncRouteHandlers,
|
|
301
277
|
) {
|
|
278
|
+
// When lazy route manifest is provided, use it as the primary source for transaction names
|
|
279
|
+
if (enableAsyncRouteHandlers && lazyRouteManifest && lazyRouteManifest.length > 0) {
|
|
280
|
+
const manifestMatch = routeManifest.matchRouteManifest(location.pathname, lazyRouteManifest, basename);
|
|
281
|
+
if (manifestMatch) {
|
|
282
|
+
return [(_stripBasename ? '' : basename) + manifestMatch, 'route'];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Fall back to React Router route matching
|
|
302
287
|
let name;
|
|
303
288
|
let source = 'url';
|
|
304
289
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"sourcesContent":["import type { Span, TransactionSource } from '@sentry/core';\nimport { debug, getActiveSpan, getRootSpan, spanToJSON } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Location, MatchRoutes, RouteMatch, RouteObject } from '../types';\n\n// Global variables that these utilities depend on\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\n// Navigation context stack for nested/concurrent patchRoutesOnNavigation calls.\n// Required because window.location hasn't updated yet when handlers are invoked.\ninterface NavigationContext {\n token: object;\n targetPath: string | undefined;\n span: Span | undefined;\n}\n\nconst _navigationContextStack: NavigationContext[] = [];\nconst MAX_CONTEXT_STACK_SIZE = 10;\n\n/**\n * Pushes a navigation context and returns a unique token for cleanup.\n * The token uses object identity for uniqueness (no counter needed).\n */\nexport function setNavigationContext(targetPath: string | undefined, span: Span | undefined): object {\n const token = {};\n // Prevent unbounded stack growth - oldest (likely stale) contexts are evicted first\n if (_navigationContextStack.length >= MAX_CONTEXT_STACK_SIZE) {\n DEBUG_BUILD && debug.warn('[React Router] Navigation context stack overflow - removing oldest context');\n _navigationContextStack.shift();\n }\n _navigationContextStack.push({ token, targetPath, span });\n return token;\n}\n\n/**\n * Clears the navigation context if it's on top of the stack (LIFO).\n * If our context is not on top (out-of-order completion), we leave it -\n * it will be cleaned up by overflow protection when the stack fills up.\n */\nexport function clearNavigationContext(token: object): void {\n const top = _navigationContextStack[_navigationContextStack.length - 1];\n if (top?.token === token) {\n _navigationContextStack.pop();\n }\n}\n\n/** Gets the current (most recent) navigation context if inside a patchRoutesOnNavigation call. */\nexport function getNavigationContext(): NavigationContext | null {\n const length = _navigationContextStack.length;\n // The `?? null` converts undefined (from array access) to null to match return type\n return length > 0 ? (_navigationContextStack[length - 1] ?? null) : null;\n}\n\n/**\n * Initialize function to set dependencies that the router utilities need.\n * Must be called before using any of the exported utility functions.\n */\nexport function initializeRouterUtils(matchRoutes: MatchRoutes, stripBasename: boolean = false): void {\n _matchRoutes = matchRoutes;\n _stripBasename = stripBasename;\n}\n\n// Helper functions\nfunction pickPath(match: RouteMatch): string {\n return trimWildcard(match.route.path || '');\n}\n\nfunction pickSplat(match: RouteMatch): string {\n return match.params['*'] || '';\n}\n\nfunction trimWildcard(path: string): string {\n return path[path.length - 1] === '*' ? path.slice(0, -1) : path;\n}\n\nfunction trimSlash(path: string): string {\n return path[path.length - 1] === '/' ? path.slice(0, -1) : path;\n}\n\n/**\n * Checks if a path ends with a wildcard character (*).\n */\nexport function pathEndsWithWildcard(path: string): boolean {\n return path.endsWith('*');\n}\n\n/** Checks if transaction name has wildcard (/* or ends with *). */\nexport function transactionNameHasWildcard(name: string): boolean {\n return name.includes('/*') || name.endsWith('*');\n}\n\n/**\n * Checks if a path is a wildcard and has child routes.\n */\nexport function pathIsWildcardAndHasChildren(path: string, branch: RouteMatch<string>): boolean {\n return (pathEndsWithWildcard(path) && !!branch.route.children?.length) || false;\n}\n\n/** Check if route is in descendant route (<Routes> within <Routes>) */\nexport function routeIsDescendant(route: RouteObject): boolean {\n return !!(!route.children && route.element && route.path?.endsWith('/*'));\n}\n\nfunction sendIndexPath(pathBuilder: string, pathname: string, basename: string): [string, TransactionSource] {\n const reconstructedPath =\n pathBuilder && pathBuilder.length > 0\n ? pathBuilder\n : _stripBasename\n ? stripBasenameFromPathname(pathname, basename)\n : pathname;\n\n let formattedPath =\n // If the path ends with a wildcard suffix, remove both the slash and the asterisk\n reconstructedPath.slice(-2) === '/*' ? reconstructedPath.slice(0, -2) : reconstructedPath;\n\n // If the path ends with a slash, remove it (but keep single '/')\n if (formattedPath.length > 1 && formattedPath[formattedPath.length - 1] === '/') {\n formattedPath = formattedPath.slice(0, -1);\n }\n\n return [formattedPath, 'route'];\n}\n\n/**\n * Returns the number of URL segments in the given URL string.\n * Splits at '/' or '\\/' to handle regex URLs correctly.\n *\n * @param url - The URL string to segment.\n * @returns The number of segments in the URL.\n */\nexport function getNumberOfUrlSegments(url: string): number {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n/**\n * Strip the basename from a pathname if exists.\n *\n * Vendored and modified from `react-router`\n * https://github.com/remix-run/react-router/blob/462bb712156a3f739d6139a0f14810b76b002df6/packages/router/utils.ts#L1038\n */\nfunction stripBasenameFromPathname(pathname: string, basename: string): string {\n if (!basename || basename === '/') {\n return pathname;\n }\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return pathname;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n const startIndex = basename.endsWith('/') ? basename.length - 1 : basename.length;\n const nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== '/') {\n // pathname does not start with basename/\n return pathname;\n }\n\n return pathname.slice(startIndex) || '/';\n}\n\n// Exported utility functions\n\n/**\n * Ensures a path string starts with a forward slash.\n */\nexport function prefixWithSlash(path: string): string {\n return path[0] === '/' ? path : `/${path}`;\n}\n\n/**\n * Rebuilds the route path from all available routes by matching against the current location.\n */\nexport function rebuildRoutePathFromAllRoutes(allRoutes: RouteObject[], location: Location): string {\n const matchedRoutes = _matchRoutes(allRoutes, location) as RouteMatch[];\n\n if (!matchedRoutes || matchedRoutes.length === 0) {\n return '';\n }\n\n for (const match of matchedRoutes) {\n if (match.route.path && match.route.path !== '*') {\n const path = pickPath(match);\n const strippedPath = stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));\n\n if (location.pathname === strippedPath) {\n return trimSlash(strippedPath);\n }\n\n return trimSlash(\n trimSlash(path || '') +\n prefixWithSlash(\n rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== match.route),\n {\n pathname: strippedPath,\n },\n ),\n ),\n );\n }\n }\n\n return '';\n}\n\n/**\n * Checks if the current location is inside a descendant route (route with splat parameter).\n */\nexport function locationIsInsideDescendantRoute(location: Location, routes: RouteObject[]): boolean {\n const matchedRoutes = _matchRoutes(routes, location) as RouteMatch[];\n\n if (matchedRoutes) {\n for (const match of matchedRoutes) {\n if (routeIsDescendant(match.route) && pickSplat(match)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Returns a fallback transaction name from location pathname.\n */\nfunction getFallbackTransactionName(location: Location, basename: string): string {\n return _stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';\n}\n\n/**\n * Gets a normalized route name and transaction source from the current routes and location.\n */\nexport function getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n }\n\n if (!branches) {\n return [getFallbackTransactionName(location, basename), 'url'];\n }\n\n let pathBuilder = '';\n\n for (const branch of branches) {\n const route = branch.route;\n if (!route) {\n continue;\n }\n\n // Early return for index routes\n if (route.index) {\n return sendIndexPath(pathBuilder, branch.pathname, basename);\n }\n\n const path = route.path;\n if (!path || pathIsWildcardAndHasChildren(path, branch)) {\n continue;\n }\n\n // Build the route path\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder = trimSlash(pathBuilder) + prefixWithSlash(newPath);\n\n // Check if this path matches the current location\n if (trimSlash(location.pathname) !== trimSlash(basename + branch.pathname)) {\n continue;\n }\n\n // Check if this is a parameterized route like /stores/:storeId/products/:productId\n if (\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n !pathEndsWithWildcard(pathBuilder)\n ) {\n return [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n\n // Handle wildcard routes with children - strip trailing wildcard\n if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {\n pathBuilder = pathBuilder.slice(0, -1);\n }\n\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n\n // Fallback when no matching route found\n return [getFallbackTransactionName(location, basename), 'url'];\n}\n\n/**\n * Shared helper function to resolve route name and source\n */\nexport function resolveRouteNameAndSource(\n location: Location,\n routes: RouteObject[],\n allRoutes: RouteObject[],\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n let name: string | undefined;\n let source: TransactionSource = 'url';\n\n const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes);\n\n if (isInDescendantRoute) {\n name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location));\n source = 'route';\n }\n\n if (!isInDescendantRoute || !name) {\n [name, source] = getNormalizedName(routes, location, branches, basename);\n }\n\n return [name || location.pathname, source];\n}\n\n/**\n * Gets the active root span if it's a pageload or navigation span.\n */\nexport function getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["DEBUG_BUILD","debug","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/reactrouter-compat-utils/utils.ts"],"sourcesContent":["import type { Span, TransactionSource } from '@sentry/core';\nimport { debug, getActiveSpan, getRootSpan, spanToJSON } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Location, MatchRoutes, RouteMatch, RouteObject } from '../types';\nimport { matchRouteManifest, stripBasenameFromPathname } from './route-manifest';\n\n// Global variables that these utilities depend on\nlet _matchRoutes: MatchRoutes;\nlet _stripBasename: boolean = false;\n\n// Navigation context stack for nested/concurrent patchRoutesOnNavigation calls.\n// Required because window.location hasn't updated yet when handlers are invoked.\ninterface NavigationContext {\n token: object;\n targetPath: string | undefined;\n span: Span | undefined;\n}\n\nconst _navigationContextStack: NavigationContext[] = [];\nconst MAX_CONTEXT_STACK_SIZE = 10;\n\n/**\n * Pushes a navigation context and returns a unique token for cleanup.\n * The token uses object identity for uniqueness (no counter needed).\n */\nexport function setNavigationContext(targetPath: string | undefined, span: Span | undefined): object {\n const token = {};\n // Prevent unbounded stack growth - oldest (likely stale) contexts are evicted first\n if (_navigationContextStack.length >= MAX_CONTEXT_STACK_SIZE) {\n DEBUG_BUILD && debug.warn('[React Router] Navigation context stack overflow - removing oldest context');\n _navigationContextStack.shift();\n }\n _navigationContextStack.push({ token, targetPath, span });\n return token;\n}\n\n/**\n * Clears the navigation context if it's on top of the stack (LIFO).\n * If our context is not on top (out-of-order completion), we leave it -\n * it will be cleaned up by overflow protection when the stack fills up.\n */\nexport function clearNavigationContext(token: object): void {\n const top = _navigationContextStack[_navigationContextStack.length - 1];\n if (top?.token === token) {\n _navigationContextStack.pop();\n }\n}\n\n/** Gets the current (most recent) navigation context if inside a patchRoutesOnNavigation call. */\nexport function getNavigationContext(): NavigationContext | null {\n const length = _navigationContextStack.length;\n // The `?? null` converts undefined (from array access) to null to match return type\n return length > 0 ? (_navigationContextStack[length - 1] ?? null) : null;\n}\n\n/**\n * Initialize function to set dependencies that the router utilities need.\n * Must be called before using any of the exported utility functions.\n */\nexport function initializeRouterUtils(matchRoutes: MatchRoutes, stripBasename: boolean = false): void {\n _matchRoutes = matchRoutes;\n _stripBasename = stripBasename;\n}\n\n// Helper functions\nfunction pickPath(match: RouteMatch): string {\n return trimWildcard(match.route.path || '');\n}\n\nfunction pickSplat(match: RouteMatch): string {\n return match.params['*'] || '';\n}\n\nfunction trimWildcard(path: string): string {\n return path[path.length - 1] === '*' ? path.slice(0, -1) : path;\n}\n\nfunction trimSlash(path: string): string {\n return path[path.length - 1] === '/' ? path.slice(0, -1) : path;\n}\n\n/**\n * Checks if a path ends with a wildcard character (*).\n */\nexport function pathEndsWithWildcard(path: string): boolean {\n return path.endsWith('*');\n}\n\n/** Checks if transaction name has wildcard (/* or ends with *). */\nexport function transactionNameHasWildcard(name: string): boolean {\n return name.includes('/*') || name.endsWith('*');\n}\n\n/**\n * Checks if a path is a wildcard and has child routes.\n */\nexport function pathIsWildcardAndHasChildren(path: string, branch: RouteMatch<string>): boolean {\n return (pathEndsWithWildcard(path) && !!branch.route.children?.length) || false;\n}\n\n/** Check if route is in descendant route (<Routes> within <Routes>) */\nexport function routeIsDescendant(route: RouteObject): boolean {\n return !!(!route.children && route.element && route.path?.endsWith('/*'));\n}\n\nfunction sendIndexPath(pathBuilder: string, pathname: string, basename: string): [string, TransactionSource] {\n const reconstructedPath =\n pathBuilder && pathBuilder.length > 0\n ? pathBuilder\n : _stripBasename\n ? stripBasenameFromPathname(pathname, basename)\n : pathname;\n\n let formattedPath =\n // If the path ends with a wildcard suffix, remove both the slash and the asterisk\n reconstructedPath.slice(-2) === '/*' ? reconstructedPath.slice(0, -2) : reconstructedPath;\n\n // If the path ends with a slash, remove it (but keep single '/')\n if (formattedPath.length > 1 && formattedPath[formattedPath.length - 1] === '/') {\n formattedPath = formattedPath.slice(0, -1);\n }\n\n return [formattedPath, 'route'];\n}\n\n/**\n * Returns the number of URL segments in the given URL string.\n * Splits at '/' or '\\/' to handle regex URLs correctly.\n *\n * @param url - The URL string to segment.\n * @returns The number of segments in the URL.\n */\nexport function getNumberOfUrlSegments(url: string): number {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n// Exported utility functions\n\n/**\n * Ensures a path string starts with a forward slash.\n */\nexport function prefixWithSlash(path: string): string {\n return path[0] === '/' ? path : `/${path}`;\n}\n\n/**\n * Rebuilds the route path from all available routes by matching against the current location.\n */\nexport function rebuildRoutePathFromAllRoutes(allRoutes: RouteObject[], location: Location): string {\n const matchedRoutes = _matchRoutes(allRoutes, location) as RouteMatch[];\n\n if (!matchedRoutes || matchedRoutes.length === 0) {\n return '';\n }\n\n for (const match of matchedRoutes) {\n if (match.route.path && match.route.path !== '*') {\n const path = pickPath(match);\n const strippedPath = stripBasenameFromPathname(location.pathname, prefixWithSlash(match.pathnameBase));\n\n if (location.pathname === strippedPath) {\n return trimSlash(strippedPath);\n }\n\n return trimSlash(\n trimSlash(path || '') +\n prefixWithSlash(\n rebuildRoutePathFromAllRoutes(\n allRoutes.filter(route => route !== match.route),\n {\n pathname: strippedPath,\n },\n ),\n ),\n );\n }\n }\n\n return '';\n}\n\n/**\n * Checks if the current location is inside a descendant route (route with splat parameter).\n */\nexport function locationIsInsideDescendantRoute(location: Location, routes: RouteObject[]): boolean {\n const matchedRoutes = _matchRoutes(routes, location) as RouteMatch[];\n\n if (matchedRoutes) {\n for (const match of matchedRoutes) {\n if (routeIsDescendant(match.route) && pickSplat(match)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Returns a fallback transaction name from location pathname.\n */\nfunction getFallbackTransactionName(location: Location, basename: string): string {\n return _stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname || '';\n}\n\n/**\n * Gets a normalized route name and transaction source from the current routes and location.\n */\nexport function getNormalizedName(\n routes: RouteObject[],\n location: Location,\n branches: RouteMatch[],\n basename: string = '',\n): [string, TransactionSource] {\n if (!routes || routes.length === 0) {\n return [_stripBasename ? stripBasenameFromPathname(location.pathname, basename) : location.pathname, 'url'];\n }\n\n if (!branches) {\n return [getFallbackTransactionName(location, basename), 'url'];\n }\n\n let pathBuilder = '';\n\n for (const branch of branches) {\n const route = branch.route;\n if (!route) {\n continue;\n }\n\n // Early return for index routes\n if (route.index) {\n return sendIndexPath(pathBuilder, branch.pathname, basename);\n }\n\n const path = route.path;\n if (!path || pathIsWildcardAndHasChildren(path, branch)) {\n continue;\n }\n\n // Build the route path\n const newPath = path[0] === '/' || pathBuilder[pathBuilder.length - 1] === '/' ? path : `/${path}`;\n pathBuilder = trimSlash(pathBuilder) + prefixWithSlash(newPath);\n\n // Check if this path matches the current location\n if (trimSlash(location.pathname) !== trimSlash(basename + branch.pathname)) {\n continue;\n }\n\n // Check if this is a parameterized route like /stores/:storeId/products/:productId\n if (\n getNumberOfUrlSegments(pathBuilder) !== getNumberOfUrlSegments(branch.pathname) &&\n !pathEndsWithWildcard(pathBuilder)\n ) {\n return [(_stripBasename ? '' : basename) + newPath, 'route'];\n }\n\n // Handle wildcard routes with children - strip trailing wildcard\n if (pathIsWildcardAndHasChildren(pathBuilder, branch)) {\n pathBuilder = pathBuilder.slice(0, -1);\n }\n\n return [(_stripBasename ? '' : basename) + pathBuilder, 'route'];\n }\n\n // Fallback when no matching route found\n return [getFallbackTransactionName(location, basename), 'url'];\n}\n\n/**\n * Shared helper function to resolve route name and source\n */\nexport function resolveRouteNameAndSource(\n location: Location,\n routes: RouteObject[],\n allRoutes: RouteObject[],\n branches: RouteMatch[],\n basename: string = '',\n lazyRouteManifest?: string[],\n enableAsyncRouteHandlers?: boolean,\n): [string, TransactionSource] {\n // When lazy route manifest is provided, use it as the primary source for transaction names\n if (enableAsyncRouteHandlers && lazyRouteManifest && lazyRouteManifest.length > 0) {\n const manifestMatch = matchRouteManifest(location.pathname, lazyRouteManifest, basename);\n if (manifestMatch) {\n return [(_stripBasename ? '' : basename) + manifestMatch, 'route'];\n }\n }\n\n // Fall back to React Router route matching\n let name: string | undefined;\n let source: TransactionSource = 'url';\n\n const isInDescendantRoute = locationIsInsideDescendantRoute(location, allRoutes);\n\n if (isInDescendantRoute) {\n name = prefixWithSlash(rebuildRoutePathFromAllRoutes(allRoutes, location));\n source = 'route';\n }\n\n if (!isInDescendantRoute || !name) {\n [name, source] = getNormalizedName(routes, location, branches, basename);\n }\n\n return [name || location.pathname, source];\n}\n\n/**\n * Gets the active root span if it's a pageload or navigation span.\n */\nexport function getActiveRootSpan(): Span | undefined {\n const span = getActiveSpan();\n const rootSpan = span ? getRootSpan(span) : undefined;\n\n if (!rootSpan) {\n return undefined;\n }\n\n const op = spanToJSON(rootSpan).op;\n\n // Only use this root span if it is a pageload or navigation span\n return op === 'navigation' || op === 'pageload' ? rootSpan : undefined;\n}\n"],"names":["DEBUG_BUILD","debug","stripBasenameFromPathname","matchRouteManifest","getActiveSpan","getRootSpan","spanToJSON"],"mappings":"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"}
|
|
@@ -128,12 +128,12 @@ function hoistNonReactStatics
|
|
|
128
128
|
const sourceStatics = getStatics(sourceComponent);
|
|
129
129
|
|
|
130
130
|
for (const key of keys) {
|
|
131
|
-
|
|
131
|
+
// Use key directly - String(key) throws for Symbols if minified to '' + key (#18966)
|
|
132
132
|
if (
|
|
133
|
-
!KNOWN_STATICS[
|
|
133
|
+
!KNOWN_STATICS[key ] &&
|
|
134
134
|
true &&
|
|
135
|
-
!sourceStatics?.[
|
|
136
|
-
!targetStatics?.[
|
|
135
|
+
!sourceStatics?.[key ] &&
|
|
136
|
+
!targetStatics?.[key ] &&
|
|
137
137
|
!getOwnPropertyDescriptor(targetComponent, key) // Don't overwrite existing properties
|
|
138
138
|
) {
|
|
139
139
|
const descriptor = getOwnPropertyDescriptor(sourceComponent, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hoist-non-react-statics.js","sources":["../../src/hoist-non-react-statics.ts"],"sourcesContent":["/**\n * Inlined implementation of hoist-non-react-statics\n * Original library: https://github.com/mridgway/hoist-non-react-statics\n * License: BSD-3-Clause\n * Copyright 2015, Yahoo! Inc.\n *\n * This is an inlined version to avoid ESM compatibility issues with the original package.\n */\n\nimport type * as React from 'react';\n\n/**\n * React statics that should not be hoisted\n */\nconst REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true,\n} as const;\n\n/**\n * Known JavaScript function statics that should not be hoisted\n */\nconst KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true,\n} as const;\n\n/**\n * Statics specific to ForwardRef components\n */\nconst FORWARD_REF_STATICS = {\n $$typeof: true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n} as const;\n\n/**\n * Statics specific to Memo components\n */\nconst MEMO_STATICS = {\n $$typeof: true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true,\n} as const;\n\n/**\n * Inlined react-is utilities\n * We only need to detect ForwardRef and Memo types\n */\nconst ForwardRefType = Symbol.for('react.forward_ref');\nconst MemoType = Symbol.for('react.memo');\n\n/**\n * Check if a component is a Memo component\n */\nfunction isMemo(component: unknown): boolean {\n return (\n typeof component === 'object' && component !== null && (component as { $$typeof?: symbol }).$$typeof === MemoType\n );\n}\n\n/**\n * Map of React component types to their specific statics\n */\nconst TYPE_STATICS: Record<symbol, Record<string, boolean>> = {};\nTYPE_STATICS[ForwardRefType] = FORWARD_REF_STATICS;\nTYPE_STATICS[MemoType] = MEMO_STATICS;\n\n/**\n * Get the appropriate statics object for a given component\n */\nfunction getStatics(component: React.ComponentType<unknown>): Record<string, boolean> {\n // React v16.11 and below\n if (isMemo(component)) {\n return MEMO_STATICS;\n }\n\n // React v16.12 and above\n const componentType = (component as { $$typeof?: symbol }).$$typeof;\n return (componentType && TYPE_STATICS[componentType]) || REACT_STATICS;\n}\n\nconst defineProperty = Object.defineProperty.bind(Object);\nconst getOwnPropertyNames = Object.getOwnPropertyNames.bind(Object);\nconst getOwnPropertySymbols = Object.getOwnPropertySymbols?.bind(Object);\nconst getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor.bind(Object);\nconst getPrototypeOf = Object.getPrototypeOf.bind(Object);\nconst objectPrototype = Object.prototype;\n\n/**\n * Copies non-react specific statics from a child component to a parent component.\n * Similar to Object.assign, but copies all static properties from source to target,\n * excluding React-specific statics and known JavaScript statics.\n *\n * @param targetComponent - The component to copy statics to\n * @param sourceComponent - The component to copy statics from\n * @param excludelist - An optional object of keys to exclude from hoisting\n * @returns The target component with hoisted statics\n */\nexport function hoistNonReactStatics<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends React.ComponentType<any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n S extends React.ComponentType<any>,\n C extends Record<string, boolean> = Record<string, never>,\n>(targetComponent: T, sourceComponent: S, excludelist?: C): T {\n if (typeof sourceComponent !== 'string') {\n // Don't hoist over string (html) components\n if (objectPrototype) {\n const inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, excludelist);\n }\n }\n\n let keys: (string | symbol)[] = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n const targetStatics = getStatics(targetComponent);\n const sourceStatics = getStatics(sourceComponent);\n\n for (const key of keys) {\n
|
|
1
|
+
{"version":3,"file":"hoist-non-react-statics.js","sources":["../../src/hoist-non-react-statics.ts"],"sourcesContent":["/**\n * Inlined implementation of hoist-non-react-statics\n * Original library: https://github.com/mridgway/hoist-non-react-statics\n * License: BSD-3-Clause\n * Copyright 2015, Yahoo! Inc.\n *\n * This is an inlined version to avoid ESM compatibility issues with the original package.\n */\n\nimport type * as React from 'react';\n\n/**\n * React statics that should not be hoisted\n */\nconst REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true,\n} as const;\n\n/**\n * Known JavaScript function statics that should not be hoisted\n */\nconst KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true,\n} as const;\n\n/**\n * Statics specific to ForwardRef components\n */\nconst FORWARD_REF_STATICS = {\n $$typeof: true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n} as const;\n\n/**\n * Statics specific to Memo components\n */\nconst MEMO_STATICS = {\n $$typeof: true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true,\n} as const;\n\n/**\n * Inlined react-is utilities\n * We only need to detect ForwardRef and Memo types\n */\nconst ForwardRefType = Symbol.for('react.forward_ref');\nconst MemoType = Symbol.for('react.memo');\n\n/**\n * Check if a component is a Memo component\n */\nfunction isMemo(component: unknown): boolean {\n return (\n typeof component === 'object' && component !== null && (component as { $$typeof?: symbol }).$$typeof === MemoType\n );\n}\n\n/**\n * Map of React component types to their specific statics\n */\nconst TYPE_STATICS: Record<symbol, Record<string, boolean>> = {};\nTYPE_STATICS[ForwardRefType] = FORWARD_REF_STATICS;\nTYPE_STATICS[MemoType] = MEMO_STATICS;\n\n/**\n * Get the appropriate statics object for a given component\n */\nfunction getStatics(component: React.ComponentType<unknown>): Record<string, boolean> {\n // React v16.11 and below\n if (isMemo(component)) {\n return MEMO_STATICS;\n }\n\n // React v16.12 and above\n const componentType = (component as { $$typeof?: symbol }).$$typeof;\n return (componentType && TYPE_STATICS[componentType]) || REACT_STATICS;\n}\n\nconst defineProperty = Object.defineProperty.bind(Object);\nconst getOwnPropertyNames = Object.getOwnPropertyNames.bind(Object);\nconst getOwnPropertySymbols = Object.getOwnPropertySymbols?.bind(Object);\nconst getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor.bind(Object);\nconst getPrototypeOf = Object.getPrototypeOf.bind(Object);\nconst objectPrototype = Object.prototype;\n\n/**\n * Copies non-react specific statics from a child component to a parent component.\n * Similar to Object.assign, but copies all static properties from source to target,\n * excluding React-specific statics and known JavaScript statics.\n *\n * @param targetComponent - The component to copy statics to\n * @param sourceComponent - The component to copy statics from\n * @param excludelist - An optional object of keys to exclude from hoisting\n * @returns The target component with hoisted statics\n */\nexport function hoistNonReactStatics<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends React.ComponentType<any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n S extends React.ComponentType<any>,\n C extends Record<string, boolean> = Record<string, never>,\n>(targetComponent: T, sourceComponent: S, excludelist?: C): T {\n if (typeof sourceComponent !== 'string') {\n // Don't hoist over string (html) components\n if (objectPrototype) {\n const inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, excludelist);\n }\n }\n\n let keys: (string | symbol)[] = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n const targetStatics = getStatics(targetComponent);\n const sourceStatics = getStatics(sourceComponent);\n\n for (const key of keys) {\n // Use key directly - String(key) throws for Symbols if minified to '' + key (#18966)\n if (\n !KNOWN_STATICS[key as keyof typeof KNOWN_STATICS] &&\n !(excludelist && excludelist[key as keyof C]) &&\n !sourceStatics?.[key as string] &&\n !targetStatics?.[key as string] &&\n !getOwnPropertyDescriptor(targetComponent, key) // Don't overwrite existing properties\n ) {\n const descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n if (descriptor) {\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {\n // Silently ignore errors\n }\n }\n }\n }\n }\n\n return targetComponent;\n}\n"],"names":[],"mappings":"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"}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"10.
|
|
1
|
+
{"type":"module","version":"10.39.0-alpha.0","sideEffects":false}
|