@jfdevelops/react-layout 0.17.4 → 0.18.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/dist/create-config/component-keys.cjs +44 -0
- package/dist/create-config/component-keys.cjs.map +1 -0
- package/dist/create-config/component-keys.mjs +39 -0
- package/dist/create-config/component-keys.mjs.map +1 -0
- package/dist/create-config/define-layout.cjs +42 -5
- package/dist/create-config/define-layout.cjs.map +1 -1
- package/dist/create-config/define-layout.d.cts +12 -10
- package/dist/create-config/define-layout.d.cts.map +1 -1
- package/dist/create-config/define-layout.d.mts +12 -10
- package/dist/create-config/define-layout.d.mts.map +1 -1
- package/dist/create-config/define-layout.mjs +43 -6
- package/dist/create-config/define-layout.mjs.map +1 -1
- package/dist/create-config/for-paths/builder.cjs +192 -0
- package/dist/create-config/for-paths/builder.cjs.map +1 -0
- package/dist/create-config/for-paths/builder.d.cts +77 -0
- package/dist/create-config/for-paths/builder.d.cts.map +1 -0
- package/dist/create-config/for-paths/builder.d.mts +77 -0
- package/dist/create-config/for-paths/builder.d.mts.map +1 -0
- package/dist/create-config/for-paths/builder.mjs +192 -0
- package/dist/create-config/for-paths/builder.mjs.map +1 -0
- package/dist/create-config/for-paths/get-component-for-path.cjs +55 -0
- package/dist/create-config/for-paths/get-component-for-path.cjs.map +1 -0
- package/dist/create-config/for-paths/get-component-for-path.d.cts +55 -0
- package/dist/create-config/for-paths/get-component-for-path.d.cts.map +1 -0
- package/dist/create-config/for-paths/get-component-for-path.d.mts +55 -0
- package/dist/create-config/for-paths/get-component-for-path.d.mts.map +1 -0
- package/dist/create-config/for-paths/get-component-for-path.mjs +55 -0
- package/dist/create-config/for-paths/get-component-for-path.mjs.map +1 -0
- package/dist/create-config/for-paths/index.d.cts +2 -0
- package/dist/create-config/for-paths/index.d.mts +2 -0
- package/dist/create-config/for-resource.cjs.map +1 -1
- package/dist/create-config/for-resource.d.cts +19 -19
- package/dist/create-config/for-resource.d.cts.map +1 -1
- package/dist/create-config/for-resource.d.mts +19 -19
- package/dist/create-config/for-resource.d.mts.map +1 -1
- package/dist/create-config/for-resource.mjs.map +1 -1
- package/dist/create-config/for-resources/scoped-layout.d.cts +14 -14
- package/dist/create-config/for-resources/scoped-layout.d.cts.map +1 -1
- package/dist/create-config/for-resources/scoped-layout.d.mts +14 -14
- package/dist/create-config/for-resources/scoped-layout.d.mts.map +1 -1
- package/dist/create-config/get-component.cjs +60 -11
- package/dist/create-config/get-component.cjs.map +1 -1
- package/dist/create-config/get-component.d.cts +75 -6
- package/dist/create-config/get-component.d.cts.map +1 -1
- package/dist/create-config/get-component.d.mts +75 -6
- package/dist/create-config/get-component.d.mts.map +1 -1
- package/dist/create-config/get-component.mjs +61 -11
- package/dist/create-config/get-component.mjs.map +1 -1
- package/dist/create-config/index.d.cts +6 -1
- package/dist/create-config/index.d.mts +6 -1
- package/dist/create-config/is-sub-resource-key.cjs +15 -0
- package/dist/create-config/is-sub-resource-key.cjs.map +1 -0
- package/dist/create-config/is-sub-resource-key.d.cts +30 -0
- package/dist/create-config/is-sub-resource-key.d.cts.map +1 -0
- package/dist/create-config/is-sub-resource-key.d.mts +30 -0
- package/dist/create-config/is-sub-resource-key.d.mts.map +1 -0
- package/dist/create-config/is-sub-resource-key.mjs +15 -0
- package/dist/create-config/is-sub-resource-key.mjs.map +1 -0
- package/dist/create-config/paths/generate.cjs +77 -0
- package/dist/create-config/paths/generate.cjs.map +1 -0
- package/dist/create-config/paths/generate.mjs +77 -0
- package/dist/create-config/paths/generate.mjs.map +1 -0
- package/dist/create-config/paths/index.d.cts +2 -0
- package/dist/create-config/paths/index.d.mts +2 -0
- package/dist/create-config/paths/introspect.cjs +123 -0
- package/dist/create-config/paths/introspect.cjs.map +1 -0
- package/dist/create-config/paths/introspect.mjs +118 -0
- package/dist/create-config/paths/introspect.mjs.map +1 -0
- package/dist/create-config/paths/resolve.cjs +130 -0
- package/dist/create-config/paths/resolve.cjs.map +1 -0
- package/dist/create-config/paths/resolve.mjs +129 -0
- package/dist/create-config/paths/resolve.mjs.map +1 -0
- package/dist/create-config/paths/types.d.cts +104 -0
- package/dist/create-config/paths/types.d.cts.map +1 -0
- package/dist/create-config/paths/types.d.mts +104 -0
- package/dist/create-config/paths/types.d.mts.map +1 -0
- package/dist/create-config/paths/variables.cjs +32 -0
- package/dist/create-config/paths/variables.cjs.map +1 -0
- package/dist/create-config/paths/variables.d.cts +32 -0
- package/dist/create-config/paths/variables.d.cts.map +1 -0
- package/dist/create-config/paths/variables.d.mts +32 -0
- package/dist/create-config/paths/variables.d.mts.map +1 -0
- package/dist/create-config/paths/variables.mjs +29 -0
- package/dist/create-config/paths/variables.mjs.map +1 -0
- package/dist/create-config/types.d.cts +28 -8
- package/dist/create-config/types.d.cts.map +1 -1
- package/dist/create-config/types.d.mts +28 -8
- package/dist/create-config/types.d.mts.map +1 -1
- package/dist/errors/invalid-component.cjs +21 -0
- package/dist/errors/invalid-component.cjs.map +1 -0
- package/dist/errors/invalid-component.d.cts +18 -0
- package/dist/errors/invalid-component.d.cts.map +1 -0
- package/dist/errors/invalid-component.d.mts +18 -0
- package/dist/errors/invalid-component.d.mts.map +1 -0
- package/dist/errors/invalid-component.mjs +21 -0
- package/dist/errors/invalid-component.mjs.map +1 -0
- package/dist/errors/invalid-config.cjs +13 -0
- package/dist/errors/invalid-config.cjs.map +1 -0
- package/dist/errors/invalid-config.d.cts +15 -0
- package/dist/errors/invalid-config.d.cts.map +1 -0
- package/dist/errors/invalid-config.d.mts +15 -0
- package/dist/errors/invalid-config.d.mts.map +1 -0
- package/dist/errors/invalid-config.mjs +13 -0
- package/dist/errors/invalid-config.mjs.map +1 -0
- package/dist/errors/invalid-path.cjs +18 -0
- package/dist/errors/invalid-path.cjs.map +1 -0
- package/dist/errors/invalid-path.d.cts +16 -0
- package/dist/errors/invalid-path.d.cts.map +1 -0
- package/dist/errors/invalid-path.d.mts +16 -0
- package/dist/errors/invalid-path.d.mts.map +1 -0
- package/dist/errors/invalid-path.mjs +18 -0
- package/dist/errors/invalid-path.mjs.map +1 -0
- package/dist/errors/invalid-resource.cjs +18 -0
- package/dist/errors/invalid-resource.cjs.map +1 -0
- package/dist/errors/invalid-resource.d.cts +16 -0
- package/dist/errors/invalid-resource.d.cts.map +1 -0
- package/dist/errors/invalid-resource.d.mts +16 -0
- package/dist/errors/invalid-resource.d.mts.map +1 -0
- package/dist/errors/invalid-resource.mjs +18 -0
- package/dist/errors/invalid-resource.mjs.map +1 -0
- package/dist/errors/invalid-sub-resource.cjs +18 -0
- package/dist/errors/invalid-sub-resource.cjs.map +1 -0
- package/dist/errors/invalid-sub-resource.d.cts +17 -0
- package/dist/errors/invalid-sub-resource.d.cts.map +1 -0
- package/dist/errors/invalid-sub-resource.d.mts +17 -0
- package/dist/errors/invalid-sub-resource.d.mts.map +1 -0
- package/dist/errors/invalid-sub-resource.mjs +18 -0
- package/dist/errors/invalid-sub-resource.mjs.map +1 -0
- package/dist/errors/missing-path-variable.cjs +18 -0
- package/dist/errors/missing-path-variable.cjs.map +1 -0
- package/dist/errors/missing-path-variable.d.cts +16 -0
- package/dist/errors/missing-path-variable.d.cts.map +1 -0
- package/dist/errors/missing-path-variable.d.mts +16 -0
- package/dist/errors/missing-path-variable.d.mts.map +1 -0
- package/dist/errors/missing-path-variable.mjs +18 -0
- package/dist/errors/missing-path-variable.mjs.map +1 -0
- package/dist/errors/react-layout-error.cjs +56 -0
- package/dist/errors/react-layout-error.cjs.map +1 -0
- package/dist/errors/react-layout-error.d.cts +46 -0
- package/dist/errors/react-layout-error.d.cts.map +1 -0
- package/dist/errors/react-layout-error.d.mts +46 -0
- package/dist/errors/react-layout-error.d.mts.map +1 -0
- package/dist/errors/react-layout-error.mjs +54 -0
- package/dist/errors/react-layout-error.mjs.map +1 -0
- package/dist/index.cjs +15 -0
- package/dist/index.d.cts +14 -2
- package/dist/index.d.mts +14 -2
- package/dist/index.mjs +8 -1
- package/dist/props.d.cts +14 -4
- package/dist/props.d.cts.map +1 -1
- package/dist/props.d.mts +14 -4
- package/dist/props.d.mts.map +1 -1
- package/dist/resource.cjs.map +1 -1
- package/dist/resource.d.cts +2 -2
- package/dist/resource.d.cts.map +1 -1
- package/dist/resource.d.mts +2 -2
- package/dist/resource.d.mts.map +1 -1
- package/dist/resource.mjs.map +1 -1
- package/dist/utils.d.cts +2 -1
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts +2 -1
- package/dist/utils.d.mts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Show } from "../../utils.cjs";
|
|
2
|
+
import { LayoutResourceKey, ResourceDefinition, ResourceDefinitionForKey, SubResourceDefinitionsFor, SubResourceParamForResource } from "../../resource.cjs";
|
|
3
|
+
import { BaseResourceConfigComponents, ResourceConfigComponentKey, SharedResourceConfigOptions } from "../types.cjs";
|
|
4
|
+
import { ComponentPathVariable, ExtractPathVariables, PathHead, PathTail, ResourcePathVariable, SubResourcePathVariable } from "./variables.cjs";
|
|
5
|
+
import { JSX } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/create-config/paths/types.d.ts
|
|
8
|
+
/** Recursion cap for path types. Must stay aligned with `MAX_PATH_DEPTH` in `./generate`. */
|
|
9
|
+
type MaxPathDepth = 6;
|
|
10
|
+
type ComponentSlotKey = keyof BaseResourceConfigComponents;
|
|
11
|
+
type SharedBranchKey = keyof SharedResourceConfigOptions;
|
|
12
|
+
/** A component slot segment: a fixed slot key, or the `$component` variable. */
|
|
13
|
+
type ComponentSegment = ComponentSlotKey | ComponentPathVariable;
|
|
14
|
+
/**
|
|
15
|
+
* Path tail selecting a component on the current node: a slot, a shared branch, or a
|
|
16
|
+
* slot inside a shared branch (`detail.errorComponent`, `new.$component`, …).
|
|
17
|
+
*/
|
|
18
|
+
type ComponentTailPath = ComponentSegment | SharedBranchKey | `${SharedBranchKey}.${ComponentSegment}`;
|
|
19
|
+
type NestedSubResourceDefinitions<Def extends ResourceDefinition> = Def extends {
|
|
20
|
+
subResources: infer Nested extends ReadonlyArray<ResourceDefinition>;
|
|
21
|
+
} ? Nested : readonly [];
|
|
22
|
+
type SubResourceTailPaths<SubDefs extends ReadonlyArray<ResourceDefinition>, DepthAcc extends readonly unknown[]> = LayoutResourceKey<SubDefs> extends infer Key extends string ? Key extends LayoutResourceKey<SubDefs> ? Key | `${Key}.${ParameterizedEntryPath<NestedSubResourceDefinitions<ResourceDefinitionForKey<SubDefs, Key>>, readonly [...DepthAcc, unknown]>}` : never : never;
|
|
23
|
+
/**
|
|
24
|
+
* Every path tail valid below one config node: component slots, declared sub-resource
|
|
25
|
+
* slugs, or a single `$subResource` variable. One `$subResource` segment stands for the
|
|
26
|
+
* whole remaining sub-resource chain, since its value may be `{ value, subResource }`.
|
|
27
|
+
*/
|
|
28
|
+
type ParameterizedEntryPath<SubDefs extends ReadonlyArray<ResourceDefinition>, DepthAcc extends readonly unknown[] = readonly []> = ComponentTailPath | ([SubDefs] extends [readonly []] ? never : DepthAcc['length'] extends MaxPathDepth ? never : SubResourceTailPaths<SubDefs, DepthAcc> | SubResourcePathVariable | `${SubResourcePathVariable}.${ComponentTailPath}`);
|
|
29
|
+
type ParameterizedEntryPathForResource<Resources extends ReadonlyArray<ResourceDefinition>, Resource extends LayoutResourceKey<Resources>> = ParameterizedEntryPath<SubResourceDefinitionsFor<Resources, Resource>>;
|
|
30
|
+
type AnyParameterizedEntryPath<Resources extends ReadonlyArray<ResourceDefinition>> = LayoutResourceKey<Resources> extends infer Resource ? Resource extends LayoutResourceKey<Resources> ? ParameterizedEntryPathForResource<Resources, Resource> : never : never;
|
|
31
|
+
/**
|
|
32
|
+
* Paths accepted by `forPaths` and `createGetComponent`. Segments whose value depends on
|
|
33
|
+
* the config collapse into variables (`$resource`, `$subResource`, `$component`), and the
|
|
34
|
+
* fixed slots stay literal, so `'$resource.detail.$component'` leaves `resource` and
|
|
35
|
+
* `component` to the call site.
|
|
36
|
+
*/
|
|
37
|
+
type ParameterizedResourcePath<Resources extends ReadonlyArray<ResourceDefinition>> = LayoutResourceKey<Resources> | ResourcePathVariable | (LayoutResourceKey<Resources> extends infer Resource ? Resource extends LayoutResourceKey<Resources> ? `${Resource}.${ParameterizedEntryPathForResource<Resources, Resource>}` : never : never) | `${ResourcePathVariable}.${AnyParameterizedEntryPath<Resources>}`;
|
|
38
|
+
type ConfigNodeOf<Node> = NonNullable<Node>;
|
|
39
|
+
/**
|
|
40
|
+
* Element slots configured on a node (`component`, `errorComponent`, …). `detail` and
|
|
41
|
+
* `new` are path segments, not `$component` values.
|
|
42
|
+
*/
|
|
43
|
+
type ComponentKeysAtNode<Node> = ConfigNodeOf<Node> extends JSX.Element ? never : Extract<keyof ConfigNodeOf<Node>, ComponentSlotKey>;
|
|
44
|
+
/** Sub-resource keys configured on a node: every key that is not a component slot. */
|
|
45
|
+
type SubResourceKeysAtNode<Node> = ConfigNodeOf<Node> extends JSX.Element ? never : Exclude<keyof ConfigNodeOf<Node>, ResourceConfigComponentKey>;
|
|
46
|
+
type IndexNode<Node, Key> = Key extends keyof ConfigNodeOf<Node> ? NonNullable<ConfigNodeOf<Node>[Key]> : never;
|
|
47
|
+
type ComponentKeysAtNodes<Node> = Node extends unknown ? ComponentKeysAtNode<Node> : never;
|
|
48
|
+
/** Sub-resource keys on a node and on every node below it, matching nested params. */
|
|
49
|
+
type SubResourceKeysBelowNode<Node, DepthAcc extends readonly unknown[] = readonly []> = DepthAcc['length'] extends MaxPathDepth ? never : SubResourceKeysAtNode<Node> extends infer Key ? Key extends SubResourceKeysAtNode<Node> ? Key | SubResourceKeysBelowNode<IndexNode<Node, Key>, readonly [...DepthAcc, unknown]> : never : never;
|
|
50
|
+
/** Every node reachable below `Node`, used when a `$subResource` value is not yet known. */
|
|
51
|
+
type AnySubResourceNode<Node, DepthAcc extends readonly unknown[] = readonly []> = DepthAcc['length'] extends MaxPathDepth ? never : SubResourceKeysAtNode<Node> extends infer Key ? Key extends SubResourceKeysAtNode<Node> ? IndexNode<Node, Key> | AnySubResourceNode<IndexNode<Node, Key>, readonly [...DepthAcc, unknown]> : never : never;
|
|
52
|
+
type ResolveConfigNodeSegment<Node, Segment extends string> = Node extends unknown ? Segment extends SubResourcePathVariable ? AnySubResourceNode<Node> : Segment extends ComponentPathVariable ? IndexNode<Node, ComponentKeysAtNode<Node>> : IndexNode<Node, Segment> : never;
|
|
53
|
+
/**
|
|
54
|
+
* Walks `Path` on a config node. Open variables resolve to every value they could take,
|
|
55
|
+
* so `never` means the path cannot exist on that node.
|
|
56
|
+
*/
|
|
57
|
+
type ResolveConfigNode<Node, Path extends string> = [Node] extends [never] ? never : Path extends '' ? Node : Path extends `${infer Head}.${infer Rest}` ? ResolveConfigNode<ResolveConfigNodeSegment<Node, Head>, Rest> : ResolveConfigNodeSegment<Node, Path>;
|
|
58
|
+
/** Resource keys present in a created config, falling back to every declared resource. */
|
|
59
|
+
type ConfigResourceKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config> = [Extract<LayoutResourceKey<Resources>, keyof Config>] extends [never] ? LayoutResourceKey<Resources> : Extract<LayoutResourceKey<Resources>, keyof Config>;
|
|
60
|
+
type ResourceNode<Config, Resource> = Resource extends keyof Config ? NonNullable<Config[Resource]> : never;
|
|
61
|
+
/**
|
|
62
|
+
* Resources a path can target: for `$resource` paths, only those whose config satisfies
|
|
63
|
+
* the path's fixed segments, so `'$resource.detail.$component'` excludes resources
|
|
64
|
+
* without a `detail`.
|
|
65
|
+
*/
|
|
66
|
+
type PathResourceCandidates<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathHead<Path> extends ResourcePathVariable ? ConfigResourceKeys<Resources, Config> extends infer Resource ? Resource extends ConfigResourceKeys<Resources, Config> ? [ResolveConfigNode<ResourceNode<Config, Resource>, PathTail<Path>>] extends [never] ? never : Resource : never : never : Extract<PathHead<Path>, ConfigResourceKeys<Resources, Config>>;
|
|
67
|
+
type StripTrailingComponentVariable<Path extends string> = Path extends ComponentPathVariable ? '' : Path extends `${infer Head}.${ComponentPathVariable}` ? Head : Path;
|
|
68
|
+
/** Component slot keys configured on the node a path resolves to. */
|
|
69
|
+
type PathComponentKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathResourceCandidates<Resources, Config, Path> extends infer Resource ? Resource extends PathResourceCandidates<Resources, Config, Path> ? ComponentKeysAtNodes<ResolveConfigNode<ResourceNode<Config, Resource>, StripTrailingComponentVariable<PathTail<Path>>>> : never : never;
|
|
70
|
+
/** Sub-resource keys valid for the `$subResource` segment of a path. */
|
|
71
|
+
type PathSubResourceKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathResourceCandidates<Resources, Config, Path> extends infer Resource ? Resource extends PathResourceCandidates<Resources, Config, Path> ? SubResourceKeysBelowNode<ResourceNode<Config, Resource>> : never : never;
|
|
72
|
+
/** Sub-resource keys configured for one resource, at any depth. */
|
|
73
|
+
type ResourceSubResourceKeys<Config, Resource> = SubResourceKeysBelowNode<ResourceNode<Config, Resource>>;
|
|
74
|
+
/** Every sub-resource key configured anywhere in a config map. */
|
|
75
|
+
type ConfigSubResourceKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config> = ConfigResourceKeys<Resources, Config> extends infer Resource ? Resource extends ConfigResourceKeys<Resources, Config> ? ResourceSubResourceKeys<Config, Resource> : never : never;
|
|
76
|
+
type ComponentKeysForPath<Config, Resource, Tail extends string> = ComponentKeysAtNodes<ResolveConfigNode<ResourceNode<Config, Resource>, StripTrailingComponentVariable<Tail>>> extends infer Keys ? [Keys] extends [never] ? ComponentSlotKey : Keys : ComponentSlotKey;
|
|
77
|
+
/** Params a path requires for one target resource. */
|
|
78
|
+
type PathVariablesForResource<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string, Resource extends LayoutResourceKey<Resources>> = Show<('resource' extends ExtractPathVariables<Path> ? {
|
|
79
|
+
resource: Resource;
|
|
80
|
+
} : {}) & ('subResource' extends ExtractPathVariables<Path> ? {
|
|
81
|
+
subResource: SubResourceParamForResource<Resources, Resource>;
|
|
82
|
+
} : {}) & ('component' extends ExtractPathVariables<Path> ? {
|
|
83
|
+
component: ComponentKeysForPath<Config, Resource, PathTail<Path>>;
|
|
84
|
+
} : {})>;
|
|
85
|
+
/**
|
|
86
|
+
* Params a path requires, as one object per resource the path can target. A path with no
|
|
87
|
+
* variables resolves to `{}`.
|
|
88
|
+
*/
|
|
89
|
+
type PathVariables<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathResourceCandidates<Resources, Config, Path> extends infer Resource ? Resource extends LayoutResourceKey<Resources> ? PathVariablesForResource<Resources, Config, Path, Resource> : never : never;
|
|
90
|
+
type VariableValue<Variables, Name extends string> = Name extends keyof Variables ? Variables[Name] : never;
|
|
91
|
+
type ResolveSubResourceParamNode<Node, Param, DepthAcc extends readonly unknown[] = readonly []> = DepthAcc['length'] extends MaxPathDepth ? never : Param extends string ? IndexNode<Node, Param> : Param extends {
|
|
92
|
+
value: infer Value extends string;
|
|
93
|
+
subResource: infer Nested;
|
|
94
|
+
} ? ResolveSubResourceParamNode<IndexNode<Node, Value>, Nested, readonly [...DepthAcc, unknown]> : never;
|
|
95
|
+
type ResolveNodeSegmentWithVariables<Node, Segment extends string, Variables> = Node extends unknown ? Segment extends SubResourcePathVariable ? ResolveSubResourceParamNode<Node, VariableValue<Variables, 'subResource'>> : Segment extends ComponentPathVariable ? IndexNode<Node, Extract<VariableValue<Variables, 'component'>, string>> : IndexNode<Node, Segment> : never;
|
|
96
|
+
type ResolveNodeWithVariables<Node, Path extends string, Variables> = [Node] extends [never] ? never : Path extends '' ? Node : Path extends `${infer Head}.${infer Rest}` ? ResolveNodeWithVariables<ResolveNodeSegmentWithVariables<Node, Head, Variables>, Rest, Variables> : ResolveNodeSegmentWithVariables<Node, Path, Variables>;
|
|
97
|
+
/**
|
|
98
|
+
* Config value a path resolves to once its variables are supplied. Object nodes come back
|
|
99
|
+
* with a `getComponent` helper attached at runtime; component slots resolve to the element.
|
|
100
|
+
*/
|
|
101
|
+
type ResolveParameterizedPathValue<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string, Variables> = Variables extends unknown ? ResolveNodeWithVariables<PathHead<Path> extends ResourcePathVariable ? ResourceNode<Config, Extract<VariableValue<Variables, 'resource'>, LayoutResourceKey<Resources>>> : ResourceNode<Config, PathHead<Path>>, PathTail<Path>, Variables> : never;
|
|
102
|
+
//#endregion
|
|
103
|
+
export { ConfigResourceKeys, ConfigSubResourceKeys, ParameterizedEntryPath, ParameterizedResourcePath, PathComponentKeys, PathResourceCandidates, PathSubResourceKeys, PathVariables, PathVariablesForResource, ResolveConfigNode, ResolveParameterizedPathValue, ResourceSubResourceKeys };
|
|
104
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/create-config/paths/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Show } from "../../utils.mjs";
|
|
2
|
+
import { LayoutResourceKey, ResourceDefinition, ResourceDefinitionForKey, SubResourceDefinitionsFor, SubResourceParamForResource } from "../../resource.mjs";
|
|
3
|
+
import { BaseResourceConfigComponents, ResourceConfigComponentKey, SharedResourceConfigOptions } from "../types.mjs";
|
|
4
|
+
import { ComponentPathVariable, ExtractPathVariables, PathHead, PathTail, ResourcePathVariable, SubResourcePathVariable } from "./variables.mjs";
|
|
5
|
+
import { JSX } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/create-config/paths/types.d.ts
|
|
8
|
+
/** Recursion cap for path types. Must stay aligned with `MAX_PATH_DEPTH` in `./generate`. */
|
|
9
|
+
type MaxPathDepth = 6;
|
|
10
|
+
type ComponentSlotKey = keyof BaseResourceConfigComponents;
|
|
11
|
+
type SharedBranchKey = keyof SharedResourceConfigOptions;
|
|
12
|
+
/** A component slot segment: a fixed slot key, or the `$component` variable. */
|
|
13
|
+
type ComponentSegment = ComponentSlotKey | ComponentPathVariable;
|
|
14
|
+
/**
|
|
15
|
+
* Path tail selecting a component on the current node: a slot, a shared branch, or a
|
|
16
|
+
* slot inside a shared branch (`detail.errorComponent`, `new.$component`, …).
|
|
17
|
+
*/
|
|
18
|
+
type ComponentTailPath = ComponentSegment | SharedBranchKey | `${SharedBranchKey}.${ComponentSegment}`;
|
|
19
|
+
type NestedSubResourceDefinitions<Def extends ResourceDefinition> = Def extends {
|
|
20
|
+
subResources: infer Nested extends ReadonlyArray<ResourceDefinition>;
|
|
21
|
+
} ? Nested : readonly [];
|
|
22
|
+
type SubResourceTailPaths<SubDefs extends ReadonlyArray<ResourceDefinition>, DepthAcc extends readonly unknown[]> = LayoutResourceKey<SubDefs> extends infer Key extends string ? Key extends LayoutResourceKey<SubDefs> ? Key | `${Key}.${ParameterizedEntryPath<NestedSubResourceDefinitions<ResourceDefinitionForKey<SubDefs, Key>>, readonly [...DepthAcc, unknown]>}` : never : never;
|
|
23
|
+
/**
|
|
24
|
+
* Every path tail valid below one config node: component slots, declared sub-resource
|
|
25
|
+
* slugs, or a single `$subResource` variable. One `$subResource` segment stands for the
|
|
26
|
+
* whole remaining sub-resource chain, since its value may be `{ value, subResource }`.
|
|
27
|
+
*/
|
|
28
|
+
type ParameterizedEntryPath<SubDefs extends ReadonlyArray<ResourceDefinition>, DepthAcc extends readonly unknown[] = readonly []> = ComponentTailPath | ([SubDefs] extends [readonly []] ? never : DepthAcc['length'] extends MaxPathDepth ? never : SubResourceTailPaths<SubDefs, DepthAcc> | SubResourcePathVariable | `${SubResourcePathVariable}.${ComponentTailPath}`);
|
|
29
|
+
type ParameterizedEntryPathForResource<Resources extends ReadonlyArray<ResourceDefinition>, Resource extends LayoutResourceKey<Resources>> = ParameterizedEntryPath<SubResourceDefinitionsFor<Resources, Resource>>;
|
|
30
|
+
type AnyParameterizedEntryPath<Resources extends ReadonlyArray<ResourceDefinition>> = LayoutResourceKey<Resources> extends infer Resource ? Resource extends LayoutResourceKey<Resources> ? ParameterizedEntryPathForResource<Resources, Resource> : never : never;
|
|
31
|
+
/**
|
|
32
|
+
* Paths accepted by `forPaths` and `createGetComponent`. Segments whose value depends on
|
|
33
|
+
* the config collapse into variables (`$resource`, `$subResource`, `$component`), and the
|
|
34
|
+
* fixed slots stay literal, so `'$resource.detail.$component'` leaves `resource` and
|
|
35
|
+
* `component` to the call site.
|
|
36
|
+
*/
|
|
37
|
+
type ParameterizedResourcePath<Resources extends ReadonlyArray<ResourceDefinition>> = LayoutResourceKey<Resources> | ResourcePathVariable | (LayoutResourceKey<Resources> extends infer Resource ? Resource extends LayoutResourceKey<Resources> ? `${Resource}.${ParameterizedEntryPathForResource<Resources, Resource>}` : never : never) | `${ResourcePathVariable}.${AnyParameterizedEntryPath<Resources>}`;
|
|
38
|
+
type ConfigNodeOf<Node> = NonNullable<Node>;
|
|
39
|
+
/**
|
|
40
|
+
* Element slots configured on a node (`component`, `errorComponent`, …). `detail` and
|
|
41
|
+
* `new` are path segments, not `$component` values.
|
|
42
|
+
*/
|
|
43
|
+
type ComponentKeysAtNode<Node> = ConfigNodeOf<Node> extends JSX.Element ? never : Extract<keyof ConfigNodeOf<Node>, ComponentSlotKey>;
|
|
44
|
+
/** Sub-resource keys configured on a node: every key that is not a component slot. */
|
|
45
|
+
type SubResourceKeysAtNode<Node> = ConfigNodeOf<Node> extends JSX.Element ? never : Exclude<keyof ConfigNodeOf<Node>, ResourceConfigComponentKey>;
|
|
46
|
+
type IndexNode<Node, Key> = Key extends keyof ConfigNodeOf<Node> ? NonNullable<ConfigNodeOf<Node>[Key]> : never;
|
|
47
|
+
type ComponentKeysAtNodes<Node> = Node extends unknown ? ComponentKeysAtNode<Node> : never;
|
|
48
|
+
/** Sub-resource keys on a node and on every node below it, matching nested params. */
|
|
49
|
+
type SubResourceKeysBelowNode<Node, DepthAcc extends readonly unknown[] = readonly []> = DepthAcc['length'] extends MaxPathDepth ? never : SubResourceKeysAtNode<Node> extends infer Key ? Key extends SubResourceKeysAtNode<Node> ? Key | SubResourceKeysBelowNode<IndexNode<Node, Key>, readonly [...DepthAcc, unknown]> : never : never;
|
|
50
|
+
/** Every node reachable below `Node`, used when a `$subResource` value is not yet known. */
|
|
51
|
+
type AnySubResourceNode<Node, DepthAcc extends readonly unknown[] = readonly []> = DepthAcc['length'] extends MaxPathDepth ? never : SubResourceKeysAtNode<Node> extends infer Key ? Key extends SubResourceKeysAtNode<Node> ? IndexNode<Node, Key> | AnySubResourceNode<IndexNode<Node, Key>, readonly [...DepthAcc, unknown]> : never : never;
|
|
52
|
+
type ResolveConfigNodeSegment<Node, Segment extends string> = Node extends unknown ? Segment extends SubResourcePathVariable ? AnySubResourceNode<Node> : Segment extends ComponentPathVariable ? IndexNode<Node, ComponentKeysAtNode<Node>> : IndexNode<Node, Segment> : never;
|
|
53
|
+
/**
|
|
54
|
+
* Walks `Path` on a config node. Open variables resolve to every value they could take,
|
|
55
|
+
* so `never` means the path cannot exist on that node.
|
|
56
|
+
*/
|
|
57
|
+
type ResolveConfigNode<Node, Path extends string> = [Node] extends [never] ? never : Path extends '' ? Node : Path extends `${infer Head}.${infer Rest}` ? ResolveConfigNode<ResolveConfigNodeSegment<Node, Head>, Rest> : ResolveConfigNodeSegment<Node, Path>;
|
|
58
|
+
/** Resource keys present in a created config, falling back to every declared resource. */
|
|
59
|
+
type ConfigResourceKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config> = [Extract<LayoutResourceKey<Resources>, keyof Config>] extends [never] ? LayoutResourceKey<Resources> : Extract<LayoutResourceKey<Resources>, keyof Config>;
|
|
60
|
+
type ResourceNode<Config, Resource> = Resource extends keyof Config ? NonNullable<Config[Resource]> : never;
|
|
61
|
+
/**
|
|
62
|
+
* Resources a path can target: for `$resource` paths, only those whose config satisfies
|
|
63
|
+
* the path's fixed segments, so `'$resource.detail.$component'` excludes resources
|
|
64
|
+
* without a `detail`.
|
|
65
|
+
*/
|
|
66
|
+
type PathResourceCandidates<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathHead<Path> extends ResourcePathVariable ? ConfigResourceKeys<Resources, Config> extends infer Resource ? Resource extends ConfigResourceKeys<Resources, Config> ? [ResolveConfigNode<ResourceNode<Config, Resource>, PathTail<Path>>] extends [never] ? never : Resource : never : never : Extract<PathHead<Path>, ConfigResourceKeys<Resources, Config>>;
|
|
67
|
+
type StripTrailingComponentVariable<Path extends string> = Path extends ComponentPathVariable ? '' : Path extends `${infer Head}.${ComponentPathVariable}` ? Head : Path;
|
|
68
|
+
/** Component slot keys configured on the node a path resolves to. */
|
|
69
|
+
type PathComponentKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathResourceCandidates<Resources, Config, Path> extends infer Resource ? Resource extends PathResourceCandidates<Resources, Config, Path> ? ComponentKeysAtNodes<ResolveConfigNode<ResourceNode<Config, Resource>, StripTrailingComponentVariable<PathTail<Path>>>> : never : never;
|
|
70
|
+
/** Sub-resource keys valid for the `$subResource` segment of a path. */
|
|
71
|
+
type PathSubResourceKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathResourceCandidates<Resources, Config, Path> extends infer Resource ? Resource extends PathResourceCandidates<Resources, Config, Path> ? SubResourceKeysBelowNode<ResourceNode<Config, Resource>> : never : never;
|
|
72
|
+
/** Sub-resource keys configured for one resource, at any depth. */
|
|
73
|
+
type ResourceSubResourceKeys<Config, Resource> = SubResourceKeysBelowNode<ResourceNode<Config, Resource>>;
|
|
74
|
+
/** Every sub-resource key configured anywhere in a config map. */
|
|
75
|
+
type ConfigSubResourceKeys<Resources extends ReadonlyArray<ResourceDefinition>, Config> = ConfigResourceKeys<Resources, Config> extends infer Resource ? Resource extends ConfigResourceKeys<Resources, Config> ? ResourceSubResourceKeys<Config, Resource> : never : never;
|
|
76
|
+
type ComponentKeysForPath<Config, Resource, Tail extends string> = ComponentKeysAtNodes<ResolveConfigNode<ResourceNode<Config, Resource>, StripTrailingComponentVariable<Tail>>> extends infer Keys ? [Keys] extends [never] ? ComponentSlotKey : Keys : ComponentSlotKey;
|
|
77
|
+
/** Params a path requires for one target resource. */
|
|
78
|
+
type PathVariablesForResource<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string, Resource extends LayoutResourceKey<Resources>> = Show<('resource' extends ExtractPathVariables<Path> ? {
|
|
79
|
+
resource: Resource;
|
|
80
|
+
} : {}) & ('subResource' extends ExtractPathVariables<Path> ? {
|
|
81
|
+
subResource: SubResourceParamForResource<Resources, Resource>;
|
|
82
|
+
} : {}) & ('component' extends ExtractPathVariables<Path> ? {
|
|
83
|
+
component: ComponentKeysForPath<Config, Resource, PathTail<Path>>;
|
|
84
|
+
} : {})>;
|
|
85
|
+
/**
|
|
86
|
+
* Params a path requires, as one object per resource the path can target. A path with no
|
|
87
|
+
* variables resolves to `{}`.
|
|
88
|
+
*/
|
|
89
|
+
type PathVariables<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string> = PathResourceCandidates<Resources, Config, Path> extends infer Resource ? Resource extends LayoutResourceKey<Resources> ? PathVariablesForResource<Resources, Config, Path, Resource> : never : never;
|
|
90
|
+
type VariableValue<Variables, Name extends string> = Name extends keyof Variables ? Variables[Name] : never;
|
|
91
|
+
type ResolveSubResourceParamNode<Node, Param, DepthAcc extends readonly unknown[] = readonly []> = DepthAcc['length'] extends MaxPathDepth ? never : Param extends string ? IndexNode<Node, Param> : Param extends {
|
|
92
|
+
value: infer Value extends string;
|
|
93
|
+
subResource: infer Nested;
|
|
94
|
+
} ? ResolveSubResourceParamNode<IndexNode<Node, Value>, Nested, readonly [...DepthAcc, unknown]> : never;
|
|
95
|
+
type ResolveNodeSegmentWithVariables<Node, Segment extends string, Variables> = Node extends unknown ? Segment extends SubResourcePathVariable ? ResolveSubResourceParamNode<Node, VariableValue<Variables, 'subResource'>> : Segment extends ComponentPathVariable ? IndexNode<Node, Extract<VariableValue<Variables, 'component'>, string>> : IndexNode<Node, Segment> : never;
|
|
96
|
+
type ResolveNodeWithVariables<Node, Path extends string, Variables> = [Node] extends [never] ? never : Path extends '' ? Node : Path extends `${infer Head}.${infer Rest}` ? ResolveNodeWithVariables<ResolveNodeSegmentWithVariables<Node, Head, Variables>, Rest, Variables> : ResolveNodeSegmentWithVariables<Node, Path, Variables>;
|
|
97
|
+
/**
|
|
98
|
+
* Config value a path resolves to once its variables are supplied. Object nodes come back
|
|
99
|
+
* with a `getComponent` helper attached at runtime; component slots resolve to the element.
|
|
100
|
+
*/
|
|
101
|
+
type ResolveParameterizedPathValue<Resources extends ReadonlyArray<ResourceDefinition>, Config, Path extends string, Variables> = Variables extends unknown ? ResolveNodeWithVariables<PathHead<Path> extends ResourcePathVariable ? ResourceNode<Config, Extract<VariableValue<Variables, 'resource'>, LayoutResourceKey<Resources>>> : ResourceNode<Config, PathHead<Path>>, PathTail<Path>, Variables> : never;
|
|
102
|
+
//#endregion
|
|
103
|
+
export { ConfigResourceKeys, ConfigSubResourceKeys, ParameterizedEntryPath, ParameterizedResourcePath, PathComponentKeys, PathResourceCandidates, PathSubResourceKeys, PathVariables, PathVariablesForResource, ResolveConfigNode, ResolveParameterizedPathValue, ResourceSubResourceKeys };
|
|
104
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/create-config/paths/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/create-config/paths/variables.ts
|
|
3
|
+
/**
|
|
4
|
+
* Prefix marking a path segment as a caller-supplied variable. `'$resource.detail.$component'`
|
|
5
|
+
* leaves `resource` and `component` open, while `detail` is fixed.
|
|
6
|
+
*/
|
|
7
|
+
const PATH_VARIABLE_IDENTIFIER = "$";
|
|
8
|
+
function createPathVariable(name) {
|
|
9
|
+
return `${"$"}${name}`;
|
|
10
|
+
}
|
|
11
|
+
function isPathVariableSegment(segment) {
|
|
12
|
+
return segment.startsWith("$");
|
|
13
|
+
}
|
|
14
|
+
/** Variable name for a segment, or `undefined` when the segment is a fixed key. */
|
|
15
|
+
function readPathVariableName(segment) {
|
|
16
|
+
return isPathVariableSegment(segment) ? segment.slice(1) : void 0;
|
|
17
|
+
}
|
|
18
|
+
/** Variable names declared by `path`, in order of appearance and without duplicates. */
|
|
19
|
+
function extractPathVariables(path) {
|
|
20
|
+
const names = /* @__PURE__ */ new Set();
|
|
21
|
+
for (const segment of path.split(".")) {
|
|
22
|
+
const name = readPathVariableName(segment);
|
|
23
|
+
if (name !== void 0 && name.length > 0) names.add(name);
|
|
24
|
+
}
|
|
25
|
+
return [...names];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
exports.createPathVariable = createPathVariable;
|
|
30
|
+
exports.extractPathVariables = extractPathVariables;
|
|
31
|
+
exports.readPathVariableName = readPathVariableName;
|
|
32
|
+
//# sourceMappingURL=variables.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.cjs","names":[],"sources":["../../../src/create-config/paths/variables.ts"],"sourcesContent":["/**\n * Prefix marking a path segment as a caller-supplied variable. `'$resource.detail.$component'`\n * leaves `resource` and `component` open, while `detail` is fixed.\n */\nexport const PATH_VARIABLE_IDENTIFIER = '$';\n\nexport type PathVariableIdentifier = typeof PATH_VARIABLE_IDENTIFIER;\n\n/** A single variable path segment, e.g. `PathVariable<'resource'>` is `'$resource'`. */\nexport type PathVariable<Name extends string> =\n `${PathVariableIdentifier}${Name}`;\n\nexport type ResourcePathVariable = PathVariable<'resource'>;\nexport type SubResourcePathVariable = PathVariable<'subResource'>;\nexport type ComponentPathVariable = PathVariable<'component'>;\n\n/** Variable names a path may leave open. */\nexport type PathVariableName = 'resource' | 'subResource' | 'component';\n\nexport type RemovePathVariableIdentifier<Segment extends string> =\n Segment extends PathVariable<infer Name> ? Name : Segment;\n\ntype ExtractSegmentVariable<Segment extends string> =\n Segment extends PathVariable<infer Name> ? Name : never;\n\n/**\n * Variable names declared by a dot-separated path.\n *\n * @example\n * ```ts\n * ExtractPathVariables<'$resource.detail.$component'>\n * // ^? 'resource' | 'component'\n * ```\n */\nexport type ExtractPathVariables<Path extends string> =\n Path extends `${infer Segment}.${infer Rest}`\n ? ExtractSegmentVariable<Segment> | ExtractPathVariables<Rest>\n : ExtractSegmentVariable<Path>;\n\n/** Whether `Path` leaves any variable open. */\nexport type PathHasVariables<Path extends string> = [\n ExtractPathVariables<Path>,\n] extends [never]\n ? false\n : true;\n\n/** First segment of a dot-separated path. */\nexport type PathHead<Path extends string> =\n Path extends `${infer Head}.${string}` ? Head : Path;\n\n/** Everything after the first segment of a dot-separated path (`''` when there is nothing left). */\nexport type PathTail<Path extends string> =\n Path extends `${string}.${infer Rest}` ? Rest : '';\n\nexport function createPathVariable<Name extends string>(\n name: Name,\n): PathVariable<Name> {\n return `${PATH_VARIABLE_IDENTIFIER}${name}`;\n}\n\nexport function isPathVariableSegment(segment: string): boolean {\n return segment.startsWith(PATH_VARIABLE_IDENTIFIER);\n}\n\n/** Variable name for a segment, or `undefined` when the segment is a fixed key. */\nexport function readPathVariableName(segment: string): string | undefined {\n return isPathVariableSegment(segment)\n ? segment.slice(PATH_VARIABLE_IDENTIFIER.length)\n : undefined;\n}\n\n/** Variable names declared by `path`, in order of appearance and without duplicates. */\nexport function extractPathVariables(path: string): string[] {\n const names = new Set<string>();\n\n for (const segment of path.split('.')) {\n const name = readPathVariableName(segment);\n\n if (name !== undefined && name.length > 0) {\n names.add(name);\n }\n }\n\n return [...names];\n}\n\nexport function pathHasVariables(path: string): boolean {\n return extractPathVariables(path).length > 0;\n}\n"],"mappings":";;;;;;AAIA,MAAa,2BAA2B;AAkDxC,SAAgB,mBACd,MACoB;CACpB,OAAO,SAA8B;AACvC;AAEA,SAAgB,sBAAsB,SAA0B;CAC9D,OAAO,QAAQ,cAAmC;AACpD;;AAGA,SAAgB,qBAAqB,SAAqC;CACxE,OAAO,sBAAsB,OAAO,IAChC,QAAQ,MAAM,CAA+B,IAC7C;AACN;;AAGA,SAAgB,qBAAqB,MAAwB;CAC3D,MAAM,wBAAQ,IAAI,IAAY;CAE9B,KAAK,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG;EACrC,MAAM,OAAO,qBAAqB,OAAO;EAEzC,IAAI,SAAS,UAAa,KAAK,SAAS,GACtC,MAAM,IAAI,IAAI;CAElB;CAEA,OAAO,CAAC,GAAG,KAAK;AAClB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/create-config/paths/variables.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Prefix marking a path segment as a caller-supplied variable. `'$resource.detail.$component'`
|
|
4
|
+
* leaves `resource` and `component` open, while `detail` is fixed.
|
|
5
|
+
*/
|
|
6
|
+
declare const PATH_VARIABLE_IDENTIFIER = "$";
|
|
7
|
+
type PathVariableIdentifier = typeof PATH_VARIABLE_IDENTIFIER;
|
|
8
|
+
/** A single variable path segment, e.g. `PathVariable<'resource'>` is `'$resource'`. */
|
|
9
|
+
type PathVariable<Name extends string> = `${PathVariableIdentifier}${Name}`;
|
|
10
|
+
type ResourcePathVariable = PathVariable<'resource'>;
|
|
11
|
+
type SubResourcePathVariable = PathVariable<'subResource'>;
|
|
12
|
+
type ComponentPathVariable = PathVariable<'component'>;
|
|
13
|
+
type ExtractSegmentVariable<Segment extends string> = Segment extends PathVariable<infer Name> ? Name : never;
|
|
14
|
+
/**
|
|
15
|
+
* Variable names declared by a dot-separated path.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* ExtractPathVariables<'$resource.detail.$component'>
|
|
20
|
+
* // ^? 'resource' | 'component'
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
type ExtractPathVariables<Path extends string> = Path extends `${infer Segment}.${infer Rest}` ? ExtractSegmentVariable<Segment> | ExtractPathVariables<Rest> : ExtractSegmentVariable<Path>;
|
|
24
|
+
/** Whether `Path` leaves any variable open. */
|
|
25
|
+
type PathHasVariables<Path extends string> = [ExtractPathVariables<Path>] extends [never] ? false : true;
|
|
26
|
+
/** First segment of a dot-separated path. */
|
|
27
|
+
type PathHead<Path extends string> = Path extends `${infer Head}.${string}` ? Head : Path;
|
|
28
|
+
/** Everything after the first segment of a dot-separated path (`''` when there is nothing left). */
|
|
29
|
+
type PathTail<Path extends string> = Path extends `${string}.${infer Rest}` ? Rest : '';
|
|
30
|
+
//#endregion
|
|
31
|
+
export { ComponentPathVariable, ExtractPathVariables, PATH_VARIABLE_IDENTIFIER, PathHasVariables, PathHead, PathTail, PathVariable, PathVariableIdentifier, ResourcePathVariable, SubResourcePathVariable };
|
|
32
|
+
//# sourceMappingURL=variables.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.d.cts","names":[],"sources":["../../../src/create-config/paths/variables.ts"],"mappings":";;AAIA;;;cAAa,wBAAA;AAAA,KAED,sBAAA,UAAgC,wBAAwB;AAApE;AAAA,KAGY,YAAA,2BACP,sBAAA,GAAyB,IAAI;AAAA,KAEtB,oBAAA,GAAuB,YAAY;AAAA,KACnC,uBAAA,GAA0B,YAAY;AAAA,KACtC,qBAAA,GAAwB,YAAY;AAAA,KAQ3C,sBAAA,2BACH,OAAA,SAAgB,YAAY,eAAe,IAAA;;;;;AAbX;AAElC;;;;KAsBY,oBAAA,wBACV,IAAA,4CACI,sBAAA,CAAuB,OAAA,IAAW,oBAAA,CAAqB,IAAA,IACvD,sBAAA,CAAuB,IAAA;AAxB7B;AAAA,KA2BY,gBAAA,yBACV,oBAAoB,CAAC,IAAA;AA5B2B;AAAA,KAkCtC,QAAA,wBACV,IAAA,qCAAyC,IAAA,GAAO,IAAI;;KAG1C,QAAA,wBACV,IAAI,qCAAqC,IAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/create-config/paths/variables.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Prefix marking a path segment as a caller-supplied variable. `'$resource.detail.$component'`
|
|
4
|
+
* leaves `resource` and `component` open, while `detail` is fixed.
|
|
5
|
+
*/
|
|
6
|
+
declare const PATH_VARIABLE_IDENTIFIER = "$";
|
|
7
|
+
type PathVariableIdentifier = typeof PATH_VARIABLE_IDENTIFIER;
|
|
8
|
+
/** A single variable path segment, e.g. `PathVariable<'resource'>` is `'$resource'`. */
|
|
9
|
+
type PathVariable<Name extends string> = `${PathVariableIdentifier}${Name}`;
|
|
10
|
+
type ResourcePathVariable = PathVariable<'resource'>;
|
|
11
|
+
type SubResourcePathVariable = PathVariable<'subResource'>;
|
|
12
|
+
type ComponentPathVariable = PathVariable<'component'>;
|
|
13
|
+
type ExtractSegmentVariable<Segment extends string> = Segment extends PathVariable<infer Name> ? Name : never;
|
|
14
|
+
/**
|
|
15
|
+
* Variable names declared by a dot-separated path.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* ExtractPathVariables<'$resource.detail.$component'>
|
|
20
|
+
* // ^? 'resource' | 'component'
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
type ExtractPathVariables<Path extends string> = Path extends `${infer Segment}.${infer Rest}` ? ExtractSegmentVariable<Segment> | ExtractPathVariables<Rest> : ExtractSegmentVariable<Path>;
|
|
24
|
+
/** Whether `Path` leaves any variable open. */
|
|
25
|
+
type PathHasVariables<Path extends string> = [ExtractPathVariables<Path>] extends [never] ? false : true;
|
|
26
|
+
/** First segment of a dot-separated path. */
|
|
27
|
+
type PathHead<Path extends string> = Path extends `${infer Head}.${string}` ? Head : Path;
|
|
28
|
+
/** Everything after the first segment of a dot-separated path (`''` when there is nothing left). */
|
|
29
|
+
type PathTail<Path extends string> = Path extends `${string}.${infer Rest}` ? Rest : '';
|
|
30
|
+
//#endregion
|
|
31
|
+
export { ComponentPathVariable, ExtractPathVariables, PATH_VARIABLE_IDENTIFIER, PathHasVariables, PathHead, PathTail, PathVariable, PathVariableIdentifier, ResourcePathVariable, SubResourcePathVariable };
|
|
32
|
+
//# sourceMappingURL=variables.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.d.mts","names":[],"sources":["../../../src/create-config/paths/variables.ts"],"mappings":";;AAIA;;;cAAa,wBAAA;AAAA,KAED,sBAAA,UAAgC,wBAAwB;AAApE;AAAA,KAGY,YAAA,2BACP,sBAAA,GAAyB,IAAI;AAAA,KAEtB,oBAAA,GAAuB,YAAY;AAAA,KACnC,uBAAA,GAA0B,YAAY;AAAA,KACtC,qBAAA,GAAwB,YAAY;AAAA,KAQ3C,sBAAA,2BACH,OAAA,SAAgB,YAAY,eAAe,IAAA;;;;;AAbX;AAElC;;;;KAsBY,oBAAA,wBACV,IAAA,4CACI,sBAAA,CAAuB,OAAA,IAAW,oBAAA,CAAqB,IAAA,IACvD,sBAAA,CAAuB,IAAA;AAxB7B;AAAA,KA2BY,gBAAA,yBACV,oBAAoB,CAAC,IAAA;AA5B2B;AAAA,KAkCtC,QAAA,wBACV,IAAA,qCAAyC,IAAA,GAAO,IAAI;;KAG1C,QAAA,wBACV,IAAI,qCAAqC,IAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/create-config/paths/variables.ts
|
|
2
|
+
/**
|
|
3
|
+
* Prefix marking a path segment as a caller-supplied variable. `'$resource.detail.$component'`
|
|
4
|
+
* leaves `resource` and `component` open, while `detail` is fixed.
|
|
5
|
+
*/
|
|
6
|
+
const PATH_VARIABLE_IDENTIFIER = "$";
|
|
7
|
+
function createPathVariable(name) {
|
|
8
|
+
return `${"$"}${name}`;
|
|
9
|
+
}
|
|
10
|
+
function isPathVariableSegment(segment) {
|
|
11
|
+
return segment.startsWith("$");
|
|
12
|
+
}
|
|
13
|
+
/** Variable name for a segment, or `undefined` when the segment is a fixed key. */
|
|
14
|
+
function readPathVariableName(segment) {
|
|
15
|
+
return isPathVariableSegment(segment) ? segment.slice(1) : void 0;
|
|
16
|
+
}
|
|
17
|
+
/** Variable names declared by `path`, in order of appearance and without duplicates. */
|
|
18
|
+
function extractPathVariables(path) {
|
|
19
|
+
const names = /* @__PURE__ */ new Set();
|
|
20
|
+
for (const segment of path.split(".")) {
|
|
21
|
+
const name = readPathVariableName(segment);
|
|
22
|
+
if (name !== void 0 && name.length > 0) names.add(name);
|
|
23
|
+
}
|
|
24
|
+
return [...names];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { createPathVariable, extractPathVariables, readPathVariableName };
|
|
29
|
+
//# sourceMappingURL=variables.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variables.mjs","names":[],"sources":["../../../src/create-config/paths/variables.ts"],"sourcesContent":["/**\n * Prefix marking a path segment as a caller-supplied variable. `'$resource.detail.$component'`\n * leaves `resource` and `component` open, while `detail` is fixed.\n */\nexport const PATH_VARIABLE_IDENTIFIER = '$';\n\nexport type PathVariableIdentifier = typeof PATH_VARIABLE_IDENTIFIER;\n\n/** A single variable path segment, e.g. `PathVariable<'resource'>` is `'$resource'`. */\nexport type PathVariable<Name extends string> =\n `${PathVariableIdentifier}${Name}`;\n\nexport type ResourcePathVariable = PathVariable<'resource'>;\nexport type SubResourcePathVariable = PathVariable<'subResource'>;\nexport type ComponentPathVariable = PathVariable<'component'>;\n\n/** Variable names a path may leave open. */\nexport type PathVariableName = 'resource' | 'subResource' | 'component';\n\nexport type RemovePathVariableIdentifier<Segment extends string> =\n Segment extends PathVariable<infer Name> ? Name : Segment;\n\ntype ExtractSegmentVariable<Segment extends string> =\n Segment extends PathVariable<infer Name> ? Name : never;\n\n/**\n * Variable names declared by a dot-separated path.\n *\n * @example\n * ```ts\n * ExtractPathVariables<'$resource.detail.$component'>\n * // ^? 'resource' | 'component'\n * ```\n */\nexport type ExtractPathVariables<Path extends string> =\n Path extends `${infer Segment}.${infer Rest}`\n ? ExtractSegmentVariable<Segment> | ExtractPathVariables<Rest>\n : ExtractSegmentVariable<Path>;\n\n/** Whether `Path` leaves any variable open. */\nexport type PathHasVariables<Path extends string> = [\n ExtractPathVariables<Path>,\n] extends [never]\n ? false\n : true;\n\n/** First segment of a dot-separated path. */\nexport type PathHead<Path extends string> =\n Path extends `${infer Head}.${string}` ? Head : Path;\n\n/** Everything after the first segment of a dot-separated path (`''` when there is nothing left). */\nexport type PathTail<Path extends string> =\n Path extends `${string}.${infer Rest}` ? Rest : '';\n\nexport function createPathVariable<Name extends string>(\n name: Name,\n): PathVariable<Name> {\n return `${PATH_VARIABLE_IDENTIFIER}${name}`;\n}\n\nexport function isPathVariableSegment(segment: string): boolean {\n return segment.startsWith(PATH_VARIABLE_IDENTIFIER);\n}\n\n/** Variable name for a segment, or `undefined` when the segment is a fixed key. */\nexport function readPathVariableName(segment: string): string | undefined {\n return isPathVariableSegment(segment)\n ? segment.slice(PATH_VARIABLE_IDENTIFIER.length)\n : undefined;\n}\n\n/** Variable names declared by `path`, in order of appearance and without duplicates. */\nexport function extractPathVariables(path: string): string[] {\n const names = new Set<string>();\n\n for (const segment of path.split('.')) {\n const name = readPathVariableName(segment);\n\n if (name !== undefined && name.length > 0) {\n names.add(name);\n }\n }\n\n return [...names];\n}\n\nexport function pathHasVariables(path: string): boolean {\n return extractPathVariables(path).length > 0;\n}\n"],"mappings":";;;;;AAIA,MAAa,2BAA2B;AAkDxC,SAAgB,mBACd,MACoB;CACpB,OAAO,SAA8B;AACvC;AAEA,SAAgB,sBAAsB,SAA0B;CAC9D,OAAO,QAAQ,cAAmC;AACpD;;AAGA,SAAgB,qBAAqB,SAAqC;CACxE,OAAO,sBAAsB,OAAO,IAChC,QAAQ,MAAM,CAA+B,IAC7C;AACN;;AAGA,SAAgB,qBAAqB,MAAwB;CAC3D,MAAM,wBAAQ,IAAI,IAAY;CAE9B,KAAK,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG;EACrC,MAAM,OAAO,qBAAqB,OAAO;EAEzC,IAAI,SAAS,UAAa,KAAK,SAAS,GACtC,MAAM,IAAI,IAAI;CAElB;CAEA,OAAO,CAAC,GAAG,KAAK;AAClB"}
|
|
@@ -20,15 +20,35 @@ type SharedResourceConfigOptions = {
|
|
|
20
20
|
};
|
|
21
21
|
type ResourceConfigComponents = BaseResourceConfigComponents & SharedResourceConfigOptions;
|
|
22
22
|
type ResourceConfigComponentKey = keyof ResourceConfigComponents;
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Config keys that cannot be used as nested sub-resource slugs. They already
|
|
25
|
+
* name component slots (`component`, `errorComponent`, …) or shared branches
|
|
26
|
+
* (`detail`, `new`). Top-level resource names may still use these strings.
|
|
27
|
+
*/
|
|
28
|
+
type ReservedResourceSlug = ResourceConfigComponentKey;
|
|
29
|
+
type ReservedResourceSlugMessage<Slug extends string> = `The resource slug "${Slug}" is reserved for config keys`;
|
|
30
|
+
type UnreservedResourceSlug<Slug extends string> = string extends Slug ? Slug : Slug extends ReservedResourceSlug ? ReservedResourceSlugMessage<Slug> : Slug;
|
|
31
|
+
type AssertUnreservedSubResourceDefinition<Resource> = Resource extends string ? UnreservedResourceSlug<Resource> : Resource extends {
|
|
32
|
+
value: infer Value extends string;
|
|
33
|
+
subResources: infer Subs;
|
|
34
|
+
} ? Omit<Resource, 'value' | 'subResources'> & {
|
|
35
|
+
value: UnreservedResourceSlug<Value>;
|
|
36
|
+
subResources: Subs extends ReadonlyArray<unknown> ? { [Index in keyof Subs]: AssertUnreservedSubResourceDefinition<Subs[Index]> } : Subs;
|
|
37
|
+
} : Resource;
|
|
38
|
+
type AssertUnreservedResourceDefinition<Resource> = Resource extends string ? Resource : Resource extends {
|
|
39
|
+
subResources: infer Subs;
|
|
40
|
+
} ? Omit<Resource, 'subResources'> & {
|
|
41
|
+
subResources: Subs extends ReadonlyArray<unknown> ? { [Index in keyof Subs]: AssertUnreservedSubResourceDefinition<Subs[Index]> } : Subs;
|
|
42
|
+
} : Resource;
|
|
43
|
+
type AssertUnreservedResources<Resources extends ReadonlyArray<unknown>> = { [Index in keyof Resources]: AssertUnreservedResourceDefinition<Resources[Index]> };
|
|
44
|
+
/**
|
|
45
|
+
* Config entry for one sub-resource node. Nested sub-resources are keyed directly by
|
|
46
|
+
* their layout slug (there is no `subResources` wrapper in the config).
|
|
47
|
+
*/
|
|
24
48
|
type SubResourceConfigComponentsFor<Resources extends ReadonlyArray<ResourceDefinition>, SubDef extends ResourceDefinition> = ResourceConfigComponents & (SubDef extends {
|
|
25
49
|
subResources: infer Nested extends ReadonlyArray<ResourceDefinition>;
|
|
26
|
-
} ? {
|
|
27
|
-
|
|
28
|
-
} : {});
|
|
29
|
-
type SubResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>, Resource extends LayoutResourceKey<Resources>> = [SubResourceDefinitionsFor<Resources, Resource>] extends [readonly []] ? {} : {
|
|
30
|
-
subResources?: { [K in LayoutResourceKey<SubResourceDefinitionsFor<Resources, Resource>>]?: SubResourceConfigComponentsFor<Resources, ResourceDefinitionForKey<SubResourceDefinitionsFor<Resources, Resource>, K>> };
|
|
31
|
-
};
|
|
50
|
+
} ? { [K in LayoutResourceKey<Nested>]?: SubResourceConfigComponentsFor<Resources, ResourceDefinitionForKey<Nested, K>> } : {});
|
|
51
|
+
type SubResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>, Resource extends LayoutResourceKey<Resources>> = [SubResourceDefinitionsFor<Resources, Resource>] extends [readonly []] ? {} : { [K in LayoutResourceKey<SubResourceDefinitionsFor<Resources, Resource>>]?: SubResourceConfigComponentsFor<Resources, ResourceDefinitionForKey<SubResourceDefinitionsFor<Resources, Resource>, K>> };
|
|
32
52
|
type ResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>> = { [resource in LayoutResourceKey<Resources>]: ResourceConfigComponents & SubResourceConfig<Resources, resource> };
|
|
33
53
|
/**
|
|
34
54
|
* Parameter type for {@link CreateResourceConfigFn}. Intersects the inferred `Config`
|
|
@@ -38,5 +58,5 @@ type ResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>> = { [re
|
|
|
38
58
|
type ResourceConfigInput<Resources extends ReadonlyArray<ResourceDefinition>, Config extends Partial<ResourceConfig<Resources>>> = Partial<ResourceConfig<Resources>> & Config;
|
|
39
59
|
type ResourceConfigMap<Resources extends ReadonlyArray<ResourceDefinition>> = Partial<ResourceConfig<Resources>>;
|
|
40
60
|
//#endregion
|
|
41
|
-
export { BaseResourceConfigComponents, ResourceConfig, ResourceConfigComponentKey, ResourceConfigComponents, ResourceConfigInput, ResourceConfigMap, SharedResourceConfigOptions, SubResourceConfig, SubResourceConfigComponentsFor };
|
|
61
|
+
export { AssertUnreservedResources, BaseResourceConfigComponents, ResourceConfig, ResourceConfigComponentKey, ResourceConfigComponents, ResourceConfigInput, ResourceConfigMap, SharedResourceConfigOptions, SubResourceConfig, SubResourceConfigComponentsFor };
|
|
42
62
|
//# sourceMappingURL=types.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/create-config/types.ts"],"mappings":";;;;KAQY,4BAAA;EACV,SAAA,EAAW,GAAA,CAAI,OAAA;EACf,cAAA,GAAiB,GAAA,CAAI,OAAA;EACrB,gBAAA,GAAmB,GAAA,CAAI,OAAA;EACvB,iBAAA,GAAoB,GAAA,CAAI,OAAA;AAAA;AAAA,KASd,2BAAA;EATqB;;;EAa/B,GAAA,GAAM,4BAAA;EAhBS;;;EAoBf,MAAA,GAAS,4BAA4B;AAAA;AAAA,KAG3B,wBAAA,GAA2B,4BAAA,GACrC,2BAA2B;AAAA,KAEjB,0BAAA,SAAmC,wBAAwB
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/create-config/types.ts"],"mappings":";;;;KAQY,4BAAA;EACV,SAAA,EAAW,GAAA,CAAI,OAAA;EACf,cAAA,GAAiB,GAAA,CAAI,OAAA;EACrB,gBAAA,GAAmB,GAAA,CAAI,OAAA;EACvB,iBAAA,GAAoB,GAAA,CAAI,OAAA;AAAA;AAAA,KASd,2BAAA;EATqB;;;EAa/B,GAAA,GAAM,4BAAA;EAhBS;;;EAoBf,MAAA,GAAS,4BAA4B;AAAA;AAAA,KAG3B,wBAAA,GAA2B,4BAAA,GACrC,2BAA2B;AAAA,KAEjB,0BAAA,SAAmC,wBAAwB;;;;;AAvBtC;KA8B5B,oBAAA,GAAuB,0BAA0B;AAAA,KAEjD,2BAAA,8CACmB,IAAI;AAAA,KAEvB,sBAAA,uCAA6D,IAAA,GAC9D,IAAA,GACA,IAAA,SAAa,oBAAA,GACX,2BAAA,CAA4B,IAAA,IAC5B,IAAA;AAAA,KAED,qCAAA,aAAkD,QAAA,kBACnD,sBAAA,CAAuB,QAAA,IACvB,QAAA;EACI,KAAA;EACA,YAAA;AAAA,IAEF,IAAA,CAAK,QAAA;EACH,KAAA,EAAO,sBAAA,CAAuB,KAAA;EAC9B,YAAA,EAAc,IAAA,SAAa,aAAA,8BAEL,IAAA,GAAO,qCAAA,CACrB,IAAA,CAAK,KAAA,OAGT,IAAA;AAAA,IAEN,QAAA;AAAA,KAED,kCAAA,aAA+C,QAAA,kBAChD,QAAA,GACA,QAAA;EACI,YAAA;AAAA,IAEF,IAAA,CAAK,QAAA;EACH,YAAA,EAAc,IAAA,SAAa,aAAA,8BAEL,IAAA,GAAO,qCAAA,CACrB,IAAA,CAAK,KAAA,OAGT,IAAA;AAAA,IAEN,QAAA;AAAA,KAEM,yBAAA,mBACQ,aAAA,+BAEF,SAAA,GAAY,kCAAA,CAC1B,SAAA,CAAU,KAAA;;;AAjDwC;AAAA;KAyD1C,8BAAA,mBACQ,aAAA,CAAc,kBAAA,kBACjB,kBAAA,IACb,wBAAA,IACD,MAAA;EACC,YAAA,uBAAmC,aAAA,CAAc,kBAAA;AAAA,YAGvC,iBAAA,CAAkB,MAAA,KAAW,8BAAA,CACjC,SAAA,EACA,wBAAA,CAAyB,MAAA,EAAQ,CAAA;AAAA,KAK/B,iBAAA,mBACQ,aAAA,CAAc,kBAAA,oBACf,iBAAA,CAAkB,SAAA,MAChC,yBAAA,CAA0B,SAAA,EAAW,QAAA,wCAG9B,iBAAA,CACJ,yBAAA,CAA0B,SAAA,EAAW,QAAA,MAClC,8BAAA,CACH,SAAA,EACA,wBAAA,CACE,yBAAA,CAA0B,SAAA,EAAW,QAAA,GACrC,CAAA;AAAA,KAKE,cAAA,mBACQ,aAAA,CAAc,kBAAA,oBAEnB,iBAAA,CAAkB,SAAA,IAAa,wBAAA,GAC1C,iBAAA,CAAkB,SAAA,EAAW,QAAA;;;;;;KAQrB,mBAAA,mBACQ,aAAA,CAAc,kBAAA,kBACjB,OAAA,CAAQ,cAAA,CAAe,SAAA,MACpC,OAAA,CAAQ,cAAA,CAAe,SAAA,KAAc,MAAA;AAAA,KAE7B,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,OAAA,CAAQ,cAAA,CAAe,SAAA"}
|
|
@@ -20,15 +20,35 @@ type SharedResourceConfigOptions = {
|
|
|
20
20
|
};
|
|
21
21
|
type ResourceConfigComponents = BaseResourceConfigComponents & SharedResourceConfigOptions;
|
|
22
22
|
type ResourceConfigComponentKey = keyof ResourceConfigComponents;
|
|
23
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Config keys that cannot be used as nested sub-resource slugs. They already
|
|
25
|
+
* name component slots (`component`, `errorComponent`, …) or shared branches
|
|
26
|
+
* (`detail`, `new`). Top-level resource names may still use these strings.
|
|
27
|
+
*/
|
|
28
|
+
type ReservedResourceSlug = ResourceConfigComponentKey;
|
|
29
|
+
type ReservedResourceSlugMessage<Slug extends string> = `The resource slug "${Slug}" is reserved for config keys`;
|
|
30
|
+
type UnreservedResourceSlug<Slug extends string> = string extends Slug ? Slug : Slug extends ReservedResourceSlug ? ReservedResourceSlugMessage<Slug> : Slug;
|
|
31
|
+
type AssertUnreservedSubResourceDefinition<Resource> = Resource extends string ? UnreservedResourceSlug<Resource> : Resource extends {
|
|
32
|
+
value: infer Value extends string;
|
|
33
|
+
subResources: infer Subs;
|
|
34
|
+
} ? Omit<Resource, 'value' | 'subResources'> & {
|
|
35
|
+
value: UnreservedResourceSlug<Value>;
|
|
36
|
+
subResources: Subs extends ReadonlyArray<unknown> ? { [Index in keyof Subs]: AssertUnreservedSubResourceDefinition<Subs[Index]> } : Subs;
|
|
37
|
+
} : Resource;
|
|
38
|
+
type AssertUnreservedResourceDefinition<Resource> = Resource extends string ? Resource : Resource extends {
|
|
39
|
+
subResources: infer Subs;
|
|
40
|
+
} ? Omit<Resource, 'subResources'> & {
|
|
41
|
+
subResources: Subs extends ReadonlyArray<unknown> ? { [Index in keyof Subs]: AssertUnreservedSubResourceDefinition<Subs[Index]> } : Subs;
|
|
42
|
+
} : Resource;
|
|
43
|
+
type AssertUnreservedResources<Resources extends ReadonlyArray<unknown>> = { [Index in keyof Resources]: AssertUnreservedResourceDefinition<Resources[Index]> };
|
|
44
|
+
/**
|
|
45
|
+
* Config entry for one sub-resource node. Nested sub-resources are keyed directly by
|
|
46
|
+
* their layout slug (there is no `subResources` wrapper in the config).
|
|
47
|
+
*/
|
|
24
48
|
type SubResourceConfigComponentsFor<Resources extends ReadonlyArray<ResourceDefinition>, SubDef extends ResourceDefinition> = ResourceConfigComponents & (SubDef extends {
|
|
25
49
|
subResources: infer Nested extends ReadonlyArray<ResourceDefinition>;
|
|
26
|
-
} ? {
|
|
27
|
-
|
|
28
|
-
} : {});
|
|
29
|
-
type SubResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>, Resource extends LayoutResourceKey<Resources>> = [SubResourceDefinitionsFor<Resources, Resource>] extends [readonly []] ? {} : {
|
|
30
|
-
subResources?: { [K in LayoutResourceKey<SubResourceDefinitionsFor<Resources, Resource>>]?: SubResourceConfigComponentsFor<Resources, ResourceDefinitionForKey<SubResourceDefinitionsFor<Resources, Resource>, K>> };
|
|
31
|
-
};
|
|
50
|
+
} ? { [K in LayoutResourceKey<Nested>]?: SubResourceConfigComponentsFor<Resources, ResourceDefinitionForKey<Nested, K>> } : {});
|
|
51
|
+
type SubResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>, Resource extends LayoutResourceKey<Resources>> = [SubResourceDefinitionsFor<Resources, Resource>] extends [readonly []] ? {} : { [K in LayoutResourceKey<SubResourceDefinitionsFor<Resources, Resource>>]?: SubResourceConfigComponentsFor<Resources, ResourceDefinitionForKey<SubResourceDefinitionsFor<Resources, Resource>, K>> };
|
|
32
52
|
type ResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>> = { [resource in LayoutResourceKey<Resources>]: ResourceConfigComponents & SubResourceConfig<Resources, resource> };
|
|
33
53
|
/**
|
|
34
54
|
* Parameter type for {@link CreateResourceConfigFn}. Intersects the inferred `Config`
|
|
@@ -38,5 +58,5 @@ type ResourceConfig<Resources extends ReadonlyArray<ResourceDefinition>> = { [re
|
|
|
38
58
|
type ResourceConfigInput<Resources extends ReadonlyArray<ResourceDefinition>, Config extends Partial<ResourceConfig<Resources>>> = Partial<ResourceConfig<Resources>> & Config;
|
|
39
59
|
type ResourceConfigMap<Resources extends ReadonlyArray<ResourceDefinition>> = Partial<ResourceConfig<Resources>>;
|
|
40
60
|
//#endregion
|
|
41
|
-
export { BaseResourceConfigComponents, ResourceConfig, ResourceConfigComponentKey, ResourceConfigComponents, ResourceConfigInput, ResourceConfigMap, SharedResourceConfigOptions, SubResourceConfig, SubResourceConfigComponentsFor };
|
|
61
|
+
export { AssertUnreservedResources, BaseResourceConfigComponents, ResourceConfig, ResourceConfigComponentKey, ResourceConfigComponents, ResourceConfigInput, ResourceConfigMap, SharedResourceConfigOptions, SubResourceConfig, SubResourceConfigComponentsFor };
|
|
42
62
|
//# sourceMappingURL=types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/create-config/types.ts"],"mappings":";;;;KAQY,4BAAA;EACV,SAAA,EAAW,GAAA,CAAI,OAAA;EACf,cAAA,GAAiB,GAAA,CAAI,OAAA;EACrB,gBAAA,GAAmB,GAAA,CAAI,OAAA;EACvB,iBAAA,GAAoB,GAAA,CAAI,OAAA;AAAA;AAAA,KASd,2BAAA;EATqB;;;EAa/B,GAAA,GAAM,4BAAA;EAhBS;;;EAoBf,MAAA,GAAS,4BAA4B;AAAA;AAAA,KAG3B,wBAAA,GAA2B,4BAAA,GACrC,2BAA2B;AAAA,KAEjB,0BAAA,SAAmC,wBAAwB
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/create-config/types.ts"],"mappings":";;;;KAQY,4BAAA;EACV,SAAA,EAAW,GAAA,CAAI,OAAA;EACf,cAAA,GAAiB,GAAA,CAAI,OAAA;EACrB,gBAAA,GAAmB,GAAA,CAAI,OAAA;EACvB,iBAAA,GAAoB,GAAA,CAAI,OAAA;AAAA;AAAA,KASd,2BAAA;EATqB;;;EAa/B,GAAA,GAAM,4BAAA;EAhBS;;;EAoBf,MAAA,GAAS,4BAA4B;AAAA;AAAA,KAG3B,wBAAA,GAA2B,4BAAA,GACrC,2BAA2B;AAAA,KAEjB,0BAAA,SAAmC,wBAAwB;;;;;AAvBtC;KA8B5B,oBAAA,GAAuB,0BAA0B;AAAA,KAEjD,2BAAA,8CACmB,IAAI;AAAA,KAEvB,sBAAA,uCAA6D,IAAA,GAC9D,IAAA,GACA,IAAA,SAAa,oBAAA,GACX,2BAAA,CAA4B,IAAA,IAC5B,IAAA;AAAA,KAED,qCAAA,aAAkD,QAAA,kBACnD,sBAAA,CAAuB,QAAA,IACvB,QAAA;EACI,KAAA;EACA,YAAA;AAAA,IAEF,IAAA,CAAK,QAAA;EACH,KAAA,EAAO,sBAAA,CAAuB,KAAA;EAC9B,YAAA,EAAc,IAAA,SAAa,aAAA,8BAEL,IAAA,GAAO,qCAAA,CACrB,IAAA,CAAK,KAAA,OAGT,IAAA;AAAA,IAEN,QAAA;AAAA,KAED,kCAAA,aAA+C,QAAA,kBAChD,QAAA,GACA,QAAA;EACI,YAAA;AAAA,IAEF,IAAA,CAAK,QAAA;EACH,YAAA,EAAc,IAAA,SAAa,aAAA,8BAEL,IAAA,GAAO,qCAAA,CACrB,IAAA,CAAK,KAAA,OAGT,IAAA;AAAA,IAEN,QAAA;AAAA,KAEM,yBAAA,mBACQ,aAAA,+BAEF,SAAA,GAAY,kCAAA,CAC1B,SAAA,CAAU,KAAA;;;AAjDwC;AAAA;KAyD1C,8BAAA,mBACQ,aAAA,CAAc,kBAAA,kBACjB,kBAAA,IACb,wBAAA,IACD,MAAA;EACC,YAAA,uBAAmC,aAAA,CAAc,kBAAA;AAAA,YAGvC,iBAAA,CAAkB,MAAA,KAAW,8BAAA,CACjC,SAAA,EACA,wBAAA,CAAyB,MAAA,EAAQ,CAAA;AAAA,KAK/B,iBAAA,mBACQ,aAAA,CAAc,kBAAA,oBACf,iBAAA,CAAkB,SAAA,MAChC,yBAAA,CAA0B,SAAA,EAAW,QAAA,wCAG9B,iBAAA,CACJ,yBAAA,CAA0B,SAAA,EAAW,QAAA,MAClC,8BAAA,CACH,SAAA,EACA,wBAAA,CACE,yBAAA,CAA0B,SAAA,EAAW,QAAA,GACrC,CAAA;AAAA,KAKE,cAAA,mBACQ,aAAA,CAAc,kBAAA,oBAEnB,iBAAA,CAAkB,SAAA,IAAa,wBAAA,GAC1C,iBAAA,CAAkB,SAAA,EAAW,QAAA;;;;;;KAQrB,mBAAA,mBACQ,aAAA,CAAc,kBAAA,kBACjB,OAAA,CAAQ,cAAA,CAAe,SAAA,MACpC,OAAA,CAAQ,cAAA,CAAe,SAAA,KAAc,MAAA;AAAA,KAE7B,iBAAA,mBACQ,aAAA,CAAc,kBAAA,KAC9B,OAAA,CAAQ,cAAA,CAAe,SAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const require_react_layout_error = require('./react-layout-error.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/errors/invalid-component.ts
|
|
4
|
+
const scope = "component";
|
|
5
|
+
/** Thrown when a requested component slot cannot be resolved. */
|
|
6
|
+
var InvalidComponentError = class extends require_react_layout_error.createReactLayoutError({
|
|
7
|
+
code: "invalidComponent",
|
|
8
|
+
scope
|
|
9
|
+
})((scope, { component, path, resource, validComponents, reason }) => {
|
|
10
|
+
const quotedComponent = JSON.stringify(component) ?? `"${String(component)}"`;
|
|
11
|
+
const locationParts = [path ? `path "${path}"` : void 0, resource ? `resource "${resource}"` : void 0].filter((part) => part !== void 0);
|
|
12
|
+
const locationMessage = locationParts.length > 0 ? ` for ${locationParts.join(" and ")}` : "";
|
|
13
|
+
return `[${scope}]: ${reason ?? `Component slot ${quotedComponent}${locationMessage} is not configured.`}${validComponents && validComponents.length > 0 ? ` Available component slots are ${new Intl.ListFormat("en", {
|
|
14
|
+
style: "long",
|
|
15
|
+
type: "disjunction"
|
|
16
|
+
}).format(validComponents)}.` : ""}`;
|
|
17
|
+
}) {};
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
exports.InvalidComponentError = InvalidComponentError;
|
|
21
|
+
//# sourceMappingURL=invalid-component.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalid-component.cjs","names":["createReactLayoutError"],"sources":["../../src/errors/invalid-component.ts"],"sourcesContent":["import {\n createReactLayoutError,\n type ReactLayoutErrorContext,\n} from './react-layout-error';\n\nconst scope = 'component' as const;\n\n/** Context describing an invalid or unconfigured component slot. */\nexport interface InvalidComponentContext\n extends ReactLayoutErrorContext<typeof scope> {\n component: unknown;\n path?: string;\n resource?: string;\n validComponents?: readonly string[];\n reason?: string;\n}\n\n/** Thrown when a requested component slot cannot be resolved. */\nexport class InvalidComponentError extends createReactLayoutError(\n { code: 'invalidComponent', scope },\n)(\n (\n scope,\n {\n component,\n path,\n resource,\n validComponents,\n reason,\n }: InvalidComponentContext,\n ) => {\n const quotedComponent =\n JSON.stringify(component) ?? `\"${String(component)}\"`;\n const locationParts = [\n path ? `path \"${path}\"` : undefined,\n resource ? `resource \"${resource}\"` : undefined,\n ].filter((part): part is string => part !== undefined);\n const locationMessage =\n locationParts.length > 0 ? ` for ${locationParts.join(' and ')}` : '';\n const body =\n reason ??\n `Component slot ${quotedComponent}${locationMessage} is not configured.`;\n const validComponentsMessage =\n validComponents && validComponents.length > 0\n ? ` Available component slots are ${new Intl.ListFormat('en', {\n style: 'long',\n type: 'disjunction',\n }).format(validComponents)}.`\n : '';\n\n return `[${scope}]: ${body}${validComponentsMessage}`;\n },\n) {}\n"],"mappings":";;;AAKA,MAAM,QAAQ;;AAad,IAAa,wBAAb,cAA2CA,kDACzC;CAAE,MAAM;CAAoB;AAAM,CACpC,GAEI,OACA,EACE,WACA,MACA,UACA,iBACA,aAEC;CACH,MAAM,kBACJ,KAAK,UAAU,SAAS,KAAK,IAAI,OAAO,SAAS,EAAE;CACrD,MAAM,gBAAgB,CACpB,OAAO,SAAS,KAAK,KAAK,QAC1B,WAAW,aAAa,SAAS,KAAK,MACxC,EAAE,QAAQ,SAAyB,SAAS,MAAS;CACrD,MAAM,kBACJ,cAAc,SAAS,IAAI,QAAQ,cAAc,KAAK,OAAO,MAAM;CAYrE,OAAO,IAAI,MAAM,KAVf,UACA,kBAAkB,kBAAkB,gBAAgB,uBAEpD,mBAAmB,gBAAgB,SAAS,IACxC,kCAAkC,IAAI,KAAK,WAAW,MAAM;EAC1D,OAAO;EACP,MAAM;CACR,CAAC,EAAE,OAAO,eAAe,EAAE,KAC3B;AAGR,CACF,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CreatedReactLayoutError, ReactLayoutErrorContext } from "./react-layout-error.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/errors/invalid-component.d.ts
|
|
4
|
+
declare const scope: "component";
|
|
5
|
+
/** Context describing an invalid or unconfigured component slot. */
|
|
6
|
+
interface InvalidComponentContext extends ReactLayoutErrorContext<typeof scope> {
|
|
7
|
+
component: unknown;
|
|
8
|
+
path?: string;
|
|
9
|
+
resource?: string;
|
|
10
|
+
validComponents?: readonly string[];
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
|
13
|
+
declare const InvalidComponentError_base: CreatedReactLayoutError<"invalidComponent", "component", InvalidComponentContext>;
|
|
14
|
+
/** Thrown when a requested component slot cannot be resolved. */
|
|
15
|
+
declare class InvalidComponentError extends InvalidComponentError_base {}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { InvalidComponentContext, InvalidComponentError };
|
|
18
|
+
//# sourceMappingURL=invalid-component.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalid-component.d.cts","names":[],"sources":["../../src/errors/invalid-component.ts"],"mappings":";;;cAKM,KAAA;;UAGW,uBAAA,SACP,uBAAuB,QAAQ,KAAA;EACvC,SAAA;EACA,IAAA;EACA,QAAA;EACA,eAAA;EACA,MAAA;AAAA;AAAA,cACD,0BAAA;;cAGY,qBAAA,SAA8B,0BAkC1C"}
|