@descryy/runtime-identity-grounding 0.3.0 → 0.4.1
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/dist/element-identity.d.ts +41 -78
- package/dist/element-identity.d.ts.map +1 -1
- package/dist/element-identity.js +59 -64
- package/dist/element-identity.js.map +1 -1
- package/dist/fiber-probe.d.ts +25 -45
- package/dist/fiber-probe.d.ts.map +1 -1
- package/dist/fiber-probe.js +45 -84
- package/dist/fiber-probe.js.map +1 -1
- package/dist/graph-join.d.ts +18 -49
- package/dist/graph-join.d.ts.map +1 -1
- package/dist/graph-join.js +17 -42
- package/dist/graph-join.js.map +1 -1
- package/dist/identity-grounder.d.ts +12 -31
- package/dist/identity-grounder.d.ts.map +1 -1
- package/dist/identity-grounder.js +13 -26
- package/dist/identity-grounder.js.map +1 -1
- package/dist/identity-grounding.d.ts +20 -39
- package/dist/identity-grounding.d.ts.map +1 -1
- package/dist/identity-grounding.js +27 -44
- package/dist/identity-grounding.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/owner-stack.d.ts +36 -65
- package/dist/owner-stack.d.ts.map +1 -1
- package/dist/owner-stack.js +33 -62
- package/dist/owner-stack.js.map +1 -1
- package/dist/vue-identity-grounder.d.ts +23 -0
- package/dist/vue-identity-grounder.d.ts.map +1 -0
- package/dist/vue-identity-grounder.js +28 -0
- package/dist/vue-identity-grounder.js.map +1 -0
- package/dist/vue-identity-grounding.d.ts +16 -0
- package/dist/vue-identity-grounding.d.ts.map +1 -0
- package/dist/vue-identity-grounding.js +110 -0
- package/dist/vue-identity-grounding.js.map +1 -0
- package/dist/vue-probe.d.ts +49 -0
- package/dist/vue-probe.d.ts.map +1 -0
- package/dist/vue-probe.js +95 -0
- package/dist/vue-probe.js.map +1 -0
- package/package.json +7 -7
|
@@ -1,38 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The decision layer: raw fiber facts in, one `ElementIdentity` out.
|
|
3
3
|
*
|
|
4
|
-
* Pure with respect to the browser —
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* injected as `OwnerStackResolver`. That split is what lets every refusal
|
|
9
|
-
* branch below be exercised as a plain unit test, with no Chromium and no
|
|
10
|
-
* fixture app, while the fixture apps prove the two mechanisms end to end.
|
|
4
|
+
* Pure with respect to the browser — never touches a `Page`. The one piece
|
|
5
|
+
* of machinery it can't own (turning a React 19 owner stack into a resolved
|
|
6
|
+
* `StackTrace`) is injected as `OwnerStackResolver`, so every refusal
|
|
7
|
+
* branch below is a plain unit test, no Chromium needed.
|
|
11
8
|
*
|
|
12
|
-
*
|
|
9
|
+
* What this cannot do, decided here: a production React build (no
|
|
10
|
+
* `_debug*` survives, refused as `react-debug-fields-absent`); anything
|
|
11
|
+
* that isn't React (no fiber key — a scope boundary, not a gap, refused as
|
|
12
|
+
* "not React" rather than "unknown"); a React 19 bundle with no source map
|
|
13
|
+
* (reported with `authoredSource: false` and `degraded`, never dressed up);
|
|
14
|
+
* an anonymous component (refused — no symbol to look up, no name to act on).
|
|
13
15
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* - **A React 19 bundle with no source map.** The owner stack still names a
|
|
21
|
-
* real position, in compiled output. Reported with
|
|
22
|
-
* `authoredSource: false` and a `degraded` capability, never dressed up
|
|
23
|
-
* as the file a developer wrote.
|
|
24
|
-
* - **An anonymous component.** Refused: there is no symbol for
|
|
25
|
-
* `resolveSymbolNode` to look up and no name for a reader to act on.
|
|
26
|
-
*
|
|
27
|
-
* ## Owner versus renderer
|
|
28
|
-
*
|
|
29
|
-
* `component` is read from `_debugOwner` — the component whose render
|
|
30
|
-
* *created* this element — because that is the component the source
|
|
31
|
-
* location belongs to. `renderedBy` is the nearest component in the fiber
|
|
32
|
-
* `return` chain, which is where the element ended up. They differ whenever
|
|
33
|
-
* an element is created in one component and passed to another as
|
|
34
|
-
* `children`; the fixture app renders that case deliberately. Both are
|
|
35
|
-
* reported and neither is reconciled into the other.
|
|
16
|
+
* `component` is read from `_debugOwner` — whose render *created* the
|
|
17
|
+
* element, matching the source location. `renderedBy` is the nearest
|
|
18
|
+
* component in the `return` chain — where it ended up. They differ when an
|
|
19
|
+
* element is created in one component and passed to another as `children`
|
|
20
|
+
* (the fixture app renders this on purpose); both are reported, neither
|
|
21
|
+
* reconciled.
|
|
36
22
|
*/
|
|
37
23
|
import { locationNamesNothing } from "@descryy/runtime-contracts";
|
|
38
24
|
import { capabilityFor, } from "./element-identity.js";
|
|
@@ -77,19 +63,18 @@ export async function groundFromProbe(probe, selector, resolveOwnerStack) {
|
|
|
77
63
|
observedTypeName: null,
|
|
78
64
|
reason: `neither the element matched by "${selector}" nor any of its ancestors carries a React fiber key ` +
|
|
79
65
|
`(${probe.ownKeys.length === 0 ? "the element has no own enumerable keys at all" : `own keys: ${probe.ownKeys.join(", ")}`}). ` +
|
|
80
|
-
"This page's DOM was not produced by React, or not by a React that tags host nodes.
|
|
81
|
-
"React-only
|
|
82
|
-
"
|
|
66
|
+
"This page's DOM was not produced by React, or not by a React that tags host nodes. This resolver " +
|
|
67
|
+
"(`groundFromProbe`) is React-only — `groundFromVueProbe` (`vue-identity-grounding.ts`) is this " +
|
|
68
|
+
"package's Vue reader, on the same `ElementIdentity` vocabulary; Svelte, Angular and Solid remain a scope " +
|
|
69
|
+
"boundary, not a temporary gap (RG-15: one framework extension at a time).",
|
|
83
70
|
capability: capabilityFor("unavailable", "no React fiber on the element or any ancestor — not a React tree."),
|
|
84
71
|
};
|
|
85
72
|
}
|
|
86
73
|
const { fiberDistance } = probe;
|
|
87
74
|
if (probe.debugFields.length === 0) {
|
|
88
|
-
// The queried node is usually a
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
// consulted, in that order, and the result is still not a component
|
|
92
|
-
// name -- see `ElementIdentityRefused.observedTypeName`.
|
|
75
|
+
// The queried node is usually a host fiber whose `type` is a tag name
|
|
76
|
+
// string, so the minified identifier lives on the nearest component
|
|
77
|
+
// above it. Consulted in that order — still not a component name.
|
|
93
78
|
const observedTypeName = probe.observedTypeName ?? probe.returnChainComponent?.name ?? probe.owner?.name ?? null;
|
|
94
79
|
return {
|
|
95
80
|
outcome: "refused",
|
|
@@ -132,7 +117,7 @@ export async function groundFromProbe(probe, selector, resolveOwnerStack) {
|
|
|
132
117
|
};
|
|
133
118
|
}
|
|
134
119
|
const renderedBy = returnChain;
|
|
135
|
-
//
|
|
120
|
+
// React 18 and earlier: the authored location is on the fiber.
|
|
136
121
|
const debugSource = probe.debugSource;
|
|
137
122
|
if (debugSource !== null && debugSource.fileName !== null) {
|
|
138
123
|
const sourceLocation = {
|
|
@@ -140,10 +125,8 @@ export async function groundFromProbe(probe, selector, resolveOwnerStack) {
|
|
|
140
125
|
line: debugSource.lineNumber,
|
|
141
126
|
column: debugSource.columnNumber,
|
|
142
127
|
functionName: component.name,
|
|
143
|
-
// The
|
|
144
|
-
//
|
|
145
|
-
// resolver.ts` gives a frame with no `sourceMappingURL`: nothing was
|
|
146
|
-
// lost, this IS the accurate answer.
|
|
128
|
+
// The app's own recorded creation site, not a translation through a
|
|
129
|
+
// side artifact — nothing was lost, this IS the accurate answer.
|
|
147
130
|
reliability: "self-contained",
|
|
148
131
|
resolvedVia: null,
|
|
149
132
|
};
|
|
@@ -163,7 +146,7 @@ export async function groundFromProbe(probe, selector, resolveOwnerStack) {
|
|
|
163
146
|
: capabilityFor("available"),
|
|
164
147
|
};
|
|
165
148
|
}
|
|
166
|
-
//
|
|
149
|
+
// React 19: an owner stack in compiled coordinates.
|
|
167
150
|
const stackText = probe.debugStackText;
|
|
168
151
|
if (stackText !== null) {
|
|
169
152
|
if (resolveOwnerStack === null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-grounding.js","sourceRoot":"","sources":["../src/identity-grounding.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"identity-grounding.js","sourceRoot":"","sources":["../src/identity-grounding.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Identity grounding: an on-screen DOM element to the React component that
|
|
3
|
-
* produced it, and to
|
|
4
|
-
*
|
|
5
|
-
* Start at `createIdentityGrounder` (`identity-grounder.ts`). Read
|
|
6
|
-
* `element-identity.ts` for what an answer is allowed to say, and
|
|
7
|
-
* `owner-stack.ts` for the measured difference between React 18's and React
|
|
8
|
-
* 19's fiber internals — they are not two implementations of one mechanism.
|
|
3
|
+
* produced it, and to its authored file and line. Start at
|
|
4
|
+
* `createIdentityGrounder` (`identity-grounder.ts`).
|
|
9
5
|
*/
|
|
10
6
|
export type { IdentityRefusal, GroundingMechanism, ComponentKind, ComponentNameSource, ComponentSource, ResolvedComponent, ElementIdentity, ElementIdentityGrounded, ElementIdentityComponentOnly, ElementIdentityRefused, } from "./element-identity.ts";
|
|
11
7
|
export { IDENTITY_REFUSALS, GROUNDING_MECHANISMS, COMPONENT_KINDS, COMPONENT_NAME_SOURCES, COMPONENT_SOURCES, capabilityFor, } from "./element-identity.ts";
|
|
@@ -17,6 +13,11 @@ export type { OwnerStackResolver } from "./identity-grounding.ts";
|
|
|
17
13
|
export { groundFromProbe } from "./identity-grounding.ts";
|
|
18
14
|
export type { IdentityGrounder, IdentityGrounderOptions } from "./identity-grounder.ts";
|
|
19
15
|
export { createIdentityGrounder } from "./identity-grounder.ts";
|
|
16
|
+
export type { RawVueProbe, RawVueComponentDescriptor, VueIdentityGroundingProbe } from "./vue-probe.ts";
|
|
17
|
+
export { createVueIdentityGroundingProbe, VUE_IDENTITY_GROUNDING_BINDING } from "./vue-probe.ts";
|
|
18
|
+
export { groundFromVueProbe } from "./vue-identity-grounding.ts";
|
|
19
|
+
export type { VueIdentityGrounder } from "./vue-identity-grounder.ts";
|
|
20
|
+
export { createVueIdentityGrounder } from "./vue-identity-grounder.ts";
|
|
20
21
|
export type { GraphSymbolLocation } from "./graph-join.ts";
|
|
21
22
|
export { symbolLocationForGraph } from "./graph-join.ts";
|
|
22
23
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AACtI,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEhH,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEnF,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACxG,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAEjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Identity grounding: an on-screen DOM element to the React component that
|
|
3
|
-
* produced it, and to
|
|
4
|
-
*
|
|
5
|
-
* Start at `createIdentityGrounder` (`identity-grounder.ts`). Read
|
|
6
|
-
* `element-identity.ts` for what an answer is allowed to say, and
|
|
7
|
-
* `owner-stack.ts` for the measured difference between React 18's and React
|
|
8
|
-
* 19's fiber internals — they are not two implementations of one mechanism.
|
|
3
|
+
* produced it, and to its authored file and line. Start at
|
|
4
|
+
* `createIdentityGrounder` (`identity-grounder.ts`).
|
|
9
5
|
*/
|
|
10
6
|
export { IDENTITY_REFUSALS, GROUNDING_MECHANISMS, COMPONENT_KINDS, COMPONENT_NAME_SOURCES, COMPONENT_SOURCES, capabilityFor, } from "./element-identity.js";
|
|
11
7
|
export { createIdentityGroundingProbe, IDENTITY_GROUNDING_BINDING, FIBER_KEY_PREFIXES } from "./fiber-probe.js";
|
|
12
8
|
export { selectOwnerFrame, REACT_ELEMENT_CREATION_FRAMES } from "./owner-stack.js";
|
|
13
9
|
export { groundFromProbe } from "./identity-grounding.js";
|
|
14
10
|
export { createIdentityGrounder } from "./identity-grounder.js";
|
|
11
|
+
export { createVueIdentityGroundingProbe, VUE_IDENTITY_GROUNDING_BINDING } from "./vue-probe.js";
|
|
12
|
+
export { groundFromVueProbe } from "./vue-identity-grounding.js";
|
|
13
|
+
export { createVueIdentityGrounder } from "./vue-identity-grounder.js";
|
|
15
14
|
export { symbolLocationForGraph } from "./graph-join.js";
|
|
16
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGhH,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAGnF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAEjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/owner-stack.d.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* React 19's replacement for `_debugSource`, and the
|
|
3
|
-
* needs
|
|
2
|
+
* React 19's replacement for `_debugSource`, and the rule this package
|
|
3
|
+
* needs to read it.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Measured directly, in a real Chromium, against React 18.3.1 and 19.2.8
|
|
8
|
-
* development bundles of the same authored source
|
|
9
|
-
* (`fixture-apps/react-identity`):
|
|
5
|
+
* Measured in a real Chromium, React 18.3.1 vs 19.2.8 dev bundles of the
|
|
6
|
+
* same source (`fixture-apps/react-identity`):
|
|
10
7
|
*
|
|
11
8
|
* | fiber field | React 18.3.1 dev | React 19.2.8 dev | either, production |
|
|
12
9
|
* | --- | --- | --- | --- |
|
|
@@ -15,64 +12,41 @@
|
|
|
15
12
|
* | `_debugOwner` | present | present | absent |
|
|
16
13
|
* | `type.name` | authored | authored | minified |
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
* second frame through the bundle's source map lands on `src/app.jsx:20`
|
|
42
|
-
* as well. `react-fixtures.test.ts` asserts that equality rather than
|
|
43
|
-
* asserting each major separately, because two independently-written
|
|
44
|
-
* expectations can both be wrong in the same direction.
|
|
45
|
-
*
|
|
46
|
-
* ## Why not `stripInitiatorWrapperFrame`'s positional rule
|
|
47
|
-
*
|
|
48
|
-
* `@descryy/runtime-browser`'s initiator capture drops its first frame *by
|
|
49
|
-
* position*, and argues correctly that its own wrapper is deterministically
|
|
50
|
-
* innermost because it captured the stack itself. Nothing here captured
|
|
51
|
-
* this stack — React did — so the same reasoning is not available. Worse,
|
|
52
|
-
* `createV8StackTraceParser` **omits** frames it cannot parse a
|
|
53
|
-
* `line:column` from, so "the first frame of the parsed trace" is not
|
|
54
|
-
* reliably "the first frame of the raw text" either.
|
|
55
|
-
*
|
|
56
|
-
* The rule used instead is by name, against a closed list of React's own
|
|
57
|
-
* element-creation entry points, and it **refuses** when the innermost
|
|
58
|
-
* frame is not one of them. A refusal here costs a source location; a
|
|
59
|
-
* positional guess that is off by one costs a confident wrong file and
|
|
60
|
-
* line, attributed to a component that did not create the element. Rule 2.
|
|
15
|
+
* React 19 didn't move the source location, it **deleted** it and left a
|
|
16
|
+
* captured stack whose frames point into *compiled* output — costing a
|
|
17
|
+
* source-map resolution React 18 doesn't need, and reporting a different
|
|
18
|
+
* `SourceLocation.reliability` (`self-contained` vs `side-artifact-resolved`):
|
|
19
|
+
* one is the app telling us where it came from, the other is us
|
|
20
|
+
* translating through a file that can be missing or stale.
|
|
21
|
+
*
|
|
22
|
+
* The rule: drop React's own element-creation frame (the stack's innermost
|
|
23
|
+
* frame, e.g. `exports.jsxDEV`), and only that — the second frame is the
|
|
24
|
+
* JSX call site inside the owning component, the same fact React 18's
|
|
25
|
+
* `_debugSource` carries. Verified against the fixture: both majors land on
|
|
26
|
+
* `src/app.jsx:20` (`react-fixtures.test.ts` asserts the equality, not each
|
|
27
|
+
* major separately, since two independent expectations can be wrong the
|
|
28
|
+
* same way).
|
|
29
|
+
*
|
|
30
|
+
* Not `stripInitiatorWrapperFrame`'s positional rule: nothing here captured
|
|
31
|
+
* this stack, React did, so "deterministically innermost" doesn't apply —
|
|
32
|
+
* and `createV8StackTraceParser` omits unparseable frames, so "first frame
|
|
33
|
+
* of the parsed trace" isn't reliably "first frame of the raw text" either.
|
|
34
|
+
* Instead: match by name against a closed list of React's element-creation
|
|
35
|
+
* entry points, and **refuse** when the innermost frame isn't one of them.
|
|
36
|
+
* A refusal costs a source location; an off-by-one positional guess costs a
|
|
37
|
+
* confident wrong file/line attributed to the wrong component (rule 2).
|
|
61
38
|
*/
|
|
62
39
|
import type { StackTrace } from "@descryy/runtime-contracts";
|
|
63
40
|
/**
|
|
64
41
|
* React's own element-creation entry points, matched against the **last
|
|
65
|
-
* dotted segment** of a frame's function name so
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* `
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* Deliberately a closed list rather than a "does this frame live inside
|
|
74
|
-
* react-dom" heuristic: the latter needs a resolved path for the frame,
|
|
75
|
-
* which is exactly the thing that may not resolve.
|
|
42
|
+
* dotted segment** of a frame's function name so `exports.jsxDEV` and bare
|
|
43
|
+
* `jsxDEV` are the same frame. `jsxDEV`/`jsxDEVImpl` are the automatic
|
|
44
|
+
* runtime's dev entry; `jsx`/`jsxs` its production ones (listed for
|
|
45
|
+
* completeness — production has no `_debugStack` to reach this code with);
|
|
46
|
+
* `createElement`/`createElementWithValidation` the classic runtime's.
|
|
47
|
+
*
|
|
48
|
+
* A closed list, not a "lives inside react-dom" heuristic — that needs a
|
|
49
|
+
* resolved path, exactly the thing that may not resolve.
|
|
76
50
|
*/
|
|
77
51
|
export declare const REACT_ELEMENT_CREATION_FRAMES: readonly ["jsxDEV", "jsxDEVImpl", "jsxWithValidation", "jsx", "jsxs", "createElement", "createElementWithValidation"];
|
|
78
52
|
export type OwnerFrameSelection = {
|
|
@@ -82,9 +56,6 @@ export type OwnerFrameSelection = {
|
|
|
82
56
|
readonly ok: false;
|
|
83
57
|
readonly reason: string;
|
|
84
58
|
};
|
|
85
|
-
/**
|
|
86
|
-
* Index of the frame that is the JSX call site inside the owning component,
|
|
87
|
-
* or a refusal naming why the stack could not be read that way.
|
|
88
|
-
*/
|
|
59
|
+
/** Index of the frame that is the JSX call site inside the owning component, or a refusal naming why the stack couldn't be read that way. */
|
|
89
60
|
export declare function selectOwnerFrame(stack: StackTrace): OwnerFrameSelection;
|
|
90
61
|
//# sourceMappingURL=owner-stack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-stack.d.ts","sourceRoot":"","sources":["../src/owner-stack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"owner-stack.d.ts","sourceRoot":"","sources":["../src/owner-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,uHAQhC,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAOpD,6IAA6I;AAC7I,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,mBAAmB,CAsCvE"}
|
package/dist/owner-stack.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* React 19's replacement for `_debugSource`, and the
|
|
3
|
-
* needs
|
|
2
|
+
* React 19's replacement for `_debugSource`, and the rule this package
|
|
3
|
+
* needs to read it.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Measured directly, in a real Chromium, against React 18.3.1 and 19.2.8
|
|
8
|
-
* development bundles of the same authored source
|
|
9
|
-
* (`fixture-apps/react-identity`):
|
|
5
|
+
* Measured in a real Chromium, React 18.3.1 vs 19.2.8 dev bundles of the
|
|
6
|
+
* same source (`fixture-apps/react-identity`):
|
|
10
7
|
*
|
|
11
8
|
* | fiber field | React 18.3.1 dev | React 19.2.8 dev | either, production |
|
|
12
9
|
* | --- | --- | --- | --- |
|
|
@@ -15,63 +12,40 @@
|
|
|
15
12
|
* | `_debugOwner` | present | present | absent |
|
|
16
13
|
* | `type.name` | authored | authored | minified |
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* not cosmetic: one is the application telling us where it came from, the
|
|
25
|
-
* other is us translating through a file that can be missing or stale.
|
|
26
|
-
*
|
|
27
|
-
* ## The rule: drop React's own element-creation frame, and only that
|
|
28
|
-
*
|
|
29
|
-
* The captured stack's innermost frame is React's own JSX entry point:
|
|
30
|
-
*
|
|
31
|
-
* ```text
|
|
32
|
-
* Error: react-stack-top-frame
|
|
33
|
-
* at exports.jsxDEV (http://…/dev.js:21690:32)
|
|
34
|
-
* at PayButton (http://…/dev.js:21714:62) <- the site we want
|
|
35
|
-
* at Object.react_stack_bottom_frame (…)
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* The second frame is the JSX call site inside the owning component, which
|
|
39
|
-
* is exactly the fact React 18's `_debugSource` carries. Verified against
|
|
40
|
-
* the fixture: React 18 reports `src/app.jsx:20`, and mapping React 19's
|
|
41
|
-
* second frame through the bundle's source map lands on `src/app.jsx:20`
|
|
42
|
-
* as well. `react-fixtures.test.ts` asserts that equality rather than
|
|
43
|
-
* asserting each major separately, because two independently-written
|
|
44
|
-
* expectations can both be wrong in the same direction.
|
|
15
|
+
* React 19 didn't move the source location, it **deleted** it and left a
|
|
16
|
+
* captured stack whose frames point into *compiled* output — costing a
|
|
17
|
+
* source-map resolution React 18 doesn't need, and reporting a different
|
|
18
|
+
* `SourceLocation.reliability` (`self-contained` vs `side-artifact-resolved`):
|
|
19
|
+
* one is the app telling us where it came from, the other is us
|
|
20
|
+
* translating through a file that can be missing or stale.
|
|
45
21
|
*
|
|
46
|
-
*
|
|
22
|
+
* The rule: drop React's own element-creation frame (the stack's innermost
|
|
23
|
+
* frame, e.g. `exports.jsxDEV`), and only that — the second frame is the
|
|
24
|
+
* JSX call site inside the owning component, the same fact React 18's
|
|
25
|
+
* `_debugSource` carries. Verified against the fixture: both majors land on
|
|
26
|
+
* `src/app.jsx:20` (`react-fixtures.test.ts` asserts the equality, not each
|
|
27
|
+
* major separately, since two independent expectations can be wrong the
|
|
28
|
+
* same way).
|
|
47
29
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* The rule used instead is by name, against a closed list of React's own
|
|
57
|
-
* element-creation entry points, and it **refuses** when the innermost
|
|
58
|
-
* frame is not one of them. A refusal here costs a source location; a
|
|
59
|
-
* positional guess that is off by one costs a confident wrong file and
|
|
60
|
-
* line, attributed to a component that did not create the element. Rule 2.
|
|
30
|
+
* Not `stripInitiatorWrapperFrame`'s positional rule: nothing here captured
|
|
31
|
+
* this stack, React did, so "deterministically innermost" doesn't apply —
|
|
32
|
+
* and `createV8StackTraceParser` omits unparseable frames, so "first frame
|
|
33
|
+
* of the parsed trace" isn't reliably "first frame of the raw text" either.
|
|
34
|
+
* Instead: match by name against a closed list of React's element-creation
|
|
35
|
+
* entry points, and **refuse** when the innermost frame isn't one of them.
|
|
36
|
+
* A refusal costs a source location; an off-by-one positional guess costs a
|
|
37
|
+
* confident wrong file/line attributed to the wrong component (rule 2).
|
|
61
38
|
*/
|
|
62
39
|
/**
|
|
63
40
|
* React's own element-creation entry points, matched against the **last
|
|
64
|
-
* dotted segment** of a frame's function name so
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* `
|
|
69
|
-
* production build has no `_debugStack` to reach this code with);
|
|
70
|
-
* `createElement` / `createElementWithValidation` the classic runtime's.
|
|
41
|
+
* dotted segment** of a frame's function name so `exports.jsxDEV` and bare
|
|
42
|
+
* `jsxDEV` are the same frame. `jsxDEV`/`jsxDEVImpl` are the automatic
|
|
43
|
+
* runtime's dev entry; `jsx`/`jsxs` its production ones (listed for
|
|
44
|
+
* completeness — production has no `_debugStack` to reach this code with);
|
|
45
|
+
* `createElement`/`createElementWithValidation` the classic runtime's.
|
|
71
46
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* which is exactly the thing that may not resolve.
|
|
47
|
+
* A closed list, not a "lives inside react-dom" heuristic — that needs a
|
|
48
|
+
* resolved path, exactly the thing that may not resolve.
|
|
75
49
|
*/
|
|
76
50
|
export const REACT_ELEMENT_CREATION_FRAMES = [
|
|
77
51
|
"jsxDEV",
|
|
@@ -86,10 +60,7 @@ function lastSegment(functionName) {
|
|
|
86
60
|
const parts = functionName.split(".");
|
|
87
61
|
return parts[parts.length - 1] ?? functionName;
|
|
88
62
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Index of the frame that is the JSX call site inside the owning component,
|
|
91
|
-
* or a refusal naming why the stack could not be read that way.
|
|
92
|
-
*/
|
|
63
|
+
/** Index of the frame that is the JSX call site inside the owning component, or a refusal naming why the stack couldn't be read that way. */
|
|
93
64
|
export function selectOwnerFrame(stack) {
|
|
94
65
|
const first = stack.frames[0];
|
|
95
66
|
if (first === undefined) {
|
package/dist/owner-stack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-stack.js","sourceRoot":"","sources":["../src/owner-stack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"owner-stack.js","sourceRoot":"","sources":["../src/owner-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,QAAQ;IACR,YAAY;IACZ,mBAAmB;IACnB,KAAK;IACL,MAAM;IACN,eAAe;IACf,6BAA6B;CACrB,CAAC;AAMX,SAAS,WAAW,CAAC,YAAoB;IACvC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,YAAY,CAAC;AACjD,CAAC;AAED,6IAA6I;AAC7I,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yFAAyF,EAAE,CAAC;IAC1H,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;IACjD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EACJ,wGAAwG;gBACxG,uGAAuG;gBACvG,iFAAiF;SACpF,CAAC;IACJ,CAAC;IAED,IAAI,CAAE,6BAAmD,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QAC9F,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EACJ,uDAAuD,YAAY,qCAAqC;gBACxG,kCAAkC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC;gBAC5G,sGAAsG;gBACtG,yBAAyB;SAC5B,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EACJ,2GAA2G;gBAC3G,+FAA+F;SAClG,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The composed, page-driving surface for Vue — install once, then ask about
|
|
3
|
+
* a selector. Mirrors `identity-grounder.ts`'s shape exactly (`install`/
|
|
4
|
+
* `ground`) so a caller consuming both frameworks can hold one interface
|
|
5
|
+
* and switch grounders per page, without a framework-specific branch
|
|
6
|
+
* anywhere above this module.
|
|
7
|
+
*
|
|
8
|
+
* Nothing to compose here beyond the probe and the decision layer — Vue's
|
|
9
|
+
* answer needs no source-map resolver, no stack parser, no `resolveSourceRoot`
|
|
10
|
+
* (`vue-identity-grounding.ts`'s own header says why: file-level only, by
|
|
11
|
+
* construction). That is the whole reason this file is a fifth of
|
|
12
|
+
* `identity-grounder.ts`'s size rather than a second copy of it.
|
|
13
|
+
*/
|
|
14
|
+
import type { Page } from "playwright-core";
|
|
15
|
+
import type { ElementIdentity } from "./element-identity.ts";
|
|
16
|
+
export interface VueIdentityGrounder {
|
|
17
|
+
/** Installs the page-side reader into every document this page loads from now on. Call before navigating — a page navigated first reports `probe-not-installed`. */
|
|
18
|
+
install(page: Page): Promise<void>;
|
|
19
|
+
/** Resolves one on-screen element to the component that produced it, and to that component's authored file where it can be established. Never throws for a routine unavailability; refuses by name instead. */
|
|
20
|
+
ground(page: Page, selector: string): Promise<ElementIdentity>;
|
|
21
|
+
}
|
|
22
|
+
export declare function createVueIdentityGrounder(): VueIdentityGrounder;
|
|
23
|
+
//# sourceMappingURL=vue-identity-grounder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue-identity-grounder.d.ts","sourceRoot":"","sources":["../src/vue-identity-grounder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,MAAM,WAAW,mBAAmB;IAClC,oKAAoK;IACpK,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,+MAA+M;IAC/M,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAChE;AAED,wBAAgB,yBAAyB,IAAI,mBAAmB,CAW/D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The composed, page-driving surface for Vue — install once, then ask about
|
|
3
|
+
* a selector. Mirrors `identity-grounder.ts`'s shape exactly (`install`/
|
|
4
|
+
* `ground`) so a caller consuming both frameworks can hold one interface
|
|
5
|
+
* and switch grounders per page, without a framework-specific branch
|
|
6
|
+
* anywhere above this module.
|
|
7
|
+
*
|
|
8
|
+
* Nothing to compose here beyond the probe and the decision layer — Vue's
|
|
9
|
+
* answer needs no source-map resolver, no stack parser, no `resolveSourceRoot`
|
|
10
|
+
* (`vue-identity-grounding.ts`'s own header says why: file-level only, by
|
|
11
|
+
* construction). That is the whole reason this file is a fifth of
|
|
12
|
+
* `identity-grounder.ts`'s size rather than a second copy of it.
|
|
13
|
+
*/
|
|
14
|
+
import { createVueIdentityGroundingProbe } from "./vue-probe.js";
|
|
15
|
+
import { groundFromVueProbe } from "./vue-identity-grounding.js";
|
|
16
|
+
export function createVueIdentityGrounder() {
|
|
17
|
+
const probe = createVueIdentityGroundingProbe();
|
|
18
|
+
return {
|
|
19
|
+
install(page) {
|
|
20
|
+
return probe.install(page);
|
|
21
|
+
},
|
|
22
|
+
async ground(page, selector) {
|
|
23
|
+
const raw = await probe.probe(page, selector);
|
|
24
|
+
return groundFromVueProbe(raw, selector);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=vue-identity-grounder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue-identity-grounder.js","sourceRoot":"","sources":["../src/vue-identity-grounder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AASjE,MAAM,UAAU,yBAAyB;IACvC,MAAM,KAAK,GAAG,+BAA+B,EAAE,CAAC;IAChD,OAAO;QACL,OAAO,CAAC,IAAU;YAChB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAU,EAAE,QAAgB;YACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC9C,OAAO,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The decision layer for Vue: raw probe facts in, one `ElementIdentity` out
|
|
3
|
+
* — same contract `identity-grounding.ts`'s `groundFromProbe` holds for
|
|
4
|
+
* React, on the same output vocabulary, so a caller that already branches
|
|
5
|
+
* on `ElementIdentity.outcome` needs no second code path to consume this.
|
|
6
|
+
*
|
|
7
|
+
* Simpler than the React decision layer by construction, not by omission:
|
|
8
|
+
* Vue's runtime gives this package one fact per element (`type.__file`,
|
|
9
|
+
* file-level, no line) rather than React 18's file+line or React 19's
|
|
10
|
+
* compiled-stack-needing-resolution — there is no owner-stack equivalent to
|
|
11
|
+
* inject a resolver for, so this function takes no second argument.
|
|
12
|
+
*/
|
|
13
|
+
import { type ElementIdentity } from "./element-identity.ts";
|
|
14
|
+
import type { RawVueProbe } from "./vue-probe.ts";
|
|
15
|
+
export declare function groundFromVueProbe(probe: RawVueProbe, selector: string): ElementIdentity;
|
|
16
|
+
//# sourceMappingURL=vue-identity-grounding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue-identity-grounding.d.ts","sourceRoot":"","sources":["../src/vue-identity-grounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAiB,KAAK,eAAe,EAA0B,MAAM,uBAAuB,CAAC;AACpG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAkHxF"}
|