Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
62a9b19
Vitest switch
JoviDeCroock Feb 17, 2025
0db9822
Make render work
JoviDeCroock Feb 19, 2025
bcd6310
Phewie
JoviDeCroock Feb 19, 2025
edf8b79
fix: dedupe preact (#4702)
sheremet-va Feb 21, 2025
ee7fbe2
Getting close
JoviDeCroock Feb 21, 2025
d90a8a3
All crashes are gone
JoviDeCroock Feb 21, 2025
f40709c
One more done
JoviDeCroock Feb 21, 2025
3a8db21
Add babel transform
JoviDeCroock Feb 22, 2025
09f447b
Add coverage
JoviDeCroock Feb 22, 2025
06a9f08
Another try
JoviDeCroock Feb 22, 2025
c1e772b
Use vite plugin instead
JoviDeCroock Feb 22, 2025
57bb577
Make all tests pass
JoviDeCroock Feb 22, 2025
49fe0b8
Coverage stuff
JoviDeCroock Feb 22, 2025
4671166
No isolation
JoviDeCroock Feb 22, 2025
63e917e
Add minify option
JoviDeCroock Feb 22, 2025
f302778
Format
JoviDeCroock Feb 22, 2025
2b332eb
Fix tests
JoviDeCroock Feb 22, 2025
9784f4b
Remove minify again
JoviDeCroock Feb 22, 2025
fa8d8b9
use env var
JoviDeCroock Feb 22, 2025
6780dc4
Reenable useId tests
JoviDeCroock Feb 22, 2025
15b9b87
Remove some deps
JoviDeCroock Feb 22, 2025
96dfa70
Lock terser
JoviDeCroock Feb 22, 2025
d0cafb5
Okay vite, lets try 5.16 then jeez
JoviDeCroock Feb 22, 2025
fdfaeaf
Add coverage dir
JoviDeCroock Feb 22, 2025
b324105
Fix some types
JoviDeCroock Feb 22, 2025
e100419
Backport commands
JoviDeCroock Feb 22, 2025
73c1dc8
Make minify work, partially failing 2 tests still
JoviDeCroock Feb 22, 2025
8ee6182
Add lcov
JoviDeCroock Feb 22, 2025
823e8af
change to only
JoviDeCroock Feb 22, 2025
9dbd5df
Maybe
JoviDeCroock Feb 22, 2025
ea8bd34
Maybe this?
JoviDeCroock Feb 22, 2025
32a3e9b
Fix some broken test
JoviDeCroock Feb 22, 2025
0c27fa6
Make coverage work
JoviDeCroock Feb 23, 2025
7e2b362
Fix vitest:min
JoviDeCroock Feb 23, 2025
2000037
Add devtools coverage back
JoviDeCroock Feb 23, 2025
556d8a0
Tweak config for consistency
JoviDeCroock Feb 23, 2025
e152bf0
test: Copy karma's filter over
rschristian Feb 23, 2025
1c1ab32
Try a cache
JoviDeCroock Feb 23, 2025
3ed298b
Fix test regex
JoviDeCroock Feb 23, 2025
fb71e9f
Try a run with isolate false
JoviDeCroock Feb 23, 2025
b38f5f2
Bump node and use playwright
JoviDeCroock Feb 24, 2025
473c65b
Restore CI
JoviDeCroock Feb 24, 2025
70e6f1f
Update .github/workflows/build-test.yml
JoviDeCroock Feb 24, 2025
ced6160
Switch to webdirver
JoviDeCroock Feb 24, 2025
7eba152
Package json
JoviDeCroock Feb 24, 2025
7651074
Bump vitest
JoviDeCroock Feb 24, 2025
8d64419
Add pending
JoviDeCroock Feb 24, 2025
f8ddf37
Skip more files
JoviDeCroock Feb 24, 2025
87eed69
Expand
JoviDeCroock Feb 25, 2025
e6a4080
Bump some stuff
JoviDeCroock Mar 7, 2025
e7cfb64
bump vitest
JoviDeCroock Apr 25, 2025
a2dcfc6
Enable lint
JoviDeCroock Apr 25, 2025
94db9b4
Try some stuff
JoviDeCroock Apr 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,7 @@ jobs:
COVERAGE: true
FLAKEY: false
# Not using `npm test` since it rebuilds source which npm ci has already done
run: |
npm run lint
npm run test:unit
run: npm run lint && npm run test:unit
- name: Coveralls GitHub Action
uses: coverallsapp/github-action@v2.3.0
timeout-minutes: 2
Expand Down
4 changes: 2 additions & 2 deletions compat/test/browser/suspense-hydration.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ describe('suspense hydration', () => {
let resetRemoveChild;
let resetRemove;

before(() => {
beforeAll(() => {
resetAppendChild = logCall(Element.prototype, 'appendChild');
resetInsertBefore = logCall(Element.prototype, 'insertBefore');
resetRemoveChild = logCall(Element.prototype, 'removeChild');
resetRemove = logCall(Element.prototype, 'remove');
});

after(() => {
afterAll(() => {
resetAppendChild();
resetInsertBefore();
resetRemoveChild();
Expand Down
2 changes: 1 addition & 1 deletion compat/test/browser/textarea.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { render, hydrate, useState } from 'preact/compat';
import ReactDOMServer from 'preact/compat/server.browser.js';
import ReactDOMServer from 'preact/compat/server';
import { setupScratch, teardown } from '../../../test/_util/helpers';
import { act } from 'preact/test-utils';

Expand Down
10 changes: 6 additions & 4 deletions debug/test/browser/component-stack.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { createElement, render, Component } from 'preact';
import 'preact/debug';
import { vi } from 'vitest';
import { setupScratch, teardown } from '../../../test/_util/helpers';

/** @jsx createElement */
Expand All @@ -18,13 +19,12 @@ describe('component stack', () => {

errors = [];
warnings = [];
sinon.stub(console, 'error').callsFake(e => errors.push(e));
sinon.stub(console, 'warn').callsFake(w => warnings.push(w));
vi.spyOn(console, 'error').mockImplementation(e => errors.push(e));
vi.spyOn(console, 'warn').mockImplementation(w => warnings.push(w));
});

afterEach(() => {
console.error.restore();
console.warn.restore();
vi.resetAllMocks();
teardown(scratch);
});

Expand All @@ -46,6 +46,8 @@ describe('component stack', () => {

render(<Foo />, scratch);

// This has a JSX transform warning, so we need to remove it
warnings.shift();
let lines = getStack(warnings).split('\n');
expect(lines[0].indexOf('Thrower') > -1).to.equal(true);
expect(lines[1].indexOf('Foo') > -1).to.equal(true);
Expand Down
94 changes: 1 addition & 93 deletions debug/test/browser/debug.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,10 @@ import {
hydrate
} from 'preact';
import { useState } from 'preact/hooks';
import {
setupScratch,
teardown,
serializeHtml
} from '../../../test/_util/helpers';
import { setupScratch, teardown } from '../../../test/_util/helpers';
import './fakeDevTools';
import 'preact/debug';
import { setupRerender } from 'preact/test-utils';
import * as PropTypes from 'prop-types';

// eslint-disable-next-line no-duplicate-imports
import { resetPropWarnings } from 'preact/debug';

const h = createElement;
/** @jsx createElement */
Expand Down Expand Up @@ -794,90 +786,6 @@ describe('debug', () => {
});
});

describe('PropTypes', () => {
beforeEach(() => {
resetPropWarnings();
});

it("should fail if props don't match prop-types", () => {
function Foo(props) {
return <h1>{props.text}</h1>;
}

Foo.propTypes = {
text: PropTypes.string.isRequired
};

render(<Foo text={123} />, scratch);

expect(console.error).to.be.calledOnce;

// The message here may change when the "prop-types" library is updated,
// but we check it exactly to make sure all parameters were supplied
// correctly.
expect(console.error).to.have.been.calledOnceWith(
sinon.match(
/^Failed prop type: Invalid prop `text` of type `number` supplied to `Foo`, expected `string`\.\n {2}in Foo \(at (.*)[/\\]debug[/\\]test[/\\]browser[/\\]debug\.test\.js:[0-9]+\)$/m
)
);
});

it('should only log a given prop type error once', () => {
function Foo(props) {
return <h1>{props.text}</h1>;
}

Foo.propTypes = {
text: PropTypes.string.isRequired,
count: PropTypes.number
};

// Trigger the same error twice. The error should only be logged
// once.
render(<Foo text={123} />, scratch);
render(<Foo text={123} />, scratch);

expect(console.error).to.be.calledOnce;

// Trigger a different error. This should result in a new log
// message.
console.error.resetHistory();
render(<Foo text="ok" count="123" />, scratch);
expect(console.error).to.be.calledOnce;
});

it('should render with error logged when validator gets signal and throws exception', () => {
function Baz(props) {
return <h1>{props.unhappy}</h1>;
}

Baz.propTypes = {
unhappy: function alwaysThrows(obj, key) {
if (obj[key] === 'signal') throw Error('got prop');
}
};

render(<Baz unhappy={'signal'} />, scratch);

expect(console.error).to.be.calledOnce;
expect(errors[0].includes('got prop')).to.equal(true);
expect(serializeHtml(scratch)).to.equal('<h1>signal</h1>');
});

it('should not print to console when types are correct', () => {
function Bar(props) {
return <h1>{props.text}</h1>;
}

Bar.propTypes = {
text: PropTypes.string.isRequired
};

render(<Bar text="foo" />, scratch);
expect(console.error).to.not.be.called;
});
});

describe('Hydration mismatches', () => {
it('Should warn us for a node mismatch', () => {
scratch.innerHTML = '<div><span>foo</span>/div>';
Expand Down
127 changes: 127 additions & 0 deletions debug/test/browser/prop-types.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import { createElement, render } from 'preact';
import {
setupScratch,
teardown,
serializeHtml
} from '../../../test/_util/helpers';
import './fakeDevTools';
import { resetPropWarnings } from 'preact/debug';
import * as PropTypes from 'prop-types';
import { jsxDEV as jsxDev } from 'preact/jsx-runtime';

describe('PropTypes', () => {
/** @type {HTMLDivElement} */
let scratch;
let errors = [];
let warnings = [];

beforeEach(() => {
errors = [];
warnings = [];
scratch = setupScratch();
sinon.stub(console, 'error').callsFake(e => errors.push(e));
sinon.stub(console, 'warn').callsFake(w => warnings.push(w));
});

afterEach(() => {
/** @type {*} */
console.error.restore();
console.warn.restore();
teardown(scratch);
});

beforeEach(() => {
resetPropWarnings();
});

it("should fail if props don't match prop-types", () => {
function Foo(props) {
return jsxDev('h1', { children: props.text });
}

Foo.propTypes = {
text: PropTypes.string.isRequired
};

render(
jsxDev(
Foo,
{ text: 123 },
null,
// @ts-ignore
false,
// @ts-ignore
{ fileName: './debug/test/browser/debug.test.js', lineNumber: 41 },
// @ts-ignore
'self'
),
scratch
);

expect(console.error).to.be.calledOnce;

// The message here may change when the "prop-types" library is updated,
// but we check it exactly to make sure all parameters were supplied
// correctly.
expect(console.error).to.have.been.calledOnceWith(
sinon.match(
/^Failed prop type: Invalid prop `text` of type `number` supplied to `Foo`, expected `string`\.\n {2}in Foo \(at (.*)[/\\]debug[/\\]test[/\\]browser[/\\]debug\.test\.js:[0-9]+\)$/m
)
);
});

it('should only log a given prop type error once', () => {
function Foo(props) {
return jsxDev('h1', { children: props.text });
}

Foo.propTypes = {
text: PropTypes.string.isRequired,
count: PropTypes.number
};

// Trigger the same error twice. The error should only be logged
// once.
render(jsxDev(Foo, { text: 123 }), scratch);
render(jsxDev(Foo, { text: 123 }), scratch);

expect(console.error).to.be.calledOnce;

// Trigger a different error. This should result in a new log
// message.
console.error.resetHistory();
render(jsxDev(Foo, { text: 'ok', count: '123' }), scratch);
expect(console.error).to.be.calledOnce;
});

it('should render with error logged when validator gets signal and throws exception', () => {
function Baz(props) {
return jsxDev('h1', { children: props.unhappy });
}

Baz.propTypes = {
unhappy: function alwaysThrows(obj, key) {
if (obj[key] === 'signal') throw Error('got prop');
}
};

render(jsxDev(Baz, { unhappy: 'signal' }), scratch);

expect(console.error).to.be.calledOnce;
expect(errors[0].includes('got prop')).to.equal(true);
expect(serializeHtml(scratch)).to.equal('<h1>signal</h1>');
});

it('should not print to console when types are correct', () => {
function Bar(props) {
return jsxDev('h1', { children: props.text });
}

Bar.propTypes = {
text: PropTypes.string.isRequired
};

render(jsxDev(Bar, { text: 'foo' }), scratch);
expect(console.error).to.not.be.called;
});
});
Loading
Loading