@builder.io/react 5.0.1 → 5.0.2-2

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@builder.io/react",
3
- "version": "5.0.1",
3
+ "version": "5.0.2-1",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "main": "dist/builder-react.cjs.js",
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.filterWithCustomTargeting = void 0;
18
+ var react_1 = __importDefault(require("react"));
19
+ var sdk_1 = require("@builder.io/sdk");
20
+ var react_2 = require("react");
21
+ var builder_blocks_component_1 = require("../components/builder-blocks.component");
22
+ function PersonalizationContainer(props) {
23
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
24
+ var _k = (0, react_2.useState)(false), isClient = _k[0], setIsClient = _k[1];
25
+ var _l = (0, react_2.useState)(0), update = _l[0], setUpdate = _l[1];
26
+ (0, react_2.useEffect)(function () {
27
+ setIsClient(true);
28
+ }, []);
29
+ (0, react_2.useEffect)(function () {
30
+ var subscriber = sdk_1.builder.userAttributesChanged.subscribe(function () {
31
+ setUpdate(update + 1);
32
+ });
33
+ return function () {
34
+ subscriber.unsubscribe();
35
+ };
36
+ }, []);
37
+ var filteredVariants = (props.variants || []).filter(function (variant) {
38
+ return filterWithCustomTargeting(sdk_1.builder.getUserAttributes(), variant.query, variant.startDate, variant.endDate);
39
+ });
40
+ return (react_1.default.createElement("div", __assign({ style: __assign({ opacity: isClient ? 1 : 0, transition: 'opacity 0.2s ease-in-out' }, props.attributes) }, props.attributes, { className: "builder-personalization-container ".concat(props.attributes.className, " ").concat(isClient ? '' : 'builder-personalization-container-loading') }), sdk_1.Builder.isEditing &&
41
+ typeof props.previewingIndex === 'number' &&
42
+ props.previewingIndex < (((_a = props.variants) === null || _a === void 0 ? void 0 : _a.length) || 0) ? (react_1.default.createElement(builder_blocks_component_1.BuilderBlocks, { blocks: (_c = (_b = props.variants) === null || _b === void 0 ? void 0 : _b[props.previewingIndex]) === null || _c === void 0 ? void 0 : _c.blocks, parentElementId: (_d = props.builderBlock) === null || _d === void 0 ? void 0 : _d.id, dataPath: "component.options.variants.".concat(props.previewingIndex, ".blocks"), child: true })) : // If editing the default or we're on the server and there are no matching variants show the default
43
+ (sdk_1.Builder.isEditing && typeof props.previewingIndex !== 'number') ||
44
+ !isClient ||
45
+ !filteredVariants.length ? (react_1.default.createElement(builder_blocks_component_1.BuilderBlocks, { blocks: (_e = props.builderBlock) === null || _e === void 0 ? void 0 : _e.children, parentElementId: (_f = props.builderBlock) === null || _f === void 0 ? void 0 : _f.id, dataPath: "this.children", child: true })) : (
46
+ // Show the variant matching the current user attributes
47
+ react_1.default.createElement(builder_blocks_component_1.BuilderBlocks, { blocks: (_g = filteredVariants[0]) === null || _g === void 0 ? void 0 : _g.blocks, parentElementId: (_h = props.builderBlock) === null || _h === void 0 ? void 0 : _h.id, dataPath: "component.options.variants.".concat((_j = props.variants) === null || _j === void 0 ? void 0 : _j.indexOf(filteredVariants[0]), ".blocks"), child: true }))));
48
+ }
49
+ exports.default = PersonalizationContainer;
50
+ function filterWithCustomTargeting(userAttributes, query, startDate, endDate) {
51
+ var item = {
52
+ query: query,
53
+ startDate: startDate,
54
+ endDate: endDate,
55
+ };
56
+ var now = (userAttributes.date && new Date(userAttributes.date)) || new Date();
57
+ if (item.startDate && new Date(item.startDate) > now) {
58
+ return false;
59
+ }
60
+ else if (item.endDate && new Date(item.endDate) < now) {
61
+ return false;
62
+ }
63
+ if (!item.query || !item.query.length) {
64
+ return true;
65
+ }
66
+ return item.query.every(function (filter) {
67
+ if (filter &&
68
+ filter.property === 'urlPath' &&
69
+ filter.value &&
70
+ typeof filter.value === 'string' &&
71
+ filter.value !== '/' &&
72
+ filter.value.endsWith('/')) {
73
+ filter.value = filter.value.slice(0, -1);
74
+ }
75
+ return objectMatchesQuery(userAttributes, filter);
76
+ });
77
+ function isNumber(val) {
78
+ return typeof val === 'number';
79
+ }
80
+ function isString(val) {
81
+ return typeof val === 'string';
82
+ }
83
+ function objectMatchesQuery(userattr, query) {
84
+ var result = (function () {
85
+ var property = query.property;
86
+ var operator = query.operator;
87
+ var testValue = query.value;
88
+ // Check is query property is present in userAttributes. Proceed only if it is present.
89
+ if (!(property && operator)) {
90
+ return true;
91
+ }
92
+ if (Array.isArray(testValue)) {
93
+ if (operator === 'isNot') {
94
+ return testValue.every(function (val) {
95
+ return objectMatchesQuery(userattr, { property: property, operator: operator, value: val });
96
+ });
97
+ }
98
+ return !!testValue.find(function (val) {
99
+ return objectMatchesQuery(userattr, { property: property, operator: operator, value: val });
100
+ });
101
+ }
102
+ var value = userattr[property];
103
+ if (Array.isArray(value)) {
104
+ return value.includes(testValue);
105
+ }
106
+ switch (operator) {
107
+ case 'is':
108
+ return value === testValue;
109
+ case 'isNot':
110
+ return value !== testValue;
111
+ case 'contains':
112
+ return (isString(value) || Array.isArray(value)) && value.includes(testValue);
113
+ case 'startsWith':
114
+ return isString(value) && value.startsWith(testValue);
115
+ case 'endsWith':
116
+ return isString(value) && value.endsWith(testValue);
117
+ case 'greaterThan':
118
+ return isNumber(value) && isNumber(testValue) && value > testValue;
119
+ case 'lessThan':
120
+ return isNumber(value) && isNumber(testValue) && value < testValue;
121
+ case 'greaterThanOrEqualTo':
122
+ return isNumber(value) && isNumber(testValue) && value >= testValue;
123
+ case 'lessThanOrEqualTo':
124
+ return isNumber(value) && isNumber(testValue) && value <= testValue;
125
+ }
126
+ return false;
127
+ })();
128
+ return result;
129
+ }
130
+ }
131
+ exports.filterWithCustomTargeting = filterWithCustomTargeting;
132
+ sdk_1.Builder.registerComponent(PersonalizationContainer, {
133
+ name: 'PersonalizationContainer',
134
+ noWrap: true,
135
+ image: 'https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F37229ed30d8c41dfb10b8cca1992053a',
136
+ canHaveChildren: true,
137
+ inputs: [
138
+ {
139
+ name: 'variants',
140
+ defaultValue: [],
141
+ behavior: 'personalizationVariantList',
142
+ type: 'list',
143
+ subFields: [
144
+ {
145
+ name: 'name',
146
+ type: 'text',
147
+ },
148
+ {
149
+ name: 'variants',
150
+ type: 'BuilderQuery',
151
+ defaultValue: [],
152
+ },
153
+ {
154
+ name: 'startDate',
155
+ type: 'date',
156
+ },
157
+ {
158
+ name: 'endDate',
159
+ type: 'date',
160
+ },
161
+ {
162
+ name: 'blocks',
163
+ type: 'UiBlocks',
164
+ hideFromUI: true,
165
+ defaultValue: [],
166
+ },
167
+ ],
168
+ },
169
+ ],
170
+ });
171
+ //# sourceMappingURL=PersonalizationContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonalizationContainer.js","sourceRoot":"","sources":["../../../../src/blocks/PersonalizationContainer.tsx"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ if (typeof window !== 'undefined') {
10
10
  supportsPatchUpdates: 'v4',
11
11
  supportsCustomBreakpoints: true,
12
12
  supportsGlobalSymbols: true,
13
+ blockLevelPersonalization: true,
13
14
  priorVersion: package_json_1.version,
14
15
  },
15
16
  }, '*');
@@ -1 +1 @@
1
- {"version":3,"file":"init-editing.js","sourceRoot":"","sources":["../../../../src/scripts/init-editing.ts"],"names":[],"mappings":";;;AAAA,mDAA6C;AAE7C,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,MAAA,MAAM,CAAC,MAAM,0CAAE,WAAW,CACxB;QACE,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI;YACX,oBAAoB,EAAE,IAAI;YAC1B,yBAAyB,EAAE,IAAI;YAC/B,qBAAqB,EAAE,IAAI;YAC3B,YAAY,EAAE,sBAAO;SACtB;KACF,EACD,GAAG,CACJ,CAAC;CACH"}
1
+ {"version":3,"file":"init-editing.js","sourceRoot":"","sources":["../../../../src/scripts/init-editing.ts"],"names":[],"mappings":";;;AAAA,mDAA6C;AAE7C,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,MAAA,MAAM,CAAC,MAAM,0CAAE,WAAW,CACxB;QACE,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI;YACX,oBAAoB,EAAE,IAAI;YAC1B,yBAAyB,EAAE,IAAI;YAC/B,qBAAqB,EAAE,IAAI;YAC3B,yBAAyB,EAAE,IAAI;YAC/B,YAAY,EAAE,sBAAO;SACtB;KACF,EACD,GAAG,CACJ,CAAC;CACH"}
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { BuilderElement } from '@builder.io/sdk';
3
+ type UserAttributes = any;
4
+ type Query = any;
5
+ export type PersonalizationContainerProps = {
6
+ children: React.ReactNode;
7
+ previewingIndex: number | null;
8
+ builderBlock?: BuilderElement;
9
+ variants?: [
10
+ {
11
+ query: Query[];
12
+ startDate?: string;
13
+ endDate?: string;
14
+ blocks: BuilderElement[];
15
+ }
16
+ ];
17
+ attributes: any;
18
+ };
19
+ declare function PersonalizationContainer(props: PersonalizationContainerProps): React.JSX.Element;
20
+ export default PersonalizationContainer;
21
+ export declare function filterWithCustomTargeting(userAttributes: UserAttributes, query: Query[], startDate?: string, endDate?: string): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@builder.io/react",
3
- "version": "5.0.1",
3
+ "version": "5.0.2-2",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "main": "dist/builder-react.cjs.js",
@@ -98,7 +98,7 @@
98
98
  "react-dom": ">=16.8.0"
99
99
  },
100
100
  "dependencies": {
101
- "@builder.io/sdk": "3.0.1",
101
+ "@builder.io/sdk": "3.0.2-0",
102
102
  "@emotion/core": "^10.0.17",
103
103
  "hash-sum": "^2.0.0",
104
104
  "isolated-vm": "^5.0.0",
@@ -106,5 +106,6 @@
106
106
  },
107
107
  "installConfig": {
108
108
  "hoistingLimits": "workspaces"
109
- }
110
- }
109
+ },
110
+ "stableVersion": "5.0.2-1"
111
+ }
File without changes
@@ -0,0 +1,238 @@
1
+ import React from 'react';
2
+ import { Builder, builder, BuilderElement } from '@builder.io/sdk';
3
+ import { useEffect, useState } from 'react';
4
+ import { BuilderBlocks } from '../components/builder-blocks.component';
5
+
6
+ type UserAttributes = any;
7
+ type Query = any;
8
+
9
+ export type PersonalizationContainerProps = {
10
+ children: React.ReactNode;
11
+ previewingIndex: number | null;
12
+ builderBlock?: BuilderElement;
13
+ variants?: [
14
+ {
15
+ query: Query[];
16
+ startDate?: string;
17
+ endDate?: string;
18
+ blocks: BuilderElement[];
19
+ },
20
+ ];
21
+ attributes: any;
22
+ };
23
+
24
+ function PersonalizationContainer(props: PersonalizationContainerProps) {
25
+ const [isClient, setIsClient] = useState(false);
26
+ const [update, setUpdate] = useState(0);
27
+
28
+ useEffect(() => {
29
+ setIsClient(true);
30
+ }, []);
31
+
32
+ useEffect(() => {
33
+ const subscriber = builder.userAttributesChanged.subscribe(() => {
34
+ setUpdate(update + 1);
35
+ });
36
+ return () => {
37
+ subscriber.unsubscribe();
38
+ };
39
+ }, []);
40
+
41
+ const filteredVariants = (props.variants || []).filter(variant => {
42
+ return filterWithCustomTargeting(
43
+ builder.getUserAttributes(),
44
+ variant.query,
45
+ variant.startDate,
46
+ variant.endDate
47
+ );
48
+ });
49
+
50
+ return (
51
+ <div
52
+ style={{
53
+ opacity: isClient ? 1 : 0,
54
+ transition: 'opacity 0.2s ease-in-out',
55
+ ...props.attributes,
56
+ }}
57
+ {...props.attributes}
58
+ className={`builder-personalization-container ${
59
+ props.attributes.className
60
+ } ${isClient ? '' : 'builder-personalization-container-loading'}`}
61
+ >
62
+ {/* If editing a specific varient */}
63
+ {Builder.isEditing &&
64
+ typeof props.previewingIndex === 'number' &&
65
+ props.previewingIndex < (props.variants?.length || 0) ? (
66
+ <BuilderBlocks
67
+ blocks={props.variants?.[props.previewingIndex]?.blocks}
68
+ parentElementId={props.builderBlock?.id}
69
+ dataPath={`component.options.variants.${props.previewingIndex}.blocks`}
70
+ child
71
+ />
72
+ ) : // If editing the default or we're on the server and there are no matching variants show the default
73
+ (Builder.isEditing && typeof props.previewingIndex !== 'number') ||
74
+ !isClient ||
75
+ !filteredVariants.length ? (
76
+ <BuilderBlocks
77
+ blocks={props.builderBlock?.children}
78
+ parentElementId={props.builderBlock?.id}
79
+ dataPath="this.children"
80
+ child
81
+ />
82
+ ) : (
83
+ // Show the variant matching the current user attributes
84
+ <BuilderBlocks
85
+ blocks={filteredVariants[0]?.blocks}
86
+ parentElementId={props.builderBlock?.id}
87
+ dataPath={`component.options.variants.${props.variants?.indexOf(
88
+ filteredVariants[0]
89
+ )}.blocks`}
90
+ child
91
+ />
92
+ )}
93
+ </div>
94
+ );
95
+ }
96
+
97
+ export default PersonalizationContainer;
98
+
99
+ export function filterWithCustomTargeting(
100
+ userAttributes: UserAttributes,
101
+ query: Query[],
102
+ startDate?: string,
103
+ endDate?: string
104
+ ) {
105
+ const item = {
106
+ query,
107
+ startDate,
108
+ endDate,
109
+ };
110
+
111
+ const now = (userAttributes.date && new Date(userAttributes.date)) || new Date();
112
+
113
+ if (item.startDate && new Date(item.startDate) > now) {
114
+ return false;
115
+ } else if (item.endDate && new Date(item.endDate) < now) {
116
+ return false;
117
+ }
118
+
119
+ if (!item.query || !item.query.length) {
120
+ return true;
121
+ }
122
+
123
+ return item.query.every((filter: Query) => {
124
+ if (
125
+ filter &&
126
+ filter.property === 'urlPath' &&
127
+ filter.value &&
128
+ typeof filter.value === 'string' &&
129
+ filter.value !== '/' &&
130
+ filter.value.endsWith('/')
131
+ ) {
132
+ filter.value = filter.value.slice(0, -1);
133
+ }
134
+ return objectMatchesQuery(userAttributes, filter);
135
+ });
136
+
137
+ function isNumber(val: unknown) {
138
+ return typeof val === 'number';
139
+ }
140
+
141
+ function isString(val: unknown) {
142
+ return typeof val === 'string';
143
+ }
144
+
145
+ function objectMatchesQuery(userattr: UserAttributes, query: Query): boolean {
146
+ const result = (() => {
147
+ const property = query.property;
148
+ const operator = query.operator;
149
+ const testValue = query.value;
150
+
151
+ // Check is query property is present in userAttributes. Proceed only if it is present.
152
+ if (!(property && operator)) {
153
+ return true;
154
+ }
155
+
156
+ if (Array.isArray(testValue)) {
157
+ if (operator === 'isNot') {
158
+ return testValue.every(val =>
159
+ objectMatchesQuery(userattr, { property, operator, value: val })
160
+ );
161
+ }
162
+ return !!testValue.find(val =>
163
+ objectMatchesQuery(userattr, { property, operator, value: val })
164
+ );
165
+ }
166
+ const value = userattr[property];
167
+
168
+ if (Array.isArray(value)) {
169
+ return value.includes(testValue);
170
+ }
171
+
172
+ switch (operator) {
173
+ case 'is':
174
+ return value === testValue;
175
+ case 'isNot':
176
+ return value !== testValue;
177
+ case 'contains':
178
+ return (isString(value) || Array.isArray(value)) && value.includes(testValue);
179
+ case 'startsWith':
180
+ return isString(value) && value.startsWith(testValue);
181
+ case 'endsWith':
182
+ return isString(value) && value.endsWith(testValue);
183
+ case 'greaterThan':
184
+ return isNumber(value) && isNumber(testValue) && value > testValue;
185
+ case 'lessThan':
186
+ return isNumber(value) && isNumber(testValue) && value < testValue;
187
+ case 'greaterThanOrEqualTo':
188
+ return isNumber(value) && isNumber(testValue) && value >= testValue;
189
+ case 'lessThanOrEqualTo':
190
+ return isNumber(value) && isNumber(testValue) && value <= testValue;
191
+ }
192
+ return false;
193
+ })();
194
+
195
+ return result;
196
+ }
197
+ }
198
+
199
+ Builder.registerComponent(PersonalizationContainer, {
200
+ name: 'PersonalizationContainer',
201
+ noWrap: true,
202
+ image:
203
+ 'https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F37229ed30d8c41dfb10b8cca1992053a',
204
+ canHaveChildren: true,
205
+ inputs: [
206
+ {
207
+ name: 'variants',
208
+ defaultValue: [],
209
+ behavior: 'personalizationVariantList',
210
+ type: 'list',
211
+ subFields: [
212
+ {
213
+ name: 'name',
214
+ type: 'text',
215
+ },
216
+ {
217
+ name: 'variants',
218
+ type: 'BuilderQuery',
219
+ defaultValue: [],
220
+ },
221
+ {
222
+ name: 'startDate',
223
+ type: 'date',
224
+ },
225
+ {
226
+ name: 'endDate',
227
+ type: 'date',
228
+ },
229
+ {
230
+ name: 'blocks',
231
+ type: 'UiBlocks',
232
+ hideFromUI: true,
233
+ defaultValue: [],
234
+ },
235
+ ],
236
+ },
237
+ ],
238
+ });
@@ -9,6 +9,7 @@ if (typeof window !== 'undefined') {
9
9
  supportsPatchUpdates: 'v4',
10
10
  supportsCustomBreakpoints: true,
11
11
  supportsGlobalSymbols: true,
12
+ blockLevelPersonalization: true,
12
13
  priorVersion: version,
13
14
  },
14
15
  },
package/.yarnrc.yml DELETED
@@ -1 +0,0 @@
1
- npmPublishAccess: "public"