---
.changeset/three-owls-drop.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.changeset/three-owls-drop.md b/.changeset/three-owls-drop.md
index 41b81c41bbe4..f6a5f90e9b5a 100644
--- a/.changeset/three-owls-drop.md
+++ b/.changeset/three-owls-drop.md
@@ -2,9 +2,9 @@
"astro": minor
---
-Extends the `client:visible` directive by adding an optional `rootMargin` property. This allows a component to be hydrated when it is close to the viewport instead of waiting for it to become visible.
+Adds the ability to set a [`rootMargin`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/rootMargin) setting when using the `client:visible` directive. This allows a component to be hydrated when it is _near_ the viewport, rather than hydrated when it has _entered_ the viewport.
```astro
-
+
```
From f244bbab1a0dff49710f50c7aef62872d0067146 Mon Sep 17 00:00:00 2001
From: Princesseuh <3019731+Princesseuh@users.noreply.github.com>
Date: Wed, 3 Jan 2024 15:36:47 -0500
Subject: [PATCH 4/6] test: add a test
---
.../astro/e2e/custom-client-directives.test.js | 11 ++++++++++-
.../custom-client-directives/astro.config.mjs | 18 ++++++++++++++++--
.../custom-client-directives/client-options.js | 6 ++++++
.../src/client-directives-types.d.ts | 5 +++--
.../src/pages/index.astro | 3 ++-
5 files changed, 37 insertions(+), 6 deletions(-)
create mode 100644 packages/astro/e2e/fixtures/custom-client-directives/client-options.js
diff --git a/packages/astro/e2e/custom-client-directives.test.js b/packages/astro/e2e/custom-client-directives.test.js
index fec5ef9a1104..443df43075c1 100644
--- a/packages/astro/e2e/custom-client-directives.test.js
+++ b/packages/astro/e2e/custom-client-directives.test.js
@@ -1,6 +1,6 @@
import { expect } from '@playwright/test';
-import { testFactory, waitForHydrate } from './test-utils.js';
import testAdapter from '../test/test-adapter.js';
+import { testFactory, waitForHydrate } from './test-utils.js';
const test = testFactory({
root: './fixtures/custom-client-directives/',
@@ -89,4 +89,13 @@ function testClientDirectivesShared() {
// Hydrated, this should be 1
await expect(counterValue).toHaveText('1');
});
+
+ test('Client directives should be passed options correctly', async ({ astro, page }) => {
+ await page.goto(astro.resolveUrl('/'));
+
+ const clientOptions = page.locator('#options');
+ await expect(clientOptions).toHaveText(
+ 'Passed options are: {"message":"Hello! I was passed as an option"}'
+ );
+ });
}
diff --git a/packages/astro/e2e/fixtures/custom-client-directives/astro.config.mjs b/packages/astro/e2e/fixtures/custom-client-directives/astro.config.mjs
index 3790d21b79bc..ae551477124c 100644
--- a/packages/astro/e2e/fixtures/custom-client-directives/astro.config.mjs
+++ b/packages/astro/e2e/fixtures/custom-client-directives/astro.config.mjs
@@ -1,9 +1,9 @@
-import { defineConfig } from 'astro/config';
import react from "@astrojs/react";
+import { defineConfig } from 'astro/config';
import { fileURLToPath } from 'node:url';
export default defineConfig({
- integrations: [astroClientClickDirective(), astroClientPasswordDirective(), react()],
+ integrations: [astroClientClickDirective(), astroClientPasswordDirective(), astroHasOptionsDirective(), react()],
});
function astroClientClickDirective() {
@@ -33,3 +33,17 @@ function astroClientPasswordDirective() {
}
};
}
+
+function astroHasOptionsDirective() {
+ return {
+ name: 'astro-options',
+ hooks: {
+ 'astro:config:setup': (opts) => {
+ opts.addClientDirective({
+ name: 'options',
+ entrypoint: fileURLToPath(new URL('./client-options.js', import.meta.url))
+ });
+ }
+ }
+ };
+}
diff --git a/packages/astro/e2e/fixtures/custom-client-directives/client-options.js b/packages/astro/e2e/fixtures/custom-client-directives/client-options.js
new file mode 100644
index 000000000000..5d21f108cf6e
--- /dev/null
+++ b/packages/astro/e2e/fixtures/custom-client-directives/client-options.js
@@ -0,0 +1,6 @@
+// Hydrate on first click on the window
+export default async (load, options) => {
+ const hydrate = await load()
+ document.write(`Passed options are: ${JSON.stringify(options.value)}
`)
+ await hydrate()
+}
diff --git a/packages/astro/e2e/fixtures/custom-client-directives/src/client-directives-types.d.ts b/packages/astro/e2e/fixtures/custom-client-directives/src/client-directives-types.d.ts
index 07399f7bb09c..6fb3c614d4e0 100644
--- a/packages/astro/e2e/fixtures/custom-client-directives/src/client-directives-types.d.ts
+++ b/packages/astro/e2e/fixtures/custom-client-directives/src/client-directives-types.d.ts
@@ -1,9 +1,10 @@
declare module 'astro' {
interface AstroClientDirectives {
'client:click'?: boolean
- 'client:password'?: string
+ 'client:password'?: string
+ 'client:options'?: { message: string }
}
}
// Make d.ts a module to similate common packaging setups where the entry `index.d.ts` would augment the types
-export {}
+export { }
diff --git a/packages/astro/e2e/fixtures/custom-client-directives/src/pages/index.astro b/packages/astro/e2e/fixtures/custom-client-directives/src/pages/index.astro
index 05c28b109e1c..b03042d44624 100644
--- a/packages/astro/e2e/fixtures/custom-client-directives/src/pages/index.astro
+++ b/packages/astro/e2e/fixtures/custom-client-directives/src/pages/index.astro
@@ -6,5 +6,6 @@ import Counter from '../components/Counter.jsx';
client:click
client:password
+ client:options
-