assign-gingerly 0.0.53 → 0.0.55
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/README.md +847 -5
- package/assignFrom.js +229 -9
- package/assignFrom.ts +338 -9
- package/assignGingerly.js +34 -1
- package/assignGingerly.ts +54 -1
- package/beVigilant.js +73 -0
- package/beVigilant.ts +85 -0
- package/enhanceAll.js +106 -0
- package/enhanceAll.ts +138 -0
- package/handlers/join.js +74 -0
- package/handlers/join.ts +80 -0
- package/handlers/lazyLoad.js +212 -0
- package/handlers/lazyLoad.ts +307 -0
- package/handlers/lazyLoadSwitch.js +58 -0
- package/handlers/lazyLoadSwitch.ts +63 -0
- package/handlers/microDataJoin.js +184 -0
- package/handlers/microDataJoin.ts +270 -0
- package/inferencer/.gitmodules +3 -0
- package/inferencer/.vscode/settings.json +2 -0
- package/inferencer/InferencedPropagator.js +230 -0
- package/inferencer/InferencedPropagator.ts +269 -0
- package/inferencer/LICENSE +21 -0
- package/inferencer/README.md +524 -0
- package/inferencer/Requirements/SupportForPropagator.md +368 -0
- package/inferencer/imports.html +7 -0
- package/inferencer/inferencer.js +254 -0
- package/inferencer/inferencer.ts +292 -0
- package/inferencer/package-lock.json +129 -0
- package/inferencer/package.json +60 -0
- package/inferencer/playwright-report/data/507ad515125e13390ea07de92f22331c913fa068.md +55 -0
- package/inferencer/playwright-report/index.html +90 -0
- package/inferencer/playwright.config.ts +54 -0
- package/inferencer/test-results/.last-run.json +6 -0
- package/inferencer/test-results/inferencer-Inferencer-Enha-535bc-inferencer-tests-in-browser-chromium/error-context.md +55 -0
- package/inferencer/tests/inferencedPropagator.html +428 -0
- package/inferencer/tests/inferencedPropagator.spec.ts +18 -0
- package/inferencer/tests/inferencer.html +355 -0
- package/inferencer/tests/inferencer.spec.ts +19 -0
- package/inferencer/tsconfig.json +19 -0
- package/inferencer/types/.kiro/specs/conversion-template/README.md +128 -0
- package/inferencer/types/.kiro/specs/conversion-template/design.md +360 -0
- package/inferencer/types/.kiro/specs/conversion-template/requirements.md +191 -0
- package/inferencer/types/.kiro/specs/conversion-template/tasks.md +174 -0
- package/inferencer/types/.kiro/steering/coding-standards.md +53 -0
- package/inferencer/types/.kiro/steering/conversion-guide.md +108 -0
- package/inferencer/types/.kiro/steering/declarative-configuration.md +108 -0
- package/inferencer/types/.kiro/steering/emc-json-serializability.md +306 -0
- package/inferencer/types/EnhancementConversionInstructions.md +1854 -0
- package/inferencer/types/LICENSE +21 -0
- package/inferencer/types/NewCustomElement.md +388 -0
- package/inferencer/types/NewCustomElementFeature.md +683 -0
- package/inferencer/types/NewEnhancementInstructions.md +705 -0
- package/inferencer/types/README.md +2 -0
- package/inferencer/types/agrace/types.d.ts +11 -0
- package/inferencer/types/assign-gingerly/types.d.ts +572 -0
- package/inferencer/types/be-a-beacon/types.d.ts +17 -0
- package/inferencer/types/be-bound/types.d.ts +66 -0
- package/inferencer/types/be-buttoned-up/types.d.ts +19 -0
- package/inferencer/types/be-calculating/types.d.ts +54 -0
- package/inferencer/types/be-clonable/types.d.ts +38 -0
- package/inferencer/types/be-committed/types.d.ts +22 -0
- package/inferencer/types/be-consoling/types.d.ts +24 -0
- package/inferencer/types/be-decked-with/types.d.ts +26 -0
- package/inferencer/types/be-delible/types.d.ts +27 -0
- package/inferencer/types/be-dispatching/types.d.ts +34 -0
- package/inferencer/types/be-evanescent/types.d.ts +20 -0
- package/inferencer/types/be-flashy/types.d.ts +21 -0
- package/inferencer/types/be-gone/types.d.ts +25 -0
- package/inferencer/types/be-observing/types.d.ts +55 -0
- package/inferencer/types/be-reflective/types.d.ts +78 -0
- package/inferencer/types/be-reformable/types.d.ts +49 -0
- package/inferencer/types/be-render-neutral/types.d.ts +32 -0
- package/inferencer/types/be-switched/types.d.ts +146 -0
- package/inferencer/types/be-typed/types.d.ts +32 -0
- package/inferencer/types/be-valued/types.d.ts +22 -0
- package/inferencer/types/data-props/types.d.ts +34 -0
- package/inferencer/types/do-inc/types.d.ts +56 -0
- package/inferencer/types/do-invoke/types.d.ts +38 -0
- package/inferencer/types/do-merge/types.d.ts +28 -0
- package/inferencer/types/do-toggle/types.d.ts +31 -0
- package/inferencer/types/face-up/types.d.ts +100 -0
- package/inferencer/types/fetch-for/types.d.ts +36 -0
- package/inferencer/types/folder-picker/types.d.ts +21 -0
- package/inferencer/types/global.d.ts +29 -0
- package/inferencer/types/id-generation/types.d.ts +26 -0
- package/inferencer/types/inferencer/types.d.ts +46 -0
- package/inferencer/types/mount-observer/types.d.ts +363 -0
- package/inferencer/types/nested-regex-groups/types.d.ts +107 -0
- package/inferencer/types/pipe-in/types.d.ts +52 -0
- package/inferencer/types/roundabout/types.d.ts +268 -0
- package/inferencer/types/soak-up/types.d.ts +40 -0
- package/inferencer/types/templ-maker/types.d.ts +43 -0
- package/inferencer/types/time-ticker/types.d.ts +62 -0
- package/inferencer/types/truth-sourcer/types.d.ts +44 -0
- package/inferencer/upSearch.js +27 -0
- package/inferencer/upSearch.ts +26 -0
- package/inferencer/withScopePerimeter.js +27 -0
- package/inferencer/withScopePerimeter.ts +33 -0
- package/inferredAssignments.js +38 -0
- package/inferredAssignments.ts +65 -0
- package/isAllowedImportPath.js +42 -0
- package/isAllowedImportPath.ts +53 -0
- package/package.json +57 -3
- package/paths.js +231 -0
- package/paths.ts +413 -0
- package/processHandlerCommands.js +188 -0
- package/processHandlerCommands.ts +217 -0
- package/resolveIdRef.js +144 -0
- package/resolveIdRef.ts +170 -0
- package/resolveValues.js +41 -2
- package/resolveValues.ts +41 -1
- package/transitionHelper.js +109 -0
- package/transitionHelper.ts +132 -0
- package/types/assign-gingerly/types.d.ts +89 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import type { EnhancementConfig } from "./types/assign-gingerly/types";
|
|
2
|
+
import { withScopePerimeter } from "./withScopePerimeter.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Symbol for smart value assignment
|
|
6
|
+
* When used with element.set[value], it infers and sets the appropriate value property
|
|
7
|
+
*/
|
|
8
|
+
export const value = Symbol.for('inferencer:value');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Symbol for smart display assignment
|
|
12
|
+
* When used with element.set[display], it infers and sets the appropriate display property
|
|
13
|
+
*/
|
|
14
|
+
export const display = Symbol.for('inferencer:display');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Enhancement class that provides smart value and display property inference
|
|
18
|
+
* Automatically determines the correct property to set based on element type
|
|
19
|
+
*/
|
|
20
|
+
export class Infer<TValue = any, TDisplay = any> {
|
|
21
|
+
#weakRef: WeakRef<Element>;
|
|
22
|
+
|
|
23
|
+
#propName: string | undefined;
|
|
24
|
+
|
|
25
|
+
#propagator: EventTarget | undefined;
|
|
26
|
+
|
|
27
|
+
get enhancedElement(){
|
|
28
|
+
return this.#weakRef.deref()!;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
constructor(enhancedElement?: Element, propName?: string){
|
|
32
|
+
this.#weakRef = new WeakRef(enhancedElement!);
|
|
33
|
+
this.#propName = propName;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Get a propagator (EventTarget) that emits events when properties change.
|
|
38
|
+
* For custom elements with a native propagator (roundabout), returns that directly.
|
|
39
|
+
* Otherwise, creates an InferencedPropagator that uses best-effort strategies
|
|
40
|
+
* to detect property changes.
|
|
41
|
+
*/
|
|
42
|
+
async getPropagator(): Promise<EventTarget> {
|
|
43
|
+
if (this.#propagator) return this.#propagator;
|
|
44
|
+
|
|
45
|
+
const {enhancedElement} = this;
|
|
46
|
+
const {localName} = enhancedElement;
|
|
47
|
+
|
|
48
|
+
if (localName.includes('-')) {
|
|
49
|
+
await (
|
|
50
|
+
(enhancedElement as any).customElementRegistry || customElements
|
|
51
|
+
).whenDefined(localName);
|
|
52
|
+
const {propagator} = enhancedElement as any;
|
|
53
|
+
if (propagator instanceof EventTarget) {
|
|
54
|
+
this.#propagator = propagator;
|
|
55
|
+
return propagator;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// No native propagator — create an inferred one
|
|
60
|
+
const {InferencedPropagator} = await import('./InferencedPropagator.js');
|
|
61
|
+
this.#propagator = new InferencedPropagator(this);
|
|
62
|
+
return this.#propagator;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#value: TValue | undefined;
|
|
66
|
+
|
|
67
|
+
get value(): TValue | undefined {
|
|
68
|
+
return this.#value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
set value(nv: TValue){
|
|
72
|
+
this.#value = nv;
|
|
73
|
+
const {enhancedElement} = this;
|
|
74
|
+
(enhancedElement as any)[inferValueProperty(enhancedElement)] = nv;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#display: TDisplay | undefined;
|
|
78
|
+
|
|
79
|
+
get display(): TDisplay | undefined {
|
|
80
|
+
return this.#display;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
set display(nv: TDisplay){
|
|
84
|
+
this.#display = nv;
|
|
85
|
+
const {enhancedElement} = this;
|
|
86
|
+
(enhancedElement as any)[inferDisplayProperty(enhancedElement)] = nv;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get the inferred event type for the element
|
|
91
|
+
* @returns The most appropriate event type for this element
|
|
92
|
+
*/
|
|
93
|
+
get eventType(): string {
|
|
94
|
+
return inferEventType(this.enhancedElement);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get the inferred value property name for the element
|
|
99
|
+
* @returns The property name used for value assignment (e.g. 'value', 'checked', 'dateTime')
|
|
100
|
+
*/
|
|
101
|
+
get valueProperty(): string {
|
|
102
|
+
return inferValueProperty(this.enhancedElement);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
['|'](itempropAttr: string, scopeBoundary: string = '[itemscope]'){
|
|
106
|
+
const candidates = this.enhancedElement.querySelectorAll(`[itemprop="${itempropAttr}"]`);
|
|
107
|
+
return Array.from(candidates)
|
|
108
|
+
.filter(el => withScopePerimeter(this.enhancedElement, el, scopeBoundary))
|
|
109
|
+
.map(x => new Infer(x, itempropAttr));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
['@'](nameAttr: string, scopeBoundary?: string){
|
|
113
|
+
const candidates = this.enhancedElement.querySelectorAll(`[name="${nameAttr}"]`);
|
|
114
|
+
const filtered = scopeBoundary
|
|
115
|
+
? Array.from(candidates).filter(el => withScopePerimeter(this.enhancedElement, el, scopeBoundary))
|
|
116
|
+
: Array.from(candidates);
|
|
117
|
+
return filtered.map(x => new Infer(x, nameAttr));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
['%'](partAttr: string, scopeBoundary?: string){
|
|
121
|
+
const candidates = this.enhancedElement.querySelectorAll(`[part~="${partAttr}"]`);
|
|
122
|
+
const filtered = scopeBoundary
|
|
123
|
+
? Array.from(candidates).filter(el => withScopePerimeter(this.enhancedElement, el, scopeBoundary))
|
|
124
|
+
: Array.from(candidates);
|
|
125
|
+
return filtered.map(x => new Infer(x, partAttr));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
['#'](id: string, scopeBoundary?: string){
|
|
129
|
+
const candidates = this.enhancedElement.querySelectorAll(`#${id}`);
|
|
130
|
+
const filtered = scopeBoundary
|
|
131
|
+
? Array.from(candidates).filter(el => withScopePerimeter(this.enhancedElement, el, scopeBoundary))
|
|
132
|
+
: Array.from(candidates);
|
|
133
|
+
return filtered.map(x => new Infer(x, id));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
['.'](className: string, scopeBoundary?: string){
|
|
137
|
+
const candidates = this.enhancedElement.querySelectorAll(`.${className}`);
|
|
138
|
+
const filtered = scopeBoundary
|
|
139
|
+
? Array.from(candidates).filter(el => withScopePerimeter(this.enhancedElement, el, scopeBoundary))
|
|
140
|
+
: Array.from(candidates);
|
|
141
|
+
return filtered.map(x => new Infer(x, className));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
setDisplay(vm: any){
|
|
145
|
+
const val = this.#propName ? vm[this.#propName] : inferBindingProperty(this.enhancedElement);
|
|
146
|
+
this.display = val;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
get defaultRemoteBindingPropName(){
|
|
150
|
+
const {enhancedElement} = this;
|
|
151
|
+
return enhancedElement.getAttribute('itemprop') || enhancedElement.getAttribute('name') || enhancedElement.getAttribute('id') || 'value'
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Registry item for the Infer enhancement
|
|
157
|
+
* Register this with customElements.enhancementRegistry to enable smart value/display assignment
|
|
158
|
+
*/
|
|
159
|
+
export const registryItem: EnhancementConfig<any> = {
|
|
160
|
+
spawn: Infer as any,
|
|
161
|
+
enhKey: 'inferencer',
|
|
162
|
+
symlinks: {
|
|
163
|
+
[value]: 'value',
|
|
164
|
+
[display]: 'display'
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Infer the most appropriate value property for an element
|
|
170
|
+
* @param element - The element to infer the property for
|
|
171
|
+
* @returns The property name to use for value assignment
|
|
172
|
+
*/
|
|
173
|
+
export function inferValueProperty(element: Element): string {
|
|
174
|
+
// Non-empty itemscope → route through ish (itemscope manager)
|
|
175
|
+
const itemscope = element.getAttribute('itemscope');
|
|
176
|
+
if (itemscope !== null && itemscope !== '') {
|
|
177
|
+
return 'ish';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const {localName} = element;
|
|
181
|
+
|
|
182
|
+
switch (localName) {
|
|
183
|
+
case 'input': {
|
|
184
|
+
const type = element.getAttribute('type')?.toLowerCase();
|
|
185
|
+
switch (type) {
|
|
186
|
+
case 'checkbox':
|
|
187
|
+
case 'radio':
|
|
188
|
+
return 'checked';
|
|
189
|
+
case 'number':
|
|
190
|
+
case 'range':
|
|
191
|
+
return 'valueAsNumber';
|
|
192
|
+
default:
|
|
193
|
+
return 'value';
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
case 'textarea':
|
|
197
|
+
case 'select':
|
|
198
|
+
case 'data':
|
|
199
|
+
case 'meter':
|
|
200
|
+
case 'progress':
|
|
201
|
+
case 'output':
|
|
202
|
+
return 'value';
|
|
203
|
+
case 'time':
|
|
204
|
+
return 'dateTime';
|
|
205
|
+
case 'a':
|
|
206
|
+
case 'area':
|
|
207
|
+
return 'href';
|
|
208
|
+
default: {
|
|
209
|
+
return 'textContent';
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Infer the most appropriate display property for an element
|
|
216
|
+
* @param element - The element to infer the property for
|
|
217
|
+
* @returns The property name to use for display assignment
|
|
218
|
+
*/
|
|
219
|
+
export function inferDisplayProperty(element: Element): string {
|
|
220
|
+
const {localName} = element;
|
|
221
|
+
|
|
222
|
+
switch (localName) {
|
|
223
|
+
case 'input':
|
|
224
|
+
case 'textarea':
|
|
225
|
+
case 'select':
|
|
226
|
+
return 'value';
|
|
227
|
+
case 'meter':
|
|
228
|
+
case 'progress':
|
|
229
|
+
return 'ariaValueText';
|
|
230
|
+
case 'time':
|
|
231
|
+
case 'data':
|
|
232
|
+
default:
|
|
233
|
+
return 'textContent';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Infer the most appropriate event type for an element
|
|
239
|
+
* Used when no explicit event type is provided
|
|
240
|
+
* @param element - The element to infer the event type for
|
|
241
|
+
* @returns The event type name like 'input', 'change', 'click', 'submit'
|
|
242
|
+
*/
|
|
243
|
+
export function inferEventType(element: Element): string {
|
|
244
|
+
const {localName} = element;
|
|
245
|
+
|
|
246
|
+
switch (localName) {
|
|
247
|
+
case 'input':
|
|
248
|
+
case 'textarea':
|
|
249
|
+
case 'select':
|
|
250
|
+
return 'input';
|
|
251
|
+
case 'form':
|
|
252
|
+
return 'submit';
|
|
253
|
+
case 'details':
|
|
254
|
+
return 'toggle';
|
|
255
|
+
case 'dialog':
|
|
256
|
+
return 'close';
|
|
257
|
+
default:
|
|
258
|
+
return 'click';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Check if an element requires propagator-based observation for value changes.
|
|
264
|
+
* Elements like <data>, <meter>, <output>, <time> have no meaningful user-driven
|
|
265
|
+
* event for value changes — their values change programmatically and reflect to attributes.
|
|
266
|
+
* Custom elements (names containing '-') should also use the propagator path, since they
|
|
267
|
+
* may expose a native propagator (EventTarget) for property change notification.
|
|
268
|
+
* For these elements, consumers should use InferencedPropagator rather than raw addEventListener.
|
|
269
|
+
* @param element - The element to check
|
|
270
|
+
* @returns true if the element needs propagator-based observation
|
|
271
|
+
*/
|
|
272
|
+
export function needsPropagator(element: Element): boolean {
|
|
273
|
+
const {localName} = element;
|
|
274
|
+
switch (localName) {
|
|
275
|
+
case 'data':
|
|
276
|
+
case 'meter':
|
|
277
|
+
case 'output':
|
|
278
|
+
case 'time':
|
|
279
|
+
return true;
|
|
280
|
+
default:
|
|
281
|
+
// Custom elements should use propagator path — Infer.getPropagator()
|
|
282
|
+
// will check for a native propagator or fall back to InferencedPropagator
|
|
283
|
+
if (localName.includes('-')) return true;
|
|
284
|
+
return inferEventType(element) === 'click';
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export function inferBindingProperty(element: Element): string {
|
|
289
|
+
return element.getAttribute('itemprop') || element.getAttribute('name') || element.getAttribute('id') || 'value';
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export default registryItem;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "inferencer",
|
|
3
|
+
"version": "0.0.13",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "inferencer",
|
|
9
|
+
"version": "0.0.13",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"assign-gingerly": "0.0.51"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@playwright/test": "1.60.0",
|
|
16
|
+
"@types/node": "25.9.3",
|
|
17
|
+
"spa-ssi": "0.0.27",
|
|
18
|
+
"typescript": "6.0.3"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"node_modules/@playwright/test": {
|
|
22
|
+
"version": "1.60.0",
|
|
23
|
+
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz",
|
|
24
|
+
"integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==",
|
|
25
|
+
"dev": true,
|
|
26
|
+
"license": "Apache-2.0",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"playwright": "1.60.0"
|
|
29
|
+
},
|
|
30
|
+
"bin": {
|
|
31
|
+
"playwright": "cli.js"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"node_modules/@types/node": {
|
|
38
|
+
"version": "25.9.3",
|
|
39
|
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz",
|
|
40
|
+
"integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==",
|
|
41
|
+
"dev": true,
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"undici-types": ">=7.24.0 <7.24.7"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"node_modules/assign-gingerly": {
|
|
48
|
+
"version": "0.0.51",
|
|
49
|
+
"resolved": "https://registry.npmjs.org/assign-gingerly/-/assign-gingerly-0.0.51.tgz",
|
|
50
|
+
"integrity": "sha512-aHs6TYjhZbzwWJgogOK+3dpbuz7gk82jn0un1UdVLyobyTD1QZKwYz/nORavD/hsMT4Lcwhe/HO8sbQkkFZ/GQ==",
|
|
51
|
+
"license": "MIT"
|
|
52
|
+
},
|
|
53
|
+
"node_modules/fsevents": {
|
|
54
|
+
"version": "2.3.2",
|
|
55
|
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
|
56
|
+
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
|
57
|
+
"dev": true,
|
|
58
|
+
"hasInstallScript": true,
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"optional": true,
|
|
61
|
+
"os": [
|
|
62
|
+
"darwin"
|
|
63
|
+
],
|
|
64
|
+
"engines": {
|
|
65
|
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"node_modules/playwright": {
|
|
69
|
+
"version": "1.60.0",
|
|
70
|
+
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz",
|
|
71
|
+
"integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==",
|
|
72
|
+
"dev": true,
|
|
73
|
+
"license": "Apache-2.0",
|
|
74
|
+
"dependencies": {
|
|
75
|
+
"playwright-core": "1.60.0"
|
|
76
|
+
},
|
|
77
|
+
"bin": {
|
|
78
|
+
"playwright": "cli.js"
|
|
79
|
+
},
|
|
80
|
+
"engines": {
|
|
81
|
+
"node": ">=18"
|
|
82
|
+
},
|
|
83
|
+
"optionalDependencies": {
|
|
84
|
+
"fsevents": "2.3.2"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"node_modules/playwright-core": {
|
|
88
|
+
"version": "1.60.0",
|
|
89
|
+
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz",
|
|
90
|
+
"integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==",
|
|
91
|
+
"dev": true,
|
|
92
|
+
"license": "Apache-2.0",
|
|
93
|
+
"bin": {
|
|
94
|
+
"playwright-core": "cli.js"
|
|
95
|
+
},
|
|
96
|
+
"engines": {
|
|
97
|
+
"node": ">=18"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"node_modules/spa-ssi": {
|
|
101
|
+
"version": "0.0.27",
|
|
102
|
+
"resolved": "https://registry.npmjs.org/spa-ssi/-/spa-ssi-0.0.27.tgz",
|
|
103
|
+
"integrity": "sha512-bV/ChmBlGBQLyroDcng/PR5IeH9LokcNxMuoURE0vDy2NNkW7uFVofvQjLpUMW6IdlCACpOEJsAStACz2kB6iA==",
|
|
104
|
+
"dev": true,
|
|
105
|
+
"license": "MIT"
|
|
106
|
+
},
|
|
107
|
+
"node_modules/typescript": {
|
|
108
|
+
"version": "6.0.3",
|
|
109
|
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
|
|
110
|
+
"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
|
|
111
|
+
"dev": true,
|
|
112
|
+
"license": "Apache-2.0",
|
|
113
|
+
"bin": {
|
|
114
|
+
"tsc": "bin/tsc",
|
|
115
|
+
"tsserver": "bin/tsserver"
|
|
116
|
+
},
|
|
117
|
+
"engines": {
|
|
118
|
+
"node": ">=14.17"
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"node_modules/undici-types": {
|
|
122
|
+
"version": "7.24.6",
|
|
123
|
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
|
|
124
|
+
"integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
|
|
125
|
+
"dev": true,
|
|
126
|
+
"license": "MIT"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "inferencer",
|
|
3
|
+
"version": "0.0.13",
|
|
4
|
+
"description": "DOM Element Enhancement that makes commonly used inferences",
|
|
5
|
+
"homepage": "https://github.com/bahrus/inferencer#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/bahrus/inferencer/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/bahrus/inferencer.git"
|
|
12
|
+
},
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "Bruce B. Anderson <anderson.bruce.b@gmail.com>",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"types": "types/inferencer/types.d.ts",
|
|
17
|
+
"files": [
|
|
18
|
+
"*.js",
|
|
19
|
+
"*.ts",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE",
|
|
22
|
+
"types/inferencer/types.d.ts"
|
|
23
|
+
],
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"default": "./inferencer.js",
|
|
27
|
+
"types": "./inferencer.ts"
|
|
28
|
+
},
|
|
29
|
+
"./inferencer.js": {
|
|
30
|
+
"default": "./inferencer.js",
|
|
31
|
+
"types": "./inferencer.ts"
|
|
32
|
+
},
|
|
33
|
+
"./InferencedPropagator.js": {
|
|
34
|
+
"default": "./InferencedPropagator.js",
|
|
35
|
+
"types": "./InferencedPropagator.ts"
|
|
36
|
+
},
|
|
37
|
+
"./upSearch.js": {
|
|
38
|
+
"default": "./upSearch.js",
|
|
39
|
+
"types": "./upSearch.ts"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"main": "inferencer.js",
|
|
43
|
+
"module": "inferencer.js",
|
|
44
|
+
"scripts": {
|
|
45
|
+
"serve": "node ./node_modules/spa-ssi/serve.js",
|
|
46
|
+
"test": "playwright test",
|
|
47
|
+
"update": "ncu -u && npm install",
|
|
48
|
+
"safari": "npx playwright wk http://localhost:8000",
|
|
49
|
+
"chrome": "npx playwright cr http://localhost:8000"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"assign-gingerly": "0.0.51"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@playwright/test": "1.60.0",
|
|
56
|
+
"spa-ssi": "0.0.27",
|
|
57
|
+
"@types/node": "25.9.3",
|
|
58
|
+
"typescript": "6.0.3"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Instructions
|
|
2
|
+
|
|
3
|
+
- Following Playwright test failed.
|
|
4
|
+
- Explain why, be concise, respect Playwright best practices.
|
|
5
|
+
- Provide a snippet of code with the fix, if possible.
|
|
6
|
+
|
|
7
|
+
# Test info
|
|
8
|
+
|
|
9
|
+
- Name: inferencer.spec.ts >> Inferencer Enhancement › should run all inferencer tests in browser
|
|
10
|
+
- Location: tests\inferencer.spec.ts:3:1
|
|
11
|
+
|
|
12
|
+
# Error details
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Error: expect(received).toBe(expected) // Object.is equality
|
|
16
|
+
|
|
17
|
+
Expected: 28
|
|
18
|
+
Received: 25
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
# Page snapshot
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
- generic [active] [ref=e1]:
|
|
25
|
+
- heading "Inferencer Enhancement Tests" [level=1] [ref=e2]
|
|
26
|
+
- generic [ref=e3]:
|
|
27
|
+
- 'heading "Results: 25/28 tests passed" [level=2] [ref=e4]'
|
|
28
|
+
- generic [ref=e5]: "✓ should set value on text input ✓ should set checked on checkbox ✓ should set checked on radio button ✓ should set value on textarea ✓ should set value on select ✓ should set textContent on div ✓ should set dateTime on time element ✓ should set value on data element ✓ should set value on progress element ✓ should set value on meter element ✓ should set value on output element ✓ should use itemprop as property name ✓ should set display (textContent) on div ✓ should set display (textContent) on time element ✓ should set display (ariaValueText) on meter element ✗ should be accessible via enh.infer: Enhancement not accessible via enh.infer ✓ should handle multiple value assignments ✓ should handle both value and display assignments ✓ should infer \"input\" event for input element ✓ should infer \"input\" event for textarea element ✓ should infer \"input\" event for select element ✓ should infer \"submit\" event for form element ✓ should infer \"toggle\" event for details element ✓ should infer \"close\" event for dialog element ✓ should infer \"click\" event for button element ✓ should infer \"click\" event for div element ✗ should access eventType via enh.infer.eventType: Cannot read properties of undefined (reading 'eventType') ✗ should return correct eventType for different elements via getter: Cannot read properties of undefined (reading 'eventType')"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
# Test source
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
1 | import { test, expect } from '@playwright/test';
|
|
35
|
+
2 |
|
|
36
|
+
3 | test('Inferencer Enhancement › should run all inferencer tests in browser', async ({ page }) => {
|
|
37
|
+
4 | // Start local server and navigate
|
|
38
|
+
5 | await page.goto('http://localhost:8000/tests/inferencer.html');
|
|
39
|
+
6 |
|
|
40
|
+
7 | // Wait for tests to complete
|
|
41
|
+
8 | await page.waitForFunction(() => window.testResults !== undefined, { timeout: 5000 });
|
|
42
|
+
9 |
|
|
43
|
+
10 | // Get test results
|
|
44
|
+
11 | const results = await page.evaluate(() => window.testResults);
|
|
45
|
+
12 |
|
|
46
|
+
13 | // Log results
|
|
47
|
+
14 | console.log(`Inferencer tests: ${results.passed}/${results.total} passed`);
|
|
48
|
+
15 | results.results.forEach((result: string) => console.log(result));
|
|
49
|
+
16 |
|
|
50
|
+
17 | // Assert all tests passed
|
|
51
|
+
> 18 | expect(results.passed).toBe(results.total);
|
|
52
|
+
| ^ Error: expect(received).toBe(expected) // Object.is equality
|
|
53
|
+
19 | });
|
|
54
|
+
20 |
|
|
55
|
+
```
|