1 | import { type Awaitable } from "./types";
|
2 | type Path<TParams extends string[], TPrefix extends string = string> = TParams extends [] ? "" : TParams extends [string] ? `${TPrefix}:${TParams[0]}${string}` : TParams extends readonly [string, ...infer Rest extends string[]] ? Path<Rest, `${TPrefix}:${TParams[0]}${string}`> : string;
|
3 | /**
|
4 | * A function responsible for fetching the data required to render a given file
|
5 | * at the provided path. Used for optimization like server side rendering or
|
6 | * serverless.
|
7 | */
|
8 | export type FilesDataFn<TGlobalData, TParams extends string[], TData> = (context: {
|
9 | /** Path to get data for. */
|
10 | path: string;
|
11 | /** Path parameters if any. */
|
12 | params: Record<TParams[number], string>;
|
13 | /** Akte app global data. */
|
14 | globalData: TGlobalData;
|
15 | }) => Awaitable<TData>;
|
16 | /** A function responsible for fetching all the data required to render files. */
|
17 | export type FilesBulkDataFn<TGlobalData, TData> = (context: {
|
18 | /** Akte app global data. */
|
19 | globalData: TGlobalData;
|
20 | }) => Awaitable<Record<string, TData>>;
|
21 | export type FilesDefinition<TGlobalData, TParams extends string[], TData> = {
|
22 | /**
|
23 | * Path pattern for the Akte files.
|
24 | *
|
25 | * @example
|
26 | * "/";
|
27 | * "/foo";
|
28 | * "/bar.json";
|
29 | * "/posts/:slug";
|
30 | * "/posts/:taxonomy/:slug";
|
31 | * "/pages/**";
|
32 | * "/assets/**.json";
|
33 | */
|
34 | path: Path<TParams>;
|
35 | /**
|
36 | * A function responsible for fetching the data required to render a given
|
37 | * file. Used for optimization like server side rendering or serverless.
|
38 | *
|
39 | * Throwing a {@link NotFoundError} makes the file at path to be treated as a
|
40 | * 404, any other error makes it treated as a 500.
|
41 | */
|
42 | data?: FilesDataFn<TGlobalData, TParams, TData>;
|
43 | /** A function responsible for fetching all the data required to render files. */
|
44 | bulkData?: FilesBulkDataFn<TGlobalData, TData>;
|
45 | /**
|
46 | * A function responsible for rendering the file.
|
47 | *
|
48 | * @param context - Resolved file path, app global data, and data to render
|
49 | * the file.
|
50 | * @returns Rendered file.
|
51 | */
|
52 | render: (context: {
|
53 | /** Path to render. */
|
54 | path: string;
|
55 | /** Akte app global data. */
|
56 | globalData: TGlobalData;
|
57 | /** File data for path. */
|
58 | data: TData;
|
59 | }) => Awaitable<string>;
|
60 | };
|
61 | /** An Akte files, managing its data cascade and rendering process. */
|
62 | export declare class AkteFiles<TGlobalData = unknown, TParams extends string[] = string[], TData = any> {
|
63 | protected definition: FilesDefinition<TGlobalData, TParams, TData>;
|
64 | /** Path pattern of this Akte files. */
|
65 | get path(): string;
|
66 | constructor(definition: FilesDefinition<TGlobalData, TParams, TData>);
|
67 | /** @internal Prefer {@link AkteApp.render} or use at your own risks. */
|
68 | render(args: {
|
69 | path: string;
|
70 | params: Record<TParams[number], string>;
|
71 | globalData: TGlobalData;
|
72 | }): Promise<string>;
|
73 | /** @internal Prefer {@link AkteApp.renderAll} or use at your own risks. */
|
74 | renderAll(args: {
|
75 | globalData: TGlobalData;
|
76 | }): Promise<Record<string, string>>;
|
77 | /** @internal Prefer {@link AkteApp.clearCache} or use at your own risks. */
|
78 | clearCache(): void;
|
79 | private _dataPromiseMap;
|
80 | protected getDataPromise: FilesDataFn<TGlobalData, TParams, TData>;
|
81 | private _bulkDataPromise;
|
82 | protected getBulkDataPromise: FilesBulkDataFn<TGlobalData, TData>;
|
83 | }
|
84 | export {};
|