effective-rsc 0.1.0
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/LICENSE +21 -0
- package/LLMS.md +382 -0
- package/README.md +235 -0
- package/bin/ersc.js +3 -0
- package/dist/application/component.d.ts +15 -0
- package/dist/application/component.js +20 -0
- package/dist/application/component.js.map +1 -0
- package/dist/application/definition.d.ts +31 -0
- package/dist/application/definition.js +57 -0
- package/dist/application/definition.js.map +1 -0
- package/dist/application/ersc-identity.d.ts +25 -0
- package/dist/application/ersc-identity.js +23 -0
- package/dist/application/ersc-identity.js.map +1 -0
- package/dist/application/ersc.d.ts +28 -0
- package/dist/application/ersc.js +72 -0
- package/dist/application/ersc.js.map +1 -0
- package/dist/application/layout.d.ts +18 -0
- package/dist/application/layout.js +17 -0
- package/dist/application/layout.js.map +1 -0
- package/dist/application/loading.d.ts +17 -0
- package/dist/application/loading.js +14 -0
- package/dist/application/loading.js.map +1 -0
- package/dist/application/middleware.d.ts +36 -0
- package/dist/application/middleware.js +46 -0
- package/dist/application/middleware.js.map +1 -0
- package/dist/application/page.d.ts +58 -0
- package/dist/application/page.js +50 -0
- package/dist/application/page.js.map +1 -0
- package/dist/application/render-runtime.d.ts +9 -0
- package/dist/application/render-runtime.js +28 -0
- package/dist/application/render-runtime.js.map +1 -0
- package/dist/application/route-graph.d.ts +22 -0
- package/dist/application/route-graph.js +68 -0
- package/dist/application/route-graph.js.map +1 -0
- package/dist/application/route-path.d.ts +31 -0
- package/dist/application/route-path.js +67 -0
- package/dist/application/route-path.js.map +1 -0
- package/dist/application/routes.d.ts +66 -0
- package/dist/application/routes.js +159 -0
- package/dist/application/routes.js.map +1 -0
- package/dist/application/server-fn.d.ts +30 -0
- package/dist/application/server-fn.js +58 -0
- package/dist/application/server-fn.js.map +1 -0
- package/dist/build/build.d.ts +26 -0
- package/dist/build/build.js +59 -0
- package/dist/build/build.js.map +1 -0
- package/dist/build/compiled-server.d.ts +53 -0
- package/dist/build/compiled-server.js +77 -0
- package/dist/build/compiled-server.js.map +1 -0
- package/dist/build/contract.d.ts +23 -0
- package/dist/build/contract.js +41 -0
- package/dist/build/contract.js.map +1 -0
- package/dist/build/dev-channel.d.ts +20 -0
- package/dist/build/dev-channel.js +71 -0
- package/dist/build/dev-channel.js.map +1 -0
- package/dist/build/dev.d.ts +41 -0
- package/dist/build/dev.js +186 -0
- package/dist/build/dev.js.map +1 -0
- package/dist/build/rsc-entry.d.ts +4 -0
- package/dist/build/rsc-entry.js +17 -0
- package/dist/build/rsc-entry.js.map +1 -0
- package/dist/build/rspack-config.d.ts +17 -0
- package/dist/build/rspack-config.js +259 -0
- package/dist/build/rspack-config.js.map +1 -0
- package/dist/build/rspack.d.ts +45 -0
- package/dist/build/rspack.js +231 -0
- package/dist/build/rspack.js.map +1 -0
- package/dist/build/terminal.d.ts +9 -0
- package/dist/build/terminal.js +17 -0
- package/dist/build/terminal.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/application.d.ts +2 -0
- package/dist/client/application.js +73 -0
- package/dist/client/application.js.map +1 -0
- package/dist/client/browser-capabilities.d.ts +9 -0
- package/dist/client/browser-capabilities.js +20 -0
- package/dist/client/browser-capabilities.js.map +1 -0
- package/dist/client/browser-effect-runner.d.ts +13 -0
- package/dist/client/browser-effect-runner.js +13 -0
- package/dist/client/browser-effect-runner.js.map +1 -0
- package/dist/client/browser-renderer.d.ts +70 -0
- package/dist/client/browser-renderer.js +159 -0
- package/dist/client/browser-renderer.js.map +1 -0
- package/dist/client/browser-screen.d.ts +2 -0
- package/dist/client/browser-screen.js +215 -0
- package/dist/client/browser-screen.js.map +1 -0
- package/dist/client/call-server.d.ts +8 -0
- package/dist/client/call-server.js +151 -0
- package/dist/client/call-server.js.map +1 -0
- package/dist/client/client-router.d.ts +6 -0
- package/dist/client/client-router.js +588 -0
- package/dist/client/client-router.js.map +1 -0
- package/dist/client/entry.d.ts +1 -0
- package/dist/client/entry.js +12 -0
- package/dist/client/entry.js.map +1 -0
- package/dist/client/flight-client.d.ts +83 -0
- package/dist/client/flight-client.js +146 -0
- package/dist/client/flight-client.js.map +1 -0
- package/dist/client/initial-flight-stream.d.ts +18 -0
- package/dist/client/initial-flight-stream.js +60 -0
- package/dist/client/initial-flight-stream.js.map +1 -0
- package/dist/client/navigation-api.d.ts +34 -0
- package/dist/client/navigation-api.js +25 -0
- package/dist/client/navigation-api.js.map +1 -0
- package/dist/client/navigation-routing.d.ts +3 -0
- package/dist/client/navigation-routing.js +8 -0
- package/dist/client/navigation-routing.js.map +1 -0
- package/dist/client/react-dom-renderer.d.ts +20 -0
- package/dist/client/react-dom-renderer.js +101 -0
- package/dist/client/react-dom-renderer.js.map +1 -0
- package/dist/client/route-loader.d.ts +81 -0
- package/dist/client/route-loader.js +128 -0
- package/dist/client/route-loader.js.map +1 -0
- package/dist/client/route-refresh.d.ts +31 -0
- package/dist/client/route-refresh.js +132 -0
- package/dist/client/route-refresh.js.map +1 -0
- package/dist/client/route-tree.d.ts +7 -0
- package/dist/client/route-tree.js +34 -0
- package/dist/client/route-tree.js.map +1 -0
- package/dist/dev/channel.d.ts +18 -0
- package/dist/dev/channel.js +30 -0
- package/dist/dev/channel.js.map +1 -0
- package/dist/dev/client.d.ts +3 -0
- package/dist/dev/client.js +132 -0
- package/dist/dev/client.js.map +1 -0
- package/dist/dev/hmr-update.d.ts +20 -0
- package/dist/dev/hmr-update.js +28 -0
- package/dist/dev/hmr-update.js.map +1 -0
- package/dist/dev/panel.d.ts +41 -0
- package/dist/dev/panel.js +9946 -0
- package/dist/dev/panel.js.map +1 -0
- package/dist/dev/runtime-failure.d.ts +11 -0
- package/dist/dev/runtime-failure.js +32 -0
- package/dist/dev/runtime-failure.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/rsc/flight.d.ts +16 -0
- package/dist/rsc/flight.js +6 -0
- package/dist/rsc/flight.js.map +1 -0
- package/dist/rsc/render-route-tree.d.ts +11 -0
- package/dist/rsc/render-route-tree.js +52 -0
- package/dist/rsc/render-route-tree.js.map +1 -0
- package/dist/rsc/route-tree.d.ts +6 -0
- package/dist/rsc/route-tree.js +5 -0
- package/dist/rsc/route-tree.js.map +1 -0
- package/dist/server/application.d.ts +17 -0
- package/dist/server/application.js +178 -0
- package/dist/server/application.js.map +1 -0
- package/dist/server/flight-html-stream.d.ts +19 -0
- package/dist/server/flight-html-stream.js +193 -0
- package/dist/server/flight-html-stream.js.map +1 -0
- package/dist/server/flight-renderer.d.ts +31 -0
- package/dist/server/flight-renderer.js +47 -0
- package/dist/server/flight-renderer.js.map +1 -0
- package/dist/server/html-renderer.d.ts +28 -0
- package/dist/server/html-renderer.js +82 -0
- package/dist/server/html-renderer.js.map +1 -0
- package/dist/server/request-outcome.d.ts +8 -0
- package/dist/server/request-outcome.js +5 -0
- package/dist/server/request-outcome.js.map +1 -0
- package/dist/server/server-config.d.ts +17 -0
- package/dist/server/server-config.js +18 -0
- package/dist/server/server-config.js.map +1 -0
- package/dist/server/server-fn-outcome.d.ts +13 -0
- package/dist/server/server-fn-outcome.js +24 -0
- package/dist/server/server-fn-outcome.js.map +1 -0
- package/dist/server/server-fn-request.d.ts +24 -0
- package/dist/server/server-fn-request.js +160 -0
- package/dist/server/server-fn-request.js.map +1 -0
- package/dist/unsupported.d.ts +0 -0
- package/dist/unsupported.js +5 -0
- package/dist/unsupported.js.map +1 -0
- package/docs/01-getting-started/01_first-application.tsx +26 -0
- package/docs/01-getting-started/20_styling.tsx +6 -0
- package/docs/01-getting-started/index.md +27 -0
- package/docs/01-getting-started/styles.css +1 -0
- package/docs/02-guides/01-server-functions/10_ersc.ts +6 -0
- package/docs/02-guides/01-server-functions/20_follow-author.ts +15 -0
- package/docs/02-guides/01-server-functions/30_follow-author-button.tsx +19 -0
- package/docs/02-guides/01-server-functions/40_application.tsx +30 -0
- package/docs/02-guides/01-server-functions/index.md +19 -0
- package/docs/02-guides/02-services/10_catalog.ts +22 -0
- package/docs/02-guides/02-services/20_application.tsx +44 -0
- package/docs/02-guides/02-services/index.md +17 -0
- package/docs/02-guides/03-routing/10_ersc.ts +6 -0
- package/docs/02-guides/03-routing/10_layouts.tsx +36 -0
- package/docs/02-guides/03-routing/20_pages.tsx +23 -0
- package/docs/02-guides/03-routing/30_routes.tsx +17 -0
- package/docs/02-guides/03-routing/40_application.ts +7 -0
- package/docs/02-guides/03-routing/index.md +22 -0
- package/docs/02-guides/04-middleware/10_auth.ts +27 -0
- package/docs/02-guides/04-middleware/20_account-page.tsx +13 -0
- package/docs/02-guides/04-middleware/30_update-profile.ts +16 -0
- package/docs/02-guides/04-middleware/40_application.tsx +20 -0
- package/docs/02-guides/04-middleware/index.md +25 -0
- package/docs/02-guides/05-http/10_application-layer.tsx +60 -0
- package/docs/02-guides/05-http/index.md +23 -0
- package/docs/02-guides/index.md +11 -0
- package/docs/03-advanced/01-request-runtime-and-lifetimes/index.md +13 -0
- package/docs/03-advanced/02-client-navigation/index.md +61 -0
- package/docs/03-advanced/03-server-function-execution-and-refresh/index.md +17 -0
- package/docs/03-advanced/index.md +11 -0
- package/docs/04-api-reference/01-application/index.md +8 -0
- package/docs/04-api-reference/02-page/index.md +12 -0
- package/docs/04-api-reference/03-layout/index.md +4 -0
- package/docs/04-api-reference/04-loading/index.md +4 -0
- package/docs/04-api-reference/05-component/10_component.tsx +18 -0
- package/docs/04-api-reference/05-component/index.md +10 -0
- package/docs/04-api-reference/06-middleware/index.md +33 -0
- package/docs/04-api-reference/07-routes/index.md +20 -0
- package/docs/04-api-reference/08-server-fn/index.md +43 -0
- package/docs/04-api-reference/index.md +17 -0
- package/docs/environment.d.ts +1 -0
- package/docs/index.md +15 -0
- package/logo-dark.svg +6 -0
- package/logo.svg +6 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/component.js","sources":["../../src/application/component.ts"],"sourcesContent":["import { Effect } from 'effect';\nimport type { ReactNode } from 'react';\n\nimport { attachERSCMember, type ERSCIdentity, type ERSCMember } from './ersc-identity';\nimport type { AnyMiddleware } from './middleware';\n\nexport interface EffectComponent<Props, ApplicationServices> extends ERSCMember<\n ApplicationServices,\n 'Component'\n> {\n (props: Props): Promise<Awaited<ReactNode>>;\n}\n\ntype ComponentOptions<Props, Error, AvailableServices> = {\n readonly render: (props: Props) => Effect.Effect<Awaited<ReactNode>, Error, AvailableServices>;\n};\n\nexport type ComponentFactory<ApplicationServices, AvailableServices> = {\n readonly make: <Props, Error>(\n options: ComponentOptions<Props, Error, AvailableServices>,\n ) => EffectComponent<Props, ApplicationServices>;\n};\n\nexport const makeComponentFactory = <ApplicationServices, AvailableServices>(\n identity: ERSCIdentity<ApplicationServices>,\n middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>,\n): ComponentFactory<ApplicationServices, AvailableServices> => {\n const make = <Props, Error>({\n render,\n }: ComponentOptions<Props, Error, AvailableServices>): EffectComponent<\n Props,\n ApplicationServices\n > => {\n const EffectComponent = (props: Props): Promise<Awaited<ReactNode>> =>\n identity.renderRuntime.run(\n 'Component',\n Effect.suspend(() => render(props)),\n middleware,\n );\n\n return attachERSCMember(EffectComponent, identity, 'Component');\n };\n\n return { make };\n};\n"],"names":["Effect","attachERSCMember","makeComponentFactory","identity","middleware","make","render","EffectComponent","props"],"mappings":";;;;;AAAgC;AAGuD;AAoBhF,MAAME,oBAAoBA,GAAG,CAClCC,UACAC;IAEA,MAAMC,OAAO,CAAe,EAC1BC,MAAM,EAC4C;QAIlD,MAAMC,kBAAkB,CAACC,QACvBL,SAAS,aAAa,CAAC,GAAG,CACxB,aACAH,cAAc,CAAC,IAAMM,OAAOE,SAC5BJ;QAGJ,OAAOH,gBAAgBA,CAACM,iBAAiBJ,UAAU;IACrD;IAEA,OAAO;QAAEE;IAAK;AAChB,EAAE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Layer, type Types } from 'effect';
|
|
2
|
+
import type { HttpRouter } from 'effect/unstable/http';
|
|
3
|
+
import { type ERSCIdentity, type ERSCStatefulMember } from './ersc-identity.js';
|
|
4
|
+
import { type CompiledRouteGraph } from './route-graph.js';
|
|
5
|
+
import type { AbsolutePath, ReservedRoutePath } from './route-path.js';
|
|
6
|
+
import { type AnyRoutes, type RoutesHasLayout, type RoutesPaths } from './routes.js';
|
|
7
|
+
declare const ApplicationContractTypeId: unique symbol;
|
|
8
|
+
export interface ApplicationDefinition<Services, out ApplicationError = never> extends ERSCStatefulMember<Services, 'Application', ApplicationImplementationState<Services, ApplicationError>> {
|
|
9
|
+
readonly [ApplicationContractTypeId]: {
|
|
10
|
+
readonly error: Types.Covariant<ApplicationError>;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export type ApplicationImplementationState<Services, ApplicationError> = {
|
|
14
|
+
readonly layer: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;
|
|
15
|
+
readonly routes: CompiledRouteGraph<Services>;
|
|
16
|
+
};
|
|
17
|
+
export declare const getApplicationState: <Services, ApplicationError>(application: ApplicationDefinition<Services, ApplicationError>) => ApplicationImplementationState<Services, ApplicationError>;
|
|
18
|
+
export type ApplicationServices<Application> = Application extends ApplicationDefinition<infer Services, infer _ApplicationError> ? Services : never;
|
|
19
|
+
type ValidRootRoutes<Services, Definition extends AnyRoutes<Services>> = RoutesHasLayout<Definition> extends true ? [RoutesPaths<Definition>] extends [never] ? never : [ReservedRoutes<RoutesPaths<Definition>>] extends [never] ? unknown : never : never;
|
|
20
|
+
type ReservedRoutes<Paths> = Paths extends AbsolutePath ? ReservedRoutePath<Paths> : never;
|
|
21
|
+
type ApplicationLayerOptions<Services, ApplicationError> = [Services] extends [never] ? {
|
|
22
|
+
readonly layer?: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;
|
|
23
|
+
} : {
|
|
24
|
+
readonly layer: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;
|
|
25
|
+
};
|
|
26
|
+
export type ERSCApplicationOptions<Services, Definition extends AnyRoutes<Services>, ApplicationError> = {
|
|
27
|
+
readonly routes: Definition & ValidRootRoutes<Services, Definition>;
|
|
28
|
+
} & ApplicationLayerOptions<Services, ApplicationError>;
|
|
29
|
+
export type ERSCMake<Services> = <Definition extends AnyRoutes<Services>, ApplicationError = never>(options: ERSCApplicationOptions<Services, Definition, ApplicationError>) => ApplicationDefinition<Services, ApplicationError>;
|
|
30
|
+
export declare const makeApplication: <Services, Definition extends AnyRoutes<Services>, ApplicationError = never>(identity: ERSCIdentity<Services>, { layer, routes }: ERSCApplicationOptions<Services, Definition, ApplicationError>) => ApplicationDefinition<Services, ApplicationError>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Layer } from "effect";
|
|
2
|
+
import { ERSCIdentityTypeId, ERSCMemberKindTypeId, ERSCStateTypeId, getERSCIdentity, isERSCMember } from "./ersc-identity.js";
|
|
3
|
+
import { compileRouteGraph } from "./route-graph.js";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ApplicationDefinitionImpl {
|
|
12
|
+
[ERSCIdentityTypeId];
|
|
13
|
+
[ERSCMemberKindTypeId] = 'Application';
|
|
14
|
+
get [ERSCStateTypeId]() {
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
layer;
|
|
18
|
+
routes;
|
|
19
|
+
constructor(identity, routes, layer){
|
|
20
|
+
this[ERSCIdentityTypeId] = identity;
|
|
21
|
+
this.layer = layer;
|
|
22
|
+
this.routes = routes;
|
|
23
|
+
Object.defineProperties(this, {
|
|
24
|
+
[ERSCIdentityTypeId]: {
|
|
25
|
+
configurable: false,
|
|
26
|
+
writable: false
|
|
27
|
+
},
|
|
28
|
+
layer: {
|
|
29
|
+
configurable: false,
|
|
30
|
+
writable: false
|
|
31
|
+
},
|
|
32
|
+
routes: {
|
|
33
|
+
configurable: false,
|
|
34
|
+
writable: false
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const getApplicationState = (application)=>{
|
|
40
|
+
if (!isERSCMember(application, 'Application')) {
|
|
41
|
+
throw new TypeError('Application must be created with ERSC.make.');
|
|
42
|
+
}
|
|
43
|
+
return application[ERSCStateTypeId];
|
|
44
|
+
};
|
|
45
|
+
function resolveApplicationLayer(layer) {
|
|
46
|
+
return layer ?? Layer.empty;
|
|
47
|
+
}
|
|
48
|
+
const makeApplication = (identity, { layer, routes })=>{
|
|
49
|
+
if (getERSCIdentity(routes) !== identity) {
|
|
50
|
+
throw new TypeError('Root Routes were created by a different ERSC module.');
|
|
51
|
+
}
|
|
52
|
+
return new ApplicationDefinitionImpl(identity, compileRouteGraph(routes), resolveApplicationLayer(layer));
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { getApplicationState, makeApplication };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/definition.js","sources":["../../src/application/definition.tsx"],"sourcesContent":["import { Layer, type Types } from 'effect';\nimport type { HttpRouter } from 'effect/unstable/http';\n\nimport {\n type ERSCIdentity,\n ERSCIdentityTypeId,\n ERSCMemberKindTypeId,\n type ERSCStatefulMember,\n ERSCStateTypeId,\n getERSCIdentity,\n isERSCMember,\n} from './ersc-identity';\nimport { type CompiledRouteGraph, compileRouteGraph } from './route-graph';\nimport type { AbsolutePath, ReservedRoutePath } from './route-path';\nimport { type AnyRoutes, type RoutesHasLayout, type RoutesPaths } from './routes';\n\ndeclare const ApplicationContractTypeId: unique symbol;\n\nexport interface ApplicationDefinition<\n Services,\n out ApplicationError = never,\n> extends ERSCStatefulMember<\n Services,\n 'Application',\n ApplicationImplementationState<Services, ApplicationError>\n> {\n readonly [ApplicationContractTypeId]: {\n readonly error: Types.Covariant<ApplicationError>;\n };\n}\n\nexport type ApplicationImplementationState<Services, ApplicationError> = {\n readonly layer: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;\n readonly routes: CompiledRouteGraph<Services>;\n};\n\nclass ApplicationDefinitionImpl<Services, ApplicationError> implements ApplicationDefinition<\n Services,\n ApplicationError\n> {\n declare readonly [ApplicationContractTypeId]: {\n readonly error: Types.Covariant<ApplicationError>;\n };\n readonly [ERSCIdentityTypeId]: ERSCIdentity<Services>;\n readonly [ERSCMemberKindTypeId] = 'Application' as const;\n get [ERSCStateTypeId](): ApplicationImplementationState<Services, ApplicationError> {\n return this;\n }\n readonly layer: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;\n readonly routes: CompiledRouteGraph<Services>;\n\n constructor(\n identity: ERSCIdentity<Services>,\n routes: CompiledRouteGraph<Services>,\n layer: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>,\n ) {\n this[ERSCIdentityTypeId] = identity;\n this.layer = layer;\n this.routes = routes;\n Object.defineProperties(this, {\n [ERSCIdentityTypeId]: { configurable: false, writable: false },\n layer: { configurable: false, writable: false },\n routes: { configurable: false, writable: false },\n });\n }\n}\n\nexport const getApplicationState = <Services, ApplicationError>(\n application: ApplicationDefinition<Services, ApplicationError>,\n): ApplicationImplementationState<Services, ApplicationError> => {\n if (!isERSCMember(application, 'Application')) {\n throw new TypeError('Application must be created with ERSC.make.');\n }\n return application[ERSCStateTypeId];\n};\n\nexport type ApplicationServices<Application> =\n Application extends ApplicationDefinition<infer Services, infer _ApplicationError>\n ? Services\n : never;\n\ntype ValidRootRoutes<Services, Definition extends AnyRoutes<Services>> =\n RoutesHasLayout<Definition> extends true\n ? [RoutesPaths<Definition>] extends [never]\n ? never\n : [ReservedRoutes<RoutesPaths<Definition>>] extends [never]\n ? unknown\n : never\n : never;\n\ntype ReservedRoutes<Paths> = Paths extends AbsolutePath ? ReservedRoutePath<Paths> : never;\n\ntype ApplicationLayerOptions<Services, ApplicationError> = [Services] extends [never]\n ? {\n readonly layer?: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;\n }\n : {\n readonly layer: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;\n };\n\nexport type ERSCApplicationOptions<\n Services,\n Definition extends AnyRoutes<Services>,\n ApplicationError,\n> = {\n readonly routes: Definition & ValidRootRoutes<Services, Definition>;\n} & ApplicationLayerOptions<Services, ApplicationError>;\n\nexport type ERSCMake<Services> = <Definition extends AnyRoutes<Services>, ApplicationError = never>(\n options: ERSCApplicationOptions<Services, Definition, ApplicationError>,\n) => ApplicationDefinition<Services, ApplicationError>;\n\nfunction resolveApplicationLayer<Services, ApplicationError>(\n layer: Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter> | undefined,\n): Layer.Layer<Services, ApplicationError, HttpRouter.HttpRouter>;\nfunction resolveApplicationLayer(layer: Layer.Any | undefined): Layer.Any {\n return layer ?? Layer.empty;\n}\n\nexport const makeApplication = <\n Services,\n Definition extends AnyRoutes<Services>,\n ApplicationError = never,\n>(\n identity: ERSCIdentity<Services>,\n { layer, routes }: ERSCApplicationOptions<Services, Definition, ApplicationError>,\n): ApplicationDefinition<Services, ApplicationError> => {\n if (getERSCIdentity(routes) !== identity) {\n throw new TypeError('Root Routes were created by a different ERSC module.');\n }\n\n return new ApplicationDefinitionImpl(\n identity,\n compileRouteGraph(routes),\n resolveApplicationLayer<Services, ApplicationError>(layer),\n );\n};\n"],"names":["Layer","ERSCIdentityTypeId","ERSCMemberKindTypeId","ERSCStateTypeId","getERSCIdentity","isERSCMember","compileRouteGraph","ApplicationDefinitionImpl","identity","routes","layer","Object","getApplicationState","application","TypeError","resolveApplicationLayer","makeApplication"],"mappings":";;;;;;;AAA2C;AAWlB;AACkD;AAwB3E,MAAMO,yBAAyBA;IAOpB,CAACN,kBAAkBA,CAAC,CAAyB;IAC7C,CAACC,oBAAoBA,CAAC,GAAG,cAAuB;IACzD,IAAI,CAACC,eAAeA,CAAC,GAA+D;QAClF,OAAO,IAAI;IACb;IACS,MAAsE;IACtE,OAAqC;IAE9C,YACEK,QAAgC,EAChCC,MAAoC,EACpCC,KAAqE,CACrE;QACA,IAAI,CAACT,kBAAkBA,CAAC,GAAGO;QAC3B,IAAI,CAAC,KAAK,GAAGE;QACb,IAAI,CAAC,MAAM,GAAGD;QACdE,OAAO,gBAAgB,CAAC,IAAI,EAAE;YAC5B,CAACV,kBAAkBA,CAAC,EAAE;gBAAE,cAAc;gBAAO,UAAU;YAAM;YAC7D,OAAO;gBAAE,cAAc;gBAAO,UAAU;YAAM;YAC9C,QAAQ;gBAAE,cAAc;gBAAO,UAAU;YAAM;QACjD;IACF;AACF;AAEO,MAAMW,mBAAmBA,GAAG,CACjCC;IAEA,IAAI,CAACR,YAAYA,CAACQ,aAAa,gBAAgB;QAC7C,MAAM,IAAIC,UAAU;IACtB;IACA,OAAOD,WAAW,CAACV,eAAeA,CAAC;AACrC,EAAE;AAyCF,SAASY,uBAAuBA,CAACL,KAA4B;IAC3D,OAAOA,SAASV,WAAW;AAC7B;AAEO,MAAMgB,eAAeA,GAAG,CAK7BR,UACA,EAAEE,KAAK,EAAED,MAAM,EAAkE;IAEjF,IAAIL,eAAeA,CAACK,YAAYD,UAAU;QACxC,MAAM,IAAIM,UAAU;IACtB;IAEA,OAAO,IAAIP,yBAAyBA,CAClCC,UACAF,iBAAiBA,CAACG,SAClBM,uBAAuBA,CAA6BL;AAExD,EAAE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Types } from 'effect';
|
|
2
|
+
import { type RenderRuntimeContext } from './render-runtime.js';
|
|
3
|
+
declare const ERSCServicesTypeId: unique symbol;
|
|
4
|
+
export declare const ERSCIdentityTypeId: unique symbol;
|
|
5
|
+
export declare const ERSCMemberKindTypeId: unique symbol;
|
|
6
|
+
export declare const ERSCStateTypeId: unique symbol;
|
|
7
|
+
export type ERSCMemberKind = 'Application' | 'Component' | 'ERSC' | 'Layout' | 'Loading' | 'Middleware' | 'Page' | 'Routes' | 'ServerFn';
|
|
8
|
+
export type ERSCIdentity<Services> = {
|
|
9
|
+
readonly [ERSCServicesTypeId]?: Types.Invariant<Services>;
|
|
10
|
+
readonly renderRuntime: RenderRuntimeContext;
|
|
11
|
+
};
|
|
12
|
+
type ERSCMemberKindMarker<Kind extends ERSCMemberKind> = {
|
|
13
|
+
readonly [ERSCMemberKindTypeId]: Kind;
|
|
14
|
+
};
|
|
15
|
+
export type ERSCMember<Services, Kind extends ERSCMemberKind = ERSCMemberKind> = ERSCMemberKindMarker<Kind> & {
|
|
16
|
+
readonly [ERSCIdentityTypeId]: ERSCIdentity<Services>;
|
|
17
|
+
};
|
|
18
|
+
export type ERSCStatefulMember<Services, Kind extends ERSCMemberKind, State> = ERSCMember<Services, Kind> & {
|
|
19
|
+
readonly [ERSCStateTypeId]: State;
|
|
20
|
+
};
|
|
21
|
+
export declare const makeERSCIdentity: <Services>() => ERSCIdentity<Services>;
|
|
22
|
+
export declare const attachERSCMember: <Member extends object, Services, const Kind extends ERSCMemberKind>(member: Member, identity: ERSCIdentity<Services>, kind: Kind) => Member & ERSCMember<Services, Kind>;
|
|
23
|
+
export declare const isERSCMember: <const Kind extends ERSCMemberKind>(value: unknown, kind: Kind) => value is ERSCMemberKindMarker<Kind>;
|
|
24
|
+
export declare const getERSCIdentity: <Services>(member: ERSCMember<Services>) => ERSCIdentity<Services>;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Predicate } from "effect";
|
|
2
|
+
import { makeRenderRuntimeContext } from "./render-runtime.js";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
const ERSCIdentityTypeId = Symbol.for('ersc/ERSCIdentity');
|
|
9
|
+
const ERSCMemberKindTypeId = Symbol.for('ersc/ERSCMemberKind');
|
|
10
|
+
const ERSCStateTypeId = Symbol.for('ersc/ERSCState');
|
|
11
|
+
const makeERSCIdentity = ()=>({
|
|
12
|
+
renderRuntime: makeRenderRuntimeContext()
|
|
13
|
+
});
|
|
14
|
+
const attachERSCMember = (member, identity, kind)=>Object.assign(member, {
|
|
15
|
+
[ERSCIdentityTypeId]: identity,
|
|
16
|
+
[ERSCMemberKindTypeId]: kind
|
|
17
|
+
});
|
|
18
|
+
const isERSCMember = (value, kind)=>Predicate.hasProperty(value, ERSCMemberKindTypeId) && value[ERSCMemberKindTypeId] === kind;
|
|
19
|
+
const getERSCIdentity = (member)=>member[ERSCIdentityTypeId];
|
|
20
|
+
|
|
21
|
+
export { ERSCIdentityTypeId, ERSCMemberKindTypeId, ERSCStateTypeId, attachERSCMember, getERSCIdentity, isERSCMember, makeERSCIdentity };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=ersc-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/ersc-identity.js","sources":["../../src/application/ersc-identity.ts"],"sourcesContent":["import { Predicate, type Types } from 'effect';\n\nimport { makeRenderRuntimeContext, type RenderRuntimeContext } from './render-runtime';\n\ndeclare const ERSCServicesTypeId: unique symbol;\n\nexport const ERSCIdentityTypeId: unique symbol = Symbol.for('ersc/ERSCIdentity');\nexport const ERSCMemberKindTypeId: unique symbol = Symbol.for('ersc/ERSCMemberKind');\nexport const ERSCStateTypeId: unique symbol = Symbol.for('ersc/ERSCState');\n\nexport type ERSCMemberKind =\n | 'Application'\n | 'Component'\n | 'ERSC'\n | 'Layout'\n | 'Loading'\n | 'Middleware'\n | 'Page'\n | 'Routes'\n | 'ServerFn';\n\nexport type ERSCIdentity<Services> = {\n readonly [ERSCServicesTypeId]?: Types.Invariant<Services>;\n readonly renderRuntime: RenderRuntimeContext;\n};\n\ntype ERSCMemberKindMarker<Kind extends ERSCMemberKind> = {\n readonly [ERSCMemberKindTypeId]: Kind;\n};\n\nexport type ERSCMember<\n Services,\n Kind extends ERSCMemberKind = ERSCMemberKind,\n> = ERSCMemberKindMarker<Kind> & {\n readonly [ERSCIdentityTypeId]: ERSCIdentity<Services>;\n};\n\nexport type ERSCStatefulMember<Services, Kind extends ERSCMemberKind, State> = ERSCMember<\n Services,\n Kind\n> & {\n readonly [ERSCStateTypeId]: State;\n};\n\nexport const makeERSCIdentity = <Services>(): ERSCIdentity<Services> => ({\n renderRuntime: makeRenderRuntimeContext(),\n});\n\nexport const attachERSCMember = <\n Member extends object,\n Services,\n const Kind extends ERSCMemberKind,\n>(\n member: Member,\n identity: ERSCIdentity<Services>,\n kind: Kind,\n): Member & ERSCMember<Services, Kind> =>\n Object.assign(member, { [ERSCIdentityTypeId]: identity, [ERSCMemberKindTypeId]: kind });\n\nexport const isERSCMember = <const Kind extends ERSCMemberKind>(\n value: unknown,\n kind: Kind,\n): value is ERSCMemberKindMarker<Kind> =>\n Predicate.hasProperty(value, ERSCMemberKindTypeId) && value[ERSCMemberKindTypeId] === kind;\n\nexport const getERSCIdentity = <Services>(member: ERSCMember<Services>): ERSCIdentity<Services> =>\n member[ERSCIdentityTypeId];\n"],"names":["Predicate","makeRenderRuntimeContext","ERSCIdentityTypeId","Symbol","ERSCMemberKindTypeId","ERSCStateTypeId","makeERSCIdentity","attachERSCMember","member","identity","kind","Object","isERSCMember","value","getERSCIdentity"],"mappings":";;;;;AAA+C;AAEwC;AAIhF,MAAME,kBAAkBA,GAAkBC,OAAO,GAAG,CAAC,qBAAqB;AAC1E,MAAMC,oBAAoBA,GAAkBD,OAAO,GAAG,CAAC,uBAAuB;AAC9E,MAAME,eAAeA,GAAkBF,OAAO,GAAG,CAAC,kBAAkB;AAoCpE,MAAMG,gBAAgBA,GAAG,IAAyC;QACvE,eAAeL,wBAAwBA;IACzC,GAAG;AAEI,MAAMM,gBAAgBA,GAAG,CAK9BC,QACAC,UACAC,OAEAC,OAAO,MAAM,CAACH,QAAQ;QAAE,CAACN,kBAAkBA,CAAC,EAAEO;QAAU,CAACL,oBAAoBA,CAAC,EAAEM;IAAK,GAAG;AAEnF,MAAME,YAAYA,GAAG,CAC1BC,OACAH,OAEAV,qBAAqB,CAACa,OAAOT,oBAAoBA,KAAKS,KAAK,CAACT,oBAAoBA,CAAC,KAAKM,KAAK;AAEtF,MAAMI,eAAeA,GAAG,CAAWN,SACxCA,MAAM,CAACN,kBAAkBA,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ComponentFactory } from './component.js';
|
|
2
|
+
import { type ERSCMake } from './definition.js';
|
|
3
|
+
import { type ERSCMember } from './ersc-identity.js';
|
|
4
|
+
import type { LayoutFactory } from './layout.js';
|
|
5
|
+
import type { LoadingFactory } from './loading.js';
|
|
6
|
+
import { type AnyMiddleware, type MiddlewareFactory, type MiddlewareProvidedServices, type MiddlewareRequiredServices } from './middleware.js';
|
|
7
|
+
import type { PageFactory } from './page.js';
|
|
8
|
+
import type { RoutesFactory } from './routes.js';
|
|
9
|
+
import type { ServerFnFactory } from './server-fn.js';
|
|
10
|
+
type ApplicableMiddleware<AvailableServices, Value> = [
|
|
11
|
+
Exclude<MiddlewareRequiredServices<Value>, AvailableServices>
|
|
12
|
+
] extends [never] ? unknown : never;
|
|
13
|
+
export type ERSC<ApplicationServices, AvailableServices = ApplicationServices> = ERSCMember<ApplicationServices, 'ERSC'> & {
|
|
14
|
+
readonly Component: ComponentFactory<ApplicationServices, AvailableServices>;
|
|
15
|
+
readonly Layout: LayoutFactory<ApplicationServices, AvailableServices>;
|
|
16
|
+
readonly Loading: LoadingFactory<ApplicationServices>;
|
|
17
|
+
readonly Middleware: MiddlewareFactory<ApplicationServices, AvailableServices>;
|
|
18
|
+
readonly Page: PageFactory<ApplicationServices, AvailableServices>;
|
|
19
|
+
readonly Routes: RoutesFactory<ApplicationServices>;
|
|
20
|
+
readonly ServerFn: ServerFnFactory<ApplicationServices, AvailableServices>;
|
|
21
|
+
readonly make: ERSCMake<ApplicationServices>;
|
|
22
|
+
readonly withMiddleware: <Value extends AnyMiddleware<ApplicationServices>>(middleware: Value & ApplicableMiddleware<AvailableServices, Value>) => ERSC<ApplicationServices, AvailableServices | MiddlewareProvidedServices<Value>>;
|
|
23
|
+
};
|
|
24
|
+
declare const ersc: <Services = never>() => ERSC<Services>;
|
|
25
|
+
export declare const Application: {
|
|
26
|
+
readonly ersc: typeof ersc;
|
|
27
|
+
};
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { makeComponentFactory } from "./component.js";
|
|
2
|
+
import { makeApplication } from "./definition.js";
|
|
3
|
+
import { attachERSCMember, getERSCIdentity, makeERSCIdentity } from "./ersc-identity.js";
|
|
4
|
+
import { makeLayoutFactory } from "./layout.js";
|
|
5
|
+
import { makeLoadingFactory } from "./loading.js";
|
|
6
|
+
import { getMiddlewareState, makeMiddlewareFactory } from "./middleware.js";
|
|
7
|
+
import { makePageFactory } from "./page.js";
|
|
8
|
+
import { makeRoutesFactory } from "./routes.js";
|
|
9
|
+
import { makeServerFnFactory } from "./server-fn.js";
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
const makeERSC = (identity, middleware, allocateRouteScopeId, make)=>{
|
|
30
|
+
const withMiddleware = (value)=>{
|
|
31
|
+
getMiddlewareState(value);
|
|
32
|
+
if (getERSCIdentity(value) !== identity) {
|
|
33
|
+
throw new TypeError('Middleware was created by a different ERSC module.');
|
|
34
|
+
}
|
|
35
|
+
if (middleware.includes(value)) {
|
|
36
|
+
throw new TypeError('Middleware cannot appear twice in the same scope.');
|
|
37
|
+
}
|
|
38
|
+
return makeERSC(identity, Object.freeze([
|
|
39
|
+
...middleware,
|
|
40
|
+
value
|
|
41
|
+
]), allocateRouteScopeId, make);
|
|
42
|
+
};
|
|
43
|
+
return Object.freeze(attachERSCMember({
|
|
44
|
+
Component: makeComponentFactory(identity, middleware),
|
|
45
|
+
Layout: makeLayoutFactory(identity, middleware),
|
|
46
|
+
Loading: makeLoadingFactory(identity),
|
|
47
|
+
Middleware: makeMiddlewareFactory(identity),
|
|
48
|
+
Page: makePageFactory(identity, middleware),
|
|
49
|
+
Routes: makeRoutesFactory(identity, middleware, allocateRouteScopeId),
|
|
50
|
+
ServerFn: makeServerFnFactory(identity, middleware),
|
|
51
|
+
make,
|
|
52
|
+
withMiddleware
|
|
53
|
+
}, identity, 'ERSC'));
|
|
54
|
+
};
|
|
55
|
+
const ersc = ()=>{
|
|
56
|
+
const identity = makeERSCIdentity();
|
|
57
|
+
const make = (options)=>makeApplication(identity, options);
|
|
58
|
+
let nextRouteScopeId = 0;
|
|
59
|
+
const allocateRouteScopeId = ()=>{
|
|
60
|
+
const scopeId = nextRouteScopeId;
|
|
61
|
+
nextRouteScopeId += 1;
|
|
62
|
+
return scopeId;
|
|
63
|
+
};
|
|
64
|
+
return makeERSC(identity, Object.freeze([]), allocateRouteScopeId, make);
|
|
65
|
+
};
|
|
66
|
+
const Application = {
|
|
67
|
+
ersc: ersc
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export { Application };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=ersc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/ersc.js","sources":["../../src/application/ersc.ts"],"sourcesContent":["import type { ComponentFactory } from './component';\nimport { makeComponentFactory } from './component';\nimport { type ERSCMake, makeApplication } from './definition';\nimport {\n attachERSCMember,\n type ERSCIdentity,\n type ERSCMember,\n getERSCIdentity,\n makeERSCIdentity,\n} from './ersc-identity';\nimport type { LayoutFactory } from './layout';\nimport { makeLayoutFactory } from './layout';\nimport type { LoadingFactory } from './loading';\nimport { makeLoadingFactory } from './loading';\nimport {\n type AnyMiddleware,\n getMiddlewareState,\n type MiddlewareFactory,\n type MiddlewareProvidedServices,\n type MiddlewareRequiredServices,\n makeMiddlewareFactory,\n} from './middleware';\nimport type { PageFactory } from './page';\nimport { makePageFactory } from './page';\nimport type { RoutesFactory } from './routes';\nimport { makeRoutesFactory } from './routes';\nimport type { ServerFnFactory } from './server-fn';\nimport { makeServerFnFactory } from './server-fn';\n\ntype ApplicableMiddleware<AvailableServices, Value> = [\n Exclude<MiddlewareRequiredServices<Value>, AvailableServices>,\n] extends [never]\n ? unknown\n : never;\n\nexport type ERSC<ApplicationServices, AvailableServices = ApplicationServices> = ERSCMember<\n ApplicationServices,\n 'ERSC'\n> & {\n readonly Component: ComponentFactory<ApplicationServices, AvailableServices>;\n readonly Layout: LayoutFactory<ApplicationServices, AvailableServices>;\n readonly Loading: LoadingFactory<ApplicationServices>;\n readonly Middleware: MiddlewareFactory<ApplicationServices, AvailableServices>;\n readonly Page: PageFactory<ApplicationServices, AvailableServices>;\n readonly Routes: RoutesFactory<ApplicationServices>;\n readonly ServerFn: ServerFnFactory<ApplicationServices, AvailableServices>;\n readonly make: ERSCMake<ApplicationServices>;\n readonly withMiddleware: <Value extends AnyMiddleware<ApplicationServices>>(\n middleware: Value & ApplicableMiddleware<AvailableServices, Value>,\n ) => ERSC<ApplicationServices, AvailableServices | MiddlewareProvidedServices<Value>>;\n};\n\nconst makeERSC = <ApplicationServices, AvailableServices>(\n identity: ERSCIdentity<ApplicationServices>,\n middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>,\n allocateRouteScopeId: () => number,\n make: ERSCMake<ApplicationServices>,\n): ERSC<ApplicationServices, AvailableServices> => {\n const withMiddleware = <Value extends AnyMiddleware<ApplicationServices>>(\n value: Value & ApplicableMiddleware<AvailableServices, Value>,\n ): ERSC<ApplicationServices, AvailableServices | MiddlewareProvidedServices<Value>> => {\n getMiddlewareState(value);\n if (getERSCIdentity(value) !== identity) {\n throw new TypeError('Middleware was created by a different ERSC module.');\n }\n if (middleware.includes(value)) {\n throw new TypeError('Middleware cannot appear twice in the same scope.');\n }\n\n return makeERSC(identity, Object.freeze([...middleware, value]), allocateRouteScopeId, make);\n };\n\n return Object.freeze(\n attachERSCMember(\n {\n Component: makeComponentFactory<ApplicationServices, AvailableServices>(\n identity,\n middleware,\n ),\n Layout: makeLayoutFactory<ApplicationServices, AvailableServices>(identity, middleware),\n Loading: makeLoadingFactory(identity),\n Middleware: makeMiddlewareFactory<ApplicationServices, AvailableServices>(identity),\n Page: makePageFactory<ApplicationServices, AvailableServices>(identity, middleware),\n Routes: makeRoutesFactory(identity, middleware, allocateRouteScopeId),\n ServerFn: makeServerFnFactory<ApplicationServices, AvailableServices>(identity, middleware),\n make,\n withMiddleware,\n },\n identity,\n 'ERSC',\n ),\n );\n};\n\nconst ersc = <Services = never>(): ERSC<Services> => {\n const identity = makeERSCIdentity<Services>();\n const make: ERSCMake<Services> = (options) => makeApplication(identity, options);\n let nextRouteScopeId = 0;\n const allocateRouteScopeId = () => {\n const scopeId = nextRouteScopeId;\n nextRouteScopeId += 1;\n return scopeId;\n };\n\n return makeERSC(identity, Object.freeze([]), allocateRouteScopeId, make);\n};\n\nexport const Application = { ersc } as const;\n"],"names":["makeComponentFactory","makeApplication","attachERSCMember","getERSCIdentity","makeERSCIdentity","makeLayoutFactory","makeLoadingFactory","getMiddlewareState","makeMiddlewareFactory","makePageFactory","makeRoutesFactory","makeServerFnFactory","makeERSC","identity","middleware","allocateRouteScopeId","make","withMiddleware","value","TypeError","Object","ersc","options","nextRouteScopeId","scopeId","Application"],"mappings":";;;;;;;;;;;;;;;;;;;AACmD;AACW;AAOrC;AAEoB;AAEE;AAQzB;AAEmB;AAEI;AAEK;AAyBlD,MAAMY,QAAQA,GAAG,CACfC,UACAC,YACAC,sBACAC;IAEA,MAAMC,iBAAiB,CACrBC;QAEAX,kBAAkBA,CAACW;QACnB,IAAIf,eAAeA,CAACe,WAAWL,UAAU;YACvC,MAAM,IAAIM,UAAU;QACtB;QACA,IAAIL,WAAW,QAAQ,CAACI,QAAQ;YAC9B,MAAM,IAAIC,UAAU;QACtB;QAEA,OAAOP,QAAQA,CAACC,UAAUO,OAAO,MAAM,CAAC;eAAIN;YAAYI;SAAM,GAAGH,sBAAsBC;IACzF;IAEA,OAAOI,OAAO,MAAM,CAClBlB,gBAAgBA,CACd;QACE,WAAWF,oBAAoBA,CAC7Ba,UACAC;QAEF,QAAQT,iBAAiBA,CAAyCQ,UAAUC;QAC5E,SAASR,kBAAkBA,CAACO;QAC5B,YAAYL,qBAAqBA,CAAyCK;QAC1E,MAAMJ,eAAeA,CAAyCI,UAAUC;QACxE,QAAQJ,iBAAiBA,CAACG,UAAUC,YAAYC;QAChD,UAAUJ,mBAAmBA,CAAyCE,UAAUC;QAChFE;QACAC;IACF,GACAJ,UACA;AAGN;AAEA,MAAMQ,IAAIA,GAAG;IACX,MAAMR,WAAWT,gBAAgBA;IACjC,MAAMY,OAA2B,CAACM,UAAYrB,eAAeA,CAACY,UAAUS;IACxE,IAAIC,mBAAmB;IACvB,MAAMR,uBAAuB;QAC3B,MAAMS,UAAUD;QAChBA,oBAAoB;QACpB,OAAOC;IACT;IAEA,OAAOZ,QAAQA,CAACC,UAAUO,OAAO,MAAM,CAAC,EAAE,GAAGL,sBAAsBC;AACrE;AAEO,MAAMS,WAAWA,GAAG;IAAEJ,UAAIA;AAAC,EAAW"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import { type ERSCIdentity, type ERSCMember } from './ersc-identity.js';
|
|
4
|
+
import type { AnyMiddleware } from './middleware.js';
|
|
5
|
+
type LayoutProps = {
|
|
6
|
+
readonly children: Awaited<ReactNode>;
|
|
7
|
+
};
|
|
8
|
+
export interface LayoutComponent<ApplicationServices> extends ERSCMember<ApplicationServices, 'Layout'> {
|
|
9
|
+
(props: LayoutProps): Promise<Awaited<ReactNode>>;
|
|
10
|
+
}
|
|
11
|
+
type LayoutOptions<Error, AvailableServices> = {
|
|
12
|
+
readonly render: (props: LayoutProps) => Effect.Effect<Awaited<ReactNode>, Error, AvailableServices>;
|
|
13
|
+
};
|
|
14
|
+
export type LayoutFactory<ApplicationServices, AvailableServices> = {
|
|
15
|
+
readonly make: <Error>(options: LayoutOptions<Error, AvailableServices>) => LayoutComponent<ApplicationServices>;
|
|
16
|
+
};
|
|
17
|
+
export declare const makeLayoutFactory: <ApplicationServices, AvailableServices>(identity: ERSCIdentity<ApplicationServices>, middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>) => LayoutFactory<ApplicationServices, AvailableServices>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { attachERSCMember } from "./ersc-identity.js";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
const makeLayoutFactory = (identity, middleware)=>({
|
|
9
|
+
make: ({ render })=>{
|
|
10
|
+
const LayoutComponent = (props)=>identity.renderRuntime.run('Layout', Effect.suspend(()=>render(props)), middleware);
|
|
11
|
+
return attachERSCMember(LayoutComponent, identity, 'Layout');
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export { makeLayoutFactory };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/layout.js","sources":["../../src/application/layout.ts"],"sourcesContent":["import { Effect } from 'effect';\nimport type { ReactNode } from 'react';\n\nimport { attachERSCMember, type ERSCIdentity, type ERSCMember } from './ersc-identity';\nimport type { AnyMiddleware } from './middleware';\n\ntype LayoutProps = {\n readonly children: Awaited<ReactNode>;\n};\n\nexport interface LayoutComponent<ApplicationServices> extends ERSCMember<\n ApplicationServices,\n 'Layout'\n> {\n (props: LayoutProps): Promise<Awaited<ReactNode>>;\n}\n\ntype LayoutOptions<Error, AvailableServices> = {\n readonly render: (\n props: LayoutProps,\n ) => Effect.Effect<Awaited<ReactNode>, Error, AvailableServices>;\n};\n\nexport type LayoutFactory<ApplicationServices, AvailableServices> = {\n readonly make: <Error>(\n options: LayoutOptions<Error, AvailableServices>,\n ) => LayoutComponent<ApplicationServices>;\n};\n\nexport const makeLayoutFactory = <ApplicationServices, AvailableServices>(\n identity: ERSCIdentity<ApplicationServices>,\n middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>,\n): LayoutFactory<ApplicationServices, AvailableServices> => ({\n make: ({ render }) => {\n const LayoutComponent = (props: LayoutProps) =>\n identity.renderRuntime.run(\n 'Layout',\n Effect.suspend(() => render(props)),\n middleware,\n );\n\n return attachERSCMember(LayoutComponent, identity, 'Layout');\n },\n});\n"],"names":["Effect","attachERSCMember","makeLayoutFactory","identity","middleware","render","LayoutComponent","props"],"mappings":";;;;;AAAgC;AAGuD;AA0BhF,MAAME,iBAAiBA,GAAG,CAC/BC,UACAC,aAC2D;QAC3D,MAAM,CAAC,EAAEC,MAAM,EAAE;YACf,MAAMC,kBAAkB,CAACC,QACvBJ,SAAS,aAAa,CAAC,GAAG,CACxB,UACAH,cAAc,CAAC,IAAMK,OAAOE,SAC5BH;YAGJ,OAAOH,gBAAgBA,CAACK,iBAAiBH,UAAU;QACrD;IACF,GAAG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Effect } from 'effect';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import { type ERSCIdentity, type ERSCMember } from './ersc-identity.js';
|
|
4
|
+
export interface LoadingComponent<Services> extends ERSCMember<Services, 'Loading'> {
|
|
5
|
+
(): Awaited<ReactNode>;
|
|
6
|
+
}
|
|
7
|
+
type NonEffectOutput<Output> = [Extract<Output, Effect.Effect<unknown, unknown, unknown>>] extends [
|
|
8
|
+
never
|
|
9
|
+
] ? unknown : never;
|
|
10
|
+
type LoadingOptions<Output extends Awaited<ReactNode>> = {
|
|
11
|
+
readonly render: (() => Output) & NonEffectOutput<Output>;
|
|
12
|
+
};
|
|
13
|
+
export type LoadingFactory<Services> = {
|
|
14
|
+
readonly make: <Output extends Awaited<ReactNode>>(options: LoadingOptions<Output>) => LoadingComponent<Services>;
|
|
15
|
+
};
|
|
16
|
+
export declare const makeLoadingFactory: <Services>(identity: ERSCIdentity<Services>) => LoadingFactory<Services>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { attachERSCMember } from "./ersc-identity.js";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const makeLoadingFactory = (identity)=>({
|
|
6
|
+
make: ({ render })=>{
|
|
7
|
+
const LoadingComponent = ()=>render();
|
|
8
|
+
return attachERSCMember(LoadingComponent, identity, 'Loading');
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export { makeLoadingFactory };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=loading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/loading.js","sources":["../../src/application/loading.ts"],"sourcesContent":["import { type Effect } from 'effect';\nimport type { ReactNode } from 'react';\n\nimport { attachERSCMember, type ERSCIdentity, type ERSCMember } from './ersc-identity';\n\nexport interface LoadingComponent<Services> extends ERSCMember<Services, 'Loading'> {\n (): Awaited<ReactNode>;\n}\n\ntype NonEffectOutput<Output> = [Extract<Output, Effect.Effect<unknown, unknown, unknown>>] extends [\n never,\n]\n ? unknown\n : never;\n\ntype LoadingOptions<Output extends Awaited<ReactNode>> = {\n readonly render: (() => Output) & NonEffectOutput<Output>;\n};\n\nexport type LoadingFactory<Services> = {\n readonly make: <Output extends Awaited<ReactNode>>(\n options: LoadingOptions<Output>,\n ) => LoadingComponent<Services>;\n};\n\nexport const makeLoadingFactory = <Services>(\n identity: ERSCIdentity<Services>,\n): LoadingFactory<Services> => ({\n make: ({ render }) => {\n const LoadingComponent = () => render();\n return attachERSCMember(LoadingComponent, identity, 'Loading');\n },\n});\n"],"names":["attachERSCMember","makeLoadingFactory","identity","render","LoadingComponent"],"mappings":";;;AAGuF;AAsBhF,MAAMC,kBAAkBA,GAAG,CAChCC,WAC8B;QAC9B,MAAM,CAAC,EAAEC,MAAM,EAAE;YACf,MAAMC,mBAAmB,IAAMD;YAC/B,OAAOH,gBAAgBA,CAACI,kBAAkBF,UAAU;QACtD;IACF,GAAG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Effect } from 'effect';
|
|
2
|
+
import { HttpRouter, type HttpServerResponse } from 'effect/unstable/http';
|
|
3
|
+
import { type ERSCIdentity, type ERSCStatefulMember } from './ersc-identity.js';
|
|
4
|
+
type MiddlewareConfig = {
|
|
5
|
+
readonly provides?: unknown;
|
|
6
|
+
};
|
|
7
|
+
type MiddlewareProvides<Config extends MiddlewareConfig> = Config extends {
|
|
8
|
+
readonly provides: infer Provides;
|
|
9
|
+
} ? Provides : never;
|
|
10
|
+
type MiddlewareHandler<AvailableServices, Provides> = <Error, RemainingServices>(httpEffect: Effect.Effect<HttpServerResponse.HttpServerResponse, Error, Provides | RemainingServices>) => Effect.Effect<HttpServerResponse.HttpServerResponse, Error, AvailableServices | HttpRouter.Provided | RemainingServices>;
|
|
11
|
+
export interface Middleware<ApplicationServices, out RequiredServices, out ProvidedServices> extends ERSCStatefulMember<ApplicationServices, 'Middleware', MiddlewareImplementationState<RequiredServices, ProvidedServices>> {
|
|
12
|
+
}
|
|
13
|
+
export type AnyMiddleware<ApplicationServices> = Middleware<ApplicationServices, unknown, unknown>;
|
|
14
|
+
type HttpMiddleware<RequiredServices, ProvidedServices> = HttpRouter.Middleware<{
|
|
15
|
+
readonly error: never;
|
|
16
|
+
readonly handles: never;
|
|
17
|
+
readonly layerError: never;
|
|
18
|
+
readonly layerRequires: never;
|
|
19
|
+
readonly provides: ProvidedServices;
|
|
20
|
+
readonly requires: Exclude<RequiredServices, HttpRouter.Provided>;
|
|
21
|
+
}>;
|
|
22
|
+
export type MiddlewareImplementationState<RequiredServices, ProvidedServices> = {
|
|
23
|
+
readonly handler: MiddlewareHandler<RequiredServices, ProvidedServices>;
|
|
24
|
+
readonly httpMiddleware: HttpMiddleware<RequiredServices, ProvidedServices>;
|
|
25
|
+
};
|
|
26
|
+
export declare const getMiddlewareState: <ApplicationServices, RequiredServices, ProvidedServices>(middleware: Middleware<ApplicationServices, RequiredServices, ProvidedServices>) => MiddlewareImplementationState<RequiredServices, ProvidedServices>;
|
|
27
|
+
export declare const getScopedMiddlewareHandler: <ApplicationServices>(middleware: AnyMiddleware<ApplicationServices>) => MiddlewareHandler<ApplicationServices | HttpRouter.Provided, never>;
|
|
28
|
+
export declare const applyMiddleware: <ApplicationServices, Error, RemainingServices>(middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>, httpEffect: Effect.Effect<HttpServerResponse.HttpServerResponse, Error, ApplicationServices | HttpRouter.Provided | RemainingServices>) => Effect.Effect<HttpServerResponse.HttpServerResponse, Error, ApplicationServices | RemainingServices | HttpRouter.Provided>;
|
|
29
|
+
export declare function getScopedHttpMiddleware<ApplicationServices>(middleware: AnyMiddleware<ApplicationServices>): HttpMiddleware<never, never>;
|
|
30
|
+
export type MiddlewareFactory<ApplicationServices, AvailableServices> = {
|
|
31
|
+
readonly make: <Config extends MiddlewareConfig = {}>(handler: MiddlewareHandler<AvailableServices, MiddlewareProvides<Config>>) => Middleware<ApplicationServices, AvailableServices, MiddlewareProvides<Config>>;
|
|
32
|
+
};
|
|
33
|
+
export declare const makeMiddlewareFactory: <ApplicationServices, AvailableServices>(identity: ERSCIdentity<ApplicationServices>) => MiddlewareFactory<ApplicationServices, AvailableServices>;
|
|
34
|
+
export type MiddlewareProvidedServices<Value> = Value extends Middleware<infer _ApplicationServices, infer _RequiredServices, infer ProvidedServices> ? ProvidedServices : never;
|
|
35
|
+
export type MiddlewareRequiredServices<Value> = Value extends Middleware<infer _ApplicationServices, infer RequiredServices, infer _ProvidedServices> ? RequiredServices : never;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { HttpRouter } from "effect/unstable/http";
|
|
2
|
+
import { ERSCIdentityTypeId, ERSCMemberKindTypeId, ERSCStateTypeId, isERSCMember } from "./ersc-identity.js";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class MiddlewareImpl {
|
|
9
|
+
[ERSCIdentityTypeId];
|
|
10
|
+
[ERSCMemberKindTypeId] = 'Middleware';
|
|
11
|
+
get [ERSCStateTypeId]() {
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
handler;
|
|
15
|
+
httpMiddleware;
|
|
16
|
+
constructor(identity, handler, httpMiddleware){
|
|
17
|
+
this[ERSCIdentityTypeId] = identity;
|
|
18
|
+
this.handler = handler;
|
|
19
|
+
this.httpMiddleware = httpMiddleware;
|
|
20
|
+
Object.freeze(this);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const getMiddlewareState = (middleware)=>{
|
|
24
|
+
if (!isERSCMember(middleware, 'Middleware')) {
|
|
25
|
+
throw new TypeError('Middleware must be created with ERSC.Middleware.make.');
|
|
26
|
+
}
|
|
27
|
+
return middleware[ERSCStateTypeId];
|
|
28
|
+
};
|
|
29
|
+
const getScopedMiddlewareHandler = (middleware)=>getMiddlewareState(middleware).handler;
|
|
30
|
+
const applyMiddleware = (middleware, httpEffect)=>middleware.reduceRight((current, value)=>getScopedMiddlewareHandler(value)(current), httpEffect);
|
|
31
|
+
// AnyMiddleware erases each link's service contract after withMiddleware has validated the ordered
|
|
32
|
+
// chain. Callers must compose that complete chain inside the application and request context; the
|
|
33
|
+
// returned native descriptor retains the real runtime provisioning behavior.
|
|
34
|
+
function getScopedHttpMiddleware(middleware) {
|
|
35
|
+
return getMiddlewareState(middleware).httpMiddleware;
|
|
36
|
+
}
|
|
37
|
+
const makeMiddlewareFactory = (identity)=>({
|
|
38
|
+
make: (handler)=>{
|
|
39
|
+
const httpHandler = (httpEffect)=>handler(httpEffect);
|
|
40
|
+
return new MiddlewareImpl(identity, handler, HttpRouter.middleware()(httpHandler));
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export { applyMiddleware, getMiddlewareState, getScopedHttpMiddleware, getScopedMiddlewareHandler, makeMiddlewareFactory };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/middleware.js","sources":["../../src/application/middleware.ts"],"sourcesContent":["import { type Effect, type Types } from 'effect';\nimport { HttpRouter, type HttpServerResponse } from 'effect/unstable/http';\n\nimport {\n type ERSCIdentity,\n ERSCIdentityTypeId,\n isERSCMember,\n ERSCMemberKindTypeId,\n type ERSCStatefulMember,\n ERSCStateTypeId,\n} from './ersc-identity';\n\ntype MiddlewareConfig = {\n readonly provides?: unknown;\n};\n\ntype MiddlewareProvides<Config extends MiddlewareConfig> = Config extends {\n readonly provides: infer Provides;\n}\n ? Provides\n : never;\n\ntype MiddlewareHandler<AvailableServices, Provides> = <Error, RemainingServices>(\n httpEffect: Effect.Effect<\n HttpServerResponse.HttpServerResponse,\n Error,\n Provides | RemainingServices\n >,\n) => Effect.Effect<\n HttpServerResponse.HttpServerResponse,\n Error,\n AvailableServices | HttpRouter.Provided | RemainingServices\n>;\n\nexport interface Middleware<\n ApplicationServices,\n out RequiredServices,\n out ProvidedServices,\n> extends ERSCStatefulMember<\n ApplicationServices,\n 'Middleware',\n MiddlewareImplementationState<RequiredServices, ProvidedServices>\n> {}\n\nexport type AnyMiddleware<ApplicationServices> = Middleware<ApplicationServices, unknown, unknown>;\n\ntype HttpMiddleware<RequiredServices, ProvidedServices> = HttpRouter.Middleware<{\n readonly error: never;\n readonly handles: never;\n readonly layerError: never;\n readonly layerRequires: never;\n readonly provides: ProvidedServices;\n readonly requires: Exclude<RequiredServices, HttpRouter.Provided>;\n}>;\n\nexport type MiddlewareImplementationState<RequiredServices, ProvidedServices> = {\n // Page GET/HEAD composes the native descriptor so Effect HTTP retains routing semantics such as\n // HEAD fallback. Server Function POST keeps the handler because its scope is known only after\n // React decodes the invoked reference.\n readonly handler: MiddlewareHandler<RequiredServices, ProvidedServices>;\n readonly httpMiddleware: HttpMiddleware<RequiredServices, ProvidedServices>;\n};\n\nclass MiddlewareImpl<ApplicationServices, RequiredServices, ProvidedServices>\n implements\n Middleware<ApplicationServices, RequiredServices, ProvidedServices>,\n MiddlewareImplementationState<RequiredServices, ProvidedServices>\n{\n readonly [ERSCIdentityTypeId]: ERSCIdentity<ApplicationServices>;\n readonly [ERSCMemberKindTypeId] = 'Middleware' as const;\n get [ERSCStateTypeId](): MiddlewareImplementationState<RequiredServices, ProvidedServices> {\n return this;\n }\n readonly handler: MiddlewareHandler<RequiredServices, ProvidedServices>;\n readonly httpMiddleware: HttpMiddleware<RequiredServices, ProvidedServices>;\n\n constructor(\n identity: ERSCIdentity<ApplicationServices>,\n handler: MiddlewareHandler<RequiredServices, ProvidedServices>,\n httpMiddleware: HttpMiddleware<RequiredServices, ProvidedServices>,\n ) {\n this[ERSCIdentityTypeId] = identity;\n this.handler = handler;\n this.httpMiddleware = httpMiddleware;\n Object.freeze(this);\n }\n}\n\nexport const getMiddlewareState = <ApplicationServices, RequiredServices, ProvidedServices>(\n middleware: Middleware<ApplicationServices, RequiredServices, ProvidedServices>,\n): MiddlewareImplementationState<RequiredServices, ProvidedServices> => {\n if (!isERSCMember(middleware, 'Middleware')) {\n throw new TypeError('Middleware must be created with ERSC.Middleware.make.');\n }\n return middleware[ERSCStateTypeId];\n};\n\nexport const getScopedMiddlewareHandler = <ApplicationServices>(\n middleware: AnyMiddleware<ApplicationServices>,\n): MiddlewareHandler<ApplicationServices | HttpRouter.Provided, never> =>\n getMiddlewareState(middleware).handler;\n\nexport const applyMiddleware = <ApplicationServices, Error, RemainingServices>(\n middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>,\n httpEffect: Effect.Effect<\n HttpServerResponse.HttpServerResponse,\n Error,\n ApplicationServices | HttpRouter.Provided | RemainingServices\n >,\n) =>\n middleware.reduceRight(\n (current, value) => getScopedMiddlewareHandler(value)(current),\n httpEffect,\n );\n\nexport function getScopedHttpMiddleware<ApplicationServices>(\n middleware: AnyMiddleware<ApplicationServices>,\n): HttpMiddleware<never, never>;\n// AnyMiddleware erases each link's service contract after withMiddleware has validated the ordered\n// chain. Callers must compose that complete chain inside the application and request context; the\n// returned native descriptor retains the real runtime provisioning behavior.\nexport function getScopedHttpMiddleware(middleware: AnyMiddleware<unknown>) {\n return getMiddlewareState(middleware).httpMiddleware;\n}\n\nexport type MiddlewareFactory<ApplicationServices, AvailableServices> = {\n readonly make: <Config extends MiddlewareConfig = {}>(\n handler: MiddlewareHandler<AvailableServices, MiddlewareProvides<Config>>,\n ) => Middleware<ApplicationServices, AvailableServices, MiddlewareProvides<Config>>;\n};\n\nexport const makeMiddlewareFactory = <ApplicationServices, AvailableServices>(\n identity: ERSCIdentity<ApplicationServices>,\n): MiddlewareFactory<ApplicationServices, AvailableServices> => ({\n make: <Config extends MiddlewareConfig = {}>(\n handler: MiddlewareHandler<AvailableServices, MiddlewareProvides<Config>>,\n ): Middleware<ApplicationServices, AvailableServices, MiddlewareProvides<Config>> => {\n type Provides = MiddlewareProvides<Config>;\n const httpHandler = (\n httpEffect: Effect.Effect<HttpServerResponse.HttpServerResponse, Types.unhandled, Provides>,\n ) => handler<Types.unhandled, never>(httpEffect);\n return new MiddlewareImpl(\n identity,\n handler,\n HttpRouter.middleware<{ provides: Provides }>()(httpHandler),\n );\n },\n});\n\nexport type MiddlewareProvidedServices<Value> =\n Value extends Middleware<\n infer _ApplicationServices,\n infer _RequiredServices,\n infer ProvidedServices\n >\n ? ProvidedServices\n : never;\n\nexport type MiddlewareRequiredServices<Value> =\n Value extends Middleware<\n infer _ApplicationServices,\n infer RequiredServices,\n infer _ProvidedServices\n >\n ? RequiredServices\n : never;\n"],"names":["HttpRouter","ERSCIdentityTypeId","isERSCMember","ERSCMemberKindTypeId","ERSCStateTypeId","MiddlewareImpl","identity","handler","httpMiddleware","Object","getMiddlewareState","middleware","TypeError","getScopedMiddlewareHandler","applyMiddleware","httpEffect","current","value","getScopedHttpMiddleware","makeMiddlewareFactory","httpHandler"],"mappings":";;;;;AAC2E;AASlD;AAqDzB,MAAMK,cAAcA;IAKT,CAACJ,kBAAkBA,CAAC,CAAoC;IACxD,CAACE,oBAAoBA,CAAC,GAAG,aAAsB;IACxD,IAAI,CAACC,eAAeA,CAAC,GAAsE;QACzF,OAAO,IAAI;IACb;IACS,QAA+D;IAC/D,eAAmE;IAE5E,YACEE,QAA2C,EAC3CC,OAA8D,EAC9DC,cAAkE,CAClE;QACA,IAAI,CAACP,kBAAkBA,CAAC,GAAGK;QAC3B,IAAI,CAAC,OAAO,GAAGC;QACf,IAAI,CAAC,cAAc,GAAGC;QACtBC,OAAO,MAAM,CAAC,IAAI;IACpB;AACF;AAEO,MAAMC,kBAAkBA,GAAG,CAChCC;IAEA,IAAI,CAACT,YAAYA,CAACS,YAAY,eAAe;QAC3C,MAAM,IAAIC,UAAU;IACtB;IACA,OAAOD,UAAU,CAACP,eAAeA,CAAC;AACpC,EAAE;AAEK,MAAMS,0BAA0BA,GAAG,CACxCF,aAEAD,kBAAkBA,CAACC,YAAY,OAAO,CAAC;AAElC,MAAMG,eAAeA,GAAG,CAC7BH,YACAI,aAMAJ,WAAW,WAAW,CACpB,CAACK,SAASC,QAAUJ,0BAA0BA,CAACI,OAAOD,UACtDD,YACA;AAKJ,mGAAmG;AACnG,kGAAkG;AAClG,6EAA6E;AACtE,SAASG,uBAAuBA,CAACP,UAAkC;IACxE,OAAOD,kBAAkBA,CAACC,YAAY,cAAc;AACtD;AAQO,MAAMQ,qBAAqBA,GAAG,CACnCb,WAC+D;QAC/D,MAAM,CACJC;YAGA,MAAMa,cAAc,CAClBL,aACGR,QAAgCQ;YACrC,OAAO,IAAIV,cAAcA,CACvBC,UACAC,SACAP,qBAAqB,GAA2BoB;QAEpD;IACF,GAAG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Effect, Schema, type Types } from 'effect';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import { type ERSCIdentity, type ERSCStatefulMember } from './ersc-identity.js';
|
|
4
|
+
import type { AnyMiddleware } from './middleware.js';
|
|
5
|
+
import type { ValidRouteParamName } from './route-path.js';
|
|
6
|
+
declare const PageContractTypeId: unique symbol;
|
|
7
|
+
export type PageParamsSchema<Services> = Schema.ConstraintCodec<Readonly<Record<string, unknown>>, Readonly<Record<string, unknown>>, Services, unknown>;
|
|
8
|
+
type PageParamKeys<ParamsSchema> = ParamsSchema extends {
|
|
9
|
+
readonly Encoded: infer Encoded;
|
|
10
|
+
} ? Extract<keyof Encoded, string> : never;
|
|
11
|
+
type NonStringPageParamKeys<ParamsSchema> = ParamsSchema extends {
|
|
12
|
+
readonly Encoded: infer Encoded;
|
|
13
|
+
} ? Exclude<keyof Encoded, string> : never;
|
|
14
|
+
type InvalidPageParamName<Name extends string> = Name extends ValidRouteParamName<Name> ? never : Name;
|
|
15
|
+
type InvalidPageParamValueKeys<ParamsSchema> = ParamsSchema extends {
|
|
16
|
+
readonly Encoded: infer Encoded;
|
|
17
|
+
} ? {
|
|
18
|
+
[Key in Extract<keyof Encoded, string>]-?: unknown extends Encoded[Key] ? never : [Extract<Encoded[Key], string>] extends [never] ? Key : never;
|
|
19
|
+
}[Extract<keyof Encoded, string>] : never;
|
|
20
|
+
type InvalidPageParamsSchema<ParamsSchema> = NonStringPageParamKeys<ParamsSchema> | InvalidPageParamName<PageParamKeys<ParamsSchema>> | InvalidPageParamValueKeys<ParamsSchema>;
|
|
21
|
+
type ValidPageParamsSchema<ParamsSchema> = [PageParamKeys<ParamsSchema>] extends [never] ? never : string extends PageParamKeys<ParamsSchema> ? never : [InvalidPageParamsSchema<ParamsSchema>] extends [never] ? unknown : never;
|
|
22
|
+
export type PageConcern<out ParamNames extends string, out Mode extends 'Parameterized' | 'Static'> = {
|
|
23
|
+
readonly [PageContractTypeId]: {
|
|
24
|
+
readonly mode: Types.Covariant<Mode>;
|
|
25
|
+
readonly paramNames: Types.Covariant<ParamNames>;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export type PagePathParams = Readonly<Record<string, string | undefined>>;
|
|
29
|
+
export type PageRuntimeProps<ParamNames extends string = string> = {
|
|
30
|
+
readonly params: Readonly<Record<ParamNames, string | undefined>>;
|
|
31
|
+
};
|
|
32
|
+
export type PageComponent<ParamNames extends string = string> = (props: PageRuntimeProps<ParamNames>) => Promise<Awaited<ReactNode>>;
|
|
33
|
+
export type StaticPageDefinition<Services> = ERSCStatefulMember<Services, 'Page', PageImplementationState> & PageConcern<never, 'Static'>;
|
|
34
|
+
export type ParameterizedPageDefinition<Services, ParamNames extends string = string> = ERSCStatefulMember<Services, 'Page', PageImplementationState> & PageConcern<ParamNames, 'Parameterized'>;
|
|
35
|
+
export type AnyPageDefinition<Services> = StaticPageDefinition<Services> | ParameterizedPageDefinition<Services>;
|
|
36
|
+
export type PageImplementationState = {
|
|
37
|
+
readonly component: PageComponent;
|
|
38
|
+
readonly paramsSchema: Schema.Constraint | null;
|
|
39
|
+
};
|
|
40
|
+
export declare const getPageState: <Services>(page: AnyPageDefinition<Services>) => PageImplementationState;
|
|
41
|
+
type StaticPageOptions<Error, Services> = {
|
|
42
|
+
readonly params?: never;
|
|
43
|
+
readonly render: () => Effect.Effect<Awaited<ReactNode>, Error, Services>;
|
|
44
|
+
};
|
|
45
|
+
type ParameterizedPageOptions<ParamsSchema extends PageParamsSchema<Services>, Error, Services> = {
|
|
46
|
+
readonly params: ParamsSchema;
|
|
47
|
+
readonly render: (props: {
|
|
48
|
+
readonly params: ParamsSchema['Type'];
|
|
49
|
+
}) => Effect.Effect<Awaited<ReactNode>, Error, Services>;
|
|
50
|
+
};
|
|
51
|
+
export type PageFactory<ApplicationServices, AvailableServices> = {
|
|
52
|
+
readonly make: {
|
|
53
|
+
<ParamsSchema extends PageParamsSchema<AvailableServices>, Error>(options: ParameterizedPageOptions<ParamsSchema, Error, AvailableServices> & ValidPageParamsSchema<ParamsSchema>): ParameterizedPageDefinition<ApplicationServices, PageParamKeys<ParamsSchema>>;
|
|
54
|
+
<Error>(options: StaticPageOptions<Error, AvailableServices>): StaticPageDefinition<ApplicationServices>;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
export declare const makePageFactory: <ApplicationServices, AvailableServices>(identity: ERSCIdentity<ApplicationServices>, middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>) => PageFactory<ApplicationServices, AvailableServices>;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { ERSCIdentityTypeId, ERSCMemberKindTypeId, ERSCStateTypeId, isERSCMember } from "./ersc-identity.js";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PageDefinitionImpl {
|
|
9
|
+
[ERSCIdentityTypeId];
|
|
10
|
+
[ERSCMemberKindTypeId] = 'Page';
|
|
11
|
+
get [ERSCStateTypeId]() {
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
component;
|
|
15
|
+
paramsSchema;
|
|
16
|
+
constructor(identity, component, paramsSchema){
|
|
17
|
+
this[ERSCIdentityTypeId] = identity;
|
|
18
|
+
this.component = component;
|
|
19
|
+
this.paramsSchema = paramsSchema;
|
|
20
|
+
Object.freeze(this);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const getPageState = (page)=>{
|
|
24
|
+
if (!isERSCMember(page, 'Page')) {
|
|
25
|
+
throw new TypeError('Page must be created with ERSC.Page.make.');
|
|
26
|
+
}
|
|
27
|
+
return page[ERSCStateTypeId];
|
|
28
|
+
};
|
|
29
|
+
const makePageFactory = (identity, middleware)=>{
|
|
30
|
+
function make(options) {
|
|
31
|
+
if ('params' in options) {
|
|
32
|
+
const { params: paramsSchema, render } = options;
|
|
33
|
+
const decodeParams = Schema.decodeUnknownEffect(paramsSchema);
|
|
34
|
+
const component = ({ params })=>identity.renderRuntime.run('Page', decodeParams(params).pipe(Effect.flatMap((decodedParams)=>Effect.suspend(()=>render({
|
|
35
|
+
params: decodedParams
|
|
36
|
+
})))), middleware);
|
|
37
|
+
return new PageDefinitionImpl(identity, component, paramsSchema);
|
|
38
|
+
}
|
|
39
|
+
const { render } = options;
|
|
40
|
+
const component = ()=>identity.renderRuntime.run('Page', Effect.suspend(render), middleware);
|
|
41
|
+
return new PageDefinitionImpl(identity, component, null);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
make
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export { getPageState, makePageFactory };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application/page.js","sources":["../../src/application/page.ts"],"sourcesContent":["import { Effect, Schema, type Types } from 'effect';\nimport type { ReactNode } from 'react';\n\nimport {\n type ERSCIdentity,\n ERSCIdentityTypeId,\n isERSCMember,\n ERSCMemberKindTypeId,\n type ERSCStatefulMember,\n ERSCStateTypeId,\n} from './ersc-identity';\nimport type { AnyMiddleware } from './middleware';\nimport type { ValidRouteParamName } from './route-path';\n\ndeclare const PageContractTypeId: unique symbol;\n\nexport type PageParamsSchema<Services> = Schema.ConstraintCodec<\n Readonly<Record<string, unknown>>,\n Readonly<Record<string, unknown>>,\n Services,\n unknown\n>;\n\ntype PageParamKeys<ParamsSchema> = ParamsSchema extends { readonly Encoded: infer Encoded }\n ? Extract<keyof Encoded, string>\n : never;\ntype NonStringPageParamKeys<ParamsSchema> = ParamsSchema extends {\n readonly Encoded: infer Encoded;\n}\n ? Exclude<keyof Encoded, string>\n : never;\ntype InvalidPageParamName<Name extends string> =\n Name extends ValidRouteParamName<Name> ? never : Name;\ntype InvalidPageParamValueKeys<ParamsSchema> = ParamsSchema extends {\n readonly Encoded: infer Encoded;\n}\n ? {\n [Key in Extract<keyof Encoded, string>]-?: unknown extends Encoded[Key]\n ? never\n : [Extract<Encoded[Key], string>] extends [never]\n ? Key\n : never;\n }[Extract<keyof Encoded, string>]\n : never;\ntype InvalidPageParamsSchema<ParamsSchema> =\n | NonStringPageParamKeys<ParamsSchema>\n | InvalidPageParamName<PageParamKeys<ParamsSchema>>\n | InvalidPageParamValueKeys<ParamsSchema>;\ntype ValidPageParamsSchema<ParamsSchema> = [PageParamKeys<ParamsSchema>] extends [never]\n ? never\n : string extends PageParamKeys<ParamsSchema>\n ? never\n : [InvalidPageParamsSchema<ParamsSchema>] extends [never]\n ? unknown\n : never;\n\nexport type PageConcern<\n out ParamNames extends string,\n out Mode extends 'Parameterized' | 'Static',\n> = {\n readonly [PageContractTypeId]: {\n readonly mode: Types.Covariant<Mode>;\n readonly paramNames: Types.Covariant<ParamNames>;\n };\n};\n\nexport type PagePathParams = Readonly<Record<string, string | undefined>>;\nexport type PageRuntimeProps<ParamNames extends string = string> = {\n readonly params: Readonly<Record<ParamNames, string | undefined>>;\n};\nexport type PageComponent<ParamNames extends string = string> = (\n props: PageRuntimeProps<ParamNames>,\n) => Promise<Awaited<ReactNode>>;\n\nexport type StaticPageDefinition<Services> = ERSCStatefulMember<\n Services,\n 'Page',\n PageImplementationState\n> &\n PageConcern<never, 'Static'>;\nexport type ParameterizedPageDefinition<\n Services,\n ParamNames extends string = string,\n> = ERSCStatefulMember<Services, 'Page', PageImplementationState> &\n PageConcern<ParamNames, 'Parameterized'>;\nexport type AnyPageDefinition<Services> =\n | StaticPageDefinition<Services>\n | ParameterizedPageDefinition<Services>;\n\nexport type PageImplementationState = {\n readonly component: PageComponent;\n readonly paramsSchema: Schema.Constraint | null;\n};\n\nclass PageDefinitionImpl<\n Services,\n ParamNames extends string,\n Mode extends 'Parameterized' | 'Static',\n ParamsSchema extends Schema.Constraint | null,\n>\n implements\n ERSCStatefulMember<Services, 'Page', PageImplementationState>,\n PageConcern<ParamNames, Mode>\n{\n declare readonly [PageContractTypeId]: {\n readonly mode: Types.Covariant<Mode>;\n readonly paramNames: Types.Covariant<ParamNames>;\n };\n readonly [ERSCIdentityTypeId]: ERSCIdentity<Services>;\n readonly [ERSCMemberKindTypeId] = 'Page' as const;\n get [ERSCStateTypeId](): PageImplementationState {\n return this;\n }\n readonly component: PageComponent;\n readonly paramsSchema: ParamsSchema;\n\n constructor(\n identity: ERSCIdentity<Services>,\n component: PageComponent,\n paramsSchema: ParamsSchema,\n ) {\n this[ERSCIdentityTypeId] = identity;\n this.component = component;\n this.paramsSchema = paramsSchema;\n Object.freeze(this);\n }\n}\n\nexport const getPageState = <Services>(\n page: AnyPageDefinition<Services>,\n): PageImplementationState => {\n if (!isERSCMember(page, 'Page')) {\n throw new TypeError('Page must be created with ERSC.Page.make.');\n }\n return page[ERSCStateTypeId];\n};\n\ntype StaticPageOptions<Error, Services> = {\n readonly params?: never;\n readonly render: () => Effect.Effect<Awaited<ReactNode>, Error, Services>;\n};\ntype ParameterizedPageOptions<ParamsSchema extends PageParamsSchema<Services>, Error, Services> = {\n readonly params: ParamsSchema;\n readonly render: (props: {\n readonly params: ParamsSchema['Type'];\n }) => Effect.Effect<Awaited<ReactNode>, Error, Services>;\n};\n\nexport type PageFactory<ApplicationServices, AvailableServices> = {\n readonly make: {\n <ParamsSchema extends PageParamsSchema<AvailableServices>, Error>(\n options: ParameterizedPageOptions<ParamsSchema, Error, AvailableServices> &\n ValidPageParamsSchema<ParamsSchema>,\n ): ParameterizedPageDefinition<ApplicationServices, PageParamKeys<ParamsSchema>>;\n <Error>(\n options: StaticPageOptions<Error, AvailableServices>,\n ): StaticPageDefinition<ApplicationServices>;\n };\n};\n\nexport const makePageFactory = <ApplicationServices, AvailableServices>(\n identity: ERSCIdentity<ApplicationServices>,\n middleware: ReadonlyArray<AnyMiddleware<ApplicationServices>>,\n): PageFactory<ApplicationServices, AvailableServices> => {\n function make<ParamsSchema extends PageParamsSchema<AvailableServices>, Error>(\n options: ParameterizedPageOptions<ParamsSchema, Error, AvailableServices> &\n ValidPageParamsSchema<ParamsSchema>,\n ): ParameterizedPageDefinition<ApplicationServices, PageParamKeys<ParamsSchema>>;\n function make<Error>(\n options: StaticPageOptions<Error, AvailableServices>,\n ): StaticPageDefinition<ApplicationServices>;\n function make<Error>(\n options:\n | Omit<StaticPageOptions<Error, AvailableServices>, 'params'>\n | ParameterizedPageOptions<PageParamsSchema<AvailableServices>, Error, AvailableServices>,\n ): AnyPageDefinition<ApplicationServices> {\n if ('params' in options) {\n const { params: paramsSchema, render } = options;\n const decodeParams = Schema.decodeUnknownEffect(paramsSchema);\n const component: PageComponent = ({ params }) =>\n identity.renderRuntime.run(\n 'Page',\n decodeParams(params).pipe(\n Effect.flatMap((decodedParams) =>\n Effect.suspend(() => render({ params: decodedParams })),\n ),\n ),\n middleware,\n );\n return new PageDefinitionImpl<\n ApplicationServices,\n PageParamKeys<typeof paramsSchema>,\n 'Parameterized',\n typeof paramsSchema\n >(identity, component, paramsSchema);\n }\n\n const { render } = options;\n const component: PageComponent = () =>\n identity.renderRuntime.run('Page', Effect.suspend(render), middleware);\n return new PageDefinitionImpl<ApplicationServices, never, 'Static', null>(\n identity,\n component,\n null,\n );\n }\n\n return { make };\n};\n"],"names":["Effect","Schema","ERSCIdentityTypeId","isERSCMember","ERSCMemberKindTypeId","ERSCStateTypeId","PageDefinitionImpl","identity","component","paramsSchema","Object","getPageState","page","TypeError","makePageFactory","middleware","make","options","render","decodeParams","params","decodedParams"],"mappings":";;;;;AAAoD;AAU3B;AAoFzB,MAAMM,kBAAkBA;IAcb,CAACJ,kBAAkBA,CAAC,CAAyB;IAC7C,CAACE,oBAAoBA,CAAC,GAAG,OAAgB;IAClD,IAAI,CAACC,eAAeA,CAAC,GAA4B;QAC/C,OAAO,IAAI;IACb;IACS,UAAyB;IACzB,aAA2B;IAEpC,YACEE,QAAgC,EAChCC,SAAwB,EACxBC,YAA0B,CAC1B;QACA,IAAI,CAACP,kBAAkBA,CAAC,GAAGK;QAC3B,IAAI,CAAC,SAAS,GAAGC;QACjB,IAAI,CAAC,YAAY,GAAGC;QACpBC,OAAO,MAAM,CAAC,IAAI;IACpB;AACF;AAEO,MAAMC,YAAYA,GAAG,CAC1BC;IAEA,IAAI,CAACT,YAAYA,CAACS,MAAM,SAAS;QAC/B,MAAM,IAAIC,UAAU;IACtB;IACA,OAAOD,IAAI,CAACP,eAAeA,CAAC;AAC9B,EAAE;AAyBK,MAAMS,eAAeA,GAAG,CAC7BP,UACAQ;IASA,SAASC,KACPC,OAE2F;QAE3F,IAAI,YAAYA,SAAS;YACvB,MAAM,EAAE,QAAQR,YAAY,EAAES,MAAM,EAAE,GAAGD;YACzC,MAAME,eAAelB,0BAA0B,CAACQ;YAChD,MAAMD,YAA2B,CAAC,EAAEY,MAAM,EAAE,GAC1Cb,SAAS,aAAa,CAAC,GAAG,CACxB,QACAY,aAAaC,QAAQ,IAAI,CACvBpB,cAAc,CAAC,CAACqB,gBACdrB,cAAc,CAAC,IAAMkB,OAAO;4BAAE,QAAQG;wBAAc,OAGxDN;YAEJ,OAAO,IAAIT,kBAAkBA,CAK3BC,UAAUC,WAAWC;QACzB;QAEA,MAAM,EAAES,MAAM,EAAE,GAAGD;QACnB,MAAMT,YAA2B,IAC/BD,SAAS,aAAa,CAAC,GAAG,CAAC,QAAQP,cAAc,CAACkB,SAASH;QAC7D,OAAO,IAAIT,kBAAkBA,CAC3BC,UACAC,WACA;IAEJ;IAEA,OAAO;QAAEQ;IAAK;AAChB,EAAE"}
|