UNPKG

3.54 kBTypeScriptView Raw
1import { type Awaitable } from "./types";
2type 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 */
8export 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. */
17export type FilesBulkDataFn<TGlobalData, TData> = (context: {
18 /** Akte app global data. */
19 globalData: TGlobalData;
20}) => Awaitable<Record<string, TData>>;
21export 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. */
62export 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}
84export {};