@gradial/aci 0.1.52-rc.3 → 0.1.52-rc.34-e2e.1

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 (276) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +86 -5
  3. package/dist/astro/error-page.js +1 -0
  4. package/dist/astro/index.js +4 -0
  5. package/dist/astro/page.d.ts +5 -2
  6. package/dist/astro/page.js +35 -23
  7. package/dist/astro/preview.js +2 -17
  8. package/dist/audience-data-models.d.ts +308 -194
  9. package/dist/audience-data-models.js +314 -51
  10. package/dist/cli/compile-registry.d.mts +5 -1
  11. package/dist/cli/compile-registry.mjs +31 -46
  12. package/dist/cli/mintlify-render.mjs +8 -0
  13. package/dist/cli/validate-content.d.mts +31 -1
  14. package/dist/cli/validate-content.mjs +50 -12
  15. package/dist/collect/aci.js +1 -1
  16. package/dist/collect/aci.js.sha256 +1 -1
  17. package/dist/collect/api.d.ts +6 -7
  18. package/dist/collect/api.js +21 -8
  19. package/dist/collect/assignments.d.ts +7 -9
  20. package/dist/collect/assignments.js +23 -32
  21. package/dist/collect/batcher.d.ts +9 -7
  22. package/dist/collect/batcher.js +6 -5
  23. package/dist/collect/consent/envelope.d.ts +7 -1
  24. package/dist/collect/consent/envelope.js +3 -1
  25. package/dist/collect/consent/mapping.d.ts +2 -0
  26. package/dist/collect/consent/mapping.js +1 -0
  27. package/dist/collect/consenthold.d.ts +38 -0
  28. package/dist/collect/consenthold.js +82 -0
  29. package/dist/collect/declarative.js +7 -5
  30. package/dist/collect/gapbuffer.d.ts +13 -4
  31. package/dist/collect/gapbuffer.js +21 -10
  32. package/dist/collect/index.js +67 -20
  33. package/dist/collect/pageviews.d.ts +11 -11
  34. package/dist/collect/pageviews.js +27 -22
  35. package/dist/consent-banner/index.d.ts +17 -0
  36. package/dist/consent-banner/index.js +23 -0
  37. package/dist/content/index.d.ts +2 -1
  38. package/dist/content/index.js +4 -1
  39. package/dist/content/provider.d.ts +16 -2
  40. package/dist/content/provider.js +5 -1
  41. package/dist/content/resolve-slots.d.ts +33 -4
  42. package/dist/content/resolve-slots.js +127 -19
  43. package/dist/content/types.d.ts +7 -1
  44. package/dist/edge/expression-capabilities.v1.d.ts +106 -0
  45. package/dist/edge/expression-capabilities.v1.js +165 -0
  46. package/dist/index.d.ts +1 -2
  47. package/dist/index.js +0 -1
  48. package/dist/internal/domain/edge/compose.d.ts +24 -0
  49. package/dist/internal/domain/edge/compose.js +89 -0
  50. package/dist/internal/domain/edge/identity.d.ts +5 -0
  51. package/dist/internal/domain/edge/identity.js +50 -14
  52. package/dist/internal/domain/edge/index.d.ts +2 -0
  53. package/dist/internal/domain/edge/index.js +2 -0
  54. package/dist/internal/domain/edge/mimic_token.d.ts +14 -0
  55. package/dist/internal/domain/edge/mimic_token.js +125 -0
  56. package/dist/internal/domain/edge/personalization-core.d.ts +61 -22
  57. package/dist/internal/domain/edge/personalization-core.js +789 -198
  58. package/dist/internal/domain/edge/personalization_index.d.ts +17 -0
  59. package/dist/internal/domain/edge/personalization_index.js +56 -0
  60. package/dist/internal/domain/edge/record/codec.d.ts +6 -32
  61. package/dist/internal/domain/edge/record/codec.js +86 -168
  62. package/dist/internal/domain/edge/resolve.js +76 -39
  63. package/dist/internal/domain/edge/testdata/flat_only_validator_v1.d.ts +10 -0
  64. package/dist/internal/domain/edge/testdata/flat_only_validator_v1.js +253 -0
  65. package/dist/internal/domain/edge/types.d.ts +93 -41
  66. package/dist/internal/domain/edge/types.js +3 -3
  67. package/dist/internal/domain/edge/variant_key.d.ts +3 -0
  68. package/dist/internal/domain/edge/variant_key.js +44 -0
  69. package/dist/internal/platform/collectionstore/errors.d.ts +24 -0
  70. package/dist/internal/platform/collectionstore/errors.js +48 -0
  71. package/dist/mimic/core.d.ts +2 -0
  72. package/dist/mimic/core.js +31 -0
  73. package/dist/mintlify/blocks.d.ts +6 -0
  74. package/dist/mintlify/blocks.js +201 -0
  75. package/dist/mintlify/config.d.ts +3 -0
  76. package/dist/mintlify/config.js +77 -0
  77. package/dist/mintlify/index.d.ts +3 -0
  78. package/dist/mintlify/index.js +2 -0
  79. package/dist/mintlify/json.d.ts +8 -0
  80. package/dist/mintlify/json.js +37 -0
  81. package/dist/mintlify/materialize.d.ts +14 -0
  82. package/dist/mintlify/materialize.js +254 -0
  83. package/dist/mintlify/types.d.ts +74 -0
  84. package/dist/mintlify/types.js +1 -0
  85. package/dist/mintlify/validate.d.ts +7 -0
  86. package/dist/mintlify/validate.js +256 -0
  87. package/dist/next/assignments-navigation.d.ts +4 -0
  88. package/dist/next/assignments-navigation.js +18 -0
  89. package/dist/next/assignments-script.d.ts +3 -2
  90. package/dist/next/assignments-script.js +5 -5
  91. package/dist/next/error-pages.d.ts +4 -0
  92. package/dist/next/error-pages.js +4 -0
  93. package/dist/next/error-seat-payload.d.ts +2 -1
  94. package/dist/next/error-seat-payload.js +14 -24
  95. package/dist/next/error-seat.js +7 -2
  96. package/dist/next/hosted-page-target.d.ts +7 -0
  97. package/dist/next/hosted-page-target.js +39 -0
  98. package/dist/next/index.d.ts +1 -1
  99. package/dist/next/index.js +3 -1
  100. package/dist/next/page.d.ts +29 -6
  101. package/dist/next/page.js +47 -25
  102. package/dist/next/release-context.d.ts +29 -0
  103. package/dist/next/release-context.js +55 -0
  104. package/dist/next/render.d.ts +1 -1
  105. package/dist/next/render.js +15 -5
  106. package/dist/next/server.d.ts +8 -0
  107. package/dist/next/server.js +44 -3
  108. package/dist/next/vercel-edge-projection-v1.d.ts +0 -9
  109. package/dist/next/vercel-edge-projection-v1.js +9 -539
  110. package/dist/preview/core.d.ts +1 -0
  111. package/dist/preview/core.js +27 -0
  112. package/dist/react/VideoPlayer.d.ts +3 -3
  113. package/dist/react/VideoPlayer.js +2 -2
  114. package/dist/react/index.d.ts +4 -4
  115. package/dist/react/index.js +2 -3
  116. package/dist/registry.d.ts +4 -2
  117. package/dist/testing/conformance/checks.d.ts +2 -2
  118. package/dist/testing/conformance/checks.js +2 -0
  119. package/dist/testing/conformance/index.d.ts +1 -0
  120. package/dist/testing/conformance/index.js +1 -0
  121. package/dist/testing/conformance/next-stubs.d.ts +6 -0
  122. package/dist/testing/conformance/next-stubs.js +9 -0
  123. package/dist/testing/conformance/preset.d.ts +3 -2
  124. package/dist/testing/conformance/preset.js +15 -8
  125. package/dist/testing/conformance/root-identity.d.ts +31 -0
  126. package/dist/testing/conformance/root-identity.js +361 -0
  127. package/dist/testing/conformance/stubs/next-image.d.ts +7 -0
  128. package/dist/testing/conformance/stubs/next-image.js +5 -0
  129. package/dist/testing/conformance/stubs/next-link.d.ts +7 -0
  130. package/dist/testing/conformance/stubs/next-link.js +4 -0
  131. package/dist/testing/conformance/types.d.ts +5 -2
  132. package/dist/testing/index.d.ts +1 -1
  133. package/dist/testing/index.js +4 -3
  134. package/dist/types/block-ref.d.ts +2 -0
  135. package/dist/types/block-ref.js +3 -2
  136. package/dist/types/component.d.ts +9 -0
  137. package/dist/types/config.d.ts +0 -1
  138. package/dist/types/image.d.ts +54 -17
  139. package/dist/types/image.js +102 -18
  140. package/dist/types/index.d.ts +0 -1
  141. package/dist/types/index.js +0 -1
  142. package/dist/types/media.d.ts +14 -6
  143. package/dist/types/page.d.ts +0 -1
  144. package/dist/types/video.d.ts +7 -3
  145. package/migrations/conformance-registry.md +22 -0
  146. package/package.json +21 -7
  147. package/src/cli/compile-registry.mjs +30 -42
  148. package/src/cli/mintlify-render.mjs +9 -0
  149. package/src/cli/validate-content.mjs +52 -13
  150. package/src/types/block-ref.test.ts +60 -0
  151. package/src/types/block-ref.ts +4 -2
  152. package/src/types/component.ts +10 -0
  153. package/src/types/config.ts +0 -1
  154. package/src/types/image.ts +133 -29
  155. package/src/types/index.ts +0 -1
  156. package/src/types/page.ts +0 -1
  157. package/src/types/video.ts +1 -1
  158. package/templates/astro/starter-content/src/components/chrome/Footer.astro +5 -3
  159. package/templates/astro/starter-content/src/components/chrome/Header.astro +5 -3
  160. package/templates/astro/starter-content/src/components/elements/Button.astro +5 -2
  161. package/templates/astro/starter-content/src/components/elements/ButtonBlock.astro +5 -3
  162. package/templates/astro/starter-content/src/components/sections/ContainerSection.astro +4 -3
  163. package/templates/astro/starter-content/src/components/sections/FeatureCard.astro +4 -3
  164. package/templates/astro/starter-content/src/components/sections/FeatureGrid.astro +4 -3
  165. package/templates/astro/starter-content/src/components/sections/HomeHero.astro +5 -3
  166. package/templates/astro/starter-content/src/components/sections/PersonalizationChoice.astro +4 -3
  167. package/templates/astro/starter-content/src/components/sections/StatsBar.astro +4 -3
  168. package/templates/astro/starter-content/src/fixtures/atomicBlocks.ts +7 -6
  169. package/templates/astro/starter-content/src/fixtures/composition.ts +3 -2
  170. package/templates/astro/starter-content/src/fixtures/sections.ts +3 -3
  171. package/templates/astro/starter-content/src/stories/CompositionStoryFrame.astro +7 -2
  172. package/templates/astro/template/.aci.yaml.tmpl +0 -1
  173. package/templates/astro/template/package.json.tmpl +5 -5
  174. package/templates/astro/template/src/layouts/SiteLayout.astro +2 -2
  175. package/templates/common/.agents/skills/aci/SKILL.md +58 -1
  176. package/templates/common/.agents/skills/authoring/SKILL.md +203 -43
  177. package/templates/common/.agents/skills/authoring/references/block-registry.md +19 -3
  178. package/templates/common/.agents/skills/authoring/references/block-slots.md +3 -0
  179. package/templates/common/.agents/skills/authoring/references/contracts.md +9 -30
  180. package/templates/common/.agents/skills/authoring/references/repo-structure.md +5 -4
  181. package/templates/common/.agents/skills/authoring/references/sdk-server-functions.md +3 -3
  182. package/templates/common/.agents/skills/dam-delivery/SKILL.md +217 -0
  183. package/templates/common/.agents/skills/dam-delivery/references/permalink-grammar.md +167 -0
  184. package/templates/common/.agents/skills/migration/references/canon-migration.md +18 -67
  185. package/templates/common/.agents/skills/migration/references/selector-map.md +1 -1
  186. package/templates/common/.content/fragments/navbar/_index.json +24 -0
  187. package/templates/common/.content/fragments/site-footer/_index.json +61 -0
  188. package/templates/common/.content/pages/404/_index.json +4 -2
  189. package/templates/common/.content/pages/{home/_index.json → _index.json} +10 -1
  190. package/templates/common/.content/pages/error/_index.json +4 -2
  191. package/templates/common/.content/schemas/site.schema.json +11 -1
  192. package/templates/common/.content/templates/error.json +24 -0
  193. package/templates/common/.content/templates/home.json +28 -0
  194. package/templates/common/.content/templates/site.json +8 -0
  195. package/templates/common/.content/templates/standard.json +24 -0
  196. package/templates/common/.nvmrc +1 -1
  197. package/templates/common/starter-content/.content/.rules-baseline.json +8 -0
  198. package/templates/common/starter-content/.content/config/site.json +1 -1
  199. package/templates/common/starter-content/.content/content-rules/no-public-resource-paths.json +6 -0
  200. package/templates/common/starter-content/.content/dam/README.md +74 -0
  201. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000101}/asset.json +1 -1
  202. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000101}/governance.json +2 -1
  203. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000102}/asset.json +1 -1
  204. package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000102}/governance.json +2 -1
  205. package/templates/common/starter-content/.content/fragments/navbar/_index.json +23 -20
  206. package/templates/common/starter-content/.content/fragments/site-footer/_index.json +59 -56
  207. package/templates/common/starter-content/.content/pages/404/_index.json +2 -2
  208. package/templates/common/starter-content/.content/pages/{home/_index.json → _index.json} +23 -3
  209. package/templates/common/starter-content/.content/pages/about/_index.json +5 -2
  210. package/templates/common/starter-content/.content/pages/error/_index.json +2 -2
  211. package/templates/common/starter-content/.content/patterns/components/button.json +55 -0
  212. package/templates/common/starter-content/.content/patterns/components/container.json +67 -0
  213. package/templates/common/starter-content/.content/patterns/components/feature_card.json +30 -0
  214. package/templates/common/starter-content/.content/patterns/components/feature_grid.json +59 -0
  215. package/templates/common/starter-content/.content/patterns/components/home_hero.json +151 -0
  216. package/templates/common/starter-content/.content/patterns/components/personalization_choice.json +42 -0
  217. package/templates/common/starter-content/.content/patterns/components/site-footer.json +203 -0
  218. package/templates/common/starter-content/.content/patterns/components/site-navigation.json +115 -0
  219. package/templates/common/starter-content/.content/patterns/components/stats_bar.json +45 -0
  220. package/templates/common/starter-content/.content/schemas/site.schema.json +11 -1
  221. package/templates/nextjs/starter-content/src/components/chrome/Footer.tsx +4 -3
  222. package/templates/nextjs/starter-content/src/components/chrome/Header.tsx +4 -3
  223. package/templates/nextjs/starter-content/src/components/elements/Button.tsx +4 -3
  224. package/templates/nextjs/starter-content/src/components/elements/ButtonBlock.tsx +4 -3
  225. package/templates/nextjs/starter-content/src/components/sections/ContainerSection.tsx +4 -2
  226. package/templates/nextjs/starter-content/src/components/sections/FeatureCard.tsx +4 -3
  227. package/templates/nextjs/starter-content/src/components/sections/FeatureGrid.tsx +4 -2
  228. package/templates/nextjs/starter-content/src/components/sections/HomeHero.tsx +4 -3
  229. package/templates/nextjs/starter-content/src/components/sections/PersonalizationChoice.tsx +4 -2
  230. package/templates/nextjs/starter-content/src/components/sections/StatsBar.tsx +4 -3
  231. package/templates/nextjs/template/.aci.yaml +9 -0
  232. package/templates/nextjs/template/.aci.yaml.tmpl +0 -1
  233. package/templates/nextjs/template/package.json.tmpl +4 -3
  234. package/templates/nextjs/template/src/app/_components/c15t-bridge.ts +30 -0
  235. package/templates/nextjs/template/src/app/_components/c15t-consent-ui.tsx +37 -0
  236. package/templates/nextjs/template/src/app/_components/consent-manager.css +63 -0
  237. package/templates/nextjs/template/src/app/_components/consent-manager.tsx +76 -0
  238. package/templates/nextjs/template/src/app/fonts/inter/OFL.txt +93 -0
  239. package/templates/nextjs/template/src/app/fonts/inter/inter-latin.woff2 +0 -0
  240. package/templates/nextjs/template/src/app/fonts/space-grotesk/OFL.txt +93 -0
  241. package/templates/nextjs/template/src/app/fonts/space-grotesk/space-grotesk-latin.woff2 +0 -0
  242. package/templates/nextjs/template/src/app/layout.tsx +12 -7
  243. package/templates/nextjs/template/tests/conformance.test.ts.tmpl +1 -0
  244. package/dist/define-layout.d.ts +0 -6
  245. package/dist/define-layout.js +0 -14
  246. package/dist/edge/personalization-core.d.ts +0 -11
  247. package/dist/edge/personalization-core.js +0 -269
  248. package/dist/next/collect-route.d.ts +0 -19
  249. package/dist/next/collect-route.js +0 -459
  250. package/dist/next/envelope-digest.d.ts +0 -21
  251. package/dist/next/envelope-digest.js +0 -58
  252. package/dist/next/middleware.d.ts +0 -40
  253. package/dist/next/middleware.js +0 -475
  254. package/dist/next/personalization-host.d.ts +0 -134
  255. package/dist/next/personalization-host.js +0 -270
  256. package/dist/next/root-layout.d.ts +0 -4
  257. package/dist/next/root-layout.js +0 -5
  258. package/dist/next/vercel-collect-sdk-route.d.ts +0 -27
  259. package/dist/next/vercel-collect-sdk-route.js +0 -181
  260. package/dist/next/vercel-personalization.d.ts +0 -4
  261. package/dist/next/vercel-personalization.js +0 -4
  262. package/dist/next/vercel-s3-personalization.d.ts +0 -79
  263. package/dist/next/vercel-s3-personalization.js +0 -570
  264. package/dist/types/layout.d.ts +0 -24
  265. package/src/types/layout.ts +0 -29
  266. package/templates/astro/starter-content/src/render/RenderPage.astro +0 -67
  267. package/templates/astro/template/src/cms/contracts/layouts/index.ts +0 -18
  268. package/templates/nextjs/starter-content/src/components/elements/AtomicBlock.tsx +0 -13
  269. package/templates/nextjs/template/src/cms/contracts/layouts/index.ts +0 -16
  270. /package/dist/{types/layout.js → cli/mintlify-render.d.mts} +0 -0
  271. /package/templates/common/.content/overlays/audience/preference-blue/pages/{home/_index.json → _index.json} +0 -0
  272. /package/templates/common/.content/overlays/audience/preference-red/pages/{home/_index.json → _index.json} +0 -0
  273. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000101}/editorial.json +0 -0
  274. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_home_hero → 000000000000000000000000101}/versions/v0001.json +0 -0
  275. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000102}/editorial.json +0 -0
  276. /package/templates/common/starter-content/.content/dam/folders/seed/{ast_site_about_hero → 000000000000000000000000102}/versions/v0001.json +0 -0
@@ -7,7 +7,7 @@
7
7
  /** Supported framework identifiers. */
8
8
  export type ConformanceFramework = 'next' | 'astro';
9
9
  /** Individual check names that can be enabled/disabled. */
10
- export type ConformanceCheckName = 'config' | 'registry' | 'pageEntry' | 'middleware' | 'noFileContentProvider' | 'noCustomContent' | 'noRequestTimeAssetRoute' | 'buildSucceeds' | 'contentCompile' | 'sdkVersion';
10
+ export type ConformanceCheckName = 'config' | 'registry' | 'pageEntry' | 'middleware' | 'noFileContentProvider' | 'noCustomContent' | 'noRequestTimeAssetRoute' | 'buildSucceeds' | 'contentCompile' | 'sdkVersion' | 'rootIdentity';
11
11
  /**
12
12
  * Options for the conformance preset.
13
13
  *
@@ -29,6 +29,8 @@ export interface ConformancePresetOptions {
29
29
  * check verifies .aci.yaml does NOT declare a siteId.
30
30
  */
31
31
  siteId?: string;
32
+ /** Render registry module, relative to rootDir (or absolute). Required for Next rootIdentity. */
33
+ registry?: string;
32
34
  /** Root directory of the site project. Defaults to process.cwd(). */
33
35
  rootDir?: string;
34
36
  /**
@@ -51,11 +53,12 @@ export interface ConformanceResult {
51
53
  failures: ConformanceCheckResult[];
52
54
  }
53
55
  /** A conformance check function. */
54
- export type ConformanceCheckFn = (ctx: ConformanceContext) => ConformanceCheckResult[];
56
+ export type ConformanceCheckFn = (ctx: ConformanceContext) => ConformanceCheckResult[] | Promise<ConformanceCheckResult[]>;
55
57
  /** Context passed to each check function. */
56
58
  export interface ConformanceContext {
57
59
  framework: ConformanceFramework;
58
60
  /** Canonical siteId from options, or '' when not provided. */
59
61
  siteId: string;
60
62
  rootDir: string;
63
+ registry?: string;
61
64
  }
@@ -17,7 +17,7 @@ export declare class FixtureContentProvider implements ContentProvider {
17
17
  getFragment<T = unknown>(id: string): Promise<T>;
18
18
  getLayout<T = unknown>(name: string): Promise<T>;
19
19
  listRoutes(): Promise<RouteEntry[]>;
20
- loadRenderInput(route?: string, options?: RenderInputOptions): Promise<RenderInput>;
20
+ loadRenderInput(route: string | undefined, options: RenderInputOptions): Promise<RenderInput>;
21
21
  resolveRouteMetadata(route?: string): Promise<KernelRouteMetadata>;
22
22
  }
23
23
  export declare function createFixtureContentProvider(options?: FixtureContentProviderOptions): FixtureContentProvider;
@@ -53,13 +53,14 @@ export class FixtureContentProvider {
53
53
  return [...this.pages.entries()]
54
54
  .sort(([a], [b]) => a.localeCompare(b))
55
55
  .map(([routePath, page]) => ({
56
- slug: routePath === '/' ? 'home' : routePath.replace(/^\//, ''),
56
+ slug: routePath === '/' ? '' : routePath.replace(/^\//, ''),
57
57
  path: routePath,
58
- payloadRef: `routes/${routePath === '/' ? 'home' : routePath.replace(/^\//, '')}.json`,
58
+ variantKey: 'base',
59
+ payloadRef: routePath === '/' ? 'routes/index.json' : `routes/${routePath.replace(/^\//, '')}.json`,
59
60
  digest: '',
60
61
  }));
61
62
  }
62
- async loadRenderInput(route = '/', options = {}) {
63
+ async loadRenderInput(route = '/', options) {
63
64
  return loadRenderInput(this, route, options);
64
65
  }
65
66
  async resolveRouteMetadata(route = '/') {
@@ -5,6 +5,7 @@ export interface BlockRefMeta {
5
5
  multiple: boolean;
6
6
  }
7
7
  declare const blockRefBase: z.ZodObject<{
8
+ $type: z.ZodLiteral<"component">;
8
9
  id: z.ZodString;
9
10
  component: z.ZodString;
10
11
  props: z.ZodRecord<z.ZodString, z.ZodUnknown>;
@@ -12,6 +13,7 @@ declare const blockRefBase: z.ZodObject<{
12
13
  type InferContractProps<T> = T extends ComponentContract<string, infer Schema> ? Schema extends z.ZodType<infer P> ? P : Record<string, unknown> : Record<string, unknown>;
13
14
  type InferContractId<T> = T extends ComponentContract<infer Id, unknown> ? Id : never;
14
15
  export type BlockRefEntry<T extends ComponentContract> = {
16
+ $type: 'component';
15
17
  id: string;
16
18
  component: InferContractId<T>;
17
19
  props: InferContractProps<T>;
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  const BLOCK_REF_KEY = '_gradialBlockRef';
3
3
  const blockRefBase = z.object({
4
+ $type: z.literal('component'),
4
5
  id: z.string().min(1),
5
6
  component: z.string().min(1),
6
7
  props: z.record(z.string(), z.unknown()),
@@ -15,10 +16,10 @@ function attachMeta(schema, allowed, multiple) {
15
16
  return schema;
16
17
  }
17
18
  export function blockRefArray(contracts) {
18
- return attachMeta(z.array(blockRefBase), contracts.map((c) => c.id), true);
19
+ return attachMeta(z.array(blockRefBase.extend({ component: z.enum(contracts.map((c) => c.id)) })), contracts.map((c) => c.id), true);
19
20
  }
20
21
  export function blockRef(contracts) {
21
- return attachMeta(blockRefBase, contracts.map((c) => c.id), false);
22
+ return attachMeta(blockRefBase.extend({ component: z.enum(contracts.map((c) => c.id)) }), contracts.map((c) => c.id), false);
22
23
  }
23
24
  export function getBlockRefMeta(schema) {
24
25
  if (schema && typeof schema === 'object' && BLOCK_REF_KEY in schema) {
@@ -18,6 +18,15 @@ export interface ComponentValidationIssue {
18
18
  message: string;
19
19
  severity?: 'error' | 'warning';
20
20
  }
21
+ /**
22
+ * Root identity props the SDK renderers inject into every page and fragment
23
+ * block (sdk I-19, ADR 0051). A component spreads them onto its own root
24
+ * element; the starter conformance test fails a component that drops them.
25
+ */
26
+ export interface RootIdentityProps {
27
+ 'data-aci-block'?: string;
28
+ 'data-aci-component'?: string;
29
+ }
21
30
  export interface ComponentDefinition<TId extends string = string, TSchema = unknown> {
22
31
  id: TId;
23
32
  displayName?: string;
@@ -9,7 +9,6 @@ export interface Config {
9
9
  };
10
10
  componentRegistry: string;
11
11
  dataRegistry?: string;
12
- layoutRegistry: string;
13
12
  routes: RouteConfig;
14
13
  dam?: DAMConfig;
15
14
  externalDependencies?: ExternalDependency[];
@@ -1,13 +1,19 @@
1
1
  import { z } from 'zod';
2
2
  export interface ImageSource {
3
- /** Primary derivative URL for this rendition candidate. */
4
- src: string;
5
- /** Intrinsic width in pixels (0 when the format carries none, e.g. SVG). */
3
+ /** Authored asset path — static sources only; DAM sources never set it. */
4
+ src?: string;
5
+ /** Declared candidate widths for the srcset (DAM sources). Empty or absent
6
+ * when the slot declares no outputs: the SDK renders the bare permalink
7
+ * (no params, original bytes). */
8
+ widths?: number[];
9
+ /** Layout width in pixels — the largest declared width, or the intrinsic
10
+ * width for static/original-aspect sources. */
6
11
  width?: number;
7
- /** Intrinsic height in pixels (0 when the format carries none). */
12
+ /** Layout height in pixels — the height at `width` (aspect carrier). */
8
13
  height?: number;
9
- /** Optional width-descriptor rendition candidates. */
10
- srcset?: string;
14
+ /** Transform fit for DAM sources: 'max' fits inside the box; 'crop' fills
15
+ * the declared aspect and emits an h param per srcset width. */
16
+ fit?: 'max' | 'crop';
11
17
  /** sizes attribute from the slot contract. */
12
18
  sizes?: string;
13
19
  /** Media query scoping this source (art direction). */
@@ -20,8 +26,9 @@ export interface Image {
20
26
  $type: 'gradial.image';
21
27
  /** DAM asset identifier (or "static:<path>" for non-DAM assets). */
22
28
  assetId: string;
23
- /** DAM version identifier (or "static" for non-DAM assets). */
24
- versionId: string;
29
+ /** DAM version identifier — absent for DAM images, which compile to the
30
+ * versionless live URL /dam/{assetId}; never set for static images. */
31
+ versionId?: string;
25
32
  /** Accessible description of the image content. */
26
33
  alt: string;
27
34
  /** <source> candidates produced for the asset slot. */
@@ -38,10 +45,14 @@ export interface SlotOutput {
38
45
  media?: string;
39
46
  }
40
47
  export declare const ImageSourceSchema: z.ZodObject<{
41
- src: z.ZodString;
42
- srcset: z.ZodOptional<z.ZodString>;
48
+ src: z.ZodOptional<z.ZodString>;
49
+ widths: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
43
50
  width: z.ZodOptional<z.ZodNumber>;
44
51
  height: z.ZodOptional<z.ZodNumber>;
52
+ fit: z.ZodOptional<z.ZodEnum<{
53
+ max: "max";
54
+ crop: "crop";
55
+ }>>;
45
56
  sizes: z.ZodOptional<z.ZodString>;
46
57
  media: z.ZodOptional<z.ZodString>;
47
58
  type: z.ZodString;
@@ -49,19 +60,43 @@ export declare const ImageSourceSchema: z.ZodObject<{
49
60
  export declare const ImageSchema: z.ZodObject<{
50
61
  $type: z.ZodLiteral<"gradial.image">;
51
62
  assetId: z.ZodString;
52
- versionId: z.ZodString;
63
+ versionId: z.ZodOptional<z.ZodString>;
53
64
  alt: z.ZodString;
54
65
  sources: z.ZodArray<z.ZodObject<{
55
- src: z.ZodString;
56
- srcset: z.ZodOptional<z.ZodString>;
66
+ src: z.ZodOptional<z.ZodString>;
67
+ widths: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
57
68
  width: z.ZodOptional<z.ZodNumber>;
58
69
  height: z.ZodOptional<z.ZodNumber>;
70
+ fit: z.ZodOptional<z.ZodEnum<{
71
+ max: "max";
72
+ crop: "crop";
73
+ }>>;
59
74
  sizes: z.ZodOptional<z.ZodString>;
60
75
  media: z.ZodOptional<z.ZodString>;
61
76
  type: z.ZodString;
62
77
  }, z.core.$strip>>;
63
78
  }, z.core.$strip>;
79
+ /** Default DAM delivery quality, matching the edge's DEFAULT_QUALITY. */
80
+ export declare const DAM_IMAGE_QUALITY = 82;
81
+ /**
82
+ * Configures the origin for DAM permalinks. The default is the empty string:
83
+ * relative same-origin URLs (`/dam/{assetId}`), served by the site's own
84
+ * hosting edge. Set a base (e.g. `https://assets.example.com`) when images
85
+ * are consumed off-origin — email, external CMS fields, social cards — or
86
+ * when delivery is hosted on a dedicated domain. Call once during app setup,
87
+ * before the first render.
88
+ */
89
+ export declare function configureDamAssets(options?: {
90
+ baseUrl?: string;
91
+ }): void;
92
+ /**
93
+ * The DAM permalink for an asset: `{base}/dam/{assetId}`. No params means
94
+ * original bytes.
95
+ */
96
+ export declare function damAssetUrl(assetId: string): string;
64
97
  export type ImageAttrs = Record<string, unknown>;
98
+ /** True when the image resolves to authored static bytes, not a DAM asset. */
99
+ export declare function isStaticImage(image: Image): boolean;
65
100
  /**
66
101
  * The primary rendition of an image — its first source entry.
67
102
  */
@@ -70,9 +105,11 @@ export declare function primaryImageSource(image: Image): ImageSource;
70
105
  * Computes the full set of <img> attributes for an Image.
71
106
  *
72
107
  * Framework components (React <Picture>, Astro <img>, Svelte <img>) call this
73
- * and spread the result into their native element. No HTML string
74
- * serialization. Media-scoped sources need a <picture> wrapper and are not
75
- * representable as plain <img> attributes, so srcset/sizes are taken from the
76
- * first unscoped source only.
108
+ * and spread the result into the native element. No HTML string
109
+ * serialization. DAM images construct their /dam/{assetId} permalink and
110
+ * srcset here from the slot-declared widths; static images pass their
111
+ * authored src through. Media-scoped sources need a <picture> wrapper and
112
+ * are not representable as plain <img> attributes, so srcset/sizes are taken
113
+ * from the first unscoped source only.
77
114
  */
78
115
  export declare function imageAttrs(image: Image, overrides?: ImageAttrs): ImageAttrs;
@@ -3,10 +3,11 @@ import { z } from 'zod';
3
3
  // Zod schema
4
4
  // ---------------------------------------------------------------------------
5
5
  export const ImageSourceSchema = z.object({
6
- src: z.string().min(1),
7
- srcset: z.string().min(1).optional(),
6
+ src: z.string().min(1).optional(),
7
+ widths: z.array(z.number().int().positive()).optional(),
8
8
  width: z.number().int().nonnegative().optional(),
9
9
  height: z.number().int().nonnegative().optional(),
10
+ fit: z.enum(['max', 'crop']).optional(),
10
11
  sizes: z.string().min(1).optional(),
11
12
  media: z.string().min(1).optional(),
12
13
  type: z.string().min(1),
@@ -14,10 +15,97 @@ export const ImageSourceSchema = z.object({
14
15
  export const ImageSchema = z.object({
15
16
  $type: z.literal('gradial.image'),
16
17
  assetId: z.string().min(1),
17
- versionId: z.string().min(1),
18
+ versionId: z.string().min(1).optional(),
18
19
  alt: z.string(),
19
20
  sources: z.array(ImageSourceSchema).min(1),
20
21
  });
22
+ // ---------------------------------------------------------------------------
23
+ // DAM permalink construction (ADR 0062)
24
+ // ---------------------------------------------------------------------------
25
+ /** Default DAM delivery quality, matching the edge's DEFAULT_QUALITY. */
26
+ export const DAM_IMAGE_QUALITY = 82;
27
+ let damAssetBase = '';
28
+ /**
29
+ * Configures the origin for DAM permalinks. The default is the empty string:
30
+ * relative same-origin URLs (`/dam/{assetId}`), served by the site's own
31
+ * hosting edge. Set a base (e.g. `https://assets.example.com`) when images
32
+ * are consumed off-origin — email, external CMS fields, social cards — or
33
+ * when delivery is hosted on a dedicated domain. Call once during app setup,
34
+ * before the first render.
35
+ */
36
+ export function configureDamAssets(options = {}) {
37
+ damAssetBase = (options.baseUrl ?? '').replace(/\/+$/, '');
38
+ }
39
+ /**
40
+ * The DAM permalink for an asset: `{base}/dam/{assetId}`. No params means
41
+ * original bytes.
42
+ */
43
+ export function damAssetUrl(assetId) {
44
+ return `${damAssetBase}/dam/${assetId}`;
45
+ }
46
+ const FORMAT_PARAMS = {
47
+ 'image/avif': 'avif',
48
+ 'image/webp': 'webp',
49
+ 'image/jpeg': 'jpg',
50
+ 'image/png': 'png',
51
+ };
52
+ function sourceFormatParams(source) {
53
+ const fm = FORMAT_PARAMS[source.type] ?? 'webp';
54
+ return `fm=${fm}&q=${DAM_IMAGE_QUALITY}`;
55
+ }
56
+ function srcsetWidth(assetId, source, width) {
57
+ const params = [`w=${width}`];
58
+ if (source.fit === 'crop' && source.width && source.height) {
59
+ const height = Math.round((width * source.height) / source.width);
60
+ params.push(`h=${height}`, 'fit=crop');
61
+ }
62
+ else {
63
+ params.push('fit=max');
64
+ }
65
+ params.push(sourceFormatParams(source));
66
+ return `${damAssetUrl(assetId)}?${params.join('&')} ${width}w`;
67
+ }
68
+ function damImageAttrs(image, primary) {
69
+ const base = {
70
+ src: damAssetUrl(image.assetId),
71
+ alt: image.alt,
72
+ width: primary.width && primary.width > 0 ? primary.width : undefined,
73
+ height: primary.height && primary.height > 0 ? primary.height : undefined,
74
+ loading: 'lazy',
75
+ decoding: 'async',
76
+ };
77
+ if (primary.widths && primary.widths.length > 0) {
78
+ // Primary src at the largest declared width; srcset covers them all.
79
+ const largest = primary.widths[primary.widths.length - 1];
80
+ const params = [`w=${largest}`];
81
+ if (primary.fit === 'crop' && primary.width && primary.height) {
82
+ params.push(`h=${Math.round((largest * primary.height) / primary.width)}`, 'fit=crop');
83
+ }
84
+ else {
85
+ params.push('fit=max');
86
+ }
87
+ params.push(sourceFormatParams(primary));
88
+ base.src = `${damAssetUrl(image.assetId)}?${params.join('&')}`;
89
+ if (primary.widths.length > 1) {
90
+ base.srcSet = primary.widths.map((w) => srcsetWidth(image.assetId, primary, w)).join(', ');
91
+ }
92
+ }
93
+ return base;
94
+ }
95
+ function staticImageAttrs(image, primary) {
96
+ return {
97
+ src: primary.src ?? '',
98
+ alt: image.alt,
99
+ width: primary.width && primary.width > 0 ? primary.width : undefined,
100
+ height: primary.height && primary.height > 0 ? primary.height : undefined,
101
+ loading: 'lazy',
102
+ decoding: 'async',
103
+ };
104
+ }
105
+ /** True when the image resolves to authored static bytes, not a DAM asset. */
106
+ export function isStaticImage(image) {
107
+ return image.assetId.startsWith('static:');
108
+ }
21
109
  /**
22
110
  * The primary rendition of an image — its first source entry.
23
111
  */
@@ -28,23 +116,19 @@ export function primaryImageSource(image) {
28
116
  * Computes the full set of <img> attributes for an Image.
29
117
  *
30
118
  * Framework components (React <Picture>, Astro <img>, Svelte <img>) call this
31
- * and spread the result into their native element. No HTML string
32
- * serialization. Media-scoped sources need a <picture> wrapper and are not
33
- * representable as plain <img> attributes, so srcset/sizes are taken from the
34
- * first unscoped source only.
119
+ * and spread the result into the native element. No HTML string
120
+ * serialization. DAM images construct their /dam/{assetId} permalink and
121
+ * srcset here from the slot-declared widths; static images pass their
122
+ * authored src through. Media-scoped sources need a <picture> wrapper and
123
+ * are not representable as plain <img> attributes, so srcset/sizes are taken
124
+ * from the first unscoped source only.
35
125
  */
36
126
  export function imageAttrs(image, overrides = {}) {
37
127
  const primary = image.sources[0];
38
128
  const unscoped = image.sources.find((s) => !s.media) ?? primary;
39
- return {
40
- src: primary.src,
41
- alt: image.alt,
42
- width: primary.width && primary.width > 0 ? primary.width : undefined,
43
- height: primary.height && primary.height > 0 ? primary.height : undefined,
44
- srcSet: unscoped?.srcset || undefined,
45
- sizes: unscoped?.sizes || undefined,
46
- loading: 'lazy',
47
- decoding: 'async',
48
- ...overrides,
49
- };
129
+ const base = isStaticImage(image) ? staticImageAttrs(image, primary) : damImageAttrs(image, primary);
130
+ if (unscoped?.sizes) {
131
+ base.sizes = unscoped.sizes;
132
+ }
133
+ return { ...base, ...overrides };
50
134
  }
@@ -1,7 +1,6 @@
1
1
  export * from './config.js';
2
2
  export * from './component.js';
3
3
  export * from './data.js';
4
- export * from './layout.js';
5
4
  export * from './page.js';
6
5
  export * from './rich-text.js';
7
6
  export * from './image.js';
@@ -1,7 +1,6 @@
1
1
  export * from './config.js';
2
2
  export * from './component.js';
3
3
  export * from './data.js';
4
- export * from './layout.js';
5
4
  export * from './page.js';
6
5
  export * from './rich-text.js';
7
6
  export * from './image.js';
@@ -7,13 +7,17 @@ export type Asset = Image | Video;
7
7
  export declare const AssetSchema: z.ZodUnion<readonly [z.ZodObject<{
8
8
  $type: z.ZodLiteral<"gradial.image">;
9
9
  assetId: z.ZodString;
10
- versionId: z.ZodString;
10
+ versionId: z.ZodOptional<z.ZodString>;
11
11
  alt: z.ZodString;
12
12
  sources: z.ZodArray<z.ZodObject<{
13
- src: z.ZodString;
14
- srcset: z.ZodOptional<z.ZodString>;
13
+ src: z.ZodOptional<z.ZodString>;
14
+ widths: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
15
15
  width: z.ZodOptional<z.ZodNumber>;
16
16
  height: z.ZodOptional<z.ZodNumber>;
17
+ fit: z.ZodOptional<z.ZodEnum<{
18
+ max: "max";
19
+ crop: "crop";
20
+ }>>;
17
21
  sizes: z.ZodOptional<z.ZodString>;
18
22
  media: z.ZodOptional<z.ZodString>;
19
23
  type: z.ZodString;
@@ -30,13 +34,17 @@ export declare const AssetSchema: z.ZodUnion<readonly [z.ZodObject<{
30
34
  poster: z.ZodOptional<z.ZodObject<{
31
35
  $type: z.ZodLiteral<"gradial.image">;
32
36
  assetId: z.ZodString;
33
- versionId: z.ZodString;
37
+ versionId: z.ZodOptional<z.ZodString>;
34
38
  alt: z.ZodString;
35
39
  sources: z.ZodArray<z.ZodObject<{
36
- src: z.ZodString;
37
- srcset: z.ZodOptional<z.ZodString>;
40
+ src: z.ZodOptional<z.ZodString>;
41
+ widths: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
38
42
  width: z.ZodOptional<z.ZodNumber>;
39
43
  height: z.ZodOptional<z.ZodNumber>;
44
+ fit: z.ZodOptional<z.ZodEnum<{
45
+ max: "max";
46
+ crop: "crop";
47
+ }>>;
40
48
  sizes: z.ZodOptional<z.ZodString>;
41
49
  media: z.ZodOptional<z.ZodString>;
42
50
  type: z.ZodString;
@@ -32,5 +32,4 @@ export interface BlockNode {
32
32
  export interface FragmentRefNode {
33
33
  kind: 'fragment-ref';
34
34
  fragmentId: string;
35
- inline: boolean;
36
35
  }
@@ -50,13 +50,17 @@ export declare const VideoSchema: z.ZodObject<{
50
50
  poster: z.ZodOptional<z.ZodObject<{
51
51
  $type: z.ZodLiteral<"gradial.image">;
52
52
  assetId: z.ZodString;
53
- versionId: z.ZodString;
53
+ versionId: z.ZodOptional<z.ZodString>;
54
54
  alt: z.ZodString;
55
55
  sources: z.ZodArray<z.ZodObject<{
56
- src: z.ZodString;
57
- srcset: z.ZodOptional<z.ZodString>;
56
+ src: z.ZodOptional<z.ZodString>;
57
+ widths: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
58
58
  width: z.ZodOptional<z.ZodNumber>;
59
59
  height: z.ZodOptional<z.ZodNumber>;
60
+ fit: z.ZodOptional<z.ZodEnum<{
61
+ max: "max";
62
+ crop: "crop";
63
+ }>>;
60
64
  sizes: z.ZodOptional<z.ZodString>;
61
65
  media: z.ZodOptional<z.ZodString>;
62
66
  type: z.ZodString;
@@ -0,0 +1,22 @@
1
+ # Designate the render registry for Next conformance
2
+
3
+ Set `registry` in the site's conformance options to the module its page entry
4
+ uses to create the ACI page:
5
+
6
+ ```ts
7
+ import { conformancePreset } from '@gradial/aci/testing';
8
+
9
+ conformancePreset({
10
+ framework: 'next',
11
+ registry: 'src/cms/registry.ts',
12
+ });
13
+ ```
14
+
15
+ Paths resolve against `rootDir`, which defaults to the test process's current
16
+ working directory. Absolute paths also work. Use the app's full render registry,
17
+ including every registered component. The named module must export the registry.
18
+
19
+ Run the site's `npm test`. The `rootIdentity` check renders components from the
20
+ named module and fails if a rendered root omits its ACI identity attributes.
21
+ Missing configuration or a missing module fails before importing site code.
22
+ Astro's existing authored-block scan does not require this option.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gradial/aci",
3
- "version": "0.1.52-rc.3",
3
+ "version": "0.1.52-rc.34-e2e.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/gradial/bare-metal-go.git",
@@ -20,6 +20,7 @@
20
20
  "templates/nextjs",
21
21
  "templates/astro",
22
22
  "CHANGELOG.md",
23
+ "migrations",
23
24
  "README.md"
24
25
  ],
25
26
  "bin": {
@@ -41,6 +42,14 @@
41
42
  "types": "./dist/compiler/index.d.ts",
42
43
  "import": "./dist/compiler/index.js"
43
44
  },
45
+ "./expression-capabilities": {
46
+ "types": "./dist/edge/expression-capabilities.v1.d.ts",
47
+ "import": "./dist/edge/expression-capabilities.v1.js"
48
+ },
49
+ "./mintlify": {
50
+ "types": "./dist/mintlify/index.d.ts",
51
+ "import": "./dist/mintlify/index.js"
52
+ },
44
53
  "./providers/file": {
45
54
  "types": "./dist/providers/file.d.ts",
46
55
  "import": "./dist/providers/file.js"
@@ -76,6 +85,11 @@
76
85
  "import": "./dist/next/error-seat.js",
77
86
  "default": "./dist/next/error-seat.js"
78
87
  },
88
+ "./next/asset-route": {
89
+ "types": "./dist/next/asset-route.d.ts",
90
+ "import": "./dist/next/asset-route.js",
91
+ "default": "./dist/next/asset-route.js"
92
+ },
79
93
  "./next/server": {
80
94
  "types": "./dist/next/server.d.ts",
81
95
  "import": "./dist/next/server.js",
@@ -146,11 +160,11 @@
146
160
  "zod": "^4.0.0"
147
161
  },
148
162
  "optionalDependencies": {
149
- "@gradial/aci-cli-darwin-arm64": "0.1.52-rc.3",
150
- "@gradial/aci-cli-darwin-x64": "0.1.52-rc.3",
151
- "@gradial/aci-cli-linux-arm64": "0.1.52-rc.3",
152
- "@gradial/aci-cli-linux-x64": "0.1.52-rc.3",
153
- "@gradial/aci-cli-win32-arm64": "0.1.52-rc.3",
154
- "@gradial/aci-cli-win32-x64": "0.1.52-rc.3"
163
+ "@gradial/aci-cli-darwin-arm64": "0.1.52-rc.34-e2e.1",
164
+ "@gradial/aci-cli-darwin-x64": "0.1.52-rc.34-e2e.1",
165
+ "@gradial/aci-cli-linux-arm64": "0.1.52-rc.34-e2e.1",
166
+ "@gradial/aci-cli-linux-x64": "0.1.52-rc.34-e2e.1",
167
+ "@gradial/aci-cli-win32-arm64": "0.1.52-rc.34-e2e.1",
168
+ "@gradial/aci-cli-win32-x64": "0.1.52-rc.34-e2e.1"
155
169
  }
156
170
  }