diff --git a/.changeset/green-bulldogs-shout.md b/.changeset/green-bulldogs-shout.md new file mode 100644 index 000000000000..c58892b6c1a2 --- /dev/null +++ b/.changeset/green-bulldogs-shout.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes `astro add` not using the proper export point when adding certain adapters diff --git a/.changeset/long-lemons-add.md b/.changeset/long-lemons-add.md new file mode 100644 index 000000000000..2ad0ecd20c9d --- /dev/null +++ b/.changeset/long-lemons-add.md @@ -0,0 +1,5 @@ +--- +'@astrojs/preact': patch +--- + +Preact components no longer throw an error if a property is null. diff --git a/packages/astro/src/cli/add/index.ts b/packages/astro/src/cli/add/index.ts index f263904cbb4d..7866f5a093ab 100644 --- a/packages/astro/src/cli/add/index.ts +++ b/packages/astro/src/cli/add/index.ts @@ -279,7 +279,7 @@ export async function add(names: string[], { flags }: AddOptions) { if (isAdapter(integration)) { const officialExportName = OFFICIAL_ADAPTER_TO_IMPORT_MAP[integration.id]; if (officialExportName) { - setAdapter(mod, integration); + setAdapter(mod, integration, officialExportName); } else { logger.info( 'SKIP_FORMAT', @@ -447,7 +447,11 @@ function addIntegration(mod: ProxifiedModule, integration: IntegrationInfo) } } -export function setAdapter(mod: ProxifiedModule, adapter: IntegrationInfo) { +export function setAdapter( + mod: ProxifiedModule, + adapter: IntegrationInfo, + exportName: string, +) { const config = getDefaultExportOptions(mod); const adapterId = toIdent(adapter.id); @@ -455,7 +459,7 @@ export function setAdapter(mod: ProxifiedModule, adapter: IntegrationInfo) mod.imports.$append({ imported: 'default', local: adapterId, - from: adapter.packageName, + from: exportName, }); } diff --git a/packages/astro/test/fixtures/preact-component/src/components/ComponentWithNullProp.jsx b/packages/astro/test/fixtures/preact-component/src/components/ComponentWithNullProp.jsx new file mode 100644 index 000000000000..53856ce90275 --- /dev/null +++ b/packages/astro/test/fixtures/preact-component/src/components/ComponentWithNullProp.jsx @@ -0,0 +1,7 @@ +import { h } from 'preact'; + +export default ({ nullProp }) => { + return
+

I have a null prop: {nullProp}

+
+} \ No newline at end of file diff --git a/packages/astro/test/fixtures/preact-component/src/pages/signals.astro b/packages/astro/test/fixtures/preact-component/src/pages/signals.astro index 37b43a73c7ec..8abfe8f025db 100644 --- a/packages/astro/test/fixtures/preact-component/src/pages/signals.astro +++ b/packages/astro/test/fixtures/preact-component/src/pages/signals.astro @@ -3,6 +3,7 @@ import { signal } from '@preact/signals'; import Signals from '../components/Signals'; import SignalsInArray from '../components/SignalsInArray'; import SignalsInObject from '../components/SignalsInObject'; +import ComponentWithNullProp from '../components/ComponentWithNullProp'; const count = signal(1); const secondCount = signal(2); --- @@ -14,6 +15,7 @@ const secondCount = signal(2); - + + diff --git a/packages/astro/test/preact-component.test.js b/packages/astro/test/preact-component.test.js index f5b5c7233b1c..221245b1c334 100644 --- a/packages/astro/test/preact-component.test.js +++ b/packages/astro/test/preact-component.test.js @@ -140,4 +140,11 @@ describe('Preact component', () => { assert.equal(element.find('h1').text(), 'I am a title'); assert.equal(element.find('p').text(), '1'); }); + + it('Can use null props', async () => { + const html = await fixture.readFile('/signals/index.html'); + const $ = cheerio.load(html); + + assert.equal($('#preact-component-with-null-prop').length, 1); + }); }); diff --git a/packages/integrations/preact/src/signals.ts b/packages/integrations/preact/src/signals.ts index 7b797f3858f3..88a50327a47f 100644 --- a/packages/integrations/preact/src/signals.ts +++ b/packages/integrations/preact/src/signals.ts @@ -38,7 +38,9 @@ export function serializeSignals( const signals: Signals = {}; for (const [key, value] of Object.entries(props)) { const isPropArray = Array.isArray(value); - const isPropObject = !isSignal(value) && typeof props[key] === 'object' && !isPropArray; + // `typeof null` is 'object' in JS, so we need to check for `null` specifically + const isPropObject = + !isSignal(value) && typeof props[key] === 'object' && props[key] !== null && !isPropArray; if (isPropObject || isPropArray) { const values = isPropObject ? Object.keys(props[key]) : value;