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
@@ -0,0 +1,95 @@
1
+ import * as THREE from 'three';
2
+ import fragmentShader from './fragment.fs';
3
+
4
+ let camera;
5
+ let uniforms = {
6
+ uResolution: { value: new THREE.Vector2() },
7
+ uTime: { value: 0 },
8
+ };
9
+
10
+ /**
11
+ * @param {object} params
12
+ * @param {HTMLCanvasElement} params.canvas
13
+ * @param {THREE.Renderer} params.renderer
14
+ * @param {THREE.Scene} params.scene
15
+ * @param {number} params.width
16
+ * @param {number} params.height
17
+ * @param {number} params.pixelRatio
18
+ */
19
+ export let init = ({ scene, width, height }) => {
20
+ camera = new THREE.OrthographicCamera(1, 1, 1, 1, 1, 1000);
21
+
22
+ let geometry = new THREE.BufferGeometry();
23
+ geometry.setAttribute(
24
+ 'position',
25
+ new THREE.Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3),
26
+ );
27
+ geometry.setAttribute(
28
+ 'uv',
29
+ new THREE.Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2),
30
+ );
31
+
32
+ let mesh = new THREE.Mesh(
33
+ geometry,
34
+ new THREE.RawShaderMaterial({
35
+ vertexShader: `
36
+ attribute vec3 position;
37
+ attribute vec2 uv;
38
+
39
+ varying vec2 vUv;
40
+
41
+ void main() {
42
+ vUv = uv;
43
+ gl_Position = vec4(position, 1.);
44
+ }
45
+ `,
46
+ fragmentShader,
47
+ uniforms,
48
+ }),
49
+ );
50
+
51
+ scene.add(mesh);
52
+ };
53
+
54
+ /**
55
+ * @param {object} params
56
+ * @param {HTMLCanvasElement} params.canvas
57
+ * @param {THREE.Renderer} params.renderer
58
+ * @param {THREE.Scene} params.scene
59
+ * @param {number} params.width
60
+ * @param {number} params.height
61
+ * @param {number} params.pixelRatio
62
+ * @param {number} params.time
63
+ * @param {number} params.deltaTime
64
+ * @param {number} params.frame
65
+ * @param {number} params.playhead
66
+ * @param {number} params.playcount
67
+ */
68
+ export let update = ({ renderer, scene, time, deltaTime }) => {
69
+ uniforms.uTime.value = time;
70
+
71
+ renderer.render(scene, camera);
72
+ };
73
+
74
+ /**
75
+ * @param {object} params
76
+ * @param {HTMLCanvasElement} params.canvas
77
+ * @param {THREE.Renderer} params.renderer
78
+ * @param {THREE.Scene} params.scene
79
+ * @param {number} params.width
80
+ * @param {number} params.height
81
+ * @param {number} params.pixelRatio
82
+ */
83
+ export let resize = ({ width, height }) => {
84
+ uniforms.uResolution.value.x = width;
85
+ uniforms.uResolution.value.y = height;
86
+
87
+ camera.left = -width * 0.5;
88
+ camera.right = width * 0.5;
89
+ camera.top = height * 0.5;
90
+ camera.bottom = -height * 0.5;
91
+
92
+ camera.updateProjectionMatrix();
93
+ };
94
+
95
+ export let rendering = 'three';
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "three-fragment",
3
+ "description": "A fullscreen fragment shader with THREE.js",
4
+ "dependencies": ["three"]
5
+ }
@@ -0,0 +1,55 @@
1
+ import * as THREE from 'three';
2
+
3
+ let camera;
4
+
5
+ /**
6
+ * @param {object} params
7
+ * @param {HTMLCanvasElement} params.canvas
8
+ * @param {THREE.Renderer} params.renderer
9
+ * @param {THREE.Scene} params.scene
10
+ * @param {number} params.width
11
+ * @param {number} params.height
12
+ * @param {number} params.pixelRatio
13
+ */
14
+ export let init = ({ scene, width, height }) => {
15
+ camera = new THREE.OrthographicCamera(1, 1, 1, 1, 1, 1000);
16
+ camera.position.z = 1;
17
+ };
18
+
19
+ /**
20
+ * @param {object} params
21
+ * @param {HTMLCanvasElement} params.canvas
22
+ * @param {THREE.Renderer} params.renderer
23
+ * @param {THREE.Scene} params.scene
24
+ * @param {number} params.width
25
+ * @param {number} params.height
26
+ * @param {number} params.pixelRatio
27
+ * @param {number} params.time
28
+ * @param {number} params.deltaTime
29
+ * @param {number} params.frame
30
+ * @param {number} params.playhead
31
+ * @param {number} params.playcount
32
+ */
33
+ export let update = ({ renderer, scene, time, deltaTime }) => {
34
+ renderer.render(scene, camera);
35
+ };
36
+
37
+ /**
38
+ * @param {object} params
39
+ * @param {HTMLCanvasElement} params.canvas
40
+ * @param {THREE.Renderer} params.renderer
41
+ * @param {THREE.Scene} params.scene
42
+ * @param {number} params.width
43
+ * @param {number} params.height
44
+ * @param {number} params.pixelRatio
45
+ */
46
+ export let resize = ({ width, height }) => {
47
+ camera.left = -width * 0.5;
48
+ camera.right = width * 0.5;
49
+ camera.top = height * 0.5;
50
+ camera.bottom = -height * 0.5;
51
+
52
+ camera.updateProjectionMatrix();
53
+ };
54
+
55
+ export let rendering = 'three';
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "three-orthographic",
3
+ "description": "An empty scene with a THREE.OrthographicCamera",
4
+ "dependencies": ["three"]
5
+ }
@@ -0,0 +1,52 @@
1
+ import * as THREE from 'three';
2
+
3
+ let camera;
4
+
5
+ /**
6
+ * @param {object} params
7
+ * @param {HTMLCanvasElement} params.canvas
8
+ * @param {THREE.Renderer} params.renderer
9
+ * @param {THREE.Scene} params.scene
10
+ * @param {number} params.width
11
+ * @param {number} params.height
12
+ * @param {number} params.pixelRatio
13
+ */
14
+ export let init = ({ scene, width, height }) => {
15
+ camera = new THREE.PerspectiveCamera(45, 1, 0.1, 100);
16
+ camera.position.z = 10;
17
+ camera.lookAt(new THREE.Vector3());
18
+ };
19
+
20
+ /**
21
+ * @param {object} params
22
+ * @param {HTMLCanvasElement} params.canvas
23
+ * @param {THREE.Renderer} params.renderer
24
+ * @param {THREE.Scene} params.scene
25
+ * @param {number} params.width
26
+ * @param {number} params.height
27
+ * @param {number} params.pixelRatio
28
+ * @param {number} params.time
29
+ * @param {number} params.deltaTime
30
+ * @param {number} params.frame
31
+ * @param {number} params.playhead
32
+ * @param {number} params.playcount
33
+ */
34
+ export let update = ({ renderer, scene, time, deltaTime }) => {
35
+ renderer.render(scene, camera);
36
+ };
37
+
38
+ /**
39
+ * @param {object} params
40
+ * @param {HTMLCanvasElement} params.canvas
41
+ * @param {THREE.Renderer} params.renderer
42
+ * @param {THREE.Scene} params.scene
43
+ * @param {number} params.width
44
+ * @param {number} params.height
45
+ * @param {number} params.pixelRatio
46
+ */
47
+ export let resize = ({ width, height }) => {
48
+ camera.aspect = width / height;
49
+ camera.updateProjectionMatrix();
50
+ };
51
+
52
+ export let rendering = 'three';
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "three-perspective",
3
+ "description": "An empty scene with a THREE.PerspectiveCamera",
4
+ "dependencies": ["three"]
5
+ }
@@ -0,0 +1,70 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { isCancel } from '@clack/core';
5
+ import { log } from './log.js';
6
+
7
+ /** @type {string} */
8
+ export const packageManager = getPackageManager() || 'npm';
9
+
10
+ /**
11
+ * From https://github.com/sveltejs/kit/blob/main/packages/create-svelte/utils.js#L56
12
+ */
13
+ function getPackageManager() {
14
+ if (!process.env.npm_config_user_agent) {
15
+ return undefined;
16
+ }
17
+ const user_agent = process.env.npm_config_user_agent;
18
+ const pm_spec = user_agent.split(' ')[0];
19
+ const separator_pos = pm_spec.lastIndexOf('/');
20
+ const name = pm_spec.substring(0, separator_pos);
21
+ return name === 'npminstall' ? 'cnpm' : name;
22
+ }
23
+
24
+ /**
25
+ * Create a directory without throwing error if it already exists
26
+ * @param {string} dir
27
+ */
28
+ export function mkdirp(dir) {
29
+ try {
30
+ fs.mkdirSync(dir, { recursive: true });
31
+ } catch (e) {
32
+ if (/** @type {any} */ (e).code === 'EEXIST') return;
33
+ throw e;
34
+ }
35
+ }
36
+
37
+ /** @param {string} path */
38
+ export function file(path) {
39
+ return fileURLToPath(new URL(`${path}`, import.meta.url).href);
40
+ }
41
+
42
+ export function handleCancelledPrompt(prompt, prefix) {
43
+ if (isCancel(prompt)) {
44
+ log.error(`Cancelled`, prefix);
45
+ process.exit(1);
46
+ }
47
+ }
48
+
49
+ /** @param {number} milliseconds */
50
+ export function prettifyTime(milliseconds) {
51
+ if (milliseconds > 999) {
52
+ return (milliseconds / 1000).toFixed(2) + 's';
53
+ } else {
54
+ return milliseconds + 'ms';
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Add extension to a string if it doesn't have any
60
+ * @param {string} filepath
61
+ * @param {string} ext
62
+ * @returns {string}
63
+ */
64
+ export function addExtension(filepath, ext) {
65
+ if (path.extname(filepath) === '') {
66
+ return `${filepath}${ext}`;
67
+ }
68
+
69
+ return filepath;
70
+ }
package/src/cli/ws.js CHANGED
@@ -1,92 +1,101 @@
1
- import fs from "fs";
2
- import path from "path";
3
1
  import getPort from 'get-port';
4
- import log from "./log.js";
5
2
  import WebSocket, { WebSocketServer } from 'ws';
6
- import db from "./db.js";
3
+ import { log } from './log.js';
7
4
 
8
- export async function start({
9
- port = 1234,
10
- cwd = "",
11
- } = {}) {
12
- port = await getPort({ port });
5
+ /**
6
+ * @param {object} params
7
+ * @param {number} params.port
8
+ */
9
+ export async function start({ port = 1234 } = {}) {
10
+ port = await getPort({ port });
13
11
 
14
- let wss = new WebSocketServer({ port });
12
+ let wss = new WebSocketServer({ port });
15
13
 
16
- wss.on('connection', (socket) => {
17
- socket.on('message', (message) => {
18
- const json = JSON.parse(message);
19
- const { event, data } = json;
20
-
21
- if (event === "save") {
22
- const { key, value } = data;
23
- db.save(key, value);
24
- }
14
+ log.info(`Starting WebSocket server...`);
25
15
 
26
- send(json, {
27
- sender: socket
28
- });
29
- });
16
+ wss.on('connection', (socket) => {
17
+ socket.on('message', (message) => {
18
+ const json = JSON.parse(message);
30
19
 
31
- send({
32
- event: 'start',
33
- data: {
34
- clientCount: wss.clients.size - 1,
35
- },
36
- }, {
37
- include: socket
38
- });
20
+ send(json, {
21
+ sender: socket,
22
+ });
23
+ });
39
24
 
40
- send({
41
- event: 'client-connect',
42
- data: {
43
- clientCount: wss.clients.size - 1
44
- }
45
- }, {
46
- exclude: socket,
47
- });
25
+ send(
26
+ {
27
+ event: 'start',
28
+ data: {
29
+ clientCount: wss.clients.size - 1,
30
+ },
31
+ },
32
+ {
33
+ include: socket,
34
+ },
35
+ );
48
36
 
49
- socket.on('close', () => {
50
- send({
51
- event: 'client-disconnect',
52
- data: {
53
- clientCount: wss.clients.size - 1
54
- }
55
- }, {
56
- exclude: socket,
57
- });
58
- });
59
- });
37
+ send(
38
+ {
39
+ event: 'client-connect',
40
+ data: {
41
+ clientCount: wss.clients.size - 1,
42
+ },
43
+ },
44
+ {
45
+ exclude: socket,
46
+ },
47
+ );
60
48
 
61
- wss.on('error', (e) => {
62
- if (e.code !== 'EADDRINUSE') {
63
- console.error(`WebSocket server error:\n${e.stack || e.message}`);
64
- }
65
- });
49
+ socket.on('close', () => {
50
+ send(
51
+ {
52
+ event: 'client-disconnect',
53
+ data: {
54
+ clientCount: wss.clients.size - 1,
55
+ },
56
+ },
57
+ {
58
+ exclude: socket,
59
+ },
60
+ );
61
+ });
62
+ });
66
63
 
67
- function send(payload, { transform = true, exclude = null, include = null } = {}) {
68
- const stringified = transform ? JSON.stringify(payload) : payload;
64
+ wss.on('error', (e) => {
65
+ if (e.code !== 'EADDRINUSE') {
66
+ console.error(`WebSocket server error:\n${e.stack || e.message}`);
67
+ }
68
+ });
69
69
 
70
- wss.clients.forEach((client) => {
71
- if (client.readyState === WebSocket.OPEN && (client !== exclude || client === include)) {
72
- client.send(stringified);
73
- }
74
- });
75
- }
70
+ function send(
71
+ payload,
72
+ { transform = true, exclude = null, include = null } = {},
73
+ ) {
74
+ const stringified = transform ? JSON.stringify(payload) : payload;
76
75
 
77
- return {
78
- port,
79
- send,
80
- close: () => {
81
- return new Promise((resolve, reject) => {
82
- wss.close((err) => {
83
- if (err) {
84
- reject(err)
85
- } else {
86
- resolve()
87
- }
88
- });
89
- });
90
- }
91
- };
76
+ wss.clients.forEach((client) => {
77
+ if (
78
+ client.readyState === WebSocket.OPEN &&
79
+ (client !== exclude || client === include)
80
+ ) {
81
+ client.send(stringified);
82
+ }
83
+ });
84
+ }
85
+
86
+ return {
87
+ port,
88
+ send,
89
+ close: () => {
90
+ return new Promise((resolve, reject) => {
91
+ wss.close((err) => {
92
+ if (err) {
93
+ reject(err);
94
+ } else {
95
+ resolve();
96
+ }
97
+ });
98
+ });
99
+ },
100
+ };
92
101
  }
@@ -1,7 +1,7 @@
1
1
  <script>
2
- import Layout from "./ui/Layout.svelte";
3
- import Init from "./components/Init.svelte";
4
- import "./client";
2
+ import Layout from './ui/Layout.svelte';
3
+ import Init from './components/Init.svelte';
4
+ import './client';
5
5
  </script>
6
6
 
7
7
  <Init />
@@ -1,68 +1,84 @@
1
- const socketProtocol = (location.protocol === 'https:' ? 'wss' : 'ws');
1
+ const socketProtocol = location.protocol === 'https:' ? 'wss' : 'ws';
2
2
  const socketHost = `${location.hostname}:${__FRAGMENT_PORT__}`;
3
3
 
4
- let socket, listeners = {};
4
+ let socket,
5
+ listeners = {};
5
6
 
6
7
  function handleMessage(payload) {
7
- const { event, data = {} } = payload;
8
- const callbacks = listeners[event];
8
+ const { event, data = {} } = payload;
9
+ const callbacks = listeners[event];
9
10
 
10
- if (callbacks && callbacks.length) {
11
- callbacks.forEach((cb) => cb(data));
12
- }
11
+ if (callbacks && callbacks.length) {
12
+ callbacks.forEach((cb) => cb(data));
13
+ }
13
14
  }
14
15
 
15
16
  function on(event, cb) {
16
- if (!listeners[event]) {
17
- listeners[event] = [];
18
- }
17
+ if (!listeners[event]) {
18
+ listeners[event] = [];
19
+ }
19
20
 
20
- listeners[event].push(cb);
21
+ listeners[event].push(cb);
21
22
 
22
- return () => {
23
- off(event, cb);
24
- };
23
+ return () => {
24
+ off(event, cb);
25
+ };
25
26
  }
26
27
 
27
- function off(event, cb) {
28
- const callbacks = listeners[event];
28
+ function off(event, cb) {
29
+ const callbacks = listeners[event];
29
30
 
30
- if (callbacks && callbacks.length) {
31
- const filtered = callbacks.filter((callback) => callback !== cb);
31
+ if (callbacks && callbacks.length) {
32
+ const filtered = callbacks.filter((callback) => callback !== cb);
32
33
 
33
- listeners[event] = filtered;
34
- }
34
+ listeners[event] = filtered;
35
+ }
35
36
  }
36
37
 
37
38
  let opened = false;
38
39
  function emit(event, data) {
39
- if (opened) {
40
- socket.send(JSON.stringify({
41
- event,
42
- data,
43
- }));
44
- }
40
+ if (opened) {
41
+ socket.send(
42
+ JSON.stringify({
43
+ event,
44
+ data,
45
+ }),
46
+ );
47
+ }
45
48
  }
46
49
 
47
50
  if (import.meta.hot) {
48
- console.log("[fragment] connecting...");
51
+ console.log('[fragment] connecting...');
49
52
 
50
- socket = new WebSocket(`${socketProtocol}://${socketHost}`);
53
+ socket = new WebSocket(`${socketProtocol}://${socketHost}`);
51
54
 
52
- socket.addEventListener('message', async (message) => {
53
- const { data } = message;
55
+ socket.addEventListener('message', async (message) => {
56
+ const { data } = message;
54
57
 
55
- handleMessage(JSON.parse(data));
56
- });
58
+ handleMessage(JSON.parse(data));
59
+ });
57
60
 
58
- socket.addEventListener("open", () => {
59
- console.log("[fragment] connected.");
60
- opened = true;
61
- });
61
+ socket.addEventListener('open', () => {
62
+ console.log('[fragment] connected.');
63
+ opened = true;
64
+ });
62
65
 
63
- import.meta.hot.on('sketch-update', (data) => {
64
- console.log(`[fragment] hmr update /${data.filepath}`);
65
- })
66
+ import.meta.hot.on('sketch-update', (data) => {
67
+ console.log(`[fragment] hmr update /${data.filepath}`);
68
+ });
66
69
  }
67
70
 
68
71
  export const client = { on, off, emit };
72
+
73
+ client.on('shader-update', (shaderUpdates) => {
74
+ shaderUpdates.forEach(({ warnings = [] } = {}) => {
75
+ if (warnings.length > 0) {
76
+ warnings.forEach((warning) => {
77
+ const { location } = warning;
78
+ console.warn(
79
+ `[fragment-plugin-hsr] ${warning.type} ${warning.importer}\n\n ${location.lineText}\n\n${warning.message}`,
80
+ );
81
+ });
82
+ }
83
+ });
84
+ });
@@ -4,26 +4,26 @@
4
4
  </div>
5
5
 
6
6
  <style>
7
- .icon-cross {
8
- position: relative;
9
- width: 100%;
10
- height: 100%;
11
- }
7
+ .icon-cross {
8
+ position: relative;
9
+ width: 100%;
10
+ height: 100%;
11
+ }
12
12
 
13
- .icon-cross-side {
14
- --size: 10px;
15
- position: absolute;
16
- top: calc(50% - 1px);
17
- left: calc(50% - var(--size) * 0.5);
18
- width: var(--size);
19
- height: 2px;
13
+ .icon-cross-side {
14
+ --size: 10px;
15
+ position: absolute;
16
+ top: calc(50% - 1px);
17
+ left: calc(50% - var(--size) * 0.5);
18
+ width: var(--size);
19
+ height: 2px;
20
20
 
21
- transform: rotate(45deg);
21
+ transform: rotate(45deg);
22
22
 
23
- background-color: #551717;
24
- }
23
+ background-color: #551717;
24
+ }
25
25
 
26
- .icon-cross-side:last-child {
27
- transform: rotate(-45deg);
28
- }
26
+ .icon-cross-side:last-child {
27
+ transform: rotate(-45deg);
28
+ }
29
29
  </style>