@sealcode/jdd-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/.arcconfig +12 -0
  2. package/.arclint +18 -0
  3. package/.eslintrc.js +37 -0
  4. package/.mocharc.js +6 -0
  5. package/.nycrc +6 -0
  6. package/.prettierrc +14 -0
  7. package/@types/component-preview-actions.d.ts +43 -0
  8. package/@types/components.sreact.d.ts +48 -0
  9. package/@types/controllers/autogrow-textarea.stimulus.d.ts +5 -0
  10. package/@types/controllers/component-debugger.stimulus.d.ts +28 -0
  11. package/@types/controllers/exportable-textarea.stimulus.d.ts +7 -0
  12. package/@types/controllers/input-image-preview.stimulus.d.ts +5 -0
  13. package/@types/controllers/jdd-table-paste.stimulus.d.ts +8 -0
  14. package/@types/controllers/json-editor.stimulus.d.ts +9 -0
  15. package/@types/controllers/markdown-textarea.stimulus.d.ts +20 -0
  16. package/@types/controllers/refresh-on-ts-changes.stimulus.d.ts +6 -0
  17. package/@types/controllers/refresh-styles.stimulus.d.ts +6 -0
  18. package/@types/controllers/submit-on-input.stimulus.d.ts +7 -0
  19. package/@types/controllers/toast.stimulus.d.ts +4 -0
  20. package/@types/edit-jdd-field.d.ts +22 -0
  21. package/@types/index.d.ts +2 -0
  22. package/@types/inputs/component-input-enum.d.ts +8 -0
  23. package/@types/inputs/component-input-image.d.ts +15 -0
  24. package/@types/inputs/component-input-list.d.ts +15 -0
  25. package/@types/inputs/component-input-single-reference.d.ts +11 -0
  26. package/@types/inputs/component-input-structured.d.ts +15 -0
  27. package/@types/inputs/component-input-table.d.ts +15 -0
  28. package/@types/inputs/component-input.d.ts +16 -0
  29. package/@types/inputs/print-arg-path.d.ts +1 -0
  30. package/@types/jdd-creator.d.ts +49 -0
  31. package/@types/jdd-page.d.ts +85 -0
  32. package/assets/icons/table-add-column-right.svg +1 -0
  33. package/assets/icons/table-add-row-below.svg +1 -0
  34. package/assets/icons/table-add-row-header-below.svg +1 -0
  35. package/assets/icons/table-delete-column.svg +1 -0
  36. package/assets/icons/table-delete-row.svg +1 -0
  37. package/assets/icons/table-move-column-right.svg +1 -0
  38. package/assets/icons/table-move-row-down.svg +1 -0
  39. package/assets/icons/table-move-row-up.svg +1 -0
  40. package/assets/styles/component-admin-table.jdd-page.css +11 -0
  41. package/assets/styles/component-debugger.jdd-page.css +71 -0
  42. package/assets/styles/components.jdd-page.css +286 -0
  43. package/assets/styles/grow-wrap.css +33 -0
  44. package/assets/styles/markdown-editor.css +42 -0
  45. package/dist/src/autogrow-textarea.stimulus.js +13 -0
  46. package/dist/src/autogrow-textarea.stimulus.js.map +7 -0
  47. package/dist/src/component-debugger.stimulus.js +190 -0
  48. package/dist/src/component-debugger.stimulus.js.map +7 -0
  49. package/dist/src/component-preview-actions.js +439 -0
  50. package/dist/src/component-preview-actions.js.map +7 -0
  51. package/dist/src/components.sreact.js +93 -0
  52. package/dist/src/components.sreact.js.map +7 -0
  53. package/dist/src/controllers/autogrow-textarea.stimulus.js +13 -0
  54. package/dist/src/controllers/autogrow-textarea.stimulus.js.map +7 -0
  55. package/dist/src/controllers/component-debugger.stimulus.js +193 -0
  56. package/dist/src/controllers/component-debugger.stimulus.js.map +7 -0
  57. package/dist/src/controllers/exportable-textarea.stimulus.js +71 -0
  58. package/dist/src/controllers/exportable-textarea.stimulus.js.map +7 -0
  59. package/dist/src/controllers/input-image-preview.stimulus.js +30 -0
  60. package/dist/src/controllers/input-image-preview.stimulus.js.map +7 -0
  61. package/dist/src/controllers/jdd-table-paste.stimulus.js +78 -0
  62. package/dist/src/controllers/jdd-table-paste.stimulus.js.map +7 -0
  63. package/dist/src/controllers/json-editor.stimulus.js +114 -0
  64. package/dist/src/controllers/json-editor.stimulus.js.map +7 -0
  65. package/dist/src/controllers/markdown-textarea.stimulus.js +174 -0
  66. package/dist/src/controllers/markdown-textarea.stimulus.js.map +7 -0
  67. package/dist/src/controllers/refresh-on-ts-changes.stimulus.js +90 -0
  68. package/dist/src/controllers/refresh-on-ts-changes.stimulus.js.map +7 -0
  69. package/dist/src/controllers/refresh-styles.stimulus.js +67 -0
  70. package/dist/src/controllers/refresh-styles.stimulus.js.map +7 -0
  71. package/dist/src/controllers/submit-on-input.stimulus.js +55 -0
  72. package/dist/src/controllers/submit-on-input.stimulus.js.map +7 -0
  73. package/dist/src/controllers/toast.stimulus.js +19 -0
  74. package/dist/src/controllers/toast.stimulus.js.map +7 -0
  75. package/dist/src/edit-jdd-field.js +94 -0
  76. package/dist/src/edit-jdd-field.js.map +7 -0
  77. package/dist/src/exportable-textarea.stimulus.js +71 -0
  78. package/dist/src/exportable-textarea.stimulus.js.map +7 -0
  79. package/dist/src/index.js +3 -0
  80. package/dist/src/index.js.map +7 -0
  81. package/dist/src/input-image-preview.stimulus.js +30 -0
  82. package/dist/src/input-image-preview.stimulus.js.map +7 -0
  83. package/dist/src/inputs/component-input-enum.js +30 -0
  84. package/dist/src/inputs/component-input-enum.js.map +7 -0
  85. package/dist/src/inputs/component-input-image.js +58 -0
  86. package/dist/src/inputs/component-input-image.js.map +7 -0
  87. package/dist/src/inputs/component-input-list.js +74 -0
  88. package/dist/src/inputs/component-input-list.js.map +7 -0
  89. package/dist/src/inputs/component-input-single-reference.js +31 -0
  90. package/dist/src/inputs/component-input-single-reference.js.map +7 -0
  91. package/dist/src/inputs/component-input-structured.js +36 -0
  92. package/dist/src/inputs/component-input-structured.js.map +7 -0
  93. package/dist/src/inputs/component-input-table.js +228 -0
  94. package/dist/src/inputs/component-input-table.js.map +7 -0
  95. package/dist/src/inputs/component-input.js +129 -0
  96. package/dist/src/inputs/component-input.js.map +7 -0
  97. package/dist/src/inputs/print-arg-path.js +7 -0
  98. package/dist/src/inputs/print-arg-path.js.map +7 -0
  99. package/dist/src/jdd-creator.js +131 -0
  100. package/dist/src/jdd-creator.js.map +7 -0
  101. package/dist/src/jdd-page.js +339 -0
  102. package/dist/src/jdd-page.js.map +7 -0
  103. package/dist/src/jdd-table-paste.stimulus.js +78 -0
  104. package/dist/src/jdd-table-paste.stimulus.js.map +7 -0
  105. package/dist/src/json-editor.stimulus.js +114 -0
  106. package/dist/src/json-editor.stimulus.js.map +7 -0
  107. package/dist/src/markdown-textarea.stimulus.js +174 -0
  108. package/dist/src/markdown-textarea.stimulus.js.map +7 -0
  109. package/dist/src/submit-on-input.stimulus.js +55 -0
  110. package/dist/src/submit-on-input.stimulus.js.map +7 -0
  111. package/dist/src/toast.stimulus.js +19 -0
  112. package/dist/src/toast.stimulus.js.map +7 -0
  113. package/esbuild.cjs +20 -0
  114. package/esbuild.js +23 -0
  115. package/jenkins.sanity.sh +3 -0
  116. package/lib/component-preview-actions.js +286 -0
  117. package/lib/component-preview-actions.js.map +1 -0
  118. package/lib/components.sreact.js +102 -0
  119. package/lib/components.sreact.js.map +1 -0
  120. package/lib/controllers/autogrow-textarea.stimulus.js +15 -0
  121. package/lib/controllers/autogrow-textarea.stimulus.js.map +1 -0
  122. package/lib/controllers/component-debugger.stimulus.js +188 -0
  123. package/lib/controllers/component-debugger.stimulus.js.map +1 -0
  124. package/lib/controllers/exportable-textarea.stimulus.js +79 -0
  125. package/lib/controllers/exportable-textarea.stimulus.js.map +1 -0
  126. package/lib/controllers/input-image-preview.stimulus.js +28 -0
  127. package/lib/controllers/input-image-preview.stimulus.js.map +1 -0
  128. package/lib/controllers/jdd-table-paste.stimulus.js +84 -0
  129. package/lib/controllers/jdd-table-paste.stimulus.js.map +1 -0
  130. package/lib/controllers/json-editor.stimulus.js +134 -0
  131. package/lib/controllers/json-editor.stimulus.js.map +1 -0
  132. package/lib/controllers/markdown-textarea.stimulus.js +186 -0
  133. package/lib/controllers/markdown-textarea.stimulus.js.map +1 -0
  134. package/lib/controllers/refresh-on-ts-changes.stimulus.js +123 -0
  135. package/lib/controllers/refresh-on-ts-changes.stimulus.js.map +1 -0
  136. package/lib/controllers/refresh-styles.stimulus.js +66 -0
  137. package/lib/controllers/refresh-styles.stimulus.js.map +1 -0
  138. package/lib/controllers/submit-on-input.stimulus.js +48 -0
  139. package/lib/controllers/submit-on-input.stimulus.js.map +1 -0
  140. package/lib/controllers/toast.stimulus.js +16 -0
  141. package/lib/controllers/toast.stimulus.js.map +1 -0
  142. package/lib/edit-jdd-field.js +102 -0
  143. package/lib/edit-jdd-field.js.map +1 -0
  144. package/lib/index.js +19 -0
  145. package/lib/index.js.map +1 -0
  146. package/lib/inputs/component-input-enum.js +25 -0
  147. package/lib/inputs/component-input-enum.js.map +1 -0
  148. package/lib/inputs/component-input-image.js +47 -0
  149. package/lib/inputs/component-input-image.js.map +1 -0
  150. package/lib/inputs/component-input-list.js +61 -0
  151. package/lib/inputs/component-input-list.js.map +1 -0
  152. package/lib/inputs/component-input-single-reference.js +36 -0
  153. package/lib/inputs/component-input-single-reference.js.map +1 -0
  154. package/lib/inputs/component-input-structured.js +42 -0
  155. package/lib/inputs/component-input-structured.js.map +1 -0
  156. package/lib/inputs/component-input-table.js +184 -0
  157. package/lib/inputs/component-input-table.js.map +1 -0
  158. package/lib/inputs/component-input.js +133 -0
  159. package/lib/inputs/component-input.js.map +1 -0
  160. package/lib/inputs/print-arg-path.js +7 -0
  161. package/lib/inputs/print-arg-path.js.map +1 -0
  162. package/lib/jdd-creator.js +113 -0
  163. package/lib/jdd-creator.js.map +1 -0
  164. package/lib/jdd-page.js +310 -0
  165. package/lib/jdd-page.js.map +1 -0
  166. package/package.json +61 -0
  167. package/src/component-preview-actions.ts +520 -0
  168. package/src/components.sreact.ts +100 -0
  169. package/src/controllers/autogrow-textarea.stimulus.ts +13 -0
  170. package/src/controllers/component-debugger.stimulus.ts +247 -0
  171. package/src/controllers/exportable-textarea.stimulus.ts +77 -0
  172. package/src/controllers/input-image-preview.stimulus.ts +29 -0
  173. package/src/controllers/jdd-table-paste.stimulus.ts +89 -0
  174. package/src/controllers/json-editor.stimulus.ts +127 -0
  175. package/src/controllers/markdown-textarea.stimulus.ts +198 -0
  176. package/src/controllers/refresh-on-ts-changes.stimulus.ts +112 -0
  177. package/src/controllers/refresh-styles.stimulus.ts +70 -0
  178. package/src/controllers/submit-on-input.stimulus.ts +66 -0
  179. package/src/controllers/toast.stimulus.ts +15 -0
  180. package/src/edit-jdd-field.ts +127 -0
  181. package/src/index.ts +2 -0
  182. package/src/inputs/component-input-enum.ts +36 -0
  183. package/src/inputs/component-input-image.ts +70 -0
  184. package/src/inputs/component-input-list.ts +91 -0
  185. package/src/inputs/component-input-single-reference.ts +45 -0
  186. package/src/inputs/component-input-structured.ts +51 -0
  187. package/src/inputs/component-input-table.ts +262 -0
  188. package/src/inputs/component-input.ts +158 -0
  189. package/src/inputs/print-arg-path.ts +3 -0
  190. package/src/jdd-creator.ts +151 -0
  191. package/src/jdd-page.ts +439 -0
  192. package/tsconfig.json +24 -0
@@ -0,0 +1,339 @@
1
+ import { documentContainerFromParsed } from "@sealcode/jdd";
2
+ import { JDD } from "@sealcode/jdd";
3
+ import { StatefulPage } from "@sealcode/sealgen";
4
+ import { hasFieldOfType, hasShape, predicates } from "@sealcode/ts-predicates";
5
+ import { tempstream } from "tempstream";
6
+ import { ComponentInput } from "./inputs/component-input.js";
7
+ import { ComponentPreviewActions } from "./component-preview-actions.js";
8
+ const actionName = "Components";
9
+ class JDDPage extends StatefulPage {
10
+ constructor(args) {
11
+ super();
12
+ this.actions = ComponentPreviewActions;
13
+ this.previewSizes = ["320", "600", "800", "1024", "1300", "1920"];
14
+ this.classes = [];
15
+ this.registry = args.registry;
16
+ this.makeJDDContext = args.makeJDDContext;
17
+ this.defaultHead = args.defaultHead;
18
+ this.html = args.html;
19
+ this.makeAssetURL = args.makeAssetURL || ((str) => `/dist/jdd-page/${str.startsWith("/") ? str.slice(1) : str}`);
20
+ }
21
+ getRegistryComponents() {
22
+ return this.registry.getAll();
23
+ }
24
+ async getInitialState(ctx) {
25
+ const all_components = Object.entries(this.getRegistryComponents());
26
+ const first_component = all_components[0];
27
+ if (!first_component) {
28
+ throw new Error("No defined components!");
29
+ }
30
+ const [component_name, component] = first_component;
31
+ const initial_state = {
32
+ components: [
33
+ {
34
+ component_name,
35
+ args: await component.getExampleValues(
36
+ this.makeJDDContext(ctx)
37
+ )
38
+ }
39
+ ]
40
+ };
41
+ return initial_state;
42
+ }
43
+ wrapInLayout(ctx, content, state) {
44
+ const jdd = new JDD(
45
+ this.registry,
46
+ this.makeJDDContext(ctx),
47
+ documentContainerFromParsed(state.components)
48
+ );
49
+ return this.html({
50
+ ctx,
51
+ title: "Components",
52
+ body: content,
53
+ description: "",
54
+ css_clumps: ["jdd-page", ...jdd.getAllCSSClumps()],
55
+ htmlOptions: {
56
+ morphing: true,
57
+ preserveScroll: true,
58
+ autoRefreshCSS: false,
59
+ navbar: () => ``,
60
+ bodyClasses: ["jdd-editor"],
61
+ showBottomNavbar: false,
62
+ showBanner: false,
63
+ showFooter: false,
64
+ loadHamburgerMenu: false,
65
+ loadSearchModal: false
66
+ },
67
+ makeHead: (...args) => tempstream`${this.defaultHead(...args)}
68
+ <link
69
+ href="/dist/jdd-page.entrypoint.css"
70
+ rel="stylesheet"
71
+ type="text/css"
72
+ />
73
+ ${jdd.renderEarlyAssets()}`
74
+ });
75
+ }
76
+ async preprocessOverrides(_ctx, state, overrides) {
77
+ const jdd_context = this.makeJDDContext(_ctx);
78
+ if (!hasFieldOfType(
79
+ "components",
80
+ overrides,
81
+ predicates.array(
82
+ predicates.shape({
83
+ args: predicates.object
84
+ })
85
+ )
86
+ )) {
87
+ return {};
88
+ }
89
+ for (const [component_index, { component_name }] of Object.entries(
90
+ state.components
91
+ )) {
92
+ const component = this.registry.get(component_name);
93
+ if (!component) {
94
+ throw new Error(`Unknown component: ${component_name}`);
95
+ }
96
+ const overrides_for_component = overrides.components[parseInt(component_index)] || { args: {} };
97
+ const promises = Object.entries(component.getArguments()).map(
98
+ async ([arg_name, arg]) => {
99
+ const value = overrides_for_component.args[arg_name];
100
+ if (value) {
101
+ const new_value = await arg.receivedToParsed(
102
+ jdd_context,
103
+ value
104
+ );
105
+ overrides_for_component.args[arg_name] = new_value;
106
+ }
107
+ }
108
+ );
109
+ await Promise.all(promises);
110
+ }
111
+ return overrides;
112
+ }
113
+ renderComponentArgs(ctx, state, component, args, index) {
114
+ const jdd_context = this.makeJDDContext(ctx);
115
+ return tempstream`<div
116
+ class="component-preview-parameters"
117
+ id="${`component-preview-parameters--${index}`}"
118
+ >
119
+ ${Object.entries(component.getArguments()).map(
120
+ async ([arg_name, arg]) => ComponentInput({
121
+ state,
122
+ arg_path: [
123
+ "components",
124
+ index.toString(),
125
+ "args",
126
+ arg_name
127
+ ],
128
+ ctx,
129
+ arg,
130
+ value: args[arg_name] === void 0 ? arg.getExampleValue(jdd_context) : args[arg_name],
131
+ page: this,
132
+ makeJDDContext: this.makeJDDContext,
133
+ makeAssetURL: this.makeAssetURL
134
+ })
135
+ )}
136
+ </div>`;
137
+ }
138
+ renderComponentBlock(ctx, state, {
139
+ component_name,
140
+ args: component_args
141
+ }, component_index) {
142
+ const component = this.registry.get(component_name);
143
+ if (!component) {
144
+ return null;
145
+ }
146
+ return this.renderComponentArgs(
147
+ ctx,
148
+ state,
149
+ component,
150
+ component_args,
151
+ component_index
152
+ );
153
+ }
154
+ async serializeState(ctx, state, pretty = false) {
155
+ console.time("serializing state");
156
+ const serialized_components = await Promise.all(
157
+ state.components.map(async ({ component_name, args }) => {
158
+ const component = this.registry.get(component_name);
159
+ const single_result = {
160
+ component_name,
161
+ args: component ? await component.convertParsedToStorage(
162
+ this.makeJDDContext(ctx),
163
+ args
164
+ ) : {}
165
+ };
166
+ return single_result;
167
+ })
168
+ );
169
+ const serialized_state = JSON.stringify(
170
+ { components: serialized_components },
171
+ null,
172
+ pretty ? 4 : ""
173
+ );
174
+ console.timeEnd("serializing state");
175
+ return serialized_state;
176
+ }
177
+ async deserializeState(ctx, state_string) {
178
+ const jdd_context = this.makeJDDContext(ctx);
179
+ const raw = JSON.parse(state_string);
180
+ const components_storage = raw.components;
181
+ if (!Array.isArray(components_storage)) {
182
+ throw new Error(
183
+ "'components' key is not an array, got ${components_storage}"
184
+ );
185
+ }
186
+ const components_parsed = await Promise.all(
187
+ components_storage.map(async (entry) => {
188
+ if (!hasShape(
189
+ {
190
+ component_name: predicates.string,
191
+ args: predicates.object
192
+ },
193
+ entry
194
+ )) {
195
+ throw new Error(
196
+ `Expected components[] items to be objects with 'component_name' and 'args' keys, got ${entry}`
197
+ );
198
+ }
199
+ const { component_name, args } = entry;
200
+ const component = this.registry.get(component_name);
201
+ if (!component) {
202
+ throw new Error("Unknown component: ${component_name}");
203
+ }
204
+ return {
205
+ component_name,
206
+ args: await component.convertStorageToParsed(
207
+ jdd_context,
208
+ args
209
+ )
210
+ };
211
+ })
212
+ );
213
+ const result = { components: components_parsed };
214
+ return result;
215
+ }
216
+ renderPreParameterButtons(_ctx, _state) {
217
+ return "";
218
+ }
219
+ renderMessages(_ctx, state) {
220
+ return `<ul
221
+ class="jdd-editor__messages"
222
+ data-controller="toast"
223
+ >
224
+ ${(state.messages || []).map(
225
+ (e) => `<li class="jdd-editor__message">${e}</li>`
226
+ )}
227
+ </ul>`;
228
+ }
229
+ async render(ctx, state) {
230
+ return tempstream`<div
231
+ class="${["two-column", "component-debugger", ...this.classes].join(
232
+ " "
233
+ )}"
234
+ id="component-debugger"
235
+ style="${`--resizable-column-width: ${state.preview_size ? state.preview_size + "px" : "50vw"}`}"
236
+ data-controller="component-debugger"
237
+ >
238
+ <div class="component-arguments" id="component-arguments">
239
+ ${this.renderPreParameterButtons(ctx, state)}
240
+ ${this.renderParameterButtons(state)}
241
+ ${this.renderMessages(ctx, state)}
242
+ ${state.components.map(
243
+ (component, component_index) => this.renderComponentBlock(
244
+ ctx,
245
+ state,
246
+ component,
247
+ component_index
248
+ )
249
+ )}
250
+ <details
251
+ class="component-debugger__json"
252
+ data-controller="exportable-textarea"
253
+ id="exportable-textarea"
254
+ open
255
+ >
256
+ <summary>Edit/Export raw JSON</summary>
257
+ <textarea
258
+ name="state_override"
259
+ rows="40"
260
+ cols="40"
261
+ data-controller="json-editor"
262
+ id="component-debugger-json-textarea"
263
+ autocomplete="off"
264
+ >
265
+ ${(await this.serializeState(ctx, state, true)).replaceAll("<", "&lt;")}
266
+ </textarea
267
+ >
268
+ ${this.makeActionButton(state, {
269
+ action: "replace_state",
270
+ label: "Apply"
271
+ })}
272
+ <button data-action="exportable-textarea#copy">Copy</button>
273
+ <button data-action="exportable-textarea#download">
274
+ Download
275
+ </button>
276
+ <input type="file" />${" "}
277
+ <button data-action="exportable-textarea#import">
278
+ Import
279
+ </button>
280
+ </details>
281
+ </div>
282
+ <div
283
+ id="resize-gutter"
284
+ class="resize-gutter"
285
+ data-component-debugger-target="gutter"
286
+ ></div>
287
+ <div
288
+ id="component-preview"
289
+ class="component-preview"
290
+ data-component-debugger-target="preview"
291
+ >
292
+ <div
293
+ id="component-preview__header"
294
+ class="component-preview__header"
295
+ >
296
+ <span>Preview</span>
297
+ <select
298
+ name="$[preview_size]"
299
+ autocomplete="off"
300
+ class="component-preview-size-select"
301
+ data-component-debugger-target="sizeSelect"
302
+ data-action="change->component-debugger#handleWidthDropdown"
303
+ data-turbo-data-turbo-permanent
304
+ >
305
+ ${state.preview_size ? `<option
306
+ class="dynamic"
307
+ value="${state.preview_size}"
308
+ selected
309
+ >
310
+ ${state.preview_size} px
311
+ </option>` : ""}
312
+ ${this.previewSizes.map(
313
+ (size) => `<option value="${size}">
314
+ ${`${size} px`}
315
+ </option>`
316
+ )}
317
+ </select>
318
+ <noscript>
319
+ ${this.makeActionButton(state, "change_size")}
320
+ </noscript>
321
+ </div>
322
+ <div class="jdd-outer-container">
323
+ <div class="jdd-container">
324
+ ${JDD.render(
325
+ this.registry,
326
+ documentContainerFromParsed(state.components),
327
+ this.makeJDDContext(ctx)
328
+ )}
329
+ </div>
330
+ </div>
331
+ </div>
332
+ </div>`;
333
+ }
334
+ }
335
+ export {
336
+ actionName,
337
+ JDDPage as default
338
+ };
339
+ //# sourceMappingURL=jdd-page.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jdd-page.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/restrict-template-expressions */\nimport type { Readable } from \"node:stream\";\nimport type { Component, JDDContext, RawJDDocument } from \"@sealcode/jdd\";\nimport { documentContainerFromParsed, Registry } from \"@sealcode/jdd\";\nimport { JDD } from \"@sealcode/jdd\";\nimport { StatefulPage } from \"@sealcode/sealgen\";\nimport { hasFieldOfType, hasShape, predicates } from \"@sealcode/ts-predicates\";\nimport type { Context } from \"koa\";\nimport type { FlatTemplatable, Templatable } from \"tempstream\";\nimport { tempstream } from \"tempstream\";\nimport { ComponentInput } from \"./inputs/component-input.js\";\nimport { ComponentPreviewActions } from \"./component-preview-actions.js\";\n\nexport const actionName = \"Components\";\n\nexport type JDDPageState = {\n\tcomponents: RawJDDocument;\n\tpreview_size?: string;\n\tmessages?: string[];\n};\n\nexport default abstract class JDDPage extends StatefulPage<\n\tJDDPageState,\n\ttypeof ComponentPreviewActions\n> {\n\tactions = ComponentPreviewActions;\n\n\tpreviewSizes = [\"320\", \"600\", \"800\", \"1024\", \"1300\", \"1920\"];\n\tclasses: string[] = [];\n\n\tpublic registry: Registry;\n\tpublic makeJDDContext: (ctx: Context) => JDDContext;\n\tpublic html: (\n\t\targs: unknown\n\t) => string | Promise<string> | Readable | Promise<Readable>;\n\tpublic defaultHead: (\n\t\t...args: unknown[]\n\t) => string | Promise<string> | Readable | Promise<Readable>;\n\tpublic makeAssetURL: (asset: string) => string;\n\n\tconstructor(args: {\n\t\tregistry: Registry;\n\t\tmakeJDDContext: (ctx: Context) => JDDContext;\n\t\thtml: (\n\t\t\targs: unknown\n\t\t) => string | Promise<string> | Readable | Promise<Readable>;\n\t\tdefaultHead: (\n\t\t\t...args: unknown[]\n\t\t) => string | Promise<string> | Readable | Promise<Readable>;\n\t\tmakeAssetURL?: (asset: string) => string;\n\t}) {\n\t\tsuper();\n\t\tthis.registry = args.registry;\n\t\tthis.makeJDDContext = args.makeJDDContext;\n\t\tthis.defaultHead = args.defaultHead;\n\t\tthis.html = args.html;\n\t\tthis.makeAssetURL =\n\t\t\targs.makeAssetURL ||\n\t\t\t((str) =>\n\t\t\t\t`/dist/jdd-page/${str.startsWith(\"/\") ? str.slice(1) : str}`);\n\t}\n\n\tgetRegistryComponents() {\n\t\treturn this.registry.getAll();\n\t}\n\n\tasync getInitialState(ctx: Context) {\n\t\tconst all_components = Object.entries(this.getRegistryComponents());\n\t\tconst first_component = all_components[0];\n\t\tif (!first_component) {\n\t\t\tthrow new Error(\"No defined components!\");\n\t\t}\n\t\tconst [component_name, component] = first_component;\n\t\tconst initial_state = {\n\t\t\tcomponents: [\n\t\t\t\t{\n\t\t\t\t\tcomponent_name: component_name,\n\t\t\t\t\targs: await component.getExampleValues(\n\t\t\t\t\t\tthis.makeJDDContext(ctx)\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\treturn initial_state;\n\t}\n\n\twrapInLayout(\n\t\tctx: Context,\n\t\tcontent: Templatable,\n\t\tstate: JDDPageState\n\t): Templatable {\n\t\tconst jdd = new JDD(\n\t\t\tthis.registry,\n\t\t\tthis.makeJDDContext(ctx),\n\t\t\tdocumentContainerFromParsed(state.components)\n\t\t);\n\t\treturn this.html({\n\t\t\tctx,\n\t\t\ttitle: \"Components\",\n\t\t\tbody: content,\n\t\t\tdescription: \"\",\n\t\t\tcss_clumps: [\"jdd-page\", ...jdd.getAllCSSClumps()],\n\t\t\thtmlOptions: {\n\t\t\t\tmorphing: true,\n\t\t\t\tpreserveScroll: true,\n\t\t\t\tautoRefreshCSS: false,\n\t\t\t\tnavbar: () => ``,\n\t\t\t\tbodyClasses: [\"jdd-editor\"],\n\t\t\t\tshowBottomNavbar: false,\n\t\t\t\tshowBanner: false,\n\t\t\t\tshowFooter: false,\n\t\t\t\tloadHamburgerMenu: false,\n\t\t\t\tloadSearchModal: false,\n\t\t\t},\n\t\t\tmakeHead: (...args: unknown[]) =>\n\t\t\t\ttempstream/* HTML */ `${this.defaultHead(...args)}\n\t\t\t\t\t<link\n\t\t\t\t\t\thref=\"/dist/jdd-page.entrypoint.css\"\n\t\t\t\t\t\trel=\"stylesheet\"\n\t\t\t\t\t\ttype=\"text/css\"\n\t\t\t\t\t/>\n\t\t\t\t\t${jdd.renderEarlyAssets()}`,\n\t\t});\n\t}\n\n\tasync preprocessOverrides(\n\t\t_ctx: Context,\n\t\tstate: JDDPageState,\n\t\toverrides: Record<string, unknown>\n\t) {\n\t\tconst jdd_context = this.makeJDDContext(_ctx);\n\t\tif (\n\t\t\t!hasFieldOfType(\n\t\t\t\t\"components\",\n\t\t\t\toverrides,\n\t\t\t\tpredicates.array(\n\t\t\t\t\tpredicates.shape({\n\t\t\t\t\t\targs: predicates.object,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t)\n\t\t) {\n\t\t\treturn {};\n\t\t}\n\t\tfor (const [component_index, { component_name }] of Object.entries(\n\t\t\tstate.components\n\t\t)) {\n\t\t\tconst component = this.registry.get(component_name);\n\t\t\tif (!component) {\n\t\t\t\tthrow new Error(`Unknown component: ${component_name}`);\n\t\t\t}\n\t\t\tconst overrides_for_component = overrides.components[\n\t\t\t\tparseInt(component_index)\n\t\t\t] || { args: {} };\n\t\t\tconst promises = Object.entries(component.getArguments()).map(\n\t\t\t\tasync ([arg_name, arg]) => {\n\t\t\t\t\tconst value = overrides_for_component.args[arg_name];\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tconst new_value = await arg.receivedToParsed(\n\t\t\t\t\t\t\tjdd_context,\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t);\n\t\t\t\t\t\toverrides_for_component.args[arg_name] = new_value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tawait Promise.all(promises);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\treturn overrides;\n\t}\n\n\t// eslint-disable-next-line no-unused-vars\n\tabstract renderParameterButtons(_state: JDDPageState): FlatTemplatable;\n\n\trenderComponentArgs<C extends Component>(\n\t\tctx: Context,\n\t\tstate: JDDPageState,\n\t\tcomponent: C,\n\t\targs: Record<string, unknown>,\n\t\tindex: number\n\t): FlatTemplatable {\n\t\tconst jdd_context = this.makeJDDContext(ctx);\n\t\treturn tempstream/* HTML */ `<div\n\t\t\tclass=\"component-preview-parameters\"\n\t\t\tid=\"${`component-preview-parameters--${index}`}\"\n\t\t>\n\t\t\t${Object.entries(component.getArguments()).map(\n\t\t\t\tasync ([arg_name, arg]) =>\n\t\t\t\t\tComponentInput({\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\targ_path: [\n\t\t\t\t\t\t\t\"components\",\n\t\t\t\t\t\t\tindex.toString(),\n\t\t\t\t\t\t\t\"args\",\n\t\t\t\t\t\t\targ_name,\n\t\t\t\t\t\t],\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\targ,\n\t\t\t\t\t\tvalue:\n\t\t\t\t\t\t\targs[arg_name] === undefined\n\t\t\t\t\t\t\t\t? arg.getExampleValue(jdd_context)\n\t\t\t\t\t\t\t\t: args[arg_name],\n\t\t\t\t\t\tpage: this,\n\t\t\t\t\t\tmakeJDDContext: this.makeJDDContext,\n\t\t\t\t\t\tmakeAssetURL: this.makeAssetURL,\n\t\t\t\t\t})\n\t\t\t)}\n\t\t</div>`;\n\t}\n\n\trenderComponentBlock(\n\t\tctx: Context,\n\t\tstate: JDDPageState,\n\t\t{\n\t\t\tcomponent_name,\n\t\t\targs: component_args,\n\t\t}: {\n\t\t\tcomponent_name: string;\n\t\t\targs: Record<string, unknown>;\n\t\t},\n\t\tcomponent_index: number\n\t) {\n\t\tconst component = this.registry.get(component_name);\n\t\tif (!component) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.renderComponentArgs(\n\t\t\tctx,\n\t\t\tstate,\n\t\t\tcomponent,\n\t\t\tcomponent_args,\n\t\t\tcomponent_index\n\t\t);\n\t}\n\n\tasync serializeState(ctx: Context, state: JDDPageState, pretty = false) {\n\t\tconsole.time(\"serializing state\");\n\t\tconst serialized_components = await Promise.all(\n\t\t\tstate.components.map(async ({ component_name, args }) => {\n\t\t\t\tconst component = this.registry.get(component_name);\n\t\t\t\tconst single_result = {\n\t\t\t\t\tcomponent_name,\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n\t\t\t\t\targs: component\n\t\t\t\t\t\t? await component.convertParsedToStorage(\n\t\t\t\t\t\t\t\tthis.makeJDDContext(ctx),\n\t\t\t\t\t\t\t\targs\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: {},\n\t\t\t\t};\n\t\t\t\treturn single_result;\n\t\t\t})\n\t\t);\n\t\tconst serialized_state = JSON.stringify(\n\t\t\t{ components: serialized_components },\n\t\t\tnull,\n\t\t\tpretty ? 4 : \"\"\n\t\t);\n\t\tconsole.timeEnd(\"serializing state\");\n\t\treturn serialized_state;\n\t}\n\n\tasync deserializeState(ctx: Context, state_string: string) {\n\t\tconst jdd_context = this.makeJDDContext(ctx);\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tconst raw = JSON.parse(state_string);\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n\t\tconst components_storage = raw.components;\n\t\tif (!Array.isArray(components_storage)) {\n\t\t\tthrow new Error(\n\t\t\t\t\"'components' key is not an array, got ${components_storage}\"\n\t\t\t);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\tconst components_parsed = await Promise.all(\n\t\t\tcomponents_storage.map(async (entry) => {\n\t\t\t\tif (\n\t\t\t\t\t!hasShape(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcomponent_name: predicates.string,\n\t\t\t\t\t\t\targs: predicates.object,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tentry\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Expected components[] items to be objects with 'component_name' and 'args' keys, got ${entry}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst { component_name, args } = entry;\n\t\t\t\tconst component = this.registry.get(component_name);\n\t\t\t\tif (!component) {\n\t\t\t\t\tthrow new Error(\"Unknown component: ${component_name}\");\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcomponent_name,\n\t\t\t\t\targs: await component.convertStorageToParsed(\n\t\t\t\t\t\tjdd_context,\n\t\t\t\t\t\targs\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t})\n\t\t);\n\t\tconst result = { components: components_parsed };\n\t\treturn result;\n\t}\n\n\trenderPreParameterButtons(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t_ctx: Context,\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t_state: JDDPageState\n\t): FlatTemplatable | Promise<FlatTemplatable> {\n\t\treturn \"\";\n\t}\n\n\trenderMessages(_ctx: Context, state: JDDPageState) {\n\t\treturn /* HTML */ `<ul\n\t\t\tclass=\"jdd-editor__messages\"\n\t\t\tdata-controller=\"toast\"\n\t\t>\n\t\t\t${(state.messages || []).map(\n\t\t\t\t(e) => `<li class=\"jdd-editor__message\">${e}</li>`\n\t\t\t)}\n\t\t</ul>`;\n\t}\n\n\tasync render(ctx: Context, state: JDDPageState): Promise<string> {\n\t\treturn tempstream/* HTML */ `<div\n\t\t\tclass=\"${[\"two-column\", \"component-debugger\", ...this.classes].join(\n\t\t\t\t\" \"\n\t\t\t)}\"\n\t\t\tid=\"component-debugger\"\n\t\t\tstyle=\"${`--resizable-column-width: ${\n\t\t\t\tstate.preview_size ? state.preview_size + \"px\" : \"50vw\"\n\t\t\t}`}\"\n\t\t\tdata-controller=\"component-debugger\"\n\t\t>\n\t\t\t<div class=\"component-arguments\" id=\"component-arguments\">\n\t\t\t\t${this.renderPreParameterButtons(ctx, state)}\n\t\t\t\t${this.renderParameterButtons(state)}\n\t\t\t\t${this.renderMessages(ctx, state)}\n\t\t\t\t${state.components.map((component, component_index) =>\n\t\t\t\t\tthis.renderComponentBlock(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tcomponent,\n\t\t\t\t\t\tcomponent_index\n\t\t\t\t\t)\n\t\t\t\t)}\n\t\t\t\t<details\n\t\t\t\t\tclass=\"component-debugger__json\"\n\t\t\t\t\tdata-controller=\"exportable-textarea\"\n\t\t\t\t\tid=\"exportable-textarea\"\n\t\t\t\t\topen\n\t\t\t\t>\n\t\t\t\t\t<summary>Edit/Export raw JSON</summary>\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tname=\"state_override\"\n\t\t\t\t\t\trows=\"40\"\n\t\t\t\t\t\tcols=\"40\"\n\t\t\t\t\t\tdata-controller=\"json-editor\"\n\t\t\t\t\t\tid=\"component-debugger-json-textarea\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t>\n\t\t\t\t\t\t\t${(await this.serializeState(ctx, state, true)).replaceAll(\"<\", \"&lt;\")}\n\t\t\t\t\t\t</textarea\n\t\t\t\t\t>\n\t\t\t\t\t${this.makeActionButton(state, {\n\t\t\t\t\t\taction: \"replace_state\",\n\t\t\t\t\t\tlabel: \"Apply\",\n\t\t\t\t\t})}\n\t\t\t\t\t<button data-action=\"exportable-textarea#copy\">Copy</button>\n\t\t\t\t\t<button data-action=\"exportable-textarea#download\">\n\t\t\t\t\t\tDownload\n\t\t\t\t\t</button>\n\t\t\t\t\t<input type=\"file\" />${\" \"}\n\t\t\t\t\t<button data-action=\"exportable-textarea#import\">\n\t\t\t\t\t\tImport\n\t\t\t\t\t</button>\n\t\t\t\t</details>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tid=\"resize-gutter\"\n\t\t\t\tclass=\"resize-gutter\"\n\t\t\t\tdata-component-debugger-target=\"gutter\"\n\t\t\t></div>\n\t\t\t<div\n\t\t\t\tid=\"component-preview\"\n\t\t\t\tclass=\"component-preview\"\n\t\t\t\tdata-component-debugger-target=\"preview\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tid=\"component-preview__header\"\n\t\t\t\t\tclass=\"component-preview__header\"\n\t\t\t\t>\n\t\t\t\t\t<span>Preview</span>\n\t\t\t\t\t<select\n\t\t\t\t\t\tname=\"$[preview_size]\"\n\t\t\t\t\t\tautocomplete=\"off\"\n\t\t\t\t\t\tclass=\"component-preview-size-select\"\n\t\t\t\t\t\tdata-component-debugger-target=\"sizeSelect\"\n\t\t\t\t\t\tdata-action=\"change->component-debugger#handleWidthDropdown\"\n\t\t\t\t\t\tdata-turbo-data-turbo-permanent\n\t\t\t\t\t>\n\t\t\t\t\t\t${state.preview_size\n\t\t\t\t\t\t\t? /* HTML */ `<option\n\t\t\t\t\t\t\t\t\tclass=\"dynamic\"\n\t\t\t\t\t\t\t\t\tvalue=\"${state.preview_size}\"\n\t\t\t\t\t\t\t\t\tselected\n\t\t\t\t\t\t\t >\n\t\t\t\t\t\t\t\t\t${state.preview_size} px\n\t\t\t\t\t\t\t </option>`\n\t\t\t\t\t\t\t: \"\"}\n\t\t\t\t\t\t${this.previewSizes.map(\n\t\t\t\t\t\t\t(size) => /* HTML */ `<option value=\"${size}\">\n\t\t\t\t\t\t\t\t${`${size} px`}\n\t\t\t\t\t\t\t</option>`\n\t\t\t\t\t\t)}\n\t\t\t\t\t</select>\n\t\t\t\t\t<noscript>\n\t\t\t\t\t\t${this.makeActionButton(state, \"change_size\")}\n\t\t\t\t\t</noscript>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"jdd-outer-container\">\n\t\t\t\t\t<div class=\"jdd-container\">\n\t\t\t\t\t\t${JDD.render(\n\t\t\t\t\t\t\tthis.registry,\n\t\t\t\t\t\t\tdocumentContainerFromParsed(state.components),\n\t\t\t\t\t\t\tthis.makeJDDContext(ctx)\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>`;\n\t}\n}\n"],
5
+ "mappings": "AAGA,SAAS,mCAA6C;AACtD,SAAS,WAAW;AACpB,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB,UAAU,kBAAkB;AAGrD,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,+BAA+B;AAEjC,MAAM,aAAa;AAQ1B,MAAO,gBAAuC,aAG5C;AAAA,EAgBD,YAAY,MAUT;AACF,UAAM;AA1BP,mBAAU;AAEV,wBAAe,CAAC,OAAO,OAAO,OAAO,QAAQ,QAAQ,MAAM;AAC3D,mBAAoB,CAAC;AAwBpB,SAAK,WAAW,KAAK;AACrB,SAAK,iBAAiB,KAAK;AAC3B,SAAK,cAAc,KAAK;AACxB,SAAK,OAAO,KAAK;AACjB,SAAK,eACJ,KAAK,iBACJ,CAAC,QACD,kBAAkB,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI;AAAA,EAC1D;AAAA,EAEA,wBAAwB;AACvB,WAAO,KAAK,SAAS,OAAO;AAAA,EAC7B;AAAA,EAEA,MAAM,gBAAgB,KAAc;AACnC,UAAM,iBAAiB,OAAO,QAAQ,KAAK,sBAAsB,CAAC;AAClE,UAAM,kBAAkB,eAAe;AACvC,QAAI,CAAC,iBAAiB;AACrB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IACzC;AACA,UAAM,CAAC,gBAAgB,SAAS,IAAI;AACpC,UAAM,gBAAgB;AAAA,MACrB,YAAY;AAAA,QACX;AAAA,UACC;AAAA,UACA,MAAM,MAAM,UAAU;AAAA,YACrB,KAAK,eAAe,GAAG;AAAA,UACxB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA,EAEA,aACC,KACA,SACA,OACc;AACd,UAAM,MAAM,IAAI;AAAA,MACf,KAAK;AAAA,MACL,KAAK,eAAe,GAAG;AAAA,MACvB,4BAA4B,MAAM,UAAU;AAAA,IAC7C;AACA,WAAO,KAAK,KAAK;AAAA,MAChB;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY,CAAC,YAAY,GAAG,IAAI,gBAAgB,CAAC;AAAA,MACjD,aAAa;AAAA,QACZ,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,aAAa,CAAC,YAAY;AAAA,QAC1B,kBAAkB;AAAA,QAClB,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MAClB;AAAA,MACA,UAAU,IAAI,SACb,aAAwB,KAAK,YAAY,GAAG,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAM7C,IAAI,kBAAkB;AAAA,IAC3B,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,oBACL,MACA,OACA,WACC;AACD,UAAM,cAAc,KAAK,eAAe,IAAI;AAC5C,QACC,CAAC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACV,WAAW,MAAM;AAAA,UAChB,MAAM,WAAW;AAAA,QAClB,CAAC;AAAA,MACF;AAAA,IACD,GACC;AACD,aAAO,CAAC;AAAA,IACT;AACA,eAAW,CAAC,iBAAiB,EAAE,eAAe,CAAC,KAAK,OAAO;AAAA,MAC1D,MAAM;AAAA,IACP,GAAG;AACF,YAAM,YAAY,KAAK,SAAS,IAAI,cAAc;AAClD,UAAI,CAAC,WAAW;AACf,cAAM,IAAI,MAAM,sBAAsB,gBAAgB;AAAA,MACvD;AACA,YAAM,0BAA0B,UAAU,WACzC,SAAS,eAAe,MACpB,EAAE,MAAM,CAAC,EAAE;AAChB,YAAM,WAAW,OAAO,QAAQ,UAAU,aAAa,CAAC,EAAE;AAAA,QACzD,OAAO,CAAC,UAAU,GAAG,MAAM;AAC1B,gBAAM,QAAQ,wBAAwB,KAAK;AAC3C,cAAI,OAAO;AACV,kBAAM,YAAY,MAAM,IAAI;AAAA,cAC3B;AAAA,cACA;AAAA,YACD;AACA,oCAAwB,KAAK,YAAY;AAAA,UAC1C;AAAA,QACD;AAAA,MACD;AAEA,YAAM,QAAQ,IAAI,QAAQ;AAAA,IAC3B;AAEA,WAAO;AAAA,EACR;AAAA,EAKA,oBACC,KACA,OACA,WACA,MACA,OACkB;AAClB,UAAM,cAAc,KAAK,eAAe,GAAG;AAC3C,WAAO;AAAA;AAAA,SAEA,iCAAiC;AAAA;AAAA,KAErC,OAAO,QAAQ,UAAU,aAAa,CAAC,EAAE;AAAA,MAC1C,OAAO,CAAC,UAAU,GAAG,MACpB,eAAe;AAAA,QACd;AAAA,QACA,UAAU;AAAA,UACT;AAAA,UACA,MAAM,SAAS;AAAA,UACf;AAAA,UACA;AAAA,QACD;AAAA,QACA;AAAA,QACA;AAAA,QACA,OACC,KAAK,cAAc,SAChB,IAAI,gBAAgB,WAAW,IAC/B,KAAK;AAAA,QACT,MAAM;AAAA,QACN,gBAAgB,KAAK;AAAA,QACrB,cAAc,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA;AAAA,EAEF;AAAA,EAEA,qBACC,KACA,OACA;AAAA,IACC;AAAA,IACA,MAAM;AAAA,EACP,GAIA,iBACC;AACD,UAAM,YAAY,KAAK,SAAS,IAAI,cAAc;AAClD,QAAI,CAAC,WAAW;AACf,aAAO;AAAA,IACR;AACA,WAAO,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,eAAe,KAAc,OAAqB,SAAS,OAAO;AACvE,YAAQ,KAAK,mBAAmB;AAChC,UAAM,wBAAwB,MAAM,QAAQ;AAAA,MAC3C,MAAM,WAAW,IAAI,OAAO,EAAE,gBAAgB,KAAK,MAAM;AACxD,cAAM,YAAY,KAAK,SAAS,IAAI,cAAc;AAClD,cAAM,gBAAgB;AAAA,UACrB;AAAA,UAEA,MAAM,YACH,MAAM,UAAU;AAAA,YAChB,KAAK,eAAe,GAAG;AAAA,YACvB;AAAA,UACA,IACA,CAAC;AAAA,QACL;AACA,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AACA,UAAM,mBAAmB,KAAK;AAAA,MAC7B,EAAE,YAAY,sBAAsB;AAAA,MACpC;AAAA,MACA,SAAS,IAAI;AAAA,IACd;AACA,YAAQ,QAAQ,mBAAmB;AACnC,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,iBAAiB,KAAc,cAAsB;AAC1D,UAAM,cAAc,KAAK,eAAe,GAAG;AAE3C,UAAM,MAAM,KAAK,MAAM,YAAY;AAEnC,UAAM,qBAAqB,IAAI;AAC/B,QAAI,CAAC,MAAM,QAAQ,kBAAkB,GAAG;AACvC,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,UAAM,oBAAoB,MAAM,QAAQ;AAAA,MACvC,mBAAmB,IAAI,OAAO,UAAU;AACvC,YACC,CAAC;AAAA,UACA;AAAA,YACC,gBAAgB,WAAW;AAAA,YAC3B,MAAM,WAAW;AAAA,UAClB;AAAA,UACA;AAAA,QACD,GACC;AACD,gBAAM,IAAI;AAAA,YACT,wFAAwF;AAAA,UACzF;AAAA,QACD;AACA,cAAM,EAAE,gBAAgB,KAAK,IAAI;AACjC,cAAM,YAAY,KAAK,SAAS,IAAI,cAAc;AAClD,YAAI,CAAC,WAAW;AACf,gBAAM,IAAI,MAAM,sCAAsC;AAAA,QACvD;AACA,eAAO;AAAA,UACN;AAAA,UACA,MAAM,MAAM,UAAU;AAAA,YACrB;AAAA,YACA;AAAA,UACD;AAAA,QACD;AAAA,MACD,CAAC;AAAA,IACF;AACA,UAAM,SAAS,EAAE,YAAY,kBAAkB;AAC/C,WAAO;AAAA,EACR;AAAA,EAEA,0BAEC,MAEA,QAC6C;AAC7C,WAAO;AAAA,EACR;AAAA,EAEA,eAAe,MAAe,OAAqB;AAClD,WAAkB;AAAA;AAAA;AAAA;AAAA,MAId,MAAM,YAAY,CAAC,GAAG;AAAA,MACxB,CAAC,MAAM,mCAAmC;AAAA,IAC3C;AAAA;AAAA,EAEF;AAAA,EAEA,MAAM,OAAO,KAAc,OAAsC;AAChE,WAAO;AAAA,YACG,CAAC,cAAc,sBAAsB,GAAG,KAAK,OAAO,EAAE;AAAA,MAC9D;AAAA,IACD;AAAA;AAAA,YAES,6BACR,MAAM,eAAe,MAAM,eAAe,OAAO;AAAA;AAAA;AAAA;AAAA,MAK/C,KAAK,0BAA0B,KAAK,KAAK;AAAA,MACzC,KAAK,uBAAuB,KAAK;AAAA,MACjC,KAAK,eAAe,KAAK,KAAK;AAAA,MAC9B,MAAM,WAAW;AAAA,MAAI,CAAC,WAAW,oBAClC,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgBM,MAAM,KAAK,eAAe,KAAK,OAAO,IAAI,GAAG,WAAW,KAAK,MAAM;AAAA;AAAA;AAAA,OAGtE,KAAK,iBAAiB,OAAO;AAAA,MAC9B,QAAQ;AAAA,MACR,OAAO;AAAA,IACR,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,4BAKsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA6BpB,MAAM,eACM;AAAA;AAAA,kBAEF,MAAM;AAAA;AAAA;AAAA,WAGb,MAAM;AAAA,sBAER;AAAA,QACD,KAAK,aAAa;AAAA,MACnB,CAAC,SAAoB,kBAAkB;AAAA,UACpC,GAAG;AAAA;AAAA,IAEP;AAAA;AAAA;AAAA,QAGE,KAAK,iBAAiB,OAAO,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,QAK1C,IAAI;AAAA,MACL,KAAK;AAAA,MACL,4BAA4B,MAAM,UAAU;AAAA,MAC5C,KAAK,eAAe,GAAG;AAAA,IACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKL;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,78 @@
1
+ import { Controller } from "stimulus";
2
+ import TurndownService from "turndown";
3
+ import objectPath from "object-path";
4
+ const turndownService = new TurndownService();
5
+ class jdd_table_paste_stimulus_default extends Controller {
6
+ connect() {
7
+ this.element.addEventListener("click", async () => {
8
+ const clipboardContents = await navigator.clipboard.read();
9
+ for (const item of clipboardContents) {
10
+ if (!item.types.includes("text/html")) {
11
+ alert(
12
+ "Nie mo\u017Cna skopiowa\u0107 tabeli - nie znaleziono danych HTML"
13
+ );
14
+ return;
15
+ }
16
+ const blob = await item.getType("text/html");
17
+ const html = await blob.text();
18
+ const div = document.createElement("div");
19
+ div.innerHTML = html;
20
+ const table = div.querySelector("table");
21
+ if (!table) {
22
+ alert("No table in clipboard");
23
+ }
24
+ const rows = Array.from(
25
+ (table == null ? void 0 : table.querySelectorAll("tr")) || []
26
+ ).map((tr) => {
27
+ const cells = Array.from(tr.querySelectorAll("td"));
28
+ return {
29
+ type: "row",
30
+ cells: cells.map(
31
+ (cell) => turndownService.turndown(cell)
32
+ )
33
+ };
34
+ });
35
+ const form = this.element.closest("form");
36
+ const json_textarea = document.getElementById(
37
+ "component-debugger-json-textarea"
38
+ );
39
+ if (!json_textarea) {
40
+ console.error(
41
+ "Could not find json textarea with the jdd state"
42
+ );
43
+ return;
44
+ }
45
+ if (!form) {
46
+ throw new Error("Not inside a form");
47
+ }
48
+ const handler = () => {
49
+ document.removeEventListener("turbo:morph", handler);
50
+ const state = JSON.parse(json_textarea.value);
51
+ objectPath.set(state, this.argpathValue, {
52
+ rows
53
+ });
54
+ json_textarea.childNodes[0].textContent = JSON.stringify(state);
55
+ setTimeout(() => {
56
+ const submitter_button = document.createElement("button");
57
+ submitter_button.setAttribute(
58
+ "formaction",
59
+ "./?action=replace_state&action_args=W10="
60
+ );
61
+ form.appendChild(submitter_button);
62
+ form.requestSubmit(submitter_button);
63
+ submitter_button.remove();
64
+ }, 0);
65
+ };
66
+ document.addEventListener("turbo:morph", handler);
67
+ form.requestSubmit();
68
+ }
69
+ });
70
+ }
71
+ }
72
+ jdd_table_paste_stimulus_default.values = {
73
+ argpath: String
74
+ };
75
+ export {
76
+ jdd_table_paste_stimulus_default as default
77
+ };
78
+ //# sourceMappingURL=jdd-table-paste.stimulus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jdd-table-paste.stimulus.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/consistent-type-assertions */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable @typescript-eslint/no-misused-promises */\nimport { Controller } from \"stimulus\";\nimport TurndownService from \"turndown\";\nimport objectPath from \"object-path\";\n\nconst turndownService = new TurndownService();\n\nexport default class extends Controller<HTMLButtonElement> {\n\tdeclare argpathValue: string;\n\tstatic values = {\n\t\targpath: String,\n\t};\n\n\tconnect() {\n\t\tthis.element.addEventListener(\"click\", async () => {\n\t\t\tconst clipboardContents = await navigator.clipboard.read();\n\t\t\tfor (const item of clipboardContents) {\n\t\t\t\tif (!item.types.includes(\"text/html\")) {\n\t\t\t\t\talert(\n\t\t\t\t\t\t\"Nie mo\u017Cna skopiowa\u0107 tabeli - nie znaleziono danych HTML\"\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst blob = await item.getType(\"text/html\");\n\t\t\t\tconst html = await blob.text();\n\t\t\t\tconst div = document.createElement(\"div\");\n\t\t\t\tdiv.innerHTML = html;\n\t\t\t\tconst table = div.querySelector(\"table\");\n\t\t\t\tif (!table) {\n\t\t\t\t\talert(\"No table in clipboard\");\n\t\t\t\t}\n\t\t\t\tconst rows = Array.from(\n\t\t\t\t\ttable?.querySelectorAll(\"tr\") || []\n\t\t\t\t).map((tr) => {\n\t\t\t\t\tconst cells = Array.from(tr.querySelectorAll(\"td\"));\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"row\",\n\t\t\t\t\t\tcells: cells.map((cell) =>\n\t\t\t\t\t\t\tturndownService.turndown(cell)\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst form = this.element.closest(\"form\");\n\t\t\t\tconst json_textarea = document.getElementById(\n\t\t\t\t\t\"component-debugger-json-textarea\"\n\t\t\t\t) as HTMLTextAreaElement;\n\t\t\t\tif (!json_textarea) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\"Could not find json textarea with the jdd state\"\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!form) {\n\t\t\t\t\tthrow new Error(\"Not inside a form\");\n\t\t\t\t}\n\t\t\t\tconst handler = () => {\n\t\t\t\t\tdocument.removeEventListener(\"turbo:morph\", handler);\n\t\t\t\t\tconst state = JSON.parse(json_textarea.value) as unknown;\n\t\t\t\t\tobjectPath.set(state as object, this.argpathValue, {\n\t\t\t\t\t\trows,\n\t\t\t\t\t});\n\n\t\t\t\t\tjson_textarea.childNodes[0]!.textContent =\n\t\t\t\t\t\tJSON.stringify(state);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t// async in order to give a chance for UI state to update after changing the iframe value\n\t\t\t\t\t\tconst submitter_button =\n\t\t\t\t\t\t\tdocument.createElement(\"button\");\n\t\t\t\t\t\tsubmitter_button.setAttribute(\n\t\t\t\t\t\t\t\"formaction\",\n\t\t\t\t\t\t\t\"./?action=replace_state&action_args=W10=\"\n\t\t\t\t\t\t);\n\t\t\t\t\t\tform.appendChild(submitter_button);\n\t\t\t\t\t\tform.requestSubmit(submitter_button);\n\t\t\t\t\t\tsubmitter_button.remove();\n\t\t\t\t\t}, 0);\n\t\t\t\t};\n\n\t\t\t\tdocument.addEventListener(\"turbo:morph\", handler);\n\t\t\t\tform.requestSubmit(); // to get the newest json first, there may be some\n\t\t\t\t// unsent changes\n\t\t\t}\n\t\t});\n\t}\n}\n"],
5
+ "mappings": "AAIA,SAAS,kBAAkB;AAC3B,OAAO,qBAAqB;AAC5B,OAAO,gBAAgB;AAEvB,MAAM,kBAAkB,IAAI,gBAAgB;AAE5C,MAAO,yCAAsB,WAA8B;AAAA,EAM1D,UAAU;AACT,SAAK,QAAQ,iBAAiB,SAAS,YAAY;AAClD,YAAM,oBAAoB,MAAM,UAAU,UAAU,KAAK;AACzD,iBAAW,QAAQ,mBAAmB;AACrC,YAAI,CAAC,KAAK,MAAM,SAAS,WAAW,GAAG;AACtC;AAAA,YACC;AAAA,UACD;AACA;AAAA,QACD;AACA,cAAM,OAAO,MAAM,KAAK,QAAQ,WAAW;AAC3C,cAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,cAAM,MAAM,SAAS,cAAc,KAAK;AACxC,YAAI,YAAY;AAChB,cAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,YAAI,CAAC,OAAO;AACX,gBAAM,uBAAuB;AAAA,QAC9B;AACA,cAAM,OAAO,MAAM;AAAA,WAClB,+BAAO,iBAAiB,UAAS,CAAC;AAAA,QACnC,EAAE,IAAI,CAAC,OAAO;AACb,gBAAM,QAAQ,MAAM,KAAK,GAAG,iBAAiB,IAAI,CAAC;AAClD,iBAAO;AAAA,YACN,MAAM;AAAA,YACN,OAAO,MAAM;AAAA,cAAI,CAAC,SACjB,gBAAgB,SAAS,IAAI;AAAA,YAC9B;AAAA,UACD;AAAA,QACD,CAAC;AAED,cAAM,OAAO,KAAK,QAAQ,QAAQ,MAAM;AACxC,cAAM,gBAAgB,SAAS;AAAA,UAC9B;AAAA,QACD;AACA,YAAI,CAAC,eAAe;AACnB,kBAAQ;AAAA,YACP;AAAA,UACD;AACA;AAAA,QACD;AACA,YAAI,CAAC,MAAM;AACV,gBAAM,IAAI,MAAM,mBAAmB;AAAA,QACpC;AACA,cAAM,UAAU,MAAM;AACrB,mBAAS,oBAAoB,eAAe,OAAO;AACnD,gBAAM,QAAQ,KAAK,MAAM,cAAc,KAAK;AAC5C,qBAAW,IAAI,OAAiB,KAAK,cAAc;AAAA,YAClD;AAAA,UACD,CAAC;AAED,wBAAc,WAAW,GAAI,cAC5B,KAAK,UAAU,KAAK;AACrB,qBAAW,MAAM;AAEhB,kBAAM,mBACL,SAAS,cAAc,QAAQ;AAChC,6BAAiB;AAAA,cAChB;AAAA,cACA;AAAA,YACD;AACA,iBAAK,YAAY,gBAAgB;AACjC,iBAAK,cAAc,gBAAgB;AACnC,6BAAiB,OAAO;AAAA,UACzB,GAAG,CAAC;AAAA,QACL;AAEA,iBAAS,iBAAiB,eAAe,OAAO;AAChD,aAAK,cAAc;AAAA,MAEpB;AAAA,IACD,CAAC;AAAA,EACF;AACD;AA9EO,iCAEC,SAAS;AAAA,EACf,SAAS;AACV;",
6
+ "names": []
7
+ }
@@ -0,0 +1,114 @@
1
+ import { Controller } from "stimulus";
2
+ const JS_ID = "codemirror-js";
3
+ const JS_PATH = "/dist/codemirror.js";
4
+ const JS_MODE_ID = "codemirror-js-mode-js";
5
+ const JS_MODE_PATH = "/dist/codemirror-javascript-mode.js";
6
+ const CSS_ID = "codemirror-css";
7
+ const CSS_PATH = "/dist/codemirror.css";
8
+ class JSONEditor extends Controller {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.saving = false;
12
+ }
13
+ addCSS() {
14
+ const tag = document.querySelector(`head #${CSS_ID}`);
15
+ if (!tag) {
16
+ const link = document.createElement("link");
17
+ link.setAttribute("rel", "stylesheet");
18
+ link.setAttribute("type", "text/css");
19
+ link.setAttribute("id", CSS_ID);
20
+ link.setAttribute("href", CSS_PATH);
21
+ document.head.appendChild(link);
22
+ }
23
+ }
24
+ async addJS(js_id, js_path) {
25
+ return new Promise((resolve, reject) => {
26
+ const once_loaded = (e) => {
27
+ e.target.setAttribute("loaded", "true");
28
+ resolve();
29
+ };
30
+ try {
31
+ const tag = document.querySelector(`head #${js_id}`);
32
+ if (!tag) {
33
+ const script = document.createElement("script");
34
+ script.setAttribute("id", js_id);
35
+ script.setAttribute("src", js_path);
36
+ script.addEventListener("load", once_loaded);
37
+ document.head.appendChild(script);
38
+ } else {
39
+ if (tag.getAttribute("loaded") == "true") {
40
+ resolve();
41
+ } else {
42
+ tag.addEventListener("load", once_loaded);
43
+ }
44
+ }
45
+ } catch (e) {
46
+ reject(e);
47
+ }
48
+ });
49
+ }
50
+ async connect() {
51
+ var _a, _b;
52
+ if ((_a = this.element.parentNode) == null ? void 0 : _a.querySelector(".CodeMirror")) {
53
+ return;
54
+ }
55
+ this.addCSS();
56
+ await this.addJS(JS_ID, JS_PATH);
57
+ await this.addJS(JS_MODE_ID, JS_MODE_PATH);
58
+ this.cm = CodeMirror.fromTextArea(this.element, {
59
+ mode: {
60
+ name: "javascript",
61
+ json: true
62
+ },
63
+ theme: "default",
64
+ addModeClass: true,
65
+ lineWrapping: true
66
+ });
67
+ this.cm.on("change", () => {
68
+ this.saving = true;
69
+ this.element.innerHTML = this.cm.getValue().replace("<", "&lt;");
70
+ this.saving = false;
71
+ });
72
+ this.cm.getWrapperElement().setAttribute("data-turbo-permanent", "");
73
+ const observer = new MutationObserver((mutation) => {
74
+ console.log("DETECTED TEXTAREA MUTATION CHANGE!", mutation);
75
+ if (!this.saving) {
76
+ if (this.cm.getValue() != this.element.innerHTML) {
77
+ console.log(
78
+ "SETTING CM VALUE TO",
79
+ this.element.innerHTML.slice(0, 100)
80
+ );
81
+ this.cm.setValue(this.element.innerHTML);
82
+ }
83
+ }
84
+ });
85
+ observer.observe(this.element, {
86
+ characterData: true,
87
+ subtree: true
88
+ });
89
+ this.element.addEventListener("change", () => {
90
+ console.log("DETECTED TEXTAREA CHANGE!");
91
+ if (!this.saving) {
92
+ if (this.cm.getValue() != this.element.innerHTML) {
93
+ console.log(
94
+ "SETTING CM VALUE TO",
95
+ this.element.innerHTML.slice(0, 100)
96
+ );
97
+ this.cm.setValue(this.element.innerHTML);
98
+ }
99
+ }
100
+ });
101
+ (_b = this.element.closest("details")) == null ? void 0 : _b.addEventListener("toggle", (event) => {
102
+ if (event.target.open) {
103
+ this.cm.refresh();
104
+ }
105
+ });
106
+ }
107
+ async disconnect() {
108
+ console.log("DISCONNECTING JSON EDITOR");
109
+ }
110
+ }
111
+ export {
112
+ JSONEditor as default
113
+ };
114
+ //# sourceMappingURL=json-editor.stimulus.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/json-editor.stimulus.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport { Controller } from \"stimulus\";\n\nconst JS_ID = \"codemirror-js\";\nconst JS_PATH = \"/dist/codemirror.js\";\n\nconst JS_MODE_ID = \"codemirror-js-mode-js\";\nconst JS_MODE_PATH = \"/dist/codemirror-javascript-mode.js\";\n\nconst CSS_ID = \"codemirror-css\";\nconst CSS_PATH = \"/dist/codemirror.css\";\n\ndeclare const CodeMirror: any;\n\nexport default class JSONEditor extends Controller<HTMLTextAreaElement> {\n\tcm: any;\n\tsaving = false;\n\n\taddCSS() {\n\t\tconst tag = document.querySelector(`head #${CSS_ID}`);\n\t\tif (!tag) {\n\t\t\tconst link = document.createElement(\"link\");\n\t\t\tlink.setAttribute(\"rel\", \"stylesheet\");\n\t\t\tlink.setAttribute(\"type\", \"text/css\");\n\t\t\tlink.setAttribute(\"id\", CSS_ID);\n\t\t\tlink.setAttribute(\"href\", CSS_PATH);\n\t\t\tdocument.head.appendChild(link);\n\t\t}\n\t}\n\n\tasync addJS(js_id: string, js_path: string) {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst once_loaded = (e: MouseEvent) => {\n\t\t\t\t(e.target as HTMLScriptElement).setAttribute(\"loaded\", \"true\");\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\ttry {\n\t\t\t\tconst tag = document.querySelector(`head #${js_id}`);\n\t\t\t\tif (!tag) {\n\t\t\t\t\tconst script = document.createElement(\"script\");\n\t\t\t\t\tscript.setAttribute(\"id\", js_id);\n\t\t\t\t\tscript.setAttribute(\"src\", js_path);\n\t\t\t\t\tscript.addEventListener(\"load\", once_loaded);\n\t\t\t\t\tdocument.head.appendChild(script);\n\t\t\t\t} else {\n\t\t\t\t\tif (tag.getAttribute(\"loaded\") == \"true\") {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttag.addEventListener(\"load\", once_loaded);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treject(e);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync connect() {\n\t\tif (this.element.parentNode?.querySelector(\".CodeMirror\")) {\n\t\t\t//already loaded, quit;\n\t\t\treturn;\n\t\t}\n\t\tthis.addCSS();\n\t\tawait this.addJS(JS_ID, JS_PATH);\n\t\tawait this.addJS(JS_MODE_ID, JS_MODE_PATH);\n\t\tthis.cm = CodeMirror.fromTextArea(this.element, {\n\t\t\tmode: {\n\t\t\t\tname: \"javascript\",\n\t\t\t\tjson: true,\n\t\t\t},\n\t\t\ttheme: \"default\",\n\t\t\taddModeClass: true,\n\t\t\tlineWrapping: true,\n\t\t});\n\t\tthis.cm.on(\"change\", () => {\n\t\t\tthis.saving = true;\n\t\t\tthis.element.innerHTML = this.cm.getValue().replace(\"<\", \"&lt;\");\n\t\t\tthis.saving = false;\n\t\t});\n\t\t// to prevent morhping from removing the element\n\t\tthis.cm.getWrapperElement().setAttribute(\"data-turbo-permanent\", \"\");\n\t\tconst observer = new MutationObserver((mutation) => {\n\t\t\tconsole.log(\"DETECTED TEXTAREA MUTATION CHANGE!\", mutation);\n\t\t\tif (!this.saving) {\n\t\t\t\tif (this.cm.getValue() != this.element.innerHTML) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"SETTING CM VALUE TO\",\n\t\t\t\t\t\tthis.element.innerHTML.slice(0, 100)\n\t\t\t\t\t);\n\t\t\t\t\tthis.cm.setValue(this.element.innerHTML);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tobserver.observe(this.element, {\n\t\t\tcharacterData: true,\n\t\t\tsubtree: true,\n\t\t});\n\n\t\tthis.element.addEventListener(\"change\", () => {\n\t\t\tconsole.log(\"DETECTED TEXTAREA CHANGE!\");\n\t\t\tif (!this.saving) {\n\t\t\t\tif (this.cm.getValue() != this.element.innerHTML) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\"SETTING CM VALUE TO\",\n\t\t\t\t\t\tthis.element.innerHTML.slice(0, 100)\n\t\t\t\t\t);\n\t\t\t\t\tthis.cm.setValue(this.element.innerHTML);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.element\n\t\t\t.closest(\"details\")\n\t\t\t?.addEventListener(\"toggle\", (event: MouseEvent) => {\n\t\t\t\tif ((event.target as HTMLDetailsElement).open) {\n\t\t\t\t\tthis.cm.refresh();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tasync disconnect() {\n\t\tconsole.log(\"DISCONNECTING JSON EDITOR\");\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }