@teambit/export 1.0.1150 → 1.0.1152

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.
@@ -11,6 +11,34 @@ function _chalk() {
11
11
  };
12
12
  return data;
13
13
  }
14
+ function _lodash() {
15
+ const data = require("lodash");
16
+ _lodash = function () {
17
+ return data;
18
+ };
19
+ return data;
20
+ }
21
+ function _yesno() {
22
+ const data = _interopRequireDefault(require("yesno"));
23
+ _yesno = function () {
24
+ return data;
25
+ };
26
+ return data;
27
+ }
28
+ function _cli() {
29
+ const data = require("@teambit/cli");
30
+ _cli = function () {
31
+ return data;
32
+ };
33
+ return data;
34
+ }
35
+ function _bitError() {
36
+ const data = require("@teambit/bit-error");
37
+ _bitError = function () {
38
+ return data;
39
+ };
40
+ return data;
41
+ }
14
42
  function _exportScopeComponents() {
15
43
  const data = require("./export-scope-components");
16
44
  _exportScopeComponents = function () {
@@ -19,30 +47,142 @@ function _exportScopeComponents() {
19
47
  return data;
20
48
  }
21
49
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
50
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
51
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22
52
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
23
53
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
24
54
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
25
55
  class ResumeExportCmd {
26
- constructor(scope) {
56
+ constructor(scope, logger) {
27
57
  this.scope = scope;
58
+ this.logger = logger;
28
59
  _defineProperty(this, "name", 'resume-export <export-id> <remotes...>');
29
60
  _defineProperty(this, "description", 'EXPERIMENTAL. resume failed export');
30
61
  _defineProperty(this, "extendedDescription", `resume failed export to persist the pending objects on the given remotes.
31
62
  the export-id is the id the client received in the error message during the failure.
32
- alternatively, exporting to any one of the failed scopes, throws server-is-busy error with the export-id`);
63
+ alternatively, exporting to any one of the failed scopes, throws server-is-busy error with the export-id.
64
+
65
+ "--delete" discards the pending objects instead of persisting them, which frees the export-queue of these
66
+ scopes. it is only the right move when no scope has persisted this export yet, e.g. when it failed during
67
+ the validation step, or when the export was abandoned and is now blocking others. if the export failed
68
+ during the persist step, some scopes are already updated - deleting the rest would leave them with
69
+ dependencies that were never exported, so run without "--delete" to persist the remaining scopes instead.
70
+ the command checks which scopes still hold the pending objects and asks for confirmation before deleting.
71
+ pass all the scopes that were used for the export, the export error lists them.
72
+ only run it once the export is over: the check and the deletion are separate requests, so an export that
73
+ persists a scope in between can still leave the scopes inconsistent`);
33
74
  _defineProperty(this, "alias", '');
34
- _defineProperty(this, "options", []);
75
+ _defineProperty(this, "options", [['', 'delete', 'discard the pending objects of this export-id instead of persisting them'], ['', 'force', 'for --delete, skip the confirmation prompt. needed when running non-interactively']]);
35
76
  _defineProperty(this, "loader", true);
36
77
  _defineProperty(this, "group", 'advanced');
37
78
  _defineProperty(this, "private", true);
38
79
  _defineProperty(this, "remoteOp", true);
39
80
  }
40
- async report([exportId, remotes]) {
81
+ async report([exportId, remotes], options) {
82
+ if (options.delete) return this.deletePendingObjects(exportId, remotes, Boolean(options.force));
41
83
  const exportedIds = await (0, _exportScopeComponents().resumeExport)(this.scope.legacyScope, exportId, remotes);
42
84
  if (!exportedIds.length) return _chalk().default.yellow('no components were left to persist for this export-id');
43
85
  return `the following components were persisted successfully:
44
86
  ${exportedIds.join('\n')}`;
45
87
  }
88
+ async deletePendingObjects(exportId, remoteNames, force) {
89
+ // a repeated scope would be probed and deleted twice in parallel, and would count twice in every
90
+ // total below - including the all-probes-failed check, which compares against unique scope names
91
+ const remotes = (0, _lodash().uniq)(remoteNames);
92
+ const probe = await (0, _exportScopeComponents().probePendingExport)(this.scope.legacyScope, exportId, remotes);
93
+ const probeFailed = Object.keys(probe.failed);
94
+ if (probeFailed.length === remotes.length) {
95
+ throw new (_bitError().BitError)(`failed reaching all the given scopes:
96
+ ${this.failedLines(probe.failed).join('\n')}`);
97
+ }
98
+ // a scope that reports "absent" has nothing for us to delete, so leave it out of the request entirely.
99
+ const scopesToClear = [...probe.present, ...probe.unknown];
100
+ if (!scopesToClear.length) {
101
+ const nothingFound = `no pending objects of "${exportId}" were found, nothing to delete`;
102
+ return (0, _cli().joinSections)([this.formatFailedSection(probe.failed),
103
+ // don't call it a success when some scopes never answered - they may well be holding the objects
104
+ probeFailed.length ? (0, _cli().formatWarningSummary)(`${nothingFound} on the scopes that answered`) : (0, _cli().formatSuccessSummary)(nothingFound)]);
105
+ }
106
+ // print what the probe found in both modes. "--force" skips the prompt, not the findings
107
+ this.logger.console(this.formatProbeResult(exportId, probe, scopesToClear));
108
+ if (!force) await this.confirmDeletion(exportId, scopesToClear);
109
+ const result = await (0, _exportScopeComponents().deletePendingExport)(this.scope.legacyScope, exportId, scopesToClear);
110
+ return this.formatDeleteResult(exportId, result, probe);
111
+ }
112
+
113
+ /**
114
+ * the whole point of the probe: show what was found before destroying it, loudest when a scope
115
+ * reports "absent" and so this export may be partially persisted already.
116
+ */
117
+ formatProbeResult(exportId, probe, scopesToClear) {
118
+ const sections = [(0, _cli().formatSection)('pending objects to delete', `(of the export-id "${exportId}")`, scopesToClear.map(scopeName => (0, _cli().formatItem)(scopeName)))];
119
+ // any "absent" scope is a possible partial persist, whether the rest answered "present" or are
120
+ // unknown old servers. unknown scopes get deleted too, so the warning matters just as much there.
121
+ if (probe.absent.length) {
122
+ sections.push((0, _cli().formatSection)(`${_cli().warnSymbol} scopes that no longer hold these objects`, `a scope drops the pending objects as soon as it persisted them, so this export may be
123
+ partially persisted already. if it is, deleting the rest leaves these scopes with
124
+ dependencies that were never exported. run without "--delete" to persist instead.`, probe.absent.map(scopeName => (0, _cli().formatItem)(scopeName, _cli().warnSymbol))));
125
+ }
126
+ if (probe.unknown.length) {
127
+ sections.push((0, _cli().formatWarningSummary)(`${probe.unknown.length} scope(s) run a server that can't report whether anything is pending, so the check above skipped them`));
128
+ }
129
+ sections.push(this.formatFailedSection(probe.failed));
130
+ return (0, _cli().joinSections)(sections);
131
+ }
132
+ async confirmDeletion(exportId, scopesToClear) {
133
+ if (!(0, _cli().canPromptUser)()) {
134
+ throw new (_bitError().BitError)(`unable to prompt for confirmation in a non-interactive terminal.
135
+ review the list above and re-run with "--force" to delete`);
136
+ }
137
+ const ok = await (0, _yesno().default)({
138
+ question: `deleting the pending objects of "${exportId}" from ${scopesToClear.length} scope(s) cannot be undone.
139
+ ${_chalk().default.bold('Would you like to proceed? [yes(y)/no(n)]')}`
140
+ });
141
+ if (!ok) throw new (_bitError().BitError)('aborted, nothing was deleted');
142
+ }
143
+ formatDeleteResult(exportId, result, probe) {
144
+ // a scope whose probe failed was never attempted, so it may still be holding the objects and
145
+ // blocking the queue. it belongs in the final report just as much as a failed deletion does,
146
+ // and with "--force" this is the only place the user gets to see it.
147
+ const failed = _objectSpread(_objectSpread({}, probe.failed), result.failed);
148
+ const failedScopes = Object.keys(failed);
149
+ // "present" here means the remote had the objects and removed them, "unknown" that it removed
150
+ // without reporting. either way they're cleared. "absent" means there was nothing to remove
151
+ const cleared = result.present.length + result.unknown.length;
152
+ if (!cleared && !result.absent.length) {
153
+ // every scope failed. "absent" counts as an answer, so this list is never empty here
154
+ throw new (_bitError().BitError)(`failed removing the pending objects of "${exportId}" from all the given scopes:
155
+ ${this.failedLines(failed).join('\n')}`);
156
+ }
157
+ const clearedMsg = `deleted the pending objects of "${exportId}" from ${cleared} scope(s)`;
158
+ let summary;
159
+ if (failedScopes.length) summary = (0, _cli().formatWarningSummary)(`${clearedMsg}, ${failedScopes.length} failed`);
160
+ // the scopes persisted between the probe and the deletion, so there was nothing left to delete
161
+ else if (!cleared) summary = (0, _cli().formatSuccessSummary)(`nothing was pending anymore, no objects were deleted`);else summary = (0, _cli().formatSuccessSummary)(clearedMsg);
162
+ const untouched = probe.absent.length + result.absent.length;
163
+ const hint = untouched ? (0, _cli().formatHint)(`(${untouched} scope(s) had nothing pending and were left untouched)`) : '';
164
+ return (0, _cli().joinSections)([this.formatRaceSection(probe, result), this.formatFailedSection(failed), summary, hint]);
165
+ }
166
+
167
+ /**
168
+ * the probe is a snapshot, not a reservation, so a scope can persist the export in the gap between
169
+ * the check and the deletion. that leaves the same partial persist the probe exists to prevent, and
170
+ * the only trace of it is a scope that held the objects during the probe but not during the
171
+ * deletion. it can't be prevented from here - it needs the two operations to exclude each other on
172
+ * the server - so at least report it instead of counting it as an ordinary no-op.
173
+ */
174
+ formatRaceSection(probe, result) {
175
+ const changedMidway = probe.present.filter(scopeName => result.absent.includes(scopeName));
176
+ return (0, _cli().formatSection)(`${_cli().warnSymbol} scopes that changed while this command ran`, `these scopes held the pending objects during the check but not during the deletion.
177
+ something else persisted or removed them in between, so this export may now be
178
+ partially persisted. verify it before relying on the result above.`, changedMidway.map(scopeName => (0, _cli().formatItem)(scopeName, _cli().warnSymbol)));
179
+ }
180
+ formatFailedSection(failed) {
181
+ return (0, _cli().formatSection)(`${_cli().errorSymbol} failed scopes`, '(these scopes could not be reached, nothing was deleted from them)', this.failedLines(failed).map(line => (0, _cli().formatItem)(line, _cli().errorSymbol)));
182
+ }
183
+ failedLines(failed) {
184
+ return Object.entries(failed).map(([scopeName, message]) => `${scopeName} - ${message}`);
185
+ }
46
186
  }
47
187
  exports.ResumeExportCmd = ResumeExportCmd;
48
188
 
@@ -1 +1 @@
1
- {"version":3,"names":["_chalk","data","_interopRequireDefault","require","_exportScopeComponents","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ResumeExportCmd","constructor","scope","report","exportId","remotes","exportedIds","resumeExport","legacyScope","length","chalk","yellow","join","exports"],"sources":["resume-export-cmd.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { Command, CommandOptions } from '@teambit/cli';\nimport type { ScopeMain } from '@teambit/scope';\nimport { resumeExport } from './export-scope-components';\n\nexport class ResumeExportCmd implements Command {\n name = 'resume-export <export-id> <remotes...>';\n description = 'EXPERIMENTAL. resume failed export';\n extendedDescription = `resume failed export to persist the pending objects on the given remotes.\nthe export-id is the id the client received in the error message during the failure.\nalternatively, exporting to any one of the failed scopes, throws server-is-busy error with the export-id`;\n alias = '';\n options = [] as CommandOptions;\n loader = true;\n group = 'advanced';\n private = true;\n remoteOp = true;\n\n constructor(private scope: ScopeMain) {}\n\n async report([exportId, remotes]: [string, string[]]): Promise<string> {\n const exportedIds = await resumeExport(this.scope.legacyScope, exportId, remotes);\n if (!exportedIds.length) return chalk.yellow('no components were left to persist for this export-id');\n return `the following components were persisted successfully:\n${exportedIds.join('\\n')}`;\n }\n}\n"],"mappings":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,sBAAA,CAAAC,OAAA;EAAAH,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGA,SAAAG,uBAAA;EAAA,MAAAH,IAAA,GAAAE,OAAA;EAAAC,sBAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAyD,SAAAC,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,gBAAAH,CAAA,EAAAI,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAJ,CAAA,GAAAO,MAAA,CAAAC,cAAA,CAAAR,CAAA,EAAAI,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAZ,CAAA,CAAAI,CAAA,IAAAC,CAAA,EAAAL,CAAA;AAAA,SAAAM,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAL,CAAA,GAAAK,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAhB,CAAA,QAAAa,CAAA,GAAAb,CAAA,CAAAiB,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA;AAElD,MAAMgB,eAAe,CAAoB;EAa9CC,WAAWA,CAASC,KAAgB,EAAE;IAAA,KAAlBA,KAAgB,GAAhBA,KAAgB;IAAApB,eAAA,eAZ7B,wCAAwC;IAAAA,eAAA,sBACjC,oCAAoC;IAAAA,eAAA,8BAC5B;AACxB;AACA,yGAAyG;IAAAA,eAAA,gBAC/F,EAAE;IAAAA,eAAA,kBACA,EAAE;IAAAA,eAAA,iBACH,IAAI;IAAAA,eAAA,gBACL,UAAU;IAAAA,eAAA,kBACR,IAAI;IAAAA,eAAA,mBACH,IAAI;EAEwB;EAEvC,MAAMqB,MAAMA,CAAC,CAACC,QAAQ,EAAEC,OAAO,CAAqB,EAAmB;IACrE,MAAMC,WAAW,GAAG,MAAM,IAAAC,qCAAY,EAAC,IAAI,CAACL,KAAK,CAACM,WAAW,EAAEJ,QAAQ,EAAEC,OAAO,CAAC;IACjF,IAAI,CAACC,WAAW,CAACG,MAAM,EAAE,OAAOC,gBAAK,CAACC,MAAM,CAAC,uDAAuD,CAAC;IACrG,OAAO;AACX,EAAEL,WAAW,CAACM,IAAI,CAAC,IAAI,CAAC,EAAE;EACxB;AACF;AAACC,OAAA,CAAAb,eAAA,GAAAA,eAAA","ignoreList":[]}
1
+ {"version":3,"names":["_chalk","data","_interopRequireDefault","require","_lodash","_yesno","_cli","_bitError","_exportScopeComponents","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","ResumeExportCmd","constructor","scope","logger","report","exportId","remotes","options","delete","deletePendingObjects","Boolean","force","exportedIds","resumeExport","legacyScope","chalk","yellow","join","remoteNames","uniq","probe","probePendingExport","probeFailed","failed","BitError","failedLines","scopesToClear","present","unknown","nothingFound","joinSections","formatFailedSection","formatWarningSummary","formatSuccessSummary","console","formatProbeResult","confirmDeletion","result","deletePendingExport","formatDeleteResult","sections","formatSection","map","scopeName","formatItem","absent","warnSymbol","canPromptUser","ok","yesno","question","bold","failedScopes","cleared","clearedMsg","summary","untouched","hint","formatHint","formatRaceSection","changedMidway","includes","errorSymbol","line","entries","message","exports"],"sources":["resume-export-cmd.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { uniq } from 'lodash';\nimport yesno from 'yesno';\nimport type { Command, CommandOptions } from '@teambit/cli';\nimport {\n canPromptUser,\n errorSymbol,\n formatHint,\n formatItem,\n formatSection,\n formatSuccessSummary,\n formatWarningSummary,\n joinSections,\n warnSymbol,\n} from '@teambit/cli';\nimport { BitError } from '@teambit/bit-error';\nimport type { Logger } from '@teambit/logger';\nimport type { ScopeMain } from '@teambit/scope';\nimport type { PendingDirScopes } from './export-scope-components';\nimport { deletePendingExport, probePendingExport, resumeExport } from './export-scope-components';\n\nexport type ResumeExportOptions = { delete?: boolean; force?: boolean };\n\nexport class ResumeExportCmd implements Command {\n name = 'resume-export <export-id> <remotes...>';\n description = 'EXPERIMENTAL. resume failed export';\n extendedDescription = `resume failed export to persist the pending objects on the given remotes.\nthe export-id is the id the client received in the error message during the failure.\nalternatively, exporting to any one of the failed scopes, throws server-is-busy error with the export-id.\n\n\"--delete\" discards the pending objects instead of persisting them, which frees the export-queue of these\nscopes. it is only the right move when no scope has persisted this export yet, e.g. when it failed during\nthe validation step, or when the export was abandoned and is now blocking others. if the export failed\nduring the persist step, some scopes are already updated - deleting the rest would leave them with\ndependencies that were never exported, so run without \"--delete\" to persist the remaining scopes instead.\nthe command checks which scopes still hold the pending objects and asks for confirmation before deleting.\npass all the scopes that were used for the export, the export error lists them.\nonly run it once the export is over: the check and the deletion are separate requests, so an export that\npersists a scope in between can still leave the scopes inconsistent`;\n alias = '';\n options = [\n ['', 'delete', 'discard the pending objects of this export-id instead of persisting them'],\n ['', 'force', 'for --delete, skip the confirmation prompt. needed when running non-interactively'],\n ] as CommandOptions;\n loader = true;\n group = 'advanced';\n private = true;\n remoteOp = true;\n\n constructor(\n private scope: ScopeMain,\n private logger: Logger\n ) {}\n\n async report([exportId, remotes]: [string, string[]], options: ResumeExportOptions): Promise<string> {\n if (options.delete) return this.deletePendingObjects(exportId, remotes, Boolean(options.force));\n const exportedIds = await resumeExport(this.scope.legacyScope, exportId, remotes);\n if (!exportedIds.length) return chalk.yellow('no components were left to persist for this export-id');\n return `the following components were persisted successfully:\n${exportedIds.join('\\n')}`;\n }\n\n private async deletePendingObjects(exportId: string, remoteNames: string[], force: boolean): Promise<string> {\n // a repeated scope would be probed and deleted twice in parallel, and would count twice in every\n // total below - including the all-probes-failed check, which compares against unique scope names\n const remotes = uniq(remoteNames);\n const probe = await probePendingExport(this.scope.legacyScope, exportId, remotes);\n const probeFailed = Object.keys(probe.failed);\n if (probeFailed.length === remotes.length) {\n throw new BitError(`failed reaching all the given scopes:\n${this.failedLines(probe.failed).join('\\n')}`);\n }\n // a scope that reports \"absent\" has nothing for us to delete, so leave it out of the request entirely.\n const scopesToClear = [...probe.present, ...probe.unknown];\n if (!scopesToClear.length) {\n const nothingFound = `no pending objects of \"${exportId}\" were found, nothing to delete`;\n return joinSections([\n this.formatFailedSection(probe.failed),\n // don't call it a success when some scopes never answered - they may well be holding the objects\n probeFailed.length\n ? formatWarningSummary(`${nothingFound} on the scopes that answered`)\n : formatSuccessSummary(nothingFound),\n ]);\n }\n // print what the probe found in both modes. \"--force\" skips the prompt, not the findings\n this.logger.console(this.formatProbeResult(exportId, probe, scopesToClear));\n if (!force) await this.confirmDeletion(exportId, scopesToClear);\n const result = await deletePendingExport(this.scope.legacyScope, exportId, scopesToClear);\n return this.formatDeleteResult(exportId, result, probe);\n }\n\n /**\n * the whole point of the probe: show what was found before destroying it, loudest when a scope\n * reports \"absent\" and so this export may be partially persisted already.\n */\n private formatProbeResult(exportId: string, probe: PendingDirScopes, scopesToClear: string[]): string {\n const sections: string[] = [\n formatSection(\n 'pending objects to delete',\n `(of the export-id \"${exportId}\")`,\n scopesToClear.map((scopeName) => formatItem(scopeName))\n ),\n ];\n // any \"absent\" scope is a possible partial persist, whether the rest answered \"present\" or are\n // unknown old servers. unknown scopes get deleted too, so the warning matters just as much there.\n if (probe.absent.length) {\n sections.push(\n formatSection(\n `${warnSymbol} scopes that no longer hold these objects`,\n `a scope drops the pending objects as soon as it persisted them, so this export may be\npartially persisted already. if it is, deleting the rest leaves these scopes with\ndependencies that were never exported. run without \"--delete\" to persist instead.`,\n probe.absent.map((scopeName) => formatItem(scopeName, warnSymbol))\n )\n );\n }\n if (probe.unknown.length) {\n sections.push(\n formatWarningSummary(\n `${probe.unknown.length} scope(s) run a server that can't report whether anything is pending, so the check above skipped them`\n )\n );\n }\n sections.push(this.formatFailedSection(probe.failed));\n return joinSections(sections);\n }\n\n private async confirmDeletion(exportId: string, scopesToClear: string[]): Promise<void> {\n if (!canPromptUser()) {\n throw new BitError(`unable to prompt for confirmation in a non-interactive terminal.\nreview the list above and re-run with \"--force\" to delete`);\n }\n const ok = await yesno({\n question: `deleting the pending objects of \"${exportId}\" from ${scopesToClear.length} scope(s) cannot be undone.\n${chalk.bold('Would you like to proceed? [yes(y)/no(n)]')}`,\n });\n if (!ok) throw new BitError('aborted, nothing was deleted');\n }\n\n private formatDeleteResult(exportId: string, result: PendingDirScopes, probe: PendingDirScopes): string {\n // a scope whose probe failed was never attempted, so it may still be holding the objects and\n // blocking the queue. it belongs in the final report just as much as a failed deletion does,\n // and with \"--force\" this is the only place the user gets to see it.\n const failed = { ...probe.failed, ...result.failed };\n const failedScopes = Object.keys(failed);\n // \"present\" here means the remote had the objects and removed them, \"unknown\" that it removed\n // without reporting. either way they're cleared. \"absent\" means there was nothing to remove\n const cleared = result.present.length + result.unknown.length;\n if (!cleared && !result.absent.length) {\n // every scope failed. \"absent\" counts as an answer, so this list is never empty here\n throw new BitError(`failed removing the pending objects of \"${exportId}\" from all the given scopes:\n${this.failedLines(failed).join('\\n')}`);\n }\n const clearedMsg = `deleted the pending objects of \"${exportId}\" from ${cleared} scope(s)`;\n let summary: string;\n if (failedScopes.length) summary = formatWarningSummary(`${clearedMsg}, ${failedScopes.length} failed`);\n // the scopes persisted between the probe and the deletion, so there was nothing left to delete\n else if (!cleared) summary = formatSuccessSummary(`nothing was pending anymore, no objects were deleted`);\n else summary = formatSuccessSummary(clearedMsg);\n const untouched = probe.absent.length + result.absent.length;\n const hint = untouched ? formatHint(`(${untouched} scope(s) had nothing pending and were left untouched)`) : '';\n return joinSections([this.formatRaceSection(probe, result), this.formatFailedSection(failed), summary, hint]);\n }\n\n /**\n * the probe is a snapshot, not a reservation, so a scope can persist the export in the gap between\n * the check and the deletion. that leaves the same partial persist the probe exists to prevent, and\n * the only trace of it is a scope that held the objects during the probe but not during the\n * deletion. it can't be prevented from here - it needs the two operations to exclude each other on\n * the server - so at least report it instead of counting it as an ordinary no-op.\n */\n private formatRaceSection(probe: PendingDirScopes, result: PendingDirScopes): string {\n const changedMidway = probe.present.filter((scopeName) => result.absent.includes(scopeName));\n return formatSection(\n `${warnSymbol} scopes that changed while this command ran`,\n `these scopes held the pending objects during the check but not during the deletion.\nsomething else persisted or removed them in between, so this export may now be\npartially persisted. verify it before relying on the result above.`,\n changedMidway.map((scopeName) => formatItem(scopeName, warnSymbol))\n );\n }\n\n private formatFailedSection(failed: { [scopeName: string]: string }): string {\n return formatSection(\n `${errorSymbol} failed scopes`,\n '(these scopes could not be reached, nothing was deleted from them)',\n this.failedLines(failed).map((line) => formatItem(line, errorSymbol))\n );\n }\n\n private failedLines(failed: { [scopeName: string]: string }): string[] {\n return Object.entries(failed).map(([scopeName, message]) => `${scopeName} - ${message}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/export",
3
- "version": "1.0.1150",
3
+ "version": "1.0.1152",
4
4
  "homepage": "https://bit.cloud/teambit/scope/export",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.scope",
8
8
  "name": "export",
9
- "version": "1.0.1150"
9
+ "version": "1.0.1152"
10
10
  },
11
11
  "dependencies": {
12
12
  "chalk": "4.1.2",
@@ -14,11 +14,11 @@
14
14
  "open": "8.4.2",
15
15
  "p-map-series": "2.1.0",
16
16
  "fs-extra": "10.0.0",
17
+ "yesno": "0.4.0",
17
18
  "@teambit/component-id": "1.2.4",
18
19
  "@teambit/legacy.constants": "0.0.42",
19
20
  "@teambit/harmony.modules.concurrency": "0.0.43",
20
21
  "@teambit/legacy.loader": "0.0.30",
21
- "@teambit/legacy.logger": "0.0.57",
22
22
  "@teambit/toolbox.promise.map-pool": "0.0.19",
23
23
  "@teambit/harmony": "0.4.12",
24
24
  "@teambit/bit-error": "0.0.404",
@@ -27,24 +27,25 @@
27
27
  "@teambit/legacy-bit-id": "1.1.3",
28
28
  "@teambit/legacy.analytics": "0.0.106",
29
29
  "@teambit/legacy.utils": "0.0.49",
30
- "@teambit/cli": "0.0.1384",
31
- "@teambit/eject": "1.0.1150",
32
- "@teambit/legacy.scope": "0.0.156",
33
- "@teambit/objects": "0.0.657",
34
- "@teambit/scope.remote-actions": "0.0.156",
35
- "@teambit/scope.remotes": "0.0.156",
36
- "@teambit/component.snap-distance": "0.0.157",
37
- "@teambit/dependency-resolver": "1.0.1150",
38
- "@teambit/legacy.bit-map": "0.0.213",
39
- "@teambit/legacy.component-list": "0.0.210",
40
- "@teambit/legacy.consumer": "0.0.156",
41
- "@teambit/logger": "0.0.1477",
42
- "@teambit/remove": "1.0.1150",
43
- "@teambit/scope.network": "0.0.156",
44
- "@teambit/scope": "1.0.1150",
45
- "@teambit/workspace.modules.node-modules-linker": "0.0.387",
46
- "@teambit/workspace": "1.0.1150",
47
- "@teambit/legacy.scope-api": "0.0.211"
30
+ "@teambit/cli": "0.0.1386",
31
+ "@teambit/eject": "1.0.1152",
32
+ "@teambit/legacy.logger": "0.0.58",
33
+ "@teambit/legacy.scope": "0.0.158",
34
+ "@teambit/objects": "0.0.659",
35
+ "@teambit/scope.remote-actions": "0.0.158",
36
+ "@teambit/scope.remotes": "0.0.158",
37
+ "@teambit/component.snap-distance": "0.0.159",
38
+ "@teambit/dependency-resolver": "1.0.1152",
39
+ "@teambit/legacy.bit-map": "0.0.215",
40
+ "@teambit/legacy.component-list": "0.0.212",
41
+ "@teambit/legacy.consumer": "0.0.158",
42
+ "@teambit/logger": "0.0.1479",
43
+ "@teambit/remove": "1.0.1152",
44
+ "@teambit/scope.network": "0.0.158",
45
+ "@teambit/scope": "1.0.1152",
46
+ "@teambit/workspace.modules.node-modules-linker": "0.0.389",
47
+ "@teambit/workspace": "1.0.1152",
48
+ "@teambit/legacy.scope-api": "0.0.213"
48
49
  },
49
50
  "devDependencies": {
50
51
  "@types/lodash": "4.14.165",