@builder.io/mitosis 0.0.56-98 → 0.0.57

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 (259) hide show
  1. package/dist/src/__tests__/data/blocks/content-slot-jsx.raw.jsx +4 -1
  2. package/dist/src/__tests__/data/blocks/form.raw.jsx +5 -5
  3. package/dist/src/__tests__/data/blocks/onUpdateWithDeps.raw.d.ts +5 -1
  4. package/dist/src/__tests__/data/blocks/onUpdateWithDeps.raw.jsx +3 -3
  5. package/dist/src/__tests__/data/jsx-json.spec.d.ts +2 -0
  6. package/dist/src/__tests__/data/jsx-json.spec.js +10226 -0
  7. package/dist/src/__tests__/shared.d.ts +7 -2
  8. package/dist/src/__tests__/shared.js +66 -9
  9. package/dist/src/constants/method-literal-prefix.d.ts +0 -1
  10. package/dist/src/constants/method-literal-prefix.js +0 -3
  11. package/dist/src/generators/angular.d.ts +2 -2
  12. package/dist/src/generators/angular.js +5 -3
  13. package/dist/src/generators/builder.d.ts +4 -11
  14. package/dist/src/generators/builder.js +3 -2
  15. package/dist/src/generators/context/svelte.d.ts +3 -0
  16. package/dist/src/generators/context/svelte.js +3 -0
  17. package/dist/src/generators/helpers/functions.d.ts +2 -0
  18. package/dist/src/generators/helpers/functions.js +28 -0
  19. package/dist/src/generators/html.d.ts +3 -3
  20. package/dist/src/generators/html.js +9 -7
  21. package/dist/src/generators/liquid.d.ts +2 -2
  22. package/dist/src/generators/liquid.js +4 -4
  23. package/dist/src/generators/lit/generate.d.ts +2 -2
  24. package/dist/src/generators/lit/generate.js +14 -6
  25. package/dist/src/generators/marko/generate.d.ts +2 -2
  26. package/dist/src/generators/marko/generate.js +10 -8
  27. package/dist/src/generators/mitosis.d.ts +3 -4
  28. package/dist/src/generators/mitosis.js +3 -2
  29. package/dist/src/generators/qwik/component-generator.d.ts +2 -2
  30. package/dist/src/generators/qwik/component-generator.js +49 -55
  31. package/dist/src/generators/qwik/component.d.ts +0 -1
  32. package/dist/src/generators/qwik/component.js +22 -19
  33. package/dist/src/generators/qwik/directives.d.ts +1 -0
  34. package/dist/src/generators/qwik/directives.js +11 -14
  35. package/dist/src/generators/qwik/jsx.d.ts +1 -1
  36. package/dist/src/generators/qwik/jsx.js +9 -5
  37. package/dist/src/generators/qwik/src-generator.js +9 -3
  38. package/dist/src/generators/qwik/stable-serialize.d.ts +6 -0
  39. package/dist/src/generators/qwik/stable-serialize.js +51 -0
  40. package/dist/src/generators/react/generator.d.ts +6 -0
  41. package/dist/src/generators/{react.js → react/generator.js} +58 -150
  42. package/dist/src/generators/react/helpers.d.ts +2 -0
  43. package/dist/src/generators/react/helpers.js +14 -0
  44. package/dist/src/generators/react/index.d.ts +2 -0
  45. package/dist/src/generators/react/index.js +18 -0
  46. package/dist/src/generators/react/state.d.ts +9 -0
  47. package/dist/src/generators/react/state.js +107 -0
  48. package/dist/src/generators/react/types.d.ts +10 -0
  49. package/dist/src/{types/string-map.js → generators/react/types.js} +0 -0
  50. package/dist/src/generators/react-native.d.ts +2 -2
  51. package/dist/src/generators/solid/index.d.ts +3 -0
  52. package/dist/src/generators/{solid.js → solid/index.js} +80 -40
  53. package/dist/src/generators/solid/state.d.ts +19 -0
  54. package/dist/src/generators/solid/state.js +144 -0
  55. package/dist/src/generators/solid/types.d.ts +6 -0
  56. package/dist/src/generators/solid/types.js +2 -0
  57. package/dist/src/generators/stencil/generate.d.ts +2 -2
  58. package/dist/src/generators/stencil/generate.js +5 -2
  59. package/dist/src/generators/svelte.d.ts +6 -7
  60. package/dist/src/generators/svelte.js +43 -40
  61. package/dist/src/generators/swift-ui.d.ts +3 -5
  62. package/dist/src/generators/swift-ui.js +3 -2
  63. package/dist/src/generators/template.d.ts +2 -2
  64. package/dist/src/generators/template.js +3 -2
  65. package/dist/src/generators/vue.d.ts +5 -3
  66. package/dist/src/generators/vue.js +256 -113
  67. package/dist/src/helpers/babel-transform.d.ts +3 -1
  68. package/dist/src/helpers/babel-transform.js +52 -56
  69. package/dist/src/helpers/get-bindings.js +3 -5
  70. package/dist/src/helpers/get-props.js +14 -1
  71. package/dist/src/helpers/get-state-object-string.js +24 -21
  72. package/dist/src/helpers/getters-to-functions.js +1 -11
  73. package/dist/src/helpers/map-refs.js +25 -25
  74. package/dist/src/helpers/nodes/for.d.ts +4 -0
  75. package/dist/src/helpers/nodes/for.js +13 -0
  76. package/dist/src/helpers/nullable.d.ts +2 -0
  77. package/dist/src/helpers/nullable.js +7 -0
  78. package/dist/src/helpers/patterns.d.ts +2 -0
  79. package/dist/src/helpers/patterns.js +5 -1
  80. package/dist/src/helpers/render-imports.js +3 -3
  81. package/dist/src/helpers/replace-identifiers.d.ts +5 -0
  82. package/dist/src/helpers/{replace-idenifiers.js → replace-identifiers.js} +2 -1
  83. package/dist/src/helpers/slots.d.ts +2 -0
  84. package/dist/src/helpers/slots.js +15 -1
  85. package/dist/src/helpers/state.d.ts +0 -2
  86. package/dist/src/helpers/state.js +1 -10
  87. package/dist/src/helpers/strip-state-and-props-refs.d.ts +1 -1
  88. package/dist/src/helpers/strip-state-and-props-refs.js +43 -31
  89. package/dist/src/helpers/styles/helpers.d.ts +1 -0
  90. package/dist/src/index.d.ts +0 -2
  91. package/dist/src/index.js +0 -2
  92. package/dist/src/parsers/angular.js +2 -2
  93. package/dist/src/parsers/builder.d.ts +2 -2
  94. package/dist/src/parsers/builder.js +61 -43
  95. package/dist/src/parsers/constants/outdated-prefixes.d.ts +10 -0
  96. package/dist/src/parsers/constants/outdated-prefixes.js +13 -0
  97. package/dist/src/parsers/context.js +2 -2
  98. package/dist/src/parsers/helpers/state.d.ts +3 -0
  99. package/dist/src/parsers/helpers/state.js +30 -0
  100. package/dist/src/parsers/jsx/component-types.d.ts +1 -1
  101. package/dist/src/parsers/jsx/component-types.js +15 -2
  102. package/dist/src/parsers/jsx/context.js +1 -1
  103. package/dist/src/parsers/jsx/element-parser.d.ts +6 -0
  104. package/dist/src/parsers/jsx/element-parser.js +243 -0
  105. package/dist/src/parsers/jsx/exports.d.ts +3 -0
  106. package/dist/src/parsers/jsx/exports.js +78 -0
  107. package/dist/src/parsers/jsx/function-parser.d.ts +7 -0
  108. package/dist/src/parsers/jsx/function-parser.js +291 -0
  109. package/dist/src/parsers/jsx/helpers.d.ts +2 -0
  110. package/dist/src/parsers/jsx/helpers.js +30 -1
  111. package/dist/src/parsers/jsx/imports.d.ts +7 -0
  112. package/dist/src/parsers/jsx/imports.js +65 -0
  113. package/dist/src/parsers/jsx/index.d.ts +1 -1
  114. package/dist/src/parsers/jsx/index.js +1 -2
  115. package/dist/src/parsers/jsx/jsx.js +29 -516
  116. package/dist/src/parsers/jsx/state.d.ts +2 -3
  117. package/dist/src/parsers/jsx/state.js +15 -22
  118. package/dist/src/plugins/compile-away-builder-components.js +6 -0
  119. package/dist/src/symbols/symbol-processor.js +3 -0
  120. package/dist/src/targets.d.ts +21 -28
  121. package/dist/src/targets.js +2 -2
  122. package/dist/src/types/config.d.ts +11 -1
  123. package/dist/src/types/mitosis-component.d.ts +12 -6
  124. package/dist/src/types/mitosis-component.js +11 -0
  125. package/dist/src/types/mitosis-context.d.ts +2 -2
  126. package/dist/src/types/mitosis-node.d.ts +14 -5
  127. package/dist/src/types/mitosis-node.js +3 -0
  128. package/dist/src/types/transpiler.d.ts +6 -1
  129. package/dist/tsconfig.build.tsbuildinfo +1 -1
  130. package/package.json +9 -9
  131. package/dist/src/__tests__/angular.test.d.ts +0 -1
  132. package/dist/src/__tests__/angular.test.js +0 -10
  133. package/dist/src/__tests__/builder.test.d.ts +0 -1
  134. package/dist/src/__tests__/builder.test.js +0 -235
  135. package/dist/src/__tests__/context.test.d.ts +0 -1
  136. package/dist/src/__tests__/context.test.js +0 -35
  137. package/dist/src/__tests__/data/blocks/builder-render-block.raw.d.ts +0 -6
  138. package/dist/src/__tests__/data/blocks/builder-render-block.raw.jsx +0 -90
  139. package/dist/src/__tests__/data/blocks/builder-render-content.raw.d.ts +0 -10
  140. package/dist/src/__tests__/data/blocks/builder-render-content.raw.jsx +0 -69
  141. package/dist/src/__tests__/hash-code.test.d.ts +0 -1
  142. package/dist/src/__tests__/hash-code.test.js +0 -11
  143. package/dist/src/__tests__/html.test.d.ts +0 -1
  144. package/dist/src/__tests__/html.test.js +0 -7
  145. package/dist/src/__tests__/liquid.test.d.ts +0 -1
  146. package/dist/src/__tests__/liquid.test.js +0 -7
  147. package/dist/src/__tests__/lit.test.d.ts +0 -1
  148. package/dist/src/__tests__/lit.test.js +0 -7
  149. package/dist/src/__tests__/marko.test.d.ts +0 -1
  150. package/dist/src/__tests__/marko.test.js +0 -14
  151. package/dist/src/__tests__/parse-jsx.test.d.ts +0 -1
  152. package/dist/src/__tests__/parse-jsx.test.js +0 -37
  153. package/dist/src/__tests__/qwik/convert-method-to-function.test.d.ts +0 -1
  154. package/dist/src/__tests__/qwik/convert-method-to-function.test.js +0 -37
  155. package/dist/src/__tests__/qwik/src-generator.test.d.ts +0 -1
  156. package/dist/src/__tests__/qwik/src-generator.test.js +0 -65
  157. package/dist/src/__tests__/qwik.directive.test.d.ts +0 -1
  158. package/dist/src/__tests__/qwik.directive.test.js +0 -108
  159. package/dist/src/__tests__/qwik.test.d.ts +0 -1
  160. package/dist/src/__tests__/qwik.test.js +0 -465
  161. package/dist/src/__tests__/react-native.test.d.ts +0 -1
  162. package/dist/src/__tests__/react-native.test.js +0 -7
  163. package/dist/src/__tests__/react.test.d.ts +0 -1
  164. package/dist/src/__tests__/react.test.js +0 -20
  165. package/dist/src/__tests__/solid.test.d.ts +0 -1
  166. package/dist/src/__tests__/solid.test.js +0 -10
  167. package/dist/src/__tests__/stencil.test.d.ts +0 -1
  168. package/dist/src/__tests__/stencil.test.js +0 -7
  169. package/dist/src/__tests__/styles.test.d.ts +0 -1
  170. package/dist/src/__tests__/styles.test.js +0 -23
  171. package/dist/src/__tests__/svelte.test.d.ts +0 -1
  172. package/dist/src/__tests__/svelte.test.js +0 -7
  173. package/dist/src/__tests__/vue.test.d.ts +0 -1
  174. package/dist/src/__tests__/vue.test.js +0 -7
  175. package/dist/src/__tests__/webcomponent.test.d.ts +0 -1
  176. package/dist/src/__tests__/webcomponent.test.js +0 -15
  177. package/dist/src/constants/function-literal-prefix.d.ts +0 -1
  178. package/dist/src/constants/function-literal-prefix.js +0 -4
  179. package/dist/src/generators/qwik/convertMethodToFunction.d.ts +0 -1
  180. package/dist/src/generators/qwik/convertMethodToFunction.js +0 -161
  181. package/dist/src/generators/react.d.ts +0 -14
  182. package/dist/src/generators/solid.d.ts +0 -5
  183. package/dist/src/helpers/babel-transform.test.d.ts +0 -1
  184. package/dist/src/helpers/babel-transform.test.js +0 -7
  185. package/dist/src/helpers/generic-format.test.d.ts +0 -1
  186. package/dist/src/helpers/generic-format.test.js +0 -8
  187. package/dist/src/helpers/map-to-attributes.d.ts +0 -2
  188. package/dist/src/helpers/map-to-attributes.js +0 -19
  189. package/dist/src/helpers/map-to-css.d.ts +0 -2
  190. package/dist/src/helpers/map-to-css.js +0 -16
  191. package/dist/src/helpers/parse-reactive-script.d.ts +0 -7
  192. package/dist/src/helpers/parse-reactive-script.js +0 -87
  193. package/dist/src/helpers/remove-surrounding-block.test.d.ts +0 -1
  194. package/dist/src/helpers/remove-surrounding-block.test.js +0 -9
  195. package/dist/src/helpers/render-imports.test.d.ts +0 -1
  196. package/dist/src/helpers/render-imports.test.js +0 -33
  197. package/dist/src/helpers/replace-idenifiers.d.ts +0 -1
  198. package/dist/src/helpers/styles/collect-css.test.d.ts +0 -1
  199. package/dist/src/helpers/styles/collect-css.test.js +0 -18
  200. package/dist/src/parsers/html.d.ts +0 -0
  201. package/dist/src/parsers/html.js +0 -2
  202. package/dist/src/parsers/liquid.d.ts +0 -70
  203. package/dist/src/parsers/liquid.js +0 -2538
  204. package/dist/src/types/string-map.d.ts +0 -3
  205. package/dist/test/qwik/Accordion/high.jsx +0 -0
  206. package/dist/test/qwik/Accordion/low.jsx +0 -240
  207. package/dist/test/qwik/Accordion/med.jsx +0 -4
  208. package/dist/test/qwik/For/high.jsx +0 -0
  209. package/dist/test/qwik/For/low.jsx +0 -52
  210. package/dist/test/qwik/For/med.jsx +0 -4
  211. package/dist/test/qwik/Image/high.js +0 -9
  212. package/dist/test/qwik/Image/low.js +0 -0
  213. package/dist/test/qwik/Image/med.js +0 -155
  214. package/dist/test/qwik/Image.slow/high.js +0 -9
  215. package/dist/test/qwik/Image.slow/low.js +0 -0
  216. package/dist/test/qwik/Image.slow/med.js +0 -155
  217. package/dist/test/qwik/bindings/high.cjs +0 -0
  218. package/dist/test/qwik/bindings/low.cjs +0 -45
  219. package/dist/test/qwik/bindings/med.cjs +0 -3
  220. package/dist/test/qwik/button/high.js +0 -3
  221. package/dist/test/qwik/button/low.js +0 -25
  222. package/dist/test/qwik/button/med.js +0 -31
  223. package/dist/test/qwik/component/bindings/high.jsx +0 -0
  224. package/dist/test/qwik/component/bindings/low.jsx +0 -104
  225. package/dist/test/qwik/component/bindings/med.jsx +0 -7
  226. package/dist/test/qwik/component/component/inputs/high.cjsx +0 -9
  227. package/dist/test/qwik/component/component/inputs/low.cjsx +0 -0
  228. package/dist/test/qwik/component/component/inputs/med.cjsx +0 -68
  229. package/dist/test/qwik/for-loop.bindings/high.cjs +0 -0
  230. package/dist/test/qwik/for-loop.bindings/low.cjs +0 -56
  231. package/dist/test/qwik/for-loop.bindings/med.cjs +0 -5
  232. package/dist/test/qwik/hello_world/stylesheet/high.jsx +0 -0
  233. package/dist/test/qwik/hello_world/stylesheet/low.jsx +0 -26
  234. package/dist/test/qwik/hello_world/stylesheet/med.jsx +0 -4
  235. package/dist/test/qwik/mount/high.cjs +0 -0
  236. package/dist/test/qwik/mount/low.cjs +0 -47
  237. package/dist/test/qwik/mount/med.cjs +0 -3
  238. package/dist/test/qwik/page-with-symbol/high.js +0 -0
  239. package/dist/test/qwik/page-with-symbol/low.js +0 -33
  240. package/dist/test/qwik/page-with-symbol/med.js +0 -4
  241. package/dist/test/qwik/show-hide/high.jsx +0 -9
  242. package/dist/test/qwik/show-hide/low.jsx +0 -0
  243. package/dist/test/qwik/show-hide/med.jsx +0 -181
  244. package/dist/test/qwik/svg/high.js +0 -0
  245. package/dist/test/qwik/svg/low.js +0 -30
  246. package/dist/test/qwik/svg/med.js +0 -4
  247. package/dist/test/qwik/todo/Todo.cjs/high.cjs +0 -19
  248. package/dist/test/qwik/todo/Todo.cjs/low.cjs +0 -0
  249. package/dist/test/qwik/todo/Todo.cjs/med.cjs +0 -51
  250. package/dist/test/qwik/todo/Todo.js/high.js +0 -19
  251. package/dist/test/qwik/todo/Todo.js/low.js +0 -0
  252. package/dist/test/qwik/todo/Todo.js/med.js +0 -47
  253. package/dist/test/qwik/todo/Todo.tsx/high.tsx +0 -19
  254. package/dist/test/qwik/todo/Todo.tsx/low.tsx +0 -0
  255. package/dist/test/qwik/todo/Todo.tsx/med.tsx +0 -43
  256. package/dist/test/qwik/todos/Todo.tsx/high.tsx +0 -7
  257. package/dist/test/qwik/todos/Todo.tsx/low.tsx +0 -32
  258. package/dist/test/qwik/todos/Todo.tsx/med.tsx +0 -4
  259. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,2538 +0,0 @@
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 __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- var desc = Object.getOwnPropertyDescriptor(m, k);
16
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
- desc = { enumerable: true, get: function() { return m[k]; } };
18
- }
19
- Object.defineProperty(o, k2, desc);
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || function (mod) {
30
- if (mod && mod.__esModule) return mod;
31
- var result = {};
32
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
- __setModuleDefault(result, mod);
34
- return result;
35
- };
36
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
- return new (P || (P = Promise))(function (resolve, reject) {
39
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
- step((generator = generator.apply(thisArg, _arguments || [])).next());
43
- });
44
- };
45
- var __generator = (this && this.__generator) || function (thisArg, body) {
46
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
- function verb(n) { return function (v) { return step([n, v]); }; }
49
- function step(op) {
50
- if (f) throw new TypeError("Generator is already executing.");
51
- while (_) try {
52
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
- if (y = 0, t) op = [op[0] & 2, t.value];
54
- switch (op[0]) {
55
- case 0: case 1: t = op; break;
56
- case 4: _.label++; return { value: op[1], done: false };
57
- case 5: _.label++; y = op[1]; op = [0]; continue;
58
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
- default:
60
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
- if (t[2]) _.ops.pop();
65
- _.trys.pop(); continue;
66
- }
67
- op = body.call(thisArg, _);
68
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
- }
71
- };
72
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
73
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
74
- if (ar || !(i in from)) {
75
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
76
- ar[i] = from[i];
77
- }
78
- }
79
- return to.concat(ar || Array.prototype.slice.call(from));
80
- };
81
- var __importDefault = (this && this.__importDefault) || function (mod) {
82
- return (mod && mod.__esModule) ? mod : { "default": mod };
83
- };
84
- Object.defineProperty(exports, "__esModule", { value: true });
85
- exports.bindingsFromAttrs = exports.htmlToBuilder = exports.liquidToBuilder = exports.preprocessLiquid = exports.tryFormat = exports.htmlDebugString = exports.processedAstToBuilder = exports.htmlAstToBuilder = exports.postProcessBuilderTree = exports.postProcessHtmlAstNodes = exports.separateTagsAndText = exports.htmlToAst = exports.liquidToAst = exports.htmlNodeToBuilder = exports.parsedLiquidToHtml = exports.humanCase = exports.blockToLiquid = exports.getLiquidConditionExpresion = void 0;
86
- var axios_1 = __importDefault(require("axios"));
87
- var liquidjs_1 = require("liquidjs");
88
- var lodash_1 = require("lodash");
89
- var object_hash_1 = __importDefault(require("object-hash"));
90
- var htmlParser = __importStar(require("prettier/parser-html"));
91
- var standalone_1 = require("prettier/standalone");
92
- var traverse_1 = __importDefault(require("traverse"));
93
- var compiler = __importStar(require("vue-template-compiler"));
94
- var fast_clone_1 = require("../helpers/fast-clone");
95
- var liquid_1 = require("../generators/liquid");
96
- var map_to_attributes_1 = require("../helpers/map-to-attributes");
97
- var map_to_css_1 = require("../helpers/map-to-css");
98
- var __1 = require("..");
99
- var voidElements = new Set([
100
- 'area',
101
- 'base',
102
- 'br',
103
- 'col',
104
- 'embed',
105
- 'hr',
106
- 'img',
107
- 'input',
108
- 'link',
109
- 'meta',
110
- 'param',
111
- 'source',
112
- 'track',
113
- 'wbr',
114
- ]);
115
- var sizeNames = ['xsmall', 'small', 'medium', 'large'];
116
- var sizes = {
117
- xsmall: {
118
- min: 0,
119
- default: 0,
120
- max: 0,
121
- },
122
- small: {
123
- min: 320,
124
- default: 321,
125
- max: 640,
126
- },
127
- medium: {
128
- min: 641,
129
- default: 642,
130
- max: 991,
131
- },
132
- large: {
133
- min: 990,
134
- default: 991,
135
- max: 1200,
136
- },
137
- getWidthForSize: function (size) {
138
- return this[size].default;
139
- },
140
- getSizeForWidth: function (width) {
141
- for (var _i = 0, sizeNames_1 = sizeNames; _i < sizeNames_1.length; _i++) {
142
- var size_1 = sizeNames_1[_i];
143
- var value = this[size_1];
144
- if (width <= value.max) {
145
- return size_1;
146
- }
147
- }
148
- return 'large';
149
- },
150
- };
151
- var isLiquidRender = function (binding) {
152
- return binding.replace(/\s/g, '').match('.liquid.render');
153
- };
154
- var isLiquidConditional = function (binding) {
155
- return binding.replace(/\s/g, '').match('.liquid.condition');
156
- };
157
- var getConditionalAttr = function (value, noEnd) {
158
- if (noEnd === void 0) { noEnd = false; }
159
- var closingTag = noEnd ? '' : '{% endif %}';
160
- return (value
161
- .split('/*start*/')
162
- .reverse()
163
- .filter(function (st) { return st.includes('liquid'); })
164
- .map(function (statement) { return statement.replace(/`/g, '"'); })
165
- .map(function (statement) {
166
- var _a;
167
- var expression = statement.startsWith('!')
168
- ? 'else'
169
- : !statement.includes('!')
170
- ? 'if'
171
- : '';
172
- var condition = expression === 'if'
173
- ? (_a = statement.match(/context\.(shopify\.)?liquid\.condition\("([^"]*)"/)) === null || _a === void 0 ? void 0 : _a[2]
174
- : '';
175
- var index = statement.indexOf('&&');
176
- var branchValue = index > -1 ? getConditionalAttr(statement.substr(index + 2), true) : getValue(statement);
177
- if (expression) {
178
- return "{% ".concat(expression, " ").concat(condition, " %} ").concat(branchValue);
179
- }
180
- return branchValue + '{% endif %}';
181
- })
182
- .join('') + closingTag);
183
- };
184
- var removeShopifyContext = function (str) {
185
- var usesSingleQuotes = Boolean(str.match(/\.\s*(get|render)\('/));
186
- if (usesSingleQuotes) {
187
- return str.replace(/(context|state)\s*\.\s*(shopify\s*\.)?\s*liquid\s*\.\s*(get|render)\s*\(\s*(\\'|')([^']+)(\\'|')\s*.*\)/g, '$5');
188
- }
189
- return str.replace(/(context|state)\s*\.\s*(shopify\s*\.)?\s*liquid\s*\.\s*(get|render)\s*\(\s*(\\"|")([^"]+)(\\"|")\s*.*\)/g, '$5');
190
- };
191
- var getValue = function (condition) {
192
- var _a;
193
- var value = (_a = condition.match(/\? (.*) :/)) === null || _a === void 0 ? void 0 : _a[1];
194
- if (value) {
195
- return removeShopifyContext(value.replace(/{{'(.*?)'}}/g, '$1').replace(/'/g, ''));
196
- }
197
- };
198
- /**
199
- * Extract a liquid expression from our JS structure - i.e. transform
200
- * "context.shopify.liquid.condition('some | liquid')" to "some | liquid"
201
- */
202
- var getLiquidConditionExpresion = function (expression) {
203
- var _a;
204
- var matched = (_a = expression.match(/context\s*\.\s*(shopify\s*\.)?\s*liquid\s*\.\s*condition\s*\(\s*['"]([\s\S]*?)['"]\s*,\s*state\s*\)\s*/i)) === null || _a === void 0 ? void 0 : _a[2];
205
- return matched || 'null';
206
- };
207
- exports.getLiquidConditionExpresion = getLiquidConditionExpresion;
208
- // TODO: move most or all of this to transformers and functions
209
- var convertBinding = function (binding, options) {
210
- var value = binding;
211
- var isShopifyContext = value.replace(/\s/g, '').includes('.liquid');
212
- if (!(0, liquid_1.isValidLiquidBinding)(binding)) {
213
- return '';
214
- }
215
- if (isLiquidConditional(value)) {
216
- value = getConditionalAttr(value);
217
- }
218
- else if (isShopifyContext) {
219
- value = removeShopifyContext(value);
220
- }
221
- if (options.looseBindings) {
222
- // We use state, Shopify uses global vars, so convert
223
- // state.product.title to {{ product.title}}, etc
224
- if (value.includes('state.')) {
225
- value = value.replace(/state\./g, '');
226
- }
227
- if (value.includes('context.')) {
228
- value = value.replace(/context\./g, '');
229
- }
230
- }
231
- return value;
232
- };
233
- function blockToLiquid(json, options) {
234
- var _a, _b, _c, _d;
235
- if (options === void 0) { options = {}; }
236
- var block = (0, fast_clone_1.fastClone)(json);
237
- var bindings = __assign(__assign({}, block.bindings), (_a = block.code) === null || _a === void 0 ? void 0 : _a.bindings);
238
- var hasInvalidHide = bindings.hide && !(0, liquid_1.isValidLiquidBinding)(bindings.hide);
239
- var hasInvalidShow = bindings.show && !(0, liquid_1.isValidLiquidBinding)(bindings.show);
240
- var hasInvalidRepeat = block.repeat && block.repeat.collection && !(0, liquid_1.isValidLiquidBinding)(block.repeat.collection);
241
- if (hasInvalidHide || hasInvalidShow || hasInvalidRepeat) {
242
- return '';
243
- }
244
- var styles = {};
245
- if (bindings && !options.static) {
246
- for (var key in bindings) {
247
- var binding = bindings[key];
248
- if (!key || !binding || key === 'hide') {
249
- continue;
250
- }
251
- var value = convertBinding(binding, options);
252
- var valueString = void 0;
253
- if (!value) {
254
- valueString = '';
255
- }
256
- else if (isLiquidRender(binding) || isLiquidConditional(binding)) {
257
- valueString = value;
258
- }
259
- else {
260
- valueString = "{{ ".concat(value, " }}");
261
- }
262
- // Preserve default styles for those bound
263
- if (!value && key.startsWith('style')) {
264
- continue;
265
- }
266
- if (key.startsWith('properties.') || !key.includes('.')) {
267
- if (!block.properties) {
268
- block.properties = {};
269
- }
270
- var name_1 = key.startsWith('properties.') ? key.replace(/^\s*properties\s*\./, '') : key;
271
- (0, lodash_1.set)(block.properties, name_1, valueString);
272
- }
273
- else if (key.startsWith('component.options.') || key.startsWith('options.')) {
274
- var name_2 = key.replace(/^.*?options\./, '');
275
- if (!block.component) {
276
- continue;
277
- }
278
- if (!block.component.options) {
279
- block.component.options = {};
280
- }
281
- (0, lodash_1.set)(block.component.options, name_2, valueString);
282
- }
283
- else if (key.startsWith('style.')) {
284
- var name_3 = key.replace('style.', '');
285
- (0, lodash_1.set)(styles, name_3, valueString);
286
- }
287
- else if (key === 'attr.style') {
288
- if (!block.properties) {
289
- block.properties = {};
290
- }
291
- (0, lodash_1.set)(block.properties, 'style', valueString);
292
- }
293
- }
294
- }
295
- // TODO: bindings with {{}} as values
296
- var css = blockCss(block, options);
297
- var stylesList = [];
298
- if ((0, lodash_1.size)(styles)) {
299
- stylesList.push((0, map_to_css_1.mapToCss)(styles, 0));
300
- }
301
- if ((_b = block.properties) === null || _b === void 0 ? void 0 : _b.style) {
302
- stylesList.push(block.properties.style);
303
- }
304
- var bindingClass = ((_c = block.bindings) === null || _c === void 0 ? void 0 : _c.class) && convertBinding(block.bindings.class, options);
305
- var classes = (0, lodash_1.uniq)([
306
- // 'builder-block',
307
- block.id,
308
- block.class,
309
- bindingClass,
310
- (_d = block.properties) === null || _d === void 0 ? void 0 : _d.class,
311
- ]).filter(lodash_1.identity);
312
- var componentInfo = null;
313
- var attributes = (0, map_to_attributes_1.mapToAttributes)(__assign(__assign(__assign({}, block.properties), {
314
- // ['builder-id']: block.id,
315
- class: classes.join(' ') }), ((0, lodash_1.size)(stylesList) && {
316
- style: stylesList.join(';'),
317
- })));
318
- var tag = block.tagName || (block.properties && block.properties.href ? 'a' : 'div');
319
- if (options.openingTagOnly) {
320
- return "<".concat(tag).concat(attributes ? ' ' + attributes : '', ">");
321
- }
322
- if (block.component && !componentInfo) {
323
- console.warn("Could not find component: ".concat(block.component.name));
324
- }
325
- var collectionName = block.repeat && (0, lodash_1.last)((block.repeat.collection || '').trim().split('(')[0].trim().split('.'));
326
- if (collectionName) {
327
- collectionName = convertBinding(collectionName, options);
328
- }
329
- return "\n ".concat(css.trim() ? "<style>".concat(css, "</style>") : '', "\n ").concat(!options.static &&
330
- block.repeat &&
331
- block.repeat.collection &&
332
- (0, liquid_1.isValidLiquidBinding)(block.repeat.collection)
333
- ? "{% for ".concat(block.repeat.itemName || collectionName + '_item', " in ").concat(convertBinding(block.repeat.collection, options), " %}")
334
- : '', "\n ").concat(!options.static && bindings.hide
335
- ? "{% unless ".concat(!(0, liquid_1.isValidLiquidBinding)(bindings.hide) ? 'false' : convertBinding(bindings.hide, options), " %}")
336
- : '', "\n ").concat(!options.static && bindings.show
337
- ? "{% if ".concat(!(0, liquid_1.isValidLiquidBinding)(bindings.show) ? 'false' : convertBinding(bindings.show, options), " %}")
338
- : '', "\n ").concat(!options.static && bindings.hide ? '{% endunless %}' : '', "\n ").concat(!options.static && bindings.show ? '{% endif %}' : '', "\n ").concat(!options.static && block.repeat && block.repeat.collection ? '{% endfor %}' : '', "\n ");
339
- }
340
- exports.blockToLiquid = blockToLiquid;
341
- // TODO: make these core functions and share with react, vue, etc
342
- // TODO: apply style bindings and default animation
343
- function blockCss(block, options) {
344
- if (options === void 0) { options = {}; }
345
- // TODO: handle style bindings
346
- var self = block;
347
- var baseStyles = __assign({}, (self.responsiveStyles && self.responsiveStyles.large));
348
- var css = options.emailMode
349
- ? ''
350
- : ".builder-block.".concat(self.id, " {").concat((0, map_to_css_1.mapToCss)(baseStyles), "}");
351
- var reversedNames = sizeNames.slice().reverse();
352
- if (self.responsiveStyles) {
353
- for (var _i = 0, reversedNames_1 = reversedNames; _i < reversedNames_1.length; _i++) {
354
- var size_2 = reversedNames_1[_i];
355
- if (options.emailMode && size_2 === 'large') {
356
- continue;
357
- }
358
- if (size_2 !== 'large' &&
359
- size_2 !== 'xsmall' &&
360
- self.responsiveStyles[size_2] &&
361
- Object.keys(self.responsiveStyles[size_2]).length) {
362
- // TODO: this will not work as expected for a couple things that are handled specially,
363
- // e.g. width
364
- css += "\n@media only screen and (max-width: ".concat(sizes[size_2].max, "px) { \n").concat(options.emailMode ? '.' : '.builder-block.').concat(self.id + (options.emailMode ? '-subject' : ''), " {").concat((0, map_to_css_1.mapToCss)(self.responsiveStyles[size_2], 4, options.emailMode), " } }");
365
- }
366
- }
367
- }
368
- return css;
369
- }
370
- function humanCase(str) {
371
- return (0, lodash_1.capitalize)((0, lodash_1.kebabCase)(str).replace(/[- ]+/g, ' ').trim());
372
- }
373
- exports.humanCase = humanCase;
374
- var setupCache = require('axios-cache-adapter/dist/cache.node.js').setupCache;
375
- var axiosCache = setupCache({
376
- exclude: { query: false },
377
- });
378
- // Webpack workaround to conditionally require certain external modules
379
- // only on the server and not bundle them on the client
380
- var serverOnlyRequire;
381
- try {
382
- // tslint:disable-next-line:no-eval
383
- serverOnlyRequire = eval('require');
384
- }
385
- catch (err) {
386
- // all good
387
- serverOnlyRequire = (function () { return null; });
388
- }
389
- var http = serverOnlyRequire('http');
390
- var https = serverOnlyRequire('https');
391
- var httpAgent = (http && new http.Agent({ keepAlive: true })) || undefined;
392
- var httpsAgent = (https && new https.Agent({ keepAlive: true })) || undefined;
393
- var serializedBlockTagName = 'builder-serialized-block';
394
- var serializedBlockCloseTag = "</".concat(serializedBlockTagName, ">");
395
- var serializeBlock = function (el, close) {
396
- if (close === void 0) { close = true; }
397
- var str = "<".concat(serializedBlockTagName, " block='").concat(htmlEncode(JSON.stringify(el)), "'>");
398
- if (close) {
399
- str += serializedBlockCloseTag;
400
- }
401
- return str;
402
- };
403
- // returns a new object from soource with a new array for each key (e.g blocks) that has key_order (e.g block_order)
404
- var mapArrays = function (source) {
405
- if (!source) {
406
- return source;
407
- }
408
- var newArrays = Object.keys(source).reduce(function (acc, key) {
409
- var _a;
410
- var orderKey = "".concat(key.slice(0, -1), "_order");
411
- if (source[orderKey]) {
412
- return __assign((_a = {}, _a[key] = source[orderKey].map(function (id) { return source[key][id]; }), _a), acc);
413
- }
414
- return acc;
415
- }, {});
416
- return __assign(__assign({}, source), newArrays);
417
- };
418
- // Create `axios` instance passing the newly created `cache.adapter`
419
- var axios = axios_1.default.create({
420
- httpAgent: httpAgent,
421
- httpsAgent: httpsAgent,
422
- timeout: 30000,
423
- adapter: axiosCache.adapter,
424
- });
425
- var isSerializedBlock = function (str) {
426
- return str.includes("<".concat(serializedBlockTagName));
427
- };
428
- var deserializeBlock = function (str) {
429
- var parts = [];
430
- var attribute = str;
431
- var matches = str.match(/<builder-serialized-block block='([^']*)'/);
432
- while (matches === null || matches === void 0 ? void 0 : matches[1]) {
433
- parts.push(attribute.substring(0, matches.index));
434
- parts.push(blockToLiquid(JSON.parse(htmlDecode(matches[1])), {
435
- componentOnly: true,
436
- }));
437
- attribute = attribute.substring(matches.index + matches[0].length + serializedBlockCloseTag.length + 1);
438
- matches = attribute.match(/<builder-serialized-block block='([^']*)'/);
439
- }
440
- return parts.join('');
441
- };
442
- var stringWithBindingsToLiquid = function (str) {
443
- var separated = (0, exports.separateTagsAndText)(str).map(function (item) { return item.text; });
444
- var liquidStr = '';
445
- var _loop_1 = function (item) {
446
- var tag = parseTag(item);
447
- if (tag && tag.value) {
448
- try {
449
- var parsedValue = JSON.parse(tag.value);
450
- if (parsedValue.fullRaw) {
451
- liquidStr += parsedValue.fullRaw;
452
- }
453
- else {
454
- console.warn('Tag missing fullRaw', tag);
455
- }
456
- }
457
- catch (err) {
458
- console.error('Could not parse tag value', tag, err);
459
- }
460
- }
461
- else if (isSerializedBlock(item)) {
462
- var block = (0, lodash_1.attempt)(function () { return deserializeBlock(item); });
463
- if (!(0, lodash_1.isError)(block)) {
464
- liquidStr += block;
465
- }
466
- else {
467
- console.warn('Error deserializing binding to liquid ', block);
468
- }
469
- }
470
- else {
471
- liquidStr += item;
472
- }
473
- };
474
- for (var _i = 0, separated_1 = separated; _i < separated_1.length; _i++) {
475
- var item = separated_1[_i];
476
- _loop_1(item);
477
- }
478
- return liquidStr;
479
- };
480
- var isSimpleLiquidBinding = function (str) {
481
- if (str === void 0) { str = ''; }
482
- return Boolean(str.match(/^[a-z0-9_\.\s]+$/i));
483
- };
484
- var liquidBindingTemplate = function (str) {
485
- return isSimpleLiquidBinding(str)
486
- ? str
487
- : "liquid.get(\"".concat(str.replace(/\n+/g, ' ').replace(/"/g, '\\"'), "\")");
488
- };
489
- var liquidRenderTemplate = function (str) {
490
- return isSimpleLiquidBinding(str) ? str : "liquid(\"".concat(str.replace(/\n+/g, ' ').replace(/"/g, '\\"'), "\")");
491
- };
492
- var liquidConditionTemplate = function (str) {
493
- return isSimpleLiquidBinding(str) ? str : "liquid(\"".concat(str.replace(/\n+/g, ' ').replace(/"/g, '\\"'), "\")");
494
- };
495
- var isIfTemplate = function (template) {
496
- return template.token.type === 'tag' && template.token.name === 'if';
497
- };
498
- var isUnlessTemplate = function (template) {
499
- return template.token.type === 'tag' && template.token.name === 'unless';
500
- };
501
- var isForTemplate = function (template) {
502
- return template.token.type === 'tag' && template.token.name === 'for';
503
- };
504
- var isBlockTemplate = function (template) {
505
- return template.token.type === 'tag' && template.token.name === 'for';
506
- };
507
- var isHtmlTemplate = function (template) {
508
- return template.token.type === 'html';
509
- };
510
- var isCaseTemplate = function (template) {
511
- return template.token.type === 'tag' && template.token.name === 'case';
512
- };
513
- var isOutputTemplate = function (template) {
514
- return template.token.type === 'output';
515
- };
516
- var isElement = function (node) { return node.type === 1; };
517
- var isTextNode = function (node) {
518
- return node.type === 3 || node.type === 2;
519
- };
520
- // Custom common HTML symbol encoding so not to confuse with actual encoded HTML
521
- var htmlEncode = function (html) { return html.replace(/'/g, '_APOS_').replace(/"/g, '_QUOT_'); };
522
- var htmlDecode = function (html) { return html.replace(/_APOS_/g, "'").replace(/_QUOT_/g, '"'); };
523
- var createHtmlAttribute = function (attribute, attributeValue) {
524
- if (attributeValue === void 0) { attributeValue = null; }
525
- var encodedValue = '';
526
- if (attributeValue) {
527
- encodedValue = "='".concat(htmlEncode(JSON.stringify(attributeValue)), "'");
528
- }
529
- return "[".concat(attribute, "]").concat(encodedValue);
530
- };
531
- var COMMA_TOKEN = '__bldr_comma__';
532
- var parseArgList = function (args) {
533
- return args
534
- // find all the string arguments (wrapped with ' or "), then replace any commas
535
- // this allows us to split the args on "," without worrying about breaking any strings
536
- .replace(/('[^']*'|"[^"]*")/g, function (str) { return str.replace(/,/g, COMMA_TOKEN); })
537
- .split(',')
538
- // now that we the arg list is broken up, we can re-add the escaped commas to each item
539
- .map(function (item) { return item.replace(new RegExp(COMMA_TOKEN, 'g'), ',').trim(); });
540
- };
541
- var errorLinesRe = /\((\d*):(\d*)\)/;
542
- var getErrorInfo = function (message) {
543
- var matched = message.match(errorLinesRe);
544
- return (matched && {
545
- line: matched[1],
546
- col: matched[2],
547
- });
548
- };
549
- var getSubstringTill = function (col, line, str) {
550
- var lines = str.split('\n');
551
- return lines.slice(0, line - 1).join('\n') + lines[line - 1].substring(0, col - 1);
552
- };
553
- var transpileUnlessToIf = function (unlessTemplate) {
554
- var cond = unlessTemplate.impl.cond;
555
- var value = "if ".concat(cond);
556
- var raw = "{% ".concat(value, " %}");
557
- return __assign(__assign({}, unlessTemplate), { impl: {
558
- branches: [
559
- {
560
- negate: true,
561
- cond: cond,
562
- templates: unlessTemplate.impl.templates,
563
- },
564
- ],
565
- elseTemplates: unlessTemplate.impl.elseTemplates,
566
- }, token: __assign(__assign({}, unlessTemplate.token), { raw: raw, value: value }) });
567
- };
568
- var parsedLiquidToHtml = function (templates, options) { return __awaiter(void 0, void 0, void 0, function () {
569
- function processTemplate(template, priorConditions) {
570
- var _a;
571
- if (priorConditions === void 0) { priorConditions = []; }
572
- return __awaiter(this, void 0, void 0, function () {
573
- var psuedoTemplate, currentConditions, isInsideAttribute, index, item, _i, _b, tpl, _c, _d, _e, tpl, _f, firstCond, index, item, condition, _g, _h, tpl, _j, _k, tpl, _l, _m, tpl, _o, _p, tpl, name_4, args, _q, _r, tpl, block, rawExpression, _s, _t, templateToken, _u, _v, rawToken, block, parsedSchema, liquidTagStringPieces, wrappedLiquidTags, _w, _x, _y, matched, path, currentAsset, schemaObject, schemaDefault, defaultSchemaObject_1, rawSchemaObject, sectionSettingsState, _z, _0, _1, name_5, path, directory, keyValsRe, assigns_1, assignString, key, auth, themeId, publicKey, token, currentAsset, value, _2, _3, _4, _5, _6, tpl, args_1, cycleGroup, argList, newHtml, i, _7, _8, _9;
574
- return __generator(this, function (_10) {
575
- switch (_10.label) {
576
- case 0:
577
- if (!isHtmlTemplate(template)) return [3 /*break*/, 1];
578
- html += template.str;
579
- return [3 /*break*/, 84];
580
- case 1:
581
- if (!(isIfTemplate(template) || isUnlessTemplate(template))) return [3 /*break*/, 18];
582
- psuedoTemplate = isIfTemplate(template)
583
- ? template
584
- : transpileUnlessToIf(template);
585
- currentConditions = priorConditions.concat({
586
- expression: psuedoTemplate.token.raw,
587
- negate: isUnlessTemplate(template),
588
- });
589
- isInsideAttribute = new RegExp("<[^>]*".concat(template.token.value)).test(template.token.input);
590
- index = 0;
591
- _10.label = 2;
592
- case 2:
593
- if (!(index < psuedoTemplate.impl.branches.length)) return [3 /*break*/, 10];
594
- item = psuedoTemplate.impl.branches[index];
595
- if (index === 0) {
596
- html += createHtmlAttribute('if', __assign(__assign({ fullRaw: psuedoTemplate.token.raw, cond: item.cond }, (item.negate && { negate: true })), { hash: (0, object_hash_1.default)(currentConditions) }));
597
- }
598
- else {
599
- html += createHtmlAttribute('elsif', {
600
- fullRaw: "{% elsif ".concat(item.cond, " %}"),
601
- cond: item.cond,
602
- hash: (0, object_hash_1.default)(currentConditions),
603
- });
604
- }
605
- if (!isInsideAttribute) return [3 /*break*/, 7];
606
- _i = 0, _b = item.templates;
607
- _10.label = 3;
608
- case 3:
609
- if (!(_i < _b.length)) return [3 /*break*/, 6];
610
- tpl = _b[_i];
611
- return [4 /*yield*/, processTemplate(tpl, currentConditions)];
612
- case 4:
613
- _10.sent();
614
- _10.label = 5;
615
- case 5:
616
- _i++;
617
- return [3 /*break*/, 3];
618
- case 6: return [3 /*break*/, 9];
619
- case 7:
620
- _c = html;
621
- return [4 /*yield*/, processInnerTemplates(item.templates, options, currentConditions)];
622
- case 8:
623
- html = _c + _10.sent();
624
- _10.label = 9;
625
- case 9:
626
- index++;
627
- return [3 /*break*/, 2];
628
- case 10:
629
- if (!(psuedoTemplate.impl.elseTemplates && psuedoTemplate.impl.elseTemplates.length)) return [3 /*break*/, 17];
630
- html += createHtmlAttribute('else', {
631
- fullRaw: '{% else %}',
632
- });
633
- if (!isInsideAttribute) return [3 /*break*/, 15];
634
- _d = 0, _e = psuedoTemplate.impl.elseTemplates;
635
- _10.label = 11;
636
- case 11:
637
- if (!(_d < _e.length)) return [3 /*break*/, 14];
638
- tpl = _e[_d];
639
- return [4 /*yield*/, processTemplate(tpl)];
640
- case 12:
641
- _10.sent();
642
- _10.label = 13;
643
- case 13:
644
- _d++;
645
- return [3 /*break*/, 11];
646
- case 14: return [3 /*break*/, 17];
647
- case 15:
648
- _f = html;
649
- return [4 /*yield*/, processInnerTemplates(psuedoTemplate.impl.elseTemplates, options, priorConditions.concat({
650
- expression: psuedoTemplate.token.raw,
651
- negate: !isUnlessTemplate(template),
652
- }), (0, object_hash_1.default)(currentConditions))];
653
- case 16:
654
- html = _f + _10.sent();
655
- _10.label = 17;
656
- case 17:
657
- html += createHtmlAttribute('endif', {
658
- fullRaw: "{% endif %}",
659
- });
660
- return [3 /*break*/, 84];
661
- case 18:
662
- if (!isCaseTemplate(template)) return [3 /*break*/, 34];
663
- firstCond = '';
664
- index = 0;
665
- _10.label = 19;
666
- case 19:
667
- if (!(index < template.impl.cases.length)) return [3 /*break*/, 29];
668
- item = template.impl.cases[index];
669
- condition = "".concat(template.impl.cond, " == ").concat(item.val);
670
- if (!(index === 0)) return [3 /*break*/, 24];
671
- firstCond = condition;
672
- html += createHtmlAttribute('if', {
673
- fullRaw: "{% if ".concat(condition, " %}"),
674
- cond: condition,
675
- hash: (0, object_hash_1.default)(condition),
676
- });
677
- _g = 0, _h = item.templates;
678
- _10.label = 20;
679
- case 20:
680
- if (!(_g < _h.length)) return [3 /*break*/, 23];
681
- tpl = _h[_g];
682
- return [4 /*yield*/, processTemplate(tpl)];
683
- case 21:
684
- _10.sent();
685
- _10.label = 22;
686
- case 22:
687
- _g++;
688
- return [3 /*break*/, 20];
689
- case 23: return [3 /*break*/, 28];
690
- case 24:
691
- html += createHtmlAttribute('elsif', {
692
- fullRaw: "{% elsif ".concat(condition, " %}"),
693
- cond: condition,
694
- hash: (0, object_hash_1.default)(firstCond),
695
- });
696
- _j = 0, _k = item.templates;
697
- _10.label = 25;
698
- case 25:
699
- if (!(_j < _k.length)) return [3 /*break*/, 28];
700
- tpl = _k[_j];
701
- return [4 /*yield*/, processTemplate(tpl)];
702
- case 26:
703
- _10.sent();
704
- _10.label = 27;
705
- case 27:
706
- _j++;
707
- return [3 /*break*/, 25];
708
- case 28:
709
- index++;
710
- return [3 /*break*/, 19];
711
- case 29:
712
- if (!(template.impl.elseTemplates && template.impl.elseTemplates.length)) return [3 /*break*/, 33];
713
- html += createHtmlAttribute('else', {
714
- fullRaw: '{% else %}',
715
- hash: (0, object_hash_1.default)(firstCond),
716
- });
717
- _l = 0, _m = template.impl.elseTemplates;
718
- _10.label = 30;
719
- case 30:
720
- if (!(_l < _m.length)) return [3 /*break*/, 33];
721
- tpl = _m[_l];
722
- return [4 /*yield*/, processTemplate(tpl)];
723
- case 31:
724
- _10.sent();
725
- _10.label = 32;
726
- case 32:
727
- _l++;
728
- return [3 /*break*/, 30];
729
- case 33:
730
- html += createHtmlAttribute('endif', {
731
- fullRaw: "{% endif %}",
732
- });
733
- return [3 /*break*/, 84];
734
- case 34:
735
- if (!isForTemplate(template)) return [3 /*break*/, 39];
736
- html += createHtmlAttribute('for', __assign(__assign({}, template.impl), { fullRaw: template.token.raw, templates: undefined, elseTemplates: undefined, liquid: undefined }));
737
- _o = 0, _p = template.impl.templates;
738
- _10.label = 35;
739
- case 35:
740
- if (!(_o < _p.length)) return [3 /*break*/, 38];
741
- tpl = _p[_o];
742
- return [4 /*yield*/, processTemplate(tpl)];
743
- case 36:
744
- _10.sent();
745
- _10.label = 37;
746
- case 37:
747
- _o++;
748
- return [3 /*break*/, 35];
749
- case 38:
750
- html += createHtmlAttribute('endfor', {
751
- fullRaw: "{% endfor %}",
752
- });
753
- return [3 /*break*/, 84];
754
- case 39:
755
- if (!isOutputTemplate(template)) return [3 /*break*/, 40];
756
- html += createHtmlAttribute('output', __assign(__assign({}, template.value), { raw: template.token.value, fullRaw: "{{".concat(template.token.value, "}}") }));
757
- return [3 /*break*/, 84];
758
- case 40:
759
- name_4 = template.name || '';
760
- args = template.token.args || '';
761
- if (!(name_4 === 'form')) return [3 /*break*/, 45];
762
- html += createHtmlAttribute('form', __assign(__assign({}, template.impl), { fullRaw: template.token.raw, templates: undefined, elseTemplates: undefined, liquid: undefined }));
763
- _q = 0, _r = template.impl.templates;
764
- _10.label = 41;
765
- case 41:
766
- if (!(_q < _r.length)) return [3 /*break*/, 44];
767
- tpl = _r[_q];
768
- return [4 /*yield*/, processTemplate(tpl)];
769
- case 42:
770
- _10.sent();
771
- _10.label = 43;
772
- case 43:
773
- _q++;
774
- return [3 /*break*/, 41];
775
- case 44:
776
- html += createHtmlAttribute('endform', {
777
- fullRaw: "{% endform %}",
778
- });
779
- return [3 /*break*/, 84];
780
- case 45:
781
- if (!(name_4 === 'assign')) return [3 /*break*/, 46];
782
- block = {
783
- component: {
784
- name: 'Shopify:Assign',
785
- options: {
786
- expression: args || '',
787
- },
788
- },
789
- };
790
- html += serializeBlock(block);
791
- return [3 /*break*/, 84];
792
- case 46:
793
- if (!(name_4 === 'capture')) return [3 /*break*/, 47];
794
- rawExpression = '';
795
- for (_s = 0, _t = template.impl.templates; _s < _t.length; _s++) {
796
- templateToken = _t[_s];
797
- if (templateToken.name === 'raw' && ((_a = templateToken.impl) === null || _a === void 0 ? void 0 : _a.tokens)) {
798
- for (_u = 0, _v = templateToken.impl.tokens; _u < _v.length; _u++) {
799
- rawToken = _v[_u];
800
- rawExpression += rawToken.raw;
801
- }
802
- }
803
- else {
804
- rawExpression += templateToken.token.raw;
805
- }
806
- }
807
- block = {
808
- component: {
809
- name: 'Shopify:Capture',
810
- options: {
811
- variableName: args,
812
- expression: rawExpression.trim(),
813
- },
814
- },
815
- };
816
- html += serializeBlock(block);
817
- return [3 /*break*/, 84];
818
- case 47:
819
- if (!(name_4 === 'schema')) return [3 /*break*/, 48];
820
- parsedSchema = JSON.parse(template.impl.templates[0].token.value.replace(/\\n/g, ''));
821
- html += serializeBlock({
822
- layerName: "Schema",
823
- component: {
824
- name: 'Builder:StateProvider',
825
- options: parsedSchema,
826
- },
827
- });
828
- return [3 /*break*/, 84];
829
- case 48:
830
- if (!(name_4 === 'comment')) return [3 /*break*/, 49];
831
- return [3 /*break*/, 84];
832
- case 49:
833
- if (!(name_4 === 'liquid')) return [3 /*break*/, 53];
834
- liquidTagStringPieces = args
835
- .trim()
836
- .replace(/^liquid/gi, '')
837
- .split('\n');
838
- wrappedLiquidTags = liquidTagStringPieces
839
- .map(function (unwrappedTag) {
840
- var trimmedTag = unwrappedTag.trim();
841
- if (trimmedTag) {
842
- return "{% ".concat(trimmedTag, " %}");
843
- }
844
- return null;
845
- })
846
- .filter(function (liquidTag) { return !!liquidTag; });
847
- _w = html;
848
- _x = exports.parsedLiquidToHtml;
849
- _y = exports.liquidToAst;
850
- return [4 /*yield*/, (0, exports.preprocessLiquid)(wrappedLiquidTags.join(''))];
851
- case 50: return [4 /*yield*/, _y.apply(void 0, [_10.sent(), options])];
852
- case 51: return [4 /*yield*/, _x.apply(void 0, [_10.sent(), options])];
853
- case 52:
854
- html = _w + _10.sent();
855
- return [3 /*break*/, 84];
856
- case 53:
857
- if (!(name_4 === 'javascript')) return [3 /*break*/, 54];
858
- return [3 /*break*/, 84];
859
- case 54:
860
- if (!(name_4 === 'stylesheet')) return [3 /*break*/, 55];
861
- return [3 /*break*/, 84];
862
- case 55:
863
- if (!(name_4 === 'section')) return [3 /*break*/, 66];
864
- matched = args.match(/['"]([^'"]+)['"]/);
865
- path = matched && matched[1];
866
- if (!path) return [3 /*break*/, 64];
867
- return [4 /*yield*/, getShopifyAsset("sections/".concat(path, ".liquid"), options)];
868
- case 56:
869
- currentAsset = _10.sent();
870
- if (!(currentAsset && !(0, lodash_1.isError)(currentAsset) && themeSettings && !(0, lodash_1.isError)(themeSettings))) return [3 /*break*/, 62];
871
- schemaObject = {};
872
- schemaDefault = currentAsset.match(/{%-? schema -?%}([\s\S]*?){%-? endschema -?%}/);
873
- defaultSchemaObject_1 = {};
874
- if (schemaDefault === null || schemaDefault === void 0 ? void 0 : schemaDefault.length) {
875
- try {
876
- rawSchemaObject = JSON.parse(schemaDefault[1].trim());
877
- schemaObject = rawSchemaObject;
878
- rawSchemaObject.settings.forEach(function (setting) {
879
- defaultSchemaObject_1[setting.id] = setting.default;
880
- });
881
- }
882
- catch (e) {
883
- console.error('Failed to parse schema.', e);
884
- }
885
- }
886
- if (!themeSettings.current.sections[path]) {
887
- themeSettings.current.sections[path] = {};
888
- }
889
- sectionSettingsState = Object.assign({}, defaultSchemaObject_1, themeSettings.current.sections[path].settings);
890
- themeSettings.current.sections[path].settings = sectionSettingsState;
891
- if (!(options.importSections === false)) return [3 /*break*/, 57];
892
- html += serializeBlock(__assign(__assign({ layerName: "".concat(humanCase(path.replace('-template', '')), " section"), component: {
893
- name: 'Shopify:SectionRef',
894
- options: {
895
- section: "sections/".concat(path, ".liquid"),
896
- },
897
- } }, ((path === 'product-template' || path === 'product') && {
898
- properties: {
899
- 'data-slot': 'shopify:productPage',
900
- },
901
- })), ((path === 'collection-template' || path === 'collection') && {
902
- properties: {
903
- 'data-slot': 'shopify:collectionPage',
904
- },
905
- })));
906
- return [3 /*break*/, 61];
907
- case 57:
908
- html += serializeBlock({
909
- layerName: "Section: sections/".concat(path, ".liquid"),
910
- meta: {
911
- identifier: 'ShopifySection',
912
- },
913
- component: {
914
- name: 'Shopify:Section',
915
- options: {
916
- template: path,
917
- shopifyMetafields: [
918
- {
919
- path: 'state.section',
920
- as: "_section_".concat((0, lodash_1.snakeCase)(path)),
921
- },
922
- ],
923
- state: {
924
- section: mapArrays(themeSettings.current.sections[path]),
925
- _sourceFile: "sections/".concat(path, ".liquid"),
926
- },
927
- },
928
- },
929
- }, false);
930
- _z = html;
931
- _0 = exports.parsedLiquidToHtml;
932
- _1 = exports.liquidToAst;
933
- return [4 /*yield*/, (0, exports.preprocessLiquid)(currentAsset)];
934
- case 58: return [4 /*yield*/, _1.apply(void 0, [_10.sent(), options])];
935
- case 59: return [4 /*yield*/, _0.apply(void 0, [_10.sent(), options])];
936
- case 60:
937
- html = _z + _10.sent();
938
- html += serializedBlockCloseTag;
939
- _10.label = 61;
940
- case 61: return [3 /*break*/, 63];
941
- case 62:
942
- // maybe should throw and block the importing ?
943
- console.warn('Could not get section', currentAsset, template);
944
- _10.label = 63;
945
- case 63: return [3 /*break*/, 65];
946
- case 64:
947
- console.warn('section with no path ', args);
948
- _10.label = 65;
949
- case 65: return [3 /*break*/, 84];
950
- case 66:
951
- if (!(name_4 === 'include' || name_4 === 'render')) return [3 /*break*/, 74];
952
- name_5 = args.match(/['"]([^'"]+)['"]/);
953
- path = name_5 && name_5[1];
954
- directory = 'snippets';
955
- if (!(options.importSnippets === false)) return [3 /*break*/, 67];
956
- html += serializeBlock({
957
- meta: {
958
- importedSnippet: args,
959
- },
960
- layerName: "".concat(humanCase(path || ''), " block"),
961
- tagName: 'span',
962
- component: {
963
- name: 'Custom Code',
964
- options: {
965
- code: template.token.raw,
966
- replaceNodes: true,
967
- },
968
- },
969
- });
970
- return [3 /*break*/, 73];
971
- case 67:
972
- keyValsRe = /,\s*([^:]+):([^,]+)/g;
973
- assigns_1 = {};
974
- args.replace(keyValsRe, function (match, key, value) {
975
- assigns_1[key] = value;
976
- return '';
977
- });
978
- assignString = '';
979
- for (key in assigns_1) {
980
- if (assigns_1.hasOwnProperty(key)) {
981
- // TODO: use StateProvider for this. With getters?
982
- assignString += "\n{% assign ".concat(key, " = ").concat(assigns_1[key], " %}");
983
- }
984
- }
985
- auth = options.auth, themeId = options.themeId;
986
- if (!(auth && path && themeId)) return [3 /*break*/, 73];
987
- publicKey = auth.publicKey, token = auth.token;
988
- if (!(publicKey && token)) return [3 /*break*/, 73];
989
- html += serializeBlock({
990
- layerName: "Include: ".concat(directory, "/").concat(path, ".liquid"),
991
- component: {
992
- name: 'Builder:StateProvider',
993
- options: {
994
- state: {
995
- _sourceFile: "".concat(directory, "/").concat(path, ".liquid"),
996
- },
997
- },
998
- },
999
- }, false);
1000
- return [4 /*yield*/, getShopifyAsset("".concat(directory, "/").concat(path, ".liquid"), options)];
1001
- case 68:
1002
- currentAsset = _10.sent();
1003
- if (!currentAsset) return [3 /*break*/, 72];
1004
- value = assignString + '\n' + (currentAsset || '');
1005
- _2 = html;
1006
- _3 = exports.parsedLiquidToHtml;
1007
- _4 = exports.liquidToAst;
1008
- return [4 /*yield*/, (0, exports.preprocessLiquid)(value)];
1009
- case 69: return [4 /*yield*/, _4.apply(void 0, [_10.sent(), options])];
1010
- case 70: return [4 /*yield*/, _3.apply(void 0, [_10.sent(), options])];
1011
- case 71:
1012
- html = _2 + _10.sent();
1013
- _10.label = 72;
1014
- case 72:
1015
- html += serializedBlockCloseTag;
1016
- _10.label = 73;
1017
- case 73: return [3 /*break*/, 84];
1018
- case 74:
1019
- if (!(name_4 === 'paginate')) return [3 /*break*/, 79];
1020
- // {% paginate collection.product by section.settings.product_per_page %}
1021
- // ...
1022
- // {% endpaginate %}
1023
- html += createHtmlAttribute('paginate', __assign(__assign({}, template.impl), { fullRaw: template.token.raw, templates: undefined, elseTemplates: undefined, liquid: undefined }));
1024
- _5 = 0, _6 = template.impl.templates;
1025
- _10.label = 75;
1026
- case 75:
1027
- if (!(_5 < _6.length)) return [3 /*break*/, 78];
1028
- tpl = _6[_5];
1029
- return [4 /*yield*/, processTemplate(tpl)];
1030
- case 76:
1031
- _10.sent();
1032
- _10.label = 77;
1033
- case 77:
1034
- _5++;
1035
- return [3 /*break*/, 75];
1036
- case 78:
1037
- html += createHtmlAttribute('endpaginate', {
1038
- fullRaw: "{% endpaginate %}",
1039
- });
1040
- return [3 /*break*/, 84];
1041
- case 79:
1042
- if (!(name_4 === 'cycle')) return [3 /*break*/, 83];
1043
- args_1 = template.token.args;
1044
- cycleGroup = void 0;
1045
- if (args_1.indexOf(':') > -1) {
1046
- cycleGroup = args_1.split(':')[0];
1047
- args_1 = args_1.split(':')[1];
1048
- }
1049
- argList = parseArgList(args_1);
1050
- newHtml = '';
1051
- for (i = 0; i < argList.length; i++) {
1052
- // first, check to make sure the cycle index isn't greating than the forloop
1053
- // then, calculate the check the remainder of current loop index divided by cycle length
1054
- // if it's equal to the current cycle index, display the cycle value
1055
- newHtml += "\n {% assign remainder = forloop.index0| modulo:".concat(argList.length, " %}\n {% if forloop.length >= ").concat(i, " and remainder == ").concat(i, " %}\n {{").concat(argList[i], "}}\n {% endif %}");
1056
- }
1057
- _7 = html;
1058
- _8 = exports.parsedLiquidToHtml;
1059
- _9 = exports.liquidToAst;
1060
- return [4 /*yield*/, (0, exports.preprocessLiquid)(newHtml)];
1061
- case 80: return [4 /*yield*/, _9.apply(void 0, [_10.sent(), options])];
1062
- case 81: return [4 /*yield*/, _8.apply(void 0, [_10.sent(), options])];
1063
- case 82:
1064
- html = _7 + _10.sent();
1065
- return [3 /*break*/, 84];
1066
- case 83:
1067
- // TODO: make generic [liquid]="..." or something else
1068
- console.warn('No match for', name_4, args);
1069
- _10.label = 84;
1070
- case 84: return [2 /*return*/];
1071
- }
1072
- });
1073
- });
1074
- }
1075
- var html, themeAsset, themeSettings, _i, templates_1, item;
1076
- return __generator(this, function (_a) {
1077
- switch (_a.label) {
1078
- case 0:
1079
- html = '';
1080
- return [4 /*yield*/, getShopifyAsset('config/settings_data.json', options)];
1081
- case 1:
1082
- themeAsset = _a.sent();
1083
- themeSettings = typeof themeAsset === 'string' && (0, lodash_1.attempt)(function () { return JSON.parse(themeAsset); });
1084
- _i = 0, templates_1 = templates;
1085
- _a.label = 2;
1086
- case 2:
1087
- if (!(_i < templates_1.length)) return [3 /*break*/, 5];
1088
- item = templates_1[_i];
1089
- return [4 /*yield*/, processTemplate(item)];
1090
- case 3:
1091
- _a.sent();
1092
- _a.label = 4;
1093
- case 4:
1094
- _i++;
1095
- return [3 /*break*/, 2];
1096
- case 5: return [2 /*return*/, html];
1097
- }
1098
- });
1099
- }); };
1100
- exports.parsedLiquidToHtml = parsedLiquidToHtml;
1101
- var flattenExpressions = function (conditionsArray, value) {
1102
- return (conditionsArray.map(function (c) { return (c.negate ? "".concat(c.expression, " {% else %}") : c.expression); }).join(' ') +
1103
- value +
1104
- conditionsArray.map(function () { return "{% endif %}"; }));
1105
- };
1106
- function processInnerTemplates(templates, options, priorConditions, overrideHash) {
1107
- return __awaiter(this, void 0, void 0, function () {
1108
- var selfCloseTags, html, processHtml;
1109
- return __generator(this, function (_a) {
1110
- switch (_a.label) {
1111
- case 0:
1112
- selfCloseTags = new Set([
1113
- 'input',
1114
- 'link',
1115
- 'br',
1116
- 'base',
1117
- 'hr',
1118
- 'meta',
1119
- 'img',
1120
- 'area',
1121
- 'col',
1122
- 'embed',
1123
- 'param',
1124
- 'source',
1125
- 'track',
1126
- 'wbr',
1127
- ]);
1128
- return [4 /*yield*/, (0, exports.parsedLiquidToHtml)(templates, options)];
1129
- case 1:
1130
- html = _a.sent();
1131
- processHtml = function (str) {
1132
- var _a, _b;
1133
- var result = '';
1134
- try {
1135
- // TODO: remove comments from inside str, it breaks things
1136
- var parsedHtml = htmlParser.parsers.html.parse(str, htmlParser.parsers, {});
1137
- for (var _i = 0, _c = parsedHtml.children; _i < _c.length; _i++) {
1138
- var node = _c[_i];
1139
- if (node.type === 'text') {
1140
- result += node.value;
1141
- }
1142
- else if ((0, lodash_1.isNull)(node.endSourceSpan) && !selfCloseTags.has(node.name)) {
1143
- var block = {
1144
- tagName: node.name,
1145
- bindings: {},
1146
- properties: {},
1147
- // not working
1148
- noWrap: true,
1149
- meta: {
1150
- renderIf: flattenExpressions(priorConditions, 'true'),
1151
- psuedoNode: {
1152
- attrsList: (_a = node.attrs) === null || _a === void 0 ? void 0 : _a.map(function (_a) {
1153
- var name = _a.name, value = _a.value;
1154
- return ({
1155
- name: name,
1156
- value: value,
1157
- });
1158
- }),
1159
- attrsMap: node.attrMap,
1160
- name: node.name,
1161
- type: 1,
1162
- },
1163
- },
1164
- component: {
1165
- name: 'TempTag',
1166
- options: {
1167
- name: 'opencondtag',
1168
- tag: node.name,
1169
- hash: overrideHash || (0, object_hash_1.default)(priorConditions),
1170
- },
1171
- },
1172
- };
1173
- result += serializeBlock(block, false);
1174
- var innerStr = str.substring(node.sourceSpan.end.offset);
1175
- if (innerStr.replace('\n', '').trim() !== '') {
1176
- result += processHtml(innerStr);
1177
- }
1178
- result += serializedBlockCloseTag;
1179
- }
1180
- else {
1181
- result += str.substring(node.sourceSpan.start.offset, node.sourceSpan.end.offset);
1182
- }
1183
- }
1184
- }
1185
- catch (error) {
1186
- if (error instanceof Error && error.message.includes('Unexpected closing tag')) {
1187
- // template.str have an unclosed tag, extract all valid text and
1188
- // replace the invlalid endtag with htmlattr
1189
- var _d = getErrorInfo(error.message), col = _d.col, line = _d.line;
1190
- var errorTag = (_b = error.message.match(/Unexpected closing tag "(\s*\S*)"/)) === null || _b === void 0 ? void 0 : _b[1];
1191
- var preErrorTag = getSubstringTill(Number(col), Number(line), str);
1192
- result += preErrorTag;
1193
- result += createHtmlAttribute('endopencondtag', {
1194
- hash: overrideHash || (priorConditions.length > 0 && (0, object_hash_1.default)(priorConditions)),
1195
- });
1196
- // 3 is length of </>
1197
- var leftovers = str.substring(preErrorTag.length + errorTag.length + 4);
1198
- if (leftovers.replace('\n', '').trim() !== '') {
1199
- result += processHtml(leftovers);
1200
- }
1201
- }
1202
- }
1203
- return result;
1204
- };
1205
- return [2 /*return*/, processHtml(html)];
1206
- }
1207
- });
1208
- });
1209
- }
1210
- var el = function (options) {
1211
- return (0, __1.createBuilderElement)(__assign({ meta: __assign({ importedFrom: 'liquid' }, options === null || options === void 0 ? void 0 : options.meta) }, options));
1212
- };
1213
- var tagRe = /\[([a-z]+)\](='([^']+)')?/;
1214
- var tagReAll = /\[([^\]]+)\](='([^']+)')?/g;
1215
- var parseTags = function (tag) {
1216
- var tags = [];
1217
- tag.replace(tagReAll, function (match, p1, _p2, p3) {
1218
- tags.push({
1219
- name: htmlDecode(p1),
1220
- value: htmlDecode(p3 || ''),
1221
- raw: match,
1222
- });
1223
- return '';
1224
- });
1225
- return tags;
1226
- };
1227
- var parseTag = function (tag) {
1228
- if (tag === void 0) { tag = ''; }
1229
- var matched = tag.match(tagRe);
1230
- return (matched && {
1231
- name: htmlDecode(matched[1]),
1232
- value: htmlDecode(matched[3] || ''),
1233
- raw: htmlDecode(matched[0]),
1234
- });
1235
- };
1236
- var hasTag = function (html) { return !!parseTag(html); };
1237
- var htmlNodeToBuilder = function (node, index, parentArray, options) { return __awaiter(void 0, void 0, void 0, function () {
1238
- var _a, element, psuedoNode, parsedBlock, children, err_1, _b, properties, bindings, imgStr, text, parsed, parsedOutput, parsedFor, parsedIf, parsedValue, translation, block;
1239
- var _c, _d, _e;
1240
- var _f, _g;
1241
- return __generator(this, function (_h) {
1242
- switch (_h.label) {
1243
- case 0:
1244
- if (!isElement(node)) return [3 /*break*/, 11];
1245
- if (!(node.tag === 'builder-component')) return [3 /*break*/, 2];
1246
- _a = el;
1247
- _c = {};
1248
- return [4 /*yield*/, (0, exports.htmlAstToBuilder)(node.children, options)];
1249
- case 1: return [2 /*return*/, _a.apply(void 0, [(_c.children = _h.sent(),
1250
- _c)])];
1251
- case 2:
1252
- element = void 0;
1253
- psuedoNode = node;
1254
- if (!(node.tag === serializedBlockTagName)) return [3 /*break*/, 7];
1255
- _h.label = 3;
1256
- case 3:
1257
- _h.trys.push([3, 5, , 6]);
1258
- parsedBlock = JSON.parse(htmlDecode(node.attrsMap.block.replace(/"/g, '\\"')));
1259
- return [4 /*yield*/, (0, exports.htmlAstToBuilder)(node.children, options)];
1260
- case 4:
1261
- children = _h.sent();
1262
- element = el(__assign(__assign({}, parsedBlock), (children.length > 0 && { children: children })));
1263
- if ((_f = parsedBlock.meta) === null || _f === void 0 ? void 0 : _f.psuedoNode) {
1264
- psuedoNode = (_g = parsedBlock.meta) === null || _g === void 0 ? void 0 : _g.psuedoNode;
1265
- (element.properties = {}), (element.bindings = {}), delete parsedBlock.meta.psuedoNode;
1266
- }
1267
- else {
1268
- return [2 /*return*/, element];
1269
- }
1270
- return [3 /*break*/, 6];
1271
- case 5:
1272
- err_1 = _h.sent();
1273
- console.error('Builder serialized block error', err_1, '\n\nin:', htmlDecode(node.attrsMap.block.replace(/"/g, '\\"')));
1274
- return [2 /*return*/, el({
1275
- component: {
1276
- name: 'Text',
1277
- options: {
1278
- text: "Builder serialized block error: ".concat(String(err_1)),
1279
- },
1280
- },
1281
- })];
1282
- case 6: return [3 /*break*/, 9];
1283
- case 7:
1284
- _b = el;
1285
- _d = {
1286
- tagName: node.tag,
1287
- properties: {},
1288
- bindings: {}
1289
- };
1290
- return [4 /*yield*/, (0, exports.htmlAstToBuilder)(node.children, options)];
1291
- case 8:
1292
- element = _b.apply(void 0, [(_d.children = _h.sent(),
1293
- _d)]);
1294
- _h.label = 9;
1295
- case 9:
1296
- properties = element.properties;
1297
- bindings = element.bindings;
1298
- if (psuedoNode.tag === 'img') {
1299
- imgStr = psuedoNode.attrsMap.src || psuedoNode.attrsMap['data-src'];
1300
- if (imgStr && hasTag(imgStr)) {
1301
- imgStr = '';
1302
- }
1303
- element.tagName = '';
1304
- element.component = {
1305
- name: 'Raw:Img',
1306
- options: {
1307
- image: imgStr,
1308
- },
1309
- };
1310
- }
1311
- return [4 /*yield*/, (0, exports.bindingsFromAttrs)(psuedoNode, bindings, properties, options)];
1312
- case 10:
1313
- _h.sent();
1314
- return [2 /*return*/, element];
1315
- case 11:
1316
- if (!isTextNode(node)) return [3 /*break*/, 13];
1317
- text = node.text;
1318
- if (!text.trim()) {
1319
- return [2 /*return*/, null];
1320
- }
1321
- parsed = null;
1322
- if (hasTag(text)) {
1323
- parsed = parseTag(text);
1324
- text = '';
1325
- }
1326
- parsedOutput = parsed && parsed.value && parsed.name === 'output' && JSON.parse(parsed.value);
1327
- parsedFor = parsed && parsed.value && parsed.name === 'for' && JSON.parse(parsed.value);
1328
- parsedIf = parsed && parsed.value && parsed.name === 'if' && JSON.parse(parsed.value);
1329
- parsedValue = parsedOutput;
1330
- return [4 /*yield*/, getTranslation(parsedValue, options)];
1331
- case 12:
1332
- translation = _h.sent();
1333
- if (translation != null) {
1334
- text = translation;
1335
- }
1336
- if (parsed) {
1337
- if ([
1338
- 'if',
1339
- 'elsif',
1340
- 'else',
1341
- 'endif',
1342
- 'endunless',
1343
- 'unless',
1344
- 'for',
1345
- 'endfor',
1346
- 'paginate',
1347
- 'endpaginate',
1348
- 'form',
1349
- 'endform',
1350
- 'endopencondtag',
1351
- ].includes(parsed.name)) {
1352
- return [2 /*return*/, el({
1353
- component: {
1354
- name: 'TempNode',
1355
- options: {
1356
- name: parsed.name,
1357
- value: parsed.value,
1358
- },
1359
- },
1360
- })];
1361
- }
1362
- if (parsed.name !== 'output') {
1363
- console.warn('No handler for', parsed.name);
1364
- }
1365
- }
1366
- block = el({
1367
- // tagName: 'span',
1368
- bindings: __assign({}, (parsedOutput &&
1369
- translation == null && (_e = {},
1370
- _e['component.options.text'] = liquidBindingTemplate(parsedOutput.raw),
1371
- _e))),
1372
- component: {
1373
- name: 'Text',
1374
- options: { text: text },
1375
- },
1376
- });
1377
- return [2 /*return*/, block];
1378
- case 13:
1379
- // TODO: handle comment, etc
1380
- console.warn('node not matched', node);
1381
- return [2 /*return*/, null];
1382
- }
1383
- });
1384
- }); };
1385
- exports.htmlNodeToBuilder = htmlNodeToBuilder;
1386
- var assets = {};
1387
- var getShopifyAsset = function (assetKey, options) { return __awaiter(void 0, void 0, void 0, function () {
1388
- var publicKey, token, themeId, key, shopifyRoot, url;
1389
- return __generator(this, function (_a) {
1390
- switch (_a.label) {
1391
- case 0:
1392
- publicKey = options && options.auth && options.auth.publicKey;
1393
- token = options && options.auth && options.auth.token;
1394
- themeId = options === null || options === void 0 ? void 0 : options.themeId;
1395
- if (!(publicKey && token && themeId)) return [3 /*break*/, 4];
1396
- key = assetKey + themeId + publicKey;
1397
- if (!assets[key]) return [3 /*break*/, 2];
1398
- return [4 /*yield*/, assets[key]];
1399
- case 1: return [2 /*return*/, _a.sent()];
1400
- case 2:
1401
- shopifyRoot = 'https://cdn.builder.io/api/v1/shopify';
1402
- url = "".concat(shopifyRoot, "/themes/").concat(themeId, "/assets.json?asset[key]=").concat(assetKey, "&apiKey=").concat(publicKey);
1403
- if (options.cachebust) {
1404
- url += '&cachebust=true';
1405
- }
1406
- assets[key] = axios
1407
- .get(url, {
1408
- headers: {
1409
- Authorization: "Bearer ".concat(token),
1410
- },
1411
- })
1412
- .then(function (result) { return result.data && result.data.asset && result.data.asset.value; });
1413
- return [4 /*yield*/, assets[key]];
1414
- case 3: return [2 /*return*/, _a.sent()];
1415
- case 4: return [2 /*return*/];
1416
- }
1417
- });
1418
- }); };
1419
- var getTranslation = function (parsedValue, options) {
1420
- if (options === void 0) { options = {}; }
1421
- return __awaiter(void 0, void 0, void 0, function () {
1422
- var filters, initial, translate, asset_1, _a, parsed, translationValue;
1423
- return __generator(this, function (_b) {
1424
- switch (_b.label) {
1425
- case 0:
1426
- if (!parsedValue) {
1427
- return [2 /*return*/, null];
1428
- }
1429
- filters = parsedValue.filters, initial = parsedValue.initial;
1430
- if (!Array.isArray(filters)) return [3 /*break*/, 3];
1431
- translate = Boolean(filters.find(function (item) { return item.name === 't'; }));
1432
- if (!translate) return [3 /*break*/, 3];
1433
- _a = options.translations;
1434
- if (_a) return [3 /*break*/, 2];
1435
- return [4 /*yield*/, getShopifyAsset('locales/en.default.json', options)];
1436
- case 1:
1437
- _a = (_b.sent());
1438
- _b.label = 2;
1439
- case 2:
1440
- asset_1 = _a;
1441
- parsed = typeof asset_1 === 'string' ? (0, lodash_1.attempt)(function () { return JSON.parse(asset_1); }) : asset_1;
1442
- if (parsed && !(0, lodash_1.isError)(parsed)) {
1443
- translationValue = (0, lodash_1.get)(parsed, initial.replace(/'/g, ''));
1444
- return [2 /*return*/, translationValue];
1445
- }
1446
- else {
1447
- console.warn('Could not grab translation', options);
1448
- }
1449
- _b.label = 3;
1450
- case 3: return [2 /*return*/, null];
1451
- }
1452
- });
1453
- });
1454
- };
1455
- var liquidToAst = function (str, options) {
1456
- if (options === void 0) { options = {}; }
1457
- // Look for "<tag ...> {% end"
1458
- // FIXME: this will also throw on self closing tags like <input> but ideally should be fixed to not
1459
- var problemMatched = str.match(/<[^\/>]+?>\s*{%[\s\-]*end/gi);
1460
- if (problemMatched) {
1461
- console.warn('Found invalid liquid condition around open HTML tag', problemMatched);
1462
- }
1463
- // Look for "{% if|unless %}</div>""
1464
- var closeTagMatch = str.match(/{%[\s\-]*(if|unless)[^}]*%}\s*<\//gi);
1465
- if (closeTagMatch) {
1466
- console.warn('Found invalid liquid condition around close HTML tag', closeTagMatch);
1467
- }
1468
- var engine = new liquidjs_1.Liquid();
1469
- // TODO: handle other tags
1470
- var selfCloseTags = [
1471
- 'section',
1472
- 'render',
1473
- 'include',
1474
- 'echo',
1475
- 'liquid',
1476
- 'layout',
1477
- 'cycle',
1478
- 'break',
1479
- 'continue',
1480
- ];
1481
- selfCloseTags.forEach(function (tag) {
1482
- engine.registerTag(tag, {
1483
- parse: function (token, remainTokens) {
1484
- this.remainTokens = remainTokens;
1485
- this.templates = [];
1486
- this.type = 'block';
1487
- this.blockType = 'selfClose';
1488
- this.name = tag;
1489
- this.args = token.args;
1490
- },
1491
- render: function () { return null; },
1492
- });
1493
- });
1494
- var nonLiquidBlockTags = ['style', 'stylesheet', 'javascript', 'schema'];
1495
- nonLiquidBlockTags.forEach(function (tag) {
1496
- engine.registerTag(tag, {
1497
- parse: function (token, remainTokens) {
1498
- var _this = this;
1499
- this.remainTokens = remainTokens;
1500
- this.tokens = [];
1501
- this.type = 'block';
1502
- this.blockType = 'nonLiquidBlock';
1503
- this.name = tag;
1504
- this.args = token.args;
1505
- this.tokens = [];
1506
- var stream = this.liquid.parser.parseStream(remainTokens);
1507
- stream
1508
- .on('token', function (token) {
1509
- if (token.name === 'end' + tag)
1510
- stream.stop();
1511
- else
1512
- _this.tokens.push(token);
1513
- })
1514
- .on('end', function () {
1515
- throw new Error("tag ".concat(token.raw, " not closed"));
1516
- });
1517
- stream.start();
1518
- },
1519
- render: function () { return null; },
1520
- });
1521
- });
1522
- var blockTags = ['form', 'paginate', 'schema'];
1523
- blockTags.forEach(function (tag) {
1524
- engine.registerTag(tag, {
1525
- parse: function (token, remainTokens) {
1526
- var _this = this;
1527
- this.remainTokens = remainTokens;
1528
- this.templates = [];
1529
- this.type = 'block';
1530
- this.name = tag;
1531
- this.args = token.args;
1532
- var stream = this.liquid.parser
1533
- .parseStream(remainTokens)
1534
- .on('tag:end' + tag, function () { return stream.stop(); })
1535
- .on('template', function (tpl) { return _this.templates.push(tpl); })
1536
- .on('end', function () {
1537
- throw new Error("tag ".concat(token.raw, " not closed"));
1538
- });
1539
- stream.start();
1540
- },
1541
- render: function () { return null; },
1542
- });
1543
- });
1544
- var parsedTemplateItems = engine.parse(str);
1545
- return parsedTemplateItems;
1546
- };
1547
- exports.liquidToAst = liquidToAst;
1548
- var bindingsPlaceholder = '__B__';
1549
- var htmlToAst = function (html) {
1550
- // https://github.com/vuejs/vue/blob/dev/src/platforms/web/compiler/modules/class.js#L19
1551
- var ast = compiler.compile("<template>".concat(html.replace(/(class|style)=/g, "".concat(bindingsPlaceholder, "$1=")), "</template>")).ast.children;
1552
- var processed = (0, exports.postProcessHtmlAstNodes)((0, lodash_1.cloneDeep)(ast));
1553
- return { htmlNodes: processed, preprocessed: ast };
1554
- };
1555
- exports.htmlToAst = htmlToAst;
1556
- var isBuilderElement = function (el) {
1557
- return Boolean(el && typeof el === 'object' && el['@type'] === '@builder.io/sdk:Element');
1558
- };
1559
- var isBuilderElementArray = function (obj) {
1560
- return Boolean(obj && Array.isArray(obj) && obj[0] && isBuilderElement(obj[0]));
1561
- };
1562
- var getNextBuilderSiblings = function (el, parentArray) {
1563
- var index = parentArray.indexOf(el);
1564
- if (index === -1) {
1565
- console.log('node', el, parentArray);
1566
- throw new Error('El is not in parentArray');
1567
- }
1568
- return parentArray.slice(index + 1);
1569
- };
1570
- var tempNodeInfo = function (el) {
1571
- var component = el.component;
1572
- if (component) {
1573
- var componentName = component.name, options = component.options;
1574
- if (componentName === 'TempNode') {
1575
- var name_6 = options.name, value = options.value;
1576
- return { value: value, name: name_6 };
1577
- }
1578
- }
1579
- return { name: null, value: null };
1580
- };
1581
- var tempTagInfo = function (el) {
1582
- var component = el.component;
1583
- if (component) {
1584
- var componentName = component.name, options = component.options;
1585
- if (componentName === 'TempTag') {
1586
- var name_7 = options.name, value = options.value;
1587
- return { value: value, name: name_7 };
1588
- }
1589
- }
1590
- return { name: null, value: null };
1591
- };
1592
- var getTextNode = function (str) { return ({
1593
- static: true,
1594
- type: 3,
1595
- text: str,
1596
- }); };
1597
- var separateTagsAndText = function (text) {
1598
- var str = (text || '').trim();
1599
- var textItems = [];
1600
- var tags = parseTags(str);
1601
- if (!tags.length) {
1602
- return [getTextNode(str)];
1603
- }
1604
- var result = [];
1605
- var currentIndex = 0;
1606
- for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
1607
- var tag = tags_1[_i];
1608
- var index = str.indexOf(tag.raw, currentIndex);
1609
- textItems.push(str.slice(currentIndex, index));
1610
- currentIndex = index + tag.raw.length;
1611
- }
1612
- var lastRaw = (0, lodash_1.last)(tags).raw;
1613
- var lastIndex = text.lastIndexOf(lastRaw) + lastRaw.length;
1614
- textItems.push(str.slice(lastIndex));
1615
- for (var i = 0; i < tags.length; i++) {
1616
- if (textItems[i] && textItems[i].trim()) {
1617
- result.push(getTextNode(textItems[i]));
1618
- }
1619
- result.push(getTextNode(tags[i].raw));
1620
- }
1621
- if (textItems[tags.length] && textItems[tags.length].trim()) {
1622
- result.push(getTextNode(textItems[tags.length] || ''));
1623
- }
1624
- return result;
1625
- };
1626
- exports.separateTagsAndText = separateTagsAndText;
1627
- var debugLoops = false;
1628
- var isArrayWithTextNode = function (obj) {
1629
- return Array.isArray(obj) && obj.find(function (item) { return isTextNode(item); });
1630
- };
1631
- var postProcessHtmlAstNodes = function (nodes) {
1632
- var updated = true;
1633
- var i = 0;
1634
- var latest = nodes;
1635
- while (updated) {
1636
- if (i++ > (debugLoops ? 3 : 1000)) {
1637
- console.warn('Too many updates');
1638
- break;
1639
- }
1640
- updated = false;
1641
- // tslint:disable-next-line:ter-prefer-arrow-callback
1642
- latest = (0, traverse_1.default)(latest).forEach(function (current) {
1643
- var _a;
1644
- if ((current === null || current === void 0 ? void 0 : current.name) && current.name.startsWith(bindingsPlaceholder)) {
1645
- this.update(__assign(__assign({}, current), { name: current.name.replace(bindingsPlaceholder, '') }));
1646
- }
1647
- else if (current) {
1648
- var prop = Object.keys(current).find(function (key) { return key.startsWith(bindingsPlaceholder); });
1649
- if (prop) {
1650
- this.update(__assign(__assign({}, (0, lodash_1.omit)(current, prop)), (_a = {}, _a[prop === null || prop === void 0 ? void 0 : prop.replace(bindingsPlaceholder, '')] = current[prop], _a)));
1651
- }
1652
- }
1653
- if (!isArrayWithTextNode(current)) {
1654
- return;
1655
- }
1656
- for (var _i = 0, current_1 = current; _i < current_1.length; _i++) {
1657
- var item = current_1[_i];
1658
- if (!isTextNode(item)) {
1659
- continue;
1660
- }
1661
- var parent_1 = current;
1662
- var text = item.text;
1663
- var separated = (0, exports.separateTagsAndText)(text);
1664
- if (separated.length > 1) {
1665
- updated = true;
1666
- this.update(__spreadArray(__spreadArray(__spreadArray([], parent_1.slice(0, parent_1.indexOf(item)), true), separated, true), parent_1.slice(parent_1.indexOf(item) + 1), true), true);
1667
- break;
1668
- }
1669
- }
1670
- });
1671
- }
1672
- return latest;
1673
- };
1674
- exports.postProcessHtmlAstNodes = postProcessHtmlAstNodes;
1675
- var isCondition = function (el) { var _a; return ((_a = el.component) === null || _a === void 0 ? void 0 : _a.name) === 'Shopify:Condition'; };
1676
- var isOpenConditionalTag = function (el) { var _a; return ((_a = el.component) === null || _a === void 0 ? void 0 : _a.name) === 'Shopify:ConditionalTag'; };
1677
- var isEndConditionalTag = function (el) { var _a, _b; return ((_b = (_a = el.component) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.name) === 'endopencondtag'; };
1678
- var moveCondtionalTagsUp = function (nodes) {
1679
- var updated = true;
1680
- var i = 0;
1681
- while (updated) {
1682
- if (i++ > (debugLoops ? 4 : 1000)) {
1683
- console.warn('Too many updates');
1684
- break;
1685
- }
1686
- updated = false;
1687
- // tslint:disable-next-line:ter-prefer-arrow-callback
1688
- nodes = (0, traverse_1.default)(nodes).forEach(function (current) {
1689
- var _a;
1690
- if (!isBuilderElementArray(current)) {
1691
- return;
1692
- }
1693
- for (var currentIndex = 0; currentIndex < current.length; currentIndex++) {
1694
- var ejected = null;
1695
- var condition = current[currentIndex];
1696
- if (!isCondition(condition)) {
1697
- return;
1698
- }
1699
- var branches = condition.component.options.branches;
1700
- var branchIndex = -1;
1701
- for (var _i = 0, branches_1 = branches; _i < branches_1.length; _i++) {
1702
- var branch = branches_1[_i];
1703
- branchIndex++;
1704
- var ejectedIndex = branch.blocks.findIndex(function (block, blockIndex) {
1705
- var name = tempTagInfo(block).name;
1706
- return name === 'opencondtag';
1707
- });
1708
- if (ejectedIndex > -1) {
1709
- var oldBlocks = branch.blocks;
1710
- ejected = (_a = branch.blocks) === null || _a === void 0 ? void 0 : _a[ejectedIndex];
1711
- var newBlocks = __spreadArray(__spreadArray(__spreadArray([], ((oldBlocks === null || oldBlocks === void 0 ? void 0 : oldBlocks.slice(0, ejectedIndex)) || []), true), (ejected.children || []), true), ((oldBlocks === null || oldBlocks === void 0 ? void 0 : oldBlocks.slice(ejectedIndex + 1)) || []), true);
1712
- var updatedCondition = __assign(__assign({}, condition), { component: __assign(__assign({}, condition.component), { options: __assign(__assign({}, condition.component.options), { branches: __spreadArray(__spreadArray(__spreadArray([], branches.slice(0, branchIndex), true), [
1713
- __assign(__assign({}, branch), { blocks: newBlocks })
1714
- ], false), branches.slice(branchIndex + 1), true) }) }) });
1715
- this.update(__spreadArray(__spreadArray(__spreadArray([], current.slice(0, currentIndex), true), [
1716
- __assign(__assign({}, ejected), { meta: __assign(__assign({}, ejected.meta), { originalIndex: ejectedIndex, branchIndex: branchIndex }), component: __assign(__assign({}, ejected.component), { name: 'Shopify:ConditionalTag' }), children: [updatedCondition] })
1717
- ], false), current.slice(currentIndex + 1), true), true);
1718
- break;
1719
- }
1720
- }
1721
- if (ejected) {
1722
- updated = true;
1723
- break;
1724
- }
1725
- }
1726
- });
1727
- }
1728
- return nodes;
1729
- };
1730
- var matchConditionalTagsWithEndings = function (nodes) {
1731
- var updated = true;
1732
- var i = 0;
1733
- while (updated) {
1734
- if (i++ > (debugLoops ? 4 : 1000)) {
1735
- console.warn('Too many updates');
1736
- break;
1737
- }
1738
- updated = false;
1739
- // tslint:disable-next-line:ter-prefer-arrow-callback
1740
- nodes = (0, traverse_1.default)(nodes).forEach(function (current) {
1741
- var _a, _b;
1742
- if (!isBuilderElementArray(current)) {
1743
- return;
1744
- }
1745
- var _loop_2 = function (currentIndex) {
1746
- var node = current[currentIndex];
1747
- if (!isOpenConditionalTag(node) || this_1.key === 'conditionalTags') {
1748
- return { value: void 0 };
1749
- }
1750
- var conditionalTags = [(0, lodash_1.omit)(node, 'children')];
1751
- var tag = node;
1752
- var originalIndex = node.meta.originalIndex;
1753
- var branchIndex = node.meta.branchIndex;
1754
- while (tag.children) {
1755
- tag = tag.children[0];
1756
- if (isOpenConditionalTag(tag)) {
1757
- conditionalTags.push((0, lodash_1.omit)(tag, 'children'));
1758
- }
1759
- else {
1760
- break;
1761
- }
1762
- }
1763
- var endTag = current
1764
- .slice(currentIndex + 1)
1765
- .findIndex(function (el) {
1766
- var _a, _b;
1767
- return isEndConditionalTag(el) &&
1768
- ((_a = el.component) === null || _a === void 0 ? void 0 : _a.options.hash) === ((_b = node.component) === null || _b === void 0 ? void 0 : _b.options.hash);
1769
- });
1770
- if (endTag === -1) {
1771
- // TODO try to recover by finding the next shopify condition with the same hash
1772
- endTag =
1773
- current
1774
- .slice(currentIndex + 1)
1775
- .findIndex(function (el) { var _a, _b; return isCondition(el) && ((_a = el.component) === null || _a === void 0 ? void 0 : _a.options.hash) === ((_b = node.component) === null || _b === void 0 ? void 0 : _b.options.hash); }) + 1;
1776
- if (endTag === 0) {
1777
- throw Error("no endTag for a conditional ".concat((_a = node.component) === null || _a === void 0 ? void 0 : _a.options.hash));
1778
- }
1779
- }
1780
- // cursor at condition now
1781
- var condition = tag;
1782
- var hoistedCondition = null;
1783
- /* originalIndex is where the open tag was, e.g
1784
- {% if test %} TEXT<span> in span</span> <div class = '''>
1785
- it'll be 2,
1786
- */
1787
- if (originalIndex > 0) {
1788
- var originalBranch = (0, lodash_1.cloneDeep)((_b = condition.component) === null || _b === void 0 ? void 0 : _b.options.branches[branchIndex]);
1789
- hoistedCondition = (0, lodash_1.mergeWith)({}, condition, {
1790
- component: {
1791
- options: {
1792
- isHoisted: true,
1793
- branches: [
1794
- __assign(__assign({}, originalBranch), { blocks: originalBranch.blocks.slice(0, originalIndex) }),
1795
- ],
1796
- },
1797
- },
1798
- }, function (_, dest) {
1799
- // always prefer arrays from destination, (third arg above)
1800
- if (Array.isArray(dest)) {
1801
- return dest;
1802
- }
1803
- });
1804
- condition = (0, lodash_1.mergeWith)({}, condition, {
1805
- component: {
1806
- options: {
1807
- branches: __spreadArray(__spreadArray(__spreadArray([], condition.component.options.branches.slice(0, branchIndex), true), [
1808
- __assign(__assign({}, originalBranch), { blocks: originalBranch.blocks.slice(originalIndex) })
1809
- ], false), condition.component.options.branches.slice(branchIndex + 1), true),
1810
- },
1811
- },
1812
- }, function (_, dest) {
1813
- // always prefer arrays from destination, (third arg above)
1814
- if (Array.isArray(dest)) {
1815
- return dest;
1816
- }
1817
- });
1818
- }
1819
- this_1.update(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], current.slice(0, currentIndex), true), (hoistedCondition ? [hoistedCondition] : []), true), [
1820
- el({
1821
- // TODO: lookout for tempnodes in condition blocks
1822
- children: __spreadArray([condition], current.slice(currentIndex + 1, endTag), true),
1823
- component: {
1824
- name: 'Shopify:WrapperTag',
1825
- options: {
1826
- conditionalTags: conditionalTags,
1827
- },
1828
- },
1829
- })
1830
- ], false), current.slice(currentIndex + endTag + 2), true), true);
1831
- updated = true;
1832
- };
1833
- var this_1 = this;
1834
- for (var currentIndex = 0; currentIndex < current.length; currentIndex++) {
1835
- var state_1 = _loop_2(currentIndex);
1836
- if (typeof state_1 === "object")
1837
- return state_1.value;
1838
- }
1839
- });
1840
- }
1841
- return nodes;
1842
- };
1843
- var postProcessBuilderTree = function (nodes, options) { return __awaiter(void 0, void 0, void 0, function () {
1844
- var updated, i, latest;
1845
- return __generator(this, function (_a) {
1846
- updated = true;
1847
- i = 0;
1848
- latest = nodes;
1849
- while (updated) {
1850
- if (i++ > (debugLoops ? 3 : 1000)) {
1851
- console.warn('Too many updates');
1852
- break;
1853
- }
1854
- updated = false;
1855
- // tslint:disable-next-line:ter-prefer-arrow-callback
1856
- latest = (0, traverse_1.default)(latest).forEach(function (current) {
1857
- var _a, _b, _c, _d, _e, _f;
1858
- if (!isBuilderElementArray(current)) {
1859
- return;
1860
- }
1861
- var _loop_3 = function (item) {
1862
- // TODO: add support for {% javascript %} and {% stylesheet %} here as well:
1863
- // https://shopify.dev/tutorials/develop-theme-use-sections#id
1864
- if (((_a = item.meta) === null || _a === void 0 ? void 0 : _a.identifier) === 'ShopifySection') {
1865
- // haven't updated the section layer yet if no schema, try to process
1866
- var schema = (_b = item.component) === null || _b === void 0 ? void 0 : _b.options.schema;
1867
- if (!schema) {
1868
- var schemaBlock = (_c = item.children) === null || _c === void 0 ? void 0 : _c.find(function (child) {
1869
- return child.layerName === 'Schema';
1870
- });
1871
- if (schemaBlock) {
1872
- item.component.options.schema = (_d = schemaBlock.component) === null || _d === void 0 ? void 0 : _d.options;
1873
- if (!item.component.options.section) {
1874
- item.component.options.section = {
1875
- name: '',
1876
- settings: {},
1877
- };
1878
- }
1879
- var settings = item.component.options.section.settings;
1880
- for (var _g = 0, _h = (_e = schemaBlock.component) === null || _e === void 0 ? void 0 : _e.options.settings; _g < _h.length; _g++) {
1881
- var setting = _h[_g];
1882
- var name_8 = setting.id;
1883
- // TODO: sometimes shopify templates are using settings but they don't have a default or a config in the settings_data.json but somehow have a value?
1884
- if (typeof settings[name_8] === 'undefined' &&
1885
- typeof setting.default !== 'undefined') {
1886
- settings[name_8] = setting.default;
1887
- }
1888
- }
1889
- }
1890
- else {
1891
- console.warn('This section has no schema!');
1892
- // Put an object here so we know we tried to process so the above condition doesn't match anymore
1893
- item.component.options.schema = {};
1894
- }
1895
- updated = true;
1896
- return { value: this_2.stop() };
1897
- }
1898
- }
1899
- var _j = tempNodeInfo(item), name_9 = _j.name, value = _j.value;
1900
- var parsedValue = value && (0, lodash_1.attempt)(function () { return JSON.parse(value); });
1901
- if (name_9) {
1902
- var isBlockStart = ['for', 'if', 'unless', 'paginate', 'form'].includes(name_9);
1903
- if (isBlockStart) {
1904
- var parent_2 = current;
1905
- // Could be fucked.... could have no close tag... or be in wrong palce...
1906
- // Handle this later.
1907
- var nextSiblings = getNextBuilderSiblings(item, parent_2);
1908
- var skip_1 = 0;
1909
- // TODO: maybe reverse traverse for end tag like compylr...
1910
- var endTag = nextSiblings.find(function (el) {
1911
- var siblingName = tempNodeInfo(el).name;
1912
- if (name_9 === siblingName) {
1913
- skip_1++;
1914
- return false;
1915
- }
1916
- var matches = siblingName === 'end' + name_9;
1917
- if (matches) {
1918
- if (skip_1) {
1919
- skip_1--;
1920
- }
1921
- else {
1922
- return true;
1923
- }
1924
- }
1925
- return false;
1926
- });
1927
- if (!endTag) {
1928
- console.warn("Did not find end tag for tag: \"".concat(name_9, "\""), item.component.options.value);
1929
- }
1930
- else {
1931
- updated = true;
1932
- var skip_2 = 0;
1933
- var midTags = nextSiblings.slice(0, parent_2.indexOf(endTag)).filter(function (el) {
1934
- var siblingName = tempNodeInfo(el).name;
1935
- if ('if' === siblingName || siblingName === 'unless') {
1936
- skip_2++;
1937
- return false;
1938
- }
1939
- var matches = siblingName === 'endunless' || siblingName === 'endif';
1940
- if (matches) {
1941
- if (skip_2) {
1942
- skip_2--;
1943
- }
1944
- else {
1945
- // TODO: short circuit
1946
- return false;
1947
- }
1948
- }
1949
- if (!skip_2 && ['else', 'elsif'].includes(siblingName)) {
1950
- return true;
1951
- }
1952
- return false;
1953
- });
1954
- if (name_9 === 'if') {
1955
- var allTags = [item].concat(midTags).concat([endTag]);
1956
- var branches = [];
1957
- for (var i_1 = 0; i_1 < allTags.length; i_1++) {
1958
- var tag = allTags[i_1];
1959
- var info = tempNodeInfo(tag);
1960
- if (info.name === 'endif') {
1961
- break;
1962
- }
1963
- var nextTag = allTags[i_1 + 1];
1964
- var parsedValue_1 = info.value && JSON.parse(info.value);
1965
- branches.push({
1966
- expression: parsedValue_1.cond
1967
- ? "".concat(parsedValue_1.negate ? '!' : '').concat(liquidConditionTemplate(parsedValue_1.cond))
1968
- : '',
1969
- blocks: parent_2.slice(parent_2.indexOf(tag) + 1, parent_2.indexOf(nextTag)),
1970
- });
1971
- }
1972
- this_2.update(__spreadArray(__spreadArray(__spreadArray([], parent_2.slice(0, parent_2.indexOf(item)), true), [
1973
- el({
1974
- component: {
1975
- name: 'Shopify:Condition',
1976
- options: {
1977
- hash: parsedValue.hash,
1978
- branches: branches,
1979
- },
1980
- },
1981
- })
1982
- ], false), parent_2.slice(parent_2.indexOf(endTag) + 1), true), true);
1983
- }
1984
- // else if (name === 'unless') {
1985
- //unless is rewritten as a Shopify:Condition component
1986
- // }
1987
- else if (name_9 === 'paginate') {
1988
- var allTags = [item].concat(midTags).concat([endTag]);
1989
- var options_1 = {};
1990
- for (var i_2 = 0; i_2 < allTags.length; i_2++) {
1991
- var tag = allTags[i_2];
1992
- var info = tempNodeInfo(tag);
1993
- if (info.name === 'endpaginate') {
1994
- break;
1995
- }
1996
- var parsedValue_2 = info.value && JSON.parse(info.value);
1997
- var _k = parsedValue_2.args.split(/\s+by\s*/), expression = _k[0], limit = _k[1];
1998
- options_1.expression = expression;
1999
- options_1.limit = limit;
2000
- }
2001
- this_2.update(__spreadArray(__spreadArray(__spreadArray([], parent_2.slice(0, parent_2.indexOf(item)), true), [
2002
- el({
2003
- component: {
2004
- options: options_1,
2005
- name: 'Shopify:Paginate',
2006
- },
2007
- children: parent_2.slice(parent_2.indexOf(item) + 1, parent_2.indexOf(endTag)),
2008
- })
2009
- ], false), parent_2.slice(parent_2.indexOf(endTag) + 1), true), true);
2010
- }
2011
- else if (name_9 === 'form') {
2012
- var allTags = [item].concat(midTags).concat([endTag]);
2013
- var options_2 = {};
2014
- for (var i_3 = 0; i_3 < allTags.length; i_3++) {
2015
- var tag = allTags[i_3];
2016
- var info = tempNodeInfo(tag);
2017
- if (info.name === 'endform') {
2018
- break;
2019
- }
2020
- var parsedValue_3 = info.value && JSON.parse(info.value);
2021
- var args = parseArgList(parsedValue_3.args);
2022
- options_2.type = (_f = args.shift()) === null || _f === void 0 ? void 0 : _f.replace(/"/g, '').replace(/'/g, '');
2023
- options_2.parameter = null;
2024
- options_2.customAttributes = null;
2025
- if (args.length && !args[0].includes(':')) {
2026
- options_2.parameter = args.shift();
2027
- }
2028
- if (args.length) {
2029
- options_2.customAttributes = args;
2030
- }
2031
- }
2032
- this_2.update(__spreadArray(__spreadArray(__spreadArray([], parent_2.slice(0, parent_2.indexOf(item)), true), [
2033
- el({
2034
- component: {
2035
- options: options_2,
2036
- name: 'Shopify:Form',
2037
- },
2038
- children: parent_2.slice(parent_2.indexOf(item) + 1, parent_2.indexOf(endTag)),
2039
- })
2040
- ], false), parent_2.slice(parent_2.indexOf(endTag) + 1), true), true);
2041
- }
2042
- else if (name_9 === 'for') {
2043
- var options_3 = {
2044
- repeat: {
2045
- itemName: parsedValue.variable,
2046
- collection: parsedValue.collection,
2047
- expression: parsedValue.fullRaw,
2048
- },
2049
- };
2050
- this_2.update(__spreadArray(__spreadArray(__spreadArray([], parent_2.slice(0, parent_2.indexOf(item)), true), [
2051
- el({
2052
- component: {
2053
- options: options_3,
2054
- name: 'Shopify:For',
2055
- },
2056
- children: parent_2.slice(parent_2.indexOf(item) + 1, parent_2.indexOf(endTag)),
2057
- })
2058
- ], false), parent_2.slice(parent_2.indexOf(endTag) + 1), true), true);
2059
- }
2060
- else {
2061
- this_2.update(__spreadArray(__spreadArray(__spreadArray([], parent_2.slice(0, parent_2.indexOf(item)), true), [
2062
- el(__assign(__assign({ component: {
2063
- name: 'Core:Fragment',
2064
- }, bindings: {} }, (name_9 === 'for' &&
2065
- !(0, lodash_1.isError)(parsedValue) && {
2066
- repeat: {
2067
- itemName: parsedValue.variable,
2068
- collection: liquidBindingTemplate(parsedValue.collection),
2069
- },
2070
- })), { children: parent_2.slice(parent_2.indexOf(item) + 1, parent_2.indexOf(endTag)) }))
2071
- ], false), parent_2.slice(parent_2.indexOf(endTag) + 1), true), true);
2072
- }
2073
- return "break";
2074
- }
2075
- }
2076
- }
2077
- };
2078
- var this_2 = this;
2079
- for (var _i = 0, current_2 = current; _i < current_2.length; _i++) {
2080
- var item = current_2[_i];
2081
- var state_2 = _loop_3(item);
2082
- if (typeof state_2 === "object")
2083
- return state_2.value;
2084
- if (state_2 === "break")
2085
- break;
2086
- }
2087
- });
2088
- }
2089
- latest = moveCondtionalTagsUp(latest);
2090
- latest = matchConditionalTagsWithEndings(latest);
2091
- return [2 /*return*/, latest];
2092
- });
2093
- }); };
2094
- exports.postProcessBuilderTree = postProcessBuilderTree;
2095
- var htmlAstToBuilder = function (nodes, options) { return __awaiter(void 0, void 0, void 0, function () {
2096
- var els, _a, _b;
2097
- return __generator(this, function (_c) {
2098
- switch (_c.label) {
2099
- case 0:
2100
- _a = lodash_1.compact;
2101
- _b = lodash_1.flatten;
2102
- return [4 /*yield*/, Promise.all(nodes
2103
- .filter(function (node) { return isTextNode(node) || isElement(node); })
2104
- .map(function (node, index, nodes) { return (0, exports.htmlNodeToBuilder)(node, index, nodes, options); }))];
2105
- case 1:
2106
- els = _a.apply(void 0, [_b.apply(void 0, [_c.sent()])]);
2107
- return [2 /*return*/, els];
2108
- }
2109
- });
2110
- }); };
2111
- exports.htmlAstToBuilder = htmlAstToBuilder;
2112
- var processedAstToBuilder = function (nodes, options) { return __awaiter(void 0, void 0, void 0, function () {
2113
- var els, processed;
2114
- return __generator(this, function (_a) {
2115
- switch (_a.label) {
2116
- case 0: return [4 /*yield*/, (0, exports.htmlAstToBuilder)(nodes, options)];
2117
- case 1:
2118
- els = _a.sent();
2119
- return [4 /*yield*/, (0, exports.postProcessBuilderTree)((0, fast_clone_1.fastClone)(els), options)];
2120
- case 2:
2121
- processed = _a.sent();
2122
- return [2 /*return*/, { blocks: processed, preprocessed: els }];
2123
- }
2124
- });
2125
- }); };
2126
- exports.processedAstToBuilder = processedAstToBuilder;
2127
- var htmlDebugString = function (els) {
2128
- var str = els.map(function (el) { return htmlDebugNodeString(el); }).join('\n');
2129
- return (0, exports.tryFormat)(str);
2130
- };
2131
- exports.htmlDebugString = htmlDebugString;
2132
- var tryFormat = function (str) {
2133
- try {
2134
- return (0, standalone_1.format)(str, {
2135
- parser: 'html',
2136
- htmlWhitespaceSensitivity: 'ignore',
2137
- plugins: [htmlParser],
2138
- });
2139
- }
2140
- catch (err) {
2141
- console.warn('Prettier failed', err);
2142
- return str;
2143
- }
2144
- };
2145
- exports.tryFormat = tryFormat;
2146
- var htmlDebugNodeString = function (el) {
2147
- var tagName = (el.component && el.component.name) || el.tagName;
2148
- var properties = [];
2149
- for (var property in el.properties) {
2150
- var value = el.properties[property];
2151
- if (property !== 'attr') {
2152
- properties.push([property, value]);
2153
- }
2154
- else {
2155
- for (var attr in value) {
2156
- properties.push([attr, value[attr]]);
2157
- }
2158
- }
2159
- }
2160
- for (var binding in el.bindings) {
2161
- properties.push([':' + binding, el.bindings[binding]]);
2162
- }
2163
- if (el.component && el.component.options) {
2164
- for (var property in el.component.options) {
2165
- var value = el.component.options[property];
2166
- if (value && typeof value === 'object') {
2167
- value = JSON.stringify(value);
2168
- }
2169
- properties.push(['@' + property, String(value)]);
2170
- }
2171
- }
2172
- return "<".concat(tagName, " ").concat(properties.reduce(function (memo, tuple) { return memo + " ".concat(tuple[0], "=\"").concat((tuple[1] || '').replace(/"/g, '`'), "\""); }, ''), "\n ").concat(el.children && el.children.length
2173
- ? ">".concat(el.children.map(function (child) { return htmlDebugNodeString(child); }).join('\n'), "</").concat(tagName, ">")
2174
- : '/>', "\n ");
2175
- };
2176
- /**
2177
- * This function is the first step, before we turn the liquid into an AST.
2178
- * It is used to make certain changes to the liquid string that are much
2179
- * easier to do before we process it. Examples of this include rewriting
2180
- * certain tags to a format we already know how to parse, or fixing common
2181
- * liquid template errors that cause problems during import.
2182
- *
2183
- * Note: there are a lot of regexes in here, and they can be confusing!
2184
- * If you are trying to debug something that includes a regex, try using
2185
- * a tool like https://regex101.com/ to break down what is going on.
2186
- */
2187
- var preprocessLiquid = function (liquid, options) {
2188
- if (options === void 0) { options = {}; }
2189
- return __awaiter(void 0, void 0, void 0, function () {
2190
- var processedLiquid, captureGroupRegex, matchedCaptureGroup, allCaptureGroupMatches, match, capturedVariableName, capturedContents, capturedContentsHasLiquid, capturedContentContainsCaptureTag, capturedVariableReplaceRegex, _i, allCaptureGroupMatches_1, captureMatch, captureReplacement, includesWithRegex, includesWithAndValuesRegex, templateContainsRegex, booleanHTMLAttributes, _loop_4, _a, booleanHTMLAttributes_1, booleanAttribute, themeAsset, themeSettings, contentForIndexTemplates, contentForIndexLiquidStrings_1, contentForIndexRegex;
2191
- var _b, _c, _d;
2192
- return __generator(this, function (_e) {
2193
- switch (_e.label) {
2194
- case 0:
2195
- processedLiquid = liquid || '';
2196
- captureGroupRegex = /{%-?\s*capture\s*(.+?)-?%}([\s\S]*?){%-?\s*endcapture\s*-?%}/gi;
2197
- allCaptureGroupMatches = [];
2198
- while ((matchedCaptureGroup = captureGroupRegex.exec(processedLiquid)) !== null) {
2199
- match = matchedCaptureGroup[0], capturedVariableName = matchedCaptureGroup[1], capturedContents = matchedCaptureGroup[2];
2200
- capturedContentsHasLiquid = capturedContents === null || capturedContents === void 0 ? void 0 : capturedContents.match(/\{%/gim);
2201
- capturedContentContainsCaptureTag = capturedContents === null || capturedContents === void 0 ? void 0 : capturedContents.match(/{%-?\s*capture/gim);
2202
- if (capturedVariableName && capturedContentsHasLiquid && !capturedContentContainsCaptureTag) {
2203
- // We want to find a replace any instances of the captured variable in the template, i.e. {{ my_variable }}
2204
- allCaptureGroupMatches.push({
2205
- match: match,
2206
- capturedVariableName: capturedVariableName,
2207
- capturedContents: capturedContents,
2208
- });
2209
- capturedVariableReplaceRegex = new RegExp("{{-?\\s*".concat(capturedVariableName.trim(), "\\s*-?}}"), 'gi');
2210
- processedLiquid = processedLiquid.replace(capturedVariableReplaceRegex, capturedContents);
2211
- }
2212
- else if (capturedContentContainsCaptureTag) {
2213
- console.warn('Capture tag preprocess contained nested capture tag', {
2214
- match: match,
2215
- capturedVariableName: capturedVariableName,
2216
- capturedContents: capturedContents,
2217
- });
2218
- }
2219
- }
2220
- // For any capture tag that we found, we still want to add it to the state
2221
- // even though we replaced any {{ captured_variable }} tags with the actual contents
2222
- // of the capture. The reason for this is so that expressions like:
2223
- //
2224
- // {% capture headlines%}....{% endcapture %}
2225
- // {% assign headline_length = headlines | split: '^' | size %}
2226
- //
2227
- // will still work
2228
- if (allCaptureGroupMatches.length) {
2229
- for (_i = 0, allCaptureGroupMatches_1 = allCaptureGroupMatches; _i < allCaptureGroupMatches_1.length; _i++) {
2230
- captureMatch = allCaptureGroupMatches_1[_i];
2231
- captureReplacement = "{% capture ".concat(captureMatch.capturedVariableName, " %}{% raw %}").concat(captureMatch.capturedContents, "{% endraw %}{% endcapture %}");
2232
- processedLiquid = processedLiquid.replace(captureMatch.match, captureReplacement);
2233
- }
2234
- }
2235
- includesWithRegex = /{%-?\s*include\s*([\S]+?)\s*with\s*([\S]+?)\s*-?%}/gi;
2236
- processedLiquid = processedLiquid.replace(includesWithRegex, function (fullIncludesMatch, templateName, withMatch) {
2237
- var templateNameCleaned = templateName.trim().replace(/'/g, '').replace(/"/g, '');
2238
- return "{% include '".concat(templateNameCleaned, "', ").concat(templateNameCleaned, ": ").concat(withMatch, " %}");
2239
- });
2240
- includesWithAndValuesRegex = /{%-?\s*include\s*([\S]+?)\s*with\s*(([\S]+?:\s*[\S]+?,?\s*)+)-?%}/gi;
2241
- processedLiquid = processedLiquid.replace(includesWithAndValuesRegex, function (fullIncludesMatch, templateName, allKeysAndValues) {
2242
- var templateNameCleaned = templateName.trim().replace(/'/g, '').replace(/"/g, '');
2243
- var allKeysAndValuesCleaned = allKeysAndValues.trim().replace(/\s+/g, ' ');
2244
- return "{% include '".concat(templateNameCleaned, "', ").concat(allKeysAndValuesCleaned, " %}");
2245
- });
2246
- templateContainsRegex = /{%-?(.+?)template\s+contains\s+(.+?)-?%}/gi;
2247
- processedLiquid = processedLiquid.replace(templateContainsRegex, function (fullTemplateMatch, templatePrefixText, templatePostfixText) {
2248
- return "{% ".concat(templatePrefixText, " template.name contains ").concat(templatePostfixText, " %}");
2249
- });
2250
- booleanHTMLAttributes = ['checked', 'disabled', 'selected'];
2251
- _loop_4 = function (booleanAttribute) {
2252
- var booleanAttributeRegex = new RegExp("<[\\s\\S]*?(".concat(booleanAttribute, "{%)[\\s\\S]*?>"), 'gi');
2253
- processedLiquid = processedLiquid.replace(booleanAttributeRegex, function (fullMatch, attributeMatch) {
2254
- return fullMatch.replace("".concat(attributeMatch), "".concat(booleanAttribute, " {%"));
2255
- });
2256
- };
2257
- for (_a = 0, booleanHTMLAttributes_1 = booleanHTMLAttributes; _a < booleanHTMLAttributes_1.length; _a++) {
2258
- booleanAttribute = booleanHTMLAttributes_1[_a];
2259
- _loop_4(booleanAttribute);
2260
- }
2261
- return [4 /*yield*/, getShopifyAsset('config/settings_data.json', options)];
2262
- case 1:
2263
- themeAsset = _e.sent();
2264
- themeSettings = typeof themeAsset === 'string' && (0, lodash_1.attempt)(function () { return JSON.parse(themeAsset); });
2265
- if (themeSettings && !(0, lodash_1.isError)(themeSettings)) {
2266
- contentForIndexTemplates = ((_b = themeSettings.current) === null || _b === void 0 ? void 0 : _b.content_for_index) || ((_d = (_c = themeSettings.presets) === null || _c === void 0 ? void 0 : _c.Default) === null || _d === void 0 ? void 0 : _d.content_for_index);
2267
- if (contentForIndexTemplates.length) {
2268
- contentForIndexLiquidStrings_1 = contentForIndexTemplates.map(function (template) { return "{% section '".concat(template, "' %}"); });
2269
- contentForIndexRegex = /{{\s*content_for_index\s*}}/gi;
2270
- processedLiquid = processedLiquid.replace(contentForIndexRegex, function (fullMatch) {
2271
- return fullMatch.replace(fullMatch, contentForIndexLiquidStrings_1.join(''));
2272
- });
2273
- }
2274
- }
2275
- return [2 /*return*/, processedLiquid];
2276
- }
2277
- });
2278
- });
2279
- };
2280
- exports.preprocessLiquid = preprocessLiquid;
2281
- var liquidToBuilder = function (liquid, options) {
2282
- if (options === void 0) { options = {}; }
2283
- return __awaiter(void 0, void 0, void 0, function () {
2284
- var preprocessedLiquid, scriptRe, scriptsInLiquid, parsedTemplateItems, html, themeAsset, themeSettings, serialized, htmlNodes, blocks;
2285
- return __generator(this, function (_a) {
2286
- switch (_a.label) {
2287
- case 0:
2288
- if (options.log) {
2289
- console.log('liquidToBuilder: liquid', { liquid: liquid });
2290
- }
2291
- return [4 /*yield*/, (0, exports.preprocessLiquid)(liquid, options)];
2292
- case 1:
2293
- preprocessedLiquid = _a.sent();
2294
- if (options.log) {
2295
- console.log('preprocessedLiquid: ', { preprocessedLiquid: preprocessedLiquid });
2296
- }
2297
- scriptRe = /<script[\s\S]*?>[\s\S]*?<\/script>/gi;
2298
- scriptsInLiquid = preprocessedLiquid.match(scriptRe);
2299
- parsedTemplateItems = (0, exports.liquidToAst)(preprocessedLiquid.replace(scriptRe, ''), options);
2300
- if (options.log) {
2301
- console.log('liquidToBuilder: parsed liquid', parsedTemplateItems);
2302
- }
2303
- return [4 /*yield*/, (0, exports.parsedLiquidToHtml)(parsedTemplateItems, options)];
2304
- case 2:
2305
- html = _a.sent();
2306
- return [4 /*yield*/, getShopifyAsset('config/settings_data.json', options)];
2307
- case 3:
2308
- themeAsset = _a.sent();
2309
- themeSettings = typeof themeAsset === 'string' && (0, lodash_1.attempt)(function () { return JSON.parse(themeAsset); });
2310
- if (themeSettings && !(0, lodash_1.isError)(themeSettings) && options.importSections !== false) {
2311
- serialized = serializeBlock({
2312
- layerName: "Theme Settings",
2313
- component: {
2314
- name: 'Shopify:ThemeProvider',
2315
- options: {
2316
- shopifyMetafields: [{ path: 'state.settings', as: '_theme_settings' }],
2317
- state: {
2318
- settings: mapArrays((0, lodash_1.omit)(themeSettings.current, 'sections')),
2319
- },
2320
- },
2321
- },
2322
- }, false);
2323
- html = "".concat(serialized).concat(html).concat(serializedBlockCloseTag);
2324
- }
2325
- if (options.log) {
2326
- console.log('liquidToBuilder: html', { html: html });
2327
- }
2328
- htmlNodes = (0, exports.htmlToAst)(html).htmlNodes;
2329
- if (options.log) {
2330
- console.log('liquidToBuilder: parsed html', htmlNodes);
2331
- }
2332
- return [4 /*yield*/, (0, exports.processedAstToBuilder)(htmlNodes, options)];
2333
- case 4:
2334
- blocks = (_a.sent()).blocks;
2335
- if (Array.isArray(scriptsInLiquid) && scriptsInLiquid.length > 0) {
2336
- blocks.push(el({
2337
- layerName: 'Imported Script',
2338
- component: {
2339
- name: 'Custom Code',
2340
- options: {
2341
- code: scriptsInLiquid.join(''),
2342
- replaceNodes: true,
2343
- },
2344
- },
2345
- }));
2346
- }
2347
- if (options.importSections !== false) {
2348
- // TODO: special option for this
2349
- // blocks.unshift(
2350
- // el({
2351
- // layerName: 'BuiltWithBuilder flag',
2352
- // component: {
2353
- // name: 'Custom Code',
2354
- // options: {
2355
- // code: '<script>window.builtWithBuilder = true</script>',
2356
- // },
2357
- // },
2358
- // }),
2359
- // );
2360
- }
2361
- if (options.log) {
2362
- console.log('liquidToBuilder: blocks', JSON.stringify(blocks));
2363
- }
2364
- return [2 /*return*/, blocks];
2365
- }
2366
- });
2367
- });
2368
- };
2369
- exports.liquidToBuilder = liquidToBuilder;
2370
- var htmlToBuilder = function (html) { return __awaiter(void 0, void 0, void 0, function () {
2371
- var htmlNodes, blocks;
2372
- return __generator(this, function (_a) {
2373
- switch (_a.label) {
2374
- case 0:
2375
- htmlNodes = (0, exports.htmlToAst)(html).htmlNodes;
2376
- console.log('procesed', htmlNodes);
2377
- return [4 /*yield*/, (0, exports.processedAstToBuilder)(htmlNodes, {})];
2378
- case 1:
2379
- blocks = (_a.sent()).blocks;
2380
- console.log('blocks', blocks);
2381
- return [2 /*return*/, blocks];
2382
- }
2383
- });
2384
- }); };
2385
- exports.htmlToBuilder = htmlToBuilder;
2386
- var bindingsFromAttrs = function (node, bindings, properties, options) { return __awaiter(void 0, void 0, void 0, function () {
2387
- var getIndexOfClosingTag, getConditionalValue, parseAttrsInRange;
2388
- return __generator(this, function (_a) {
2389
- switch (_a.label) {
2390
- case 0:
2391
- getIndexOfClosingTag = function (start, closingTags) {
2392
- var i = start;
2393
- var cursor = 1;
2394
- while (i < node.attrsList.length) {
2395
- var name_10 = node.attrsList[i].name;
2396
- if (name_10 === '[if]') {
2397
- if (!closingTags.includes('[else]')) {
2398
- throw new Error('if after else');
2399
- }
2400
- cursor++;
2401
- }
2402
- if (closingTags.includes(name_10)) {
2403
- cursor--;
2404
- if (cursor === 0) {
2405
- return i;
2406
- }
2407
- }
2408
- i++;
2409
- }
2410
- throw new Error("".concat(cursor, " no matching closing tag"));
2411
- };
2412
- getConditionalValue = function (conditions, value, defaultValue) {
2413
- return conditions.length > 0
2414
- ? "/*start*/".concat(conditions
2415
- .map(function (c) { return "".concat(c.negate ? '!' : '').concat(liquidConditionTemplate(c.expression)); })
2416
- .join('&&') + " ? ".concat(value, " : (").concat(defaultValue, ")"), "/*end*/")
2417
- : value;
2418
- };
2419
- parseAttrsInRange = function (start, end, conditions) { return __awaiter(void 0, void 0, void 0, function () {
2420
- var i, keyForImage, _a, name_11, value, key, jump, stuff, elseConditions, liquidStr, useKey, parsed, parsedValue, translation, useKey;
2421
- return __generator(this, function (_b) {
2422
- switch (_b.label) {
2423
- case 0:
2424
- i = start;
2425
- keyForImage = '';
2426
- _b.label = 1;
2427
- case 1:
2428
- if (!(i < end)) return [3 /*break*/, 15];
2429
- _a = node.attrsList[i], name_11 = _a.name, value = _a.value;
2430
- key = name_11;
2431
- jump = 1;
2432
- if (!hasTag(key)) return [3 /*break*/, 10];
2433
- stuff = JSON.parse(htmlDecode(value));
2434
- if (!(key === '[if]')) return [3 /*break*/, 3];
2435
- jump = getIndexOfClosingTag(i + 1, ['[endif]']);
2436
- return [4 /*yield*/, parseAttrsInRange(i + 1, jump, conditions.concat([{ expression: stuff.cond, negate: stuff.negate }]))];
2437
- case 2:
2438
- _b.sent();
2439
- return [3 /*break*/, 9];
2440
- case 3:
2441
- if (!(key === '[unless]')) return [3 /*break*/, 5];
2442
- jump = getIndexOfClosingTag(i + 1, ['[endunless]']);
2443
- return [4 /*yield*/, parseAttrsInRange(i + 1, jump, conditions.concat([{ expression: stuff.cond, negate: true }]))];
2444
- case 4:
2445
- _b.sent();
2446
- return [3 /*break*/, 9];
2447
- case 5:
2448
- if (!(key === '[else]')) return [3 /*break*/, 7];
2449
- jump = getIndexOfClosingTag(i + 1, ['[endif]']);
2450
- return [4 /*yield*/, parseAttrsInRange(i + 1, jump, conditions.map(function (cond) { return (__assign(__assign({}, cond), { negate: !cond.negate })); }))];
2451
- case 6:
2452
- _b.sent();
2453
- return [3 /*break*/, 9];
2454
- case 7:
2455
- if (!(key === '[elsif]')) return [3 /*break*/, 9];
2456
- jump = getIndexOfClosingTag(i + 1, ['[elsif]', '[endif]']);
2457
- elseConditions = conditions.map(function (cond) { return (__assign(__assign({}, cond), { negate: !cond.negate })); });
2458
- return [4 /*yield*/, parseAttrsInRange(i + 1, jump, elseConditions.concat([{ expression: stuff.cond }]))];
2459
- case 8:
2460
- _b.sent();
2461
- _b.label = 9;
2462
- case 9: return [3 /*break*/, 14];
2463
- case 10:
2464
- if (!hasTag(value)) return [3 /*break*/, 13];
2465
- liquidStr = stringWithBindingsToLiquid(value);
2466
- // Remove trailing semi-colon because the liquid render function does not know how to handle it
2467
- liquidStr = liquidStr === null || liquidStr === void 0 ? void 0 : liquidStr.replace(/;$/, '');
2468
- useKey = key;
2469
- if ((keyForImage == key || (!keyForImage && (key === 'src' || key === 'data-src'))) &&
2470
- node.tag === 'img') {
2471
- useKey = 'component.options.image';
2472
- keyForImage = key;
2473
- }
2474
- if (key === 'data-srcset' && node.tag === 'img') {
2475
- useKey = 'srcset';
2476
- }
2477
- if (useKey === 'style') {
2478
- useKey = 'attr.style';
2479
- }
2480
- bindings[useKey] = getConditionalValue(conditions, liquidRenderTemplate(liquidStr), bindings[useKey]);
2481
- parsed = parseTag(value);
2482
- if (!(parsed && parsed.value && parsed.name === 'output')) return [3 /*break*/, 12];
2483
- parsedValue = JSON.parse(parsed.value);
2484
- return [4 /*yield*/, getTranslation(parsedValue, options)];
2485
- case 11:
2486
- translation = _b.sent();
2487
- if (translation !== null) {
2488
- if (conditions.length === 0) {
2489
- delete bindings[key];
2490
- properties[key] = translation;
2491
- }
2492
- else {
2493
- bindings[key] = getConditionalValue(conditions, "'".concat(translation, "'"), bindings[key]);
2494
- }
2495
- }
2496
- _b.label = 12;
2497
- case 12: return [3 /*break*/, 14];
2498
- case 13:
2499
- if (key === 'style' && conditions.length === 0) {
2500
- if (!properties.attr) {
2501
- // TODO: use another property? hm
2502
- properties.attr = {};
2503
- }
2504
- properties.attr.style = value;
2505
- console.warn('skipping style', value);
2506
- }
2507
- else if (key.includes('[')) {
2508
- console.warn('Found property key with [', key);
2509
- }
2510
- else {
2511
- if (conditions.length > 0) {
2512
- useKey = key === 'style' ? 'attr.style' : key;
2513
- bindings[useKey] = getConditionalValue(conditions, "'".concat(value, "'"), bindings[useKey]);
2514
- }
2515
- else {
2516
- properties[key] = value;
2517
- }
2518
- // TEMP HACK FOR LAZY IMAGES
2519
- if (key === 'data-src') {
2520
- properties.src = value;
2521
- }
2522
- }
2523
- _b.label = 14;
2524
- case 14:
2525
- i += jump;
2526
- return [3 /*break*/, 1];
2527
- case 15: return [2 /*return*/];
2528
- }
2529
- });
2530
- }); };
2531
- return [4 /*yield*/, parseAttrsInRange(0, node.attrsList.length, [])];
2532
- case 1:
2533
- _a.sent();
2534
- return [2 /*return*/];
2535
- }
2536
- });
2537
- }); };
2538
- exports.bindingsFromAttrs = bindingsFromAttrs;