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
@@ -12,25 +12,28 @@
12
12
  }
13
13
 
14
14
  :root {
15
- --font-mono: "Jetbrains Mono", monospace;
15
+ --font-mono: 'Jetbrains Mono', monospace;
16
16
 
17
17
  --color-lightred: #ffaeae;
18
18
  --color-red: #ff4444;
19
19
  --color-green: #9af49f;
20
- --color-lightblack: #0E0E0E;
21
-
20
+ --color-lightblack: #0e0e0e;
21
+
22
22
  --color-background: #242425;
23
23
  --color-active: #177bd0;
24
+ --color-active-disabled: #214366;
24
25
  --color-text: #f0f0f0;
25
26
  --color-border: var(--color-lightblack);
26
27
  --color-border-input: #000000;
27
- --color-background-input: #1d1d1e;
28
- --color-spacing: #323233;
28
+ --color-text-input: #989899;
29
+ --color-text-input-disabled: #535354;
30
+ --color-background-input: #1d1d1e;
31
+ --color-spacing: #323233;
29
32
 
30
33
  --height-input: 20px;
31
34
  --height-topbar: 24px;
32
- --border-radius-input: 3px;
33
- --font-size-input: 11px;
35
+ --border-radius-input: 3px;
36
+ --font-size-input: 11px;
34
37
  }
35
38
 
36
39
  html {
@@ -63,7 +66,8 @@ body {
63
66
  overflow: hidden;
64
67
  }
65
68
 
66
- ul, ol {
69
+ ul,
70
+ ol {
67
71
  list-style: none;
68
72
  margin: 0;
69
73
  padding: 0;
@@ -75,7 +79,9 @@ ul, ol {
75
79
  scrollbar-color: var(--color-active) transparent;
76
80
  }
77
81
 
78
- input, select, button {
82
+ input,
83
+ select,
84
+ button {
79
85
  -webkit-appearance: none;
80
86
  padding: 0;
81
87
  margin: 0;
@@ -83,19 +89,23 @@ input, select, button {
83
89
  font-family: var(--font-mono);
84
90
  }
85
91
 
86
- h1, h2, h3, h4, h5 {
92
+ h1,
93
+ h2,
94
+ h3,
95
+ h4,
96
+ h5 {
87
97
  font-weight: 400;
88
98
  margin: 0;
89
99
  padding: 0;
90
100
  }
91
101
 
92
102
  .visually-hidden {
93
- position: absolute;
94
- left: -10000px;
95
- top: auto;
96
- width: 1px;
97
- height: 1px;
98
- overflow: hidden;
103
+ position: absolute;
104
+ left: -10000px;
105
+ top: auto;
106
+ width: 1px;
107
+ height: 1px;
108
+ overflow: hidden;
99
109
  }
100
110
 
101
111
  .loading {
package/src/cli/db.js DELETED
@@ -1,17 +0,0 @@
1
- const state = {
2
- 'hello': 'world',
3
- };
4
-
5
- export function save(key, value) {
6
- console.log("database :: save");
7
- state[key] = value;
8
- };
9
-
10
- export function read() {
11
- return state;
12
- }
13
-
14
- export default {
15
- read,
16
- save,
17
- };
package/src/cli/index.js DELETED
@@ -1,198 +0,0 @@
1
- import fs from "fs/promises";
2
- import path from "path";
3
- import log from "./log.js";
4
- import { start as startViteServer } from "./server.js";
5
- import { start as startWebSocketServer } from "./ws.js";
6
- import templates from "./templates/index.js";
7
-
8
- import { fileURLToPath } from 'url';
9
-
10
- const __filename = fileURLToPath(import.meta.url);
11
- const __dirname = path.dirname(__filename);
12
- const timestamp = Date.now();
13
-
14
- export const run = async (entry, options) => {
15
- let wsServer;
16
-
17
- function exit() {
18
- process.off('SIGTERM', exit);
19
-
20
- if (wsServer) {
21
- wsServer.close();
22
- }
23
- }
24
-
25
- process.once('SIGTERM', exit);
26
-
27
- try {
28
- const entries = await createEntries(entry, options);
29
-
30
- if (entries.length > 0) {
31
- const filepaths = await generateFiles(entries, options);
32
-
33
- if (!options.build) {
34
- wsServer = await startWebSocketServer({
35
- cwd: process.cwd(),
36
- });
37
- }
38
-
39
- await startViteServer({
40
- options,
41
- timestamp,
42
- filepaths,
43
- entries,
44
- fragment: {
45
- server: wsServer,
46
- }
47
- });
48
- }
49
- } catch(error) {
50
- console.log(error);
51
- }
52
- };
53
-
54
- async function createEntries(entry, options) {
55
- if (entry === undefined) {
56
- log.error(`Missing argument.`)
57
- console.log(" Use --new flag to let fragment create the file.");
58
- return;
59
- }
60
-
61
- const entries = [];
62
- let shouldCreateFile = options.new;
63
-
64
- async function createEntryFile(entryPath) {
65
- if (path.extname(entryPath) !== ".js") {
66
- throw new Error(`File extension needs to be .js`);
67
- }
68
-
69
- const createFromTemplate = typeof options.template === "string";
70
- const templateFiles = createFromTemplate ? templates[options.template] : templates.default;
71
-
72
- if (!templateFiles) {
73
- throw new Error(`Error: Template ${options.template} doesn't exist.`);
74
- }
75
-
76
- const entryName = path.basename(entryPath, path.extname(entryPath));
77
-
78
- for (let i = 0; i < templateFiles.length; i++) {
79
- const filepath = path.join(__dirname, templateFiles[i]);
80
- const ext = path.extname(filepath);
81
- let fileContent = (await fs.readFile(filepath)).toString();
82
-
83
- const destPath = i === 0 ? entryPath :
84
- path.join(process.cwd(), `${entryName}${ext}`);
85
- const destName = path.basename(destPath);
86
-
87
- const filepaths = templateFiles
88
- .filter((file, index) => index !== i)
89
- .map((file) => path.basename(file));
90
-
91
- for (let i = 0; i < filepaths.length; i++) {
92
- fileContent = fileContent.replace(new RegExp(filepaths[i], 'g'), `${entryName}${path.extname(filepaths[i])}`);
93
- }
94
-
95
- try {
96
- const stats = await fs.lstat(destPath);
97
-
98
- if (stats.isFile()) {
99
- log.warning(`Ignored argument: --new. File already exists.`);
100
- }
101
- } catch(error) {
102
- if (error.code === "ENOENT") {
103
- await fs.writeFile(destPath, Buffer.from(fileContent));
104
- console.log(`${log.prefix} Created ${path.relative(process.cwd(), destPath)} on disk.`);
105
- } else {
106
- throw error;
107
- }
108
- }
109
- }
110
-
111
- shouldCreateFile = false;
112
- }
113
-
114
- const entryPath = path.join(process.cwd(), entry);
115
-
116
- try {
117
- if (shouldCreateFile) {
118
- await createEntryFile(entryPath);
119
- }
120
-
121
- const stats = await fs.lstat(entryPath);
122
-
123
- if (stats.isFile()) {
124
- entries.push(path.relative(process.cwd(), entryPath));
125
- } else if (stats.isDirectory()) {
126
- const files = await fs.readdir(entryPath);
127
- const sketchFiles = files.filter((file) => path.extname(file) === ".js");
128
-
129
- if (sketchFiles.length === 0) {
130
- log.error(`Folder doesn't contain any sketch files.`);
131
- console.log("Use --new flag to start working on a sketch.");
132
- return;
133
- }
134
-
135
- entries.push(...sketchFiles.map((sketchFile) => path.relative(process.cwd(), sketchFile)));
136
- }
137
- } catch(error) {
138
- if (error.code === "ENOENT") {
139
- log.error(`Error: ${entry} doesn't exist.`);
140
- } else {
141
- log.error(error.message);
142
- }
143
- }
144
-
145
-
146
-
147
- return entries;
148
- }
149
-
150
- async function generateFiles(entries, options) {
151
- log.warning(`Building files for:`);
152
- entries.forEach(entry => console.log(`- ${entry}`));
153
-
154
- const dir = "/node_modules/.fragment";
155
- const dirpath = path.join(process.cwd(), dir);
156
- const filename = `sketches.js`;
157
-
158
- // create directory and don't throw error if it already exists
159
- try {
160
- await fs.mkdir(dirpath, { recursive: true });
161
- } catch (e) {
162
- if (e.code !== 'EEXIST') {
163
- throw e;
164
- }
165
- }
166
-
167
- // generate sketch index file
168
- const code = `
169
- // This file is generated by Fragment. Do not edit it.
170
-
171
- export const sketches = {
172
- ${entries.map((entry) => {
173
- return `"${entry}": () => import("../../${entry}")`
174
- }).join(',')
175
- }
176
- };
177
-
178
- export const onSketchReload = (fn) => {
179
- if (import.meta.hot) {
180
- import.meta.hot.data.onSketchChange = fn;
181
- }
182
- };
183
-
184
- if (import.meta.hot) {
185
- import.meta.hot.accept((m) => {
186
- if (typeof import.meta.hot.data.onSketchChange === "function") {
187
- import.meta.hot.data.onSketchChange(m);
188
- }
189
- });
190
- }
191
- `;
192
-
193
- const filepath = path.join(dirpath, filename);
194
-
195
- await fs.writeFile(filepath, code);
196
-
197
- return [filepath];
198
- }
@@ -1,12 +0,0 @@
1
- import db from "../db.js"
2
-
3
- export default function dbPlugin() {
4
- return {
5
- name: 'db',
6
- configureServer(server) {
7
- server.middlewares.use('/db', (req, res, next) => {
8
- res.end(JSON.stringify(db.read()))
9
- })
10
- }
11
- };
12
- }
@@ -1,86 +0,0 @@
1
- import path from "path";
2
- import glslify from "glslify";
3
-
4
- export default function hotShaderReload({ wss }) {
5
- const fileRegex = /\.(?:frag|vert|glsl|vs|fs)$/
6
-
7
- function addShaderFilepath(shader, id) {
8
- let keyword = `void main`;
9
- let shaderParts = shader.split(keyword);
10
- let hint = `// <filepath://${id}>`;
11
-
12
- return `${shaderParts[0]}
13
- ${hint}
14
- ${keyword}${shaderParts[1]}
15
- `;
16
- }
17
-
18
- let modulesToReload = [];
19
-
20
- function compile(shader) {
21
- return glslify(shader, {
22
- basedir: process.cwd()
23
- });
24
- }
25
-
26
- return {
27
- name: 'hot-shader-reload',
28
- config: () => ({
29
- optimizeDeps: {
30
- esbuildOptions: {
31
- loader: {
32
- ".frag": "text",
33
- ".vert": "text",
34
- ".glsl": "text",
35
- ".fs": "text",
36
- ".vs": "text",
37
- }
38
- },
39
- }
40
- }),
41
- handleHotUpdate: async ({ modules, file, read }) => {
42
- if (fileRegex.test(file)) {
43
- let src = await read();
44
- let source = compile(src);
45
- source = addShaderFilepath(source, file);
46
-
47
- wss.send({
48
- type: 'custom',
49
- event: 'shader-update',
50
- data: {
51
- filepath: file,
52
- source
53
- },
54
- });
55
-
56
- // save modules that were handled
57
- modulesToReload.push(...modules);
58
-
59
- return [];
60
- }
61
-
62
- // add previous modules that were handled to the list of modules to avoid shader invalidation
63
- if (modulesToReload.length > 0) {
64
- const all = [
65
- ...modules,
66
- ...modulesToReload,
67
- ];
68
-
69
- modulesToReload = [];
70
-
71
- return all;
72
- }
73
- },
74
- transform: (src, id) => {
75
- if (fileRegex.test(id)) {
76
- let source = compile(src);
77
- source = addShaderFilepath(source, id);
78
-
79
- return {
80
- code: `export default ${JSON.stringify(source)}`,
81
- map: null // provide source map if available
82
- }
83
- }
84
- }
85
- };
86
- }
@@ -1,46 +0,0 @@
1
- import path from "path";
2
- import fs from "fs/promises";
3
- import fsSync from "fs";
4
- import bodyParser from "body-parser";
5
- import log from "../log.js";
6
-
7
- export default function screenshot({ cwd, exportDir = cwd }) {
8
- let dir = (path.isAbsolute(exportDir) ? exportDir : path.join(cwd, exportDir));
9
-
10
- return {
11
- name: 'screenshot',
12
- configureServer(server){
13
- server.middlewares.use(bodyParser.json({ limit: '100mb'}))
14
- server.middlewares.use('/save', async (req, res, next) => {
15
- if (req.method === "POST") {
16
- const { filename, dataURL } = req.body;
17
-
18
- const filepath = path.join(dir, filename);
19
- const buffer = Buffer.from(dataURL, 'base64');
20
-
21
- if (!fsSync.existsSync(dir)) {
22
- try {
23
- await fs.mkdir(dir, { recursive: true });
24
- } catch(error) {
25
- log.error('Cannot create directory for exports');
26
- console.log(error);
27
- }
28
- }
29
-
30
- try {
31
- await fs.writeFile(filepath, buffer);
32
-
33
- res.writeHead(200, {'Content-Type': 'application/json'});
34
- res.end(JSON.stringify({ filepath }));
35
- } catch(error) {
36
- res.writeHead(500, {'Content-Type': 'application/json'});
37
- res.end(JSON.stringify({ error }));
38
- }
39
- } else {
40
- next();
41
- }
42
- });
43
- }
44
- }
45
-
46
- }
package/src/cli/server.js DELETED
@@ -1,153 +0,0 @@
1
- import path from "path";
2
- import kleur from "kleur";
3
- import { fileURLToPath } from 'url';
4
- import { createServer, defineConfig, build } from "vite";
5
- import { svelte } from '@sveltejs/vite-plugin-svelte'
6
- import hotShaderReload from "./plugins/hot-shader-reload.js";
7
- import hotSketchReload from "./plugins/hot-sketch-reload.js";
8
- import dbPlugin from "./plugins/db.js";
9
-
10
- import log from "./log.js";
11
- import db from "./db.js";
12
- import screenshotPlugin from "./plugins/screenshot.js";
13
- import checkDependencies from "./plugins/check-dependencies.js";
14
-
15
- const __filename = fileURLToPath(import.meta.url);
16
- const __dirname = path.dirname(__filename);
17
-
18
- export async function start({ options, filepaths, entries, fragment }) {
19
- const root = path.join(__dirname, '/../client');
20
- const cwd = process.cwd();
21
- const app = path.join(root, 'app');
22
-
23
- const entriesPaths = entries.map((entry ) => path.join(cwd, entry));
24
-
25
- const config = defineConfig({
26
- configFile: false,
27
- root,
28
- logLevel: options.development ? "info" : "silent",
29
- resolve: {
30
- alias: [
31
- { find: '@fragment/sketches', replacement: filepaths[0] },
32
- { find: '@fragment', replacement: app },
33
- { find: 'three', replacement: path.join(cwd, 'node_modules/three') },
34
- { find: 'p5', replacement: path.join(cwd, 'node_modules/p5') },
35
- { find: 'ogl', replacement: path.join(cwd, 'node_modules/ogl') },
36
- ]
37
- },
38
- plugins: [
39
- svelte({
40
- configFile: false,
41
- onwarn: (warning, handler) => {
42
- if (options.development) {
43
- handler(warning);
44
- } else {
45
- return;
46
- }
47
- }
48
- }),
49
- hotSketchReload({
50
- cwd,
51
- }),
52
- hotShaderReload({ wss: fragment.server }),
53
- {
54
- name: 'configure-response-headers',
55
- configureServer: (server) => {
56
- server.middlewares.use((_req, res, next) => {
57
- res.setHeader("Cross-Origin-Opener-Policy", "same-origin");
58
- res.setHeader("Cross-Origin-Embedder-Policy", "require-corp");
59
- next();
60
- });
61
- }
62
- },
63
- dbPlugin(),
64
- screenshotPlugin({ cwd, exportDir: options.exportDir }),
65
- checkDependencies({
66
- cwd,
67
- app,
68
- entriesPaths,
69
- build: options.build,
70
- })
71
- ],
72
- server: {
73
- port: options.port,
74
- host: true,
75
- fs: {
76
- strict: false,
77
- allow: [".."],
78
- },
79
- },
80
- define: {
81
- '__CWD__': `${JSON.stringify(cwd)}`,
82
- '__FRAGMENT_PORT__': fragment.server ? fragment.server.port : undefined,
83
- '__START_TIME__': Date.now(),
84
- '__SEED__': Date.now(),
85
- '__BUILD__': options.build,
86
- '__DEV__': !options.build,
87
-
88
- },
89
- optimizeDeps: {
90
- include: ['convert-length', 'webm-writer', 'changedpi'],
91
- exclude: [
92
- "@fragment/sketches",
93
- ...entriesPaths,
94
- ]
95
- },
96
- build: {
97
- commonjsOptions: {
98
- include: ['convert-length', 'webm-writer', 'changedpi'],
99
- },
100
- },
101
- });
102
-
103
- if (options.build) {
104
- if (entries.length > 1) {
105
- log.error(`fragment can only build one sketch at a time.`);
106
- return;
107
- }
108
-
109
- const outDir = options.outDir ? options.outDir : entries[0].split('.js')[0];
110
-
111
- await build({
112
- ...config,
113
- logLevel: "info",
114
- build: {
115
- outDir: path.join(process.cwd(), outDir),
116
- emptyOutDir: options.emptyOutDir,
117
- },
118
- });
119
-
120
- log.success(`Built files for:`);
121
- entries.forEach(entry => console.log(`- ${entry}`));
122
- } else {
123
- log.warning(`Starting server...`);
124
- const server = await createServer(config);
125
-
126
- server.middlewares.use('/db', (req, res, next) => {
127
- next();
128
- });
129
-
130
- await server.listen();
131
-
132
- log.success(`Server started at:`);
133
-
134
- const { resolvedUrls } = server;
135
-
136
- for (const url of resolvedUrls.local) {
137
- console.log(
138
- ` ${kleur.green('➜')} ${kleur.bold('Local')}: ${kleur.cyan(
139
- url,
140
- )}`,
141
- );
142
- }
143
- for (const url of resolvedUrls.network) {
144
- console.log(
145
- ` ${kleur.green('➜')} ${kleur.bold('Network')}: ${kleur.cyan(
146
- url,
147
- )}`,
148
- );
149
- }
150
-
151
- return server;
152
- }
153
- }
@@ -1,15 +0,0 @@
1
- export let props = {};
2
-
3
- export let init = ({ context, width, height }) => {
4
-
5
- };
6
-
7
- export let update = ({ context, width, height, time, deltaTime }) => {
8
- context.clearRect(0, 0, width, height);
9
- };
10
-
11
- export let resize = ({ width, height }) => {
12
-
13
- };
14
-
15
- export let rendering = "2d";
@@ -1,13 +0,0 @@
1
- export let props = {};
2
-
3
- export let init = ({ canvas, width, height }) => {
4
-
5
- };
6
-
7
- export let update = ({ width, height, time, deltaTime }) => {
8
-
9
- };
10
-
11
- export let resize = ({ width, height, pixelRatio }) => {
12
-
13
- };
@@ -1,18 +0,0 @@
1
- import fragmentShader from "./fragment.fs";
2
-
3
- let uniforms = {
4
- uTime: { value: 0, type: "float" },
5
- };
6
-
7
- export let init = ({ frag }) => {
8
- frag.uniforms = uniforms;
9
- frag.shader = fragmentShader;
10
- };
11
-
12
- export let update = ({ frag, deltaTime }) => {
13
- uniforms.uTime.value += deltaTime;
14
-
15
- frag.render();
16
- };
17
-
18
- export let rendering = "fragment";
@@ -1,27 +0,0 @@
1
- const templates = {
2
- "blank": [
3
- "./templates/blank.js"
4
- ],
5
- "2d": [
6
- "./templates/2d.js"
7
- ],
8
- "fragment": [
9
- "./templates/fragment.js",
10
- "./templates/fragment.fs"
11
- ],
12
- "three/orthographic": [
13
- "./templates/three-orthographic.js"
14
- ],
15
- "three/fragment": [
16
- "./templates/three-fragment.js",
17
- "./templates/fragment.fs"
18
- ],
19
- "three/perspective": [
20
- "./templates/three-perspective.js"
21
- ],
22
- "p5": [
23
- "./templates/p5.js"
24
- ]
25
- };
26
-
27
- export default templates;
@@ -1,13 +0,0 @@
1
- import p5 from "p5";
2
-
3
- export let props = {};
4
-
5
- export let setup = ({ p, width, height }) => {
6
-
7
- };
8
-
9
- export let draw = ({ p }) => {
10
- p.background(255, 0, 0);
11
- };
12
-
13
- export let rendering = "p5";