@uservitals/import
Version:
Import helpers for uploading feedback to UserVitals
1,029 lines (1,009 loc) • 65.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var axios = require('axios');
var _ = require('lodash');
var inquirer = require('inquirer');
var chalk = require('chalk');
var csv = require('csvtojson');
var TurndownService = require('turndown');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
var inquirer__namespace = /*#__PURE__*/_interopNamespace(inquirer);
var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
var csv__default = /*#__PURE__*/_interopDefaultLegacy(csv);
var TurndownService__default = /*#__PURE__*/_interopDefaultLegacy(TurndownService);
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
function __values(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
}
function __spreadArray(to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
}
var UservitalsClient = /** @class */ (function () {
function UservitalsClient(apiKey) {
var _this = this;
this.baseApiPath = process.env.DEV_BUILD ? process.env.UV_API_PATH : "https://api.uservitalshq.com";
this.myTeamMembers = function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n query myTeamMembers {\n myTeamMembers {\n user {\n email\n name\n }\n id\n } \n }\n ",
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Get team info
this.team = function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n query myTeam {\n myTeam {\n id\n name\n } \n }\n ",
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Gets all story labels
this.teamLabels = function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n query myTeamLabels {\n myTeamLabels {\n id\n name\n } \n }\n ",
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Gets all story labels
this.teamCategories = function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n query myTeamCategories {\n myTeamCategories {\n id\n name\n } \n }\n ",
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
this.changelogLabels = function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n query myTeamChangelogLabels {\n myTeamChangelogLabels {\n id\n name\n } \n }\n ",
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Used to create insights and stories from a flat csv file
this.createInsight = function (input) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createInsight( $input: InsightCreateInput!) {\n createInsight(input: $input) {\n id\n }\n }\n ",
variables: {
input: {
text: input.text,
sourceUrl: input.source,
integration: input.integration,
type: input.type,
storyId: input.story,
contactId: input.contactId,
},
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Creates a message in UserVtials
this.createMessage = function (input) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createMessage( $input: MessageCreateInput!) {\n createMessage(input: $input) {\n id\n } \n }\n ",
variables: {
input: {
title: input.title,
content: input.content,
status: input.status,
sourceUrl: input.sourceUrl,
labels: input.labels,
contactId: input.contactId,
creatorId: input.creatorId,
},
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Creates a story in UserVtials
this.createStory = function (input) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createStory( $input: StoryCreateInput!) {\n createStory(input: $input) {\n id\n } \n }\n ",
variables: {
input: {
name: input.name,
desc: input.desc,
privDesc: input.privDesc,
contactId: input.contactId,
status: input.status,
category: input.category,
labels: input.labels,
},
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Creates a story label for a team in UserVtials
this.createStoryLabel = function (name) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createStoryLabel($name: String!) {\n createStoryLabel(name: $name) {\n id\n } \n }\n ",
variables: {
name: name,
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Creates a Changelog label for a team in UserVtials
this.createChangelogLabel = function (name) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createChangelogLabel($name: String!) {\n createChangelogLabel(name: $name) {\n id\n } \n }\n ",
variables: {
name: name,
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Creates a story category for a team in UserVtials
this.createStoryCategory = function (name) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createStoryCategory($name: String!) {\n createStoryCategory(name: $name) {\n id\n } \n }\n ",
variables: {
name: name,
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Creates a changelog in UserVtials
this.createChangelog = function (input) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createChangelog( $input: ChangelogCreateInput!) {\n createChangelog(input: $input) {\n title\n } \n }\n ",
variables: {
input: {
title: input.title,
desc: input.desc,
labels: input.labels,
status: input.status,
},
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
// Creates a message in UserVtials
this.createMembership = function (input) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.client({
data: {
query: "\n mutation createMembership( $input: UserInput!) {\n createMembership(input: $input) {\n id\n user {\n email\n name\n }\n } \n }\n ",
variables: {
input: {
name: input.name,
email: input.email,
role: input.role,
},
},
},
})];
case 1: return [2 /*return*/, _a.sent()];
}
});
}); };
this.client = axios__default["default"].create({
method: "POST",
baseURL: this.baseApiPath + "/v1/",
headers: {
Authorization: "Bearer " + apiKey,
"auth-provider": "custom",
"content-type": "application/json",
"user-agent": "UserVitals Importer",
},
});
}
return UservitalsClient;
}());
// eslint-disable-next-line @typescript-eslint/no-var-requires
require("dotenv").config();
var importItems = function (apiKey, importer) { return __awaiter(void 0, void 0, void 0, function () {
var client, importData, labelMapping, existingLabelMap, myTeamLabelsQuery, myTeamLabels, myTeamLabels_1, myTeamLabels_1_1, label, labelName, _a, _b, labelId, label, labelName, labelArray, labelArray_1, labelArray_1_1, nameOfLabel, actualLabelId, labelResponse, labelData, e_1_1, e_2_1, categoryMapping, categoryQuery, categories, existingCategoryMap, categories_1, categories_1_1, catergory, categoryName, _c, _d, cat, catName, actualCatId, catResponse, catData, e_3_1, contactMapping, existingContactMap, teamMemberQuery, teamMembers, teamMembers_1, teamMembers_1_1, member, contactEmail, _e, _f, contact, contactEmail, user, actualContactId, contactResponse, contactData, e_4_1, storyMapping, _g, _h, story, storyLabelIds, response, storyData, e_5_1, _j, _k, insight, e_6_1, _l, _m, message, e_7_1, changelogLabelQuery, myTeamChangelogLabels, existingChangelogLabelMap, myTeamChangelogLabels_1, myTeamChangelogLabels_1_1, label, labelName, changelogLabelMapping_1, _o, _p, labelId, label, labelName, labelArray, labelArray_2, labelArray_2_1, nameOfLabel, actualLabelId, labelResponse, labelData, e_8_1, e_9_1, _q, _r, changelog, storyLabelIds, e_10_1;
var e_11, _s, e_2, _t, e_1, _u, e_12, _v, e_3, _w, e_13, _x, e_4, _y, e_5, _z, e_6, _0, e_7, _1, e_14, _2, e_9, _3, e_8, _4, e_10, _5;
var _6, _7, _8, _9, _10, _11, _12, _13;
return __generator(this, function (_14) {
switch (_14.label) {
case 0:
client = new UservitalsClient(apiKey);
return [4 /*yield*/, importer.import()];
case 1:
importData = _14.sent();
labelMapping = {};
existingLabelMap = {};
if (!(Object.keys(importData.labels).length !== 0)) return [3 /*break*/, 17];
return [4 /*yield*/, client.teamLabels()];
case 2:
myTeamLabelsQuery = (_14.sent()) || [];
myTeamLabels = (_7 = (_6 = myTeamLabelsQuery === null || myTeamLabelsQuery === void 0 ? void 0 : myTeamLabelsQuery.data) === null || _6 === void 0 ? void 0 : _6.data) === null || _7 === void 0 ? void 0 : _7.myTeamLabels;
try {
for (myTeamLabels_1 = __values(myTeamLabels), myTeamLabels_1_1 = myTeamLabels_1.next(); !myTeamLabels_1_1.done; myTeamLabels_1_1 = myTeamLabels_1.next()) {
label = myTeamLabels_1_1.value;
labelName = (_8 = label.name) === null || _8 === void 0 ? void 0 : _8.toLowerCase().trim();
existingLabelMap[labelName] = label.id;
}
}
catch (e_11_1) { e_11 = { error: e_11_1 }; }
finally {
try {
if (myTeamLabels_1_1 && !myTeamLabels_1_1.done && (_s = myTeamLabels_1.return)) _s.call(myTeamLabels_1);
}
finally { if (e_11) throw e_11.error; }
}
_14.label = 3;
case 3:
_14.trys.push([3, 15, 16, 17]);
_a = __values(Object.keys(importData.labels)), _b = _a.next();
_14.label = 4;
case 4:
if (!!_b.done) return [3 /*break*/, 14];
labelId = _b.value;
label = importData.labels[labelId];
labelName = ___default["default"].truncate((_9 = label === null || label === void 0 ? void 0 : label.name) === null || _9 === void 0 ? void 0 : _9.trim(), { length: 20 });
labelArray = labelName.split(",");
_14.label = 5;
case 5:
_14.trys.push([5, 11, 12, 13]);
labelArray_1 = (e_1 = void 0, __values(labelArray)), labelArray_1_1 = labelArray_1.next();
_14.label = 6;
case 6:
if (!!labelArray_1_1.done) return [3 /*break*/, 10];
nameOfLabel = labelArray_1_1.value;
actualLabelId = existingLabelMap[nameOfLabel.toLowerCase()];
if (!(!actualLabelId && nameOfLabel.length > 0)) return [3 /*break*/, 8];
return [4 /*yield*/, client.createStoryLabel(nameOfLabel)];
case 7:
labelResponse = _14.sent();
labelData = labelResponse.data.data.createStoryLabel;
if (labelData === null || labelData === void 0 ? void 0 : labelData.id) {
actualLabelId = labelData === null || labelData === void 0 ? void 0 : labelData.id;
}
existingLabelMap[nameOfLabel.toLowerCase()] = actualLabelId;
_14.label = 8;
case 8:
labelMapping[nameOfLabel.toLowerCase()] = actualLabelId;
_14.label = 9;
case 9:
labelArray_1_1 = labelArray_1.next();
return [3 /*break*/, 6];
case 10: return [3 /*break*/, 13];
case 11:
e_1_1 = _14.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 13];
case 12:
try {
if (labelArray_1_1 && !labelArray_1_1.done && (_u = labelArray_1.return)) _u.call(labelArray_1);
}
finally { if (e_1) throw e_1.error; }
return [7 /*endfinally*/];
case 13:
_b = _a.next();
return [3 /*break*/, 4];
case 14: return [3 /*break*/, 17];
case 15:
e_2_1 = _14.sent();
e_2 = { error: e_2_1 };
return [3 /*break*/, 17];
case 16:
try {
if (_b && !_b.done && (_t = _a.return)) _t.call(_a);
}
finally { if (e_2) throw e_2.error; }
return [7 /*endfinally*/];
case 17:
categoryMapping = {};
if (!(Object.keys(importData.categories).length !== 0)) return [3 /*break*/, 27];
return [4 /*yield*/, client.teamCategories()];
case 18:
categoryQuery = _14.sent();
categories = categoryQuery.data.data.myTeamCategories;
existingCategoryMap = {};
try {
for (categories_1 = __values(categories), categories_1_1 = categories_1.next(); !categories_1_1.done; categories_1_1 = categories_1.next()) {
catergory = categories_1_1.value;
categoryName = catergory.name;
existingCategoryMap[categoryName] = catergory.id;
}
}
catch (e_12_1) { e_12 = { error: e_12_1 }; }
finally {
try {
if (categories_1_1 && !categories_1_1.done && (_v = categories_1.return)) _v.call(categories_1);
}
finally { if (e_12) throw e_12.error; }
}
_14.label = 19;
case 19:
_14.trys.push([19, 25, 26, 27]);
_c = __values(Object.keys(importData.categories)), _d = _c.next();
_14.label = 20;
case 20:
if (!!_d.done) return [3 /*break*/, 24];
cat = _d.value;
if (!(cat !== "")) return [3 /*break*/, 23];
catName = importData.categories[cat].name;
actualCatId = existingCategoryMap[catName];
if (!!actualCatId) return [3 /*break*/, 22];
return [4 /*yield*/, client.createStoryCategory(catName)];
case 21:
catResponse = _14.sent();
catData = catResponse.data.data.createStoryCategory;
if (catData === null || catData === void 0 ? void 0 : catData.id) {
actualCatId = catData === null || catData === void 0 ? void 0 : catData.id;
}
existingCategoryMap[catName] = actualCatId;
_14.label = 22;
case 22:
categoryMapping[cat] = actualCatId;
_14.label = 23;
case 23:
_d = _c.next();
return [3 /*break*/, 20];
case 24: return [3 /*break*/, 27];
case 25:
e_3_1 = _14.sent();
e_3 = { error: e_3_1 };
return [3 /*break*/, 27];
case 26:
try {
if (_d && !_d.done && (_w = _c.return)) _w.call(_c);
}
finally { if (e_3) throw e_3.error; }
return [7 /*endfinally*/];
case 27:
contactMapping = {};
existingContactMap = {};
if (!(Object.keys(importData.contacts).length !== 0)) return [3 /*break*/, 37];
return [4 /*yield*/, client.myTeamMembers()];
case 28:
teamMemberQuery = _14.sent();
teamMembers = teamMemberQuery.data.data.myTeamMembers;
try {
for (teamMembers_1 = __values(teamMembers), teamMembers_1_1 = teamMembers_1.next(); !teamMembers_1_1.done; teamMembers_1_1 = teamMembers_1.next()) {
member = teamMembers_1_1.value;
contactEmail = member.user.email;
existingContactMap[contactEmail] = member.id;
}
}
catch (e_13_1) { e_13 = { error: e_13_1 }; }
finally {
try {
if (teamMembers_1_1 && !teamMembers_1_1.done && (_x = teamMembers_1.return)) _x.call(teamMembers_1);
}
finally { if (e_13) throw e_13.error; }
}
_14.label = 29;
case 29:
_14.trys.push([29, 35, 36, 37]);
_e = __values(Object === null || Object === void 0 ? void 0 : Object.keys(importData === null || importData === void 0 ? void 0 : importData.contacts)), _f = _e.next();
_14.label = 30;
case 30:
if (!!_f.done) return [3 /*break*/, 34];
contact = _f.value;
if (!(contact !== "" && importData.contacts[contact].email)) return [3 /*break*/, 33];
contactEmail = importData.contacts[contact].email;
user = __assign({}, importData.contacts[contact]);
actualContactId = existingContactMap[contactEmail];
if (!!actualContactId) return [3 /*break*/, 32];
return [4 /*yield*/, client.createMembership(user)];
case 31:
contactResponse = _14.sent();
contactData = contactResponse.data.data.createMembership;
if (contactData === null || contactData === void 0 ? void 0 : contactData.id) {
actualContactId = contactData === null || contactData === void 0 ? void 0 : contactData.id;
}
existingContactMap[contactEmail] = actualContactId;
_14.label = 32;
case 32:
contactMapping[contact] = actualContactId;
_14.label = 33;
case 33:
_f = _e.next();
return [3 /*break*/, 30];
case 34: return [3 /*break*/, 37];
case 35:
e_4_1 = _14.sent();
e_4 = { error: e_4_1 };
return [3 /*break*/, 37];
case 36:
try {
if (_f && !_f.done && (_y = _e.return)) _y.call(_e);
}
finally { if (e_4) throw e_4.error; }
return [7 /*endfinally*/];
case 37:
storyMapping = {};
_14.label = 38;
case 38:
_14.trys.push([38, 43, 44, 45]);
_g = __values(importData.stories), _h = _g.next();
_14.label = 39;
case 39:
if (!!_h.done) return [3 /*break*/, 42];
story = _h.value;
// replace story labels with label id
if (story.labels) {
storyLabelIds = story.labels.map(function (label) {
return labelMapping[label.toLowerCase()];
});
story.labels = storyLabelIds;
}
// replace story categories with category id
if (story.category) {
story.category = categoryMapping[story.category];
}
if (story.contactEmail) {
story.contactId = contactMapping[story.contactEmail];
}
return [4 /*yield*/, client.createStory(story)];
case 40:
response = _14.sent();
storyData = response.data.data.createStory;
if (storyData === null || storyData === void 0 ? void 0 : storyData.id) {
storyMapping[story.name] = storyData === null || storyData === void 0 ? void 0 : storyData.id;
}
_14.label = 41;
case 41:
_h = _g.next();
return [3 /*break*/, 39];
case 42: return [3 /*break*/, 45];
case 43:
e_5_1 = _14.sent();
e_5 = { error: e_5_1 };
return [3 /*break*/, 45];
case 44:
try {
if (_h && !_h.done && (_z = _g.return)) _z.call(_g);
}
finally { if (e_5) throw e_5.error; }
return [7 /*endfinally*/];
case 45:
_14.trys.push([45, 50, 51, 52]);
_j = __values(importData.insights), _k = _j.next();
_14.label = 46;
case 46:
if (!!_k.done) return [3 /*break*/, 49];
insight = _k.value;
// replace story name with story id
insight.story = storyMapping[insight.story];
// replace contact email with contact id
insight.contactId = contactMapping[insight.contactEmail];
return [4 /*yield*/, client.createInsight(insight)];
case 47:
_14.sent();
_14.label = 48;
case 48:
_k = _j.next();
return [3 /*break*/, 46];
case 49: return [3 /*break*/, 52];
case 50:
e_6_1 = _14.sent();
e_6 = { error: e_6_1 };
return [3 /*break*/, 52];
case 51:
try {
if (_k && !_k.done && (_0 = _j.return)) _0.call(_j);
}
finally { if (e_6) throw e_6.error; }
return [7 /*endfinally*/];
case 52:
if (!(importData.messages.length !== 0)) return [3 /*break*/, 60];
_14.label = 53;
case 53:
_14.trys.push([53, 58, 59, 60]);
_l = __values(importData.messages), _m = _l.next();
_14.label = 54;
case 54:
if (!!_m.done) return [3 /*break*/, 57];
message = _m.value;
// create message on UserVitals
message.contactId = contactMapping[message.contactEmail];
message.creatorId = contactMapping[message.creatorEmail];
return [4 /*yield*/, client.createMessage(message)];
case 55:
_14.sent();
_14.label = 56;
case 56:
_m = _l.next();
return [3 /*break*/, 54];
case 57: return [3 /*break*/, 60];
case 58:
e_7_1 = _14.sent();
e_7 = { error: e_7_1 };
return [3 /*break*/, 60];
case 59:
try {
if (_m && !_m.done && (_1 = _l.return)) _1.call(_l);
}
finally { if (e_7) throw e_7.error; }
return [7 /*endfinally*/];
case 60:
if (!(importData.changelogs.length !== 0)) return [3 /*break*/, 83];
return [4 /*yield*/, client.changelogLabels()];
case 61:
changelogLabelQuery = (_14.sent()) || [];
myTeamChangelogLabels = (_11 = (_10 = changelogLabelQuery === null || changelogLabelQuery === void 0 ? void 0 : changelogLabelQuery.data) === null || _10 === void 0 ? void 0 : _10.data) === null || _11 === void 0 ? void 0 : _11.myTeamChangelogLabels;
existingChangelogLabelMap = {};
if ((myTeamChangelogLabels === null || myTeamChangelogLabels === void 0 ? void 0 : myTeamChangelogLabels.length) > 0) {
try {
for (myTeamChangelogLabels_1 = __values(myTeamChangelogLabels), myTeamChangelogLabels_1_1 = myTeamChangelogLabels_1.next(); !myTeamChangelogLabels_1_1.done; myTeamChangelogLabels_1_1 = myTeamChangelogLabels_1.next()) {
label = myTeamChangelogLabels_1_1.value;
labelName = (_12 = label.name) === null || _12 === void 0 ? void 0 : _12.toLowerCase();
existingChangelogLabelMap[labelName] = label.id;
}
}
catch (e_14_1) { e_14 = { error: e_14_1 }; }
finally {
try {
if (myTeamChangelogLabels_1_1 && !myTeamChangelogLabels_1_1.done && (_2 = myTeamChangelogLabels_1.return)) _2.call(myTeamChangelogLabels_1);
}
finally { if (e_14) throw e_14.error; }
}
}
if (!(Object.keys(importData.changelogLabels).length !== 0)) return [3 /*break*/, 83];
changelogLabelMapping_1 = {};
_14.label = 62;
case 62:
_14.trys.push([62, 74, 75, 76]);
_o = __values(Object.keys(importData.changelogLabels)), _p = _o.next();
_14.label = 63;
case 63:
if (!!_p.done) return [3 /*break*/, 73];
labelId = _p.value;
label = importData.changelogLabels[labelId];
labelName = ___default["default"].truncate((_13 = label === null || label === void 0 ? void 0 : label.name) === null || _13 === void 0 ? void 0 : _13.trim(), { length: 20 });
labelArray = labelName.split(",");
_14.label = 64;
case 64:
_14.trys.push([64, 70, 71, 72]);
labelArray_2 = (e_8 = void 0, __values(labelArray)), labelArray_2_1 = labelArray_2.next();
_14.label = 65;
case 65:
if (!!labelArray_2_1.done) return [3 /*break*/, 69];
nameOfLabel = labelArray_2_1.value;
if (!(nameOfLabel !== "")) return [3 /*break*/, 68];
actualLabelId = existingChangelogLabelMap[nameOfLabel.toLowerCase()];
if (!!actualLabelId) return [3 /*break*/, 67];
return [4 /*yield*/, client.createChangelogLabel(nameOfLabel)];
case 66:
labelResponse = _14.sent();
labelData = labelResponse.data.data.createChangelogLabel;
if (labelData === null || labelData === void 0 ? void 0 : labelData.id) {
actualLabelId = labelData === null || labelData === void 0 ? void 0 : labelData.id;
}
existingChangelogLabelMap[nameOfLabel.toLowerCase()] = actualLabelId;
_14.label = 67;
case 67:
changelogLabelMapping_1[nameOfLabel.toLowerCase()] = actualLabelId;
_14.label = 68;
case 68:
labelArray_2_1 = labelArray_2.next();
return [3 /*break*/, 65];
case 69: return [3 /*break*/, 72];
case 70:
e_8_1 = _14.sent();
e_8 = { error: e_8_1 };
return [3 /*break*/, 72];
case 71:
try {
if (labelArray_2_1 && !labelArray_2_1.done && (_4 = labelArray_2.return)) _4.call(labelArray_2);
}
finally { if (e_8) throw e_8.error; }
return [7 /*endfinally*/];
case 72:
_p = _o.next();
return [3 /*break*/, 63];
case 73: return [3 /*break*/, 76];
case 74:
e_9_1 = _14.sent();
e_9 = { error: e_9_1 };
return [3 /*break*/, 76];
case 75:
try {
if (_p && !_p.done && (_3 = _o.return)) _3.call(_o);
}
finally { if (e_9) throw e_9.error; }
return [7 /*endfinally*/];
case 76:
_14.trys.push([76, 81, 82, 83]);
_q = __values(importData.changelogs), _r = _q.next();
_14.label = 77;
case 77:
if (!!_r.done) return [3 /*break*/, 80];
changelog = _r.value;
storyLabelIds = changelog.labels.map(function (label) {
var returnVariable = label ? changelogLabelMapping_1[label.toLowerCase()] : "";
return returnVariable;
});
changelog.labels = storyLabelIds;
// create changelogs on UserVitals
return [4 /*yield*/, client.createChangelog(changelog)];
case 78:
// create changelogs on UserVitals
_14.sent();
_14.label = 79;
case 79:
_r = _q.next();
return [3 /*break*/, 77];
case 80: return [3 /*break*/, 83];
case 81:
e_10_1 = _14.sent();
e_10 = { error: e_10_1 };
return [3 /*break*/, 83];
case 82:
try {
if (_r && !_r.done && (_5 = _q.return)) _5.call(_q);
}
finally { if (e_10) throw e_10.error; }
return [7 /*endfinally*/];
case 83: return [2 /*return*/];
}
});
}); };
var BASE_PATH = process.cwd();
var pathQuestion = {
basePath: BASE_PATH,
type: "filePath",
name: "filePath",
message: "Select your exported CSV file",
};
var genericQuestion = [pathQuestion];
var productBoardQuestions = [
{
type: "list",
message: "Pick the type of file to be imported:",
name: "importType",
choices: [
{
name: "Feature Export",
value: "features",
},
{
name: "Notes Export",
value: "notes",
},
],
},
pathQuestion,
];
var changelogQuestions = [
pathQuestion,
{
type: "list",
message: "Choose the status of the newly imported changelogs",
name: "status",
choices: [
{
name: "Published",
value: "PUBLISHED",
},
{
name: "Draft",
value: "DRAFT",
},
],
},
];
/**
* Import issues from a Generic CSV export.
* @param filePath Path to CSV file
* @prarm sdk API
*/
var GenericCsvImporter = /** @class */ (function () {
function GenericCsvImporter(filePath) {
var _this = this;
this.import = function () { return __awaiter(_this, void 0, void 0, function () {
var csvData, data, data_1, data_1_1, row;
var e_1, _a;
var _b, _c, _d, _e;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
csvData = {
messages: [],
insights: [],
stories: [],
changelogs: [],
changelogLabels: {},
labels: {},
categories: {},
contacts: {},
};
return [4 /*yield*/, csv__default["default"]().fromFile(this.filePath)];
case 1:
data = (_f.sent());
if (data.length < 1) {
return [2 /*return*/, Promise.reject(new Error("No data found in CSV file."))];
}
try {
for (data_1 = __values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {
row = data_1_1.value;
csvData.insights.push({
text: row.Text,
type: row.Type,
source: row.Source,
integration: row.Integration,
story: row.Name,
contactEmail: row["Contact Email"],
contactName: row["Contact Name"],
contactId: "",
});
csvData.stories.push({
name: row.Name,
desc: row.Description,
privDesc: row["Private Description"],
contactId: "",
contactName: row["Created By Name"],
contactEmail: row["Created By Email"],
status: row.Status,
visibility: row.Visibility,
category: row.Category,
labels: (_c = (_b = row === null || row === void 0 ? void 0 : row.Labels) === null || _b === void 0 ? void 0 : _b.trim()) === null || _c === void 0 ? void 0 : _c.split(","),
});
csvData.labels[(_d = row.Labels) === null || _d === void 0 ? void 0 : _d.trim()] = {
name: (_e = row.Labels) === null || _e === void 0 ? void 0 : _e.trim(),
};
csvData.contacts[row["Contact Email"]] = {
name: row["Contact Name"],
email: row["Contact Email"],
role: "CUSTOMER",
};
csvData.contacts[row["Created By Email"]] = {
name: row["Created By Name"],
email: row["Created By Email"],
role: "ADMIN",
};
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);
}
finally { if (e_1) throw e_1.error; }
}
// remove duplicates
csvData.stories = __spreadArray([], __read(new Set(csvData.stories)), false);
console.log(chalk__default["default"].green("Insight CSV Data Parsed"));
return [2 /*return*/, csvData];
}
});
}); };
this.filePath = filePath;
}
Object.defineProperty(GenericCsvImporter.prototype, "name", {
get: function () {
return "Generic (CSV)";
},
enumerable: false,
configurable: true
});
Object.defineProperty(GenericCsvImporter.prototype, "defaultTeamName", {
get: function () {
return "Generic";
},
enumerable: false,
configurable: true
});
return GenericCsvImporter;
}());
var genericCsvImporter = function () { return __awaiter(void 0, void 0, void 0, function () {
var answers, genericImporter;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, inquirer__namespace.prompt(genericQuestion)];
case 1:
answers = _a.sent();
genericImporter = new GenericCsvImporter(answers.filePath);
return [2 /*return*/, genericImporter];
}
});
}); };
/**
* Import issues from a Generic CSV export.
* @param filePath Path to CSV file
* @prarm sdk API
*/
var CannyCsvImporter = /** @class */ (function () {
function CannyCsvImporter(filePath) {
var _this = this;
// convert to UserVitals format
this.statusMap = {
"under review": "UnderReview",
planned: "Planned",
"in progress": "InProgress",
complete: "Completed",
closed: "Closed",
open: "Open",
};
this.import = function () { return __awaiter(_this, void 0, void 0, function () {
var csvData, data, duplicate, data_1, data_1_1, row;
var e_1, _a;
var _b;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
csvData = {
stories: [],
insights: [],
messages: [],
changelogs: [],
changelogLabels: {},
labels: {},
categories: {},
contacts: {},
};
return [4 /*yield*/, csv__default["default"]().fromFile(this.filePath)];
case 1:
data = (_c.sent());
if (data.length < 1) {
return [2 /*return*/, Promise.reject(