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 | data?: TData;
|
73 | }): Promise<string>;
|
74 | /** @internal Prefer {@link AkteApp.renderAll} or use at your own risks. */
|
75 | renderAll(args: {
|
76 | globalData: TGlobalData;
|
77 | }): Promise<Record<string, string>>;
|
78 | /** @internal Prefer {@link AkteApp.clearCache} or use at your own risks. */
|
79 | clearCache(): void;
|
80 | /**
|
81 | * Readonly cache of files' definition `data` method.
|
82 | *
|
83 | * @experimental Programmatic API might still change not following SemVer.
|
84 | */
|
85 | get dataMapCache(): ReadonlyMap<string, Awaitable<TData>>;
|
86 | private _dataMapCache;
|
87 | /**
|
88 | * Retrieves data from files' definition `data` method with given context.
|
89 | *
|
90 | * @param context - Context to get data with.
|
91 | * @returns Retrieved data.
|
92 | * @remark Returned data may come from cache.
|
93 | * @experimental Programmatic API might still change not following SemVer.
|
94 | */
|
95 | getData: FilesDataFn<TGlobalData, TParams, TData>;
|
96 | /**
|
97 | * Readonly cache of files' definition `bulkData` method.
|
98 | *
|
99 | * @experimental Programmatic API might still change not following SemVer.
|
100 | */
|
101 | get bulkDataCache(): Awaitable<Record<string, TData>> | undefined;
|
102 | private _bulkDataCache;
|
103 | /**
|
104 | * Retrieves data from files' definition `bulkData` method with given context.
|
105 | *
|
106 | * @param context - Context to get bulk data with.
|
107 | * @returns Retrieved bulk data.
|
108 | * @remark Returned bulk data may come from cache.
|
109 | * @experimental Programmatic API might still change not following SemVer.
|
110 | */
|
111 | getBulkData: FilesBulkDataFn<TGlobalData, TData>;
|
112 | }
|
113 | export {};
|