polen 0.8.0-next.4 → 0.8.0-next.5
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/build/api/vite/plugins/core.d.ts.map +1 -1
- package/build/api/vite/plugins/core.js +83 -52
- package/build/api/vite/plugins/core.js.map +1 -1
- package/build/lib/file-router/linter.d.ts.map +1 -1
- package/build/lib/file-router/linter.js +3 -3
- package/build/lib/file-router/linter.js.map +1 -1
- package/build/lib/file-router/route.d.ts +48 -10
- package/build/lib/file-router/route.d.ts.map +1 -1
- package/build/lib/file-router/route.js +68 -3
- package/build/lib/file-router/route.js.map +1 -1
- package/build/lib/file-router/scan.d.ts +2 -2
- package/build/lib/file-router/scan.d.ts.map +1 -1
- package/build/lib/file-router/scan.js +8 -8
- package/build/lib/file-router/scan.js.map +1 -1
- package/build/lib/kit-temp.d.ts +2 -0
- package/build/lib/kit-temp.d.ts.map +1 -0
- package/build/lib/kit-temp.js +23 -0
- package/build/lib/kit-temp.js.map +1 -0
- package/build/project-data.d.ts +10 -1
- package/build/project-data.d.ts.map +1 -1
- package/build/template/components/Sidebar.d.ts +11 -0
- package/build/template/components/Sidebar.d.ts.map +1 -0
- package/build/template/components/Sidebar.jsx +47 -0
- package/build/template/components/Sidebar.jsx.map +1 -0
- package/build/template/routes/root.d.ts.map +1 -1
- package/build/template/routes/root.jsx +28 -5
- package/build/template/routes/root.jsx.map +1 -1
- package/package.json +1 -1
- package/src/api/vite/plugins/core.ts +97 -54
- package/src/lib/file-router/index.test.ts +5 -5
- package/src/lib/file-router/linter.ts +3 -3
- package/src/lib/file-router/route.ts +147 -11
- package/src/lib/file-router/scan.ts +9 -9
- package/src/lib/kit-temp.ts +21 -0
- package/src/project-data.ts +12 -1
- package/src/template/components/Sidebar.tsx +92 -0
- package/src/template/routes/root.tsx +35 -5
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/api/vite/plugins/core.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../../src/api/vite/plugins/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAS9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAW/D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,CAAA;CACjC;AAED,eAAO,MAAM,IAAI,GAAI,QAAQ,YAAY,CAAC,MAAM,KAAG,IAAI,CAAC,YAAY,EA6PnE,CAAA"}
|
@@ -1,8 +1,7 @@
|
|
1
|
-
import { Markdown } from '#api/singletons/markdown/index.js';
|
2
1
|
import { FileRouter } from '#lib/file-router/index.js';
|
3
2
|
import { ViteVirtual } from '#lib/vite-virtual/index.js';
|
4
3
|
import mdx from '@mdx-js/rollup';
|
5
|
-
import { Cache,
|
4
|
+
import { Cache, Json, Path, Str } from '@wollybeard/kit';
|
6
5
|
import jsesc from 'jsesc';
|
7
6
|
import remarkGfm from 'remark-gfm';
|
8
7
|
import { superjson } from '../../../singletons/superjson.js';
|
@@ -40,27 +39,30 @@ export const Core = (config) => {
|
|
40
39
|
],
|
41
40
|
}),
|
42
41
|
},
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
}
|
42
|
+
// TODO: We can remove, mdx subsumes this
|
43
|
+
// TODO: First we need to investigate how e can make our api singleton Markdown used by MDX.
|
44
|
+
// If we cannot, then we might want to ditch MDX instead and use our lower level solution here.
|
45
|
+
// It depends in part on how complex our Markdown singleton gets.
|
46
|
+
// {
|
47
|
+
// name: `polen:markdown`,
|
48
|
+
// enforce: `pre`,
|
49
|
+
// resolveId(id) {
|
50
|
+
// if (id.endsWith(`.md`)) {
|
51
|
+
// return id
|
52
|
+
// }
|
53
|
+
// return null
|
54
|
+
// },
|
55
|
+
// async load(id) {
|
56
|
+
// if (id.endsWith(`.md`)) {
|
57
|
+
// const markdownString = await Fs.read(id)
|
58
|
+
// if (!markdownString) return null
|
59
|
+
// const htmlString = await Markdown.parse(markdownString)
|
60
|
+
// const code = `export default ${JSON.stringify(htmlString)}`
|
61
|
+
// return code
|
62
|
+
// }
|
63
|
+
// return null
|
64
|
+
// },
|
65
|
+
// },
|
64
66
|
{
|
65
67
|
name: `polen:core:alias`,
|
66
68
|
resolveId(id, importer) {
|
@@ -120,30 +122,68 @@ export const Core = (config) => {
|
|
120
122
|
async loader() {
|
121
123
|
// todo: parallel
|
122
124
|
const schema = await readSchema();
|
123
|
-
console.log({ schema });
|
124
125
|
const pagesScanResult = await scanPageRoutes();
|
125
126
|
const siteNavigationItems = [];
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
127
|
+
//
|
128
|
+
// ━━ Build Navbar
|
129
|
+
//
|
130
|
+
// ━ Top pages become navigation items
|
131
|
+
const topPages = pagesScanResult.routes.filter(FileRouter.routeIsTopLevel);
|
132
|
+
for (const page of topPages) {
|
133
|
+
const path = FileRouter.routeToPathExpression(page);
|
131
134
|
const title = Str.titlizeSlug(path);
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
135
|
+
siteNavigationItems.push({ pathExp: path, title });
|
136
|
+
}
|
137
|
+
// ━ Top directories become navigation items
|
138
|
+
const topDirsPaths = pagesScanResult.routes
|
139
|
+
.filter(FileRouter.routeIsSubLevel)
|
140
|
+
// todo: kit, slice that understands non-empty
|
141
|
+
// Arr.slice(route.path.segments, 1)
|
142
|
+
.map(route => [route.logical.path[0]]);
|
143
|
+
for (const dir of topDirsPaths) {
|
144
|
+
const pathExp = FileRouter.pathToExpression(dir);
|
145
|
+
const title = Str.titlizeSlug(pathExp);
|
146
|
+
// todo: this should never happen, if it does, swarn user
|
147
|
+
// Only add if not already added as a top page
|
148
|
+
if (!siteNavigationItems.some(item => item.pathExp === pathExp)) {
|
149
|
+
siteNavigationItems.push({ pathExp: pathExp, title });
|
150
|
+
}
|
151
|
+
}
|
152
|
+
// ━ Schema presence causes adding some navbar items
|
138
153
|
if (schema) {
|
139
|
-
siteNavigationItems.push({
|
154
|
+
siteNavigationItems.push({ pathExp: `/reference`, title: `Reference` });
|
140
155
|
if (schema.versions.length > 1) {
|
141
|
-
siteNavigationItems.push({
|
156
|
+
siteNavigationItems.push({ pathExp: `/changelog`, title: `Changelog` });
|
142
157
|
}
|
143
158
|
}
|
159
|
+
//
|
160
|
+
// ━━ Build Sidebar
|
161
|
+
//
|
162
|
+
const sidebar = {};
|
163
|
+
for (const dirPath of topDirsPaths) {
|
164
|
+
const childPages = pagesScanResult.routes.filter(page => FileRouter.routeIsSubOf(page, dirPath));
|
165
|
+
const sidebarItems = [];
|
166
|
+
// ━ Pages in this dir become sidebar items
|
167
|
+
for (const childPage of childPages) {
|
168
|
+
const childPageRelative = FileRouter.makeRelativeUnsafe(childPage, dirPath);
|
169
|
+
if (FileRouter.routeIsRootLevel(childPageRelative)) {
|
170
|
+
// We elide root from items. Root represents this whole group of items.
|
171
|
+
continue;
|
172
|
+
}
|
173
|
+
if (FileRouter.routeIsTopLevel(childPageRelative)) {
|
174
|
+
const pathExp = FileRouter.routeToPathExpression(childPage);
|
175
|
+
const relativePathExp = FileRouter.routeToPathExpression(childPageRelative);
|
176
|
+
const title = Str.titlizeSlug(relativePathExp);
|
177
|
+
sidebarItems.push({ pathExp, title });
|
178
|
+
}
|
179
|
+
// TODO: Handle nested directories in phase 3
|
180
|
+
}
|
181
|
+
sidebar[FileRouter.pathToExpression(dirPath)] = sidebarItems;
|
182
|
+
}
|
144
183
|
const projectData = {
|
145
184
|
schema,
|
146
185
|
siteNavigationItems,
|
186
|
+
sidebar,
|
147
187
|
faviconPath: `/logo.svg`,
|
148
188
|
pagesScanResult: pagesScanResult,
|
149
189
|
paths: config.paths.project,
|
@@ -177,24 +217,15 @@ export const Core = (config) => {
|
|
177
217
|
s `export const ${$.pages} = []`;
|
178
218
|
// todo: kit fs should accept parsed file paths
|
179
219
|
for (const route of pagesScanResult.routes) {
|
180
|
-
const
|
181
|
-
const
|
182
|
-
const ident = Str.Case.camel(`page ` + Str.titlizeSlug(
|
220
|
+
const filePathExp = Path.format(route.file.path.absolute);
|
221
|
+
const pathExp = FileRouter.routeToPathExpression(route);
|
222
|
+
const ident = Str.Case.camel(`page ` + Str.titlizeSlug(pathExp));
|
183
223
|
s `
|
184
|
-
import ${ident} from '${
|
224
|
+
import ${ident} from '${filePathExp}'
|
185
225
|
|
186
226
|
${$.pages}.push({
|
187
|
-
path: '${
|
188
|
-
Component:
|
189
|
-
if (typeof ${ident} === 'function') {
|
190
|
-
// ━ MDX
|
191
|
-
const Component = ${ident}
|
192
|
-
return <Component />
|
193
|
-
} else {
|
194
|
-
// ━ MD
|
195
|
-
return <div dangerouslySetInnerHTML={{ __html: ${ident} }} />
|
196
|
-
}
|
197
|
-
}
|
227
|
+
path: '${pathExp}',
|
228
|
+
Component: ${ident}
|
198
229
|
})
|
199
230
|
`;
|
200
231
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/api/vite/plugins/core.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/api/vite/plugins/core.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/linter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAA+
|
1
|
+
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/linter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAA+C,MAAM,YAAY,CAAA;AAEpG,MAAM,MAAM,UAAU,GAAG,uBAAuB,CAAA;AAEhD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE;QACP,IAAI,EAAE,SAAS,CAAA;KAChB,CAAA;IACD,KAAK,EAAE;QACL,IAAI,EAAE,SAAS,CAAA;KAChB,CAAA;CACF;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB;AAED,eAAO,MAAM,IAAI,GAAI,QAAQ,KAAK,EAAE,KAAG,UA0CtC,CAAA"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Idx, Path } from '@wollybeard/kit';
|
2
|
-
import {
|
2
|
+
import { routeIsFromIndexFile, routeToPathExpression } from './route.js';
|
3
3
|
export const lint = (routes) => {
|
4
4
|
const diagnostics = [];
|
5
|
-
const seen = Idx.create({ toKey:
|
5
|
+
const seen = Idx.create({ toKey: routeToPathExpression });
|
6
6
|
// ━ Check for conflict between index and literal.
|
7
7
|
// Note: There is no other way for paths to conflict so we safely assuming the cause is index+literal.
|
8
8
|
for (const route of routes) {
|
@@ -10,7 +10,7 @@ export const lint = (routes) => {
|
|
10
10
|
const seenRoute = seen.get(route);
|
11
11
|
if (seenRoute) {
|
12
12
|
// Fix - ignore the index
|
13
|
-
const [index, literal] =
|
13
|
+
const [index, literal] = routeIsFromIndexFile(route) ? [route, seenRoute] : [seenRoute, route];
|
14
14
|
if (seenRoute === index) {
|
15
15
|
seen.set(route);
|
16
16
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../../src/lib/file-router/linter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAA8B,
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../../src/lib/file-router/linter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAA8B,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAmBpG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAe,EAAc,EAAE;IAClD,MAAM,WAAW,GAAiB,EAAE,CAAA;IAEpC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAA;IAEzD,kDAAkD;IAClD,wGAAwG;IACxG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,SAAS;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAEjC,IAAI,SAAS,EAAE,CAAC;YACd,yBAAyB;YACzB,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAC9F,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACjB,CAAC;YAED,SAAS;YACT,MAAM,UAAU,GAA4B;gBAC1C,gBAAgB;gBAChB,OAAO,EAAE,sEAAsE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oDAAoD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,yCAAyC;gBACxP,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO,CAAC,IAAI;iBACnB;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB;aACF,CAAA;YACD,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAE5B,SAAQ;QACV,CAAC;QAED,WAAW;QACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACjB,CAAC;IAED,OAAO;QACL,WAAW;QACX,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;KACxB,CAAA;AACH,CAAC,CAAA"}
|
@@ -1,7 +1,17 @@
|
|
1
|
-
import type
|
2
|
-
export type
|
3
|
-
export
|
4
|
-
|
1
|
+
import { type Path } from '@wollybeard/kit';
|
2
|
+
export type Path = PathSegment[];
|
3
|
+
export type PathRoot = [];
|
4
|
+
export type PathTop = [PathSegment];
|
5
|
+
export type PathSub = [PathSegment, PathSegment, ...PathSegment[]];
|
6
|
+
export type PathSegment = string;
|
7
|
+
export declare const sep = "/";
|
8
|
+
export declare const pathToExpression: (path: Path) => string;
|
9
|
+
export interface Route {
|
10
|
+
logical: RouteLogical;
|
11
|
+
file: RouteFile;
|
12
|
+
}
|
13
|
+
export interface RouteLogical {
|
14
|
+
path: Path;
|
5
15
|
}
|
6
16
|
export interface RouteFile {
|
7
17
|
path: {
|
@@ -9,11 +19,39 @@ export interface RouteFile {
|
|
9
19
|
absolute: Path.Parsed;
|
10
20
|
};
|
11
21
|
}
|
12
|
-
export interface Route {
|
13
|
-
|
14
|
-
file: RouteFile;
|
22
|
+
export interface TopLevelRoute extends Route {
|
23
|
+
logical: TopLevelRouteLogical;
|
15
24
|
}
|
16
|
-
export
|
17
|
-
|
18
|
-
|
25
|
+
export interface TopLevelRouteLogical {
|
26
|
+
path: PathTop;
|
27
|
+
}
|
28
|
+
/**
|
29
|
+
* Route is top level meaning exists directly under the root.
|
30
|
+
*
|
31
|
+
* It excludes the root level route.
|
32
|
+
*/
|
33
|
+
export declare const routeIsTopLevel: (route: Route) => route is TopLevelRoute;
|
34
|
+
export interface RouteSubLevel extends Route {
|
35
|
+
logical: RoutePathSubLevel;
|
36
|
+
}
|
37
|
+
export interface RoutePathSubLevel {
|
38
|
+
path: PathSub;
|
39
|
+
}
|
40
|
+
/**
|
41
|
+
* Route is not top or root level
|
42
|
+
*/
|
43
|
+
export declare const routeIsSubLevel: (route: Route) => route is RouteSubLevel;
|
44
|
+
/**
|
45
|
+
* Route is the singular root route.
|
46
|
+
|
47
|
+
* This is the case of index under root.
|
48
|
+
*/
|
49
|
+
export declare const routeIsRootLevel: (route: Route) => route is TopLevelRoute;
|
50
|
+
export declare const routeIsFromIndexFile: (route: Route) => boolean;
|
51
|
+
export declare const routeIsSubOf: (route: Route, potentialAncestorPath: PathSegment[]) => boolean;
|
52
|
+
/**
|
53
|
+
* You are responsible for ensuring given ancestor path is really an ancestor of given route's path.
|
54
|
+
*/
|
55
|
+
export declare const makeRelativeUnsafe: (route: Route, assumedAncestorPath: PathSegment[]) => Route;
|
56
|
+
export declare const routeToPathExpression: (route: Route) => string;
|
19
57
|
//# sourceMappingURL=route.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAU3C,MAAM,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;AAEhC,MAAM,MAAM,QAAQ,GAAG,EAAE,CAAA;AAEzB,MAAM,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,CAAA;AAEnC,MAAM,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,eAAO,MAAM,GAAG,MAAM,CAAA;AAEtB,eAAO,MAAM,gBAAgB,GAAI,MAAM,IAAI,WAE1C,CAAA;AAUD,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,YAAY,CAAA;IACrB,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAA;CACX;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE;QACJ,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAA;QACrB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAA;KACtB,CAAA;CACF;AAUD,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,OAAO,EAAE,oBAAoB,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAEvD,CAAA;AAcD,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,OAAO,EAAE,iBAAiB,CAAA;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAA;CACd;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAEvD,CAAA;AAcD;;;;EAIE;AACF,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAIxD,CAAA;AASD,eAAO,MAAM,oBAAoB,GAAI,OAAO,KAAK,KAAG,OAEnD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,uBAAuB,WAAW,EAAE,KAAG,OAQjF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,EAAE,qBAAqB,WAAW,EAAE,KAAG,KAUrF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,KAAK,WAEjD,CAAA"}
|
@@ -1,10 +1,75 @@
|
|
1
|
+
import { arrayEquals } from '#lib/kit-temp.js';
|
2
|
+
import {} from '@wollybeard/kit';
|
1
3
|
export const sep = `/`;
|
2
|
-
export const
|
3
|
-
return sep +
|
4
|
+
export const pathToExpression = (path) => {
|
5
|
+
return sep + path.join(sep);
|
4
6
|
};
|
5
|
-
|
7
|
+
/**
|
8
|
+
* Route is top level meaning exists directly under the root.
|
9
|
+
*
|
10
|
+
* It excludes the root level route.
|
11
|
+
*/
|
12
|
+
export const routeIsTopLevel = (route) => {
|
13
|
+
return route.logical.path.length === 1;
|
14
|
+
};
|
15
|
+
/**
|
16
|
+
* Route is not top or root level
|
17
|
+
*/
|
18
|
+
export const routeIsSubLevel = (route) => {
|
19
|
+
return route.logical.path.length > 1;
|
20
|
+
};
|
21
|
+
//
|
22
|
+
// ━━ Root Level
|
23
|
+
//
|
24
|
+
//
|
25
|
+
//
|
26
|
+
//
|
27
|
+
//
|
28
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Root Level Route
|
29
|
+
//
|
30
|
+
//
|
31
|
+
/**
|
32
|
+
* Route is the singular root route.
|
33
|
+
|
34
|
+
* This is the case of index under root.
|
35
|
+
*/
|
36
|
+
export const routeIsRootLevel = (route) => {
|
37
|
+
// No need to check for name "index"
|
38
|
+
// Segments is uniquely empty for <root>/index
|
39
|
+
return route.logical.path.length === 0;
|
40
|
+
};
|
41
|
+
//
|
42
|
+
//
|
43
|
+
//
|
44
|
+
// ━━━━━━━━━━━━━━ • Route Functions
|
45
|
+
//
|
46
|
+
//
|
47
|
+
export const routeIsFromIndexFile = (route) => {
|
6
48
|
return route.file.path.relative.name === conventions.index.name;
|
7
49
|
};
|
50
|
+
export const routeIsSubOf = (route, potentialAncestorPath) => {
|
51
|
+
if (route.logical.path.length <= potentialAncestorPath.length) {
|
52
|
+
return false;
|
53
|
+
}
|
54
|
+
return arrayEquals(route.logical.path.slice(0, potentialAncestorPath.length), potentialAncestorPath);
|
55
|
+
};
|
56
|
+
/**
|
57
|
+
* You are responsible for ensuring given ancestor path is really an ancestor of given route's path.
|
58
|
+
*/
|
59
|
+
export const makeRelativeUnsafe = (route, assumedAncestorPath) => {
|
60
|
+
// We assume that we're working with paths where index is elided per our FileRouter system.
|
61
|
+
const newPath = route.logical.path.slice(assumedAncestorPath.length);
|
62
|
+
return {
|
63
|
+
...route,
|
64
|
+
logical: {
|
65
|
+
...route.logical,
|
66
|
+
path: newPath,
|
67
|
+
},
|
68
|
+
};
|
69
|
+
};
|
70
|
+
export const routeToPathExpression = (route) => {
|
71
|
+
return pathToExpression(route.logical.path);
|
72
|
+
};
|
8
73
|
const conventions = {
|
9
74
|
index: {
|
10
75
|
name: `index`,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAa,MAAM,iBAAiB,CAAA;AAoB3C,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,CAAA;AAEtB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC7C,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7B,CAAC,CAAA;AA0CD;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAY,EAA0B,EAAE;IACtE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAA;AACxC,CAAC,CAAA;AAsBD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAY,EAA0B,EAAE;IACtE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,EAAE;AACF,gBAAgB;AAChB,EAAE;AAEF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,gEAAgE;AAChE,EAAE;AACF,EAAE;AAEF;;;;EAIE;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAA0B,EAAE;IACvE,oCAAoC;IACpC,8CAA8C;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAA;AACxC,CAAC,CAAA;AAED,EAAE;AACF,EAAE;AACF,EAAE;AACF,mCAAmC;AACnC,EAAE;AACF,EAAE;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAY,EAAW,EAAE;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,qBAAoC,EAAW,EAAE;IAC1F,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,WAAW,CAChB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,MAAM,CAAC,EACzD,qBAAqB,CACtB,CAAA;AACH,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAY,EAAE,mBAAkC,EAAS,EAAE;IAC5F,2FAA2F;IAC3F,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACpE,OAAO;QACL,GAAG,KAAK;QACR,OAAO,EAAE;YACP,GAAG,KAAK,CAAC,OAAO;YAChB,IAAI,EAAE,OAAO;SACd;KACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAY,EAAE,EAAE;IACpD,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAA;AAED,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;KACd;CACF,CAAA"}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { Path } from '@wollybeard/kit';
|
2
2
|
import { type Diagnostic } from './linter.js';
|
3
|
-
import type { Route,
|
3
|
+
import type { Route, RouteLogical } from './route.js';
|
4
4
|
export interface ScanResult {
|
5
5
|
routes: Route[];
|
6
6
|
diagnostics: Diagnostic[];
|
@@ -10,5 +10,5 @@ export declare const scan: (parameters: {
|
|
10
10
|
glob?: string;
|
11
11
|
}) => Promise<ScanResult>;
|
12
12
|
export declare const filePathToRoute: (filePathExpression: string, rootDir: string) => Route;
|
13
|
-
export declare const
|
13
|
+
export declare const filePathToRouteLogical: (filePath: Path.Parsed) => RouteLogical;
|
14
14
|
//# sourceMappingURL=scan.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAO,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,aAAa,CAAA;AACnD,OAAO,KAAK,EAAE,KAAK,EAAa,
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAO,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,aAAa,CAAA;AACnD,OAAO,KAAK,EAAE,KAAK,EAAa,YAAY,EAAE,MAAM,YAAY,CAAA;AAwBhE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAUD,eAAO,MAAM,IAAI,GAAU,YAAY;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KAAG,OAAO,CAAC,UAAU,CAcrB,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,oBAAoB,MAAM,EAAE,SAAS,MAAM,KAAG,KAa7E,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,UAAU,IAAI,CAAC,MAAM,KAAG,YAc9D,CAAA"}
|
@@ -38,23 +38,23 @@ export const filePathToRoute = (filePathExpression, rootDir) => {
|
|
38
38
|
relative: Path.parse(Path.relative(rootDir, filePathExpression)),
|
39
39
|
},
|
40
40
|
};
|
41
|
-
const
|
41
|
+
const logical = filePathToRouteLogical(file.path.relative);
|
42
42
|
return {
|
43
|
-
|
43
|
+
logical,
|
44
44
|
file,
|
45
45
|
};
|
46
46
|
};
|
47
|
-
export const
|
48
|
-
const
|
47
|
+
export const filePathToRouteLogical = (filePath) => {
|
48
|
+
const dirPath = Str.split(Str.removeSurrounding(filePath.dir, Path.sep), Path.sep);
|
49
49
|
if (Str.isMatch(filePath.name, conventions.index.name)) {
|
50
|
-
const
|
50
|
+
const path = dirPath;
|
51
51
|
return {
|
52
|
-
|
52
|
+
path,
|
53
53
|
};
|
54
54
|
}
|
55
|
-
const
|
55
|
+
const path = dirPath.concat(filePath.name);
|
56
56
|
return {
|
57
|
-
|
57
|
+
path,
|
58
58
|
};
|
59
59
|
};
|
60
60
|
//# sourceMappingURL=scan.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAmB,IAAI,EAAE,MAAM,aAAa,CAAA;AAGnD,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,yDAAyD;AACzD,EAAE;AACF,EAAE;AAEF,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;KACd;CACF,CAAA;AAeD,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,EAAE;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,UAG1B,EAAuB,EAAE;IACxB,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IAEzC,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;QAClD,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,GAAG;QACR,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAY,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;IAEvF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IAE/B,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,kBAA0B,EAAE,OAAe,EAAS,EAAE;IACpF,MAAM,IAAI,GAAc;QACtB,IAAI,EAAE;YACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;SACjE;KACF,CAAA;IACD,MAAM,
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAmB,IAAI,EAAE,MAAM,aAAa,CAAA;AAGnD,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,yDAAyD;AACzD,EAAE;AACF,EAAE;AAEF,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;KACd;CACF,CAAA;AAeD,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,oDAAoD;AACpD,EAAE;AACF,EAAE;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,UAG1B,EAAuB,EAAE;IACxB,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,EAAE,GAAG,UAAU,CAAA;IAEzC,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;QAClD,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,GAAG;QACR,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAY,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;IAEvF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;IAE/B,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,kBAA0B,EAAE,OAAe,EAAS,EAAE;IACpF,MAAM,IAAI,GAAc;QACtB,IAAI,EAAE;YACJ,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;SACjE;KACF,CAAA;IACD,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAE1D,OAAO;QACL,OAAO;QACP,IAAI;KACL,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAqB,EAAgB,EAAE;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IAElF,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAA;QACpB,OAAO;YACL,IAAI;SACL,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC1C,OAAO;QACL,IAAI;KACL,CAAA;AACH,CAAC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"kit-temp.d.ts","sourceRoot":"","sources":["../../src/lib/kit-temp.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,WAAW,GAAI,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,YAM7C,CAAA"}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
//
|
2
|
+
//
|
3
|
+
//
|
4
|
+
//
|
5
|
+
//
|
6
|
+
// Holding Module for Missing @wollybeard/kit Functionality
|
7
|
+
//
|
8
|
+
// ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
|
9
|
+
//
|
10
|
+
// Code here is meant to be migrated eventually to @wollybeard/kit.
|
11
|
+
//
|
12
|
+
//
|
13
|
+
//
|
14
|
+
export const arrayEquals = (a, b) => {
|
15
|
+
if (a.length !== b.length)
|
16
|
+
return false;
|
17
|
+
for (let i = 0; i < a.length; i++) {
|
18
|
+
if (a[i] !== b[i])
|
19
|
+
return false;
|
20
|
+
}
|
21
|
+
return true;
|
22
|
+
};
|
23
|
+
//# sourceMappingURL=kit-temp.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"kit-temp.js","sourceRoot":"","sources":["../../src/lib/kit-temp.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,2DAA2D;AAC3D,EAAE;AACF,mFAAmF;AACnF,EAAE;AACF,mEAAmE;AACnE,EAAE;AACF,EAAE;AACF,EAAE;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,EAAE;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACjC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
package/build/project-data.d.ts
CHANGED
@@ -4,6 +4,7 @@ import type { Schema } from './api/schema/index.js';
|
|
4
4
|
export interface ProjectData {
|
5
5
|
schema: null | Schema.Schema;
|
6
6
|
siteNavigationItems: SiteNavigationItem[];
|
7
|
+
sidebar: Sidebar;
|
7
8
|
faviconPath: string;
|
8
9
|
paths: Configurator.Config[`paths`][`project`];
|
9
10
|
pagesScanResult: FileRouter.ScanResult;
|
@@ -16,6 +17,14 @@ export interface ProjectData {
|
|
16
17
|
}
|
17
18
|
export interface SiteNavigationItem {
|
18
19
|
title: string;
|
19
|
-
|
20
|
+
pathExp: string;
|
21
|
+
}
|
22
|
+
export interface Sidebar {
|
23
|
+
[navPath: string]: SidebarItem[];
|
24
|
+
}
|
25
|
+
export interface SidebarItem {
|
26
|
+
title: string;
|
27
|
+
pathExp: string;
|
28
|
+
children?: SidebarItem[];
|
20
29
|
}
|
21
30
|
//# sourceMappingURL=project-data.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"project-data.d.ts","sourceRoot":"","sources":["../src/project-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAA;IAC9C,eAAe,EAAE,UAAU,CAAC,UAAU,CAAA;IACtC,MAAM,EAAE;QACN,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAA;YACjB,KAAK,EAAE,MAAM,CAAA;SACd,CAAA;KACF,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,
|
1
|
+
{"version":3,"file":"project-data.d.ts","sourceRoot":"","sources":["../src/project-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAA;IAC9C,eAAe,EAAE,UAAU,CAAC,UAAU,CAAA;IACtC,MAAM,EAAE;QACN,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAA;YACjB,KAAK,EAAE,MAAM,CAAA;SACd,CAAA;KACF,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;CACzB"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
export interface SidebarItem {
|
2
|
+
title: string;
|
3
|
+
pathExp: string;
|
4
|
+
children?: SidebarItem[];
|
5
|
+
}
|
6
|
+
interface SidebarProps {
|
7
|
+
items: SidebarItem[];
|
8
|
+
}
|
9
|
+
export declare const Sidebar: ({ items }: SidebarProps) => import("react").JSX.Element;
|
10
|
+
export {};
|
11
|
+
//# sourceMappingURL=Sidebar.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/template/components/Sidebar.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;CACzB;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,WAAW,EAAE,CAAA;CACrB;AAED,eAAO,MAAM,OAAO,GAAI,WAAW,YAAY,gCAuB9C,CAAA"}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import { Box, Flex, Text } from '@radix-ui/themes';
|
2
|
+
import { Link, useLocation } from 'react-router';
|
3
|
+
export const Sidebar = ({ items }) => {
|
4
|
+
const location = useLocation();
|
5
|
+
return (<Box style={{
|
6
|
+
width: `240px`,
|
7
|
+
borderRight: `1px solid var(--gray-3)`,
|
8
|
+
height: `100%`,
|
9
|
+
paddingRight: `var(--space-4)`,
|
10
|
+
}}>
|
11
|
+
<Flex direction='column' gap='1'>
|
12
|
+
{items.map((item) => (<SidebarItem key={item.pathExp} item={item} currentPathExp={location.pathname}/>))}
|
13
|
+
</Flex>
|
14
|
+
</Box>);
|
15
|
+
};
|
16
|
+
const SidebarItem = ({ item, currentPathExp: currentPath, level = 0 }) => {
|
17
|
+
const isActive = currentPath === item.pathExp;
|
18
|
+
const hasChildren = item.children && item.children.length > 0;
|
19
|
+
return (<>
|
20
|
+
<Link to={item.pathExp} style={{
|
21
|
+
textDecoration: `none`,
|
22
|
+
color: isActive ? `var(--accent-11)` : `var(--gray-12)`,
|
23
|
+
padding: `var(--space-2) var(--space-3)`,
|
24
|
+
paddingLeft: `calc(var(--space-3) + ${(level * 16).toString()}px)`,
|
25
|
+
borderRadius: `var(--radius-2)`,
|
26
|
+
display: `block`,
|
27
|
+
backgroundColor: isActive ? `var(--accent-3)` : `transparent`,
|
28
|
+
transition: `background-color 0.2s ease, color 0.2s ease`,
|
29
|
+
}} onMouseEnter={(e) => {
|
30
|
+
if (!isActive) {
|
31
|
+
e.currentTarget.style.backgroundColor = `var(--gray-2)`;
|
32
|
+
}
|
33
|
+
}} onMouseLeave={(e) => {
|
34
|
+
if (!isActive) {
|
35
|
+
e.currentTarget.style.backgroundColor = `transparent`;
|
36
|
+
}
|
37
|
+
}}>
|
38
|
+
<Text size='2' weight={isActive ? `medium` : `regular`}>
|
39
|
+
{item.title}
|
40
|
+
</Text>
|
41
|
+
</Link>
|
42
|
+
{hasChildren && (<Flex direction='column' gap='1'>
|
43
|
+
{item.children.map((child) => (<SidebarItem key={child.pathExp} item={child} currentPathExp={currentPath} level={level + 1}/>))}
|
44
|
+
</Flex>)}
|
45
|
+
</>);
|
46
|
+
};
|
47
|
+
//# sourceMappingURL=Sidebar.jsx.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Sidebar.jsx","sourceRoot":"","sources":["../../../src/template/components/Sidebar.tsx"],"names":[],"mappings":"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"}
|