@loozo/angular-router 0.0.0-stage → 0.0.1
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/.npmignore +3 -0
- package/LICENSE +21 -0
- package/README.md +114 -2
- package/builders.json +15 -0
- package/fesm2022/loozo-angular-router-_core.mjs +565 -0
- package/fesm2022/loozo-angular-router-_core.mjs.map +1 -0
- package/fesm2022/loozo-angular-router-_generated.mjs +658 -0
- package/fesm2022/loozo-angular-router-_generated.mjs.map +1 -0
- package/fesm2022/loozo-angular-router.mjs +6 -0
- package/fesm2022/loozo-angular-router.mjs.map +1 -0
- package/node/_core/src/path.js +50 -0
- package/node/src/builders/application.js +40 -0
- package/node/src/builders/options.js +70 -0
- package/node/src/builders/serve.js +155 -0
- package/node/src/generation/emit.js +245 -0
- package/node/src/generation/files.js +168 -0
- package/node/src/generation/generate.js +19 -0
- package/node/src/generation/selectors.js +60 -0
- package/node/src/generation/sources.js +493 -0
- package/node/src/generation/validate.js +463 -0
- package/package.json +47 -3
- package/schemas/application.json +17 -0
- package/schemas/serve.json +16 -0
- package/types/loozo-angular-router-_core.d.ts +185 -0
- package/types/loozo-angular-router-_generated.d.ts +56 -0
- package/types/loozo-angular-router.d.ts +1 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { RedirectCommand, RunGuardsAndResolvers, ActivatedRouteSnapshot, RouterStateSnapshot, MaybeAsync, GuardResult, Route as Route$1, UrlSegment, PartialMatchRouteSnapshot } from '@angular/router';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
|
|
4
|
+
interface ParamCodec<Value> {
|
|
5
|
+
parse(raw: string): Value | Promise<Value>;
|
|
6
|
+
stringify(value: Value): string;
|
|
7
|
+
}
|
|
8
|
+
declare const searchPresence: unique symbol;
|
|
9
|
+
type OptionalCodec<Value> = ParamCodec<Value | undefined> & {
|
|
10
|
+
readonly [searchPresence]: "optional";
|
|
11
|
+
};
|
|
12
|
+
type NullableCodec<Value> = ParamCodec<Value | null> & {
|
|
13
|
+
readonly [searchPresence]: "nullable";
|
|
14
|
+
};
|
|
15
|
+
type PathCodec = ParamCodec<any> & {
|
|
16
|
+
readonly [searchPresence]?: never;
|
|
17
|
+
};
|
|
18
|
+
type CodecValue<Codec> = Codec extends ParamCodec<infer Value> ? Value : never;
|
|
19
|
+
type IsOptional<Codec> = Codec extends {
|
|
20
|
+
readonly [searchPresence]: "optional";
|
|
21
|
+
} ? true : false;
|
|
22
|
+
declare function codecPresence(codec: object): "optional" | "nullable" | undefined;
|
|
23
|
+
declare const stringParam: ParamCodec<string>;
|
|
24
|
+
declare const numberParam: ParamCodec<number>;
|
|
25
|
+
declare const booleanParam: ParamCodec<boolean>;
|
|
26
|
+
declare function enumParam<const Values extends readonly string[]>(values: Values): ParamCodec<Values[number]>;
|
|
27
|
+
declare function optionalSearchParam<Value>(codec: ParamCodec<Value>): OptionalCodec<Value>;
|
|
28
|
+
declare function nullableSearchParam<Value>(codec: ParamCodec<Value> & {
|
|
29
|
+
readonly [searchPresence]?: "nullable";
|
|
30
|
+
}): NullableCodec<Value>;
|
|
31
|
+
|
|
32
|
+
type ValidName<Name extends string> = Name extends "" | "__proto__" | `...${string}` | `${string}?${string}` | `${string}*${string}` | `${string}[]${string}` ? false : true;
|
|
33
|
+
type SegmentValid<Segment extends string> = Segment extends `$${infer Name}` ? ValidName<Name> : Segment extends "" | "." | ".." | "*" | "**" | `:${string}` ? false : true;
|
|
34
|
+
type ValidateSegments<Path extends string, Scalars extends string = never> = Path extends `${infer Head}/${infer Tail}` ? Head extends `$${string}[]` ? false : SegmentValid<Head> extends true ? ValidateSegments<Tail, Scalars | ScalarName<Head>> : false : Path extends `$${infer Name}[]` ? ValidName<Name> extends true ? Name extends Scalars ? false : true : false : SegmentValid<Path>;
|
|
35
|
+
type ValidPath<Path extends string> = string extends Path ? never : Path extends "" ? Path : ValidateSegments<Path> extends true ? Path : never;
|
|
36
|
+
type ScalarName<Segment extends string> = Segment extends `$${infer Name}` ? Name : never;
|
|
37
|
+
type SegmentName<Segment extends string> = Segment extends `$${infer Name}[]` ? Name : ScalarName<Segment>;
|
|
38
|
+
type PathNames<Path extends string> = Path extends `${infer Head}/${infer Tail}` ? SegmentName<Head> | PathNames<Tail> : SegmentName<Path>;
|
|
39
|
+
type CatchallName<Path extends string> = Path extends `${string}/${infer Tail}` ? CatchallName<Tail> : Path extends `$${infer Name}[]` ? Name : never;
|
|
40
|
+
type Segment = {
|
|
41
|
+
readonly kind: "static";
|
|
42
|
+
readonly text: string;
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: "scalar" | "catchall";
|
|
45
|
+
readonly name: string;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
declare const routeBrand: unique symbol;
|
|
49
|
+
interface Route<Path extends string, Params, Search, Resolvers = {}, Fragments extends string = string, Catchall extends boolean = CatchallName<Path> extends never ? false : true> {
|
|
50
|
+
readonly [routeBrand]: {
|
|
51
|
+
readonly fragments: Fragments;
|
|
52
|
+
readonly catchall: Catchall;
|
|
53
|
+
};
|
|
54
|
+
readonly path: Path;
|
|
55
|
+
readonly __params?: Params;
|
|
56
|
+
readonly __search?: Search;
|
|
57
|
+
readonly __data?: {
|
|
58
|
+
readonly [Key in keyof Resolvers]: Resolved<Resolvers[Key]>;
|
|
59
|
+
};
|
|
60
|
+
readonly resolve?: Readonly<Resolvers>;
|
|
61
|
+
readonly runGuardsAndResolvers?: RunGuardsAndResolvers;
|
|
62
|
+
}
|
|
63
|
+
type Unwrap<Value> = Value extends Promise<infer Inner> | Observable<infer Inner> ? Unwrap<Inner> : Value;
|
|
64
|
+
type Resolved<Callback> = Callback extends (...args: any[]) => infer Value ? Exclude<Unwrap<Value>, RedirectCommand> : never;
|
|
65
|
+
type AnyRoute = Route<string, any, any, any, any, boolean>;
|
|
66
|
+
type ParamsOf<Target> = Target extends Route<string, infer Params, any, any, any, boolean> ? Params : {};
|
|
67
|
+
type SearchOf<Target> = Target extends Route<string, any, infer Search, any, any, boolean> ? Search : {};
|
|
68
|
+
type FragmentsOf<Target> = Target extends Route<string, any, any, any, infer Fragments, boolean> ? Fragments : never;
|
|
69
|
+
type CodecMap = Record<string, ParamCodec<any>>;
|
|
70
|
+
type LocalParams<Path extends string, Codecs> = {
|
|
71
|
+
readonly [Key in keyof Codecs]: Key extends CatchallName<Path> ? readonly CodecValue<Codecs[Key]>[] : CodecValue<Codecs[Key]>;
|
|
72
|
+
};
|
|
73
|
+
type SearchValues<Codecs> = {
|
|
74
|
+
readonly [Key in keyof Codecs as IsOptional<Codecs[Key]> extends true ? never : Key]: CodecValue<Codecs[Key]>;
|
|
75
|
+
} & {
|
|
76
|
+
readonly [Key in keyof Codecs as IsOptional<Codecs[Key]> extends true ? Key : never]?: CodecValue<Codecs[Key]>;
|
|
77
|
+
};
|
|
78
|
+
type EffectiveParams<Path extends string, Codecs, Parent> = ParamsOf<Parent> & LocalParams<Path, Codecs>;
|
|
79
|
+
type EffectiveSearch<Codecs, Parent> = SearchOf<Parent> & SearchValues<Codecs>;
|
|
80
|
+
type Inputs<Params, Search> = {
|
|
81
|
+
readonly params: Readonly<Params>;
|
|
82
|
+
readonly search: Readonly<Search>;
|
|
83
|
+
};
|
|
84
|
+
type Resolver<Params, Search> = (inputs: Inputs<Params, Search>, snapshot: ActivatedRouteSnapshot, state: RouterStateSnapshot) => unknown;
|
|
85
|
+
type ActivationGuard<Params, Search> = (inputs: Inputs<Params, Search>, snapshot: ActivatedRouteSnapshot, state: RouterStateSnapshot) => MaybeAsync<GuardResult>;
|
|
86
|
+
type MatchingGuard<Params, Search> = (inputs: Inputs<Params, Search>, routeConfig: Route$1, segments: UrlSegment[], partialSnapshot: PartialMatchRouteSnapshot) => MaybeAsync<GuardResult>;
|
|
87
|
+
type RequiredKeys<Value> = {
|
|
88
|
+
[Key in keyof Value]-?: Pick<Value, Key> extends Required<Pick<Value, Key>> ? Key : never;
|
|
89
|
+
}[keyof Value];
|
|
90
|
+
type SearchInput<Schema, Keys extends keyof Schema> = keyof Schema extends never ? Record<string, never> : Pick<Schema, RequiredKeys<Schema> | Keys>;
|
|
91
|
+
type UrlValues<Target extends AnyRoute, SearchKeys extends keyof SearchOf<Target> = keyof SearchOf<Target>> = (keyof ParamsOf<Target> extends never ? {
|
|
92
|
+
params?: never;
|
|
93
|
+
} : {
|
|
94
|
+
params: ParamsOf<Target>;
|
|
95
|
+
}) & (keyof SearchOf<Target> extends never ? {
|
|
96
|
+
search?: never;
|
|
97
|
+
} : RequiredKeys<SearchOf<Target>> extends never ? {
|
|
98
|
+
search?: SearchInput<SearchOf<Target>, SearchKeys>;
|
|
99
|
+
} : {
|
|
100
|
+
search: SearchInput<SearchOf<Target>, SearchKeys>;
|
|
101
|
+
}) & (FragmentsOf<Target> extends never ? {
|
|
102
|
+
fragment?: never;
|
|
103
|
+
} : {
|
|
104
|
+
fragment?: FragmentsOf<Target>;
|
|
105
|
+
});
|
|
106
|
+
type CompatibleKeys<Source, Value> = {
|
|
107
|
+
[Key in keyof Source]: Source[Key] extends Value ? Key : never;
|
|
108
|
+
}[keyof Source];
|
|
109
|
+
type Mapping<Source, Destination> = {
|
|
110
|
+
[Key in keyof Destination]: CompatibleKeys<Source, Destination[Key]>;
|
|
111
|
+
};
|
|
112
|
+
type Forwardable<Source, Destination> = {
|
|
113
|
+
[Key in keyof Destination]: Key extends keyof Source ? Source[Key] extends Destination[Key] ? never : Key : Key;
|
|
114
|
+
}[keyof Destination] extends never ? true : false;
|
|
115
|
+
type Preservable<Source, Destination> = {
|
|
116
|
+
[Key in RequiredKeys<Destination>]: Key extends RequiredKeys<Source> ? Source[Key & keyof Source] extends Destination[Key] ? never : Key : Key;
|
|
117
|
+
}[RequiredKeys<Destination>] extends never ? true : false;
|
|
118
|
+
type Redirect<SourceParams, SourceSearch, Target extends AnyRoute, SearchKeys extends keyof SearchOf<Target>> = {
|
|
119
|
+
to: Target;
|
|
120
|
+
search: {
|
|
121
|
+
mode: "replace";
|
|
122
|
+
values: SearchInput<SearchOf<NoInfer<Target>>, SearchKeys>;
|
|
123
|
+
} | (RequiredKeys<SearchOf<Target>> extends never ? {
|
|
124
|
+
mode: "drop";
|
|
125
|
+
} : never) | (Preservable<SourceSearch, SearchOf<Target>> extends true ? {
|
|
126
|
+
mode: "preserve";
|
|
127
|
+
} : never);
|
|
128
|
+
fragment: {
|
|
129
|
+
mode: "preserve" | "drop";
|
|
130
|
+
} | (FragmentsOf<Target> extends never ? never : {
|
|
131
|
+
mode: "replace";
|
|
132
|
+
value: FragmentsOf<Target>;
|
|
133
|
+
});
|
|
134
|
+
} & (Forwardable<SourceParams, ParamsOf<Target>> extends true ? {
|
|
135
|
+
params?: Mapping<SourceParams, ParamsOf<Target>>;
|
|
136
|
+
} : {
|
|
137
|
+
params: Mapping<SourceParams, ParamsOf<Target>>;
|
|
138
|
+
});
|
|
139
|
+
type RouteConfig<Path extends string, Parent extends AnyRoute | undefined, Params extends Record<string, PathCodec>, Search extends CodecMap, Resolvers, Fragments extends readonly string[], Target extends AnyRoute | undefined, ReplacementKeys extends keyof SearchOf<Target>> = {
|
|
140
|
+
parent?: Parent & (Parent extends Route<string, any, any, any, any, true> ? never : unknown);
|
|
141
|
+
search?: Search & Record<Extract<keyof Search, keyof SearchOf<Parent>>, never>;
|
|
142
|
+
resolve?: Resolvers & Record<PropertyKey, Resolver<EffectiveParams<Path, Params, Parent>, EffectiveSearch<Search, Parent>>> & {
|
|
143
|
+
__loozoAngularRouterRouteId?: never;
|
|
144
|
+
};
|
|
145
|
+
fragments?: Fragments;
|
|
146
|
+
runGuardsAndResolvers?: RunGuardsAndResolvers;
|
|
147
|
+
canActivateChild?: readonly ActivationGuard<EffectiveParams<Path, Params, Parent>, EffectiveSearch<Search, Parent>>[];
|
|
148
|
+
canDeactivate?: Route$1["canDeactivate"];
|
|
149
|
+
providers?: Route$1["providers"];
|
|
150
|
+
title?: Route$1["title"];
|
|
151
|
+
data?: Route$1["data"] & {
|
|
152
|
+
__loozoAngularRouterRouteId?: never;
|
|
153
|
+
};
|
|
154
|
+
} & (PathNames<Path> extends never ? {
|
|
155
|
+
params?: never;
|
|
156
|
+
} : {
|
|
157
|
+
params: Params & Record<PathNames<Path>, PathCodec> & Record<Exclude<keyof Params, PathNames<Path>> | Extract<keyof Params, keyof ParamsOf<Parent>>, never>;
|
|
158
|
+
}) & (Target extends AnyRoute ? {
|
|
159
|
+
redirect: Redirect<EffectiveParams<Path, Params, Parent>, EffectiveSearch<Search, Parent>, Target, ReplacementKeys>;
|
|
160
|
+
canActivate?: never;
|
|
161
|
+
canMatch?: never;
|
|
162
|
+
} : {
|
|
163
|
+
redirect?: never;
|
|
164
|
+
canActivate?: readonly ActivationGuard<EffectiveParams<Path, Params, Parent>, EffectiveSearch<Search, Parent>>[];
|
|
165
|
+
canMatch?: readonly MatchingGuard<LocalParams<Path, Params>, EffectiveSearch<Search, Parent>>[];
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
interface RouteMetadata {
|
|
169
|
+
readonly parent?: AnyRoute;
|
|
170
|
+
readonly localSegments: readonly Segment[];
|
|
171
|
+
readonly segments: readonly Segment[];
|
|
172
|
+
readonly localParams: Readonly<Record<string, ParamCodec<any>>>;
|
|
173
|
+
readonly localSearch: Readonly<Record<string, ParamCodec<any>>>;
|
|
174
|
+
readonly params: Readonly<Record<string, ParamCodec<any>>>;
|
|
175
|
+
readonly search: Readonly<Record<string, ParamCodec<any>>>;
|
|
176
|
+
readonly fragments: readonly string[];
|
|
177
|
+
readonly config: Readonly<Record<string, unknown>>;
|
|
178
|
+
}
|
|
179
|
+
declare function routeMetadata(route: unknown): RouteMetadata;
|
|
180
|
+
declare function defineRoute<const Path extends string, Parent extends AnyRoute | undefined = undefined, Params extends Record<string, PathCodec> = {}, Search extends CodecMap = {}, Resolvers extends Record<string, (...args: any[]) => unknown> = {}, const Fragments extends readonly string[] = [], Target extends AnyRoute | undefined = undefined, ReplacementKeys extends keyof SearchOf<NoInfer<Target>> = never>(path: Path & ValidPath<Path>, config: RouteConfig<Path, Parent, Params, Search, Resolvers, Fragments, Target, ReplacementKeys>): Route<Path, EffectiveParams<Path, Params, Parent>, EffectiveSearch<Search, Parent>, Resolvers, Fragments[number], CatchallName<Path> extends never ? false : true>;
|
|
181
|
+
|
|
182
|
+
declare function createUrl<Target extends AnyRoute, SearchKeys extends keyof SearchOf<NoInfer<Target>> = never>(route: Target, values: UrlValues<NoInfer<Target>, SearchKeys>): string;
|
|
183
|
+
|
|
184
|
+
export { booleanParam, codecPresence, createUrl, defineRoute, enumParam, nullableSearchParam, numberParam, optionalSearchParam, routeMetadata, stringParam };
|
|
185
|
+
export type { AnyRoute, FragmentsOf, Inputs, ParamCodec, ParamsOf, Route, RouteMetadata, SearchOf, UrlValues };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ActivatedRouteSnapshot, Route, RedirectFunction, UrlTree } from '@angular/router';
|
|
2
|
+
import { AnyRoute, ParamsOf, SearchOf, UrlValues } from '@loozo/angular-router/_core';
|
|
3
|
+
import { Resource } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
interface RecordBinding {
|
|
6
|
+
readonly definition: () => AnyRoute;
|
|
7
|
+
readonly owners: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
interface RouteSet {
|
|
10
|
+
readonly records: Readonly<Record<string, RecordBinding>>;
|
|
11
|
+
readonly destinations: Readonly<Record<string, () => AnyRoute>>;
|
|
12
|
+
readonly absolute: Readonly<Record<string, string>>;
|
|
13
|
+
readonly relative: Readonly<Record<string, Readonly<Record<string, string>>>>;
|
|
14
|
+
}
|
|
15
|
+
interface Parsed {
|
|
16
|
+
readonly params: Readonly<Record<string, unknown>>;
|
|
17
|
+
readonly search: Readonly<Record<string, unknown>>;
|
|
18
|
+
}
|
|
19
|
+
declare function assertIdentity(snapshot: Pick<ActivatedRouteSnapshot, "routeConfig">, id: string): void;
|
|
20
|
+
declare function parseInputs(set: RouteSet, id: string, snapshot: ActivatedRouteSnapshot): Promise<Parsed>;
|
|
21
|
+
|
|
22
|
+
declare function callbacks(set: RouteSet, id: string): Pick<Route, "canActivate" | "canActivateChild" | "canMatch" | "resolve">;
|
|
23
|
+
declare function redirect(definition: () => AnyRoute): RedirectFunction;
|
|
24
|
+
|
|
25
|
+
declare const destinationBrand: unique symbol;
|
|
26
|
+
declare class Destination<Target extends AnyRoute, Set = unknown, Id extends string = string> {
|
|
27
|
+
#private;
|
|
28
|
+
readonly [destinationBrand]: {
|
|
29
|
+
readonly target: Target;
|
|
30
|
+
readonly set: Set;
|
|
31
|
+
readonly id: Id;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
declare function createDestination<Target extends AnyRoute, Set, Id extends string>(getSet: () => RouteSet, id: Id): Destination<Target, Set, Id>;
|
|
35
|
+
type DataOf<Target> = Target extends {
|
|
36
|
+
readonly __data?: infer Data;
|
|
37
|
+
} ? Readonly<Data> : never;
|
|
38
|
+
type IsUnion<Value, Whole = Value> = Value extends unknown ? [Whole] extends [Value] ? false : true : never;
|
|
39
|
+
interface Handle<Target extends AnyRoute, Selected extends Record<string, AnyRoute> = {}, Set = unknown, References extends Record<string, AnyRoute> = {}> {
|
|
40
|
+
readonly params: Resource<Readonly<ParamsOf<Target>> | undefined>;
|
|
41
|
+
readonly search: Resource<Readonly<SearchOf<Target>> | undefined>;
|
|
42
|
+
readonly data: Resource<DataOf<Target> | undefined>;
|
|
43
|
+
link<Keys extends keyof SearchOf<Target> = never>(values: UrlValues<Target, Keys>): UrlTree;
|
|
44
|
+
link<Keys extends keyof SearchOf<Target> = never>(selector: ".", values: UrlValues<Target, Keys>): UrlTree;
|
|
45
|
+
link<const Selector extends keyof Selected & string, Keys extends keyof SearchOf<NoInfer<Selected[Selector]>> = never>(selector: Selector & (IsUnion<Selector> extends true ? never : unknown), values: UrlValues<NoInfer<Selected[Selector]>, Keys>): UrlTree;
|
|
46
|
+
link<const Id extends keyof References & string, Keys extends keyof SearchOf<NoInfer<References[Id]>> = never>(selector: Destination<NoInfer<References[Id]>, Set, Id> & (IsUnion<Id> extends true ? never : unknown), values: UrlValues<NoInfer<References[Id]>, Keys>): UrlTree;
|
|
47
|
+
navigate<Keys extends keyof SearchOf<Target> = never>(values: UrlValues<Target, Keys>): Promise<boolean>;
|
|
48
|
+
navigate<Keys extends keyof SearchOf<Target> = never>(selector: ".", values: UrlValues<Target, Keys>): Promise<boolean>;
|
|
49
|
+
navigate<const Selector extends keyof Selected & string, Keys extends keyof SearchOf<NoInfer<Selected[Selector]>> = never>(selector: Selector & (IsUnion<Selector> extends true ? never : unknown), values: UrlValues<NoInfer<Selected[Selector]>, Keys>): Promise<boolean>;
|
|
50
|
+
navigate<const Id extends keyof References & string, Keys extends keyof SearchOf<NoInfer<References[Id]>> = never>(selector: Destination<NoInfer<References[Id]>, Set, Id> & (IsUnion<Id> extends true ? never : unknown), values: UrlValues<NoInfer<References[Id]>, Keys>): Promise<boolean>;
|
|
51
|
+
}
|
|
52
|
+
declare function nativeOptions(definition: AnyRoute): Record<string, unknown>;
|
|
53
|
+
declare function injectGeneratedRoute<Target extends AnyRoute, Selected extends Record<string, AnyRoute>, Set, References extends Record<string, AnyRoute>>(set: RouteSet, id: string): Handle<Target, Selected, Set, References>;
|
|
54
|
+
|
|
55
|
+
export { Destination, assertIdentity, callbacks, createDestination, injectGeneratedRoute, nativeOptions, parseInputs, redirect };
|
|
56
|
+
export type { Handle, RecordBinding, RouteSet };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ParamCodec, Route, booleanParam, createUrl, defineRoute, enumParam, nullableSearchParam, numberParam, optionalSearchParam, stringParam } from '@loozo/angular-router/_core';
|