fragment-tools 0.1.13 → 0.1.15

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 (184) hide show
  1. package/.prettierignore +1 -2
  2. package/.prettierrc +23 -7
  3. package/README.md +28 -9
  4. package/bin/index.js +70 -10
  5. package/package.json +14 -6
  6. package/src/cli/build.js +125 -0
  7. package/src/cli/create.js +238 -0
  8. package/src/cli/createConfig.js +82 -0
  9. package/src/cli/createFragmentFile.js +70 -0
  10. package/src/cli/getEntries.js +85 -0
  11. package/src/cli/log.js +36 -24
  12. package/src/cli/plugins/check-dependencies.js +88 -42
  13. package/src/cli/plugins/hot-shader-replacement.js +408 -0
  14. package/src/cli/plugins/hot-sketch-reload.js +21 -25
  15. package/src/cli/plugins/save.js +101 -0
  16. package/src/cli/preview.js +55 -0
  17. package/src/cli/prompts.js +260 -0
  18. package/src/cli/run.js +131 -0
  19. package/src/cli/templates/blank/index.js +33 -0
  20. package/src/cli/templates/blank/meta.json +4 -0
  21. package/src/cli/templates/default/index.js +39 -0
  22. package/src/cli/templates/default/meta.json +5 -0
  23. package/src/cli/templates/fragment-gl/index.js +37 -0
  24. package/src/cli/templates/fragment-gl/meta.json +4 -0
  25. package/src/cli/templates/p5/index.js +32 -0
  26. package/src/cli/templates/p5/meta.json +5 -0
  27. package/src/cli/templates/p5-webgl/fragment.fs +14 -0
  28. package/src/cli/templates/p5-webgl/index.js +67 -0
  29. package/src/cli/templates/p5-webgl/meta.json +5 -0
  30. package/src/cli/templates/three-fragment/fragment.fs +10 -0
  31. package/src/cli/templates/three-fragment/index.js +95 -0
  32. package/src/cli/templates/three-fragment/meta.json +5 -0
  33. package/src/cli/templates/three-orthographic/index.js +55 -0
  34. package/src/cli/templates/three-orthographic/meta.json +5 -0
  35. package/src/cli/templates/three-perspective/index.js +52 -0
  36. package/src/cli/templates/three-perspective/meta.json +5 -0
  37. package/src/cli/utils.js +70 -0
  38. package/src/cli/ws.js +87 -78
  39. package/src/client/app/App.svelte +3 -3
  40. package/src/client/app/client.js +55 -39
  41. package/src/client/app/components/IconCross.svelte +18 -18
  42. package/src/client/app/components/Init.svelte +40 -8
  43. package/src/client/app/components/KeyBinding.svelte +22 -22
  44. package/src/client/app/helpers.js +42 -0
  45. package/src/client/app/hooks.js +20 -0
  46. package/src/client/app/inputs/Input.js +9 -9
  47. package/src/client/app/inputs/Keyboard.js +13 -15
  48. package/src/client/app/inputs/MIDI.js +14 -15
  49. package/src/client/app/inputs/Mouse.js +1 -1
  50. package/src/client/app/inputs/Webcam.js +89 -88
  51. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +41 -21
  52. package/src/client/app/lib/canvas-recorder/FrameRecorder.js +7 -6
  53. package/src/client/app/lib/canvas-recorder/H264Recorder.js +45 -0
  54. package/src/client/app/lib/canvas-recorder/MP4Recorder.js +7 -9
  55. package/src/client/app/lib/canvas-recorder/WebMRecorder.js +3 -4
  56. package/src/client/app/lib/canvas-recorder/mp4.js +1649 -15
  57. package/src/client/app/lib/canvas-recorder/utils.js +33 -17
  58. package/src/client/app/lib/gl/Geometry.js +11 -8
  59. package/src/client/app/lib/gl/Program.js +38 -19
  60. package/src/client/app/lib/gl/Renderer.js +163 -156
  61. package/src/client/app/lib/gl/Texture.js +113 -85
  62. package/src/client/app/lib/gl/index.js +12 -12
  63. package/src/client/app/lib/gl/utils.js +1 -3
  64. package/src/client/app/lib/helpers/frameDebounce.js +30 -30
  65. package/src/client/app/lib/loader/index.js +10 -10
  66. package/src/client/app/lib/loader/loadImage.js +15 -15
  67. package/src/client/app/lib/loader/loadScript.js +1 -1
  68. package/src/client/app/lib/paper-sizes.js +75 -76
  69. package/src/client/app/lib/presets.js +25 -5
  70. package/src/client/app/lib/tempo/Analyser.js +18 -17
  71. package/src/client/app/lib/tempo/Range.js +15 -12
  72. package/src/client/app/lib/tempo/index.js +34 -27
  73. package/src/client/app/modules/AudioAnalyser/Range.svelte +69 -72
  74. package/src/client/app/modules/AudioAnalyser/Spectrum.svelte +20 -19
  75. package/src/client/app/modules/AudioAnalyser.svelte +52 -35
  76. package/src/client/app/modules/Console/ConsoleLine.svelte +193 -172
  77. package/src/client/app/modules/Console.svelte +76 -74
  78. package/src/client/app/modules/Exports.svelte +62 -43
  79. package/src/client/app/modules/MidiPanel.svelte +100 -101
  80. package/src/client/app/modules/Monitor.svelte +57 -57
  81. package/src/client/app/modules/Params.svelte +128 -103
  82. package/src/client/app/renderers/2DRenderer.js +3 -3
  83. package/src/client/app/renderers/FragmentRenderer.js +30 -23
  84. package/src/client/app/renderers/P5GLRenderer.js +144 -0
  85. package/src/client/app/renderers/P5Renderer.js +10 -7
  86. package/src/client/app/renderers/THREERenderer.js +136 -94
  87. package/src/client/app/stores/audioAnalysis.js +3 -4
  88. package/src/client/app/stores/console.js +9 -10
  89. package/src/client/app/stores/errors.js +1 -1
  90. package/src/client/app/stores/exports.js +36 -20
  91. package/src/client/app/stores/index.js +2 -2
  92. package/src/client/app/stores/layout.js +143 -138
  93. package/src/client/app/stores/multisampling.js +4 -4
  94. package/src/client/app/stores/props.js +76 -13
  95. package/src/client/app/stores/renderers.js +26 -15
  96. package/src/client/app/stores/rendering.js +108 -89
  97. package/src/client/app/stores/sketches.js +7 -9
  98. package/src/client/app/stores/time.js +18 -18
  99. package/src/client/app/stores/utils.js +95 -38
  100. package/src/client/app/transitions/fade.js +3 -3
  101. package/src/client/app/transitions/index.js +6 -7
  102. package/src/client/app/transitions/splitX.js +2 -2
  103. package/src/client/app/transitions/splitY.js +2 -2
  104. package/src/client/app/triggers/Keyboard.js +88 -79
  105. package/src/client/app/triggers/MIDI.js +110 -84
  106. package/src/client/app/triggers/Mouse.js +73 -65
  107. package/src/client/app/triggers/Trigger.js +59 -58
  108. package/src/client/app/triggers/index.js +7 -7
  109. package/src/client/app/triggers/shared.js +5 -5
  110. package/src/client/app/ui/Build.svelte +70 -71
  111. package/src/client/app/ui/ErrorOverlay.svelte +118 -104
  112. package/src/client/app/ui/Field.svelte +393 -258
  113. package/src/client/app/ui/FieldGroup.svelte +106 -94
  114. package/src/client/app/ui/FieldSection.svelte +127 -116
  115. package/src/client/app/ui/FieldSpace.svelte +29 -30
  116. package/src/client/app/ui/FieldTrigger.svelte +256 -244
  117. package/src/client/app/ui/FieldTriggers.svelte +46 -46
  118. package/src/client/app/ui/FloatingParams.svelte +29 -30
  119. package/src/client/app/ui/Layout.svelte +31 -32
  120. package/src/client/app/ui/LayoutColumn.svelte +4 -4
  121. package/src/client/app/ui/LayoutComponent.svelte +239 -225
  122. package/src/client/app/ui/LayoutResizer.svelte +195 -176
  123. package/src/client/app/ui/LayoutRoot.svelte +6 -6
  124. package/src/client/app/ui/LayoutRow.svelte +4 -4
  125. package/src/client/app/ui/LayoutToolbar.svelte +191 -194
  126. package/src/client/app/ui/Module.svelte +134 -135
  127. package/src/client/app/ui/ModuleHeaderAction.svelte +81 -78
  128. package/src/client/app/ui/ModuleHeaderButton.svelte +12 -12
  129. package/src/client/app/ui/ModuleHeaderSelect.svelte +47 -37
  130. package/src/client/app/ui/ModuleRenderer.svelte +26 -27
  131. package/src/client/app/ui/OutputRenderer.svelte +112 -105
  132. package/src/client/app/ui/ParamsMultisampling.svelte +96 -95
  133. package/src/client/app/ui/ParamsOutput.svelte +130 -113
  134. package/src/client/app/ui/Preview.svelte +7 -8
  135. package/src/client/app/ui/SelectChevrons.svelte +27 -15
  136. package/src/client/app/ui/SketchRenderer.svelte +780 -667
  137. package/src/client/app/ui/SketchSelect.svelte +50 -44
  138. package/src/client/app/ui/fields/ButtonInput.svelte +61 -48
  139. package/src/client/app/ui/fields/CheckboxInput.svelte +67 -61
  140. package/src/client/app/ui/fields/ColorInput.svelte +294 -238
  141. package/src/client/app/ui/fields/FieldInputRow.svelte +8 -8
  142. package/src/client/app/ui/fields/ImageInput.svelte +123 -121
  143. package/src/client/app/ui/fields/Input.svelte +100 -111
  144. package/src/client/app/ui/fields/IntervalInput.svelte +268 -0
  145. package/src/client/app/ui/fields/ListInput.svelte +96 -96
  146. package/src/client/app/ui/fields/NumberInput.svelte +120 -116
  147. package/src/client/app/ui/fields/ProgressInput.svelte +99 -73
  148. package/src/client/app/ui/fields/Select.svelte +137 -124
  149. package/src/client/app/ui/fields/TextInput.svelte +10 -11
  150. package/src/client/app/ui/fields/VectorInput.svelte +86 -82
  151. package/src/client/app/utils/canvas.utils.js +189 -208
  152. package/src/client/app/utils/color.utils.js +138 -101
  153. package/src/client/app/utils/fields.utils.js +131 -0
  154. package/src/client/app/utils/file.utils.js +209 -37
  155. package/src/client/app/utils/glsl.utils.js +2 -2
  156. package/src/client/app/utils/glslErrors.js +49 -31
  157. package/src/client/app/utils/index.js +32 -29
  158. package/src/client/app/utils/math.utils.js +14 -10
  159. package/src/client/index.html +16 -16
  160. package/src/client/main.js +4 -4
  161. package/src/client/public/css/global.css +26 -16
  162. package/src/cli/db.js +0 -17
  163. package/src/cli/index.js +0 -198
  164. package/src/cli/plugins/db.js +0 -12
  165. package/src/cli/plugins/hot-shader-reload.js +0 -86
  166. package/src/cli/plugins/screenshot.js +0 -46
  167. package/src/cli/server.js +0 -153
  168. package/src/cli/templates/2d.js +0 -15
  169. package/src/cli/templates/blank.js +0 -13
  170. package/src/cli/templates/fragment.js +0 -18
  171. package/src/cli/templates/index.js +0 -27
  172. package/src/cli/templates/p5.js +0 -13
  173. package/src/cli/templates/three-fragment.js +0 -53
  174. package/src/cli/templates/three-orthographic.js +0 -23
  175. package/src/cli/templates/three-perspective.js +0 -20
  176. package/src/client/app/lib/canvas-recorder/FFMPEGRecorder.js +0 -56
  177. package/src/client/app/utils/props.utils.js +0 -51
  178. package/src/client/public/fonts/Inter-Bold.woff2 +0 -0
  179. package/src/client/public/fonts/Inter-Italic.woff2 +0 -0
  180. package/src/client/public/fonts/Inter-Regular.woff2 +0 -0
  181. package/src/client/public/fonts/Inter-SemiBold.woff2 +0 -0
  182. package/src/client/public/js/ffmpeg.min.js +0 -2
  183. package/src/client/public/js/ffmpeg.min.js.map +0 -1
  184. /package/src/cli/templates/{fragment.fs → fragment-gl/fragment.fs} +0 -0
@@ -1,71 +1,72 @@
1
1
  let ID = 0;
2
2
 
3
3
  class Trigger {
4
- /**
5
- *
6
- * @param {string} inputType
7
- * @param {string} eventName
8
- * @param {function} fn
9
- * @param {object} params
10
- */
11
- constructor({
12
- inputType,
13
- eventName,
14
- fn,
15
- context,
16
- params = { key: [] },
17
- destroy = () => {},
18
- enabled = typeof inputType === "string" && typeof eventName === "string",
19
- hot = true,
20
- } = {}) {
21
- this.id = ID++;
22
- this.inputType = inputType;
23
- this.eventName = eventName;
24
- this.fn = fn;
25
- this.context = context;
26
- this.params = params;
27
- this.enabled = enabled;
28
- this.hot = hot;
29
- this._destroy = destroy;
30
- }
4
+ /**
5
+ *
6
+ * @param {string} inputType
7
+ * @param {string} eventName
8
+ * @param {function} fn
9
+ * @param {object} params
10
+ */
11
+ constructor({
12
+ inputType,
13
+ eventName,
14
+ fn,
15
+ context,
16
+ params = { key: [] },
17
+ destroy = () => {},
18
+ enabled = typeof inputType === 'string' &&
19
+ typeof eventName === 'string',
20
+ hot = true,
21
+ } = {}) {
22
+ this.id = ID++;
23
+ this.inputType = inputType;
24
+ this.eventName = eventName;
25
+ this.fn = fn;
26
+ this.context = context;
27
+ this.params = params;
28
+ this.enabled = enabled;
29
+ this.hot = hot;
30
+ this._destroy = destroy;
31
+ }
31
32
 
32
- assign(fn) {
33
- this.fn = fn;
34
- }
33
+ assign(fn) {
34
+ this.fn = fn;
35
+ }
35
36
 
36
- enable() {
37
- this.enabled = true;
38
- }
37
+ enable() {
38
+ this.enabled = true;
39
+ }
39
40
 
40
- disable() {
41
- this.enabled = false;
42
- }
41
+ disable() {
42
+ this.enabled = false;
43
+ }
43
44
 
44
- run(...args) {
45
- if (this.enabled) {
46
- this.fn(...args);
47
- }
48
- }
45
+ run(...args) {
46
+ if (this.enabled) {
47
+ this.fn(...args);
48
+ }
49
+ }
49
50
 
50
- destroy() {
51
- this._destroy();
51
+ destroy() {
52
+ this._destroy();
52
53
 
53
- this.inputType = null;
54
- this.eventName = null;
55
- this.fn = null;
56
- this.params = null;
57
- this.enabled = null;
58
- this._destroy = null;
59
- }
54
+ this.inputType = null;
55
+ this.eventName = null;
56
+ this.fn = null;
57
+ this.params = null;
58
+ this.enabled = null;
59
+ this._destroy = null;
60
+ }
60
61
 
61
- toJSON() {
62
- return {
63
- inputType: this.inputType,
64
- eventName: this.eventName,
65
- enabled: this.enabled,
66
- params: this.params,
67
- };
68
- }
62
+ toJSON() {
63
+ return {
64
+ inputType: this.inputType,
65
+ eventName: this.eventName,
66
+ enabled: this.enabled,
67
+ params: this.params,
68
+ };
69
+ }
69
70
  }
70
71
 
71
72
  export default Trigger;
@@ -1,16 +1,16 @@
1
- import * as Mouse from "./Mouse.js";
2
- import * as Keyboard from "./Keyboard.js";
3
- import * as MIDI from "./MIDI.js";
1
+ import * as Mouse from './Mouse.js';
2
+ import * as Keyboard from './Keyboard.js';
3
+ import * as MIDI from './MIDI.js';
4
4
 
5
- export * from "./Mouse.js";
6
- export * from "./Keyboard.js";
7
- export * from "./MIDI.js";
5
+ export * from './Mouse.js';
6
+ export * from './Keyboard.js';
7
+ export * from './MIDI.js';
8
8
 
9
9
  export { Mouse, Keyboard, MIDI };
10
10
 
11
11
  /**
12
12
  * Remove all listeners for all kinds of inputs for a specific context
13
- * @param {string} context
13
+ * @param {string} context
14
14
  */
15
15
  export const removeHotListeners = (context) => {
16
16
  Mouse.removeHotListeners(context);
@@ -1,13 +1,13 @@
1
- export const wildcard = "*";
1
+ export const wildcard = '*';
2
2
  export let sketchFiles = [];
3
3
 
4
4
  export function assignSketchFiles(files) {
5
- sketchFiles.push(...files);
6
- };
5
+ sketchFiles.push(...files);
6
+ }
7
7
 
8
8
  export function getContext() {
9
9
  let context;
10
-
10
+
11
11
  const { stack } = new Error();
12
12
  const { url } = import.meta;
13
13
 
@@ -34,4 +34,4 @@ export function getContext() {
34
34
  }
35
35
 
36
36
  return context;
37
- };
37
+ }
@@ -1,90 +1,89 @@
1
1
  <script>
2
- import { onDestroy } from "svelte";
2
+ import { onDestroy } from 'svelte';
3
3
 
4
- import Monitor from "../modules/Monitor.svelte";
5
- import Params from "../modules/Params.svelte";
6
- import { layout } from "../stores/layout";
7
- import { override, preview } from "../stores/rendering";
8
- import { sketches, sketchesKeys } from "../stores/sketches";
9
- import FloatingParams from "./FloatingParams.svelte";
10
- import Column from "./LayoutColumn.svelte";
11
- import Row from "./LayoutRow.svelte";
4
+ import Monitor from '../modules/Monitor.svelte';
5
+ import Params from '../modules/Params.svelte';
6
+ import { layout } from '../stores/layout';
7
+ import { override, preview } from '../stores/rendering';
8
+ import { sketches, sketchesKeys } from '../stores/sketches';
9
+ import FloatingParams from './FloatingParams.svelte';
10
+ import Column from './LayoutColumn.svelte';
11
+ import Row from './LayoutRow.svelte';
12
12
 
13
- console.log(`Made with Fragment. https://fragment.tools`);
13
+ console.log(`Made with Fragment. https://fragment.tools`);
14
14
 
15
- let gui, style, head;
16
- let defaultGUIConfig = {
17
- position: "float",
18
- align: "right",
19
- size: 0.3,
20
- output: false,
21
- hidden: false,
22
- };
15
+ let gui, style, head;
16
+ let defaultGUIConfig = {
17
+ position: 'float',
18
+ align: 'right',
19
+ size: 0.3,
20
+ output: false,
21
+ hidden: false,
22
+ };
23
23
 
24
- let guiConfig = defaultGUIConfig;
25
- $: sketchKey = ($layout.previewing && $preview) ? $preview : $sketchesKeys[0];
26
- $: sketch = $sketches[sketchKey];
24
+ let guiConfig = defaultGUIConfig;
25
+ $: sketchKey = $layout.previewing && $preview ? $preview : $sketchesKeys[0];
26
+ $: sketch = $sketches[sketchKey];
27
27
 
28
- $: {
29
- if (sketch) {
30
- if (sketch.buildConfig) {
31
- override(sketch.buildConfig);
32
- }
28
+ $: {
29
+ if (sketch) {
30
+ if (sketch.buildConfig) {
31
+ override(sketch.buildConfig);
32
+ }
33
33
 
34
- const config = sketch.buildConfig ? sketch.buildConfig : {};
35
- gui = config.gui;
34
+ const config = sketch.buildConfig ? sketch.buildConfig : {};
35
+ gui = config.gui;
36
36
 
37
- if (gui && typeof gui === "object") {
38
- guiConfig = {
39
- ...defaultGUIConfig,
40
- ...gui,
41
- };
42
- }
37
+ if (gui && typeof gui === 'object') {
38
+ guiConfig = {
39
+ ...defaultGUIConfig,
40
+ ...gui,
41
+ };
42
+ }
43
43
 
44
- const { styles = "" } = config;
44
+ const { styles = '' } = config;
45
45
 
46
- if (styles !== "") {
47
- head = document.getElementsByTagName('head')[0];
46
+ if (styles !== '') {
47
+ head = document.getElementsByTagName('head')[0];
48
48
 
49
- if (style) {
50
- head.removeChild(style);
51
- }
49
+ if (style) {
50
+ head.removeChild(style);
51
+ }
52
52
 
53
- style = document.createElement('style');
54
- style.setAttribute('type', 'text/css');
55
- style.appendChild(document.createTextNode(styles));
56
- head.appendChild(style);
53
+ style = document.createElement('style');
54
+ style.setAttribute('type', 'text/css');
55
+ style.appendChild(document.createTextNode(styles));
56
+ head.appendChild(style);
57
+ }
57
58
  }
58
-
59
59
  }
60
- }
61
60
 
62
- onDestroy(() => {
63
- if (style && head) {
64
- head.removeChild(style);
65
- }
66
- });
61
+ onDestroy(() => {
62
+ if (style && head) {
63
+ head.removeChild(style);
64
+ }
65
+ });
67
66
  </script>
68
67
 
69
68
  {#if gui}
70
- {#if guiConfig.position === "fixed"}
71
- <Row>
72
- {#if guiConfig.align === "right"}
73
- <Column size={1 - guiConfig.size}>
74
- <Monitor hasHeader={false} {sketchKey} />
75
- </Column>
76
- <Column size={guiConfig.size}>
77
- <Params hasHeader={false} {output}/>
78
- </Column>
79
- {:else}
80
- <Column size={guiConfig.size}>
81
- <Params hasHeader={false} {output}/>
82
- </Column>
83
- <Column size={1 - guiConfig.size}>
84
- <Monitor hasHeader={false} {sketchKey} />
85
- </Column>
86
- {/if}
87
- </Row>
69
+ {#if guiConfig.position === 'fixed'}
70
+ <Row>
71
+ {#if guiConfig.align === 'right'}
72
+ <Column size={1 - guiConfig.size}>
73
+ <Monitor hasHeader={false} {sketchKey} />
74
+ </Column>
75
+ <Column size={guiConfig.size}>
76
+ <Params hasHeader={false} />
77
+ </Column>
78
+ {:else}
79
+ <Column size={guiConfig.size}>
80
+ <Params hasHeader={false} />
81
+ </Column>
82
+ <Column size={1 - guiConfig.size}>
83
+ <Monitor hasHeader={false} {sketchKey} />
84
+ </Column>
85
+ {/if}
86
+ </Row>
88
87
  {:else}
89
88
  <Monitor hasHeader={false} {sketchKey} />
90
89
  <FloatingParams
@@ -94,6 +93,6 @@ onDestroy(() => {
94
93
  hidden={guiConfig.hidden}
95
94
  />
96
95
  {/if}
97
- {:else }
98
- <Monitor hasHeader={false}/>
96
+ {:else}
97
+ <Monitor hasHeader={false} />
99
98
  {/if}
@@ -1,37 +1,45 @@
1
1
  <script>
2
- import { clearErrors } from "../stores/errors";
2
+ import { clearErrors } from '../stores/errors';
3
3
 
4
- export let error;
4
+ export let error;
5
5
 
6
- export function getLineAndColNumber(stack) {
7
- const match = stack.match(/(:([0-9]+)\:([0-9]+))/);
6
+ export function getLineAndColNumber(stack) {
7
+ const match = stack.match(/(:([0-9]+)\:([0-9]+))/);
8
8
 
9
- let lineNumber, colNumber;
9
+ let lineNumber, colNumber;
10
10
 
11
- if (match && match[2] && match[3]) {
12
- lineNumber = match[2];
13
- colNumber = match[3];
11
+ if (match && match[2] && match[3]) {
12
+ lineNumber = match[2];
13
+ colNumber = match[3];
14
+ }
15
+
16
+ return { lineNumber, colNumber };
14
17
  }
15
18
 
16
- return { lineNumber, colNumber };
17
- }
18
-
19
- $: stackLines = error.stack ?
20
- error.stack.split('\n')
21
- .filter((line, i, s) => s.length === 1 ? true : i !== 0)
22
- .filter((line) => !line.includes('/app'))
23
- .map((line) => {
24
- // remove path to file in URL
25
- line = line.replace(`${window.location.origin}/@fs${__CWD__}/`, "");
26
- // remove vite injected params in URL
27
- line = line.replace(/\?.+?\:/g, ":");
28
-
29
- return line;
30
- }) :
31
- null;
32
-
33
- $: extract = error.source ?
34
- error.source.split("\n").map((text, index) => ({ text, highlighted: text.includes(`> ${error.lineNumber}:`) })) : [];
19
+ $: stackLines = error.stack
20
+ ? error.stack
21
+ .split('\n')
22
+ .filter((line, i, s) => (s.length === 1 ? true : i !== 0))
23
+ .filter((line) => !line.includes('/app'))
24
+ .map((line) => {
25
+ // remove path to file in URL
26
+ line = line.replace(
27
+ `${window.location.origin}/@fs${__CWD__}/`,
28
+ '',
29
+ );
30
+ // remove vite injected params in URL
31
+ line = line.replace(/\?.+?\:/g, ':');
32
+
33
+ return line;
34
+ })
35
+ : null;
36
+
37
+ $: extract = error.source
38
+ ? error.source.split('\n').map((text, index) => ({
39
+ text,
40
+ highlighted: text.includes(`> ${error.lineNumber}:`),
41
+ }))
42
+ : [];
35
43
  </script>
36
44
 
37
45
  <div class="error-overlay" on:click={() => clearErrors()}>
@@ -45,86 +53,92 @@ $: extract = error.source ?
45
53
  </p>
46
54
  {/if}
47
55
  {#if extract.length > 0}
48
- <div class="extract">
49
- {#each extract as line}
50
- <span class="extract-line" class:highlighted={line.highlighted}>{line.text}</span>
51
- {/each}
52
- </div>
56
+ <div class="extract">
57
+ {#each extract as line}
58
+ <span
59
+ class="extract-line"
60
+ class:highlighted={line.highlighted}>{line.text}</span
61
+ >
62
+ {/each}
63
+ </div>
53
64
  {/if}
54
65
  </div>
55
- <span class="console">Open your browser's console to further inspect this error. Click to dismiss.</span>
66
+ <span class="console"
67
+ >Open your browser's console to further inspect this error. Click to
68
+ dismiss.</span
69
+ >
56
70
  </div>
57
71
 
58
72
  <style>
59
- .error-overlay {
60
- position: absolute;
61
- top: 0;
62
- left: 0;
63
-
64
- display: flex;
65
- flex-direction: column;
66
- justify-content: space-between;
67
- width: 100%;
68
- height: 100%;
69
- padding: 12px 18px;
70
-
71
- color: #FF8081;
72
-
73
- background-color: #2A0000;
74
- }
75
-
76
- h2 {
77
- color: #FF8081;
78
- font-size: 1rem;
79
- }
80
-
81
- .stack {
82
- padding-left: 18px;
83
- font-size: 13px;
84
- }
85
-
86
- .stack span {
87
- display: block;
88
- }
89
-
90
- .extract {
91
- display: flex;
92
- flex-direction: column;
93
- justify-content: stretch;
94
- color: #2A0000;
95
- padding: 12px 0;
96
- font-size: var(--font-size-input);
97
- background-color: #FF8081;
98
- border-radius: var(--border-radius-input);
99
- overflow-x: auto;
100
- }
101
-
102
- .extract::-webkit-scrollbar {
103
- height: 5px; /* width of the entire scrollbar */
104
- }
105
-
106
- .extract::-webkit-scrollbar-track {
107
- background-color: #5C0000;
108
- }
109
-
110
- .extract::-webkit-scrollbar-thumb {
111
- background-color: #f0f0f0; /* color of the scroll thumb */
112
- border-radius: 20px; /* roundness of the scroll thumb */
113
- }
114
-
115
- .extract-line {
116
- display: block;
117
- white-space: pre;
118
- padding: 0 12px;
119
- width: 100%;
120
- }
121
-
122
- .extract-line.highlighted {
123
- background-color: rgba(0, 0, 0, 0.1);
124
- border-radius: 1px;
125
- }
126
-
127
- .console {
128
- font-size: var(--font-size-input);
129
- }
73
+ .error-overlay {
74
+ position: absolute;
75
+ top: 0;
76
+ left: 0;
77
+
78
+ display: flex;
79
+ flex-direction: column;
80
+ justify-content: space-between;
81
+ width: 100%;
82
+ height: 100%;
83
+ padding: 12px 18px;
84
+
85
+ color: #ff8081;
86
+
87
+ background-color: #2a0000;
88
+ }
89
+
90
+ h2 {
91
+ color: #ff8081;
92
+ font-size: 1rem;
93
+ }
94
+
95
+ .stack {
96
+ padding-left: 18px;
97
+ font-size: 13px;
98
+ }
99
+
100
+ .stack span {
101
+ display: block;
102
+ }
103
+
104
+ .extract {
105
+ display: flex;
106
+ flex-direction: column;
107
+ justify-content: stretch;
108
+ color: #2a0000;
109
+ padding: 12px 0;
110
+ font-size: var(--font-size-input);
111
+ background-color: #ff8081;
112
+ border-radius: var(--border-radius-input);
113
+ overflow-x: auto;
114
+ }
115
+
116
+ .extract::-webkit-scrollbar {
117
+ height: 5px; /* width of the entire scrollbar */
118
+ }
119
+
120
+ .extract::-webkit-scrollbar-track {
121
+ background-color: #5c0000;
122
+ }
123
+
124
+ .extract::-webkit-scrollbar-thumb {
125
+ background-color: #f0f0f0; /* color of the scroll thumb */
126
+ border-radius: 20px; /* roundness of the scroll thumb */
127
+ }
128
+
129
+ .extract-line {
130
+ display: block;
131
+ white-space: pre;
132
+ padding: 0 12px;
133
+ width: 100%;
134
+ }
135
+
136
+ .extract-line.highlighted {
137
+ background-color: rgba(0, 0, 0, 0.1);
138
+ border-radius: 1px;
139
+ }
140
+
141
+ .console {
142
+ font-size: var(--font-size-input);
143
+ }
130
144
  </style>