@jlnstack/routes 0.0.1 → 0.0.3
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/index.cjs +21 -0
- package/dist/index.d.cts +19 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +19 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +22 -0
- package/dist/index.mjs.map +1 -0
- package/dist/proxy.cjs +19 -0
- package/dist/proxy.mjs +19 -0
- package/dist/proxy.mjs.map +1 -0
- package/package.json +5 -1
- package/.turbo/turbo-dev.log +0 -27299
- package/src/index.ts +0 -163
- package/src/proxy.ts +0 -26
- package/test/index.test-d.ts +0 -60
- package/test/index.test.ts +0 -58
- package/tsconfig.json +0 -5
- package/tsdown.config.ts +0 -16
- package/vitest.config.ts +0 -10
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const require_proxy = require('./proxy.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/index.ts
|
|
4
|
+
function createRoutes() {
|
|
5
|
+
return require_proxy.createRecursiveProxy(({ path, args }) => {
|
|
6
|
+
var _args$;
|
|
7
|
+
const segments = path.slice(0, -1);
|
|
8
|
+
const params = (_args$ = args[0]) !== null && _args$ !== void 0 ? _args$ : {};
|
|
9
|
+
if (segments.length === 0) return "/";
|
|
10
|
+
const resolved = segments.flatMap((seg) => {
|
|
11
|
+
const value = params[seg];
|
|
12
|
+
if (Array.isArray(value)) return value;
|
|
13
|
+
if (value === void 0) return [];
|
|
14
|
+
return value !== null && value !== void 0 ? value : seg;
|
|
15
|
+
});
|
|
16
|
+
return resolved.length === 0 ? "/" : `/${resolved.join("/")}`;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
exports.createRoutes = createRoutes;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/index.d.ts
|
|
2
|
+
type SegmentName<S extends string> = S extends `[...${infer N}]` ? N : S extends `[[...${infer N}]]` ? N : S extends `[${infer N}]` ? N : S;
|
|
3
|
+
type ChildSegments<Routes extends string, Path extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> : never;
|
|
4
|
+
type IsDynamicSegment<S extends string> = S extends `[${string}]` | `[...${string}]` | `[[...${string}]]` ? true : false;
|
|
5
|
+
type IsCatchAllSegment<S extends string> = S extends `[...${string}]` ? true : false;
|
|
6
|
+
type IsOptionalCatchAllSegment<S extends string> = S extends `[[...${string}]]` ? true : false;
|
|
7
|
+
type GetOriginalSegment<Routes extends string, Path extends string, Seg extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> extends Seg ? Next : never : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> extends Seg ? Next : never : never;
|
|
8
|
+
type IsDynamicAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsDynamicSegment<Original> extends true ? true : false : false : false;
|
|
9
|
+
type IsCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
10
|
+
type IsOptionalCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsOptionalCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
11
|
+
type Join<T extends readonly string[], Sep extends string> = T extends readonly [infer First extends string, ...infer Rest extends readonly string[]] ? Rest["length"] extends 0 ? First : `${First}${Sep}${Join<Rest, Sep>}` : "";
|
|
12
|
+
type ReplaceDynamicSegments<Path extends string, P extends Record<string, string | string[] | undefined>> = Path extends `${infer Start}/[[...${infer Param}]]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[...${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends string ? `${Start}/${P[Param]}${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path;
|
|
13
|
+
type RouteNode<Routes extends string, Path extends string, Params extends Record<string, string | string[]> = {}> = {
|
|
14
|
+
getRoute: [keyof Params] extends [never] ? () => Path extends "" ? "/" : Path : <const P extends Params>(params: P) => ReplaceDynamicSegments<Path, P>;
|
|
15
|
+
} & { [Seg in ChildSegments<Routes, Path>]: RouteNode<Routes, Path extends "" ? `/${GetOriginalSegment<Routes, Path, Seg>}` : `${Path}/${GetOriginalSegment<Routes, Path, Seg>}`, IsOptionalCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]?: string[] } : IsCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string[] } : IsDynamicAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string } : Params> };
|
|
16
|
+
declare function createRoutes<Routes extends string>(): RouteNode<Routes, "", {}>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { RouteNode, createRoutes };
|
|
19
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/index.d.ts
|
|
2
|
+
type SegmentName<S extends string> = S extends `[...${infer N}]` ? N : S extends `[[...${infer N}]]` ? N : S extends `[${infer N}]` ? N : S;
|
|
3
|
+
type ChildSegments<Routes extends string, Path extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> : never;
|
|
4
|
+
type IsDynamicSegment<S extends string> = S extends `[${string}]` | `[...${string}]` | `[[...${string}]]` ? true : false;
|
|
5
|
+
type IsCatchAllSegment<S extends string> = S extends `[...${string}]` ? true : false;
|
|
6
|
+
type IsOptionalCatchAllSegment<S extends string> = S extends `[[...${string}]]` ? true : false;
|
|
7
|
+
type GetOriginalSegment<Routes extends string, Path extends string, Seg extends string> = Routes extends `${Path}/${infer Next}/${string}` ? SegmentName<Next> extends Seg ? Next : never : Routes extends `${Path}/${infer Next}` ? SegmentName<Next> extends Seg ? Next : never : never;
|
|
8
|
+
type IsDynamicAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsDynamicSegment<Original> extends true ? true : false : false : false;
|
|
9
|
+
type IsCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
10
|
+
type IsOptionalCatchAllAtPath<Routes extends string, Path extends string, Seg extends string> = GetOriginalSegment<Routes, Path, Seg> extends infer Original ? Original extends string ? IsOptionalCatchAllSegment<Original> extends true ? true : false : false : false;
|
|
11
|
+
type Join<T extends readonly string[], Sep extends string> = T extends readonly [infer First extends string, ...infer Rest extends readonly string[]] ? Rest["length"] extends 0 ? First : `${First}${Sep}${Join<Rest, Sep>}` : "";
|
|
12
|
+
type ReplaceDynamicSegments<Path extends string, P extends Record<string, string | string[] | undefined>> = Path extends `${infer Start}/[[...${infer Param}]]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[...${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends readonly string[] ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], "/">}${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path extends `${infer Start}/[${infer Param}]${infer Rest}` ? Param extends keyof P ? P[Param] extends string ? `${Start}/${P[Param]}${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}` : Path;
|
|
13
|
+
type RouteNode<Routes extends string, Path extends string, Params extends Record<string, string | string[]> = {}> = {
|
|
14
|
+
getRoute: [keyof Params] extends [never] ? () => Path extends "" ? "/" : Path : <const P extends Params>(params: P) => ReplaceDynamicSegments<Path, P>;
|
|
15
|
+
} & { [Seg in ChildSegments<Routes, Path>]: RouteNode<Routes, Path extends "" ? `/${GetOriginalSegment<Routes, Path, Seg>}` : `${Path}/${GetOriginalSegment<Routes, Path, Seg>}`, IsOptionalCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]?: string[] } : IsCatchAllAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string[] } : IsDynamicAtPath<Routes, Path, Seg> extends true ? Params & { [K in Seg]: string } : Params> };
|
|
16
|
+
declare function createRoutes<Routes extends string>(): RouteNode<Routes, "", {}>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { RouteNode, createRoutes };
|
|
19
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createRecursiveProxy } from "./proxy.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/index.ts
|
|
4
|
+
function createRoutes() {
|
|
5
|
+
return createRecursiveProxy(({ path, args }) => {
|
|
6
|
+
var _args$;
|
|
7
|
+
const segments = path.slice(0, -1);
|
|
8
|
+
const params = (_args$ = args[0]) !== null && _args$ !== void 0 ? _args$ : {};
|
|
9
|
+
if (segments.length === 0) return "/";
|
|
10
|
+
const resolved = segments.flatMap((seg) => {
|
|
11
|
+
const value = params[seg];
|
|
12
|
+
if (Array.isArray(value)) return value;
|
|
13
|
+
if (value === void 0) return [];
|
|
14
|
+
return value !== null && value !== void 0 ? value : seg;
|
|
15
|
+
});
|
|
16
|
+
return resolved.length === 0 ? "/" : `/${resolved.join("/")}`;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { createRoutes };
|
|
22
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { createRecursiveProxy } from \"./proxy\";\n\ntype SegmentName<S extends string> = S extends `[...${infer N}]`\n ? N\n : S extends `[[...${infer N}]]`\n ? N\n : S extends `[${infer N}]`\n ? N\n : S;\n\ntype ChildSegments<\n Routes extends string,\n Path extends string,\n> = Routes extends `${Path}/${infer Next}/${string}`\n ? SegmentName<Next>\n : Routes extends `${Path}/${infer Next}`\n ? SegmentName<Next>\n : never;\n\ntype IsDynamicSegment<S extends string> = S extends\n | `[${string}]`\n | `[...${string}]`\n | `[[...${string}]]`\n ? true\n : false;\n\ntype IsCatchAllSegment<S extends string> = S extends `[...${string}]`\n ? true\n : false;\n\ntype IsOptionalCatchAllSegment<S extends string> = S extends `[[...${string}]]`\n ? true\n : false;\n\ntype GetOriginalSegment<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = Routes extends `${Path}/${infer Next}/${string}`\n ? SegmentName<Next> extends Seg\n ? Next\n : never\n : Routes extends `${Path}/${infer Next}`\n ? SegmentName<Next> extends Seg\n ? Next\n : never\n : never;\n\ntype IsDynamicAtPath<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = GetOriginalSegment<Routes, Path, Seg> extends infer Original\n ? Original extends string\n ? IsDynamicSegment<Original> extends true\n ? true\n : false\n : false\n : false;\n\ntype IsCatchAllAtPath<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = GetOriginalSegment<Routes, Path, Seg> extends infer Original\n ? Original extends string\n ? IsCatchAllSegment<Original> extends true\n ? true\n : false\n : false\n : false;\n\ntype IsOptionalCatchAllAtPath<\n Routes extends string,\n Path extends string,\n Seg extends string,\n> = GetOriginalSegment<Routes, Path, Seg> extends infer Original\n ? Original extends string\n ? IsOptionalCatchAllSegment<Original> extends true\n ? true\n : false\n : false\n : false;\n\ntype Join<\n T extends readonly string[],\n Sep extends string,\n> = T extends readonly [\n infer First extends string,\n ...infer Rest extends readonly string[],\n]\n ? Rest[\"length\"] extends 0\n ? First\n : `${First}${Sep}${Join<Rest, Sep>}`\n : \"\";\n\ntype ReplaceDynamicSegments<\n Path extends string,\n P extends Record<string, string | string[] | undefined>,\n> = Path extends `${infer Start}/[[...${infer Param}]]${infer Rest}`\n ? Param extends keyof P\n ? P[Param] extends readonly string[]\n ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], \"/\">}${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}${ReplaceDynamicSegments<Rest, P>}`\n : Path extends `${infer Start}/[...${infer Param}]${infer Rest}`\n ? Param extends keyof P\n ? P[Param] extends readonly string[]\n ? `${ReplaceDynamicSegments<Start, P>}/${Join<P[Param], \"/\">}${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : `${ReplaceDynamicSegments<Start, P>}/[...${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : Path extends `${infer Start}/[${infer Param}]${infer Rest}`\n ? Param extends keyof P\n ? P[Param] extends string\n ? `${Start}/${P[Param]}${ReplaceDynamicSegments<Rest, P>}`\n : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : `${Start}/[${Param}]${ReplaceDynamicSegments<Rest, P>}`\n : Path;\n\nexport type RouteNode<\n Routes extends string,\n Path extends string,\n Params extends Record<string, string | string[]> = {},\n> = {\n getRoute: [keyof Params] extends [never]\n ? () => Path extends \"\" ? \"/\" : Path\n : <const P extends Params>(params: P) => ReplaceDynamicSegments<Path, P>;\n} & {\n [Seg in ChildSegments<Routes, Path>]: RouteNode<\n Routes,\n Path extends \"\"\n ? `/${GetOriginalSegment<Routes, Path, Seg>}`\n : `${Path}/${GetOriginalSegment<Routes, Path, Seg>}`,\n IsOptionalCatchAllAtPath<Routes, Path, Seg> extends true\n ? Params & { [K in Seg]?: string[] }\n : IsCatchAllAtPath<Routes, Path, Seg> extends true\n ? Params & { [K in Seg]: string[] }\n : IsDynamicAtPath<Routes, Path, Seg> extends true\n ? Params & { [K in Seg]: string }\n : Params\n >;\n};\n\nexport function createRoutes<Routes extends string>() {\n return createRecursiveProxy(({ path, args }) => {\n const segments = path.slice(0, -1);\n const params = (args[0] ?? {}) as Record<\n string,\n string | string[] | undefined\n >;\n\n if (segments.length === 0) return \"/\";\n\n const resolved = segments.flatMap((seg) => {\n const value = params[seg];\n if (Array.isArray(value)) return value;\n if (value === undefined) return [];\n return value ?? seg;\n });\n\n return resolved.length === 0 ? \"/\" : `/${resolved.join(\"/\")}`;\n }) as RouteNode<Routes, \"\", {}>;\n}\n"],"mappings":";;;AA+IA,SAAgB,eAAsC;AACpD,QAAO,sBAAsB,EAAE,MAAM,WAAW;;EAC9C,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG;EAClC,MAAM,mBAAU,KAAK,6CAAM,EAAE;AAK7B,MAAI,SAAS,WAAW,EAAG,QAAO;EAElC,MAAM,WAAW,SAAS,SAAS,QAAQ;GACzC,MAAM,QAAQ,OAAO;AACrB,OAAI,MAAM,QAAQ,MAAM,CAAE,QAAO;AACjC,OAAI,UAAU,OAAW,QAAO,EAAE;AAClC,UAAO,6CAAS;IAChB;AAEF,SAAO,SAAS,WAAW,IAAI,MAAM,IAAI,SAAS,KAAK,IAAI;GAC3D"}
|
package/dist/proxy.cjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/proxy.ts
|
|
3
|
+
function createRecursiveProxy(callback, path = []) {
|
|
4
|
+
return new Proxy(() => {}, {
|
|
5
|
+
get(_obj, key) {
|
|
6
|
+
if (typeof key !== "string") return void 0;
|
|
7
|
+
return createRecursiveProxy(callback, [...path, key]);
|
|
8
|
+
},
|
|
9
|
+
apply(_1, _2, args) {
|
|
10
|
+
return callback({
|
|
11
|
+
path,
|
|
12
|
+
args
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
exports.createRecursiveProxy = createRecursiveProxy;
|
package/dist/proxy.mjs
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/proxy.ts
|
|
2
|
+
function createRecursiveProxy(callback, path = []) {
|
|
3
|
+
return new Proxy(() => {}, {
|
|
4
|
+
get(_obj, key) {
|
|
5
|
+
if (typeof key !== "string") return void 0;
|
|
6
|
+
return createRecursiveProxy(callback, [...path, key]);
|
|
7
|
+
},
|
|
8
|
+
apply(_1, _2, args) {
|
|
9
|
+
return callback({
|
|
10
|
+
path,
|
|
11
|
+
args
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { createRecursiveProxy };
|
|
19
|
+
//# sourceMappingURL=proxy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.mjs","names":[],"sources":["../src/proxy.ts"],"sourcesContent":["interface ProxyCallbackOptions {\n path: readonly string[];\n args: readonly unknown[];\n}\n\ntype ProxyCallback = (opts: ProxyCallbackOptions) => unknown;\n\nexport function createRecursiveProxy(\n callback: ProxyCallback,\n path: readonly string[] = [],\n) {\n const proxy: unknown = new Proxy(() => {}, {\n get(_obj, key) {\n if (typeof key !== \"string\") return undefined;\n return createRecursiveProxy(callback, [...path, key]);\n },\n apply(_1, _2, args) {\n return callback({\n path,\n args,\n });\n },\n });\n\n return proxy;\n}\n"],"mappings":";AAOA,SAAgB,qBACd,UACA,OAA0B,EAAE,EAC5B;AAcA,QAbuB,IAAI,YAAY,IAAI;EACzC,IAAI,MAAM,KAAK;AACb,OAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,UAAO,qBAAqB,UAAU,CAAC,GAAG,MAAM,IAAI,CAAC;;EAEvD,MAAM,IAAI,IAAI,MAAM;AAClB,UAAO,SAAS;IACd;IACA;IACD,CAAC;;EAEL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jlnstack/routes",
|
|
3
3
|
"description": "Type-safe route builder",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.3",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "jln13x",
|
|
7
7
|
"repository": {
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
"publishConfig": {
|
|
12
12
|
"access": "public"
|
|
13
13
|
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"package.json"
|
|
17
|
+
],
|
|
14
18
|
"scripts": {
|
|
15
19
|
"build": "tsdown",
|
|
16
20
|
"dev": "tsdown --watch",
|