@lunora/astro 1.0.0-alpha.4 → 1.0.0-alpha.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +6 -0
- package/README.md +18 -0
- package/dist/index.d.mts +54 -54
- package/dist/index.d.ts +54 -54
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/{lunora-DCkPGEVa.mjs → lunora-BPXRQkP4.mjs} +2 -2
- package/package.json +4 -4
package/LICENSE.md
CHANGED
|
@@ -103,3 +103,9 @@ Unless required by applicable law or agreed to in writing, software distributed
|
|
|
103
103
|
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
104
104
|
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
|
105
105
|
specific language governing permissions and limitations under the License.
|
|
106
|
+
|
|
107
|
+
<!-- DEPENDENCIES -->
|
|
108
|
+
<!-- /DEPENDENCIES -->
|
|
109
|
+
|
|
110
|
+
<!-- TYPE_DEPENDENCIES -->
|
|
111
|
+
<!-- /TYPE_DEPENDENCIES -->
|
package/README.md
CHANGED
|
@@ -98,6 +98,24 @@ const preloaded = await preloadQuery(client, api.messages.list, {});
|
|
|
98
98
|
<my-island data-preloaded={serializePreloaded(preloaded)}></my-island>
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
+
### Feature flags
|
|
102
|
+
|
|
103
|
+
`@lunora/astro` ships no flag hook — like every other surface, flags follow the same server/island split. Read `ctx.flags` server-side (a server endpoint, a function, or the same `.astro` frontmatter) and hand the resolved value to the island, or call `useFlag` inside the island itself via the adapter you hydrate with (`@lunora/react`, `@lunora/vue`, …). Requires [`@lunora/flags`](https://www.npmjs.com/package/@lunora/flags) wired in `lunora/flags.ts`.
|
|
104
|
+
|
|
105
|
+
```astro
|
|
106
|
+
---
|
|
107
|
+
// src/pages/index.astro — resolve the flag once, server-side
|
|
108
|
+
import { createServerClient, preloadQuery, preloadedQueryResult } from "@lunora/astro/server";
|
|
109
|
+
import { api } from "../lunora/_generated/api";
|
|
110
|
+
|
|
111
|
+
const client = createServerClient({ url: Astro.url.origin + "/_lunora/rpc" });
|
|
112
|
+
const preloaded = await preloadQuery(client, api.homepage.heroFlag, {}); // a query that returns ctx.flags.boolean(...)
|
|
113
|
+
const newHero = preloadedQueryResult(preloaded);
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
{newHero ? <NewHero client:load /> : <ClassicHero client:load />}
|
|
117
|
+
```
|
|
118
|
+
|
|
101
119
|
> This README covers the basics. For the full API, options, and guides, see the **[documentation](https://lunora.sh/docs/frameworks/bring-your-framework)**.
|
|
102
120
|
|
|
103
121
|
## Related
|
package/dist/index.d.mts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
export { type FrameworkHostHandler as AstroWorkerHandler, type LunoraWorker as ComposedWorker, type FrameworkWorkerOptions as LunoraOptions, withFrameworkWorker as withLunora } from '@lunora/runtime';
|
|
2
2
|
/**
|
|
3
|
-
* The Lunora Astro **integration** — an `AstroIntegration` object
|
|
4
|
-
* (`{ name, hooks }`) added to `astro.config.*`'s `integrations` array.
|
|
5
|
-
*
|
|
6
|
-
* Astro is multi-framework at the UI layer, so this integration is **not** a new
|
|
7
|
-
* reactive runtime. Its job is the *composition* seam (PLAN4 class-B): make the
|
|
8
|
-
* Worker `@astrojs/cloudflare` emits mount Lunora realtime under `/_lunora/*`
|
|
9
|
-
* via `withLunora`, and surface the framework-neutral server helpers
|
|
10
|
-
* (`@lunora/astro/server`) to Astro server endpoints / `.astro` frontmatter.
|
|
11
|
-
*
|
|
12
|
-
* Reactivity itself comes from whichever island adapter the app hydrates with —
|
|
13
|
-
* `@lunora/react`, `@lunora/solid`, `@lunora/svelte`, or `@lunora/vue` — each of
|
|
14
|
-
* which ships its own `hydratePreloaded(preloaded)` for the SSR-seed → live
|
|
15
|
-
* handoff. This package owns the server/composition half only.
|
|
16
|
-
*/
|
|
3
|
+
* The Lunora Astro **integration** — an `AstroIntegration` object
|
|
4
|
+
* (`{ name, hooks }`) added to `astro.config.*`'s `integrations` array.
|
|
5
|
+
*
|
|
6
|
+
* Astro is multi-framework at the UI layer, so this integration is **not** a new
|
|
7
|
+
* reactive runtime. Its job is the *composition* seam (PLAN4 class-B): make the
|
|
8
|
+
* Worker `@astrojs/cloudflare` emits mount Lunora realtime under `/_lunora/*`
|
|
9
|
+
* via `withLunora`, and surface the framework-neutral server helpers
|
|
10
|
+
* (`@lunora/astro/server`) to Astro server endpoints / `.astro` frontmatter.
|
|
11
|
+
*
|
|
12
|
+
* Reactivity itself comes from whichever island adapter the app hydrates with —
|
|
13
|
+
* `@lunora/react`, `@lunora/solid`, `@lunora/svelte`, or `@lunora/vue` — each of
|
|
14
|
+
* which ships its own `hydratePreloaded(preloaded)` for the SSR-seed → live
|
|
15
|
+
* handoff. This package owns the server/composition half only.
|
|
16
|
+
*/
|
|
17
17
|
/**
|
|
18
|
-
* Structural subset of Astro's `AstroIntegration`. Declared locally (rather than
|
|
19
|
-
* importing `astro`'s type) so `@lunora/astro`'s public surface stays decoupled
|
|
20
|
-
* from a specific Astro major and type-checks even when `astro` is not installed
|
|
21
|
-
* — `astro` is an *optional* peer here (only the host Astro app pulls it in).
|
|
22
|
-
* The shape is assignable to/from Astro's real `AstroIntegration`, so adding the
|
|
23
|
-
* returned object to `integrations` type-checks in a real Astro project.
|
|
24
|
-
*/
|
|
18
|
+
* Structural subset of Astro's `AstroIntegration`. Declared locally (rather than
|
|
19
|
+
* importing `astro`'s type) so `@lunora/astro`'s public surface stays decoupled
|
|
20
|
+
* from a specific Astro major and type-checks even when `astro` is not installed
|
|
21
|
+
* — `astro` is an *optional* peer here (only the host Astro app pulls it in).
|
|
22
|
+
* The shape is assignable to/from Astro's real `AstroIntegration`, so adding the
|
|
23
|
+
* returned object to `integrations` type-checks in a real Astro project.
|
|
24
|
+
*/
|
|
25
25
|
interface AstroIntegrationLike {
|
|
26
26
|
readonly hooks: {
|
|
27
27
|
readonly [hook: string]: ((...arguments_: never[]) => unknown) | undefined;
|
|
@@ -31,41 +31,41 @@ interface AstroIntegrationLike {
|
|
|
31
31
|
/** Options for the `lunora` integration. */
|
|
32
32
|
interface LunoraIntegrationOptions {
|
|
33
33
|
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
* Path (or specifier) of the module that calls `withLunora` and is the
|
|
35
|
+
* composed worker's `export default`. Documented for the wiring story; when
|
|
36
|
+
* omitted the integration assumes the conventional `src/worker.ts`.
|
|
37
|
+
*/
|
|
38
38
|
readonly serverEntry?: string;
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
|
-
* The Lunora Astro integration. Add it to `astro.config.*`:
|
|
42
|
-
*
|
|
43
|
-
* ```ts
|
|
44
|
-
* import cloudflare from "@astrojs/cloudflare";
|
|
45
|
-
* import { defineConfig } from "astro/config";
|
|
46
|
-
* import { lunora } from "@lunora/astro";
|
|
47
|
-
*
|
|
48
|
-
* export default defineConfig({
|
|
49
|
-
* output: "server",
|
|
50
|
-
* adapter: cloudflare(),
|
|
51
|
-
* integrations: [lunora()],
|
|
52
|
-
* });
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* What it does:
|
|
56
|
-
*
|
|
57
|
-
* - Marks the build so the `@astrojs/cloudflare` server entry is wrapped with
|
|
58
|
-
* `withLunora` — the composed worker reserves `/_lunora/*` for Lunora realtime
|
|
59
|
-
* and forwards everything else to Astro's SSR handler (one worker, one deploy).
|
|
60
|
-
* - Documents the `serverEntry` (default `src/worker.ts`) where the
|
|
61
|
-
* `withLunora(astroWorker, { shardDO: env.SHARD, … })` composition lives.
|
|
62
|
-
*
|
|
63
|
-
* The hook is intentionally minimal here: the load-bearing composition is the
|
|
64
|
-
* `withLunora` wrapper at the server-entry boundary (see `withLunora` for the
|
|
65
|
-
* `@astrojs/cloudflare` injection point). The integration object exists so the
|
|
66
|
-
* wiring is declared in `astro.config` the idiomatic Astro way, and so future
|
|
67
|
-
* build-time hooks (binding reconcile, dev middleware) have a home without
|
|
68
|
-
* changing the public surface.
|
|
69
|
-
*/
|
|
41
|
+
* The Lunora Astro integration. Add it to `astro.config.*`:
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* import cloudflare from "@astrojs/cloudflare";
|
|
45
|
+
* import { defineConfig } from "astro/config";
|
|
46
|
+
* import { lunora } from "@lunora/astro";
|
|
47
|
+
*
|
|
48
|
+
* export default defineConfig({
|
|
49
|
+
* output: "server",
|
|
50
|
+
* adapter: cloudflare(),
|
|
51
|
+
* integrations: [lunora()],
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* What it does:
|
|
56
|
+
*
|
|
57
|
+
* - Marks the build so the `@astrojs/cloudflare` server entry is wrapped with
|
|
58
|
+
* `withLunora` — the composed worker reserves `/_lunora/*` for Lunora realtime
|
|
59
|
+
* and forwards everything else to Astro's SSR handler (one worker, one deploy).
|
|
60
|
+
* - Documents the `serverEntry` (default `src/worker.ts`) where the
|
|
61
|
+
* `withLunora(astroWorker, { shardDO: env.SHARD, … })` composition lives.
|
|
62
|
+
*
|
|
63
|
+
* The hook is intentionally minimal here: the load-bearing composition is the
|
|
64
|
+
* `withLunora` wrapper at the server-entry boundary (see `withLunora` for the
|
|
65
|
+
* `@astrojs/cloudflare` injection point). The integration object exists so the
|
|
66
|
+
* wiring is declared in `astro.config` the idiomatic Astro way, and so future
|
|
67
|
+
* build-time hooks (binding reconcile, dev middleware) have a home without
|
|
68
|
+
* changing the public surface.
|
|
69
|
+
*/
|
|
70
70
|
declare const lunora: (options?: LunoraIntegrationOptions) => AstroIntegrationLike;
|
|
71
71
|
export { type AstroIntegrationLike, type LunoraIntegrationOptions, lunora };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
export { type FrameworkHostHandler as AstroWorkerHandler, type LunoraWorker as ComposedWorker, type FrameworkWorkerOptions as LunoraOptions, withFrameworkWorker as withLunora } from '@lunora/runtime';
|
|
2
2
|
/**
|
|
3
|
-
* The Lunora Astro **integration** — an `AstroIntegration` object
|
|
4
|
-
* (`{ name, hooks }`) added to `astro.config.*`'s `integrations` array.
|
|
5
|
-
*
|
|
6
|
-
* Astro is multi-framework at the UI layer, so this integration is **not** a new
|
|
7
|
-
* reactive runtime. Its job is the *composition* seam (PLAN4 class-B): make the
|
|
8
|
-
* Worker `@astrojs/cloudflare` emits mount Lunora realtime under `/_lunora/*`
|
|
9
|
-
* via `withLunora`, and surface the framework-neutral server helpers
|
|
10
|
-
* (`@lunora/astro/server`) to Astro server endpoints / `.astro` frontmatter.
|
|
11
|
-
*
|
|
12
|
-
* Reactivity itself comes from whichever island adapter the app hydrates with —
|
|
13
|
-
* `@lunora/react`, `@lunora/solid`, `@lunora/svelte`, or `@lunora/vue` — each of
|
|
14
|
-
* which ships its own `hydratePreloaded(preloaded)` for the SSR-seed → live
|
|
15
|
-
* handoff. This package owns the server/composition half only.
|
|
16
|
-
*/
|
|
3
|
+
* The Lunora Astro **integration** — an `AstroIntegration` object
|
|
4
|
+
* (`{ name, hooks }`) added to `astro.config.*`'s `integrations` array.
|
|
5
|
+
*
|
|
6
|
+
* Astro is multi-framework at the UI layer, so this integration is **not** a new
|
|
7
|
+
* reactive runtime. Its job is the *composition* seam (PLAN4 class-B): make the
|
|
8
|
+
* Worker `@astrojs/cloudflare` emits mount Lunora realtime under `/_lunora/*`
|
|
9
|
+
* via `withLunora`, and surface the framework-neutral server helpers
|
|
10
|
+
* (`@lunora/astro/server`) to Astro server endpoints / `.astro` frontmatter.
|
|
11
|
+
*
|
|
12
|
+
* Reactivity itself comes from whichever island adapter the app hydrates with —
|
|
13
|
+
* `@lunora/react`, `@lunora/solid`, `@lunora/svelte`, or `@lunora/vue` — each of
|
|
14
|
+
* which ships its own `hydratePreloaded(preloaded)` for the SSR-seed → live
|
|
15
|
+
* handoff. This package owns the server/composition half only.
|
|
16
|
+
*/
|
|
17
17
|
/**
|
|
18
|
-
* Structural subset of Astro's `AstroIntegration`. Declared locally (rather than
|
|
19
|
-
* importing `astro`'s type) so `@lunora/astro`'s public surface stays decoupled
|
|
20
|
-
* from a specific Astro major and type-checks even when `astro` is not installed
|
|
21
|
-
* — `astro` is an *optional* peer here (only the host Astro app pulls it in).
|
|
22
|
-
* The shape is assignable to/from Astro's real `AstroIntegration`, so adding the
|
|
23
|
-
* returned object to `integrations` type-checks in a real Astro project.
|
|
24
|
-
*/
|
|
18
|
+
* Structural subset of Astro's `AstroIntegration`. Declared locally (rather than
|
|
19
|
+
* importing `astro`'s type) so `@lunora/astro`'s public surface stays decoupled
|
|
20
|
+
* from a specific Astro major and type-checks even when `astro` is not installed
|
|
21
|
+
* — `astro` is an *optional* peer here (only the host Astro app pulls it in).
|
|
22
|
+
* The shape is assignable to/from Astro's real `AstroIntegration`, so adding the
|
|
23
|
+
* returned object to `integrations` type-checks in a real Astro project.
|
|
24
|
+
*/
|
|
25
25
|
interface AstroIntegrationLike {
|
|
26
26
|
readonly hooks: {
|
|
27
27
|
readonly [hook: string]: ((...arguments_: never[]) => unknown) | undefined;
|
|
@@ -31,41 +31,41 @@ interface AstroIntegrationLike {
|
|
|
31
31
|
/** Options for the `lunora` integration. */
|
|
32
32
|
interface LunoraIntegrationOptions {
|
|
33
33
|
/**
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
* Path (or specifier) of the module that calls `withLunora` and is the
|
|
35
|
+
* composed worker's `export default`. Documented for the wiring story; when
|
|
36
|
+
* omitted the integration assumes the conventional `src/worker.ts`.
|
|
37
|
+
*/
|
|
38
38
|
readonly serverEntry?: string;
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
|
-
* The Lunora Astro integration. Add it to `astro.config.*`:
|
|
42
|
-
*
|
|
43
|
-
* ```ts
|
|
44
|
-
* import cloudflare from "@astrojs/cloudflare";
|
|
45
|
-
* import { defineConfig } from "astro/config";
|
|
46
|
-
* import { lunora } from "@lunora/astro";
|
|
47
|
-
*
|
|
48
|
-
* export default defineConfig({
|
|
49
|
-
* output: "server",
|
|
50
|
-
* adapter: cloudflare(),
|
|
51
|
-
* integrations: [lunora()],
|
|
52
|
-
* });
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* What it does:
|
|
56
|
-
*
|
|
57
|
-
* - Marks the build so the `@astrojs/cloudflare` server entry is wrapped with
|
|
58
|
-
* `withLunora` — the composed worker reserves `/_lunora/*` for Lunora realtime
|
|
59
|
-
* and forwards everything else to Astro's SSR handler (one worker, one deploy).
|
|
60
|
-
* - Documents the `serverEntry` (default `src/worker.ts`) where the
|
|
61
|
-
* `withLunora(astroWorker, { shardDO: env.SHARD, … })` composition lives.
|
|
62
|
-
*
|
|
63
|
-
* The hook is intentionally minimal here: the load-bearing composition is the
|
|
64
|
-
* `withLunora` wrapper at the server-entry boundary (see `withLunora` for the
|
|
65
|
-
* `@astrojs/cloudflare` injection point). The integration object exists so the
|
|
66
|
-
* wiring is declared in `astro.config` the idiomatic Astro way, and so future
|
|
67
|
-
* build-time hooks (binding reconcile, dev middleware) have a home without
|
|
68
|
-
* changing the public surface.
|
|
69
|
-
*/
|
|
41
|
+
* The Lunora Astro integration. Add it to `astro.config.*`:
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* import cloudflare from "@astrojs/cloudflare";
|
|
45
|
+
* import { defineConfig } from "astro/config";
|
|
46
|
+
* import { lunora } from "@lunora/astro";
|
|
47
|
+
*
|
|
48
|
+
* export default defineConfig({
|
|
49
|
+
* output: "server",
|
|
50
|
+
* adapter: cloudflare(),
|
|
51
|
+
* integrations: [lunora()],
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* What it does:
|
|
56
|
+
*
|
|
57
|
+
* - Marks the build so the `@astrojs/cloudflare` server entry is wrapped with
|
|
58
|
+
* `withLunora` — the composed worker reserves `/_lunora/*` for Lunora realtime
|
|
59
|
+
* and forwards everything else to Astro's SSR handler (one worker, one deploy).
|
|
60
|
+
* - Documents the `serverEntry` (default `src/worker.ts`) where the
|
|
61
|
+
* `withLunora(astroWorker, { shardDO: env.SHARD, … })` composition lives.
|
|
62
|
+
*
|
|
63
|
+
* The hook is intentionally minimal here: the load-bearing composition is the
|
|
64
|
+
* `withLunora` wrapper at the server-entry boundary (see `withLunora` for the
|
|
65
|
+
* `@astrojs/cloudflare` injection point). The integration object exists so the
|
|
66
|
+
* wiring is declared in `astro.config` the idiomatic Astro way, and so future
|
|
67
|
+
* build-time hooks (binding reconcile, dev middleware) have a home without
|
|
68
|
+
* changing the public surface.
|
|
69
|
+
*/
|
|
70
70
|
declare const lunora: (options?: LunoraIntegrationOptions) => AstroIntegrationLike;
|
|
71
71
|
export { type AstroIntegrationLike, type LunoraIntegrationOptions, lunora };
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { lunora } from './packem_shared/lunora-
|
|
1
|
+
export { lunora } from './packem_shared/lunora-BPXRQkP4.mjs';
|
|
2
2
|
export { withFrameworkWorker as withLunora } from '@lunora/runtime';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const lunora = (options = {}) => {
|
|
2
|
-
const serverEntry = options.serverEntry ?? "src/worker.ts";
|
|
2
|
+
const serverEntry = (options.serverEntry ?? "src/worker.ts").trim();
|
|
3
3
|
return {
|
|
4
4
|
hooks: {
|
|
5
5
|
"astro:config:done": () => {
|
|
6
6
|
if (serverEntry.length === 0) {
|
|
7
|
-
throw new
|
|
7
|
+
throw new TypeError("@lunora/astro: `serverEntry` must be a non-empty path.");
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/astro",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.41",
|
|
4
4
|
"description": "Astro integration for Lunora — single-worker composition plus reactive-loader server helpers",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"astro",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"directory": "packages/astro"
|
|
26
26
|
},
|
|
27
27
|
"files": [
|
|
28
|
-
"dist",
|
|
28
|
+
"./dist",
|
|
29
29
|
"README.md",
|
|
30
30
|
"LICENSE.md",
|
|
31
31
|
"__assets__"
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@lunora/client": "1.0.0-alpha.
|
|
54
|
-
"@lunora/runtime": "1.0.0-alpha.
|
|
53
|
+
"@lunora/client": "1.0.0-alpha.25",
|
|
54
|
+
"@lunora/runtime": "1.0.0-alpha.30"
|
|
55
55
|
},
|
|
56
56
|
"peerDependencies": {
|
|
57
57
|
"astro": "^6.0.0"
|