dataverse-utils 2.2.13 → 2.4.0

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.
@@ -3,12 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.deployAssembly = void 0;
6
+ exports.assemblyDeploy = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const pluginAssembly_1 = require("./models/pluginAssembly");
10
+ const pluginPackage_1 = require("./models/pluginPackage");
10
11
  const logger_1 = require("./logger");
11
- async function deployAssembly(creds, apiConfig) {
12
+ async function assemblyDeploy(creds, apiConfig) {
12
13
  const currentPath = '.';
13
14
  const configFile = await fs_1.default.promises.readFile(path_1.default.resolve(currentPath, 'dataverse.config.json'), 'utf8');
14
15
  if (configFile == null) {
@@ -16,14 +17,27 @@ async function deployAssembly(creds, apiConfig) {
16
17
  return;
17
18
  }
18
19
  const config = JSON.parse(configFile);
19
- logger_1.logger.info('deploy assembly');
20
- try {
21
- await (0, pluginAssembly_1.deploy)(config, apiConfig, creds.solution);
20
+ if (config.prefix) {
21
+ logger_1.logger.info('deploy plugin package');
22
+ try {
23
+ await (0, pluginPackage_1.deployPluginPackage)(config, apiConfig, creds.solution);
24
+ }
25
+ catch (error) {
26
+ logger_1.logger.error(error.message);
27
+ return;
28
+ }
29
+ logger_1.logger.done(`deployed plugin package ${config.prefix}_${config.name}\r\n`);
22
30
  }
23
- catch (error) {
24
- logger_1.logger.error(error.message);
25
- return;
31
+ else {
32
+ logger_1.logger.info('deploy assembly');
33
+ try {
34
+ await (0, pluginAssembly_1.deployAssembly)(config, apiConfig, creds.solution);
35
+ }
36
+ catch (error) {
37
+ logger_1.logger.error(error.message);
38
+ return;
39
+ }
40
+ logger_1.logger.done(`deployed assembly ${config.name}\r\n`);
26
41
  }
27
- logger_1.logger.done(`deployed assembly ${config.name}\r\n`);
28
42
  }
29
- exports.deployAssembly = deployAssembly;
43
+ exports.assemblyDeploy = assemblyDeploy;
package/lib/auth.js CHANGED
@@ -1,10 +1,33 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAccessToken = void 0;
6
+ exports.getAccessToken = exports.onTokenFailure = void 0;
7
+ const prompts_1 = __importDefault(require("prompts"));
4
8
  const cachePlugin_1 = require("./cachePlugin");
5
9
  const msal_node_1 = require("@azure/msal-node");
6
10
  const logger_1 = require("./logger");
7
11
  const clientId = '51f81489-12ee-4a9e-aaae-a2591f45987d';
12
+ const onTokenFailure = async (url, error) => {
13
+ if (error) {
14
+ logger_1.logger.error(`failed to acquire access token: ${error}`);
15
+ }
16
+ else {
17
+ logger_1.logger.error('failed to acquire access token');
18
+ }
19
+ if ((0, cachePlugin_1.cacheExists)(url)) {
20
+ const { deleteToken } = await (0, prompts_1.default)({
21
+ type: 'confirm',
22
+ name: 'deleteToken',
23
+ message: `delete current token cache for ${url}?`
24
+ });
25
+ if (deleteToken) {
26
+ (0, cachePlugin_1.deleteCache)(url);
27
+ }
28
+ }
29
+ };
30
+ exports.onTokenFailure = onTokenFailure;
8
31
  const getAccessToken = async (tenant, url) => {
9
32
  const config = {
10
33
  auth: {
@@ -22,23 +45,31 @@ const getAccessToken = async (tenant, url) => {
22
45
  });
23
46
  // Try to get token silently
24
47
  if (accounts.length > 0) {
25
- const silentToken = await pca.acquireTokenSilent({
26
- account: accounts[0],
27
- scopes: [`${url}/.default`]
28
- }).catch(ex => {
29
- throw new Error(ex.message);
30
- });
31
- if (silentToken) {
32
- return silentToken;
48
+ try {
49
+ const silentToken = await pca.acquireTokenSilent({
50
+ account: accounts[0],
51
+ scopes: [`${url}/.default`]
52
+ });
53
+ if (silentToken) {
54
+ return silentToken;
55
+ }
56
+ }
57
+ catch (ex) {
58
+ if (ex.message.indexOf('The refresh token has expired due to inactivity') === -1) {
59
+ throw new Error(ex.message);
60
+ }
33
61
  }
34
62
  }
35
63
  // Acquire token by device code
36
- const token = await pca.acquireTokenByDeviceCode({
37
- scopes: [`${url}/.default`],
38
- deviceCodeCallback: (response) => logger_1.logger.info(response.message)
39
- }).catch(ex => {
64
+ try {
65
+ const token = await pca.acquireTokenByDeviceCode({
66
+ scopes: [`${url}/.default`],
67
+ deviceCodeCallback: (response) => logger_1.logger.info(response.message)
68
+ });
69
+ return token;
70
+ }
71
+ catch (ex) {
40
72
  throw new Error(ex.message);
41
- });
42
- return token;
73
+ }
43
74
  };
44
75
  exports.getAccessToken = getAccessToken;
@@ -21,7 +21,7 @@ const decrypt = (text) => {
21
21
  return decrypted;
22
22
  };
23
23
  const getCachePath = (url) => {
24
- const org = url.replace('https://', '').split('.')[0];
24
+ const org = new URL(url).hostname.split('.')[0];
25
25
  if (!fs_1.default.existsSync(path_1.default.join(os_1.default.homedir(), './.dataverse-utils/'))) {
26
26
  fs_1.default.mkdirSync(path_1.default.join(os_1.default.homedir(), './.dataverse-utils/'));
27
27
  }
@@ -9,6 +9,7 @@ var ComponentType;
9
9
  ComponentType[ComponentType["PluginAssembly"] = 91] = "PluginAssembly";
10
10
  ComponentType[ComponentType["SDKMessageProcessingStep"] = 92] = "SDKMessageProcessingStep";
11
11
  ComponentType[ComponentType["SDKMessageProcessingStepImage"] = 93] = "SDKMessageProcessingStepImage";
12
+ ComponentType[ComponentType["PluginPackage"] = 10865] = "PluginPackage";
12
13
  })(ComponentType = exports.ComponentType || (exports.ComponentType = {}));
13
14
  async function addToSolution(id, solution, type, apiConfig) {
14
15
  const data = {
package/lib/deploy.js CHANGED
@@ -11,25 +11,6 @@ const assemblyDeploy_1 = require("./assemblyDeploy");
11
11
  const webResourceDeploy_1 = require("./webResourceDeploy");
12
12
  const node_1 = require("dataverse-webapi/lib/node");
13
13
  const auth_1 = require("./auth");
14
- const cachePlugin_1 = require("./cachePlugin");
15
- const onTokenFailure = async (url, error) => {
16
- if (error) {
17
- logger_1.logger.error(`failed to acquire access token: ${error}`);
18
- }
19
- else {
20
- logger_1.logger.error('failed to acquire access token');
21
- }
22
- if ((0, cachePlugin_1.cacheExists)(url)) {
23
- const { deleteToken } = await (0, prompts_1.default)({
24
- type: 'confirm',
25
- name: 'deleteToken',
26
- message: `delete current token cache for ${url}?`
27
- });
28
- if (deleteToken) {
29
- (0, cachePlugin_1.deleteCache)(url);
30
- }
31
- }
32
- };
33
14
  async function deploy(type, files) {
34
15
  if (!type || (type !== 'webresource' && type !== 'assembly')) {
35
16
  const invalid = type !== undefined && type !== 'webresource' && type !== 'assembly';
@@ -57,20 +38,20 @@ async function deploy(type, files) {
57
38
  token = await (0, auth_1.getAccessToken)(creds.tenant, creds.server);
58
39
  }
59
40
  catch (error) {
60
- onTokenFailure(creds.server, error.message);
41
+ (0, auth_1.onTokenFailure)(creds.server, error.message);
61
42
  return;
62
43
  }
63
44
  if (token == null || token.accessToken == null) {
64
- onTokenFailure(creds.server);
45
+ (0, auth_1.onTokenFailure)(creds.server);
65
46
  return;
66
47
  }
67
48
  const apiConfig = new node_1.WebApiConfig('8.2', token.accessToken, creds.server);
68
49
  switch (type) {
69
50
  case 'webresource':
70
- await (0, webResourceDeploy_1.deployWebResource)(creds, apiConfig, files);
51
+ await (0, webResourceDeploy_1.webResourceDeploy)(creds, apiConfig, files);
71
52
  break;
72
53
  case 'assembly':
73
- await (0, assemblyDeploy_1.deployAssembly)(creds, apiConfig);
54
+ await (0, assemblyDeploy_1.assemblyDeploy)(creds, apiConfig);
74
55
  break;
75
56
  default:
76
57
  break;
package/lib/generate.js CHANGED
@@ -31,11 +31,11 @@ async function generate(table) {
31
31
  token = await (0, auth_1.getAccessToken)(creds.tenant, creds.server);
32
32
  }
33
33
  catch (error) {
34
- logger_1.logger.error(`failed to acquire access token: ${error.message}`);
34
+ (0, auth_1.onTokenFailure)(creds.server, error.message);
35
35
  return;
36
36
  }
37
37
  if (token == null || token.accessToken == null) {
38
- logger_1.logger.error('failed to acquire access token');
38
+ (0, auth_1.onTokenFailure)(creds.server);
39
39
  return;
40
40
  }
41
41
  const apiConfig = new node_1.WebApiConfig('8.2', token.accessToken, creds.server);
@@ -3,14 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.deploy = void 0;
6
+ exports.deployAssembly = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const glob_1 = __importDefault(require("glob"));
9
9
  const node_1 = require("dataverse-webapi/lib/node");
10
10
  const pluginType_1 = require("./pluginType");
11
11
  const dataverse_service_1 = require("../dataverse.service");
12
12
  const logger_1 = require("../logger");
13
- async function deploy(config, apiConfig, solution) {
13
+ async function deployAssembly(config, apiConfig, solution) {
14
14
  const files = glob_1.default.sync(`**/${config.name}.dll`);
15
15
  if (files.length === 0) {
16
16
  logger_1.logger.warn(`assembly ${config.name}.dll not found`);
@@ -63,7 +63,7 @@ async function deploy(config, apiConfig, solution) {
63
63
  }
64
64
  }
65
65
  }
66
- exports.deploy = deploy;
66
+ exports.deployAssembly = deployAssembly;
67
67
  async function retrieveAssembly(name, apiConfig) {
68
68
  const options = `$select=pluginassemblyid&$filter=name eq '${name}'`;
69
69
  const result = await (0, node_1.retrieveMultiple)(apiConfig, 'pluginassemblies', options);
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deployPluginPackage = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const glob_1 = __importDefault(require("glob"));
9
+ const node_1 = require("dataverse-webapi/lib/node");
10
+ const pluginAssembly_1 = require("./pluginAssembly");
11
+ const dataverse_service_1 = require("../dataverse.service");
12
+ const logger_1 = require("../logger");
13
+ async function deployPluginPackage(config, apiConfig, solution) {
14
+ const files = glob_1.default.sync(`**/${config.name}.*.nupkg`);
15
+ if (files.length === 0) {
16
+ logger_1.logger.warn(`package ${config.name}.nupkg not found`);
17
+ return;
18
+ }
19
+ const content = (await fs_1.default.promises.readFile(files[0])).toString('base64');
20
+ let packageId = '';
21
+ try {
22
+ packageId = await retrievePackage(config.prefix, config.name, apiConfig);
23
+ }
24
+ catch (error) {
25
+ logger_1.logger.error(`failed to retrieve package ${config.name}: ${error.message}`);
26
+ return;
27
+ }
28
+ if (packageId != '') {
29
+ try {
30
+ await updatePackage(packageId, config, content, apiConfig);
31
+ }
32
+ catch (error) {
33
+ throw new Error(`failed to update package: ${error.message}`);
34
+ }
35
+ }
36
+ else {
37
+ try {
38
+ packageId = await createPackage(config, content, apiConfig);
39
+ }
40
+ catch (error) {
41
+ throw new Error(`failed to create package: ${error.message}`);
42
+ }
43
+ if (solution != undefined) {
44
+ try {
45
+ await (0, dataverse_service_1.addToSolution)(packageId, solution, dataverse_service_1.ComponentType.PluginPackage, apiConfig);
46
+ }
47
+ catch (error) {
48
+ logger_1.logger.error(`failed to add package to solution: ${error.message}`);
49
+ }
50
+ }
51
+ }
52
+ if (config.assembly != null) {
53
+ try {
54
+ config.assembly['packageid@odata.bind'] = `/pluginpackages(${packageId})`;
55
+ await (0, pluginAssembly_1.deployAssembly)(config.assembly, apiConfig, solution);
56
+ }
57
+ catch (error) {
58
+ logger_1.logger.error(error.message);
59
+ return;
60
+ }
61
+ }
62
+ }
63
+ exports.deployPluginPackage = deployPluginPackage;
64
+ async function retrievePackage(prefix, name, apiConfig) {
65
+ const options = `$select=pluginpackageid&$filter=contains(name, '${prefix}_${name}')`;
66
+ const result = await (0, node_1.retrieveMultiple)(apiConfig, 'pluginpackages', options);
67
+ return result.value.length > 0 ? result.value[0].pluginassemblyid : '';
68
+ }
69
+ async function createPackage(config, content, apiConfig) {
70
+ logger_1.logger.info(`create assembly ${config.name}`);
71
+ const pluginPackage = {
72
+ name: `${config.prefix}_${config.name}`,
73
+ version: config.version,
74
+ content: content
75
+ };
76
+ const result = await (0, node_1.createWithReturnData)(apiConfig, 'pluginpackages', pluginPackage, '$select=pluginpackageid');
77
+ if (result.error) {
78
+ throw new Error(result.error.message);
79
+ }
80
+ return result.pluginpackageid;
81
+ }
82
+ async function updatePackage(id, config, content, apiConfig) {
83
+ logger_1.logger.info(`update assembly ${config.name}`);
84
+ const assembly = {
85
+ content: content,
86
+ version: config.version
87
+ };
88
+ return (0, node_1.update)(apiConfig, 'pluginpackages', id, assembly);
89
+ }
@@ -3,12 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.deployWebResource = void 0;
6
+ exports.webResourceDeploy = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const logger_1 = require("./logger");
10
10
  const webResource_1 = require("./models/webResource");
11
- async function deployWebResource(creds, apiConfig, files) {
11
+ async function webResourceDeploy(creds, apiConfig, files) {
12
12
  const currentPath = '.';
13
13
  const configFile = await fs_1.default.promises.readFile(path_1.default.resolve(currentPath, 'dataverse.config.json'), 'utf8');
14
14
  if (configFile == null) {
@@ -26,4 +26,4 @@ async function deployWebResource(creds, apiConfig, files) {
26
26
  }
27
27
  logger_1.logger.done('deployed web resources');
28
28
  }
29
- exports.deployWebResource = deployWebResource;
29
+ exports.webResourceDeploy = webResourceDeploy;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dataverse-utils",
3
- "version": "2.2.13",
3
+ "version": "2.4.0",
4
4
  "license": "MIT",
5
5
  "description": "Utilities for interacting with Dataverse environments",
6
6
  "main": "lib/index.js",