@bomb.sh/router 0.0.1 → 0.7.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.
Files changed (61) hide show
  1. package/README.md +293 -0
  2. package/esm/_dnt.polyfills.d.ts +11 -0
  3. package/esm/_dnt.polyfills.js +15 -0
  4. package/esm/lib/argument.d.ts +7 -0
  5. package/esm/lib/argument.js +66 -0
  6. package/esm/lib/bind.d.ts +41 -0
  7. package/esm/lib/bind.js +285 -0
  8. package/esm/lib/checkpoint.d.ts +3 -0
  9. package/esm/lib/checkpoint.js +5 -0
  10. package/esm/lib/command.d.ts +6 -0
  11. package/esm/lib/command.js +16 -0
  12. package/esm/lib/dasherize.d.ts +1 -0
  13. package/esm/lib/dasherize.js +7 -0
  14. package/esm/lib/decode.d.ts +6 -0
  15. package/esm/lib/decode.js +46 -0
  16. package/esm/lib/definition.d.ts +4 -0
  17. package/esm/lib/definition.js +10 -0
  18. package/esm/lib/dynamic.d.ts +6 -0
  19. package/esm/lib/dynamic.js +21 -0
  20. package/esm/lib/env.d.ts +34 -0
  21. package/esm/lib/env.js +83 -0
  22. package/esm/lib/extend.d.ts +2 -0
  23. package/esm/lib/extend.js +4 -0
  24. package/esm/lib/maybe.d.ts +9 -0
  25. package/esm/lib/maybe.js +12 -0
  26. package/esm/lib/multiple.d.ts +8 -0
  27. package/esm/lib/multiple.js +9 -0
  28. package/esm/lib/option.d.ts +7 -0
  29. package/esm/lib/option.js +31 -0
  30. package/esm/lib/param.d.ts +26 -0
  31. package/esm/lib/param.js +37 -0
  32. package/esm/lib/parse.d.ts +2 -0
  33. package/esm/lib/parse.js +338 -0
  34. package/esm/lib/pipeline.d.ts +182 -0
  35. package/esm/lib/pipeline.js +6 -0
  36. package/esm/lib/print.d.ts +7 -0
  37. package/esm/lib/print.js +156 -0
  38. package/esm/lib/read.d.ts +27 -0
  39. package/esm/lib/read.js +95 -0
  40. package/esm/lib/rest.d.ts +9 -0
  41. package/esm/lib/rest.js +1 -0
  42. package/esm/lib/result.d.ts +9 -0
  43. package/esm/lib/result.js +1 -0
  44. package/esm/lib/route.d.ts +9 -0
  45. package/esm/lib/route.js +45 -0
  46. package/esm/lib/toggle.d.ts +7 -0
  47. package/esm/lib/toggle.js +91 -0
  48. package/esm/lib/tokenize.d.ts +20 -0
  49. package/esm/lib/tokenize.js +41 -0
  50. package/esm/lib/tokenizer.d.ts +34 -0
  51. package/esm/lib/tokenizer.js +130 -0
  52. package/esm/lib/transform.d.ts +8 -0
  53. package/esm/lib/transform.js +34 -0
  54. package/esm/lib/types.d.ts +196 -0
  55. package/esm/lib/types.js +1 -0
  56. package/esm/lib/values.d.ts +29 -0
  57. package/esm/lib/values.js +83 -0
  58. package/esm/mod.d.ts +29 -0
  59. package/esm/mod.js +18 -0
  60. package/esm/package.json +3 -0
  61. package/package.json +27 -9
@@ -0,0 +1,8 @@
1
+ import { type ModelElement, type ModelTransform } from "./pipeline.js";
2
+ import type { Schema } from "./types.js";
3
+ export declare function transform<Input extends object, Output extends object>(schema: Schema<Input, Output>): ModelElement<SchemaTransform<Input, Output>>;
4
+ interface SchemaTransform<Input extends object, Output extends object> extends ModelTransform {
5
+ readonly input: Input;
6
+ readonly output: Output;
7
+ }
8
+ export {};
@@ -0,0 +1,34 @@
1
+ import { brand } from "./pipeline.js";
2
+ export function transform(schema) {
3
+ return brand((route) => {
4
+ let phases = [...route.phases];
5
+ let phase = phases.pop();
6
+ phases.push({
7
+ ...phase,
8
+ model: {
9
+ params: phase.model.params,
10
+ steps: phase.model.steps.concat((current) => {
11
+ let result = schema["~standard"].validate(current);
12
+ if (result instanceof Promise) {
13
+ return {
14
+ ok: false,
15
+ issues: [{
16
+ message: `async validation not currently supported`,
17
+ }],
18
+ };
19
+ }
20
+ else if (result.issues) {
21
+ return { ok: false, issues: result.issues };
22
+ }
23
+ else {
24
+ return { ok: true, value: result.value };
25
+ }
26
+ }),
27
+ },
28
+ });
29
+ return {
30
+ ...route,
31
+ phases,
32
+ };
33
+ });
34
+ }
@@ -0,0 +1,196 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ import type { EnvSource } from "./env.js";
3
+ import type { Literal } from "./tokenize.js";
4
+ import type { AnyParam } from "./param.js";
5
+ import type { Result } from "./result.js";
6
+ import type { ValueSource } from "./values.js";
7
+ export type Issue = StandardSchemaV1.Issue;
8
+ export type Schema<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output>;
9
+ export type OutputOf<S extends Schema> = StandardSchemaV1.InferOutput<S>;
10
+ export interface Definition<N extends string> {
11
+ readonly name: N;
12
+ readonly description?: string;
13
+ }
14
+ export interface Route<N extends string, M extends Method, P extends AnyPhases> extends Definition<N> {
15
+ readonly methods: readonly M[];
16
+ readonly version?: string;
17
+ readonly phases: P;
18
+ }
19
+ export type Parse<R extends AnyRoute> = Outcome<ParseAt<R, "/", {}>>;
20
+ export type Phase<Model extends object, Routes extends readonly AnyRoute[], Requirement = never> = [Requirement] extends [never] ? Done<Model, Routes> : Next<Model, Routes, Requirement>;
21
+ export type Next<Model extends object, Routes extends readonly AnyRoute[], T> = {
22
+ readonly [phaseModel]?: Model;
23
+ readonly model: {
24
+ params: Params;
25
+ steps: ((previous: object, bindings: Record<string, unknown>) => Result<object>)[];
26
+ };
27
+ readonly routes: Routes;
28
+ readonly values: readonly ValueSource[];
29
+ readonly envs: readonly EnvSource[];
30
+ readonly resolver: (requirement: T) => (input: AnyRoute) => AnyRoute;
31
+ };
32
+ export type Done<Model extends object, Routes extends readonly AnyRoute[]> = {
33
+ readonly [phaseModel]?: Model;
34
+ readonly model: {
35
+ params: Params;
36
+ steps: ((previous: object, bindings: Record<string, unknown>) => Result<object>)[];
37
+ };
38
+ readonly routes: Routes;
39
+ readonly values: readonly ValueSource[];
40
+ readonly envs: readonly EnvSource[];
41
+ };
42
+ export type Params = Readonly<Record<string, AnyParam>>;
43
+ export interface ParseIncrement<R extends AnyRoute, P extends RoutePath = "/", Models extends ModelsByRoute = {}> {
44
+ readonly ok: true;
45
+ readonly route: P;
46
+ readonly model: IncrementModelOf<R>;
47
+ resume(result: Result<RequirementOf<R>>): Outcome<ParseAt<ContinuationOf<R>, P, Models>>;
48
+ }
49
+ export type ContinuationOf<R extends AnyRoute> = Route<R["name"], MethodsOf<R>, SettleNext<R["phases"]>>;
50
+ export type ModelOf<R extends AnyRoute, P extends RoutePath = "/"> = ModelOfRoute<RouteAt<R, P>>;
51
+ export type ChildrenOf<R extends AnyRoute> = RoutesIn<R["phases"]>;
52
+ export type RequirementsOf<R extends AnyRoute> = RequirementsIn<R["phases"]>;
53
+ export type RequirementOf<R extends AnyRoute> = RequirementInPhases<R["phases"]>;
54
+ export interface AnyRoute extends Definition<string> {
55
+ readonly methods: readonly Method[];
56
+ readonly version?: string;
57
+ readonly phases: AnyPhases;
58
+ }
59
+ export interface AnyPhase {
60
+ readonly [phaseModel]?: object;
61
+ readonly model: {
62
+ params: Params;
63
+ steps: ((previous: object, bindings: Record<string, unknown>) => Result<object>)[];
64
+ };
65
+ readonly routes: readonly AnyRoute[];
66
+ readonly values: readonly ValueSource[];
67
+ readonly envs: readonly EnvSource[];
68
+ readonly resolver?: (requirement: never) => (route: never) => AnyRoute;
69
+ }
70
+ export type AnyPhases = readonly [AnyPhase, ...AnyPhase[]];
71
+ export type Method = "help" | "version" | "execute";
72
+ export type MethodsOf<R extends AnyRoute> = R["methods"][number];
73
+ export type Path = readonly string[];
74
+ export type Input = {
75
+ argv: string[];
76
+ values?: readonly ValueSource[];
77
+ envs?: readonly EnvSource[];
78
+ };
79
+ export interface Failure<C extends Status> {
80
+ readonly ok: false;
81
+ readonly code: C;
82
+ }
83
+ export type Outcome<T> = T | MethodNotAllowed | UnprocessableContent;
84
+ export type IntentsOf<R extends AnyRoute> = IntentsAt<R, `/`, {}>;
85
+ export type RoutePath = `/${string}`;
86
+ export type ModelsByRoute = {
87
+ readonly [path: RoutePath]: object;
88
+ };
89
+ export type PathOf<R extends RoutePath> = R extends "/" ? [] : R extends `/${infer Rest}` ? Split<Rest> : never;
90
+ export type AnyIntent = Help<RoutePath> | Version<RoutePath> | Execute<RoutePath, ModelsByRoute>;
91
+ export type ChildIntents<C extends readonly AnyRoute[], P extends RoutePath, Models extends ModelsByRoute> = C extends readonly [
92
+ infer Head extends AnyRoute,
93
+ ...infer Tail extends readonly AnyRoute[]
94
+ ] ? (IntentsAt<Head, Append<P, Head["name"]>, Models> | ChildIntents<Tail, P, Models>) : never;
95
+ export interface Intent<M extends Method, P extends RoutePath> {
96
+ readonly ok: true;
97
+ readonly method: M;
98
+ readonly route: P;
99
+ readonly definition: AnyRoute;
100
+ readonly path: PathOf<P>;
101
+ readonly literals: Iterable<Literal>;
102
+ }
103
+ export type Help<P extends RoutePath> = Intent<"help", P>;
104
+ export type Version<P extends RoutePath> = Intent<"version", P>;
105
+ export interface Execute<P extends RoutePath, Models extends ModelsByRoute> extends Intent<"execute", P> {
106
+ readonly issues: readonly Issue[];
107
+ readonly model: Models[P];
108
+ readonly models: Models;
109
+ }
110
+ export type Status = "method-not-allowed" | "unprocessable-content";
111
+ export interface MethodNotAllowed extends Failure<"method-not-allowed"> {
112
+ readonly route: string;
113
+ readonly definition: AnyRoute;
114
+ readonly path: Path;
115
+ readonly method: Method;
116
+ readonly allowed: readonly Method[];
117
+ }
118
+ export interface UnprocessableContent extends Failure<"unprocessable-content"> {
119
+ readonly route: string;
120
+ readonly definition: AnyRoute;
121
+ readonly path: Path;
122
+ readonly issues: Issue[];
123
+ }
124
+ declare const phaseModel: unique symbol;
125
+ type ModelOfRoute<R extends AnyRoute> = ModelsIn<R["phases"]> extends infer Model extends object ? {
126
+ [K in keyof Model]: Model[K];
127
+ } : never;
128
+ type ModelsIn<P extends readonly AnyPhase[]> = P extends readonly [
129
+ infer Head extends AnyPhase,
130
+ ...infer Tail extends readonly AnyPhase[]
131
+ ] ? Omit<PhaseModelOf<Head>, ModelKeys<Tail>> & ModelsIn<Tail> : {};
132
+ type ModelKeys<P extends readonly AnyPhase[]> = P extends readonly [
133
+ infer Head extends AnyPhase,
134
+ ...infer Tail extends readonly AnyPhase[]
135
+ ] ? keyof PhaseModelOf<Head> | ModelKeys<Tail> : never;
136
+ type PhaseModelOf<P extends AnyPhase> = P extends {
137
+ readonly [phaseModel]?: infer Model extends object;
138
+ } ? Model : never;
139
+ type RoutesIn<P extends readonly AnyPhase[]> = P extends readonly [
140
+ infer Head extends AnyPhase,
141
+ ...infer Tail extends readonly AnyPhase[]
142
+ ] ? readonly [...Head["routes"], ...RoutesIn<Tail>] : readonly [];
143
+ type RouteAt<R extends AnyRoute, P extends RoutePath> = P extends "/" ? R : P extends `/${infer Head}/${infer Tail}` ? FindRoute<ChildrenOf<R>, Head> extends infer Child extends AnyRoute ? RouteAt<Child, `/${Tail}`> : never : P extends `/${infer Name}` ? FindRoute<ChildrenOf<R>, Name> : never;
144
+ type FindRoute<C extends readonly AnyRoute[], N extends string> = C extends readonly [
145
+ infer Head extends AnyRoute,
146
+ ...infer Tail extends readonly AnyRoute[]
147
+ ] ? Head["name"] extends N ? Head : FindRoute<Tail, N> : never;
148
+ type SettleNext<P extends AnyPhases> = P extends readonly [
149
+ infer Head extends AnyPhase,
150
+ ...infer Tail extends readonly AnyPhase[]
151
+ ] ? Head extends Next<infer Model, infer Routes, infer _Requirement> ? readonly [Done<Model, Routes>, ...Tail] : Tail extends AnyPhases ? readonly [Head, ...SettleNext<Tail>] : P : never;
152
+ type NextModelIn<P extends readonly AnyPhase[]> = P extends readonly [
153
+ infer Head extends AnyPhase,
154
+ ...infer Tail extends readonly AnyPhase[]
155
+ ] ? Head extends Next<infer Model, readonly AnyRoute[], infer _Requirement> ? Model : NextModelIn<Tail> : never;
156
+ type RequirementIn<P extends AnyPhase> = P extends {
157
+ readonly resolver: (requirement: infer Requirement) => (route: AnyRoute) => AnyRoute;
158
+ } ? Requirement : never;
159
+ type RequirementInPhases<P extends readonly AnyPhase[]> = P extends readonly [
160
+ infer Head extends AnyPhase,
161
+ ...infer Tail extends readonly AnyPhase[]
162
+ ] ? [RequirementIn<Head>] extends [never] ? RequirementInPhases<Tail> : RequirementIn<Head> : never;
163
+ type IncrementModelOf<R extends AnyRoute> = NextModelIn<R["phases"]>;
164
+ type ParseAt<R extends AnyRoute, P extends RoutePath, Models extends ModelsByRoute> = [RequirementOf<R>] extends [never] ? (Help<P> | ("version" extends MethodsOf<R> ? Version<P> : never) | ("execute" extends MethodsOf<R> ? AddModel<Models, P, ModelOf<R>> extends infer Bound extends ModelsByRoute ? Execute<P, {
165
+ [K in keyof Bound]: Bound[K];
166
+ }> : never : never) | ParseChildren<ChildrenOf<R>, P, AddModel<Models, P, ModelOf<R>>>) : ParseIncrement<R, P, {
167
+ [K in keyof Models]: Models[K];
168
+ }>;
169
+ type ParseChildren<C extends readonly AnyRoute[], P extends RoutePath, Models extends ModelsByRoute> = C extends readonly [
170
+ infer Head extends AnyRoute,
171
+ ...infer Tail extends readonly AnyRoute[]
172
+ ] ? (ParseAt<Head, Append<P, Head["name"]>, Models> | ParseChildren<Tail, P, Models>) : never;
173
+ type RequirementsIn<P extends readonly AnyPhase[]> = P extends readonly [
174
+ infer Head extends AnyPhase,
175
+ ...infer Tail extends AnyPhase[]
176
+ ] ? [RequirementIn<Head>] extends [never] ? RequirementsIn<Tail> : readonly [RequirementIn<Head>, ...RequirementsIn<Tail>] : readonly [];
177
+ type AddModel<Models extends ModelsByRoute, P extends RoutePath, T extends object> = {
178
+ [K in keyof Models | P]: K extends P ? T : K extends keyof Models ? Models[K] : never;
179
+ };
180
+ type Split<S extends string> = string extends S ? Path : S extends `${infer Head}/${infer Tail}` ? [Head, ...Split<Tail>] : S extends "" ? [] : [S];
181
+ type Append<A extends RoutePath, N extends string> = A extends "/" ? `/${N}` : `${A}/${N}`;
182
+ export type AddRoutesToLast<P extends AnyPhases, C extends readonly AnyRoute[]> = ReplaceLast<P, AddRoutes<LastOf<P>, C>>;
183
+ type LastOf<P extends AnyPhases> = P extends readonly [
184
+ ...AnyPhase[],
185
+ infer Last extends AnyPhase
186
+ ] ? Last : never;
187
+ type ReplaceLast<P extends AnyPhases, Last extends AnyPhase> = P extends readonly [AnyPhase] ? readonly [Last] : P extends readonly [
188
+ infer First extends AnyPhase,
189
+ ...infer Middle extends AnyPhase[],
190
+ AnyPhase
191
+ ] ? readonly [First, ...Middle, Last] : never;
192
+ type AddRoutes<Phase extends AnyPhase, Added extends readonly AnyRoute[]> = Phase extends Next<infer Model, infer Routes, infer Requirement> ? Next<Model, readonly [...Routes, ...Added], Requirement> : Phase extends Done<infer Model, infer Routes> ? Done<Model, readonly [...Routes, ...Added]> : never;
193
+ type IntentsAt<R extends AnyRoute, P extends RoutePath, Models extends ModelsByRoute> = Help<P> | ("version" extends MethodsOf<R> ? Version<P> : never) | ("execute" extends MethodsOf<R> ? AddModel<Models, P, ModelOf<R>> extends infer Bound extends ModelsByRoute ? Execute<P, {
194
+ [K in keyof Bound]: Bound[K];
195
+ }> : never : never) | ChildIntents<ChildrenOf<R>, P, AddModel<Models, P, ModelOf<R>>>;
196
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { Maybe } from "./maybe.js";
2
+ import { type IdentityElement } from "./pipeline.js";
3
+ import type { AnyRoute, RoutePath } from "./types.js";
4
+ export type ValueSource = {
5
+ name: string;
6
+ value: unknown;
7
+ };
8
+ export declare function withValues(values: readonly ValueSource[]): IdentityElement<AnyRoute>;
9
+ export type ValueClaim = {
10
+ result: Maybe<{
11
+ source: string;
12
+ address: readonly string[];
13
+ value: unknown;
14
+ }>;
15
+ rest: Values;
16
+ };
17
+ export declare class Values {
18
+ mounts: Map<RoutePath, ValueSource[]>;
19
+ claims: Set<ClaimId>;
20
+ constructor(mounts?: Map<RoutePath, ValueSource[]>, claims?: Set<ClaimId>);
21
+ mount(path: readonly string[], sources: readonly ValueSource[]): Values;
22
+ claim({ route, address }: ClaimOptions): ValueClaim;
23
+ }
24
+ export interface ClaimOptions {
25
+ route: readonly string[];
26
+ address: readonly string[];
27
+ }
28
+ type ClaimId = string;
29
+ export {};
@@ -0,0 +1,83 @@
1
+ import { brand } from "./pipeline.js";
2
+ export function withValues(values) {
3
+ return brand((route) => {
4
+ let phases = [...route.phases];
5
+ let phase = phases.pop();
6
+ phases.push({
7
+ ...phase,
8
+ values: phase.values.concat(values),
9
+ });
10
+ return {
11
+ ...route,
12
+ phases,
13
+ };
14
+ });
15
+ }
16
+ export class Values {
17
+ mounts;
18
+ claims;
19
+ constructor(mounts = new Map(), claims = new Set()) {
20
+ this.mounts = mounts;
21
+ this.claims = claims;
22
+ }
23
+ mount(path, sources) {
24
+ if (sources.length === 0) {
25
+ return this;
26
+ }
27
+ const id = routeId(path);
28
+ return new Values(new Map([...this.mounts.entries(), [
29
+ id,
30
+ (this.mounts.get(id) ?? []).concat(sources),
31
+ ]]), this.claims);
32
+ }
33
+ claim({ route, address }) {
34
+ let id = claimId([...route, ...address]);
35
+ const nope = { result: { exists: false }, rest: this };
36
+ if (this.claims.has(id)) {
37
+ return nope;
38
+ }
39
+ for (let end = route.length; end >= 0; end--) {
40
+ let mountId = routeId(route.slice(0, end));
41
+ let sources = this.mounts.get(mountId) ?? [];
42
+ for (let { name, value } of sources) {
43
+ let result = find(value, [...route.slice(end), ...address]);
44
+ if (result.exists) {
45
+ let rest = new Values(this.mounts, new Set([...this.claims, id]));
46
+ return {
47
+ result: {
48
+ exists: true,
49
+ value: {
50
+ source: name,
51
+ address,
52
+ value: result.value,
53
+ },
54
+ },
55
+ rest,
56
+ };
57
+ }
58
+ }
59
+ }
60
+ return nope;
61
+ }
62
+ }
63
+ function routeId(address) {
64
+ return `/${address.join("/")}`;
65
+ }
66
+ function claimId(address) {
67
+ return JSON.stringify(address);
68
+ }
69
+ function find(value, path) {
70
+ let current = value;
71
+ for (let key of path) {
72
+ if (current === null ||
73
+ (typeof current !== "object" && typeof current !== "function") ||
74
+ !Object.hasOwn(current, key)) {
75
+ return { exists: false };
76
+ }
77
+ current = current[key];
78
+ }
79
+ return {
80
+ exists: true,
81
+ value: current,
82
+ };
83
+ }
package/esm/mod.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import "./_dnt.polyfills.js";
2
+ export { argument } from "./lib/argument.js";
3
+ export { extend } from "./lib/extend.js";
4
+ export { command } from "./lib/command.js";
5
+ export type { CommandZero } from "./lib/command.js";
6
+ export { checkpoint } from "./lib/checkpoint.js";
7
+ export { description, name } from "./lib/definition.js";
8
+ export { env, withEnvs } from "./lib/env.js";
9
+ export type { Environment, EnvSource } from "./lib/env.js";
10
+ export { option } from "./lib/option.js";
11
+ export { multiple } from "./lib/multiple.js";
12
+ export { param, schema } from "./lib/param.js";
13
+ export type { Param } from "./lib/param.js";
14
+ export { parse } from "./lib/parse.js";
15
+ export { mark } from "./lib/pipeline.js";
16
+ export type { Transform, TransformElement } from "./lib/pipeline.js";
17
+ export { printErrors, printHelp, printVersion } from "./lib/print.js";
18
+ export type { Rest } from "./lib/rest.js";
19
+ export { cli } from "./lib/read.js";
20
+ export type { CLIOptions, CLIRead, ReadCLI, Symbol as CLISymbol, } from "./lib/read.js";
21
+ export { executable, route, routes, version } from "./lib/route.js";
22
+ export type { RouteZero } from "./lib/route.js";
23
+ export { toggle } from "./lib/toggle.js";
24
+ export { transform } from "./lib/transform.js";
25
+ export { withValues } from "./lib/values.js";
26
+ export type { ValueSource } from "./lib/values.js";
27
+ export type { Literal } from "./lib/tokenize.js";
28
+ export type { Result } from "./lib/result.js";
29
+ export type { AnyIntent, AnyRoute, Definition, Execute, Help, Input, Intent, IntentsOf, Issue, Method, MethodNotAllowed, MethodsOf, ModelOf, ModelsByRoute, Outcome, Path, PathOf, Route, RoutePath, Schema, UnprocessableContent, Version, } from "./lib/types.js";
package/esm/mod.js ADDED
@@ -0,0 +1,18 @@
1
+ import "./_dnt.polyfills.js";
2
+ export { argument } from "./lib/argument.js";
3
+ export { extend } from "./lib/extend.js";
4
+ export { command } from "./lib/command.js";
5
+ export { checkpoint } from "./lib/checkpoint.js";
6
+ export { description, name } from "./lib/definition.js";
7
+ export { env, withEnvs } from "./lib/env.js";
8
+ export { option } from "./lib/option.js";
9
+ export { multiple } from "./lib/multiple.js";
10
+ export { param, schema } from "./lib/param.js";
11
+ export { parse } from "./lib/parse.js";
12
+ export { mark } from "./lib/pipeline.js";
13
+ export { printErrors, printHelp, printVersion } from "./lib/print.js";
14
+ export { cli } from "./lib/read.js";
15
+ export { executable, route, routes, version } from "./lib/route.js";
16
+ export { toggle } from "./lib/toggle.js";
17
+ export { transform } from "./lib/transform.js";
18
+ export { withValues } from "./lib/values.js";
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json CHANGED
@@ -1,11 +1,29 @@
1
1
  {
2
2
  "name": "@bomb.sh/router",
3
- "publishConfig": {
4
- "access": "public"
5
- },
6
- "version": "0.0.1",
7
- "description": "An extremely good, soon-to-exist router.",
8
- "main": "index.js",
9
- "keywords": [],
10
- "type": "module"
11
- }
3
+ "version": "0.7.1",
4
+ "description": "Configuration for programs",
5
+ "author": "Bombshell Authors (https://github.com/bombshell-dev)",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/bombshell-dev/router.git"
9
+ },
10
+ "license": "MIT",
11
+ "bugs": {
12
+ "url": "https://github.com/bombshell-dev/router/issues"
13
+ },
14
+ "module": "./esm/mod.js",
15
+ "exports": {
16
+ ".": {
17
+ "import": "./esm/mod.js"
18
+ }
19
+ },
20
+ "scripts": {},
21
+ "engines": {
22
+ "node": ">= 20"
23
+ },
24
+ "sideEffects": false,
25
+ "dependencies": {
26
+ "@standard-schema/spec": "^1.1.0"
27
+ },
28
+ "_generatedBy": "dnt@0.43.2"
29
+ }