@vladimish/motion-canvas-2-vite-plugin 3.17.2

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 (52) hide show
  1. package/lib/index.d.ts +3 -0
  2. package/lib/index.js +23 -0
  3. package/lib/index.js.map +1 -0
  4. package/lib/main.d.ts +82 -0
  5. package/lib/main.js +43 -0
  6. package/lib/main.js.map +1 -0
  7. package/lib/openInExplorer.d.ts +1 -0
  8. package/lib/openInExplorer.js +45 -0
  9. package/lib/openInExplorer.js.map +1 -0
  10. package/lib/partials/assets.d.ts +6 -0
  11. package/lib/partials/assets.js +51 -0
  12. package/lib/partials/assets.js.map +1 -0
  13. package/lib/partials/audio.d.ts +9 -0
  14. package/lib/partials/audio.js +104 -0
  15. package/lib/partials/audio.js.map +1 -0
  16. package/lib/partials/corsProxy.d.ts +43 -0
  17. package/lib/partials/corsProxy.js +219 -0
  18. package/lib/partials/corsProxy.js.map +1 -0
  19. package/lib/partials/editor.d.ts +8 -0
  20. package/lib/partials/editor.js +76 -0
  21. package/lib/partials/editor.js.map +1 -0
  22. package/lib/partials/exporter.d.ts +6 -0
  23. package/lib/partials/exporter.js +49 -0
  24. package/lib/partials/exporter.js.map +1 -0
  25. package/lib/partials/index.d.ts +10 -0
  26. package/lib/partials/index.js +27 -0
  27. package/lib/partials/index.js.map +1 -0
  28. package/lib/partials/meta.d.ts +2 -0
  29. package/lib/partials/meta.js +67 -0
  30. package/lib/partials/meta.js.map +1 -0
  31. package/lib/partials/projects.d.ts +9 -0
  32. package/lib/partials/projects.js +89 -0
  33. package/lib/partials/projects.js.map +1 -0
  34. package/lib/partials/scenes.d.ts +2 -0
  35. package/lib/partials/scenes.js +47 -0
  36. package/lib/partials/scenes.js.map +1 -0
  37. package/lib/partials/settings.d.ts +2 -0
  38. package/lib/partials/settings.js +66 -0
  39. package/lib/partials/settings.js.map +1 -0
  40. package/lib/partials/webgl.d.ts +10 -0
  41. package/lib/partials/webgl.js +89 -0
  42. package/lib/partials/webgl.js.map +1 -0
  43. package/lib/plugins.d.ts +104 -0
  44. package/lib/plugins.js +9 -0
  45. package/lib/plugins.js.map +1 -0
  46. package/lib/utils.d.ts +3 -0
  47. package/lib/utils.js +55 -0
  48. package/lib/utils.js.map +1 -0
  49. package/lib/versions.d.ts +6 -0
  50. package/lib/versions.js +29 -0
  51. package/lib/versions.js.map +1 -0
  52. package/package.json +35 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corsProxy.js","sourceRoot":"","sources":["../../src/partials/corsProxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Plugin } from 'vite';
2
+ import { ProjectData } from '../plugins';
3
+ interface EditorPluginConfig {
4
+ editor: string;
5
+ projects: ProjectData[];
6
+ }
7
+ export declare function editorPlugin({ editor, projects }: EditorPluginConfig): Plugin;
8
+ export {};
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.editorPlugin = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function editorPlugin({ editor, projects }) {
10
+ const editorPath = path_1.default.dirname(require.resolve(editor));
11
+ const editorFile = fs_1.default.readFileSync(path_1.default.resolve(editorPath, 'editor.html'));
12
+ const htmlParts = editorFile
13
+ .toString()
14
+ .replace('{{style}}', `/@fs/${path_1.default.resolve(editorPath, 'style.css')}`)
15
+ .split('{{source}}');
16
+ const createHtml = (src) => htmlParts[0] + src + htmlParts[1];
17
+ const resolvedEditorId = '\0virtual:editor';
18
+ const lookup = new Map();
19
+ for (const project of projects) {
20
+ lookup.set(project.url, project);
21
+ }
22
+ return {
23
+ name: 'motion-canvas:editor',
24
+ async load(id) {
25
+ const [, query] = id.split('?');
26
+ if (id.startsWith(resolvedEditorId)) {
27
+ if (projects.length === 1) {
28
+ /* language=typescript */
29
+ return `\
30
+ import {editor} from '${editor}';
31
+ import project from '${projects[0].filePath}?project';
32
+ editor(project);
33
+ `;
34
+ }
35
+ if (query) {
36
+ const params = new URLSearchParams(query);
37
+ const name = params.get('project');
38
+ if (name && lookup.has(name)) {
39
+ /* language=typescript */
40
+ return `\
41
+ import {editor} from '${editor}';
42
+ import project from '${lookup.get(name).filePath}?project';
43
+ editor(project);
44
+ `;
45
+ }
46
+ }
47
+ /* language=typescript */
48
+ return `\
49
+ import {index} from '${editor}';
50
+ index(${JSON.stringify(projects)});
51
+ `;
52
+ }
53
+ },
54
+ configureServer(server) {
55
+ server.middlewares.use((req, res, next) => {
56
+ if (req.url) {
57
+ const url = new URL(req.url, `http://${req.headers.host}`);
58
+ if (url.pathname === '/') {
59
+ res.setHeader('Content-Type', 'text/html');
60
+ res.end(createHtml('/@id/__x00__virtual:editor'));
61
+ return;
62
+ }
63
+ const name = url.pathname.slice(1);
64
+ if (name && lookup.has(name)) {
65
+ res.setHeader('Content-Type', 'text/html');
66
+ res.end(createHtml(`/@id/__x00__virtual:editor?project=${encodeURIComponent(name)}`));
67
+ return;
68
+ }
69
+ }
70
+ next();
71
+ });
72
+ },
73
+ };
74
+ }
75
+ exports.editorPlugin = editorPlugin;
76
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/partials/editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Plugin } from 'vite';
2
+ interface ExporterPluginConfig {
3
+ outputPath: string;
4
+ }
5
+ export declare function exporterPlugin({ outputPath }: ExporterPluginConfig): Plugin;
6
+ export {};
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.exporterPlugin = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const mime_types_1 = __importDefault(require("mime-types"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const openInExplorer_1 = require("../openInExplorer");
11
+ function exporterPlugin({ outputPath }) {
12
+ return {
13
+ name: 'motion-canvas:exporter',
14
+ configureServer(server) {
15
+ server.middlewares.use((req, res, next) => {
16
+ if (req.url === '/__open-output-path') {
17
+ if (!fs_1.default.existsSync(outputPath)) {
18
+ fs_1.default.mkdirSync(outputPath, { recursive: true });
19
+ }
20
+ (0, openInExplorer_1.openInExplorer)(outputPath);
21
+ res.end();
22
+ return;
23
+ }
24
+ next();
25
+ });
26
+ server.ws.on('motion-canvas:export', async ({ data, frame, name, subDirectories, mimeType }, client) => {
27
+ const extension = mime_types_1.default.extension(mimeType);
28
+ const outputFilePath = path_1.default.join(outputPath, ...subDirectories, `${name}.${extension}`);
29
+ const outputDirectory = path_1.default.dirname(outputFilePath);
30
+ if (!fs_1.default.existsSync(outputDirectory)) {
31
+ fs_1.default.mkdirSync(outputDirectory, { recursive: true });
32
+ }
33
+ const base64Data = data.slice(data.indexOf(',') + 1);
34
+ await writeBase64(outputFilePath, base64Data);
35
+ client.send('motion-canvas:export-ack', { frame });
36
+ });
37
+ },
38
+ };
39
+ }
40
+ exports.exporterPlugin = exporterPlugin;
41
+ function writeBase64(filePath, base64) {
42
+ return new Promise((resolve, reject) => {
43
+ fs_1.default.createWriteStream(filePath)
44
+ .on('finish', resolve)
45
+ .on('error', reject)
46
+ .end(Buffer.from(base64, 'base64'));
47
+ });
48
+ }
49
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../src/partials/exporter.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,4DAA8B;AAC9B,gDAAwB;AAExB,sDAAiD;AAMjD,SAAgB,cAAc,CAAC,EAAC,UAAU,EAAuB;IAC/D,OAAO;QACL,IAAI,EAAE,wBAAwB;QAE9B,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,GAAG,CAAC,GAAG,KAAK,qBAAqB,EAAE,CAAC;oBACtC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;oBAC9C,CAAC;oBACD,IAAA,+BAAc,EAAC,UAAU,CAAC,CAAC;oBAC3B,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBAED,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,EAAE,CACV,sBAAsB,EACtB,KAAK,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAC,EAAE,MAAM,EAAE,EAAE;gBAC9D,MAAM,SAAS,GAAG,oBAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,UAAU,EACV,GAAG,cAAc,EACjB,GAAG,IAAI,IAAI,SAAS,EAAE,CACvB,CAAC;gBACF,MAAM,eAAe,GAAG,cAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAErD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;oBACpC,YAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;gBACnD,CAAC;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrD,MAAM,WAAW,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC;YACnD,CAAC,CACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAxCD,wCAwCC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,MAAc;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,YAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;aAC3B,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;aACrB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;aACnB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './assets';
2
+ export * from './audio';
3
+ export * from './corsProxy';
4
+ export * from './editor';
5
+ export * from './exporter';
6
+ export * from './meta';
7
+ export * from './projects';
8
+ export * from './scenes';
9
+ export * from './settings';
10
+ export * from './webgl';
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./assets"), exports);
18
+ __exportStar(require("./audio"), exports);
19
+ __exportStar(require("./corsProxy"), exports);
20
+ __exportStar(require("./editor"), exports);
21
+ __exportStar(require("./exporter"), exports);
22
+ __exportStar(require("./meta"), exports);
23
+ __exportStar(require("./projects"), exports);
24
+ __exportStar(require("./scenes"), exports);
25
+ __exportStar(require("./settings"), exports);
26
+ __exportStar(require("./webgl"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/partials/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,8CAA4B;AAC5B,2CAAyB;AACzB,6CAA2B;AAC3B,yCAAuB;AACvB,6CAA2B;AAC3B,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB"}
@@ -0,0 +1,2 @@
1
+ import { Plugin } from 'vite';
2
+ export declare function metaPlugin(): Plugin;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.metaPlugin = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ function metaPlugin() {
10
+ const timeStamps = {};
11
+ let config;
12
+ return {
13
+ name: 'motion-canvas:meta',
14
+ configResolved(resolvedConfig) {
15
+ config = resolvedConfig;
16
+ },
17
+ async transform(code, id) {
18
+ const [base] = id.split('?');
19
+ const { name, ext } = path_1.default.posix.parse(base);
20
+ if (ext !== '.meta') {
21
+ return;
22
+ }
23
+ const sourceFile = config.command === 'build' ? false : JSON.stringify(id);
24
+ /* language=typescript */
25
+ return `\
26
+ import {MetaFile} from '@vladimish/motion-canvas-2-core';
27
+ let meta;
28
+ if (import.meta.hot) {
29
+ meta = import.meta.hot.data.meta;
30
+ }
31
+ meta ??= new MetaFile('${name}', ${sourceFile});
32
+ if (import.meta.hot) {
33
+ import.meta.hot.accept();
34
+ import.meta.hot.data.meta = meta;
35
+ }
36
+ meta.loadData(${code});
37
+ export default meta;
38
+ `;
39
+ },
40
+ configureServer(server) {
41
+ server.ws.on('motion-canvas:meta', async ({ source, data }, client) => {
42
+ // Ignore virtual meta files.
43
+ if (source.startsWith('\0')) {
44
+ return;
45
+ }
46
+ timeStamps[source] = Date.now();
47
+ await fs_1.default.promises.writeFile(source, JSON.stringify(data, undefined, 2), 'utf8');
48
+ client.send('motion-canvas:meta-ack', { source });
49
+ });
50
+ },
51
+ handleHotUpdate(ctx) {
52
+ const now = Date.now();
53
+ const modules = [];
54
+ for (const module of ctx.modules) {
55
+ if (module.file !== null &&
56
+ timeStamps[module.file] &&
57
+ timeStamps[module.file] + 1000 > now) {
58
+ continue;
59
+ }
60
+ modules.push(module);
61
+ }
62
+ return modules;
63
+ },
64
+ };
65
+ }
66
+ exports.metaPlugin = metaPlugin;
67
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/partials/meta.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAGxB,SAAgB,UAAU;IACxB,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,IAAI,MAAsB,CAAC;IAC3B,OAAO;QACL,IAAI,EAAE,oBAAoB;QAE1B,cAAc,CAAC,cAAc;YAC3B,MAAM,GAAG,cAAc,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,GAAG,cAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GACd,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAE1D,yBAAyB;YACzB,OAAO;;;;;;yBAMY,IAAI,MAAM,UAAU;;;;;gBAK7B,IAAI;;CAEnB,CAAC;QACE,CAAC;QAED,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,EAAE,MAAM,EAAE,EAAE;gBAClE,6BAA6B;gBAC7B,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBAED,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,YAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,MAAM,EACN,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAClC,MAAM,CACP,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAC,MAAM,EAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,eAAe,CAAC,GAAG;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,EAAE,CAAC;YAEnB,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBACjC,IACE,MAAM,CAAC,IAAI,KAAK,IAAI;oBACpB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;oBACvB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,EACpC,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAzED,gCAyEC"}
@@ -0,0 +1,9 @@
1
+ import { Plugin } from 'vite';
2
+ import { PluginOptions, ProjectData } from '../plugins';
3
+ interface ProjectPluginConfig {
4
+ buildForEditor?: boolean;
5
+ plugins: PluginOptions[];
6
+ projects: ProjectData[];
7
+ }
8
+ export declare function projectsPlugin({ buildForEditor, plugins, projects, }: ProjectPluginConfig): Plugin;
9
+ export {};
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.projectsPlugin = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const utils_1 = require("../utils");
9
+ const versions_1 = require("../versions");
10
+ const PROJECT_QUERY_REGEX = /[?&]project\b/;
11
+ function projectsPlugin({ buildForEditor, plugins, projects, }) {
12
+ const versions = JSON.stringify((0, versions_1.getVersions)());
13
+ let config;
14
+ return {
15
+ name: 'motion-canvas:project',
16
+ configResolved(resolvedConfig) {
17
+ config = resolvedConfig;
18
+ },
19
+ async load(id) {
20
+ if (!PROJECT_QUERY_REGEX.test(id)) {
21
+ return;
22
+ }
23
+ const [base] = id.split('?');
24
+ const { name, dir } = path_1.default.posix.parse(base);
25
+ const runsInEditor = buildForEditor || config.command === 'serve';
26
+ const metaFile = `${name}.meta`;
27
+ await (0, utils_1.createMeta)(path_1.default.join(dir, metaFile));
28
+ const imports = [];
29
+ const pluginNames = [];
30
+ let index = 0;
31
+ for (const plugin of plugins) {
32
+ if (plugin.entryPoint) {
33
+ const pluginName = `plugin${index}`;
34
+ let options = (await plugin.runtimeConfig?.()) ?? '';
35
+ if (typeof options !== 'string') {
36
+ options = JSON.stringify(options);
37
+ }
38
+ imports.push(`import ${pluginName} from '${plugin.entryPoint}'`);
39
+ pluginNames.push(`${pluginName}(${options})`);
40
+ index++;
41
+ }
42
+ }
43
+ /* language=typescript */
44
+ return `\
45
+ ${imports.join('\n')}
46
+ import {${runsInEditor ? 'editorBootstrap' : 'bootstrap'}} from '@vladimish/motion-canvas-2-core';
47
+ import {MetaFile} from '@vladimish/motion-canvas-2-core';
48
+ import metaFile from './${metaFile}';
49
+ import config from './${name}';
50
+ import settings from 'virtual:settings.meta';
51
+ export default ${runsInEditor ? 'await editorBootstrap' : 'bootstrap'}(
52
+ '${name}',
53
+ ${versions},
54
+ [${pluginNames.join(', ')}],
55
+ config,
56
+ metaFile,
57
+ settings,
58
+ );`;
59
+ },
60
+ config(config) {
61
+ return {
62
+ build: {
63
+ target: buildForEditor ? 'esnext' : 'modules',
64
+ assetsDir: './',
65
+ rollupOptions: {
66
+ preserveEntrySignatures: 'strict',
67
+ input: Object.fromEntries(projects.map(project => [
68
+ project.name,
69
+ project.filePath + '?project',
70
+ ])),
71
+ },
72
+ },
73
+ server: {
74
+ port: config?.server?.port ?? 9000,
75
+ },
76
+ esbuild: {
77
+ jsx: 'automatic',
78
+ jsxImportSource: '@vladimish/motion-canvas-2-2d/lib',
79
+ },
80
+ optimizeDeps: {
81
+ entries: projects.map(project => project.filePath),
82
+ exclude: ['preact', 'preact/*', '@preact/signals'],
83
+ },
84
+ };
85
+ },
86
+ };
87
+ }
88
+ exports.projectsPlugin = projectsPlugin;
89
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/partials/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Plugin } from 'vite';
2
+ export declare function scenesPlugin(): Plugin;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scenesPlugin = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const utils_1 = require("../utils");
9
+ const SCENE_QUERY_REGEX = /[?&]scene\b/;
10
+ function scenesPlugin() {
11
+ return {
12
+ name: 'motion-canvas:scene',
13
+ async load(id) {
14
+ if (!SCENE_QUERY_REGEX.test(id)) {
15
+ return;
16
+ }
17
+ const [base] = id.split('?');
18
+ const { name, dir } = path_1.default.posix.parse(base);
19
+ const metaFile = `${name}.meta`;
20
+ await (0, utils_1.createMeta)(path_1.default.join(dir, metaFile));
21
+ const sceneFile = `${name}`;
22
+ /* language=typescript */
23
+ return `\
24
+ import {ValueDispatcher} from '@vladimish/motion-canvas-2-core';
25
+ import metaFile from './${metaFile}';
26
+ import description from './${sceneFile}';
27
+ description.name = '${name}';
28
+ metaFile.attach(description.meta);
29
+ if (import.meta.hot) {
30
+ description.onReplaced = import.meta.hot.data.onReplaced;
31
+ }
32
+ description.onReplaced ??= new ValueDispatcher(description.config);
33
+ if (import.meta.hot) {
34
+ import.meta.hot.accept();
35
+ if (import.meta.hot.data.onReplaced) {
36
+ description.onReplaced.current = description;
37
+ } else {
38
+ import.meta.hot.data.onReplaced = description.onReplaced;
39
+ }
40
+ }
41
+ export default description;
42
+ `;
43
+ },
44
+ };
45
+ }
46
+ exports.scenesPlugin = scenesPlugin;
47
+ //# sourceMappingURL=scenes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenes.js","sourceRoot":"","sources":["../../src/partials/scenes.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,oCAAoC;AAEpC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAExC,SAAgB,YAAY;IAC1B,OAAO;QACL,IAAI,EAAE,qBAAqB;QAE3B,KAAK,CAAC,IAAI,CAAC,EAAE;YACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,GAAG,cAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,CAAC;YAChC,MAAM,IAAA,kBAAU,EAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,GAAG,IAAI,EAAE,CAAC;YAE5B,yBAAyB;YACzB,OAAO;;0BAEa,QAAQ;6BACL,SAAS;sBAChB,IAAI;;;;;;;;;;;;;;;CAezB,CAAC;QACE,CAAC;KACF,CAAC;AACJ,CAAC;AAtCD,oCAsCC"}
@@ -0,0 +1,2 @@
1
+ import { Plugin } from 'vite';
2
+ export declare function settingsPlugin(): Plugin;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.settingsPlugin = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const path_1 = __importDefault(require("path"));
10
+ function settingsPlugin() {
11
+ const settingsId = 'virtual:settings.meta';
12
+ const resolvedSettingsId = '\0' + settingsId;
13
+ const settingsPath = path_1.default.resolve(os_1.default.homedir(), '.motion-canvas/settings.json');
14
+ const outputDirectory = path_1.default.dirname(settingsPath);
15
+ return {
16
+ name: 'motion-canvas:settings',
17
+ resolveId(id) {
18
+ if (id === settingsId) {
19
+ return resolvedSettingsId;
20
+ }
21
+ },
22
+ async load(id) {
23
+ if (id === resolvedSettingsId) {
24
+ let parsed = {};
25
+ try {
26
+ parsed = JSON.parse(await fs_1.default.promises.readFile(settingsPath, 'utf8'));
27
+ }
28
+ catch (_) {
29
+ // Ignore an invalid settings file
30
+ }
31
+ return JSON.stringify(parsed);
32
+ }
33
+ },
34
+ configureServer(server) {
35
+ server.ws.on('motion-canvas:meta', async ({ source, data }, client) => {
36
+ if (source !== resolvedSettingsId) {
37
+ return;
38
+ }
39
+ await fs_1.default.promises.mkdir(outputDirectory, { recursive: true });
40
+ const newData = JSON.stringify(data, undefined, 2);
41
+ let oldData = '';
42
+ try {
43
+ oldData = await fs_1.default.promises.readFile(settingsPath, 'utf8');
44
+ }
45
+ catch (_) {
46
+ // Ignore an invalid settings file
47
+ }
48
+ if (oldData !== newData) {
49
+ await Promise.all([
50
+ fs_1.default.promises.writeFile(settingsPath, newData, 'utf8'),
51
+ // Invalidate the module so that the settings are up-to-date next
52
+ // time the browser is refreshed.
53
+ server.moduleGraph.getModuleByUrl(source).then(module => {
54
+ if (module) {
55
+ server.moduleGraph.invalidateModule(module);
56
+ }
57
+ }),
58
+ ]);
59
+ }
60
+ client.send('motion-canvas:meta-ack', { source });
61
+ });
62
+ },
63
+ };
64
+ }
65
+ exports.settingsPlugin = settingsPlugin;
66
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/partials/settings.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AAGxB,SAAgB,cAAc;IAC5B,MAAM,UAAU,GAAG,uBAAuB,CAAC;IAC3C,MAAM,kBAAkB,GAAG,IAAI,GAAG,UAAU,CAAC;IAC7C,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAC/B,YAAE,CAAC,OAAO,EAAE,EACZ,8BAA8B,CAC/B,CAAC;IACF,MAAM,eAAe,GAAG,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAEnD,OAAO;QACL,IAAI,EAAE,wBAAwB;QAE9B,SAAS,CAAC,EAAE;YACV,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;gBACtB,OAAO,kBAAkB,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,KAAK,kBAAkB,EAAE,CAAC;gBAC9B,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxE,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,kCAAkC;gBACpC,CAAC;gBAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,EAAE,MAAM,EAAE,EAAE;gBAClE,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;oBAClC,OAAO;gBACT,CAAC;gBAED,MAAM,YAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;gBAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;gBACnD,IAAI,OAAO,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBAC7D,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,kCAAkC;gBACpC,CAAC;gBAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;oBACxB,MAAM,OAAO,CAAC,GAAG,CAAC;wBAChB,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC;wBACpD,iEAAiE;wBACjE,iCAAiC;wBACjC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;4BACtD,IAAI,MAAM,EAAE,CAAC;gCACX,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;4BAC9C,CAAC;wBACH,CAAC,CAAC;qBACH,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAC,MAAM,EAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AA/DD,wCA+DC"}
@@ -0,0 +1,10 @@
1
+ import { Plugin } from 'vite';
2
+ declare module 'source-map' {
3
+ interface SourceNode {
4
+ add(value: string | SourceNode): void;
5
+ }
6
+ interface SourceMapGenerator {
7
+ toJSON(): any;
8
+ }
9
+ }
10
+ export declare function webglPlugin(): Plugin;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.webglPlugin = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const source_map_1 = require("source-map");
10
+ const vite_1 = require("vite");
11
+ const GLSL_EXTENSION_REGEX = /\.glsl(?:$|\?)/;
12
+ const INCLUDE_REGEX = /^#include "([^"]+)"/;
13
+ function webglPlugin() {
14
+ let config;
15
+ return {
16
+ name: 'motion-canvas:webgl',
17
+ configResolved(resolvedConfig) {
18
+ config = resolvedConfig;
19
+ },
20
+ async transform(code, id) {
21
+ if (!GLSL_EXTENSION_REGEX.test(id)) {
22
+ return;
23
+ }
24
+ const [base, query] = id.split('?');
25
+ const { dir } = path_1.default.posix.parse(base);
26
+ const params = new URLSearchParams(query);
27
+ if (params.has('raw')) {
28
+ return;
29
+ }
30
+ const context = {
31
+ rootDir: dir,
32
+ fileStack: [],
33
+ includeMap: new Map(),
34
+ watchFile: file => this.addWatchFile(file),
35
+ resolve: async (source, importer) => {
36
+ const resolved = await this.resolve(source, importer);
37
+ return resolved?.id;
38
+ },
39
+ };
40
+ const glslSource = await resolveGlsl(context, id, code);
41
+ const sourceUrl = (0, vite_1.normalizePath)(path_1.default.relative(config.root, base));
42
+ const result = glslSource.toStringWithSourceMap();
43
+ const map = result.map.toJSON();
44
+ map.includeMap = Object.fromEntries(context.includeMap);
45
+ return {
46
+ map,
47
+ code: `export default \`${result.code}\n//# sourceURL=${sourceUrl}\`;`,
48
+ };
49
+ },
50
+ };
51
+ }
52
+ exports.webglPlugin = webglPlugin;
53
+ async function resolveGlsl(context, id, code) {
54
+ const lines = code.split(/\r?\n/);
55
+ const source = new source_map_1.SourceNode(1, 0, '', '');
56
+ if (context.fileStack.includes(id)) {
57
+ throw new Error(`Circular dependency detected: ${context.fileStack.join(' -> ')}`);
58
+ }
59
+ context.fileStack.push(id);
60
+ const sourceMapId = path_1.default.posix.relative(context.rootDir, id);
61
+ for (let i = 0; i < lines.length; i++) {
62
+ const line = lines[i];
63
+ const match = line.match(INCLUDE_REGEX);
64
+ if (match) {
65
+ const childId = await context.resolve(match[1], id);
66
+ if (!childId) {
67
+ continue;
68
+ }
69
+ const childSourceMapId = path_1.default.posix.relative(context.rootDir, childId);
70
+ if (context.includeMap.has(childSourceMapId)) {
71
+ continue;
72
+ }
73
+ context.includeMap.set(childSourceMapId, [sourceMapId, i + 1]);
74
+ context.watchFile(childId);
75
+ const childCode = await fs_1.default.promises.readFile(childId, 'utf-8');
76
+ source.add(await resolveGlsl(context, childId, childCode));
77
+ }
78
+ else {
79
+ let j = 0;
80
+ for (; j < line.length; j++) {
81
+ source.add(new source_map_1.SourceNode(i + 1, j, sourceMapId, line[j]));
82
+ }
83
+ source.add(new source_map_1.SourceNode(i + 1, j, sourceMapId, '\n'));
84
+ }
85
+ }
86
+ context.fileStack.pop();
87
+ return source;
88
+ }
89
+ //# sourceMappingURL=webgl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl.js","sourceRoot":"","sources":["../../src/partials/webgl.ts"],"names":[],"mappings":"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"}