mirror of
https://github.com/morten-olsen/mini-loader.git
synced 2026-02-08 01:36:26 +01:00
feat: support multiple contexts
This commit is contained in:
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -21,7 +22,8 @@ list
|
|||||||
.option('-a, --limit <limit>', 'Limit', '1000')
|
.option('-a, --limit <limit>', 'Limit', '1000')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, offset, limit } = list.opts();
|
const { runId, loadId, offset, limit } = list.opts();
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { step } from '../../utils/step.js';
|
|||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { dirname, resolve } from 'path';
|
import { dirname, resolve } from 'path';
|
||||||
import { mkdir, writeFile } from 'fs/promises';
|
import { mkdir, writeFile } from 'fs/promises';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const pull = new Command('pull');
|
const pull = new Command('pull');
|
||||||
|
|
||||||
@@ -12,7 +13,8 @@ pull
|
|||||||
.argument('<artifact-id>', 'Artifact ID')
|
.argument('<artifact-id>', 'Artifact ID')
|
||||||
.argument('<file>', 'File to save')
|
.argument('<file>', 'File to save')
|
||||||
.action(async (id, file) => {
|
.action(async (id, file) => {
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const target = resolve(file);
|
const target = resolve(file);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { createClient } from '../../client/client.js';
|
|||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import inquirer from 'inquirer';
|
import inquirer from 'inquirer';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const remove = new Command('remove');
|
const remove = new Command('remove');
|
||||||
|
|
||||||
@@ -22,7 +23,8 @@ remove
|
|||||||
.option('-a, --limit <limit>', 'Limit', '1000')
|
.option('-a, --limit <limit>', 'Limit', '1000')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, offset, limit } = remove.opts();
|
const { runId, loadId, offset, limit } = remove.opts();
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,12 +2,14 @@ import { Command } from 'commander';
|
|||||||
import inquerer from 'inquirer';
|
import inquerer from 'inquirer';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const login = new Command('login');
|
const login = new Command('login');
|
||||||
|
|
||||||
login.description('Login to your account');
|
login.description('Login to your account');
|
||||||
login.action(async () => {
|
login.action(async () => {
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const { host, token } = await inquerer.prompt([
|
const { host, token } = await inquerer.prompt([
|
||||||
{
|
{
|
||||||
type: 'input',
|
type: 'input',
|
||||||
|
|||||||
10
packages/cli/src/commands/contexts/contexts.current.ts
Normal file
10
packages/cli/src/commands/contexts/contexts.current.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { Command } from 'commander';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
|
const current = new Command('current');
|
||||||
|
current.action(async () => {
|
||||||
|
const config = new Config();
|
||||||
|
console.log(config.context);
|
||||||
|
});
|
||||||
|
|
||||||
|
export { current };
|
||||||
11
packages/cli/src/commands/contexts/contexts.list.ts
Normal file
11
packages/cli/src/commands/contexts/contexts.list.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { Command } from 'commander';
|
||||||
|
import { Context } from '../../context/context.js';
|
||||||
|
|
||||||
|
const list = new Command('list');
|
||||||
|
list.alias('ls').description('List contexts');
|
||||||
|
list.action(async () => {
|
||||||
|
const contexts = await Context.list();
|
||||||
|
console.table(contexts);
|
||||||
|
});
|
||||||
|
|
||||||
|
export { list };
|
||||||
12
packages/cli/src/commands/contexts/contexts.ts
Normal file
12
packages/cli/src/commands/contexts/contexts.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { Command } from 'commander';
|
||||||
|
import { list } from './contexts.list.js';
|
||||||
|
import { use } from './contexts.use.js';
|
||||||
|
import { current } from './contexts.current.js';
|
||||||
|
|
||||||
|
const contexts = new Command('contexts');
|
||||||
|
contexts.description('Manage contexts');
|
||||||
|
contexts.addCommand(list);
|
||||||
|
contexts.addCommand(use);
|
||||||
|
contexts.addCommand(current);
|
||||||
|
|
||||||
|
export { contexts };
|
||||||
11
packages/cli/src/commands/contexts/contexts.use.ts
Normal file
11
packages/cli/src/commands/contexts/contexts.use.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { Command } from 'commander';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
|
const use = new Command('use');
|
||||||
|
|
||||||
|
use.argument('<name>').action(async (name) => {
|
||||||
|
const config = new Config();
|
||||||
|
await config.setContext(name);
|
||||||
|
});
|
||||||
|
|
||||||
|
export { use };
|
||||||
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -9,7 +10,8 @@ list
|
|||||||
.alias('ls')
|
.alias('ls')
|
||||||
.description('List loads')
|
.description('List loads')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { createClient } from '../../client/client.js';
|
|||||||
import { bundle } from '../../bundler/bundler.js';
|
import { bundle } from '../../bundler/bundler.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const push = new Command('push');
|
const push = new Command('push');
|
||||||
|
|
||||||
@@ -15,7 +16,8 @@ push
|
|||||||
.option('-ai, --auto-install', 'Auto install dependencies', false)
|
.option('-ai, --auto-install', 'Auto install dependencies', false)
|
||||||
.action(async (script) => {
|
.action(async (script) => {
|
||||||
const opts = push.opts();
|
const opts = push.opts();
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const location = resolve(script);
|
const location = resolve(script);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -23,7 +24,8 @@ list
|
|||||||
.option('-s, --sort <order>', 'Sort', 'desc')
|
.option('-s, --sort <order>', 'Sort', 'desc')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, severities, offset, limit, order } = list.opts();
|
const { runId, loadId, severities, offset, limit, order } = list.opts();
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { createClient } from '../../client/client.js';
|
|||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
import inquirer from 'inquirer';
|
import inquirer from 'inquirer';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const remove = new Command('remove');
|
const remove = new Command('remove');
|
||||||
|
|
||||||
@@ -24,7 +25,8 @@ remove
|
|||||||
.option('-s, --sort <order>', 'Sort', 'desc')
|
.option('-s, --sort <order>', 'Sort', 'desc')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { runId, loadId, severities, offset, limit, order } = remove.opts();
|
const { runId, loadId, severities, offset, limit, order } = remove.opts();
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const create = new Command('create');
|
const create = new Command('create');
|
||||||
|
|
||||||
@@ -9,7 +10,8 @@ create
|
|||||||
.description('Create a new run')
|
.description('Create a new run')
|
||||||
.argument('load-id', 'Load ID')
|
.argument('load-id', 'Load ID')
|
||||||
.action(async (loadId) => {
|
.action(async (loadId) => {
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -10,7 +11,8 @@ list
|
|||||||
.description('Find a run')
|
.description('Find a run')
|
||||||
.argument('[load-id]', 'Load ID')
|
.argument('[load-id]', 'Load ID')
|
||||||
.action(async (loadId) => {
|
.action(async (loadId) => {
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const list = new Command('list');
|
const list = new Command('list');
|
||||||
|
|
||||||
@@ -19,7 +20,8 @@ list
|
|||||||
.option('-a, --limit <limit>', 'Limit', '1000')
|
.option('-a, --limit <limit>', 'Limit', '1000')
|
||||||
.action(async () => {
|
.action(async () => {
|
||||||
const { offset, limit } = list.opts();
|
const { offset, limit } = list.opts();
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const remove = new Command('remove');
|
const remove = new Command('remove');
|
||||||
|
|
||||||
@@ -9,7 +10,8 @@ remove
|
|||||||
.alias('rm')
|
.alias('rm')
|
||||||
.argument('<id>')
|
.argument('<id>')
|
||||||
.action(async (id) => {
|
.action(async (id) => {
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Command } from 'commander';
|
|||||||
import { createClient } from '../../client/client.js';
|
import { createClient } from '../../client/client.js';
|
||||||
import { step } from '../../utils/step.js';
|
import { step } from '../../utils/step.js';
|
||||||
import { Context } from '../../context/context.js';
|
import { Context } from '../../context/context.js';
|
||||||
|
import { Config } from '../../config/config.js';
|
||||||
|
|
||||||
const set = new Command('set');
|
const set = new Command('set');
|
||||||
|
|
||||||
@@ -9,7 +10,8 @@ set
|
|||||||
.argument('<id>')
|
.argument('<id>')
|
||||||
.argument('[value]')
|
.argument('[value]')
|
||||||
.action(async (id, value) => {
|
.action(async (id, value) => {
|
||||||
const context = new Context();
|
const config = new Config();
|
||||||
|
const context = new Context(config.context);
|
||||||
const client = await step('Connecting to server', async () => {
|
const client = await step('Connecting to server', async () => {
|
||||||
return createClient(context);
|
return createClient(context);
|
||||||
});
|
});
|
||||||
|
|||||||
44
packages/cli/src/config/config.ts
Normal file
44
packages/cli/src/config/config.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import envPaths from 'env-paths';
|
||||||
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
||||||
|
import { mkdir } from 'fs/promises';
|
||||||
|
import { join, dirname } from 'path';
|
||||||
|
|
||||||
|
type ConfigValues = {
|
||||||
|
context?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Config {
|
||||||
|
#location: string;
|
||||||
|
#config?: ConfigValues;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
const paths = envPaths('mini-loader');
|
||||||
|
this.#location = join(paths.config, 'config.json');
|
||||||
|
if (existsSync(this.#location)) {
|
||||||
|
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get context() {
|
||||||
|
return this.#config?.context || 'default';
|
||||||
|
}
|
||||||
|
|
||||||
|
public setContext = (context: string) => {
|
||||||
|
this.#config = {
|
||||||
|
...(this.#config || {}),
|
||||||
|
context,
|
||||||
|
};
|
||||||
|
this.save();
|
||||||
|
};
|
||||||
|
|
||||||
|
public save = async () => {
|
||||||
|
if (!this.#config) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const json = JSON.stringify(this.#config);
|
||||||
|
mkdir(dirname(this.#location), { recursive: true });
|
||||||
|
writeFileSync(this.#location, json);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export { Config };
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import envPaths from 'env-paths';
|
import envPaths from 'env-paths';
|
||||||
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
||||||
import { mkdir } from 'fs/promises';
|
import { mkdir, readdir } from 'fs/promises';
|
||||||
import { dirname } from 'path';
|
import { dirname, join } from 'path';
|
||||||
|
|
||||||
type ContextValues = {
|
type ContextValues = {
|
||||||
host: string;
|
host: string;
|
||||||
@@ -12,9 +12,9 @@ class Context {
|
|||||||
#location: string;
|
#location: string;
|
||||||
#config?: ContextValues;
|
#config?: ContextValues;
|
||||||
|
|
||||||
constructor() {
|
constructor(name: string) {
|
||||||
const paths = envPaths('dws');
|
const paths = envPaths('mini-loader');
|
||||||
this.#location = paths.config;
|
this.#location = join(paths.config, 'contexts', name);
|
||||||
if (existsSync(this.#location)) {
|
if (existsSync(this.#location)) {
|
||||||
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
|
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
|
||||||
}
|
}
|
||||||
@@ -45,6 +45,15 @@ class Context {
|
|||||||
mkdir(dirname(this.#location), { recursive: true });
|
mkdir(dirname(this.#location), { recursive: true });
|
||||||
writeFileSync(this.#location, json);
|
writeFileSync(this.#location, json);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static list = async () => {
|
||||||
|
const paths = envPaths('mini-loader');
|
||||||
|
const location = join(paths.config, 'contexts');
|
||||||
|
if (!existsSync(location)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return await readdir(location);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Context };
|
export { Context };
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { artifacts } from './commands/artifacts/artifacts.js';
|
|||||||
import { secrets } from './commands/secrets/secrets.js';
|
import { secrets } from './commands/secrets/secrets.js';
|
||||||
import { local } from './commands/local/local.js';
|
import { local } from './commands/local/local.js';
|
||||||
import { auth } from './commands/auth/auth.js';
|
import { auth } from './commands/auth/auth.js';
|
||||||
|
import { contexts } from './commands/contexts/contexts.js';
|
||||||
|
|
||||||
program.addCommand(loads);
|
program.addCommand(loads);
|
||||||
program.addCommand(runs);
|
program.addCommand(runs);
|
||||||
@@ -14,5 +15,6 @@ program.addCommand(artifacts);
|
|||||||
program.addCommand(secrets);
|
program.addCommand(secrets);
|
||||||
program.addCommand(local);
|
program.addCommand(local);
|
||||||
program.addCommand(auth);
|
program.addCommand(auth);
|
||||||
|
program.addCommand(contexts);
|
||||||
|
|
||||||
await program.parseAsync();
|
await program.parseAsync();
|
||||||
|
|||||||
Reference in New Issue
Block a user