{"version":3,"sources":["entrypoints.ts"],"sourcesContent":["import { Datex } from \"datex-core-legacy\";\nimport { Context } from \"../routing/context.ts\";\nimport { Path } from \"datex-core-legacy/utils/path.ts\";\nimport { HTTPStatus } from \"../html/http-status.ts\";\nimport { RenderPreset, RenderMethod } from \"../base/render-methods.ts\";\nimport { FileHandle, KEEP_CONTENT } from \"./common.tsx\";\nimport { resolveEntrypointRoute } from \"../routing/rendering.ts\";\nimport { filter } from \"../routing/route-filter.ts\";\n\n\ndeclare global {\n\t/**\n\t * Well-known global interface SharedData\n\t * Returned by context.getSharedData()\n\t */\n\tinterface SharedData { }\n\n\t/**\n\t * Well-known global interface PrivateData\n\t * Returned by context.getPrivateDat()\n\t */\n\tinterface PrivateData { }\n}\n\nconst a: SharedData = {\n\taa: \"s\",\n\tb: 12\n}\n\ntype RefOrValueUnion<U> = (U extends any ? Datex.RefOrValue<U> : never)\n\nexport type raw_content = Blob|Response // sent as raw Response\nexport type special_content = URL|Deno.FsFile|FileHandle|HTTPStatus|Error // gets converted to a Response\nexport type html_content = RefOrValueUnion<JSX.Element|string|number|boolean|bigint|Datex.Markdown|RouteManager|RouteHandler>|null|undefined|raw_content|special_content;\nexport type html_content_or_generator<\n\tCustomSharedData extends Record<string, unknown>|SharedData = SharedData,\n\tCustomPrivateData extends Record<any, unknown>|PrivateData = PrivateData\n\t> = html_content|html_generator<CustomSharedData, CustomPrivateData>;\nexport type html_content_or_generator_or_preset<\n\tCustomSharedData extends Record<string, unknown>|SharedData = SharedData,\n\tCustomPrivateData extends Record<any, unknown>|PrivateData = PrivateData\n\t> = html_content_or_generator<CustomSharedData, CustomPrivateData>|RenderPreset<RenderMethod, html_content_or_generator<CustomSharedData, CustomPrivateData>>;\n\nexport type EntrypointRouteMap<\n\tCustomSharedData extends Record<string, unknown>|SharedData = SharedData,\n\tCustomPrivateData extends Record<any, unknown>|PrivateData = PrivateData\n\t> = {[route:string|filter]:Entrypoint<CustomSharedData, CustomPrivateData>}\nexport type html_generator<\n\tCustomSharedData extends Record<string, unknown>|SharedData = SharedData,\n\tCustomPrivateData extends Record<any, unknown>|PrivateData = PrivateData\n\t> = (ctx:Context<CustomSharedData, CustomPrivateData>, params:Record<string, string>)=>Entrypoint<CustomSharedData, CustomPrivateData> // html_content|RenderPreset<RenderMethod, html_content>|Promise<html_content|RenderPreset<RenderMethod, html_content>>;\n\ntype _Entrypoint<\n\tCustomSharedData extends Record<string, unknown>|SharedData = SharedData,\n\tCustomPrivateData extends Record<any, unknown>|PrivateData = PrivateData\n\t> = html_content_or_generator_or_preset<CustomSharedData, CustomPrivateData> | EntrypointRouteMap<CustomSharedData, CustomPrivateData> | typeof KEEP_CONTENT\n\n/**\n * UIX Entrypoint type.\n * Default exports in entrypoint.ts/entrypoint.tsx must satisfy this type:\n * ```ts\n * export default \"Hello World\" satisfies Entrypoint;\n * ```\n * ```ts\n * export default <h1>Title</h1> satisfies Entrypoint;\n * ```\n * ```ts\n * export default {\n *   '/route1': 'Hello',\n *   '/route2': 'World'\n * } satisfies Entrypoint;\n * ```\n */\nexport type Entrypoint<\n\tCustomSharedData extends Record<string, unknown>|SharedData = SharedData,\n\tCustomPrivateData extends Record<any, unknown>|PrivateData = PrivateData\n\t> = _Entrypoint<CustomSharedData, CustomPrivateData> | Promise<_Entrypoint<CustomSharedData, CustomPrivateData>>\n\n\n/**\n * handles routes internally\n */\nexport interface RouteManager {\n\tresolveRoute(route:Path.Route, context:Context): Path.route_representation|Promise<Path.route_representation> // return part of route that could be resolved\n\tgetInternalRoute(): Path.route_representation|Promise<Path.route_representation> // return internal state of last resolved route\n}\n\n/**\n * redirects to other Entrypoints for specific routes\n */\nexport interface RouteHandler {\n\tgetRoute(route:Path.Route, context:Context): Entrypoint|Promise<Entrypoint> // return child entrypoint for route\n}\n\n\n\n/**\n * transforms entrypoint content to a new entrypoint content\n */\nexport abstract class EntrypointProxy<E extends Entrypoint = Entrypoint> implements RouteHandler {\n\n\t#entrypoint: E\n\tget entrypoint() {return this.#entrypoint}\n\n\tconstructor(entrypoint: E = null as E) {\n\t\tthis.#entrypoint = entrypoint;\n\t}\n\n\tasync getRoute(route:Path.Route, context: Context) {\n\t\tlet entrypoint = this.#entrypoint;\n\t\troute = Path.Route(await this.redirect?.(route, context) ?? route);\n\t\tconst intercepted = await this.intercept?.(route, context);\n\t\tif (intercepted != null) entrypoint = intercepted as E;\n\t\tconst {content, render_method, status_code} = await resolveEntrypointRoute({entrypoint, route, context});\n\t\treturn this.transform?.(content, render_method, status_code, route, context) ?? <any> new RenderPreset<RenderMethod, html_content_or_generator>(render_method, content, status_code);\n\t}\n\n\t/**\n\t * This method is called before intercept()\n\t * It can be used to modify the route that is used by the intercept method and the entrypoint\n\t * \n\t * The returned value replaces the current route part\n\t * \n\t * @param route requested route\n\t * @param context UIX context\n\t * @returns new route or void\n\t */\n\tabstract redirect?(route:Path.Route, context: Context): void|Path.route_representation|string|null|Promise<void|Path.route_representation|string|null>\n\n\t/**\n\t * This method is called before a route is resolved by the entrypoint\n\t * It can be used to implement a custom routing behavior\n\t * for some or all routes, overriding the entrypoint routing\n\t * \n\t * The returned value replaces the entrypoint, if not null\n\t * \n\t * @param route requested route\n\t * @param context UIX context\n\t * @returns entrypoint override or null\n\t */\n\tabstract intercept?(route:Path.Route, context: Context): void|Entrypoint|Promise<void|Entrypoint>\n\n\t/**\n\t * This method is called after a route was resolved by the entrypoint\n\t * It can be used to override the content provided for a route by returning \n\t * a different entrypoint value. \n\t * When null is returned, the route content is not changed\n\t * \n\t * @param content content as resolved by entrypoint\n\t * @param render_method render method as resolved by entrypoint\n\t * @param status_code HTTP response status code as resolved by entrypoint\n\t * @param route the requested route\n\t * @param context UIX context\n\t * @returns entrypoint override or null\n\t */\n\tabstract transform?(content: Entrypoint, render_method: RenderMethod, status_code: number, route:Path.Route, context: Context): void|Entrypoint|Promise<void|Entrypoint>\n}\n\n"],"names":["Path","RenderPreset","resolveEntrypointRoute","EntrypointProxy","entrypoint","constructor","getRoute","route","context","Route","redirect","intercepted","intercept","content","render_method","status_code","transform"],"mappings":"AAEA,SAASA,IAAI,QAAQ,kCAAkC;AAEvD,SAASC,YAAY,QAAsB,4BAA4B;AAEvE,SAASC,sBAAsB,QAAQ,0BAA0B;AA6FjE,OAAO,MAAeC;IAErB,CAAA,UAAW,CAAG;IACd,IAAIC,aAAa;QAAC,OAAO,IAAI,CAAC,CAAA,UAAW;IAAA;IAEzCC,YAAYD,aAAgB,IAAS,CAAE;QACtC,IAAI,CAAC,CAAA,UAAW,GAAGA;IACpB;IAEA,MAAME,SAASC,KAAgB,EAAEC,OAAgB,EAAE;QAClD,IAAIJ,aAAa,IAAI,CAAC,CAAA,UAAW;QACjCG,QAAQP,KAAKS,KAAK,CAAC,MAAM,IAAI,CAACC,QAAQ,GAAGH,OAAOC,YAAYD;QAC5D,IAAMI,cAAc,MAAM,IAAI,CAACC,SAAS,GAAGL,OAAOC;QAC/B,QAAfG,eAAqBP,CAAAA,aAAaO,WAAe;QACrD,IAAM,EAACE,OAAO,EAAEC,aAAa,EAAEC,WAAW,EAAC,GAAG,MAAMb,uBAAuB;YAACE;YAAYG;YAAOC;QAAO;QACtG,OAAO,IAAI,CAACQ,SAAS,GAAGH,SAASC,eAAeC,aAAaR,OAAOC,YAAkB,IAAIP,aAAsDa,eAAeD,SAASE;IACzK;AAyCD","sourceRoot":"/lib/uix-0.4.39/src/providers/","file":"entrypoints.ts"}