@builder.io/sdk-solid 0.8.0 → 0.9.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.
package/lib/node/index.js CHANGED
@@ -56,7 +56,9 @@ var builder_context_default = createContext({
56
56
  apiKey: null,
57
57
  apiVersion: void 0,
58
58
  componentInfos: {},
59
- inheritedStyles: {}
59
+ inheritedStyles: {},
60
+ BlocksWrapper: "div",
61
+ BlocksWrapperProps: {}
60
62
  });
61
63
  var components_context_default = createContext({ registeredComponents: {} });
62
64
 
@@ -229,11 +231,16 @@ var set = (obj, _path, value) => {
229
231
  path.slice(0, -1).reduce((a, c, i) => Object(a[c]) === a[c] ? a[c] : a[c] = Math.abs(Number(path[i + 1])) >> 0 === +path[i + 1] ? [] : {}, obj)[path[path.length - 1]] = value;
230
232
  return obj;
231
233
  };
232
- var noop = () => null;
234
+ var noop = () => {
235
+ };
233
236
  var safeDynamicRequire = noop;
234
237
  try {
235
238
  safeDynamicRequire = createRequire(import.meta.url);
236
239
  } catch (error) {
240
+ try {
241
+ safeDynamicRequire = eval("require");
242
+ } catch (error2) {
243
+ }
237
244
  }
238
245
 
239
246
  // src/functions/evaluate/node-runtime/node-runtime.ts
@@ -726,78 +733,10 @@ function getBlockActions(options) {
726
733
  return obj;
727
734
  }
728
735
 
729
- // src/functions/sanitize-react-native-block-styles.ts
730
- var propertiesThatMustBeNumber = /* @__PURE__ */ new Set(["lineHeight"]);
731
- var displayValues = /* @__PURE__ */ new Set(["flex", "none"]);
732
- var normalizeNumber = (value) => {
733
- if (Number.isNaN(value)) {
734
- return void 0;
735
- } else if (value < 0) {
736
- return 0;
737
- } else {
738
- return value;
739
- }
740
- };
741
- var sanitizeReactNativeBlockStyles = (styles) => {
742
- return Object.keys(styles).reduce((acc, key) => {
743
- const propertyValue = styles[key];
744
- if (key === "display" && !displayValues.has(propertyValue)) {
745
- return acc;
746
- }
747
- if (propertiesThatMustBeNumber.has(key) && typeof propertyValue !== "number") {
748
- return acc;
749
- }
750
- if (typeof propertyValue === "string") {
751
- const isPixelUnit = propertyValue.match(/^-?(\d*)(\.?)(\d*)*px$/);
752
- if (isPixelUnit) {
753
- const newValue = parseFloat(propertyValue);
754
- const normalizedValue = normalizeNumber(newValue);
755
- if (normalizedValue) {
756
- return {
757
- ...acc,
758
- [key]: normalizedValue
759
- };
760
- } else {
761
- return acc;
762
- }
763
- } else if (propertyValue === "0") {
764
- return {
765
- ...acc,
766
- [key]: 0
767
- };
768
- }
769
- }
770
- return {
771
- ...acc,
772
- [key]: propertyValue
773
- };
774
- }, {});
775
- };
776
-
777
- // src/functions/get-react-native-block-styles.ts
778
- function getReactNativeBlockStyles({
779
- block,
780
- context,
781
- blockStyles
782
- }) {
783
- const responsiveStyles = block.responsiveStyles;
784
- if (!responsiveStyles) {
785
- return {};
786
- }
787
- const styles = {
788
- // recursively apply inherited styles so that they can be passed down to children `Text` blocks
789
- ...context.inheritedStyles,
790
- ...responsiveStyles.large || {},
791
- ...responsiveStyles.medium || {},
792
- ...responsiveStyles.small || {},
793
- ...blockStyles
794
- };
795
- const newStyles = sanitizeReactNativeBlockStyles(styles);
796
- return newStyles;
797
- }
798
-
799
736
  // src/functions/transform-block-properties.ts
800
- function transformBlockProperties(properties) {
737
+ function transformBlockProperties({
738
+ properties
739
+ }) {
801
740
  return properties;
802
741
  }
803
742
 
@@ -818,14 +757,11 @@ function getBlockProperties({
818
757
  style: block.style ? getStyleAttribute(block.style) : void 0,
819
758
  class: [block.id, "builder-block", block.class, block.properties?.class].filter(Boolean).join(" ")
820
759
  };
821
- if (TARGET === "reactNative") {
822
- properties.style = getReactNativeBlockStyles({
823
- block,
824
- context,
825
- blockStyles: properties.style
826
- });
827
- }
828
- return transformBlockProperties(properties);
760
+ return transformBlockProperties({
761
+ properties,
762
+ context,
763
+ block
764
+ });
829
765
  }
830
766
  function getStyleAttribute(style) {
831
767
  switch (TARGET) {
@@ -1263,7 +1199,6 @@ function Block(props) {
1263
1199
  });
1264
1200
  }
1265
1201
  var block_default = Block;
1266
- var _tmpl$4 = /* @__PURE__ */ template(`<div>`);
1267
1202
  function BlocksWrapper(props) {
1268
1203
  function className() {
1269
1204
  return "builder-blocks" + (!props.blocks?.length ? " no-blocks" : "");
@@ -1290,33 +1225,35 @@ function BlocksWrapper(props) {
1290
1225
  }, "*");
1291
1226
  }
1292
1227
  }
1293
- return (() => {
1294
- const _el$ = _tmpl$4();
1295
- spread(_el$, mergeProps({
1296
- get ["class"]() {
1297
- return className() + " " + css({
1298
- display: "flex",
1299
- flexDirection: "column",
1300
- alignItems: "stretch"
1301
- });
1302
- },
1303
- get ["builder-path"]() {
1304
- return props.path;
1305
- },
1306
- get ["builder-parent-id"]() {
1307
- return props.parent;
1308
- }
1309
- }, {}, {
1310
- get style() {
1311
- return props.styleProp;
1312
- },
1313
- "onClick": (event) => onClick(),
1314
- "onMouseEnter": (event) => onMouseEnter(),
1315
- "onKeyPress": (event) => onClick()
1316
- }), false, true);
1317
- insert(_el$, () => props.children);
1318
- return _el$;
1319
- })();
1228
+ return createComponent(Dynamic, mergeProps({
1229
+ get ["class"]() {
1230
+ return className() + " " + css({
1231
+ display: "flex",
1232
+ flexDirection: "column",
1233
+ alignItems: "stretch"
1234
+ });
1235
+ },
1236
+ get ["builder-path"]() {
1237
+ return props.path;
1238
+ },
1239
+ get ["builder-parent-id"]() {
1240
+ return props.parent;
1241
+ }
1242
+ }, {}, {
1243
+ get style() {
1244
+ return props.styleProp;
1245
+ },
1246
+ onClick: (event) => onClick(),
1247
+ onMouseEnter: (event) => onMouseEnter(),
1248
+ onKeyPress: (event) => onClick()
1249
+ }, () => props.BlocksWrapperProps, {
1250
+ get component() {
1251
+ return props.BlocksWrapper;
1252
+ },
1253
+ get children() {
1254
+ return props.children;
1255
+ }
1256
+ }));
1320
1257
  }
1321
1258
  var blocks_wrapper_default = BlocksWrapper;
1322
1259
 
@@ -1337,6 +1274,12 @@ function Blocks(props) {
1337
1274
  get styleProp() {
1338
1275
  return props.styleProp;
1339
1276
  },
1277
+ get BlocksWrapper() {
1278
+ return props.context?.BlocksWrapper;
1279
+ },
1280
+ get BlocksWrapperProps() {
1281
+ return props.context?.BlocksWrapperProps;
1282
+ },
1340
1283
  get children() {
1341
1284
  return [createComponent(Show, {
1342
1285
  get when() {
@@ -1394,7 +1337,7 @@ function Blocks(props) {
1394
1337
  var blocks_default = Blocks;
1395
1338
 
1396
1339
  // src/blocks/columns/columns.tsx
1397
- var _tmpl$5 = /* @__PURE__ */ template(`<div>`);
1340
+ var _tmpl$4 = /* @__PURE__ */ template(`<div>`);
1398
1341
  function Columns(props) {
1399
1342
  const [gutterSize, setGutterSize] = createSignal(typeof props.space === "number" ? props.space || 0 : 20);
1400
1343
  const [cols, setCols] = createSignal(props.columns || []);
@@ -1488,7 +1431,7 @@ function Columns(props) {
1488
1431
  `;
1489
1432
  }
1490
1433
  return (() => {
1491
- const _el$ = _tmpl$5();
1434
+ const _el$ = _tmpl$4();
1492
1435
  spread(_el$, mergeProps({
1493
1436
  get ["class"]() {
1494
1437
  return `builder-columns ${props.builderBlock.id}-breakpoints ` + css({
@@ -1517,7 +1460,7 @@ function Columns(props) {
1517
1460
  children: (column, _index) => {
1518
1461
  const index = _index();
1519
1462
  return (() => {
1520
- const _el$2 = _tmpl$5();
1463
+ const _el$2 = _tmpl$4();
1521
1464
  spread(_el$2, mergeProps({
1522
1465
  get ["class"]() {
1523
1466
  return "builder-column " + css({
@@ -1558,10 +1501,10 @@ function Columns(props) {
1558
1501
  })();
1559
1502
  }
1560
1503
  var columns_default = Columns;
1561
- var _tmpl$6 = /* @__PURE__ */ template(`<span>`);
1504
+ var _tmpl$5 = /* @__PURE__ */ template(`<span>`);
1562
1505
  function FragmentComponent(props) {
1563
1506
  return (() => {
1564
- const _el$ = _tmpl$6();
1507
+ const _el$ = _tmpl$5();
1565
1508
  insert(_el$, () => props.children);
1566
1509
  return _el$;
1567
1510
  })();
@@ -1616,7 +1559,7 @@ function getSrcSet(url) {
1616
1559
  }
1617
1560
 
1618
1561
  // src/blocks/image/image.tsx
1619
- var _tmpl$7 = /* @__PURE__ */ template(`<source type=image/webp>`);
1562
+ var _tmpl$6 = /* @__PURE__ */ template(`<source type=image/webp>`);
1620
1563
  var _tmpl$22 = /* @__PURE__ */ template(`<picture><img loading=lazy>`);
1621
1564
  var _tmpl$32 = /* @__PURE__ */ template(`<div>`);
1622
1565
  function Image(props) {
@@ -1662,7 +1605,7 @@ function Image(props) {
1662
1605
  return webpSrcSet();
1663
1606
  },
1664
1607
  get children() {
1665
- const _el$2 = _tmpl$7();
1608
+ const _el$2 = _tmpl$6();
1666
1609
  effect(() => setAttribute(_el$2, "srcset", webpSrcSet()));
1667
1610
  return _el$2;
1668
1611
  }
@@ -1744,10 +1687,10 @@ function Image(props) {
1744
1687
  })];
1745
1688
  }
1746
1689
  var image_default = Image;
1747
- var _tmpl$8 = /* @__PURE__ */ template(`<section>`);
1690
+ var _tmpl$7 = /* @__PURE__ */ template(`<section>`);
1748
1691
  function SectionComponent(props) {
1749
1692
  return (() => {
1750
- const _el$ = _tmpl$8();
1693
+ const _el$ = _tmpl$7();
1751
1694
  spread(_el$, mergeProps({}, () => props.attributes, {
1752
1695
  get style() {
1753
1696
  return {
@@ -2241,7 +2184,7 @@ var componentInfo3 = {
2241
2184
  advanced: true
2242
2185
  }]
2243
2186
  };
2244
- var _tmpl$9 = /* @__PURE__ */ template(`<div>`);
2187
+ var _tmpl$8 = /* @__PURE__ */ template(`<div>`);
2245
2188
  function CustomCode(props) {
2246
2189
  const [scriptsInserted, setScriptsInserted] = createSignal([]);
2247
2190
  const [scriptsRun, setScriptsRun] = createSignal([]);
@@ -2269,13 +2212,13 @@ function CustomCode(props) {
2269
2212
  try {
2270
2213
  scriptsRun().push(script.innerText);
2271
2214
  new Function(script.innerText)();
2272
- } catch (error) {
2215
+ } catch (error2) {
2273
2216
  }
2274
2217
  }
2275
2218
  }
2276
2219
  });
2277
2220
  return (() => {
2278
- const _el$ = _tmpl$9();
2221
+ const _el$ = _tmpl$8();
2279
2222
  const _ref$ = elementRef;
2280
2223
  typeof _ref$ === "function" ? use(_ref$, _el$) : elementRef = _el$;
2281
2224
  effect((_p$) => {
@@ -2335,7 +2278,7 @@ var SCRIPT_MIME_TYPES = ["text/javascript", "application/javascript", "applicati
2335
2278
  var isJsScript = (script) => SCRIPT_MIME_TYPES.includes(script.type);
2336
2279
 
2337
2280
  // src/blocks/embed/embed.tsx
2338
- var _tmpl$10 = /* @__PURE__ */ template(`<div class=builder-embed>`);
2281
+ var _tmpl$9 = /* @__PURE__ */ template(`<div class=builder-embed>`);
2339
2282
  function Embed(props) {
2340
2283
  const [scriptsInserted, setScriptsInserted] = createSignal([]);
2341
2284
  const [scriptsRun, setScriptsRun] = createSignal([]);
@@ -2356,7 +2299,7 @@ function Embed(props) {
2356
2299
  try {
2357
2300
  scriptsRun().push(script.innerText);
2358
2301
  new Function(script.innerText)();
2359
- } catch (error) {
2302
+ } catch (error2) {
2360
2303
  }
2361
2304
  }
2362
2305
  }
@@ -2370,7 +2313,7 @@ function Embed(props) {
2370
2313
  }
2371
2314
  createEffect(on(() => [elem, ranInitFn()], onUpdateFn_0));
2372
2315
  return (() => {
2373
- const _el$ = _tmpl$10();
2316
+ const _el$ = _tmpl$9();
2374
2317
  const _ref$ = elem;
2375
2318
  typeof _ref$ === "function" ? use(_ref$, _el$) : elem = _el$;
2376
2319
  effect(() => _el$.innerHTML = props.content);
@@ -2526,10 +2469,10 @@ var componentInfo7 = {
2526
2469
  noWrap: true,
2527
2470
  static: true
2528
2471
  };
2529
- var _tmpl$11 = /* @__PURE__ */ template(`<img>`);
2472
+ var _tmpl$10 = /* @__PURE__ */ template(`<img>`);
2530
2473
  function ImgComponent(props) {
2531
2474
  return (() => {
2532
- const _el$ = _tmpl$11();
2475
+ const _el$ = _tmpl$10();
2533
2476
  spread(_el$, mergeProps({
2534
2477
  get style() {
2535
2478
  return {
@@ -2650,10 +2593,10 @@ var componentInfo10 = {
2650
2593
  textAlign: "center"
2651
2594
  }
2652
2595
  };
2653
- var _tmpl$12 = /* @__PURE__ */ template(`<div class=builder-text>`);
2596
+ var _tmpl$11 = /* @__PURE__ */ template(`<div class=builder-text>`);
2654
2597
  function Text(props) {
2655
2598
  return (() => {
2656
- const _el$ = _tmpl$12();
2599
+ const _el$ = _tmpl$11();
2657
2600
  _el$.style.setProperty("outline", "none");
2658
2601
  effect(() => _el$.innerHTML = props.text?.toString() || "");
2659
2602
  return _el$;
@@ -2744,7 +2687,7 @@ var componentInfo11 = {
2744
2687
  advanced: true
2745
2688
  }]
2746
2689
  };
2747
- var _tmpl$13 = /* @__PURE__ */ template(`<source type=video/mp4>`);
2690
+ var _tmpl$12 = /* @__PURE__ */ template(`<source type=video/mp4>`);
2748
2691
  var _tmpl$23 = /* @__PURE__ */ template(`<div>`);
2749
2692
  var _tmpl$33 = /* @__PURE__ */ template(`<div><video class=builder-video>`);
2750
2693
  function Video(props) {
@@ -2807,7 +2750,7 @@ function Video(props) {
2807
2750
  return !props.lazyLoad;
2808
2751
  },
2809
2752
  get children() {
2810
- const _el$3 = _tmpl$13();
2753
+ const _el$3 = _tmpl$12();
2811
2754
  effect(() => setAttribute(_el$3, "src", props.video));
2812
2755
  return _el$3;
2813
2756
  }
@@ -2966,10 +2909,10 @@ var getUpdateVariantVisibilityScript = ({
2966
2909
  }) => `window.${UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME}(
2967
2910
  "${variationId}", "${contentId}", ${isHydrationTarget}
2968
2911
  )`;
2969
- var _tmpl$14 = /* @__PURE__ */ template(`<script>`);
2912
+ var _tmpl$13 = /* @__PURE__ */ template(`<script>`);
2970
2913
  function InlinedScript(props) {
2971
2914
  return (() => {
2972
- const _el$ = _tmpl$14();
2915
+ const _el$ = _tmpl$13();
2973
2916
  effect((_p$) => {
2974
2917
  const _v$ = props.scriptStr, _v$2 = props.id || "";
2975
2918
  _v$ !== _p$._v$ && (_el$.innerHTML = _p$._v$ = _v$);
@@ -3209,8 +3152,8 @@ async function fetchEntries(options) {
3209
3152
  return null;
3210
3153
  }
3211
3154
  return _processContentResult(options, content);
3212
- } catch (error) {
3213
- logger.error("Error fetching data. ", error);
3155
+ } catch (error2) {
3156
+ logger.error("Error fetching data. ", error2);
3214
3157
  return null;
3215
3158
  }
3216
3159
  }
@@ -3464,7 +3407,7 @@ var getInteractionPropertiesForEvent = (event) => {
3464
3407
  };
3465
3408
 
3466
3409
  // src/constants/sdk-version.ts
3467
- var SDK_VERSION = "0.8.0";
3410
+ var SDK_VERSION = "0.9.0";
3468
3411
 
3469
3412
  // src/functions/register.ts
3470
3413
  var registry = {};
@@ -3554,18 +3497,18 @@ var setupBrowserForEditing = (options = {}) => {
3554
3497
  const id = data.data.id;
3555
3498
  const fn = new Function(text);
3556
3499
  let result;
3557
- let error = null;
3500
+ let error2 = null;
3558
3501
  try {
3559
3502
  result = fn.apply(null, args);
3560
3503
  } catch (err) {
3561
- error = err;
3504
+ error2 = err;
3562
3505
  }
3563
- if (error) {
3506
+ if (error2) {
3564
3507
  window.parent?.postMessage({
3565
3508
  type: "builder.evaluateError",
3566
3509
  data: {
3567
3510
  id,
3568
- error: error.message
3511
+ error: error2.message
3569
3512
  }
3570
3513
  }, "*");
3571
3514
  } else {
@@ -3597,11 +3540,11 @@ var setupBrowserForEditing = (options = {}) => {
3597
3540
  };
3598
3541
 
3599
3542
  // src/components/content/components/enable-editor.tsx
3600
- var _tmpl$15 = /* @__PURE__ */ template(`<div>`);
3601
3543
  function EnableEditor(props) {
3602
3544
  const [forceReRenderCount, setForceReRenderCount] = createSignal(0);
3603
3545
  createSignal(0);
3604
3546
  const [shouldSendResetCookie, setShouldSendResetCookie] = createSignal(false);
3547
+ const [ContentWrapper, setContentWrapper] = createSignal(props.contentWrapper || "div");
3605
3548
  const [httpReqsData, setHttpReqsData] = createSignal({});
3606
3549
  const [clicked, setClicked] = createSignal(false);
3607
3550
  function mergeNewContent(newContent) {
@@ -3833,10 +3776,7 @@ function EnableEditor(props) {
3833
3776
  return props.builderContextSignal.content;
3834
3777
  },
3835
3778
  get children() {
3836
- const _el$ = _tmpl$15();
3837
- const _ref$ = elementRef;
3838
- typeof _ref$ === "function" ? use(_ref$, _el$) : elementRef = _el$;
3839
- spread(_el$, mergeProps({
3779
+ return createComponent(Dynamic, mergeProps({
3840
3780
  get ["class"]() {
3841
3781
  return `variant-${props.content?.testVariationId || props.content?.id}`;
3842
3782
  }
@@ -3844,7 +3784,11 @@ function EnableEditor(props) {
3844
3784
  get key() {
3845
3785
  return forceReRenderCount();
3846
3786
  },
3847
- "onClick": (event) => onClick(event),
3787
+ ref(r$) {
3788
+ const _ref$ = elementRef;
3789
+ typeof _ref$ === "function" ? _ref$(r$) : elementRef = r$;
3790
+ },
3791
+ onClick: (event) => onClick(event),
3848
3792
  get ["builder-content-id"]() {
3849
3793
  return props.builderContextSignal.content?.id;
3850
3794
  },
@@ -3854,9 +3798,14 @@ function EnableEditor(props) {
3854
3798
  }, {}, () => props.showContent ? {} : {
3855
3799
  hidden: true,
3856
3800
  "aria-hidden": true
3857
- }), false, true);
3858
- insert(_el$, () => props.children);
3859
- return _el$;
3801
+ }, () => props.contentWrapperProps, {
3802
+ get component() {
3803
+ return ContentWrapper();
3804
+ },
3805
+ get children() {
3806
+ return props.children;
3807
+ }
3808
+ }));
3860
3809
  }
3861
3810
  });
3862
3811
  }
@@ -4045,7 +3994,9 @@ function ContentComponent(props) {
4045
3994
  ...acc,
4046
3995
  [info.name]: serializeComponentInfo(info)
4047
3996
  }), {}),
4048
- inheritedStyles: {}
3997
+ inheritedStyles: {},
3998
+ BlocksWrapper: props.blocksWrapper || "div",
3999
+ BlocksWrapperProps: props.blocksWrapperProps || {}
4049
4000
  });
4050
4001
  function contentSetState(newRootState) {
4051
4002
  setBuilderContextSignal((PREVIOUS_VALUE) => ({
@@ -4090,6 +4041,12 @@ function ContentComponent(props) {
4090
4041
  },
4091
4042
  get builderContextSignal() {
4092
4043
  return builderContextSignal();
4044
+ },
4045
+ get contentWrapper() {
4046
+ return props.contentWrapper;
4047
+ },
4048
+ get contentWrapperProps() {
4049
+ return props.contentWrapperProps;
4093
4050
  }
4094
4051
  }, {
4095
4052
  setBuilderContextSignal
@@ -4237,6 +4194,18 @@ function ContentVariants(props) {
4237
4194
  },
4238
4195
  get isSsrAbTest() {
4239
4196
  return shouldRenderVariants();
4197
+ },
4198
+ get blocksWrapper() {
4199
+ return props.blocksWrapper;
4200
+ },
4201
+ get blocksWrapperProps() {
4202
+ return props.blocksWrapperProps;
4203
+ },
4204
+ get contentWrapper() {
4205
+ return props.contentWrapper;
4206
+ },
4207
+ get contentWrapperProps() {
4208
+ return props.contentWrapperProps;
4240
4209
  }
4241
4210
  });
4242
4211
  }
@@ -4279,6 +4248,18 @@ function ContentVariants(props) {
4279
4248
  },
4280
4249
  get isSsrAbTest() {
4281
4250
  return shouldRenderVariants();
4251
+ },
4252
+ get blocksWrapper() {
4253
+ return props.blocksWrapper;
4254
+ },
4255
+ get blocksWrapperProps() {
4256
+ return props.blocksWrapperProps;
4257
+ },
4258
+ get contentWrapper() {
4259
+ return props.contentWrapper;
4260
+ },
4261
+ get contentWrapperProps() {
4262
+ return props.contentWrapperProps;
4282
4263
  }
4283
4264
  }))];
4284
4265
  }
@@ -4309,7 +4290,7 @@ var fetchSymbolContent = async ({
4309
4290
  };
4310
4291
 
4311
4292
  // src/blocks/symbol/symbol.tsx
4312
- var _tmpl$16 = /* @__PURE__ */ template(`<div>`);
4293
+ var _tmpl$14 = /* @__PURE__ */ template(`<div>`);
4313
4294
  function Symbol(props) {
4314
4295
  const [contentToUse, setContentToUse] = createSignal(props.symbol?.content);
4315
4296
  function className() {
@@ -4335,7 +4316,7 @@ function Symbol(props) {
4335
4316
  }
4336
4317
  createEffect(on(() => [props.symbol], onUpdateFn_0));
4337
4318
  return (() => {
4338
- const _el$ = _tmpl$16();
4319
+ const _el$ = _tmpl$14();
4339
4320
  spread(_el$, mergeProps({
4340
4321
  get ["class"]() {
4341
4322
  return className();