├── .appveyor.yml ├── .gitattributes ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.txt ├── README.md ├── img ├── fuse_sdk.png ├── fuselibs.png ├── fuseopen.png └── uno.png ├── package-lock.json ├── package.json ├── scripts ├── changelog.js └── check-dependencies.js ├── test ├── Main.ux └── app.unoproj └── uno.js /.appveyor.yml: -------------------------------------------------------------------------------- 1 | version: '{build}' 2 | image: Visual Studio 2022 3 | 4 | environment: 5 | nodejs_version: 16 6 | 7 | install: 8 | - ps: Install-Product node $env:nodejs_version 9 | 10 | build_script: 11 | - npm install 12 | - npm pack 13 | 14 | artifacts: 15 | - path: fuse-sdk-*.tgz 16 | 17 | test_script: 18 | - bash -c "npm install -g fuse-sdk-*.tgz" 19 | - uno build app 20 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .uno/ 2 | build/ 3 | node_modules/ 4 | *.tgz -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project 7 | and our community a harassment-free experience for everyone, regardless of 8 | age, body size, disability, ethnicity, gender identity and expression, level 9 | of experience, nationality, personal appearance, race, religion, or sexual 10 | identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention 26 | or advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of 37 | acceptable behavior and are expected to take appropriate and fair corrective 38 | action in response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem 44 | inappropriate, threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an 52 | appointed representative at an online or offline event. Representation of a 53 | project may be further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at fuse-open@googlegroups.com. 59 | The project team will review and investigate all complaints, and will 60 | respond in a way that it deems appropriate to the circumstances. The project 61 | team is obligated to maintain confidentiality with regard to the reporter 62 | of an incident. Further details of specific enforcement policies may be 63 | posted separately. 64 | 65 | Project maintainers who do not follow or enforce the Code of Conduct in good 66 | faith may face temporary or permanent repercussions as determined by other 67 | members of the project's leadership. 68 | 69 | ## Attribution 70 | 71 | This Code of Conduct is adapted from the 72 | [Contributor Covenant][homepage], version 1.4, 73 | available at [http://contributor-covenant.org/version/1/4][version] 74 | 75 | [homepage]: http://contributor-covenant.org 76 | [version]: http://contributor-covenant.org/version/1/4/ 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | If you want to contribute to this repository, please first discuss the 4 | changes you want to make with the repository's owners, for example via 5 | an issue or on [Slack](https://fusecommunity.slack.com). 6 | 7 | This project has a [code of conduct](#code-of-conduct). Please follow 8 | it in all your interactions related to the project. 9 | 10 | We also have a [contributor license agreement][1], that we require 11 | contributors to sign in order to have their changes considered for 12 | inclusion. 13 | 14 | ## Code of Conduct 15 | 16 | Please read and adhere to our [Code of Conduct](CODE_OF_CONDUCT.md) 17 | 18 | [1]: https://cla-assistant.io/fusetools/fuselibs-public 19 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (C) 2019-present Fuse Open 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 4 | associated documentation files (the "Software"), to deal in the Software without restriction, 5 | including without limitation the rights to use, copy, modify, merge, publish, distribute, 6 | sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 7 | furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies or 10 | substantial portions of the Software. 11 | 12 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 13 | NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 14 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 15 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 16 | OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Fuse Open

2 |

Build beautiful, high-performance iOS and Android apps with a single codebase.

3 | 4 |

5 | AppVeyor build status 6 | NPM package 7 | NPM beta 8 | Slack 9 | Financial Contributors on Open Collective 10 | License: MIT 11 |

12 | 13 |

14 | User experience 15 | Performance 16 | Supported platforms 17 |

18 | 19 | --- 20 | 21 |

22 | Fuse SDK 23 | Fuselibs 24 | Uno 25 |

26 | 27 | --- 28 | 29 | Fuse SDK is a set of open-source tools and libraries for cross-platform mobile app development. 30 | 31 | Build user interfaces using the easy to learn [UX markup language](https://fuseopen.com/docs/ux-markup/ux-markup.html), and add [JavaScript or TypeScript](https://fuseopen.com/docs/fusejs/fusejs.html) for business logic. UX markup is a declarative, XML based language for expressing user interfaces, layout, effects and motion, where animation is a first class citizen, and where you can easily produce advanced visuals and user interfaces. 32 | 33 | Access lower level features via the very powerful [Uno programming language](https://fuseopen.com/docs/uno/uno-lang). This is a modern, C#-like language where you can seamlessly access any native API in Java, Objective-C and C/C++, implement new Fuse components, or just write some superfast code. Uno is optimized for performance and portability, compiles down to native C++, and is one of the fastest and most versatile programming languages around. The UI-engine and most run-time features in Fuse are implemented in Uno. 34 | 35 | For rapid development, you can even build and test apps directly on your development machine. Fuse apps run on Linux, Mac and Windows, in addition to Android and iOS. 36 | 37 | There's also a visual tool suite called [fuse X](https://fuse-x.com), based on Fuse SDK, offering powerful app creation tools, realtime preview (hot reload) and more, available for macOS and Windows. 38 | 39 | ## Install 40 | 41 | ```shell 42 | npm install fuse-sdk 43 | ``` 44 | 45 | This will install Fuse SDK, including [`uno`](https://github.com/fuse-open/uno) and [a set of libraries](https://github.com/fuse-open/fuselibs) used to build [Fuse](https://fuseopen.com) apps. 46 | 47 | ### Beta releases 48 | 49 | We are currently working on [`beta-3.0`](https://github.com/fuse-open/fuse-sdk/tree/beta-3.0). Releases made from this branch are tagged `@beta` on NPM. 50 | 51 | ## Usage 52 | 53 | Please refer to the following links for information about using Fuse SDK. 54 | 55 | * A quick introduction to using Fuse SDK can be found in [this blog post](https://medium.com/@mortendanielfornes/introducing-fuse-sdk-890180044c13). 56 | 57 | * Check out the [official documentation](https://fuseopen.com/docs), [examples](https://fuseopen.com/examples/) and [source code](https://github.com/fuse-open). 58 | 59 | * Come chat with us on [Slack](https://fusecommunity.slack.com/) and join the [forums](https://forums.fusetools.com/). 60 | 61 | * The old, but still useful [YouTube playlist](https://www.youtube.com/playlist?list=PLdlqWm6b-XALJgM3fGa4q95Yipsgb8Q1o). 62 | 63 | ## Contributors 64 | 65 | ### Code Contributors 66 | 67 | This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)] 68 | 69 | 70 | ### Financial Contributors 71 | 72 | Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/fuse-open/contribute)] 73 | 74 | #### Individuals 75 | 76 | 77 | 78 | #### Organizations 79 | 80 | Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/fuse-open/contribute)] 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /img/fuse_sdk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuse-open/fuse-sdk/c7dd1b24b738563296c78610deecb5ba3c448fe8/img/fuse_sdk.png -------------------------------------------------------------------------------- /img/fuselibs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuse-open/fuse-sdk/c7dd1b24b738563296c78610deecb5ba3c448fe8/img/fuselibs.png -------------------------------------------------------------------------------- /img/fuseopen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuse-open/fuse-sdk/c7dd1b24b738563296c78610deecb5ba3c448fe8/img/fuseopen.png -------------------------------------------------------------------------------- /img/uno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fuse-open/fuse-sdk/c7dd1b24b738563296c78610deecb5ba3c448fe8/img/uno.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fuse-sdk", 3 | "version": "3.0.0-beta.4", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "fuse-sdk", 9 | "version": "3.0.0-beta.4", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@fuse-open/fuselibs": "~3.0.0-beta.9", 13 | "@fuse-open/tsconfig": "~2.7.0", 14 | "@fuse-open/types": "~2.7.1", 15 | "@fuse-open/uno": "~3.0.0-beta.10" 16 | }, 17 | "bin": { 18 | "uno": "uno.js" 19 | }, 20 | "devDependencies": { 21 | "axios": "^1.6.7" 22 | }, 23 | "funding": { 24 | "type": "opencollective", 25 | "url": "https://opencollective.com/fuse-open" 26 | } 27 | }, 28 | "node_modules/@fuse-open/fuselibs": { 29 | "version": "3.0.0-beta.9", 30 | "resolved": "https://registry.npmjs.org/@fuse-open/fuselibs/-/fuselibs-3.0.0-beta.9.tgz", 31 | "integrity": "sha512-H6ROayirOFHp9GlKVUpmA2OAtX7F+ew6EUQ/ad/arqsSs/XNirBEkFrCaclNFBLrU8jze9l9YXg4xs3GXH/5qQ==", 32 | "funding": { 33 | "type": "opencollective", 34 | "url": "https://opencollective.com/fuse-open" 35 | } 36 | }, 37 | "node_modules/@fuse-open/opentk": { 38 | "version": "3.2.0", 39 | "resolved": "https://registry.npmjs.org/@fuse-open/opentk/-/opentk-3.2.0.tgz", 40 | "integrity": "sha512-LFXms2H9+3k12Ijcaz4aQ+9PzHn6KiN1ee/0T7iwkraTGy9f8g/SUCmLa7Co/Bzrr0Ykj2u7eYoT7QXYtutOEA==" 41 | }, 42 | "node_modules/@fuse-open/transpiler": { 43 | "version": "1.18.0", 44 | "resolved": "https://registry.npmjs.org/@fuse-open/transpiler/-/transpiler-1.18.0.tgz", 45 | "integrity": "sha512-mqxz4Acz9EJ6yPFNJfnGA/4xY+ePWcsyn/eTh2NmvqREpbbtNB/08hTTaFBBjPnxqXqDONJ3N1JZdofgjyx6vQ==", 46 | "bin": { 47 | "fusejs-transpiler": "bin/cli.js" 48 | } 49 | }, 50 | "node_modules/@fuse-open/tsconfig": { 51 | "version": "2.7.0", 52 | "resolved": "https://registry.npmjs.org/@fuse-open/tsconfig/-/tsconfig-2.7.0.tgz", 53 | "integrity": "sha512-0vpHoIyu2FxvnKZ6GyJo78D2zBei39kd5mHqa/Bly5StjxBc4DHPhRiqIuwYRi5MliriA9biq4gmnhLOEdWM0Q==" 54 | }, 55 | "node_modules/@fuse-open/types": { 56 | "version": "2.7.1", 57 | "resolved": "https://registry.npmjs.org/@fuse-open/types/-/types-2.7.1.tgz", 58 | "integrity": "sha512-lnO0eeAUt+En3AAMmeenq2o3Q6izUreFEqVd9ePeccMz09XPyygnFx1BSAoy6UNEVcks1Ptuyy/Cy+8dZ/VrzQ==" 59 | }, 60 | "node_modules/@fuse-open/uno": { 61 | "version": "3.0.0-beta.10", 62 | "resolved": "https://registry.npmjs.org/@fuse-open/uno/-/uno-3.0.0-beta.10.tgz", 63 | "integrity": "sha512-44Cc6VVDHMnUzO7q5lqGG/bAjX0HSyMQ5K1XigJtxuDiNBnbxhEqeq738AY7kljHtgc21sEP0m6X1MKALYlI+g==", 64 | "hasInstallScript": true, 65 | "dependencies": { 66 | "@fuse-open/opentk": "^3.2.0", 67 | "@fuse-open/transpiler": "^1.18.0", 68 | "dotnet-run": "^2.0.0", 69 | "xcode-devteams": "^1.0.1" 70 | }, 71 | "bin": { 72 | "uno": "bin/uno.js" 73 | }, 74 | "funding": { 75 | "type": "opencollective", 76 | "url": "https://opencollective.com/fuse-open" 77 | } 78 | }, 79 | "node_modules/asynckit": { 80 | "version": "0.4.0", 81 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 82 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 83 | "dev": true 84 | }, 85 | "node_modules/axios": { 86 | "version": "1.8.2", 87 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", 88 | "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", 89 | "dev": true, 90 | "license": "MIT", 91 | "dependencies": { 92 | "follow-redirects": "^1.15.6", 93 | "form-data": "^4.0.0", 94 | "proxy-from-env": "^1.1.0" 95 | } 96 | }, 97 | "node_modules/combined-stream": { 98 | "version": "1.0.8", 99 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 100 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 101 | "dev": true, 102 | "dependencies": { 103 | "delayed-stream": "~1.0.0" 104 | }, 105 | "engines": { 106 | "node": ">= 0.8" 107 | } 108 | }, 109 | "node_modules/delayed-stream": { 110 | "version": "1.0.0", 111 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 112 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 113 | "dev": true, 114 | "engines": { 115 | "node": ">=0.4.0" 116 | } 117 | }, 118 | "node_modules/dotnet-run": { 119 | "version": "2.0.0", 120 | "resolved": "https://registry.npmjs.org/dotnet-run/-/dotnet-run-2.0.0.tgz", 121 | "integrity": "sha512-P2md5E7tHUlFW1jLSG1Lq4RY71lu1BytQSvjRAqIEv1ktNiO/SCPOH6Wirv2iGY5RvQ7+KAkHaTiyoJE+FufRg==", 122 | "hasInstallScript": true, 123 | "dependencies": { 124 | "readline-sync": "^1.4.10", 125 | "which": "^2.0.2" 126 | } 127 | }, 128 | "node_modules/follow-redirects": { 129 | "version": "1.15.6", 130 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 131 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 132 | "dev": true, 133 | "funding": [ 134 | { 135 | "type": "individual", 136 | "url": "https://github.com/sponsors/RubenVerborgh" 137 | } 138 | ], 139 | "engines": { 140 | "node": ">=4.0" 141 | }, 142 | "peerDependenciesMeta": { 143 | "debug": { 144 | "optional": true 145 | } 146 | } 147 | }, 148 | "node_modules/form-data": { 149 | "version": "4.0.0", 150 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 151 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 152 | "dev": true, 153 | "dependencies": { 154 | "asynckit": "^0.4.0", 155 | "combined-stream": "^1.0.8", 156 | "mime-types": "^2.1.12" 157 | }, 158 | "engines": { 159 | "node": ">= 6" 160 | } 161 | }, 162 | "node_modules/isexe": { 163 | "version": "2.0.0", 164 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 165 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 166 | }, 167 | "node_modules/mime-db": { 168 | "version": "1.52.0", 169 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 170 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 171 | "dev": true, 172 | "engines": { 173 | "node": ">= 0.6" 174 | } 175 | }, 176 | "node_modules/mime-types": { 177 | "version": "2.1.35", 178 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 179 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 180 | "dev": true, 181 | "dependencies": { 182 | "mime-db": "1.52.0" 183 | }, 184 | "engines": { 185 | "node": ">= 0.6" 186 | } 187 | }, 188 | "node_modules/proxy-from-env": { 189 | "version": "1.1.0", 190 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 191 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 192 | "dev": true 193 | }, 194 | "node_modules/readline-sync": { 195 | "version": "1.4.10", 196 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 197 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", 198 | "engines": { 199 | "node": ">= 0.8.0" 200 | } 201 | }, 202 | "node_modules/which": { 203 | "version": "2.0.2", 204 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 205 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 206 | "dependencies": { 207 | "isexe": "^2.0.0" 208 | }, 209 | "bin": { 210 | "node-which": "bin/node-which" 211 | }, 212 | "engines": { 213 | "node": ">= 8" 214 | } 215 | }, 216 | "node_modules/xcode-devteams": { 217 | "version": "1.0.1", 218 | "resolved": "https://registry.npmjs.org/xcode-devteams/-/xcode-devteams-1.0.1.tgz", 219 | "integrity": "sha512-7TbAgRpOqisPkQUwQzUKw5gJachoIu9PZGVswqxEbFLaT7l3fWTKGM+NgCIrZEG/gySWm3bILC3bHfwhqMGuuw==", 220 | "bin": { 221 | "xcode-devteams": "cli.js" 222 | } 223 | } 224 | } 225 | } 226 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fuse-sdk", 3 | "version": "3.0.0-beta.4", 4 | "description": "Build beautiful, high-performance iOS and Android apps with a single codebase.", 5 | "dependencies": { 6 | "@fuse-open/fuselibs": "~3.0.0-beta.9", 7 | "@fuse-open/tsconfig": "~2.7.0", 8 | "@fuse-open/types": "~2.7.1", 9 | "@fuse-open/uno": "~3.0.0-beta.10" 10 | }, 11 | "devDependencies": { 12 | "axios": "^1.6.7" 13 | }, 14 | "bin": { 15 | "uno": "uno.js" 16 | }, 17 | "files": [ 18 | "uno.js" 19 | ], 20 | "scripts": { 21 | "changelog": "node scripts/changelog.js", 22 | "prepack": "node scripts/check-dependencies.js", 23 | "test": "uno build test", 24 | "uno": "node uno.js" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "git+https://github.com/fuse-open/fuse-sdk.git" 29 | }, 30 | "keywords": [ 31 | "fuse", 32 | "cross-platform", 33 | "mobile", 34 | "app", 35 | "framework", 36 | "javascript", 37 | "typescript", 38 | "uno", 39 | "ux" 40 | ], 41 | "author": "Fuse Open", 42 | "license": "MIT", 43 | "bugs": { 44 | "url": "https://github.com/fuse-open/fuse-sdk/issues" 45 | }, 46 | "funding": { 47 | "type": "opencollective", 48 | "url": "https://opencollective.com/fuse-open" 49 | }, 50 | "homepage": "https://github.com/fuse-open/fuse-sdk#readme" 51 | } 52 | -------------------------------------------------------------------------------- /scripts/changelog.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios") 2 | 3 | const SDK_VERSION = require("../package.json").version 4 | const UNO_VERSION = "3.0.0-beta.10" 5 | const FUSELIBS_VERSION = "3.0.0-beta.9" 6 | const LAST_VERSION = "2.9.0" 7 | 8 | async function getChangelog(url) { 9 | const request = await axios.get(url) 10 | const data = request.data 11 | const start = data.indexOf("

", data.indexOf("

Changes since")) 12 | const end = data.indexOf("", start) 13 | return data.substring(start, end) 14 | } 15 | 16 | /** Returns a list of patch versions, e.g. 2.9.2 => [2.9.2, 2.9.1, 2.9.0] */ 17 | function getPatchVersions(version) { 18 | const versions = [version] 19 | const versionParts = version.split(".") 20 | const patchParts = versionParts[2].split("-") 21 | 22 | for (let patch = Number.parseInt(patchParts[0]); --patch >= 0;) { 23 | patchParts[0] = patch.toString() 24 | versionParts[2] = patchParts.join("-") 25 | versions.push(versionParts.join(".")) 26 | } 27 | 28 | return versions 29 | } 30 | 31 | async function main() { 32 | const uno = await Promise.all(getPatchVersions(UNO_VERSION).map(v => getChangelog(`https://github.com/fuse-open/uno/releases/tag/v${v}`))) 33 | const fuselibs = await Promise.all(getPatchVersions(FUSELIBS_VERSION).map(v => getChangelog(`https://github.com/fuse-open/fuselibs/releases/tag/v${v}`))) 34 | console.log(`### [Install](https://www.npmjs.com/package/fuse-sdk) 35 | 36 | \`\`\` 37 | npm install fuse-sdk@${SDK_VERSION} 38 | \`\`\` 39 | 40 | ### Changes since v${LAST_VERSION} 41 | 42 | ### Fuselibs ${FUSELIBS_VERSION} 43 | 44 |
45 | Click to see the full changelog 46 | ${fuselibs.join("\n\n")} 47 |
48 | 49 | ### Uno ${UNO_VERSION} 50 | 51 |
52 | Click to see the full changelog 53 | ${uno.join("\n\n")} 54 |
`) 55 | } 56 | 57 | main() 58 | .then(() => { 59 | process.exit(0) 60 | }) 61 | .catch(error => { 62 | console.error(error) 63 | process.exit(1) 64 | }) 65 | -------------------------------------------------------------------------------- /scripts/check-dependencies.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs") 2 | const path = require("path") 3 | 4 | const json = fs.readFileSync(path.join(__dirname, "..", "package.json")) 5 | const package = JSON.parse(json) 6 | 7 | // https://stackoverflow.com/questions/175739/built-in-way-in-javascript-to-check-if-a-string-is-a-valid-number 8 | function isAllowed(version) { 9 | return version.startsWith("~") || 10 | !isNaN(version[0]) || 11 | version.startsWith("https://") 12 | } 13 | 14 | let failed = 0 15 | 16 | for (let name in package.dependencies) { 17 | if (!isAllowed(package.dependencies[name])) { 18 | console.error(`package.json: The version number of ${name} must start with ~ or a number`) 19 | failed++ 20 | } 21 | } 22 | 23 | if (failed) { 24 | console.log("\nWe want to upgrade only patch versions of Uno, Fuselibs and other dependencies.") 25 | console.log("Minor version upgrades require a new Fuse SDK release to be made.") 26 | } 27 | 28 | process.exit(failed) 29 | -------------------------------------------------------------------------------- /test/Main.ux: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/app.unoproj: -------------------------------------------------------------------------------- 1 | { 2 | "Packages": [ 3 | "Fuse", 4 | "FuseJS" 5 | ], 6 | "Includes": [ 7 | "*" 8 | ] 9 | } -------------------------------------------------------------------------------- /uno.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const uno = require("@fuse-open/uno") 3 | 4 | uno(process.argv.slice(2)) 5 | .then(process.exit) 6 | --------------------------------------------------------------------------------