@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.
Files changed (73) hide show
  1. package/dist/components/main-layout.js +2 -2
  2. package/dist/components/main-layout.js.map +1 -1
  3. package/dist/components/nav-tabs.d.ts.map +1 -1
  4. package/dist/components/nav-tabs.js +5 -4
  5. package/dist/components/nav-tabs.js.map +1 -1
  6. package/dist/components/settings-nav.d.ts +2 -1
  7. package/dist/components/settings-nav.d.ts.map +1 -1
  8. package/dist/components/settings-nav.js +17 -13
  9. package/dist/components/settings-nav.js.map +1 -1
  10. package/dist/components/workspace-crumb.js +2 -2
  11. package/dist/components/workspace-crumb.js.map +1 -1
  12. package/dist/components/workspace-switcher.d.ts.map +1 -1
  13. package/dist/components/workspace-switcher.js +4 -2
  14. package/dist/components/workspace-switcher.js.map +1 -1
  15. package/dist/compose/compose-routes.d.ts.map +1 -1
  16. package/dist/compose/compose-routes.js +4 -1
  17. package/dist/compose/compose-routes.js.map +1 -1
  18. package/dist/compose/validate-registries.d.ts.map +1 -1
  19. package/dist/compose/validate-registries.js +1 -1
  20. package/dist/compose/validate-registries.js.map +1 -1
  21. package/dist/contract.d.ts +2 -1
  22. package/dist/contract.d.ts.map +1 -1
  23. package/dist/contract.js.map +1 -1
  24. package/dist/core/session.d.ts +1 -0
  25. package/dist/core/session.d.ts.map +1 -1
  26. package/dist/core/session.js.map +1 -1
  27. package/dist/hooks/api/session-auth.d.ts.map +1 -1
  28. package/dist/hooks/api/session-auth.js +1 -0
  29. package/dist/hooks/api/session-auth.js.map +1 -1
  30. package/dist/runtime/active-workspace.js +3 -3
  31. package/dist/runtime/active-workspace.js.map +1 -1
  32. package/dist/runtime/anchor-paths.d.ts +14 -4
  33. package/dist/runtime/anchor-paths.d.ts.map +1 -1
  34. package/dist/runtime/anchor-paths.js +57 -4
  35. package/dist/runtime/anchor-paths.js.map +1 -1
  36. package/dist/runtime/anchors.d.ts +9 -6
  37. package/dist/runtime/anchors.d.ts.map +1 -1
  38. package/dist/runtime/anchors.js +85 -42
  39. package/dist/runtime/anchors.js.map +1 -1
  40. package/dist/runtime/assemble-route-tree.d.ts.map +1 -1
  41. package/dist/runtime/assemble-route-tree.js +7 -2
  42. package/dist/runtime/assemble-route-tree.js.map +1 -1
  43. package/dist/runtime/chrome-context.d.ts +2 -1
  44. package/dist/runtime/chrome-context.d.ts.map +1 -1
  45. package/dist/runtime/chrome-context.js.map +1 -1
  46. package/dist/runtime/compose-client-app.d.ts.map +1 -1
  47. package/dist/runtime/compose-client-app.js +5 -3
  48. package/dist/runtime/compose-client-app.js.map +1 -1
  49. package/dist/runtime/index.d.ts +1 -0
  50. package/dist/runtime/index.d.ts.map +1 -1
  51. package/dist/runtime/index.js +1 -0
  52. package/dist/runtime/index.js.map +1 -1
  53. package/dist/runtime/registries.js +4 -1
  54. package/dist/runtime/registries.js.map +1 -1
  55. package/dist/runtime/route-inputs.d.ts +3 -3
  56. package/dist/runtime/route-inputs.d.ts.map +1 -1
  57. package/dist/runtime/route-inputs.js +9 -9
  58. package/dist/runtime/route-inputs.js.map +1 -1
  59. package/dist/runtime/router-context.d.ts +7 -0
  60. package/dist/runtime/router-context.d.ts.map +1 -1
  61. package/dist/runtime/router-context.js.map +1 -1
  62. package/dist/runtime/search-serialization.d.ts +26 -0
  63. package/dist/runtime/search-serialization.d.ts.map +1 -0
  64. package/dist/runtime/search-serialization.js +78 -0
  65. package/dist/runtime/search-serialization.js.map +1 -0
  66. package/dist/runtime/workspace-setup.d.ts +1 -0
  67. package/dist/runtime/workspace-setup.d.ts.map +1 -1
  68. package/dist/runtime/workspace-setup.js.map +1 -1
  69. package/dist/tsconfig.test.tsbuildinfo +1 -1
  70. package/dist/vite/generate.d.ts.map +1 -1
  71. package/dist/vite/generate.js +12 -3
  72. package/dist/vite/generate.js.map +1 -1
  73. 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,cAAcL,WAAWC,EAAE;gBAC3BK,QAAQN,WAAWO,gBAAgB;YACrC,CAAA;IACF;AACF;AAEA,OAAO,SAASC;IACd,OAAOpB,aAAa;QAClBqB,UAAUnB;QACVoB,SAAS,CAAC,EAAChB,MAAM,EAAC,GAAKiB,4BAA4BjB;QACnDkB,OAAO;QACPC,WAAW;IACb;AACF;AAEA,OAAO,SAASC,2BAA2BrB,KAAc;IACvD,OAAOL,aAAa;QAClBqB,UAAUlB;QACVmB,SAAS,CAAC,EAAChB,MAAM,EAAC,GAAKF,mBAAmBC,OAAOC;QACjDkB,OAAO;QACPC,WAAW;IACb;AACF;AAEA,OAAO,eAAeF,4BACpBjB,MAAoB;IAEpB,MAAMC,WAAW,MAAMR,kBAAkBF,qBAAqB,iBAAiB;QAC7E8B,QAAQ;QACRrB;IACF;IACA,OAAOL,uBAAuBM;AAChC"}
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 /workspaces/$wid route');
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 { wid } = useRouteParams(parseWorkspaceParams);
10
- return useAuthState().workspaces.find((workspace)=>workspace.id === wid);
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 /workspaces/$wid route');\n return workspace;\n}\n\nexport function useMaybeActiveWorkspace(): Workspace | undefined {\n const {wid} = useRouteParams(parseWorkspaceParams);\n return useAuthState().workspaces.find((workspace) => workspace.id === wid);\n}\n"],"names":["useAuthState","parseWorkspaceParams","useRouteParams","useActiveWorkspace","workspace","useMaybeActiveWorkspace","Error","wid","workspaces","find","id"],"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,GAAG,EAAC,GAAGL,eAAeD;IAC7B,OAAOD,eAAeQ,UAAU,CAACC,IAAI,CAAC,CAACL,YAAcA,UAAUM,EAAE,KAAKH;AACxE"}
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: "/workspaces/$wid";
5
- readonly projectLayout: "/workspaces/$wid/projects/$pid";
6
- readonly workspaceSettings: "/workspaces/$wid/settings";
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
- export { anchorPaths };
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;;;;;CAKP,CAAC;AAEX,OAAO,EAAC,WAAW,EAAC,CAAC;AAErB,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
+ {"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: '/workspaces/$wid',
5
- projectLayout: '/workspaces/$wid/projects/$pid',
6
- workspaceSettings: '/workspaces/$wid/settings'
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
- export { anchorPaths };
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: '/workspaces/$wid',\n projectLayout: '/workspaces/$wid/projects/$pid',\n workspaceSettings: '/workspaces/$wid/settings',\n} as const;\n\nexport {anchorPaths};\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","routePathForAnchor","anchor","fullPath","anchorPath","startsWith","Error","slice","length","routePathForParent","parent","layoutPaths","Map","normalizedPath","parentPath","Object","hasOwn","get","parentKind"],"mappings":"AAAA,SAAQA,kBAAkB,QAAO,mCAAmC;AAGpE,MAAMC,cAAc;IAClBC,MAAM;IACNC,iBAAiB;IACjBC,eAAe;IACfC,mBAAmB;AACrB;AAEA,SAAQJ,WAAW,GAAE;AAErB,OAAO,SAASK,mBAAmBC,MAAgC,EAAEC,QAAgB;IACnF,MAAMC,aAAaR,WAAW,CAACM,OAAO;IACtC,IAAIA,WAAW,QAAQ,OAAOC;IAC9B,IAAIA,aAAaC,YAAY,OAAO;IACpC,IAAI,CAACD,SAASE,UAAU,CAAC,GAAGD,WAAW,CAAC,CAAC,GAAG;QAC1C,MAAM,IAAIE,MAAM,CAAC,OAAO,EAAEH,SAAS,+BAA+B,EAAED,OAAO,GAAG,EAAEE,WAAW,EAAE,CAAC;IAChG;IACA,OAAOD,SAASI,KAAK,CAACH,WAAWI,MAAM;AACzC;AAEA,OAAO,SAASC,mBACdC,MAAqB,EACrBP,QAAgB,EAChBQ,cAA2C,IAAIC,KAAK;IAEpD,MAAMC,iBAAiBlB,mBAAmBQ;IAC1C,MAAMW,aAAaC,OAAOC,MAAM,CAACpB,aAAac,UAC1Cd,WAAW,CAACc,OAAmC,GAC/CC,YAAYM,GAAG,CAACP;IACpB,IAAI,CAACI,YAAY;QACf,MAAM,IAAIR,MAAM,CAAC,OAAO,EAAEO,eAAe,iCAAiC,EAAEH,OAAO,EAAE,CAAC;IACxF;IACA,IAAII,eAAe,KAAK,OAAOD;IAC/B,IAAIA,mBAAmBC,YAAY,OAAO;IAC1C,IAAIA,eAAe,OAAO,CAACD,eAAeR,UAAU,CAAC,GAAGS,WAAW,CAAC,CAAC,GAAG;QACtE,MAAMI,aAAaH,OAAOC,MAAM,CAACpB,aAAac,UAAU,WAAW;QACnE,MAAM,IAAIJ,MACR,CAAC,OAAO,EAAEO,eAAe,uBAAuB,EAAEK,WAAW,EAAE,EAAER,OAAO,GAAG,EAAEI,WAAW,EAAE,CAAC;IAE/F;IACA,OAAOD,eAAeN,KAAK,CAACO,WAAWN,MAAM;AAC/C"}
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>, "/workspaces/$wid", "/workspaces/$wid", string, "/workspaces/$wid", undefined, import("@tanstack/router-core").ResolveParams<"/workspaces/$wid">, 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<"/workspaces/$wid">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/workspaces/$wid", unknown, undefined>) => Promise<import("./workspace-setup.js").WorkspaceSetupState | undefined>, {}, 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>, "/workspaces/$wid", "/workspaces/$wid", string, "/workspaces/$wid", undefined, import("@tanstack/router-core").ResolveParams<"/workspaces/$wid">, 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<"/workspaces/$wid">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/workspaces/$wid", unknown, undefined>) => Promise<import("./workspace-setup.js").WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/projects/$pid", "/workspaces/$wid/projects/$pid", string, "/workspaces/$wid/projects/$pid", undefined, import("@tanstack/router-core").ResolveParams<"/projects/$pid">, import("@tanstack/router-core").AnyContext, 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>, "/workspaces/$wid", "/workspaces/$wid", string, "/workspaces/$wid", undefined, import("@tanstack/router-core").ResolveParams<"/workspaces/$wid">, 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<"/workspaces/$wid">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/workspaces/$wid", unknown, undefined>) => Promise<import("./workspace-setup.js").WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/settings", "/workspaces/$wid/settings", string, "/workspaces/$wid/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>;
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>, "/workspaces/$wid", "/workspaces/$wid", string, "/workspaces/$wid", undefined, import("@tanstack/router-core").ResolveParams<"/workspaces/$wid">, 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<"/workspaces/$wid">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/workspaces/$wid", unknown, undefined>) => Promise<import("./workspace-setup.js").WorkspaceSetupState | undefined>, {}, 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>, "/workspaces/$wid", "/workspaces/$wid", string, "/workspaces/$wid", undefined, import("@tanstack/router-core").ResolveParams<"/workspaces/$wid">, 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<"/workspaces/$wid">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/workspaces/$wid", unknown, undefined>) => Promise<import("./workspace-setup.js").WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/projects/$pid", "/workspaces/$wid/projects/$pid", string, "/workspaces/$wid/projects/$pid", undefined, import("@tanstack/router-core").ResolveParams<"/projects/$pid">, import("@tanstack/router-core").AnyContext, 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>, "/workspaces/$wid", "/workspaces/$wid", string, "/workspaces/$wid", undefined, import("@tanstack/router-core").ResolveParams<"/workspaces/$wid">, 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<"/workspaces/$wid">, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, "/workspaces/$wid", unknown, undefined>) => Promise<import("./workspace-setup.js").WorkspaceSetupState | undefined>, {}, undefined, unknown, unknown, unknown, unknown, undefined>, "/settings", "/workspaces/$wid/settings", string, "/workspaces/$wid/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>;
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;AAOvD,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;;;;;;;;;;;EAyFA"}
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"}
@@ -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
- if (!auth.workspaces.some((workspace)=>workspace.id === params.wid)) throw redirect({
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, params.wid);
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: params.wid,
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: '/projects/$pid',
70
- component: ()=>{
71
- const { ProjectLayoutGuard } = useChrome();
72
- return /*#__PURE__*/ _jsx(ProjectLayoutGuard, {});
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__*/ _jsxs("div", {
81
- className: "flex w-full flex-col gap-24",
82
- children: [
83
- /*#__PURE__*/ _jsxs("header", {
84
- className: "flex flex-col gap-6",
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":"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"}
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;AAkCrF,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,4SA8EF"}
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 projectLayout = skeleton.projectLayout.addChildren(childrenFor('projectLayout'));
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'),