@astrojs/preact
Advanced tools
Comparing version 0.3.0 to 0.3.1
# @astrojs/preact | ||
## 0.3.1 | ||
### Patch Changes | ||
- [#3769](https://github.com/withastro/astro/pull/3769) [`b934ab5d`](https://github.com/withastro/astro/commit/b934ab5d860aa3adeec56a9c395f629ee7252ca4) Thanks [@hippotastic](https://github.com/hippotastic)! - Fix "Invalid hook call" warning | ||
## 0.3.0 | ||
@@ -4,0 +10,0 @@ |
{ | ||
"name": "@astrojs/preact", | ||
"description": "Use Preact components within Astro", | ||
"version": "0.3.0", | ||
"version": "0.3.1", | ||
"type": "module", | ||
@@ -6,0 +6,0 @@ "types": "./dist/index.d.ts", |
@@ -7,2 +7,5 @@ import { h, Component as BaseComponent } from 'preact'; | ||
let originalConsoleError; | ||
let consoleFilterRefs = 0; | ||
function check(Component, props, children) { | ||
@@ -15,14 +18,20 @@ if (typeof Component !== 'function') return false; | ||
useConsoleFilter(); | ||
try { | ||
const { html } = renderToStaticMarkup(Component, props, children); | ||
if (typeof html !== 'string') { | ||
try { | ||
const { html } = renderToStaticMarkup(Component, props, children); | ||
if (typeof html !== 'string') { | ||
return false; | ||
} | ||
// There are edge cases (SolidJS) where Preact *might* render a string, | ||
// but components would be <undefined></undefined> | ||
return !/\<undefined\>/.test(html); | ||
} catch (err) { | ||
return false; | ||
} | ||
// There are edge cases (SolidJS) where Preact *might* render a string, | ||
// but components would be <undefined></undefined> | ||
return !/\<undefined\>/.test(html); | ||
} catch (err) { | ||
return false; | ||
} finally { | ||
finishUsingConsoleFilter(); | ||
} | ||
@@ -45,2 +54,57 @@ } | ||
/** | ||
* Reduces console noise by filtering known non-problematic errors. | ||
* | ||
* Performs reference counting to allow parallel usage from async code. | ||
* | ||
* To stop filtering, please ensure that there always is a matching call | ||
* to `finishUsingConsoleFilter` afterwards. | ||
*/ | ||
function useConsoleFilter() { | ||
consoleFilterRefs++; | ||
if (!originalConsoleError) { | ||
// eslint-disable-next-line no-console | ||
originalConsoleError = console.error; | ||
try { | ||
// eslint-disable-next-line no-console | ||
console.error = filteredConsoleError; | ||
} catch (error) { | ||
// If we're unable to hook `console.error`, just accept it | ||
} | ||
} | ||
} | ||
/** | ||
* Indicates that the filter installed by `useConsoleFilter` | ||
* is no longer needed by the calling code. | ||
*/ | ||
function finishUsingConsoleFilter() { | ||
consoleFilterRefs--; | ||
// Note: Instead of reverting `console.error` back to the original | ||
// when the reference counter reaches 0, we leave our hook installed | ||
// to prevent potential race conditions once `check` is made async | ||
} | ||
/** | ||
* Hook/wrapper function for the global `console.error` function. | ||
* | ||
* Ignores known non-problematic errors while any code is using the console filter. | ||
* Otherwise, simply forwards all arguments to the original function. | ||
*/ | ||
function filteredConsoleError(msg, ...rest) { | ||
if (consoleFilterRefs > 0 && typeof msg === 'string') { | ||
// In `check`, we attempt to render JSX components through Preact. | ||
// When attempting this on a React component, React may output | ||
// the following error, which we can safely filter out: | ||
const isKnownReactHookError = | ||
msg.includes('Warning: Invalid hook call.') && | ||
msg.includes('https://reactjs.org/link/invalid-hook-call'); | ||
if (isKnownReactHookError) return; | ||
} | ||
originalConsoleError(msg, ...rest); | ||
} | ||
export default { | ||
@@ -47,0 +111,0 @@ check, |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
24579
330