@inertia-node/core 0.1.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.
- package/LICENSE +21 -0
- package/dist/index.d.ts +196 -0
- package/dist/index.js +509 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Inertia Node Adapter contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
type HeaderValue = string | string[] | number | undefined;
|
|
2
|
+
type HeadersLike = Record<string, HeaderValue>;
|
|
3
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
4
|
+
type LazyProp<T = unknown> = (context: RenderContext) => MaybePromise<T>;
|
|
5
|
+
type PropSource<T = unknown> = T | LazyProp<T>;
|
|
6
|
+
type PropValue = unknown | LazyProp | InertiaPropWrapper;
|
|
7
|
+
type PageProps = Record<string, unknown>;
|
|
8
|
+
type InputProps = Record<string, PropValue>;
|
|
9
|
+
type VersionValue = string | number | null;
|
|
10
|
+
interface SharedPageProps {
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
interface ValidationErrorValue {
|
|
14
|
+
value: string;
|
|
15
|
+
}
|
|
16
|
+
interface InertiaRequest {
|
|
17
|
+
headers: HeadersLike;
|
|
18
|
+
method: string;
|
|
19
|
+
url: string;
|
|
20
|
+
originalUrl?: string;
|
|
21
|
+
protocol?: string;
|
|
22
|
+
host?: string;
|
|
23
|
+
raw?: unknown;
|
|
24
|
+
}
|
|
25
|
+
interface RenderContext {
|
|
26
|
+
request: InertiaRequest;
|
|
27
|
+
component: string;
|
|
28
|
+
url: string;
|
|
29
|
+
}
|
|
30
|
+
interface InertiaPage<TProps extends PageProps = PageProps> {
|
|
31
|
+
component: string;
|
|
32
|
+
props: TProps;
|
|
33
|
+
url: string;
|
|
34
|
+
version: VersionValue;
|
|
35
|
+
encryptHistory?: boolean;
|
|
36
|
+
clearHistory?: boolean;
|
|
37
|
+
preserveFragment?: boolean;
|
|
38
|
+
mergeProps?: string[];
|
|
39
|
+
prependProps?: string[];
|
|
40
|
+
deepMergeProps?: string[];
|
|
41
|
+
matchPropsOn?: string[];
|
|
42
|
+
scrollProps?: Record<string, unknown>;
|
|
43
|
+
deferredProps?: Record<string, unknown>;
|
|
44
|
+
rescuedProps?: string[];
|
|
45
|
+
sharedProps?: string[];
|
|
46
|
+
onceProps?: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
interface SsrResult {
|
|
49
|
+
head: string[];
|
|
50
|
+
body: string;
|
|
51
|
+
}
|
|
52
|
+
interface SsrOptions {
|
|
53
|
+
enabled?: boolean | ((request: InertiaRequest) => MaybePromise<boolean>);
|
|
54
|
+
url?: string;
|
|
55
|
+
timeoutMs?: number;
|
|
56
|
+
throwOnError?: boolean;
|
|
57
|
+
fetch?: typeof fetch;
|
|
58
|
+
}
|
|
59
|
+
interface ProtocolResponse {
|
|
60
|
+
status: number;
|
|
61
|
+
headers: Record<string, string>;
|
|
62
|
+
body: string;
|
|
63
|
+
}
|
|
64
|
+
interface RootViewContext {
|
|
65
|
+
page: string;
|
|
66
|
+
pageObject: InertiaPage;
|
|
67
|
+
rootElementId: string;
|
|
68
|
+
ssr?: SsrResult;
|
|
69
|
+
}
|
|
70
|
+
interface CreateInertiaOptions {
|
|
71
|
+
rootView?: string | ((context: RootViewContext) => MaybePromise<string>);
|
|
72
|
+
rootElementId?: string;
|
|
73
|
+
version?: VersionValue | ((request: InertiaRequest) => MaybePromise<VersionValue>);
|
|
74
|
+
share?: InputProps | ((context: RenderContext) => MaybePromise<InputProps>);
|
|
75
|
+
resolveUrl?: (request: InertiaRequest) => string;
|
|
76
|
+
ssr?: SsrOptions;
|
|
77
|
+
}
|
|
78
|
+
interface RenderOptions {
|
|
79
|
+
status?: number;
|
|
80
|
+
props?: InputProps;
|
|
81
|
+
encryptHistory?: boolean;
|
|
82
|
+
clearHistory?: boolean;
|
|
83
|
+
preserveFragment?: boolean;
|
|
84
|
+
mergeProps?: string[];
|
|
85
|
+
prependProps?: string[];
|
|
86
|
+
deepMergeProps?: string[];
|
|
87
|
+
matchPropsOn?: string[];
|
|
88
|
+
scrollProps?: Record<string, unknown>;
|
|
89
|
+
deferredProps?: Record<string, unknown>;
|
|
90
|
+
rescuedProps?: string[];
|
|
91
|
+
onceProps?: Record<string, unknown>;
|
|
92
|
+
ssr?: boolean;
|
|
93
|
+
}
|
|
94
|
+
interface InertiaInstance {
|
|
95
|
+
render(request: InertiaRequest, component: string, props?: InputProps, options?: RenderOptions): Promise<ProtocolResponse>;
|
|
96
|
+
redirect(request: InertiaRequest, location: string, status?: number): ProtocolResponse;
|
|
97
|
+
location(location: string): ProtocolResponse;
|
|
98
|
+
}
|
|
99
|
+
interface DeferredOptions {
|
|
100
|
+
group?: string;
|
|
101
|
+
rescue?: boolean;
|
|
102
|
+
}
|
|
103
|
+
interface OnceOptions {
|
|
104
|
+
expiresAt?: number;
|
|
105
|
+
}
|
|
106
|
+
interface InertiaPropWrapper<T = unknown> {
|
|
107
|
+
readonly __inertiaProp: true;
|
|
108
|
+
readonly kind: "always" | "optional" | "defer" | "merge";
|
|
109
|
+
readonly value: PropSource<T>;
|
|
110
|
+
readonly defer?: DeferredOptions;
|
|
111
|
+
readonly merge?: MergeMetadata;
|
|
112
|
+
}
|
|
113
|
+
interface MergeMetadata {
|
|
114
|
+
mode?: "append" | "prepend" | "deepMerge";
|
|
115
|
+
paths: string[];
|
|
116
|
+
matchOn: string[];
|
|
117
|
+
once?: OnceOptions | true;
|
|
118
|
+
}
|
|
119
|
+
type InferPageProps<T> = T extends InertiaPage<infer Props> ? Props : never;
|
|
120
|
+
type PageComponentProps<T extends PageProps = PageProps> = T & SharedPageProps;
|
|
121
|
+
type ValidationErrors<TFields extends string = string, TValue = string> = Partial<Record<TFields, TValue>>;
|
|
122
|
+
type FlashData<T extends Record<string, unknown> = Record<string, unknown>> = T;
|
|
123
|
+
|
|
124
|
+
declare function createInertia(options?: CreateInertiaOptions): InertiaInstance;
|
|
125
|
+
|
|
126
|
+
declare function getHeader(headers: HeadersLike, name: string): string | undefined;
|
|
127
|
+
declare function requestHeader(request: InertiaRequest, name: string): string | undefined;
|
|
128
|
+
declare function isInertiaRequest(request: InertiaRequest): boolean;
|
|
129
|
+
declare function varyHeader(value?: string, addition?: string): string;
|
|
130
|
+
declare function parseCommaHeader(value?: string): string[];
|
|
131
|
+
|
|
132
|
+
declare function serializePage(page: InertiaPage): string;
|
|
133
|
+
declare function defaultRootView(context: RootViewContext): string;
|
|
134
|
+
declare function escapeAttribute(value: string): string;
|
|
135
|
+
|
|
136
|
+
interface AuthConfig<TRequest, TUser, TSerialized = TUser> {
|
|
137
|
+
getUser(request: TRequest): MaybePromise<TUser | null>;
|
|
138
|
+
login(request: TRequest, user: TUser): MaybePromise<void>;
|
|
139
|
+
logout(request: TRequest): MaybePromise<void>;
|
|
140
|
+
serializeUser?(user: TUser): MaybePromise<TSerialized>;
|
|
141
|
+
redirectTo?: string;
|
|
142
|
+
home?: string;
|
|
143
|
+
}
|
|
144
|
+
interface AuthRuntime<TUser, TSerialized = TUser> {
|
|
145
|
+
user(): Promise<TUser | null>;
|
|
146
|
+
check(): Promise<boolean>;
|
|
147
|
+
login(user: TUser): Promise<void>;
|
|
148
|
+
logout(): Promise<void>;
|
|
149
|
+
serializedUser(): Promise<TSerialized | null>;
|
|
150
|
+
}
|
|
151
|
+
declare function inertiaAuth<TRequest, TUser, TSerialized = TUser>(config: AuthConfig<TRequest, TUser, TSerialized>): AuthConfig<TRequest, TUser, TSerialized>;
|
|
152
|
+
|
|
153
|
+
interface ResolvedProps {
|
|
154
|
+
props: PageProps;
|
|
155
|
+
deferredProps?: Record<string, string[]>;
|
|
156
|
+
mergeProps?: string[];
|
|
157
|
+
prependProps?: string[];
|
|
158
|
+
deepMergeProps?: string[];
|
|
159
|
+
matchPropsOn?: string[];
|
|
160
|
+
onceProps?: Record<string, unknown>;
|
|
161
|
+
rescuedProps?: string[];
|
|
162
|
+
}
|
|
163
|
+
declare function always<T>(value: PropSource<T>): InertiaPropWrapper<T>;
|
|
164
|
+
declare function optional<T>(value: PropSource<T>): InertiaPropWrapper<T>;
|
|
165
|
+
declare function defer<T>(value: PropSource<T>, options?: DeferredOptions): InertiaPropWrapper<T>;
|
|
166
|
+
interface MergeBuilder<T> extends InertiaPropWrapper<T> {
|
|
167
|
+
append(path?: string): MergeBuilder<T>;
|
|
168
|
+
prepend(path?: string): MergeBuilder<T>;
|
|
169
|
+
deepMerge(path?: string): MergeBuilder<T>;
|
|
170
|
+
matchOn(path: string): MergeBuilder<T>;
|
|
171
|
+
once(options?: OnceOptions): MergeBuilder<T>;
|
|
172
|
+
}
|
|
173
|
+
declare function merge<T>(value: PropSource<T>): MergeBuilder<T>;
|
|
174
|
+
declare function isInertiaPropWrapper(value: unknown): value is InertiaPropWrapper;
|
|
175
|
+
declare function selectPartialProps(context: RenderContext, props: InputProps): InputProps;
|
|
176
|
+
declare function resolveProps(context: RenderContext, props: InputProps): Promise<PageProps>;
|
|
177
|
+
declare function resolvePageProps(context: RenderContext, props: InputProps): Promise<ResolvedProps>;
|
|
178
|
+
|
|
179
|
+
interface SessionStore {
|
|
180
|
+
get<T = unknown>(key: string): MaybePromise<T | undefined>;
|
|
181
|
+
set<T = unknown>(key: string, value: T): MaybePromise<void>;
|
|
182
|
+
pull<T = unknown>(key: string): MaybePromise<T | undefined>;
|
|
183
|
+
flash<T = unknown>(key: string, value: T): MaybePromise<void>;
|
|
184
|
+
reflash(keys?: string[]): MaybePromise<void>;
|
|
185
|
+
}
|
|
186
|
+
type ValidationErrorInput<TValue = string | string[]> = Record<string, TValue | TValue[]>;
|
|
187
|
+
interface ValidationErrorOptions {
|
|
188
|
+
bag?: string;
|
|
189
|
+
}
|
|
190
|
+
interface ValidationErrorPayload {
|
|
191
|
+
errors: ValidationErrorInput;
|
|
192
|
+
bag?: string;
|
|
193
|
+
}
|
|
194
|
+
declare function validationError(errors: ValidationErrorInput, options?: ValidationErrorOptions): ValidationErrorPayload;
|
|
195
|
+
|
|
196
|
+
export { type AuthConfig, type AuthRuntime, type CreateInertiaOptions, type DeferredOptions, type FlashData, type HeaderValue, type HeadersLike, type InertiaInstance, type InertiaPage, type InertiaPropWrapper, type InertiaRequest, type InferPageProps, type InputProps, type LazyProp, type MaybePromise, type MergeMetadata, type OnceOptions, type PageComponentProps, type PageProps, type PropSource, type PropValue, type ProtocolResponse, type RenderContext, type RenderOptions, type RootViewContext, type SessionStore, type SsrOptions, type SsrResult, type ValidationErrorInput, type ValidationErrorOptions, type ValidationErrorPayload, type ValidationErrorValue, type ValidationErrors, type VersionValue, always, createInertia, defaultRootView, defer, escapeAttribute, getHeader, inertiaAuth, isInertiaPropWrapper, isInertiaRequest, merge, optional, parseCommaHeader, requestHeader, resolvePageProps, resolveProps, selectPartialProps, serializePage, validationError, varyHeader };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
// src/html.ts
|
|
2
|
+
function serializePage(page) {
|
|
3
|
+
return JSON.stringify(page).replace(/</g, "\\u003c");
|
|
4
|
+
}
|
|
5
|
+
function defaultRootView(context) {
|
|
6
|
+
const head = context.ssr?.head.join("\n") ?? "";
|
|
7
|
+
const body = context.ssr?.body ?? "";
|
|
8
|
+
return `<!doctype html>
|
|
9
|
+
<html>
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="utf-8">
|
|
12
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
13
|
+
${head}
|
|
14
|
+
</head>
|
|
15
|
+
<body>
|
|
16
|
+
<script data-page="app" type="application/json">${context.page}</script>
|
|
17
|
+
<div id="${escapeAttribute(context.rootElementId)}">${body}</div>
|
|
18
|
+
</body>
|
|
19
|
+
</html>`;
|
|
20
|
+
}
|
|
21
|
+
function escapeAttribute(value) {
|
|
22
|
+
return value.replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// src/headers.ts
|
|
26
|
+
function getHeader(headers, name) {
|
|
27
|
+
const wanted = name.toLowerCase();
|
|
28
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
29
|
+
if (key.toLowerCase() !== wanted || value === void 0) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(value)) {
|
|
33
|
+
return value[0];
|
|
34
|
+
}
|
|
35
|
+
return String(value);
|
|
36
|
+
}
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
function requestHeader(request, name) {
|
|
40
|
+
return getHeader(request.headers, name);
|
|
41
|
+
}
|
|
42
|
+
function isInertiaRequest(request) {
|
|
43
|
+
return requestHeader(request, "X-Inertia") === "true";
|
|
44
|
+
}
|
|
45
|
+
function varyHeader(value, addition = "X-Inertia") {
|
|
46
|
+
if (!value) {
|
|
47
|
+
return addition;
|
|
48
|
+
}
|
|
49
|
+
const parts = value.split(",").map((part) => part.trim().toLowerCase());
|
|
50
|
+
return parts.includes(addition.toLowerCase()) ? value : `${value}, ${addition}`;
|
|
51
|
+
}
|
|
52
|
+
function parseCommaHeader(value) {
|
|
53
|
+
if (!value) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
return value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/props.ts
|
|
60
|
+
var DEFAULT_DEFERRED_GROUP = "default";
|
|
61
|
+
function always(value) {
|
|
62
|
+
return wrapper("always", value);
|
|
63
|
+
}
|
|
64
|
+
function optional(value) {
|
|
65
|
+
return wrapper("optional", value);
|
|
66
|
+
}
|
|
67
|
+
function defer(value, options = {}) {
|
|
68
|
+
return wrapper("defer", value, { defer: options });
|
|
69
|
+
}
|
|
70
|
+
function merge(value) {
|
|
71
|
+
return mergeWrapper(value);
|
|
72
|
+
}
|
|
73
|
+
function isInertiaPropWrapper(value) {
|
|
74
|
+
return typeof value === "object" && value !== null && "__inertiaProp" in value && value.__inertiaProp === true;
|
|
75
|
+
}
|
|
76
|
+
function selectPartialProps(context, props) {
|
|
77
|
+
const partialComponent = requestHeader(
|
|
78
|
+
context.request,
|
|
79
|
+
"X-Inertia-Partial-Component"
|
|
80
|
+
);
|
|
81
|
+
if (partialComponent !== context.component) {
|
|
82
|
+
return props;
|
|
83
|
+
}
|
|
84
|
+
const except = parseCommaHeader(
|
|
85
|
+
requestHeader(context.request, "X-Inertia-Partial-Except")
|
|
86
|
+
);
|
|
87
|
+
if (except.length > 0) {
|
|
88
|
+
return Object.fromEntries(
|
|
89
|
+
Object.entries(props).filter(([key]) => !except.includes(key))
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const only = parseCommaHeader(
|
|
93
|
+
requestHeader(context.request, "X-Inertia-Partial-Data")
|
|
94
|
+
);
|
|
95
|
+
if (only.length > 0) {
|
|
96
|
+
return Object.fromEntries(
|
|
97
|
+
Object.entries(props).filter(([key]) => only.includes(key))
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
return props;
|
|
101
|
+
}
|
|
102
|
+
async function resolveProps(context, props) {
|
|
103
|
+
return (await resolvePageProps(context, props)).props;
|
|
104
|
+
}
|
|
105
|
+
async function resolvePageProps(context, props) {
|
|
106
|
+
const selected = selectPartialProps(context, props);
|
|
107
|
+
const output = {};
|
|
108
|
+
const deferredProps = {};
|
|
109
|
+
const mergeProps = [];
|
|
110
|
+
const prependProps = [];
|
|
111
|
+
const deepMergeProps = [];
|
|
112
|
+
const matchPropsOn = [];
|
|
113
|
+
const onceProps = {};
|
|
114
|
+
const rescuedProps = [];
|
|
115
|
+
for (const [key, value] of Object.entries(selected)) {
|
|
116
|
+
if (isInertiaPropWrapper(value)) {
|
|
117
|
+
collectMetadata(key, value, {
|
|
118
|
+
deferredProps,
|
|
119
|
+
mergeProps,
|
|
120
|
+
prependProps,
|
|
121
|
+
deepMergeProps,
|
|
122
|
+
matchPropsOn,
|
|
123
|
+
onceProps
|
|
124
|
+
});
|
|
125
|
+
if (!shouldResolveWrapper(context, key, value)) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
output[key] = await resolveValue(context, value.value);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if (value.kind === "defer" && value.defer?.rescue) {
|
|
132
|
+
rescuedProps.push(key);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
output[key] = await resolveValue(context, value);
|
|
140
|
+
}
|
|
141
|
+
return stripEmpty({
|
|
142
|
+
props: output,
|
|
143
|
+
deferredProps,
|
|
144
|
+
mergeProps,
|
|
145
|
+
prependProps,
|
|
146
|
+
deepMergeProps,
|
|
147
|
+
matchPropsOn,
|
|
148
|
+
onceProps,
|
|
149
|
+
rescuedProps
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function wrapper(kind, value, options = {}) {
|
|
153
|
+
return {
|
|
154
|
+
__inertiaProp: true,
|
|
155
|
+
kind,
|
|
156
|
+
value,
|
|
157
|
+
...options
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function mergeWrapper(value) {
|
|
161
|
+
const prop = wrapper("merge", value, {
|
|
162
|
+
merge: {
|
|
163
|
+
paths: [""],
|
|
164
|
+
matchOn: []
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
prop.append = (path = "") => setMergeMode(prop, "append", path);
|
|
168
|
+
prop.prepend = (path = "") => setMergeMode(prop, "prepend", path);
|
|
169
|
+
prop.deepMerge = (path = "") => setMergeMode(prop, "deepMerge", path);
|
|
170
|
+
prop.matchOn = (path) => {
|
|
171
|
+
prop.merge?.matchOn.push(path);
|
|
172
|
+
return prop;
|
|
173
|
+
};
|
|
174
|
+
prop.once = (options) => {
|
|
175
|
+
if (prop.merge) {
|
|
176
|
+
prop.merge.once = options ?? true;
|
|
177
|
+
}
|
|
178
|
+
return prop;
|
|
179
|
+
};
|
|
180
|
+
return prop;
|
|
181
|
+
}
|
|
182
|
+
function setMergeMode(prop, mode, path) {
|
|
183
|
+
if (prop.merge) {
|
|
184
|
+
prop.merge.mode = mode;
|
|
185
|
+
prop.merge.paths = [path];
|
|
186
|
+
}
|
|
187
|
+
return prop;
|
|
188
|
+
}
|
|
189
|
+
async function resolveValue(context, value) {
|
|
190
|
+
if (typeof value === "function") {
|
|
191
|
+
return value(context);
|
|
192
|
+
}
|
|
193
|
+
return value;
|
|
194
|
+
}
|
|
195
|
+
function shouldResolveWrapper(context, key, value) {
|
|
196
|
+
if (value.kind === "always" || value.kind === "merge") {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
const partialComponent = requestHeader(
|
|
200
|
+
context.request,
|
|
201
|
+
"X-Inertia-Partial-Component"
|
|
202
|
+
);
|
|
203
|
+
const requestedKeys = parseCommaHeader(
|
|
204
|
+
requestHeader(context.request, "X-Inertia-Partial-Data")
|
|
205
|
+
);
|
|
206
|
+
const exceptKeys = parseCommaHeader(
|
|
207
|
+
requestHeader(context.request, "X-Inertia-Partial-Except")
|
|
208
|
+
);
|
|
209
|
+
const partialRequestForComponent = partialComponent === context.component;
|
|
210
|
+
const explicitlyRequested = partialRequestForComponent && requestedKeys.includes(key);
|
|
211
|
+
const excepted = partialRequestForComponent && exceptKeys.includes(key);
|
|
212
|
+
if (excepted) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
if (value.kind === "defer" || value.kind === "optional") {
|
|
216
|
+
return explicitlyRequested;
|
|
217
|
+
}
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
function collectMetadata(key, value, metadata) {
|
|
221
|
+
if (value.kind === "defer") {
|
|
222
|
+
const group = value.defer?.group ?? DEFAULT_DEFERRED_GROUP;
|
|
223
|
+
metadata.deferredProps[group] ??= [];
|
|
224
|
+
metadata.deferredProps[group].push(key);
|
|
225
|
+
}
|
|
226
|
+
if (value.kind !== "merge" || !value.merge) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const paths = value.merge.paths.map((path) => propPath(key, path));
|
|
230
|
+
if (value.merge.mode === "prepend") {
|
|
231
|
+
metadata.prependProps.push(...paths);
|
|
232
|
+
} else if (value.merge.mode === "deepMerge") {
|
|
233
|
+
metadata.deepMergeProps.push(...paths);
|
|
234
|
+
} else {
|
|
235
|
+
metadata.mergeProps.push(...paths);
|
|
236
|
+
}
|
|
237
|
+
metadata.matchPropsOn.push(
|
|
238
|
+
...value.merge.matchOn.map((path) => propPath(key, path))
|
|
239
|
+
);
|
|
240
|
+
if (value.merge.once) {
|
|
241
|
+
metadata.onceProps[key] = value.merge.once === true ? { prop: key } : { prop: key, ...value.merge.once };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function propPath(key, path) {
|
|
245
|
+
return path ? `${key}.${path}` : key;
|
|
246
|
+
}
|
|
247
|
+
function stripEmpty(value) {
|
|
248
|
+
const entries = Object.entries(value).filter(([key, entry]) => {
|
|
249
|
+
if (key === "props") {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
if (Array.isArray(entry)) {
|
|
253
|
+
return entry.length > 0;
|
|
254
|
+
}
|
|
255
|
+
if (entry && typeof entry === "object") {
|
|
256
|
+
return Object.keys(entry).length > 0;
|
|
257
|
+
}
|
|
258
|
+
return entry !== void 0;
|
|
259
|
+
});
|
|
260
|
+
return Object.fromEntries(entries);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// src/inertia.ts
|
|
264
|
+
function createInertia(options = {}) {
|
|
265
|
+
const rootElementId = options.rootElementId ?? "app";
|
|
266
|
+
async function resolveVersion(request) {
|
|
267
|
+
if (typeof options.version === "function") {
|
|
268
|
+
return options.version(request);
|
|
269
|
+
}
|
|
270
|
+
return options.version ?? null;
|
|
271
|
+
}
|
|
272
|
+
function resolveUrl(request) {
|
|
273
|
+
return options.resolveUrl?.(request) ?? request.originalUrl ?? request.url;
|
|
274
|
+
}
|
|
275
|
+
async function resolveShared(context) {
|
|
276
|
+
if (typeof options.share === "function") {
|
|
277
|
+
return options.share(context);
|
|
278
|
+
}
|
|
279
|
+
return options.share ?? {};
|
|
280
|
+
}
|
|
281
|
+
async function renderSsr(request, page) {
|
|
282
|
+
const ssr = options.ssr;
|
|
283
|
+
if (!ssr) {
|
|
284
|
+
return void 0;
|
|
285
|
+
}
|
|
286
|
+
const enabled = typeof ssr.enabled === "function" ? await ssr.enabled(request) : ssr.enabled ?? true;
|
|
287
|
+
if (!enabled) {
|
|
288
|
+
return void 0;
|
|
289
|
+
}
|
|
290
|
+
const controller = new AbortController();
|
|
291
|
+
const timeout = setTimeout(() => {
|
|
292
|
+
controller.abort();
|
|
293
|
+
}, ssr.timeoutMs ?? 1500);
|
|
294
|
+
try {
|
|
295
|
+
const fetcher = ssr.fetch ?? fetch;
|
|
296
|
+
const response = await fetcher(
|
|
297
|
+
ssr.url ?? "http://127.0.0.1:13714/render",
|
|
298
|
+
{
|
|
299
|
+
method: "POST",
|
|
300
|
+
headers: {
|
|
301
|
+
"Content-Type": "application/json",
|
|
302
|
+
Accept: "application/json"
|
|
303
|
+
},
|
|
304
|
+
body: JSON.stringify(page),
|
|
305
|
+
signal: controller.signal
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
if (!response.ok) {
|
|
309
|
+
throw new Error(`SSR request failed with status ${response.status}`);
|
|
310
|
+
}
|
|
311
|
+
return await response.json();
|
|
312
|
+
} catch (error) {
|
|
313
|
+
if (ssr.throwOnError) {
|
|
314
|
+
throw error;
|
|
315
|
+
}
|
|
316
|
+
return void 0;
|
|
317
|
+
} finally {
|
|
318
|
+
clearTimeout(timeout);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
async function renderRootView(request, pageObject, renderOptions) {
|
|
322
|
+
const page = serializePage(pageObject);
|
|
323
|
+
const ssr = renderOptions.ssr === false ? void 0 : await renderSsr(request, pageObject);
|
|
324
|
+
if (typeof options.rootView === "function") {
|
|
325
|
+
return options.rootView({ page, pageObject, rootElementId, ssr });
|
|
326
|
+
}
|
|
327
|
+
if (typeof options.rootView === "string") {
|
|
328
|
+
return options.rootView.replaceAll("{{ page }}", page).replaceAll("{{ rootElementId }}", rootElementId);
|
|
329
|
+
}
|
|
330
|
+
return defaultRootView({ page, pageObject, rootElementId, ssr });
|
|
331
|
+
}
|
|
332
|
+
async function render(request, component, props = {}, renderOptions = {}) {
|
|
333
|
+
const version = await resolveVersion(request);
|
|
334
|
+
const url = resolveUrl(request);
|
|
335
|
+
if (shouldReloadAssets(request, version)) {
|
|
336
|
+
return {
|
|
337
|
+
status: 409,
|
|
338
|
+
headers: {
|
|
339
|
+
"X-Inertia-Location": absoluteUrl(request, url),
|
|
340
|
+
Vary: "X-Inertia"
|
|
341
|
+
},
|
|
342
|
+
body: ""
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
const context = { request, component, url };
|
|
346
|
+
const shared = await resolveShared(context);
|
|
347
|
+
const mergedProps = { ...shared, ...props };
|
|
348
|
+
const resolved = await resolvePageProps(context, {
|
|
349
|
+
errors: {},
|
|
350
|
+
...mergedProps
|
|
351
|
+
});
|
|
352
|
+
const page = stripUndefined({
|
|
353
|
+
component,
|
|
354
|
+
props: resolved.props,
|
|
355
|
+
url,
|
|
356
|
+
version,
|
|
357
|
+
encryptHistory: renderOptions.encryptHistory,
|
|
358
|
+
clearHistory: renderOptions.clearHistory,
|
|
359
|
+
preserveFragment: renderOptions.preserveFragment,
|
|
360
|
+
mergeProps: appendMetadata(renderOptions.mergeProps, resolved.mergeProps),
|
|
361
|
+
prependProps: appendMetadata(
|
|
362
|
+
renderOptions.prependProps,
|
|
363
|
+
resolved.prependProps
|
|
364
|
+
),
|
|
365
|
+
deepMergeProps: appendMetadata(
|
|
366
|
+
renderOptions.deepMergeProps,
|
|
367
|
+
resolved.deepMergeProps
|
|
368
|
+
),
|
|
369
|
+
matchPropsOn: appendMetadata(
|
|
370
|
+
renderOptions.matchPropsOn,
|
|
371
|
+
resolved.matchPropsOn
|
|
372
|
+
),
|
|
373
|
+
scrollProps: renderOptions.scrollProps,
|
|
374
|
+
deferredProps: {
|
|
375
|
+
...resolved.deferredProps,
|
|
376
|
+
...renderOptions.deferredProps
|
|
377
|
+
},
|
|
378
|
+
rescuedProps: appendMetadata(
|
|
379
|
+
renderOptions.rescuedProps,
|
|
380
|
+
resolved.rescuedProps
|
|
381
|
+
),
|
|
382
|
+
onceProps: {
|
|
383
|
+
...resolved.onceProps,
|
|
384
|
+
...renderOptions.onceProps
|
|
385
|
+
},
|
|
386
|
+
sharedProps: Object.keys(shared)
|
|
387
|
+
});
|
|
388
|
+
if (isInertiaRequest(request)) {
|
|
389
|
+
return {
|
|
390
|
+
status: renderOptions.status ?? 200,
|
|
391
|
+
headers: {
|
|
392
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
393
|
+
"X-Inertia": "true",
|
|
394
|
+
Vary: "X-Inertia"
|
|
395
|
+
},
|
|
396
|
+
body: JSON.stringify(page)
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
return {
|
|
400
|
+
status: renderOptions.status ?? 200,
|
|
401
|
+
headers: {
|
|
402
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
403
|
+
Vary: "X-Inertia"
|
|
404
|
+
},
|
|
405
|
+
body: await renderRootView(request, page, renderOptions)
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
return {
|
|
409
|
+
render,
|
|
410
|
+
redirect,
|
|
411
|
+
location
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
function shouldReloadAssets(request, version) {
|
|
415
|
+
if (!isInertiaRequest(request) || request.method.toUpperCase() !== "GET") {
|
|
416
|
+
return false;
|
|
417
|
+
}
|
|
418
|
+
const clientVersion = requestHeader(request, "X-Inertia-Version");
|
|
419
|
+
return clientVersion !== void 0 && String(version) !== clientVersion;
|
|
420
|
+
}
|
|
421
|
+
function redirect(request, location2, status = defaultRedirectStatus(request)) {
|
|
422
|
+
return {
|
|
423
|
+
status,
|
|
424
|
+
headers: {
|
|
425
|
+
Location: location2,
|
|
426
|
+
Vary: varyHeader(void 0)
|
|
427
|
+
},
|
|
428
|
+
body: ""
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
function location(location2) {
|
|
432
|
+
return {
|
|
433
|
+
status: 409,
|
|
434
|
+
headers: {
|
|
435
|
+
"X-Inertia-Location": location2,
|
|
436
|
+
Vary: "X-Inertia"
|
|
437
|
+
},
|
|
438
|
+
body: ""
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
function defaultRedirectStatus(request) {
|
|
442
|
+
return request.method.toUpperCase() === "GET" ? 302 : 303;
|
|
443
|
+
}
|
|
444
|
+
function absoluteUrl(request, url) {
|
|
445
|
+
if (/^https?:\/\//i.test(url)) {
|
|
446
|
+
return url;
|
|
447
|
+
}
|
|
448
|
+
const host = request.host ?? requestHeader(request, "Host");
|
|
449
|
+
if (!host) {
|
|
450
|
+
return url;
|
|
451
|
+
}
|
|
452
|
+
const protocol = request.protocol ?? "http";
|
|
453
|
+
return `${protocol}://${host}${url.startsWith("/") ? url : `/${url}`}`;
|
|
454
|
+
}
|
|
455
|
+
function appendMetadata(left, right) {
|
|
456
|
+
const merged = [...left ?? [], ...right ?? []];
|
|
457
|
+
return merged.length > 0 ? merged : void 0;
|
|
458
|
+
}
|
|
459
|
+
function stripUndefined(value) {
|
|
460
|
+
return Object.fromEntries(
|
|
461
|
+
Object.entries(value).filter(([key, entry]) => {
|
|
462
|
+
if (entry === void 0) {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
if (Array.isArray(entry)) {
|
|
466
|
+
return entry.length > 0;
|
|
467
|
+
}
|
|
468
|
+
if (key !== "props" && entry && typeof entry === "object" && Object.keys(entry).length === 0) {
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
return true;
|
|
472
|
+
})
|
|
473
|
+
);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// src/auth.ts
|
|
477
|
+
function inertiaAuth(config) {
|
|
478
|
+
return config;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// src/session.ts
|
|
482
|
+
function validationError(errors, options = {}) {
|
|
483
|
+
return {
|
|
484
|
+
errors,
|
|
485
|
+
bag: options.bag
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
export {
|
|
489
|
+
always,
|
|
490
|
+
createInertia,
|
|
491
|
+
defaultRootView,
|
|
492
|
+
defer,
|
|
493
|
+
escapeAttribute,
|
|
494
|
+
getHeader,
|
|
495
|
+
inertiaAuth,
|
|
496
|
+
isInertiaPropWrapper,
|
|
497
|
+
isInertiaRequest,
|
|
498
|
+
merge,
|
|
499
|
+
optional,
|
|
500
|
+
parseCommaHeader,
|
|
501
|
+
requestHeader,
|
|
502
|
+
resolvePageProps,
|
|
503
|
+
resolveProps,
|
|
504
|
+
selectPartialProps,
|
|
505
|
+
serializePage,
|
|
506
|
+
validationError,
|
|
507
|
+
varyHeader
|
|
508
|
+
};
|
|
509
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/html.ts","../src/headers.ts","../src/props.ts","../src/inertia.ts","../src/auth.ts","../src/session.ts"],"sourcesContent":["import type { InertiaPage, RootViewContext } from \"./types.js\";\n\nexport function serializePage(page: InertiaPage): string {\n return JSON.stringify(page).replace(/</g, \"\\\\u003c\");\n}\n\nexport function defaultRootView(context: RootViewContext): string {\n const head = context.ssr?.head.join(\"\\n\") ?? \"\";\n const body = context.ssr?.body ?? \"\";\n\n return `<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n ${head}\n </head>\n <body>\n <script data-page=\"app\" type=\"application/json\">${context.page}</script>\n <div id=\"${escapeAttribute(context.rootElementId)}\">${body}</div>\n </body>\n</html>`;\n}\n\nexport function escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","import type { HeadersLike, InertiaRequest } from \"./types.js\";\n\nexport function getHeader(\n headers: HeadersLike,\n name: string,\n): string | undefined {\n const wanted = name.toLowerCase();\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() !== wanted || value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n return value[0];\n }\n\n return String(value);\n }\n\n return undefined;\n}\n\nexport function requestHeader(\n request: InertiaRequest,\n name: string,\n): string | undefined {\n return getHeader(request.headers, name);\n}\n\nexport function isInertiaRequest(request: InertiaRequest): boolean {\n return requestHeader(request, \"X-Inertia\") === \"true\";\n}\n\nexport function varyHeader(value?: string, addition = \"X-Inertia\"): string {\n if (!value) {\n return addition;\n }\n\n const parts = value.split(\",\").map((part) => part.trim().toLowerCase());\n return parts.includes(addition.toLowerCase())\n ? value\n : `${value}, ${addition}`;\n}\n\nexport function parseCommaHeader(value?: string): string[] {\n if (!value) {\n return [];\n }\n\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n","import { parseCommaHeader, requestHeader } from \"./headers.js\";\nimport type {\n DeferredOptions,\n InertiaPropWrapper,\n InputProps,\n MergeMetadata,\n OnceOptions,\n PageProps,\n PropSource,\n RenderContext,\n} from \"./types.js\";\n\nexport interface ResolvedProps {\n props: PageProps;\n deferredProps?: Record<string, string[]>;\n mergeProps?: string[];\n prependProps?: string[];\n deepMergeProps?: string[];\n matchPropsOn?: string[];\n onceProps?: Record<string, unknown>;\n rescuedProps?: string[];\n}\n\nconst DEFAULT_DEFERRED_GROUP = \"default\";\n\nexport function always<T>(value: PropSource<T>): InertiaPropWrapper<T> {\n return wrapper(\"always\", value);\n}\n\nexport function optional<T>(value: PropSource<T>): InertiaPropWrapper<T> {\n return wrapper(\"optional\", value);\n}\n\nexport function defer<T>(\n value: PropSource<T>,\n options: DeferredOptions = {},\n): InertiaPropWrapper<T> {\n return wrapper(\"defer\", value, { defer: options });\n}\n\nexport interface MergeBuilder<T> extends InertiaPropWrapper<T> {\n append(path?: string): MergeBuilder<T>;\n prepend(path?: string): MergeBuilder<T>;\n deepMerge(path?: string): MergeBuilder<T>;\n matchOn(path: string): MergeBuilder<T>;\n once(options?: OnceOptions): MergeBuilder<T>;\n}\n\nexport function merge<T>(value: PropSource<T>): MergeBuilder<T> {\n return mergeWrapper(value);\n}\n\nexport function isInertiaPropWrapper(\n value: unknown,\n): value is InertiaPropWrapper {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"__inertiaProp\" in value &&\n value.__inertiaProp === true\n );\n}\n\nexport function selectPartialProps(\n context: RenderContext,\n props: InputProps,\n): InputProps {\n const partialComponent = requestHeader(\n context.request,\n \"X-Inertia-Partial-Component\",\n );\n\n if (partialComponent !== context.component) {\n return props;\n }\n\n const except = parseCommaHeader(\n requestHeader(context.request, \"X-Inertia-Partial-Except\"),\n );\n if (except.length > 0) {\n return Object.fromEntries(\n Object.entries(props).filter(([key]) => !except.includes(key)),\n );\n }\n\n const only = parseCommaHeader(\n requestHeader(context.request, \"X-Inertia-Partial-Data\"),\n );\n if (only.length > 0) {\n return Object.fromEntries(\n Object.entries(props).filter(([key]) => only.includes(key)),\n );\n }\n\n return props;\n}\n\nexport async function resolveProps(\n context: RenderContext,\n props: InputProps,\n): Promise<PageProps> {\n return (await resolvePageProps(context, props)).props;\n}\n\nexport async function resolvePageProps(\n context: RenderContext,\n props: InputProps,\n): Promise<ResolvedProps> {\n const selected = selectPartialProps(context, props);\n const output: PageProps = {};\n const deferredProps: Record<string, string[]> = {};\n const mergeProps: string[] = [];\n const prependProps: string[] = [];\n const deepMergeProps: string[] = [];\n const matchPropsOn: string[] = [];\n const onceProps: Record<string, unknown> = {};\n const rescuedProps: string[] = [];\n\n for (const [key, value] of Object.entries(selected)) {\n if (isInertiaPropWrapper(value)) {\n collectMetadata(key, value, {\n deferredProps,\n mergeProps,\n prependProps,\n deepMergeProps,\n matchPropsOn,\n onceProps,\n });\n\n if (!shouldResolveWrapper(context, key, value)) {\n continue;\n }\n\n try {\n output[key] = await resolveValue(context, value.value);\n } catch (error) {\n if (value.kind === \"defer\" && value.defer?.rescue) {\n rescuedProps.push(key);\n continue;\n }\n\n throw error;\n }\n\n continue;\n }\n\n output[key] = await resolveValue(context, value);\n }\n\n return stripEmpty({\n props: output,\n deferredProps,\n mergeProps,\n prependProps,\n deepMergeProps,\n matchPropsOn,\n onceProps,\n rescuedProps,\n });\n}\n\nfunction wrapper<T>(\n kind: InertiaPropWrapper<T>[\"kind\"],\n value: PropSource<T>,\n options: Partial<InertiaPropWrapper<T>> = {},\n): InertiaPropWrapper<T> {\n return {\n __inertiaProp: true,\n kind,\n value,\n ...options,\n };\n}\n\nfunction mergeWrapper<T>(value: PropSource<T>): MergeBuilder<T> {\n const prop = wrapper(\"merge\", value, {\n merge: {\n paths: [\"\"],\n matchOn: [],\n },\n }) as MergeBuilder<T>;\n\n prop.append = (path = \"\") => setMergeMode(prop, \"append\", path);\n prop.prepend = (path = \"\") => setMergeMode(prop, \"prepend\", path);\n prop.deepMerge = (path = \"\") => setMergeMode(prop, \"deepMerge\", path);\n prop.matchOn = (path: string) => {\n prop.merge?.matchOn.push(path);\n return prop;\n };\n prop.once = (options?: OnceOptions) => {\n if (prop.merge) {\n prop.merge.once = options ?? true;\n }\n return prop;\n };\n\n return prop;\n}\n\nfunction setMergeMode<T>(\n prop: MergeBuilder<T>,\n mode: NonNullable<MergeMetadata[\"mode\"]>,\n path: string,\n): MergeBuilder<T> {\n if (prop.merge) {\n prop.merge.mode = mode;\n prop.merge.paths = [path];\n }\n\n return prop;\n}\n\nasync function resolveValue(\n context: RenderContext,\n value: PropSource | unknown,\n): Promise<unknown> {\n if (typeof value === \"function\") {\n return value(context);\n }\n\n return value;\n}\n\nfunction shouldResolveWrapper(\n context: RenderContext,\n key: string,\n value: InertiaPropWrapper,\n): boolean {\n if (value.kind === \"always\" || value.kind === \"merge\") {\n return true;\n }\n\n const partialComponent = requestHeader(\n context.request,\n \"X-Inertia-Partial-Component\",\n );\n const requestedKeys = parseCommaHeader(\n requestHeader(context.request, \"X-Inertia-Partial-Data\"),\n );\n const exceptKeys = parseCommaHeader(\n requestHeader(context.request, \"X-Inertia-Partial-Except\"),\n );\n const partialRequestForComponent = partialComponent === context.component;\n const explicitlyRequested =\n partialRequestForComponent && requestedKeys.includes(key);\n const excepted = partialRequestForComponent && exceptKeys.includes(key);\n\n if (excepted) {\n return false;\n }\n\n if (value.kind === \"defer\" || value.kind === \"optional\") {\n return explicitlyRequested;\n }\n\n return true;\n}\n\nfunction collectMetadata(\n key: string,\n value: InertiaPropWrapper,\n metadata: {\n deferredProps: Record<string, string[]>;\n mergeProps: string[];\n prependProps: string[];\n deepMergeProps: string[];\n matchPropsOn: string[];\n onceProps: Record<string, unknown>;\n },\n): void {\n if (value.kind === \"defer\") {\n const group = value.defer?.group ?? DEFAULT_DEFERRED_GROUP;\n metadata.deferredProps[group] ??= [];\n metadata.deferredProps[group].push(key);\n }\n\n if (value.kind !== \"merge\" || !value.merge) {\n return;\n }\n\n const paths = value.merge.paths.map((path) => propPath(key, path));\n\n if (value.merge.mode === \"prepend\") {\n metadata.prependProps.push(...paths);\n } else if (value.merge.mode === \"deepMerge\") {\n metadata.deepMergeProps.push(...paths);\n } else {\n metadata.mergeProps.push(...paths);\n }\n\n metadata.matchPropsOn.push(\n ...value.merge.matchOn.map((path) => propPath(key, path)),\n );\n\n if (value.merge.once) {\n metadata.onceProps[key] =\n value.merge.once === true\n ? { prop: key }\n : { prop: key, ...value.merge.once };\n }\n}\n\nfunction propPath(key: string, path: string): string {\n return path ? `${key}.${path}` : key;\n}\n\nfunction stripEmpty<T extends ResolvedProps>(value: T): T {\n const entries = Object.entries(value).filter(([key, entry]) => {\n if (key === \"props\") {\n return true;\n }\n\n if (Array.isArray(entry)) {\n return entry.length > 0;\n }\n\n if (entry && typeof entry === \"object\") {\n return Object.keys(entry).length > 0;\n }\n\n return entry !== undefined;\n });\n\n return Object.fromEntries(entries) as T;\n}\n","import { defaultRootView, serializePage } from \"./html.js\";\nimport { isInertiaRequest, requestHeader, varyHeader } from \"./headers.js\";\nimport { resolvePageProps } from \"./props.js\";\nimport {\n type CreateInertiaOptions,\n type InertiaInstance,\n type InertiaPage,\n type InertiaRequest,\n type InputProps,\n type ProtocolResponse,\n type RenderContext,\n type RenderOptions,\n type SsrResult,\n type VersionValue,\n} from \"./types.js\";\n\nexport function createInertia(\n options: CreateInertiaOptions = {},\n): InertiaInstance {\n const rootElementId = options.rootElementId ?? \"app\";\n\n async function resolveVersion(\n request: InertiaRequest,\n ): Promise<VersionValue> {\n if (typeof options.version === \"function\") {\n return options.version(request);\n }\n\n return options.version ?? null;\n }\n\n function resolveUrl(request: InertiaRequest): string {\n return options.resolveUrl?.(request) ?? request.originalUrl ?? request.url;\n }\n\n async function resolveShared(context: RenderContext): Promise<InputProps> {\n if (typeof options.share === \"function\") {\n return options.share(context);\n }\n\n return options.share ?? {};\n }\n\n async function renderSsr(\n request: InertiaRequest,\n page: InertiaPage,\n ): Promise<SsrResult | undefined> {\n const ssr = options.ssr;\n\n if (!ssr) {\n return undefined;\n }\n\n const enabled =\n typeof ssr.enabled === \"function\"\n ? await ssr.enabled(request)\n : (ssr.enabled ?? true);\n\n if (!enabled) {\n return undefined;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => {\n controller.abort();\n }, ssr.timeoutMs ?? 1500);\n\n try {\n const fetcher = ssr.fetch ?? fetch;\n const response = await fetcher(\n ssr.url ?? \"http://127.0.0.1:13714/render\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify(page),\n signal: controller.signal,\n },\n );\n\n if (!response.ok) {\n throw new Error(`SSR request failed with status ${response.status}`);\n }\n\n return (await response.json()) as SsrResult;\n } catch (error) {\n if (ssr.throwOnError) {\n throw error;\n }\n\n return undefined;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n async function renderRootView(\n request: InertiaRequest,\n pageObject: InertiaPage,\n renderOptions: RenderOptions,\n ): Promise<string> {\n const page = serializePage(pageObject);\n const ssr =\n renderOptions.ssr === false\n ? undefined\n : await renderSsr(request, pageObject);\n\n if (typeof options.rootView === \"function\") {\n return options.rootView({ page, pageObject, rootElementId, ssr });\n }\n\n if (typeof options.rootView === \"string\") {\n return options.rootView\n .replaceAll(\"{{ page }}\", page)\n .replaceAll(\"{{ rootElementId }}\", rootElementId);\n }\n\n return defaultRootView({ page, pageObject, rootElementId, ssr });\n }\n\n async function render(\n request: InertiaRequest,\n component: string,\n props: InputProps = {},\n renderOptions: RenderOptions = {},\n ): Promise<ProtocolResponse> {\n const version = await resolveVersion(request);\n const url = resolveUrl(request);\n\n if (shouldReloadAssets(request, version)) {\n return {\n status: 409,\n headers: {\n \"X-Inertia-Location\": absoluteUrl(request, url),\n Vary: \"X-Inertia\",\n },\n body: \"\",\n };\n }\n\n const context: RenderContext = { request, component, url };\n const shared = await resolveShared(context);\n const mergedProps = { ...shared, ...props };\n const resolved = await resolvePageProps(context, {\n errors: {},\n ...mergedProps,\n });\n\n const page: InertiaPage = stripUndefined({\n component,\n props: resolved.props,\n url,\n version,\n encryptHistory: renderOptions.encryptHistory,\n clearHistory: renderOptions.clearHistory,\n preserveFragment: renderOptions.preserveFragment,\n mergeProps: appendMetadata(renderOptions.mergeProps, resolved.mergeProps),\n prependProps: appendMetadata(\n renderOptions.prependProps,\n resolved.prependProps,\n ),\n deepMergeProps: appendMetadata(\n renderOptions.deepMergeProps,\n resolved.deepMergeProps,\n ),\n matchPropsOn: appendMetadata(\n renderOptions.matchPropsOn,\n resolved.matchPropsOn,\n ),\n scrollProps: renderOptions.scrollProps,\n deferredProps: {\n ...resolved.deferredProps,\n ...renderOptions.deferredProps,\n },\n rescuedProps: appendMetadata(\n renderOptions.rescuedProps,\n resolved.rescuedProps,\n ),\n onceProps: {\n ...resolved.onceProps,\n ...renderOptions.onceProps,\n },\n sharedProps: Object.keys(shared),\n });\n\n if (isInertiaRequest(request)) {\n return {\n status: renderOptions.status ?? 200,\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-Inertia\": \"true\",\n Vary: \"X-Inertia\",\n },\n body: JSON.stringify(page),\n };\n }\n\n return {\n status: renderOptions.status ?? 200,\n headers: {\n \"Content-Type\": \"text/html; charset=utf-8\",\n Vary: \"X-Inertia\",\n },\n body: await renderRootView(request, page, renderOptions),\n };\n }\n\n return {\n render,\n redirect,\n location,\n };\n}\n\nfunction shouldReloadAssets(\n request: InertiaRequest,\n version: VersionValue,\n): boolean {\n if (!isInertiaRequest(request) || request.method.toUpperCase() !== \"GET\") {\n return false;\n }\n\n const clientVersion = requestHeader(request, \"X-Inertia-Version\");\n return clientVersion !== undefined && String(version) !== clientVersion;\n}\n\nfunction redirect(\n request: InertiaRequest,\n location: string,\n status = defaultRedirectStatus(request),\n): ProtocolResponse {\n return {\n status,\n headers: {\n Location: location,\n Vary: varyHeader(undefined),\n },\n body: \"\",\n };\n}\n\nfunction location(location: string): ProtocolResponse {\n return {\n status: 409,\n headers: {\n \"X-Inertia-Location\": location,\n Vary: \"X-Inertia\",\n },\n body: \"\",\n };\n}\n\nfunction defaultRedirectStatus(request: InertiaRequest): number {\n return request.method.toUpperCase() === \"GET\" ? 302 : 303;\n}\n\nfunction absoluteUrl(request: InertiaRequest, url: string): string {\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n\n const host = request.host ?? requestHeader(request, \"Host\");\n if (!host) {\n return url;\n }\n\n const protocol = request.protocol ?? \"http\";\n return `${protocol}://${host}${url.startsWith(\"/\") ? url : `/${url}`}`;\n}\n\nfunction appendMetadata<T>(left?: T[], right?: T[]): T[] | undefined {\n const merged = [...(left ?? []), ...(right ?? [])];\n return merged.length > 0 ? merged : undefined;\n}\n\nfunction stripUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([key, entry]) => {\n if (entry === undefined) {\n return false;\n }\n\n if (Array.isArray(entry)) {\n return entry.length > 0;\n }\n\n if (\n key !== \"props\" &&\n entry &&\n typeof entry === \"object\" &&\n Object.keys(entry).length === 0\n ) {\n return false;\n }\n\n return true;\n }),\n ) as T;\n}\n","import type { MaybePromise } from \"./types.js\";\n\nexport interface AuthConfig<TRequest, TUser, TSerialized = TUser> {\n getUser(request: TRequest): MaybePromise<TUser | null>;\n login(request: TRequest, user: TUser): MaybePromise<void>;\n logout(request: TRequest): MaybePromise<void>;\n serializeUser?(user: TUser): MaybePromise<TSerialized>;\n redirectTo?: string;\n home?: string;\n}\n\nexport interface AuthRuntime<TUser, TSerialized = TUser> {\n user(): Promise<TUser | null>;\n check(): Promise<boolean>;\n login(user: TUser): Promise<void>;\n logout(): Promise<void>;\n serializedUser(): Promise<TSerialized | null>;\n}\n\nexport function inertiaAuth<TRequest, TUser, TSerialized = TUser>(\n config: AuthConfig<TRequest, TUser, TSerialized>,\n): AuthConfig<TRequest, TUser, TSerialized> {\n return config;\n}\n","import type { MaybePromise } from \"./types.js\";\n\nexport interface SessionStore {\n get<T = unknown>(key: string): MaybePromise<T | undefined>;\n set<T = unknown>(key: string, value: T): MaybePromise<void>;\n pull<T = unknown>(key: string): MaybePromise<T | undefined>;\n flash<T = unknown>(key: string, value: T): MaybePromise<void>;\n reflash(keys?: string[]): MaybePromise<void>;\n}\n\nexport type ValidationErrorInput<TValue = string | string[]> = Record<\n string,\n TValue | TValue[]\n>;\n\nexport interface ValidationErrorOptions {\n bag?: string;\n}\n\nexport interface ValidationErrorPayload {\n errors: ValidationErrorInput;\n bag?: string;\n}\n\nexport function validationError(\n errors: ValidationErrorInput,\n options: ValidationErrorOptions = {},\n): ValidationErrorPayload {\n return {\n errors,\n bag: options.bag,\n };\n}\n"],"mappings":"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","names":["location"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@inertia-node/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic Inertia.js v3 protocol helpers for Node.js.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Inertia Node Adapter contributors",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/inertia-node/inertia-node-adapter.git",
|
|
11
|
+
"directory": "packages/core"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/inertia-node/inertia-node-adapter#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/inertia-node/inertia-node-adapter/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"inertia",
|
|
19
|
+
"inertiajs",
|
|
20
|
+
"node",
|
|
21
|
+
"typescript",
|
|
22
|
+
"protocol"
|
|
23
|
+
],
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist"
|
|
35
|
+
],
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=20"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsup src/index.ts --format esm --dts --sourcemap",
|
|
41
|
+
"clean": "rm -rf dist"
|
|
42
|
+
}
|
|
43
|
+
}
|