xs-dev 0.15.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +1 -1
  2. package/bin/xs-dev +3 -4
  3. package/build/commands/build.js +30 -0
  4. package/build/commands/run.js +15 -124
  5. package/build/commands/setup.js +3 -3
  6. package/build/commands/update.js +3 -3
  7. package/build/extensions/build-extension.js +7 -0
  8. package/build/toolbox/build/index.js +145 -0
  9. package/build/toolbox/setup/constants.js +10 -3
  10. package/build/toolbox/setup/esp32/windows.js +42 -0
  11. package/build/toolbox/setup/esp32.js +48 -19
  12. package/build/toolbox/setup/esp8266/windows.js +84 -0
  13. package/build/toolbox/setup/esp8266.js +44 -16
  14. package/build/toolbox/setup/linux.js +45 -7
  15. package/build/toolbox/setup/mac.js +51 -12
  16. package/build/toolbox/setup/moddable.js +35 -2
  17. package/build/toolbox/setup/types.js +3 -0
  18. package/build/toolbox/setup/windows.js +167 -3
  19. package/build/toolbox/update/linux.js +92 -31
  20. package/build/toolbox/update/mac.js +80 -26
  21. package/build/types/commands/build.d.ts +4 -0
  22. package/build/types/extensions/build-extension.d.ts +3 -0
  23. package/build/types/toolbox/build/index.d.ts +13 -0
  24. package/build/types/toolbox/setup/esp32/windows.d.ts +3 -0
  25. package/build/types/toolbox/setup/esp8266/windows.d.ts +3 -0
  26. package/build/types/toolbox/setup/linux.d.ts +2 -1
  27. package/build/types/toolbox/setup/mac.d.ts +2 -1
  28. package/build/types/toolbox/setup/moddable.d.ts +11 -0
  29. package/build/types/toolbox/setup/types.d.ts +3 -0
  30. package/build/types/toolbox/setup/windows.d.ts +7 -1
  31. package/build/types/toolbox/update/linux.d.ts +2 -1
  32. package/build/types/toolbox/update/mac.d.ts +2 -1
  33. package/build/types/types.d.ts +5 -2
  34. package/docs/public/run-hello-world.png +0 -0
  35. package/docs/src/components/HeadCommon.astro +4 -13
  36. package/docs/src/components/HeadSEO.astro +2 -8
  37. package/docs/src/components/Header/Header.astro +1 -1
  38. package/docs/src/components/LeftSidebar/LeftSidebar.astro +1 -1
  39. package/docs/src/components/RightSidebar/RightSidebar.astro +2 -3
  40. package/docs/src/components/RightSidebar/TableOfContents.tsx +50 -43
  41. package/docs/src/config.ts +3 -0
  42. package/docs/src/layouts/MainLayout.astro +3 -3
  43. package/docs/src/pages/en/features/run.md +29 -2
  44. package/docs/src/pages/en/features/setup.md +13 -1
  45. package/docs/src/pages/en/features/update.md +16 -0
  46. package/docs/src/pages/en/guide/00-prepare.md +54 -0
  47. package/docs/src/pages/en/guide/01-hello-console.md +62 -0
  48. package/docs/tsconfig.json +3 -1
  49. package/package.json +12 -9
@@ -1,8 +1,172 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureModdableCommandPrompt = exports.openModdableCommandPrompt = exports.addToPath = exports.setEnv = void 0;
3
7
  const gluegun_1 = require("gluegun");
4
- async function default_1() {
5
- gluegun_1.print.warning('Windows setup is not currently supported');
8
+ const constants_1 = require("./constants");
9
+ const upsert_1 = __importDefault(require("../patching/upsert"));
10
+ const windows_shortcuts_1 = __importDefault(require("windows-shortcuts"));
11
+ const util_1 = require("util");
12
+ const wsPromise = (0, util_1.promisify)(windows_shortcuts_1.default.create);
13
+ const SHORTCUT = gluegun_1.filesystem.resolve(constants_1.INSTALL_DIR, 'Moddable Command Prompt.lnk');
14
+ async function setEnv(name, permanentValue, envValue) {
15
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `set "${name}=${permanentValue}"`);
16
+ process.env[name] = envValue !== undefined ? envValue : permanentValue;
17
+ }
18
+ exports.setEnv = setEnv;
19
+ async function addToPath(path) {
20
+ var _a;
21
+ const newPath = `${path};${(_a = process.env.PATH) !== null && _a !== void 0 ? _a : ''}`;
22
+ await setEnv('PATH', `${path};%PATH%`, newPath);
23
+ }
24
+ exports.addToPath = addToPath;
25
+ async function openModdableCommandPrompt() {
26
+ gluegun_1.print.info('Opening the Moddable Command Prompt in a new Window');
27
+ await gluegun_1.system.run(`START "Moddable Command Prompt" "${SHORTCUT}"`);
28
+ }
29
+ exports.openModdableCommandPrompt = openModdableCommandPrompt;
30
+ async function ensureModdableCommandPrompt(spinner) {
31
+ if (process.env.ISMODDABLECOMMANDPROMPT === undefined ||
32
+ process.env.ISMODDABLECOMMANDPROMPT === '') {
33
+ if (gluegun_1.filesystem.exists(SHORTCUT) !== false) {
34
+ spinner.fail(`Moddable tooling required. Run xs-dev commands from the Moddable Command Prompt: ${SHORTCUT}`);
35
+ await openModdableCommandPrompt();
36
+ }
37
+ else {
38
+ spinner.fail('Moddable tooling required. Run `xs-dev setup` before trying again.');
39
+ }
40
+ process.exit(1);
41
+ }
42
+ }
43
+ exports.ensureModdableCommandPrompt = ensureModdableCommandPrompt;
44
+ async function default_1(_args) {
45
+ const BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'win', 'release');
46
+ const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'win');
47
+ gluegun_1.print.info(`Setting up Windows tools at ${constants_1.INSTALL_PATH}`);
48
+ // 0. Check for Visual Studio CMD tools & Git
49
+ if (gluegun_1.system.which('nmake') === null ||
50
+ process.env.VSINSTALLDIR === undefined) {
51
+ try {
52
+ await gluegun_1.system.exec('where winget');
53
+ }
54
+ catch (error) {
55
+ gluegun_1.print.error('Visual Studio 2022 Community is required to build the Moddable SDK');
56
+ gluegun_1.print.error('If you already have VS 2022 Community installed, please run "xs-dev setup" from the x86 Native Tools Command Prompt for VS 2022');
57
+ gluegun_1.print.error('You can download and install Visual Studio 2022 Community from https://www.visualstudio.com/downloads/');
58
+ gluegun_1.print.info('Or xs-dev can manage installing Visual Stuudio 2022 Community and other dependencies using the Windows Package Manager Client (winget).');
59
+ gluegun_1.print.info('You can install winget via the App Installer package in the Microsoft Store.');
60
+ gluegun_1.print.info('Please install either Visual Studio 2022 Community or winget, then launch a new xs86 Native Tools Command Prompt for VS 2022 and re-run this setup.');
61
+ process.exit(1);
62
+ }
63
+ gluegun_1.print.info('Installing Visual Studio 2022 Community from winget...');
64
+ try {
65
+ await gluegun_1.system.exec('winget install -e --id Microsoft.VisualStudio.2022.Community --silent', { stdio: 'inherit', shell: true });
66
+ }
67
+ catch (error) {
68
+ gluegun_1.print.error('Visual Studio 2022 Community install failed');
69
+ process.exit(1);
70
+ }
71
+ gluegun_1.print.info('Visual Studio 2022 Community successfully installed.');
72
+ gluegun_1.print.info('The "Desktop development for C++" workload must be manually installed.');
73
+ gluegun_1.print.info('From your Start Menu, select Visual Studio Installer. Then "Modify." Then select "Desktop development with C++" Then "Modify" again.');
74
+ gluegun_1.print.info('When complete, please close this window and launch the "x86 Native Tools Command Prompt for VS 2022" from the start menu.');
75
+ process.exit(1);
76
+ }
77
+ if (gluegun_1.system.which('git') === null) {
78
+ try {
79
+ await gluegun_1.system.exec('where winget');
80
+ }
81
+ catch (error) {
82
+ gluegun_1.print.error('git is required to clone the Moddable SDK');
83
+ gluegun_1.print.error('You can download and install git from https://git-scm.com/download/win');
84
+ gluegun_1.print.info('Or xs-dev can manage installing git and other dependencies using the Windows Package Manager Client (winget).');
85
+ gluegun_1.print.info('You can install winget via the App Installer package in the Microsoft Store.');
86
+ gluegun_1.print.info('Please install either git or winget, then launch a new xs86 Native Tools Command Prompt for VS 2022 and re-run this setup.');
87
+ process.exit(1);
88
+ }
89
+ gluegun_1.print.info('Installing git from winget...');
90
+ try {
91
+ await gluegun_1.system.exec('winget install -e --id Git.Git --silent', {
92
+ stdio: 'inherit',
93
+ shell: true,
94
+ });
95
+ }
96
+ catch (error) {
97
+ gluegun_1.print.error('git install failed');
98
+ process.exit(1);
99
+ }
100
+ gluegun_1.print.info('git successfully installed. Please close this window and re-launch the x86 Native Tools Command Prompt for VS 2022, then re-run this setup.');
101
+ process.exit(1);
102
+ }
103
+ const spinner = gluegun_1.print.spin();
104
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, '@echo off');
105
+ const vsBatPath = gluegun_1.filesystem.resolve(process.env.VSINSTALLDIR, 'VC', 'Auxiliary', 'Build', 'vcvars32.bat');
106
+ await (0, upsert_1.default)(constants_1.EXPORTS_FILE_PATH, `call "${vsBatPath}"`);
107
+ // 1. clone moddable repo into INSTALL_DIR directory if it does not exist yet
108
+ try {
109
+ gluegun_1.filesystem.dir(constants_1.INSTALL_DIR);
110
+ }
111
+ catch (error) {
112
+ spinner.fail(`Error setting up install directory: ${String(error)}`);
113
+ process.exit(1);
114
+ }
115
+ if (gluegun_1.filesystem.exists(constants_1.INSTALL_PATH) !== false) {
116
+ spinner.info('Moddable repo already installed');
117
+ }
118
+ else {
119
+ try {
120
+ spinner.start('Cloning Moddable-OpenSource/moddable repo');
121
+ await gluegun_1.system.spawn(`git clone ${constants_1.MODDABLE_REPO} ${constants_1.INSTALL_PATH}`);
122
+ spinner.succeed();
123
+ }
124
+ catch (error) {
125
+ spinner.fail(`Error cloning moddable repo: ${String(error)}`);
126
+ process.exit(1);
127
+ }
128
+ }
129
+ // 2. configure MODDABLE env variable, add release binaries dir to PATH
130
+ spinner.start(`Creating Moddable SDK Environment Batch File`);
131
+ try {
132
+ await setEnv('MODDABLE', constants_1.INSTALL_PATH);
133
+ await addToPath(BIN_PATH);
134
+ await setEnv('ISMODDABLECOMMANDPROMPT', '1');
135
+ spinner.succeed();
136
+ }
137
+ catch (error) {
138
+ spinner.fail(error.toString());
139
+ }
140
+ // 3. build tools
141
+ try {
142
+ spinner.start(`Building Moddable SDK tools`);
143
+ await gluegun_1.system.exec(`build.bat`, { cwd: BUILD_DIR, stdout: process.stdout });
144
+ spinner.succeed();
145
+ }
146
+ catch (error) {
147
+ spinner.fail(`Error building Moddable SDK tools: ${String(error)}`);
148
+ process.exit(1);
149
+ }
150
+ // 4. create Windows shortcut
151
+ try {
152
+ spinner.start(`Creating Moddable Command Prompt Shortcut`);
153
+ await wsPromise(SHORTCUT, {
154
+ target: '^%comspec^%',
155
+ args: `/k ${constants_1.EXPORTS_FILE_PATH}`,
156
+ workingDir: `${constants_1.INSTALL_PATH}`,
157
+ desc: 'Moddable Command Prompt',
158
+ });
159
+ spinner.succeed();
160
+ }
161
+ catch (error) {
162
+ spinner.fail('Error creating Moddable Command Prompt shortcut');
163
+ }
164
+ spinner.succeed('Moddable SDK successfully set up!');
165
+ gluegun_1.print.info(`A shortcut to the Moddable Command Prompt has been created at ${SHORTCUT}.`);
166
+ gluegun_1.print.info('You should always use the Moddable Command Prompt when working with the Moddable SDK.');
167
+ gluegun_1.print.info(`The Moddable Command Prompt will now open for you in a new Window. Please close this Command Prompt and use the Moddable Command Prompt instead.`);
168
+ gluegun_1.print.info(`As a next step, try running the "helloworld example" in the Moddable Command Prompt: xs-dev run --example helloworld'`);
169
+ await openModdableCommandPrompt();
6
170
  }
7
171
  exports.default = default_1;
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3dpbmRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBK0I7QUFFaEIsS0FBSztJQUNsQixlQUFLLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUZELDRCQUVDIn0=
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90b29sYm94L3NldHVwL3dpbmRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscUNBQWlFO0FBQ2pFLDJDQUtvQjtBQUNwQixnRUFBdUM7QUFDdkMsMEVBQWtDO0FBQ2xDLCtCQUFnQztBQUdoQyxNQUFNLFNBQVMsR0FBRyxJQUFBLGdCQUFTLEVBQUMsMkJBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUV0QyxNQUFNLFFBQVEsR0FBRyxvQkFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBVyxFQUFFLDZCQUE2QixDQUFDLENBQUE7QUFFeEUsS0FBSyxVQUFVLE1BQU0sQ0FDMUIsSUFBWSxFQUNaLGNBQXNCLEVBQ3RCLFFBQWlCO0lBRWpCLE1BQU0sSUFBQSxnQkFBTSxFQUFDLDZCQUFpQixFQUFFLFFBQVEsSUFBSSxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUE7SUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQTtBQUN4RSxDQUFDO0FBUEQsd0JBT0M7QUFFTSxLQUFLLFVBQVUsU0FBUyxDQUFDLElBQVk7O0lBQzFDLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxJQUFJLE1BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLG1DQUFJLEVBQUUsRUFBRSxDQUFBO0lBQ25ELE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFIRCw4QkFHQztBQUVNLEtBQUssVUFBVSx5QkFBeUI7SUFDN0MsZUFBSyxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFBO0lBQ2pFLE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLFFBQVEsR0FBRyxD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
@@ -1,39 +1,100 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const os_1 = __importDefault(require("os"));
7
+ const util_1 = require("util");
8
+ const fs_1 = require("fs");
3
9
  const gluegun_1 = require("gluegun");
4
10
  const constants_1 = require("../setup/constants");
5
- async function default_1() {
11
+ const moddable_1 = require("../setup/moddable");
12
+ const exec_1 = require("../system/exec");
13
+ const chmodPromise = (0, util_1.promisify)(fs_1.chmod);
14
+ async function default_1({ targetBranch }) {
15
+ var _a;
16
+ // 0. ensure Moddable exists
17
+ if (!(0, moddable_1.moddableExists)()) {
18
+ gluegun_1.print.error('Moddable tooling required. Run `xs-dev setup` before trying again.');
19
+ process.exit(1);
20
+ }
6
21
  gluegun_1.print.info('Checking for SDK changes');
7
- const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'mac');
8
- const currentRev = await gluegun_1.system.exec('git rev-parse public', {
9
- cwd: process.env.MODDABLE,
10
- });
11
- const remoteRev = await gluegun_1.system.exec('git ls-remote origin refs/heads/public', { cwd: process.env.MODDABLE });
12
- if (remoteRev.split('\t').shift() === currentRev.trim()) {
13
- gluegun_1.print.success('Moddable SDK already up to date!');
14
- process.exit(0);
22
+ const BUILD_DIR = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'makefiles', 'lin');
23
+ if (targetBranch === 'latest-release') {
24
+ // get tag for current repo
25
+ const currentTag = await gluegun_1.system.exec('git tag', {
26
+ cwd: process.env.MODDABLE,
27
+ });
28
+ // get latest release tag
29
+ const latestRelease = await (0, moddable_1.fetchLatestRelease)();
30
+ if (currentTag.trim() === latestRelease.tag_name) {
31
+ gluegun_1.print.success('Moddable SDK already up to date!');
32
+ process.exit(0);
33
+ }
34
+ const spinner = gluegun_1.print.spin();
35
+ spinner.start('Updating Moddable SDK!');
36
+ const BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'lin', 'release');
37
+ const DEBUG_BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'lin', 'debug');
38
+ gluegun_1.filesystem.remove(process.env.MODDABLE);
39
+ await gluegun_1.system.spawn(`git clone ${constants_1.MODDABLE_REPO} ${constants_1.INSTALL_PATH} --depth 1 --branch ${latestRelease.tag_name} --single-branch`);
40
+ gluegun_1.filesystem.dir(BIN_PATH);
41
+ gluegun_1.filesystem.dir(DEBUG_BIN_PATH);
42
+ const isArm = os_1.default.arch() === 'arm64';
43
+ const assetName = isArm
44
+ ? 'moddable-tools-lin64arm.zip'
45
+ : 'moddable-tools-lin64.zip';
46
+ spinner.info('Downloading release tools');
47
+ await (0, moddable_1.downloadReleaseTools)({
48
+ writePath: BIN_PATH,
49
+ assetName,
50
+ release: latestRelease,
51
+ });
52
+ spinner.info('Updating tool permissions');
53
+ const tools = (_a = gluegun_1.filesystem.list(BIN_PATH)) !== null && _a !== void 0 ? _a : [];
54
+ await Promise.all(tools.map(async (tool) => {
55
+ await chmodPromise(gluegun_1.filesystem.resolve(BIN_PATH, tool), 0o751);
56
+ await gluegun_1.filesystem.copyAsync(gluegun_1.filesystem.resolve(BIN_PATH, tool), gluegun_1.filesystem.resolve(DEBUG_BIN_PATH, tool));
57
+ }));
58
+ spinner.info('Reinstalling simulator');
59
+ gluegun_1.filesystem.dir(gluegun_1.filesystem.resolve(BUILD_DIR, '..', '..', 'tmp', 'lin', 'debug', 'simulator'));
60
+ await gluegun_1.system.exec(`mcconfig -m -p x-lin ${gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'tools', 'xsbug', 'manifest.json')}`, { process });
61
+ await gluegun_1.system.exec(`mcconfig -m -p x-lin ${gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'tools', 'mcsim', 'manifest.json')}`, { process });
62
+ await (0, exec_1.execWithSudo)('make install', {
63
+ cwd: BUILD_DIR,
64
+ stdout: process.stdout,
65
+ });
66
+ spinner.succeed('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
67
+ }
68
+ if (targetBranch === 'public') {
69
+ const currentRev = await gluegun_1.system.exec('git rev-parse public', {
70
+ cwd: process.env.MODDABLE,
71
+ });
72
+ const remoteRev = await gluegun_1.system.exec('git ls-remote origin refs/heads/public', { cwd: process.env.MODDABLE });
73
+ if (remoteRev.split('\t').shift() === currentRev.trim()) {
74
+ gluegun_1.print.success('Moddable SDK already up to date!');
75
+ process.exit(0);
76
+ }
77
+ const spinner = gluegun_1.print.spin();
78
+ spinner.start('Updating Moddable SDK!');
79
+ spinner.start('Stashing any unsaved changes before committing');
80
+ await gluegun_1.system.exec('git stash', { cwd: process.env.MODDABLE });
81
+ await gluegun_1.system.exec('git pull origin public', { cwd: process.env.MODDABLE });
82
+ await gluegun_1.system.exec('rm -rf build/{tmp,bin}', { cwd: process.env.MODDABLE });
83
+ spinner.succeed();
84
+ spinner.start('Rebuilding platform tools');
85
+ await gluegun_1.system.exec('make', {
86
+ cwd: BUILD_DIR,
87
+ stdout: process.stdout,
88
+ });
89
+ spinner.succeed();
90
+ spinner.start('Reinstalling simulator');
91
+ await (0, exec_1.execWithSudo)('make install', {
92
+ cwd: BUILD_DIR,
93
+ stdout: process.stdout,
94
+ });
95
+ spinner.succeed();
96
+ gluegun_1.print.success('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
15
97
  }
16
- const spinner = gluegun_1.print.spin();
17
- spinner.start('Updating Moddable SDK!');
18
- spinner.start('Stashing any unsaved changes before committing');
19
- await gluegun_1.system.exec('git stash', { cwd: process.env.MODDABLE });
20
- await gluegun_1.system.exec('git pull origin public', { cwd: process.env.MODDABLE });
21
- await gluegun_1.system.exec('rm -rf build/{tmp,bin}', { cwd: process.env.MODDABLE });
22
- spinner.succeed();
23
- spinner.start('Rebuilding platform tools');
24
- await gluegun_1.system.exec('make', {
25
- cwd: BUILD_DIR,
26
- stdout: process.stdout,
27
- });
28
- spinner.succeed();
29
- spinner.start('Reinstalling simulator');
30
- await gluegun_1.system.exec('make install', {
31
- cwd: BUILD_DIR,
32
- stdout: process.stdout,
33
- stdin: process.stdin,
34
- });
35
- spinner.succeed();
36
- gluegun_1.print.success('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
37
98
  }
38
99
  exports.default = default_1;
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC91cGRhdGUvbGludXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBbUQ7QUFDbkQsa0RBQWlEO0FBRWxDLEtBQUs7SUFDbEIsZUFBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUNsQyx3QkFBWSxFQUNaLE9BQU8sRUFDUCxXQUFXLEVBQ1gsS0FBSyxDQUNOLENBQUE7SUFFRCxNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQ25FLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxTQUFTLEdBQVcsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDekMsd0NBQXdDLEVBQ3hDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUE7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDL0QsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqQixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDMUMsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDeEIsR0FBRyxFQUFFLFNBQVM7UUFDZCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRWpCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUN2QyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtRQUNoQyxHQUFHLEVBQUUsU0FBUztRQUNkLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7S0FDckIsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRWpCLGVBQUssQ0FBQyxPQUFPLENBQ1gsMEhBQTBILENBQzNILENBQUE7QUFDSCxDQUFDO0FBbERELDRCQWtEQyJ9
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGludXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbGJveC91cGRhdGUvbGludXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0Q0FBbUI7QUFDbkIsK0JBQWdDO0FBQ2hDLDJCQUEwQjtBQUMxQixxQ0FBbUQ7QUFDbkQsa0RBQWdFO0FBRWhFLGdEQUkwQjtBQUMxQix5Q0FBNkM7QUFFN0MsTUFBTSxZQUFZLEdBQUcsSUFBQSxnQkFBUyxFQUFDLFVBQUssQ0FBQyxDQUFBO0FBRXRCLEtBQUssb0JBQVcsRUFBRSxZQUFZLEVBQWE7O0lBQ3hELDRCQUE0QjtJQUM1QixJQUFJLENBQUMsSUFBQSx5QkFBYyxHQUFFLEVBQUU7UUFDckIsZUFBSyxDQUFDLEtBQUssQ0FDVCxvRUFBb0UsQ0FDckUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCxlQUFLLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFFdEMsTUFBTSxTQUFTLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQ2xDLHdCQUFZLEVBQ1osT0FBTyxFQUNQLFdBQVcsRUFDWCxLQUFLLENBQ04sQ0FBQTtJQUVELElBQUksWUFBWSxLQUFLLGdCQUFnQixFQUFFO1FBQ3JDLDJCQUEyQjtRQUMzQixNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN0RCxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQTtRQUNGLHlCQUF5QjtRQUN6QixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUEsNkJBQWtCLEdBQUUsQ0FBQTtRQUVoRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQ2hELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtZQUNqRCxPQUFP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
@@ -1,39 +1,93 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const os_1 = __importDefault(require("os"));
7
+ const util_1 = require("util");
8
+ const fs_1 = require("fs");
3
9
  const gluegun_1 = require("gluegun");
10
+ const constants_1 = require("../setup/constants");
4
11
  const moddable_1 = require("../setup/moddable");
5
- async function default_1() {
6
- var _a, _b;
12
+ const chmodPromise = (0, util_1.promisify)(fs_1.chmod);
13
+ async function default_1({ targetBranch }) {
14
+ var _a, _b, _c;
7
15
  gluegun_1.print.info('Checking for SDK changes');
8
16
  // 0. ensure Moddable exists
9
17
  if (!(0, moddable_1.moddableExists)()) {
10
18
  gluegun_1.print.error('Moddable tooling required. Run `xs-dev setup` before trying again.');
11
19
  process.exit(1);
12
20
  }
13
- const currentRev = await gluegun_1.system.exec('git rev-parse public', {
14
- cwd: process.env.MODDABLE,
15
- });
16
- const remoteRev = await gluegun_1.system.exec('git ls-remote origin refs/heads/public', { cwd: process.env.MODDABLE });
17
- if (remoteRev.split('\t').shift() === currentRev.trim()) {
18
- gluegun_1.print.success('Moddable SDK already up to date!');
19
- process.exit(0);
21
+ if (targetBranch === 'latest-release') {
22
+ // get tag for current repo
23
+ const currentTag = await gluegun_1.system.exec('git tag', {
24
+ cwd: process.env.MODDABLE,
25
+ });
26
+ // get latest release tag
27
+ const latestRelease = await (0, moddable_1.fetchLatestRelease)();
28
+ if (currentTag.trim() === latestRelease.tag_name) {
29
+ gluegun_1.print.success('Moddable SDK already up to date!');
30
+ process.exit(0);
31
+ }
32
+ const spinner = gluegun_1.print.spin();
33
+ spinner.start('Updating Moddable SDK!');
34
+ const BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'mac', 'release');
35
+ const DEBUG_BIN_PATH = gluegun_1.filesystem.resolve(constants_1.INSTALL_PATH, 'build', 'bin', 'mac', 'debug');
36
+ gluegun_1.filesystem.remove(process.env.MODDABLE);
37
+ await gluegun_1.system.spawn(`git clone ${constants_1.MODDABLE_REPO} ${constants_1.INSTALL_PATH} --depth 1 --branch ${latestRelease.tag_name} --single-branch`);
38
+ gluegun_1.filesystem.dir(BIN_PATH);
39
+ gluegun_1.filesystem.dir(DEBUG_BIN_PATH);
40
+ const isArm = os_1.default.arch() === 'arm64';
41
+ const assetName = isArm
42
+ ? 'moddable-tools-mac64arm.zip'
43
+ : 'moddable-tools-mac64.zip';
44
+ spinner.info('Downloading release tools');
45
+ await (0, moddable_1.downloadReleaseTools)({
46
+ writePath: BIN_PATH,
47
+ assetName,
48
+ release: latestRelease,
49
+ });
50
+ spinner.info('Updating tool permissions');
51
+ const tools = (_a = gluegun_1.filesystem.list(BIN_PATH)) !== null && _a !== void 0 ? _a : [];
52
+ await Promise.all(tools.map(async (tool) => {
53
+ if (tool.endsWith('.app')) {
54
+ const mainPath = gluegun_1.filesystem.resolve(BIN_PATH, tool, 'Contents', 'MacOS', 'main');
55
+ await chmodPromise(mainPath, 0o751);
56
+ }
57
+ else {
58
+ await chmodPromise(gluegun_1.filesystem.resolve(BIN_PATH, tool), 0o751);
59
+ }
60
+ await gluegun_1.filesystem.copyAsync(gluegun_1.filesystem.resolve(BIN_PATH, tool), gluegun_1.filesystem.resolve(DEBUG_BIN_PATH, tool));
61
+ }));
62
+ spinner.succeed('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
63
+ }
64
+ if (targetBranch === 'public') {
65
+ const currentRev = await gluegun_1.system.exec('git rev-parse public', {
66
+ cwd: process.env.MODDABLE,
67
+ });
68
+ const remoteRev = await gluegun_1.system.exec('git ls-remote origin refs/heads/public', { cwd: process.env.MODDABLE });
69
+ if (remoteRev.split('\t').shift() === currentRev.trim()) {
70
+ gluegun_1.print.success('Moddable SDK already up to date!');
71
+ process.exit(0);
72
+ }
73
+ const spinner = gluegun_1.print.spin();
74
+ spinner.start('Updating Moddable SDK!');
75
+ spinner.start('Stashing any unsaved changes before committing');
76
+ await gluegun_1.system.exec('git stash', { cwd: process.env.MODDABLE });
77
+ await gluegun_1.system.exec('git pull origin public', { cwd: process.env.MODDABLE });
78
+ const BUILD_DIR = gluegun_1.filesystem.resolve((_b = process.env.MODDABLE) !== null && _b !== void 0 ? _b : '', 'build', 'bin');
79
+ const TMP_DIR = gluegun_1.filesystem.resolve((_c = process.env.MODDABLE) !== null && _c !== void 0 ? _c : '', 'build', 'tmp');
80
+ gluegun_1.filesystem.remove(BUILD_DIR);
81
+ gluegun_1.filesystem.remove(TMP_DIR);
82
+ spinner.succeed();
83
+ spinner.start('Rebuilding platform tools');
84
+ // install release assets or build
85
+ await gluegun_1.system.exec('make', {
86
+ cwd: gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'makefiles', 'mac'),
87
+ stdout: process.stdout,
88
+ });
89
+ spinner.succeed('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
20
90
  }
21
- const spinner = gluegun_1.print.spin();
22
- spinner.start('Updating Moddable SDK!');
23
- spinner.start('Stashing any unsaved changes before committing');
24
- await gluegun_1.system.exec('git stash', { cwd: process.env.MODDABLE });
25
- await gluegun_1.system.exec('git pull origin public', { cwd: process.env.MODDABLE });
26
- const BUILD_DIR = gluegun_1.filesystem.resolve((_a = process.env.MODDABLE) !== null && _a !== void 0 ? _a : '', 'build', 'bin');
27
- const TMP_DIR = gluegun_1.filesystem.resolve((_b = process.env.MODDABLE) !== null && _b !== void 0 ? _b : '', 'build', 'tmp');
28
- gluegun_1.filesystem.remove(BUILD_DIR);
29
- gluegun_1.filesystem.remove(TMP_DIR);
30
- spinner.succeed();
31
- spinner.start('Rebuilding platform tools');
32
- await gluegun_1.system.exec('make', {
33
- cwd: gluegun_1.filesystem.resolve(String(process.env.MODDABLE), 'build', 'makefiles', 'mac'),
34
- stdout: process.stdout,
35
- });
36
- spinner.succeed('Moddable SDK successfully updated! Start the xsbug.app and run the "helloworld example": xs-dev run --example helloworld');
37
91
  }
38
92
  exports.default = default_1;
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvdXBkYXRlL21hYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUFtRDtBQUNuRCxnREFBa0Q7QUFFbkMsS0FBSzs7SUFDbEIsZUFBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBRXRDLDRCQUE0QjtJQUM1QixJQUFJLENBQUMsSUFBQSx5QkFBYyxHQUFFLEVBQUU7UUFDckIsZUFBSyxDQUFDLEtBQUssQ0FDVCxvRUFBb0UsQ0FDckUsQ0FBQTtRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7SUFFRCxNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1FBQ25FLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxTQUFTLEdBQVcsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FDekMsd0NBQXdDLEVBQ3hDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQzlCLENBQUE7SUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtRQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0lBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUV2QyxPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDL0QsTUFBTSxnQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBRTFFLE1BQU0sU0FBUyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUNsQyxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxtQ0FBSSxFQUFFLEVBQzFCLE9BQU8sRUFDUCxLQUFLLENBQ04sQ0FBQTtJQUNELE1BQU0sT0FBTyxHQUFHLG9CQUFVLENBQUMsT0FBTyxDQUFDLE1BQUEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLG1DQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDOUUsb0JBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDNUIsb0JBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDMUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBRWpCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtJQUMxQyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUN4QixHQUFHLEVBQUUsb0JBQVUsQ0FBQyxPQUFPLENBQ3JCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUM1QixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssQ0FDTjtRQUNELE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUE7SUFFRixPQUFPLENBQUMsT0FBTyxDQUNiLDBIQUEwSCxDQUMzSCxDQUFBO0FBQ0gsQ0FBQztBQXZERCw0QkF1REMifQ==
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xib3gvdXBkYXRlL21hYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDRDQUFtQjtBQUNuQiwrQkFBZ0M7QUFDaEMsMkJBQTBCO0FBQzFCLHFDQUFtRDtBQUNuRCxrREFBZ0U7QUFDaEUsZ0RBSTBCO0FBRzFCLE1BQU0sWUFBWSxHQUFHLElBQUEsZ0JBQVMsRUFBQyxVQUFLLENBQUMsQ0FBQTtBQUV0QixLQUFLLG9CQUFXLEVBQUUsWUFBWSxFQUFhOztJQUN4RCxlQUFLLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFFdEMsNEJBQTRCO0lBQzVCLElBQUksQ0FBQyxJQUFBLHlCQUFjLEdBQUUsRUFBRTtRQUNyQixlQUFLLENBQUMsS0FBSyxDQUNULG9FQUFvRSxDQUNyRSxDQUFBO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtJQUVELElBQUksWUFBWSxLQUFLLGdCQUFnQixFQUFFO1FBQ3JDLDJCQUEyQjtRQUMzQixNQUFNLFVBQVUsR0FBVyxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN0RCxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO1NBQzFCLENBQUMsQ0FBQTtRQUNGLHlCQUF5QjtRQUN6QixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUEsNkJBQWtCLEdBQUUsQ0FBQTtRQUVoRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQ2hELGVBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtZQUNqRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ2hCO1FBRUQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzVCLE9BQU8sQ0FBQyxLQUFLLENB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
@@ -0,0 +1,4 @@
1
+ import type { GluegunCommand } from 'gluegun';
2
+ import type { XSDevToolbox } from '../types';
3
+ declare const command: GluegunCommand<XSDevToolbox>;
4
+ export default command;
@@ -0,0 +1,3 @@
1
+ import { XSDevToolbox } from '../types';
2
+ declare const _default: (toolbox: XSDevToolbox) => Promise<void>;
3
+ export default _default;
@@ -0,0 +1,13 @@
1
+ export declare type DeployStatus = 'none' | 'run' | 'push';
2
+ export interface BuildArgs {
3
+ port?: string;
4
+ example?: string;
5
+ listExamples: boolean;
6
+ listDevices: boolean;
7
+ projectPath: string;
8
+ targetPlatform: string;
9
+ mode: 'development' | 'production';
10
+ deployStatus: DeployStatus;
11
+ outputDir: string;
12
+ }
13
+ export declare function build({ listDevices, port, example, listExamples, projectPath, targetPlatform, mode, deployStatus, outputDir, }: BuildArgs): Promise<void>;
@@ -0,0 +1,3 @@
1
+ import type { GluegunPrint } from 'gluegun';
2
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>, ESP32_DIR: string, IDF_PATH: string): Promise<void>;
3
+ export declare function esp32Exists(): boolean;
@@ -0,0 +1,3 @@
1
+ import type { GluegunPrint } from 'gluegun';
2
+ export declare function installPython(spinner: ReturnType<GluegunPrint['spin']>): Promise<void>;
3
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>, ESP_DIR: string): Promise<void>;
@@ -1 +1,2 @@
1
- export default function (): Promise<void>;
1
+ import { SetupArgs } from './types';
2
+ export default function ({ targetBranch }: SetupArgs): Promise<void>;
@@ -1 +1,2 @@
1
- export default function (): Promise<void>;
1
+ import { SetupArgs } from './types';
2
+ export default function ({ targetBranch }: SetupArgs): Promise<void>;
@@ -1 +1,12 @@
1
+ import { RestEndpointMethodTypes } from '@octokit/rest';
1
2
  export declare function moddableExists(): boolean;
3
+ declare type ExtractFromArray<Item extends readonly unknown[]> = Item extends Readonly<Array<infer ItemType>> ? ItemType : never;
4
+ declare type GitHubRelease = ExtractFromArray<RestEndpointMethodTypes['repos']['listReleases']['response']['data']>;
5
+ export declare function fetchLatestRelease(): Promise<GitHubRelease>;
6
+ interface DownloadToolsArgs {
7
+ writePath: string;
8
+ assetName: string;
9
+ release: GitHubRelease;
10
+ }
11
+ export declare function downloadReleaseTools({ writePath, assetName, release, }: DownloadToolsArgs): Promise<void>;
12
+ export {};
@@ -0,0 +1,3 @@
1
+ export interface SetupArgs {
2
+ targetBranch: 'public' | 'latest-release';
3
+ }
@@ -1 +1,7 @@
1
- export default function (): Promise<void>;
1
+ import { GluegunPrint } from 'gluegun';
2
+ import { SetupArgs } from './types';
3
+ export declare function setEnv(name: string, permanentValue: string, envValue?: string): Promise<void>;
4
+ export declare function addToPath(path: string): Promise<void>;
5
+ export declare function openModdableCommandPrompt(): Promise<void>;
6
+ export declare function ensureModdableCommandPrompt(spinner: ReturnType<GluegunPrint['spin']>): Promise<void>;
7
+ export default function (_args: SetupArgs): Promise<void>;
@@ -1 +1,2 @@
1
- export default function (): Promise<void>;
1
+ import { SetupArgs } from '../setup/types';
2
+ export default function ({ targetBranch }: SetupArgs): Promise<void>;
@@ -1 +1,2 @@
1
- export default function (): Promise<void>;
1
+ import { SetupArgs } from '../setup/types';
2
+ export default function ({ targetBranch }: SetupArgs): Promise<void>;
@@ -1,6 +1,9 @@
1
1
  import type { GluegunToolbox } from 'gluegun';
2
+ import type { SetupArgs } from './toolbox/setup/types';
3
+ import type { BuildArgs } from './toolbox/build/index';
2
4
  export declare type Device = 'darwin' | 'linux' | 'windows_nt' | 'esp' | 'esp8266' | 'esp32' | 'wasm' | 'pico';
3
5
  export interface XSDevToolbox extends GluegunToolbox {
4
- setup: Record<Device, () => Promise<void>>;
5
- update: Record<Device, () => Promise<void>>;
6
+ setup: Record<Device, (() => Promise<void>) | ((args: SetupArgs) => Promise<void>)>;
7
+ update: Record<Device, (() => Promise<void>) | ((args: SetupArgs) => Promise<void>)>;
8
+ build: (args: BuildArgs) => Promise<void>;
6
9
  }
Binary file
@@ -7,10 +7,10 @@ import '../styles/index.css';
7
7
  <meta charset="utf-8" />
8
8
  <meta name="viewport" content="width=device-width" />
9
9
 
10
- <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
11
- <link rel="alternate icon" type="image/x-icon" href="/favicon.ico" />
10
+ <link rel="icon" type="image/svg+xml" href="/xs-dev/favicon.svg" />
11
+ <link rel="alternate icon" type="image/x-icon" href="/xs-dev/favicon.ico" />
12
12
 
13
- <link rel="sitemap" href="/sitemap.xml" />
13
+ <link rel="sitemap" href="/xs-dev/sitemap.xml" />
14
14
 
15
15
  <!-- Preload Fonts -->
16
16
  <link rel="preconnect" href="https://fonts.googleapis.com" />
@@ -18,7 +18,7 @@ import '../styles/index.css';
18
18
  <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital@0;1&display=swap" rel="stylesheet" />
19
19
 
20
20
  <!-- Scrollable a11y code helper -->
21
- <script src="/make-scrollable-code-focusable.js" is:inline></script>
21
+ <script src="/xs-dev/make-scrollable-code-focusable.js" is:inline></script>
22
22
 
23
23
  <!-- This is intentionally inlined to avoid FOUC -->
24
24
  <script is:inline>
@@ -30,12 +30,3 @@ import '../styles/index.css';
30
30
  root.classList.remove('theme-dark');
31
31
  }
32
32
  </script>
33
-
34
- <!-- Global site tag (gtag.js) - Google Analytics -->
35
- <!-- <script async src="https://www.googletagmanager.com/gtag/js?id=G-TEL60V1WM9" is:inline></script>
36
- <script>
37
- window.dataLayer = window.dataLayer || [];
38
- function gtag(){dataLayer.push(arguments);}
39
- gtag('js', new Date());
40
- gtag('config', 'G-TEL60V1WM9');
41
- </script> -->
@@ -5,7 +5,8 @@ export interface Props {
5
5
  site: any;
6
6
  canonicalURL: URL | string;
7
7
  }
8
- const { content = {}, canonicalURL } = Astro.props;
8
+ const canonicalURL = new URL(Astro.url.pathname, Astro.site);
9
+ const { content = {} } = Astro.props;
9
10
  const formattedContentTitle = content.title ? `${content.title} 🚀 ${SITE.title}` : SITE.title;
10
11
  ---
11
12
 
@@ -25,10 +26,3 @@ const formattedContentTitle = content.title ? `${content.title} 🚀 ${SITE.titl
25
26
  <meta name="twitter:site" content={OPEN_GRAPH.twitter} />
26
27
  <meta name="twitter:title" content={formattedContentTitle} />
27
28
  <meta name="twitter:description" content={content.description ? content.description : SITE.description} />
28
-
29
- <!--
30
- TODO: Add json+ld data, maybe https://schema.org/APIReference makes sense?
31
- Docs: https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data
32
- https://www.npmjs.com/package/schema-dts seems like a great resource for implementing this.
33
- Even better, there's a React component that integrates with `schema-dts`: https://github.com/google/react-schemaorg
34
- -->