wrec 0.32.0 → 0.33.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/dist/{wrec-Cpci7nM6.js → wrec-BL9AvT9R.js} +129 -114
- package/dist/wrec-ssr.es.js +1 -1
- package/dist/wrec.es.js +1 -1
- package/package.json +1 -1
- package/scripts/lint.js +35 -0
- package/scripts/used-by.js +63 -25
|
@@ -303,7 +303,9 @@ var X = class e extends m {
|
|
|
303
303
|
#s = null;
|
|
304
304
|
#c = /* @__PURE__ */ new Map();
|
|
305
305
|
#l = /* @__PURE__ */ new Map();
|
|
306
|
-
#u = /* @__PURE__ */ new
|
|
306
|
+
#u = /* @__PURE__ */ new WeakMap();
|
|
307
|
+
#d = /* @__PURE__ */ new WeakSet();
|
|
308
|
+
#f = /* @__PURE__ */ new Map();
|
|
307
309
|
static define(e) {
|
|
308
310
|
if (this.elementName = e, h.get(e)) throw new g(`custom element ${e} is already defined`);
|
|
309
311
|
h.define(e, this);
|
|
@@ -311,13 +313,13 @@ var X = class e extends m {
|
|
|
311
313
|
constructor() {
|
|
312
314
|
super(), this.attachShadow({ mode: "open" });
|
|
313
315
|
let e = this.#n;
|
|
314
|
-
this.#
|
|
316
|
+
this.#E("attrToPropMap") || (e.attrToPropMap = /* @__PURE__ */ new Map()), this.#E("computedGraph") || (e.computedGraph = null), this.#E("computedPropsRegistered") || (e.computedPropsRegistered = !1), this.#E("properties") || (e.properties = {}), this.#E("propToAttrMap") || (e.propToAttrMap = /* @__PURE__ */ new Map()), this.#E("propToComputedMap") || (e.propToComputedMap = /* @__PURE__ */ new Map()), this.#E("propToExprsMap") || (e.propToExprsMap = /* @__PURE__ */ new Map()), this.#E("registeredComputedProps") || (e.registeredComputedProps = /* @__PURE__ */ new Set());
|
|
315
317
|
}
|
|
316
318
|
attributeChangedCallback(t, n, r) {
|
|
317
|
-
t === "disabled" && this.#
|
|
319
|
+
t === "disabled" && this.#v();
|
|
318
320
|
let i = e.getPropName(t);
|
|
319
|
-
if (!this.#
|
|
320
|
-
let e = this.#
|
|
321
|
+
if (!this.#O(i) && this.#D(i)) {
|
|
322
|
+
let e = this.#V(i, r);
|
|
321
323
|
this[i] = e;
|
|
322
324
|
let t = this.#i[i];
|
|
323
325
|
t && this.setFormValue(t, String(e));
|
|
@@ -331,15 +333,15 @@ var X = class e extends m {
|
|
|
331
333
|
let e = t.get(r) ?? [];
|
|
332
334
|
for (let t of e) n.add(t);
|
|
333
335
|
}
|
|
334
|
-
let r = this.#
|
|
336
|
+
let r = this.#w(Object.keys(e));
|
|
335
337
|
for (let [e, i] of r) {
|
|
336
|
-
this.#
|
|
338
|
+
this.#F(e, this.#x(i));
|
|
337
339
|
let r = t.get(e) ?? [];
|
|
338
340
|
for (let e of r) n.add(e);
|
|
339
341
|
}
|
|
340
|
-
this.#
|
|
342
|
+
this.#b([...n]), this.#e = !1;
|
|
341
343
|
}
|
|
342
|
-
async #
|
|
344
|
+
async #p() {
|
|
343
345
|
let e = this.#n, { template: t } = e;
|
|
344
346
|
t || (t = e.template = document.createElement("template"), t.innerHTML = e.buildHTML()), await Y(t), this.shadowRoot.replaceChildren(t.content.cloneNode(!0));
|
|
345
347
|
}
|
|
@@ -354,37 +356,37 @@ var X = class e extends m {
|
|
|
354
356
|
this[t] = n;
|
|
355
357
|
}
|
|
356
358
|
async connectedCallback() {
|
|
357
|
-
this.#
|
|
359
|
+
this.#q(), this.#h(), await this.#p(), this.hasAttribute("disabled") && this.#v(), this.#Q(this.shadowRoot), this.#A(this.shadowRoot), this.#K(), this.#m(), this.ready();
|
|
358
360
|
}
|
|
359
|
-
#
|
|
361
|
+
#m() {
|
|
360
362
|
let { properties: e } = this.#n;
|
|
361
|
-
for (let [t, { computed: n }] of Object.entries(e)) n && this.#
|
|
363
|
+
for (let [t, { computed: n }] of Object.entries(e)) n && this.#F(t, this.#x(n));
|
|
362
364
|
}
|
|
363
|
-
#
|
|
365
|
+
#h() {
|
|
364
366
|
let { observedAttributes: e, properties: t } = this.#n;
|
|
365
|
-
for (let [n, r] of Object.entries(t)) r.computed || this.#
|
|
366
|
-
for (let [n, r] of Object.entries(t)) r.computed && this.#
|
|
367
|
-
this.#
|
|
367
|
+
for (let [n, r] of Object.entries(t)) r.computed || this.#g(n, r, e);
|
|
368
|
+
for (let [n, r] of Object.entries(t)) r.computed && this.#g(n, r, e);
|
|
369
|
+
this.#N();
|
|
368
370
|
}
|
|
369
|
-
#
|
|
371
|
+
#g(t, n, r) {
|
|
370
372
|
if (t === "class" || t === "style") throw new g(`"${t}" is a reserved property`);
|
|
371
373
|
let i = e.getAttrName(t), a = this.hasAttribute(i);
|
|
372
|
-
n.required && !a && this.#
|
|
374
|
+
n.required && !a && this.#R(this, i, "is a required attribute");
|
|
373
375
|
let o = n.value;
|
|
374
376
|
this.hasOwnProperty(t) && (o = this[t], delete this[t]);
|
|
375
|
-
let { type: c } = n, l = c === Boolean ? o || a : r.includes(i) && a ? this.#
|
|
376
|
-
this[u] = l, Object.defineProperty(this, t, {
|
|
377
|
+
let { type: c } = n, l = c === Boolean ? o || a : r.includes(i) && a ? this.#B(t, i) : o ?? k(n), u = "#" + t;
|
|
378
|
+
this[u] = this.#k(t, c, l), Object.defineProperty(this, t, {
|
|
377
379
|
enumerable: !0,
|
|
378
380
|
get() {
|
|
379
381
|
return this[u];
|
|
380
382
|
},
|
|
381
383
|
set(e) {
|
|
382
|
-
n.computed && !this.#t.has(t) && this.#
|
|
384
|
+
n.computed && !this.#t.has(t) && this.#R(null, t, "is a computed property and cannot be set directly"), c === Number && typeof e == "string" && (e = G(e));
|
|
383
385
|
let r = this[u];
|
|
384
386
|
if (e === r) return;
|
|
385
|
-
this.#
|
|
387
|
+
this.#X(t, c, e), e = this.#k(t, c, e), this[u] = e;
|
|
386
388
|
let a = this.#l.get(t);
|
|
387
|
-
a && s(a.state, a.stateProp, e), this.#
|
|
389
|
+
a && s(a.state, a.stateProp, e), this.#H(t, c, e, i), this.#e || (this.#U(t), this.#M(t)), this.#G(t, e);
|
|
388
390
|
let o = this.#i[t];
|
|
389
391
|
o && this.setFormValue(o, String(e)), this.propertyChangedCallback(t, r, e), n.dispatch && this.dispatch("change", {
|
|
390
392
|
tagName: this.localName,
|
|
@@ -395,13 +397,17 @@ var X = class e extends m {
|
|
|
395
397
|
}
|
|
396
398
|
});
|
|
397
399
|
}
|
|
398
|
-
#
|
|
400
|
+
#_(e, t, n) {
|
|
401
|
+
let r = this["#" + e], i = this.#l.get(e);
|
|
402
|
+
i && s(i.state, i.stateProp, r), this.#e || (this.#U(e), this.#M(e)), this.#G(e, r), this.propertyChangedCallback(e, t, n);
|
|
403
|
+
}
|
|
404
|
+
#v() {
|
|
399
405
|
let e = this.hasAttribute("disabled"), t = j(this.shadowRoot);
|
|
400
406
|
for (let n of t) D(n) && (n.disabled = e);
|
|
401
407
|
}
|
|
402
408
|
disconnectedCallback() {
|
|
403
|
-
for (let { unsubscribe: e } of this.#
|
|
404
|
-
this.#r.clear(), this.#o.clear(), this.#c.clear(), this.#l.clear(), this.#
|
|
409
|
+
for (let { unsubscribe: e } of this.#f.values()) e();
|
|
410
|
+
this.#r.clear(), this.#o.clear(), this.#c.clear(), this.#l.clear(), this.#f.clear();
|
|
405
411
|
}
|
|
406
412
|
dispatch(e, t) {
|
|
407
413
|
this.dispatchEvent(new CustomEvent(e, {
|
|
@@ -413,39 +419,39 @@ var X = class e extends m {
|
|
|
413
419
|
displayIfSet(e, t = "block") {
|
|
414
420
|
return `display: ${e == null ? "none" : t}`;
|
|
415
421
|
}
|
|
416
|
-
#
|
|
422
|
+
#y(t) {
|
|
417
423
|
let n = t instanceof e;
|
|
418
424
|
for (let r of t.getAttributeNames()) {
|
|
419
425
|
let i = t.getAttribute(r);
|
|
420
426
|
if (r === "ref") {
|
|
421
|
-
this.#
|
|
427
|
+
this.#L(t, i);
|
|
422
428
|
continue;
|
|
423
429
|
}
|
|
424
|
-
let a = this.#
|
|
430
|
+
let a = this.#j(t, i);
|
|
425
431
|
if (a) {
|
|
426
432
|
let i = this[a];
|
|
427
|
-
i === void 0 && this.#
|
|
433
|
+
i === void 0 && this.#z(t, r, a);
|
|
428
434
|
let [o, s] = r.split(":"), c = e.getPropName(o);
|
|
429
435
|
if (o === "checked") {
|
|
430
436
|
let { type: e } = this.#n.properties[a];
|
|
431
|
-
I(t) && e !== Boolean && this.#
|
|
437
|
+
I(t) && e !== Boolean && this.#R(t, r, `refers to property "${a}" whose type is not Boolean`), z(t) && e !== String && this.#R(t, r, `refers to property "${a}" whose type is not String`);
|
|
432
438
|
}
|
|
433
|
-
let l = this.#
|
|
434
|
-
n && t.#
|
|
439
|
+
let l = this.#O(a);
|
|
440
|
+
n && t.#O(c) || (o === "checked" && z(t) ? t.checked = t.value === i : t[c] = i), o === "value" && (s ? (t["on" + s] === void 0 && this.#R(t, r, "refers to an unsupported event name"), t.setAttribute(o, this[a])) : s = "change"), n && !l && t.#c.set(e.getPropName(o), a);
|
|
435
441
|
}
|
|
436
|
-
this.#
|
|
442
|
+
this.#I(i, t, r);
|
|
437
443
|
}
|
|
438
444
|
}
|
|
439
|
-
#
|
|
445
|
+
#b(e) {
|
|
440
446
|
for (let t of e) {
|
|
441
|
-
let e = this.#
|
|
447
|
+
let e = this.#x(t), n = this.#r.get(t) ?? [], r = /* @__PURE__ */ new Set();
|
|
442
448
|
for (let t of n) {
|
|
443
449
|
let n = t instanceof HTMLElement || t instanceof CSSStyleRule ? t : t.element;
|
|
444
450
|
if (n instanceof HTMLElement && !n.isConnected) {
|
|
445
451
|
r.add(t);
|
|
446
452
|
continue;
|
|
447
453
|
}
|
|
448
|
-
if (t instanceof HTMLElement) this.#
|
|
454
|
+
if (t instanceof HTMLElement) this.#W(t, e);
|
|
449
455
|
else if (!(t instanceof CSSStyleRule)) {
|
|
450
456
|
let { element: n, attrName: r } = t;
|
|
451
457
|
n instanceof CSSStyleRule ? n.style.setProperty(r, e) : q(n, r, e);
|
|
@@ -457,11 +463,11 @@ var X = class e extends m {
|
|
|
457
463
|
}
|
|
458
464
|
}
|
|
459
465
|
}
|
|
460
|
-
#
|
|
466
|
+
#x(e) {
|
|
461
467
|
let { context: t } = this.#n;
|
|
462
468
|
return Function("context", `const {${Object.keys(t).join(",")}} = context; return ${e};`).call(this, t);
|
|
463
469
|
}
|
|
464
|
-
#
|
|
470
|
+
#S(e) {
|
|
465
471
|
let { localName: t } = e;
|
|
466
472
|
if (t === "style") {
|
|
467
473
|
let { sheet: t } = e, n = t?.cssRules ?? [], r = Array.from(n);
|
|
@@ -469,13 +475,13 @@ var X = class e extends m {
|
|
|
469
475
|
let t = Array.from(e.style);
|
|
470
476
|
for (let n of t) if (n.startsWith("--")) {
|
|
471
477
|
let t = e.style.getPropertyValue(n);
|
|
472
|
-
this.#
|
|
478
|
+
this.#I(t, e, n);
|
|
473
479
|
}
|
|
474
480
|
}
|
|
475
481
|
} else {
|
|
476
482
|
let t = "";
|
|
477
483
|
if (B(e)) {
|
|
478
|
-
this.#
|
|
484
|
+
this.#I(e.textContent, e);
|
|
479
485
|
let n = e.textContent?.match(x);
|
|
480
486
|
n && (t = n[1]);
|
|
481
487
|
} else {
|
|
@@ -483,8 +489,8 @@ var X = class e extends m {
|
|
|
483
489
|
n && (t = n.textContent?.trim() ?? "");
|
|
484
490
|
}
|
|
485
491
|
if (t) {
|
|
486
|
-
let n = this.#
|
|
487
|
-
n && B(e) ? e.textContent = this[n] : this.#
|
|
492
|
+
let n = this.#j(e, t);
|
|
493
|
+
n && B(e) ? e.textContent = this[n] : this.#I(t, e);
|
|
488
494
|
}
|
|
489
495
|
}
|
|
490
496
|
}
|
|
@@ -492,7 +498,7 @@ var X = class e extends m {
|
|
|
492
498
|
let e = this.getAttribute("form-assoc");
|
|
493
499
|
if (!e) {
|
|
494
500
|
let t = this.getAttribute("name");
|
|
495
|
-
if (t) if (this.#
|
|
501
|
+
if (t) if (this.#D("value")) e = `value:${t}`;
|
|
496
502
|
else return;
|
|
497
503
|
else return;
|
|
498
504
|
}
|
|
@@ -513,14 +519,14 @@ var X = class e extends m {
|
|
|
513
519
|
let e = this.#o;
|
|
514
520
|
for (let t of Object.keys(e)) {
|
|
515
521
|
let n = e[t];
|
|
516
|
-
C.test(n) && (n = this.#
|
|
522
|
+
C.test(n) && (n = this.#x(n)), this[t] = n;
|
|
517
523
|
}
|
|
518
524
|
}
|
|
519
525
|
static getAttrName(e) {
|
|
520
526
|
let t = this.propToAttrMap.get(e);
|
|
521
527
|
return t || (t = e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), this.propToAttrMap.set(e, t)), t;
|
|
522
528
|
}
|
|
523
|
-
#
|
|
529
|
+
#C() {
|
|
524
530
|
let e = this.#n, t = e.computedGraph;
|
|
525
531
|
if (t) return t;
|
|
526
532
|
let n = f(), r = f(), i = {};
|
|
@@ -537,8 +543,8 @@ var X = class e extends m {
|
|
|
537
543
|
computedToExprMap: i
|
|
538
544
|
}, e.computedGraph = t, t;
|
|
539
545
|
}
|
|
540
|
-
#
|
|
541
|
-
let { computedToDependenciesMap: t, computedToDependentsMap: n, computedToExprMap: r } = this.#
|
|
546
|
+
#w(e) {
|
|
547
|
+
let { computedToDependenciesMap: t, computedToDependentsMap: n, computedToExprMap: r } = this.#C(), i = this.#n.propToComputedMap, a = /* @__PURE__ */ new Set(), o = [...new Set(e)];
|
|
542
548
|
for (let e = 0; e < o.length; e++) {
|
|
543
549
|
let t = o[e], n = i.get(t) || [];
|
|
544
550
|
for (let [e, t] of n) r[e] = t, a.has(e) || (a.add(e), o.push(e));
|
|
@@ -566,62 +572,66 @@ var X = class e extends m {
|
|
|
566
572
|
let t = this.attrToPropMap.get(e);
|
|
567
573
|
return t || (t = e.replace(/-([a-z])/g, (e, t) => t.toUpperCase()), this.attrToPropMap.set(e, t)), t;
|
|
568
574
|
}
|
|
569
|
-
#
|
|
575
|
+
#T(e, t, n) {
|
|
570
576
|
if (n.length !== 1) return;
|
|
571
577
|
let [r] = n;
|
|
572
578
|
if (!C.test(r)) return;
|
|
573
579
|
let i = I(e), a = z(e), o = V(e) || B(e), [s, c] = (t ?? "").split(":");
|
|
574
580
|
if (!(o && s === "value" || i && s === "checked" || a && s === "checked" || B(e))) return;
|
|
575
|
-
c ? e["on" + c] === void 0 && this.#
|
|
581
|
+
c ? e["on" + c] === void 0 && this.#R(e, t, "refers to an unsupported event name") : c = "change";
|
|
576
582
|
let l = N(r);
|
|
577
583
|
e.addEventListener(c, (e) => {
|
|
578
584
|
let { target: t } = e;
|
|
579
585
|
if (!t) return;
|
|
580
586
|
let { type: n } = this.#n.properties[l], r = t, { value: o } = r;
|
|
581
|
-
s === "checked" ? i ? this[l] = r.checked : a && r.checked && (this[l] = o) : this[l] = n === Number ? G(o) : o, this.#
|
|
587
|
+
s === "checked" ? i ? this[l] = r.checked : a && r.checked && (this[l] = o) : this[l] = n === Number ? G(o) : o, this.#M(l);
|
|
582
588
|
});
|
|
583
589
|
}
|
|
584
|
-
#
|
|
590
|
+
#E(e) {
|
|
585
591
|
return Object.hasOwn(this.#n, e);
|
|
586
592
|
}
|
|
587
|
-
#
|
|
593
|
+
#D(e) {
|
|
588
594
|
return !!this.#n.properties[e];
|
|
589
595
|
}
|
|
590
|
-
#
|
|
596
|
+
#O(e) {
|
|
591
597
|
return !!this.#n.properties[e]?.computed;
|
|
592
598
|
}
|
|
593
|
-
#
|
|
594
|
-
|
|
595
|
-
|
|
599
|
+
#k(e, n, r) {
|
|
600
|
+
if (typeof r != "object" || !r || n !== Array && n !== Object || this.#d.has(r)) return r;
|
|
601
|
+
let i = this.#u.get(r);
|
|
602
|
+
if (i) return i;
|
|
603
|
+
let a = t(r, (t, n, r) => {
|
|
604
|
+
this.#_(e, n, r);
|
|
605
|
+
});
|
|
606
|
+
return this.#u.set(r, a), this.#d.add(a), a;
|
|
596
607
|
}
|
|
597
|
-
#
|
|
598
|
-
|
|
599
|
-
let e
|
|
600
|
-
this.#F(this, void 0, `inside form, class ${e} requires "static formAssociated = true;"`);
|
|
608
|
+
#A(e) {
|
|
609
|
+
let t = Array.from(e.querySelectorAll("*"));
|
|
610
|
+
for (let e of t) this.#y(e), e.firstElementChild || this.#S(e);
|
|
601
611
|
}
|
|
602
612
|
static get observedAttributes() {
|
|
603
613
|
let t = Object.entries(this.properties || {}).filter(([e, t]) => !t.computed).map(([t]) => e.getAttrName(t));
|
|
604
614
|
return t.includes("disabled") || t.push("disabled"), t;
|
|
605
615
|
}
|
|
606
616
|
propertyChangedCallback(e, t, n) {}
|
|
607
|
-
#
|
|
617
|
+
#j(e, t) {
|
|
608
618
|
if (!t || !C.test(t)) return;
|
|
609
619
|
let n = N(t);
|
|
610
|
-
return this[n] === void 0 && this.#
|
|
620
|
+
return this[n] === void 0 && this.#z(e, "", n), n;
|
|
611
621
|
}
|
|
612
|
-
#
|
|
622
|
+
#M(e) {
|
|
613
623
|
let t = this.#n.propToExprsMap.get(e) || [];
|
|
614
|
-
this.#
|
|
624
|
+
this.#b(t);
|
|
615
625
|
}
|
|
616
626
|
ready() {}
|
|
617
|
-
#
|
|
627
|
+
#N() {
|
|
618
628
|
let e = this.#n;
|
|
619
629
|
if (!e.computedPropsRegistered) {
|
|
620
630
|
e.computedPropsRegistered = !0, e.computedGraph = null;
|
|
621
|
-
for (let [t, n] of Object.entries(e.properties)) n.computed && this.#
|
|
631
|
+
for (let [t, n] of Object.entries(e.properties)) n.computed && this.#P(t, n);
|
|
622
632
|
}
|
|
623
633
|
}
|
|
624
|
-
#
|
|
634
|
+
#P(e, t) {
|
|
625
635
|
let n = this.#n;
|
|
626
636
|
n.registeredComputedProps.add(e);
|
|
627
637
|
let r = n.propToComputedMap;
|
|
@@ -632,7 +642,7 @@ var X = class e extends m {
|
|
|
632
642
|
let a = t.computed;
|
|
633
643
|
for (let t of a.matchAll(w)) {
|
|
634
644
|
let r = N(t[0]);
|
|
635
|
-
this[r] === void 0 && this.#
|
|
645
|
+
this[r] === void 0 && this.#z(null, e, r);
|
|
636
646
|
let o = H(r), s = !1;
|
|
637
647
|
for (let [e, t] of Object.entries(n.properties)) J(t.usedBy)?.includes(o) && (i(e, a), s = !0);
|
|
638
648
|
!s && typeof this[r] != "function" && i(r, a);
|
|
@@ -643,7 +653,7 @@ var X = class e extends m {
|
|
|
643
653
|
for (let [e, t] of Object.entries(n.properties)) J(t.usedBy)?.includes(r) && i(e, a);
|
|
644
654
|
}
|
|
645
655
|
}
|
|
646
|
-
#
|
|
656
|
+
#F(e, t) {
|
|
647
657
|
this.#t.add(e);
|
|
648
658
|
try {
|
|
649
659
|
this[e] = t;
|
|
@@ -651,9 +661,9 @@ var X = class e extends m {
|
|
|
651
661
|
this.#t.delete(e);
|
|
652
662
|
}
|
|
653
663
|
}
|
|
654
|
-
#
|
|
664
|
+
#I(e, t, n = void 0) {
|
|
655
665
|
if (!e) return;
|
|
656
|
-
let r = this.#
|
|
666
|
+
let r = this.#J(t, n, e);
|
|
657
667
|
if (!r) {
|
|
658
668
|
let r = e.replaceAll("this..", "this.");
|
|
659
669
|
n ? q(t, n, r) : "textContent" in t && (t.textContent = r);
|
|
@@ -674,13 +684,13 @@ var X = class e extends m {
|
|
|
674
684
|
a || (a = [], this.#r.set(e, a)), a.push(n ? {
|
|
675
685
|
element: t,
|
|
676
686
|
attrName: n
|
|
677
|
-
} : t), t instanceof HTMLElement && this.#
|
|
678
|
-
let o = this.#
|
|
679
|
-
n ? q(t, n, o) : this.#
|
|
687
|
+
} : t), t instanceof HTMLElement && this.#T(t, n, r);
|
|
688
|
+
let o = this.#x(e);
|
|
689
|
+
n ? q(t, n, o) : this.#W(t, o);
|
|
680
690
|
}
|
|
681
|
-
#
|
|
691
|
+
#L(e, t) {
|
|
682
692
|
let n = t?.trim() ?? "", r = this.#n.properties[n];
|
|
683
|
-
r || this.#
|
|
693
|
+
r || this.#z(e, "ref", n), r.type !== m && this.#R(e, "ref", `refers to property "${n}" whose type is not HTMLElement`), this[n] && this.#R(e, "ref", `is a duplicate reference to the property "${n}"`), this[n] = e, e.removeAttribute("ref");
|
|
684
694
|
}
|
|
685
695
|
setAttributeSafe(e, t) {
|
|
686
696
|
this.hasAttribute(e) || this.setAttribute(e, t);
|
|
@@ -691,24 +701,24 @@ var X = class e extends m {
|
|
|
691
701
|
static ssr(e = {}) {
|
|
692
702
|
throw new g("SSR is not available in the browser build.");
|
|
693
703
|
}
|
|
694
|
-
#
|
|
704
|
+
#R(e, t, n) {
|
|
695
705
|
let r = e instanceof HTMLElement ? e.localName : "CSS rule";
|
|
696
706
|
throw new g(`component ${this.#n.elementName}` + (e ? `, element "${r}"` : "") + (t ? `, attribute "${t}"` : "") + ` ${n}`);
|
|
697
707
|
}
|
|
698
|
-
#
|
|
699
|
-
this.#
|
|
708
|
+
#z(e, t, n) {
|
|
709
|
+
this.#R(e, t, `refers to missing property "${n}"`);
|
|
700
710
|
}
|
|
701
|
-
#
|
|
702
|
-
return this.#
|
|
711
|
+
#B(e, t) {
|
|
712
|
+
return this.#V(e, this.getAttribute(t));
|
|
703
713
|
}
|
|
704
|
-
#
|
|
714
|
+
#V(t, n) {
|
|
705
715
|
if (n?.match(w)) return n;
|
|
706
716
|
let r = this.#n.properties[t], { type: i, values: a } = r;
|
|
707
|
-
if (i || this.#
|
|
717
|
+
if (i || this.#R(null, t, "does not specify its type"), n === null) return i === Boolean ? !1 : k(r);
|
|
708
718
|
if (i === String) {
|
|
709
719
|
if (a && !a.includes(n)) {
|
|
710
720
|
let e = a.map((e) => `"${e}"`).join(", ");
|
|
711
|
-
this.#
|
|
721
|
+
this.#R(null, t, `must be one of ${e}`);
|
|
712
722
|
}
|
|
713
723
|
return n;
|
|
714
724
|
}
|
|
@@ -717,25 +727,25 @@ var X = class e extends m {
|
|
|
717
727
|
if (n === "true") return !0;
|
|
718
728
|
if (n === "false" || n === "null") return !1;
|
|
719
729
|
let r = e.getAttrName(t);
|
|
720
|
-
return n && n !== r && this.#
|
|
730
|
+
return n && n !== r && this.#R(null, t, "is a Boolean attribute, so its value must match attribute name or be missing"), n === "" || n === r;
|
|
721
731
|
}
|
|
722
732
|
}
|
|
723
|
-
#
|
|
724
|
-
R(n) && !this.#
|
|
733
|
+
#H(e, t, n, r) {
|
|
734
|
+
R(n) && !this.#O(e) && n !== (t === Boolean ? this.hasAttribute(r) : this.#B(e, r)) && K(this, r || e, n);
|
|
725
735
|
}
|
|
726
|
-
#
|
|
727
|
-
for (let [t, n] of this.#
|
|
736
|
+
#U(e) {
|
|
737
|
+
for (let [t, n] of this.#w([e])) this.#F(t, this.#x(n));
|
|
728
738
|
}
|
|
729
|
-
#
|
|
739
|
+
#W(e, t) {
|
|
730
740
|
if (t === void 0) return;
|
|
731
741
|
let n = e instanceof HTMLElement;
|
|
732
742
|
Array.isArray(t) && (t = t.join(""));
|
|
733
743
|
let r = typeof t;
|
|
734
|
-
r !== "string" && r !== "number" && this.#
|
|
744
|
+
r !== "string" && r !== "number" && this.#R(e, void 0, " computed content is not a string or number");
|
|
735
745
|
let i = String(t);
|
|
736
|
-
e instanceof HTMLElement && B(e) ? e.value = i : n && r === "string" && i.trim().startsWith("<") ? (e.innerHTML = d(i), this.#
|
|
746
|
+
e instanceof HTMLElement && B(e) ? e.value = i : n && r === "string" && i.trim().startsWith("<") ? (e.innerHTML = d(i), this.#Q(e), this.#A(e)) : n && (e.textContent = i);
|
|
737
747
|
}
|
|
738
|
-
#
|
|
748
|
+
#G(e, t) {
|
|
739
749
|
let n = this.#c.get(e);
|
|
740
750
|
if (!n) return;
|
|
741
751
|
let r = this.getRootNode();
|
|
@@ -745,7 +755,7 @@ var X = class e extends m {
|
|
|
745
755
|
let a = i;
|
|
746
756
|
a[n] = t;
|
|
747
757
|
}
|
|
748
|
-
#
|
|
758
|
+
#K() {
|
|
749
759
|
let e = this.#n, t = (e, t, n) => {
|
|
750
760
|
let r = e.get(t);
|
|
751
761
|
r || (r = [], e.set(t, r)), r.includes(n) || r.push(n);
|
|
@@ -779,15 +789,15 @@ var X = class e extends m {
|
|
|
779
789
|
t = {};
|
|
780
790
|
for (let n of Object.keys(e)) t[n] = n;
|
|
781
791
|
}
|
|
782
|
-
this.#
|
|
783
|
-
for (let [n, r] of Object.entries(t)) if (this.#
|
|
792
|
+
this.#Y(e, t);
|
|
793
|
+
for (let [n, r] of Object.entries(t)) if (this.#D(r)) {
|
|
784
794
|
let t = o(e, n);
|
|
785
795
|
t !== void 0 && (this[r] = t), this.#l.set(r, {
|
|
786
796
|
state: e,
|
|
787
797
|
stateProp: n
|
|
788
798
|
});
|
|
789
799
|
}
|
|
790
|
-
let n = this.#
|
|
800
|
+
let n = this.#f.get(e), r = {
|
|
791
801
|
...n?.map,
|
|
792
802
|
...t
|
|
793
803
|
};
|
|
@@ -796,55 +806,60 @@ var X = class e extends m {
|
|
|
796
806
|
let n = r[e];
|
|
797
807
|
n && (this[n] = t);
|
|
798
808
|
}, Object.keys(r));
|
|
799
|
-
this.#
|
|
809
|
+
this.#f.set(e, {
|
|
800
810
|
map: r,
|
|
801
811
|
unsubscribe: i
|
|
802
812
|
});
|
|
803
813
|
}
|
|
804
|
-
#
|
|
814
|
+
#q() {
|
|
805
815
|
let t = new Set(Object.keys(this.#n.properties));
|
|
806
816
|
for (let n of this.getAttributeNames()) if (!p.has(n) && !n.startsWith("on") && n !== "ref") {
|
|
807
817
|
if (n === "form-assoc") {
|
|
808
|
-
this.#
|
|
818
|
+
this.#Z();
|
|
809
819
|
continue;
|
|
810
820
|
}
|
|
811
821
|
if (!t.has(e.getPropName(n))) {
|
|
812
822
|
if (n === "name") {
|
|
813
|
-
this.#
|
|
823
|
+
this.#Z();
|
|
814
824
|
continue;
|
|
815
825
|
}
|
|
816
|
-
this.#
|
|
826
|
+
this.#R(null, n, "is not a supported attribute");
|
|
817
827
|
}
|
|
818
828
|
}
|
|
819
829
|
}
|
|
820
|
-
#
|
|
830
|
+
#J(e, t, n) {
|
|
821
831
|
let r = n.match(w);
|
|
822
832
|
if (r) return r.forEach((n) => {
|
|
823
833
|
let r = N(n);
|
|
824
|
-
this[r] === void 0 && this.#
|
|
834
|
+
this[r] === void 0 && this.#z(e, t, r);
|
|
825
835
|
}), r;
|
|
826
836
|
}
|
|
827
|
-
#
|
|
837
|
+
#Y(e, t) {
|
|
828
838
|
for (let [n, r] of Object.entries(t)) {
|
|
829
839
|
let t = o(e, n);
|
|
830
|
-
t === void 0 && this.#
|
|
840
|
+
t === void 0 && this.#R(this, void 0, `invalid state path "${n}"`), t = this[r], this.#D(r) || this.#R(null, r, "refers to missing property in useState map");
|
|
831
841
|
}
|
|
832
842
|
}
|
|
833
|
-
#
|
|
843
|
+
#X(e, t, n) {
|
|
834
844
|
let { values: r } = this.#n.properties[e];
|
|
835
845
|
if (r) {
|
|
836
846
|
let i;
|
|
837
|
-
t === String ? typeof n == "string" ? r.includes(n) || (i = `must be one of ${r.map((e) => `"${e}"`).join(", ")}`) : i = `value is a ${typeof n}, but type is String` : i = "declares allowed values, but its type is not String", i && this.#
|
|
847
|
+
t === String ? typeof n == "string" ? r.includes(n) || (i = `must be one of ${r.map((e) => `"${e}"`).join(", ")}`) : i = `value is a ${typeof n}, but type is String` : i = "declares allowed values, but its type is not String", i && this.#R(null, e, i);
|
|
838
848
|
}
|
|
839
849
|
if (n instanceof t) return;
|
|
840
850
|
let i = typeof n;
|
|
841
851
|
if (i === "object") {
|
|
842
852
|
let { constructor: r } = n;
|
|
843
|
-
i = r.name, r !== t && this.#
|
|
853
|
+
i = r.name, r !== t && this.#R(null, e, `was set to a ${i}, but must be a ${t.name}`);
|
|
844
854
|
}
|
|
845
|
-
i !== t.name.toLowerCase() && this.#
|
|
855
|
+
i !== t.name.toLowerCase() && this.#R(null, e, `was set to a ${i}, but must be a ${t.name}`);
|
|
856
|
+
}
|
|
857
|
+
#Z() {
|
|
858
|
+
if (this.#n.formAssociated || this.closest("form") === null) return;
|
|
859
|
+
let e = this.#n.name;
|
|
860
|
+
this.#R(this, void 0, `inside form, class ${e} requires "static formAssociated = true;"`);
|
|
846
861
|
}
|
|
847
|
-
#
|
|
862
|
+
#Q(e) {
|
|
848
863
|
let t = Array.from(e.querySelectorAll("*"));
|
|
849
864
|
for (let e of t) {
|
|
850
865
|
let t = [];
|
|
@@ -854,9 +869,9 @@ var X = class e extends m {
|
|
|
854
869
|
let i = r.slice(2);
|
|
855
870
|
i = i[0].toLowerCase() + i.slice(1).toLowerCase();
|
|
856
871
|
let a = n.value;
|
|
857
|
-
this.#
|
|
872
|
+
this.#J(e, r, a);
|
|
858
873
|
let o;
|
|
859
|
-
typeof this[a] == "function" ? o = (e) => this[a](e) : (this.#
|
|
874
|
+
typeof this[a] == "function" ? o = (e) => this[a](e) : (this.#J(e, r, a), o = () => this.#x(a)), e.addEventListener(i, o), t.push(r);
|
|
860
875
|
}
|
|
861
876
|
}
|
|
862
877
|
for (let n of t) e.removeAttribute(n);
|
package/dist/wrec-ssr.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as e, i as t, n, r, t as i } from "./wrec-
|
|
1
|
+
import { a as e, i as t, n, r, t as i } from "./wrec-BL9AvT9R.js";
|
|
2
2
|
//#region \0rolldown/runtime.js
|
|
3
3
|
var a = Object.defineProperty, o = Object.getOwnPropertyDescriptor, s = Object.getOwnPropertyNames, c = Object.prototype.hasOwnProperty, l = (e, t) => () => (e && (t = e(e = 0)), t), u = (e, t) => () => (t || e((t = { exports: {} }).exports, t), t.exports), d = (e, t) => {
|
|
4
4
|
let n = {};
|
package/dist/wrec.es.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as e, i as t, n, r, t as i } from "./wrec-
|
|
1
|
+
import { a as e, i as t, n, r, t as i } from "./wrec-BL9AvT9R.js";
|
|
2
2
|
export { i as Wrec, e as WrecState, n as createElement, r as css, t as html };
|
package/package.json
CHANGED
package/scripts/lint.js
CHANGED
|
@@ -119,6 +119,7 @@ const THIS_CALL_RE = /this\.([A-Za-z_$][\w$]*)\s*\(/g;
|
|
|
119
119
|
const THIS_REF_RE = /this\.([A-Za-z_$][\w$]*)(\.[A-Za-z_$][\w$]*)*/g;
|
|
120
120
|
const PLACEHOLDER_PREFIX = '__WREC_PLACEHOLDER__';
|
|
121
121
|
const RESERVED_PROPERTY_NAMES = new Set(['class', 'style']);
|
|
122
|
+
const GETTER_PREFIX = 'get ';
|
|
122
123
|
const SUPPORTED_EVENT_NAMES = new Set([
|
|
123
124
|
'blur',
|
|
124
125
|
'change',
|
|
@@ -348,6 +349,17 @@ function collectClassMethods(classNode) {
|
|
|
348
349
|
return methods;
|
|
349
350
|
}
|
|
350
351
|
|
|
352
|
+
// Collects all getter names defined in a component class.
|
|
353
|
+
function collectGetterNames(classNode) {
|
|
354
|
+
const getters = new Set();
|
|
355
|
+
for (const member of classNode.members) {
|
|
356
|
+
if (!ts.isGetAccessorDeclaration(member)) continue;
|
|
357
|
+
const name = getMemberName(member);
|
|
358
|
+
if (name) getters.add(name);
|
|
359
|
+
}
|
|
360
|
+
return getters;
|
|
361
|
+
}
|
|
362
|
+
|
|
351
363
|
// Finds the synthetic `__wrec_expr_*` helper functions that were added by
|
|
352
364
|
// `buildAugmentedSource` and returns their bodies in index order.
|
|
353
365
|
// This gives the linter a stable list of typed code nodes
|
|
@@ -1062,6 +1074,11 @@ function getExpressionText(sourceFile, expression) {
|
|
|
1062
1074
|
return expression.getText(sourceFile).trim();
|
|
1063
1075
|
}
|
|
1064
1076
|
|
|
1077
|
+
// Returns the name from a getter reference.
|
|
1078
|
+
function getGetterName(reference) {
|
|
1079
|
+
return reference.slice(GETTER_PREFIX.length).trim();
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1065
1082
|
// Returns a lowercased HTML tag name for a parsed HTML node.
|
|
1066
1083
|
function getHtmlTagName(node) {
|
|
1067
1084
|
const tagName = node.rawTagName || node.tagName;
|
|
@@ -1243,6 +1260,11 @@ function isCallCallee(node) {
|
|
|
1243
1260
|
return ts.isCallExpression(node.parent) && node.parent.expression === node;
|
|
1244
1261
|
}
|
|
1245
1262
|
|
|
1263
|
+
// Returns whether a reference refers to a getter method.
|
|
1264
|
+
function isGetterReference(reference) {
|
|
1265
|
+
return reference.startsWith(GETTER_PREFIX);
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1246
1268
|
// Returns whether a declaration represents an imported binding.
|
|
1247
1269
|
function isImportLikeDeclaration(node) {
|
|
1248
1270
|
return (
|
|
@@ -1325,6 +1347,7 @@ export function lintSource(filePath, sourceText, options = {}) {
|
|
|
1325
1347
|
propertyEntries,
|
|
1326
1348
|
reservedProperties
|
|
1327
1349
|
} = extractProperties(sourceFile, checker, classNode);
|
|
1350
|
+
const getterNames = collectGetterNames(classNode);
|
|
1328
1351
|
const allMethods = collectClassMethods(classNode);
|
|
1329
1352
|
const findings = {
|
|
1330
1353
|
duplicateProperties,
|
|
@@ -1393,6 +1416,7 @@ export function lintSource(filePath, sourceText, options = {}) {
|
|
|
1393
1416
|
checker,
|
|
1394
1417
|
supportedProps,
|
|
1395
1418
|
propertyEntries,
|
|
1419
|
+
getterNames,
|
|
1396
1420
|
allMethods,
|
|
1397
1421
|
findings
|
|
1398
1422
|
);
|
|
@@ -1826,6 +1850,7 @@ function validatePropertyConfigs(
|
|
|
1826
1850
|
checker,
|
|
1827
1851
|
supportedProps,
|
|
1828
1852
|
propertyEntries,
|
|
1853
|
+
getterNames,
|
|
1829
1854
|
classMethods,
|
|
1830
1855
|
findings
|
|
1831
1856
|
) {
|
|
@@ -1852,6 +1877,16 @@ function validatePropertyConfigs(
|
|
|
1852
1877
|
|
|
1853
1878
|
if (methods) {
|
|
1854
1879
|
for (const methodName of methods) {
|
|
1880
|
+
if (isGetterReference(methodName)) {
|
|
1881
|
+
const getterName = getGetterName(methodName);
|
|
1882
|
+
if (getterNames.has(getterName)) continue;
|
|
1883
|
+
findings.invalidUsedByReferences.push(
|
|
1884
|
+
`property "${propName}" usedBy references ` +
|
|
1885
|
+
`missing getter "${getterName}"`
|
|
1886
|
+
);
|
|
1887
|
+
continue;
|
|
1888
|
+
}
|
|
1889
|
+
|
|
1855
1890
|
if (!classMethods.has(methodName)) {
|
|
1856
1891
|
findings.invalidUsedByReferences.push(
|
|
1857
1892
|
`property "${propName}" usedBy references ` +
|
package/scripts/used-by.js
CHANGED
|
@@ -28,6 +28,10 @@ import {
|
|
|
28
28
|
} from './ast-utils.js';
|
|
29
29
|
|
|
30
30
|
const cwd = process.cwd();
|
|
31
|
+
const CALL_RE = /this\.([A-Za-z_$][A-Za-z0-9_$]*)\s*\(/g;
|
|
32
|
+
const REFS_RE =
|
|
33
|
+
/this\.([A-Za-z_$][A-Za-z0-9_$]*)(\.[A-Za-z_$][A-Za-z0-9_$]*)*/g;
|
|
34
|
+
const GETTER_PREFIX = 'get ';
|
|
31
35
|
|
|
32
36
|
// Records property names introduced by
|
|
33
37
|
// an identifier or object binding pattern.
|
|
@@ -264,17 +268,17 @@ function buildConfigText(sourceFile, member, methodNames, quote) {
|
|
|
264
268
|
return `{${openSpacing}${propertyStrings.join(', ')}${closeSpacing}}`;
|
|
265
269
|
}
|
|
266
270
|
|
|
267
|
-
// Walks a method body to collect component property reads
|
|
268
|
-
// and
|
|
271
|
+
// Walks a method or accessor body to collect component property reads
|
|
272
|
+
// and dependency targets reached through `this`.
|
|
269
273
|
// This is only called by getMethodUsages.
|
|
270
|
-
function collectMethodBodyUsage(node, props, calledMethods) {
|
|
274
|
+
function collectMethodBodyUsage(node, getterNames, props, calledMethods) {
|
|
271
275
|
if (
|
|
272
276
|
ts.isPropertyAccessExpression(node) &&
|
|
273
277
|
node.expression.kind === ts.SyntaxKind.ThisKeyword
|
|
274
278
|
) {
|
|
275
279
|
// Handles direct property access like `this.foo`
|
|
276
280
|
// and records method calls like `this.foo()`.
|
|
277
|
-
recordThisAccess(props, calledMethods, node, node.name.text);
|
|
281
|
+
recordThisAccess(props, calledMethods, getterNames, node, node.name.text);
|
|
278
282
|
} else if (
|
|
279
283
|
ts.isElementAccessExpression(node) &&
|
|
280
284
|
node.expression.kind === ts.SyntaxKind.ThisKeyword &&
|
|
@@ -283,7 +287,13 @@ function collectMethodBodyUsage(node, props, calledMethods) {
|
|
|
283
287
|
) {
|
|
284
288
|
// Handles string-based element access like `this['foo']`
|
|
285
289
|
// and records method calls like `this['foo']()`.
|
|
286
|
-
recordThisAccess(
|
|
290
|
+
recordThisAccess(
|
|
291
|
+
props,
|
|
292
|
+
calledMethods,
|
|
293
|
+
getterNames,
|
|
294
|
+
node,
|
|
295
|
+
node.argumentExpression.text
|
|
296
|
+
);
|
|
287
297
|
} else if (
|
|
288
298
|
ts.isVariableDeclaration(node) &&
|
|
289
299
|
node.initializer &&
|
|
@@ -315,7 +325,7 @@ function collectMethodBodyUsage(node, props, calledMethods) {
|
|
|
315
325
|
}
|
|
316
326
|
|
|
317
327
|
ts.forEachChild(node, child =>
|
|
318
|
-
collectMethodBodyUsage(child, props, calledMethods)
|
|
328
|
+
collectMethodBodyUsage(child, getterNames, props, calledMethods)
|
|
319
329
|
);
|
|
320
330
|
}
|
|
321
331
|
|
|
@@ -385,7 +395,6 @@ export function evaluateSourceText(filePath, text) {
|
|
|
385
395
|
// This is only called by getMethodUsages.
|
|
386
396
|
function getCssCalledMethods(classNode) {
|
|
387
397
|
const methodNames = new Set();
|
|
388
|
-
const CALL_RE = /this\.([A-Za-z_$][A-Za-z0-9_$]*)\s*\(/g;
|
|
389
398
|
let template;
|
|
390
399
|
|
|
391
400
|
for (const member of classNode.members) {
|
|
@@ -410,11 +419,10 @@ function getCssCalledMethods(classNode) {
|
|
|
410
419
|
// If no matching declaration was found, return an empty Set.
|
|
411
420
|
if (!template) return methodNames;
|
|
412
421
|
|
|
413
|
-
// Finds all method
|
|
414
|
-
//
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
methodNames.add(match[1]);
|
|
422
|
+
// Finds all method calls and getter references
|
|
423
|
+
// in CSS property value expressions.
|
|
424
|
+
for (const target of getExpressionTargets(template.getText())) {
|
|
425
|
+
methodNames.add(target);
|
|
418
426
|
}
|
|
419
427
|
|
|
420
428
|
return methodNames;
|
|
@@ -425,7 +433,6 @@ function getCssCalledMethods(classNode) {
|
|
|
425
433
|
// This is only called by getMethodUsages.
|
|
426
434
|
function getComputedCalledMethods(classNode) {
|
|
427
435
|
const methodNames = new Set();
|
|
428
|
-
const CALL_RE = /this\.([A-Za-z_$][A-Za-z0-9_$]*)\s*\(/g;
|
|
429
436
|
let propertiesNode;
|
|
430
437
|
|
|
431
438
|
for (const member of classNode.members) {
|
|
@@ -473,10 +480,11 @@ function getComputedCalledMethods(classNode) {
|
|
|
473
480
|
// If the property value isn't a string then skip it.
|
|
474
481
|
if (!ts.isStringLiteralLike(configProperty.initializer)) continue;
|
|
475
482
|
|
|
476
|
-
// Find all
|
|
483
|
+
// Find all method calls and getter references
|
|
484
|
+
// in the string JavaScript expression.
|
|
477
485
|
const computed = configProperty.initializer.text;
|
|
478
|
-
for (const
|
|
479
|
-
methodNames.add(
|
|
486
|
+
for (const target of getExpressionTargets(computed)) {
|
|
487
|
+
methodNames.add(target);
|
|
480
488
|
}
|
|
481
489
|
}
|
|
482
490
|
}
|
|
@@ -484,6 +492,23 @@ function getComputedCalledMethods(classNode) {
|
|
|
484
492
|
return methodNames;
|
|
485
493
|
}
|
|
486
494
|
|
|
495
|
+
// Collects method-call and getter-reference targets from expression text.
|
|
496
|
+
function getExpressionTargets(text) {
|
|
497
|
+
const targets = new Set();
|
|
498
|
+
for (const match of text.matchAll(CALL_RE)) {
|
|
499
|
+
targets.add(match[1]);
|
|
500
|
+
}
|
|
501
|
+
for (const match of text.matchAll(REFS_RE)) {
|
|
502
|
+
targets.add(getGetterDependency(match[1]));
|
|
503
|
+
}
|
|
504
|
+
return targets;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// Returns the dependency target string for a getter reference.
|
|
508
|
+
function getGetterDependency(name) {
|
|
509
|
+
return `${GETTER_PREFIX}${name}`;
|
|
510
|
+
}
|
|
511
|
+
|
|
487
512
|
// Returns the leading indentation in the line
|
|
488
513
|
// that begins at a given position (`pos`) inside `text`.
|
|
489
514
|
function getIndent(text, pos) {
|
|
@@ -495,19 +520,26 @@ function getIndent(text, pos) {
|
|
|
495
520
|
// Returns a map where the keys are property names and
|
|
496
521
|
// the values are Sets of public methods that use it transitively.
|
|
497
522
|
function getMethodUsages(classNode, propertyNames) {
|
|
523
|
+
const getterNames = new Set();
|
|
498
524
|
const methodInfo = new Map();
|
|
499
525
|
|
|
526
|
+
for (const member of classNode.members) {
|
|
527
|
+
if (!ts.isGetAccessorDeclaration(member)) continue;
|
|
528
|
+
const getterName = getNameText(member.name);
|
|
529
|
+
if (getterName) getterNames.add(getterName);
|
|
530
|
+
}
|
|
531
|
+
|
|
500
532
|
for (const member of classNode.members) {
|
|
501
533
|
// If the member doesn't represent an instance method, skip it.
|
|
502
534
|
if (!isInstanceMethodMember(member)) continue;
|
|
503
535
|
|
|
504
536
|
// If the member doesn't have a string name, skip it.
|
|
505
|
-
const methodName =
|
|
537
|
+
const methodName = getUsageTargetName(member);
|
|
506
538
|
if (!methodName) continue;
|
|
507
539
|
|
|
508
540
|
const props = new Set();
|
|
509
541
|
const calledMethods = new Set();
|
|
510
|
-
collectMethodBodyUsage(member.body, props, calledMethods);
|
|
542
|
+
collectMethodBodyUsage(member.body, getterNames, props, calledMethods);
|
|
511
543
|
methodInfo.set(methodName, {
|
|
512
544
|
calledMethods,
|
|
513
545
|
isPrivate: ts.isPrivateIdentifier(member.name),
|
|
@@ -573,12 +605,9 @@ function getTemplateCalledMethods(classNode) {
|
|
|
573
605
|
|
|
574
606
|
const methodNames = new Set();
|
|
575
607
|
if (template) {
|
|
576
|
-
// Finds all method
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
const CALL_RE = /this\.([A-Za-z_$][A-Za-z0-9_$]*)\s*\(/g;
|
|
580
|
-
for (const match of text.matchAll(CALL_RE)) {
|
|
581
|
-
methodNames.add(match[1]);
|
|
608
|
+
// Finds all method calls and getter references in the HTML template.
|
|
609
|
+
for (const target of getExpressionTargets(template.getText())) {
|
|
610
|
+
methodNames.add(target);
|
|
582
611
|
}
|
|
583
612
|
}
|
|
584
613
|
return methodNames;
|
|
@@ -614,6 +643,13 @@ function getTransitiveProps(methodInfo, memo, methodName, seen = new Set()) {
|
|
|
614
643
|
return props;
|
|
615
644
|
}
|
|
616
645
|
|
|
646
|
+
// Returns the usedBy dependency target name for a class member.
|
|
647
|
+
function getUsageTargetName(member) {
|
|
648
|
+
const name = getNameText(member.name);
|
|
649
|
+
if (!name) return undefined;
|
|
650
|
+
return ts.isGetAccessorDeclaration(member) ? getGetterDependency(name) : name;
|
|
651
|
+
}
|
|
652
|
+
|
|
617
653
|
// Determines if a class member represents an instance method.
|
|
618
654
|
// This is only called by getMethodUsages.
|
|
619
655
|
function isInstanceMethodMember(member) {
|
|
@@ -671,10 +707,12 @@ function main() {
|
|
|
671
707
|
|
|
672
708
|
// Records a `this` property access and
|
|
673
709
|
// tracks it as a method call when applicable.
|
|
674
|
-
function recordThisAccess(props, calledMethods, node, name) {
|
|
710
|
+
function recordThisAccess(props, calledMethods, getterNames, node, name) {
|
|
675
711
|
props.add(name);
|
|
676
712
|
if (ts.isCallExpression(node.parent) && node.parent.expression === node) {
|
|
677
713
|
calledMethods.add(name);
|
|
714
|
+
} else if (getterNames.has(name)) {
|
|
715
|
+
calledMethods.add(getGetterDependency(name));
|
|
678
716
|
}
|
|
679
717
|
}
|
|
680
718
|
|