From 3dccd5fd102f5729ecb985a2bd8c47a02b0caeb5 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Sun, 8 Dec 2024 10:27:39 +0000 Subject: [PATCH 01/18] Add custom element with method --- .../webcomponents/src/ce-with-methods.js | 30 +++++++++++++++++++ libraries/angular/src/basic-tests.js | 13 ++++++-- libraries/angular/src/components.ts | 10 +++++++ libraries/react/src/basic-tests.js | 14 +++++++++ libraries/react/src/components.js | 9 ++++++ 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 libraries/__shared__/webcomponents/src/ce-with-methods.js diff --git a/libraries/__shared__/webcomponents/src/ce-with-methods.js b/libraries/__shared__/webcomponents/src/ce-with-methods.js new file mode 100644 index 0000000000..c29d91e3a2 --- /dev/null +++ b/libraries/__shared__/webcomponents/src/ce-with-methods.js @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class CEWithMethods extends HTMLElement { + + test() { + this.innerText = 'Success'; + } + + connectedCallback() { + this.test(); + } + +} + +customElements.define('ce-with-methods', CEWithMethods); diff --git a/libraries/angular/src/basic-tests.js b/libraries/angular/src/basic-tests.js index 80dba3fd4a..24ca806826 100644 --- a/libraries/angular/src/basic-tests.js +++ b/libraries/angular/src/basic-tests.js @@ -27,7 +27,8 @@ import { ComponentWithProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, - ComponentWithDeclarativeEvent + ComponentWithDeclarativeEvent, + ComponentWithMethods } from "./components"; beforeEach(function() { @@ -40,7 +41,8 @@ beforeEach(function() { ComponentWithProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, - ComponentWithDeclarativeEvent + ComponentWithDeclarativeEvent, + ComponentWithMethods ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }); @@ -146,6 +148,13 @@ describe("basic support", function() { let data = wc.str || wc.getAttribute("str"); expect(data).to.eql("Angular"); }); + + it('will not overwrite methods', function () { + let fixture = TestBed.createComponent(ComponentWithMethods); + fixture.detectChanges(); + let root = fixture.debugElement.nativeElement; + expect(root.innerText).to.eql('Success') + }); }); describe("events", function() { diff --git a/libraries/angular/src/components.ts b/libraries/angular/src/components.ts index fbb4cfe45e..3a7a076e7f 100644 --- a/libraries/angular/src/components.ts +++ b/libraries/angular/src/components.ts @@ -27,6 +27,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; +import 'ce-with-methods'; @Component({ template: ` @@ -105,6 +106,15 @@ export class ComponentWithProperties { } } +@Component({ + template: ` +
+ +
+ ` +}) +export class ComponentWithMethods {} + @Component({ template: `
diff --git a/libraries/react/src/basic-tests.js b/libraries/react/src/basic-tests.js index 3400a37e8b..e05374c6b3 100644 --- a/libraries/react/src/basic-tests.js +++ b/libraries/react/src/basic-tests.js @@ -29,6 +29,7 @@ import { ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent, + ComponentWithMethods, } from "./components"; // Setup the test harness. This will get cleaned out with every test. @@ -198,6 +199,19 @@ describe("basic support", function () { expect(data).to.eql("React"); }); + it('will not overwrite methods', function () { + let root; + render( + { + root = current; + }} + /> + ) + let wc = root.wc; + expect(wc.innerText).to.eql('Success'); + }) + // TODO: Is it the framework's responsibility to check if the underlying // property is defined? Or should it just always assume it is and do its // usual default behavior? Preact will actually check if it's defined and diff --git a/libraries/react/src/components.js b/libraries/react/src/components.js index 20a7f82c23..5081373373 100644 --- a/libraries/react/src/components.js +++ b/libraries/react/src/components.js @@ -20,6 +20,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; +import 'ce-with-methods'; export class ComponentWithoutChildren extends Component { render() { @@ -110,6 +111,14 @@ export class ComponentWithProperties extends Component { } } +export class ComponentWithMethods extends Component { + render() { + return
+ this.wc = el}> +
+ } +} + export class ComponentWithUnregistered extends Component { render () { const data = { From 262fd1c60329466c64ff275f550e8227076ea052 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Sun, 8 Dec 2024 15:35:53 +0000 Subject: [PATCH 02/18] Add vue, svlete tests --- libraries/svelte/src/basic-tests.js | 7 +++++++ libraries/svelte/src/components.js | 2 ++ .../svelte/src/components/ComponentWithMethods.svelte | 1 + libraries/vue/src/basic-tests.js | 10 +++++++++- libraries/vue/src/components.js | 11 +++++++++++ 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 libraries/svelte/src/components/ComponentWithMethods.svelte diff --git a/libraries/svelte/src/basic-tests.js b/libraries/svelte/src/basic-tests.js index fa5dc5a75f..816765b3e3 100644 --- a/libraries/svelte/src/basic-tests.js +++ b/libraries/svelte/src/basic-tests.js @@ -24,6 +24,7 @@ import { ComponentWithProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, + ComponentWithMethods, } from "./components"; import { tick } from "svelte"; @@ -125,6 +126,12 @@ describe("basic support", function() { expect(data).to.eql("svelte"); }); + it('will not overwrite methods', function () { + new ComponentWithMethods({ target: scratch }); + const wc = scratch.querySelector('#wc'); + expect(wc.innerText).to.eql('Success'); + }) + // it('will set boolean attributes on a Custom Element that has not already been defined and upgraded', function() { // new ComponentWithUnregistered({ target: scratch }); // let wc = scratch.querySelector("#wc"); diff --git a/libraries/svelte/src/components.js b/libraries/svelte/src/components.js index 8e773bc191..79906fa6c3 100644 --- a/libraries/svelte/src/components.js +++ b/libraries/svelte/src/components.js @@ -19,6 +19,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; +import 'ce-with-methods'; export { default as ComponentWithoutChildren } from './components/ComponentWithoutChildren.svelte'; export { default as ComponentWithChildren } from './components/ComponentWithChildren.svelte'; @@ -28,3 +29,4 @@ export { default as ComponentWithProperties } from './components/ComponentWithPr export { default as ComponentWithUnregistered } from './components/ComponentWithUnregistered.svelte'; export { default as ComponentWithImperativeEvent } from './components/ComponentWithImperativeEvent.svelte'; export { default as ComponentWithDeclarativeEvent } from './components/ComponentWithDeclarativeEvent.svelte'; +export { default as ComponentWithMethods } from './components/ComponentWithMethods.svelte'; diff --git a/libraries/svelte/src/components/ComponentWithMethods.svelte b/libraries/svelte/src/components/ComponentWithMethods.svelte new file mode 100644 index 0000000000..c338385ddd --- /dev/null +++ b/libraries/svelte/src/components/ComponentWithMethods.svelte @@ -0,0 +1 @@ + diff --git a/libraries/vue/src/basic-tests.js b/libraries/vue/src/basic-tests.js index 4e3a33bcf2..773477f4b9 100644 --- a/libraries/vue/src/basic-tests.js +++ b/libraries/vue/src/basic-tests.js @@ -24,7 +24,8 @@ import { ComponentWithProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, - ComponentWithDeclarativeEvent + ComponentWithDeclarativeEvent, + ComponentWithMethods } from "./components"; import { expect } from "chai"; @@ -147,6 +148,13 @@ describe("basic support", function() { expect(data).to.eql("Vue"); }); + it('will not overwrite methods', function () { + const app = createApp(ComponentWithMethods); + app.mount(scratch); + const wc = scratch.querySelector('#wc'); + expect(wc.innerText).to.eql('Success'); + }) + // it('will set boolean attributes on a Custom Element that has not already been defined and upgraded', function() { // let root = new ComponentWithUnregistered().$mount(scratch).$el; // let wc = root.querySelector('#wc'); diff --git a/libraries/vue/src/components.js b/libraries/vue/src/components.js index 9a4ac360b8..a4164ecce0 100644 --- a/libraries/vue/src/components.js +++ b/libraries/vue/src/components.js @@ -20,6 +20,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; +import 'ce-with-methods'; export const ComponentWithoutChildren = defineComponent({ template: ` @@ -100,6 +101,16 @@ export const ComponentWithProperties = defineComponent({ } }); +export const ComponentWithMethods = defineComponent({ + template: ` +
+ +
+ ` +}) + export const ComponentWithUnregistered = defineComponent({ template: `
From e359f1c669d317644e88c0b28b506bfece7c81f0 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Tue, 10 Dec 2024 13:24:30 +0000 Subject: [PATCH 03/18] Switch to more comprehensive tests of setting attributes sharing names with unwriteable properties --- ...th-methods.js => ce-without-properties.js} | 18 +++++++++++---- libraries/angular/src/basic-tests.js | 14 +++++++---- libraries/angular/src/components.ts | 6 ++--- libraries/angularjs/src/app.module.js | 2 ++ libraries/angularjs/src/basic-tests.js | 13 +++++++++++ libraries/angularjs/src/components.js | 23 +++++++++++++++++++ libraries/dio/src/basic-tests.js | 13 ++++++++++- libraries/dio/src/components.js | 11 +++++++++ libraries/dojo/src/basic-tests.ts | 13 ++++++++++- libraries/dojo/src/components.ts | 10 ++++++++ libraries/hybrids/src/basic-tests.js | 20 ++++++++++++++++ libraries/hybrids/src/components.js | 12 ++++++++++ libraries/react/src/basic-tests.js | 18 ++++++++------- libraries/react/src/components.js | 14 +++++------ libraries/svelte/src/basic-tests.js | 9 +++++--- libraries/svelte/src/components.js | 4 ++-- .../components/ComponentWithMethods.svelte | 1 - .../ComponentWithoutProperties.svelte | 1 + libraries/vue/src/basic-tests.js | 11 +++++---- libraries/vue/src/components.js | 21 ++++++++++++----- 20 files changed, 188 insertions(+), 46 deletions(-) rename libraries/__shared__/webcomponents/src/{ce-with-methods.js => ce-without-properties.js} (66%) delete mode 100644 libraries/svelte/src/components/ComponentWithMethods.svelte create mode 100644 libraries/svelte/src/components/ComponentWithoutProperties.svelte diff --git a/libraries/__shared__/webcomponents/src/ce-with-methods.js b/libraries/__shared__/webcomponents/src/ce-without-properties.js similarity index 66% rename from libraries/__shared__/webcomponents/src/ce-with-methods.js rename to libraries/__shared__/webcomponents/src/ce-without-properties.js index c29d91e3a2..04a374e004 100644 --- a/libraries/__shared__/webcomponents/src/ce-with-methods.js +++ b/libraries/__shared__/webcomponents/src/ce-without-properties.js @@ -15,16 +15,26 @@ * limitations under the License. */ -class CEWithMethods extends HTMLElement { +class CEWithoutProperties extends HTMLElement { - test() { + amethod() { this.innerText = 'Success'; + return 'method'; + } + + get agetter() { + return 'getter'; } connectedCallback() { - this.test(); + this.amethod(); } } -customElements.define('ce-with-methods', CEWithMethods); +Object.defineProperty(CEWithoutProperties.prototype, 'areadonly', { + value: 'readonly', + writable: false +}); + +customElements.define('ce-without-properties', CEWithoutProperties); diff --git a/libraries/angular/src/basic-tests.js b/libraries/angular/src/basic-tests.js index 24ca806826..75488651f0 100644 --- a/libraries/angular/src/basic-tests.js +++ b/libraries/angular/src/basic-tests.js @@ -28,7 +28,7 @@ import { ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent, - ComponentWithMethods + ComponentWithoutProperties } from "./components"; beforeEach(function() { @@ -42,7 +42,7 @@ beforeEach(function() { ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent, - ComponentWithMethods + ComponentWithoutProperties ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }); @@ -149,11 +149,15 @@ describe("basic support", function() { expect(data).to.eql("Angular"); }); - it('will not overwrite methods', function () { - let fixture = TestBed.createComponent(ComponentWithMethods); + it('will not overwrite unwriteable properties', function () { + let fixture = TestBed.createComponent(ComponentWithoutProperties); fixture.detectChanges(); let root = fixture.debugElement.nativeElement; - expect(root.innerText).to.eql('Success') + let wc = root.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); }); }); diff --git a/libraries/angular/src/components.ts b/libraries/angular/src/components.ts index 3a7a076e7f..1ec7b23bc3 100644 --- a/libraries/angular/src/components.ts +++ b/libraries/angular/src/components.ts @@ -27,7 +27,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; -import 'ce-with-methods'; +import 'ce-without-properties'; @Component({ template: ` @@ -109,11 +109,11 @@ export class ComponentWithProperties { @Component({ template: `
- +
` }) -export class ComponentWithMethods {} +export class ComponentWithoutProperties {} @Component({ template: ` diff --git a/libraries/angularjs/src/app.module.js b/libraries/angularjs/src/app.module.js index 5ad040272f..5d8b3da271 100644 --- a/libraries/angularjs/src/app.module.js +++ b/libraries/angularjs/src/app.module.js @@ -6,6 +6,7 @@ import { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProps, + ComponentWithoutProps, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent } from './components'; @@ -16,6 +17,7 @@ export default angular.module('ce-tests', []) .component('compWithChildrenRerender', ComponentWithChildrenRerender) .component('compWithDifferentViews', ComponentWithDifferentViews) .component('compWithProps', ComponentWithProps) +.component('compWithoutProps', ComponentWithoutProps) .component('compWithImperativeEvent', ComponentWithImperativeEvent) .component('compWithDeclarativeEvent', ComponentWithDeclarativeEvent) .name; diff --git a/libraries/angularjs/src/basic-tests.js b/libraries/angularjs/src/basic-tests.js index f90ff3ab43..92afad71d5 100644 --- a/libraries/angularjs/src/basic-tests.js +++ b/libraries/angularjs/src/basic-tests.js @@ -113,6 +113,19 @@ describe("basic support", () => { }); }); + describe("without properties", () => { + it('will not overwrite unwriteable properties', function () { + this.weight = 3; + const comp = compile("")(scope); + scope.$digest(); + const wc = comp[0].querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + }); + describe("events", () => { it("can imperatively listen to a DOM event dispatched by a Custom Element", function() { this.weight = 3; diff --git a/libraries/angularjs/src/components.js b/libraries/angularjs/src/components.js index f7f7a0f369..d734fad872 100644 --- a/libraries/angularjs/src/components.js +++ b/libraries/angularjs/src/components.js @@ -81,6 +81,28 @@ const ComponentWithProps = { } }; +const ComponentWithoutProps = { + template: ` +
+ +
+ `, + controller: class { + constructor() {} + $onInit() { + angular.extend(this, { + method: 'method', + getter: 'getter', + readonly: 'readonly' + }) + } + } +} + const ComponentWithImperativeEvent = { template: `
@@ -154,6 +176,7 @@ export { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProps, + ComponentWithoutProps, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent } diff --git a/libraries/dio/src/basic-tests.js b/libraries/dio/src/basic-tests.js index 4c597a0e99..ede752f869 100644 --- a/libraries/dio/src/basic-tests.js +++ b/libraries/dio/src/basic-tests.js @@ -25,7 +25,8 @@ import { ComponentWithProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, - ComponentWithDeclarativeEvent + ComponentWithDeclarativeEvent, + ComponentWithoutProperties } from "./components"; // Setup the test harness. This will get cleaned out with every test. @@ -128,6 +129,16 @@ describe("basic support", function() { let data = wc.str || wc.getAttribute("str"); expect(data).to.eql("DIO"); }); + + it('will not overwrite unwriteable properties', function () { + render(, scratch); + console.log(scratch); + let wc = scratch.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }) }); describe("events", function() { diff --git a/libraries/dio/src/components.js b/libraries/dio/src/components.js index 78df469ca7..d7fc57b817 100644 --- a/libraries/dio/src/components.js +++ b/libraries/dio/src/components.js @@ -20,6 +20,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; +import 'ce-without-properties'; export class ComponentWithoutChildren extends Component { render() { @@ -109,6 +110,16 @@ export class ComponentWithProperties extends Component { } } +export class ComponentWithoutProperties extends Component { + render () { + return ( +
+ +
+ ) + } +} + export class ComponentWithUnregistered extends Component { render () { const data = { diff --git a/libraries/dojo/src/basic-tests.ts b/libraries/dojo/src/basic-tests.ts index f3865a794d..5b25c4f755 100644 --- a/libraries/dojo/src/basic-tests.ts +++ b/libraries/dojo/src/basic-tests.ts @@ -22,7 +22,8 @@ import { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProperties, - ComponentWithImperativeEvent + ComponentWithImperativeEvent, + ComponentWithoutProperties } from "./components"; import renderer, { w } from "@dojo/framework/core/vdom"; @@ -128,6 +129,16 @@ describe("basic support", function() { const data = wc.getAttribute("str"); expect(data).to.eql("Dojo"); }); + + it('will not overwrite unwriteable properties', function () { + const r = renderer(() => w(ComponentWithoutProperties, {})); + r.mount({ domNode: scratch, sync: true }); + const wc: any = document.querySelector("ce-without-properties"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); }); describe("events", function() { diff --git a/libraries/dojo/src/components.ts b/libraries/dojo/src/components.ts index 436bef0f36..a4780b246e 100644 --- a/libraries/dojo/src/components.ts +++ b/libraries/dojo/src/components.ts @@ -21,6 +21,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; +import 'ce-without-properties'; const factory = create({ icache }); @@ -67,6 +68,15 @@ export const ComponentWithProperties = factory(() => { return v('ce-with-properties', data); }); +export const ComponentWithoutProperties = factory(() => { + const data = { + amethod: 'method', + agetter: 'getter', + areadonly: 'readonly' + }; + return v('ce-without-properties', data); +}) + export const ComponentWithUnregistered = factory(() => { const data = { bool: true, diff --git a/libraries/hybrids/src/basic-tests.js b/libraries/hybrids/src/basic-tests.js index 37229acdf2..2073c0d924 100644 --- a/libraries/hybrids/src/basic-tests.js +++ b/libraries/hybrids/src/basic-tests.js @@ -25,6 +25,7 @@ import { ComponentWithDifferentViews, ComponentWithProperties, ComponentWithDeclarativeEvent, + ComponentWithoutProperties, } from "./components"; describe("basic support", function() { @@ -165,6 +166,25 @@ describe("basic support", function() { }); }); + describe('without properties', function () { + define("component-without-properties", ComponentWithoutProperties); + + beforeEach(() => { + root.appendChild(document.createElement("component-without-properties")); + }); + + it('will not overwrite unwriteable properties', function () { + this.weight = 3; + requestAnimationFrame(() => { + const wc = root.firstElementChild.shadowRoot.querySelector('#wc'); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }) + }); + }); + describe("events", function() { define("component-with-declarative-event", ComponentWithDeclarativeEvent); diff --git a/libraries/hybrids/src/components.js b/libraries/hybrids/src/components.js index ae5810576e..e8a28e3276 100644 --- a/libraries/hybrids/src/components.js +++ b/libraries/hybrids/src/components.js @@ -19,6 +19,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; +import 'ce-without-properties'; import { html } from 'hybrids'; @@ -62,6 +63,17 @@ export const ComponentWithProperties = { `, }; +export const ComponentWithoutProperties = { + render: () => html` + + ` +} + export const ComponentWithDeclarativeEvent = { lowercaseHandled: false, kebabHandled: false, diff --git a/libraries/react/src/basic-tests.js b/libraries/react/src/basic-tests.js index e05374c6b3..28fdbc1706 100644 --- a/libraries/react/src/basic-tests.js +++ b/libraries/react/src/basic-tests.js @@ -29,7 +29,7 @@ import { ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent, - ComponentWithMethods, + ComponentWithoutProperties, } from "./components"; // Setup the test harness. This will get cleaned out with every test. @@ -199,18 +199,20 @@ describe("basic support", function () { expect(data).to.eql("React"); }); - it('will not overwrite methods', function () { - let root; + it('will not overwrite unwriteable properties', function () { + let wc; render( - { - root = current; + wc = current; }} /> ) - let wc = root.wc; - expect(wc.innerText).to.eql('Success'); - }) + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); // TODO: Is it the framework's responsibility to check if the underlying // property is defined? Or should it just always assume it is and do its diff --git a/libraries/react/src/components.js b/libraries/react/src/components.js index 5081373373..7f270647aa 100644 --- a/libraries/react/src/components.js +++ b/libraries/react/src/components.js @@ -20,7 +20,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; -import 'ce-with-methods'; +import 'ce-without-properties'; export class ComponentWithoutChildren extends Component { render() { @@ -111,13 +111,11 @@ export class ComponentWithProperties extends Component { } } -export class ComponentWithMethods extends Component { - render() { - return
- this.wc = el}> -
- } -} +export const ComponentWithoutProperties = React.forwardRef(({}, ref) => { + return
+ +
+}); export class ComponentWithUnregistered extends Component { render () { diff --git a/libraries/svelte/src/basic-tests.js b/libraries/svelte/src/basic-tests.js index 816765b3e3..8525044918 100644 --- a/libraries/svelte/src/basic-tests.js +++ b/libraries/svelte/src/basic-tests.js @@ -24,7 +24,7 @@ import { ComponentWithProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, - ComponentWithMethods, + ComponentWithoutProperties, } from "./components"; import { tick } from "svelte"; @@ -127,9 +127,12 @@ describe("basic support", function() { }); it('will not overwrite methods', function () { - new ComponentWithMethods({ target: scratch }); + new ComponentWithoutProperties({ target: scratch }); const wc = scratch.querySelector('#wc'); - expect(wc.innerText).to.eql('Success'); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); }) // it('will set boolean attributes on a Custom Element that has not already been defined and upgraded', function() { diff --git a/libraries/svelte/src/components.js b/libraries/svelte/src/components.js index 79906fa6c3..f128e8ba44 100644 --- a/libraries/svelte/src/components.js +++ b/libraries/svelte/src/components.js @@ -19,7 +19,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; -import 'ce-with-methods'; +import 'ce-without-properties'; export { default as ComponentWithoutChildren } from './components/ComponentWithoutChildren.svelte'; export { default as ComponentWithChildren } from './components/ComponentWithChildren.svelte'; @@ -29,4 +29,4 @@ export { default as ComponentWithProperties } from './components/ComponentWithPr export { default as ComponentWithUnregistered } from './components/ComponentWithUnregistered.svelte'; export { default as ComponentWithImperativeEvent } from './components/ComponentWithImperativeEvent.svelte'; export { default as ComponentWithDeclarativeEvent } from './components/ComponentWithDeclarativeEvent.svelte'; -export { default as ComponentWithMethods } from './components/ComponentWithMethods.svelte'; +export { default as ComponentWithoutProperties } from './components/ComponentWithoutProperties.svelte'; diff --git a/libraries/svelte/src/components/ComponentWithMethods.svelte b/libraries/svelte/src/components/ComponentWithMethods.svelte deleted file mode 100644 index c338385ddd..0000000000 --- a/libraries/svelte/src/components/ComponentWithMethods.svelte +++ /dev/null @@ -1 +0,0 @@ - diff --git a/libraries/svelte/src/components/ComponentWithoutProperties.svelte b/libraries/svelte/src/components/ComponentWithoutProperties.svelte new file mode 100644 index 0000000000..c1ccfed389 --- /dev/null +++ b/libraries/svelte/src/components/ComponentWithoutProperties.svelte @@ -0,0 +1 @@ + diff --git a/libraries/vue/src/basic-tests.js b/libraries/vue/src/basic-tests.js index 773477f4b9..a09f6c07ec 100644 --- a/libraries/vue/src/basic-tests.js +++ b/libraries/vue/src/basic-tests.js @@ -25,7 +25,7 @@ import { ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent, - ComponentWithMethods + ComponentWithoutProperties } from "./components"; import { expect } from "chai"; @@ -148,11 +148,14 @@ describe("basic support", function() { expect(data).to.eql("Vue"); }); - it('will not overwrite methods', function () { - const app = createApp(ComponentWithMethods); + it('will not overwrite unwriteable properties', function () { + const app = createApp(ComponentWithoutProperties); app.mount(scratch); const wc = scratch.querySelector('#wc'); - expect(wc.innerText).to.eql('Success'); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); }) // it('will set boolean attributes on a Custom Element that has not already been defined and upgraded', function() { diff --git a/libraries/vue/src/components.js b/libraries/vue/src/components.js index a4164ecce0..e0189703ce 100644 --- a/libraries/vue/src/components.js +++ b/libraries/vue/src/components.js @@ -20,7 +20,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; import 'ce-with-event'; -import 'ce-with-methods'; +import 'ce-without-properties'; export const ComponentWithoutChildren = defineComponent({ template: ` @@ -101,14 +101,23 @@ export const ComponentWithProperties = defineComponent({ } }); -export const ComponentWithMethods = defineComponent({ +export const ComponentWithoutProperties = defineComponent({ template: `
- +
- ` + `, + data: function () { + return { + method: 'method', + getter: 'getter', + readonly: 'readonly', + } + } }) export const ComponentWithUnregistered = defineComponent({ From 21bcfe16edc9be24c6c79c354f20a7c76de73bd8 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Mon, 16 Dec 2024 13:54:39 +0000 Subject: [PATCH 04/18] Update goldens --- libraries/angular/meta/expectedResults.json | 6 +++--- libraries/angularjs/meta/expectedResults.json | 8 ++++---- libraries/dio/meta/expectedResults.json | 8 ++++---- libraries/dojo/meta/expectedResults.json | 6 +++--- libraries/hybrids/meta/expectedResults.json | 8 ++++---- libraries/lwc/meta/expectedResults.json | 2 +- libraries/react/meta/expectedResults.json | 10 +++++----- libraries/react/package.json | 2 +- libraries/solid/meta/expectedResults.json | 2 +- libraries/svelte/meta/expectedResults.json | 12 ++++++------ libraries/vue/meta/expectedResults.json | 6 +++--- 11 files changed, 35 insertions(+), 35 deletions(-) diff --git a/libraries/angular/meta/expectedResults.json b/libraries/angular/meta/expectedResults.json index 755586be4b..96a3486551 100644 --- a/libraries/angular/meta/expectedResults.json +++ b/libraries/angular/meta/expectedResults.json @@ -1,5 +1,5 @@ { - "success": 32, + "success": 34, "failed": 0, "skipped": 0, "error": false, @@ -7,9 +7,9 @@ "exitCode": 0, "score": 100, "basicSupport": { - "total": 16, + "total": 18, "failed": 0, - "passed": 16 + "passed": 18 }, "advancedSupport": { "total": 16, diff --git a/libraries/angularjs/meta/expectedResults.json b/libraries/angularjs/meta/expectedResults.json index c15d4478b5..b34f84d98c 100644 --- a/libraries/angularjs/meta/expectedResults.json +++ b/libraries/angularjs/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 30, - "failed": 2, + "failed": 4, "skipped": 0, "error": false, "disconnected": false, "exitCode": 1, - "score": 94, + "score": 87, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/dio/meta/expectedResults.json b/libraries/dio/meta/expectedResults.json index 33d25e192e..c7c62ab0a9 100644 --- a/libraries/dio/meta/expectedResults.json +++ b/libraries/dio/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 26, - "failed": 6, + "failed": 8, "skipped": 0, "error": false, "disconnected": false, "exitCode": 1, - "score": 92, + "score": 85, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/dojo/meta/expectedResults.json b/libraries/dojo/meta/expectedResults.json index 755586be4b..96a3486551 100644 --- a/libraries/dojo/meta/expectedResults.json +++ b/libraries/dojo/meta/expectedResults.json @@ -1,5 +1,5 @@ { - "success": 32, + "success": 34, "failed": 0, "skipped": 0, "error": false, @@ -7,9 +7,9 @@ "exitCode": 0, "score": 100, "basicSupport": { - "total": 16, + "total": 18, "failed": 0, - "passed": 16 + "passed": 18 }, "advancedSupport": { "total": 16, diff --git a/libraries/hybrids/meta/expectedResults.json b/libraries/hybrids/meta/expectedResults.json index c15d4478b5..b34f84d98c 100644 --- a/libraries/hybrids/meta/expectedResults.json +++ b/libraries/hybrids/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 30, - "failed": 2, + "failed": 4, "skipped": 0, "error": false, "disconnected": false, "exitCode": 1, - "score": 94, + "score": 87, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/lwc/meta/expectedResults.json b/libraries/lwc/meta/expectedResults.json index c7270700ca..06d0027d40 100644 --- a/libraries/lwc/meta/expectedResults.json +++ b/libraries/lwc/meta/expectedResults.json @@ -16,4 +16,4 @@ "failed": 8, "passed": 8 } -} +} \ No newline at end of file diff --git a/libraries/react/meta/expectedResults.json b/libraries/react/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/react/meta/expectedResults.json +++ b/libraries/react/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/react/package.json b/libraries/react/package.json index e98b836ded..4a11fc52c0 100644 --- a/libraries/react/package.json +++ b/libraries/react/package.json @@ -37,7 +37,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=react karma start" + "command": "cross-env LIBRARY_NAME=react karma start || echo ''" }, "build": { "dependencies": [ diff --git a/libraries/solid/meta/expectedResults.json b/libraries/solid/meta/expectedResults.json index 714176a640..755586be4b 100644 --- a/libraries/solid/meta/expectedResults.json +++ b/libraries/solid/meta/expectedResults.json @@ -16,4 +16,4 @@ "failed": 0, "passed": 16 } -} +} \ No newline at end of file diff --git a/libraries/svelte/meta/expectedResults.json b/libraries/svelte/meta/expectedResults.json index 714176a640..922b788009 100644 --- a/libraries/svelte/meta/expectedResults.json +++ b/libraries/svelte/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { @@ -16,4 +16,4 @@ "failed": 0, "passed": 16 } -} +} \ No newline at end of file diff --git a/libraries/vue/meta/expectedResults.json b/libraries/vue/meta/expectedResults.json index 755586be4b..96a3486551 100644 --- a/libraries/vue/meta/expectedResults.json +++ b/libraries/vue/meta/expectedResults.json @@ -1,5 +1,5 @@ { - "success": 32, + "success": 34, "failed": 0, "skipped": 0, "error": false, @@ -7,9 +7,9 @@ "exitCode": 0, "score": 100, "basicSupport": { - "total": 16, + "total": 18, "failed": 0, - "passed": 16 + "passed": 18 }, "advancedSupport": { "total": 16, From 5ef6462fff20815d9b21e401853eb8a95ee26cc1 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:26:44 +0000 Subject: [PATCH 05/18] hyperapp --- libraries/hyperapp/src/basic-tests.js | 14 +++++++++++++- libraries/hyperapp/src/components.js | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/libraries/hyperapp/src/basic-tests.js b/libraries/hyperapp/src/basic-tests.js index 80b863062b..742678fe48 100644 --- a/libraries/hyperapp/src/basic-tests.js +++ b/libraries/hyperapp/src/basic-tests.js @@ -25,7 +25,8 @@ import { ComponentWithDifferentViews, ComponentWithProperties, ComponentWithImperativeEvent, - ComponentWithDeclarativeEvent + ComponentWithDeclarativeEvent, + ComponentWithoutProperties } from "./components"; // Setup the test harness. This will get cleaned out with every test. @@ -130,6 +131,17 @@ describe("basic support", function () { let data = wc.str || wc.getAttribute("str"); expect(data).to.eql("Hyperapp"); }); + + it('will not overwrite unwritable properties', async function() { + this.weight = 3; + ComponentWithoutProperties(root); + await new Promise(requestAnimationFrame); + let wc = testContainer.querySelector('#wc'); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }) }); describe("events", function () { diff --git a/libraries/hyperapp/src/components.js b/libraries/hyperapp/src/components.js index 73726e7934..0c54a8e6ff 100644 --- a/libraries/hyperapp/src/components.js +++ b/libraries/hyperapp/src/components.js @@ -19,6 +19,7 @@ import "ce-without-children" import "ce-with-children" import "ce-with-properties" import "ce-with-event" +import "ce-without-properties" import { app, h, text } from "hyperapp" @@ -81,6 +82,20 @@ export const ComponentWithProperties = node => ]), }) +export const ComponentWithoutProperties = node => + app({ + node, + init: {}, + view: () => + h('div', {}, [ + h('ce-without-properties', { + amethod: 'method', + agetter: 'getter', + areadonly: 'readonly' + }), + ]), + }) + export const ComponentWithImperativeEvent = node => { const _withElem = (_, opts) => requestAnimationFrame(_ => { From f2f95b38e5eda87789df460dad33f16ee0fd47c0 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:30:37 +0000 Subject: [PATCH 06/18] hyperhtml --- libraries/hyperhtml/src/basic-tests.js | 11 +++++++++++ libraries/hyperhtml/src/components.js | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/libraries/hyperhtml/src/basic-tests.js b/libraries/hyperhtml/src/basic-tests.js index 5416e41c6e..4a3965c959 100644 --- a/libraries/hyperhtml/src/basic-tests.js +++ b/libraries/hyperhtml/src/basic-tests.js @@ -26,6 +26,7 @@ import { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProperties, + ComponentWithoutProperties, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent } from "./components"; @@ -131,6 +132,16 @@ describe("basic support", function() { let data = wc.str || wc.getAttribute("str"); expect(data).to.eql("hyperHTML"); }); + + it('will not overwrite unwriteable properties', function () { + this.weight = 3; + ComponentWithoutProperties(root); + let wc = root.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); }); describe("events", function() { diff --git a/libraries/hyperhtml/src/components.js b/libraries/hyperhtml/src/components.js index 4ab1431184..16896ed364 100644 --- a/libraries/hyperhtml/src/components.js +++ b/libraries/hyperhtml/src/components.js @@ -18,6 +18,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; +import 'ce-without-properties'; import 'ce-with-event'; import HyperHTMLELement from 'hyperhtml-element/esm'; @@ -79,6 +80,16 @@ export const ComponentWithProperties = (root) => hyper(root)` >
`; +export const ComponentWithoutProperties = (root) => hyper(root)` +
+ +
+` + export class ComponentWithImperativeEvent extends HyperHTMLELement { created() { this.eventClicks = 0; From a15d495c4a550a97c2cc7d484f39af45d42840a3 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:35:49 +0000 Subject: [PATCH 07/18] lit --- libraries/lit/src/basic-tests.js | 14 ++++++++++ libraries/lit/src/components.js | 1 + .../component-without-properties.js | 26 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 libraries/lit/src/components/component-without-properties.js diff --git a/libraries/lit/src/basic-tests.js b/libraries/lit/src/basic-tests.js index 7bba7cbd7b..56324a54cd 100644 --- a/libraries/lit/src/basic-tests.js +++ b/libraries/lit/src/basic-tests.js @@ -128,6 +128,20 @@ describe("basic support", function() { }); }); + describe("without properties", () => { + it("will not overwrite unwritable properties", async function() { + this.weight = 3; + const root = document.createElement("component-without-properties"); + scratch.appendChild(root); + await root.updateComplete; + const wc = root.shadowRoot.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + }); + describe("events", function() { it("can imperatively listen to a DOM event dispatched by a Custom Element", async function() { this.weight = 3; diff --git a/libraries/lit/src/components.js b/libraries/lit/src/components.js index 7cd9671c32..8821efad23 100644 --- a/libraries/lit/src/components.js +++ b/libraries/lit/src/components.js @@ -3,5 +3,6 @@ import "./components/component-with-children.js"; import "./components/component-with-children-rerender.js"; import "./components/component-with-different-views.js"; import "./components/component-with-properties.js"; +import "./components/component-without-properties.js"; import "./components/component-with-imperative-event.js"; import "./components/component-with-declarative-event.js"; diff --git a/libraries/lit/src/components/component-without-properties.js b/libraries/lit/src/components/component-without-properties.js new file mode 100644 index 0000000000..dca2c8b1e6 --- /dev/null +++ b/libraries/lit/src/components/component-without-properties.js @@ -0,0 +1,26 @@ +import { LitElement, html } from "lit"; +import "ce-without-properties"; + +class ComponentWithoutProperties extends LitElement { + + static get properties() { + return {}; + } + + render() { + return html` +
+ +
+ `; + } +} +customElements.define( + "component-without-properties", + ComponentWithoutProperties +); From 8b15eb134a2f7cd6bf4544d6938c050cd50a46f1 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:42:21 +0000 Subject: [PATCH 08/18] lwc --- libraries/lwc/src/basic-tests.js | 12 ++++++++++++ libraries/lwc/src/components.js | 6 ++++++ .../x/withoutProperties/withoutProperties.html | 7 +++++++ .../modules/x/withoutProperties/withoutProperties.js | 7 +++++++ libraries/vue/src/basic-tests.js | 2 +- 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 libraries/lwc/src/modules/x/withoutProperties/withoutProperties.html create mode 100644 libraries/lwc/src/modules/x/withoutProperties/withoutProperties.js diff --git a/libraries/lwc/src/basic-tests.js b/libraries/lwc/src/basic-tests.js index e0f217c53d..295d9a0b90 100644 --- a/libraries/lwc/src/basic-tests.js +++ b/libraries/lwc/src/basic-tests.js @@ -21,6 +21,7 @@ import { createComponentWithChildrenRerender, createComponentWithDifferentViews, createComponentWithProperties, + createComponentWithoutProperties, createComponentWithImperativeEvent, } from './components'; @@ -135,6 +136,17 @@ describe('basic support', function() { const data = wc.str || wc.getAttribute('str'); expect(data).to.eql('lwc'); }); + + it("will not overwrite unwriteable properties", function () { + this.weight = 3; + const cmp = createComponentWithoutProperties(); + scratch.appendChild(cmp); + const wc = cmp.shadowRoot.querySelector('ce-without-properties'); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); }); describe('events', function() { diff --git a/libraries/lwc/src/components.js b/libraries/lwc/src/components.js index 0310014a42..4315f10f55 100644 --- a/libraries/lwc/src/components.js +++ b/libraries/lwc/src/components.js @@ -18,6 +18,7 @@ import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; +import 'ce-without-properties'; import 'ce-with-event'; import { createElement } from 'lwc'; @@ -27,6 +28,7 @@ import WithChildren from 'x/withChildren'; import WithChildrenRerender from 'x/withChildrenRerender'; import WithDifferentViews from 'x/withDifferentViews'; import WithProperties from 'x/withProperties'; +import WithoutProperties from 'x/withoutProperties'; import WithImperativeEvent from 'x/withImperativeEvent'; import WithDeclarativeEvent from 'x/withDeclarativeEvent'; @@ -50,6 +52,10 @@ export function createComponentWithProperties() { return createElement('x-with-properties', { is: WithProperties }); } +export function createComponentWithoutProperties() { + return createElement('x-without-properties', { is: WithoutProperties }); +} + export function createComponentWithImperativeEvent() { return createElement('x-with-imperative-event', { is: WithImperativeEvent }); } diff --git a/libraries/lwc/src/modules/x/withoutProperties/withoutProperties.html b/libraries/lwc/src/modules/x/withoutProperties/withoutProperties.html new file mode 100644 index 0000000000..e87ddf87f8 --- /dev/null +++ b/libraries/lwc/src/modules/x/withoutProperties/withoutProperties.html @@ -0,0 +1,7 @@ + diff --git a/libraries/lwc/src/modules/x/withoutProperties/withoutProperties.js b/libraries/lwc/src/modules/x/withoutProperties/withoutProperties.js new file mode 100644 index 0000000000..2fcb83fdbd --- /dev/null +++ b/libraries/lwc/src/modules/x/withoutProperties/withoutProperties.js @@ -0,0 +1,7 @@ +import { LightningElement } from "lwc"; + +export default class extends LightningElement { + method = 'method'; + readonly = 'readonly'; + getter = 'getter'; +} diff --git a/libraries/vue/src/basic-tests.js b/libraries/vue/src/basic-tests.js index a09f6c07ec..4a23d76371 100644 --- a/libraries/vue/src/basic-tests.js +++ b/libraries/vue/src/basic-tests.js @@ -148,7 +148,7 @@ describe("basic support", function() { expect(data).to.eql("Vue"); }); - it('will not overwrite unwriteable properties', function () { + it("will not overwrite unwriteable properties", function () { const app = createApp(ComponentWithoutProperties); app.mount(scratch); const wc = scratch.querySelector('#wc'); From 083f7ebadb31787aa741f7d4c8ea8ba9509eeb01 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:45:01 +0000 Subject: [PATCH 09/18] Mithril --- libraries/mithril/src/basic-tests.js | 11 +++++++++++ libraries/mithril/src/components.js | 12 ++++++++++++ libraries/vue/src/basic-tests.js | 1 + 3 files changed, 24 insertions(+) diff --git a/libraries/mithril/src/basic-tests.js b/libraries/mithril/src/basic-tests.js index ed0bb38a63..de54b171ae 100644 --- a/libraries/mithril/src/basic-tests.js +++ b/libraries/mithril/src/basic-tests.js @@ -27,6 +27,7 @@ import { ComponentWithDifferentViews, ComponentWithProperties, ComponentWithImperativeEvent, + ComponentWithoutProperties, ComponentWithDeclarativeEvent } from "./components"; @@ -127,6 +128,16 @@ describe("basic support", function() { let data = wc.str || wc.getAttribute("str"); expect(data).to.eql("Mithril"); }); + + it("will not overwrite unwriteable properties", function () { + this.weight = 3; + m.mount(root, ComponentWithoutProperties()); + let wc = root.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); }); describe("events", function() { diff --git a/libraries/mithril/src/components.js b/libraries/mithril/src/components.js index 27be8d6d01..15114170f5 100644 --- a/libraries/mithril/src/components.js +++ b/libraries/mithril/src/components.js @@ -19,6 +19,7 @@ import 'ce-without-children' import 'ce-with-children' import 'ce-with-properties' import 'ce-with-event' +import 'ce-without-properties' import m from 'mithril' @@ -86,6 +87,17 @@ export const ComponentWithProperties = () => ({ ) }) +export const ComponentWithoutProperties = () => ({ + view: () => + m('div', + m('ce-without-properties#wc', { + amethod: 'method', + agetter: 'getter', + areadonly: 'readonly' + }) + ) +}) + export const ComponentWithImperativeEvent = () => { let eventHandled = false diff --git a/libraries/vue/src/basic-tests.js b/libraries/vue/src/basic-tests.js index 4a23d76371..d9a8b289c5 100644 --- a/libraries/vue/src/basic-tests.js +++ b/libraries/vue/src/basic-tests.js @@ -149,6 +149,7 @@ describe("basic support", function() { }); it("will not overwrite unwriteable properties", function () { + this.weight = 3; const app = createApp(ComponentWithoutProperties); app.mount(scratch); const wc = scratch.querySelector('#wc'); From 57fc2f8e94b04adac38e4a222f64ff147ffae6fb Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:47:52 +0000 Subject: [PATCH 10/18] omi --- libraries/omi/src/basic-tests.js | 10 ++++++++++ libraries/omi/src/components.js | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/libraries/omi/src/basic-tests.js b/libraries/omi/src/basic-tests.js index c2f17ff112..831c56ca9d 100644 --- a/libraries/omi/src/basic-tests.js +++ b/libraries/omi/src/basic-tests.js @@ -102,6 +102,16 @@ describe("basic support", function () { expect(data).to.eql("Omi"); }); + it("will not overwrite unwriteable properties", function () { + this.weight = 3; + let root = render(, scratch); + let wc = root.shadowRoot.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + // it('will set boolean attributes on a Custom Element that has not already been defined and upgraded', function () { // let root = render(, scratch); // let wc = root.shadowRoot.querySelector('#wc'); diff --git a/libraries/omi/src/components.js b/libraries/omi/src/components.js index 97269ce804..5046337b83 100644 --- a/libraries/omi/src/components.js +++ b/libraries/omi/src/components.js @@ -3,6 +3,7 @@ import 'ce-without-children' import 'ce-with-children' import 'ce-with-properties' import 'ce-with-event' +import 'ce-without-properties' define('component-without-children', _ => (
@@ -78,6 +79,23 @@ define('component-with-properties', _ => { }) +define('component-without-properties', _ => { + const data = { + method: 'method', + getter: 'getter', + readonly: 'readonly' + } + return ( +
+ +
+ ) +}) + From c6dacc5f1b94b4dd2db3748aef840a59d7a6ddf5 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:53:19 +0000 Subject: [PATCH 11/18] polymer --- libraries/polymer/src/basic-tests.js | 13 +++++++ libraries/polymer/src/components.js | 1 + .../component-without-properties.js | 39 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 libraries/polymer/src/components/component-without-properties.js diff --git a/libraries/polymer/src/basic-tests.js b/libraries/polymer/src/basic-tests.js index 241e02efa9..456a72da57 100644 --- a/libraries/polymer/src/basic-tests.js +++ b/libraries/polymer/src/basic-tests.js @@ -124,6 +124,19 @@ describe("basic support", function() { }); }); + describe("without properties", () => { + it('will not overwrite unwriteable properties', function () { + this.weight = 3; + const root = document.createElement("component-without-properties"); + scratch.appendChild(root); + const wc = root.shadowRoot.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }) + }); + describe("events", function() { it("can imperatively listen to a DOM event dispatched by a Custom Element", async function() { this.weight = 3; diff --git a/libraries/polymer/src/components.js b/libraries/polymer/src/components.js index 7cd9671c32..8821efad23 100644 --- a/libraries/polymer/src/components.js +++ b/libraries/polymer/src/components.js @@ -3,5 +3,6 @@ import "./components/component-with-children.js"; import "./components/component-with-children-rerender.js"; import "./components/component-with-different-views.js"; import "./components/component-with-properties.js"; +import "./components/component-without-properties.js"; import "./components/component-with-imperative-event.js"; import "./components/component-with-declarative-event.js"; diff --git a/libraries/polymer/src/components/component-without-properties.js b/libraries/polymer/src/components/component-without-properties.js new file mode 100644 index 0000000000..8afdaf8a09 --- /dev/null +++ b/libraries/polymer/src/components/component-without-properties.js @@ -0,0 +1,39 @@ +import { PolymerElement, html } from "@polymer/polymer/polymer-element.js"; +import "ce-without-properties"; + +class ComponentWithoutProperties extends PolymerElement { + static get is() { + return "component-without-properties"; + } + static get properties() { + return { + method: { + type: String, + value: 'method' + }, + getter: { + type: String, + value: 'getter' + }, + readonly: { + type: String, + value: 'readonly' + }, + }; + } + static get template() { + return html` +
+ +
+ `; + } +} +window.customElements.define( + ComponentWithoutProperties.is, + ComponentWithoutProperties +); From d0dad12588df6c60f8667b4ece834b22632dc50e Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 17:57:20 +0000 Subject: [PATCH 12/18] preact --- libraries/preact/src/basic-tests.js | 12 ++++++++++++ libraries/preact/src/components.js | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/libraries/preact/src/basic-tests.js b/libraries/preact/src/basic-tests.js index d87303c6ef..db898d9fc3 100644 --- a/libraries/preact/src/basic-tests.js +++ b/libraries/preact/src/basic-tests.js @@ -23,6 +23,7 @@ import { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProperties, + ComponentWithoutProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent @@ -113,6 +114,17 @@ describe("basic support", function() { expect(data).to.eql("Preact"); }); + it("will not overwrite unwriteable properties", function () { + this.weight = 3; + let root = mount().getDOMNode(); + let wc = root.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + + // it('will set boolean attributes on a Custom Element that has not already been defined and upgraded', function() { // let root = mount().getDOMNode(); // let wc = root.querySelector('#wc'); diff --git a/libraries/preact/src/components.js b/libraries/preact/src/components.js index 0792eae4cd..df0c948aa7 100644 --- a/libraries/preact/src/components.js +++ b/libraries/preact/src/components.js @@ -19,6 +19,7 @@ import { h, render, Component } from 'preact'; import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; +import 'ce-without-properties'; import 'ce-with-event'; export class ComponentWithoutChildren extends Component { @@ -109,6 +110,25 @@ export class ComponentWithProperties extends Component { } } +export class ComponentWithoutProperties extends Component { + render () { + const data = { + method: 'method', + getter: 'getter', + readonly: 'readonly' + } + return ( +
+ +
+ ) + } +} + export class ComponentWithUnregistered extends Component { render () { const data = { From 357915bad273d78874b16ad960e63cf954df81f0 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 18:01:45 +0000 Subject: [PATCH 13/18] riot --- libraries/riot/src/basic-tests.js | 11 +++++++++++ libraries/riot/src/components.js | 2 ++ .../src/components/ComponentWithoutProperties.riot | 12 ++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 libraries/riot/src/components/ComponentWithoutProperties.riot diff --git a/libraries/riot/src/basic-tests.js b/libraries/riot/src/basic-tests.js index 83298d2284..9cdf1cb51d 100644 --- a/libraries/riot/src/basic-tests.js +++ b/libraries/riot/src/basic-tests.js @@ -23,6 +23,7 @@ import { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProperties, + ComponentWithoutProperties, ComponentWithUnregistered, ComponentWithImperativeEvent } from './components' @@ -122,6 +123,16 @@ describe('basic support', function() { expect(data).to.eql('riot') }) + it("will not overwrite unwriteable properties", function () { + this.weight = 3; + component(ComponentWithoutProperties)(scratch) + let wc = scratch.querySelector('#wc') + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + // Riot.js passes all the following tests but they must be commented out // being consistent with the other frameworks ¯\_(ツ)_/¯ /* diff --git a/libraries/riot/src/components.js b/libraries/riot/src/components.js index a144c30860..a6da4fa505 100644 --- a/libraries/riot/src/components.js +++ b/libraries/riot/src/components.js @@ -18,6 +18,7 @@ import 'ce-without-children' import 'ce-with-children' import 'ce-with-properties' +import 'ce-without-properties' import 'ce-with-event' export { default as ComponentWithoutChildren } from './components/ComponentWithoutChildren.riot' @@ -25,6 +26,7 @@ export { default as ComponentWithChildren } from './components/ComponentWithChil export { default as ComponentWithChildrenRerender } from './components/ComponentWithChildrenRerender.riot' export { default as ComponentWithDifferentViews } from './components/ComponentWithDifferentViews.riot' export { default as ComponentWithProperties } from './components/ComponentWithProperties.riot' +export { default as ComponentWithoutProperties } from './components/ComponentWithoutProperties.riot' export { default as ComponentWithUnregistered } from './components/ComponentWithUnregistered.riot' export { default as ComponentWithImperativeEvent } from './components/ComponentWithImperativeEvent.riot' export { default as ComponentWithDeclarativeEvent } from './components/ComponentWithDeclarativeEvent.riot' diff --git a/libraries/riot/src/components/ComponentWithoutProperties.riot b/libraries/riot/src/components/ComponentWithoutProperties.riot new file mode 100644 index 0000000000..2c8bbfcea8 --- /dev/null +++ b/libraries/riot/src/components/ComponentWithoutProperties.riot @@ -0,0 +1,12 @@ + + + + From 9763c5eaa94e84d107120e0cdadddd9330f2f876 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 18:05:48 +0000 Subject: [PATCH 14/18] skate --- libraries/skate/src/basic-tests.js | 14 ++++++++++++++ libraries/skate/src/components.js | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/libraries/skate/src/basic-tests.js b/libraries/skate/src/basic-tests.js index ce474dd053..c18ae505e0 100644 --- a/libraries/skate/src/basic-tests.js +++ b/libraries/skate/src/basic-tests.js @@ -138,6 +138,20 @@ describe("basic support", function() { }); }); + describe("without properties", function() { + it("will not overwrite unwriteable properties", async function() { + this.weight = 3; + let root = document.createElement('component-without-properties'); + scratch.appendChild(root); + await Promise.resolve(); + let wc = root.shadowRoot.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + }) + describe("events", function() { it("can imperatively listen to a DOM event dispatched by a Custom Element", async function() { this.weight = 3; diff --git a/libraries/skate/src/components.js b/libraries/skate/src/components.js index 053578727e..92f08a8d6d 100644 --- a/libraries/skate/src/components.js +++ b/libraries/skate/src/components.js @@ -23,6 +23,7 @@ import { h } from "preact"; import "ce-without-children"; import "ce-with-children"; import "ce-with-properties"; +import "ce-without-properties"; import "ce-with-event"; export class ComponentWithoutChildren extends withComponent(withPreact()) { @@ -128,6 +129,27 @@ export class ComponentWithProperties extends withComponent(withPreact()) { } customElements.define("component-with-properties", ComponentWithProperties); +export class ComponentWithoutProperties extends withComponent(withPreact()) { + render() { + const data = { + getter: 'getter', + readonly: 'readonly', + method: 'method', + } + return ( +
+ +
+ ) + } +} +customElements.define("component-without-properties", ComponentWithoutProperties) + export class ComponentWithUnregistered extends withComponent(withPreact()) { render() { const data = { From 4f8f7e55ca4a71d8ee5f82064d5570eb580043ee Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 18:08:17 +0000 Subject: [PATCH 15/18] Solid --- libraries/solid/src/basic-tests.js | 11 +++++++++++ libraries/solid/src/components.js | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/libraries/solid/src/basic-tests.js b/libraries/solid/src/basic-tests.js index 4247a307de..9a78ff99e6 100644 --- a/libraries/solid/src/basic-tests.js +++ b/libraries/solid/src/basic-tests.js @@ -23,6 +23,7 @@ import { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProperties, + ComponentWithoutProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent @@ -110,6 +111,16 @@ describe("basic support", function() { expect(data).to.eql("Solid"); }); + it("will not overwrite unwriteable properties", function () { + this.weight = 3; + let wc; + render(() => wc = , document.body); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + // TODO: Is it the framework's responsibility to check if the underlying // property is defined? Or should it just always assume it is and do its // usual default behavior? Preact will actually check if it's defined and diff --git a/libraries/solid/src/components.js b/libraries/solid/src/components.js index 047248bc00..5db210a4e7 100644 --- a/libraries/solid/src/components.js +++ b/libraries/solid/src/components.js @@ -20,6 +20,7 @@ import { createStore } from "solid-js/store"; import "ce-without-children"; import "ce-with-children"; import "ce-with-properties"; +import "ce-without-properties"; import "ce-with-event"; export const ComponentWithoutChildren = () => ; @@ -63,6 +64,21 @@ export const ComponentWithProperties = () => { ); }; +export const ComponentWithoutProperties = () => { + const data = { + getter: 'getter', + method: 'method', + readonly: 'readonly', + } + return ( + + ) +} + export const ComponentWithUnregistered = () => { const data = { bool: true, From 8ee776b3318b1e9e87cc5cef31f9541c5e066ae0 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 18:18:08 +0000 Subject: [PATCH 16/18] stencil --- libraries/stencil/src/basic-tests.js | 13 ++++++++++ libraries/stencil/src/components.d.ts | 13 ++++++++++ libraries/stencil/src/components.js | 3 +++ .../component-without-properties.tsx | 26 +++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 libraries/stencil/src/components/component-without-properties/component-without-properties.tsx diff --git a/libraries/stencil/src/basic-tests.js b/libraries/stencil/src/basic-tests.js index e1408c6051..6493fdf3ab 100644 --- a/libraries/stencil/src/basic-tests.js +++ b/libraries/stencil/src/basic-tests.js @@ -129,6 +129,19 @@ describe("basic support", function () { expect(data).to.eql("Stencil"); }); }); + describe('without properties', function () { + it("will not overwrite unwriteable properties", async function () { + this.weight = 3; + let root = document.createElement('component-without-properties'); + scratch.appendChild(root); + await waitForRender(root); + let wc = root.shadowRoot.querySelector("#wc"); + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }); + }); describe("events", function () { it("can imperatively listen to a DOM event dispatched by a Custom Element", async function () { diff --git a/libraries/stencil/src/components.d.ts b/libraries/stencil/src/components.d.ts index f1c933cfb1..b5a94ce17e 100644 --- a/libraries/stencil/src/components.d.ts +++ b/libraries/stencil/src/components.d.ts @@ -35,6 +35,8 @@ export namespace Components { } interface ComponentWithoutChildren { } + interface ComponentWithoutProperties { + } } declare global { interface HTMLComponentWithChildrenElement extends Components.ComponentWithChildren, HTMLStencilElement { @@ -79,6 +81,12 @@ declare global { prototype: HTMLComponentWithoutChildrenElement; new (): HTMLComponentWithoutChildrenElement; }; + interface HTMLComponentWithoutPropertiesElement extends Components.ComponentWithoutProperties, HTMLStencilElement { + } + var HTMLComponentWithoutPropertiesElement: { + prototype: HTMLComponentWithoutPropertiesElement; + new (): HTMLComponentWithoutPropertiesElement; + }; interface HTMLElementTagNameMap { "component-with-children": HTMLComponentWithChildrenElement; "component-with-children-rerender": HTMLComponentWithChildrenRerenderElement; @@ -87,6 +95,7 @@ declare global { "component-with-imperative-event": HTMLComponentWithImperativeEventElement; "component-with-properties": HTMLComponentWithPropertiesElement; "component-without-children": HTMLComponentWithoutChildrenElement; + "component-without-properties": HTMLComponentWithoutPropertiesElement; } } declare namespace LocalJSX { @@ -118,6 +127,8 @@ declare namespace LocalJSX { } interface ComponentWithoutChildren { } + interface ComponentWithoutProperties { + } interface IntrinsicElements { "component-with-children": ComponentWithChildren; "component-with-children-rerender": ComponentWithChildrenRerender; @@ -126,6 +137,7 @@ declare namespace LocalJSX { "component-with-imperative-event": ComponentWithImperativeEvent; "component-with-properties": ComponentWithProperties; "component-without-children": ComponentWithoutChildren; + "component-without-properties": ComponentWithoutProperties; } } export { LocalJSX as JSX }; @@ -139,6 +151,7 @@ declare module "@stencil/core" { "component-with-imperative-event": LocalJSX.ComponentWithImperativeEvent & JSXBase.HTMLAttributes; "component-with-properties": LocalJSX.ComponentWithProperties & JSXBase.HTMLAttributes; "component-without-children": LocalJSX.ComponentWithoutChildren & JSXBase.HTMLAttributes; + "component-without-properties": LocalJSX.ComponentWithoutProperties & JSXBase.HTMLAttributes; } } } diff --git a/libraries/stencil/src/components.js b/libraries/stencil/src/components.js index 4efba7f4e4..c9705c8a2d 100644 --- a/libraries/stencil/src/components.js +++ b/libraries/stencil/src/components.js @@ -1,6 +1,7 @@ import "ce-without-children"; import "ce-with-children"; import "ce-with-properties"; +import "ce-without-properties"; import "ce-with-event"; import { ComponentWithChildren } from "../dist/components/component-with-children.js"; import { ComponentWithChildrenRerender } from "../dist/components/component-with-children-rerender.js"; @@ -8,6 +9,7 @@ import { ComponentWithDeclarativeEvent } from "../dist/components/component-with import { ComponentWithDifferentViews } from "../dist/components/component-with-different-views.js"; import { ComponentWithImperativeEvent } from "../dist/components/component-with-imperative-event.js"; import { ComponentWithProperties } from "../dist/components/component-with-properties.js"; +import { ComponentWithoutProperties } from "../dist/components/component-without-properties.js"; import { ComponentWithoutChildren } from "../dist/components/component-without-children.js"; customElements.define("component-without-children", ComponentWithoutChildren); @@ -29,3 +31,4 @@ customElements.define( ComponentWithDeclarativeEvent ); customElements.define("component-with-properties", ComponentWithProperties); +customElements.define('component-without-properties', ComponentWithoutProperties); diff --git a/libraries/stencil/src/components/component-without-properties/component-without-properties.tsx b/libraries/stencil/src/components/component-without-properties/component-without-properties.tsx new file mode 100644 index 0000000000..9b0a0e9062 --- /dev/null +++ b/libraries/stencil/src/components/component-without-properties/component-without-properties.tsx @@ -0,0 +1,26 @@ +import { Component, Host, h } from "@stencil/core"; + +@Component({ + tag: "component-without-properties", + shadow: true +}) +export class ComponentWithoutProperties { + + render() { + const data = { + getter: 'getter', + method: 'method', + readonly: 'readonly' + } + return ( + + + + ); + } +} From 7e7d1e75956e04237dcf2061c3c70c0afcfcd7e6 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 18:21:24 +0000 Subject: [PATCH 17/18] surplus --- libraries/surplus/src/basic-tests.js | 13 +++++++++++++ libraries/surplus/src/components.js | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/libraries/surplus/src/basic-tests.js b/libraries/surplus/src/basic-tests.js index df00059752..da86ddb8a3 100644 --- a/libraries/surplus/src/basic-tests.js +++ b/libraries/surplus/src/basic-tests.js @@ -24,6 +24,7 @@ import { ComponentWithChildrenRerender, ComponentWithDifferentViews, ComponentWithProperties, + ComponentWithoutProperties, ComponentWithUnregistered, ComponentWithImperativeEvent, ComponentWithDeclarativeEvent @@ -122,6 +123,18 @@ describe("basic support", function() { }); }); + it("will not overwrite unwriteable properties", function () { + this.weight = 3; + S.root(() => { + let root = ; + let wc = root.wc; + expect(wc.getAttribute('amethod')).to.eql('method'); + expect(wc.getAttribute('agetter')).to.eql('getter'); + expect(wc.getAttribute('areadonly')).to.eql('readonly'); + expect(wc.innerHTML).to.eql('Success'); + }) + }); + // TODO: Is it the framework's responsibility to check if the underlying // property is defined? Or should it just always assume it is and do its // usual default behavior? Preact will actually check if it's defined and diff --git a/libraries/surplus/src/components.js b/libraries/surplus/src/components.js index c20d5fe4a5..050bab9039 100644 --- a/libraries/surplus/src/components.js +++ b/libraries/surplus/src/components.js @@ -21,6 +21,7 @@ import on from 'surplus-mixin-on'; import 'ce-without-children'; import 'ce-with-children'; import 'ce-with-properties'; +import 'ce-without-properties'; import 'ce-with-event'; export const ComponentWithoutChildren = () => @@ -80,6 +81,23 @@ export const ComponentWithProperties = () => { ); } +export const ComponentWithoutProperties = () => { + const data = { + getter: 'getter', + method: 'method', + readonly: 'readonly', + }; + return ( +
+ +
+ ) +} + export const ComponentWithUnregistered = () => { const data = { bool: true, From 65332c4fa4570acb911b923af2f8bc17163e1b19 Mon Sep 17 00:00:00 2001 From: Bill Collins Date: Fri, 27 Dec 2024 18:30:52 +0000 Subject: [PATCH 18/18] Update goldens --- libraries/hyperapp/meta/expectedResults.json | 10 +++++----- libraries/hyperapp/package.json | 2 +- libraries/hyperhtml/meta/expectedResults.json | 10 +++++----- libraries/hyperhtml/package.json | 2 +- libraries/lit/meta/expectedResults.json | 6 +++--- libraries/lwc/meta/expectedResults.json | 8 ++++---- libraries/mithril/meta/expectedResults.json | 10 +++++----- libraries/mithril/package.json | 2 +- libraries/omi/meta/expectedResults.json | 10 +++++----- libraries/omi/package.json | 2 +- libraries/polymer/meta/expectedResults.json | 8 ++++---- libraries/preact/meta/expectedResults.json | 10 +++++----- libraries/preact/package.json | 2 +- libraries/riot/meta/expectedResults.json | 6 +++--- libraries/skate/meta/expectedResults.json | 8 ++++---- libraries/solid/meta/expectedResults.json | 6 +++--- libraries/stencil/meta/expectedResults.json | 10 +++++----- libraries/stencil/package.json | 2 +- libraries/surplus/meta/expectedResults.json | 10 +++++----- libraries/surplus/package.json | 2 +- scripts/copy-and-verify-results.mjs | 2 +- 21 files changed, 64 insertions(+), 64 deletions(-) diff --git a/libraries/hyperapp/meta/expectedResults.json b/libraries/hyperapp/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/hyperapp/meta/expectedResults.json +++ b/libraries/hyperapp/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/hyperapp/package.json b/libraries/hyperapp/package.json index 42a51f5f1a..53441deb29 100644 --- a/libraries/hyperapp/package.json +++ b/libraries/hyperapp/package.json @@ -35,7 +35,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=hyperapp karma start" + "command": "cross-env LIBRARY_NAME=hyperapp karma start || echo ''" }, "build": { "dependencies": [ diff --git a/libraries/hyperhtml/meta/expectedResults.json b/libraries/hyperhtml/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/hyperhtml/meta/expectedResults.json +++ b/libraries/hyperhtml/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/hyperhtml/package.json b/libraries/hyperhtml/package.json index 6994b23459..2f69d22a01 100644 --- a/libraries/hyperhtml/package.json +++ b/libraries/hyperhtml/package.json @@ -35,7 +35,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=hyperhtml karma start" + "command": "cross-env LIBRARY_NAME=hyperhtml karma start || echo ''" }, "build": { "dependencies": [ diff --git a/libraries/lit/meta/expectedResults.json b/libraries/lit/meta/expectedResults.json index 755586be4b..96a3486551 100644 --- a/libraries/lit/meta/expectedResults.json +++ b/libraries/lit/meta/expectedResults.json @@ -1,5 +1,5 @@ { - "success": 32, + "success": 34, "failed": 0, "skipped": 0, "error": false, @@ -7,9 +7,9 @@ "exitCode": 0, "score": 100, "basicSupport": { - "total": 16, + "total": 18, "failed": 0, - "passed": 16 + "passed": 18 }, "advancedSupport": { "total": 16, diff --git a/libraries/lwc/meta/expectedResults.json b/libraries/lwc/meta/expectedResults.json index 06d0027d40..519648fef2 100644 --- a/libraries/lwc/meta/expectedResults.json +++ b/libraries/lwc/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 24, - "failed": 8, + "failed": 10, "skipped": 0, "error": false, "disconnected": false, "exitCode": 1, - "score": 89, + "score": 82, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/mithril/meta/expectedResults.json b/libraries/mithril/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/mithril/meta/expectedResults.json +++ b/libraries/mithril/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/mithril/package.json b/libraries/mithril/package.json index cd29f3db9d..539f5ffc56 100644 --- a/libraries/mithril/package.json +++ b/libraries/mithril/package.json @@ -34,7 +34,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=mithril karma start" + "command": "cross-env LIBRARY_NAME=mithril karma start || echo ''" }, "build": { "dependencies": [ diff --git a/libraries/omi/meta/expectedResults.json b/libraries/omi/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/omi/meta/expectedResults.json +++ b/libraries/omi/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/omi/package.json b/libraries/omi/package.json index 99e46130c0..81a515d3da 100644 --- a/libraries/omi/package.json +++ b/libraries/omi/package.json @@ -37,7 +37,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=omi karma start" + "command": "cross-env LIBRARY_NAME=omi karma start || echo ''" }, "build": { "dependencies": [ diff --git a/libraries/polymer/meta/expectedResults.json b/libraries/polymer/meta/expectedResults.json index 33d25e192e..c7c62ab0a9 100644 --- a/libraries/polymer/meta/expectedResults.json +++ b/libraries/polymer/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 26, - "failed": 6, + "failed": 8, "skipped": 0, "error": false, "disconnected": false, "exitCode": 1, - "score": 92, + "score": 85, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/preact/meta/expectedResults.json b/libraries/preact/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/preact/meta/expectedResults.json +++ b/libraries/preact/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/preact/package.json b/libraries/preact/package.json index 0214e40ac2..1b6e49e1d5 100644 --- a/libraries/preact/package.json +++ b/libraries/preact/package.json @@ -38,7 +38,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=preact karma start" + "command": "cross-env LIBRARY_NAME=preact karma start || echo ''" }, "build": { "dependencies": [ diff --git a/libraries/riot/meta/expectedResults.json b/libraries/riot/meta/expectedResults.json index 755586be4b..96a3486551 100644 --- a/libraries/riot/meta/expectedResults.json +++ b/libraries/riot/meta/expectedResults.json @@ -1,5 +1,5 @@ { - "success": 32, + "success": 34, "failed": 0, "skipped": 0, "error": false, @@ -7,9 +7,9 @@ "exitCode": 0, "score": 100, "basicSupport": { - "total": 16, + "total": 18, "failed": 0, - "passed": 16 + "passed": 18 }, "advancedSupport": { "total": 16, diff --git a/libraries/skate/meta/expectedResults.json b/libraries/skate/meta/expectedResults.json index 33d25e192e..c7c62ab0a9 100644 --- a/libraries/skate/meta/expectedResults.json +++ b/libraries/skate/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 26, - "failed": 6, + "failed": 8, "skipped": 0, "error": false, "disconnected": false, "exitCode": 1, - "score": 92, + "score": 85, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/solid/meta/expectedResults.json b/libraries/solid/meta/expectedResults.json index 755586be4b..96a3486551 100644 --- a/libraries/solid/meta/expectedResults.json +++ b/libraries/solid/meta/expectedResults.json @@ -1,5 +1,5 @@ { - "success": 32, + "success": 34, "failed": 0, "skipped": 0, "error": false, @@ -7,9 +7,9 @@ "exitCode": 0, "score": 100, "basicSupport": { - "total": 16, + "total": 18, "failed": 0, - "passed": 16 + "passed": 18 }, "advancedSupport": { "total": 16, diff --git a/libraries/stencil/meta/expectedResults.json b/libraries/stencil/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/stencil/meta/expectedResults.json +++ b/libraries/stencil/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/stencil/package.json b/libraries/stencil/package.json index a7eb039cdd..a620bbeddc 100644 --- a/libraries/stencil/package.json +++ b/libraries/stencil/package.json @@ -38,7 +38,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=@stencil/core karma start" + "command": "cross-env LIBRARY_NAME=@stencil/core karma start || echo ''" }, "build": { "dependencies": [ diff --git a/libraries/surplus/meta/expectedResults.json b/libraries/surplus/meta/expectedResults.json index 755586be4b..922b788009 100644 --- a/libraries/surplus/meta/expectedResults.json +++ b/libraries/surplus/meta/expectedResults.json @@ -1,14 +1,14 @@ { "success": 32, - "failed": 0, + "failed": 2, "skipped": 0, "error": false, "disconnected": false, - "exitCode": 0, - "score": 100, + "exitCode": 1, + "score": 92, "basicSupport": { - "total": 16, - "failed": 0, + "total": 18, + "failed": 2, "passed": 16 }, "advancedSupport": { diff --git a/libraries/surplus/package.json b/libraries/surplus/package.json index dbd9a4af6d..c36846caf6 100644 --- a/libraries/surplus/package.json +++ b/libraries/surplus/package.json @@ -37,7 +37,7 @@ "output": [ "results" ], - "command": "cross-env LIBRARY_NAME=surplus karma start" + "command": "cross-env LIBRARY_NAME=surplus karma start || echo ''" }, "build": { "dependencies": [ diff --git a/scripts/copy-and-verify-results.mjs b/scripts/copy-and-verify-results.mjs index d890101ae8..6f29fa7336 100644 --- a/scripts/copy-and-verify-results.mjs +++ b/scripts/copy-and-verify-results.mjs @@ -67,7 +67,7 @@ function compareResultsAgainstGoldens(library) { } // A constant, to make sure that if we add/remove any tests, that we add that test to all // tested libraries. - const numberOfTests = 32; + const numberOfTests = 34; chai.assert.equal(actual.success + actual.failed, numberOfTests, `${library.name} has incorrect total tests`); chai.assert.deepEqual(actual, expected, `${library.name} has incorrect deep results equal`); }