From 017fc5ae27d482495cf3782951c42800153eb5bb Mon Sep 17 00:00:00 2001 From: Michael Dougall <6801309+itsdouges@users.noreply.github.com> Date: Sun, 22 Oct 2023 18:00:05 +1100 Subject: [PATCH] Namespace Triplex Package adeira-source-id: f6e068c16f796df5249311cef0f49a8bed13b637 --- .changeset/wicked-eagles-hide.md | 11 + package.json | 4 +- packages/bridge/.swcrc | 15 - packages/bridge/CHANGELOG.md | 272 ----- packages/bridge/LICENSE | 632 ------------ packages/bridge/README.md | 1 - packages/bridge/package.json | 43 - packages/bridge/src/client.ts | 74 -- packages/bridge/src/host.ts | 97 -- packages/bridge/src/types.ts | 203 ---- packages/bridge/tsconfig.json | 9 - packages/editor/CHANGELOG.md | 897 ----------------- packages/editor/LICENSE | 632 ------------ packages/editor/README.md | 1 - packages/editor/index.html | 16 - packages/editor/package.json | 51 - packages/editor/postcss.config.js | 12 - packages/editor/public/banner-r3f.jpg | Bin 68550 -> 0 bytes packages/editor/src/ds/README.md | 3 - packages/editor/src/ds/button.tsx | 135 --- packages/editor/src/ds/cn.ts | 42 - packages/editor/src/ds/drawer.tsx | 48 - packages/editor/src/ds/menubar.tsx | 79 -- packages/editor/src/ds/pressable.tsx | 73 -- packages/editor/src/ds/scroll-container.tsx | 35 - packages/editor/src/editor.tsx | 40 - packages/editor/src/environment.tsx | 35 - packages/editor/src/index.tsx | 34 - packages/editor/src/main-dev-only.ts | 52 - packages/editor/src/scence-bridge.tsx | 116 --- packages/editor/src/stores/README.md | 2 - packages/editor/src/stores/assets-drawer.tsx | 26 - packages/editor/src/stores/editor.tsx | 452 --------- packages/editor/src/stores/overlay.tsx | 17 - packages/editor/src/stores/provider.tsx | 19 - packages/editor/src/stores/scene-state.tsx | 54 - packages/editor/src/stores/scene.tsx | 196 ---- packages/editor/src/stores/undo-redo.tsx | 74 -- packages/editor/src/styles.css | 125 --- packages/editor/src/ui/README.md | 2 - .../src/ui/__tests__/array-input.test.tsx | 255 ----- .../__tests__/litreral-union-input.test.tsx | 123 --- .../src/ui/__tests__/number-input.test.tsx | 410 -------- packages/editor/src/ui/array-input.tsx | 142 --- packages/editor/src/ui/assets-drawer.tsx | 394 -------- packages/editor/src/ui/boolean-input.tsx | 57 -- packages/editor/src/ui/color-input.tsx | 113 --- packages/editor/src/ui/context-panel.tsx | 342 ------- packages/editor/src/ui/controls-menu.tsx | 104 -- packages/editor/src/ui/editor-menu.tsx | 426 -------- packages/editor/src/ui/error-boundary.tsx | 73 -- packages/editor/src/ui/error-overlay.tsx | 139 --- .../editor/src/ui/literal-union-input.tsx | 92 -- packages/editor/src/ui/number-input.tsx | 346 ------- packages/editor/src/ui/prop-field.tsx | 56 -- packages/editor/src/ui/prop-input.tsx | 227 ----- packages/editor/src/ui/provider-config.tsx | 151 --- packages/editor/src/ui/scene-panel.tsx | 406 -------- packages/editor/src/ui/scenes-drawer.tsx | 124 --- packages/editor/src/ui/string-input.tsx | 93 -- packages/editor/src/ui/title-bar.tsx | 38 - packages/editor/src/ui/union-input.tsx | 70 -- packages/editor/src/util/ide.tsx | 78 -- packages/editor/src/util/prompt.tsx | 13 - packages/editor/src/util/string.ts | 36 - packages/editor/src/welcome.tsx | 156 --- packages/editor/tailwind.config.js | 47 - packages/editor/tsconfig.json | 12 - packages/editor/types/globals.d.ts | 7 - packages/editor/types/triplex.d.ts | 32 - packages/editor/vite.config.mjs | 27 - packages/editor/welcome.html | 16 - packages/run/.gitignore | 1 - packages/run/.swcrc | 19 - packages/run/CHANGELOG.md | 946 ------------------ packages/run/LICENSE | 632 ------------ packages/run/README.md | 11 - packages/run/hook.js | 12 - packages/run/package.json | 45 - packages/run/src/commands/editor.ts | 75 -- packages/run/src/index.ts | 41 - packages/run/src/types.ts | 46 - packages/run/tsconfig.json | 13 - packages/scene/.swcrc | 20 - packages/scene/CHANGELOG.md | 837 ---------------- packages/scene/LICENSE | 632 ------------ packages/scene/README.md | 1 - packages/scene/package.json | 52 - .../scene/src/__tests__/__stubs__/custom.tsx | 48 - .../scene/src/__tests__/scene-object.test.tsx | 147 --- packages/scene/src/__tests__/scene.test.tsx | 59 -- .../scene/src/__tests__/selection.test.tsx | 331 ------ .../src/__tests__/utils/subscriptions.tsx | 39 - packages/scene/src/add-scene-object.tsx | 147 --- packages/scene/src/canvas.tsx | 19 - .../src/components/__tests__/camera.test.tsx | 65 -- .../scene/src/components/camera-helper.tsx | 235 ----- packages/scene/src/components/camera.tsx | 177 ---- packages/scene/src/components/helper.tsx | 130 --- .../src/components/transform-controls.tsx | 44 - packages/scene/src/context.tsx | 39 - packages/scene/src/environment.tsx | 33 - packages/scene/src/error-boundary.tsx | 24 - packages/scene/src/index.tsx | 87 -- packages/scene/src/loader.tsx | 68 -- packages/scene/src/manual-editable.tsx | 61 -- packages/scene/src/scene-object.tsx | 259 ----- packages/scene/src/scene.tsx | 168 ---- packages/scene/src/selection.tsx | 520 ---------- packages/scene/src/stores/scene-state.tsx | 54 - packages/scene/src/types.tsx | 19 - packages/scene/tsconfig.json | 10 - packages/scene/types/global.d.ts | 9 - .../compose.ts => scripts/workspace-run.js | 11 +- 114 files changed, 20 insertions(+), 15400 deletions(-) create mode 100644 .changeset/wicked-eagles-hide.md delete mode 100644 packages/bridge/.swcrc delete mode 100644 packages/bridge/CHANGELOG.md delete mode 100644 packages/bridge/LICENSE delete mode 100644 packages/bridge/README.md delete mode 100644 packages/bridge/package.json delete mode 100644 packages/bridge/src/client.ts delete mode 100644 packages/bridge/src/host.ts delete mode 100644 packages/bridge/src/types.ts delete mode 100644 packages/bridge/tsconfig.json delete mode 100644 packages/editor/CHANGELOG.md delete mode 100644 packages/editor/LICENSE delete mode 100644 packages/editor/README.md delete mode 100644 packages/editor/index.html delete mode 100644 packages/editor/package.json delete mode 100644 packages/editor/postcss.config.js delete mode 100644 packages/editor/public/banner-r3f.jpg delete mode 100644 packages/editor/src/ds/README.md delete mode 100644 packages/editor/src/ds/button.tsx delete mode 100644 packages/editor/src/ds/cn.ts delete mode 100644 packages/editor/src/ds/drawer.tsx delete mode 100644 packages/editor/src/ds/menubar.tsx delete mode 100644 packages/editor/src/ds/pressable.tsx delete mode 100644 packages/editor/src/ds/scroll-container.tsx delete mode 100644 packages/editor/src/editor.tsx delete mode 100644 packages/editor/src/environment.tsx delete mode 100644 packages/editor/src/index.tsx delete mode 100644 packages/editor/src/main-dev-only.ts delete mode 100644 packages/editor/src/scence-bridge.tsx delete mode 100644 packages/editor/src/stores/README.md delete mode 100644 packages/editor/src/stores/assets-drawer.tsx delete mode 100644 packages/editor/src/stores/editor.tsx delete mode 100644 packages/editor/src/stores/overlay.tsx delete mode 100644 packages/editor/src/stores/provider.tsx delete mode 100644 packages/editor/src/stores/scene-state.tsx delete mode 100644 packages/editor/src/stores/scene.tsx delete mode 100644 packages/editor/src/stores/undo-redo.tsx delete mode 100644 packages/editor/src/styles.css delete mode 100644 packages/editor/src/ui/README.md delete mode 100644 packages/editor/src/ui/__tests__/array-input.test.tsx delete mode 100644 packages/editor/src/ui/__tests__/litreral-union-input.test.tsx delete mode 100644 packages/editor/src/ui/__tests__/number-input.test.tsx delete mode 100644 packages/editor/src/ui/array-input.tsx delete mode 100644 packages/editor/src/ui/assets-drawer.tsx delete mode 100644 packages/editor/src/ui/boolean-input.tsx delete mode 100644 packages/editor/src/ui/color-input.tsx delete mode 100644 packages/editor/src/ui/context-panel.tsx delete mode 100644 packages/editor/src/ui/controls-menu.tsx delete mode 100644 packages/editor/src/ui/editor-menu.tsx delete mode 100644 packages/editor/src/ui/error-boundary.tsx delete mode 100644 packages/editor/src/ui/error-overlay.tsx delete mode 100644 packages/editor/src/ui/literal-union-input.tsx delete mode 100644 packages/editor/src/ui/number-input.tsx delete mode 100644 packages/editor/src/ui/prop-field.tsx delete mode 100644 packages/editor/src/ui/prop-input.tsx delete mode 100644 packages/editor/src/ui/provider-config.tsx delete mode 100644 packages/editor/src/ui/scene-panel.tsx delete mode 100644 packages/editor/src/ui/scenes-drawer.tsx delete mode 100644 packages/editor/src/ui/string-input.tsx delete mode 100644 packages/editor/src/ui/title-bar.tsx delete mode 100644 packages/editor/src/ui/union-input.tsx delete mode 100644 packages/editor/src/util/ide.tsx delete mode 100644 packages/editor/src/util/prompt.tsx delete mode 100644 packages/editor/src/util/string.ts delete mode 100644 packages/editor/src/welcome.tsx delete mode 100644 packages/editor/tailwind.config.js delete mode 100644 packages/editor/tsconfig.json delete mode 100644 packages/editor/types/globals.d.ts delete mode 100644 packages/editor/types/triplex.d.ts delete mode 100644 packages/editor/vite.config.mjs delete mode 100644 packages/editor/welcome.html delete mode 100644 packages/run/.gitignore delete mode 100644 packages/run/.swcrc delete mode 100644 packages/run/CHANGELOG.md delete mode 100644 packages/run/LICENSE delete mode 100644 packages/run/README.md delete mode 100755 packages/run/hook.js delete mode 100644 packages/run/package.json delete mode 100644 packages/run/src/commands/editor.ts delete mode 100755 packages/run/src/index.ts delete mode 100644 packages/run/src/types.ts delete mode 100644 packages/run/tsconfig.json delete mode 100644 packages/scene/.swcrc delete mode 100644 packages/scene/CHANGELOG.md delete mode 100644 packages/scene/LICENSE delete mode 100644 packages/scene/README.md delete mode 100644 packages/scene/package.json delete mode 100644 packages/scene/src/__tests__/__stubs__/custom.tsx delete mode 100644 packages/scene/src/__tests__/scene-object.test.tsx delete mode 100644 packages/scene/src/__tests__/scene.test.tsx delete mode 100644 packages/scene/src/__tests__/selection.test.tsx delete mode 100644 packages/scene/src/__tests__/utils/subscriptions.tsx delete mode 100644 packages/scene/src/add-scene-object.tsx delete mode 100644 packages/scene/src/canvas.tsx delete mode 100644 packages/scene/src/components/__tests__/camera.test.tsx delete mode 100644 packages/scene/src/components/camera-helper.tsx delete mode 100644 packages/scene/src/components/camera.tsx delete mode 100644 packages/scene/src/components/helper.tsx delete mode 100644 packages/scene/src/components/transform-controls.tsx delete mode 100644 packages/scene/src/context.tsx delete mode 100644 packages/scene/src/environment.tsx delete mode 100644 packages/scene/src/error-boundary.tsx delete mode 100644 packages/scene/src/index.tsx delete mode 100644 packages/scene/src/loader.tsx delete mode 100644 packages/scene/src/manual-editable.tsx delete mode 100644 packages/scene/src/scene-object.tsx delete mode 100644 packages/scene/src/scene.tsx delete mode 100644 packages/scene/src/selection.tsx delete mode 100644 packages/scene/src/stores/scene-state.tsx delete mode 100644 packages/scene/src/types.tsx delete mode 100644 packages/scene/tsconfig.json delete mode 100644 packages/scene/types/global.d.ts rename packages/bridge/src/compose.ts => scripts/workspace-run.js (55%) diff --git a/.changeset/wicked-eagles-hide.md b/.changeset/wicked-eagles-hide.md new file mode 100644 index 00000000..a958e067 --- /dev/null +++ b/.changeset/wicked-eagles-hide.md @@ -0,0 +1,11 @@ +--- +"@triplex/ws-client": patch +"@triplex/bridge": patch +"@triplex/client": patch +"@triplex/editor": patch +"@triplex/server": patch +"@triplex/scene": patch +"@triplex/run": patch +--- + +Packages have been moved into namedspaced folders. diff --git a/package.json b/package.json index 447fed39..9c5257ea 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "workspaces": [ "apps/docs", "examples/*", - "packages/*" + "packages/*", + "packages/*/*", + "!packages/create-triplex-project/*" ], "scripts": { "build": "yarn clean && yarn workspaces run build", diff --git a/packages/bridge/.swcrc b/packages/bridge/.swcrc deleted file mode 100644 index 2add8c2b..00000000 --- a/packages/bridge/.swcrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/swcrc", - "minify": true, - "sourceMaps": false, - "jsc": { - "minify": { - "compress": true, - "mangle": true - }, - "target": "es2017", - "parser": { - "syntax": "typescript" - } - } -} diff --git a/packages/bridge/CHANGELOG.md b/packages/bridge/CHANGELOG.md deleted file mode 100644 index 1226c080..00000000 --- a/packages/bridge/CHANGELOG.md +++ /dev/null @@ -1,272 +0,0 @@ -# @triplex/bridge - -## 0.58.2 - -### Patch Changes - -- b5247c2: Apply lint and prettier fixes. - -## 0.58.1 - -## 0.58.0 - -### Minor Changes - -- 3e1e081: Separate soft refresh from hard refresh. - -## 0.57.2 - -## 0.57.1 - -## 0.57.0 - -### Minor Changes - -- 5c1fc3d: Add editing child jsx elements through the Triplex UI. -- 2b61384: Adding an asset is now contextual, the original button adds to the - open component, while the add buttons on each element in the left scene panel - add to it as a child. - -## 0.56.1 - -## 0.56.0 - -### Minor Changes - -- 32a110f: Add top-level scene component to the scene panel. When selected users - can modify the props during their seession to see what happens. - -### Patch Changes - -- 2e53a2e: Turn off type declaration maps. - -## 0.55.3 - -## 0.55.2 - -## 0.55.1 - -### Patch Changes - -- ea86fdc: Add license banner. - -## 0.55.0 - -## 0.54.2 - -## 0.54.1 - -## 0.54.0 - -### Minor Changes - -- 8fad65a: Adds camera type to controls menu, allowing you to switch between - perspective and orthographic camera. -- e0038f6: Add support for viewing through a user land camera. - -## 0.53.1 - -## 0.53.0 - -### Minor Changes - -- c71412b: Adds refresh scene action available in the File menubar and through - cmd/ctrl + r. - -## 0.52.0 - -### Minor Changes - -- 8d532f5: Editor now shows build time and runtime errors in an error overlay. - -## 0.51.1 - -## 0.51.0 - -## 0.50.1 - -## 0.50.0 - -### Minor Changes - -- 8ea575b: Built output is now mangled. - -## 0.49.0 - -## 0.48.0 - -## 0.47.0 - -## 0.46.4 - -## 0.46.3 - -## 0.46.2 - -## 0.46.1 - -## 0.46.0 - -## 0.45.1 - -## 0.45.0 - -## 0.44.0 - -### Minor Changes - -- 0242833: Scene now removes intermediate state when resetting. -- 4d8d9cc: Builds are now minified. -- 557648e: Editor has been extracted out of the client dev server and now is - bundled when published to npm. - -## 0.43.0 - -### Minor Changes - -- b7bbeba: When adding a new element to the scene if you have a selection it - will be added as a child. If you have no selection it will be added to the - root component. - -## 0.42.0 - -## 0.41.0 - -## 0.40.0 - -## 0.39.0 - -## 0.38.0 - -## 0.37.0 - -### Minor Changes - -- 23fe64a: Adds delete scene object. Access through the context panel when - focusing on a scene object. -- 1a2ecea: Iframe client bridge can now wait for a response from host. - -## 0.36.0 - -## 0.35.0 - -## 0.34.0 - -### Minor Changes - -- 2a64658: The context panel now displays all available props on a component - even if they aren't yet declared thanks to the TypeScript compiler and - ts-morph. Not all prop types are supported currently, if you have one that you - expected to be available but isn't please reach out. - -## 0.33.0 - -### Minor Changes - -- 1067d23: Adds transform controls to the ui. - -## 0.32.0 - -### Minor Changes - -- c87a5f3: Undo/redo now available. When manipulating the scene through - transform controls or the context panel each persisted manipulation will be - able to be undone (and redone) using hotkeys and the edit menu actions. - -## 0.31.0 - -## 0.30.0 - -### Minor Changes - -- 0bb6119: Adds support for updating scene objects through the context panel. - -## 0.29.0 - -## 0.28.0 - -## 0.27.0 - -## 0.26.0 - -## 0.25.0 - -## 0.24.0 - -## 0.23.0 - -## 0.22.0 - -## 0.21.0 - -## 0.20.0 - -### Minor Changes - -- 1c9771d: Focus events now only use line and column numbers. - -## 0.19.0 - -## 0.18.0 - -## 0.17.0 - -## 0.16.0 - -### Minor Changes - -- d8e1602: Fixed non-scene objects not being able to be selected through the UI. -- 7ff35f3: Upgrades @react-three/fiber to latest. -- 2fa7c45: Adds author field to package.json. - -## 0.15.0 - -### Minor Changes - -- e54e0f8: Bridge events now flow unidirectionally enabling the editor ui to - initiate events to the scene, such as navigate and focus. - -## 0.14.0 - -## 0.7.0 - -### Minor Changes - -- a4d6882: Passes name during object focus. - -## 0.6.0 - -### Minor Changes - -- 3c725bc: Force release all packages. - -## 0.5.0 - -### Minor Changes - -- ac9624f: Fixes client/host race condition where host would send events before - the client has connected. - -## 0.4.0 - -### Minor Changes - -- b144bb1: Package `build` now use `swc` and `tsc` directly. - -## 0.3.0 - -### Minor Changes - -- bbc457e: Fixes some bugs preventing triplex from being able to be ran via cli. - -## 0.2.0 - -### Minor Changes - -- 08a03af: Fixes publish to build before pushing. - -## 0.1.0 - -### Minor Changes - -- 9c120b4: Initial release. diff --git a/packages/bridge/LICENSE b/packages/bridge/LICENSE deleted file mode 100644 index 741b8fab..00000000 --- a/packages/bridge/LICENSE +++ /dev/null @@ -1,632 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. Everyone is -permitted to copy and distribute verbatim copies of this license document, but -changing it is not allowed. - - Preamble - -The GNU General Public License is a free, copyleft license for software and -other kinds of works. - -The licenses for most software and other practical works are designed to take -away your freedom to share and change the works. By contrast, the GNU General -Public License is intended to guarantee your freedom to share and change all -versions of a program--to make sure it remains free software for all its users. -We, the Free Software Foundation, use the GNU General Public License for most of -our software; it applies also to any other work released this way by its -authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our -General Public Licenses are designed to make sure that you have the freedom to -distribute copies of free software (and charge for them if you wish), that you -receive source code or can get it if you want it, that you can change the -software or use pieces of it in new free programs, and that you know you can do -these things. - -To protect your rights, we need to prevent others from denying you these rights -or asking you to surrender the rights. Therefore, you have certain -responsibilities if you distribute copies of the software, or if you modify it: -responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a -fee, you must pass on to the recipients the same freedoms that you received. You -must make sure that they, too, receive or can get the source code. And you must -show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert -copyright on the software, and (2) offer you this License giving you legal -permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there -is no warranty for this free software. For both users' and authors' sake, the -GPL requires that modified versions be marked as changed, so that their problems -will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified -versions of the software inside them, although the manufacturer can do so. This -is fundamentally incompatible with the aim of protecting users' freedom to -change the software. The systematic pattern of such abuse occurs in the area of -products for individuals to use, which is precisely where it is most -unacceptable. Therefore, we have designed this version of the GPL to prohibit -the practice for those products. If such problems arise substantially in other -domains, we stand ready to extend this provision to those domains in future -versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States -should not allow patents to restrict development and use of software on -general-purpose computers, but in those that do, we wish to avoid the special -danger that patents applied to a free program could make it effectively -proprietary. To prevent this, the GPL assures that patents cannot be used to -render the program non-free. - -The precise terms and conditions for copying, distribution and modification -follow. - - TERMS AND CONDITIONS - -0. Definitions. - -"This License" refers to version 3 of the GNU General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds of works, -such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this License. Each -licensee is addressed as "you". "Licensees" and "recipients" may be individuals -or organizations. - -To "modify" a work means to copy from or adapt all or part of the work in a -fashion requiring copyright permission, other than the making of an exact copy. -The resulting work is called a "modified version" of the earlier work or a work -"based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based on the -Program. - -To "propagate" a work means to do anything with it that, without permission, -would make you directly or secondarily liable for infringement under applicable -copyright law, except executing it on a computer or modifying a private copy. -Propagation includes copying, distribution (with or without modification), -making available to the public, and in some countries other activities as well. - -To "convey" a work means any kind of propagation that enables other parties to -make or receive copies. Mere interaction with a user through a computer network, -with no transfer of a copy, is not conveying. - -An interactive user interface displays "Appropriate Legal Notices" to the extent -that it includes a convenient and prominently visible feature that (1) displays -an appropriate copyright notice, and (2) tells the user that there is no -warranty for the work (except to the extent that warranties are provided), that -licensees may convey the work under this License, and how to view a copy of this -License. If the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -1. Source Code. - -The "source code" for a work means the preferred form of the work for making -modifications to it. "Object code" means any non-source form of a work. - -A "Standard Interface" means an interface that either is an official standard -defined by a recognized standards body, or, in the case of interfaces specified -for a particular programming language, one that is widely used among developers -working in that language. - -The "System Libraries" of an executable work include anything, other than the -work as a whole, that (a) is included in the normal form of packaging a Major -Component, but which is not part of that Major Component, and (b) serves only to -enable use of the work with that Major Component, or to implement a Standard -Interface for which an implementation is available to the public in source code -form. A "Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system (if any) on -which the executable work runs, or a compiler used to produce the work, or an -object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all the source -code needed to generate, install, and (for an executable work) run the object -code and to modify the work, including scripts to control those activities. -However, it does not include the work's System Libraries, or general-purpose -tools or generally available free programs which are used unmodified in -performing those activities but which are not part of the work. For example, -Corresponding Source includes interface definition files associated with source -files for the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, such as by -intimate data communication or control flow between those subprograms and other -parts of the work. - -The Corresponding Source need not include anything that users can regenerate -automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. - -All rights granted under this License are granted for the term of copyright on -the Program, and are irrevocable provided the stated conditions are met. This -License explicitly affirms your unlimited permission to run the unmodified -Program. The output from running a covered work is covered by this License only -if the output, given its content, constitutes a covered work. This License -acknowledges your rights of fair use or other equivalent, as provided by -copyright law. - -You may make, run and propagate covered works that you do not convey, without -conditions so long as your license otherwise remains in force. You may convey -covered works to others for the sole purpose of having them make modifications -exclusively for you, or provide you with facilities for running those works, -provided that you comply with the terms of this License in conveying all -material for which you do not control copyright. Those thus making or running -the covered works for you must do so exclusively on your behalf, under your -direction and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions -stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological measure under -any applicable law fulfilling obligations under article 11 of the WIPO copyright -treaty adopted on 20 December 1996, or similar laws prohibiting or restricting -circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention is -effected by exercising rights under this License with respect to the covered -work, and you disclaim any intention to limit operation or modification of the -work as a means of enforcing, against the work's users, your or third parties' -legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you receive it, -in any medium, provided that you conspicuously and appropriately publish on each -copy an appropriate copyright notice; keep intact all notices stating that this -License and any non-permissive terms added in accord with section 7 apply to the -code; keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may -offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to produce it -from the Program, in the form of source code under the terms of section 4, -provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - -A compilation of a covered work with other separate and independent works, which -are not by their nature extensions of the covered work, and which are not -combined with it such as to form a larger program, in or on a volume of a -storage or distribution medium, is called an "aggregate" if the compilation and -its resulting copyright are not used to limit the access or legal rights of the -compilation's users beyond what the individual works permit. Inclusion of a -covered work in an aggregate does not cause this License to apply to the other -parts of the aggregate. - -6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms of sections 4 -and 5, provided that you also convey the machine-readable Corresponding Source -under the terms of this License, in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the -Corresponding Source as a System Library, need not be included in conveying the -object code work. - -A "User Product" is either (1) a "consumer product", which means any tangible -personal property which is normally used for personal, family, or household -purposes, or (2) anything designed or sold for incorporation into a dwelling. In -determining whether a product is a consumer product, doubtful cases shall be -resolved in favor of coverage. For a particular product received by a particular -user, "normally used" refers to a typical or common use of that class of -product, regardless of the status of the particular user or of the way in which -the particular user actually uses, or expects or is expected to use, the -product. A product is a consumer product regardless of whether the product has -substantial commercial, industrial or non-consumer uses, unless such uses -represent the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, procedures, -authorization keys, or other information required to install and execute -modified versions of a covered work in that User Product from a modified version -of its Corresponding Source. The information must suffice to ensure that the -continued functioning of the modified object code is in no case prevented or -interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as part of a -transaction in which the right of possession and use of the User Product is -transferred to the recipient in perpetuity or for a fixed term (regardless of -how the transaction is characterized), the Corresponding Source conveyed under -this section must be accompanied by the Installation Information. But this -requirement does not apply if neither you nor any third party retains the -ability to install modified object code on the User Product (for example, the -work has been installed in ROM). - -The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates for a -work that has been modified or installed by the recipient, or for the User -Product in which it has been modified or installed. Access to a network may be -denied when the modification itself materially and adversely affects the -operation of the network or violates the rules and protocols for communication -across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord -with this section must be in a format that is publicly documented (and with an -implementation available to the public in source code form), and must require no -special password or key for unpacking, reading or copying. - -7. Additional Terms. - -"Additional permissions" are terms that supplement the terms of this License by -making exceptions from one or more of its conditions. Additional permissions -that are applicable to the entire Program shall be treated as though they were -included in this License, to the extent that they are valid under applicable -law. If additional permissions apply only to part of the Program, that part may -be used separately under those permissions, but the entire Program remains -governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any -additional permissions from that copy, or from any part of it. (Additional -permissions may be written to require their own removal in certain cases when -you modify the work.) You may place additional permissions on material, added by -you to a covered work, for which you have or can give appropriate copyright -permission. - -Notwithstanding any other provision of this License, for material you add to a -covered work, you may (if authorized by the copyright holders of that material) -supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - -All other non-permissive additional terms are considered "further restrictions" -within the meaning of section 10. If the Program as you received it, or any part -of it, contains a notice stating that it is governed by this License along with -a term that is a further restriction, you may remove that term. If a license -document contains a further restriction but permits relicensing or conveying -under this License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does not survive -such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, -in the relevant source files, a statement of the additional terms that apply to -those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a -separately written license, or stated as exceptions; the above requirements -apply either way. - -8. Termination. - -You may not propagate or modify a covered work except as expressly provided -under this License. Any attempt otherwise to propagate or modify it is void, and -will automatically terminate your rights under this License (including any -patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a -particular copyright holder is reinstated (a) provisionally, unless and until -the copyright holder explicitly and finally terminates your license, and (b) -permanently, if the copyright holder fails to notify you of the violation by -some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated -permanently if the copyright holder notifies you of the violation by some -reasonable means, this is the first time you have received notice of violation -of this License (for any work) from that copyright holder, and you cure the -violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of -parties who have received copies or rights from you under this License. If your -rights have been terminated and not permanently reinstated, you do not qualify -to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy of -the Program. Ancillary propagation of a covered work occurring solely as a -consequence of using peer-to-peer transmission to receive a copy likewise does -not require acceptance. However, nothing other than this License grants you -permission to propagate or modify any covered work. These actions infringe -copyright if you do not accept this License. Therefore, by modifying or -propagating a covered work, you indicate your acceptance of this License to do -so. - -10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives a -license from the original licensors, to run, modify and propagate that work, -subject to this License. You are not responsible for enforcing compliance by -third parties with this License. - -An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered work results -from an entity transaction, each party to that transaction who receives a copy -of the work also receives whatever licenses to the work the party's predecessor -in interest had or could give under the previous paragraph, plus a right to -possession of the Corresponding Source of the work from the predecessor in -interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights -granted or affirmed under this License. For example, you may not impose a -license fee, royalty, or other charge for exercise of rights granted under this -License, and you may not initiate litigation (including a cross-claim or -counterclaim in a lawsuit) alleging that any patent claim is infringed by -making, using, selling, offering for sale, or importing the Program or any -portion of it. - -11. Patents. - -A "contributor" is a copyright holder who authorizes use under this License of -the Program or a work on which the Program is based. The work thus licensed is -called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned or -controlled by the contributor, whether already acquired or hereafter acquired, -that would be infringed by some manner, permitted by this License, of making, -using, or selling its contributor version, but do not include claims that would -be infringed only as a consequence of further modification of the contributor -version. For purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent -license under the contributor's essential patent claims, to make, use, sell, -offer for sale, import and otherwise run, modify and propagate the contents of -its contributor version. - -In the following three paragraphs, a "patent license" is any express agreement -or commitment, however denominated, not to enforce a patent (such as an express -permission to practice a patent or covenant not to sue for patent infringement). -To "grant" such a patent license to a party means to make such an agreement or -commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the -Corresponding Source of the work is not available for anyone to copy, free of -charge and under the terms of this License, through a publicly available network -server or other readily accessible means, then you must either (1) cause the -Corresponding Source to be so available, or (2) arrange to deprive yourself of -the benefit of the patent license for this particular work, or (3) arrange, in a -manner consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have actual -knowledge that, but for the patent license, your conveying the covered work in a -country, or your recipient's use of the covered work in a country, would -infringe one or more identifiable patents in that country that you have reason -to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you -convey, or propagate by procuring conveyance of, a covered work, and grant a -patent license to some of the parties receiving the covered work authorizing -them to use, propagate, modify or convey a specific copy of the covered work, -then the patent license you grant is automatically extended to all recipients of -the covered work and works based on it. - -A patent license is "discriminatory" if it does not include within the scope of -its coverage, prohibits the exercise of, or is conditioned on the non-exercise -of one or more of the rights that are specifically granted under this License. -You may not convey a covered work if you are a party to an arrangement with a -third party that is in the business of distributing software, under which you -make payment to the third party based on the extent of your activity of -conveying the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory patent -license (a) in connection with copies of the covered work conveyed by you (or -copies made from those copies), or (b) primarily for and in connection with -specific products or compilations that contain the covered work, unless you -entered into that arrangement, or that patent license was granted, prior to 28 -March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied -license or other defenses to infringement that may otherwise be available to you -under applicable patent law. - -12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not excuse -you from the conditions of this License. If you cannot convey a covered work so -as to satisfy simultaneously your obligations under this License and any other -pertinent obligations, then as a consequence you may not convey it at all. For -example, if you agree to terms that obligate you to collect a royalty for -further conveying from those to whom you convey the Program, the only way you -could satisfy both those terms and this License would be to refrain entirely -from conveying the Program. - -13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have permission to link -or combine any covered work with a work licensed under version 3 of the GNU -Affero General Public License into a single combined work, and to convey the -resulting work. The terms of this License will continue to apply to the part -which is the covered work, but the special requirements of the GNU Affero -General Public License, section 13, concerning interaction through a network -will apply to the combination as such. - -14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the GNU -General Public License from time to time. Such new versions will be similar in -spirit to the present version, but may differ in detail to address new problems -or concerns. - -Each version is given a distinguishing version number. If the Program specifies -that a certain numbered version of the GNU General Public License "or any later -version" applies to it, you have the option of following the terms and -conditions either of that numbered version or of any later version published by -the Free Software Foundation. If the Program does not specify a version number -of the GNU General Public License, you may choose any version ever published by -the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the -GNU General Public License can be used, that proxy's public statement of -acceptance of a version permanently authorizes you to choose that version for -the Program. - -Later license versions may give you additional or different permissions. -However, no additional obligations are imposed on any author or copyright holder -as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER -PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE -QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE -DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY -COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS -PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, -INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE -THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED -INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE -PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY -HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot -be given local legal effect according to their terms, reviewing courts shall -apply local law that most closely approximates an absolute waiver of all civil -liability in connection with the Program, unless a warranty or assumption of -liability accompanies a copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use -to the public, the best way to achieve this is to make it free software which -everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach -them to the start of each source file to most effectively state the exclusion of -warranty; and each file should have at least the "copyright" line and a pointer -to where the full notice is found. - - Triplex — The React Three Fiber editor - Copyright (C) 2022-Present Michael Dougall - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like -this when it starts in an interactive mode: - - Triplex Copyright (C) 2022-Present Michael Dougall - This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate -parts of the General Public License. Of course, your program's commands might be -different; for a GUI interface, you would use an "about box". - -You should also get your employer (if you work as a programmer) or school, if -any, to sign a "copyright disclaimer" for the program, if necessary. For more -information on this, and how to apply and follow the GNU GPL, see -. - -The GNU General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may consider -it more useful to permit linking proprietary applications with the library. If -this is what you want to do, use the GNU Lesser General Public License instead -of this License. But first, please read -. diff --git a/packages/bridge/README.md b/packages/bridge/README.md deleted file mode 100644 index 0cd5d93c..00000000 --- a/packages/bridge/README.md +++ /dev/null @@ -1 +0,0 @@ -# @triplex/bridge diff --git a/packages/bridge/package.json b/packages/bridge/package.json deleted file mode 100644 index 4a44284f..00000000 --- a/packages/bridge/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@triplex/bridge", - "version": "0.58.2", - "private": true, - "description": "The React Three Fiber editor.", - "license": "GPL-3.0", - "author": "Michael Dougall (https://twitter.com/itsdouges)", - "exports": { - "./host": { - "module": "./src/host.ts", - "types": "./src/host.ts" - }, - "./client": { - "module": "./src/client.ts", - "types": "./src/client.ts" - } - }, - "files": [ - "dist" - ], - "scripts": { - "build": "swc ./src -d ./dist", - "typedef": "tsc" - }, - "devDependencies": { - "@swc/cli": "^0.1.59", - "@swc/core": "^1.3.28", - "typescript": "^4.9.4" - }, - "publishConfig": { - "exports": { - "./host": { - "module": "./dist/host.js", - "types": "./dist/host.d.ts" - }, - "./client": { - "module": "./dist/client.js", - "types": "./dist/client.d.ts" - } - }, - "types": "./dist/index.d.ts" - } -} diff --git a/packages/bridge/src/client.ts b/packages/bridge/src/client.ts deleted file mode 100644 index 431951e1..00000000 --- a/packages/bridge/src/client.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import type { - ClientSendEventData, - ClientSendEventName, - ClientSendEventResponse, - HostSendEventData, - HostSendEventName, - HostSendEventResponse, -} from "./types"; - -export function listen( - eventName: TEvent, - callback: ( - data: HostSendEventData[TEvent] - ) => - | void - | HostSendEventResponse[TEvent] - | Promise -) { - const cb = async (e: MessageEvent) => { - if (typeof e.data === "object" && e.data.eventName === eventName) { - const value = await callback(e.data.data); - - if (value !== undefined) { - respond(eventName, value); - } else if (process.env.NODE_ENV === "test") { - // Always respond in a test environment so we can assert that the event was called - // eslint-disable-next-line @typescript-eslint/no-explicit-any - respond(eventName, undefined as any); - } - } - }; - - window.addEventListener("message", cb, false); - - return () => { - window.removeEventListener("message", cb, false); - }; -} - -export function send( - eventName: TEvent, - data: ClientSendEventData[TEvent], - awaitResponse = false -): Promise { - window.top?.postMessage({ data, eventName }, "*"); - - if (awaitResponse) { - return new Promise((resolve) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const responseName = `${eventName}Response` as any; - const cleanup = listen(responseName, (responseValue) => { - resolve(responseValue as ClientSendEventResponse[TEvent]); - cleanup(); - }); - }); - } - - return Promise.resolve(undefined as ClientSendEventResponse[TEvent]); -} - -function respond( - eventName: TEvent, - data: HostSendEventResponse[TEvent] -) { - window.top?.postMessage({ data, eventName: `${eventName}Response` }, "*"); -} - -export { compose } from "./compose"; diff --git a/packages/bridge/src/host.ts b/packages/bridge/src/host.ts deleted file mode 100644 index b2cc915b..00000000 --- a/packages/bridge/src/host.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import type { - ClientSendEventData, - ClientSendEventName, - ClientSendEventResponse, - HostSendEventData, - HostSendEventName, - HostSendEventResponse, -} from "./types"; - -export function listen( - eventName: TEvent, - callback: ( - data: ClientSendEventData[TEvent] - ) => - | void - | ClientSendEventResponse[TEvent] - | Promise -) { - const cb = async (e: MessageEvent) => { - if (typeof e.data === "object" && e.data.eventName === eventName) { - const value = await callback(e.data.data); - - if (value !== undefined) { - respond(eventName, value); - } - } - }; - - window.addEventListener("message", cb, false); - - return () => { - window.removeEventListener("message", cb, false); - }; -} - -function getMessageWindow() { - const iframe = document.getElementsByTagName("iframe")[0]; - const messageWindow = - process.env.NODE_ENV === "test" - ? // In a test environment there won't be an iframe so we just return the window - window - : iframe.contentWindow; - - return messageWindow; -} - -export function send( - eventName: TEvent, - data: HostSendEventData[TEvent], - awaitResponse = false -): Promise { - const messageWindow = getMessageWindow(); - - messageWindow?.postMessage( - { - data, - eventName, - }, - "*" - ); - - if (awaitResponse) { - return new Promise((resolve) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const responseName = `${eventName}Response` as any; - const cleanup = listen(responseName, (responseValue) => { - resolve(responseValue as HostSendEventResponse[TEvent]); - cleanup(); - }); - }); - } - - return Promise.resolve(undefined as HostSendEventResponse[TEvent]); -} - -function respond( - eventName: TEvent, - data: ClientSendEventResponse[TEvent] -) { - const messageWindow = getMessageWindow(); - - messageWindow?.postMessage( - { - data, - eventName: `${eventName}Response`, - }, - "*" - ); -} - -export { compose } from "./compose"; diff --git a/packages/bridge/src/types.ts b/packages/bridge/src/types.ts deleted file mode 100644 index 4879b333..00000000 --- a/packages/bridge/src/types.ts +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -export type ClientSendEventName = keyof ClientSendEventData; - -export interface ClientSendEventData { - "trplx:onAddNewComponent": { - target?: { - action: "child"; - column: number; - exportName: string; - line: number; - path: string; - }; - type: - | { - exportName: string; - name: string; - path: string; - props: Record; - type: "custom"; - } - | { - name: string; - props: Record; - type: "host"; - }; - }; - "trplx:onCameraTypeChange": { - type: "perspective" | "orthographic"; - }; - "trplx:onConfirmSceneObjectProp": { - column: number; - line: number; - path: string; - propName: string; - propValue: unknown; - }; - "trplx:onConnected": undefined; - "trplx:onError": { - col: number; - line: number; - message: string; - source: string; - stack: string; - }; - "trplx:onOpenFileHmr": undefined; - "trplx:onSceneObjectBlur": undefined; - "trplx:onSceneObjectFocus": { - column: number; - line: number; - parentPath: string; - path: string; - }; - "trplx:onSceneObjectNavigated": { - encodedProps: string; - entered?: boolean; - exportName: string; - path: string; - }; - "trplx:onStateChange": { - change: "userCamera"; - data: { column: number; line: number; path: string }; - }; - "trplx:onTransformChange": { - mode: "translate" | "scale" | "rotate"; - }; - "trplx:requestDeleteSceneObject": undefined; - "trplx:requestRedo": undefined; - "trplx:requestSave": undefined; - "trplx:requestUndo": undefined; -} - -export interface ClientSendEventResponse { - "trplx:onAddNewComponent": { - column: number; - line: number; - path: string; - }; - "trplx:onCameraTypeChange": void; - "trplx:onConfirmSceneObjectProp": void; - "trplx:onConnected": void; - "trplx:onError": void; - "trplx:onOpenFileHmr": void; - "trplx:onSceneObjectBlur": void; - "trplx:onSceneObjectFocus": void; - "trplx:onSceneObjectNavigated": void; - "trplx:onStateChange": void; - "trplx:onTransformChange": void; - "trplx:requestDeleteSceneObject": void; - "trplx:requestRedo": void; - "trplx:requestSave": void; - "trplx:requestUndo": void; -} - -export type HostSendEventName = keyof HostSendEventData; - -export interface HostSendEventData { - "trplx:requestAction": { action: "viewFocusedCamera" | "resetCamera" }; - "trplx:requestAddNewComponent": { - target?: { - action: "child"; - column: number; - exportName: string; - line: number; - path: string; - }; - type: - | { - exportName: string; - name: string; - path: string; - props: Record; - type: "custom"; - } - | { - name: string; - props: Record; - type: "host"; - }; - }; - "trplx:requestBlurSceneObject": undefined; - "trplx:requestCameraTypeChange": { - type: "perspective" | "orthographic"; - }; - "trplx:requestDeleteSceneObject": { - column: number; - line: number; - parentPath: string; - }; - "trplx:requestFocusSceneObject": { - column: number; - line: number; - parentPath: string; - path: string; - }; - "trplx:requestJumpToSceneObject": undefined; - "trplx:requestNavigateToScene": - | { - encodedProps: string; - exportName: string; - path: string; - } - | undefined; - "trplx:requestPersistSceneObjectProp": { - column: number; - line: number; - path: string; - propName: string; - propValue: unknown; - }; - "trplx:requestRefresh": { hard?: boolean }; - "trplx:requestReset": undefined; - "trplx:requestResetSceneObjectProp": { - column: number; - line: number; - path: string; - propName: string; - }; - "trplx:requestRestoreSceneObject": { - column: number; - line: number; - parentPath: string; - }; - "trplx:requestSceneObjectPropValue": { - column: number; - line: number; - path: string; - propName: string; - }; - "trplx:requestSetSceneObjectProp": { - column: number; - line: number; - path: string; - propName: string; - propValue: unknown; - }; - "trplx:requestTransformChange": { - mode: "translate" | "scale" | "rotate"; - }; -} - -export interface HostSendEventResponse { - "trplx:requestAction": void; - "trplx:requestAddNewComponent": void; - "trplx:requestBlurSceneObject": void; - "trplx:requestCameraTypeChange": void; - "trplx:requestDeleteSceneObject": void; - "trplx:requestFocusSceneObject": void; - "trplx:requestJumpToSceneObject": void; - "trplx:requestNavigateToScene": void; - "trplx:requestPersistSceneObjectProp": void; - "trplx:requestRefresh": void; - "trplx:requestReset": void; - "trplx:requestResetSceneObjectProp": void; - "trplx:requestRestoreSceneObject": void; - "trplx:requestSceneObjectPropValue": { value: unknown }; - "trplx:requestSetSceneObjectProp": void; - "trplx:requestTransformChange": void; -} diff --git a/packages/bridge/tsconfig.json b/packages/bridge/tsconfig.json deleted file mode 100644 index e3b45f2a..00000000 --- a/packages/bridge/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../.tsconfig/react-library.json", - "include": ["."], - "exclude": ["dist", "build", "node_modules"], - "compilerOptions": { - "baseUrl": ".", - "outDir": "./dist" - } -} diff --git a/packages/editor/CHANGELOG.md b/packages/editor/CHANGELOG.md deleted file mode 100644 index 0b5702b5..00000000 --- a/packages/editor/CHANGELOG.md +++ /dev/null @@ -1,897 +0,0 @@ -# @triplex/editor - -## 0.58.2 - -### Patch Changes - -- 85447c2: Add halloween template for project initialization. -- 85447c2: Upgrade three.js. -- b5247c2: Apply lint and prettier fixes. -- Updated dependencies [b5247c2] - - @triplex/ws-client@0.58.2 - - @triplex/bridge@0.58.2 - -## 0.58.1 - -### Patch Changes - -- e645e5c: Fix provider ui not respecting default props. -- f1656e0: Provider config now takes up slightly more space. - - @triplex/ws-client@0.58.1 - - @triplex/bridge@0.58.1 - -## 0.58.0 - -### Minor Changes - -- 37bf36d: Add provider props as config to the ui. -- 3e1e081: Separate soft refresh from hard refresh. - -### Patch Changes - -- Updated dependencies [3e1e081] - - @triplex/bridge@0.58.0 - - @triplex/ws-client@0.58.0 - -## 0.57.2 - -### Patch Changes - -- f5bbeda: Literal union input now supports boolean literals. -- f5bbeda: Fix server throwing when symbols for jsx elements were not resolved. - - @triplex/ws-client@0.57.2 - - @triplex/bridge@0.57.2 - -## 0.57.1 - -### Patch Changes - -- @triplex/bridge@0.57.1 -- @triplex/ws-client@0.57.1 - -## 0.57.0 - -### Minor Changes - -- 5c1fc3d: Add editing child jsx elements through the Triplex UI. -- 628646e: Context panel now has a filter for props. -- 7673ae8: A search input filter is now available when opening a component. -- 2b61384: Adding an asset is now contextual, the original button adds to the - open component, while the add buttons on each element in the left scene panel - add to it as a child. - -### Patch Changes - -- 046cf78: Error notification is now displayed in the bottom left and is - emphasized less. -- 2b61384: When adding new elements to the scene the left scene panel now - scrolls to the added element if needed. -- 628646e: Inputs can now have their content selected with the select all - command (cmd + a). -- Updated dependencies [5c1fc3d] -- Updated dependencies [2b61384] - - @triplex/bridge@0.57.0 - - @triplex/ws-client@0.57.0 - -## 0.56.1 - -### Patch Changes - -- @triplex/ws-client@0.56.1 -- @triplex/bridge@0.56.1 - -## 0.56.0 - -### Minor Changes - -- 463789f: Adds end-to-end typesafe ws router. -- 32a110f: Add top-level scene component to the scene panel. When selected users - can modify the props during their seession to see what happens. -- 47483b9: The data that powers the context panel props is now sourced from - types first instead of defined props first, resulting in tuple type data no - longer being lost after a prop has been set. - -### Patch Changes - -- d674f26: Color input can now be cleared when not required. -- 47483b9: Tuple input no longer fires when required values are only partially - filled out. -- 2e53a2e: Turn off type declaration maps. -- Updated dependencies [463789f] -- Updated dependencies [5f7e78f] -- Updated dependencies [32a110f] -- Updated dependencies [2e53a2e] - - @triplex/ws-client@0.56.0 - - @triplex/bridge@0.56.0 - -## 0.55.3 - -### Patch Changes - -- @triplex/bridge@0.55.3 -- @triplex/ws-client@0.55.3 - -## 0.55.2 - -### Patch Changes - -- @triplex/bridge@0.55.2 -- @triplex/ws-client@0.55.2 - -## 0.55.1 - -### Patch Changes - -- ea86fdc: Add license banner. -- b3d2fa9: Number input no longer calls change and confirm handlers if the value - is outside the min/max range. -- Updated dependencies [ea86fdc] - - @triplex/ws-client@0.55.1 - - @triplex/bridge@0.55.1 - -## 0.55.0 - -### Minor Changes - -- 3be2782: Add support for adding a gltf static asset to the scene. -- b6970aa: Adds prop tags to context to be picked up by inputs. -- ab909b4: Static assets are now available through the assets drawer. -- 4fa9018: The number input has been re-written to improve its UX. -- 44faed1: Jsdoc tags are now returned in the jsx element type response. -- b6970aa: Number input can now have a min/max value set using `@min` and `@max` - jsdoc tags respectively. E.g. `@min 1` will cap the input value to 1. - -### Patch Changes - -- Updated dependencies [ab909b4] - - @triplex/ws-client@0.55.0 - - @triplex/bridge@0.55.0 - -## 0.54.2 - -### Patch Changes - -- Updated dependencies [a060d2c] - - @triplex/ws-client@0.54.2 - - @triplex/bridge@0.54.2 - -## 0.54.1 - -### Patch Changes - -- d58e0b0: During save a route transition will only occur if saving the file to - another path. -- 8afea84: Focus state is now handled across the app. -- cdd6234: Delete and undo/redo actions are no longer double fired when using - the hotkey in the editor. - - @triplex/bridge@0.54.1 - - @triplex/ws-client@0.54.1 - -## 0.54.0 - -### Minor Changes - -- 8fad65a: Adds camera type to controls menu, allowing you to switch between - perspective and orthographic camera. -- e0038f6: Add support for viewing through a user land camera. - -### Patch Changes - -- e0038f6: Disable enter component for node modules dependencies. -- Updated dependencies [8fad65a] -- Updated dependencies [e0038f6] - - @triplex/bridge@0.54.0 - - @triplex/ws-client@0.54.0 - -## 0.53.1 - -### Patch Changes - -- @triplex/bridge@0.53.1 -- @triplex/ws-client@0.53.1 - -## 0.53.0 - -### Minor Changes - -- c71412b: Adds refresh scene action available in the File menubar and through - cmd/ctrl + r. - -### Patch Changes - -- aa3a982: View logs button no longer is disabled during project creation. -- aa3a982: React and React Three Fiber are now peer dependencies. -- aa3a982: Fixed three peer dependency not being loose enough and - react-three-fiber and react being missing from peer dependencies. -- bddac75: Welcome screen version number now positioned depending on OS. -- Updated dependencies [aa3a982] -- Updated dependencies [c71412b] - - @triplex/ws-client@0.53.0 - - @triplex/bridge@0.53.0 - -## 0.52.0 - -### Minor Changes - -- 48016ba: Rotation props are now displayed as degrees in the UI and saved to - code as radians. Previously it was all radians which was confusing for pretty - much everyone. -- fe90482: Logs are now accessible through the View > Logs menubar action. -- 8d532f5: Editor now shows build time and runtime errors in an error overlay. - -### Patch Changes - -- 120f9ef: When updating array inputs undefined optional values are now ignored - and discarded. -- Updated dependencies [8d532f5] - - @triplex/bridge@0.52.0 - - @triplex/ws-client@0.52.0 - -## 0.51.1 - -### Patch Changes - -- @triplex/bridge@0.51.1 -- @triplex/ws-client@0.51.1 - -## 0.51.0 - -### Minor Changes - -- b61dc2a: The editor menu bar is now displayed in the title bar for Windows and - Node.js. - -### Patch Changes - -- b61dc2a: Hotkeys on Windows are now title case. -- b61dc2a: Menu bar events now originate from the editor source instead of being - some in the electron app and some in the editor. -- c97e359: Inputs no longer call change and confirm handlers with `undefined` - values when required. - - @triplex/bridge@0.51.0 - - @triplex/ws-client@0.51.0 - -## 0.50.1 - -### Patch Changes - -- @triplex/bridge@0.50.1 -- @triplex/ws-client@0.50.1 - -## 0.50.0 - -### Minor Changes - -- 8ea575b: Built output is now mangled. - -### Patch Changes - -- Updated dependencies [8ea575b] - - @triplex/bridge@0.50.0 - - @triplex/ws-client@0.50.0 - -## 0.49.0 - -### Minor Changes - -- 3eae131: Welcome screen now shows a progress bar when installing node modules. -- 8c5611d: Adds create project action to the welcome screen. -- 3eae131: Welcome screen now is draggable using the top invisible title bar. - -### Patch Changes - -- @triplex/bridge@0.49.0 -- @triplex/ws-client@0.49.0 - -## 0.48.0 - -### Minor Changes - -- 6fe34af: Windows support is here. Now Triplex cli and electron can be ran on - Windows, as well as the local dev loop now being functional. - -### Patch Changes - -- @triplex/bridge@0.48.0 -- @triplex/ws-client@0.48.0 - -## 0.47.0 - -### Minor Changes - -- daa2697: Adds a welcome screen to the electron app. -- 1fc7657: Menu bar is now native when ran in the electron app. -- 1fc7657: Electron app now uses a custom title bar. -- e8cf76f: Adds native save dialog support. -- 1fc7657: Window title now uses both the folder name and file name if open. -- 4164026: Undo/redo menu items now correctly display as enabled or disabled - when appropriate. - -### Patch Changes - -- 4164026: Editor is now typechecked again. -- e8cf76f: When no file is open irrelevant menu items are now disabled. - - @triplex/bridge@0.47.0 - - @triplex/ws-client@0.47.0 - -## 0.46.4 - -### Patch Changes - -- @triplex/bridge@0.46.4 -- @triplex/ws-client@0.46.4 - -## 0.46.3 - -### Patch Changes - -- @triplex/bridge@0.46.3 -- @triplex/ws-client@0.46.3 - -## 0.46.2 - -### Patch Changes - -- @triplex/bridge@0.46.2 -- @triplex/ws-client@0.46.2 - -## 0.46.1 - -### Patch Changes - -- @triplex/bridge@0.46.1 -- @triplex/ws-client@0.46.1 - -## 0.46.0 - -### Patch Changes - -- @triplex/bridge@0.46.0 -- @triplex/ws-client@0.46.0 - -## 0.45.1 - -### Patch Changes - -- @triplex/bridge@0.45.1 -- @triplex/ws-client@0.45.1 - -## 0.45.0 - -### Patch Changes - -- @triplex/bridge@0.45.0 -- @triplex/ws-client@0.45.0 - -## 0.44.0 - -### Minor Changes - -- 0242833: Scene now removes intermediate state when resetting. -- 56b17f0: Adds filter for add element drawer. -- 4d8d9cc: Builds are now minified. -- 557648e: Editor has been extracted out of the client dev server and now is - bundled when published to npm. - -### Patch Changes - -- Updated dependencies [0242833] -- Updated dependencies [4d8d9cc] -- Updated dependencies [557648e] - - @triplex/bridge@0.44.0 - - @triplex/ws-client@0.44.0 - -## 0.43.0 - -### Minor Changes - -- 6dfb22d: Save as action now available in the menubar. Use to save the current - open file to another location. -- 6dfb22d: Scroll container thumb scroll areas now take up less space. -- 6dfb22d: Create a component in the current open file through the component - switcher. -- de54812: Color inputs now show a transparent background when undefined. -- b7bbeba: Deleting the selected element with backspace now works when focused - on any element other than an input. -- 6dfb22d: A component switcher is now available in the left panel, use it to - quickly switch between components in the open file. -- 6dfb22d: The browser tab title now changes when there are unsaved changes. -- b7bbeba: String and numbers in props now can have undefined default values. -- de54812: Prop inputs now are able to be cleared through the ui. -- de54812: Context panel tuple props now show labels when available. -- de54812: Checkbox now renders using a custom icon. -- b7bbeba: When adding a new element to the scene if you have a selection it - will be added as a child. If you have no selection it will be added to the - root component. -- 01cd388: Adds context panel indicator to the add component drawer when an - element is selected. -- facc6aa: Saving a new component now prompts for a component name. -- de54812: Fixed save prop serializing undefined to null. -- 01cd388: Fixes the context panel unexpectedly when closing the color picker - with escape. - -### Patch Changes - -- Updated dependencies [b7bbeba] - - @triplex/bridge@0.43.0 - - @triplex/ws-client@0.43.0 - -## 0.42.0 - -### Patch Changes - -- @triplex/bridge@0.42.0 -- @triplex/ws-client@0.42.0 - -## 0.41.0 - -### Minor Changes - -- 5d161d8: The editor panels are now displayed on a single flex layout. - -### Patch Changes - -- @triplex/bridge@0.41.0 -- @triplex/ws-client@0.41.0 - -## 0.40.0 - -### Minor Changes - -- a2a2f4b: Removes usage of r3f internals. -- a2a2f4b: Fixes union input accidentally having default value being applied - when it shouldn't. -- dac7c76: Selection for scene objects is now more resilient being able to be - set before scene objects are actually available. -- bfb0f7a: Adds an error boundary ui to replace the basic error text version. -- ee2494b: When clicking ide links such as view source websocket connections no - longer close. - -### Patch Changes - -- Updated dependencies [ee2494b] - - @triplex/ws-client@0.40.0 - - @triplex/bridge@0.40.0 - -## 0.39.0 - -### Minor Changes - -- ca9807e: New files can now be created through the file menu. -- ca9807e: After adding a component it will now be automatically focused. -- ca9807e: Union input now correctly picks up default value. - -### Patch Changes - -- @triplex/bridge@0.39.0 -- @triplex/ws-client@0.39.0 - -## 0.38.0 - -### Patch Changes - -- @triplex/bridge@0.38.0 -- @triplex/ws-client@0.38.0 - -## 0.37.0 - -### Minor Changes - -- 23fe64a: Adds delete scene object. Access through the context panel when - focusing on a scene object. - -### Patch Changes - -- Updated dependencies [23fe64a] -- Updated dependencies [1a2ecea] - - @triplex/bridge@0.37.0 - - @triplex/ws-client@0.37.0 - -## 0.36.0 - -### Patch Changes - -- @triplex/bridge@0.36.0 -- @triplex/ws-client@0.36.0 - -## 0.35.0 - -### Minor Changes - -- e53a703: Prop font size in the context panel has been reduced. -- e53a703: Emissive prop now considered a color. - -### Patch Changes - -- @triplex/bridge@0.35.0 -- @triplex/ws-client@0.35.0 - -## 0.34.0 - -### Minor Changes - -- 2a64658: Prop descriptions are now viewable in the context panel when hovering - over prop names. -- 2a64658: The context panel now displays all available props on a component - even if they aren't yet declared thanks to the TypeScript compiler and - ts-morph. Not all prop types are supported currently, if you have one that you - expected to be available but isn't please reach out. - -### Patch Changes - -- Updated dependencies [2a64658] - - @triplex/ws-client@0.34.0 - - @triplex/bridge@0.34.0 - -## 0.33.0 - -### Minor Changes - -- 1067d23: Adds transform controls to the ui. - -### Patch Changes - -- Updated dependencies [1067d23] - - @triplex/bridge@0.33.0 - - @triplex/ws-client@0.33.0 - -## 0.32.0 - -### Minor Changes - -- 73d9e8c: Inputs no longer trigger dirty scene state if their value hasn't - changed. -- c87a5f3: Undo/redo now available. When manipulating the scene through - transform controls or the context panel each persisted manipulation will be - able to be undone (and redone) using hotkeys and the edit menu actions. -- c87a5f3: Saving with hotkey is now available when focus is on the ui. -- c87a5f3: Adds reset command. Use this to throw away all unsaved changes in the - scene. - -### Patch Changes - -- Updated dependencies [c87a5f3] - - @triplex/bridge@0.32.0 - - @triplex/ws-client@0.32.0 - -## 0.31.0 - -### Minor Changes - -- 5ac3a26: UI has been darkened and borders have been deemphasized. -- a1e3127: When source changes ui now reflects the updated value. -- 48002a7: Array input no longer caches its value which resulted in unexpected - bugs when transforming in scene and then through the ui. - -### Patch Changes - -- @triplex/bridge@0.31.0 -- @triplex/ws-client@0.31.0 - -## 0.30.0 - -### Minor Changes - -- 0bb6119: Adds support for updating scene objects through the context panel. -- 0bb6119: Extract inputs to their own custom components. -- 0bb6119: Fix color input not showing for various color inputs. - -### Patch Changes - -- Updated dependencies [0bb6119] - - @triplex/bridge@0.30.0 - - @triplex/ws-client@0.30.0 - -## 0.29.0 - -### Minor Changes - -- 0d83ef2: Scene drawer now has correct padding and is increased in width. -- 0d83ef2: The catch all prop field now has capped height stopping it from - looking ridiculous. - -### Patch Changes - -- @triplex/bridge@0.29.0 -- @triplex/ws-client@0.29.0 - -## 0.28.0 - -### Minor Changes - -- aa1aa8c: Scene transformation using ts-morph has been replaced with Babel - significantly speeding up initial load and saving. The need for the - `.triplex/tmp` folder is now gone and thus no longer used. -- aa1aa8c: Line and column numbers for scene objects have been corrected and are - now consistent across editor, scene, and server. -- aa1aa8c: Scene drawer now shows loading text when appropriate. - -### Patch Changes - -- @triplex/bridge@0.28.0 -- @triplex/ws-client@0.28.0 - -## 0.27.0 - -### Minor Changes - -- fa35cde: Fixes UI scrolling and contrast bugs. -- 9b1d135: Increased gutters in the scene panel list as well as fixing the - variable width in the context panel. -- 246217f: Text contrast in the scene and context panel have been improved. -- e5a3419: Context panel now supports more prop types. - -### Patch Changes - -- @triplex/bridge@0.27.0 -- @triplex/ws-client@0.27.0 - -## 0.26.0 - -### Minor Changes - -- 785050d: Adds unsaved indicator to the editor. -- 71374c9: Scene, context, and open scene containers now scroll when overflowing - with content. - -### Patch Changes - -- Updated dependencies [785050d] - - @triplex/ws-client@0.26.0 - - @triplex/bridge@0.26.0 - -## 0.25.0 - -### Patch Changes - -- @triplex/bridge@0.25.0 -- @triplex/ws-client@0.25.0 - -## 0.24.0 - -### Patch Changes - -- @triplex/bridge@0.24.0 -- @triplex/ws-client@0.24.0 - -## 0.23.0 - -### Patch Changes - -- @triplex/bridge@0.23.0 -- @triplex/ws-client@0.23.0 - -## 0.22.0 - -### Minor Changes - -- aa9c9ae: Lighten selected state. - -### Patch Changes - -- @triplex/bridge@0.22.0 -- @triplex/ws-client@0.22.0 - -## 0.21.0 - -### Patch Changes - -- @triplex/bridge@0.21.0 -- @triplex/ws-client@0.21.0 - -## 0.20.0 - -### Minor Changes - -- 1c9771d: Named exports are now able to be opened by the editor. -- 1c9771d: Scene drawer now shows named exports from scenes. -- 1c9771d: Focus events now only use line and column numbers. - -### Patch Changes - -- Updated dependencies [1c9771d] - - @triplex/bridge@0.20.0 - - @triplex/ws-client@0.20.0 - -## 0.19.0 - -### Patch Changes - -- @triplex/bridge@0.19.0 -- @triplex/ws-client@0.19.0 - -## 0.18.0 - -### Patch Changes - -- @triplex/bridge@0.18.0 -- @triplex/ws-client@0.18.0 - -## 0.17.0 - -### Patch Changes - -- @triplex/bridge@0.17.0 -- @triplex/ws-client@0.17.0 - -## 0.16.0 - -### Minor Changes - -- e7c026b: Scene drawer no-longer stays open when selecting a scene. -- 7ff35f3: Context panel no longer throws when navigating between scene and a - scene object is selected. -- e7c026b: Scene panel now shows correctly nested jsx elements. -- e7c026b: Disabled menu items are now actually disabled. -- 7ff35f3: Upgrades @react-three/fiber to latest. -- 7ff35f3: Navigating to host elements is no longer possible (as there is - nowhere to navigate to). -- 2fa7c45: Adds author field to package.json. - -### Patch Changes - -- Updated dependencies [d8e1602] -- Updated dependencies [7ff35f3] -- Updated dependencies [2fa7c45] - - @triplex/bridge@0.16.0 - - @triplex/ws-client@0.16.0 - -## 0.15.0 - -### Minor Changes - -- e54e0f8: Editor now has a select menu with useful actions when a scene object - is selected. -- e54e0f8: Bridge events now flow unidirectionally enabling the editor ui to - initiate events to the scene, such as navigate and focus. - -### Patch Changes - -- Updated dependencies [e54e0f8] - - @triplex/bridge@0.15.0 - - @triplex/ws-client@0.15.0 - -## 0.14.0 - -### Minor Changes - -- 7a8083c: The open rpc has been added back to prevent the "flash of no scene" - when transitioning between scenes for the first time. - -### Patch Changes - -- @triplex/bridge@0.14.0 -- @triplex/ws-client@0.14.0 - -## 0.13.0 - -### Minor Changes - -- cfbd47b: When transitioning between scenes there is no longer a flash of - hidden scene objects. -- 969feab: Removes unneeded fetch calls. -- cc917d7: Adds usage of ws-client pkg. -- 969feab: Adds react suspense powered websocket abstraction. -- a4d6882: Adds context panel for selected scene objects. -- 99075ff: Adds error boundaries so the app doesn't blow up when a scene isn't - found. -- cfbd47b: Scene meta has been extrated into a common hook. -- 969feab: Scene list and scene components ui now fetch data using the websocket - client. - -### Patch Changes - -- Updated dependencies [a4d6882] -- Updated dependencies [cc917d7] - - @triplex/bridge@0.7.0 - - @triplex/ws-client@0.1.0 - -## 0.12.0 - -### Minor Changes - -- 55f0206: Fixed focus and blur events between the scene and the editor. -- 55f0206: Scene components now appear nested when children of other components - in the UI. - -## 0.11.0 - -### Minor Changes - -- 3c725bc: Force release all packages. - -### Patch Changes - -- Updated dependencies [3c725bc] - - @triplex/bridge@0.6.0 - -## 0.10.0 - -### Minor Changes - -- a32c72e: Adds the scene component list to the sidebar with the ability to - focus scene objects on click. Scene components in this list are also selected - when focusing scene objects in the scene. - -## 0.9.0 - -### Minor Changes - -- ac9624f: Fixes client/host race condition where host would send events before - the client has connected. -- 7db42bd: Adds open scene drawer. - -### Patch Changes - -- Updated dependencies [ac9624f] - - @triplex/bridge@0.5.0 - -## 0.8.0 - -### Minor Changes - -- 387f6cd: Editor now able to use tailwindcss during dev, which is compiled away - when packaged to npm. -- 387f6cd: Adds a menu bar to the editor. - -## 0.7.0 - -### Minor Changes - -- 56dde00: Fixes publish config main field to point to the correct location. - -## 0.6.0 - -### Minor Changes - -- c84a8ca: Package now declares the main field. - -## 0.5.0 - -### Minor Changes - -- c8c4a55: Fixes scene frame so it can hot module reload. - -## 0.4.0 - -### Minor Changes - -- b144bb1: Package `build` now use `swc` and `tsc` directly. - -### Patch Changes - -- Updated dependencies [b144bb1] - - @triplex/bridge@0.4.0 - -## 0.3.0 - -### Minor Changes - -- bbc457e: Fixes some bugs preventing triplex from being able to be ran via cli. - -### Patch Changes - -- Updated dependencies [bbc457e] - - @triplex/bridge@0.3.0 - -## 0.2.0 - -### Minor Changes - -- 08a03af: Fixes publish to build before pushing. - -### Patch Changes - -- Updated dependencies [08a03af] - - @triplex/bridge@0.2.0 - -## 0.1.0 - -### Minor Changes - -- 9c120b4: Initial release. - -### Patch Changes - -- Updated dependencies [9c120b4] - - @triplex/bridge@0.1.0 diff --git a/packages/editor/LICENSE b/packages/editor/LICENSE deleted file mode 100644 index 741b8fab..00000000 --- a/packages/editor/LICENSE +++ /dev/null @@ -1,632 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. Everyone is -permitted to copy and distribute verbatim copies of this license document, but -changing it is not allowed. - - Preamble - -The GNU General Public License is a free, copyleft license for software and -other kinds of works. - -The licenses for most software and other practical works are designed to take -away your freedom to share and change the works. By contrast, the GNU General -Public License is intended to guarantee your freedom to share and change all -versions of a program--to make sure it remains free software for all its users. -We, the Free Software Foundation, use the GNU General Public License for most of -our software; it applies also to any other work released this way by its -authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our -General Public Licenses are designed to make sure that you have the freedom to -distribute copies of free software (and charge for them if you wish), that you -receive source code or can get it if you want it, that you can change the -software or use pieces of it in new free programs, and that you know you can do -these things. - -To protect your rights, we need to prevent others from denying you these rights -or asking you to surrender the rights. Therefore, you have certain -responsibilities if you distribute copies of the software, or if you modify it: -responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a -fee, you must pass on to the recipients the same freedoms that you received. You -must make sure that they, too, receive or can get the source code. And you must -show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert -copyright on the software, and (2) offer you this License giving you legal -permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there -is no warranty for this free software. For both users' and authors' sake, the -GPL requires that modified versions be marked as changed, so that their problems -will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified -versions of the software inside them, although the manufacturer can do so. This -is fundamentally incompatible with the aim of protecting users' freedom to -change the software. The systematic pattern of such abuse occurs in the area of -products for individuals to use, which is precisely where it is most -unacceptable. Therefore, we have designed this version of the GPL to prohibit -the practice for those products. If such problems arise substantially in other -domains, we stand ready to extend this provision to those domains in future -versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States -should not allow patents to restrict development and use of software on -general-purpose computers, but in those that do, we wish to avoid the special -danger that patents applied to a free program could make it effectively -proprietary. To prevent this, the GPL assures that patents cannot be used to -render the program non-free. - -The precise terms and conditions for copying, distribution and modification -follow. - - TERMS AND CONDITIONS - -0. Definitions. - -"This License" refers to version 3 of the GNU General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds of works, -such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this License. Each -licensee is addressed as "you". "Licensees" and "recipients" may be individuals -or organizations. - -To "modify" a work means to copy from or adapt all or part of the work in a -fashion requiring copyright permission, other than the making of an exact copy. -The resulting work is called a "modified version" of the earlier work or a work -"based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based on the -Program. - -To "propagate" a work means to do anything with it that, without permission, -would make you directly or secondarily liable for infringement under applicable -copyright law, except executing it on a computer or modifying a private copy. -Propagation includes copying, distribution (with or without modification), -making available to the public, and in some countries other activities as well. - -To "convey" a work means any kind of propagation that enables other parties to -make or receive copies. Mere interaction with a user through a computer network, -with no transfer of a copy, is not conveying. - -An interactive user interface displays "Appropriate Legal Notices" to the extent -that it includes a convenient and prominently visible feature that (1) displays -an appropriate copyright notice, and (2) tells the user that there is no -warranty for the work (except to the extent that warranties are provided), that -licensees may convey the work under this License, and how to view a copy of this -License. If the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -1. Source Code. - -The "source code" for a work means the preferred form of the work for making -modifications to it. "Object code" means any non-source form of a work. - -A "Standard Interface" means an interface that either is an official standard -defined by a recognized standards body, or, in the case of interfaces specified -for a particular programming language, one that is widely used among developers -working in that language. - -The "System Libraries" of an executable work include anything, other than the -work as a whole, that (a) is included in the normal form of packaging a Major -Component, but which is not part of that Major Component, and (b) serves only to -enable use of the work with that Major Component, or to implement a Standard -Interface for which an implementation is available to the public in source code -form. A "Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system (if any) on -which the executable work runs, or a compiler used to produce the work, or an -object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all the source -code needed to generate, install, and (for an executable work) run the object -code and to modify the work, including scripts to control those activities. -However, it does not include the work's System Libraries, or general-purpose -tools or generally available free programs which are used unmodified in -performing those activities but which are not part of the work. For example, -Corresponding Source includes interface definition files associated with source -files for the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, such as by -intimate data communication or control flow between those subprograms and other -parts of the work. - -The Corresponding Source need not include anything that users can regenerate -automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. - -All rights granted under this License are granted for the term of copyright on -the Program, and are irrevocable provided the stated conditions are met. This -License explicitly affirms your unlimited permission to run the unmodified -Program. The output from running a covered work is covered by this License only -if the output, given its content, constitutes a covered work. This License -acknowledges your rights of fair use or other equivalent, as provided by -copyright law. - -You may make, run and propagate covered works that you do not convey, without -conditions so long as your license otherwise remains in force. You may convey -covered works to others for the sole purpose of having them make modifications -exclusively for you, or provide you with facilities for running those works, -provided that you comply with the terms of this License in conveying all -material for which you do not control copyright. Those thus making or running -the covered works for you must do so exclusively on your behalf, under your -direction and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions -stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological measure under -any applicable law fulfilling obligations under article 11 of the WIPO copyright -treaty adopted on 20 December 1996, or similar laws prohibiting or restricting -circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention is -effected by exercising rights under this License with respect to the covered -work, and you disclaim any intention to limit operation or modification of the -work as a means of enforcing, against the work's users, your or third parties' -legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you receive it, -in any medium, provided that you conspicuously and appropriately publish on each -copy an appropriate copyright notice; keep intact all notices stating that this -License and any non-permissive terms added in accord with section 7 apply to the -code; keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may -offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to produce it -from the Program, in the form of source code under the terms of section 4, -provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - -A compilation of a covered work with other separate and independent works, which -are not by their nature extensions of the covered work, and which are not -combined with it such as to form a larger program, in or on a volume of a -storage or distribution medium, is called an "aggregate" if the compilation and -its resulting copyright are not used to limit the access or legal rights of the -compilation's users beyond what the individual works permit. Inclusion of a -covered work in an aggregate does not cause this License to apply to the other -parts of the aggregate. - -6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms of sections 4 -and 5, provided that you also convey the machine-readable Corresponding Source -under the terms of this License, in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the -Corresponding Source as a System Library, need not be included in conveying the -object code work. - -A "User Product" is either (1) a "consumer product", which means any tangible -personal property which is normally used for personal, family, or household -purposes, or (2) anything designed or sold for incorporation into a dwelling. In -determining whether a product is a consumer product, doubtful cases shall be -resolved in favor of coverage. For a particular product received by a particular -user, "normally used" refers to a typical or common use of that class of -product, regardless of the status of the particular user or of the way in which -the particular user actually uses, or expects or is expected to use, the -product. A product is a consumer product regardless of whether the product has -substantial commercial, industrial or non-consumer uses, unless such uses -represent the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, procedures, -authorization keys, or other information required to install and execute -modified versions of a covered work in that User Product from a modified version -of its Corresponding Source. The information must suffice to ensure that the -continued functioning of the modified object code is in no case prevented or -interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as part of a -transaction in which the right of possession and use of the User Product is -transferred to the recipient in perpetuity or for a fixed term (regardless of -how the transaction is characterized), the Corresponding Source conveyed under -this section must be accompanied by the Installation Information. But this -requirement does not apply if neither you nor any third party retains the -ability to install modified object code on the User Product (for example, the -work has been installed in ROM). - -The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates for a -work that has been modified or installed by the recipient, or for the User -Product in which it has been modified or installed. Access to a network may be -denied when the modification itself materially and adversely affects the -operation of the network or violates the rules and protocols for communication -across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord -with this section must be in a format that is publicly documented (and with an -implementation available to the public in source code form), and must require no -special password or key for unpacking, reading or copying. - -7. Additional Terms. - -"Additional permissions" are terms that supplement the terms of this License by -making exceptions from one or more of its conditions. Additional permissions -that are applicable to the entire Program shall be treated as though they were -included in this License, to the extent that they are valid under applicable -law. If additional permissions apply only to part of the Program, that part may -be used separately under those permissions, but the entire Program remains -governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any -additional permissions from that copy, or from any part of it. (Additional -permissions may be written to require their own removal in certain cases when -you modify the work.) You may place additional permissions on material, added by -you to a covered work, for which you have or can give appropriate copyright -permission. - -Notwithstanding any other provision of this License, for material you add to a -covered work, you may (if authorized by the copyright holders of that material) -supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - -All other non-permissive additional terms are considered "further restrictions" -within the meaning of section 10. If the Program as you received it, or any part -of it, contains a notice stating that it is governed by this License along with -a term that is a further restriction, you may remove that term. If a license -document contains a further restriction but permits relicensing or conveying -under this License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does not survive -such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, -in the relevant source files, a statement of the additional terms that apply to -those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a -separately written license, or stated as exceptions; the above requirements -apply either way. - -8. Termination. - -You may not propagate or modify a covered work except as expressly provided -under this License. Any attempt otherwise to propagate or modify it is void, and -will automatically terminate your rights under this License (including any -patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a -particular copyright holder is reinstated (a) provisionally, unless and until -the copyright holder explicitly and finally terminates your license, and (b) -permanently, if the copyright holder fails to notify you of the violation by -some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated -permanently if the copyright holder notifies you of the violation by some -reasonable means, this is the first time you have received notice of violation -of this License (for any work) from that copyright holder, and you cure the -violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of -parties who have received copies or rights from you under this License. If your -rights have been terminated and not permanently reinstated, you do not qualify -to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy of -the Program. Ancillary propagation of a covered work occurring solely as a -consequence of using peer-to-peer transmission to receive a copy likewise does -not require acceptance. However, nothing other than this License grants you -permission to propagate or modify any covered work. These actions infringe -copyright if you do not accept this License. Therefore, by modifying or -propagating a covered work, you indicate your acceptance of this License to do -so. - -10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives a -license from the original licensors, to run, modify and propagate that work, -subject to this License. You are not responsible for enforcing compliance by -third parties with this License. - -An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered work results -from an entity transaction, each party to that transaction who receives a copy -of the work also receives whatever licenses to the work the party's predecessor -in interest had or could give under the previous paragraph, plus a right to -possession of the Corresponding Source of the work from the predecessor in -interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights -granted or affirmed under this License. For example, you may not impose a -license fee, royalty, or other charge for exercise of rights granted under this -License, and you may not initiate litigation (including a cross-claim or -counterclaim in a lawsuit) alleging that any patent claim is infringed by -making, using, selling, offering for sale, or importing the Program or any -portion of it. - -11. Patents. - -A "contributor" is a copyright holder who authorizes use under this License of -the Program or a work on which the Program is based. The work thus licensed is -called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned or -controlled by the contributor, whether already acquired or hereafter acquired, -that would be infringed by some manner, permitted by this License, of making, -using, or selling its contributor version, but do not include claims that would -be infringed only as a consequence of further modification of the contributor -version. For purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent -license under the contributor's essential patent claims, to make, use, sell, -offer for sale, import and otherwise run, modify and propagate the contents of -its contributor version. - -In the following three paragraphs, a "patent license" is any express agreement -or commitment, however denominated, not to enforce a patent (such as an express -permission to practice a patent or covenant not to sue for patent infringement). -To "grant" such a patent license to a party means to make such an agreement or -commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the -Corresponding Source of the work is not available for anyone to copy, free of -charge and under the terms of this License, through a publicly available network -server or other readily accessible means, then you must either (1) cause the -Corresponding Source to be so available, or (2) arrange to deprive yourself of -the benefit of the patent license for this particular work, or (3) arrange, in a -manner consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have actual -knowledge that, but for the patent license, your conveying the covered work in a -country, or your recipient's use of the covered work in a country, would -infringe one or more identifiable patents in that country that you have reason -to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you -convey, or propagate by procuring conveyance of, a covered work, and grant a -patent license to some of the parties receiving the covered work authorizing -them to use, propagate, modify or convey a specific copy of the covered work, -then the patent license you grant is automatically extended to all recipients of -the covered work and works based on it. - -A patent license is "discriminatory" if it does not include within the scope of -its coverage, prohibits the exercise of, or is conditioned on the non-exercise -of one or more of the rights that are specifically granted under this License. -You may not convey a covered work if you are a party to an arrangement with a -third party that is in the business of distributing software, under which you -make payment to the third party based on the extent of your activity of -conveying the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory patent -license (a) in connection with copies of the covered work conveyed by you (or -copies made from those copies), or (b) primarily for and in connection with -specific products or compilations that contain the covered work, unless you -entered into that arrangement, or that patent license was granted, prior to 28 -March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied -license or other defenses to infringement that may otherwise be available to you -under applicable patent law. - -12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not excuse -you from the conditions of this License. If you cannot convey a covered work so -as to satisfy simultaneously your obligations under this License and any other -pertinent obligations, then as a consequence you may not convey it at all. For -example, if you agree to terms that obligate you to collect a royalty for -further conveying from those to whom you convey the Program, the only way you -could satisfy both those terms and this License would be to refrain entirely -from conveying the Program. - -13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have permission to link -or combine any covered work with a work licensed under version 3 of the GNU -Affero General Public License into a single combined work, and to convey the -resulting work. The terms of this License will continue to apply to the part -which is the covered work, but the special requirements of the GNU Affero -General Public License, section 13, concerning interaction through a network -will apply to the combination as such. - -14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the GNU -General Public License from time to time. Such new versions will be similar in -spirit to the present version, but may differ in detail to address new problems -or concerns. - -Each version is given a distinguishing version number. If the Program specifies -that a certain numbered version of the GNU General Public License "or any later -version" applies to it, you have the option of following the terms and -conditions either of that numbered version or of any later version published by -the Free Software Foundation. If the Program does not specify a version number -of the GNU General Public License, you may choose any version ever published by -the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the -GNU General Public License can be used, that proxy's public statement of -acceptance of a version permanently authorizes you to choose that version for -the Program. - -Later license versions may give you additional or different permissions. -However, no additional obligations are imposed on any author or copyright holder -as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER -PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE -QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE -DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY -COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS -PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, -INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE -THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED -INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE -PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY -HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot -be given local legal effect according to their terms, reviewing courts shall -apply local law that most closely approximates an absolute waiver of all civil -liability in connection with the Program, unless a warranty or assumption of -liability accompanies a copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use -to the public, the best way to achieve this is to make it free software which -everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach -them to the start of each source file to most effectively state the exclusion of -warranty; and each file should have at least the "copyright" line and a pointer -to where the full notice is found. - - Triplex — The React Three Fiber editor - Copyright (C) 2022-Present Michael Dougall - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like -this when it starts in an interactive mode: - - Triplex Copyright (C) 2022-Present Michael Dougall - This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate -parts of the General Public License. Of course, your program's commands might be -different; for a GUI interface, you would use an "about box". - -You should also get your employer (if you work as a programmer) or school, if -any, to sign a "copyright disclaimer" for the program, if necessary. For more -information on this, and how to apply and follow the GNU GPL, see -. - -The GNU General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may consider -it more useful to permit linking proprietary applications with the library. If -this is what you want to do, use the GNU Lesser General Public License instead -of this License. But first, please read -. diff --git a/packages/editor/README.md b/packages/editor/README.md deleted file mode 100644 index ae52548e..00000000 --- a/packages/editor/README.md +++ /dev/null @@ -1 +0,0 @@ -# @triplex/editor diff --git a/packages/editor/index.html b/packages/editor/index.html deleted file mode 100644 index 57b40f0b..00000000 --- a/packages/editor/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - Triplex - - -
- - - diff --git a/packages/editor/package.json b/packages/editor/package.json deleted file mode 100644 index de0677c8..00000000 --- a/packages/editor/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "@triplex/editor", - "version": "0.58.2", - "private": true, - "description": "The React Three Fiber editor.", - "license": "GPL-3.0", - "author": "Michael Dougall (https://twitter.com/itsdouges)", - "main": "./src/main-dev-only.ts", - "types": "./src/main-dev-only.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "vite build", - "typedef": "tsc" - }, - "dependencies": { - "@radix-ui/react-dialog": "^1.0.3", - "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/react-menubar": "^1.0.2", - "@radix-ui/react-scroll-area": "^1.0.3", - "@triplex/bridge": "0.58.2", - "@triplex/ws-client": "0.58.2", - "react-dom": "^18.2.0", - "react-error-boundary": "^3.1.4", - "react-router-dom": "^6.7.0", - "suspend-react": "^0.0.9", - "tinycolor2": "^1.6.0", - "zustand": "^4.3.2" - }, - "devDependencies": { - "@swc/cli": "^0.1.59", - "@swc/core": "^1.3.28", - "@testing-library/react": "^14.0.0", - "@triplex/server": "^0.58.2", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "@types/three": "^0.157.0", - "@types/tinycolor2": "^1.4.3", - "@vitejs/plugin-react": "^3.0.1", - "tailwindcss": "^3.3.2", - "three": "^0.157.0", - "typescript": "^4.9.4", - "vite": "^4.4.11" - }, - "peerDependencies": { - "@react-three/fiber": "^8.0.0", - "react": "^18.0.0", - "three": ">=0.153.0" - } -} diff --git a/packages/editor/postcss.config.js b/packages/editor/postcss.config.js deleted file mode 100644 index 4ea687d6..00000000 --- a/packages/editor/postcss.config.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -module.exports = { - plugins: { - autoprefixer: {}, - tailwindcss: {}, - }, -}; diff --git a/packages/editor/public/banner-r3f.jpg b/packages/editor/public/banner-r3f.jpg deleted file mode 100644 index f2543a563d7da636c7badd69192bd9bd9594ff17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68550 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 SOY5_KAGek=JR{B@ZU5PvzP3^T diff --git a/packages/editor/src/ds/README.md b/packages/editor/src/ds/README.md deleted file mode 100644 index b506641d..00000000 --- a/packages/editor/src/ds/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This is where any pieces of UI will go that can be considered an atom, such as a -button. For components that form an experience (such as a scene menu) put them -in the ui folder. diff --git a/packages/editor/src/ds/button.tsx b/packages/editor/src/ds/button.tsx deleted file mode 100644 index 6bafccfa..00000000 --- a/packages/editor/src/ds/button.tsx +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { IconProps } from "@radix-ui/react-icons/dist/types"; -import { ComponentType, forwardRef } from "react"; -import { cn } from "./cn"; - -export const IconButton = forwardRef< - HTMLButtonElement, - { - className?: string; - icon: ComponentType; - isDisabled?: boolean; - isSelected?: boolean | "partial"; - onClick?: () => void; - size?: "default" | "tight"; - testId?: string; - title: string; - variant?: "default" | "inverse"; - } ->( - ( - { - className, - icon: Icon, - isDisabled, - isSelected, - onClick, - size = "default", - testId, - title, - variant = "default", - }, - ref - ) => ( - - ) -); - -IconButton.displayName = "IconButton"; - -export const Button = forwardRef< - HTMLButtonElement, - { - children: string; - className?: string; - disabled?: boolean; - icon?: ComponentType; - isSelected?: boolean; - onClick?: () => void; - size?: "default" | "tight"; - testId?: string; - variant?: "default" | "inverse"; - } ->( - ( - { - children, - className, - disabled, - icon: Icon, - isSelected, - onClick, - size = "default", - testId, - variant = "default", - }, - ref - ) => ( - - ) -); - -Button.displayName = "Button"; diff --git a/packages/editor/src/ds/cn.ts b/packages/editor/src/ds/cn.ts deleted file mode 100644 index c6822a40..00000000 --- a/packages/editor/src/ds/cn.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -type ClassNames = string | false | undefined | ClassNames[]; - -function collectDecls( - classNames: ClassNames[], - outDecls: Record -): void { - for (let i = 0; i < classNames.length; i++) { - const className = classNames[i]; - - if (Array.isArray(className)) { - collectDecls(className, outDecls); - } else if (className) { - const parts = className.split(" "); - - for (let x = 0; x < parts.length; x++) { - const part = parts[x]; - outDecls[part] = part; - } - } - } -} - -export function cn(classNames: ClassNames[]): string | undefined { - const decls: Record = {}; - - collectDecls(classNames, decls); - - const str = []; - - for (const key in decls) { - const value = decls[key]; - str.push(value); - } - - return str.join(" "); -} diff --git a/packages/editor/src/ds/drawer.tsx b/packages/editor/src/ds/drawer.tsx deleted file mode 100644 index db1f837d..00000000 --- a/packages/editor/src/ds/drawer.tsx +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -// eslint-disable-next-line import/no-namespace -import * as Dialog from "@radix-ui/react-dialog"; -import { cn } from "./cn"; - -export function Drawer({ - attach = "left", - children, - mode = "blocking", - onClose, - open, - title, -}: { - attach?: "left" | "bottom"; - children: React.ReactNode; - mode?: "blocking" | "transparent"; - onClose: () => void; - open: boolean; - title: string; -}) { - return ( - !isOpen && onClose()} open={open}> - - - - {title} - {children} - - - - ); -} diff --git a/packages/editor/src/ds/menubar.tsx b/packages/editor/src/ds/menubar.tsx deleted file mode 100644 index 90c8fec1..00000000 --- a/packages/editor/src/ds/menubar.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -// eslint-disable-next-line import/no-namespace -import * as RadixMenubar from "@radix-ui/react-menubar"; -import { ReactNode } from "react"; -import { cn } from "./cn"; - -export function Trigger({ - children, - ...props -}: RadixMenubar.MenubarTriggerProps) { - return ( - - {children} - - ); -} - -export function MenuContent({ - children, - ...props -}: RadixMenubar.MenuContentProps) { - return ( - - - {children} - - - ); -} - -export function MenuItem({ - children, - disabled, - onClick, - rslot, - ...props -}: RadixMenubar.MenuItemProps & { rslot?: ReactNode }) { - return ( - - {children} - {rslot &&
{rslot}
} -
- ); -} - -export function Menu({ children }: RadixMenubar.MenubarMenuProps) { - return {children}; -} - -export function Menubar({ children }: RadixMenubar.MenubarProps) { - return {children}; -} - -export function Separator() { - return ( - - ); -} diff --git a/packages/editor/src/ds/pressable.tsx b/packages/editor/src/ds/pressable.tsx deleted file mode 100644 index d8a24cab..00000000 --- a/packages/editor/src/ds/pressable.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { - forwardRef, - KeyboardEventHandler, - MouseEventHandler, - useCallback, -} from "react"; -import { cn } from "./cn"; - -export const Pressable = forwardRef< - HTMLDivElement, - { - children?: React.ReactNode; - className?: string; - onPress?: () => void; - style?: React.CSSProperties; - title?: string; - } ->(({ children, className, onPress, style, title }, ref) => { - const onKeyDownHandler: KeyboardEventHandler = useCallback( - (e) => { - if (e.key === "Enter") { - onPress?.(); - e.stopPropagation(); - } - }, - [onPress] - ); - - const onKeyUpHandler: KeyboardEventHandler = useCallback( - (e) => { - if (e.key === " ") { - onPress?.(); - e.stopPropagation(); - } - }, - [onPress] - ); - - const onClickHandler: MouseEventHandler = useCallback( - (e) => { - onPress?.(); - e.stopPropagation(); - }, - [onPress] - ); - - return ( -
- {children} -
- ); -}); - -Pressable.displayName = "Pressable"; diff --git a/packages/editor/src/ds/scroll-container.tsx b/packages/editor/src/ds/scroll-container.tsx deleted file mode 100644 index 1b98dd0e..00000000 --- a/packages/editor/src/ds/scroll-container.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { - Corner, - Root, - Scrollbar, - Thumb, - Viewport, -} from "@radix-ui/react-scroll-area"; -import { cn } from "./cn"; - -export function ScrollContainer({ - children, - className, -}: { - children: React.ReactNode; - className?: string; -}) { - return ( - - {children} - - - - - - ); -} diff --git a/packages/editor/src/editor.tsx b/packages/editor/src/editor.tsx deleted file mode 100644 index 10b4a489..00000000 --- a/packages/editor/src/editor.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { SceneFrame } from "./scence-bridge"; -import { useEditor } from "./stores/editor"; -import { AssetsDrawer } from "./ui/assets-drawer"; -import { ContextPanel } from "./ui/context-panel"; -import { ControlsMenu } from "./ui/controls-menu"; -import { ProviderConfig } from "./ui/provider-config"; -import { ScenePanel } from "./ui/scene-panel"; -import { ScenesDrawer } from "./ui/scenes-drawer"; - -export function EditorFrame() { - const { path } = useEditor(); - - return ( - <> - - -
- {path && } -
- -
- - -
- -
- -
- - - - - ); -} diff --git a/packages/editor/src/environment.tsx b/packages/editor/src/environment.tsx deleted file mode 100644 index 2b3fb0be..00000000 --- a/packages/editor/src/environment.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { createContext, ReactNode, useContext } from "react"; -import { suspend } from "suspend-react"; - -type Env = Awaited>; - -const Context = createContext(null); - -export function useEnvironment() { - const context = useContext(Context); - if (!context) { - throw new Error("invariant"); - } - - return context; -} - -export function Environment({ children }: { children: ReactNode }) { - const data: Env = suspend( - () => - __TRIPLEX_TARGET__ === "electron" - ? window.triplex.getEnv() - : Promise.resolve({ - config: { provider: "", sceneUrl: "", serverUrl: "", wsUrl: "" }, - }), - [] - ); - - return {children}; -} diff --git a/packages/editor/src/index.tsx b/packages/editor/src/index.tsx deleted file mode 100644 index f10659dd..00000000 --- a/packages/editor/src/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { createRoot } from "react-dom/client"; -import { BrowserRouter } from "react-router-dom"; -import { cn } from "./ds/cn"; -import { EditorFrame } from "./editor"; -import { ErrorOverlay } from "./ui/error-overlay"; -import { TitleBar } from "./ui/title-bar"; -import "./styles.css"; -import { Suspense } from "react"; -import { Environment } from "./environment"; - -createRoot(document.getElementById("root")!).render( - -
- - - - - - - -
-
-); diff --git a/packages/editor/src/main-dev-only.ts b/packages/editor/src/main-dev-only.ts deleted file mode 100644 index 1b1a8b08..00000000 --- a/packages/editor/src/main-dev-only.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { join } from "node:path"; - -export async function createDevServer(): Promise<{ - listen: (port: number) => Promise; -}> { - const { createServer: createViteServer } = await import("vite"); - - const vite = await createViteServer({ - clearScreen: false, - css: { - postcss: { - plugins: [ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ((await import("tailwindcss")).default as any)( - ( - await import( - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - "../tailwind.config.js" - ) - ).default - ), - ], - }, - }, - root: join(__dirname, "../"), - }); - - return { - listen: async (port) => { - const server = await vite.listen(port); - - const close = async () => { - try { - await server.close(); - await vite.close(); - } finally { - process.exit(0); - } - }; - - process.once("SIGINT", close); - process.once("SIGTERM", close); - }, - }; -} diff --git a/packages/editor/src/scence-bridge.tsx b/packages/editor/src/scence-bridge.tsx deleted file mode 100644 index 2f13ee53..00000000 --- a/packages/editor/src/scence-bridge.tsx +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) Michael Dougall. All rights reserved. - * - * This source code is licensed under the GPL-3.0 license found in the LICENSE - * file in the root directory of this source tree. - */ -import { compose, listen } from "@triplex/bridge/host"; -import { useEffect, useState } from "react"; -import { useEnvironment } from "./environment"; -import { useEditor } from "./stores/editor"; -import { useScene } from "./stores/scene"; -import { useUndoRedoState } from "./stores/undo-redo"; - -export interface FocusedObject { - column: number; - line: number; - path: string; -} - -export function SceneFrame() { - const editor = useEditor(); - const [initialPath] = useState(() => editor.path); - const [initialProps] = useState(() => editor.encodedProps); - const [initialExportName] = useState(() => editor.exportName); - const sceneReady = useScene((prev) => prev.sceneReady); - const env = useEnvironment(); - - useEffect(() => { - return listen("trplx:onConnected", sceneReady); - }, [sceneReady]); - - return ( - <> -