mirror of
https://github.com/onyx-and-iris/meld-cli.git
synced 2025-07-12 02:11:46 +00:00
add some colour
satisfy the linter
This commit is contained in:
parent
7ec73f8253
commit
a97019b521
401
index.js
401
index.js
@ -1,306 +1,301 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
import cli from "./utils/cli.js";
|
import { QWebChannel } from 'qwebchannel'
|
||||||
import { sceneHelp, sceneList, sceneSwitch, sceneCurrent } from "./utils/scene.js";
|
import WebSocket from 'ws'
|
||||||
import { audioHelp, audioMute, audioUnmute, audioToggle, audioStatus } from "./utils/audio.js";
|
|
||||||
import { streamHelp, streamStart, streamStop, streamStatus } from "./utils/stream.js";
|
|
||||||
import { recordHelp, recordStart, recordStop, recordStatus } from "./utils/record.js";
|
|
||||||
import { QWebChannel } from "qwebchannel";
|
|
||||||
|
|
||||||
|
import cli from './utils/cli.js'
|
||||||
|
import { sceneHelp, sceneList, sceneSwitch, sceneCurrent } from './utils/scene.js'
|
||||||
|
import { audioHelp, audioMute, audioUnmute, audioToggle, audioStatus } from './utils/audio.js'
|
||||||
|
import { streamHelp, streamStart, streamStop, streamStatus } from './utils/stream.js'
|
||||||
|
import { recordHelp, recordStart, recordStop, recordStatus } from './utils/record.js'
|
||||||
|
|
||||||
const address = process.env.MELD_CLI_HOST || "localhost";
|
const address = process.env.MELD_CLI_HOST || 'localhost'
|
||||||
const port = process.env.MELD_CLI_PORT || 13376;
|
const port = process.env.MELD_CLI_PORT || 13376
|
||||||
|
|
||||||
const input = cli.input;
|
const input = cli.input
|
||||||
const flags = cli.flags;
|
const flags = cli.flags
|
||||||
|
|
||||||
var socket = new WebSocket(`ws://${address}:${port}`);
|
const socket = new WebSocket(`ws://${address}:${port}`)
|
||||||
|
|
||||||
|
socket.onopen = function () {
|
||||||
socket.onopen = function() {
|
|
||||||
let channel;
|
|
||||||
(() => {
|
(() => {
|
||||||
|
let channel
|
||||||
try {
|
try {
|
||||||
if (input[0] === "scene") {
|
if (input[0] === 'scene') {
|
||||||
if (flags.help) {
|
if (flags.help) {
|
||||||
console.log(sceneHelp);
|
console.log(sceneHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
const sceneCommand = input[1];
|
const sceneCommand = input[1]
|
||||||
|
const sceneArguments = input.slice(2)
|
||||||
switch (sceneCommand) {
|
switch (sceneCommand) {
|
||||||
case "list":
|
case 'list':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
sceneList(channel)
|
sceneList(channel)
|
||||||
.then((scenes) => {
|
.then((scenes) => {
|
||||||
console.log("Available scenes:");
|
console.log(scenes)
|
||||||
scenes.forEach(scene => {
|
socket.close()
|
||||||
console.log(`- ${scene.name} (ID: ${scene.id})`);
|
process.exit(0)
|
||||||
});
|
|
||||||
socket.close();
|
|
||||||
process.exit(0);
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
break;
|
break
|
||||||
case "switch":
|
case 'switch':
|
||||||
const sceneName = input[2];
|
if (!sceneArguments[0]) {
|
||||||
if (!sceneName) {
|
console.error('Error: Scene name is required for the switch command.')
|
||||||
console.error("Error: Scene name is required for the switch command.");
|
process.exit(1)
|
||||||
process.exit(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
sceneSwitch(channel, sceneName)
|
sceneSwitch(channel, sceneArguments[0])
|
||||||
.then(() => {
|
.then((message) => {
|
||||||
socket.close();
|
console.log(message)
|
||||||
process.exit(0);
|
socket.close()
|
||||||
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
case "current":
|
case 'current':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
sceneCurrent(channel)
|
sceneCurrent(channel)
|
||||||
.then((currentScene) => {
|
.then((message) => {
|
||||||
if (currentScene) {
|
console.log(message)
|
||||||
console.log(`Current scene: ${currentScene.name} (ID: ${currentScene.id})`);
|
socket.close()
|
||||||
} else {
|
process.exit(0)
|
||||||
console.log("No current scene found.");
|
|
||||||
}
|
|
||||||
socket.close();
|
|
||||||
process.exit(0);
|
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
default:
|
default:
|
||||||
console.log(sceneHelp);
|
console.log(sceneHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
} else if (input[0] === "audio") {
|
} else if (input[0] === 'audio') {
|
||||||
if (flags.help) {
|
if (flags.help) {
|
||||||
console.log(audioHelp);
|
console.log(audioHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
const audioCommand = input[1];
|
const audioCommand = input[1]
|
||||||
const audioName = input[2];
|
const audioName = input[2]
|
||||||
switch (audioCommand) {
|
switch (audioCommand) {
|
||||||
case "mute":
|
case 'mute':
|
||||||
if (!audioName) {
|
if (!audioName) {
|
||||||
console.error("Error: Audio name is required for the mute command.");
|
console.error('Error: Audio name is required for the mute command.')
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
audioMute(channel, audioName)
|
audioMute(channel, audioName)
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
console.log(message);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
case "unmute":
|
case 'unmute':
|
||||||
if (!audioName) {
|
if (!audioName) {
|
||||||
console.error("Error: Audio name is required for the mute command.");
|
console.error('Error: Audio name is required for the unmute command.')
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
audioUnmute(channel, audioName)
|
audioUnmute(channel, audioName)
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
console.log(message);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
case "toggle":
|
case 'toggle':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
audioToggle(channel, audioName)
|
audioToggle(channel, audioName)
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
console.log(message);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
case "status":
|
case 'status':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
audioStatus(channel, audioName)
|
audioStatus(channel, audioName)
|
||||||
.then((status) => {
|
.then((message) => {
|
||||||
console.log(`${audioName} is ${status ? "muted" : "unmuted"}`);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`Error fetching audio status: ${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
default:
|
default:
|
||||||
console.log(audioHelp);
|
console.log(audioHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
} else if (input[0] === "stream") {
|
} else if (input[0] === 'stream') {
|
||||||
if (flags.help) {
|
if (flags.help) {
|
||||||
console.log(streamHelp);
|
console.log(streamHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
const streamCommand = input[1];
|
const streamCommand = input[1]
|
||||||
switch (streamCommand) {
|
switch (streamCommand) {
|
||||||
case "start":
|
case 'start':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
streamStart(channel)
|
streamStart(channel)
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
console.log(message);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
case "stop":
|
case 'stop':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
streamStop(channel)
|
streamStop(channel)
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
console.log(message);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
break;
|
break
|
||||||
case "status":
|
case 'status':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
streamStatus(channel)
|
streamStatus(channel)
|
||||||
.then((isStreaming) => {
|
.then((message) => {
|
||||||
console.log(`Streaming is currently ${isStreaming ? "active" : "inactive"}`);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`Error fetching stream status: ${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
default:
|
default:
|
||||||
console.log(streamHelp);
|
console.log(streamHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
} else if (input[0] === "record") {
|
} else if (input[0] === 'record') {
|
||||||
if (flags.help) {
|
if (flags.help) {
|
||||||
console.log(recordHelp);
|
console.log(recordHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
const recordCommand = input[1];
|
const recordCommand = input[1]
|
||||||
switch (recordCommand) {
|
switch (recordCommand) {
|
||||||
case "start":
|
case 'start':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
recordStart(channel)
|
recordStart(channel)
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
console.log(message);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
case "stop":
|
case 'stop':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
recordStop(channel)
|
recordStop(channel)
|
||||||
.then((message) => {
|
.then((message) => {
|
||||||
console.log(message);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
case "status":
|
case 'status':
|
||||||
channel = new QWebChannel(socket, function (channel) {
|
channel = new QWebChannel(socket, function (channel) {
|
||||||
recordStatus(channel)
|
recordStatus(channel)
|
||||||
.then((isRecording) => {
|
.then((message) => {
|
||||||
console.log(`Recording is currently ${isRecording ? "active" : "inactive"}`);
|
console.log(message)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(`Error fetching recording status: ${err}`);
|
console.error(`${err}`)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(1);
|
process.exit(1)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
return;
|
break
|
||||||
default:
|
default:
|
||||||
console.log(recordHelp);
|
console.log(recordHelp)
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log("Unknown command. Use --help for available commands.");
|
console.log('Unknown command. Use meld-cli --help for available commands.')
|
||||||
socket.close();
|
socket.close()
|
||||||
process.exit(0);
|
process.exit(0)
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error handling CLI flags:", error);
|
console.error('Error handling CLI flags:', error)
|
||||||
}
|
}
|
||||||
})();
|
})()
|
||||||
};
|
}
|
||||||
|
4072
package-lock.json
generated
4072
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -26,8 +26,14 @@
|
|||||||
"meld-cli": "index.js"
|
"meld-cli": "index.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"cli-color": "^2.0.4",
|
||||||
"cli-meow-help": "^4.0.0",
|
"cli-meow-help": "^4.0.0",
|
||||||
|
"cli-table3": "^0.6.5",
|
||||||
"meow": "^13.2.0",
|
"meow": "^13.2.0",
|
||||||
"qwebchannel": "^6.2.0"
|
"qwebchannel": "^6.2.0",
|
||||||
|
"ws": "^8.18.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"standard": "^17.1.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
152
utils/audio.js
152
utils/audio.js
@ -1,150 +1,158 @@
|
|||||||
import meowHelp from "cli-meow-help";
|
import meowHelp from 'cli-meow-help'
|
||||||
|
|
||||||
|
import { highlight, error } from './style.js'
|
||||||
|
|
||||||
const commands = {
|
const commands = {
|
||||||
mute: {
|
mute: {
|
||||||
desc: "Mute the audio",
|
desc: 'Mute the audio'
|
||||||
},
|
},
|
||||||
unmute: {
|
unmute: {
|
||||||
desc: "Unmute the audio",
|
desc: 'Unmute the audio'
|
||||||
},
|
},
|
||||||
toggle: {
|
toggle: {
|
||||||
desc: "Toggle audio mute state",
|
desc: 'Toggle audio mute state'
|
||||||
},
|
},
|
||||||
status: {
|
status: {
|
||||||
desc: "Show current audio status",
|
desc: 'Show current audio status'
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const flags = {
|
const flags = {
|
||||||
help: {
|
help: {
|
||||||
type: "boolean",
|
type: 'boolean',
|
||||||
shortFlag: "h",
|
shortFlag: 'h',
|
||||||
desc: "Display help information"
|
desc: 'Display help information'
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
const audioHelp = meowHelp({
|
const audioHelp = meowHelp({
|
||||||
name: "meld-cli audio",
|
name: 'meld-cli audio',
|
||||||
flags,
|
flags,
|
||||||
commands,
|
commands,
|
||||||
description: "Manage audio settings in Meld",
|
description: 'Manage audio settings in Meld',
|
||||||
defaults: false,
|
defaults: false
|
||||||
});
|
})
|
||||||
|
|
||||||
function audioMute(channel, audioName) {
|
function audioMute (channel, audioName) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error(error('Meld object not found in channel.')))
|
||||||
}
|
}
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
let itemId;
|
let itemId
|
||||||
let isMuted;
|
let isMuted
|
||||||
for (const [key, value] of Object.entries(meld.session.items)) {
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
||||||
if (value.type === "track" && value.name === audioName) {
|
if (value.type === 'track' && value.name === audioName) {
|
||||||
itemId = key;
|
itemId = key
|
||||||
isMuted = value.muted;
|
isMuted = value.muted
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!itemId) {
|
if (!itemId) {
|
||||||
return Promise.reject(new Error(`No audio device with name ${audioName} found.`));
|
return Promise.reject(new Error(`No audio device with name ${audioName} found.`))
|
||||||
}
|
}
|
||||||
if (isMuted) {
|
if (isMuted) {
|
||||||
return Promise.resolve(`Audio track ${audioName} is already muted.`);
|
return Promise.resolve(`Audio track ${highlight(audioName)} is already muted.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.toggleMute(itemId)
|
meld.toggleMute(itemId)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
resolve(`Audio track ${audioName} has been muted.`);
|
resolve(`Audio track ${highlight(audioName)} has been muted.`)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
reject(new Error(`Error muting audio track: ${err}`));
|
reject(new Error(`Error muting audio track: ${err}`))
|
||||||
});
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function audioUnmute(channel, audioName) {
|
function audioUnmute (channel, audioName) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
let itemId;
|
let itemId
|
||||||
let isMuted;
|
let isMuted
|
||||||
for (const [key, value] of Object.entries(meld.session.items)) {
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
||||||
if (value.type === "track" && value.name === audioName) {
|
if (value.type === 'track' && value.name === audioName) {
|
||||||
itemId = key;
|
itemId = key
|
||||||
isMuted = value.muted;
|
isMuted = value.muted
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!itemId) {
|
if (!itemId) {
|
||||||
return Promise.reject(new Error("No audio track found."));
|
return Promise.reject(new Error('No audio track found.'))
|
||||||
}
|
}
|
||||||
if (!isMuted) {
|
if (!isMuted) {
|
||||||
return Promise.resolve(`Audio track ${audioName} is already unmuted.`);
|
return Promise.resolve(`Audio track ${audioName} is already unmuted.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.toggleMute(itemId)
|
meld.toggleMute(itemId)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
resolve(`Audio track ${audioName} has been unmuted.`);
|
resolve(`Audio track ${audioName} has been unmuted.`)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
reject(new Error(`Error unmuting audio track: ${err}`));
|
reject(new Error(`Error unmuting audio track: ${err}`))
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function audioToggle(channel, audioName) {
|
function audioToggle (channel, audioName) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
let itemId;
|
let itemId
|
||||||
let isMuted;
|
let isMuted
|
||||||
for (const [key, value] of Object.entries(meld.session.items)) {
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
||||||
if (value.type === "track" && value.name === audioName) {
|
if (value.type === 'track' && value.name === audioName) {
|
||||||
itemId = key;
|
itemId = key
|
||||||
isMuted = value.muted;
|
isMuted = value.muted
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!itemId) {
|
if (!itemId) {
|
||||||
return Promise.reject(new Error(`No audio device with name ${audioName} found.`));
|
return Promise.reject(new Error(`No audio device with name ${audioName} found.`))
|
||||||
}
|
}
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.toggleMute(itemId)
|
meld.toggleMute(itemId)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
const status = isMuted ? "unmuted" : "muted";
|
const status = isMuted ? 'unmuted' : 'muted'
|
||||||
resolve(`Audio track ${audioName} has been ${status}.`);
|
resolve(`Audio track ${audioName} has been ${status}.`)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
reject(new Error(`Error toggling audio track: ${err}`));
|
reject(new Error(`Error toggling audio track: ${err}`))
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function audioStatus(channel, audioName) {
|
function audioStatus (channel, audioName) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
let itemId;
|
let itemId
|
||||||
let isMuted;
|
let isMuted
|
||||||
for (const [key, value] of Object.entries(meld.session.items)) {
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
||||||
if (value.type === "track" && value.name === audioName) {
|
if (value.type === 'track' && value.name === audioName) {
|
||||||
itemId = key;
|
itemId = key
|
||||||
isMuted = value.muted;
|
isMuted = value.muted
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!itemId) {
|
if (!itemId) {
|
||||||
return Promise.reject(new Error(`No audio device with name ${audioName} found.`));
|
return Promise.reject(new Error(`No audio device with name ${audioName} found.`))
|
||||||
}
|
}
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
resolve(isMuted);
|
resolve(`${highlight(audioName)} is ${isMuted ? 'muted' : 'unmuted'}`)
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export { audioHelp, audioMute, audioUnmute, audioToggle, audioStatus }
|
export {
|
||||||
|
audioHelp,
|
||||||
|
audioMute,
|
||||||
|
audioUnmute,
|
||||||
|
audioToggle,
|
||||||
|
audioStatus
|
||||||
|
}
|
||||||
|
38
utils/cli.js
38
utils/cli.js
@ -1,43 +1,43 @@
|
|||||||
import meow from "meow";
|
import meow from 'meow'
|
||||||
import meowHelp from "cli-meow-help";
|
import meowHelp from 'cli-meow-help'
|
||||||
|
|
||||||
const commands = {
|
const commands = {
|
||||||
scene: {
|
scene: {
|
||||||
desc: "Manage scenes",
|
desc: 'Manage scenes'
|
||||||
},
|
},
|
||||||
audio: {
|
audio: {
|
||||||
desc: "Manage audio settings",
|
desc: 'Manage audio settings'
|
||||||
},
|
},
|
||||||
stream: {
|
stream: {
|
||||||
desc: "Manage streaming",
|
desc: 'Manage streaming'
|
||||||
},
|
},
|
||||||
record: {
|
record: {
|
||||||
desc: "Manage recording",
|
desc: 'Manage recording'
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
const flags = {
|
const flags = {
|
||||||
help: {
|
help: {
|
||||||
type: "boolean",
|
type: 'boolean',
|
||||||
shortFlag: "h",
|
shortFlag: 'h',
|
||||||
description: "Display help information"
|
description: 'Display help information'
|
||||||
},
|
},
|
||||||
version: {
|
version: {
|
||||||
type: "boolean",
|
type: 'boolean',
|
||||||
shortFlag: "v",
|
shortFlag: 'v',
|
||||||
description: "Display the version number"
|
description: 'Display the version number'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const helpText = meowHelp({
|
const helpText = meowHelp({
|
||||||
name: "meld-cli",
|
name: 'meld-cli',
|
||||||
flags,
|
flags,
|
||||||
commands,
|
commands,
|
||||||
description: "A command-line interface for managing scenes in Meld",
|
description: 'A command-line interface for managing scenes in Meld',
|
||||||
defaults: false,
|
defaults: false
|
||||||
});
|
})
|
||||||
|
|
||||||
export default meow(helpText, {
|
export default meow(helpText, {
|
||||||
importMeta: import.meta,
|
importMeta: import.meta,
|
||||||
flags,
|
flags
|
||||||
})
|
})
|
@ -1,82 +1,87 @@
|
|||||||
import meowHelp from "cli-meow-help";
|
import meowHelp from 'cli-meow-help'
|
||||||
|
|
||||||
const commands = {
|
const commands = {
|
||||||
start: {
|
start: {
|
||||||
desc: "Start streaming",
|
desc: 'Start streaming'
|
||||||
},
|
},
|
||||||
stop: {
|
stop: {
|
||||||
desc: "Stop streaming",
|
desc: 'Stop streaming'
|
||||||
},
|
},
|
||||||
status: {
|
status: {
|
||||||
desc: "Show the current streaming status",
|
desc: 'Show the current streaming status'
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
const flags = {
|
const flags = {
|
||||||
help: {
|
help: {
|
||||||
type: "boolean",
|
type: 'boolean',
|
||||||
shortFlag: "h",
|
shortFlag: 'h',
|
||||||
desc: "Display help information",
|
desc: 'Display help information'
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
const recordHelp = meowHelp({
|
const recordHelp = meowHelp({
|
||||||
name: "meld-cli record",
|
name: 'meld-cli record',
|
||||||
flags,
|
flags,
|
||||||
commands,
|
commands,
|
||||||
description: "Manage recording in Meld",
|
description: 'Manage recording in Meld',
|
||||||
defaults: false,
|
defaults: false
|
||||||
});
|
})
|
||||||
|
|
||||||
function recordStart(channel) {
|
function recordStart (channel) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
if (meld.isRecording) {
|
if (meld.isRecording) {
|
||||||
return Promise.reject(new Error("Recording is already active."));
|
return Promise.reject(new Error('Recording is already active.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.toggleRecord()
|
meld.toggleRecord()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
resolve("Recording started successfully.");
|
resolve('Recording started successfully.')
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
reject(err);
|
reject(err)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function recordStop(channel) {
|
function recordStop (channel) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
if (!meld.isRecording) {
|
if (!meld.isRecording) {
|
||||||
return Promise.reject(new Error("Recording is not currently active."));
|
return Promise.reject(new Error('Recording is not currently active.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.toggleRecord()
|
meld.toggleRecord()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
resolve("Recording stopped successfully.");
|
resolve('Recording stopped successfully.')
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
reject(err);
|
reject(err)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function recordStatus(channel) {
|
function recordStatus (channel) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
return Promise.resolve(meld.isRecording);
|
return Promise.resolve(`Recording is currently ${meld.isRecording ? 'active' : 'inactive'}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
export { recordHelp, recordStart, recordStop, recordStatus };
|
export {
|
||||||
|
recordHelp,
|
||||||
|
recordStart,
|
||||||
|
recordStop,
|
||||||
|
recordStatus
|
||||||
|
}
|
||||||
|
122
utils/scene.js
122
utils/scene.js
@ -1,90 +1,104 @@
|
|||||||
import meowHelp from "cli-meow-help";
|
import meowHelp from 'cli-meow-help'
|
||||||
|
import Table from 'cli-table3'
|
||||||
|
|
||||||
|
import { highlight, error, errorHighlight } from './style.js'
|
||||||
|
|
||||||
const commands = {
|
const commands = {
|
||||||
list: {
|
list: {
|
||||||
desc: "List all scenes",
|
desc: 'List all scenes'
|
||||||
},
|
},
|
||||||
switch: {
|
switch: {
|
||||||
desc: "Switch to a scene by name",
|
desc: 'Switch to a scene by name'
|
||||||
},
|
},
|
||||||
current: {
|
current: {
|
||||||
desc: "Show the current scene",
|
desc: 'Show the current scene'
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const flags = {
|
const flags = {
|
||||||
help: {
|
help: {
|
||||||
type: "boolean",
|
type: 'boolean',
|
||||||
shortFlag: "h",
|
shortFlag: 'h',
|
||||||
desc: "Display help information"
|
desc: 'Display help information'
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const sceneHelp = meowHelp({
|
|
||||||
name: "meld-cli scene",
|
|
||||||
flags,
|
|
||||||
commands,
|
|
||||||
description: "Manage scenes in Meld",
|
|
||||||
defaults: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
function sceneList(channel) {
|
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
|
||||||
const scenes = [];
|
|
||||||
for (const [key, value] of Object.entries(meld.session.items)) {
|
|
||||||
if (value.type === "scene") {
|
|
||||||
scenes.push({ name: value.name, id: key });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (scenes.length === 0) {
|
|
||||||
return Promise.reject(new Error("No scenes found."));
|
|
||||||
}
|
|
||||||
return Promise.resolve(scenes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function sceneSwitch(channel, sceneName) {
|
const sceneHelp = meowHelp({
|
||||||
|
name: 'meld-cli scene',
|
||||||
|
flags,
|
||||||
|
commands,
|
||||||
|
description: 'Manage scenes in Meld',
|
||||||
|
defaults: false
|
||||||
|
})
|
||||||
|
|
||||||
|
function sceneList (channel) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const table = new Table({
|
||||||
let itemId;
|
style: {
|
||||||
|
head: ['none'],
|
||||||
|
compact: true
|
||||||
|
},
|
||||||
|
head: [{ content: 'Scene Name', hAlign: 'center' }, { content: 'ID', hAlign: 'center' }]
|
||||||
|
})
|
||||||
|
|
||||||
|
const meld = channel.objects.meld
|
||||||
for (const [key, value] of Object.entries(meld.session.items)) {
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
||||||
if (value.type === "scene" && value.name === sceneName) {
|
if (value.type === 'scene') {
|
||||||
itemId = key;
|
table.push([highlight(value.name), highlight(key)])
|
||||||
break;
|
}
|
||||||
|
}
|
||||||
|
if (table.length === 0) {
|
||||||
|
return Promise.reject(new Error('No scenes found.'))
|
||||||
|
}
|
||||||
|
return Promise.resolve(table.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
function sceneSwitch (channel, sceneName) {
|
||||||
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
|
}
|
||||||
|
|
||||||
|
const meld = channel.objects.meld
|
||||||
|
let itemId
|
||||||
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
||||||
|
if (value.type === 'scene' && value.name === sceneName) {
|
||||||
|
itemId = key
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!itemId) {
|
if (!itemId) {
|
||||||
return Promise.reject(new Error(`Scene "${sceneName}" not found.`));
|
return Promise.reject(new Error(error(`No scene with name ${errorHighlight(sceneName)} found.`)))
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.showScene(itemId).then(() => {
|
meld.showScene(itemId).then(() => {
|
||||||
console.log(`Switched to scene: ${sceneName}`);
|
resolve(`Switched to scene: ${highlight(sceneName)}`)
|
||||||
resolve();
|
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
reject(err);
|
reject(err)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function sceneCurrent(channel) {
|
function sceneCurrent (channel) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
for (const [key, value] of Object.entries(meld.session.items)) {
|
for (const [key, value] of Object.entries(meld.session.items)) {
|
||||||
if (value.type === "scene" && value.current) {
|
if (value.type === 'scene' && value.current) {
|
||||||
return Promise.resolve({ name: value.name, id: key });
|
return Promise.resolve(`Current scene: ${highlight(value.name)} (ID: ${highlight(key)})`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Promise.reject(new Error("No current scene found."));
|
return Promise.reject(new Error('No current scene found.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
export { sceneHelp, sceneList, sceneSwitch, sceneCurrent };
|
export {
|
||||||
|
sceneHelp,
|
||||||
|
sceneList,
|
||||||
|
sceneSwitch,
|
||||||
|
sceneCurrent
|
||||||
|
}
|
||||||
|
@ -1,83 +1,87 @@
|
|||||||
import meowHelp from "cli-meow-help";
|
import meowHelp from 'cli-meow-help'
|
||||||
|
|
||||||
const commands = {
|
const commands = {
|
||||||
start: {
|
start: {
|
||||||
desc: "Start streaming",
|
desc: 'Start streaming'
|
||||||
},
|
},
|
||||||
stop: {
|
stop: {
|
||||||
desc: "Stop streaming",
|
desc: 'Stop streaming'
|
||||||
},
|
},
|
||||||
status: {
|
status: {
|
||||||
desc: "Show the current streaming status",
|
desc: 'Show the current streaming status'
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
const flags = {
|
const flags = {
|
||||||
help: {
|
help: {
|
||||||
type: "boolean",
|
type: 'boolean',
|
||||||
shortFlag: "h",
|
shortFlag: 'h',
|
||||||
desc: "Display help information",
|
desc: 'Display help information'
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
const streamHelp = meowHelp({
|
const streamHelp = meowHelp({
|
||||||
name: "meld-cli stream",
|
name: 'meld-cli stream',
|
||||||
flags,
|
flags,
|
||||||
commands,
|
commands,
|
||||||
description: "Manage streaming in Meld",
|
description: 'Manage streaming in Meld',
|
||||||
defaults: false,
|
defaults: false
|
||||||
});
|
})
|
||||||
|
|
||||||
function streamStart(channel) {
|
function streamStart (channel) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
if (meld.isStreaming) {
|
if (meld.isStreaming) {
|
||||||
return Promise.reject(new Error("Streaming is already active."));
|
return Promise.reject(new Error('Streaming is already active.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.toggleStream()
|
meld.toggleStream()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
resolve("Streaming started successfully.");
|
resolve('Streaming started successfully.')
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
reject(err);
|
reject(err)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function streamStop(channel) {
|
function streamStop (channel) {
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
if (!meld.isStreaming) {
|
if (!meld.isStreaming) {
|
||||||
return Promise.reject(new Error("Streaming is not currently active."));
|
return Promise.reject(new Error('Streaming is not currently active.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
meld.toggleStream()
|
meld.toggleStream()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
resolve("Streaming stopped successfully.");
|
resolve('Streaming stopped successfully.')
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
reject(err);
|
reject(err)
|
||||||
});
|
})
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function streamStatus (channel) {
|
||||||
function streamStatus(channel) {
|
|
||||||
if (!channel.objects || !channel.objects.meld) {
|
if (!channel.objects || !channel.objects.meld) {
|
||||||
return Promise.reject(new Error("Meld object not found in channel."));
|
return Promise.reject(new Error('Meld object not found in channel.'))
|
||||||
}
|
}
|
||||||
|
|
||||||
const meld = channel.objects.meld;
|
const meld = channel.objects.meld
|
||||||
return Promise.resolve(meld.isStreaming);
|
return Promise.resolve(`Streaming is currently ${meld.isStreaming ? 'active' : 'inactive'}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
export { streamHelp, streamStart, streamStop, streamStatus };
|
export {
|
||||||
|
streamStart,
|
||||||
|
streamStop,
|
||||||
|
streamStatus,
|
||||||
|
streamHelp
|
||||||
|
}
|
||||||
|
11
utils/style.js
Normal file
11
utils/style.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import clc from 'cli-color'
|
||||||
|
|
||||||
|
const highlight = clc.cyan
|
||||||
|
const error = clc.red.bold
|
||||||
|
const errorHighlight = clc.yellow.bold
|
||||||
|
|
||||||
|
export {
|
||||||
|
highlight,
|
||||||
|
error,
|
||||||
|
errorHighlight
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user