@reporting-bi/cli 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +117 -68
  2. package/package.json +2 -1
package/dist/index.js CHANGED
@@ -2831,7 +2831,7 @@ var ReportingAuthClient = class {
2831
2831
  async getAuthInit() {
2832
2832
  if (this.options.tokenProvider) {
2833
2833
  const token = await this.options.tokenProvider();
2834
- return token ? { headers: { "Authorization": `Bearer ${token}` } } : {};
2834
+ return token?.access_token ? { headers: { "Authorization": `Bearer ${token.access_token}` } } : {};
2835
2835
  }
2836
2836
  return { credentials: "include" };
2837
2837
  }
@@ -2905,14 +2905,18 @@ var ReportingAuthClient = class {
2905
2905
  }
2906
2906
  return this.response;
2907
2907
  }
2908
- redirect() {
2908
+ redirect(authorizationCode) {
2909
2909
  let url = `${this.options.serviceUrl}/redirect`;
2910
2910
  const queryParams = [];
2911
2911
  if (this.options.clientId) {
2912
2912
  queryParams.push("client_id=" + encodeURIComponent(this.options.clientId));
2913
2913
  }
2914
2914
  if (this.options.redirectUrl) {
2915
- queryParams.push("redirect_uri=" + encodeURIComponent(this.options.redirectUrl));
2915
+ let redirectUri = this.options.redirectUrl;
2916
+ if (authorizationCode) {
2917
+ queryParams.push("code=" + encodeURIComponent(authorizationCode));
2918
+ }
2919
+ queryParams.push("redirect_uri=" + encodeURIComponent(redirectUri));
2916
2920
  }
2917
2921
  url += (url.includes("?") ? "&" : "?") + queryParams.join("&");
2918
2922
  window.location.href = url;
@@ -2974,15 +2978,22 @@ var ReportingAuthClient = class {
2974
2978
  }
2975
2979
  async refreshToken() {
2976
2980
  const body = { grant_type: "refresh_token" };
2981
+ if (this.options.tokenProvider) {
2982
+ const token = await this.options.tokenProvider();
2983
+ if (token?.refresh_token) {
2984
+ body.refresh_token = token.refresh_token;
2985
+ }
2986
+ }
2977
2987
  if (this.options.clientId)
2978
2988
  body.client_id = this.options.clientId;
2979
2989
  if (this.options.clientSecret)
2980
2990
  body.client_secret = this.options.clientSecret;
2981
- this.response = await this.fetchWithAuth(`${this.options.serviceUrl}/token`, {
2991
+ this.response = await fetch(`${this.options.serviceUrl}/token`, {
2982
2992
  method: "POST",
2983
2993
  headers: {
2984
2994
  "Content-Type": "application/json"
2985
2995
  },
2996
+ credentials: body.refresh_token ? "include" : "omit",
2986
2997
  body: JSON.stringify(body)
2987
2998
  });
2988
2999
  if (!this.response.ok) {
@@ -3046,15 +3057,34 @@ function setActive(domain, accounting2) {
3046
3057
  saveCredentials(creds);
3047
3058
  return true;
3048
3059
  }
3049
- function createAuthClient(domain, tokenProvider) {
3060
+ function createAuthClient(domain, tokens) {
3050
3061
  return new ReportingAuthClient({
3051
3062
  serviceUrl: `${domain}/auth`,
3052
3063
  clientId: CLIENT_ID,
3053
3064
  clientSecret: CLIENT_SECRET,
3054
- tokenProvider
3065
+ tokenProvider: tokens ? () => ({ access_token: tokens.access_token, refresh_token: tokens.refresh_token }) : void 0
3055
3066
  });
3056
3067
  }
3057
- function createService(name, accountingOverride) {
3068
+ async function ensureValidToken(conn) {
3069
+ const now = Math.floor(Date.now() / 1e3);
3070
+ const margin = 60;
3071
+ if (conn.tokens.expires_at && conn.tokens.expires_at > now + margin) return;
3072
+ if (!conn.tokens.refresh_token) return;
3073
+ const client = createAuthClient(conn.domain, conn.tokens);
3074
+ try {
3075
+ await client.refreshToken();
3076
+ const credentials = await client.readCredentials();
3077
+ if (credentials?.access_token) {
3078
+ conn.tokens.access_token = credentials.access_token;
3079
+ if (credentials.refresh_token) conn.tokens.refresh_token = credentials.refresh_token;
3080
+ conn.tokens.expires_at = credentials.expires_in ? now + credentials.expires_in : 0;
3081
+ storeTokens(conn.domain, conn.tokens);
3082
+ }
3083
+ } catch (err) {
3084
+ console.error("Token refresh failed:", err instanceof Error ? err.message : err);
3085
+ }
3086
+ }
3087
+ async function createService(name, accountingOverride) {
3058
3088
  const conn = getActiveConnection();
3059
3089
  if (!conn) {
3060
3090
  console.error('Not logged in. Run "rpbi login" first.');
@@ -3065,6 +3095,7 @@ function createService(name, accountingOverride) {
3065
3095
  console.error('No accounting set. Run "rpbi use <domain> --accounting <id>" first.');
3066
3096
  process.exit(1);
3067
3097
  }
3098
+ await ensureValidToken(conn);
3068
3099
  const service = new import_rp_client.Service({
3069
3100
  name,
3070
3101
  baseUrl: `${conn.domain}/ms`,
@@ -3076,6 +3107,10 @@ function createService(name, accountingOverride) {
3076
3107
  service.accountingProvider = ap;
3077
3108
  return service;
3078
3109
  }
3110
+ function getFields(flags, defaults) {
3111
+ if (flags.columns) return flags.columns.split(",").map((s) => s.trim());
3112
+ return defaults;
3113
+ }
3079
3114
  var FLAG_ALIASES = {
3080
3115
  a: "accounting"
3081
3116
  };
@@ -3147,7 +3182,7 @@ function output(data, flags) {
3147
3182
 
3148
3183
  // src/commands/accounting.ts
3149
3184
  async function fetchAccountingName(accountingId) {
3150
- const service = createService("accounting", accountingId);
3185
+ const service = await createService("accounting", accountingId);
3151
3186
  const accountings = await service.get("accountings", { fields: ["accounting", "company"] });
3152
3187
  const match = accountings?.find((a) => a.accounting === accountingId);
3153
3188
  return match?.company ?? null;
@@ -3164,7 +3199,7 @@ async function accounting(args2) {
3164
3199
  }
3165
3200
  }
3166
3201
  async function list(flags) {
3167
- const service = createService("accounting");
3202
+ const service = await createService("accounting");
3168
3203
  const accountings = await service.get("accountings", { fields: ["accounting", "company"] });
3169
3204
  output(accountings || [], flags);
3170
3205
  }
@@ -3329,7 +3364,7 @@ async function logout(domain) {
3329
3364
  return;
3330
3365
  }
3331
3366
  try {
3332
- const client = createAuthClient(domain, () => tokens.access_token);
3367
+ const client = createAuthClient(domain, tokens);
3333
3368
  await client.revokeToken();
3334
3369
  } catch {
3335
3370
  }
@@ -3410,24 +3445,24 @@ async function use(args2) {
3410
3445
  var fs2 = __toESM(require("node:fs"));
3411
3446
  var DEFAULT_LANG = "cs";
3412
3447
  async function list2(flags) {
3413
- const service = createService("wiki");
3448
+ const service = await createService("wiki");
3414
3449
  const pages = await service.get("pages");
3415
3450
  output(pages || [], flags);
3416
3451
  }
3417
3452
  async function get(id, flags) {
3418
3453
  const lang = flags.lang || DEFAULT_LANG;
3419
- const service = createService("wiki");
3454
+ const service = await createService("wiki");
3420
3455
  const page = await service.get(`page/${lang}/${id}`);
3421
3456
  output(page, flags);
3422
3457
  }
3423
3458
  async function read(id, flags) {
3424
3459
  const lang = flags.lang || DEFAULT_LANG;
3425
- const service = createService("wiki");
3460
+ const service = await createService("wiki");
3426
3461
  const content2 = await service.get(`pageContent/${lang}/${id}`, void 0, { parseResponse: false });
3427
3462
  process.stdout.write(content2 || "");
3428
3463
  }
3429
3464
  async function search(query, flags) {
3430
- const service = createService("wiki");
3465
+ const service = await createService("wiki");
3431
3466
  const results = await service.get("search", { q: query });
3432
3467
  output(results || [], flags);
3433
3468
  }
@@ -3451,7 +3486,7 @@ async function readContent(flags) {
3451
3486
  }
3452
3487
  async function save(id, flags) {
3453
3488
  const lang = flags.lang || DEFAULT_LANG;
3454
- const service = createService("wiki");
3489
+ const service = await createService("wiki");
3455
3490
  const content2 = await readContent(flags);
3456
3491
  const page = {
3457
3492
  lang,
@@ -3464,7 +3499,7 @@ async function save(id, flags) {
3464
3499
  }
3465
3500
  async function del(id, flags) {
3466
3501
  const lang = flags.lang || DEFAULT_LANG;
3467
- const service = createService("wiki");
3502
+ const service = await createService("wiki");
3468
3503
  await service.delete(`page/${lang}/${id}`);
3469
3504
  console.log(`Page ${id} deleted.`);
3470
3505
  }
@@ -3508,23 +3543,24 @@ async function wiki(args2) {
3508
3543
 
3509
3544
  // src/commands/etl.ts
3510
3545
  var fs3 = __toESM(require("node:fs"));
3546
+ var DEFAULT_FIELDS = ["id_thread", "description", "module", "type", "enabled", "ord_num"];
3511
3547
  async function list3(flags) {
3512
- const service = createService("etl");
3513
- const threads = await service.get("threads");
3548
+ const service = await createService("etl");
3549
+ const threads = await service.get("threads", { fields: getFields(flags, DEFAULT_FIELDS) });
3514
3550
  output(threads || [], flags);
3515
3551
  }
3516
3552
  async function get2(id, flags) {
3517
- const service = createService("etl");
3553
+ const service = await createService("etl");
3518
3554
  const thread = await service.get(`threads/${id}`);
3519
3555
  output(thread, flags);
3520
3556
  }
3521
3557
  async function content(id, flags) {
3522
- const service = createService("etl");
3558
+ const service = await createService("etl");
3523
3559
  const text = await service.get(`threadContent/${id}`, void 0, { parseResponse: false });
3524
3560
  process.stdout.write(text || "");
3525
3561
  }
3526
3562
  async function exec2(id, flags) {
3527
- const service = createService("etl");
3563
+ const service = await createService("etl");
3528
3564
  let body = void 0;
3529
3565
  if (flags.file) {
3530
3566
  body = fs3.readFileSync(flags.file, "utf-8");
@@ -3535,8 +3571,8 @@ async function exec2(id, flags) {
3535
3571
  process.stdout.write(result || "");
3536
3572
  }
3537
3573
  async function search2(query, flags) {
3538
- const service = createService("etl");
3539
- const results = await service.get("search", { q: query });
3574
+ const service = await createService("etl");
3575
+ const results = await service.get("search", { q: query, fields: getFields(flags, DEFAULT_FIELDS) });
3540
3576
  output(results || [], flags);
3541
3577
  }
3542
3578
  async function etl(args2) {
@@ -3576,24 +3612,26 @@ async function etl(args2) {
3576
3612
  }
3577
3613
 
3578
3614
  // src/commands/jobs.ts
3615
+ var DEFAULT_LIST_FIELDS = ["job_name", "description", "enabled", "last_run", "next_run"];
3616
+ var DEFAULT_STATUS_FIELDS = ["job_name", "running", "enabled", "last_run", "next_run"];
3579
3617
  async function list4(flags) {
3580
- const service = createService("jobs");
3581
- const jobs2 = await service.get("userJobs");
3618
+ const service = await createService("jobs");
3619
+ const jobs2 = await service.get("userJobs", { fields: getFields(flags, DEFAULT_LIST_FIELDS) });
3582
3620
  output(jobs2 || [], flags);
3583
3621
  }
3584
3622
  async function start(jobName, flags) {
3585
- const service = createService("jobs");
3623
+ const service = await createService("jobs");
3586
3624
  await service.get("start", { job_name: jobName });
3587
3625
  console.log(`Job "${jobName}" started.`);
3588
3626
  }
3589
3627
  async function stop(jobName, flags) {
3590
- const service = createService("jobs");
3628
+ const service = await createService("jobs");
3591
3629
  await service.get("stop", { job_name: jobName });
3592
3630
  console.log(`Job "${jobName}" stopped.`);
3593
3631
  }
3594
3632
  async function statusCmd(flags) {
3595
- const service = createService("jobs");
3596
- const statuses = await service.get("jobStatuses");
3633
+ const service = await createService("jobs");
3634
+ const statuses = await service.get("jobStatuses", { fields: getFields(flags, DEFAULT_STATUS_FIELDS) });
3597
3635
  output(statuses || [], flags);
3598
3636
  }
3599
3637
  async function jobs(args2) {
@@ -3623,18 +3661,19 @@ async function jobs(args2) {
3623
3661
  }
3624
3662
 
3625
3663
  // src/commands/analytics.ts
3664
+ var DEFAULT_CONTEXT_FIELDS = ["id_context", "name", "module", "user_name"];
3626
3665
  async function contexts(flags) {
3627
- const service = createService("analytics");
3628
- const ctxs = await service.get("namedContext");
3666
+ const service = await createService("analytics");
3667
+ const ctxs = await service.get("namedContext", { fields: getFields(flags, DEFAULT_CONTEXT_FIELDS) });
3629
3668
  output(ctxs || [], flags);
3630
3669
  }
3631
3670
  async function getContext(id, flags) {
3632
- const service = createService("analytics");
3671
+ const service = await createService("analytics");
3633
3672
  const ctx = await service.get(`context/${id}`);
3634
3673
  output(ctx, flags);
3635
3674
  }
3636
3675
  async function report(id, flags) {
3637
- const service = createService("analytics");
3676
+ const service = await createService("analytics");
3638
3677
  const index = flags.index || "0";
3639
3678
  const result = await service.get(`report/${id}/${index}`, void 0, { parseResponse: false });
3640
3679
  process.stdout.write(result || "");
@@ -3645,12 +3684,12 @@ async function dimensions(flags) {
3645
3684
  console.error("Usage: rpbi analytics dimensions --module <module>");
3646
3685
  process.exit(1);
3647
3686
  }
3648
- const service = createService("definition");
3649
- const dims = await service.get(`visibleDimensions/${module2}`);
3687
+ const service = await createService("definition");
3688
+ const dims = await service.get(`visibleDimensions/${module2}`, { fields: getFields(flags) });
3650
3689
  output(dims || [], flags);
3651
3690
  }
3652
3691
  async function periods(flags) {
3653
- const service = createService("analytics");
3692
+ const service = await createService("analytics");
3654
3693
  const tree = await service.get("years");
3655
3694
  output(tree || [], flags);
3656
3695
  }
@@ -3683,24 +3722,27 @@ async function analytics(args2) {
3683
3722
  }
3684
3723
 
3685
3724
  // src/commands/users.ts
3725
+ var DEFAULT_LIST_FIELDS2 = ["user_name", "login_name", "company"];
3726
+ var DEFAULT_RIGHTS_FIELDS = ["right", "accounting", "role", "source"];
3727
+ var DEFAULT_ROLES_FIELDS = ["id_access_role", "role", "description"];
3686
3728
  async function list5(flags) {
3687
- const service = createService("users");
3688
- const users2 = await service.get("allUsers");
3729
+ const service = await createService("users");
3730
+ const users2 = await service.get("allUsers", { fields: getFields(flags, DEFAULT_LIST_FIELDS2) });
3689
3731
  output(users2 || [], flags);
3690
3732
  }
3691
3733
  async function get3(user, flags) {
3692
- const service = createService("users");
3734
+ const service = await createService("users");
3693
3735
  const result = await service.get(user);
3694
3736
  output(result, flags);
3695
3737
  }
3696
3738
  async function rights(flags) {
3697
- const service = createService("users");
3698
- const result = await service.get("userRights");
3739
+ const service = await createService("users");
3740
+ const result = await service.get("userRights", { fields: getFields(flags, DEFAULT_RIGHTS_FIELDS) });
3699
3741
  output(result || [], flags);
3700
3742
  }
3701
3743
  async function roles(flags) {
3702
- const service = createService("users");
3703
- const result = await service.get("accessRoles");
3744
+ const service = await createService("users");
3745
+ const result = await service.get("accessRoles", { fields: getFields(flags, DEFAULT_ROLES_FIELDS) });
3704
3746
  output(result || [], flags);
3705
3747
  }
3706
3748
  async function users(args2) {
@@ -3724,13 +3766,16 @@ async function users(args2) {
3724
3766
  }
3725
3767
 
3726
3768
  // src/commands/def.ts
3769
+ var DEFAULT_STATEMENTS_FIELDS = ["id_statement", "statement", "description"];
3770
+ var DEFAULT_DIMENSIONS_FIELDS = ["dim_num", "description", "enabled", "ord_num"];
3771
+ var DEFAULT_MODULES_FIELDS = ["module", "name", "type"];
3727
3772
  async function statements(flags) {
3728
- const service = createService("definition");
3729
- const result = await service.get("finStatements");
3773
+ const service = await createService("definition");
3774
+ const result = await service.get("finStatements", { fields: getFields(flags, DEFAULT_STATEMENTS_FIELDS) });
3730
3775
  output(result || [], flags);
3731
3776
  }
3732
3777
  async function statement(id, flags) {
3733
- const service = createService("definition");
3778
+ const service = await createService("definition");
3734
3779
  const result = await service.get(`finStatement/${id}`);
3735
3780
  output(result, flags);
3736
3781
  }
@@ -3740,23 +3785,23 @@ async function dimensions2(flags) {
3740
3785
  console.error("Usage: rpbi def dimensions --module <module>");
3741
3786
  process.exit(1);
3742
3787
  }
3743
- const service = createService("definition");
3744
- const result = await service.get(`dimensions/${module2}`);
3788
+ const service = await createService("definition");
3789
+ const result = await service.get(`dimensions/${module2}`, { fields: getFields(flags, DEFAULT_DIMENSIONS_FIELDS) });
3745
3790
  output(result || [], flags);
3746
3791
  }
3747
3792
  async function modules(flags) {
3748
- const service = createService("definition");
3749
- const result = await service.get("modules");
3793
+ const service = await createService("definition");
3794
+ const result = await service.get("modules", { fields: getFields(flags, DEFAULT_MODULES_FIELDS) });
3750
3795
  output(result || [], flags);
3751
3796
  }
3752
3797
  async function scenarios(flags) {
3753
- const service = createService("definition");
3754
- const result = await service.get("scenarios");
3798
+ const service = await createService("definition");
3799
+ const result = await service.get("scenarios", { fields: getFields(flags) });
3755
3800
  output(result || [], flags);
3756
3801
  }
3757
3802
  async function fiscalYears(flags) {
3758
- const service = createService("definition");
3759
- const result = await service.get("fiscalYears");
3803
+ const service = await createService("definition");
3804
+ const result = await service.get("fiscalYears", { fields: getFields(flags) });
3760
3805
  output(result || [], flags);
3761
3806
  }
3762
3807
  async function def(args2) {
@@ -3786,28 +3831,29 @@ async function def(args2) {
3786
3831
  }
3787
3832
 
3788
3833
  // src/commands/mdm.ts
3834
+ var DEFAULT_TABLES_FIELDS = ["id_md", "md_name", "type"];
3789
3835
  async function tables(flags) {
3790
- const service = createService("mdm");
3791
- const result = await service.get("tableDefinitions");
3836
+ const service = await createService("mdm");
3837
+ const result = await service.get("tableDefinitions", { fields: getFields(flags, DEFAULT_TABLES_FIELDS) });
3792
3838
  output(result || [], flags);
3793
3839
  }
3794
3840
  async function table(id, flags) {
3795
- const service = createService("mdm");
3841
+ const service = await createService("mdm");
3796
3842
  const result = await service.get(`tableDefinition/${id}`);
3797
3843
  output(result, flags);
3798
3844
  }
3799
3845
  async function columns(id, flags) {
3800
- const service = createService("mdm");
3801
- const result = await service.get(`columnDefinitions/${id}`);
3846
+ const service = await createService("mdm");
3847
+ const result = await service.get(`columnDefinitions/${id}`, { fields: getFields(flags) });
3802
3848
  output(result || [], flags);
3803
3849
  }
3804
3850
  async function values(id, flags) {
3805
- const service = createService("mdm");
3806
- const result = await service.get(`values/${id}`);
3851
+ const service = await createService("mdm");
3852
+ const result = await service.get(`values/${id}`, { fields: getFields(flags) });
3807
3853
  output(result || [], flags);
3808
3854
  }
3809
3855
  async function exportCsv(id, flags) {
3810
- const service = createService("mdm");
3856
+ const service = await createService("mdm");
3811
3857
  const type = flags.type || "mdm";
3812
3858
  const result = await service.get(`export/${id}/${type}`, void 0, { parseResponse: false });
3813
3859
  process.stdout.write(result || "");
@@ -3849,19 +3895,21 @@ async function mdm(args2) {
3849
3895
  }
3850
3896
 
3851
3897
  // src/commands/helpdesk.ts
3898
+ var DEFAULT_LIST_FIELDS3 = ["id_request", "subject", "status", "priority", "who_created"];
3899
+ var DEFAULT_MESSAGES_FIELDS = ["id_message", "text", "who_created", "date_created"];
3852
3900
  async function list6(flags) {
3853
- const service = createService("helpdesk");
3854
- const tickets = await service.get("tickets");
3901
+ const service = await createService("helpdesk");
3902
+ const tickets = await service.get("tickets", { fields: getFields(flags, DEFAULT_LIST_FIELDS3) });
3855
3903
  output(tickets || [], flags);
3856
3904
  }
3857
3905
  async function get4(id, flags) {
3858
- const service = createService("helpdesk");
3906
+ const service = await createService("helpdesk");
3859
3907
  const ticket = await service.get(`ticket/${id}`);
3860
3908
  output(ticket, flags);
3861
3909
  }
3862
3910
  async function messages(id, flags) {
3863
- const service = createService("helpdesk");
3864
- const msgs = await service.get(`messages/${id}`);
3911
+ const service = await createService("helpdesk");
3912
+ const msgs = await service.get(`messages/${id}`, { fields: getFields(flags, DEFAULT_MESSAGES_FIELDS) });
3865
3913
  output(msgs || [], flags);
3866
3914
  }
3867
3915
  async function create(flags) {
@@ -3871,7 +3919,7 @@ async function create(flags) {
3871
3919
  console.error('Usage: rpbi helpdesk create --subject "..." [--text "..."] [--priority N]');
3872
3920
  process.exit(1);
3873
3921
  }
3874
- const service = createService("helpdesk");
3922
+ const service = await createService("helpdesk");
3875
3923
  const ticket = { subject };
3876
3924
  if (flags.priority) ticket.priority = parseInt(flags.priority);
3877
3925
  const result = await service.post("ticket", ticket);
@@ -3978,6 +4026,7 @@ Wiki:
3978
4026
 
3979
4027
  Global options:
3980
4028
  --json Output raw JSON instead of table format
4029
+ --columns col1,col2,... Select specific columns to display
3981
4030
 
3982
4031
  Default domain: https://reporting.bi
3983
4032
  Default language: cs
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reporting-bi/cli",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "license": "UNLICENSED",
5
5
  "description": "Reporting.bi CLI — command-line interface for the Reporting.bi platform",
6
6
  "main": "./dist/index.js",
@@ -13,6 +13,7 @@
13
13
  "scripts": {
14
14
  "build": "yarn node build.mjs",
15
15
  "watch": "yarn build --watch",
16
+ "rpbi": "yarn node dist/index.js",
16
17
  "deploy-installers": "cp install.sh ../rp-static/install-cli.sh && cp install.ps1 ../rp-static/install-cli.ps1",
17
18
  "release": "yarn node -e \"const p=require('./package.json');const v=p.version.split('.');v[2]++;p.version=v.join('.');require('fs').writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n')\" && yarn build && git add package.json && git commit -m \"rp-cli v$(yarn node -p \"require('./package.json').version\")\" && git push && yarn npm publish --access public"
18
19
  },