@greensecurity/javascript-sdk 0.46.0-beta.10 → 0.46.0-beta.11

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 (183) hide show
  1. package/dist/commonjs/__tests__/apps/contract.test.js +288 -4
  2. package/dist/commonjs/__tests__/apps/contract.test.js.map +1 -1
  3. package/dist/commonjs/__tests__/apps/devpreview-routes.test.d.ts +2 -0
  4. package/dist/commonjs/__tests__/apps/devpreview-routes.test.d.ts.map +1 -0
  5. package/dist/commonjs/__tests__/apps/devpreview-routes.test.js +86 -0
  6. package/dist/commonjs/__tests__/apps/devpreview-routes.test.js.map +1 -0
  7. package/dist/commonjs/__tests__/apps/kit/example.test.js +84 -4
  8. package/dist/commonjs/__tests__/apps/kit/example.test.js.map +1 -1
  9. package/dist/commonjs/__tests__/apps/kit/pages.test.d.ts +2 -0
  10. package/dist/commonjs/__tests__/apps/kit/pages.test.d.ts.map +1 -0
  11. package/dist/commonjs/__tests__/apps/kit/pages.test.js +119 -0
  12. package/dist/commonjs/__tests__/apps/kit/pages.test.js.map +1 -0
  13. package/dist/commonjs/__tests__/apps/kit/render.test.js +24 -0
  14. package/dist/commonjs/__tests__/apps/kit/render.test.js.map +1 -1
  15. package/dist/commonjs/__tests__/apps/kit/store.test.d.ts +2 -0
  16. package/dist/commonjs/__tests__/apps/kit/store.test.d.ts.map +1 -0
  17. package/dist/commonjs/__tests__/apps/kit/store.test.js +123 -0
  18. package/dist/commonjs/__tests__/apps/kit/store.test.js.map +1 -0
  19. package/dist/commonjs/__tests__/apps/post-install-page.test.d.ts +2 -0
  20. package/dist/commonjs/__tests__/apps/post-install-page.test.d.ts.map +1 -0
  21. package/dist/commonjs/__tests__/apps/post-install-page.test.js +110 -0
  22. package/dist/commonjs/__tests__/apps/post-install-page.test.js.map +1 -0
  23. package/dist/commonjs/__tests__/apps/routes.test.d.ts +2 -0
  24. package/dist/commonjs/__tests__/apps/routes.test.d.ts.map +1 -0
  25. package/dist/commonjs/__tests__/apps/routes.test.js +238 -0
  26. package/dist/commonjs/__tests__/apps/routes.test.js.map +1 -0
  27. package/dist/commonjs/__tests__/vendors.test.js +1 -1
  28. package/dist/commonjs/__tests__/webhooks.test.js +1 -1
  29. package/dist/commonjs/__tests__/webhooks.test.js.map +1 -1
  30. package/dist/commonjs/__tests__/zones.test.js +2 -9
  31. package/dist/commonjs/__tests__/zones.test.js.map +1 -1
  32. package/dist/commonjs/apps/components.d.ts +321 -0
  33. package/dist/commonjs/apps/components.d.ts.map +1 -1
  34. package/dist/commonjs/apps/components.js +168 -2
  35. package/dist/commonjs/apps/components.js.map +1 -1
  36. package/dist/commonjs/apps/context.d.ts +24 -0
  37. package/dist/commonjs/apps/context.d.ts.map +1 -1
  38. package/dist/commonjs/apps/context.js.map +1 -1
  39. package/dist/commonjs/apps/devpreview.d.ts +20 -3
  40. package/dist/commonjs/apps/devpreview.d.ts.map +1 -1
  41. package/dist/commonjs/apps/devpreview.js +18 -7
  42. package/dist/commonjs/apps/devpreview.js.map +1 -1
  43. package/dist/commonjs/apps/hooks/index.d.ts +33 -2
  44. package/dist/commonjs/apps/hooks/index.d.ts.map +1 -1
  45. package/dist/commonjs/apps/hooks/index.js +41 -1
  46. package/dist/commonjs/apps/hooks/index.js.map +1 -1
  47. package/dist/commonjs/apps/hooks/store.d.ts +48 -0
  48. package/dist/commonjs/apps/hooks/store.d.ts.map +1 -0
  49. package/dist/commonjs/apps/hooks/store.js +87 -0
  50. package/dist/commonjs/apps/hooks/store.js.map +1 -0
  51. package/dist/commonjs/apps/manifest.d.ts +64 -3
  52. package/dist/commonjs/apps/manifest.d.ts.map +1 -1
  53. package/dist/commonjs/apps/manifest.js +128 -27
  54. package/dist/commonjs/apps/manifest.js.map +1 -1
  55. package/dist/commonjs/apps/protocol.d.ts +1 -1
  56. package/dist/commonjs/apps/protocol.d.ts.map +1 -1
  57. package/dist/commonjs/apps/route.d.ts +11 -1
  58. package/dist/commonjs/apps/route.d.ts.map +1 -1
  59. package/dist/commonjs/apps/route.js +13 -7
  60. package/dist/commonjs/apps/route.js.map +1 -1
  61. package/dist/commonjs/apps/routes.d.ts +65 -0
  62. package/dist/commonjs/apps/routes.d.ts.map +1 -0
  63. package/dist/commonjs/apps/routes.js +202 -0
  64. package/dist/commonjs/apps/routes.js.map +1 -0
  65. package/dist/commonjs/apps/surfaces.d.ts +20 -2
  66. package/dist/commonjs/apps/surfaces.d.ts.map +1 -1
  67. package/dist/commonjs/apps/surfaces.js +45 -7
  68. package/dist/commonjs/apps/surfaces.js.map +1 -1
  69. package/dist/commonjs/apps/testing/index.d.ts +17 -1
  70. package/dist/commonjs/apps/testing/index.d.ts.map +1 -1
  71. package/dist/commonjs/apps/testing/index.js +50 -1
  72. package/dist/commonjs/apps/testing/index.js.map +1 -1
  73. package/dist/commonjs/apps/ui/index.d.ts +13 -0
  74. package/dist/commonjs/apps/ui/index.d.ts.map +1 -1
  75. package/dist/commonjs/apps/ui/index.js +19 -2
  76. package/dist/commonjs/apps/ui/index.js.map +1 -1
  77. package/dist/commonjs/lib/config.d.ts +2 -2
  78. package/dist/commonjs/lib/config.js +2 -2
  79. package/dist/esm/__tests__/apps/contract.test.js +289 -5
  80. package/dist/esm/__tests__/apps/contract.test.js.map +1 -1
  81. package/dist/esm/__tests__/apps/devpreview-routes.test.d.ts +2 -0
  82. package/dist/esm/__tests__/apps/devpreview-routes.test.d.ts.map +1 -0
  83. package/dist/esm/__tests__/apps/devpreview-routes.test.js +84 -0
  84. package/dist/esm/__tests__/apps/devpreview-routes.test.js.map +1 -0
  85. package/dist/esm/__tests__/apps/kit/example.test.js +85 -5
  86. package/dist/esm/__tests__/apps/kit/example.test.js.map +1 -1
  87. package/dist/esm/__tests__/apps/kit/pages.test.d.ts +2 -0
  88. package/dist/esm/__tests__/apps/kit/pages.test.d.ts.map +1 -0
  89. package/dist/esm/__tests__/apps/kit/pages.test.js +117 -0
  90. package/dist/esm/__tests__/apps/kit/pages.test.js.map +1 -0
  91. package/dist/esm/__tests__/apps/kit/render.test.js +25 -1
  92. package/dist/esm/__tests__/apps/kit/render.test.js.map +1 -1
  93. package/dist/esm/__tests__/apps/kit/store.test.d.ts +2 -0
  94. package/dist/esm/__tests__/apps/kit/store.test.d.ts.map +1 -0
  95. package/dist/esm/__tests__/apps/kit/store.test.js +121 -0
  96. package/dist/esm/__tests__/apps/kit/store.test.js.map +1 -0
  97. package/dist/esm/__tests__/apps/post-install-page.test.d.ts +2 -0
  98. package/dist/esm/__tests__/apps/post-install-page.test.d.ts.map +1 -0
  99. package/dist/esm/__tests__/apps/post-install-page.test.js +108 -0
  100. package/dist/esm/__tests__/apps/post-install-page.test.js.map +1 -0
  101. package/dist/esm/__tests__/apps/routes.test.d.ts +2 -0
  102. package/dist/esm/__tests__/apps/routes.test.d.ts.map +1 -0
  103. package/dist/esm/__tests__/apps/routes.test.js +236 -0
  104. package/dist/esm/__tests__/apps/routes.test.js.map +1 -0
  105. package/dist/esm/__tests__/vendors.test.js +1 -1
  106. package/dist/esm/__tests__/webhooks.test.js +1 -1
  107. package/dist/esm/__tests__/webhooks.test.js.map +1 -1
  108. package/dist/esm/__tests__/zones.test.js +2 -9
  109. package/dist/esm/__tests__/zones.test.js.map +1 -1
  110. package/dist/esm/apps/components.d.ts +321 -0
  111. package/dist/esm/apps/components.d.ts.map +1 -1
  112. package/dist/esm/apps/components.js +163 -1
  113. package/dist/esm/apps/components.js.map +1 -1
  114. package/dist/esm/apps/context.d.ts +24 -0
  115. package/dist/esm/apps/context.d.ts.map +1 -1
  116. package/dist/esm/apps/context.js.map +1 -1
  117. package/dist/esm/apps/devpreview.d.ts +20 -3
  118. package/dist/esm/apps/devpreview.d.ts.map +1 -1
  119. package/dist/esm/apps/devpreview.js +19 -8
  120. package/dist/esm/apps/devpreview.js.map +1 -1
  121. package/dist/esm/apps/hooks/index.d.ts +33 -2
  122. package/dist/esm/apps/hooks/index.d.ts.map +1 -1
  123. package/dist/esm/apps/hooks/index.js +37 -1
  124. package/dist/esm/apps/hooks/index.js.map +1 -1
  125. package/dist/esm/apps/hooks/store.d.ts +48 -0
  126. package/dist/esm/apps/hooks/store.d.ts.map +1 -0
  127. package/dist/esm/apps/hooks/store.js +84 -0
  128. package/dist/esm/apps/hooks/store.js.map +1 -0
  129. package/dist/esm/apps/manifest.d.ts +64 -3
  130. package/dist/esm/apps/manifest.d.ts.map +1 -1
  131. package/dist/esm/apps/manifest.js +116 -26
  132. package/dist/esm/apps/manifest.js.map +1 -1
  133. package/dist/esm/apps/protocol.d.ts +1 -1
  134. package/dist/esm/apps/protocol.d.ts.map +1 -1
  135. package/dist/esm/apps/route.d.ts +11 -1
  136. package/dist/esm/apps/route.d.ts.map +1 -1
  137. package/dist/esm/apps/route.js +14 -8
  138. package/dist/esm/apps/route.js.map +1 -1
  139. package/dist/esm/apps/routes.d.ts +65 -0
  140. package/dist/esm/apps/routes.d.ts.map +1 -0
  141. package/dist/esm/apps/routes.js +194 -0
  142. package/dist/esm/apps/routes.js.map +1 -0
  143. package/dist/esm/apps/surfaces.d.ts +20 -2
  144. package/dist/esm/apps/surfaces.d.ts.map +1 -1
  145. package/dist/esm/apps/surfaces.js +39 -2
  146. package/dist/esm/apps/surfaces.js.map +1 -1
  147. package/dist/esm/apps/testing/index.d.ts +17 -1
  148. package/dist/esm/apps/testing/index.d.ts.map +1 -1
  149. package/dist/esm/apps/testing/index.js +49 -1
  150. package/dist/esm/apps/testing/index.js.map +1 -1
  151. package/dist/esm/apps/ui/index.d.ts +13 -0
  152. package/dist/esm/apps/ui/index.d.ts.map +1 -1
  153. package/dist/esm/apps/ui/index.js +17 -1
  154. package/dist/esm/apps/ui/index.js.map +1 -1
  155. package/dist/esm/lib/config.d.ts +2 -2
  156. package/dist/esm/lib/config.js +2 -2
  157. package/examples/apps/hello-green/src/store.ts +15 -0
  158. package/jsr.json +1 -1
  159. package/package.json +1 -1
  160. package/src/__tests__/apps/contract.test.ts +305 -4
  161. package/src/__tests__/apps/devpreview-routes.test.ts +103 -0
  162. package/src/__tests__/apps/kit/example.test.ts +94 -5
  163. package/src/__tests__/apps/kit/pages.test.ts +137 -0
  164. package/src/__tests__/apps/kit/render.test.ts +35 -1
  165. package/src/__tests__/apps/kit/store.test.ts +149 -0
  166. package/src/__tests__/apps/post-install-page.test.ts +126 -0
  167. package/src/__tests__/apps/routes.test.ts +318 -0
  168. package/src/__tests__/vendors.test.ts +1 -1
  169. package/src/__tests__/webhooks.test.ts +1 -1
  170. package/src/__tests__/zones.test.ts +2 -9
  171. package/src/apps/components.ts +183 -1
  172. package/src/apps/context.ts +25 -0
  173. package/src/apps/devpreview.ts +20 -7
  174. package/src/apps/hooks/index.ts +42 -2
  175. package/src/apps/hooks/store.ts +115 -0
  176. package/src/apps/manifest.ts +151 -27
  177. package/src/apps/protocol.ts +1 -1
  178. package/src/apps/route.ts +22 -10
  179. package/src/apps/routes.ts +230 -0
  180. package/src/apps/surfaces.ts +45 -12
  181. package/src/apps/testing/index.ts +48 -2
  182. package/src/apps/ui/index.ts +18 -1
  183. package/src/lib/config.ts +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/apps/hooks/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AA4BlE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,cAAc,CAAmB,OAAU;IACzD,IAAI,KAAK,GAAG,OAAO,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEjD,MAAM,KAAK,GAAgB;QACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QAErB,QAAQ,CAAC,MAAM;YACb,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAmB,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO;YACpE,MAAM,QAAQ,GAAG,KAAK,CAAC;YACvB,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;YAC/B,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC;gBAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QAED,QAAQ,EAAE,SAAS,QAAQ,CAAI,QAA0B;YACvD,OAAO,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxC,CAA4B;KAC7B,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAsB,KAAkB,EAAE,QAA0B;IACxF,4FAA4F;IAC5F,oFAAoF;IACpF,MAAM,KAAK,GAAG,MAAM,CAA6E,IAAI,CAAC,CAAC;IACvG,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,MAAkB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAElG,MAAM,WAAW,GAAG,GAAU,EAAE;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrD,iGAAiG;QACjG,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/E,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,oBAAoB,CAAC,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACvE,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import * as z from "zod/v4";
2
2
  export { IPV4_OCTET_PATTERN, PORT_PATTERN, CSP_PATH_CHAR, CSP_SOURCE_MAX_CHARS, CSP_SOURCE_PATTERN, CSP_SOURCES_MAX_PER_DIRECTIVE, CSP_SOURCES_MAX_TOTAL_CHARS, cspSourcesTotalChars, HTTPS_URL_PATTERN, isHttpsUrl, isParsableHttpsUrl, } from "./url.js";
3
+ export { APP_ROUTES_MAX, CONCRETE_ROUTE_PATH_PATTERN, isConcreteRoutePath, isRoutePath, matchAppRoute, normalizeRoutePath, ROUTE_PATH_MAX_CHARS, ROUTE_PATH_MAX_SEGMENTS, ROUTE_PATH_PATTERN, routeSetIssues, type AppRouteMatch, type RouteSetIssue, } from "./routes.js";
3
4
  /** A single SRI hash with the digest length its algorithm produces (32, 48 or 64 bytes, base64). */
4
5
  export declare const SRI_PATTERN = "^(sha256-[A-Za-z0-9+/]{43}=|sha384-[A-Za-z0-9+/]{64}|sha512-[A-Za-z0-9+/]{86}==)$";
5
6
  /** SemVer 2.0.0 (semver.org's reference pattern): no empty or leading-zero numeric identifiers. */
@@ -45,6 +46,45 @@ export declare const appViewSchema: z.ZodObject<{
45
46
  }>;
46
47
  component: z.ZodString;
47
48
  }, z.core.$strict>;
49
+ /** Reports {@link routeSetIssues} (segment cap, repeated params, duplicate paths, repeated portals). */
50
+ export declare function addRouteIssues(routes: ReadonlyArray<{
51
+ path: string;
52
+ portals?: readonly string[] | undefined;
53
+ navigation?: unknown;
54
+ }> | undefined, ctx: z.RefinementCtx, path: ReadonlyArray<string | number>): void;
55
+ /**
56
+ * One app page. The host renders `component` at `/{portal}/apps/{appId}/pages{path}`.
57
+ *
58
+ * `title` is required here, for new manifests. The server keeps accepting title-less entries in a
59
+ * bundle-less v1 manifest, which stored `routes[{ path, component }]` before pages were rendered;
60
+ * such a manifest has nothing to render them with, and the host never shows them.
61
+ */
62
+ /**
63
+ * Text a person reads (a page title, a sidebar label): at least one character that isn't
64
+ * whitespace. The host never shows a blank one, so the manifest can't publish one.
65
+ *
66
+ * This is JavaScript's `\S` spelled out (ASCII whitespace, the Unicode space separators,
67
+ * U+2028/U+2029 and U+FEFF), because the generated schema's patterns also run as Ruby regexps, and
68
+ * Ruby's `\S` is ASCII-only: there, a title of no-break spaces would pass.
69
+ */
70
+ export declare const NON_BLANK_PATTERN = "[^\\t\\n\\v\\f\\r \\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]";
71
+ export declare const appRouteSchema: z.ZodObject<{
72
+ path: z.ZodString;
73
+ component: z.ZodString;
74
+ /** Page header title. */
75
+ title: z.ZodString;
76
+ /** Portals the page is offered in. Absent = every portal the host renders. */
77
+ portals: z.ZodOptional<z.ZodArray<z.ZodEnum<{
78
+ facility: "facility";
79
+ system: "system";
80
+ company: "company";
81
+ vendor: "vendor";
82
+ }>>>;
83
+ /** Offer the page in the sidebar / mobile drawer menu under this label (default: `title`). */
84
+ navigation: z.ZodOptional<z.ZodObject<{
85
+ label: z.ZodOptional<z.ZodString>;
86
+ }, z.core.$strict>>;
87
+ }, z.core.$strict>;
48
88
  /** Constants are delivered to every view as `environment.constants`. */
49
89
  export declare const appConstantsSchema: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
50
90
  export declare const appCspSchema: z.ZodObject<{
@@ -84,10 +124,23 @@ export declare const appManifestSchema: z.ZodObject<{
84
124
  }>;
85
125
  component: z.ZodString;
86
126
  }, z.core.$strict>>>;
87
- /** Reserved for a future FullPageView. Stored and validated, not rendered. */
127
+ /** App pages, each a full screen under `/{portal}/apps/{appId}/pages`. */
88
128
  routes: z.ZodOptional<z.ZodArray<z.ZodObject<{
89
129
  path: z.ZodString;
90
130
  component: z.ZodString;
131
+ /** Page header title. */
132
+ title: z.ZodString;
133
+ /** Portals the page is offered in. Absent = every portal the host renders. */
134
+ portals: z.ZodOptional<z.ZodArray<z.ZodEnum<{
135
+ facility: "facility";
136
+ system: "system";
137
+ company: "company";
138
+ vendor: "vendor";
139
+ }>>>;
140
+ /** Offer the page in the sidebar / mobile drawer menu under this label (default: `title`). */
141
+ navigation: z.ZodOptional<z.ZodObject<{
142
+ label: z.ZodOptional<z.ZodString>;
143
+ }, z.core.$strict>>;
91
144
  }, z.core.$strict>>>;
92
145
  csp: z.ZodOptional<z.ZodObject<{
93
146
  connect_src: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -102,8 +155,14 @@ export declare const appManifestSchema: z.ZodObject<{
102
155
  url: "url";
103
156
  app_settings_view: "app_settings_view";
104
157
  app_main_view: "app_main_view";
158
+ app_page: "app_page";
105
159
  }>;
106
160
  url: z.ZodOptional<z.ZodString>;
161
+ /**
162
+ * For `app_page` only: the page to open, a concrete path (no `:params`) that one of
163
+ * `ui_extensions.routes` matches, such as `/welcome` or `/reports/7`.
164
+ */
165
+ path: z.ZodOptional<z.ZodString>;
107
166
  }, z.core.$strict>>;
108
167
  webhooks: z.ZodOptional<z.ZodObject<{
109
168
  url: z.ZodString;
@@ -115,12 +174,14 @@ export declare const appManifestSchema: z.ZodObject<{
115
174
  }, z.core.$strict>>;
116
175
  }, z.core.$strict>;
117
176
  export type AppManifestV2 = z.infer<typeof appManifestSchema>;
177
+ export type AppRoute = z.infer<typeof appRouteSchema>;
118
178
  export type PostInstallAction = NonNullable<AppManifestV2["post_install_action"]>;
119
179
  /**
120
180
  * What installing the app does when `post_install_action` is left out, so the server and the host
121
181
  * never land an installer on a view the app does not have: nothing for a back-end-only app, the
122
- * settings page for a settings-only app, and the app's main view otherwise. `null` means
123
- * "no post-install step". An explicit action is returned unchanged.
182
+ * settings page for a settings-only app, and the app's main view otherwise. A root page (route
183
+ * `/`) counts as a main view. `null` means "no post-install step". An explicit action, including
184
+ * `app_page`, is returned unchanged.
124
185
  */
125
186
  export declare function effectivePostInstallAction(manifest: Pick<AppManifestV2, "post_install_action" | "ui_extensions">): PostInstallAction | null;
126
187
  export type AppView = z.infer<typeof appViewSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/apps/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/apps/manifest.ts"],"names":[],"mappings":"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"}
@@ -9,11 +9,14 @@
9
9
  * server's own validation.
10
10
  */
11
11
  import * as z from "zod/v4";
12
+ import { APP_ROUTES_MAX, CONCRETE_ROUTE_PATH_PATTERN, isConcreteRoutePath, matchAppRoute, ROUTE_PATH_MAX_CHARS, ROUTE_PATH_PATTERN, routeSetIssues, } from "./routes.js";
12
13
  import { SURFACES } from "./surfaces.js";
13
14
  import { CSP_SOURCE_MAX_CHARS, CSP_SOURCE_PATTERN, CSP_SOURCES_MAX_PER_DIRECTIVE, CSP_SOURCES_MAX_TOTAL_CHARS, cspSourcesTotalChars, HTTPS_URL_PATTERN, isParsableHttpsUrl, } from "./url.js";
14
15
  // The URL and CSP-source rules live in the zod-free `url.ts` so the host renderer can use them
15
16
  // without bundling zod; re-exported here because they are part of the manifest contract.
16
17
  export { IPV4_OCTET_PATTERN, PORT_PATTERN, CSP_PATH_CHAR, CSP_SOURCE_MAX_CHARS, CSP_SOURCE_PATTERN, CSP_SOURCES_MAX_PER_DIRECTIVE, CSP_SOURCES_MAX_TOTAL_CHARS, cspSourcesTotalChars, HTTPS_URL_PATTERN, isHttpsUrl, isParsableHttpsUrl, } from "./url.js";
18
+ // The route grammar and matcher live in the zod-free `routes.ts` for the same reason.
19
+ export { APP_ROUTES_MAX, CONCRETE_ROUTE_PATH_PATTERN, isConcreteRoutePath, isRoutePath, matchAppRoute, normalizeRoutePath, ROUTE_PATH_MAX_CHARS, ROUTE_PATH_MAX_SEGMENTS, ROUTE_PATH_PATTERN, routeSetIssues, } from "./routes.js";
17
20
  /** A single SRI hash with the digest length its algorithm produces (32, 48 or 64 bytes, base64). */
18
21
  export const SRI_PATTERN = "^(sha256-[A-Za-z0-9+/]{43}=|sha384-[A-Za-z0-9+/]{64}|sha512-[A-Za-z0-9+/]{86}==)$";
19
22
  /** SemVer 2.0.0 (semver.org's reference pattern): no empty or leading-zero numeric identifiers. */
@@ -47,7 +50,10 @@ const PLATFORM_PERMISSION_NAMES = new Set(PLATFORM_PERMISSIONS.map((p) => p.perm
47
50
  export function isPlatformPermission(value) {
48
51
  return typeof value === "string" && PLATFORM_PERMISSION_NAMES.has(value);
49
52
  }
50
- const SURFACE_IDS = SURFACES.map((s) => s.id);
53
+ // A view's viewport. `page` is not one: an app declares its pages in `routes`, not in `views`.
54
+ const SURFACE_IDS = SURFACES.filter((s) => s.kind !== "page").map((s) => s.id);
55
+ /** Portals an app page may be offered in (`routes[].portals`). */
56
+ const ROUTE_PORTALS = ["company", "vendor", "facility", "system"];
51
57
  /** Lifecycle events an app's own webhook endpoint can receive (see C19). */
52
58
  export const APP_WEBHOOK_EVENTS = [
53
59
  "MarketplaceAppActivation.created",
@@ -100,6 +106,42 @@ export const appViewSchema = z.strictObject({
100
106
  viewport: z.enum(SURFACE_IDS),
101
107
  component: z.string().max(100).regex(new RegExp(COMPONENT_NAME_PATTERN)),
102
108
  });
109
+ /** Reports {@link routeSetIssues} (segment cap, repeated params, duplicate paths, repeated portals). */
110
+ export function addRouteIssues(routes, ctx, path) {
111
+ for (const issue of routeSetIssues(routes ?? [])) {
112
+ ctx.addIssue({ code: "custom", path: [...path, issue.index, issue.field], message: issue.message });
113
+ }
114
+ }
115
+ /**
116
+ * One app page. The host renders `component` at `/{portal}/apps/{appId}/pages{path}`.
117
+ *
118
+ * `title` is required here, for new manifests. The server keeps accepting title-less entries in a
119
+ * bundle-less v1 manifest, which stored `routes[{ path, component }]` before pages were rendered;
120
+ * such a manifest has nothing to render them with, and the host never shows them.
121
+ */
122
+ /**
123
+ * Text a person reads (a page title, a sidebar label): at least one character that isn't
124
+ * whitespace. The host never shows a blank one, so the manifest can't publish one.
125
+ *
126
+ * This is JavaScript's `\S` spelled out (ASCII whitespace, the Unicode space separators,
127
+ * U+2028/U+2029 and U+FEFF), because the generated schema's patterns also run as Ruby regexps, and
128
+ * Ruby's `\S` is ASCII-only: there, a title of no-break spaces would pass.
129
+ */
130
+ export const NON_BLANK_PATTERN = "[^\\t\\n\\v\\f\\r \\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]";
131
+ export const appRouteSchema = z.strictObject({
132
+ path: z.string().max(ROUTE_PATH_MAX_CHARS).regex(new RegExp(ROUTE_PATH_PATTERN)),
133
+ component: z.string().max(100).regex(new RegExp(COMPONENT_NAME_PATTERN)),
134
+ /** Page header title. */
135
+ title: z.string().min(1).max(100).regex(new RegExp(NON_BLANK_PATTERN), { message: "must not be blank" }),
136
+ /** Portals the page is offered in. Absent = every portal the host renders. */
137
+ portals: z.array(z.enum(ROUTE_PORTALS)).min(1).max(ROUTE_PORTALS.length).optional(),
138
+ /** Offer the page in the sidebar / mobile drawer menu under this label (default: `title`). */
139
+ navigation: z
140
+ .strictObject({
141
+ label: z.string().min(1).max(40).regex(new RegExp(NON_BLANK_PATTERN), { message: "must not be blank" }).optional(),
142
+ })
143
+ .optional(),
144
+ });
103
145
  /** Constants are delivered to every view as `environment.constants`. */
104
146
  export const appConstantsSchema = z.record(z.string().max(100).regex(/^[A-Za-z_][A-Za-z0-9_]*$/), z.union([z.string().max(2048), z.number(), z.boolean()]));
105
147
  export const appCspSchema = z.strictObject({
@@ -139,21 +181,20 @@ export const appManifestSchema = z
139
181
  integrity: z.string().max(200).regex(new RegExp(SRI_PATTERN)),
140
182
  }).optional(),
141
183
  views: z.array(appViewSchema).max(200).optional(),
142
- /** Reserved for a future FullPageView. Stored and validated, not rendered. */
143
- routes: z
144
- .array(z.strictObject({
145
- path: z.string().max(200).regex(/^\/[a-z0-9\-/:]*$/),
146
- component: z.string().max(100).regex(new RegExp(COMPONENT_NAME_PATTERN)),
147
- }))
148
- .max(50)
149
- .optional(),
184
+ /** App pages, each a full screen under `/{portal}/apps/{appId}/pages`. */
185
+ routes: z.array(appRouteSchema).max(APP_ROUTES_MAX).optional(),
150
186
  csp: appCspSchema.optional(),
151
187
  })
152
188
  .optional(),
153
189
  post_install_action: z
154
190
  .strictObject({
155
- type: z.enum(["url", "app_settings_view", "app_main_view"]),
191
+ type: z.enum(["url", "app_settings_view", "app_main_view", "app_page"]),
156
192
  url: httpsUrlSchema.optional(),
193
+ /**
194
+ * For `app_page` only: the page to open, a concrete path (no `:params`) that one of
195
+ * `ui_extensions.routes` matches, such as `/welcome` or `/reports/7`.
196
+ */
197
+ path: z.string().max(ROUTE_PATH_MAX_CHARS).regex(new RegExp(CONCRETE_ROUTE_PATH_PATTERN)).optional(),
157
198
  })
158
199
  .optional(),
159
200
  // The app's own webhook endpoint: registered by the catalog when the manifest is published, not
@@ -167,31 +208,50 @@ export const appManifestSchema = z
167
208
  .optional(),
168
209
  })
169
210
  .superRefine((manifest, ctx) => {
170
- addDuplicateViewportIssues(manifest.ui_extensions?.views, ctx, ["ui_extensions", "views"]);
171
- addCspBudgetIssue(manifest.ui_extensions?.csp, ctx, ["ui_extensions", "csp"]);
172
211
  const events = manifest.webhooks?.events ?? [];
173
212
  if (new Set(events).size !== events.length) {
174
213
  ctx.addIssue({ code: "custom", path: ["webhooks", "events"], message: "events must not repeat" });
175
214
  }
176
- if (manifest.ui_extensions?.views?.length && !manifest.ui_extensions.bundle) {
215
+ if (manifest.post_install_action?.type === "url" && !manifest.post_install_action.url) {
216
+ ctx.addIssue({ code: "custom", path: ["post_install_action", "url"], message: "url is required for type=url" });
217
+ }
218
+ if (manifest.post_install_action?.type !== "app_page" && manifest.post_install_action?.path !== undefined) {
219
+ ctx.addIssue({ code: "custom", path: ["post_install_action", "path"], message: "path is only allowed for type=app_page" });
220
+ }
221
+ // When a field under `ui_extensions` fails its own schema, zod hands this refinement the
222
+ // manifest without `ui_extensions`, so every rule below would report a problem that isn't
223
+ // there (a missing settings view, an unmatched post-install page). Report the real one only.
224
+ if (ctx.issues.some((issue) => issue.path?.[0] === "ui_extensions"))
225
+ return;
226
+ addDuplicateViewportIssues(manifest.ui_extensions?.views, ctx, ["ui_extensions", "views"]);
227
+ addRouteIssues(manifest.ui_extensions?.routes, ctx, ["ui_extensions", "routes"]);
228
+ addCspBudgetIssue(manifest.ui_extensions?.csp, ctx, ["ui_extensions", "csp"]);
229
+ const hasViews = Boolean(manifest.ui_extensions?.views?.length);
230
+ const hasRoutes = Boolean(manifest.ui_extensions?.routes?.length);
231
+ if (hasViews && !manifest.ui_extensions?.bundle) {
177
232
  ctx.addIssue({
178
233
  code: "custom",
179
234
  path: ["ui_extensions", "bundle"],
180
235
  message: "bundle is required when views are declared",
181
236
  });
182
237
  }
238
+ if (hasRoutes && !manifest.ui_extensions?.bundle) {
239
+ ctx.addIssue({
240
+ code: "custom",
241
+ path: ["ui_extensions", "bundle"],
242
+ message: "bundle is required when routes are declared",
243
+ });
244
+ }
183
245
  // `version` stays optional only for legacy (v1) manifests. Anything the host renders needs one:
184
246
  // it names the runtime URL and reaches views as `ExtensionContext.app.version`.
185
- if ((manifest.ui_extensions?.bundle || manifest.ui_extensions?.views?.length) && !manifest.version) {
247
+ if ((manifest.ui_extensions?.bundle || hasViews || hasRoutes) && !manifest.version) {
186
248
  ctx.addIssue({
187
249
  code: "custom",
188
250
  path: ["version"],
189
- message: "version is required when ui_extensions declares a bundle or views",
251
+ message: "version is required when ui_extensions declares a bundle, views or routes",
190
252
  });
191
253
  }
192
- if (manifest.post_install_action?.type === "url" && !manifest.post_install_action.url) {
193
- ctx.addIssue({ code: "custom", path: ["post_install_action", "url"], message: "url is required for type=url" });
194
- }
254
+ addAppPageActionIssues(manifest, ctx);
195
255
  // A back-end-only app has no views, so it cannot land installers on one. Checked only for
196
256
  // versioned (v2) manifests: v1 apps may carry a post-install view type from before views existed.
197
257
  const viewports = new Set((manifest.ui_extensions?.views ?? []).map((v) => v.viewport));
@@ -204,28 +264,58 @@ export const appManifestSchema = z
204
264
  });
205
265
  }
206
266
  // The settings page is not a main view: a settings-only app should land on app_settings_view.
207
- const mainViewports = [...viewports].filter((v) => v !== "settings");
208
- if (versioned && manifest.post_install_action?.type === "app_main_view" && mainViewports.length === 0) {
267
+ // A root page (route `/`) is one: installing opens `/{portal}/apps/{id}/pages`.
268
+ if (versioned && manifest.post_install_action?.type === "app_main_view" && !hasMainView(manifest)) {
209
269
  ctx.addIssue({
210
270
  code: "custom",
211
271
  path: ["post_install_action", "type"],
212
- message: "app_main_view requires a view other than settings",
272
+ message: "app_main_view requires a view other than settings, or a root route",
213
273
  });
214
274
  }
215
275
  });
276
+ /**
277
+ * The rules for `post_install_action.path`: required for `app_page` and allowed nowhere else, a
278
+ * concrete path within the route limits, and one that a declared route matches (`/reports/7` for a
279
+ * `/reports/:id` route), so installing never opens a page the app does not have.
280
+ */
281
+ function addAppPageActionIssues(manifest, ctx) {
282
+ const action = manifest.post_install_action;
283
+ if (action === undefined)
284
+ return;
285
+ const path = ["post_install_action", "path"];
286
+ // `path` on another type is reported by the manifest refinement, before the rules that need
287
+ // `ui_extensions`.
288
+ if (action.type !== "app_page")
289
+ return;
290
+ if (action.path === undefined) {
291
+ ctx.addIssue({ code: "custom", path, message: "path is required for type=app_page" });
292
+ }
293
+ else if (!isConcreteRoutePath(action.path)) {
294
+ ctx.addIssue({ code: "custom", path, message: "path must be a page path without :params, such as /reports/7" });
295
+ }
296
+ else if (matchAppRoute(manifest.ui_extensions?.routes ?? [], action.path) === null) {
297
+ ctx.addIssue({ code: "custom", path, message: "path must match one of ui_extensions.routes" });
298
+ }
299
+ }
300
+ /** Whether a manifest has a main view to land on: a view other than settings, or a root page `/`. */
301
+ function hasMainView(manifest) {
302
+ const views = manifest.ui_extensions?.views ?? [];
303
+ const routes = manifest.ui_extensions?.routes ?? [];
304
+ return views.some((v) => v.viewport !== "settings") || routes.some((r) => r.path === "/");
305
+ }
216
306
  /**
217
307
  * What installing the app does when `post_install_action` is left out, so the server and the host
218
308
  * never land an installer on a view the app does not have: nothing for a back-end-only app, the
219
- * settings page for a settings-only app, and the app's main view otherwise. `null` means
220
- * "no post-install step". An explicit action is returned unchanged.
309
+ * settings page for a settings-only app, and the app's main view otherwise. A root page (route
310
+ * `/`) counts as a main view. `null` means "no post-install step". An explicit action, including
311
+ * `app_page`, is returned unchanged.
221
312
  */
222
313
  export function effectivePostInstallAction(manifest) {
223
314
  if (manifest.post_install_action)
224
315
  return manifest.post_install_action;
225
- const viewports = (manifest.ui_extensions?.views ?? []).map((v) => v.viewport);
226
- if (viewports.some((v) => v !== "settings"))
316
+ if (hasMainView(manifest))
227
317
  return { type: "app_main_view" };
228
- if (viewports.includes("settings"))
318
+ if ((manifest.ui_extensions?.views ?? []).some((v) => v.viewport === "settings"))
229
319
  return { type: "app_settings_view" };
230
320
  return null;
231
321
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/apps/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/apps/manifest.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ export interface RemoteConnection {
12
12
  }
13
13
  /** `@remote-dom/core` mutation records: insert child, remove child, update text, update property. */
14
14
  export type RemoteMutationRecord = readonly [type: 0, parentId: string, child: unknown, index: number] | readonly [type: 1, parentId: string, index: number] | readonly [type: 2, textId: string, text: string] | readonly [type: 3, id: string, name: string, value: unknown, updateType?: 1 | 2 | 3];
15
- export type ViewType = "context" | "focus" | "settings";
15
+ export type ViewType = "context" | "focus" | "settings" | "page";
16
16
  /** Implemented inside the worker by the SDK runtime (`defineApp`). */
17
17
  export interface SandboxExports {
18
18
  mount(args: {
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/apps/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/apps/protocol.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type SurfaceId } from "./surfaces.js";
2
- /** Values the destination view receives as `environment.queryParams`. Strings only. */
2
+ /** Values the destination view receives as `environment.navParams`, never as `queryParams`. Strings only. */
3
3
  export type EnvParams = Record<string, string>;
4
4
  export type RouteDescriptor =
5
5
  /** The screen a surface lives on, optionally for one record (detail surfaces). */
@@ -13,6 +13,16 @@ export type RouteDescriptor =
13
13
  | {
14
14
  type: "appSettings";
15
15
  envParams?: EnvParams;
16
+ }
17
+ /**
18
+ * One of the calling app's own pages, by concrete path in the app's space (`/reports/7`, not
19
+ * `/reports/:id`). The host checks that it matches one of the app's routes offered in the
20
+ * current portal. There is no `appId`: an app can only open its own pages.
21
+ */
22
+ | {
23
+ type: "appPage";
24
+ path: string;
25
+ envParams?: EnvParams;
16
26
  };
17
27
  export declare function isRouteDescriptor(value: unknown): value is RouteDescriptor;
18
28
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/apps/route.ts"],"names":[],"mappings":"AAQA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5D,uFAAuF;AACvF,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,eAAe;AACzB,kFAAkF;AAChF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE;AACrF,oEAAoE;GAClE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAEnD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAmB1E"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/apps/route.ts"],"names":[],"mappings":"AAUA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3D,6GAA6G;AAC7G,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,eAAe;AACzB,kFAAkF;AAChF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE;AACrF,oEAAoE;GAClE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE;AAChD;;;;GAIG;GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAE7D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAuB1E"}
@@ -2,10 +2,12 @@
2
2
  * Hand-written (not generated by Speakeasy). Part of the third-party app platform contract;
3
3
  * see docs/third-party-apps/plan.md.
4
4
  *
5
- * Apps never navigate by path. They name a destination and the host maps it to its own routes,
6
- * which keeps host URLs free to change and stops an app from steering users to arbitrary pages.
5
+ * Apps never navigate by host path. They name a destination and the host maps it to its own
6
+ * routes, which keeps host URLs free to change and stops an app from steering users to arbitrary
7
+ * pages. The one path an app writes, `appPage`, is a path inside its own pages space.
7
8
  */
8
- import { isSurfaceId } from "./surfaces.js";
9
+ import { isConcreteRoutePath } from "./routes.js";
10
+ import { getSurface } from "./surfaces.js";
9
11
  export function isRouteDescriptor(value) {
10
12
  if (typeof value !== "object" || value === null || !("type" in value))
11
13
  return false;
@@ -14,14 +16,18 @@ export function isRouteDescriptor(value) {
14
16
  return false;
15
17
  switch (v["type"]) {
16
18
  case "surface":
17
- // Only catalog surfaces: the host has no route for anything else. Safe integers only, so a
18
- // record id is never silently rounded on its way through JSON. `settings` is reachable only
19
- // as `appSettings`, which always means the calling app: as a plain surface its `objectId`
20
- // would name another app's settings page.
21
- return isSurfaceId(v["surfaceId"]) && v["surfaceId"] !== "settings" &&
19
+ // Only catalog surfaces of a portal: the host has no route for anything else. Safe integers
20
+ // only, so a record id is never silently rounded on its way through JSON. The portal-less
21
+ // surfaces belong to an app and are reachable only through descriptors that always mean the
22
+ // calling app (`appSettings`, `appPage`): as a plain surface, `objectId` would name another
23
+ // app's settings page or pages.
24
+ return typeof v["surfaceId"] === "string" && (getSurface(v["surfaceId"])?.portal ?? null) !== null &&
22
25
  (v["objectId"] === undefined || (Number.isSafeInteger(v["objectId"]) && v["objectId"] > 0));
23
26
  case "appSettings":
24
27
  return true;
28
+ case "appPage":
29
+ // Concrete paths only, in the route grammar: no params, dots, escapes or empty segments.
30
+ return isConcreteRoutePath(v["path"]);
25
31
  default:
26
32
  return false;
27
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/apps/route.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,eAAe,CAAC;AAW5D,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpF,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/E,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,2FAA2F;YAC3F,4FAA4F;YAC5F,0FAA0F;YAC1F,0CAA0C;YAC1C,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,UAAU;gBACjE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAK,CAAC,CAAC,UAAU,CAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5G,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/apps/route.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAiB3D,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpF,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/E,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,4FAA4F;YAC5F,0FAA0F;YAC1F,4FAA4F;YAC5F,4FAA4F;YAC5F,gCAAgC;YAChC,OAAO,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI;gBAChG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAK,CAAC,CAAC,UAAU,CAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5G,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,yFAAyF;YACzF,OAAO,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * A declared route path: `/`, or `/seg(/seg)*` where each segment is static or a `:param`. No dots,
3
+ * percent-escapes, upper case, empty segments or trailing slash, so no path can climb out of the
4
+ * app's own space. `pages` is not reserved inside that space: `/pages/foo` is an ordinary path.
5
+ */
6
+ export declare const ROUTE_PATH_PATTERN = "^/(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|:[a-z][a-z0-9_]*)(?:/(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|:[a-z][a-z0-9_]*))*)?$";
7
+ /** A concrete path an app navigates to (`{ type: "appPage" }`): the same grammar without params. */
8
+ export declare const CONCRETE_ROUTE_PATH_PATTERN = "^/(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:/[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*)?$";
9
+ export declare const ROUTE_PATH_MAX_CHARS = 200;
10
+ /** Segments in one path; `/` has none. */
11
+ export declare const ROUTE_PATH_MAX_SEGMENTS = 8;
12
+ /** Routes in one manifest. */
13
+ export declare const APP_ROUTES_MAX = 50;
14
+ /** A declared route path: the {@link ROUTE_PATH_PATTERN} grammar, ≤ 200 characters and ≤ 8 segments. */
15
+ export declare function isRoutePath(value: unknown): value is string;
16
+ /** A concrete route path (no `:param` segments) within the same limits as a declared one. */
17
+ export declare function isConcreteRoutePath(value: unknown): value is string;
18
+ /**
19
+ * Renames every param segment to `:_`. Two paths that normalize to the same string claim the same
20
+ * URLs (`/vendors/:id` and `/vendors/:vendor_id`), so a manifest may declare only one of them.
21
+ */
22
+ export declare function normalizeRoutePath(path: string): string;
23
+ export interface RouteSetIssue {
24
+ /** Index of the offending entry in `routes`. */
25
+ index: number;
26
+ field: "path" | "portals" | "navigation";
27
+ message: string;
28
+ }
29
+ /**
30
+ * The rules over a set of routes that a pattern alone cannot express: the segment cap, a param
31
+ * name used twice in one path, two paths claiming the same URLs, and a repeated portal. Grammar,
32
+ * length and the per-field limits are the schema's job; a path that fails the grammar is skipped
33
+ * here. The zod schema and `apps-cli validate` both report these, and the server repeats them.
34
+ */
35
+ export declare function routeSetIssues(routes: ReadonlyArray<{
36
+ path: string;
37
+ portals?: readonly string[] | undefined;
38
+ navigation?: unknown;
39
+ }>): RouteSetIssue[];
40
+ export interface AppRouteMatch<R> {
41
+ route: R;
42
+ /** Param values by name, percent-decoded. Always strings: the app parses ids itself. */
43
+ params: Record<string, string>;
44
+ /** Index of `route` in the list passed to {@link matchAppRoute}. */
45
+ index: number;
46
+ }
47
+ /**
48
+ * Finds the route a pathname in the app's own space renders (`/reports/7` for
49
+ * `/{portal}/apps/{appId}/pages/reports/7`), or `null` when none does.
50
+ *
51
+ * `pathname` is URL-encoded, as it appears in a URL: `/` or `/seg(/seg)*` with no empty segment,
52
+ * trailing slash, query or fragment (anything else matches nothing). A host that receives decoded
53
+ * segments encodes each with `encodeURIComponent` before joining them.
54
+ *
55
+ * A static route segment matches only the identical pathname segment. A param segment matches any
56
+ * other segment that decodes to a plain value (see `paramValue`); a segment containing `:` never
57
+ * matches a param. When several routes match, the one with a static segment at the first position
58
+ * where they differ wins (static before param, left to right); among equals, the first declared.
59
+ * Routes whose path is not in the grammar are ignored, so a stale or hand-edited feed entry can
60
+ * never match.
61
+ */
62
+ export declare function matchAppRoute<R extends {
63
+ path: string;
64
+ }>(routes: readonly R[], pathname: string): AppRouteMatch<R> | null;
65
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/apps/routes.ts"],"names":[],"mappings":"AAkBA;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,2HAC2F,CAAC;AAE3H,oGAAoG;AACpG,eAAO,MAAM,2BAA2B,iFAAqD,CAAC;AAE9F,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,0CAA0C;AAC1C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,8BAA8B;AAC9B,eAAO,MAAM,cAAc,KAAK,CAAC;AAkBjC,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE3D;AAED,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACrG,aAAa,EAAE,CAgDjB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC;IACT,wFAAwF;IACxF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACtD,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,QAAQ,EAAE,MAAM,GACf,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAazB"}