@teyik0/furin 0.1.0-alpha.6 → 0.1.0-alpha.7
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/dist/build/index.js +30 -21
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +40 -29
- package/dist/client.d.ts +8 -5
- package/dist/furin.js +389 -31
- package/dist/link.js +375 -14
- package/dist/router.js +1 -1
- package/package.json +6 -8
- package/src/adapter/bun.ts +11 -7
- package/src/build/client.ts +7 -0
- package/src/build/entry-template.ts +7 -3
- package/src/build/hydrate.ts +3 -1
- package/src/build/shared.ts +7 -3
- package/src/cli/index.ts +1 -0
- package/src/client.ts +10 -6
package/dist/build/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/build/index.ts
|
|
3
3
|
import { existsSync as existsSync8, writeFileSync as writeFileSync7 } from "fs";
|
|
4
|
-
import { join as join9, relative as relative3, resolve as
|
|
4
|
+
import { join as join9, relative as relative3, resolve as resolve2 } from "path";
|
|
5
5
|
|
|
6
6
|
// src/adapter/bun.ts
|
|
7
7
|
import { existsSync as existsSync6, rmSync as rmSync2, writeFileSync as writeFileSync6 } from "fs";
|
|
8
|
-
import { join as join7, resolve
|
|
8
|
+
import { dirname as dirname2, join as join7, resolve } from "path";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
9
10
|
|
|
10
11
|
// src/build/client.ts
|
|
11
12
|
import { existsSync as existsSync4, mkdirSync as mkdirSync3, writeFileSync as writeFileSync3 } from "fs";
|
|
@@ -1547,7 +1548,9 @@ const _match = routes.find((r) => r.regex.test(pathname));
|
|
|
1547
1548
|
} else {
|
|
1548
1549
|
log.error({ action: "hydrate_no_match", pathname });
|
|
1549
1550
|
}
|
|
1550
|
-
})()
|
|
1551
|
+
})().catch((err: unknown) => {
|
|
1552
|
+
log.error({ action: "hydrate_failed", pathname, error: String(err) });
|
|
1553
|
+
});
|
|
1551
1554
|
`;
|
|
1552
1555
|
}
|
|
1553
1556
|
function writeDevFiles(routes, { outDir, rootLayout }, projectRoot) {
|
|
@@ -1572,9 +1575,9 @@ function writeDevFiles(routes, { outDir, rootLayout }, projectRoot) {
|
|
|
1572
1575
|
|
|
1573
1576
|
// src/build/shared.ts
|
|
1574
1577
|
import { cpSync, existsSync as existsSync3, mkdirSync as mkdirSync2, readdirSync, rmSync } from "fs";
|
|
1575
|
-
import { join as join3, relative
|
|
1576
|
-
var CLIENT_MODULE_PATH =
|
|
1577
|
-
var LINK_MODULE_PATH =
|
|
1578
|
+
import { join as join3, relative } from "path";
|
|
1579
|
+
var CLIENT_MODULE_PATH = new URL(import.meta.resolve("@teyik0/furin/client")).pathname;
|
|
1580
|
+
var LINK_MODULE_PATH = new URL(import.meta.resolve("@teyik0/furin/link")).pathname;
|
|
1578
1581
|
function ensureDir(path) {
|
|
1579
1582
|
if (!existsSync3(path)) {
|
|
1580
1583
|
mkdirSync2(path, { recursive: true });
|
|
@@ -1676,6 +1679,10 @@ ${transformed}`;
|
|
|
1676
1679
|
splitting: true,
|
|
1677
1680
|
minify: true,
|
|
1678
1681
|
sourcemap: "linked",
|
|
1682
|
+
naming: {
|
|
1683
|
+
entry: "[dir]/[name]-[hash].[ext]",
|
|
1684
|
+
chunk: "[name]-[hash].[ext]"
|
|
1685
|
+
},
|
|
1679
1686
|
publicPath: "/_client/",
|
|
1680
1687
|
plugins: plugins ? [...plugins, transformPlugin] : [transformPlugin],
|
|
1681
1688
|
alias: {
|
|
@@ -1706,9 +1713,10 @@ import { existsSync as existsSync5, writeFileSync as writeFileSync4 } from "fs";
|
|
|
1706
1713
|
import { join as join5, relative as relative2 } from "path";
|
|
1707
1714
|
|
|
1708
1715
|
// src/build/entry-template.ts
|
|
1709
|
-
import {
|
|
1710
|
-
var
|
|
1711
|
-
var
|
|
1716
|
+
import { dirname } from "path";
|
|
1717
|
+
var _pkgSrcDir = dirname(new URL(import.meta.resolve("@teyik0/furin")).pathname);
|
|
1718
|
+
var INTERNAL_MODULE_PATH = `${_pkgSrcDir}/internal.ts`;
|
|
1719
|
+
var RUNTIME_ENV_MODULE_PATH = `${_pkgSrcDir}/runtime-env.ts`;
|
|
1712
1720
|
function buildEntrySource(options) {
|
|
1713
1721
|
const { buildId, headerComment, rootPath, routes, serverEntry } = options;
|
|
1714
1722
|
let { extraImports, extraContext } = options;
|
|
@@ -1840,13 +1848,14 @@ function generateServerRoutesEntry(options) {
|
|
|
1840
1848
|
}
|
|
1841
1849
|
|
|
1842
1850
|
// src/adapter/bun.ts
|
|
1851
|
+
var _pkgSrcDir2 = dirname2(fileURLToPath(import.meta.resolve("@teyik0/furin")));
|
|
1843
1852
|
var BUILD_ID_INPUT_PATHS = [
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1853
|
+
`${_pkgSrcDir2}/build/compile-entry.ts`,
|
|
1854
|
+
`${_pkgSrcDir2}/build/entry-template.ts`,
|
|
1855
|
+
`${_pkgSrcDir2}/build/server-routes-entry.ts`,
|
|
1856
|
+
`${_pkgSrcDir2}/render/index.ts`,
|
|
1857
|
+
`${_pkgSrcDir2}/render/shell.ts`,
|
|
1858
|
+
`${_pkgSrcDir2}/router.ts`
|
|
1850
1859
|
];
|
|
1851
1860
|
async function createBuildFingerprint(entryChunk, cssChunks, routes, rootPath, serverEntry) {
|
|
1852
1861
|
const fingerprintPaths = new Set([rootPath, ...routes.map((route) => route.path)]);
|
|
@@ -1873,7 +1882,7 @@ async function buildBunTarget(routes, rootDir, buildRoot, rootPath, serverEntry,
|
|
|
1873
1882
|
}
|
|
1874
1883
|
const target = "bun";
|
|
1875
1884
|
const targetManifest = buildTargetManifest(rootDir, buildRoot, target, serverEntry);
|
|
1876
|
-
const targetDir =
|
|
1885
|
+
const targetDir = resolve(rootDir, targetManifest.targetDir);
|
|
1877
1886
|
rmSync2(targetDir, { force: true, recursive: true });
|
|
1878
1887
|
ensureDir(targetDir);
|
|
1879
1888
|
const { entryChunk, cssChunks } = await buildClient(routes, {
|
|
@@ -2237,25 +2246,25 @@ function resolvePagesDirFromServer(serverEntry, rootDir) {
|
|
|
2237
2246
|
const detected = scanFurinInstances(serverEntry);
|
|
2238
2247
|
if (detected.length === 0)
|
|
2239
2248
|
return null;
|
|
2240
|
-
return
|
|
2249
|
+
return resolve2(rootDir, detected[0]);
|
|
2241
2250
|
}
|
|
2242
2251
|
async function buildApp(options) {
|
|
2243
|
-
const rootDir =
|
|
2252
|
+
const rootDir = resolve2(options.rootDir ?? process.cwd());
|
|
2244
2253
|
const buildRoot = join9(rootDir, BUILD_OUTPUT_DIR);
|
|
2245
2254
|
const serverEntry = (() => {
|
|
2246
2255
|
if (options.serverEntry) {
|
|
2247
|
-
const resolved =
|
|
2256
|
+
const resolved = resolve2(rootDir, options.serverEntry);
|
|
2248
2257
|
if (existsSync8(resolved))
|
|
2249
2258
|
return resolved;
|
|
2250
2259
|
}
|
|
2251
|
-
const serverEntry2 =
|
|
2260
|
+
const serverEntry2 = resolve2(rootDir, "src/server.ts");
|
|
2252
2261
|
if (!existsSync8(serverEntry2)) {
|
|
2253
2262
|
throw new Error("[furin] Entrypoint server.ts not found");
|
|
2254
2263
|
}
|
|
2255
2264
|
return serverEntry2;
|
|
2256
2265
|
})();
|
|
2257
2266
|
const rawPagesDir = options.pagesDir ?? resolvePagesDirFromServer(serverEntry, rootDir) ?? "src/pages";
|
|
2258
|
-
const pagesDir =
|
|
2267
|
+
const pagesDir = resolve2(rootDir, rawPagesDir);
|
|
2259
2268
|
const requestedTargets = options.target === "all" ? [...IMPLEMENTED_TARGETS] : [options.target].map((target) => {
|
|
2260
2269
|
if (!BUILD_TARGETS.includes(target)) {
|
|
2261
2270
|
throw new Error(`[furin] Unsupported build target "${target}"`);
|
package/dist/cli/index.d.ts
CHANGED
package/dist/cli/index.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
1
2
|
// @bun
|
|
3
|
+
|
|
2
4
|
// src/cli/index.ts
|
|
3
5
|
import { existsSync as existsSync8 } from "fs";
|
|
4
|
-
import { resolve as
|
|
6
|
+
import { resolve as resolve4 } from "path";
|
|
5
7
|
import { parseArgs } from "util";
|
|
6
8
|
|
|
7
9
|
// src/build/index.ts
|
|
8
10
|
import { existsSync as existsSync6, writeFileSync as writeFileSync5 } from "fs";
|
|
9
|
-
import { join as join7, relative as relative3, resolve as
|
|
11
|
+
import { join as join7, relative as relative3, resolve as resolve2 } from "path";
|
|
10
12
|
|
|
11
13
|
// src/adapter/bun.ts
|
|
12
14
|
import { existsSync as existsSync4, rmSync as rmSync2, writeFileSync as writeFileSync4 } from "fs";
|
|
13
|
-
import { join as join5, resolve
|
|
15
|
+
import { dirname as dirname2, join as join5, resolve } from "path";
|
|
16
|
+
import { fileURLToPath } from "url";
|
|
14
17
|
|
|
15
18
|
// src/build/client.ts
|
|
16
19
|
import { existsSync as existsSync2, mkdirSync as mkdirSync2, writeFileSync } from "fs";
|
|
@@ -1468,15 +1471,17 @@ const _match = routes.find((r) => r.regex.test(pathname));
|
|
|
1468
1471
|
} else {
|
|
1469
1472
|
log.error({ action: "hydrate_no_match", pathname });
|
|
1470
1473
|
}
|
|
1471
|
-
})()
|
|
1474
|
+
})().catch((err: unknown) => {
|
|
1475
|
+
log.error({ action: "hydrate_failed", pathname, error: String(err) });
|
|
1476
|
+
});
|
|
1472
1477
|
`;
|
|
1473
1478
|
}
|
|
1474
1479
|
|
|
1475
1480
|
// src/build/shared.ts
|
|
1476
1481
|
import { cpSync, existsSync, mkdirSync, readdirSync, rmSync } from "fs";
|
|
1477
|
-
import { join, relative
|
|
1478
|
-
var CLIENT_MODULE_PATH =
|
|
1479
|
-
var LINK_MODULE_PATH =
|
|
1482
|
+
import { join, relative } from "path";
|
|
1483
|
+
var CLIENT_MODULE_PATH = new URL(import.meta.resolve("@teyik0/furin/client")).pathname;
|
|
1484
|
+
var LINK_MODULE_PATH = new URL(import.meta.resolve("@teyik0/furin/link")).pathname;
|
|
1480
1485
|
function ensureDir(path) {
|
|
1481
1486
|
if (!existsSync(path)) {
|
|
1482
1487
|
mkdirSync(path, { recursive: true });
|
|
@@ -1578,6 +1583,10 @@ ${transformed}`;
|
|
|
1578
1583
|
splitting: true,
|
|
1579
1584
|
minify: true,
|
|
1580
1585
|
sourcemap: "linked",
|
|
1586
|
+
naming: {
|
|
1587
|
+
entry: "[dir]/[name]-[hash].[ext]",
|
|
1588
|
+
chunk: "[name]-[hash].[ext]"
|
|
1589
|
+
},
|
|
1581
1590
|
publicPath: "/_client/",
|
|
1582
1591
|
plugins: plugins ? [...plugins, transformPlugin] : [transformPlugin],
|
|
1583
1592
|
alias: {
|
|
@@ -1608,9 +1617,10 @@ import { existsSync as existsSync3, writeFileSync as writeFileSync2 } from "fs";
|
|
|
1608
1617
|
import { join as join3, relative as relative2 } from "path";
|
|
1609
1618
|
|
|
1610
1619
|
// src/build/entry-template.ts
|
|
1611
|
-
import {
|
|
1612
|
-
var
|
|
1613
|
-
var
|
|
1620
|
+
import { dirname } from "path";
|
|
1621
|
+
var _pkgSrcDir = dirname(new URL(import.meta.resolve("@teyik0/furin")).pathname);
|
|
1622
|
+
var INTERNAL_MODULE_PATH = `${_pkgSrcDir}/internal.ts`;
|
|
1623
|
+
var RUNTIME_ENV_MODULE_PATH = `${_pkgSrcDir}/runtime-env.ts`;
|
|
1614
1624
|
function buildEntrySource(options) {
|
|
1615
1625
|
const { buildId, headerComment, rootPath, routes, serverEntry } = options;
|
|
1616
1626
|
let { extraImports, extraContext } = options;
|
|
@@ -1742,13 +1752,14 @@ function generateServerRoutesEntry(options) {
|
|
|
1742
1752
|
}
|
|
1743
1753
|
|
|
1744
1754
|
// src/adapter/bun.ts
|
|
1755
|
+
var _pkgSrcDir2 = dirname2(fileURLToPath(import.meta.resolve("@teyik0/furin")));
|
|
1745
1756
|
var BUILD_ID_INPUT_PATHS = [
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1757
|
+
`${_pkgSrcDir2}/build/compile-entry.ts`,
|
|
1758
|
+
`${_pkgSrcDir2}/build/entry-template.ts`,
|
|
1759
|
+
`${_pkgSrcDir2}/build/server-routes-entry.ts`,
|
|
1760
|
+
`${_pkgSrcDir2}/render/index.ts`,
|
|
1761
|
+
`${_pkgSrcDir2}/render/shell.ts`,
|
|
1762
|
+
`${_pkgSrcDir2}/router.ts`
|
|
1752
1763
|
];
|
|
1753
1764
|
async function createBuildFingerprint(entryChunk, cssChunks, routes, rootPath, serverEntry) {
|
|
1754
1765
|
const fingerprintPaths = new Set([rootPath, ...routes.map((route) => route.path)]);
|
|
@@ -1775,7 +1786,7 @@ async function buildBunTarget(routes, rootDir, buildRoot, rootPath, serverEntry,
|
|
|
1775
1786
|
}
|
|
1776
1787
|
const target = "bun";
|
|
1777
1788
|
const targetManifest = buildTargetManifest(rootDir, buildRoot, target, serverEntry);
|
|
1778
|
-
const targetDir =
|
|
1789
|
+
const targetDir = resolve(rootDir, targetManifest.targetDir);
|
|
1779
1790
|
rmSync2(targetDir, { force: true, recursive: true });
|
|
1780
1791
|
ensureDir(targetDir);
|
|
1781
1792
|
const { entryChunk, cssChunks } = await buildClient(routes, {
|
|
@@ -2139,25 +2150,25 @@ function resolvePagesDirFromServer(serverEntry, rootDir) {
|
|
|
2139
2150
|
const detected = scanFurinInstances(serverEntry);
|
|
2140
2151
|
if (detected.length === 0)
|
|
2141
2152
|
return null;
|
|
2142
|
-
return
|
|
2153
|
+
return resolve2(rootDir, detected[0]);
|
|
2143
2154
|
}
|
|
2144
2155
|
async function buildApp(options) {
|
|
2145
|
-
const rootDir =
|
|
2156
|
+
const rootDir = resolve2(options.rootDir ?? process.cwd());
|
|
2146
2157
|
const buildRoot = join7(rootDir, BUILD_OUTPUT_DIR);
|
|
2147
2158
|
const serverEntry = (() => {
|
|
2148
2159
|
if (options.serverEntry) {
|
|
2149
|
-
const resolved =
|
|
2160
|
+
const resolved = resolve2(rootDir, options.serverEntry);
|
|
2150
2161
|
if (existsSync6(resolved))
|
|
2151
2162
|
return resolved;
|
|
2152
2163
|
}
|
|
2153
|
-
const serverEntry2 =
|
|
2164
|
+
const serverEntry2 = resolve2(rootDir, "src/server.ts");
|
|
2154
2165
|
if (!existsSync6(serverEntry2)) {
|
|
2155
2166
|
throw new Error("[furin] Entrypoint server.ts not found");
|
|
2156
2167
|
}
|
|
2157
2168
|
return serverEntry2;
|
|
2158
2169
|
})();
|
|
2159
2170
|
const rawPagesDir = options.pagesDir ?? resolvePagesDirFromServer(serverEntry, rootDir) ?? "src/pages";
|
|
2160
|
-
const pagesDir =
|
|
2171
|
+
const pagesDir = resolve2(rootDir, rawPagesDir);
|
|
2161
2172
|
const requestedTargets = options.target === "all" ? [...IMPLEMENTED_TARGETS] : [options.target].map((target) => {
|
|
2162
2173
|
if (!BUILD_TARGETS.includes(target)) {
|
|
2163
2174
|
throw new Error(`[furin] Unsupported build target "${target}"`);
|
|
@@ -2199,7 +2210,7 @@ async function buildApp(options) {
|
|
|
2199
2210
|
|
|
2200
2211
|
// src/cli/config.ts
|
|
2201
2212
|
import { existsSync as existsSync7 } from "fs";
|
|
2202
|
-
import { resolve as
|
|
2213
|
+
import { resolve as resolve3 } from "path";
|
|
2203
2214
|
import { pathToFileURL } from "url";
|
|
2204
2215
|
import { TypeCompiler } from "elysia/type-system";
|
|
2205
2216
|
var compiledConfigSchema = TypeCompiler.Compile(configSchema);
|
|
@@ -2209,13 +2220,13 @@ var DEFAULT_CONFIG_FILENAMES = [
|
|
|
2209
2220
|
"furin.config.mjs"
|
|
2210
2221
|
];
|
|
2211
2222
|
async function loadCliConfig(cwd, explicitConfigPath) {
|
|
2212
|
-
const rootDir =
|
|
2213
|
-
const configPath = explicitConfigPath ?
|
|
2223
|
+
const rootDir = resolve3(cwd);
|
|
2224
|
+
const configPath = explicitConfigPath ? resolve3(rootDir, explicitConfigPath) : DEFAULT_CONFIG_FILENAMES.map((filename) => resolve3(rootDir, filename)).find((path) => existsSync7(path));
|
|
2214
2225
|
if (!configPath) {
|
|
2215
2226
|
return {
|
|
2216
2227
|
configPath: null,
|
|
2217
2228
|
rootDir,
|
|
2218
|
-
pagesDir:
|
|
2229
|
+
pagesDir: resolve3(rootDir, "src/pages")
|
|
2219
2230
|
};
|
|
2220
2231
|
}
|
|
2221
2232
|
const imported = await import(pathToFileURL(configPath).href);
|
|
@@ -2228,13 +2239,13 @@ async function loadCliConfig(cwd, explicitConfigPath) {
|
|
|
2228
2239
|
const [firstError] = compiledConfigSchema.Errors(configToValidate);
|
|
2229
2240
|
throw new Error(`[furin] Invalid config at ${configPath}: ${firstError?.message ?? "unknown error"} (path: ${firstError?.path ?? "/"})`);
|
|
2230
2241
|
}
|
|
2231
|
-
const resolvedRootDir =
|
|
2242
|
+
const resolvedRootDir = resolve3(rootDir, configToValidate.rootDir ?? ".");
|
|
2232
2243
|
return {
|
|
2233
2244
|
...configToValidate,
|
|
2234
2245
|
plugins,
|
|
2235
2246
|
configPath,
|
|
2236
2247
|
rootDir: resolvedRootDir,
|
|
2237
|
-
pagesDir:
|
|
2248
|
+
pagesDir: resolve3(resolvedRootDir, configToValidate.pagesDir ?? "src/pages")
|
|
2238
2249
|
};
|
|
2239
2250
|
}
|
|
2240
2251
|
|
|
@@ -2285,7 +2296,7 @@ if (command === "build") {
|
|
|
2285
2296
|
bail(`Unsupported build target "${target}". Valid: ${BUILD_TARGETS.join(", ")}, all`);
|
|
2286
2297
|
}
|
|
2287
2298
|
const config = await loadCliConfig(process.cwd(), values.config);
|
|
2288
|
-
const resolvedServerEntry =
|
|
2299
|
+
const resolvedServerEntry = resolve4(config.rootDir, config.serverEntry ?? "src/server.ts");
|
|
2289
2300
|
if (!existsSync8(resolvedServerEntry)) {
|
|
2290
2301
|
const expected = config.serverEntry ?? "src/server.ts";
|
|
2291
2302
|
throw new Error(`[furin] Entrypoint ${expected} not found`);
|
package/dist/client.d.ts
CHANGED
|
@@ -2,6 +2,9 @@ import type { Cookie, StatusMap } from "elysia";
|
|
|
2
2
|
import type { AnySchema, HTTPHeaders, UnwrapSchema } from "elysia/types";
|
|
3
3
|
declare const UNSET: unique symbol;
|
|
4
4
|
type Unset = typeof UNSET;
|
|
5
|
+
type ToRecord<T> = {
|
|
6
|
+
[K in keyof T]: T[K];
|
|
7
|
+
};
|
|
5
8
|
type ResolvedSchema<T> = [T] extends [Unset] ? Unset : T extends AnySchema ? UnwrapSchema<T> : Unset;
|
|
6
9
|
type MergeSchema<TParent, TOwn> = [TParent] extends [Unset] ? TOwn : [TOwn] extends [Unset] ? TParent : TParent & TOwn;
|
|
7
10
|
type NormalizeUnset<T> = [T] extends [Unset] ? {} : T;
|
|
@@ -33,7 +36,7 @@ type ResolveParent<T> = T extends RouteRef<infer D, infer P, infer Q> ? {
|
|
|
33
36
|
query: Unset;
|
|
34
37
|
};
|
|
35
38
|
interface Resolved<TParentRef, TLoaderData, TParamsSchema = Unset, TQuerySchema = Unset> {
|
|
36
|
-
data: ResolveParent<TParentRef>["data"] & TLoaderData
|
|
39
|
+
data: ToRecord<ResolveParent<TParentRef>["data"] & TLoaderData>;
|
|
37
40
|
params: MergeSchema<ResolveParent<TParentRef>["params"], ResolvedSchema<TParamsSchema>>;
|
|
38
41
|
query: MergeSchema<ResolveParent<TParentRef>["query"], ResolvedSchema<TQuerySchema>>;
|
|
39
42
|
}
|
|
@@ -89,7 +92,7 @@ export interface HeadOptions {
|
|
|
89
92
|
export type LoaderDeps = (route: {
|
|
90
93
|
__type: string;
|
|
91
94
|
}) => Promise<Record<string, unknown>>;
|
|
92
|
-
type ExtractLoaderReturn<TLoader> = TLoader extends (...args: never[]) => unknown ? Awaited<ReturnType<TLoader>> extends
|
|
95
|
+
type ExtractLoaderReturn<TLoader> = TLoader extends (...args: never[]) => unknown ? Awaited<ReturnType<TLoader>> extends object ? ToRecord<Awaited<ReturnType<TLoader>>> : {} : {};
|
|
93
96
|
export interface PageConfig<TParentData extends Record<string, unknown>, TParams, TQuery, TPageLoaderData extends object = {}> {
|
|
94
97
|
component: React.FC<TParentData & TPageLoaderData & ComponentProps<TParams, TQuery>>;
|
|
95
98
|
head?: (ctx: ComponentProps<TParams, TQuery> & TParentData & TPageLoaderData) => HeadOptions;
|
|
@@ -124,7 +127,7 @@ export interface RouteRef<TData extends Record<string, unknown> = Record<string,
|
|
|
124
127
|
query: TQuery;
|
|
125
128
|
};
|
|
126
129
|
}
|
|
127
|
-
interface PageResult<TData extends Record<string, unknown>, TParams, TQuery, TPageLoaderData extends
|
|
130
|
+
interface PageResult<TData extends Record<string, unknown>, TParams, TQuery, TPageLoaderData extends object> {
|
|
128
131
|
__type: "FURIN_PAGE";
|
|
129
132
|
_route: Route<TData, TParams, TQuery>;
|
|
130
133
|
component: React.FC<TData & TPageLoaderData & ComponentProps<TParams, TQuery>>;
|
|
@@ -138,7 +141,7 @@ export interface Route<TParentData extends Record<string, unknown>, TParams, TQu
|
|
|
138
141
|
} & ComponentProps<TParams, TQuery>>;
|
|
139
142
|
loader?(ctx: RouteContext<TParams, TQuery> & TParentData, deps: TypedDeps): Promise<TParentData> | TParentData;
|
|
140
143
|
mode?: "ssr" | "ssg" | "isr";
|
|
141
|
-
page<TLoader extends (ctx: RouteContext<TParams, TQuery> & TParentData, deps: TypedDeps) => unknown, TPageLoaderData extends
|
|
144
|
+
page<TLoader extends (ctx: RouteContext<TParams, TQuery> & TParentData, deps: TypedDeps) => unknown, TPageLoaderData extends object = ExtractLoaderReturn<TLoader>>(config: {
|
|
142
145
|
loader: TLoader;
|
|
143
146
|
mode?: "ssr" | "ssg" | "isr";
|
|
144
147
|
revalidate?: number;
|
|
@@ -161,7 +164,7 @@ export interface Route<TParentData extends Record<string, unknown>, TParams, TQu
|
|
|
161
164
|
revalidate?: number;
|
|
162
165
|
}
|
|
163
166
|
type TypedDeps = <TData extends Record<string, unknown>>(route: Route<TData, any, any>) => Promise<TData>;
|
|
164
|
-
export declare function createRoute<TParentRef extends RouteRef | undefined = undefined, TParamsSchema extends AnySchema | Unset = Unset, TQuerySchema extends AnySchema | Unset = Unset, TLoaderData extends
|
|
167
|
+
export declare function createRoute<TParentRef extends RouteRef | undefined = undefined, TParamsSchema extends AnySchema | Unset = Unset, TQuerySchema extends AnySchema | Unset = Unset, TLoaderData extends object = {}>(config?: {
|
|
165
168
|
parent?: {
|
|
166
169
|
ref: TParentRef;
|
|
167
170
|
} & {
|