├── .env.example
├── .github
├── FUNDING.yml
└── workflows
│ ├── compile-linux.yml
│ ├── compile-macos.yml
│ └── compile-windows.yml
├── .gitignore
├── .npmrc
├── .tool-versions
├── README.md
├── app
├── .gitignore
├── app-path.js
├── browser
│ ├── index.css
│ ├── index.html
│ └── index.js
├── dev-app-update.yml
├── index.js
├── menu.js
├── package.json
├── pnpm-lock.yaml
└── yarn.lock
├── icon.icns
├── package.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── publish-linux.sh
├── publish-macos.sh
├── publish.sh
└── screenshot.png
/.env.example:
--------------------------------------------------------------------------------
1 | CSC_IDENTITY_AUTO_DISCOVERY=false
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: coldlogic
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/workflows/compile-linux.yml:
--------------------------------------------------------------------------------
1 | name: Build Linux App
2 |
3 | on:
4 | push:
5 | branches: [ compile-exe, main ]
6 | pull_request:
7 | branches: [ compile-exe, main ]
8 |
9 | jobs:
10 |
11 | build-linux:
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v4
16 |
17 | - name: Use Node.js
18 | uses: actions/setup-node@v4
19 | with:
20 | node-version: 20
21 |
22 | - name: Install pnpm
23 | uses: pnpm/action-setup@v3
24 | with:
25 | version: 8
26 | run_install: false
27 |
28 | - name: Get pnpm store directory
29 | shell: bash
30 | run: |
31 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
32 |
33 | - uses: actions/cache@v4
34 | name: Setup pnpm cache
35 | with:
36 | path: ${{ env.STORE_PATH }}
37 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
38 | restore-keys: |
39 | ${{ runner.os }}-pnpm-store-
40 |
41 | - name: Install dependencies
42 | run: pnpm install --frozen-lockfile
43 |
44 | - name: Create .env file
45 | run: |
46 | echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> .env
47 |
48 | - name: Build Electron App
49 | run: |
50 | # Build the Electron app
51 | npm run build
52 |
53 | # Package the app into a Linux app
54 | npm run package-linux
55 |
56 | - name: Upload Artifact
57 | uses: actions/upload-artifact@v4
58 | with:
59 | name: linux-app
60 | path: dist/*.AppImage
61 |
--------------------------------------------------------------------------------
/.github/workflows/compile-macos.yml:
--------------------------------------------------------------------------------
1 | name: Build macOS App
2 |
3 | on:
4 | push:
5 | branches: [ compile-exe, main ]
6 | pull_request:
7 | branches: [ compile-exe, main ]
8 |
9 | jobs:
10 |
11 | build-macos:
12 | runs-on: macos-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v4
16 |
17 | - name: Use Node.js
18 | uses: actions/setup-node@v4
19 | with:
20 | node-version: 20
21 |
22 | - name: Install pnpm
23 | uses: pnpm/action-setup@v3
24 | with:
25 | version: 8
26 | run_install: false
27 |
28 | - name: Get pnpm store directory
29 | shell: bash
30 | run: |
31 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
32 | echo "CSC_IDENTITY_AUTO_DISCOVERY=false" >> $GITHUB_ENV
33 |
34 | - uses: actions/cache@v4
35 | name: Setup pnpm cache
36 | with:
37 | path: ${{ env.STORE_PATH }}
38 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
39 | restore-keys: |
40 | ${{ runner.os }}-pnpm-store-
41 |
42 | - name: Install dependencies
43 | run: pnpm install --frozen-lockfile
44 |
45 | - name: Create .env file
46 | run: |
47 | echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> .env
48 |
49 | - name: Build Electron App
50 | run: |
51 | # Build the Electron app
52 | npm run build
53 |
54 | # Package the app into a macOS app
55 | npm run package-mac
56 |
57 | - name: Upload Artifact
58 | uses: actions/upload-artifact@v4
59 | with:
60 | name: macos-app
61 | path: dist/*.dmg
62 |
--------------------------------------------------------------------------------
/.github/workflows/compile-windows.yml:
--------------------------------------------------------------------------------
1 | name: Build Windows App
2 |
3 | on:
4 | push:
5 | branches: [ compile-exe, main ]
6 | pull_request:
7 | branches: [ compile-exe, main ]
8 |
9 | jobs:
10 |
11 | build-windows:
12 | runs-on: windows-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v4
16 |
17 | - name: Use Node.js
18 | uses: actions/setup-node@v4
19 | with:
20 | node-version: 20
21 |
22 | - name: Install pnpm
23 | uses: pnpm/action-setup@v3
24 | with:
25 | version: 8
26 | run_install: false
27 |
28 | - name: Get pnpm store directory
29 | shell: bash
30 | run: |
31 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
32 |
33 | - uses: actions/cache@v4
34 | name: Setup pnpm cache
35 | with:
36 | path: ${{ env.STORE_PATH }}
37 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
38 | restore-keys: |
39 | ${{ runner.os }}-pnpm-store-
40 |
41 | - name: Install dependencies
42 | run: pnpm install --frozen-lockfile
43 |
44 | - name: Setup MSBuild
45 | uses: microsoft/setup-msbuild@v2
46 |
47 | - name: Create .env file
48 | run: |
49 | echo "GH_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> .env
50 |
51 | - name: Build Electron App
52 | run: |
53 | # Build the Electron app
54 | npm run build
55 |
56 | # Package the app into a Windows executable
57 | npm run package-win
58 |
59 | - name: Upload Artifact
60 | uses: actions/upload-artifact@v4
61 | with:
62 | name: windows-executable
63 | path: dist/*.exe
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .pnpm-store/
2 | node_modules/
3 | dist/
4 |
5 | .env
6 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | auto-install-peers = true
2 | lockfile = true
3 | node-linker = hoisted
4 | provenance = true
5 | save-exact = true
6 | strict-peer-dependencies = false
7 | tag-version-prefix=""
8 |
--------------------------------------------------------------------------------
/.tool-versions:
--------------------------------------------------------------------------------
1 | nodejs 20.12.1
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Heos Controller
2 | Desktop controller for [Denon Heos](http://heosbydenon.denon.com) wifi speakers.
3 |
4 | ## Screenshot
5 |
6 | 
7 |
8 | ## Features
9 | * Automatic detection of speakers
10 | * User friendly volume dial
11 | * Playback controls (previous, play/pause, next)
12 |
13 | ## Usage
14 | 1. [Download a release](https://github.com/cold-logic/heos-controller/releases) and extract the app into your Applications directory
15 | 2. Run the app and wait for speaker detection
16 | 3. Select a speaker from the dropdown and use the controls
17 |
18 | ## Development
19 | 1. Clone this repo
20 | 2. Install all the dependencies using the `yarn install` command
21 | 3. Run the app using `yarn start`
22 | 4. To preview changes made in the *app* directory while the app is running, refresh with the (cmd-r) hot key
23 | 5. Dev tools are available using the (cmd-opt-i) hot key
24 |
25 | ## Generating the compiled app
26 | 1. Rename `.env.example` to `.env`. This will disable code signing.
27 | 2. To generate only the app bundle run: `yarn run pack`
28 | 3. To generate the app bundle, ZIP and DMG, run: `yarn build`
29 | 4. Look in the `dist` folder for the results
30 |
31 | ## ToDo
32 | * Detection and control of grouped speakers
33 | * Details about the currently playing stream
34 | * A slider to scrub and track playback position
35 | * A "sources" media stream picker
36 |
37 | ## Reference Materials
38 |
39 | - https://rn.dmglobal.com/usmodel/HEOS_CLI_ProtocolSpecification-Version-1.16.pdf
40 | - http://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf
41 | - https://support.denon.com/app/answers/detail/a_id/6953/~/heos-control-protocol-%28cli%29
42 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | .pnp.*
2 | .yarn/*
3 | !.yarn/patches
4 | !.yarn/plugins
5 | !.yarn/releases
6 | !.yarn/sdks
7 | !.yarn/versions
8 |
--------------------------------------------------------------------------------
/app/app-path.js:
--------------------------------------------------------------------------------
1 | module.exports = exports = function() {
2 | const path = require("path");
3 |
4 | let appPath;
5 |
6 | // Determine if this is a packaged app or a gulp run
7 | if (process.resourcesPath.indexOf("/Heos Controller.app/") > -1) {
8 | // Packaged app should use app.asar
9 | appPath = [process.resourcesPath, "app.asar","browser"].join(path.sep);
10 | } else {
11 | // Gulp runs should use the app directory
12 | appPath = [__dirname, "..","app","browser"].join(path.sep);
13 | }
14 |
15 | return appPath;
16 | };
--------------------------------------------------------------------------------
/app/browser/index.css:
--------------------------------------------------------------------------------
1 | @import url('../node_modules/bootstrap/dist/css/bootstrap.min.css');
2 | @import url('../node_modules/bootstrap/dist/css/bootstrap-theme.min.css');
3 |
4 | body {
5 | overflow: hidden;
6 | }
7 |
8 | #main-panel > .panel-body {
9 | height: 100%;
10 | }
11 |
12 | #main-panel > .panel-body > .container-fluid {
13 | display: flex;
14 | flex-direction: column;
15 | height: 100%;
16 | }
17 |
18 | #main-panel {
19 | display: flex;
20 | flex-direction: column;
21 | /* justify-content: space-between; */
22 | height: 100vh;
23 | margin: 0;
24 | }
25 |
26 | .volume-row {
27 | justify-content: center;
28 | display: flex;
29 | margin-top: 2rem;
30 | height: 100%;
31 | }
32 |
33 | .volume-dial {
34 | display: flex;
35 | height: 100%;
36 | justify-content: center;
37 | width: 100%;
38 | }
39 |
40 | .volume-dial > div {
41 | position: absolute;
42 | }
43 |
44 | .panel-footer {
45 | margin-top: auto;
46 | padding: 0px;
47 | }
48 |
49 | .control {
50 | display: flex;
51 | height: 41px;
52 | justify-content: center;
53 | align-items: center;
54 | }
55 |
56 | .control:hover {
57 | background-color: #DBDBDB;
58 | }
59 |
60 | .control>.glyphicon {
61 | top: 0px;
62 | }
63 |
--------------------------------------------------------------------------------
/app/browser/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
11 | Heos Controller
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
Heos Controller
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
34 |
35 |
38 |
39 |
40 |
41 |
42 |
47 |
48 |
49 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/app/browser/index.js:
--------------------------------------------------------------------------------
1 | /* global $ */
2 |
3 | window.$ = window.jQuery = require('jquery');
4 | require('jquery-knob/dist/jquery.knob.min.js');
5 |
6 | const dgram = require('node:dgram'); // dgram is UDP
7 | const net = require('node:net');
8 | const os = require('node:os');
9 |
10 | const HEOS_BROADCAST_ADDR = "239.255.255.250";
11 | let connection, ui, lastCommand, discovery_interval;
12 |
13 | // Before the window closes, de-register and disconnect
14 | window.onbeforeunload = function(e) {
15 | if (connection && connection.readyState == 'open') {
16 | sendCmd('system/register_for_change_events', {
17 | enable: 'off'
18 | });
19 | connection.end();
20 | }
21 | };
22 |
23 | // Setup UI event handlers
24 | $(function() {
25 | const jQ = (function() {
26 | function jQ(s) {
27 | this.sel = s;
28 | this.$ = $(s);
29 | }
30 | return jQ;
31 | })();
32 |
33 | ui = {
34 | dial: new jQ('.dial'),
35 | speaker: new jQ('#speaker'),
36 | speaker_count: new jQ('#speaker_count'),
37 | refresh: new jQ('#refresh'),
38 | prev: new jQ('#prev'),
39 | state: new jQ('#state'),
40 | next: new jQ('#next')
41 | };
42 |
43 | const knobConfig = {
44 | fgColor: '#66CC66',
45 | angleOffset: -125,
46 | angleArc: 250,
47 | width: '100%',
48 | release: function(v) {
49 | if (lastCommand != 'populateVolume') {
50 | const option = ui.speaker.$.children().filter(':selected');
51 | const pid = option.data('pid');
52 | setVolume(pid, v);
53 | }
54 | lastCommand = '';
55 | }
56 | }
57 |
58 | ui.dial.$.knob(knobConfig);
59 |
60 | ui.speaker.$.on('change', function(e){
61 | const pid = $(this).find(':selected').data('pid');
62 | getVolume(pid);
63 | getState(pid);
64 | });
65 |
66 | // Controller button click highlights
67 | $('.control').on('mousedown mouseup', function(e){
68 | $(this).css('background-color', (e.type == 'mousedown' ? '#C2C2C2' : ''));
69 | });
70 |
71 | // Click events
72 | const clickSelectors = [
73 | ui.refresh.sel,
74 | ui.prev.sel,
75 | ui.state.sel,
76 | ui.next.sel
77 | ].join(',');
78 | $(document).on('click', clickSelectors, function (e) {
79 | const $this = $(this);
80 | const pid = ui.speaker.$.find(':selected').data('pid');
81 | if ($this.is(ui.refresh.sel)) {
82 | sendCmd('player/get_players');
83 | }
84 | if ($this.is(ui.prev.sel)) {
85 | playPrev(pid);
86 | }
87 | if ($this.is(ui.state.sel)) {
88 | const state = ui.state.$.find('.glyphicon').attr('class').split('-')[1];
89 | setState(pid, state);
90 | }
91 | if ($this.is(ui.next.sel)) {
92 | playNext(pid);
93 | }
94 | });
95 | });
96 |
97 | // Start the SSDP discovery process
98 | discover();
99 |
100 | /******************************
101 | * Functions
102 | ******************************/
103 |
104 | function broadcast_address() {
105 | if (os.platform() == "win32") {
106 | let addresses = [];
107 | const ifaces = os.networkInterfaces();
108 | Object.values(ifaces).forEach((i) => {
109 | let iface_addresses = i.filter(iface => iface.family == "IPv4" && !iface.internal).map(iface => iface.address);
110 |
111 | // create broadcast address from interface adress
112 | iface_addresses = iface_addresses.map(addr => {
113 | let blocks = addr.split(".");
114 | blocks[3] = "255";
115 | return blocks.join(".");
116 | });
117 |
118 | addresses.push(...iface_addresses);
119 | });
120 | return addresses;
121 | } else {
122 | return [ HEOS_BROADCAST_ADDR ];
123 | }
124 | }
125 |
126 | function discover() {
127 | const client = dgram.createSocket('udp4');
128 | client.on('error', (err) => {
129 | console.error(`client error:\n${err.stack}`);
130 | client.close();
131 | });
132 | client.on('listening', () => {
133 | const address = client.address();
134 | console.log(`listening ${address.address}:${address.port}`);
135 | const BROADCAST_ADDR = broadcast_address()[0];
136 | const message = Buffer.from(
137 | 'M-SEARCH * HTTP/1.1\r\n' +
138 | `HOST: ${HEOS_BROADCAST_ADDR}:1900\r\n` +
139 | 'MAN: "ssdp:discover"\r\n' +
140 | 'ST: urn:schemas-denon-com:device:ACT-Denon:1\r\n' + // Essential, used by the client to specify what they want to discover, eg 'ST:ge:fridge'
141 | 'MX: 1\r\n' + // 1 second to respond (but they all respond immediately?)
142 | '\r\n'
143 | );
144 | client.send(message, 0, message.length, 1900, BROADCAST_ADDR);
145 | console.log('sent discovery request...');
146 | });
147 | client.on('message', function (msg, rinfo) {
148 | console.log(`client got: ${msg} from ${rinfo.address}:${rinfo.port}`);
149 | if ( msg.indexOf('ST: urn:schemas-denon-com:device:ACT-Denon:1') > -1) {
150 | client.close();
151 | connect(rinfo.address);
152 | clearInterval(discovery_interval);
153 | }
154 | });
155 | client.bind(null);
156 | if (!discovery_interval) // Setup an interval to keep trying to discover speakers
157 | discovery_interval = setInterval(discover, 10000)
158 | }
159 |
160 | // Connect to the speaker
161 | function connect(ip) {
162 | connection = net.createConnection({
163 | host: ip,
164 | port: 1255
165 | });
166 | connection.on('error', err => {
167 | console.error(new Date(), String(err))
168 | if (err && err.code && err.code === 'ECONNREFUSED') {
169 | setTimeout(function () {
170 | console.log('Retrying connect...');
171 | connection.connect(1255, ip, connectListener)
172 | }, 3e4); // retry every 30 seconds
173 | }
174 | })
175 | connection.on('connect', () => { // gets triggered on successful connection
176 | console.log('connected to server!');
177 | setTimeout(function () {
178 | sendCmd('system/register_for_change_events', {
179 | enable: 'off'
180 | });
181 | sendCmd('player/get_players');
182 | sendCmd('system/register_for_change_events', {
183 | enable: 'on'
184 | });
185 | }, 1000);
186 | });
187 | connection.on('data', function(data) {
188 | const events = data.toString().split('\r\n');
189 | for (const event of events) {
190 | if (event.length > 0) {
191 | const json = JSON.parse(event);
192 | console.log('%s: %o', json.heos.command, json);
193 | if (json.heos.command == 'player/get_players' && json.payload) {
194 | populatePlayers(json.payload);
195 | }
196 | if (json.heos.command == 'player/get_play_state') {
197 | parseMsg(json.heos.message, populateState);
198 | }
199 | if (json.heos.command == 'player/get_volume' || json.heos.command == 'event/player_volume_changed') {
200 | parseMsg(json.heos.message, populateVolume);
201 | }
202 | }
203 | }
204 | });
205 | connection.on('end', function() {
206 | console.log('disconnected from server');
207 | });
208 | }
209 |
210 | // Cleanup the msg and execute a callback
211 | function parseMsg (msg, cb) {
212 | const args = [], qs = msg.split('&');
213 | for (const param of qs) {
214 | args.push(param.split('=')[1]);
215 | }
216 | if (typeof cb == 'function') cb.apply(this, args);
217 | }
218 |
219 | // Send a command to the HEOS API
220 | function sendCmd (cmd, obj) {
221 | if (connection && connection.readyState == 'open') {
222 | const qs = [];
223 | let msg = 'heos://' + cmd;
224 | if (obj) {
225 | for (const k in obj) {
226 | if (obj.hasOwnProperty(k)) {
227 | const v = obj[k];
228 | qs.push([k,v].join('='));
229 | }
230 | }
231 | msg += '?' + qs.join('&');
232 | }
233 | connection.write(msg + '\r\n');
234 | }
235 | }
236 |
237 | // Toggle UI play/pause/stop button
238 | function toggleState (state) {
239 | const toggle = {
240 | 'play': 'pause',
241 | 'pause': 'play',
242 | 'stop': 'play'
243 | };
244 | return toggle[state];
245 | }
246 |
247 | // Fill the speaker dropdown with what we've discovered
248 | function populatePlayers(payload) {
249 | ui.speaker_count.$.text(`(${payload.length} detected)`);
250 | ui.speaker.$.children().remove();
251 | for (const i in payload) {
252 | const obj = payload[i];
253 | const option = document.createElement('option');
254 | option.textContent = obj.name;
255 | for (const k in obj) {
256 | option.dataset[k] = obj[k];
257 | }
258 | ui.speaker.$.append(option);
259 | }
260 | if (payload[0] && payload[0].pid) {
261 | getVolume(payload[0].pid);
262 | getState(payload[0].pid);
263 | }
264 | }
265 |
266 | // Set the UI volume dial level
267 | function populateVolume(pid, level) {
268 | lastCommand = 'populateVolume';
269 | if (ui.speaker.$.children().filter(':selected').data('pid') == pid) {
270 | ui.dial.$.val(level).trigger('change');
271 | }
272 | }
273 |
274 | // Set the UI play/pause/stop button's state
275 | function populateState (pid, state) {
276 | lastCommand = 'populateState';
277 | if (ui.speaker.$.children().filter(':selected').data('pid') == pid) {
278 | ui.state.$.find('.glyphicon')
279 | .removeClass('glyphicon-play glyphicon-pause glyphicon-stop')
280 | .addClass('glyphicon-' + toggleState(state));
281 | }
282 | }
283 |
284 | // Query HEOS API for volume
285 | function getVolume(pid) {
286 | sendCmd('player/get_volume', {
287 | pid: pid
288 | });
289 | }
290 |
291 | // Query HEOS API for state
292 | function getState (pid) {
293 | sendCmd('player/get_play_state', {
294 | pid: '-652946493'
295 | });
296 | }
297 |
298 | // Query HEOS API for play queue
299 | function getPlayQueue (pid, range) {
300 | sendCmd('player/get_queue', {
301 | pid: '-652946493'
302 | });
303 | }
304 |
305 | // Crank the volume to 11 ;)
306 | function setVolume(pid, level) {
307 | sendCmd('player/set_volume', {
308 | pid: pid,
309 | level: level
310 | });
311 | }
312 |
313 | // Play that funky music
314 | function setState(pid, state) {
315 | sendCmd('player/set_play_state', {
316 | pid: pid,
317 | state: state
318 | });
319 | populateState(pid, state);
320 | }
321 |
322 | // Play my jam again!
323 | function playPrev (pid) {
324 | sendCmd('player/play_previous', {
325 | pid: pid
326 | });
327 | }
328 |
329 | // NOPE! Next song plz...
330 | function playNext (pid) {
331 | sendCmd('player/play_next', {
332 | pid: pid
333 | });
334 | }
335 |
--------------------------------------------------------------------------------
/app/dev-app-update.yml:
--------------------------------------------------------------------------------
1 | owner: cold-logic
2 | repo: heos-controller
3 | provider: github
4 |
--------------------------------------------------------------------------------
/app/index.js:
--------------------------------------------------------------------------------
1 | // Vendor deps
2 | const {app, BrowserWindow, Menu} = require('electron');
3 | const log = require('electron-log')
4 | const {autoUpdater} = require('electron-updater')
5 |
6 | // Local deps
7 | const menu = require('./menu.js')
8 |
9 | autoUpdater.logger = log;
10 | autoUpdater.logger.transports.file.level = 'info';
11 | log.info('App starting...');
12 |
13 | // Keep a global reference of the window object, if you don't, the window will
14 | // be closed automatically when the JavaScript object is garbage collected.
15 | let mainWindow;
16 |
17 | // Quit when all windows are closed.
18 | app.on("window-all-closed", function() {
19 | // On OS X it is common for applications and their menu bar
20 | // to stay active until the user quits explicitly with Cmd + Q
21 | // if (process.platform != "darwin") {
22 | app.quit();
23 | // }
24 | });
25 |
26 | // Handle Updates
27 | autoUpdater.on('checking-for-update', () => {
28 | log.info('Checking for update...');
29 | })
30 | autoUpdater.on('update-available', (info) => {
31 | log.info('Update available.');
32 | })
33 | autoUpdater.on('update-not-available', (info) => {
34 | log.info('Update not available.');
35 | })
36 | autoUpdater.on('error', (err) => {
37 | log.info('Error in auto-updater.');
38 | })
39 | autoUpdater.on('download-progress', (progressObj) => {
40 | let log_message = "Download speed: " + progressObj.bytesPerSecond;
41 | log_message = log_message + ' - Downloaded ' + progressObj.percent + '%';
42 | log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')';
43 | log.info(log_message);
44 | })
45 | autoUpdater.on('update-downloaded', (info) => {
46 | log.info('Update downloaded; will install in 5 seconds');
47 | });
48 | autoUpdater.on('update-downloaded', (info) => {
49 | // Wait 5 seconds, then quit and install
50 | // In your application, you don't need to wait 5 seconds.
51 | // You could call autoUpdater.quitAndInstall(); immediately
52 | setTimeout(function() {
53 | autoUpdater.quitAndInstall();
54 | }, 5000)
55 | })
56 |
57 | // This method will be called when Electron has done everything
58 | // initialization and ready for creating browser windows.
59 | app.on("ready", function() {
60 | // Check for updates
61 | autoUpdater.checkForUpdates();
62 |
63 | // Create the browser window.
64 | mainWindow = new BrowserWindow({
65 | 'min-width': 350,
66 | 'min-height': 413,
67 | center: true,
68 | width: 350,
69 | height: 413,
70 | show: false,
71 | webPreferences: {
72 | contextIsolation: false,
73 | nodeIntegration: true
74 | }
75 | });
76 |
77 | // Setup the main menu
78 | Menu.setApplicationMenu(menu);
79 |
80 | // Load the homepage
81 | mainWindow.loadFile('browser/index.html');
82 | mainWindow.show();
83 |
84 | // Open the dev tools
85 | // mainWindow.webContents.openDevTools();
86 |
87 | // Emitted when the window is closed.
88 | mainWindow.on("closed", function() {
89 | // Dereference the window object, usually you would store windows
90 | // in an array if your app supports multi windows, this is the time
91 | // when you should delete the corresponding element.
92 | mainWindow = null;
93 | });
94 | });
--------------------------------------------------------------------------------
/app/menu.js:
--------------------------------------------------------------------------------
1 | const {app, Menu, BrowserWindow} = require("electron")
2 |
3 | const isMac = process.platform === 'darwin'
4 |
5 | module.exports = exports = Menu.buildFromTemplate([
6 | ...(isMac ? [{
7 | label: app.name,
8 | submenu: [
9 | { role: 'about' },
10 | { type: 'separator' },
11 | { role: 'services' },
12 | { type: 'separator' },
13 | { role: 'hide' },
14 | { role: 'hideOthers' },
15 | { role: 'unhide' },
16 | { type: 'separator' },
17 | { role: 'quit' }
18 | ]
19 | }] : []),
20 | {
21 | label: 'File',
22 | submenu: [
23 | isMac ? { role: 'close' } : { role: 'quit' }
24 | ]
25 | },
26 | {
27 | label: 'Edit',
28 | submenu: [
29 | { role: 'undo' },
30 | { role: 'redo' },
31 | { type: 'separator' },
32 | { role: 'cut' },
33 | { role: 'copy' },
34 | { role: 'paste' },
35 | ...(isMac ? [
36 | { role: 'pasteAndMatchStyle' },
37 | { role: 'delete' },
38 | { role: 'selectAll' },
39 | { type: 'separator' },
40 | {
41 | label: 'Speech',
42 | submenu: [
43 | { role: 'startSpeaking' },
44 | { role: 'stopSpeaking' }
45 | ]
46 | }
47 | ] : [
48 | { role: 'delete' },
49 | { type: 'separator' },
50 | { role: 'selectAll' }
51 | ])
52 | ]
53 | },
54 | {
55 | label: 'View',
56 | submenu: [
57 | { role: 'reload' },
58 | { role: 'forceReload' },
59 | { role: 'toggleDevTools' },
60 | { type: 'separator' },
61 | { role: 'resetZoom' },
62 | { role: 'zoomIn' },
63 | { role: 'zoomOut' },
64 | { type: 'separator' },
65 | { role: 'togglefullscreen' }
66 | ]
67 | },
68 | {
69 | label: 'Window',
70 | submenu: [
71 | { role: 'minimize' },
72 | { role: 'zoom' },
73 | ...(isMac ? [
74 | { type: 'separator' },
75 | { role: 'front' },
76 | { type: 'separator' },
77 | { role: 'window' }
78 | ] : [
79 | { role: 'close' }
80 | ])
81 | ]
82 | },
83 | {
84 | role: 'help',
85 | submenu: [{
86 | label: "Documentation",
87 | click: async () => {
88 | const { shell } = require('electron');
89 | await shell.openExternal("https://github.com/cold-logic/heos-controller/wiki");
90 | }
91 | }]
92 | }
93 | ]);
--------------------------------------------------------------------------------
/app/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "productName": "Heos Controller",
3 | "description": "Controller for Denon Heos speakers",
4 | "author": "Christopher Davison",
5 | "version": "1.0.10",
6 | "name": "heos-controller",
7 | "main": "index.js",
8 | "dependencies": {
9 | "bootstrap": "^3.4.1",
10 | "electron-log": "^5.1.2",
11 | "electron-updater": "^6.3.0",
12 | "jquery": "^3.7.1",
13 | "jquery-knob": "ssh://git@github.com:aterrien/jQuery-Knob.git"
14 | },
15 | "private": true,
16 | "license": "ISC"
17 | }
18 |
--------------------------------------------------------------------------------
/app/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | dependencies:
8 | bootstrap:
9 | specifier: ^3.4.1
10 | version: 3.4.1
11 | electron-log:
12 | specifier: ^4.4.8
13 | version: 4.4.8
14 | electron-updater:
15 | specifier: ^4.6.5
16 | version: 4.6.5
17 | jquery:
18 | specifier: ^3.6.3
19 | version: 3.6.3
20 | jquery-knob:
21 | specifier: ssh://git@github.com:aterrien/jQuery-Knob.git
22 | version: github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515
23 |
24 | packages:
25 |
26 | /@types/semver@7.5.1:
27 | resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==}
28 | dev: false
29 |
30 | /argparse@2.0.1:
31 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
32 | dev: false
33 |
34 | /bootstrap@3.4.1:
35 | resolution: {integrity: sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==}
36 | engines: {node: '>=6'}
37 | dev: false
38 |
39 | /builder-util-runtime@8.9.2:
40 | resolution: {integrity: sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==}
41 | engines: {node: '>=12.0.0'}
42 | dependencies:
43 | debug: 4.3.4
44 | sax: 1.2.4
45 | transitivePeerDependencies:
46 | - supports-color
47 | dev: false
48 |
49 | /debug@4.3.4:
50 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
51 | engines: {node: '>=6.0'}
52 | peerDependencies:
53 | supports-color: '*'
54 | peerDependenciesMeta:
55 | supports-color:
56 | optional: true
57 | dependencies:
58 | ms: 2.1.2
59 | dev: false
60 |
61 | /electron-log@4.4.8:
62 | resolution: {integrity: sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA==}
63 | dev: false
64 |
65 | /electron-updater@4.6.5:
66 | resolution: {integrity: sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==}
67 | dependencies:
68 | '@types/semver': 7.5.1
69 | builder-util-runtime: 8.9.2
70 | fs-extra: 10.1.0
71 | js-yaml: 4.1.0
72 | lazy-val: 1.0.5
73 | lodash.escaperegexp: 4.1.2
74 | lodash.isequal: 4.5.0
75 | semver: 7.5.4
76 | transitivePeerDependencies:
77 | - supports-color
78 | dev: false
79 |
80 | /fs-extra@10.1.0:
81 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
82 | engines: {node: '>=12'}
83 | dependencies:
84 | graceful-fs: 4.2.11
85 | jsonfile: 6.1.0
86 | universalify: 2.0.0
87 | dev: false
88 |
89 | /graceful-fs@4.2.11:
90 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
91 | dev: false
92 |
93 | /jquery@3.6.3:
94 | resolution: {integrity: sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==}
95 | dev: false
96 |
97 | /js-yaml@4.1.0:
98 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
99 | hasBin: true
100 | dependencies:
101 | argparse: 2.0.1
102 | dev: false
103 |
104 | /jsonfile@6.1.0:
105 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
106 | dependencies:
107 | universalify: 2.0.0
108 | optionalDependencies:
109 | graceful-fs: 4.2.11
110 | dev: false
111 |
112 | /lazy-val@1.0.5:
113 | resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==}
114 | dev: false
115 |
116 | /lodash.escaperegexp@4.1.2:
117 | resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==}
118 | dev: false
119 |
120 | /lodash.isequal@4.5.0:
121 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
122 | dev: false
123 |
124 | /lru-cache@6.0.0:
125 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
126 | engines: {node: '>=10'}
127 | dependencies:
128 | yallist: 4.0.0
129 | dev: false
130 |
131 | /ms@2.1.2:
132 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
133 | dev: false
134 |
135 | /sax@1.2.4:
136 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
137 | dev: false
138 |
139 | /semver@7.5.4:
140 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
141 | engines: {node: '>=10'}
142 | hasBin: true
143 | dependencies:
144 | lru-cache: 6.0.0
145 | dev: false
146 |
147 | /universalify@2.0.0:
148 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
149 | engines: {node: '>= 10.0.0'}
150 | dev: false
151 |
152 | /yallist@4.0.0:
153 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
154 | dev: false
155 |
156 | github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515:
157 | resolution: {tarball: https://codeload.github.com/aterrien/jQuery-Knob/tar.gz/755309e933d326ffaa5a2d758dc377147b766515}
158 | name: jquery-knob
159 | version: 1.2.13
160 | dev: false
161 |
--------------------------------------------------------------------------------
/app/yarn.lock:
--------------------------------------------------------------------------------
1 | # This file is generated by running "yarn install" inside your project.
2 | # Manual changes might be lost - proceed with caution!
3 |
4 | __metadata:
5 | version: 6
6 | cacheKey: 8
7 |
8 | "@types/semver@npm:^7.3.6":
9 | version: 7.3.9
10 | resolution: "@types/semver@npm:7.3.9"
11 | checksum: 60bfcfdfa7f937be2c6f4b37ddb6714fb0f27b05fe4cbdfdd596a97d35ed95d13ee410efdd88e72a66449d0384220bf20055ab7d6b5df10de4990fbd20e5cbe0
12 | languageName: node
13 | linkType: hard
14 |
15 | "argparse@npm:^2.0.1":
16 | version: 2.0.1
17 | resolution: "argparse@npm:2.0.1"
18 | checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced
19 | languageName: node
20 | linkType: hard
21 |
22 | "bootstrap@npm:^3.4.1":
23 | version: 3.4.1
24 | resolution: "bootstrap@npm:3.4.1"
25 | checksum: 5742035e8c541cd525780542771e7d56f63e5d4b2d902427bf182d3383e74a17c9074b6809f50d7f3de0585377e673339628b97cfdcde597ad69ecb1d2b562a6
26 | languageName: node
27 | linkType: hard
28 |
29 | "builder-util-runtime@npm:8.9.2":
30 | version: 8.9.2
31 | resolution: "builder-util-runtime@npm:8.9.2"
32 | dependencies:
33 | debug: ^4.3.2
34 | sax: ^1.2.4
35 | checksum: 35adcd6162e2ed16635ff7b7ecc353e400dcbbb3e7cd01823bfefc7256cefca8c820f62d15a0f7dbee1c7495a5f1fba4e0e238857a79b48d5f6bd35064f27208
36 | languageName: node
37 | linkType: hard
38 |
39 | "debug@npm:^4.3.2":
40 | version: 4.3.4
41 | resolution: "debug@npm:4.3.4"
42 | dependencies:
43 | ms: 2.1.2
44 | peerDependenciesMeta:
45 | supports-color:
46 | optional: true
47 | checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
48 | languageName: node
49 | linkType: hard
50 |
51 | "electron-log@npm:^4.4.8":
52 | version: 4.4.8
53 | resolution: "electron-log@npm:4.4.8"
54 | checksum: 5a7958f8fd9a5c95987e885ffe1c5b88be15bb41d348b65c92e2d8664519faddf17ce0208cd4e7027b0908f92fecedfbef246a45061f53e4a53b5d2201aafbd9
55 | languageName: node
56 | linkType: hard
57 |
58 | "electron-updater@npm:^4.6.5":
59 | version: 4.6.5
60 | resolution: "electron-updater@npm:4.6.5"
61 | dependencies:
62 | "@types/semver": ^7.3.6
63 | builder-util-runtime: 8.9.2
64 | fs-extra: ^10.0.0
65 | js-yaml: ^4.1.0
66 | lazy-val: ^1.0.5
67 | lodash.escaperegexp: ^4.1.2
68 | lodash.isequal: ^4.5.0
69 | semver: ^7.3.5
70 | checksum: 06b34490fa6213f5c6a01de6f7b3d96eba4e1b7d27e8346747d8b094b9591684f55f92c703e2ee3407c562a240518c0eede699462cc333fcfe2983141941fe98
71 | languageName: node
72 | linkType: hard
73 |
74 | "fs-extra@npm:^10.0.0":
75 | version: 10.0.1
76 | resolution: "fs-extra@npm:10.0.1"
77 | dependencies:
78 | graceful-fs: ^4.2.0
79 | jsonfile: ^6.0.1
80 | universalify: ^2.0.0
81 | checksum: c1faaa5eb9e1c5c7c7ff09f966e93922ecb068ae1b04801cfc983ef05fcc1f66bfbb8d8d0b745c910014c7a2e7317fb6cf3bfe7390450c1157e3cc1a218f221d
82 | languageName: node
83 | linkType: hard
84 |
85 | "graceful-fs@npm:^4.1.6":
86 | version: 4.1.15
87 | resolution: "graceful-fs@npm:4.1.15"
88 | checksum: 0c7d7fcb739f760b3b702f993b64e2c111fce22084bbc9c5c8ff7f1a051691a7bba2baf0bf1c464ea5081225f8e17610c6b30167bcd6899aaabca820d55e403c
89 | languageName: node
90 | linkType: hard
91 |
92 | "graceful-fs@npm:^4.2.0":
93 | version: 4.2.3
94 | resolution: "graceful-fs@npm:4.2.3"
95 | checksum: ec1f6a7027dfd4f6b69a15b2c78493d7211e88a8c0fdb6d93aa504f8f6b5353abac6ba0a202aedb9d970be22c2c257a1481426913ae0166bdc8bb8f3bed378dc
96 | languageName: node
97 | linkType: hard
98 |
99 | "heos-controller@workspace:.":
100 | version: 0.0.0-use.local
101 | resolution: "heos-controller@workspace:."
102 | dependencies:
103 | bootstrap: ^3.4.1
104 | electron-log: ^4.4.8
105 | electron-updater: ^4.6.5
106 | jquery: ^3.6.3
107 | jquery-knob: "ssh://git@github.com:aterrien/jQuery-Knob.git"
108 | languageName: unknown
109 | linkType: soft
110 |
111 | "jquery-knob@ssh://git@github.com:aterrien/jQuery-Knob.git":
112 | version: 1.2.13
113 | resolution: "jquery-knob@ssh://git@github.com:aterrien/jQuery-Knob.git#commit=755309e933d326ffaa5a2d758dc377147b766515"
114 | checksum: 12076a75ee04734bb043e4b634a2ed87462054d43295a7133bae799b6f8fb0c98f82bf4f5adc4aeff5d496bc2d64ffb662d01e67aa8a9eab24ce4e9114638b42
115 | languageName: node
116 | linkType: hard
117 |
118 | "jquery@npm:^3.6.3":
119 | version: 3.6.3
120 | resolution: "jquery@npm:3.6.3"
121 | checksum: 0fd366bdcaa0c84a7a8751ce20f8192290141913978b5059574426d9b01f4365daa675f95aab3eec94fd794d27b08d32078a2236bef404b8ba78073009988ce6
122 | languageName: node
123 | linkType: hard
124 |
125 | "js-yaml@npm:^4.1.0":
126 | version: 4.1.0
127 | resolution: "js-yaml@npm:4.1.0"
128 | dependencies:
129 | argparse: ^2.0.1
130 | bin:
131 | js-yaml: bin/js-yaml.js
132 | checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a
133 | languageName: node
134 | linkType: hard
135 |
136 | "jsonfile@npm:^6.0.1":
137 | version: 6.0.1
138 | resolution: "jsonfile@npm:6.0.1"
139 | dependencies:
140 | graceful-fs: ^4.1.6
141 | universalify: ^1.0.0
142 | dependenciesMeta:
143 | graceful-fs:
144 | optional: true
145 | checksum: d37b3732c6a44d2839338d4580f6092d569a1dc6b1895b8f0b02ece5c39420b4b8b89cf3540caa4a7da9986c5844d2f6d39753651ddd785959e628b9d87ba216
146 | languageName: node
147 | linkType: hard
148 |
149 | "lazy-val@npm:^1.0.5":
150 | version: 1.0.5
151 | resolution: "lazy-val@npm:1.0.5"
152 | checksum: 31e12e0b118826dfae74f8f3ff8ebcddfe4200ff88d0d448db175c7265ee537e0ba55488d411728246337f3ed3c9ec68416f10889f632a2ce28fb7a970909fb5
153 | languageName: node
154 | linkType: hard
155 |
156 | "lodash.escaperegexp@npm:^4.1.2":
157 | version: 4.1.2
158 | resolution: "lodash.escaperegexp@npm:4.1.2"
159 | checksum: 6d99452b1cfd6073175a9b741a9b09ece159eac463f86f02ea3bee2e2092923fce812c8d2bf446309cc52d1d61bf9af51c8118b0d7421388e6cead7bd3798f0f
160 | languageName: node
161 | linkType: hard
162 |
163 | "lodash.isequal@npm:^4.5.0":
164 | version: 4.5.0
165 | resolution: "lodash.isequal@npm:4.5.0"
166 | checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644
167 | languageName: node
168 | linkType: hard
169 |
170 | "lru-cache@npm:^6.0.0":
171 | version: 6.0.0
172 | resolution: "lru-cache@npm:6.0.0"
173 | dependencies:
174 | yallist: ^4.0.0
175 | checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297
176 | languageName: node
177 | linkType: hard
178 |
179 | "ms@npm:2.1.2":
180 | version: 2.1.2
181 | resolution: "ms@npm:2.1.2"
182 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f
183 | languageName: node
184 | linkType: hard
185 |
186 | "sax@npm:^1.2.4":
187 | version: 1.2.4
188 | resolution: "sax@npm:1.2.4"
189 | checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe
190 | languageName: node
191 | linkType: hard
192 |
193 | "semver@npm:^7.3.5":
194 | version: 7.5.3
195 | resolution: "semver@npm:7.5.3"
196 | dependencies:
197 | lru-cache: ^6.0.0
198 | bin:
199 | semver: bin/semver.js
200 | checksum: 9d58db16525e9f749ad0a696a1f27deabaa51f66e91d2fa2b0db3de3e9644e8677de3b7d7a03f4c15bc81521e0c3916d7369e0572dbde250d9bedf5194e2a8a7
201 | languageName: node
202 | linkType: hard
203 |
204 | "universalify@npm:^1.0.0":
205 | version: 1.0.0
206 | resolution: "universalify@npm:1.0.0"
207 | checksum: 095a808f2b915e3b89d29b6f3b4ee4163962b02fa5b7cb686970b8d0439f4ca789bc43f319b7cbb1ce552ae724e631d148e5aee9ce04c4f46a7fe0c5bbfd2b9e
208 | languageName: node
209 | linkType: hard
210 |
211 | "universalify@npm:^2.0.0":
212 | version: 2.0.0
213 | resolution: "universalify@npm:2.0.0"
214 | checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44
215 | languageName: node
216 | linkType: hard
217 |
218 | "yallist@npm:^4.0.0":
219 | version: 4.0.0
220 | resolution: "yallist@npm:4.0.0"
221 | checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
222 | languageName: node
223 | linkType: hard
224 |
--------------------------------------------------------------------------------
/icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cold-logic/heos-controller/bb0e4ee85abdc0f82447bd59ac55d576ce140ac4/icon.icns
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "heos-controller",
3 | "version": "1.0.10",
4 | "description": "Controller for Denon Heos speakers",
5 | "repository": "https://github.com/cold-logic/heos-controller",
6 | "main": "app/index.js",
7 | "scripts": {
8 | "pack": "env-cmd electron-builder --dir",
9 | "dist": "env-cmd electron-builder",
10 | "build": "env-cmd electron-builder build",
11 | "package-linux": "env-cmd electron-builder --linux",
12 | "package-mac": "env-cmd electron-builder --mac --arm64 --x64",
13 | "package-win": "env-cmd electron-builder --win --ia32 --x64",
14 | "release": "build",
15 | "start": "electron app",
16 | "test": "echo \"Error: no test specified\" && exit 1"
17 | },
18 | "author": "Christopher Davison",
19 | "private": true,
20 | "license": "ISC",
21 | "build": {
22 | "appId": "me.christopherd.heos-controller",
23 | "productName": "Heos Controller",
24 | "mac": {
25 | "icon": "icon.icns",
26 | "category": "public.app-category.music",
27 | "publish": [
28 | "github"
29 | ]
30 | },
31 | "linux": {
32 | "icon": "icon.icns",
33 | "category": "public.app-category.music",
34 | "target": "AppImage",
35 | "publish": [
36 | "github"
37 | ]
38 | }
39 | },
40 | "packageManager": "pnpm@8.15.6",
41 | "dependencies": {
42 | "electron": "^29.2.0",
43 | "electron-builder": "^24.13.3",
44 | "env-cmd": "^10.1.0"
45 | },
46 | "workspaces": [
47 | "app"
48 | ]
49 | }
50 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | electron:
12 | specifier: ^29.2.0
13 | version: 29.2.0
14 | electron-builder:
15 | specifier: ^24.13.3
16 | version: 24.13.3(electron-builder-squirrel-windows@24.13.3)
17 | env-cmd:
18 | specifier: ^10.1.0
19 | version: 10.1.0
20 |
21 | app:
22 | dependencies:
23 | bootstrap:
24 | specifier: ^3.4.1
25 | version: 3.4.1
26 | electron-log:
27 | specifier: ^5.1.2
28 | version: 5.1.2
29 | electron-updater:
30 | specifier: ^6.3.0
31 | version: 6.3.0
32 | jquery:
33 | specifier: ^3.7.1
34 | version: 3.7.1
35 | jquery-knob:
36 | specifier: ssh://git@github.com:aterrien/jQuery-Knob.git
37 | version: github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515
38 |
39 | packages:
40 |
41 | /7zip-bin@5.2.0:
42 | resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==}
43 | dev: false
44 |
45 | /@develar/schema-utils@2.6.5:
46 | resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==}
47 | engines: {node: '>= 8.9.0'}
48 | dependencies:
49 | ajv: 6.12.6
50 | ajv-keywords: 3.5.2(ajv@6.12.6)
51 | dev: false
52 |
53 | /@electron/asar@3.2.4:
54 | resolution: {integrity: sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==}
55 | engines: {node: '>=10.12.0'}
56 | hasBin: true
57 | dependencies:
58 | chromium-pickle-js: 0.2.0
59 | commander: 5.1.0
60 | glob: 7.2.3
61 | minimatch: 3.1.2
62 | dev: false
63 |
64 | /@electron/get@2.0.3:
65 | resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==}
66 | engines: {node: '>=12'}
67 | dependencies:
68 | debug: 4.3.4
69 | env-paths: 2.2.1
70 | fs-extra: 8.1.0
71 | got: 11.8.6
72 | progress: 2.0.3
73 | semver: 6.3.1
74 | sumchecker: 3.0.1
75 | optionalDependencies:
76 | global-agent: 3.0.0
77 | transitivePeerDependencies:
78 | - supports-color
79 | dev: false
80 |
81 | /@electron/notarize@2.2.1:
82 | resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==}
83 | engines: {node: '>= 10.0.0'}
84 | dependencies:
85 | debug: 4.3.4
86 | fs-extra: 9.1.0
87 | promise-retry: 2.0.1
88 | transitivePeerDependencies:
89 | - supports-color
90 | dev: false
91 |
92 | /@electron/osx-sign@1.0.5:
93 | resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==}
94 | engines: {node: '>=12.0.0'}
95 | hasBin: true
96 | dependencies:
97 | compare-version: 0.1.2
98 | debug: 4.3.4
99 | fs-extra: 10.1.0
100 | isbinaryfile: 4.0.10
101 | minimist: 1.2.8
102 | plist: 3.1.0
103 | transitivePeerDependencies:
104 | - supports-color
105 | dev: false
106 |
107 | /@electron/universal@1.5.1:
108 | resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==}
109 | engines: {node: '>=8.6'}
110 | dependencies:
111 | '@electron/asar': 3.2.4
112 | '@malept/cross-spawn-promise': 1.1.1
113 | debug: 4.3.4
114 | dir-compare: 3.3.0
115 | fs-extra: 9.1.0
116 | minimatch: 3.1.2
117 | plist: 3.1.0
118 | transitivePeerDependencies:
119 | - supports-color
120 | dev: false
121 |
122 | /@malept/cross-spawn-promise@1.1.1:
123 | resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==}
124 | engines: {node: '>= 10'}
125 | dependencies:
126 | cross-spawn: 7.0.3
127 | dev: false
128 |
129 | /@malept/flatpak-bundler@0.4.0:
130 | resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==}
131 | engines: {node: '>= 10.0.0'}
132 | dependencies:
133 | debug: 4.3.4
134 | fs-extra: 9.1.0
135 | lodash: 4.17.21
136 | tmp-promise: 3.0.3
137 | transitivePeerDependencies:
138 | - supports-color
139 | dev: false
140 |
141 | /@sindresorhus/is@4.6.0:
142 | resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
143 | engines: {node: '>=10'}
144 | dev: false
145 |
146 | /@szmarczak/http-timer@4.0.6:
147 | resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
148 | engines: {node: '>=10'}
149 | dependencies:
150 | defer-to-connect: 2.0.1
151 | dev: false
152 |
153 | /@tootallnate/once@2.0.0:
154 | resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
155 | engines: {node: '>= 10'}
156 | dev: false
157 |
158 | /@types/cacheable-request@6.0.3:
159 | resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==}
160 | dependencies:
161 | '@types/http-cache-semantics': 4.0.1
162 | '@types/keyv': 3.1.4
163 | '@types/node': 20.12.7
164 | '@types/responselike': 1.0.0
165 | dev: false
166 |
167 | /@types/debug@4.1.8:
168 | resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==}
169 | dependencies:
170 | '@types/ms': 0.7.31
171 | dev: false
172 |
173 | /@types/fs-extra@9.0.13:
174 | resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
175 | dependencies:
176 | '@types/node': 20.5.9
177 | dev: false
178 |
179 | /@types/http-cache-semantics@4.0.1:
180 | resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
181 | dev: false
182 |
183 | /@types/keyv@3.1.4:
184 | resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
185 | dependencies:
186 | '@types/node': 20.12.7
187 | dev: false
188 |
189 | /@types/ms@0.7.31:
190 | resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
191 | dev: false
192 |
193 | /@types/node@20.12.7:
194 | resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==}
195 | dependencies:
196 | undici-types: 5.26.5
197 | dev: false
198 |
199 | /@types/node@20.5.9:
200 | resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==}
201 | dev: false
202 |
203 | /@types/plist@3.0.2:
204 | resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==}
205 | requiresBuild: true
206 | dependencies:
207 | '@types/node': 20.12.7
208 | xmlbuilder: 15.1.1
209 | dev: false
210 | optional: true
211 |
212 | /@types/responselike@1.0.0:
213 | resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
214 | dependencies:
215 | '@types/node': 20.12.7
216 | dev: false
217 |
218 | /@types/verror@1.10.6:
219 | resolution: {integrity: sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==}
220 | requiresBuild: true
221 | dev: false
222 | optional: true
223 |
224 | /@types/yauzl@2.10.0:
225 | resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
226 | requiresBuild: true
227 | dependencies:
228 | '@types/node': 20.12.7
229 | dev: false
230 | optional: true
231 |
232 | /@xmldom/xmldom@0.8.10:
233 | resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
234 | engines: {node: '>=10.0.0'}
235 | requiresBuild: true
236 | dev: false
237 |
238 | /agent-base@6.0.2:
239 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
240 | engines: {node: '>= 6.0.0'}
241 | dependencies:
242 | debug: 4.3.4
243 | transitivePeerDependencies:
244 | - supports-color
245 | dev: false
246 |
247 | /ajv-keywords@3.5.2(ajv@6.12.6):
248 | resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
249 | peerDependencies:
250 | ajv: ^6.9.1
251 | dependencies:
252 | ajv: 6.12.6
253 | dev: false
254 |
255 | /ajv@6.12.6:
256 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
257 | dependencies:
258 | fast-deep-equal: 3.1.3
259 | fast-json-stable-stringify: 2.1.0
260 | json-schema-traverse: 0.4.1
261 | uri-js: 4.4.1
262 | dev: false
263 |
264 | /ansi-regex@5.0.1:
265 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
266 | engines: {node: '>=8'}
267 | dev: false
268 |
269 | /ansi-styles@4.3.0:
270 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
271 | engines: {node: '>=8'}
272 | dependencies:
273 | color-convert: 2.0.1
274 | dev: false
275 |
276 | /app-builder-bin@4.0.0:
277 | resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==}
278 | dev: false
279 |
280 | /app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3):
281 | resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==}
282 | engines: {node: '>=14.0.0'}
283 | peerDependencies:
284 | dmg-builder: 24.13.3
285 | electron-builder-squirrel-windows: 24.13.3
286 | dependencies:
287 | '@develar/schema-utils': 2.6.5
288 | '@electron/notarize': 2.2.1
289 | '@electron/osx-sign': 1.0.5
290 | '@electron/universal': 1.5.1
291 | '@malept/flatpak-bundler': 0.4.0
292 | '@types/fs-extra': 9.0.13
293 | async-exit-hook: 2.0.1
294 | bluebird-lst: 1.0.9
295 | builder-util: 24.13.1
296 | builder-util-runtime: 9.2.4
297 | chromium-pickle-js: 0.2.0
298 | debug: 4.3.4
299 | dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3)
300 | ejs: 3.1.9
301 | electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3)
302 | electron-publish: 24.13.1
303 | form-data: 4.0.0
304 | fs-extra: 10.1.0
305 | hosted-git-info: 4.1.0
306 | is-ci: 3.0.1
307 | isbinaryfile: 5.0.0
308 | js-yaml: 4.1.0
309 | lazy-val: 1.0.5
310 | minimatch: 5.1.6
311 | read-config-file: 6.3.2
312 | sanitize-filename: 1.6.3
313 | semver: 7.5.4
314 | tar: 6.2.0
315 | temp-file: 3.4.0
316 | transitivePeerDependencies:
317 | - supports-color
318 | dev: false
319 |
320 | /archiver-utils@2.1.0:
321 | resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==}
322 | engines: {node: '>= 6'}
323 | dependencies:
324 | glob: 7.2.3
325 | graceful-fs: 4.2.11
326 | lazystream: 1.0.1
327 | lodash.defaults: 4.2.0
328 | lodash.difference: 4.5.0
329 | lodash.flatten: 4.4.0
330 | lodash.isplainobject: 4.0.6
331 | lodash.union: 4.6.0
332 | normalize-path: 3.0.0
333 | readable-stream: 2.3.8
334 | dev: false
335 |
336 | /archiver-utils@3.0.4:
337 | resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==}
338 | engines: {node: '>= 10'}
339 | dependencies:
340 | glob: 7.2.3
341 | graceful-fs: 4.2.11
342 | lazystream: 1.0.1
343 | lodash.defaults: 4.2.0
344 | lodash.difference: 4.5.0
345 | lodash.flatten: 4.4.0
346 | lodash.isplainobject: 4.0.6
347 | lodash.union: 4.6.0
348 | normalize-path: 3.0.0
349 | readable-stream: 3.6.2
350 | dev: false
351 |
352 | /archiver@5.3.2:
353 | resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==}
354 | engines: {node: '>= 10'}
355 | dependencies:
356 | archiver-utils: 2.1.0
357 | async: 3.2.4
358 | buffer-crc32: 0.2.13
359 | readable-stream: 3.6.2
360 | readdir-glob: 1.1.3
361 | tar-stream: 2.2.0
362 | zip-stream: 4.1.1
363 | dev: false
364 |
365 | /argparse@2.0.1:
366 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
367 | dev: false
368 |
369 | /assert-plus@1.0.0:
370 | resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
371 | engines: {node: '>=0.8'}
372 | requiresBuild: true
373 | dev: false
374 | optional: true
375 |
376 | /astral-regex@2.0.0:
377 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
378 | engines: {node: '>=8'}
379 | requiresBuild: true
380 | dev: false
381 | optional: true
382 |
383 | /async-exit-hook@2.0.1:
384 | resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==}
385 | engines: {node: '>=0.12.0'}
386 | dev: false
387 |
388 | /async@3.2.4:
389 | resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
390 | dev: false
391 |
392 | /asynckit@0.4.0:
393 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
394 | dev: false
395 |
396 | /at-least-node@1.0.0:
397 | resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
398 | engines: {node: '>= 4.0.0'}
399 | dev: false
400 |
401 | /balanced-match@1.0.2:
402 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
403 | dev: false
404 |
405 | /base64-js@1.5.1:
406 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
407 | requiresBuild: true
408 | dev: false
409 |
410 | /bl@4.1.0:
411 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
412 | dependencies:
413 | buffer: 5.7.1
414 | inherits: 2.0.4
415 | readable-stream: 3.6.2
416 | dev: false
417 |
418 | /bluebird-lst@1.0.9:
419 | resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==}
420 | dependencies:
421 | bluebird: 3.7.2
422 | dev: false
423 |
424 | /bluebird@3.7.2:
425 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
426 | dev: false
427 |
428 | /boolean@3.2.0:
429 | resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
430 | requiresBuild: true
431 | dev: false
432 | optional: true
433 |
434 | /bootstrap@3.4.1:
435 | resolution: {integrity: sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==}
436 | engines: {node: '>=6'}
437 | dev: false
438 |
439 | /brace-expansion@1.1.11:
440 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
441 | dependencies:
442 | balanced-match: 1.0.2
443 | concat-map: 0.0.1
444 | dev: false
445 |
446 | /brace-expansion@2.0.1:
447 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
448 | dependencies:
449 | balanced-match: 1.0.2
450 | dev: false
451 |
452 | /buffer-crc32@0.2.13:
453 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
454 | dev: false
455 |
456 | /buffer-equal@1.0.0:
457 | resolution: {integrity: sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==}
458 | engines: {node: '>=0.4.0'}
459 | dev: false
460 |
461 | /buffer-from@1.1.2:
462 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
463 | dev: false
464 |
465 | /buffer@5.7.1:
466 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
467 | requiresBuild: true
468 | dependencies:
469 | base64-js: 1.5.1
470 | ieee754: 1.2.1
471 | dev: false
472 |
473 | /builder-util-runtime@9.2.4:
474 | resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==}
475 | engines: {node: '>=12.0.0'}
476 | dependencies:
477 | debug: 4.3.4
478 | sax: 1.2.4
479 | transitivePeerDependencies:
480 | - supports-color
481 | dev: false
482 |
483 | /builder-util-runtime@9.2.5:
484 | resolution: {integrity: sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==}
485 | engines: {node: '>=12.0.0'}
486 | dependencies:
487 | debug: 4.3.4
488 | sax: 1.2.4
489 | transitivePeerDependencies:
490 | - supports-color
491 | dev: false
492 |
493 | /builder-util@24.13.1:
494 | resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==}
495 | dependencies:
496 | 7zip-bin: 5.2.0
497 | '@types/debug': 4.1.8
498 | app-builder-bin: 4.0.0
499 | bluebird-lst: 1.0.9
500 | builder-util-runtime: 9.2.4
501 | chalk: 4.1.2
502 | cross-spawn: 7.0.3
503 | debug: 4.3.4
504 | fs-extra: 10.1.0
505 | http-proxy-agent: 5.0.0
506 | https-proxy-agent: 5.0.1
507 | is-ci: 3.0.1
508 | js-yaml: 4.1.0
509 | source-map-support: 0.5.21
510 | stat-mode: 1.0.0
511 | temp-file: 3.4.0
512 | transitivePeerDependencies:
513 | - supports-color
514 | dev: false
515 |
516 | /cacheable-lookup@5.0.4:
517 | resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==}
518 | engines: {node: '>=10.6.0'}
519 | dev: false
520 |
521 | /cacheable-request@7.0.4:
522 | resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==}
523 | engines: {node: '>=8'}
524 | dependencies:
525 | clone-response: 1.0.3
526 | get-stream: 5.2.0
527 | http-cache-semantics: 4.1.1
528 | keyv: 4.5.3
529 | lowercase-keys: 2.0.0
530 | normalize-url: 6.1.0
531 | responselike: 2.0.1
532 | dev: false
533 |
534 | /chalk@4.1.2:
535 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
536 | engines: {node: '>=10'}
537 | dependencies:
538 | ansi-styles: 4.3.0
539 | supports-color: 7.2.0
540 | dev: false
541 |
542 | /chownr@2.0.0:
543 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
544 | engines: {node: '>=10'}
545 | dev: false
546 |
547 | /chromium-pickle-js@0.2.0:
548 | resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==}
549 | dev: false
550 |
551 | /ci-info@3.8.0:
552 | resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
553 | engines: {node: '>=8'}
554 | dev: false
555 |
556 | /cli-truncate@2.1.0:
557 | resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
558 | engines: {node: '>=8'}
559 | requiresBuild: true
560 | dependencies:
561 | slice-ansi: 3.0.0
562 | string-width: 4.2.3
563 | dev: false
564 | optional: true
565 |
566 | /cliui@8.0.1:
567 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
568 | engines: {node: '>=12'}
569 | dependencies:
570 | string-width: 4.2.3
571 | strip-ansi: 6.0.1
572 | wrap-ansi: 7.0.0
573 | dev: false
574 |
575 | /clone-response@1.0.3:
576 | resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
577 | dependencies:
578 | mimic-response: 1.0.1
579 | dev: false
580 |
581 | /color-convert@2.0.1:
582 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
583 | engines: {node: '>=7.0.0'}
584 | dependencies:
585 | color-name: 1.1.4
586 | dev: false
587 |
588 | /color-name@1.1.4:
589 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
590 | dev: false
591 |
592 | /combined-stream@1.0.8:
593 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
594 | engines: {node: '>= 0.8'}
595 | dependencies:
596 | delayed-stream: 1.0.0
597 | dev: false
598 |
599 | /commander@4.1.1:
600 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
601 | engines: {node: '>= 6'}
602 | dev: false
603 |
604 | /commander@5.1.0:
605 | resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
606 | engines: {node: '>= 6'}
607 | dev: false
608 |
609 | /compare-version@0.1.2:
610 | resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==}
611 | engines: {node: '>=0.10.0'}
612 | dev: false
613 |
614 | /compress-commons@4.1.2:
615 | resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==}
616 | engines: {node: '>= 10'}
617 | dependencies:
618 | buffer-crc32: 0.2.13
619 | crc32-stream: 4.0.3
620 | normalize-path: 3.0.0
621 | readable-stream: 3.6.2
622 | dev: false
623 |
624 | /concat-map@0.0.1:
625 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
626 | dev: false
627 |
628 | /config-file-ts@0.2.4:
629 | resolution: {integrity: sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==}
630 | dependencies:
631 | glob: 7.2.3
632 | typescript: 4.9.5
633 | dev: false
634 |
635 | /core-util-is@1.0.2:
636 | resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
637 | requiresBuild: true
638 | dev: false
639 |
640 | /crc-32@1.2.2:
641 | resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
642 | engines: {node: '>=0.8'}
643 | hasBin: true
644 | dev: false
645 |
646 | /crc32-stream@4.0.3:
647 | resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==}
648 | engines: {node: '>= 10'}
649 | dependencies:
650 | crc-32: 1.2.2
651 | readable-stream: 3.6.2
652 | dev: false
653 |
654 | /crc@3.8.0:
655 | resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==}
656 | requiresBuild: true
657 | dependencies:
658 | buffer: 5.7.1
659 | dev: false
660 | optional: true
661 |
662 | /cross-spawn@7.0.3:
663 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
664 | engines: {node: '>= 8'}
665 | dependencies:
666 | path-key: 3.1.1
667 | shebang-command: 2.0.0
668 | which: 2.0.2
669 | dev: false
670 |
671 | /debug@4.3.4:
672 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
673 | engines: {node: '>=6.0'}
674 | peerDependencies:
675 | supports-color: '*'
676 | peerDependenciesMeta:
677 | supports-color:
678 | optional: true
679 | dependencies:
680 | ms: 2.1.2
681 | dev: false
682 |
683 | /decompress-response@6.0.0:
684 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
685 | engines: {node: '>=10'}
686 | dependencies:
687 | mimic-response: 3.1.0
688 | dev: false
689 |
690 | /defer-to-connect@2.0.1:
691 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
692 | engines: {node: '>=10'}
693 | dev: false
694 |
695 | /define-properties@1.2.0:
696 | resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
697 | engines: {node: '>= 0.4'}
698 | requiresBuild: true
699 | dependencies:
700 | has-property-descriptors: 1.0.0
701 | object-keys: 1.1.1
702 | dev: false
703 | optional: true
704 |
705 | /delayed-stream@1.0.0:
706 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
707 | engines: {node: '>=0.4.0'}
708 | dev: false
709 |
710 | /detect-node@2.1.0:
711 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
712 | requiresBuild: true
713 | dev: false
714 | optional: true
715 |
716 | /dir-compare@3.3.0:
717 | resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==}
718 | dependencies:
719 | buffer-equal: 1.0.0
720 | minimatch: 3.1.2
721 | dev: false
722 |
723 | /dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3):
724 | resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==}
725 | dependencies:
726 | app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3)
727 | builder-util: 24.13.1
728 | builder-util-runtime: 9.2.4
729 | fs-extra: 10.1.0
730 | iconv-lite: 0.6.3
731 | js-yaml: 4.1.0
732 | optionalDependencies:
733 | dmg-license: 1.0.11
734 | transitivePeerDependencies:
735 | - electron-builder-squirrel-windows
736 | - supports-color
737 | dev: false
738 |
739 | /dmg-license@1.0.11:
740 | resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==}
741 | engines: {node: '>=8'}
742 | os: [darwin]
743 | hasBin: true
744 | requiresBuild: true
745 | dependencies:
746 | '@types/plist': 3.0.2
747 | '@types/verror': 1.10.6
748 | ajv: 6.12.6
749 | crc: 3.8.0
750 | iconv-corefoundation: 1.1.7
751 | plist: 3.1.0
752 | smart-buffer: 4.2.0
753 | verror: 1.10.1
754 | dev: false
755 | optional: true
756 |
757 | /dotenv-expand@5.1.0:
758 | resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==}
759 | dev: false
760 |
761 | /dotenv@9.0.2:
762 | resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==}
763 | engines: {node: '>=10'}
764 | dev: false
765 |
766 | /ejs@3.1.9:
767 | resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
768 | engines: {node: '>=0.10.0'}
769 | hasBin: true
770 | dependencies:
771 | jake: 10.8.7
772 | dev: false
773 |
774 | /electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3):
775 | resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==}
776 | dependencies:
777 | app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3)
778 | archiver: 5.3.2
779 | builder-util: 24.13.1
780 | fs-extra: 10.1.0
781 | transitivePeerDependencies:
782 | - dmg-builder
783 | - supports-color
784 | dev: false
785 |
786 | /electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3):
787 | resolution: {integrity: sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==}
788 | engines: {node: '>=14.0.0'}
789 | hasBin: true
790 | dependencies:
791 | app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3)
792 | builder-util: 24.13.1
793 | builder-util-runtime: 9.2.4
794 | chalk: 4.1.2
795 | dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3)
796 | fs-extra: 10.1.0
797 | is-ci: 3.0.1
798 | lazy-val: 1.0.5
799 | read-config-file: 6.3.2
800 | simple-update-notifier: 2.0.0
801 | yargs: 17.7.2
802 | transitivePeerDependencies:
803 | - electron-builder-squirrel-windows
804 | - supports-color
805 | dev: false
806 |
807 | /electron-log@5.1.2:
808 | resolution: {integrity: sha512-Cpg4hAZ27yM9wzE77c4TvgzxzavZ+dVltCczParXN+Vb3jocojCSAuSMCVOI9fhFuuOR+iuu3tZLX1cu0y0kgQ==}
809 | engines: {node: '>= 14'}
810 | dev: false
811 |
812 | /electron-publish@24.13.1:
813 | resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==}
814 | dependencies:
815 | '@types/fs-extra': 9.0.13
816 | builder-util: 24.13.1
817 | builder-util-runtime: 9.2.4
818 | chalk: 4.1.2
819 | fs-extra: 10.1.0
820 | lazy-val: 1.0.5
821 | mime: 2.6.0
822 | transitivePeerDependencies:
823 | - supports-color
824 | dev: false
825 |
826 | /electron-updater@6.3.0:
827 | resolution: {integrity: sha512-3Xlezhk+dKaSQrOnkQNqCGiuGSSUPO9BV9TQZ4Iig6AyTJ4FzJONE5gFFc382sY53Sh9dwJfzKsA3DxRHt2btw==}
828 | dependencies:
829 | builder-util-runtime: 9.2.5
830 | fs-extra: 10.1.0
831 | js-yaml: 4.1.0
832 | lazy-val: 1.0.5
833 | lodash.escaperegexp: 4.1.2
834 | lodash.isequal: 4.5.0
835 | semver: 7.5.4
836 | tiny-typed-emitter: 2.1.0
837 | transitivePeerDependencies:
838 | - supports-color
839 | dev: false
840 |
841 | /electron@29.2.0:
842 | resolution: {integrity: sha512-ALKrCN52RG4g9prx4DriXSPnY5WoiyRUCNp7zEVQuoiNOpHTNqMMpRidQAHzntV4hajF1LMWHVoBkwqIs1jHhg==}
843 | engines: {node: '>= 12.20.55'}
844 | hasBin: true
845 | requiresBuild: true
846 | dependencies:
847 | '@electron/get': 2.0.3
848 | '@types/node': 20.12.7
849 | extract-zip: 2.0.1
850 | transitivePeerDependencies:
851 | - supports-color
852 | dev: false
853 |
854 | /emoji-regex@8.0.0:
855 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
856 | dev: false
857 |
858 | /end-of-stream@1.4.4:
859 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
860 | dependencies:
861 | once: 1.4.0
862 | dev: false
863 |
864 | /env-cmd@10.1.0:
865 | resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==}
866 | engines: {node: '>=8.0.0'}
867 | hasBin: true
868 | dependencies:
869 | commander: 4.1.1
870 | cross-spawn: 7.0.3
871 | dev: false
872 |
873 | /env-paths@2.2.1:
874 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
875 | engines: {node: '>=6'}
876 | dev: false
877 |
878 | /err-code@2.0.3:
879 | resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
880 | dev: false
881 |
882 | /es6-error@4.1.1:
883 | resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
884 | requiresBuild: true
885 | dev: false
886 | optional: true
887 |
888 | /escalade@3.1.1:
889 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
890 | engines: {node: '>=6'}
891 | dev: false
892 |
893 | /escape-string-regexp@4.0.0:
894 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
895 | engines: {node: '>=10'}
896 | requiresBuild: true
897 | dev: false
898 | optional: true
899 |
900 | /extract-zip@2.0.1:
901 | resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
902 | engines: {node: '>= 10.17.0'}
903 | hasBin: true
904 | dependencies:
905 | debug: 4.3.4
906 | get-stream: 5.2.0
907 | yauzl: 2.10.0
908 | optionalDependencies:
909 | '@types/yauzl': 2.10.0
910 | transitivePeerDependencies:
911 | - supports-color
912 | dev: false
913 |
914 | /extsprintf@1.4.1:
915 | resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==}
916 | engines: {'0': node >=0.6.0}
917 | requiresBuild: true
918 | dev: false
919 | optional: true
920 |
921 | /fast-deep-equal@3.1.3:
922 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
923 | requiresBuild: true
924 | dev: false
925 |
926 | /fast-json-stable-stringify@2.1.0:
927 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
928 | requiresBuild: true
929 | dev: false
930 |
931 | /fd-slicer@1.1.0:
932 | resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
933 | dependencies:
934 | pend: 1.2.0
935 | dev: false
936 |
937 | /filelist@1.0.4:
938 | resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
939 | dependencies:
940 | minimatch: 5.1.6
941 | dev: false
942 |
943 | /form-data@4.0.0:
944 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
945 | engines: {node: '>= 6'}
946 | dependencies:
947 | asynckit: 0.4.0
948 | combined-stream: 1.0.8
949 | mime-types: 2.1.35
950 | dev: false
951 |
952 | /fs-constants@1.0.0:
953 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
954 | dev: false
955 |
956 | /fs-extra@10.1.0:
957 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
958 | engines: {node: '>=12'}
959 | dependencies:
960 | graceful-fs: 4.2.11
961 | jsonfile: 6.1.0
962 | universalify: 2.0.0
963 | dev: false
964 |
965 | /fs-extra@8.1.0:
966 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
967 | engines: {node: '>=6 <7 || >=8'}
968 | dependencies:
969 | graceful-fs: 4.2.11
970 | jsonfile: 4.0.0
971 | universalify: 0.1.2
972 | dev: false
973 |
974 | /fs-extra@9.1.0:
975 | resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
976 | engines: {node: '>=10'}
977 | dependencies:
978 | at-least-node: 1.0.0
979 | graceful-fs: 4.2.11
980 | jsonfile: 6.1.0
981 | universalify: 2.0.0
982 | dev: false
983 |
984 | /fs-minipass@2.1.0:
985 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
986 | engines: {node: '>= 8'}
987 | dependencies:
988 | minipass: 3.3.6
989 | dev: false
990 |
991 | /fs.realpath@1.0.0:
992 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
993 | dev: false
994 |
995 | /function-bind@1.1.1:
996 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
997 | requiresBuild: true
998 | dev: false
999 | optional: true
1000 |
1001 | /get-caller-file@2.0.5:
1002 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
1003 | engines: {node: 6.* || 8.* || >= 10.*}
1004 | dev: false
1005 |
1006 | /get-intrinsic@1.2.1:
1007 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
1008 | requiresBuild: true
1009 | dependencies:
1010 | function-bind: 1.1.1
1011 | has: 1.0.3
1012 | has-proto: 1.0.1
1013 | has-symbols: 1.0.3
1014 | dev: false
1015 | optional: true
1016 |
1017 | /get-stream@5.2.0:
1018 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
1019 | engines: {node: '>=8'}
1020 | dependencies:
1021 | pump: 3.0.0
1022 | dev: false
1023 |
1024 | /glob@7.2.3:
1025 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
1026 | dependencies:
1027 | fs.realpath: 1.0.0
1028 | inflight: 1.0.6
1029 | inherits: 2.0.4
1030 | minimatch: 3.1.2
1031 | once: 1.4.0
1032 | path-is-absolute: 1.0.1
1033 | dev: false
1034 |
1035 | /global-agent@3.0.0:
1036 | resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==}
1037 | engines: {node: '>=10.0'}
1038 | requiresBuild: true
1039 | dependencies:
1040 | boolean: 3.2.0
1041 | es6-error: 4.1.1
1042 | matcher: 3.0.0
1043 | roarr: 2.15.4
1044 | semver: 7.5.4
1045 | serialize-error: 7.0.1
1046 | dev: false
1047 | optional: true
1048 |
1049 | /globalthis@1.0.3:
1050 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
1051 | engines: {node: '>= 0.4'}
1052 | requiresBuild: true
1053 | dependencies:
1054 | define-properties: 1.2.0
1055 | dev: false
1056 | optional: true
1057 |
1058 | /got@11.8.6:
1059 | resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==}
1060 | engines: {node: '>=10.19.0'}
1061 | dependencies:
1062 | '@sindresorhus/is': 4.6.0
1063 | '@szmarczak/http-timer': 4.0.6
1064 | '@types/cacheable-request': 6.0.3
1065 | '@types/responselike': 1.0.0
1066 | cacheable-lookup: 5.0.4
1067 | cacheable-request: 7.0.4
1068 | decompress-response: 6.0.0
1069 | http2-wrapper: 1.0.3
1070 | lowercase-keys: 2.0.0
1071 | p-cancelable: 2.1.1
1072 | responselike: 2.0.1
1073 | dev: false
1074 |
1075 | /graceful-fs@4.2.11:
1076 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
1077 | dev: false
1078 |
1079 | /has-flag@4.0.0:
1080 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1081 | engines: {node: '>=8'}
1082 | dev: false
1083 |
1084 | /has-property-descriptors@1.0.0:
1085 | resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
1086 | requiresBuild: true
1087 | dependencies:
1088 | get-intrinsic: 1.2.1
1089 | dev: false
1090 | optional: true
1091 |
1092 | /has-proto@1.0.1:
1093 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
1094 | engines: {node: '>= 0.4'}
1095 | requiresBuild: true
1096 | dev: false
1097 | optional: true
1098 |
1099 | /has-symbols@1.0.3:
1100 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
1101 | engines: {node: '>= 0.4'}
1102 | requiresBuild: true
1103 | dev: false
1104 | optional: true
1105 |
1106 | /has@1.0.3:
1107 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
1108 | engines: {node: '>= 0.4.0'}
1109 | requiresBuild: true
1110 | dependencies:
1111 | function-bind: 1.1.1
1112 | dev: false
1113 | optional: true
1114 |
1115 | /hosted-git-info@4.1.0:
1116 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
1117 | engines: {node: '>=10'}
1118 | dependencies:
1119 | lru-cache: 6.0.0
1120 | dev: false
1121 |
1122 | /http-cache-semantics@4.1.1:
1123 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
1124 | dev: false
1125 |
1126 | /http-proxy-agent@5.0.0:
1127 | resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
1128 | engines: {node: '>= 6'}
1129 | dependencies:
1130 | '@tootallnate/once': 2.0.0
1131 | agent-base: 6.0.2
1132 | debug: 4.3.4
1133 | transitivePeerDependencies:
1134 | - supports-color
1135 | dev: false
1136 |
1137 | /http2-wrapper@1.0.3:
1138 | resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
1139 | engines: {node: '>=10.19.0'}
1140 | dependencies:
1141 | quick-lru: 5.1.1
1142 | resolve-alpn: 1.2.1
1143 | dev: false
1144 |
1145 | /https-proxy-agent@5.0.1:
1146 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
1147 | engines: {node: '>= 6'}
1148 | dependencies:
1149 | agent-base: 6.0.2
1150 | debug: 4.3.4
1151 | transitivePeerDependencies:
1152 | - supports-color
1153 | dev: false
1154 |
1155 | /iconv-corefoundation@1.1.7:
1156 | resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==}
1157 | engines: {node: ^8.11.2 || >=10}
1158 | os: [darwin]
1159 | requiresBuild: true
1160 | dependencies:
1161 | cli-truncate: 2.1.0
1162 | node-addon-api: 1.7.2
1163 | dev: false
1164 | optional: true
1165 |
1166 | /iconv-lite@0.6.3:
1167 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
1168 | engines: {node: '>=0.10.0'}
1169 | dependencies:
1170 | safer-buffer: 2.1.2
1171 | dev: false
1172 |
1173 | /ieee754@1.2.1:
1174 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
1175 | requiresBuild: true
1176 | dev: false
1177 |
1178 | /inflight@1.0.6:
1179 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1180 | dependencies:
1181 | once: 1.4.0
1182 | wrappy: 1.0.2
1183 | dev: false
1184 |
1185 | /inherits@2.0.4:
1186 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1187 | dev: false
1188 |
1189 | /is-ci@3.0.1:
1190 | resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
1191 | hasBin: true
1192 | dependencies:
1193 | ci-info: 3.8.0
1194 | dev: false
1195 |
1196 | /is-fullwidth-code-point@3.0.0:
1197 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
1198 | engines: {node: '>=8'}
1199 | dev: false
1200 |
1201 | /isarray@1.0.0:
1202 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
1203 | dev: false
1204 |
1205 | /isbinaryfile@4.0.10:
1206 | resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==}
1207 | engines: {node: '>= 8.0.0'}
1208 | dev: false
1209 |
1210 | /isbinaryfile@5.0.0:
1211 | resolution: {integrity: sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==}
1212 | engines: {node: '>= 14.0.0'}
1213 | dev: false
1214 |
1215 | /isexe@2.0.0:
1216 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1217 | dev: false
1218 |
1219 | /jake@10.8.7:
1220 | resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
1221 | engines: {node: '>=10'}
1222 | hasBin: true
1223 | dependencies:
1224 | async: 3.2.4
1225 | chalk: 4.1.2
1226 | filelist: 1.0.4
1227 | minimatch: 3.1.2
1228 | dev: false
1229 |
1230 | /jquery@3.7.1:
1231 | resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
1232 | dev: false
1233 |
1234 | /js-yaml@4.1.0:
1235 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1236 | hasBin: true
1237 | dependencies:
1238 | argparse: 2.0.1
1239 | dev: false
1240 |
1241 | /json-buffer@3.0.1:
1242 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1243 | dev: false
1244 |
1245 | /json-schema-traverse@0.4.1:
1246 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1247 | requiresBuild: true
1248 | dev: false
1249 |
1250 | /json-stringify-safe@5.0.1:
1251 | resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
1252 | requiresBuild: true
1253 | dev: false
1254 | optional: true
1255 |
1256 | /json5@2.2.3:
1257 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
1258 | engines: {node: '>=6'}
1259 | hasBin: true
1260 | dev: false
1261 |
1262 | /jsonfile@4.0.0:
1263 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
1264 | optionalDependencies:
1265 | graceful-fs: 4.2.11
1266 | dev: false
1267 |
1268 | /jsonfile@6.1.0:
1269 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
1270 | dependencies:
1271 | universalify: 2.0.0
1272 | optionalDependencies:
1273 | graceful-fs: 4.2.11
1274 | dev: false
1275 |
1276 | /keyv@4.5.3:
1277 | resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==}
1278 | dependencies:
1279 | json-buffer: 3.0.1
1280 | dev: false
1281 |
1282 | /lazy-val@1.0.5:
1283 | resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==}
1284 | dev: false
1285 |
1286 | /lazystream@1.0.1:
1287 | resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
1288 | engines: {node: '>= 0.6.3'}
1289 | dependencies:
1290 | readable-stream: 2.3.8
1291 | dev: false
1292 |
1293 | /lodash.defaults@4.2.0:
1294 | resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
1295 | dev: false
1296 |
1297 | /lodash.difference@4.5.0:
1298 | resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
1299 | dev: false
1300 |
1301 | /lodash.escaperegexp@4.1.2:
1302 | resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==}
1303 | dev: false
1304 |
1305 | /lodash.flatten@4.4.0:
1306 | resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
1307 | dev: false
1308 |
1309 | /lodash.isequal@4.5.0:
1310 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
1311 | dev: false
1312 |
1313 | /lodash.isplainobject@4.0.6:
1314 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
1315 | dev: false
1316 |
1317 | /lodash.union@4.6.0:
1318 | resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
1319 | dev: false
1320 |
1321 | /lodash@4.17.21:
1322 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
1323 | dev: false
1324 |
1325 | /lowercase-keys@2.0.0:
1326 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
1327 | engines: {node: '>=8'}
1328 | dev: false
1329 |
1330 | /lru-cache@6.0.0:
1331 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
1332 | engines: {node: '>=10'}
1333 | dependencies:
1334 | yallist: 4.0.0
1335 | dev: false
1336 |
1337 | /matcher@3.0.0:
1338 | resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
1339 | engines: {node: '>=10'}
1340 | requiresBuild: true
1341 | dependencies:
1342 | escape-string-regexp: 4.0.0
1343 | dev: false
1344 | optional: true
1345 |
1346 | /mime-db@1.52.0:
1347 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
1348 | engines: {node: '>= 0.6'}
1349 | dev: false
1350 |
1351 | /mime-types@2.1.35:
1352 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
1353 | engines: {node: '>= 0.6'}
1354 | dependencies:
1355 | mime-db: 1.52.0
1356 | dev: false
1357 |
1358 | /mime@2.6.0:
1359 | resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
1360 | engines: {node: '>=4.0.0'}
1361 | hasBin: true
1362 | dev: false
1363 |
1364 | /mimic-response@1.0.1:
1365 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
1366 | engines: {node: '>=4'}
1367 | dev: false
1368 |
1369 | /mimic-response@3.1.0:
1370 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
1371 | engines: {node: '>=10'}
1372 | dev: false
1373 |
1374 | /minimatch@3.1.2:
1375 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1376 | dependencies:
1377 | brace-expansion: 1.1.11
1378 | dev: false
1379 |
1380 | /minimatch@5.1.6:
1381 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
1382 | engines: {node: '>=10'}
1383 | dependencies:
1384 | brace-expansion: 2.0.1
1385 | dev: false
1386 |
1387 | /minimist@1.2.8:
1388 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
1389 | dev: false
1390 |
1391 | /minipass@3.3.6:
1392 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
1393 | engines: {node: '>=8'}
1394 | dependencies:
1395 | yallist: 4.0.0
1396 | dev: false
1397 |
1398 | /minipass@5.0.0:
1399 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
1400 | engines: {node: '>=8'}
1401 | dev: false
1402 |
1403 | /minizlib@2.1.2:
1404 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
1405 | engines: {node: '>= 8'}
1406 | dependencies:
1407 | minipass: 3.3.6
1408 | yallist: 4.0.0
1409 | dev: false
1410 |
1411 | /mkdirp@1.0.4:
1412 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
1413 | engines: {node: '>=10'}
1414 | hasBin: true
1415 | dev: false
1416 |
1417 | /ms@2.1.2:
1418 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1419 | dev: false
1420 |
1421 | /node-addon-api@1.7.2:
1422 | resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==}
1423 | requiresBuild: true
1424 | dev: false
1425 | optional: true
1426 |
1427 | /normalize-path@3.0.0:
1428 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1429 | engines: {node: '>=0.10.0'}
1430 | dev: false
1431 |
1432 | /normalize-url@6.1.0:
1433 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
1434 | engines: {node: '>=10'}
1435 | dev: false
1436 |
1437 | /object-keys@1.1.1:
1438 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
1439 | engines: {node: '>= 0.4'}
1440 | requiresBuild: true
1441 | dev: false
1442 | optional: true
1443 |
1444 | /once@1.4.0:
1445 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1446 | dependencies:
1447 | wrappy: 1.0.2
1448 | dev: false
1449 |
1450 | /p-cancelable@2.1.1:
1451 | resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
1452 | engines: {node: '>=8'}
1453 | dev: false
1454 |
1455 | /path-is-absolute@1.0.1:
1456 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1457 | engines: {node: '>=0.10.0'}
1458 | dev: false
1459 |
1460 | /path-key@3.1.1:
1461 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1462 | engines: {node: '>=8'}
1463 | dev: false
1464 |
1465 | /pend@1.2.0:
1466 | resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
1467 | dev: false
1468 |
1469 | /plist@3.1.0:
1470 | resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
1471 | engines: {node: '>=10.4.0'}
1472 | dependencies:
1473 | '@xmldom/xmldom': 0.8.10
1474 | base64-js: 1.5.1
1475 | xmlbuilder: 15.1.1
1476 | dev: false
1477 |
1478 | /process-nextick-args@2.0.1:
1479 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
1480 | dev: false
1481 |
1482 | /progress@2.0.3:
1483 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
1484 | engines: {node: '>=0.4.0'}
1485 | dev: false
1486 |
1487 | /promise-retry@2.0.1:
1488 | resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
1489 | engines: {node: '>=10'}
1490 | dependencies:
1491 | err-code: 2.0.3
1492 | retry: 0.12.0
1493 | dev: false
1494 |
1495 | /pump@3.0.0:
1496 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
1497 | dependencies:
1498 | end-of-stream: 1.4.4
1499 | once: 1.4.0
1500 | dev: false
1501 |
1502 | /punycode@2.3.0:
1503 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
1504 | engines: {node: '>=6'}
1505 | requiresBuild: true
1506 | dev: false
1507 |
1508 | /quick-lru@5.1.1:
1509 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
1510 | engines: {node: '>=10'}
1511 | dev: false
1512 |
1513 | /read-config-file@6.3.2:
1514 | resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==}
1515 | engines: {node: '>=12.0.0'}
1516 | dependencies:
1517 | config-file-ts: 0.2.4
1518 | dotenv: 9.0.2
1519 | dotenv-expand: 5.1.0
1520 | js-yaml: 4.1.0
1521 | json5: 2.2.3
1522 | lazy-val: 1.0.5
1523 | dev: false
1524 |
1525 | /readable-stream@2.3.8:
1526 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
1527 | dependencies:
1528 | core-util-is: 1.0.2
1529 | inherits: 2.0.4
1530 | isarray: 1.0.0
1531 | process-nextick-args: 2.0.1
1532 | safe-buffer: 5.1.2
1533 | string_decoder: 1.1.1
1534 | util-deprecate: 1.0.2
1535 | dev: false
1536 |
1537 | /readable-stream@3.6.2:
1538 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
1539 | engines: {node: '>= 6'}
1540 | dependencies:
1541 | inherits: 2.0.4
1542 | string_decoder: 1.3.0
1543 | util-deprecate: 1.0.2
1544 | dev: false
1545 |
1546 | /readdir-glob@1.1.3:
1547 | resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
1548 | dependencies:
1549 | minimatch: 5.1.6
1550 | dev: false
1551 |
1552 | /require-directory@2.1.1:
1553 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
1554 | engines: {node: '>=0.10.0'}
1555 | dev: false
1556 |
1557 | /resolve-alpn@1.2.1:
1558 | resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
1559 | dev: false
1560 |
1561 | /responselike@2.0.1:
1562 | resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==}
1563 | dependencies:
1564 | lowercase-keys: 2.0.0
1565 | dev: false
1566 |
1567 | /retry@0.12.0:
1568 | resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
1569 | engines: {node: '>= 4'}
1570 | dev: false
1571 |
1572 | /rimraf@3.0.2:
1573 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
1574 | hasBin: true
1575 | dependencies:
1576 | glob: 7.2.3
1577 | dev: false
1578 |
1579 | /roarr@2.15.4:
1580 | resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
1581 | engines: {node: '>=8.0'}
1582 | requiresBuild: true
1583 | dependencies:
1584 | boolean: 3.2.0
1585 | detect-node: 2.1.0
1586 | globalthis: 1.0.3
1587 | json-stringify-safe: 5.0.1
1588 | semver-compare: 1.0.0
1589 | sprintf-js: 1.1.2
1590 | dev: false
1591 | optional: true
1592 |
1593 | /safe-buffer@5.1.2:
1594 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
1595 | dev: false
1596 |
1597 | /safe-buffer@5.2.1:
1598 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
1599 | dev: false
1600 |
1601 | /safer-buffer@2.1.2:
1602 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
1603 | dev: false
1604 |
1605 | /sanitize-filename@1.6.3:
1606 | resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==}
1607 | dependencies:
1608 | truncate-utf8-bytes: 1.0.2
1609 | dev: false
1610 |
1611 | /sax@1.2.4:
1612 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
1613 | dev: false
1614 |
1615 | /semver-compare@1.0.0:
1616 | resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
1617 | requiresBuild: true
1618 | dev: false
1619 | optional: true
1620 |
1621 | /semver@6.3.1:
1622 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
1623 | hasBin: true
1624 | dev: false
1625 |
1626 | /semver@7.5.4:
1627 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
1628 | engines: {node: '>=10'}
1629 | hasBin: true
1630 | dependencies:
1631 | lru-cache: 6.0.0
1632 | dev: false
1633 |
1634 | /serialize-error@7.0.1:
1635 | resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==}
1636 | engines: {node: '>=10'}
1637 | requiresBuild: true
1638 | dependencies:
1639 | type-fest: 0.13.1
1640 | dev: false
1641 | optional: true
1642 |
1643 | /shebang-command@2.0.0:
1644 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1645 | engines: {node: '>=8'}
1646 | dependencies:
1647 | shebang-regex: 3.0.0
1648 | dev: false
1649 |
1650 | /shebang-regex@3.0.0:
1651 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1652 | engines: {node: '>=8'}
1653 | dev: false
1654 |
1655 | /simple-update-notifier@2.0.0:
1656 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==}
1657 | engines: {node: '>=10'}
1658 | dependencies:
1659 | semver: 7.5.4
1660 | dev: false
1661 |
1662 | /slice-ansi@3.0.0:
1663 | resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
1664 | engines: {node: '>=8'}
1665 | requiresBuild: true
1666 | dependencies:
1667 | ansi-styles: 4.3.0
1668 | astral-regex: 2.0.0
1669 | is-fullwidth-code-point: 3.0.0
1670 | dev: false
1671 | optional: true
1672 |
1673 | /smart-buffer@4.2.0:
1674 | resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
1675 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
1676 | requiresBuild: true
1677 | dev: false
1678 | optional: true
1679 |
1680 | /source-map-support@0.5.21:
1681 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
1682 | dependencies:
1683 | buffer-from: 1.1.2
1684 | source-map: 0.6.1
1685 | dev: false
1686 |
1687 | /source-map@0.6.1:
1688 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
1689 | engines: {node: '>=0.10.0'}
1690 | dev: false
1691 |
1692 | /sprintf-js@1.1.2:
1693 | resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==}
1694 | requiresBuild: true
1695 | dev: false
1696 | optional: true
1697 |
1698 | /stat-mode@1.0.0:
1699 | resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==}
1700 | engines: {node: '>= 6'}
1701 | dev: false
1702 |
1703 | /string-width@4.2.3:
1704 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
1705 | engines: {node: '>=8'}
1706 | dependencies:
1707 | emoji-regex: 8.0.0
1708 | is-fullwidth-code-point: 3.0.0
1709 | strip-ansi: 6.0.1
1710 | dev: false
1711 |
1712 | /string_decoder@1.1.1:
1713 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
1714 | dependencies:
1715 | safe-buffer: 5.1.2
1716 | dev: false
1717 |
1718 | /string_decoder@1.3.0:
1719 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
1720 | dependencies:
1721 | safe-buffer: 5.2.1
1722 | dev: false
1723 |
1724 | /strip-ansi@6.0.1:
1725 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1726 | engines: {node: '>=8'}
1727 | dependencies:
1728 | ansi-regex: 5.0.1
1729 | dev: false
1730 |
1731 | /sumchecker@3.0.1:
1732 | resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==}
1733 | engines: {node: '>= 8.0'}
1734 | dependencies:
1735 | debug: 4.3.4
1736 | transitivePeerDependencies:
1737 | - supports-color
1738 | dev: false
1739 |
1740 | /supports-color@7.2.0:
1741 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1742 | engines: {node: '>=8'}
1743 | dependencies:
1744 | has-flag: 4.0.0
1745 | dev: false
1746 |
1747 | /tar-stream@2.2.0:
1748 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
1749 | engines: {node: '>=6'}
1750 | dependencies:
1751 | bl: 4.1.0
1752 | end-of-stream: 1.4.4
1753 | fs-constants: 1.0.0
1754 | inherits: 2.0.4
1755 | readable-stream: 3.6.2
1756 | dev: false
1757 |
1758 | /tar@6.2.0:
1759 | resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==}
1760 | engines: {node: '>=10'}
1761 | dependencies:
1762 | chownr: 2.0.0
1763 | fs-minipass: 2.1.0
1764 | minipass: 5.0.0
1765 | minizlib: 2.1.2
1766 | mkdirp: 1.0.4
1767 | yallist: 4.0.0
1768 | dev: false
1769 |
1770 | /temp-file@3.4.0:
1771 | resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==}
1772 | dependencies:
1773 | async-exit-hook: 2.0.1
1774 | fs-extra: 10.1.0
1775 | dev: false
1776 |
1777 | /tiny-typed-emitter@2.1.0:
1778 | resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==}
1779 | dev: false
1780 |
1781 | /tmp-promise@3.0.3:
1782 | resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==}
1783 | dependencies:
1784 | tmp: 0.2.1
1785 | dev: false
1786 |
1787 | /tmp@0.2.1:
1788 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
1789 | engines: {node: '>=8.17.0'}
1790 | dependencies:
1791 | rimraf: 3.0.2
1792 | dev: false
1793 |
1794 | /truncate-utf8-bytes@1.0.2:
1795 | resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==}
1796 | dependencies:
1797 | utf8-byte-length: 1.0.4
1798 | dev: false
1799 |
1800 | /type-fest@0.13.1:
1801 | resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
1802 | engines: {node: '>=10'}
1803 | requiresBuild: true
1804 | dev: false
1805 | optional: true
1806 |
1807 | /typescript@4.9.5:
1808 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
1809 | engines: {node: '>=4.2.0'}
1810 | hasBin: true
1811 | dev: false
1812 |
1813 | /undici-types@5.26.5:
1814 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
1815 | dev: false
1816 |
1817 | /universalify@0.1.2:
1818 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
1819 | engines: {node: '>= 4.0.0'}
1820 | dev: false
1821 |
1822 | /universalify@2.0.0:
1823 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
1824 | engines: {node: '>= 10.0.0'}
1825 | dev: false
1826 |
1827 | /uri-js@4.4.1:
1828 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1829 | requiresBuild: true
1830 | dependencies:
1831 | punycode: 2.3.0
1832 | dev: false
1833 |
1834 | /utf8-byte-length@1.0.4:
1835 | resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==}
1836 | dev: false
1837 |
1838 | /util-deprecate@1.0.2:
1839 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1840 | dev: false
1841 |
1842 | /verror@1.10.1:
1843 | resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==}
1844 | engines: {node: '>=0.6.0'}
1845 | requiresBuild: true
1846 | dependencies:
1847 | assert-plus: 1.0.0
1848 | core-util-is: 1.0.2
1849 | extsprintf: 1.4.1
1850 | dev: false
1851 | optional: true
1852 |
1853 | /which@2.0.2:
1854 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1855 | engines: {node: '>= 8'}
1856 | hasBin: true
1857 | dependencies:
1858 | isexe: 2.0.0
1859 | dev: false
1860 |
1861 | /wrap-ansi@7.0.0:
1862 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
1863 | engines: {node: '>=10'}
1864 | dependencies:
1865 | ansi-styles: 4.3.0
1866 | string-width: 4.2.3
1867 | strip-ansi: 6.0.1
1868 | dev: false
1869 |
1870 | /wrappy@1.0.2:
1871 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
1872 | dev: false
1873 |
1874 | /xmlbuilder@15.1.1:
1875 | resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}
1876 | engines: {node: '>=8.0'}
1877 | requiresBuild: true
1878 | dev: false
1879 |
1880 | /y18n@5.0.8:
1881 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
1882 | engines: {node: '>=10'}
1883 | dev: false
1884 |
1885 | /yallist@4.0.0:
1886 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
1887 | dev: false
1888 |
1889 | /yargs-parser@21.1.1:
1890 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
1891 | engines: {node: '>=12'}
1892 | dev: false
1893 |
1894 | /yargs@17.7.2:
1895 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
1896 | engines: {node: '>=12'}
1897 | dependencies:
1898 | cliui: 8.0.1
1899 | escalade: 3.1.1
1900 | get-caller-file: 2.0.5
1901 | require-directory: 2.1.1
1902 | string-width: 4.2.3
1903 | y18n: 5.0.8
1904 | yargs-parser: 21.1.1
1905 | dev: false
1906 |
1907 | /yauzl@2.10.0:
1908 | resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
1909 | dependencies:
1910 | buffer-crc32: 0.2.13
1911 | fd-slicer: 1.1.0
1912 | dev: false
1913 |
1914 | /zip-stream@4.1.1:
1915 | resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
1916 | engines: {node: '>= 10'}
1917 | dependencies:
1918 | archiver-utils: 3.0.4
1919 | compress-commons: 4.1.2
1920 | readable-stream: 3.6.2
1921 | dev: false
1922 |
1923 | github.com/aterrien/jQuery-Knob/755309e933d326ffaa5a2d758dc377147b766515:
1924 | resolution: {tarball: https://codeload.github.com/aterrien/jQuery-Knob/tar.gz/755309e933d326ffaa5a2d758dc377147b766515}
1925 | name: jquery-knob
1926 | version: 1.2.13
1927 | dev: false
1928 |
--------------------------------------------------------------------------------
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
1 | packages:
2 | - 'app'
--------------------------------------------------------------------------------
/publish-linux.sh:
--------------------------------------------------------------------------------
1 | #!/bin/zsh
2 |
3 | # For building a linux AppImage
4 |
5 | docker run --rm -ti \
6 | --env-file .env \
7 | --env ELECTRON_CACHE="/root/.cache/electron" \
8 | --env ELECTRON_BUILDER_CACHE="/root/.cache/electron-builder" \
9 | -v ${PWD}:/project \
10 | -v ${PWD##*/}-node-modules:/project/node_modules \
11 | -v ~/.cache/electron:/root/.cache/electron \
12 | -v ~/.cache/electron-builder:/root/.cache/electron-builder \
13 | electronuserland/builder \
14 | pnpm install && pnpm dist
15 | pnpx electron-builder --publish onTagOrDraft
16 |
--------------------------------------------------------------------------------
/publish-macos.sh:
--------------------------------------------------------------------------------
1 | #!/bin/zsh
2 |
3 | # For building a macOS app
4 |
5 | pnpx env-cmd pnpx electron-builder --publish onTagOrDraft
6 |
--------------------------------------------------------------------------------
/publish.sh:
--------------------------------------------------------------------------------
1 | #!/bin/zsh
2 |
3 | echo '1. Bump version in BOTH package.json files'
4 | echo '2. Commit, Tag, and Push the changes up to GitHub'
5 | echo '3. Create a tag and a draft release in GitHub'
6 | echo '4. Run the publish scripts:'
7 | echo ' ./publish-macos.sh'
8 | echo ' ./publish-linux.sh'
9 | echo '5. Publish the release'
10 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cold-logic/heos-controller/bb0e4ee85abdc0f82447bd59ac55d576ce140ac4/screenshot.png
--------------------------------------------------------------------------------