@shipfox/client-shell 12.0.2 → 13.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 (70) 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/settings-nav.d.ts +2 -1
  4. package/dist/components/settings-nav.d.ts.map +1 -1
  5. package/dist/components/settings-nav.js +17 -13
  6. package/dist/components/settings-nav.js.map +1 -1
  7. package/dist/components/workspace-crumb.js +2 -2
  8. package/dist/components/workspace-crumb.js.map +1 -1
  9. package/dist/components/workspace-switcher.d.ts.map +1 -1
  10. package/dist/components/workspace-switcher.js +4 -2
  11. package/dist/components/workspace-switcher.js.map +1 -1
  12. package/dist/compose/compose-routes.d.ts.map +1 -1
  13. package/dist/compose/compose-routes.js +4 -1
  14. package/dist/compose/compose-routes.js.map +1 -1
  15. package/dist/compose/validate-registries.d.ts.map +1 -1
  16. package/dist/compose/validate-registries.js +1 -1
  17. package/dist/compose/validate-registries.js.map +1 -1
  18. package/dist/contract.d.ts +2 -1
  19. package/dist/contract.d.ts.map +1 -1
  20. package/dist/contract.js.map +1 -1
  21. package/dist/core/session.d.ts +1 -0
  22. package/dist/core/session.d.ts.map +1 -1
  23. package/dist/core/session.js.map +1 -1
  24. package/dist/hooks/api/session-auth.d.ts.map +1 -1
  25. package/dist/hooks/api/session-auth.js +1 -0
  26. package/dist/hooks/api/session-auth.js.map +1 -1
  27. package/dist/runtime/active-workspace.js +3 -3
  28. package/dist/runtime/active-workspace.js.map +1 -1
  29. package/dist/runtime/anchor-paths.d.ts +14 -4
  30. package/dist/runtime/anchor-paths.d.ts.map +1 -1
  31. package/dist/runtime/anchor-paths.js +57 -4
  32. package/dist/runtime/anchor-paths.js.map +1 -1
  33. package/dist/runtime/anchors.d.ts +9 -6
  34. package/dist/runtime/anchors.d.ts.map +1 -1
  35. package/dist/runtime/anchors.js +85 -42
  36. package/dist/runtime/anchors.js.map +1 -1
  37. package/dist/runtime/assemble-route-tree.d.ts.map +1 -1
  38. package/dist/runtime/assemble-route-tree.js +7 -2
  39. package/dist/runtime/assemble-route-tree.js.map +1 -1
  40. package/dist/runtime/chrome-context.d.ts +2 -1
  41. package/dist/runtime/chrome-context.d.ts.map +1 -1
  42. package/dist/runtime/chrome-context.js.map +1 -1
  43. package/dist/runtime/compose-client-app.d.ts.map +1 -1
  44. package/dist/runtime/compose-client-app.js +5 -3
  45. package/dist/runtime/compose-client-app.js.map +1 -1
  46. package/dist/runtime/index.d.ts +1 -0
  47. package/dist/runtime/index.d.ts.map +1 -1
  48. package/dist/runtime/index.js +1 -0
  49. package/dist/runtime/index.js.map +1 -1
  50. package/dist/runtime/registries.js +4 -1
  51. package/dist/runtime/registries.js.map +1 -1
  52. package/dist/runtime/route-inputs.d.ts +3 -3
  53. package/dist/runtime/route-inputs.d.ts.map +1 -1
  54. package/dist/runtime/route-inputs.js +9 -9
  55. package/dist/runtime/route-inputs.js.map +1 -1
  56. package/dist/runtime/router-context.d.ts +7 -0
  57. package/dist/runtime/router-context.d.ts.map +1 -1
  58. package/dist/runtime/router-context.js.map +1 -1
  59. package/dist/runtime/search-serialization.d.ts +26 -0
  60. package/dist/runtime/search-serialization.d.ts.map +1 -0
  61. package/dist/runtime/search-serialization.js +78 -0
  62. package/dist/runtime/search-serialization.js.map +1 -0
  63. package/dist/runtime/workspace-setup.d.ts +1 -0
  64. package/dist/runtime/workspace-setup.d.ts.map +1 -1
  65. package/dist/runtime/workspace-setup.js.map +1 -1
  66. package/dist/tsconfig.test.tsbuildinfo +1 -1
  67. package/dist/vite/generate.d.ts.map +1 -1
  68. package/dist/vite/generate.js +12 -3
  69. package/dist/vite/generate.js.map +1 -1
  70. package/package.json +6 -6
@@ -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'),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/assemble-route-tree.ts"],"sourcesContent":["import {type AnyRoute, createRoute} from '@tanstack/react-router';\nimport type {ComposedLayout, ComposedRoute} from '#compose/compose-routes.js';\nimport type {RouteParentId} from '#contract.js';\nimport {routePathForParent} from '#runtime/anchor-paths.js';\nimport {buildAnchorSkeleton} from '#runtime/anchors.js';\nimport type {RouteImpl} from '#runtime/define-route.js';\n\nexport type ResolveRouteImpl = (specifier: string) => RouteImpl | Promise<RouteImpl>;\n\nconst shellAnchors = ['root', 'workspaceLayout', 'projectLayout', 'workspaceSettings'] as const;\n\nfunction isShellAnchor(parent: RouteParentId): parent is (typeof shellAnchors)[number] {\n return shellAnchors.includes(parent as (typeof shellAnchors)[number]);\n}\n\nfunction orderLayouts(layouts: readonly ComposedLayout[]): ComposedLayout[] {\n const byId = new Map(layouts.map((layout) => [layout.id, layout]));\n const ordered: ComposedLayout[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n function visit(layout: ComposedLayout): void {\n if (visited.has(layout.id)) return;\n if (!isShellAnchor(layout.parent)) {\n if (visiting.has(layout.id))\n throw new Error(`Layout \"${layout.id}\" has a cyclic parent reference.`);\n const parent = byId.get(layout.parent);\n if (!parent)\n throw new Error(`Layout \"${layout.id}\" targets missing parent \"${layout.parent}\".`);\n visiting.add(layout.id);\n visit(parent);\n visiting.delete(layout.id);\n }\n visited.add(layout.id);\n ordered.push(layout);\n }\n\n for (const layout of layouts) visit(layout);\n return ordered;\n}\n\nexport async function assembleRouteTree(\n routes: readonly ComposedRoute[],\n options: {\n layouts?: readonly ComposedLayout[];\n resolveImpl: ResolveRouteImpl;\n navigation: Parameters<typeof buildAnchorSkeleton>[0]['navigation'];\n settingsSections: Parameters<typeof buildAnchorSkeleton>[0]['settingsSections'];\n },\n) {\n const layouts = orderLayouts(options.layouts ?? []);\n const layoutPaths = new Map(layouts.map((layout) => [layout.id, layout.path]));\n const skeleton = buildAnchorSkeleton(options);\n const layoutRoutes = new Map<string, AnyRoute>();\n\n for (const layout of layouts) {\n const impl = await options.resolveImpl(layout.impl);\n const parentRoute = isShellAnchor(layout.parent)\n ? skeleton.anchors[layout.parent]\n : layoutRoutes.get(layout.parent);\n if (!parentRoute) throw new Error(`Missing layout parent \"${layout.parent}\".`);\n layoutRoutes.set(\n layout.id,\n createRoute({\n getParentRoute: () => parentRoute as never,\n path: routePathForParent(layout.parent, layout.path, layoutPaths),\n ...impl.options,\n } as never) as unknown as AnyRoute,\n );\n }\n\n const routeEntries: Array<{parent: RouteParentId; route: AnyRoute}> = await Promise.all(\n routes.map(async (route) => {\n const impl = await options.resolveImpl(route.impl);\n const parentRoute = isShellAnchor(route.parent)\n ? skeleton.anchors[route.parent]\n : layoutRoutes.get(route.parent);\n if (!parentRoute) throw new Error(`Missing route parent \"${route.parent}\".`);\n return {\n parent: route.parent,\n route: createRoute({\n getParentRoute: () => parentRoute as never,\n path: routePathForParent(route.parent, route.path, layoutPaths),\n ...impl.options,\n } as never) as unknown as AnyRoute,\n };\n }),\n );\n\n const routeChildrenFor = (parent: RouteParentId) =>\n routeEntries.filter((entry) => entry.parent === parent).map((entry) => entry.route);\n const layoutTrees = new Map<string, AnyRoute>();\n function layoutTree(layoutId: string): AnyRoute {\n const existing = layoutTrees.get(layoutId);\n if (existing) return existing;\n const layout = layouts.find((candidate) => candidate.id === layoutId);\n const route = layoutRoutes.get(layoutId);\n if (!layout || !route) throw new Error(`Missing layout \"${layoutId}\".`);\n const children = [\n ...routeChildrenFor(layoutId),\n ...layouts\n .filter((candidate) => candidate.parent === layoutId)\n .map((candidate) => layoutTree(candidate.id)),\n ];\n const tree = route.addChildren(children as never) as unknown as AnyRoute;\n layoutTrees.set(layoutId, tree);\n return tree;\n }\n\n const childrenFor = (parent: RouteParentId) => [\n ...routeChildrenFor(parent),\n ...layouts.filter((layout) => layout.parent === parent).map((layout) => layoutTree(layout.id)),\n ];\n const projectLayout = skeleton.projectLayout.addChildren(childrenFor('projectLayout') as never);\n const workspaceSettings = skeleton.workspaceSettings.addChildren(\n childrenFor('workspaceSettings') as never,\n );\n const workspaceLayout = skeleton.workspaceLayout.addChildren([\n ...childrenFor('workspaceLayout'),\n projectLayout,\n workspaceSettings,\n ] as never);\n return skeleton.rootRoute.addChildren([\n ...childrenFor('root'),\n workspaceLayout,\n ] as never) as unknown as typeof skeleton.rootRoute;\n}\n"],"names":["createRoute","routePathForParent","buildAnchorSkeleton","shellAnchors","isShellAnchor","parent","includes","orderLayouts","layouts","byId","Map","map","layout","id","ordered","visiting","Set","visited","visit","has","Error","get","add","delete","push","assembleRouteTree","routes","options","layoutPaths","path","skeleton","layoutRoutes","impl","resolveImpl","parentRoute","anchors","set","getParentRoute","routeEntries","Promise","all","route","routeChildrenFor","filter","entry","layoutTrees","layoutTree","layoutId","existing","find","candidate","children","tree","addChildren","childrenFor","projectLayout","workspaceSettings","workspaceLayout","rootRoute"],"mappings":"AAAA,SAAuBA,WAAW,QAAO,yBAAyB;AAGlE,SAAQC,kBAAkB,QAAO,2BAA2B;AAC5D,SAAQC,mBAAmB,QAAO,sBAAsB;AAKxD,MAAMC,eAAe;IAAC;IAAQ;IAAmB;IAAiB;CAAoB;AAEtF,SAASC,cAAcC,MAAqB;IAC1C,OAAOF,aAAaG,QAAQ,CAACD;AAC/B;AAEA,SAASE,aAAaC,OAAkC;IACtD,MAAMC,OAAO,IAAIC,IAAIF,QAAQG,GAAG,CAAC,CAACC,SAAW;YAACA,OAAOC,EAAE;YAAED;SAAO;IAChE,MAAME,UAA4B,EAAE;IACpC,MAAMC,WAAW,IAAIC;IACrB,MAAMC,UAAU,IAAID;IAEpB,SAASE,MAAMN,MAAsB;QACnC,IAAIK,QAAQE,GAAG,CAACP,OAAOC,EAAE,GAAG;QAC5B,IAAI,CAACT,cAAcQ,OAAOP,MAAM,GAAG;YACjC,IAAIU,SAASI,GAAG,CAACP,OAAOC,EAAE,GACxB,MAAM,IAAIO,MAAM,CAAC,QAAQ,EAAER,OAAOC,EAAE,CAAC,gCAAgC,CAAC;YACxE,MAAMR,SAASI,KAAKY,GAAG,CAACT,OAAOP,MAAM;YACrC,IAAI,CAACA,QACH,MAAM,IAAIe,MAAM,CAAC,QAAQ,EAAER,OAAOC,EAAE,CAAC,0BAA0B,EAAED,OAAOP,MAAM,CAAC,EAAE,CAAC;YACpFU,SAASO,GAAG,CAACV,OAAOC,EAAE;YACtBK,MAAMb;YACNU,SAASQ,MAAM,CAACX,OAAOC,EAAE;QAC3B;QACAI,QAAQK,GAAG,CAACV,OAAOC,EAAE;QACrBC,QAAQU,IAAI,CAACZ;IACf;IAEA,KAAK,MAAMA,UAAUJ,QAASU,MAAMN;IACpC,OAAOE;AACT;AAEA,OAAO,eAAeW,kBACpBC,MAAgC,EAChCC,OAKC;IAED,MAAMnB,UAAUD,aAAaoB,QAAQnB,OAAO,IAAI,EAAE;IAClD,MAAMoB,cAAc,IAAIlB,IAAIF,QAAQG,GAAG,CAAC,CAACC,SAAW;YAACA,OAAOC,EAAE;YAAED,OAAOiB,IAAI;SAAC;IAC5E,MAAMC,WAAW5B,oBAAoByB;IACrC,MAAMI,eAAe,IAAIrB;IAEzB,KAAK,MAAME,UAAUJ,QAAS;QAC5B,MAAMwB,OAAO,MAAML,QAAQM,WAAW,CAACrB,OAAOoB,IAAI;QAClD,MAAME,cAAc9B,cAAcQ,OAAOP,MAAM,IAC3CyB,SAASK,OAAO,CAACvB,OAAOP,MAAM,CAAC,GAC/B0B,aAAaV,GAAG,CAACT,OAAOP,MAAM;QAClC,IAAI,CAAC6B,aAAa,MAAM,IAAId,MAAM,CAAC,uBAAuB,EAAER,OAAOP,MAAM,CAAC,EAAE,CAAC;QAC7E0B,aAAaK,GAAG,CACdxB,OAAOC,EAAE,EACTb,YAAY;YACVqC,gBAAgB,IAAMH;YACtBL,MAAM5B,mBAAmBW,OAAOP,MAAM,EAAEO,OAAOiB,IAAI,EAAED;YACrD,GAAGI,KAAKL,OAAO;QACjB;IAEJ;IAEA,MAAMW,eAAgE,MAAMC,QAAQC,GAAG,CACrFd,OAAOf,GAAG,CAAC,OAAO8B;QAChB,MAAMT,OAAO,MAAML,QAAQM,WAAW,CAACQ,MAAMT,IAAI;QACjD,MAAME,cAAc9B,cAAcqC,MAAMpC,MAAM,IAC1CyB,SAASK,OAAO,CAACM,MAAMpC,MAAM,CAAC,GAC9B0B,aAAaV,GAAG,CAACoB,MAAMpC,MAAM;QACjC,IAAI,CAAC6B,aAAa,MAAM,IAAId,MAAM,CAAC,sBAAsB,EAAEqB,MAAMpC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO;YACLA,QAAQoC,MAAMpC,MAAM;YACpBoC,OAAOzC,YAAY;gBACjBqC,gBAAgB,IAAMH;gBACtBL,MAAM5B,mBAAmBwC,MAAMpC,MAAM,EAAEoC,MAAMZ,IAAI,EAAED;gBACnD,GAAGI,KAAKL,OAAO;YACjB;QACF;IACF;IAGF,MAAMe,mBAAmB,CAACrC,SACxBiC,aAAaK,MAAM,CAAC,CAACC,QAAUA,MAAMvC,MAAM,KAAKA,QAAQM,GAAG,CAAC,CAACiC,QAAUA,MAAMH,KAAK;IACpF,MAAMI,cAAc,IAAInC;IACxB,SAASoC,WAAWC,QAAgB;QAClC,MAAMC,WAAWH,YAAYxB,GAAG,CAAC0B;QACjC,IAAIC,UAAU,OAAOA;QACrB,MAAMpC,SAASJ,QAAQyC,IAAI,CAAC,CAACC,YAAcA,UAAUrC,EAAE,KAAKkC;QAC5D,MAAMN,QAAQV,aAAaV,GAAG,CAAC0B;QAC/B,IAAI,CAACnC,UAAU,CAAC6B,OAAO,MAAM,IAAIrB,MAAM,CAAC,gBAAgB,EAAE2B,SAAS,EAAE,CAAC;QACtE,MAAMI,WAAW;eACZT,iBAAiBK;eACjBvC,QACAmC,MAAM,CAAC,CAACO,YAAcA,UAAU7C,MAAM,KAAK0C,UAC3CpC,GAAG,CAAC,CAACuC,YAAcJ,WAAWI,UAAUrC,EAAE;SAC9C;QACD,MAAMuC,OAAOX,MAAMY,WAAW,CAACF;QAC/BN,YAAYT,GAAG,CAACW,UAAUK;QAC1B,OAAOA;IACT;IAEA,MAAME,cAAc,CAACjD,SAA0B;eAC1CqC,iBAAiBrC;eACjBG,QAAQmC,MAAM,CAAC,CAAC/B,SAAWA,OAAOP,MAAM,KAAKA,QAAQM,GAAG,CAAC,CAACC,SAAWkC,WAAWlC,OAAOC,EAAE;SAC7F;IACD,MAAM0C,gBAAgBzB,SAASyB,aAAa,CAACF,WAAW,CAACC,YAAY;IACrE,MAAME,oBAAoB1B,SAAS0B,iBAAiB,CAACH,WAAW,CAC9DC,YAAY;IAEd,MAAMG,kBAAkB3B,SAAS2B,eAAe,CAACJ,WAAW,CAAC;WACxDC,YAAY;QACfC;QACAC;KACD;IACD,OAAO1B,SAAS4B,SAAS,CAACL,WAAW,CAAC;WACjCC,YAAY;QACfG;KACD;AACH"}
1
+ {"version":3,"sources":["../../src/runtime/assemble-route-tree.ts"],"sourcesContent":["import {type AnyRoute, createRoute} from '@tanstack/react-router';\nimport type {ComposedLayout, ComposedRoute} from '#compose/compose-routes.js';\nimport type {RouteParentId} from '#contract.js';\nimport {routePathForParent} from '#runtime/anchor-paths.js';\nimport {buildAnchorSkeleton} from '#runtime/anchors.js';\nimport type {RouteImpl} from '#runtime/define-route.js';\n\nexport type ResolveRouteImpl = (specifier: string) => RouteImpl | Promise<RouteImpl>;\n\nconst shellAnchors = [\n 'root',\n 'workspaceLayout',\n 'projectLayout',\n 'workspaceSettings',\n 'projectSettings',\n] as const;\n\nfunction isShellAnchor(parent: RouteParentId): parent is (typeof shellAnchors)[number] {\n return shellAnchors.includes(parent as (typeof shellAnchors)[number]);\n}\n\nfunction orderLayouts(layouts: readonly ComposedLayout[]): ComposedLayout[] {\n const byId = new Map(layouts.map((layout) => [layout.id, layout]));\n const ordered: ComposedLayout[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n function visit(layout: ComposedLayout): void {\n if (visited.has(layout.id)) return;\n if (!isShellAnchor(layout.parent)) {\n if (visiting.has(layout.id))\n throw new Error(`Layout \"${layout.id}\" has a cyclic parent reference.`);\n const parent = byId.get(layout.parent);\n if (!parent)\n throw new Error(`Layout \"${layout.id}\" targets missing parent \"${layout.parent}\".`);\n visiting.add(layout.id);\n visit(parent);\n visiting.delete(layout.id);\n }\n visited.add(layout.id);\n ordered.push(layout);\n }\n\n for (const layout of layouts) visit(layout);\n return ordered;\n}\n\nexport async function assembleRouteTree(\n routes: readonly ComposedRoute[],\n options: {\n layouts?: readonly ComposedLayout[];\n resolveImpl: ResolveRouteImpl;\n navigation: Parameters<typeof buildAnchorSkeleton>[0]['navigation'];\n settingsSections: Parameters<typeof buildAnchorSkeleton>[0]['settingsSections'];\n },\n) {\n const layouts = orderLayouts(options.layouts ?? []);\n const layoutPaths = new Map(layouts.map((layout) => [layout.id, layout.path]));\n const skeleton = buildAnchorSkeleton(options);\n const layoutRoutes = new Map<string, AnyRoute>();\n\n for (const layout of layouts) {\n const impl = await options.resolveImpl(layout.impl);\n const parentRoute = isShellAnchor(layout.parent)\n ? skeleton.anchors[layout.parent]\n : layoutRoutes.get(layout.parent);\n if (!parentRoute) throw new Error(`Missing layout parent \"${layout.parent}\".`);\n layoutRoutes.set(\n layout.id,\n createRoute({\n getParentRoute: () => parentRoute as never,\n path: routePathForParent(layout.parent, layout.path, layoutPaths),\n ...impl.options,\n } as never) as unknown as AnyRoute,\n );\n }\n\n const routeEntries: Array<{parent: RouteParentId; route: AnyRoute}> = await Promise.all(\n routes.map(async (route) => {\n const impl = await options.resolveImpl(route.impl);\n const parentRoute = isShellAnchor(route.parent)\n ? skeleton.anchors[route.parent]\n : layoutRoutes.get(route.parent);\n if (!parentRoute) throw new Error(`Missing route parent \"${route.parent}\".`);\n return {\n parent: route.parent,\n route: createRoute({\n getParentRoute: () => parentRoute as never,\n path: routePathForParent(route.parent, route.path, layoutPaths),\n ...impl.options,\n } as never) as unknown as AnyRoute,\n };\n }),\n );\n\n const routeChildrenFor = (parent: RouteParentId) =>\n routeEntries.filter((entry) => entry.parent === parent).map((entry) => entry.route);\n const layoutTrees = new Map<string, AnyRoute>();\n function layoutTree(layoutId: string): AnyRoute {\n const existing = layoutTrees.get(layoutId);\n if (existing) return existing;\n const layout = layouts.find((candidate) => candidate.id === layoutId);\n const route = layoutRoutes.get(layoutId);\n if (!layout || !route) throw new Error(`Missing layout \"${layoutId}\".`);\n const children = [\n ...routeChildrenFor(layoutId),\n ...layouts\n .filter((candidate) => candidate.parent === layoutId)\n .map((candidate) => layoutTree(candidate.id)),\n ];\n const tree = route.addChildren(children as never) as unknown as AnyRoute;\n layoutTrees.set(layoutId, tree);\n return tree;\n }\n\n const childrenFor = (parent: RouteParentId) => [\n ...routeChildrenFor(parent),\n ...layouts.filter((layout) => layout.parent === parent).map((layout) => layoutTree(layout.id)),\n ];\n const projectSettings = skeleton.projectSettings.addChildren(\n childrenFor('projectSettings') as never,\n );\n const projectLayout = skeleton.projectLayout.addChildren([\n ...childrenFor('projectLayout'),\n projectSettings,\n ] as never);\n const workspaceSettings = skeleton.workspaceSettings.addChildren(\n childrenFor('workspaceSettings') as never,\n );\n const workspaceLayout = skeleton.workspaceLayout.addChildren([\n ...childrenFor('workspaceLayout'),\n projectLayout,\n workspaceSettings,\n ] as never);\n return skeleton.rootRoute.addChildren([\n ...childrenFor('root'),\n workspaceLayout,\n ] as never) as unknown as typeof skeleton.rootRoute;\n}\n"],"names":["createRoute","routePathForParent","buildAnchorSkeleton","shellAnchors","isShellAnchor","parent","includes","orderLayouts","layouts","byId","Map","map","layout","id","ordered","visiting","Set","visited","visit","has","Error","get","add","delete","push","assembleRouteTree","routes","options","layoutPaths","path","skeleton","layoutRoutes","impl","resolveImpl","parentRoute","anchors","set","getParentRoute","routeEntries","Promise","all","route","routeChildrenFor","filter","entry","layoutTrees","layoutTree","layoutId","existing","find","candidate","children","tree","addChildren","childrenFor","projectSettings","projectLayout","workspaceSettings","workspaceLayout","rootRoute"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import type { ComponentType, PropsWithChildren } from 'react';
2
+ import type { ProjectSlugResolver } from './router-context.js';
2
3
  export interface ChromeSlots {
3
4
  ProjectBreadcrumb: ComponentType;
4
- ProjectLayoutGuard: ComponentType;
5
+ projectSlugResolver: ProjectSlugResolver;
5
6
  /**
6
7
  * Optional content rendered in the account menu before the shell-owned logout
7
8
  * action. The composing component must render one DropdownMenuItem or return
@@ -1 +1 @@
1
- {"version":3,"file":"chrome-context.d.ts","sourceRoot":"","sources":["../../src/runtime/chrome-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAG5D,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,aAAa,CAAC;IACjC,kBAAkB,EAAE,aAAa,CAAC;IAClC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,aAAa,CAAC;CAClC;AAID,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,GACT,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;CAAC,CAAC,+BAEtD;AAED,wBAAgB,SAAS,IAAI,WAAW,CAIvC"}
1
+ {"version":3,"file":"chrome-context.d.ts","sourceRoot":"","sources":["../../src/runtime/chrome-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,aAAa,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,aAAa,CAAC;CAClC;AAID,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,GACT,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;CAAC,CAAC,+BAEtD;AAED,wBAAgB,SAAS,IAAI,WAAW,CAIvC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/runtime/chrome-context.tsx"],"sourcesContent":["import type {ComponentType, PropsWithChildren} from 'react';\nimport {createContext, useContext} from 'react';\n\nexport interface ChromeSlots {\n ProjectBreadcrumb: ComponentType;\n ProjectLayoutGuard: ComponentType;\n /**\n * Optional content rendered in the account menu before the shell-owned logout\n * action. The composing component must render one DropdownMenuItem or return\n * null, and owns whether this content renders from the current session.\n */\n AccountMenuEntry?: ComponentType;\n}\n\nconst ChromeContext = createContext<ChromeSlots | undefined>(undefined);\n\nexport function ChromeProvider({\n chrome,\n children,\n}: PropsWithChildren<{chrome: ChromeSlots | undefined}>) {\n return <ChromeContext.Provider value={chrome}>{children}</ChromeContext.Provider>;\n}\n\nexport function useChrome(): ChromeSlots {\n const chrome = useContext(ChromeContext);\n if (!chrome) throw new Error('Client composition must provide browser chrome slots.');\n return chrome;\n}\n"],"names":["createContext","useContext","ChromeContext","undefined","ChromeProvider","chrome","children","Provider","value","useChrome","Error"],"mappings":";AACA,SAAQA,aAAa,EAAEC,UAAU,QAAO,QAAQ;AAahD,MAAMC,8BAAgBF,cAAuCG;AAE7D,OAAO,SAASC,eAAe,EAC7BC,MAAM,EACNC,QAAQ,EAC6C;IACrD,qBAAO,KAACJ,cAAcK,QAAQ;QAACC,OAAOH;kBAASC;;AACjD;AAEA,OAAO,SAASG;IACd,MAAMJ,SAASJ,WAAWC;IAC1B,IAAI,CAACG,QAAQ,MAAM,IAAIK,MAAM;IAC7B,OAAOL;AACT"}
1
+ {"version":3,"sources":["../../src/runtime/chrome-context.tsx"],"sourcesContent":["import type {ComponentType, PropsWithChildren} from 'react';\nimport {createContext, useContext} from 'react';\nimport type {ProjectSlugResolver} from './router-context.js';\n\nexport interface ChromeSlots {\n ProjectBreadcrumb: ComponentType;\n projectSlugResolver: ProjectSlugResolver;\n /**\n * Optional content rendered in the account menu before the shell-owned logout\n * action. The composing component must render one DropdownMenuItem or return\n * null, and owns whether this content renders from the current session.\n */\n AccountMenuEntry?: ComponentType;\n}\n\nconst ChromeContext = createContext<ChromeSlots | undefined>(undefined);\n\nexport function ChromeProvider({\n chrome,\n children,\n}: PropsWithChildren<{chrome: ChromeSlots | undefined}>) {\n return <ChromeContext.Provider value={chrome}>{children}</ChromeContext.Provider>;\n}\n\nexport function useChrome(): ChromeSlots {\n const chrome = useContext(ChromeContext);\n if (!chrome) throw new Error('Client composition must provide browser chrome slots.');\n return chrome;\n}\n"],"names":["createContext","useContext","ChromeContext","undefined","ChromeProvider","chrome","children","Provider","value","useChrome","Error"],"mappings":";AACA,SAAQA,aAAa,EAAEC,UAAU,QAAO,QAAQ;AAchD,MAAMC,8BAAgBF,cAAuCG;AAE7D,OAAO,SAASC,eAAe,EAC7BC,MAAM,EACNC,QAAQ,EAC6C;IACrD,qBAAO,KAACJ,cAAcK,QAAQ;QAACC,OAAOH;kBAASC;;AACjD;AAEA,OAAO,SAASG;IACd,MAAMJ,SAASJ,WAAWC;IAC1B,IAAI,CAACG,QAAQ,MAAM,IAAIK,MAAM;IAC7B,OAAOL;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"compose-client-app.d.ts","sourceRoot":"","sources":["../../src/runtime/compose-client-app.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAC,KAAK,SAAS,EAAiB,MAAM,wBAAwB,CAAC;AAKtE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,cAAc,GACf,EAAE;IACD,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACrC;mBASkB,WAAW,GAAG,IAAI;EAiCpC"}
1
+ {"version":3,"file":"compose-client-app.d.ts","sourceRoot":"","sources":["../../src/runtime/compose-client-app.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAC,KAAK,SAAS,EAAiB,MAAM,wBAAwB,CAAC;AAKtE,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,cAAc,GACf,EAAE;IACD,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACrC;mBASkB,WAAW,GAAG,IAAI;EAkCpC"}