docusaurus-plugin-generate-schema-docs 1.1.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +60 -2
  2. package/__tests__/ExampleDataLayer.test.js +92 -0
  3. package/__tests__/__fixtures__/static/schemas/add-to-cart-event.json +44 -0
  4. package/__tests__/__fixtures__/static/schemas/choice-event.json +72 -0
  5. package/__tests__/__fixtures__/static/schemas/components/dataLayer.json +56 -0
  6. package/__tests__/__fixtures__/static/schemas/components/product.json +125 -0
  7. package/__tests__/__fixtures__/static/schemas/nested/child-event.json +10 -0
  8. package/__tests__/__fixtures__/static/schemas/nested/grandchild-a.json +9 -0
  9. package/__tests__/__fixtures__/static/schemas/nested/grandchild-b.json +9 -0
  10. package/__tests__/__fixtures__/static/schemas/nested/parent-event.json +7 -0
  11. package/__tests__/__fixtures__/static/schemas/root-any-of-event.json +34 -0
  12. package/__tests__/__fixtures__/static/schemas/root-choice-event.json +36 -0
  13. package/__tests__/__fixtures__/validateSchemas/circular-schema.json +8 -0
  14. package/__tests__/__fixtures__/validateSchemas/components/referenced.json +10 -0
  15. package/__tests__/__fixtures__/validateSchemas/invalid-example-schema.json +8 -0
  16. package/__tests__/__fixtures__/validateSchemas/main-schema-with-missing-ref.json +8 -0
  17. package/__tests__/__fixtures__/validateSchemas/main-schema-with-ref.json +8 -0
  18. package/__tests__/__fixtures__/validateSchemas/no-example-schema.json +12 -0
  19. package/__tests__/__fixtures__/validateSchemas/schema-A.json +7 -0
  20. package/__tests__/__fixtures__/validateSchemas/schema-B.json +7 -0
  21. package/__tests__/__fixtures__/validateSchemas/valid-schema.json +8 -0
  22. package/__tests__/__fixtures_versioned__/static/schemas/1.1.1/add-to-cart-event.json +44 -0
  23. package/__tests__/__fixtures_versioned__/static/schemas/1.1.1/components/dataLayer.json +56 -0
  24. package/__tests__/__fixtures_versioned__/static/schemas/1.1.1/components/product.json +125 -0
  25. package/__tests__/__fixtures_versioned__/static/schemas/next/add-to-cart-event.json +44 -0
  26. package/__tests__/__fixtures_versioned__/static/schemas/next/components/dataLayer.json +56 -0
  27. package/__tests__/__fixtures_versioned__/static/schemas/next/components/product.json +125 -0
  28. package/__tests__/__fixtures_versioned__/versions.json +1 -0
  29. package/__tests__/__snapshots__/ExampleDataLayer.test.js.snap +117 -0
  30. package/__tests__/__snapshots__/generateEventDocs.nested.test.js.snap +92 -0
  31. package/__tests__/__snapshots__/generateEventDocs.test.js.snap +151 -0
  32. package/__tests__/__snapshots__/generateEventDocs.versioned.test.js.snap +53 -0
  33. package/__tests__/components/FoldableRows.test.js +330 -0
  34. package/__tests__/components/PropertiesTable.test.js +41 -0
  35. package/__tests__/components/PropertyRow.test.js +487 -0
  36. package/__tests__/components/SchemaJsonViewer.test.js +36 -0
  37. package/__tests__/components/SchemaRows.test.js +110 -0
  38. package/__tests__/components/SchemaViewer.test.js +44 -0
  39. package/__tests__/components/TableHeader.test.js +20 -0
  40. package/__tests__/generateEventDocs.nested.test.js +80 -0
  41. package/__tests__/generateEventDocs.test.js +90 -0
  42. package/__tests__/generateEventDocs.versioned.test.js +69 -0
  43. package/__tests__/helpers/buildExampleFromSchema.test.js +188 -0
  44. package/__tests__/helpers/file-system.test.js +44 -0
  45. package/__tests__/helpers/getConstraints.test.js +58 -0
  46. package/__tests__/helpers/loadSchema.test.js +20 -0
  47. package/__tests__/helpers/path-helpers.test.js +34 -0
  48. package/__tests__/helpers/processSchema.test.js +56 -0
  49. package/__tests__/helpers/schema-processing.test.js +82 -0
  50. package/__tests__/helpers/schemaToExamples.test.js +56 -0
  51. package/__tests__/helpers/schemaToTableData.filtering.test.js +65 -0
  52. package/__tests__/helpers/schemaToTableData.hierarchicalLines.test.js +539 -0
  53. package/__tests__/helpers/schemaToTableData.test.js +222 -0
  54. package/__tests__/helpers/update-schema-ids.test.js +107 -0
  55. package/__tests__/update-schema-ids.test.js +39 -0
  56. package/__tests__/validateSchemas.test.js +137 -0
  57. package/components/ExampleDataLayer.js +60 -27
  58. package/components/FoldableRows.js +164 -0
  59. package/components/PropertiesTable.js +12 -14
  60. package/components/PropertyRow.js +183 -0
  61. package/components/SchemaJsonViewer.js +8 -7
  62. package/components/SchemaRows.css +250 -0
  63. package/components/SchemaRows.js +24 -69
  64. package/components/SchemaViewer.js +21 -13
  65. package/components/TableHeader.js +15 -0
  66. package/generateEventDocs.js +141 -60
  67. package/helpers/buildExampleFromSchema.js +59 -73
  68. package/helpers/choice-index-template.js +22 -0
  69. package/helpers/file-system.js +32 -0
  70. package/helpers/getConstraints.js +52 -0
  71. package/helpers/loadSchema.js +11 -0
  72. package/helpers/path-helpers.js +22 -0
  73. package/helpers/processSchema.js +32 -0
  74. package/helpers/schema-doc-template.js +36 -0
  75. package/helpers/schema-processing.js +75 -0
  76. package/helpers/schemaToExamples.js +99 -0
  77. package/helpers/schemaToTableData.js +311 -0
  78. package/helpers/update-schema-ids.js +47 -0
  79. package/index.js +146 -47
  80. package/package.json +6 -3
  81. package/validateSchemas.js +56 -70
package/README.md CHANGED
@@ -45,7 +45,7 @@ npm install --save docusaurus-plugin-generate-schema-docs
45
45
  To generate the documentation from your schemas, run the following command:
46
46
 
47
47
  ```bash
48
- npx docusaurus generate schema-docs
48
+ npm run gen-docs
49
49
  ```
50
50
 
51
51
  This will generate MDX files in the `docs/events` directory.
@@ -55,17 +55,75 @@ This will generate MDX files in the `docs/events` directory.
55
55
  To validate your schemas, run the following command:
56
56
 
57
57
  ```bash
58
- npx docusaurus validate-schemas
58
+ npm run validate-schemas
59
59
  ```
60
60
 
61
61
  This will validate the schemas in the `schemas` directory.
62
62
 
63
+ ### Update Schema IDs
64
+
65
+ When using versioning, you can update the `$id` of your versioned schemas by running:
66
+
67
+ ```bash
68
+ npm run update-schema-ids
69
+ ```
70
+
71
+ This command will update the `$id` of all schemas in the versioned directories.
72
+
63
73
  ## How it Works
64
74
 
65
75
  The plugin reads your JSON schemas, dereferences any `$ref` properties, and merges `allOf` properties. It then generates an MDX file for each schema, which uses custom React components to render the schema details.
66
76
 
67
77
  The validation script builds an example from each schema and validates it against the schema itself, ensuring your examples are always in sync with your schemas.
68
78
 
79
+ ## Versioning
80
+
81
+ This plugin supports documentation and schema versioning, integrated with Docusaurus's native versioning system.
82
+
83
+ ### Enabling Versioning
84
+
85
+ To enable versioning, you need to:
86
+
87
+ 1. **Enable Docusaurus Versioning**: Follow the [Docusaurus documentation](https://docusaurus.io/docs/versioning) to enable versioning for your site. This typically involves creating a `versions.json` file.
88
+
89
+ 2. **Organize Your Schemas**: Create a versioned directory structure for your schemas. Instead of placing your schemas in `static/schemas`, you should have:
90
+ - `static/schemas/next`: For the "current" or "next" version of your schemas.
91
+ - `static/schemas/<version>`: For each version of your schemas (e.g., `static/schemas/1.1.1`).
92
+
93
+ When versioning is enabled, the plugin will automatically detect the `versions.json` file and generate documentation for each version, as well as for the `current` version.
94
+
95
+ ### Non-Versioned Mode
96
+
97
+ If you do not have a `versions.json` file in your `siteDir`, the plugin will run in non-versioned mode. It will read your schemas from `static/schemas` and generate documentation in `docs/events`.
98
+
99
+ ### Schema `$id` Versioning
100
+
101
+ When using the versioning feature, the plugin will automatically update the `$id` of your schemas to include the version number. For example, if your site's `url` is `https://example.com` and you have a schema `my-event.json` in version `1.0.0`, the `$id` will be updated to `https://example.com/schemas/1.0.0/my-event.json`.
102
+
103
+ This is done automatically by the plugin. However, if you need to update the `$id`s of your schemas manually, you can use the `update-schema-ids.js` script located in the plugin's `helpers` directory.
104
+
105
+ ## Partials
106
+
107
+ You can provide additional content to the generated documentation pages by creating partial files. Partials are Markdown files that can be automatically included in the generated pages.
108
+
109
+ ### Naming Convention
110
+
111
+ Partials must be named after the schema file they correspond to. For a schema named `my-event.json`, the partials would be:
112
+
113
+ - `my-event.mdx`: This partial is rendered directly after the schema's main description.
114
+ - `my-event_bottom.mdx`: This partial is rendered at the very bottom of the page.
115
+
116
+ ### Location
117
+
118
+ Place your partial files in the `/docs/partials` directory at the root of your docusaurus project. The plugin will automatically find and include them.
119
+
120
+ ### Example
121
+
122
+ If you have a schema `add-to-cart-event.json`, you can create the following files:
123
+
124
+ - `docs/partials/add-to-cart-event.mdx`: For content to appear after the description.
125
+ - `docs/partials/add-to-cart-event_bottom.mdx`: For content to appear at the bottom.
126
+
69
127
  ## Contributing
70
128
 
71
129
  Contributions are welcome! Please open an issue or submit a pull request if you have any ideas or improvements.
@@ -0,0 +1,92 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import ExampleDataLayer, {
5
+ findClearableProperties,
6
+ } from '../components/ExampleDataLayer';
7
+ import choiceEventSchema from './__fixtures__/static/schemas/choice-event.json';
8
+
9
+ // Mock the CodeBlock to make assertions on its content easier
10
+ jest.mock('@theme/CodeBlock', () => {
11
+ return function CodeBlock({ children, language }) {
12
+ return <pre data-language={language}>{children}</pre>;
13
+ };
14
+ });
15
+
16
+ jest.mock('@theme/Tabs', () => {
17
+ return function Tabs({ children }) {
18
+ return <div data-testid="tabs">{children}</div>;
19
+ };
20
+ });
21
+
22
+ jest.mock('@theme/TabItem', () => {
23
+ return function TabItem({ children, label }) {
24
+ return (
25
+ <div data-testid="tab-item" data-label={label}>
26
+ {children}
27
+ </div>
28
+ );
29
+ };
30
+ });
31
+
32
+ describe('ExampleDataLayer', () => {
33
+ it('should render a single example for a simple schema', () => {
34
+ const schema = {
35
+ type: 'object',
36
+ properties: {
37
+ event: { type: 'string', examples: ['test_event'] },
38
+ },
39
+ };
40
+ const { container } = render(<ExampleDataLayer schema={schema} />);
41
+ expect(container).toMatchSnapshot();
42
+ });
43
+
44
+ it('should render nothing for an empty schema', () => {
45
+ const { container } = render(<ExampleDataLayer schema={{}} />);
46
+ // An empty schema produces no examples, so the component should render null
47
+ expect(container.firstChild).toBeNull();
48
+ });
49
+
50
+ it('should render grouped tabs for a schema with choices', () => {
51
+ const { container, getAllByTestId } = render(
52
+ <ExampleDataLayer schema={choiceEventSchema} />,
53
+ );
54
+
55
+ // Check for the group headings
56
+ const headings = screen.getAllByRole('heading', { level: 4 });
57
+ expect(headings[0]).toHaveTextContent(/user_id options:/);
58
+ expect(headings[1]).toHaveTextContent(/payment_method options:/);
59
+
60
+ const tabItems = getAllByTestId('tab-item');
61
+ // 2 options for user_id + 2 options for payment_method = 4 tabs total
62
+ expect(tabItems).toHaveLength(4);
63
+
64
+ // Check the labels for one of the groups
65
+ expect(tabItems[0]).toHaveAttribute('data-label', 'User ID as String');
66
+ expect(tabItems[1]).toHaveAttribute('data-label', 'User ID as Integer');
67
+
68
+ // Let snapshot testing verify the complex content of each tab
69
+ expect(container).toMatchSnapshot();
70
+ });
71
+ });
72
+
73
+ describe('findClearableProperties', () => {
74
+ it('should return an empty array when schema is empty, null, or has no properties', () => {
75
+ expect(findClearableProperties({})).toEqual([]);
76
+ expect(findClearableProperties({ type: 'object' })).toEqual([]);
77
+ expect(findClearableProperties(null)).toEqual([]);
78
+ expect(findClearableProperties(undefined)).toEqual([]);
79
+ });
80
+
81
+ it('should return properties with "x-gtm-clear": true', () => {
82
+ const schema = {
83
+ properties: {
84
+ prop1: { type: 'string' },
85
+ prop2: { 'x-gtm-clear': true, type: 'object' },
86
+ prop3: { 'x-gtm-clear': false, type: 'object' },
87
+ prop4: { 'x-gtm-clear': true, type: 'array' },
88
+ },
89
+ };
90
+ expect(findClearableProperties(schema)).toEqual(['prop2', 'prop4']);
91
+ });
92
+ });
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tracking-docs-demo.buchert.digital/schemas/add-to-cart-event.json",
4
+ "title": "Add to Cart Event",
5
+ "description": "An add_to_cart event fires when a user adds one or more items to their shopping cart. Based on Google Analytics 4 ecommerce event specifications.",
6
+ "type": "object",
7
+ "allOf": [
8
+ {
9
+ "$ref": "./components/dataLayer.json"
10
+ }
11
+ ],
12
+ "properties": {
13
+ "event": {
14
+ "type": "string",
15
+ "const": "add_to_cart",
16
+ "description": "The name of the event indicating a add_to_cart has occurred."
17
+ },
18
+ "ecommerce": {
19
+ "type": "object",
20
+ "description": "Ecommerce related data for the purchase event.",
21
+ "properties": {
22
+ "value": {
23
+ "type": "number",
24
+ "description": "The monetary value of the event. Set value to the sum of (price * quantity) for all items in items.",
25
+ "examples": [30.03, 99.99, 45.5]
26
+ },
27
+ "currency": {
28
+ "type": "string",
29
+ "description": "The currency of the items in ISO 4217 three-letter format. Required when value is set.",
30
+ "examples": ["USD", "EUR", "GBP"]
31
+ },
32
+ "items": {
33
+ "type": "array",
34
+ "description": "The products added to the cart.",
35
+ "minItems": 1,
36
+ "items": {
37
+ "$ref": "./components/product.json"
38
+ }
39
+ }
40
+ },
41
+ "required": ["currency", "items"]
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tracking-docs-demo.buchert.digital/schemas/1.2.0/choice-event.json",
4
+ "title": "Choice Event",
5
+ "description": "An example event that uses oneOf and anyOf.",
6
+ "type": "object",
7
+ "properties": {
8
+ "event": {
9
+ "type": "string",
10
+ "const": "one_of_event"
11
+ },
12
+ "user_id": {
13
+ "description": "The user's ID.",
14
+ "oneOf": [
15
+ {
16
+ "type": "string",
17
+ "title": "User ID as String",
18
+ "description": "The user's ID as a string.",
19
+ "examples": ["user-123"]
20
+ },
21
+ {
22
+ "type": "integer",
23
+ "title": "User ID as Integer",
24
+ "description": "The user's ID as an integer.",
25
+ "examples": [123]
26
+ }
27
+ ]
28
+ },
29
+ "payment_method": {
30
+ "description": "The user's payment method.",
31
+ "type": "object",
32
+ "anyOf": [
33
+ {
34
+ "title": "Credit Card",
35
+ "properties": {
36
+ "payment_type": {
37
+ "type": "string",
38
+ "enum": ["credit_card", "debit_card"],
39
+ "examples": ["credit_card"]
40
+ },
41
+ "card_number": {
42
+ "type": "string",
43
+ "examples": ["1234-5678-9012-3456"]
44
+ },
45
+ "expiry_date": {
46
+ "type": "string",
47
+ "examples": ["12/26"]
48
+ }
49
+ },
50
+ "required": ["card_number", "expiry_date"]
51
+ },
52
+ {
53
+ "title": "PayPal",
54
+ "type": "object",
55
+ "properties": {
56
+ "payment_type": {
57
+ "type": "string",
58
+ "const": "paypal"
59
+ },
60
+ "email": {
61
+ "type": "string",
62
+ "format": "email",
63
+ "examples": ["test@example.com"]
64
+ }
65
+ },
66
+ "required": ["email"]
67
+ }
68
+ ]
69
+ }
70
+ },
71
+ "required": ["event", "user_id", "payment_method"]
72
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tracking-docs-demo.buchert.digital/schemas/components/dataLayer.json",
4
+ "title": "dataLayer",
5
+ "description": "Schema for the object structure pushed to the dataLayer.",
6
+ "type": "object",
7
+ "allOf": [
8
+ {
9
+ "$ref": "#/$defs/strictObject"
10
+ }
11
+ ],
12
+ "properties": {
13
+ "event": {
14
+ "type": "string",
15
+ "description": "The name of the event."
16
+ },
17
+ "ecommerce": {
18
+ "type": "object",
19
+ "description": "Ecommerce related data.",
20
+ "x-gtm-clear": true
21
+ },
22
+ "user_data": {
23
+ "type": "object",
24
+ "description": "User related data.",
25
+ "x-gtm-clear": true
26
+ }
27
+ },
28
+ "required": ["event"],
29
+ "$defs": {
30
+ "strictObject": {
31
+ "type": "object",
32
+ "propertyNames": {
33
+ "maxLength": 40,
34
+ "pattern": "^[a-z0-9_]+$"
35
+ },
36
+ "additionalProperties": {
37
+ "anyOf": [
38
+ {
39
+ "$ref": "#/$defs/strictObject"
40
+ },
41
+ {
42
+ "type": "array",
43
+ "items": {
44
+ "$ref": "#/$defs/strictObject"
45
+ }
46
+ },
47
+ {
48
+ "not": {
49
+ "type": "object"
50
+ }
51
+ }
52
+ ]
53
+ }
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,125 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tracking-docs-demo.buchert.digital/schemas/components/product.json",
4
+ "title": "A Product",
5
+ "description": "A product object representing an item for use within a purchase event, based on Google Analytics 4 ecommerce event specifications.",
6
+ "type": "object",
7
+ "properties": {
8
+ "item_id": {
9
+ "type": "string",
10
+ "description": "The ID of the item. Either item_id or item_name is required.",
11
+ "examples": ["SKU_12345", "PROD_98765"]
12
+ },
13
+ "item_name": {
14
+ "type": "string",
15
+ "description": "The name of the item. Either item_id or item_name is required.",
16
+ "examples": ["Stan and Friends Tee", "Blue Running Shoes"]
17
+ },
18
+ "affiliation": {
19
+ "type": "string",
20
+ "description": "A product affiliation to indicate a supplier or store. Note: affiliation is only available at the item level.",
21
+ "examples": ["Google Merchandise Store", "Nike Store"]
22
+ },
23
+ "coupon": {
24
+ "type": "string",
25
+ "description": "The coupon name/code associated with the item. Coupon parameters at event and item levels are independent.",
26
+ "examples": ["SUMMER_FUN", "WELCOME20", "SAVE10"]
27
+ },
28
+ "discount": {
29
+ "type": "number",
30
+ "description": "The monetary value of the discount per unit applied to the item.",
31
+ "examples": [2.22, 5.0, 10.5]
32
+ },
33
+ "index": {
34
+ "type": "number",
35
+ "description": "The index or position of the item in a list.",
36
+ "examples": [0, 1, 2]
37
+ },
38
+ "item_brand": {
39
+ "type": "string",
40
+ "description": "The brand of the item.",
41
+ "examples": ["Google", "Nike", "Adidas"]
42
+ },
43
+ "item_category": {
44
+ "type": "string",
45
+ "description": "The category of the item. If used as part of a category hierarchy or taxonomy, this is the first category.",
46
+ "examples": ["Apparel", "Footwear", "Electronics"]
47
+ },
48
+ "item_category2": {
49
+ "type": "string",
50
+ "description": "The second category hierarchy or additional taxonomy of the item.",
51
+ "examples": ["Adult", "Women", "Men"]
52
+ },
53
+ "item_category3": {
54
+ "type": "string",
55
+ "description": "The third category hierarchy or additional taxonomy of the item.",
56
+ "examples": ["Shirts", "Shoes", "Boots"]
57
+ },
58
+ "item_category4": {
59
+ "type": "string",
60
+ "description": "The fourth category hierarchy or additional taxonomy of the item.",
61
+ "examples": ["Crew", "Running", "Casual"]
62
+ },
63
+ "item_category5": {
64
+ "type": "string",
65
+ "description": "The fifth category hierarchy or additional taxonomy of the item.",
66
+ "examples": ["Short sleeve", "Long distance", "Lightweight"]
67
+ },
68
+ "item_list_id": {
69
+ "type": "string",
70
+ "description": "The ID of the list in which the item was presented to the user. If set, item_list_id at the event level is ignored. If not set, item_list_id at the event level is used if available.",
71
+ "examples": ["related_products", "search_results", "recommendations"]
72
+ },
73
+ "item_list_name": {
74
+ "type": "string",
75
+ "description": "The name of the list in which the item was presented to the user. If set, item_list_name at the event level is ignored. If not set, item_list_name at the event level is used if available.",
76
+ "examples": ["Related Products", "Search Results", "Recommended Items"]
77
+ },
78
+ "item_variant": {
79
+ "type": "string",
80
+ "description": "The item variant or unique code or description for additional item details/options.",
81
+ "examples": ["green", "Blue Size 10", "M-Black"]
82
+ },
83
+ "location_id": {
84
+ "type": "string",
85
+ "description": "The physical location associated with the item, such as the location of a brick-and-mortar store. It is recommended to use the Google Place ID that corresponds to the associated item. A custom location ID can also be used. Note: location_id is only available at the item level.",
86
+ "examples": ["ChIJIQBpAG2ahYAR_6128GcTUEo", "store_123", "location_sf"]
87
+ },
88
+ "price": {
89
+ "type": "number",
90
+ "description": "The price of the item in the specified currency unit. If a discount is applied to the item, set price to the reduced per-unit price and provide the per-unit price discount in the discount parameter.",
91
+ "examples": [10.01, 21.01, 89.99]
92
+ },
93
+ "quantity": {
94
+ "type": "number",
95
+ "description": "The item quantity. If not set, quantity is set to 1.",
96
+ "examples": [1, 2, 3]
97
+ },
98
+ "promotion_id": {
99
+ "type": "string",
100
+ "description": "The ID of the promotion associated with the item.",
101
+ "examples": ["P_12345", "PROMO_001"]
102
+ },
103
+ "promotion_name": {
104
+ "type": "string",
105
+ "description": "The name of the promotion associated with the item.",
106
+ "examples": ["Summer Sale", "Black Friday", "Flash Deal"]
107
+ },
108
+ "creative_name": {
109
+ "type": "string",
110
+ "description": "The name of the promotion creative.",
111
+ "examples": ["summer_banner2", "holiday_email_v1"]
112
+ },
113
+ "creative_slot": {
114
+ "type": "string",
115
+ "description": "The name of the creative slot associated with the item.",
116
+ "examples": ["featured_app_1", "top_banner", "sidebar"]
117
+ },
118
+ "google_business_vertical": {
119
+ "type": "string",
120
+ "description": "The business vertical for the item (e.g., 'retail').",
121
+ "examples": ["retail", "ecommerce"]
122
+ }
123
+ },
124
+ "required": []
125
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.com/schemas/nested/child-event.json",
4
+ "title": "Child Event",
5
+ "type": "object",
6
+ "oneOf": [
7
+ { "$ref": "./grandchild-a.json" },
8
+ { "$ref": "./grandchild-b.json" }
9
+ ]
10
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.com/schemas/nested/grandchild-a.json",
4
+ "title": "Grandchild A",
5
+ "type": "object",
6
+ "properties": {
7
+ "prop_a": { "type": "string" }
8
+ }
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.com/schemas/nested/grandchild-b.json",
4
+ "title": "Grandchild B",
5
+ "type": "object",
6
+ "properties": {
7
+ "prop_b": { "type": "string" }
8
+ }
9
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.com/schemas/nested/parent-event.json",
4
+ "title": "Parent Event",
5
+ "type": "object",
6
+ "oneOf": [{ "$ref": "./child-event.json" }]
7
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://tracking-docs-demo.buchert.digital/schemas/1.2.0/root-any-of-event.json",
4
+ "title": "Root AnyOf Event",
5
+ "description": "An example event that has anyOf at the root level.",
6
+ "type": "object",
7
+ "properties": {
8
+ "event": {
9
+ "type": "string",
10
+ "const": "any_of_event"
11
+ }
12
+ },
13
+ "anyOf": [
14
+ {
15
+ "title": "Has Param C",
16
+ "properties": {
17
+ "param_c": {
18
+ "type": "string",
19
+ "examples": ["example_c"],
20
+ "description": "This is the description for Param C."
21
+ }
22
+ }
23
+ },
24
+ {
25
+ "title": "Has Param D",
26
+ "properties": {
27
+ "param_d": {
28
+ "type": "boolean",
29
+ "examples": [true]
30
+ }
31
+ }
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.com/root-choice-event.schema.json",
4
+ "title": "Root Choice Event",
5
+ "description": "An example event that has oneOf at the root level.",
6
+ "oneOf": [
7
+ {
8
+ "title": "Option A",
9
+ "type": "object",
10
+ "properties": {
11
+ "event": {
12
+ "type": "string",
13
+ "const": "option_a"
14
+ },
15
+ "param_a": {
16
+ "type": "string",
17
+ "examples": ["example_a"]
18
+ }
19
+ }
20
+ },
21
+ {
22
+ "title": "Option B",
23
+ "type": "object",
24
+ "properties": {
25
+ "event": {
26
+ "type": "string",
27
+ "const": "option_b"
28
+ },
29
+ "param_b": {
30
+ "type": "integer",
31
+ "examples": [123]
32
+ }
33
+ }
34
+ }
35
+ ]
36
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "title": "Circular Schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "name": { "type": "string" },
6
+ "parent": { "$ref": "#" }
7
+ }
8
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "components/referenced.json",
4
+ "title": "Referenced Component",
5
+ "type": "object",
6
+ "properties": {
7
+ "prop": { "type": "string", "examples": ["component prop"] }
8
+ },
9
+ "required": ["prop"]
10
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "invalid-example-schema",
4
+ "title": "Invalid Example Schema",
5
+ "type": "object",
6
+ "properties": { "age": { "type": "number", "examples": ["not-a-number"] } },
7
+ "required": ["age"]
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "main-schema-with-missing-ref",
4
+ "title": "Main Schema with Missing Ref",
5
+ "type": "object",
6
+ "properties": { "component": { "$ref": "non-existent-component.json" } },
7
+ "required": ["component"]
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "main-schema-with-ref",
4
+ "title": "Main Schema with Ref",
5
+ "type": "object",
6
+ "properties": { "component": { "$ref": "components/referenced.json" } },
7
+ "required": ["component"]
8
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "no-valid-example-schema",
4
+ "title": "No Valid Example Schema",
5
+ "type": "object",
6
+ "properties": {
7
+ "some_prop": {
8
+ "description": "This property has no type or example, so it won't be in the generated example."
9
+ }
10
+ },
11
+ "required": ["some_prop"]
12
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "title": "Schema A",
3
+ "type": "object",
4
+ "properties": {
5
+ "b": { "$ref": "schema-B.json" }
6
+ }
7
+ }