@vidact/start 0.2.0-beta.0

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.
Files changed (48) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +65 -0
  4. package/dist/client.d.ts +20 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +181 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/index-client.d.ts +4 -0
  9. package/dist/index-client.d.ts.map +1 -0
  10. package/dist/index-client.js +4 -0
  11. package/dist/index-client.js.map +1 -0
  12. package/dist/index.d.ts +4 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +4 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/link-client.d.ts +5 -0
  17. package/dist/link-client.d.ts.map +1 -0
  18. package/dist/link-client.js +6 -0
  19. package/dist/link-client.js.map +1 -0
  20. package/dist/link-contract.d.ts +9 -0
  21. package/dist/link-contract.d.ts.map +1 -0
  22. package/dist/link-contract.js +9 -0
  23. package/dist/link-contract.js.map +1 -0
  24. package/dist/link.d.ts +5 -0
  25. package/dist/link.d.ts.map +1 -0
  26. package/dist/link.js +6 -0
  27. package/dist/link.js.map +1 -0
  28. package/dist/router.d.ts +69 -0
  29. package/dist/router.d.ts.map +1 -0
  30. package/dist/router.js +172 -0
  31. package/dist/router.js.map +1 -0
  32. package/dist/server.d.ts +19 -0
  33. package/dist/server.d.ts.map +1 -0
  34. package/dist/server.js +113 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/snapshot.d.ts +12 -0
  37. package/dist/snapshot.d.ts.map +1 -0
  38. package/dist/snapshot.js +25 -0
  39. package/dist/snapshot.js.map +1 -0
  40. package/dist/virtual.d.ts +4 -0
  41. package/dist/virtual.d.ts.map +1 -0
  42. package/dist/virtual.js +2 -0
  43. package/dist/virtual.js.map +1 -0
  44. package/dist/vite.d.ts +18 -0
  45. package/dist/vite.d.ts.map +1 -0
  46. package/dist/vite.js +200 -0
  47. package/dist/vite.js.map +1 -0
  48. package/package.json +76 -0
package/dist/router.js ADDED
@@ -0,0 +1,172 @@
1
+ const FILE_ROUTE = Symbol('Vidact.Start.FileRoute');
2
+ export function defineFileRoute(options) {
3
+ return Object.freeze({ [FILE_ROUTE]: true, options: Object.freeze({ ...options }) });
4
+ }
5
+ export function isFileRouteDefinition(value) {
6
+ return typeof value === 'object' && value !== null && FILE_ROUTE in value;
7
+ }
8
+ export function createRouteManifest(entries) {
9
+ const byId = new Map();
10
+ for (const entry of entries) {
11
+ if (entry.id.length === 0)
12
+ throw new TypeError('route id must be non-empty');
13
+ if (!entry.path.startsWith('/'))
14
+ throw new TypeError(`route ${entry.id} path must start with /`);
15
+ if (byId.has(entry.id))
16
+ throw new TypeError(`duplicate route id ${entry.id}`);
17
+ byId.set(entry.id, Object.freeze({ ...entry }));
18
+ }
19
+ for (const entry of byId.values()) {
20
+ if (entry.parentId !== null && !byId.has(entry.parentId)) {
21
+ throw new TypeError(`route ${entry.id} has unknown parent ${entry.parentId}`);
22
+ }
23
+ assertAcyclicParentChain(entry, byId);
24
+ }
25
+ const frozenEntries = Object.freeze([...byId.values()]);
26
+ return Object.freeze({ entries: frozenEntries, byId });
27
+ }
28
+ export function matchRoutes(manifest, pathname) {
29
+ const normalized = normalizePathname(pathname);
30
+ let selected;
31
+ for (const entry of manifest.entries) {
32
+ const match = matchPath(entry.path, normalized);
33
+ if (match === undefined)
34
+ continue;
35
+ const score = routeScore(entry, manifest);
36
+ if (selected === undefined || score > selected.score)
37
+ selected = { entry, params: match, score };
38
+ }
39
+ if (selected === undefined)
40
+ return [];
41
+ const chain = [];
42
+ let entry = selected.entry;
43
+ while (entry !== undefined) {
44
+ chain.push(entry);
45
+ entry = entry.parentId === null ? undefined : manifest.byId.get(entry.parentId);
46
+ }
47
+ return Object.freeze(chain.toReversed().map((matchedEntry) => Object.freeze({
48
+ entry: matchedEntry,
49
+ params: Object.freeze({ ...selected.params }),
50
+ })));
51
+ }
52
+ export async function loadRouteMatches(matches, request, suppliedData = {}) {
53
+ return runRouteLoaders(await resolveRouteMatches(matches), request, suppliedData);
54
+ }
55
+ export async function resolveRouteMatches(matches) {
56
+ return Object.freeze(await Promise.all(matches.map(async (match) => {
57
+ const module = await match.entry.load();
58
+ return Object.freeze({
59
+ ...match,
60
+ definition: readRouteDefinition(match.entry.id, module),
61
+ });
62
+ })));
63
+ }
64
+ export async function runRouteLoaders(matches, request, suppliedData = {}) {
65
+ const loaded = [];
66
+ const parentData = { ...suppliedData };
67
+ for (const match of matches) {
68
+ const loaderData = Object.hasOwn(suppliedData, match.entry.id)
69
+ ? suppliedData[match.entry.id]
70
+ : match.definition.options.loader === undefined
71
+ ? undefined
72
+ : // oxlint-disable-next-line no-await-in-loop -- Descendants receive settled parent data.
73
+ await match.definition.options.loader({
74
+ parentData: Object.freeze({ ...parentData }),
75
+ params: match.params,
76
+ request,
77
+ });
78
+ parentData[match.entry.id] = loaderData;
79
+ loaded.push(Object.freeze({ ...match, loaderData }));
80
+ }
81
+ return Object.freeze(loaded);
82
+ }
83
+ export function composeRouteMatches(matches, createElement, requestUrl) {
84
+ let children;
85
+ for (let index = matches.length - 1; index >= 0; index -= 1) {
86
+ const match = matches[index];
87
+ const component = match.definition.options.component;
88
+ if (component === undefined)
89
+ continue;
90
+ children = createElement(component, {
91
+ children,
92
+ loaderData: match.loaderData,
93
+ params: match.params,
94
+ requestUrl,
95
+ });
96
+ }
97
+ return children;
98
+ }
99
+ export function routeLoaderData(matches) {
100
+ return Object.freeze(Object.fromEntries(matches.map((match) => [match.entry.id, match.loaderData])));
101
+ }
102
+ function readRouteDefinition(id, module) {
103
+ const definition = module.Route ?? module.default;
104
+ if (!isFileRouteDefinition(definition)) {
105
+ throw new TypeError(`route module ${id} must export a Route created by defineFileRoute`);
106
+ }
107
+ return definition;
108
+ }
109
+ function matchPath(pattern, pathname) {
110
+ if (pattern === '/')
111
+ return pathname === '/' ? Object.freeze({}) : undefined;
112
+ const patternSegments = segments(pattern);
113
+ const pathSegments = segments(pathname);
114
+ const parameters = {};
115
+ let pathIndex = 0;
116
+ for (const segment of patternSegments) {
117
+ if (segment === '*') {
118
+ if (pathIndex >= pathSegments.length)
119
+ return undefined;
120
+ parameters['*'] = decodeSegment(pathSegments.slice(pathIndex).join('/'));
121
+ pathIndex = pathSegments.length;
122
+ break;
123
+ }
124
+ const value = pathSegments[pathIndex];
125
+ if (value === undefined)
126
+ return undefined;
127
+ if (segment.startsWith(':'))
128
+ parameters[segment.slice(1)] = decodeSegment(value);
129
+ else if (segment !== value)
130
+ return undefined;
131
+ pathIndex += 1;
132
+ }
133
+ return pathIndex === pathSegments.length ? Object.freeze(parameters) : undefined;
134
+ }
135
+ function normalizePathname(pathname) {
136
+ const path = pathname.split(/[?#]/u, 1)[0] ?? '/';
137
+ if (!path.startsWith('/'))
138
+ throw new TypeError('route pathname must start with /');
139
+ return path.length > 1 ? path.replace(/\/+$/u, '') : '/';
140
+ }
141
+ function segments(pathname) {
142
+ return pathname.split('/').filter(Boolean);
143
+ }
144
+ function decodeSegment(value) {
145
+ try {
146
+ return decodeURIComponent(value);
147
+ }
148
+ catch {
149
+ throw new TypeError(`invalid encoded route segment ${value}`);
150
+ }
151
+ }
152
+ function routeScore(entry, manifest) {
153
+ const specificity = segments(entry.path).reduce((score, segment) => score + (segment === '*' ? 1 : segment.startsWith(':') ? 10 : 100), 0);
154
+ let depth = 0;
155
+ let current = entry;
156
+ while (current !== undefined) {
157
+ depth += 1;
158
+ current = current.parentId === null ? undefined : manifest.byId.get(current.parentId);
159
+ }
160
+ return specificity * 1_000 + depth;
161
+ }
162
+ function assertAcyclicParentChain(entry, byId) {
163
+ const visited = new Set([entry.id]);
164
+ let parentId = entry.parentId;
165
+ while (parentId !== null) {
166
+ if (visited.has(parentId))
167
+ throw new TypeError(`route ${entry.id} has a cyclic parent chain`);
168
+ visited.add(parentId);
169
+ parentId = byId.get(parentId)?.parentId ?? null;
170
+ }
171
+ }
172
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type RouteManifest, type StartComponent } from './router.js';
2
+ export interface StartDocumentContext {
3
+ readonly applicationHtml: string;
4
+ readonly clientEntry: string | undefined;
5
+ readonly rootId: string;
6
+ readonly snapshot: string;
7
+ readonly snapshotId: string;
8
+ }
9
+ export interface StartHandlerOptions {
10
+ readonly clientEntry?: string;
11
+ readonly manifest: RouteManifest;
12
+ readonly notFound?: (request: Request) => Response | Promise<Response>;
13
+ readonly renderDocument?: (context: StartDocumentContext) => string | Promise<string>;
14
+ readonly rootId?: string;
15
+ readonly snapshotId?: string;
16
+ }
17
+ export declare function createStartHandler(options: StartHandlerOptions): (request: Request) => Promise<Response>;
18
+ export type { StartComponent };
19
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,aAAa,EAElB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAA;AAWpB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACrF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,GAC3B,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA8EzC;AAmDD,YAAY,EAAE,cAAc,EAAE,CAAA"}
package/dist/server.js ADDED
@@ -0,0 +1,113 @@
1
+ import { renderToReadableStream } from '@vidact/runtime/framework/server';
2
+ import { createElement } from '@vidact/runtime/server';
3
+ import { composeRouteMatches, matchRoutes, resolveRouteMatches, routeLoaderData, runRouteLoaders, } from './router.js';
4
+ import { encodeStartSnapshot, VIDACT_START_NAVIGATION_HEADER, VIDACT_START_PROTOCOL, VIDACT_START_SNAPSHOT_MEDIA_TYPE, } from './snapshot.js';
5
+ const DEFAULT_ROOT_ID = 'vidact-start-root';
6
+ const DEFAULT_SNAPSHOT_ID = 'vidact-start-snapshot';
7
+ export function createStartHandler(options) {
8
+ const rootId = options.rootId ?? DEFAULT_ROOT_ID;
9
+ const snapshotId = options.snapshotId ?? DEFAULT_SNAPSHOT_ID;
10
+ return async (request) => {
11
+ const url = new URL(request.url);
12
+ const matches = matchRoutes(options.manifest, url.pathname);
13
+ if (matches.length === 0) {
14
+ return options.notFound === undefined
15
+ ? new Response('Not found', { status: 404 })
16
+ : await options.notFound(request);
17
+ }
18
+ const resolved = await resolveRouteMatches(matches);
19
+ const endpoint = endpointHandler(resolved, request.method);
20
+ if (endpoint !== undefined) {
21
+ const response = await endpoint({
22
+ params: resolved.at(-1).params,
23
+ request,
24
+ });
25
+ return request.method === 'HEAD'
26
+ ? new Response(null, {
27
+ status: response.status,
28
+ statusText: response.statusText,
29
+ headers: response.headers,
30
+ })
31
+ : response;
32
+ }
33
+ const canRender = resolved.some((match) => match.definition.options.component !== undefined);
34
+ if ((request.method !== 'GET' && request.method !== 'HEAD') || !canRender) {
35
+ const allow = allowedMethods(resolved, canRender);
36
+ if (allow.length === 0) {
37
+ return options.notFound === undefined
38
+ ? new Response('Not found', { status: 404 })
39
+ : await options.notFound(request);
40
+ }
41
+ return new Response('Method not allowed', {
42
+ status: 405,
43
+ headers: { allow: allow.join(', ') },
44
+ });
45
+ }
46
+ const loaded = await runRouteLoaders(resolved, request);
47
+ const snapshot = escapeScriptText(encodeStartSnapshot({
48
+ protocol: VIDACT_START_PROTOCOL,
49
+ pathname: `${url.pathname}${url.search}`,
50
+ loaderData: routeLoaderData(loaded),
51
+ }));
52
+ if (request.headers.get(VIDACT_START_NAVIGATION_HEADER) === '1') {
53
+ return new Response(request.method === 'HEAD' ? null : snapshot, {
54
+ headers: { 'content-type': `${VIDACT_START_SNAPSHOT_MEDIA_TYPE}; charset=utf-8` },
55
+ });
56
+ }
57
+ const application = composeRouteMatches(loaded, (component, props) => createElement(component, props), request.url);
58
+ const stream = await renderToReadableStream(() => application, {
59
+ identifierPrefix: 'start-',
60
+ });
61
+ const applicationHtml = await new Response(stream).text();
62
+ const documentContext = {
63
+ applicationHtml,
64
+ clientEntry: options.clientEntry,
65
+ rootId,
66
+ snapshot,
67
+ snapshotId,
68
+ };
69
+ const html = options.renderDocument === undefined
70
+ ? defaultDocument(documentContext)
71
+ : await options.renderDocument(documentContext);
72
+ return new Response(request.method === 'HEAD' ? null : html, {
73
+ headers: { 'content-type': 'text/html; charset=utf-8' },
74
+ });
75
+ };
76
+ }
77
+ function endpointHandler(matches, method) {
78
+ const handlers = matches.at(-1)?.definition.options.server?.handlers;
79
+ return handlers?.[method.toUpperCase()] ?? (method === 'HEAD' ? handlers?.GET : undefined);
80
+ }
81
+ function allowedMethods(matches, canRender) {
82
+ const methods = new Set();
83
+ if (canRender) {
84
+ methods.add('GET');
85
+ methods.add('HEAD');
86
+ }
87
+ const handlers = matches.at(-1)?.definition.options.server?.handlers;
88
+ for (const method of Object.keys(handlers ?? {}))
89
+ methods.add(method.toUpperCase());
90
+ if (methods.has('GET'))
91
+ methods.add('HEAD');
92
+ return [...methods].toSorted((left, right) => methodRank(left) - methodRank(right) || left.localeCompare(right));
93
+ }
94
+ function methodRank(method) {
95
+ return method === 'GET' ? 0 : method === 'HEAD' ? 1 : 2;
96
+ }
97
+ function defaultDocument(context) {
98
+ const clientScript = context.clientEntry === undefined
99
+ ? ''
100
+ : `<script type="module" src="${escapeAttribute(context.clientEntry)}"></script>`;
101
+ return `<!doctype html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><div id="${escapeAttribute(context.rootId)}">${context.applicationHtml}</div><script id="${escapeAttribute(context.snapshotId)}" type="application/json">${context.snapshot}</script>${clientScript}</body></html>`;
102
+ }
103
+ function escapeAttribute(value) {
104
+ return value
105
+ .replaceAll('&', '&amp;')
106
+ .replaceAll('"', '&quot;')
107
+ .replaceAll('<', '&lt;')
108
+ .replaceAll('>', '&gt;');
109
+ }
110
+ function escapeScriptText(value) {
111
+ return value.replaceAll('&', '\\u0026').replaceAll('<', '\\u003c').replaceAll('>', '\\u003e');
112
+ }
113
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type FrameworkValue } from '@vidact/runtime/framework/protocol';
2
+ export declare const VIDACT_START_PROTOCOL = "vidact-start-v1";
3
+ export declare const VIDACT_START_NAVIGATION_HEADER = "x-vidact-start-navigation";
4
+ export declare const VIDACT_START_SNAPSHOT_MEDIA_TYPE = "application/x-vidact-start+json";
5
+ export interface StartSnapshot {
6
+ readonly protocol: typeof VIDACT_START_PROTOCOL;
7
+ readonly loaderData: Readonly<Record<string, FrameworkValue>>;
8
+ readonly pathname: string;
9
+ }
10
+ export declare function encodeStartSnapshot(snapshot: StartSnapshot): string;
11
+ export declare function decodeStartSnapshot(payload: string): StartSnapshot;
12
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAA;AAE3C,eAAO,MAAM,qBAAqB,oBAAoB,CAAA;AACtD,eAAO,MAAM,8BAA8B,8BAA8B,CAAA;AACzE,eAAO,MAAM,gCAAgC,oCAAoC,CAAA;AAEjF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,qBAAqB,CAAA;IAC/C,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;IAC7D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAEnE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAelE"}
@@ -0,0 +1,25 @@
1
+ import { decodeFrameworkValue, encodeFrameworkValue, } from '@vidact/runtime/framework/protocol';
2
+ export const VIDACT_START_PROTOCOL = 'vidact-start-v1';
3
+ export const VIDACT_START_NAVIGATION_HEADER = 'x-vidact-start-navigation';
4
+ export const VIDACT_START_SNAPSHOT_MEDIA_TYPE = 'application/x-vidact-start+json';
5
+ export function encodeStartSnapshot(snapshot) {
6
+ return encodeFrameworkValue(snapshot);
7
+ }
8
+ export function decodeStartSnapshot(payload) {
9
+ const value = decodeFrameworkValue(payload);
10
+ if (!isRecord(value) ||
11
+ value.protocol !== VIDACT_START_PROTOCOL ||
12
+ typeof value.pathname !== 'string' ||
13
+ !isRecord(value.loaderData)) {
14
+ throw new TypeError('invalid Vidact Start snapshot');
15
+ }
16
+ return {
17
+ protocol: VIDACT_START_PROTOCOL,
18
+ pathname: value.pathname,
19
+ loaderData: value.loaderData,
20
+ };
21
+ }
22
+ function isRecord(value) {
23
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
24
+ }
25
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAErB,MAAM,oCAAoC,CAAA;AAE3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAA;AACtD,MAAM,CAAC,MAAM,8BAA8B,GAAG,2BAA2B,CAAA;AACzE,MAAM,CAAC,MAAM,gCAAgC,GAAG,iCAAiC,CAAA;AAQjF,MAAM,UAAU,mBAAmB,CAAC,QAAuB;IACzD,OAAO,oBAAoB,CAAC,QAAqC,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC3C,IACE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,KAAK,CAAC,QAAQ,KAAK,qBAAqB;QACxC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAC3B,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAA;IACtD,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,qBAAqB;QAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAsD;KACzE,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC"}
@@ -0,0 +1,4 @@
1
+ declare module 'virtual:vidact-start/routes' {
2
+ const routeManifest: import('./router.js').RouteManifest;
3
+ }
4
+ //# sourceMappingURL=virtual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,6BAA6B,CAAC;IACpC,MAAM,aAAa,EAAE,OAAO,aAAa,EAAE,aAAa,CAAA;CAChE"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=virtual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":""}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import { type VidactPluginOptions } from '@vidact/vite';
2
+ import { type Plugin } from 'vite';
3
+ export interface VidactStartOptions {
4
+ readonly compiler?: Omit<VidactPluginOptions, 'target'>;
5
+ readonly routesDirectory?: string;
6
+ readonly serverEntry?: string | false;
7
+ readonly serverExport?: string;
8
+ }
9
+ export interface GeneratedRouteRecord {
10
+ readonly file: string;
11
+ readonly id: string;
12
+ readonly parentId: string | null;
13
+ readonly path: string;
14
+ }
15
+ export declare function vidactStart(options?: VidactStartOptions): Plugin[];
16
+ export declare function discoverRouteRecords(routesDirectory: string): Promise<readonly GeneratedRouteRecord[]>;
17
+ export declare function routeFileToRecord(filename: string, routesDirectory: string): GeneratedRouteRecord;
18
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAIA,OAAO,EAAU,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAGL,KAAK,MAAM,EAGZ,MAAM,MAAM,CAAA;AAOb,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAA;IACvD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,MAAM,EAAE,CAmBtE;AAsID,wBAAsB,oBAAoB,CACxC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAiB1C;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,oBAAoB,CAgBjG"}
package/dist/vite.js ADDED
@@ -0,0 +1,200 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { vidact } from '@vidact/vite';
4
+ import { isRunnableDevEnvironment, normalizePath, } from 'vite';
5
+ const PUBLIC_ROUTES_ID = 'virtual:vidact-start/routes';
6
+ const INTERNAL_ROUTES_ID = `\0${PUBLIC_ROUTES_ID}`;
7
+ const ROUTE_FILE = /\.(?:[cm]?[jt]sx?)$/u;
8
+ const IGNORED_ROUTE_FILE = /(?:^|\.)\b(?:test|spec)\.[cm]?[jt]sx?$/u;
9
+ export function vidactStart(options = {}) {
10
+ const compiler = options.compiler ?? {};
11
+ const features = [...new Set(['framework', ...(compiler.features ?? [])])];
12
+ const plugins = [
13
+ vidactForEnvironment('client', { ...compiler, target: 'hydrate', features }),
14
+ vidactForEnvironment('ssr', { ...compiler, target: 'server', features }),
15
+ routeManifestPlugin(options.routesDirectory),
16
+ ];
17
+ if (options.serverEntry !== false) {
18
+ plugins.push(developmentServerPlugin(options.serverEntry ?? '/src/server.ts', options.serverExport ?? 'default'));
19
+ }
20
+ return plugins;
21
+ }
22
+ function routeManifestPlugin(configuredRoutesDirectory) {
23
+ let config;
24
+ let routesDirectory;
25
+ let server;
26
+ return {
27
+ name: 'vidact-start-routes',
28
+ configResolved(resolved) {
29
+ config = resolved;
30
+ routesDirectory = path.resolve(config.root, configuredRoutesDirectory ?? 'src/routes');
31
+ },
32
+ configureServer(viteServer) {
33
+ server = viteServer;
34
+ viteServer.watcher.add(routesDirectory);
35
+ },
36
+ resolveId(source) {
37
+ return source === PUBLIC_ROUTES_ID ? INTERNAL_ROUTES_ID : null;
38
+ },
39
+ async load(id) {
40
+ if (id !== INTERNAL_ROUTES_ID)
41
+ return null;
42
+ return generateRouteModule(await discoverRouteRecords(routesDirectory));
43
+ },
44
+ handleHotUpdate(context) {
45
+ if (!isRouteFile(routesDirectory, context.file))
46
+ return;
47
+ const module = server?.moduleGraph.getModuleById(INTERNAL_ROUTES_ID);
48
+ if (module !== undefined)
49
+ server?.moduleGraph.invalidateModule(module);
50
+ server?.ws.send({ type: 'full-reload' });
51
+ return [];
52
+ },
53
+ };
54
+ }
55
+ function vidactForEnvironment(environmentName, options) {
56
+ const plugin = vidact(options);
57
+ return {
58
+ ...plugin,
59
+ name: `${plugin.name}:start:${environmentName}`,
60
+ applyToEnvironment: (environment) => environment.name === environmentName,
61
+ };
62
+ }
63
+ function developmentServerPlugin(serverEntry, serverExport) {
64
+ return {
65
+ name: 'vidact-start-development-server',
66
+ config: () => ({ appType: 'custom' }),
67
+ configureServer(server) {
68
+ return () => {
69
+ server.middlewares.use((nodeRequest, nodeResponse, next) => {
70
+ void serveDevelopmentRequest(server, serverEntry, serverExport, nodeRequest, nodeResponse).catch((error) => {
71
+ if (error instanceof Error)
72
+ server.ssrFixStacktrace(error);
73
+ next(error);
74
+ });
75
+ });
76
+ };
77
+ },
78
+ };
79
+ }
80
+ async function serveDevelopmentRequest(server, serverEntry, serverExport, nodeRequest, nodeResponse) {
81
+ const environment = server.environments.ssr;
82
+ if (!isRunnableDevEnvironment(environment)) {
83
+ throw new Error("Vidact Start requires Vite's runnable SSR development environment");
84
+ }
85
+ const module = (await environment.runner.import(serverEntry));
86
+ const handler = module[serverExport];
87
+ if (typeof handler !== 'function') {
88
+ throw new TypeError(`${serverEntry} must export a ${serverExport} request handler`);
89
+ }
90
+ const request = await nodeRequestToRequest(nodeRequest);
91
+ let response = await handler(request);
92
+ if (!(response instanceof Response)) {
93
+ throw new TypeError(`${serverEntry} ${serverExport} must return a Response`);
94
+ }
95
+ if (response.headers.get('content-type')?.startsWith('text/html') === true) {
96
+ const html = await server.transformIndexHtml(nodeRequest.url ?? '/', await response.text());
97
+ response = new Response(html, response);
98
+ }
99
+ await sendNodeResponse(nodeResponse, response);
100
+ }
101
+ async function nodeRequestToRequest(request) {
102
+ const headers = new Headers();
103
+ for (const [name, value] of Object.entries(request.headers)) {
104
+ if (Array.isArray(value))
105
+ for (const item of value)
106
+ headers.append(name, item);
107
+ else if (value !== undefined)
108
+ headers.set(name, value);
109
+ }
110
+ const forwardedProtocol = headers.get('x-forwarded-proto')?.split(',', 1)[0]?.trim();
111
+ const protocol = forwardedProtocol ?? (Reflect.get(request.socket, 'encrypted') === true ? 'https' : 'http');
112
+ const url = new URL(request.url ?? '/', `${protocol}://${headers.get('host') ?? 'localhost'}`);
113
+ const body = request.method === 'GET' || request.method === 'HEAD'
114
+ ? undefined
115
+ : await readRequestBody(request);
116
+ return new Request(url, {
117
+ method: request.method ?? 'GET',
118
+ headers,
119
+ ...(body === undefined ? {} : { body }),
120
+ });
121
+ }
122
+ async function readRequestBody(request) {
123
+ const chunks = [];
124
+ for await (const chunk of request) {
125
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
126
+ }
127
+ return Uint8Array.from(Buffer.concat(chunks)).buffer;
128
+ }
129
+ async function sendNodeResponse(response, webResponse) {
130
+ response.statusCode = webResponse.status;
131
+ response.statusMessage = webResponse.statusText;
132
+ for (const [name, value] of webResponse.headers)
133
+ response.setHeader(name, value);
134
+ const cookies = webResponse.headers.getSetCookie();
135
+ if (cookies.length > 0)
136
+ response.setHeader('set-cookie', cookies);
137
+ response.end(Buffer.from(await webResponse.arrayBuffer()));
138
+ }
139
+ export async function discoverRouteRecords(routesDirectory) {
140
+ let filenames;
141
+ try {
142
+ filenames = await readdir(routesDirectory, { recursive: true });
143
+ }
144
+ catch (error) {
145
+ if (isMissingDirectory(error))
146
+ return [];
147
+ throw error;
148
+ }
149
+ const records = filenames
150
+ .filter((filename) => ROUTE_FILE.test(filename) && !IGNORED_ROUTE_FILE.test(filename))
151
+ .map((filename) => routeFileToRecord(filename, routesDirectory));
152
+ const ids = new Set(records.map((record) => record.id));
153
+ return Object.freeze(records
154
+ .map((record) => Object.freeze({ ...record, parentId: parentRouteId(record.id, ids) }))
155
+ .toSorted((left, right) => left.id.localeCompare(right.id)));
156
+ }
157
+ export function routeFileToRecord(filename, routesDirectory) {
158
+ const normalizedFilename = normalizePath(filename);
159
+ const id = normalizedFilename.replace(ROUTE_FILE, '');
160
+ if (id.length === 0)
161
+ throw new TypeError(`invalid route filename ${filename}`);
162
+ const routeSegments = id
163
+ .split('/')
164
+ .filter((segment) => segment !== '__root' && segment !== 'index' && !segment.startsWith('_'))
165
+ .map((segment) => segment === '$' ? '*' : segment.startsWith('$') ? `:${segment.slice(1)}` : segment);
166
+ return {
167
+ file: normalizePath(path.resolve(routesDirectory, normalizedFilename)),
168
+ id,
169
+ parentId: null,
170
+ path: routeSegments.length === 0 ? '/' : `/${routeSegments.join('/')}`,
171
+ };
172
+ }
173
+ function parentRouteId(id, ids) {
174
+ if (id === '__root')
175
+ return null;
176
+ const segments = id.split('/');
177
+ if (segments.at(-1) === 'index')
178
+ segments.pop();
179
+ while (segments.length > 0) {
180
+ const candidate = segments.join('/');
181
+ if (candidate !== id && ids.has(candidate))
182
+ return candidate;
183
+ segments.pop();
184
+ }
185
+ return ids.has('__root') ? '__root' : null;
186
+ }
187
+ function generateRouteModule(records) {
188
+ const entries = records
189
+ .map((record) => `{ id: ${JSON.stringify(record.id)}, parentId: ${JSON.stringify(record.parentId)}, path: ${JSON.stringify(record.path)}, load: () => import(${JSON.stringify(record.file)}) }`)
190
+ .join(',\n ');
191
+ return `import { createRouteManifest } from '@vidact/start'\n\nexport const routeManifest = createRouteManifest([\n ${entries}\n])\n`;
192
+ }
193
+ function isRouteFile(routesDirectory, filename) {
194
+ const relative = path.relative(routesDirectory, filename);
195
+ return (!relative.startsWith('..') && ROUTE_FILE.test(relative) && !IGNORED_ROUTE_FILE.test(relative));
196
+ }
197
+ function isMissingDirectory(error) {
198
+ return typeof error === 'object' && error !== null && Reflect.get(error, 'code') === 'ENOENT';
199
+ }
200
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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"}