@shipfox/client-shell 12.0.2 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/main-layout.js +2 -2
- package/dist/components/main-layout.js.map +1 -1
- package/dist/components/nav-tabs.d.ts.map +1 -1
- package/dist/components/nav-tabs.js +5 -4
- package/dist/components/nav-tabs.js.map +1 -1
- package/dist/components/settings-nav.d.ts +2 -1
- package/dist/components/settings-nav.d.ts.map +1 -1
- package/dist/components/settings-nav.js +17 -13
- package/dist/components/settings-nav.js.map +1 -1
- package/dist/components/workspace-crumb.js +2 -2
- package/dist/components/workspace-crumb.js.map +1 -1
- package/dist/components/workspace-switcher.d.ts.map +1 -1
- package/dist/components/workspace-switcher.js +4 -2
- package/dist/components/workspace-switcher.js.map +1 -1
- package/dist/compose/compose-routes.d.ts.map +1 -1
- package/dist/compose/compose-routes.js +4 -1
- package/dist/compose/compose-routes.js.map +1 -1
- package/dist/compose/validate-registries.d.ts.map +1 -1
- package/dist/compose/validate-registries.js +1 -1
- package/dist/compose/validate-registries.js.map +1 -1
- package/dist/contract.d.ts +2 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js.map +1 -1
- package/dist/core/session.d.ts +1 -0
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js.map +1 -1
- package/dist/hooks/api/session-auth.d.ts.map +1 -1
- package/dist/hooks/api/session-auth.js +1 -0
- package/dist/hooks/api/session-auth.js.map +1 -1
- package/dist/runtime/active-workspace.js +3 -3
- package/dist/runtime/active-workspace.js.map +1 -1
- package/dist/runtime/anchor-paths.d.ts +14 -4
- package/dist/runtime/anchor-paths.d.ts.map +1 -1
- package/dist/runtime/anchor-paths.js +57 -4
- package/dist/runtime/anchor-paths.js.map +1 -1
- package/dist/runtime/anchors.d.ts +9 -6
- package/dist/runtime/anchors.d.ts.map +1 -1
- package/dist/runtime/anchors.js +85 -42
- package/dist/runtime/anchors.js.map +1 -1
- package/dist/runtime/assemble-route-tree.d.ts.map +1 -1
- package/dist/runtime/assemble-route-tree.js +7 -2
- package/dist/runtime/assemble-route-tree.js.map +1 -1
- package/dist/runtime/chrome-context.d.ts +2 -1
- package/dist/runtime/chrome-context.d.ts.map +1 -1
- package/dist/runtime/chrome-context.js.map +1 -1
- package/dist/runtime/compose-client-app.d.ts.map +1 -1
- package/dist/runtime/compose-client-app.js +5 -3
- package/dist/runtime/compose-client-app.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/registries.js +4 -1
- package/dist/runtime/registries.js.map +1 -1
- package/dist/runtime/route-inputs.d.ts +3 -3
- package/dist/runtime/route-inputs.d.ts.map +1 -1
- package/dist/runtime/route-inputs.js +9 -9
- package/dist/runtime/route-inputs.js.map +1 -1
- package/dist/runtime/router-context.d.ts +7 -0
- package/dist/runtime/router-context.d.ts.map +1 -1
- package/dist/runtime/router-context.js.map +1 -1
- package/dist/runtime/search-serialization.d.ts +26 -0
- package/dist/runtime/search-serialization.d.ts.map +1 -0
- package/dist/runtime/search-serialization.js +78 -0
- package/dist/runtime/search-serialization.js.map +1 -0
- package/dist/runtime/workspace-setup.d.ts +1 -0
- package/dist/runtime/workspace-setup.d.ts.map +1 -1
- package/dist/runtime/workspace-setup.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/dist/vite/generate.d.ts.map +1 -1
- package/dist/vite/generate.js +12 -3
- package/dist/vite/generate.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/session-auth.ts"],"sourcesContent":["import {loginResponseSchema} from '@shipfox/api-auth-dto';\nimport {listUserWorkspacesResponseSchema} from '@shipfox/api-workspaces-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {type FetchQueryOptions, queryOptions} from '@tanstack/react-query';\nimport type {AuthenticatedSession, WorkspaceSummary} from '#core/session.js';\nimport {toAuthenticatedSession} from './session-mapper.js';\n\nexport interface UserWorkspaces {\n memberships: WorkspaceSummary[];\n}\n\nexport const authRefreshQueryKey = ['auth', 'refresh'] as const;\nexport const userWorkspacesQueryKey = ['workspaces', 'mine'] as const;\n\ntype AuthRefreshQueryOptions = FetchQueryOptions<\n AuthenticatedSession,\n Error,\n AuthenticatedSession,\n typeof authRefreshQueryKey\n>;\n\ntype UserWorkspacesQueryOptions = FetchQueryOptions<\n UserWorkspaces,\n Error,\n UserWorkspaces,\n typeof userWorkspacesQueryKey\n>;\n\nexport async function listUserWorkspaces(\n token?: string,\n signal?: AbortSignal,\n): Promise<UserWorkspaces> {\n const response = await checkedApiRequest(\n listUserWorkspacesResponseSchema,\n '/workspaces',\n token ? {headers: {authorization: `Bearer ${token}`}, signal} : {signal},\n );\n return {\n memberships: response.memberships.map((membership) => ({\n id: membership.workspace_id,\n name: membership.workspace_name,\n membershipId: membership.id,\n status: membership.workspace_status,\n })),\n };\n}\n\nexport function authRefreshQueryOptions(): AuthRefreshQueryOptions {\n return queryOptions({\n queryKey: authRefreshQueryKey,\n queryFn: ({signal}) => refreshAuthenticatedSession(signal),\n retry: false,\n staleTime: 0,\n });\n}\n\nexport function userWorkspacesQueryOptions(token?: string): UserWorkspacesQueryOptions {\n return queryOptions({\n queryKey: userWorkspacesQueryKey,\n queryFn: ({signal}) => listUserWorkspaces(token, signal),\n retry: false,\n staleTime: 0,\n });\n}\n\nexport async function refreshAuthenticatedSession(\n signal?: AbortSignal,\n): Promise<AuthenticatedSession> {\n const response = await checkedApiRequest(loginResponseSchema, '/auth/refresh', {\n method: 'POST',\n signal,\n });\n return toAuthenticatedSession(response);\n}\n"],"names":["loginResponseSchema","listUserWorkspacesResponseSchema","checkedApiRequest","queryOptions","toAuthenticatedSession","authRefreshQueryKey","userWorkspacesQueryKey","listUserWorkspaces","token","signal","response","headers","authorization","memberships","map","membership","id","workspace_id","name","workspace_name","membershipId","status","workspace_status","authRefreshQueryOptions","queryKey","queryFn","refreshAuthenticatedSession","retry","staleTime","userWorkspacesQueryOptions","method"],"mappings":"AAAA,SAAQA,mBAAmB,QAAO,wBAAwB;AAC1D,SAAQC,gCAAgC,QAAO,8BAA8B;AAC7E,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAAgCC,YAAY,QAAO,wBAAwB;AAE3E,SAAQC,sBAAsB,QAAO,sBAAsB;AAM3D,OAAO,MAAMC,sBAAsB;IAAC;IAAQ;CAAU,CAAU;AAChE,OAAO,MAAMC,yBAAyB;IAAC;IAAc;CAAO,CAAU;AAgBtE,OAAO,eAAeC,mBACpBC,KAAc,EACdC,MAAoB;IAEpB,MAAMC,WAAW,MAAMR,kBACrBD,kCACA,eACAO,QAAQ;QAACG,SAAS;YAACC,eAAe,CAAC,OAAO,EAAEJ,OAAO;QAAA;QAAGC;IAAM,IAAI;QAACA;IAAM;IAEzE,OAAO;QACLI,aAAaH,SAASG,WAAW,CAACC,GAAG,CAAC,CAACC,aAAgB,CAAA;gBACrDC,IAAID,WAAWE,YAAY;gBAC3BC,MAAMH,WAAWI,cAAc;gBAC/BC,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/session-auth.ts"],"sourcesContent":["import {loginResponseSchema} from '@shipfox/api-auth-dto';\nimport {listUserWorkspacesResponseSchema} from '@shipfox/api-workspaces-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {type FetchQueryOptions, queryOptions} from '@tanstack/react-query';\nimport type {AuthenticatedSession, WorkspaceSummary} from '#core/session.js';\nimport {toAuthenticatedSession} from './session-mapper.js';\n\nexport interface UserWorkspaces {\n memberships: WorkspaceSummary[];\n}\n\nexport const authRefreshQueryKey = ['auth', 'refresh'] as const;\nexport const userWorkspacesQueryKey = ['workspaces', 'mine'] as const;\n\ntype AuthRefreshQueryOptions = FetchQueryOptions<\n AuthenticatedSession,\n Error,\n AuthenticatedSession,\n typeof authRefreshQueryKey\n>;\n\ntype UserWorkspacesQueryOptions = FetchQueryOptions<\n UserWorkspaces,\n Error,\n UserWorkspaces,\n typeof userWorkspacesQueryKey\n>;\n\nexport async function listUserWorkspaces(\n token?: string,\n signal?: AbortSignal,\n): Promise<UserWorkspaces> {\n const response = await checkedApiRequest(\n listUserWorkspacesResponseSchema,\n '/workspaces',\n token ? {headers: {authorization: `Bearer ${token}`}, signal} : {signal},\n );\n return {\n memberships: response.memberships.map((membership) => ({\n id: membership.workspace_id,\n name: membership.workspace_name,\n slug: membership.workspace_slug,\n membershipId: membership.id,\n status: membership.workspace_status,\n })),\n };\n}\n\nexport function authRefreshQueryOptions(): AuthRefreshQueryOptions {\n return queryOptions({\n queryKey: authRefreshQueryKey,\n queryFn: ({signal}) => refreshAuthenticatedSession(signal),\n retry: false,\n staleTime: 0,\n });\n}\n\nexport function userWorkspacesQueryOptions(token?: string): UserWorkspacesQueryOptions {\n return queryOptions({\n queryKey: userWorkspacesQueryKey,\n queryFn: ({signal}) => listUserWorkspaces(token, signal),\n retry: false,\n staleTime: 0,\n });\n}\n\nexport async function refreshAuthenticatedSession(\n signal?: AbortSignal,\n): Promise<AuthenticatedSession> {\n const response = await checkedApiRequest(loginResponseSchema, '/auth/refresh', {\n method: 'POST',\n signal,\n });\n return toAuthenticatedSession(response);\n}\n"],"names":["loginResponseSchema","listUserWorkspacesResponseSchema","checkedApiRequest","queryOptions","toAuthenticatedSession","authRefreshQueryKey","userWorkspacesQueryKey","listUserWorkspaces","token","signal","response","headers","authorization","memberships","map","membership","id","workspace_id","name","workspace_name","slug","workspace_slug","membershipId","status","workspace_status","authRefreshQueryOptions","queryKey","queryFn","refreshAuthenticatedSession","retry","staleTime","userWorkspacesQueryOptions","method"],"mappings":"AAAA,SAAQA,mBAAmB,QAAO,wBAAwB;AAC1D,SAAQC,gCAAgC,QAAO,8BAA8B;AAC7E,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAAgCC,YAAY,QAAO,wBAAwB;AAE3E,SAAQC,sBAAsB,QAAO,sBAAsB;AAM3D,OAAO,MAAMC,sBAAsB;IAAC;IAAQ;CAAU,CAAU;AAChE,OAAO,MAAMC,yBAAyB;IAAC;IAAc;CAAO,CAAU;AAgBtE,OAAO,eAAeC,mBACpBC,KAAc,EACdC,MAAoB;IAEpB,MAAMC,WAAW,MAAMR,kBACrBD,kCACA,eACAO,QAAQ;QAACG,SAAS;YAACC,eAAe,CAAC,OAAO,EAAEJ,OAAO;QAAA;QAAGC;IAAM,IAAI;QAACA;IAAM;IAEzE,OAAO;QACLI,aAAaH,SAASG,WAAW,CAACC,GAAG,CAAC,CAACC,aAAgB,CAAA;gBACrDC,IAAID,WAAWE,YAAY;gBAC3BC,MAAMH,WAAWI,cAAc;gBAC/BC,MAAML,WAAWM,cAAc;gBAC/BC,cAAcP,WAAWC,EAAE;gBAC3BO,QAAQR,WAAWS,gBAAgB;YACrC,CAAA;IACF;AACF;AAEA,OAAO,SAASC;IACd,OAAOtB,aAAa;QAClBuB,UAAUrB;QACVsB,SAAS,CAAC,EAAClB,MAAM,EAAC,GAAKmB,4BAA4BnB;QACnDoB,OAAO;QACPC,WAAW;IACb;AACF;AAEA,OAAO,SAASC,2BAA2BvB,KAAc;IACvD,OAAOL,aAAa;QAClBuB,UAAUpB;QACVqB,SAAS,CAAC,EAAClB,MAAM,EAAC,GAAKF,mBAAmBC,OAAOC;QACjDoB,OAAO;QACPC,WAAW;IACb;AACF;AAEA,OAAO,eAAeF,4BACpBnB,MAAoB;IAEpB,MAAMC,WAAW,MAAMR,kBAAkBF,qBAAqB,iBAAiB;QAC7EgC,QAAQ;QACRvB;IACF;IACA,OAAOL,uBAAuBM;AAChC"}
|
|
@@ -2,12 +2,12 @@ import { useAuthState } from './auth.js';
|
|
|
2
2
|
import { parseWorkspaceParams, useRouteParams } from './route-inputs.js';
|
|
3
3
|
export function useActiveWorkspace() {
|
|
4
4
|
const workspace = useMaybeActiveWorkspace();
|
|
5
|
-
if (!workspace) throw new Error('useActiveWorkspace called outside a /
|
|
5
|
+
if (!workspace) throw new Error('useActiveWorkspace called outside a /w/$workspaceSlug route');
|
|
6
6
|
return workspace;
|
|
7
7
|
}
|
|
8
8
|
export function useMaybeActiveWorkspace() {
|
|
9
|
-
const {
|
|
10
|
-
return useAuthState().workspaces.find((workspace)=>workspace.
|
|
9
|
+
const { workspaceSlug } = useRouteParams(parseWorkspaceParams);
|
|
10
|
+
return useAuthState().workspaces.find((workspace)=>workspace.slug === workspaceSlug);
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
//# sourceMappingURL=active-workspace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/active-workspace.ts"],"sourcesContent":["import {useAuthState, type Workspace} from './auth.js';\nimport {parseWorkspaceParams, useRouteParams} from './route-inputs.js';\n\nexport function useActiveWorkspace(): Workspace {\n const workspace = useMaybeActiveWorkspace();\n if (!workspace) throw new Error('useActiveWorkspace called outside a /
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/active-workspace.ts"],"sourcesContent":["import {useAuthState, type Workspace} from './auth.js';\nimport {parseWorkspaceParams, useRouteParams} from './route-inputs.js';\n\nexport function useActiveWorkspace(): Workspace {\n const workspace = useMaybeActiveWorkspace();\n if (!workspace) throw new Error('useActiveWorkspace called outside a /w/$workspaceSlug route');\n return workspace;\n}\n\nexport function useMaybeActiveWorkspace(): Workspace | undefined {\n const {workspaceSlug} = useRouteParams(parseWorkspaceParams);\n return useAuthState().workspaces.find((workspace) => workspace.slug === workspaceSlug);\n}\n"],"names":["useAuthState","parseWorkspaceParams","useRouteParams","useActiveWorkspace","workspace","useMaybeActiveWorkspace","Error","workspaceSlug","workspaces","find","slug"],"mappings":"AAAA,SAAQA,YAAY,QAAuB,YAAY;AACvD,SAAQC,oBAAoB,EAAEC,cAAc,QAAO,oBAAoB;AAEvE,OAAO,SAASC;IACd,MAAMC,YAAYC;IAClB,IAAI,CAACD,WAAW,MAAM,IAAIE,MAAM;IAChC,OAAOF;AACT;AAEA,OAAO,SAASC;IACd,MAAM,EAACE,aAAa,EAAC,GAAGL,eAAeD;IACvC,OAAOD,eAAeQ,UAAU,CAACC,IAAI,CAAC,CAACL,YAAcA,UAAUM,IAAI,KAAKH;AAC1E"}
|
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import type { RouteParentId } from '#contract.js';
|
|
2
2
|
declare const anchorPaths: {
|
|
3
3
|
readonly root: "/";
|
|
4
|
-
readonly workspaceLayout: "/
|
|
5
|
-
readonly projectLayout: "/
|
|
6
|
-
readonly workspaceSettings: "/
|
|
4
|
+
readonly workspaceLayout: "/w/$workspaceSlug";
|
|
5
|
+
readonly projectLayout: "/w/$workspaceSlug/p/$projectSlug";
|
|
6
|
+
readonly workspaceSettings: "/w/$workspaceSlug/settings";
|
|
7
|
+
readonly projectSettings: "/w/$workspaceSlug/p/$projectSlug/settings";
|
|
7
8
|
};
|
|
8
|
-
|
|
9
|
+
declare const entityPrefixRegistry: {
|
|
10
|
+
readonly w: "workspace";
|
|
11
|
+
readonly p: "project";
|
|
12
|
+
};
|
|
13
|
+
declare const slugParamPrefixes: {
|
|
14
|
+
readonly workspaceSlug: "w";
|
|
15
|
+
readonly projectSlug: "p";
|
|
16
|
+
};
|
|
17
|
+
export { anchorPaths, entityPrefixRegistry, slugParamPrefixes };
|
|
18
|
+
export declare function validateRoutePathInvariants(path: string): void;
|
|
9
19
|
export declare function routePathForAnchor(anchor: keyof typeof anchorPaths, fullPath: string): string;
|
|
10
20
|
export declare function routePathForParent(parent: RouteParentId, fullPath: string, layoutPaths?: ReadonlyMap<string, string>): string;
|
|
11
21
|
//# sourceMappingURL=anchor-paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor-paths.d.ts","sourceRoot":"","sources":["../../src/runtime/anchor-paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,QAAA,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"anchor-paths.d.ts","sourceRoot":"","sources":["../../src/runtime/anchor-paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,QAAA,MAAM,WAAW;;;;;;CAMP,CAAC;AAEX,QAAA,MAAM,oBAAoB;;;CAGhB,CAAC;AAEX,QAAA,MAAM,iBAAiB;;;CAGb,CAAC;AAEX,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,iBAAiB,EAAC,CAAC;AAE9D,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA+D9D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,OAAO,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ7F;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GACnD,MAAM,CAiBR"}
|
|
@@ -1,11 +1,64 @@
|
|
|
1
1
|
import { normalizeRoutePath } from '#compose/normalize-route-path.js';
|
|
2
2
|
const anchorPaths = {
|
|
3
3
|
root: '/',
|
|
4
|
-
workspaceLayout: '/
|
|
5
|
-
projectLayout: '/
|
|
6
|
-
workspaceSettings: '/
|
|
4
|
+
workspaceLayout: '/w/$workspaceSlug',
|
|
5
|
+
projectLayout: '/w/$workspaceSlug/p/$projectSlug',
|
|
6
|
+
workspaceSettings: '/w/$workspaceSlug/settings',
|
|
7
|
+
projectSettings: '/w/$workspaceSlug/p/$projectSlug/settings'
|
|
7
8
|
};
|
|
8
|
-
|
|
9
|
+
const entityPrefixRegistry = {
|
|
10
|
+
w: 'workspace',
|
|
11
|
+
p: 'project'
|
|
12
|
+
};
|
|
13
|
+
const slugParamPrefixes = {
|
|
14
|
+
workspaceSlug: 'w',
|
|
15
|
+
projectSlug: 'p'
|
|
16
|
+
};
|
|
17
|
+
export { anchorPaths, entityPrefixRegistry, slugParamPrefixes };
|
|
18
|
+
export function validateRoutePathInvariants(path) {
|
|
19
|
+
const segments = path.split('/').filter(Boolean);
|
|
20
|
+
const seenSlugParams = new Set();
|
|
21
|
+
if (segments[0] === 'workspaces' && segments[1]?.startsWith('$')) {
|
|
22
|
+
throw new Error(`Route "${path}" must use the slug-based workspace prefix "w" instead of the legacy "/workspaces" path.`);
|
|
23
|
+
}
|
|
24
|
+
for (const [index, segment] of segments.entries()){
|
|
25
|
+
const nextSegment = segments[index + 1];
|
|
26
|
+
if (segment.length === 1 && Object.hasOwn(entityPrefixRegistry, segment)) {
|
|
27
|
+
if (!nextSegment?.startsWith('$')) {
|
|
28
|
+
throw new Error(`Route "${path}" uses prefix "${segment}" without a dynamic parameter immediately after it.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!segment.startsWith('$')) continue;
|
|
32
|
+
const param = segment.slice(1);
|
|
33
|
+
const prefix = Object.hasOwn(slugParamPrefixes, param) ? slugParamPrefixes[param] : undefined;
|
|
34
|
+
if (prefix !== undefined) {
|
|
35
|
+
if (seenSlugParams.has(param)) {
|
|
36
|
+
throw new Error(`Route "${path}" repeats slug parameter "${param}".`);
|
|
37
|
+
}
|
|
38
|
+
seenSlugParams.add(param);
|
|
39
|
+
if (segments[index - 1] !== prefix) {
|
|
40
|
+
throw new Error(`Route "${path}" places slug parameter "${param}" outside prefix "${prefix}".`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (prefix === undefined) {
|
|
44
|
+
const previousSegment = segments[index - 1];
|
|
45
|
+
if (!previousSegment || previousSegment.startsWith('$') || Object.hasOwn(entityPrefixRegistry, previousSegment)) {
|
|
46
|
+
throw new Error(`Route "${path}" must place UUID parameter "${param}" after a page segment.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const workspacePrefixIndex = segments.indexOf('w');
|
|
51
|
+
const projectPrefixIndex = segments.indexOf('p');
|
|
52
|
+
if (workspacePrefixIndex !== -1 && projectPrefixIndex !== -1 && workspacePrefixIndex > projectPrefixIndex) {
|
|
53
|
+
throw new Error(`Route "${path}" must place workspace prefix "w" before project prefix "p".`);
|
|
54
|
+
}
|
|
55
|
+
if (workspacePrefixIndex !== -1 && workspacePrefixIndex !== 0) {
|
|
56
|
+
throw new Error(`Route "${path}" must place workspace prefix "w" at the start of the path.`);
|
|
57
|
+
}
|
|
58
|
+
if (projectPrefixIndex !== -1 && (workspacePrefixIndex !== 0 || projectPrefixIndex !== 2)) {
|
|
59
|
+
throw new Error(`Route "${path}" must place workspace prefix "w" before project prefix "p".`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
9
62
|
export function routePathForAnchor(anchor, fullPath) {
|
|
10
63
|
const anchorPath = anchorPaths[anchor];
|
|
11
64
|
if (anchor === 'root') return fullPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/anchor-paths.ts"],"sourcesContent":["import {normalizeRoutePath} from '#compose/normalize-route-path.js';\nimport type {RouteParentId} from '#contract.js';\n\nconst anchorPaths = {\n root: '/',\n workspaceLayout: '/
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/anchor-paths.ts"],"sourcesContent":["import {normalizeRoutePath} from '#compose/normalize-route-path.js';\nimport type {RouteParentId} from '#contract.js';\n\nconst anchorPaths = {\n root: '/',\n workspaceLayout: '/w/$workspaceSlug',\n projectLayout: '/w/$workspaceSlug/p/$projectSlug',\n workspaceSettings: '/w/$workspaceSlug/settings',\n projectSettings: '/w/$workspaceSlug/p/$projectSlug/settings',\n} as const;\n\nconst entityPrefixRegistry = {\n w: 'workspace',\n p: 'project',\n} as const;\n\nconst slugParamPrefixes = {\n workspaceSlug: 'w',\n projectSlug: 'p',\n} as const;\n\nexport {anchorPaths, entityPrefixRegistry, slugParamPrefixes};\n\nexport function validateRoutePathInvariants(path: string): void {\n const segments = path.split('/').filter(Boolean);\n const seenSlugParams = new Set<string>();\n\n if (segments[0] === 'workspaces' && segments[1]?.startsWith('$')) {\n throw new Error(\n `Route \"${path}\" must use the slug-based workspace prefix \"w\" instead of the legacy \"/workspaces\" path.`,\n );\n }\n\n for (const [index, segment] of segments.entries()) {\n const nextSegment = segments[index + 1];\n if (segment.length === 1 && Object.hasOwn(entityPrefixRegistry, segment)) {\n if (!nextSegment?.startsWith('$')) {\n throw new Error(\n `Route \"${path}\" uses prefix \"${segment}\" without a dynamic parameter immediately after it.`,\n );\n }\n }\n\n if (!segment.startsWith('$')) continue;\n const param = segment.slice(1) as keyof typeof slugParamPrefixes;\n const prefix = Object.hasOwn(slugParamPrefixes, param) ? slugParamPrefixes[param] : undefined;\n if (prefix !== undefined) {\n if (seenSlugParams.has(param)) {\n throw new Error(`Route \"${path}\" repeats slug parameter \"${param}\".`);\n }\n seenSlugParams.add(param);\n if (segments[index - 1] !== prefix) {\n throw new Error(\n `Route \"${path}\" places slug parameter \"${param}\" outside prefix \"${prefix}\".`,\n );\n }\n }\n if (prefix === undefined) {\n const previousSegment = segments[index - 1];\n if (\n !previousSegment ||\n previousSegment.startsWith('$') ||\n Object.hasOwn(entityPrefixRegistry, previousSegment)\n ) {\n throw new Error(\n `Route \"${path}\" must place UUID parameter \"${param}\" after a page segment.`,\n );\n }\n }\n }\n\n const workspacePrefixIndex = segments.indexOf('w');\n const projectPrefixIndex = segments.indexOf('p');\n if (\n workspacePrefixIndex !== -1 &&\n projectPrefixIndex !== -1 &&\n workspacePrefixIndex > projectPrefixIndex\n ) {\n throw new Error(`Route \"${path}\" must place workspace prefix \"w\" before project prefix \"p\".`);\n }\n if (workspacePrefixIndex !== -1 && workspacePrefixIndex !== 0) {\n throw new Error(`Route \"${path}\" must place workspace prefix \"w\" at the start of the path.`);\n }\n if (projectPrefixIndex !== -1 && (workspacePrefixIndex !== 0 || projectPrefixIndex !== 2)) {\n throw new Error(`Route \"${path}\" must place workspace prefix \"w\" before project prefix \"p\".`);\n }\n}\n\nexport function routePathForAnchor(anchor: keyof typeof anchorPaths, fullPath: string): string {\n const anchorPath = anchorPaths[anchor];\n if (anchor === 'root') return fullPath;\n if (fullPath === anchorPath) return '/';\n if (!fullPath.startsWith(`${anchorPath}/`)) {\n throw new Error(`Route \"${fullPath}\" must be nested under anchor \"${anchor}\" (${anchorPath}).`);\n }\n return fullPath.slice(anchorPath.length);\n}\n\nexport function routePathForParent(\n parent: RouteParentId,\n fullPath: string,\n layoutPaths: ReadonlyMap<string, string> = new Map(),\n): string {\n const normalizedPath = normalizeRoutePath(fullPath);\n const parentPath = Object.hasOwn(anchorPaths, parent)\n ? anchorPaths[parent as keyof typeof anchorPaths]\n : layoutPaths.get(parent);\n if (!parentPath) {\n throw new Error(`Route \"${normalizedPath}\" targets missing layout parent \"${parent}\".`);\n }\n if (parentPath === '/') return normalizedPath;\n if (normalizedPath === parentPath) return '/';\n if (parentPath !== '/' && !normalizedPath.startsWith(`${parentPath}/`)) {\n const parentKind = Object.hasOwn(anchorPaths, parent) ? 'anchor' : 'layout';\n throw new Error(\n `Route \"${normalizedPath}\" must be nested under ${parentKind} \"${parent}\" (${parentPath}).`,\n );\n }\n return normalizedPath.slice(parentPath.length);\n}\n"],"names":["normalizeRoutePath","anchorPaths","root","workspaceLayout","projectLayout","workspaceSettings","projectSettings","entityPrefixRegistry","w","p","slugParamPrefixes","workspaceSlug","projectSlug","validateRoutePathInvariants","path","segments","split","filter","Boolean","seenSlugParams","Set","startsWith","Error","index","segment","entries","nextSegment","length","Object","hasOwn","param","slice","prefix","undefined","has","add","previousSegment","workspacePrefixIndex","indexOf","projectPrefixIndex","routePathForAnchor","anchor","fullPath","anchorPath","routePathForParent","parent","layoutPaths","Map","normalizedPath","parentPath","get","parentKind"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { NavTabEntry, SettingsSectionEntry } from '#contract.js';
|
|
2
2
|
import type { RouterContext } from './router-context.js';
|
|
3
|
+
import type { WorkspaceSetupState } from './workspace-setup.js';
|
|
3
4
|
export { routePathForAnchor } from './anchor-paths.js';
|
|
4
5
|
export declare function buildAnchorSkeleton({ navigation, settingsSections, }: {
|
|
5
6
|
navigation: readonly NavTabEntry[];
|
|
@@ -7,13 +8,15 @@ export declare function buildAnchorSkeleton({ navigation, settingsSections, }: {
|
|
|
7
8
|
}): {
|
|
8
9
|
anchors: {
|
|
9
10
|
root: import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
10
|
-
workspaceLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/
|
|
11
|
-
projectLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/
|
|
12
|
-
workspaceSettings: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/
|
|
11
|
+
workspaceLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
12
|
+
projectLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/p/$projectSlug", "/w/$workspaceSlug/p/$projectSlug", string, "/w/$workspaceSlug/p/$projectSlug", undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug/p/$projectSlug", unknown, undefined>) => Promise<void>, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
13
|
+
workspaceSettings: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/settings", "/w/$workspaceSlug/settings", string, "/w/$workspaceSlug/settings", undefined, import("@tanstack/router-core").ResolveParams<"/settings">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
14
|
+
projectSettings: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/p/$projectSlug", "/w/$workspaceSlug/p/$projectSlug", string, "/w/$workspaceSlug/p/$projectSlug", undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug/p/$projectSlug", unknown, undefined>) => Promise<void>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/settings", "/w/$workspaceSlug/p/$projectSlug/settings", string, "/w/$workspaceSlug/p/$projectSlug/settings", undefined, import("@tanstack/router-core").ResolveParams<"/settings">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
13
15
|
};
|
|
14
16
|
rootRoute: import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
15
|
-
workspaceLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/
|
|
16
|
-
projectLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/
|
|
17
|
-
workspaceSettings: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/
|
|
17
|
+
workspaceLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
18
|
+
projectLayout: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/p/$projectSlug", "/w/$workspaceSlug/p/$projectSlug", string, "/w/$workspaceSlug/p/$projectSlug", undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug/p/$projectSlug", unknown, undefined>) => Promise<void>, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
19
|
+
workspaceSettings: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/settings", "/w/$workspaceSlug/settings", string, "/w/$workspaceSlug/settings", undefined, import("@tanstack/router-core").ResolveParams<"/settings">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
20
|
+
projectSettings: import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/p/$projectSlug", "/w/$workspaceSlug/p/$projectSlug", string, "/w/$workspaceSlug/p/$projectSlug", undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").Route<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/w/$workspaceSlug", "/w/$workspaceSlug", string, "/w/$workspaceSlug", undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, ({ context, params, location }: import("@tanstack/router-core").BeforeLoadContextOptions<unknown, import("@tanstack/react-router").RootRoute<import("@tanstack/router-core").Register, undefined, RouterContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/w/$workspaceSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug", unknown, undefined>) => Promise<WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, undefined, import("@tanstack/router-core").ResolveParams<"/p/$projectSlug">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/w/$workspaceSlug/p/$projectSlug", unknown, undefined>) => Promise<void>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/settings", "/w/$workspaceSlug/p/$projectSlug/settings", string, "/w/$workspaceSlug/p/$projectSlug/settings", undefined, import("@tanstack/router-core").ResolveParams<"/settings">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, unknown, unknown, unknown, unknown, undefined>;
|
|
18
21
|
};
|
|
19
22
|
//# sourceMappingURL=anchors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchors.d.ts","sourceRoot":"","sources":["../../src/runtime/anchors.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,WAAW,EAAE,oBAAoB,EAAC,MAAM,cAAc,CAAC;AAKpE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"anchors.d.ts","sourceRoot":"","sources":["../../src/runtime/anchors.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,WAAW,EAAE,oBAAoB,EAAC,MAAM,cAAc,CAAC;AAKpE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,sBAAsB,CAAC;AAO9D,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,gBAAgB,GACjB,EAAE;IACD,UAAU,EAAE,SAAS,WAAW,EAAE,CAAC;IACnC,gBAAgB,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD;;;;;;;;;;;;;EAsHA"}
|
package/dist/runtime/anchors.js
CHANGED
|
@@ -7,8 +7,8 @@ import { NotFoundPage } from '#components/not-found-page.js';
|
|
|
7
7
|
import { SettingsNav } from '#components/settings-nav.js';
|
|
8
8
|
import { useActiveWorkspace, useMaybeActiveWorkspace } from './active-workspace.js';
|
|
9
9
|
import { anchorPaths } from './anchor-paths.js';
|
|
10
|
-
import { useChrome } from './chrome-context.js';
|
|
11
10
|
import { rememberLastWorkspaceId } from './last-workspace.js';
|
|
11
|
+
import { parseWorkspaceParams, parseWorkspaceProjectParams, useRouteParams } from './route-inputs.js';
|
|
12
12
|
import { WorkspaceLayoutErrorRoute, WorkspaceSetupPending, WorkspaceUnavailablePage } from './workspace-setup.js';
|
|
13
13
|
export { routePathForAnchor } from './anchor-paths.js';
|
|
14
14
|
export function buildAnchorSkeleton({ navigation, settingsSections }) {
|
|
@@ -28,18 +28,20 @@ export function buildAnchorSkeleton({ navigation, settingsSections }) {
|
|
|
28
28
|
redirect: location.href
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
|
-
|
|
31
|
+
const workspace = auth.workspaces.find((candidate)=>candidate.slug === params.workspaceSlug);
|
|
32
|
+
if (!workspace) throw redirect({
|
|
32
33
|
to: '/'
|
|
33
34
|
});
|
|
34
35
|
try {
|
|
35
|
-
if (auth.user?.id) rememberLastWorkspaceId(auth.user.id,
|
|
36
|
+
if (auth.user?.id) rememberLastWorkspaceId(auth.user.id, workspace.id);
|
|
36
37
|
} catch {
|
|
37
38
|
// Local storage is best effort.
|
|
38
39
|
}
|
|
39
40
|
if (!context.workspaceSetup) throw new Error('Client composition includes workspace routes but no workspaceSetup gate.');
|
|
40
41
|
return await context.workspaceSetup({
|
|
41
42
|
queryClient: context.queryClient,
|
|
42
|
-
workspaceId:
|
|
43
|
+
workspaceId: workspace.id,
|
|
44
|
+
workspaceSlug: params.workspaceSlug,
|
|
43
45
|
pathname: location.pathname
|
|
44
46
|
});
|
|
45
47
|
},
|
|
@@ -66,48 +68,54 @@ export function buildAnchorSkeleton({ navigation, settingsSections }) {
|
|
|
66
68
|
});
|
|
67
69
|
const projectLayout = createRoute({
|
|
68
70
|
getParentRoute: ()=>workspaceLayout,
|
|
69
|
-
path: '/
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
path: '/p/$projectSlug',
|
|
72
|
+
beforeLoad: async ({ context, params })=>{
|
|
73
|
+
const auth = context.auth;
|
|
74
|
+
if (!auth || auth.isLoading || !context.queryClient) return;
|
|
75
|
+
if (context.unavailable) return;
|
|
76
|
+
const workspace = auth.workspaces.find((candidate)=>candidate.slug === params.workspaceSlug);
|
|
77
|
+
if (!workspace) throw redirect({
|
|
78
|
+
to: '/'
|
|
79
|
+
});
|
|
80
|
+
if (!context.projectSlugResolver) {
|
|
81
|
+
throw new Error('Client composition includes project routes but no project slug resolver.');
|
|
82
|
+
}
|
|
83
|
+
const projectId = await context.projectSlugResolver({
|
|
84
|
+
queryClient: context.queryClient,
|
|
85
|
+
workspaceId: workspace.id,
|
|
86
|
+
projectSlug: params.projectSlug
|
|
87
|
+
});
|
|
88
|
+
if (!projectId) {
|
|
89
|
+
throw redirect({
|
|
90
|
+
to: '/w/$workspaceSlug',
|
|
91
|
+
params: {
|
|
92
|
+
workspaceSlug: params.workspaceSlug
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
component: Outlet
|
|
98
|
+
});
|
|
99
|
+
const projectSettings = createRoute({
|
|
100
|
+
getParentRoute: ()=>projectLayout,
|
|
101
|
+
path: '/settings',
|
|
102
|
+
component: ()=>/*#__PURE__*/ _jsx(SettingsAnchorLayout, {
|
|
103
|
+
scope: "project",
|
|
104
|
+
title: "Project settings",
|
|
105
|
+
description: "Configure this project.",
|
|
106
|
+
settingsSections: settingsSections
|
|
107
|
+
})
|
|
74
108
|
});
|
|
75
109
|
const workspaceSettings = createRoute({
|
|
76
110
|
getParentRoute: ()=>workspaceLayout,
|
|
77
111
|
path: '/settings',
|
|
78
112
|
component: ()=>{
|
|
79
113
|
const workspace = useActiveWorkspace();
|
|
80
|
-
return /*#__PURE__*/
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
children: [
|
|
86
|
-
/*#__PURE__*/ _jsx(Header, {
|
|
87
|
-
variant: "h2",
|
|
88
|
-
children: "Workspace settings"
|
|
89
|
-
}),
|
|
90
|
-
/*#__PURE__*/ _jsxs(Text, {
|
|
91
|
-
size: "sm",
|
|
92
|
-
className: "text-foreground-neutral-muted",
|
|
93
|
-
children: [
|
|
94
|
-
"Configure ",
|
|
95
|
-
workspace.name,
|
|
96
|
-
"."
|
|
97
|
-
]
|
|
98
|
-
})
|
|
99
|
-
]
|
|
100
|
-
}),
|
|
101
|
-
/*#__PURE__*/ _jsxs("div", {
|
|
102
|
-
className: "grid grid-cols-[180px_minmax(0,1fr)] gap-32 max-[760px]:grid-cols-1",
|
|
103
|
-
children: [
|
|
104
|
-
/*#__PURE__*/ _jsx(SettingsNav, {
|
|
105
|
-
entries: settingsSections
|
|
106
|
-
}),
|
|
107
|
-
/*#__PURE__*/ _jsx(Outlet, {})
|
|
108
|
-
]
|
|
109
|
-
})
|
|
110
|
-
]
|
|
114
|
+
return /*#__PURE__*/ _jsx(SettingsAnchorLayout, {
|
|
115
|
+
scope: "workspace",
|
|
116
|
+
title: "Workspace settings",
|
|
117
|
+
description: `Configure ${workspace.name}.`,
|
|
118
|
+
settingsSections: settingsSections
|
|
111
119
|
});
|
|
112
120
|
}
|
|
113
121
|
});
|
|
@@ -116,13 +124,48 @@ export function buildAnchorSkeleton({ navigation, settingsSections }) {
|
|
|
116
124
|
root: rootRoute,
|
|
117
125
|
workspaceLayout,
|
|
118
126
|
projectLayout,
|
|
119
|
-
workspaceSettings
|
|
127
|
+
workspaceSettings,
|
|
128
|
+
projectSettings
|
|
120
129
|
},
|
|
121
130
|
rootRoute,
|
|
122
131
|
workspaceLayout,
|
|
123
132
|
projectLayout,
|
|
124
|
-
workspaceSettings
|
|
133
|
+
workspaceSettings,
|
|
134
|
+
projectSettings
|
|
125
135
|
};
|
|
126
136
|
}
|
|
137
|
+
function SettingsAnchorLayout({ scope, title, description, settingsSections }) {
|
|
138
|
+
const params = useRouteParams((input)=>scope === 'workspace' ? parseWorkspaceParams(input) : parseWorkspaceProjectParams(input));
|
|
139
|
+
if (!params.workspaceSlug || scope === 'project' && !params.projectSlug) return null;
|
|
140
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
141
|
+
className: "flex w-full flex-col gap-24",
|
|
142
|
+
children: [
|
|
143
|
+
/*#__PURE__*/ _jsxs("header", {
|
|
144
|
+
className: "flex flex-col gap-6",
|
|
145
|
+
children: [
|
|
146
|
+
/*#__PURE__*/ _jsx(Header, {
|
|
147
|
+
variant: "h2",
|
|
148
|
+
children: title
|
|
149
|
+
}),
|
|
150
|
+
/*#__PURE__*/ _jsx(Text, {
|
|
151
|
+
size: "sm",
|
|
152
|
+
className: "text-foreground-neutral-muted",
|
|
153
|
+
children: description
|
|
154
|
+
})
|
|
155
|
+
]
|
|
156
|
+
}),
|
|
157
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
158
|
+
className: "grid grid-cols-[180px_minmax(0,1fr)] gap-32 max-[760px]:grid-cols-1",
|
|
159
|
+
children: [
|
|
160
|
+
/*#__PURE__*/ _jsx(SettingsNav, {
|
|
161
|
+
entries: settingsSections,
|
|
162
|
+
scope: scope
|
|
163
|
+
}),
|
|
164
|
+
/*#__PURE__*/ _jsx(Outlet, {})
|
|
165
|
+
]
|
|
166
|
+
})
|
|
167
|
+
]
|
|
168
|
+
});
|
|
169
|
+
}
|
|
127
170
|
|
|
128
171
|
//# sourceMappingURL=anchors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/anchors.tsx"],"sourcesContent":["import {ShipfoxLoader} from '@shipfox/react-ui/loader';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {createRootRouteWithContext, createRoute, Outlet, redirect} from '@tanstack/react-router';\nimport {MainLayout} from '#components/main-layout.js';\nimport {NotFoundPage} from '#components/not-found-page.js';\nimport {SettingsNav} from '#components/settings-nav.js';\nimport type {NavTabEntry, SettingsSectionEntry} from '#contract.js';\nimport {useActiveWorkspace, useMaybeActiveWorkspace} from './active-workspace.js';\nimport {anchorPaths} from './anchor-paths.js';\nimport {useChrome} from './chrome-context.js';\nimport {rememberLastWorkspaceId} from './last-workspace.js';\nimport type {RouterContext} from './router-context.js';\nimport {\n WorkspaceLayoutErrorRoute,\n WorkspaceSetupPending,\n WorkspaceUnavailablePage,\n} from './workspace-setup.js';\n\nexport {routePathForAnchor} from './anchor-paths.js';\n\nexport function buildAnchorSkeleton({\n navigation,\n settingsSections,\n}: {\n navigation: readonly NavTabEntry[];\n settingsSections: readonly SettingsSectionEntry[];\n}) {\n const rootRoute = createRootRouteWithContext<RouterContext>()({\n component: Outlet,\n notFoundComponent: NotFoundPage,\n });\n const workspaceLayout = createRoute({\n getParentRoute: () => rootRoute,\n path: anchorPaths.workspaceLayout,\n beforeLoad: async ({context, params, location}) => {\n const auth = context.auth;\n if (!auth || auth.isLoading || !context.queryClient) return;\n if (!auth.isAuthenticated)\n throw redirect({to: '/auth/login' as never, search: {redirect: location.href} as never});\n if (!auth.workspaces.some((workspace) => workspace.id === params.wid))\n throw redirect({to: '/'});\n try {\n if (auth.user?.id) rememberLastWorkspaceId(auth.user.id, params.wid);\n } catch {\n // Local storage is best effort.\n }\n if (!context.workspaceSetup)\n throw new Error('Client composition includes workspace routes but no workspaceSetup gate.');\n return await context.workspaceSetup({\n queryClient: context.queryClient,\n workspaceId: params.wid,\n pathname: location.pathname,\n });\n },\n pendingComponent: () => (\n <div className=\"flex h-screen items-center justify-center\">\n <ShipfoxLoader size={64} animation=\"circular\" color=\"orange\" background=\"dark\" />\n </div>\n ),\n errorComponent: WorkspaceLayoutErrorRoute,\n component: () => {\n const setupState = workspaceLayout.useRouteContext() as {\n hideProjectNavigation?: boolean;\n unavailable?: boolean;\n };\n const workspace = useMaybeActiveWorkspace();\n return setupState.hideProjectNavigation === undefined ? (\n <WorkspaceSetupPending />\n ) : setupState.unavailable ? (\n <WorkspaceUnavailablePage workspaceName={workspace?.name} />\n ) : (\n <MainLayout\n navigation={navigation}\n hideProjectNavigation={setupState.hideProjectNavigation}\n />\n );\n },\n });\n const projectLayout = createRoute({\n getParentRoute: () => workspaceLayout,\n path: '/projects/$pid',\n component: () => {\n const {ProjectLayoutGuard} = useChrome();\n return <ProjectLayoutGuard />;\n },\n });\n const workspaceSettings = createRoute({\n getParentRoute: () => workspaceLayout,\n path: '/settings',\n component: () => {\n const workspace = useActiveWorkspace();\n return (\n <div className=\"flex w-full flex-col gap-24\">\n <header className=\"flex flex-col gap-6\">\n <Header variant=\"h2\">Workspace settings</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Configure {workspace.name}.\n </Text>\n </header>\n\n <div className=\"grid grid-cols-[180px_minmax(0,1fr)] gap-32 max-[760px]:grid-cols-1\">\n <SettingsNav entries={settingsSections} />\n <Outlet />\n </div>\n </div>\n );\n },\n });\n return {\n anchors: {root: rootRoute, workspaceLayout, projectLayout, workspaceSettings},\n rootRoute,\n workspaceLayout,\n projectLayout,\n workspaceSettings,\n };\n}\n"],"names":["ShipfoxLoader","Header","Text","createRootRouteWithContext","createRoute","Outlet","redirect","MainLayout","NotFoundPage","SettingsNav","useActiveWorkspace","useMaybeActiveWorkspace","anchorPaths","useChrome","rememberLastWorkspaceId","WorkspaceLayoutErrorRoute","WorkspaceSetupPending","WorkspaceUnavailablePage","routePathForAnchor","buildAnchorSkeleton","navigation","settingsSections","rootRoute","component","notFoundComponent","workspaceLayout","getParentRoute","path","beforeLoad","context","params","location","auth","isLoading","queryClient","isAuthenticated","to","search","href","workspaces","some","workspace","id","wid","user","workspaceSetup","Error","workspaceId","pathname","pendingComponent","div","className","size","animation","color","background","errorComponent","setupState","useRouteContext","hideProjectNavigation","undefined","unavailable","workspaceName","name","projectLayout","ProjectLayoutGuard","workspaceSettings","header","variant","entries","anchors","root"],"mappings":";AAAA,SAAQA,aAAa,QAAO,2BAA2B;AACvD,SAAQC,MAAM,EAAEC,IAAI,QAAO,+BAA+B;AAC1D,SAAQC,0BAA0B,EAAEC,WAAW,EAAEC,MAAM,EAAEC,QAAQ,QAAO,yBAAyB;AACjG,SAAQC,UAAU,QAAO,6BAA6B;AACtD,SAAQC,YAAY,QAAO,gCAAgC;AAC3D,SAAQC,WAAW,QAAO,8BAA8B;AAExD,SAAQC,kBAAkB,EAAEC,uBAAuB,QAAO,wBAAwB;AAClF,SAAQC,WAAW,QAAO,oBAAoB;AAC9C,SAAQC,SAAS,QAAO,sBAAsB;AAC9C,SAAQC,uBAAuB,QAAO,sBAAsB;AAE5D,SACEC,yBAAyB,EACzBC,qBAAqB,EACrBC,wBAAwB,QACnB,uBAAuB;AAE9B,SAAQC,kBAAkB,QAAO,oBAAoB;AAErD,OAAO,SAASC,oBAAoB,EAClCC,UAAU,EACVC,gBAAgB,EAIjB;IACC,MAAMC,YAAYnB,6BAA4C;QAC5DoB,WAAWlB;QACXmB,mBAAmBhB;IACrB;IACA,MAAMiB,kBAAkBrB,YAAY;QAClCsB,gBAAgB,IAAMJ;QACtBK,MAAMf,YAAYa,eAAe;QACjCG,YAAY,OAAO,EAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAC;YAC5C,MAAMC,OAAOH,QAAQG,IAAI;YACzB,IAAI,CAACA,QAAQA,KAAKC,SAAS,IAAI,CAACJ,QAAQK,WAAW,EAAE;YACrD,IAAI,CAACF,KAAKG,eAAe,EACvB,MAAM7B,SAAS;gBAAC8B,IAAI;gBAAwBC,QAAQ;oBAAC/B,UAAUyB,SAASO,IAAI;gBAAA;YAAU;YACxF,IAAI,CAACN,KAAKO,UAAU,CAACC,IAAI,CAAC,CAACC,YAAcA,UAAUC,EAAE,KAAKZ,OAAOa,GAAG,GAClE,MAAMrC,SAAS;gBAAC8B,IAAI;YAAG;YACzB,IAAI;gBACF,IAAIJ,KAAKY,IAAI,EAAEF,IAAI5B,wBAAwBkB,KAAKY,IAAI,CAACF,EAAE,EAAEZ,OAAOa,GAAG;YACrE,EAAE,OAAM;YACN,gCAAgC;YAClC;YACA,IAAI,CAACd,QAAQgB,cAAc,EACzB,MAAM,IAAIC,MAAM;YAClB,OAAO,MAAMjB,QAAQgB,cAAc,CAAC;gBAClCX,aAAaL,QAAQK,WAAW;gBAChCa,aAAajB,OAAOa,GAAG;gBACvBK,UAAUjB,SAASiB,QAAQ;YAC7B;QACF;QACAC,kBAAkB,kBAChB,KAACC;gBAAIC,WAAU;0BACb,cAAA,KAACnD;oBAAcoD,MAAM;oBAAIC,WAAU;oBAAWC,OAAM;oBAASC,YAAW;;;QAG5EC,gBAAgBzC;QAChBQ,WAAW;YACT,MAAMkC,aAAahC,gBAAgBiC,eAAe;YAIlD,MAAMjB,YAAY9B;YAClB,OAAO8C,WAAWE,qBAAqB,KAAKC,0BAC1C,KAAC5C,6BACCyC,WAAWI,WAAW,iBACxB,KAAC5C;gBAAyB6C,eAAerB,WAAWsB;+BAEpD,KAACxD;gBACCa,YAAYA;gBACZuC,uBAAuBF,WAAWE,qBAAqB;;QAG7D;IACF;IACA,MAAMK,gBAAgB5D,YAAY;QAChCsB,gBAAgB,IAAMD;QACtBE,MAAM;QACNJ,WAAW;YACT,MAAM,EAAC0C,kBAAkB,EAAC,GAAGpD;YAC7B,qBAAO,KAACoD;QACV;IACF;IACA,MAAMC,oBAAoB9D,YAAY;QACpCsB,gBAAgB,IAAMD;QACtBE,MAAM;QACNJ,WAAW;YACT,MAAMkB,YAAY/B;YAClB,qBACE,MAACwC;gBAAIC,WAAU;;kCACb,MAACgB;wBAAOhB,WAAU;;0CAChB,KAAClD;gCAAOmE,SAAQ;0CAAK;;0CACrB,MAAClE;gCAAKkD,MAAK;gCAAKD,WAAU;;oCAAgC;oCAC7CV,UAAUsB,IAAI;oCAAC;;;;;kCAI9B,MAACb;wBAAIC,WAAU;;0CACb,KAAC1C;gCAAY4D,SAAShD;;0CACtB,KAAChB;;;;;QAIT;IACF;IACA,OAAO;QACLiE,SAAS;YAACC,MAAMjD;YAAWG;YAAiBuC;YAAeE;QAAiB;QAC5E5C;QACAG;QACAuC;QACAE;IACF;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/anchors.tsx"],"sourcesContent":["import {ShipfoxLoader} from '@shipfox/react-ui/loader';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {createRootRouteWithContext, createRoute, Outlet, redirect} from '@tanstack/react-router';\nimport {MainLayout} from '#components/main-layout.js';\nimport {NotFoundPage} from '#components/not-found-page.js';\nimport {SettingsNav} from '#components/settings-nav.js';\nimport type {NavTabEntry, SettingsSectionEntry} from '#contract.js';\nimport {useActiveWorkspace, useMaybeActiveWorkspace} from './active-workspace.js';\nimport {anchorPaths} from './anchor-paths.js';\nimport {rememberLastWorkspaceId} from './last-workspace.js';\nimport {parseWorkspaceParams, parseWorkspaceProjectParams, useRouteParams} from './route-inputs.js';\nimport type {RouterContext} from './router-context.js';\nimport type {WorkspaceSetupState} from './workspace-setup.js';\nimport {\n WorkspaceLayoutErrorRoute,\n WorkspaceSetupPending,\n WorkspaceUnavailablePage,\n} from './workspace-setup.js';\n\nexport {routePathForAnchor} from './anchor-paths.js';\n\nexport function buildAnchorSkeleton({\n navigation,\n settingsSections,\n}: {\n navigation: readonly NavTabEntry[];\n settingsSections: readonly SettingsSectionEntry[];\n}) {\n const rootRoute = createRootRouteWithContext<RouterContext>()({\n component: Outlet,\n notFoundComponent: NotFoundPage,\n });\n const workspaceLayout = createRoute({\n getParentRoute: () => rootRoute,\n path: anchorPaths.workspaceLayout,\n beforeLoad: async ({context, params, location}) => {\n const auth = context.auth;\n if (!auth || auth.isLoading || !context.queryClient) return;\n if (!auth.isAuthenticated)\n throw redirect({to: '/auth/login' as never, search: {redirect: location.href} as never});\n const workspace = auth.workspaces.find(\n (candidate) => candidate.slug === params.workspaceSlug,\n );\n if (!workspace) throw redirect({to: '/'});\n try {\n if (auth.user?.id) rememberLastWorkspaceId(auth.user.id, workspace.id);\n } catch {\n // Local storage is best effort.\n }\n if (!context.workspaceSetup)\n throw new Error('Client composition includes workspace routes but no workspaceSetup gate.');\n return await context.workspaceSetup({\n queryClient: context.queryClient,\n workspaceId: workspace.id,\n workspaceSlug: params.workspaceSlug,\n pathname: location.pathname,\n });\n },\n pendingComponent: () => (\n <div className=\"flex h-screen items-center justify-center\">\n <ShipfoxLoader size={64} animation=\"circular\" color=\"orange\" background=\"dark\" />\n </div>\n ),\n errorComponent: WorkspaceLayoutErrorRoute,\n component: () => {\n const setupState = workspaceLayout.useRouteContext() as {\n hideProjectNavigation?: boolean;\n unavailable?: boolean;\n };\n const workspace = useMaybeActiveWorkspace();\n return setupState.hideProjectNavigation === undefined ? (\n <WorkspaceSetupPending />\n ) : setupState.unavailable ? (\n <WorkspaceUnavailablePage workspaceName={workspace?.name} />\n ) : (\n <MainLayout\n navigation={navigation}\n hideProjectNavigation={setupState.hideProjectNavigation}\n />\n );\n },\n });\n const projectLayout = createRoute({\n getParentRoute: () => workspaceLayout,\n path: '/p/$projectSlug',\n beforeLoad: async ({context, params}) => {\n const auth = context.auth;\n if (!auth || auth.isLoading || !context.queryClient) return;\n if ((context as RouterContext & Partial<WorkspaceSetupState>).unavailable) return;\n const workspace = auth.workspaces.find(\n (candidate) => candidate.slug === params.workspaceSlug,\n );\n if (!workspace) throw redirect({to: '/'});\n if (!context.projectSlugResolver) {\n throw new Error('Client composition includes project routes but no project slug resolver.');\n }\n const projectId = await context.projectSlugResolver({\n queryClient: context.queryClient,\n workspaceId: workspace.id,\n projectSlug: params.projectSlug,\n });\n if (!projectId) {\n throw redirect({\n to: '/w/$workspaceSlug',\n params: {workspaceSlug: params.workspaceSlug},\n });\n }\n },\n component: Outlet,\n });\n const projectSettings = createRoute({\n getParentRoute: () => projectLayout,\n path: '/settings',\n component: () => (\n <SettingsAnchorLayout\n scope=\"project\"\n title=\"Project settings\"\n description=\"Configure this project.\"\n settingsSections={settingsSections}\n />\n ),\n });\n const workspaceSettings = createRoute({\n getParentRoute: () => workspaceLayout,\n path: '/settings',\n component: () => {\n const workspace = useActiveWorkspace();\n return (\n <SettingsAnchorLayout\n scope=\"workspace\"\n title=\"Workspace settings\"\n description={`Configure ${workspace.name}.`}\n settingsSections={settingsSections}\n />\n );\n },\n });\n return {\n anchors: {root: rootRoute, workspaceLayout, projectLayout, workspaceSettings, projectSettings},\n rootRoute,\n workspaceLayout,\n projectLayout,\n workspaceSettings,\n projectSettings,\n };\n}\n\nfunction SettingsAnchorLayout({\n scope,\n title,\n description,\n settingsSections,\n}: {\n scope: 'workspace' | 'project';\n title: string;\n description: string;\n settingsSections: readonly SettingsSectionEntry[];\n}) {\n const params = useRouteParams((input): {workspaceSlug?: string; projectSlug?: string} =>\n scope === 'workspace' ? parseWorkspaceParams(input) : parseWorkspaceProjectParams(input),\n );\n if (!params.workspaceSlug || (scope === 'project' && !params.projectSlug)) return null;\n\n return (\n <div className=\"flex w-full flex-col gap-24\">\n <header className=\"flex flex-col gap-6\">\n <Header variant=\"h2\">{title}</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {description}\n </Text>\n </header>\n\n <div className=\"grid grid-cols-[180px_minmax(0,1fr)] gap-32 max-[760px]:grid-cols-1\">\n <SettingsNav entries={settingsSections} scope={scope} />\n <Outlet />\n </div>\n </div>\n );\n}\n"],"names":["ShipfoxLoader","Header","Text","createRootRouteWithContext","createRoute","Outlet","redirect","MainLayout","NotFoundPage","SettingsNav","useActiveWorkspace","useMaybeActiveWorkspace","anchorPaths","rememberLastWorkspaceId","parseWorkspaceParams","parseWorkspaceProjectParams","useRouteParams","WorkspaceLayoutErrorRoute","WorkspaceSetupPending","WorkspaceUnavailablePage","routePathForAnchor","buildAnchorSkeleton","navigation","settingsSections","rootRoute","component","notFoundComponent","workspaceLayout","getParentRoute","path","beforeLoad","context","params","location","auth","isLoading","queryClient","isAuthenticated","to","search","href","workspace","workspaces","find","candidate","slug","workspaceSlug","user","id","workspaceSetup","Error","workspaceId","pathname","pendingComponent","div","className","size","animation","color","background","errorComponent","setupState","useRouteContext","hideProjectNavigation","undefined","unavailable","workspaceName","name","projectLayout","projectSlugResolver","projectId","projectSlug","projectSettings","SettingsAnchorLayout","scope","title","description","workspaceSettings","anchors","root","input","header","variant","entries"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assemble-route-tree.d.ts","sourceRoot":"","sources":["../../src/runtime/assemble-route-tree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAE,aAAa,EAAC,MAAM,4BAA4B,CAAC;AAG9E,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAExD,MAAM,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"assemble-route-tree.d.ts","sourceRoot":"","sources":["../../src/runtime/assemble-route-tree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAE,aAAa,EAAC,MAAM,4BAA4B,CAAC;AAG9E,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAExD,MAAM,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAwCrF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACpE,gBAAgB,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;CACjF,4SAoFF"}
|
|
@@ -5,7 +5,8 @@ const shellAnchors = [
|
|
|
5
5
|
'root',
|
|
6
6
|
'workspaceLayout',
|
|
7
7
|
'projectLayout',
|
|
8
|
-
'workspaceSettings'
|
|
8
|
+
'workspaceSettings',
|
|
9
|
+
'projectSettings'
|
|
9
10
|
];
|
|
10
11
|
function isShellAnchor(parent) {
|
|
11
12
|
return shellAnchors.includes(parent);
|
|
@@ -85,7 +86,11 @@ export async function assembleRouteTree(routes, options) {
|
|
|
85
86
|
...routeChildrenFor(parent),
|
|
86
87
|
...layouts.filter((layout)=>layout.parent === parent).map((layout)=>layoutTree(layout.id))
|
|
87
88
|
];
|
|
88
|
-
const
|
|
89
|
+
const projectSettings = skeleton.projectSettings.addChildren(childrenFor('projectSettings'));
|
|
90
|
+
const projectLayout = skeleton.projectLayout.addChildren([
|
|
91
|
+
...childrenFor('projectLayout'),
|
|
92
|
+
projectSettings
|
|
93
|
+
]);
|
|
89
94
|
const workspaceSettings = skeleton.workspaceSettings.addChildren(childrenFor('workspaceSettings'));
|
|
90
95
|
const workspaceLayout = skeleton.workspaceLayout.addChildren([
|
|
91
96
|
...childrenFor('workspaceLayout'),
|