@faststore/core 4.1.0 β†’ 4.1.1-dev.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.
package/README.md CHANGED
@@ -1,224 +1,165 @@
1
1
  <p align="center">
2
- <a href="https://github.com/vtex/faststore">
3
- <img alt="Store Framework" src="https://emoji.slack-edge.com/T02BCPD0X/store-framework/7547b127e929c376.png" width="75" />
4
- </a>
2
+ <img alt="Faststore" src="../ui/static/logo.png" width="60" />
5
3
  </p>
6
- <h1 align="center">
7
- A starter powered by FastStore and NextJS.
8
- </h1>
9
-
10
- Kick off your store with this boilerplate.
11
- This starter ships the main FastStore configuration files to get your store up and running blazing-fast. This source code is the base for FastStore projects starter.
12
4
 
13
- ## πŸš€ Quick start
5
+ <h1 align="center">FastStore Core</h1>
14
6
 
15
- 1. **Install dependencies**
7
+ <p align="center">
8
+ <a href="https://badge.fury.io/js/%40faststore%2Fcore">
9
+ <img alt="npm version" src="https://badge.fury.io/js/%40faststore%2Fcore.svg" />
10
+ </a>
11
+ </p>
16
12
 
17
- > PS: you can install dependencies using the package manager of your choosing. In this guide, we'll be using `pnpm` as an example.
18
13
 
19
- Install dependencies with pnpm
20
14
 
21
- ```shell
22
- pnpm i
15
+ `@faststore/core` is the main Next.js application for FastStore storefronts. It bundles together all the building blocks of a store β€” sections, pages, SDK hooks, server utilities, and CMS configuration β€” into a ready-to-use boilerplate.
16
+
17
+ Store builders consume this package through `@faststore/cli` and extend it via the `src/customizations/` directory. You will work directly in this package when contributing new sections, pages, SDK hooks, or CMS configurations to the FastStore platform.
18
+
19
+ ## Package structure
20
+
21
+ ```text
22
+ packages/core/
23
+ β”œβ”€β”€ src/
24
+ β”‚ β”œβ”€β”€ components/
25
+ β”‚ β”‚ β”œβ”€β”€ sections/ # Full-page content slices (Hero, ProductGallery, ProductShelf…)
26
+ β”‚ β”‚ β”œβ”€β”€ ui/ # Store-level UI components (compositions of @faststore/ui)
27
+ β”‚ β”‚ β”œβ”€β”€ skeletons/ # Loading state skeleton components
28
+ β”‚ β”‚ └── … # Domain folders: cart, product, search, navigation, auth…
29
+ β”‚ β”œβ”€β”€ pages/ # Next.js file-based routes
30
+ β”‚ β”œβ”€β”€ sdk/ # Business logic hooks (cart, session, search, analytics…)
31
+ β”‚ β”œβ”€β”€ server/ # Server-side utilities (CMS content fetching)
32
+ β”‚ β”œβ”€β”€ customizations/ # Store-level overrides: styles, fonts, components, fragments
33
+ β”‚ β”œβ”€β”€ styles/ # Global SCSS styles
34
+ β”‚ └── instrumentation.ts # Next.js instrumentation hook (boots @faststore/diagnostics when otelEnabled)
35
+ β”œβ”€β”€ cms/faststore/ # CMS configuration: sections.json, content-types.json, schemas
36
+ β”œβ”€β”€ @generated/ # Auto-generated GraphQL types β€” do not edit
37
+ β”œβ”€β”€ discovery.config.default.js # Committed base store configuration (platform, sales channel, locale)
38
+ β”œβ”€β”€ discovery.config.js # Merges default config with store-level customizations β€” do not edit directly
39
+ β”œβ”€β”€ next.config.js # Next.js configuration
40
+ β”œβ”€β”€ codegen.ts # GraphQL code generation config
41
+ └── lighthouserc.js # Lighthouse CI configuration
23
42
  ```
24
43
 
25
- 2. **Start developing**
26
-
27
- Navigate into your new site’s directory and start it up.
28
-
29
- ```shell
30
- pnpm dev
31
- ```
32
-
33
- 3. **Open the source code and start editing!**
34
-
35
- Your site is now running at `http://localhost:3000`!
36
-
37
- ## 🧐 What's inside?
44
+ ## How to run
38
45
 
39
- A quick look at the top-level files and directories you'll see in a this NextJS project.
46
+ **Prerequisites:** Node β‰₯ 20, pnpm
40
47
 
41
- ./
42
- β”œβ”€β”€ node_modules
43
- β”œβ”€β”€ @generated
44
- β”œβ”€β”€ cms
45
- β”œβ”€β”€ public
46
- β”œβ”€β”€ src
47
- β”œβ”€β”€ test
48
- β”œβ”€β”€ .babelrc.js
49
- β”œβ”€β”€ .editorconfig
50
- β”œβ”€β”€ .prettierignore
51
- β”œβ”€β”€ .prettierrrc
52
- β”œβ”€β”€ .stylelintignore
53
- β”œβ”€β”€ .gitignore
54
- β”œβ”€β”€ codegen.ts
55
- β”œβ”€β”€ cypress
56
- β”œβ”€β”€ cypress.config.ts
57
- β”œβ”€β”€ discovery.config.default.js
58
- β”œβ”€β”€ discovery.config.js
59
- β”œβ”€β”€ index.ts
60
- β”œβ”€β”€ jest.config.js
61
- β”œβ”€β”€ LICENSE
62
- β”œβ”€β”€ lighthouserc.js
63
- β”œβ”€β”€ next-env.d.ts
64
- β”œβ”€β”€ next.config.ts
65
- β”œβ”€β”€ package.json
66
- β”œβ”€β”€ tsconfig.json
67
- β”œβ”€β”€ postcss.config.js
68
- β”œβ”€β”€ postinstall.js
69
- β”œβ”€β”€ README.md
70
- β”œβ”€β”€ stylelint.config.js
71
- β”œβ”€β”€ tsconfig.json
72
- β”œβ”€β”€ vtex.env
48
+ ```sh
49
+ pnpm install
50
+ pnpm dev # generates GraphQL types, then starts the Next.js dev server
51
+ ```
73
52
 
74
- 1. **`/node_modules`**: This directory contains all of the modules of code that your project depends on (npm packages) are automatically installed.
53
+ Your store will be available at `http://localhost:3000`.
75
54
 
76
- 2. **`/src`**: This directory will contain all of the code related to what you will see on the front-end of your site (what you see in the browser) such as your site header or a page template. `src` is a convention for β€œsource code”.
77
55
 
78
- 3. **`.gitignore`**: This file tells git which files it should not track / not maintain a version history for.
79
56
 
80
- 4. **`.prettierrc`**: This is a configuration file for [Prettier](https://prettier.io/). Prettier is a tool to help keep the formatting of your code consistent.
57
+ > The `pnpm dev` command runs `pnpm generate` automatically before starting the dev server. You only need to run `pnpm generate` manually when you change a GraphQL query or fragment while the server is already running.
81
58
 
82
- 5. **`LICENSE`**: NextJS is licensed under the MIT license.
59
+ ## How to develop
83
60
 
84
- 6. **`package.json`**: A manifest file for Node.js projects, which includes things like metadata (the project’s name, author, etc). This manifest is how npm knows which packages to install for your project.
61
+ ### Adding or modifying a section
85
62
 
86
- 7. **`tsconfig.json`**: The configuration file for the typescript compiler. This will statically analyze your code for errors and bugs before releasing them into production
63
+ Sections are full-page slices that can be managed via the CMS. They live in `src/components/sections/`.
87
64
 
88
- 8. **`discovery.config.default.js`**: Configure your e-commerce platform, default sales channel etc.
65
+ 1. Create `src/components/sections/{SectionName}/{SectionName}.tsx` and a companion `.module.scss`
66
+ 2. Compose the section using components from `@faststore/ui`
67
+ 3. Add the section definition to `cms/faststore/sections.json` (name, props, schema)
68
+ 4. Export the section from the sections index
89
69
 
90
- 9. **`@generated`**: Where TypeScript typings are generated for your GraphQL queries. You can use these files for strongly typing your App
70
+ ### Adding a store-level UI component
91
71
 
92
- 10. **`cypress`**: End to End(e2e) tests using Cypress. Most of the scenarios are covered here. Add your custom flows to avoid regressions
72
+ Store-level UI components (not intended for the shared library) live in `src/components/ui/`.
93
73
 
94
- 11. **`cypress.config.ts`**: [Cypress configuration file](https://docs.cypress.io/guides/references/configuration)
74
+ 1. Create `src/components/ui/{ComponentName}/{ComponentName}.tsx` with a companion `.module.scss`
75
+ 2. Compose using components from `@faststore/ui`
76
+ 3. Use TypeScript for props β€” no `data-fs-*` attributes needed here (those belong in `@faststore/components`)
95
77
 
96
- 12. **`lighthouserc.js`**: Configures [Google Lighthouse CI](https://github.com/GoogleChrome/lighthouse-ci). This is where you can turn on/off lighthouse assertions to be used by Lighthouse CI Bot/hook
78
+ ### Adding or modifying a GraphQL query
97
79
 
98
- 13. **`.prettierignore`**: Ignore listed files when applying prettier rules
80
+ 1. Edit or create a `.graphql` file with your query or fragment
81
+ 2. Run `pnpm generate` to regenerate types under `@generated/`
82
+ 3. Import the generated types from `@generated/graphql`
99
83
 
100
- ## πŸ’» Code Structure
84
+ > Never edit files inside `@generated/` manually β€” they are overwritten on every `pnpm generate` run.
101
85
 
102
- All code is inside the `src` folder. The code is split into folders that implement an MVC-like architecture.
86
+ ### Managing SVG icons
103
87
 
104
- The `controller` is inside the `src/sdk` folder. This is where you will find most logic for the application. This folder contains hooks for adding items to cart, making graphql queries, resizing images, etc. If you need to write a custom business logic this is probably the place to put this logic.
88
+ Icons are loaded from a single sprite at `public/icons.svg` via the `Icon` component from `@faststore/ui`.
105
89
 
106
- The `views` are written in the `src/components` folder and are subdivided into domain-specific components. Cart related items are inside the `src/components/cart` folder. Search and Product related components like facets, product summary, and search results are in their respective folders. Basic building blocks components used in the sections are inside the UI folder.
107
- Section components are those components that occupy a whole slice on the webpage and are desirable to be changed by a CMS. Section components are Product Gallery, Product Shelf and Hero and BannerText.
90
+ 1. Open `public/icons.svg` and add a new `<symbol>` with a unique `id`
91
+ 2. Remove `fill`, `stroke-width`, `width`, `height`, and `color` attributes from the symbol so it can be styled via CSS
92
+ 3. Use the icon in any component:
108
93
 
109
- The `model`, in a website, is where the data fetching occurs. Since this project uses Jamstack, a crucial design decision was made to explicitly split where Static and Dynamic data are fetched. The files inside the `src/pages` folder use [NextJS's File System Route API](https://nextjs.org/docs/routing/introduction) to declare routes and fetch static data.
94
+ ```tsx
95
+ import { Icon } from '@faststore/ui'
110
96
 
111
- To summarize:
97
+ <Icon name="Bell" weight="thin" />
98
+ ```
112
99
 
113
- 1. `src/pages`: Routes are declared and static data is fetched.
114
- 2. `src/views`: Receives static data from `src/pages`, enriches this data with dynamic attributes, and render section components along with SEO tags.
115
- 3. `src/components/sections`: Receives necessary data and use domain-specific components (cart/product/search/ui) for rendering a slice on the web page.
100
+ This project uses icons from [Phosphor Icons](https://phosphoricons.com/).
116
101
 
117
- ### Managing SVG Icons
102
+ ### Adding CMS configuration
118
103
 
119
- Icons help build web pages by illustrating concepts and improving website navigation. However, using icons can decrease the page's performance. One option to avoid the decrease of the page's performance is to use SVGs from a single SVG file, located in `/static/icons.svg`, and load them with the `ui/Icon` component.
104
+ FastStore currently supports two CMS content sources. The flow depends on which one we want to update.
120
105
 
121
- In the following steps, learn how to add and use a new SVG icon and avoid decreasing page performance while using an icon.
106
+ #### Headless CMS (legacy)
122
107
 
123
- #### Adding an SVG icon
108
+ 1. Define the section schema in `cms/faststore/sections.json`
109
+ 2. For new content types, add them to `cms/faststore/content-types.json`
110
+ 3. Run `pnpm faststore cms-sync` to push changes to the CMS
124
111
 
125
- 1. In the SVG file, change the `svg` tag to `symbol`.
126
- 2. Add an `id` to the symbol. Remember to use an unique `id` and do not replicate it.
127
- 3. Remove unnecessary HTML/SVG properties to allow you to style and decrease the final file size, such as `fill`, `stroke-width`, `width`, `height`, and `color`.
112
+ #### CMS (new)
128
113
 
129
- An example adding Bell icon:
114
+ Schemas are defined as individual `.jsonc` files instead of a single `sections.json`.
115
+ To support both CMS versions, changes made to the legacy files are migrated to the new format using the split commands.
130
116
 
131
- ```svg
132
- <svg style="display:none">
133
- <symbol id="Bell" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"></rect><path d="M56.2,104a71.9,71.9,0,0,1,72.3-72c39.6.3,71.3,33.2,71.3,72.9V112c0,35.8,7.5,56.6,14.1,68a8,8,0,0,1-6.9,12H49a8,8,0,0,1-6.9-12c6.6-11.4,14.1-32.2,14.1-68Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M96,192v8a32,32,0,0,0,64,0v-8" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></symbol>
134
- </svg>
117
+ 1. After updating `sections.json` or `content-types.json`, run the split commands to generate the new format:
118
+ ```sh
119
+ vtex content split-components -i cms/faststore/sections.json -o cms/faststore/components
135
120
  ```
136
121
 
137
- #### Using an SVG icon
138
-
139
- 1. Get the icon's `id` that you created in the SVG icon file.
140
- 2. Add the `id` in the React component that you desire to use the SVG icon. For example
141
-
142
- ```tsx
143
- // src/components/ui/MyIconButton/MyIconButton.tsx
144
- import Icon from '@faststore/ui'
145
-
146
- function ButtonIcon() {
147
- return (
148
- <button>
149
- <Icon name="<<symbol_id>>" weight="thin" />
150
- </button>
151
- )
152
- }
153
-
154
- export default ButtonIcon
122
+ ```sh
123
+ vtex content split-content-types -i cms/faststore/content-types.json -s cms/faststore/sections.json -o cms/faststore/pages
155
124
  ```
156
125
 
157
- This project uses SVGs from [Phosphor icons](https://phosphoricons.com/).
158
- More details, please refer to this [doc](https://www.faststore.dev/docs/icons).
159
-
160
- ## πŸ–ŠοΈ Styling Components
161
-
162
- Our customized themes are based on [Design Tokens](https://css-tricks.com/what-are-design-tokens/) using [CSS Variables](https://developer.mozilla.org/en-US/docs/Web/CSS/--*) or a CSS class for each token. We utilize the styles from the `@faststore/ui` package, which are imported into the `src/styles` directory. Additionally, each component's styles are imported directly into the section where they are being used. Refer to [Theming overview](https://www.faststore.dev/docs/theming-overview) for more details.
163
-
164
- ## πŸ’ Adding queries
165
-
166
- We use [graphql-codegen](https://www.graphql-code-generator.com/) to pre-process GraphQL queries. This compilation generates TypeScript typings and configurations for our graphql server under the folder `@generated/graphql`.
167
- This means we can statically analyze your code in search of bugs and secure your graphql server before each deploy. If, however you need to change any GraphQL Fragment, Query or Mutation, you will need to regenerate the whole thing. To do this, open your terminal and type
168
-
126
+ 2. Generate the schema:
169
127
  ```sh
170
- $ pnpm dev
128
+ vtex content generate-schema cms/faststore/components cms/faststore/pages -o cms/faststore/schema.json
171
129
  ```
172
130
 
173
- Now, after the nextjs development server is up and running, open another terminal and run
174
-
131
+ 3. Upload the schema to the Schema Registry:
175
132
  ```sh
176
- $ pnpm generate
133
+ vtex content upload-schema cms/faststore/schema.json
177
134
  ```
178
135
 
179
- That's it! you have just regenerated all graphql queries/fragments for your application and the new data you requested should be available to your component.
180
-
181
- > Pro tip: Pass `-w` to the `pnpm generate` command so it watches for changes and you don't need to run this command multiple times.
182
-
183
-
184
- ## CMS Integration
185
-
186
- This store is integrated with [VTEX headless CMS](https://v1.faststore.dev/tutorials/cms/0).
136
+ Files can be placed in `cms/components/` and `cms/pages/`, or co-located alongside their component in `src/components/`.
187
137
 
188
- The page rendered with CMS is the index page: `pages/index.tsx`
189
- The `cms/faststore` contains the `content-types.json` and `sections.json` files.
138
+ > For schema syntax and the full architectural overview, see the [CMS architecture and schema declarations](https://developers.vtex.com/docs/guides/understanding-cms-architecture-and-schema-declarations) guide.
190
139
 
191
- ### CMS configs
140
+ ## How to test
192
141
 
193
- It's possible to change the CMS tenant and workspace at `discovery.config.default.js`.
194
-
195
- ## πŸŽ“ Learning the Frameworks
196
-
197
- Looking for more guidance? Full documentation for FastStore lives [on this GitHub repository](https://github.com/vtex/faststore). Also, for learning NextJS, take a look at the [NextJS Website](https://nextjs.org/docs/getting-started), they have plenty of tutorials and examples in there.
198
-
199
- ## ⚑ Performance & QA
200
-
201
- This project has strict performance budgets. Right out of the box, this project performs around 95 on Google's Page Speed Insights website, which usually is way more strict than your laptop's chrome lighthouse. Every time you commit to the repository, our QA bots will run and evaluate your code quality. We recommend you NEVER put in production a code that breaks any of the bots. If a bot breaks and still you need to put the code into production, change the bot config (`lighthouserc.js`, `cypress.config.ts`) to make it pass and merge. This way you ensure your website will keep performing well during the years to come.
142
+ ```sh
143
+ pnpm test # unit tests (Vitest)
144
+ pnpm test:e2e # E2E tests (Cypress)
145
+ pnpm lhci # Lighthouse performance audit
146
+ ```
202
147
 
203
- ## Adding third party scripts
148
+ This project has strict performance budgets. The Lighthouse CI (`lhci`) runs automatically on every PR and enforces score minimums and metric budgets defined in `lighthouserc.js`.
204
149
 
205
- Adding third-party scripts to a webpage usually makes it slow. To maintain great performance while third-party scripts are added, this project uses [Partytown](https://github.com/BuilderIO/partytown/), a lazy-load library that helps relocate intensive scripts into a web worker and off of the main thread.
150
+ ## How to publish
206
151
 
207
- To add scripts using Partytown, add the `type="text/partytown"` to the script tag and make sure to add it before the Partytown script or component.
208
- Some third-party scripts execute expensive computations that may require some time to run, making pages few slow. If that's the case, wrap those in a function and reference it on the Partytown `forward` prop. By doing this, Partytown will run this function on a web worker so it doesn't block the main thread.
152
+ This package is versioned and published as part of the FastStore monorepo release process, managed by Lerna at the monorepo root. Do not publish individually.
209
153
 
210
- ```tsx
211
- export const onRenderBody = ({ setHeadComponents }) => {
212
- // ...
213
- setHeadComponents([
214
- <script type="text/partytown">
215
- window.expensiveFunction = function() {/* expensive computation used by custom-script */}
216
- </script>
217
- <script key="custom-script" src="*://domain/path" type="text/partytown" />,
218
- <Partytown key="partytown" forward={["expensiveFunction"]} />
219
- ])
220
- // ...
221
- }
154
+ ```sh
155
+ # From the monorepo root:
156
+ pnpm release # publish to latest (main branch)
157
+ pnpm release:dev # publish to dev tag (dev branch)
222
158
  ```
223
159
 
224
- For more information about integrating third-party scripts: [Partytown Wiki](https://github.com/BuilderIO/partytown/wiki).
160
+ ## Documentation
161
+
162
+ - [FastStore documentation](https://developers.vtex.com/docs/guides/faststore/getting-started-overview)
163
+ - [Theming and design tokens](https://developers.vtex.com/docs/guides/faststore/styling-overview)
164
+ - [CMS integration](https://developers.vtex.com/docs/guides/faststore/headless-cms-overview)
165
+ - [Next.js docs](https://nextjs.org/docs)
@@ -6,65 +6,7 @@
6
6
  "title": "Global Footer Sections",
7
7
  "properties": {
8
8
  "sections": {
9
- "type": "array",
10
- "items": {
11
- "anyOf": [
12
- {
13
- "$ref": "#/components/Search"
14
- },
15
- {
16
- "$ref": "#/components/Navbar"
17
- },
18
- {
19
- "$ref": "#/components/Alert"
20
- },
21
- {
22
- "$ref": "#/components/Footer"
23
- },
24
- {
25
- "$ref": "#/components/BannerText"
26
- },
27
- {
28
- "$ref": "#/components/Hero"
29
- },
30
- {
31
- "$ref": "#/components/Incentives"
32
- },
33
- {
34
- "$ref": "#/components/ProductShelf"
35
- },
36
- {
37
- "$ref": "#/components/ProductTiles"
38
- },
39
- {
40
- "$ref": "#/components/Newsletter"
41
- },
42
- {
43
- "$ref": "#/components/Children"
44
- },
45
- {
46
- "$ref": "#/components/BannerNewsletter"
47
- },
48
- {
49
- "$ref": "#/components/CartSidebar"
50
- },
51
- {
52
- "$ref": "#/components/RegionBar"
53
- },
54
- {
55
- "$ref": "#/components/RegionModal"
56
- },
57
- {
58
- "$ref": "#/components/RegionPopover"
59
- },
60
- {
61
- "$ref": "#/components/EmptyState"
62
- },
63
- {
64
- "$ref": "#/components/ShoppingAssistant"
65
- }
66
- ]
67
- }
9
+ "$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
68
10
  }
69
11
  },
70
12
  "readOnly": false,
@@ -6,65 +6,7 @@
6
6
  "title": "Global Header Sections",
7
7
  "properties": {
8
8
  "sections": {
9
- "type": "array",
10
- "items": {
11
- "anyOf": [
12
- {
13
- "$ref": "#/components/Search"
14
- },
15
- {
16
- "$ref": "#/components/Navbar"
17
- },
18
- {
19
- "$ref": "#/components/Alert"
20
- },
21
- {
22
- "$ref": "#/components/Footer"
23
- },
24
- {
25
- "$ref": "#/components/BannerText"
26
- },
27
- {
28
- "$ref": "#/components/Hero"
29
- },
30
- {
31
- "$ref": "#/components/Incentives"
32
- },
33
- {
34
- "$ref": "#/components/ProductShelf"
35
- },
36
- {
37
- "$ref": "#/components/ProductTiles"
38
- },
39
- {
40
- "$ref": "#/components/Newsletter"
41
- },
42
- {
43
- "$ref": "#/components/Children"
44
- },
45
- {
46
- "$ref": "#/components/BannerNewsletter"
47
- },
48
- {
49
- "$ref": "#/components/CartSidebar"
50
- },
51
- {
52
- "$ref": "#/components/RegionBar"
53
- },
54
- {
55
- "$ref": "#/components/RegionModal"
56
- },
57
- {
58
- "$ref": "#/components/RegionPopover"
59
- },
60
- {
61
- "$ref": "#/components/EmptyState"
62
- },
63
- {
64
- "$ref": "#/components/ShoppingAssistant"
65
- }
66
- ]
67
- }
9
+ "$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
68
10
  }
69
11
  },
70
12
  "readOnly": false,
@@ -360,65 +360,7 @@
360
360
  "$componentTitle": "Loading"
361
361
  },
362
362
  "sections": {
363
- "type": "array",
364
- "items": {
365
- "anyOf": [
366
- {
367
- "$ref": "#/components/Search"
368
- },
369
- {
370
- "$ref": "#/components/Navbar"
371
- },
372
- {
373
- "$ref": "#/components/Alert"
374
- },
375
- {
376
- "$ref": "#/components/Footer"
377
- },
378
- {
379
- "$ref": "#/components/BannerText"
380
- },
381
- {
382
- "$ref": "#/components/Hero"
383
- },
384
- {
385
- "$ref": "#/components/Incentives"
386
- },
387
- {
388
- "$ref": "#/components/ProductShelf"
389
- },
390
- {
391
- "$ref": "#/components/ProductTiles"
392
- },
393
- {
394
- "$ref": "#/components/Newsletter"
395
- },
396
- {
397
- "$ref": "#/components/Children"
398
- },
399
- {
400
- "$ref": "#/components/BannerNewsletter"
401
- },
402
- {
403
- "$ref": "#/components/CartSidebar"
404
- },
405
- {
406
- "$ref": "#/components/RegionBar"
407
- },
408
- {
409
- "$ref": "#/components/RegionModal"
410
- },
411
- {
412
- "$ref": "#/components/RegionPopover"
413
- },
414
- {
415
- "$ref": "#/components/EmptyState"
416
- },
417
- {
418
- "$ref": "#/components/ShoppingAssistant"
419
- }
420
- ]
421
- }
363
+ "$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
422
364
  }
423
365
  },
424
366
  "readOnly": false,
@@ -152,65 +152,7 @@
152
152
  "$componentTitle": "SEO"
153
153
  },
154
154
  "sections": {
155
- "type": "array",
156
- "items": {
157
- "anyOf": [
158
- {
159
- "$ref": "#/components/Search"
160
- },
161
- {
162
- "$ref": "#/components/Navbar"
163
- },
164
- {
165
- "$ref": "#/components/Alert"
166
- },
167
- {
168
- "$ref": "#/components/Footer"
169
- },
170
- {
171
- "$ref": "#/components/BannerText"
172
- },
173
- {
174
- "$ref": "#/components/Hero"
175
- },
176
- {
177
- "$ref": "#/components/Incentives"
178
- },
179
- {
180
- "$ref": "#/components/ProductShelf"
181
- },
182
- {
183
- "$ref": "#/components/ProductTiles"
184
- },
185
- {
186
- "$ref": "#/components/Newsletter"
187
- },
188
- {
189
- "$ref": "#/components/Children"
190
- },
191
- {
192
- "$ref": "#/components/BannerNewsletter"
193
- },
194
- {
195
- "$ref": "#/components/CartSidebar"
196
- },
197
- {
198
- "$ref": "#/components/RegionBar"
199
- },
200
- {
201
- "$ref": "#/components/RegionModal"
202
- },
203
- {
204
- "$ref": "#/components/RegionPopover"
205
- },
206
- {
207
- "$ref": "#/components/EmptyState"
208
- },
209
- {
210
- "$ref": "#/components/ShoppingAssistant"
211
- }
212
- ]
213
- }
155
+ "$ref": "#/$defs/$ALLOW_ALL_COMPONENTS"
214
156
  }
215
157
  },
216
158
  "readOnly": false,