@aderis-erp/cli 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/{processing-logs.d.ts → access-groups.d.ts} +1 -1
- package/dist/commands/{access-groups 2.js → access-groups.js} +30 -18
- package/dist/commands/account-transactions.d.ts +41 -0
- package/dist/commands/account-transactions.js +1032 -0
- package/dist/commands/accounts.d.ts +40 -0
- package/dist/commands/accounts.js +1024 -0
- package/dist/commands/agent-runs.d.ts +39 -0
- package/dist/commands/agent-runs.js +1013 -0
- package/dist/commands/{pubsub.d.ts → async-endpoints-internal.d.ts} +1 -1
- package/dist/commands/{pubsub.js → async-endpoints-internal.js} +37 -25
- package/dist/commands/audit-log.d.ts +39 -0
- package/dist/commands/{processing-logs.js → audit-log.js} +42 -28
- package/dist/commands/auth/login.d.ts +14 -0
- package/dist/commands/auth/login.js +116 -0
- package/dist/commands/auth/logout.d.ts +10 -0
- package/dist/commands/auth/logout.js +58 -0
- package/dist/commands/auth/status.d.ts +12 -0
- package/dist/commands/auth/status.js +101 -0
- package/dist/commands/auth/tenant.d.ts +19 -0
- package/dist/commands/auth/tenant.js +184 -0
- package/dist/commands/auth.d.ts +37 -0
- package/dist/commands/auth.js +871 -0
- package/dist/commands/bank-accounts.d.ts +41 -0
- package/dist/commands/bank-accounts.js +1032 -0
- package/dist/commands/bank-integrations.js +30 -18
- package/dist/commands/business-partners---contacts.js +30 -18
- package/dist/commands/business-partners.js +30 -18
- package/dist/commands/config/add.d.ts +13 -0
- package/dist/commands/config/add.js +120 -0
- package/dist/commands/config/current.d.ts +9 -0
- package/dist/commands/config/current.js +43 -0
- package/dist/commands/config/delete.d.ts +12 -0
- package/dist/commands/config/delete.js +67 -0
- package/dist/commands/config/list.d.ts +9 -0
- package/dist/commands/config/list.js +50 -0
- package/dist/commands/config/use.d.ts +9 -0
- package/dist/commands/config/use.js +40 -0
- package/dist/commands/credit-card-accounts.js +30 -18
- package/dist/commands/documents.js +30 -18
- package/dist/commands/dunning-configs.js +30 -18
- package/dist/commands/dunning-reminders.js +30 -18
- package/dist/commands/dunning-runs.js +30 -18
- package/dist/commands/employees.js +30 -18
- package/dist/commands/event-processor-mappings.js +30 -18
- package/dist/commands/files-internal.js +30 -18
- package/dist/commands/health.js +30 -18
- package/dist/commands/inbox.js +33 -19
- package/dist/commands/integrations.js +30 -18
- package/dist/commands/item-categories.js +30 -18
- package/dist/commands/items.js +30 -18
- package/dist/commands/journal-lines.js +30 -18
- package/dist/commands/journals.js +30 -18
- package/dist/commands/ledgers.js +30 -18
- package/dist/commands/office-locations.js +30 -18
- package/dist/commands/payment-method-ledger-mappings.js +30 -18
- package/dist/commands/payment-methods.js +30 -18
- package/dist/commands/payment-runs.js +30 -18
- package/dist/commands/payment-terms.js +30 -18
- package/dist/commands/price-lists.js +30 -18
- package/dist/commands/processor-mappings.js +30 -18
- package/dist/commands/processors.js +31 -19
- package/dist/commands/reconciliation.js +30 -18
- package/dist/commands/reports.js +30 -18
- package/dist/commands/salary-types.js +1018 -0
- package/dist/commands/sales-invoices.js +30 -18
- package/dist/commands/sales-orders.js +32 -19
- package/dist/commands/switch.d.ts +1 -0
- package/dist/commands/switch.js +58 -3
- package/dist/commands/tags.js +30 -18
- package/dist/commands/tax-codes.js +30 -18
- package/dist/commands/tax-matrix.js +30 -18
- package/dist/commands/tenants.js +30 -18
- package/dist/commands/text-templates.js +30 -18
- package/dist/commands/tools.js +30 -18
- package/dist/commands/vendor-invoices.js +33 -19
- package/dist/commands/webhooks.js +30 -18
- package/dist/commands/workflows.js +30 -18
- package/dist/index 2.js +1 -0
- package/dist/index.d 2.ts +1 -0
- package/dist/lib/auth.d.ts +16 -1
- package/dist/lib/auth.js +153 -45
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.js +6 -0
- package/oclif.manifest.json +2092 -669
- package/package.json +2 -2
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { select } from '@inquirer/prompts';
|
|
2
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
3
|
+
import { getCurrentTenant, listTenants, switchTenant } from '../../lib/auth.js';
|
|
4
|
+
import { getContext, getCurrentContext } from '../../lib/config.js';
|
|
5
|
+
export default class AuthTenant extends Command {
|
|
6
|
+
static args = {
|
|
7
|
+
action: Args.string({
|
|
8
|
+
description: 'Action to perform: show, list, or switch',
|
|
9
|
+
options: ['show', 'list', 'switch'],
|
|
10
|
+
required: false,
|
|
11
|
+
}),
|
|
12
|
+
tenantId: Args.string({
|
|
13
|
+
description: 'Tenant ID to switch to (for switch action)',
|
|
14
|
+
required: false,
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
static description = 'Manage tenant selection for multi-tenant access';
|
|
18
|
+
static examples = [
|
|
19
|
+
'<%= config.bin %> auth tenant',
|
|
20
|
+
'<%= config.bin %> auth tenant show',
|
|
21
|
+
'<%= config.bin %> auth tenant list',
|
|
22
|
+
'<%= config.bin %> auth tenant switch <tenant-id>',
|
|
23
|
+
];
|
|
24
|
+
static flags = {
|
|
25
|
+
context: Flags.string({
|
|
26
|
+
char: 'c',
|
|
27
|
+
description: 'Context to use',
|
|
28
|
+
}),
|
|
29
|
+
json: Flags.boolean({
|
|
30
|
+
default: false,
|
|
31
|
+
description: 'Output as JSON',
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
async run() {
|
|
35
|
+
const { args, flags } = await this.parse(AuthTenant);
|
|
36
|
+
const contextName = flags.context || getCurrentContext()?.name;
|
|
37
|
+
if (!contextName) {
|
|
38
|
+
this.error('No context configured. Run: aderis auth login --new');
|
|
39
|
+
}
|
|
40
|
+
const context = getContext(contextName);
|
|
41
|
+
if (!context?.tokens) {
|
|
42
|
+
this.error('Not logged in. Run: aderis auth login');
|
|
43
|
+
}
|
|
44
|
+
const action = args.action || 'interactive';
|
|
45
|
+
switch (action) {
|
|
46
|
+
case 'list': {
|
|
47
|
+
await this.listTenants(contextName, flags.json);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case 'show': {
|
|
51
|
+
await this.showCurrentTenant(contextName, flags.json);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'switch': {
|
|
55
|
+
if (!args.tenantId) {
|
|
56
|
+
this.error('Tenant ID required for switch action. Usage: aderis auth tenant switch <tenant-id>');
|
|
57
|
+
}
|
|
58
|
+
await this.switchTenant(contextName, args.tenantId);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
default: {
|
|
62
|
+
await this.interactiveSwitch(contextName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async interactiveSwitch(contextName) {
|
|
67
|
+
const tenants = await listTenants(contextName);
|
|
68
|
+
const current = await getCurrentTenant(contextName);
|
|
69
|
+
if (tenants.length === 0) {
|
|
70
|
+
this.log('No tenants available');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (tenants.length === 1) {
|
|
74
|
+
const tenant = tenants[0];
|
|
75
|
+
this.log(`Only one tenant available: ${tenant.name}`);
|
|
76
|
+
if (tenant.tenantId === current?.tenantId) {
|
|
77
|
+
this.log(`Already using this tenant (${tenant.name}, ${tenant.tenantId})`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
await this.switchTenant(contextName, tenant.tenantId, tenant.name);
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Sort tenants: current first, then by name
|
|
85
|
+
const sortedTenants = [...tenants].sort((a, b) => {
|
|
86
|
+
if (a.tenantId === current?.tenantId)
|
|
87
|
+
return -1;
|
|
88
|
+
if (b.tenantId === current?.tenantId)
|
|
89
|
+
return 1;
|
|
90
|
+
return a.name.localeCompare(b.name);
|
|
91
|
+
});
|
|
92
|
+
const choices = sortedTenants.map((t) => {
|
|
93
|
+
const isCurrent = t.tenantId === current?.tenantId;
|
|
94
|
+
const tags = [];
|
|
95
|
+
if (isCurrent)
|
|
96
|
+
tags.push('current');
|
|
97
|
+
if (t.isDefault)
|
|
98
|
+
tags.push('default');
|
|
99
|
+
const tagStr = tags.length > 0 ? ` (${tags.join(', ')})` : '';
|
|
100
|
+
return {
|
|
101
|
+
name: `${t.name}${tagStr}`,
|
|
102
|
+
value: t.tenantId,
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
const selectedTenant = await select({
|
|
106
|
+
choices,
|
|
107
|
+
message: 'Select a tenant:',
|
|
108
|
+
});
|
|
109
|
+
const selectedTenantName = tenants.find((t) => t.tenantId === selectedTenant)?.name;
|
|
110
|
+
if (selectedTenant === current?.tenantId) {
|
|
111
|
+
const label = selectedTenantName ? `${selectedTenantName}, ${selectedTenant}` : selectedTenant;
|
|
112
|
+
this.log(`Already using this tenant (${label})`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
await this.switchTenant(contextName, selectedTenant, selectedTenantName);
|
|
116
|
+
}
|
|
117
|
+
async listTenants(contextName, asJson) {
|
|
118
|
+
const tenants = await listTenants(contextName);
|
|
119
|
+
const current = await getCurrentTenant(contextName);
|
|
120
|
+
if (asJson) {
|
|
121
|
+
this.log(JSON.stringify({ currentTenantId: current?.tenantId, tenants }, null, 2));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (tenants.length === 0) {
|
|
125
|
+
this.log('No tenants available');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.log('Available tenants:\n');
|
|
129
|
+
for (const tenant of tenants) {
|
|
130
|
+
const isCurrent = tenant.tenantId === current?.tenantId;
|
|
131
|
+
const marker = isCurrent ? '*' : ' ';
|
|
132
|
+
const defaultTag = tenant.isDefault ? ' (default)' : '';
|
|
133
|
+
this.log(`${marker} ${tenant.name}${defaultTag}`);
|
|
134
|
+
this.log(` ID: ${tenant.tenantId}`);
|
|
135
|
+
}
|
|
136
|
+
this.log('\n* = current tenant');
|
|
137
|
+
}
|
|
138
|
+
async showCurrentTenant(contextName, asJson) {
|
|
139
|
+
const current = await getCurrentTenant(contextName);
|
|
140
|
+
if (!current) {
|
|
141
|
+
if (asJson) {
|
|
142
|
+
this.log(JSON.stringify({ tenant: null }, null, 2));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.log('No tenant selected');
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (asJson) {
|
|
150
|
+
this.log(JSON.stringify(current, null, 2));
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.log(`Current tenant: ${current.name || current.tenantId}`);
|
|
154
|
+
this.log(`Tenant ID: ${current.tenantId}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async switchTenant(contextName, tenantId, tenantName) {
|
|
158
|
+
const requested = tenantName ? `${tenantName} (${tenantId})` : tenantId;
|
|
159
|
+
this.log(`Switching to tenant ${requested}...`);
|
|
160
|
+
try {
|
|
161
|
+
const tokens = await switchTenant(contextName, tenantId);
|
|
162
|
+
const resolvedName = tenantName ?? (await this.resolveTenantName(contextName, tokens.tenant_id));
|
|
163
|
+
const display = resolvedName ? `${resolvedName} (${tokens.tenant_id})` : tokens.tenant_id;
|
|
164
|
+
this.log(`Successfully switched to tenant ${display}`);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error instanceof Error) {
|
|
168
|
+
this.error(`Failed to switch tenant: ${error.message}`);
|
|
169
|
+
}
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async resolveTenantName(contextName, tenantId) {
|
|
174
|
+
if (!tenantId)
|
|
175
|
+
return undefined;
|
|
176
|
+
try {
|
|
177
|
+
const tenants = await listTenants(contextName);
|
|
178
|
+
return tenants.find((t) => t.tenantId === tenantId)?.name;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Auth extends Command {
|
|
3
|
+
static args: {
|
|
4
|
+
action: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static description: string;
|
|
8
|
+
static examples: never[];
|
|
9
|
+
static flags: {
|
|
10
|
+
context: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
csv: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
data: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
fields: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
include: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
limit: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
page: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
query: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
|
+
sanitize: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
21
|
+
search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
22
|
+
set: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
23
|
+
'sort-by': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
24
|
+
table: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
25
|
+
};
|
|
26
|
+
run(): Promise<void>;
|
|
27
|
+
private filterFields;
|
|
28
|
+
private getColumns;
|
|
29
|
+
private getValue;
|
|
30
|
+
private printCsv;
|
|
31
|
+
private printTable;
|
|
32
|
+
private runCamt053Import;
|
|
33
|
+
private runExport;
|
|
34
|
+
private runImport;
|
|
35
|
+
private runNestedImport;
|
|
36
|
+
private sanitizeOutput;
|
|
37
|
+
}
|