xs-dev 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +213 -0
- package/bin/xs-dev +21 -0
- package/build/cli.js +22 -0
- package/build/commands/include.js +42 -0
- package/build/commands/init.js +41 -0
- package/build/commands/remove.js +26 -0
- package/build/commands/run.js +76 -0
- package/build/commands/setup.js +14 -0
- package/build/commands/update.js +14 -0
- package/build/commands/xs-dev.js +13 -0
- package/build/extensions/setup-extension.js +23 -0
- package/build/extensions/update-extension.js +23 -0
- package/build/templates/main.js.ejs +4 -0
- package/build/templates/manifest.json.ejs +8 -0
- package/build/toolbox/patching/upsert.js +13 -0
- package/build/toolbox/prompt/choices.js +17 -0
- package/build/toolbox/setup/constants.js +19 -0
- package/build/toolbox/setup/esp32.js +74 -0
- package/build/toolbox/setup/esp8266.js +86 -0
- package/build/toolbox/setup/linux.js +8 -0
- package/build/toolbox/setup/mac.js +77 -0
- package/build/toolbox/setup/wasm.js +65 -0
- package/build/toolbox/setup/windows.js +8 -0
- package/build/toolbox/update/esp32.js +8 -0
- package/build/toolbox/update/esp8266.js +8 -0
- package/build/toolbox/update/linux.js +8 -0
- package/build/toolbox/update/mac.js +27 -0
- package/build/toolbox/update/wasm.js +8 -0
- package/build/toolbox/update/windows.js +8 -0
- package/build/types/cli.d.ts +1 -0
- package/build/types/commands/include.d.ts +3 -0
- package/build/types/commands/init.d.ts +3 -0
- package/build/types/commands/remove.d.ts +3 -0
- package/build/types/commands/run.d.ts +4 -0
- package/build/types/commands/setup.d.ts +4 -0
- package/build/types/commands/update.d.ts +4 -0
- package/build/types/commands/xs-dev.d.ts +3 -0
- package/build/types/extensions/setup-extension.d.ts +3 -0
- package/build/types/extensions/update-extension.d.ts +3 -0
- package/build/types/toolbox/patching/upsert.d.ts +1 -0
- package/build/types/toolbox/prompt/choices.d.ts +7 -0
- package/build/types/toolbox/setup/constants.d.ts +5 -0
- package/build/types/toolbox/setup/esp32.d.ts +1 -0
- package/build/types/toolbox/setup/esp8266.d.ts +1 -0
- package/build/types/toolbox/setup/linux.d.ts +1 -0
- package/build/types/toolbox/setup/mac.d.ts +1 -0
- package/build/types/toolbox/setup/wasm.d.ts +1 -0
- package/build/types/toolbox/setup/windows.d.ts +1 -0
- package/build/types/toolbox/update/esp32.d.ts +1 -0
- package/build/types/toolbox/update/esp8266.d.ts +1 -0
- package/build/types/toolbox/update/linux.d.ts +1 -0
- package/build/types/toolbox/update/mac.d.ts +1 -0
- package/build/types/toolbox/update/wasm.d.ts +1 -0
- package/build/types/toolbox/update/windows.d.ts +1 -0
- package/build/types/types.d.ts +6 -0
- package/build/types.js +3 -0
- package/docs/commands.md +3 -0
- package/docs/plugins.md +47 -0
- package/package.json +69 -0
- package/tsconfig.json +24 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Nicholas Hehr
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# CLI for automating the setup and usage of [Moddable XS tools](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md)
|
|
2
|
+
|
|
3
|
+
The Moddable SDK and associated dev board tooling is incredibly empowering for embedded JS hardware development, however the set up process can be tedious to follow when getting started. This project aims to streamline the install and environment configuration requirements across platforms in just a few commands.
|
|
4
|
+
|
|
5
|
+
**This project is a work in progress and should be considered pre-1.0.**
|
|
6
|
+
|
|
7
|
+
**Feature support:**
|
|
8
|
+
|
|
9
|
+
- [X] [Moddable SDK install & setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/Moddable%20SDK%20-%20Getting%20Started.md)
|
|
10
|
+
- [X] [ESP32 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp32.md)
|
|
11
|
+
- [X] [ESP8266 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/esp8266.md)
|
|
12
|
+
- [ ] [Gecko SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/gecko/GeckoBuild.md)
|
|
13
|
+
- [ ] [QCA4020 SDK setup](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/qca4020/README.md)
|
|
14
|
+
- [X] Update Moddable SDK
|
|
15
|
+
- [X] Project management, including dependencies
|
|
16
|
+
- [X] WASM simulator
|
|
17
|
+
- [ ] Raspberry Pi Pico
|
|
18
|
+
|
|
19
|
+
**Platform support:**
|
|
20
|
+
|
|
21
|
+
- [X] Mac
|
|
22
|
+
- [ ] Windows
|
|
23
|
+
- [ ] Linux
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
[Node.js >= v12](https://nodejs.org/en/)
|
|
28
|
+
|
|
29
|
+
## Install
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
npm install -g xs-dev
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Features
|
|
36
|
+
|
|
37
|
+
### Moddable SDK install / setup / update
|
|
38
|
+
|
|
39
|
+
This process mostly automates the instructions provided by Moddable's "Getting Started" documentation with a few exceptions:
|
|
40
|
+
|
|
41
|
+
- it will not install XCode, just ensures the command line tools are available
|
|
42
|
+
- the `moddable` git repo is cloned into `~/.local/share` instead of a new/existing `~/Projects` directory
|
|
43
|
+
- a symlink for `xsbug.app` is created in `/Applications` for easy access through Launchpad (on Mac)
|
|
44
|
+
|
|
45
|
+
Run script for initial setup:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
xs-dev setup
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Run script for updating SDK:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
xs-dev update
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### ESP32 SDK install / setup
|
|
58
|
+
|
|
59
|
+
This process automates the instructions for downloading and building the esp-idf SDK tooling. This tooling will be placed in the `~/.local/share/esp32` directory, which will be created if it doesn't exist.
|
|
60
|
+
|
|
61
|
+
Run script for platform setup:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
xs-dev setup --device=esp32
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Run script to confirm the setup:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
xs-dev run --example helloworld --device=esp32
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Flags:
|
|
74
|
+
|
|
75
|
+
- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)
|
|
76
|
+
- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)
|
|
77
|
+
|
|
78
|
+
### ESP8266 SDK install / setup
|
|
79
|
+
|
|
80
|
+
This process automates the instructions for downloading all the dependencies for the ESP8266 RTOS SDK. These dependencies will be placed in the `~/.local/share/esp` directory, which will be created if it doesn't exist.
|
|
81
|
+
|
|
82
|
+
Run script for platform setup:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
xs-dev setup --device=esp8266
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Run script to confirm the setup:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
xs-dev run --example helloworld --device=esp8266
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Flags:
|
|
95
|
+
|
|
96
|
+
- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)
|
|
97
|
+
- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)
|
|
98
|
+
|
|
99
|
+
### Wasm Simulator install / setup
|
|
100
|
+
|
|
101
|
+
This process automates the instructions for downloading all the dependencies for the [wasm simulator](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/devices/wasm.md) and building the Moddable tooling. These dependencies will be placed in `~/.local/share/wasm`, which will be created if it doesn't exist.
|
|
102
|
+
|
|
103
|
+
Run script for platform setup:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
xs-dev setup --device=wasm
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
_If there are issues building the Moddable wasm tools, please try running `eval $SHELL` or starting a new shell insance before running the setup script again._
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
Run script to confirm the setup:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
xs-dev run --example helloworld --device=wasm
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Run Moddable examples
|
|
119
|
+
|
|
120
|
+
While it is still possible to run the Moddable example projects in the documented workflow:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
cd $MODDABLE/examples/<example directory>
|
|
124
|
+
mcconfig -d -m -p <platform here>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
This tool aims to simplify that process.
|
|
128
|
+
|
|
129
|
+
List available examples:
|
|
130
|
+
```
|
|
131
|
+
xs-dev run --list-examples
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Run an example (coming soon):
|
|
135
|
+
```
|
|
136
|
+
xs-dev run --example helloworld
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Flags:
|
|
140
|
+
|
|
141
|
+
- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)
|
|
142
|
+
- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)
|
|
143
|
+
|
|
144
|
+
## Project management
|
|
145
|
+
|
|
146
|
+
### Start a project
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
xs-dev init my-project
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Creates a `main.js` and base configured `manifest.json` for running in the simulator.
|
|
154
|
+
|
|
155
|
+
Flags:
|
|
156
|
+
|
|
157
|
+
- `typescript`: includes typings and creates `main.ts` (experimental)
|
|
158
|
+
- `io`: includes [TC53 IO manifest](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/io/io.md)
|
|
159
|
+
|
|
160
|
+
### Build and run a project
|
|
161
|
+
|
|
162
|
+
In the project directory:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
xs-dev run
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
When not in the project directory:
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
xs-dev run path/to/project
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Flags:
|
|
175
|
+
|
|
176
|
+
- `device`: `esp8266` | `esp32` | [any of the allowed platform identifiers](https://github.com/Moddable-OpenSource/moddable/blob/public/documentation/tools/tools.md#arguments) (defaults to current OS platform)
|
|
177
|
+
- `port`: path to port for connected device (defaults to: `UPLOAD_PORT` environment variable)
|
|
178
|
+
|
|
179
|
+
### Add a Moddable module
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
xs-dev include network/wifi
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Or select from available modules:
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
xs-dev include
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Updates the `manifest.json` with the path to the dependency.
|
|
192
|
+
|
|
193
|
+
### Add a remote dependency (Coming soon)
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
xs-dev get dtex/j5e
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Assumes the dependency is a GitHub repo, clones it to `~/.local/share`, creates an environment variable with the name of the repo, and updates the `manifest.json` with the path to that dependency.
|
|
200
|
+
|
|
201
|
+
To include a specific module for the installed dependency:
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
xs-dev include j5e/lib/led
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Remove a dependency
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
xs-dev remove network/wifi
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Updates the `manifest.json` to remove the dependency.
|
package/bin/xs-dev
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
/* tslint:disable */
|
|
5
|
+
// check if we're running in dev mode
|
|
6
|
+
var devMode = require('fs').existsSync(`${__dirname}/../src`)
|
|
7
|
+
// or want to "force" running the compiled version with --compiled-build
|
|
8
|
+
var wantsCompiled = process.argv.indexOf('--compiled-build') >= 0
|
|
9
|
+
|
|
10
|
+
if (wantsCompiled || !devMode) {
|
|
11
|
+
// this runs from the compiled javascript source
|
|
12
|
+
require(`${__dirname}/../build/cli`).run(process.argv)
|
|
13
|
+
} else {
|
|
14
|
+
// this runs from the typescript source (for dev only)
|
|
15
|
+
// hook into ts-node so we can run typescript on the fly
|
|
16
|
+
require('ts-node').register({ project: `${__dirname}/../tsconfig.json` })
|
|
17
|
+
// run the CLI with the current process arguments
|
|
18
|
+
require(`${__dirname}/../src/cli`).run(process.argv)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
package/build/cli.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const gluegun_1 = require("gluegun");
|
|
4
|
+
/**
|
|
5
|
+
* Create the cli and kick it off
|
|
6
|
+
*/
|
|
7
|
+
async function run(argv) {
|
|
8
|
+
// create a CLI runtime
|
|
9
|
+
const cli = (0, gluegun_1.build)()
|
|
10
|
+
.brand('xs-dev')
|
|
11
|
+
.src(__dirname)
|
|
12
|
+
.help() // provides default for help, h, --help, -h
|
|
13
|
+
.version() // provides default for version, v, --version, -v
|
|
14
|
+
.create();
|
|
15
|
+
// enable the following method if you'd like to skip loading one of these core extensions
|
|
16
|
+
// this can improve performance if they're not necessary for your project:
|
|
17
|
+
// .exclude(['meta', 'strings', 'print', 'filesystem', 'semver', 'system', 'prompt', 'http', 'template', 'patching', 'package-manager'])
|
|
18
|
+
// and run it
|
|
19
|
+
return await cli.run(argv);
|
|
20
|
+
}
|
|
21
|
+
module.exports = { run };
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHFDQUErQjtBQUUvQjs7R0FFRztBQUNILEtBQUssVUFBVSxHQUFHLENBQUMsSUFBYztJQUMvQix1QkFBdUI7SUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBQSxlQUFLLEdBQUU7U0FDaEIsS0FBSyxDQUFDLFFBQVEsQ0FBQztTQUNmLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDZCxJQUFJLEVBQUUsQ0FBQywyQ0FBMkM7U0FDbEQsT0FBTyxFQUFFLENBQUMsaURBQWlEO1NBQzNELE1BQU0sRUFBRSxDQUFBO0lBQ1gseUZBQXlGO0lBQ3pGLDBFQUEwRTtJQUMxRSx3SUFBd0k7SUFDeEksYUFBYTtJQUNiLE9BQU8sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUEifQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const choices_1 = require("../toolbox/prompt/choices");
|
|
4
|
+
const command = {
|
|
5
|
+
name: 'include',
|
|
6
|
+
description: 'Name or select Moddable module to add to project manifest',
|
|
7
|
+
run: async ({ prompt, filesystem, patching, print, parameters }) => {
|
|
8
|
+
var _a;
|
|
9
|
+
const manifestPath = filesystem.resolve(process.cwd(), 'manifest.json');
|
|
10
|
+
if (filesystem.exists(manifestPath) === false) {
|
|
11
|
+
print.error('Cannot find manifest.json. Must be in project directory to update manifest includes.');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const modulesPath = filesystem.resolve(String(process.env.MODDABLE), 'modules');
|
|
15
|
+
let moduleName = parameters.first;
|
|
16
|
+
if (moduleName === undefined ||
|
|
17
|
+
filesystem.exists(filesystem.resolve(modulesPath, moduleName, 'manifest.json')) === false) {
|
|
18
|
+
// prompt with choices from $MODDABLE/modules
|
|
19
|
+
const modules = (_a = filesystem.inspectTree(modulesPath)) === null || _a === void 0 ? void 0 : _a.children;
|
|
20
|
+
const choices = modules !== undefined
|
|
21
|
+
? modules.map((mod) => (0, choices_1.collectChoicesFromTree)(mod)).flat()
|
|
22
|
+
: [];
|
|
23
|
+
const { mod: selectedModule } = await prompt.ask([
|
|
24
|
+
{
|
|
25
|
+
type: 'autocomplete',
|
|
26
|
+
name: 'mod',
|
|
27
|
+
message: 'Here are the available modules:',
|
|
28
|
+
choices,
|
|
29
|
+
},
|
|
30
|
+
]);
|
|
31
|
+
moduleName = selectedModule;
|
|
32
|
+
}
|
|
33
|
+
print.info(`Adding "${String(moduleName)}" to manifest includes`);
|
|
34
|
+
await patching.update(manifestPath, (manifest) => {
|
|
35
|
+
manifest.include.push(`$(MODDABLE)/modules/${String(moduleName)}/manifest.json`);
|
|
36
|
+
return manifest;
|
|
37
|
+
});
|
|
38
|
+
print.success('Done!');
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
exports.default = command;
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbmNsdWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsdURBQWtFO0FBRWxFLE1BQU0sT0FBTyxHQUFtQjtJQUM5QixJQUFJLEVBQUUsU0FBUztJQUNmLFdBQVcsRUFBRSwyREFBMkQ7SUFDeEUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFOztRQUNqRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUN2RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQzdDLEtBQUssQ0FBQyxLQUFLLENBQ1Qsc0ZBQXNGLENBQ3ZGLENBQUE7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO1FBQ0QsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQzVCLFNBQVMsQ0FDVixDQUFBO1FBQ0QsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtRQUVqQyxJQUNFLFVBQVUsS0FBSyxTQUFTO1lBQ3hCLFVBQVUsQ0FBQyxNQUFNLENBQ2YsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUM3RCxLQUFLLEtBQUssRUFDWDtZQUNBLDZDQUE2QztZQUM3QyxNQUFNLE9BQU8sR0FBRyxNQUFBLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLDBDQUFFLFFBQVEsQ0FBQTtZQUM3RCxNQUFNLE9BQU8sR0FDWCxPQUFPLEtBQUssU0FBUztnQkFDbkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUEsZ0NBQXNCLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQzFELENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDUixNQUFNLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDL0M7b0JBQ0UsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLElBQUksRUFBRSxLQUFLO29CQUNYLE9BQU8sRUFBRSxpQ0FBaUM7b0JBQzFDLE9BQU87aUJBQ1I7YUFDRixDQUFDLENBQUE7WUFDRixVQUFVLEdBQUcsY0FBYyxDQUFBO1NBQzVCO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUNqRSxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDL0MsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ25CLHVCQUF1QixNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUMxRCxDQUFBO1lBQ0QsT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQyxDQUFDLENBQUE7UUFDRixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hCLENBQUM7Q0FDRixDQUFBO0FBRUQsa0JBQWUsT0FBTyxDQUFBIn0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const command = {
|
|
4
|
+
name: 'init',
|
|
5
|
+
alias: ['i'],
|
|
6
|
+
description: 'Scaffold a new Moddable XS project',
|
|
7
|
+
run: async (toolbox) => {
|
|
8
|
+
const { parameters, filesystem, template: { generate }, print: { warning, spin, info }, } = toolbox;
|
|
9
|
+
const name = parameters.first;
|
|
10
|
+
const { typescript = false, io = false } = parameters.options;
|
|
11
|
+
if (name !== undefined) {
|
|
12
|
+
const spinner = spin();
|
|
13
|
+
spinner.start(`Generating Moddable project: ${name}`);
|
|
14
|
+
filesystem.dir(name);
|
|
15
|
+
const includes = [
|
|
16
|
+
io
|
|
17
|
+
? '"$(MODDABLE)/modules/io/manifest.json"'
|
|
18
|
+
: '"$(MODDABLE)/examples/manifest_base.json"',
|
|
19
|
+
typescript && '"$(MODDABLE)/examples/manifest_typings.json"',
|
|
20
|
+
]
|
|
21
|
+
.filter(Boolean)
|
|
22
|
+
.join(',\n\t');
|
|
23
|
+
await generate({
|
|
24
|
+
template: 'manifest.json.ejs',
|
|
25
|
+
target: `${name}/manifest.json`,
|
|
26
|
+
props: { includes },
|
|
27
|
+
});
|
|
28
|
+
await generate({
|
|
29
|
+
template: 'main.js.ejs',
|
|
30
|
+
target: `${name}/main.${typescript ? 'ts' : 'js'}`,
|
|
31
|
+
});
|
|
32
|
+
spinner.succeed();
|
|
33
|
+
info('Run the project using: xs-dev run');
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
warning('Name is required to generate project: xs-dev init my-project-name');
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
exports.default = command;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0EsTUFBTSxPQUFPLEdBQW1CO0lBQzlCLElBQUksRUFBRSxNQUFNO0lBQ1osS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ1osV0FBVyxFQUFFLG9DQUFvQztJQUNqRCxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3JCLE1BQU0sRUFDSixVQUFVLEVBQ1YsVUFBVSxFQUNWLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUN0QixLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUMvQixHQUFHLE9BQU8sQ0FBQTtRQUVYLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUE7UUFDN0IsTUFBTSxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFnQixVQUFVLENBQUMsT0FBTyxDQUFBO1FBRTFFLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQTtZQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBRXJELFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFcEIsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsRUFBRTtvQkFDQSxDQUFDLENBQUMsd0NBQXdDO29CQUMxQyxDQUFDLENBQUMsMkNBQTJDO2dCQUMvQyxVQUFVLElBQUksOENBQThDO2FBQzdEO2lCQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRWhCLE1BQU0sUUFBUSxDQUFDO2dCQUNiLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLE1BQU0sRUFBRSxHQUFHLElBQUksZ0JBQWdCO2dCQUMvQixLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUU7YUFDcEIsQ0FBQyxDQUFBO1lBRUYsTUFBTSxRQUFRLENBQUM7Z0JBQ2IsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2FBQ25ELENBQUMsQ0FBQTtZQUVGLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNqQixJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtTQUMxQzthQUFNO1lBQ0wsT0FBTyxDQUNMLG1FQUFtRSxDQUNwRSxDQUFBO1NBQ0Y7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const command = {
|
|
4
|
+
name: 'remove',
|
|
5
|
+
description: 'Name or select Moddable module to remove from project manifest',
|
|
6
|
+
run: async ({ filesystem, patching, print, parameters }) => {
|
|
7
|
+
const manifestPath = filesystem.resolve(process.cwd(), 'manifest.json');
|
|
8
|
+
if (filesystem.exists(manifestPath) === false) {
|
|
9
|
+
print.error('Cannot find manifest.json. Must be in project directory to update manifest includes.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const moduleName = parameters.first;
|
|
13
|
+
if (moduleName === undefined) {
|
|
14
|
+
print.error('Module name is required');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
print.info(`Removing "${String(moduleName)}" to manifest includes`);
|
|
18
|
+
await patching.update(manifestPath, (manifest) => {
|
|
19
|
+
manifest.include = manifest.include.filter((mod) => !mod.includes(moduleName));
|
|
20
|
+
return manifest;
|
|
21
|
+
});
|
|
22
|
+
print.success('Done!');
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
exports.default = command;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3JlbW92ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sT0FBTyxHQUFtQjtJQUM5QixJQUFJLEVBQUUsUUFBUTtJQUNkLFdBQVcsRUFBRSxnRUFBZ0U7SUFDN0UsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7UUFDekQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDdkUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssRUFBRTtZQUM3QyxLQUFLLENBQUMsS0FBSyxDQUNULHNGQUFzRixDQUN2RixDQUFBO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUNoQjtRQUNELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUE7UUFFbkMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLE1BQU0sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUNuRSxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDL0MsUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDeEMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FDM0MsQ0FBQTtZQUNELE9BQU8sUUFBUSxDQUFBO1FBQ2pCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const serve_handler_1 = __importDefault(require("serve-handler"));
|
|
8
|
+
const http_1 = require("http");
|
|
9
|
+
const choices_1 = require("../toolbox/prompt/choices");
|
|
10
|
+
const DEVICE_ALIAS = Object.freeze({
|
|
11
|
+
esp8266: 'esp',
|
|
12
|
+
darwin: 'mac',
|
|
13
|
+
windows_nt: 'win',
|
|
14
|
+
linux: 'lin',
|
|
15
|
+
esp: 'esp',
|
|
16
|
+
esp32: 'esp32',
|
|
17
|
+
wasm: 'wasm',
|
|
18
|
+
});
|
|
19
|
+
const command = {
|
|
20
|
+
name: 'run',
|
|
21
|
+
description: 'Build and launch project on target device or simulator',
|
|
22
|
+
run: async ({ parameters, print, system, filesystem, prompt }) => {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
25
|
+
const { device = currentPlatform, port, example, listExamples = false, } = parameters.options;
|
|
26
|
+
const targetPlatform = (_a = DEVICE_ALIAS[device]) !== null && _a !== void 0 ? _a : device;
|
|
27
|
+
let projectPath = filesystem.resolve((_b = parameters.first) !== null && _b !== void 0 ? _b : '.');
|
|
28
|
+
if (listExamples) {
|
|
29
|
+
const exampleProjectPath = filesystem.resolve(String(process.env.MODDABLE), 'examples');
|
|
30
|
+
const examples = (_c = filesystem.inspectTree(exampleProjectPath)) === null || _c === void 0 ? void 0 : _c.children;
|
|
31
|
+
const choices = examples !== undefined
|
|
32
|
+
? examples.map((example) => (0, choices_1.collectChoicesFromTree)(example)).flat()
|
|
33
|
+
: [];
|
|
34
|
+
const { example: selectedExample } = await prompt.ask([
|
|
35
|
+
{
|
|
36
|
+
type: 'autocomplete',
|
|
37
|
+
name: 'example',
|
|
38
|
+
message: 'Here are the available examples:',
|
|
39
|
+
choices,
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
print.info(`Run the example: xs-dev run --example ${selectedExample}`);
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
if (example !== undefined) {
|
|
46
|
+
const exampleProjectPath = filesystem.resolve(String(process.env.MODDABLE), 'examples', example);
|
|
47
|
+
if (filesystem.exists(filesystem.resolve(exampleProjectPath, 'manifest.json')) === false) {
|
|
48
|
+
print.error('Example project must contain a manifest.json.');
|
|
49
|
+
print.info(`Lookup the available examples: xs-dev run --list-examples`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
projectPath = exampleProjectPath;
|
|
53
|
+
}
|
|
54
|
+
if (port !== undefined) {
|
|
55
|
+
process.env.UPLOAD_PORT = port;
|
|
56
|
+
}
|
|
57
|
+
const spinner = print.spin();
|
|
58
|
+
spinner.start(`Building and running project ${projectPath} on ${targetPlatform}`);
|
|
59
|
+
await system.exec(`mcconfig -d -m -p ${targetPlatform}`, {
|
|
60
|
+
cwd: projectPath,
|
|
61
|
+
stdout: process.stdout,
|
|
62
|
+
});
|
|
63
|
+
spinner.stop();
|
|
64
|
+
if (targetPlatform === 'wasm') {
|
|
65
|
+
const buildName = String(projectPath.split('/').pop());
|
|
66
|
+
const debugPath = filesystem.resolve(String(process.env.MODDABLE), 'build', 'bin', 'wasm', 'debug', buildName);
|
|
67
|
+
(0, http_1.createServer)((req, res) => {
|
|
68
|
+
void (0, serve_handler_1.default)(req, res, { public: debugPath });
|
|
69
|
+
}).listen(8080, () => {
|
|
70
|
+
print.info('Started server on port 8080, go to http://localhost:8080 in your browser to view the simulator');
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
exports.default = command;
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDJCQUF5QztBQUN6QyxrRUFBbUM7QUFDbkMsK0JBQW1DO0FBRW5DLHVEQUFrRTtBQVNsRSxNQUFNLFlBQVksR0FBdUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNyRSxPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxLQUFLO0lBQ2IsVUFBVSxFQUFFLEtBQUs7SUFDakIsS0FBSyxFQUFFLEtBQUs7SUFDWixHQUFHLEVBQUUsS0FBSztJQUNWLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07Q0FDYixDQUFDLENBQUE7QUFFRixNQUFNLE9BQU8sR0FBaUM7SUFDNUMsSUFBSSxFQUFFLEtBQUs7SUFDWCxXQUFXLEVBQUUsd0RBQXdEO0lBQ3JFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTs7UUFDL0QsTUFBTSxlQUFlLEdBQVcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQVksQ0FBQTtRQUN0RSxNQUFNLEVBQ0osTUFBTSxHQUFHLGVBQWUsRUFDeEIsSUFBSSxFQUNKLE9BQU8sRUFDUCxZQUFZLEdBQUcsS0FBSyxHQUNyQixHQUFlLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDbEMsTUFBTSxjQUFjLEdBQVcsTUFBQSxZQUFZLENBQUMsTUFBTSxDQUFDLG1DQUFJLE1BQU0sQ0FBQTtRQUM3RCxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQUEsVUFBVSxDQUFDLEtBQUssbUNBQUksR0FBRyxDQUFDLENBQUE7UUFFN0QsSUFBSSxZQUFZLEVBQUU7WUFDaEIsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUMzQyxNQUFNLENBQUMsT0FB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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const os_1 = require("os");
|
|
4
|
+
const command = {
|
|
5
|
+
name: 'setup',
|
|
6
|
+
description: 'Download and build Moddable tooling for various platform targets',
|
|
7
|
+
run: async ({ parameters, setup }) => {
|
|
8
|
+
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
9
|
+
const { device = currentPlatform } = parameters.options;
|
|
10
|
+
await setup[device]();
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
exports.default = command;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwyQkFBeUM7QUFPekMsTUFBTSxPQUFPLEdBQWlDO0lBQzVDLElBQUksRUFBRSxPQUFPO0lBQ2IsV0FBVyxFQUNULGtFQUFrRTtJQUNwRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDbkMsTUFBTSxlQUFlLEdBQVcsSUFBQSxTQUFZLEdBQUUsQ0FBQyxXQUFXLEVBQVksQ0FBQTtRQUN0RSxNQUFNLEVBQUUsTUFBTSxHQUFHLGVBQWUsRUFBRSxHQUFpQixVQUFVLENBQUMsT0FBTyxDQUFBO1FBQ3JFLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUE7SUFDdkIsQ0FBQztDQUNGLENBQUE7QUFFRCxrQkFBZSxPQUFPLENBQUEifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const os_1 = require("os");
|
|
4
|
+
const command = {
|
|
5
|
+
name: 'update',
|
|
6
|
+
description: 'Check and update Moddable tooling for various platform targets',
|
|
7
|
+
run: async ({ parameters, update }) => {
|
|
8
|
+
const currentPlatform = (0, os_1.type)().toLowerCase();
|
|
9
|
+
const { device = currentPlatform } = parameters.options;
|
|
10
|
+
await update[device]();
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
exports.default = command;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3VwZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLDJCQUF5QztBQU96QyxNQUFNLE9BQU8sR0FBaUM7SUFDNUMsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQUUsZ0VBQWdFO0lBQzdFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtRQUNwQyxNQUFNLGVBQWUsR0FBVyxJQUFBLFNBQVksR0FBRSxDQUFDLFdBQVcsRUFBWSxDQUFBO1FBQ3RFLE1BQU0sRUFBRSxNQUFNLEdBQUcsZUFBZSxFQUFFLEdBQWtCLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDdEUsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtJQUN4QixDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const command = {
|
|
4
|
+
name: 'xs-dev',
|
|
5
|
+
description: 'CLI for automating the setup and usage of Moddable XS tools',
|
|
6
|
+
run: async (toolbox) => {
|
|
7
|
+
const { print } = toolbox;
|
|
8
|
+
print.info('Welcome to XS Dev! Run xs-dev --help to learn more.');
|
|
9
|
+
print.printHelp(toolbox);
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
exports.default = command;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHMtZGV2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3hzLWRldi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sT0FBTyxHQUFtQjtJQUM5QixJQUFJLEVBQUUsUUFBUTtJQUNkLFdBQVcsRUFBRSw2REFBNkQ7SUFDMUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUNyQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBRXpCLEtBQUssQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQTtRQUNqRSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzFCLENBQUM7Q0FDRixDQUFBO0FBRUQsa0JBQWUsT0FBTyxDQUFBIn0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const mac_1 = __importDefault(require("../toolbox/setup/mac"));
|
|
7
|
+
const linux_1 = __importDefault(require("../toolbox/setup/linux"));
|
|
8
|
+
const windows_1 = __importDefault(require("../toolbox/setup/windows"));
|
|
9
|
+
const esp8266_1 = __importDefault(require("../toolbox/setup/esp8266"));
|
|
10
|
+
const esp32_1 = __importDefault(require("../toolbox/setup/esp32"));
|
|
11
|
+
const wasm_1 = __importDefault(require("../toolbox/setup/wasm"));
|
|
12
|
+
exports.default = async (toolbox) => {
|
|
13
|
+
toolbox.setup = {
|
|
14
|
+
darwin: mac_1.default,
|
|
15
|
+
linux: linux_1.default,
|
|
16
|
+
windows_nt: windows_1.default,
|
|
17
|
+
esp: esp8266_1.default,
|
|
18
|
+
esp8266: esp8266_1.default,
|
|
19
|
+
esp32: esp32_1.default,
|
|
20
|
+
wasm: wasm_1.default,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtZXh0ZW5zaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4dGVuc2lvbnMvc2V0dXAtZXh0ZW5zaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsK0RBQTJDO0FBQzNDLG1FQUErQztBQUMvQyx1RUFBbUQ7QUFDbkQsdUVBQW1EO0FBQ25ELG1FQUErQztBQUMvQyxpRUFBNkM7QUFFN0Msa0JBQWUsS0FBSyxFQUFFLE9BQXFCLEVBQWlCLEVBQUU7SUFDNUQsT0FBTyxDQUFDLEtBQUssR0FBRztRQUNkLE1BQU0sRUFBRSxhQUFRO1FBQ2hCLEtBQUssRUFBRSxlQUFVO1FBQ2pCLFVBQVUsRUFBRSxpQkFBWTtRQUN4QixHQUFHLEVBQUUsaUJBQVk7UUFDakIsT0FBTyxFQUFFLGlCQUFZO1FBQ3JCLEtBQUssRUFBRSxlQUFVO1FBQ2pCLElBQUksRUFBRSxjQUFTO0tBQ2hCLENBQUE7QUFDSCxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const mac_1 = __importDefault(require("../toolbox/update/mac"));
|
|
7
|
+
const linux_1 = __importDefault(require("../toolbox/update/linux"));
|
|
8
|
+
const windows_1 = __importDefault(require("../toolbox/update/windows"));
|
|
9
|
+
const esp8266_1 = __importDefault(require("../toolbox/update/esp8266"));
|
|
10
|
+
const esp32_1 = __importDefault(require("../toolbox/update/esp32"));
|
|
11
|
+
const wasm_1 = __importDefault(require("../toolbox/update/wasm"));
|
|
12
|
+
exports.default = async (toolbox) => {
|
|
13
|
+
toolbox.update = {
|
|
14
|
+
darwin: mac_1.default,
|
|
15
|
+
linux: linux_1.default,
|
|
16
|
+
windows_nt: windows_1.default,
|
|
17
|
+
esp: esp8266_1.default,
|
|
18
|
+
esp8266: esp8266_1.default,
|
|
19
|
+
esp32: esp32_1.default,
|
|
20
|
+
wasm: wasm_1.default,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWV4dGVuc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRlbnNpb25zL3VwZGF0ZS1leHRlbnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxnRUFBNkM7QUFDN0Msb0VBQWlEO0FBQ2pELHdFQUFxRDtBQUNyRCx3RUFBcUQ7QUFDckQsb0VBQWlEO0FBQ2pELGtFQUErQztBQUUvQyxrQkFBZSxLQUFLLEVBQUUsT0FBcUIsRUFBaUIsRUFBRTtJQUM1RCxPQUFPLENBQUMsTUFBTSxHQUFHO1FBQ2YsTUFBTSxFQUFFLGFBQVM7UUFDakIsS0FBSyxFQUFFLGVBQVc7UUFDbEIsVUFBVSxFQUFFLGlCQUFhO1FBQ3pCLEdBQUcsRUFBRSxpQkFBYTtRQUNsQixPQUFPLEVBQUUsaUJBQWE7UUFDdEIsS0FBSyxFQUFFLGVBQVc7UUFDbEIsSUFBSSxFQUFFLGNBQVU7S0FDakIsQ0FBQTtBQUNILENBQUMsQ0FBQSJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const gluegun_1 = require("gluegun");
|
|
4
|
+
async function default_1(filePath, newLine) {
|
|
5
|
+
await gluegun_1.patching.update(filePath, (contents) => {
|
|
6
|
+
if (!contents.includes(newLine)) {
|
|
7
|
+
return [contents, newLine].join('\n');
|
|
8
|
+
}
|
|
9
|
+
return contents;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
exports.default = default_1;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBzZXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvcGF0Y2hpbmcvdXBzZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscUNBQWtDO0FBRW5CLEtBQUssb0JBQ2xCLFFBQWdCLEVBQ2hCLE9BQWU7SUFFZixNQUFNLGtCQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQWdCLEVBQUUsRUFBRTtRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMvQixPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUN0QztRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQVZELDRCQVVDIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectChoicesFromTree = void 0;
|
|
4
|
+
function collectChoicesFromTree(fd, results = [], root = '') {
|
|
5
|
+
if (fd.type === 'dir' &&
|
|
6
|
+
fd.children.find((file) => file.name === 'manifest.json') !== undefined) {
|
|
7
|
+
results.push(root + fd.name);
|
|
8
|
+
}
|
|
9
|
+
else if (fd.type === 'dir') {
|
|
10
|
+
results.concat(fd.children
|
|
11
|
+
.map((child) => collectChoicesFromTree(child, results, `${root}${fd.name}/`))
|
|
12
|
+
.flat());
|
|
13
|
+
}
|
|
14
|
+
return results.flat();
|
|
15
|
+
}
|
|
16
|
+
exports.collectChoicesFromTree = collectChoicesFromTree;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hvaWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3Byb21wdC9jaG9pY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLFNBQWdCLHNCQUFzQixDQUNwQyxFQUFxQixFQUNyQixVQUFvQixFQUFFLEVBQ3RCLE9BQWUsRUFBRTtJQUVqQixJQUNFLEVBQUUsQ0FBQyxJQUFJLEtBQUssS0FBSztRQUNqQixFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsS0FBSyxTQUFTLEVBQ3ZFO1FBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQzdCO1NBQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtRQUM1QixPQUFPLENBQUMsTUFBTSxDQUNaLEVBQUUsQ0FBQyxRQUFRO2FBQ1IsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDYixzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUM3RDthQUNBLElBQUksRUFBRSxDQUNWLENBQUE7S0FDRjtJQUNELE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3ZCLENBQUM7QUFwQkQsd0RBb0JDIn0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PROFILE_PATH = exports.PROFILE = exports.INSTALL_PATH = exports.INSTALL_DIR = exports.HOME_DIR = void 0;
|
|
5
|
+
const gluegun_1 = require("gluegun");
|
|
6
|
+
exports.HOME_DIR = gluegun_1.filesystem.homedir();
|
|
7
|
+
exports.INSTALL_DIR = gluegun_1.filesystem.resolve(exports.HOME_DIR, '.local', 'share');
|
|
8
|
+
exports.INSTALL_PATH = (_a = process.env.MODDABLE) !== null && _a !== void 0 ? _a : gluegun_1.filesystem.resolve(exports.INSTALL_DIR, 'moddable');
|
|
9
|
+
exports.PROFILE = (function () {
|
|
10
|
+
var _a;
|
|
11
|
+
const shell = (_a = process.env.SHELL) !== null && _a !== void 0 ? _a : '';
|
|
12
|
+
if (shell.includes('zsh'))
|
|
13
|
+
return '.zshrc';
|
|
14
|
+
if (shell.includes('bash'))
|
|
15
|
+
return '.bashrc';
|
|
16
|
+
return '.profile';
|
|
17
|
+
})();
|
|
18
|
+
exports.PROFILE_PATH = gluegun_1.filesystem.resolve(exports.HOME_DIR, exports.PROFILE);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvc2V0dXAvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxxQ0FBb0M7QUFFdkIsUUFBQSxRQUFRLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUMvQixRQUFBLFdBQVcsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyxnQkFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUM3RCxRQUFBLFlBQVksR0FDdkIsTUFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsbUNBQUksb0JBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUN4RCxRQUFBLE9BQU8sR0FBRyxDQUFDOztJQUN0QixNQUFNLEtBQUssR0FBRyxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUE7SUFDckMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQzFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUM1QyxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDLENBQUMsRUFBRSxDQUFBO0FBQ1MsUUFBQSxZQUFZLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQVEsRUFBRSxlQUFPLENBQUMsQ0FBQSJ9
|