docusaurus-plugin-generate-schema-docs 1.7.1 → 1.8.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 +22 -0
- package/__tests__/ExampleDataLayer.test.js +149 -2
- package/__tests__/__fixtures__/schema-processing/components/dataLayer.json +9 -0
- package/__tests__/__fixtures__/schema-processing/event-reference.json +14 -0
- package/__tests__/__fixtures__/schema-processing/purchase-event.json +14 -0
- package/__tests__/components/PropertyRow.test.js +30 -0
- package/__tests__/components/__snapshots__/ConnectorLines.visualRegression.test.js.snap +3 -3
- package/__tests__/helpers/exampleModel.test.js +135 -0
- package/__tests__/helpers/schema-processing.test.js +56 -0
- package/__tests__/helpers/schemaToTableData.test.js +41 -0
- package/__tests__/helpers/snippetTargets.test.js +744 -0
- package/__tests__/helpers/trackingTargets.test.js +42 -0
- package/__tests__/runtimePayload.android.test.js +292 -0
- package/__tests__/runtimePayload.ios.test.js +282 -0
- package/__tests__/runtimePayload.web.test.js +32 -0
- package/__tests__/validateSchemas.test.js +53 -1
- package/components/ExampleDataLayer.js +191 -56
- package/components/PropertyRow.js +3 -2
- package/components/SchemaRows.css +10 -1
- package/helpers/exampleModel.js +70 -0
- package/helpers/schema-processing.js +41 -5
- package/helpers/schemaToExamples.js +52 -2
- package/helpers/schemaToTableData.js +40 -2
- package/helpers/snippetTargets.js +853 -0
- package/helpers/trackingTargets.js +73 -0
- package/helpers/validator.js +1 -0
- package/package.json +1 -1
- package/test-data/payloadContracts.js +155 -0
- package/validateSchemas.js +15 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export const DEFAULT_TRACKING_TARGET = 'web-datalayer-js';
|
|
2
|
+
|
|
3
|
+
export const SUPPORTED_TRACKING_TARGETS = [
|
|
4
|
+
DEFAULT_TRACKING_TARGET,
|
|
5
|
+
'android-firebase-kotlin-sdk',
|
|
6
|
+
'android-firebase-java-sdk',
|
|
7
|
+
'ios-firebase-swift-sdk',
|
|
8
|
+
'ios-firebase-objc-sdk',
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
const TARGET_ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+){2,}$/;
|
|
12
|
+
|
|
13
|
+
export function resolveTrackingTargets(
|
|
14
|
+
schema,
|
|
15
|
+
{ schemaFile = 'schema', isQuiet = false } = {},
|
|
16
|
+
) {
|
|
17
|
+
const configuredTargets = schema?.['x-tracking-targets'];
|
|
18
|
+
|
|
19
|
+
if (configuredTargets == null) {
|
|
20
|
+
const warning = isQuiet
|
|
21
|
+
? null
|
|
22
|
+
: `Schema ${schemaFile} is missing x-tracking-targets. Falling back to "${DEFAULT_TRACKING_TARGET}".`;
|
|
23
|
+
return {
|
|
24
|
+
targets: [DEFAULT_TRACKING_TARGET],
|
|
25
|
+
warning,
|
|
26
|
+
errors: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (
|
|
31
|
+
!Array.isArray(configuredTargets) ||
|
|
32
|
+
configuredTargets.length === 0 ||
|
|
33
|
+
configuredTargets.some((target) => typeof target !== 'string')
|
|
34
|
+
) {
|
|
35
|
+
return {
|
|
36
|
+
targets: [],
|
|
37
|
+
warning: null,
|
|
38
|
+
errors: [
|
|
39
|
+
'x-tracking-targets must be a non-empty array of string target IDs.',
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const errors = [];
|
|
45
|
+
const unknownTargets = configuredTargets.filter(
|
|
46
|
+
(target) => !SUPPORTED_TRACKING_TARGETS.includes(target),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (unknownTargets.length > 0) {
|
|
50
|
+
errors.push(
|
|
51
|
+
`x-tracking-targets contains unsupported target(s): ${unknownTargets.join(
|
|
52
|
+
', ',
|
|
53
|
+
)}.`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const badlyFormattedTargets = configuredTargets.filter(
|
|
58
|
+
(target) => !TARGET_ID_PATTERN.test(target),
|
|
59
|
+
);
|
|
60
|
+
if (badlyFormattedTargets.length > 0) {
|
|
61
|
+
errors.push(
|
|
62
|
+
`x-tracking-targets must use lowercase kebab-case IDs like "web-datalayer-js". Invalid value(s): ${badlyFormattedTargets.join(
|
|
63
|
+
', ',
|
|
64
|
+
)}.`,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
targets: errors.length === 0 ? configuredTargets : [],
|
|
70
|
+
warning: null,
|
|
71
|
+
errors,
|
|
72
|
+
};
|
|
73
|
+
}
|
package/helpers/validator.js
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
const PAYLOAD_CONTRACTS = [
|
|
2
|
+
{
|
|
3
|
+
id: 'screen-view-predefined',
|
|
4
|
+
class: 'predefined',
|
|
5
|
+
example: {
|
|
6
|
+
event: 'screen_view',
|
|
7
|
+
firebase_screen: 'Checkout',
|
|
8
|
+
firebase_screen_class: 'CheckoutViewController',
|
|
9
|
+
},
|
|
10
|
+
expected: {
|
|
11
|
+
web: {
|
|
12
|
+
eventName: 'screen_view',
|
|
13
|
+
payload: {
|
|
14
|
+
event: 'screen_view',
|
|
15
|
+
firebase_screen: 'Checkout',
|
|
16
|
+
firebase_screen_class: 'CheckoutViewController',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
firebase: {
|
|
20
|
+
eventName: 'screen_view',
|
|
21
|
+
parameters: {
|
|
22
|
+
screen_name: 'Checkout',
|
|
23
|
+
screen_class: 'CheckoutViewController',
|
|
24
|
+
},
|
|
25
|
+
userProperties: {},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'add-to-cart-with-items',
|
|
31
|
+
class: 'ecommerce_items',
|
|
32
|
+
example: {
|
|
33
|
+
event: 'add_to_cart',
|
|
34
|
+
currency: 'EUR',
|
|
35
|
+
value: 42.5,
|
|
36
|
+
items: [
|
|
37
|
+
{
|
|
38
|
+
item_id: 'sku-1',
|
|
39
|
+
item_name: 'Socks',
|
|
40
|
+
price: 21.25,
|
|
41
|
+
quantity: 2,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
expected: {
|
|
46
|
+
web: {
|
|
47
|
+
eventName: 'add_to_cart',
|
|
48
|
+
payload: {
|
|
49
|
+
event: 'add_to_cart',
|
|
50
|
+
currency: 'EUR',
|
|
51
|
+
value: 42.5,
|
|
52
|
+
items: [
|
|
53
|
+
{
|
|
54
|
+
item_id: 'sku-1',
|
|
55
|
+
item_name: 'Socks',
|
|
56
|
+
price: 21.25,
|
|
57
|
+
quantity: 2,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
firebase: {
|
|
63
|
+
eventName: 'add_to_cart',
|
|
64
|
+
parameters: {
|
|
65
|
+
currency: 'EUR',
|
|
66
|
+
value: 42.5,
|
|
67
|
+
items: [
|
|
68
|
+
{
|
|
69
|
+
item_id: 'sku-1',
|
|
70
|
+
item_name: 'Socks',
|
|
71
|
+
price: 21.25,
|
|
72
|
+
quantity: 2,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
userProperties: {},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: 'custom-event-with-user-properties',
|
|
82
|
+
class: 'custom',
|
|
83
|
+
example: {
|
|
84
|
+
event: 'my_custom_event',
|
|
85
|
+
plan: 'pro',
|
|
86
|
+
count: 2,
|
|
87
|
+
premium: true,
|
|
88
|
+
user_properties: {
|
|
89
|
+
sign_up_method: 'email',
|
|
90
|
+
allow_ad_personalization_signals: false,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
expected: {
|
|
94
|
+
web: {
|
|
95
|
+
eventName: 'my_custom_event',
|
|
96
|
+
payload: {
|
|
97
|
+
event: 'my_custom_event',
|
|
98
|
+
plan: 'pro',
|
|
99
|
+
count: 2,
|
|
100
|
+
premium: true,
|
|
101
|
+
user_properties: {
|
|
102
|
+
sign_up_method: 'email',
|
|
103
|
+
allow_ad_personalization_signals: false,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
firebase: {
|
|
108
|
+
eventName: 'my_custom_event',
|
|
109
|
+
parameters: {
|
|
110
|
+
plan: 'pro',
|
|
111
|
+
count: 2,
|
|
112
|
+
premium: 1,
|
|
113
|
+
},
|
|
114
|
+
userProperties: {
|
|
115
|
+
sign_up_method: 'email',
|
|
116
|
+
allow_personalized_ads: 'false',
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'web-fallback-json-serialization',
|
|
123
|
+
class: 'fallback_json_serialization',
|
|
124
|
+
targets: ['web-datalayer-js'],
|
|
125
|
+
example: {
|
|
126
|
+
event: 'metadata_capture',
|
|
127
|
+
metadata: {
|
|
128
|
+
checkout_step: 2,
|
|
129
|
+
flags: ['beta', 'ios'],
|
|
130
|
+
},
|
|
131
|
+
user: {
|
|
132
|
+
id: 'U-123',
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
expected: {
|
|
136
|
+
web: {
|
|
137
|
+
eventName: 'metadata_capture',
|
|
138
|
+
payload: {
|
|
139
|
+
event: 'metadata_capture',
|
|
140
|
+
metadata: {
|
|
141
|
+
checkout_step: 2,
|
|
142
|
+
flags: ['beta', 'ios'],
|
|
143
|
+
},
|
|
144
|
+
user: {
|
|
145
|
+
id: 'U-123',
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
module.exports = {
|
|
154
|
+
PAYLOAD_CONTRACTS,
|
|
155
|
+
};
|
package/validateSchemas.js
CHANGED
|
@@ -3,6 +3,7 @@ import fs from 'fs';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import processSchema from './helpers/processSchema.js';
|
|
5
5
|
import { schemaToExamples } from './helpers/schemaToExamples.js';
|
|
6
|
+
import { resolveTrackingTargets } from './helpers/trackingTargets.js';
|
|
6
7
|
|
|
7
8
|
const validateSingleSchema = async (filePath, schemaPath) => {
|
|
8
9
|
const file = path.basename(filePath);
|
|
@@ -13,6 +14,20 @@ const validateSingleSchema = async (filePath, schemaPath) => {
|
|
|
13
14
|
const mergedSchema = await processSchema(filePath);
|
|
14
15
|
const exampleGroups = schemaToExamples(mergedSchema);
|
|
15
16
|
const originalSchema = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
17
|
+
const trackingTargets = resolveTrackingTargets(originalSchema, {
|
|
18
|
+
schemaFile: file,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (trackingTargets.warning) {
|
|
22
|
+
console.warn(trackingTargets.warning);
|
|
23
|
+
}
|
|
24
|
+
if (trackingTargets.errors.length > 0) {
|
|
25
|
+
trackingTargets.errors.forEach((error) =>
|
|
26
|
+
errors.push(`x Schema ${file} ${error}`),
|
|
27
|
+
);
|
|
28
|
+
return { allValid: false, errors };
|
|
29
|
+
}
|
|
30
|
+
|
|
16
31
|
const validate = await createValidator([], originalSchema, schemaPath);
|
|
17
32
|
|
|
18
33
|
if (exampleGroups.length === 0) {
|