inup 1.6.5 → 1.6.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 (109) hide show
  1. package/README.md +16 -0
  2. package/dist/{interactive-ui.js → app/interactive-ui.js} +32 -21
  3. package/dist/{core → app}/upgrade-runner.js +12 -11
  4. package/dist/cli.js +12 -10
  5. package/dist/{services → features/audit}/background-audit.js +2 -2
  6. package/dist/features/{headless/vulnerability-audit.js → audit/headless-audit.js} +9 -5
  7. package/dist/features/audit/index.js +36 -0
  8. package/dist/{ui/presenters/vulnerability.js → features/audit/presenter.js} +1 -1
  9. package/dist/{ui/controllers → features/audit}/vulnerability-audit-controller.js +12 -6
  10. package/dist/{services → features/audit}/vulnerability-checker.js +11 -8
  11. package/dist/features/changelog/clients/github-client.js +35 -17
  12. package/dist/features/changelog/clients/npm-registry-client.js +16 -2
  13. package/dist/features/changelog/index.js +1 -1
  14. package/dist/features/changelog/services/package-metadata-service.js +6 -2
  15. package/dist/features/changelog/services/release-notes-service.js +6 -10
  16. package/dist/features/changelog/types.js +3 -0
  17. package/dist/features/debug/index.js +3 -4
  18. package/dist/features/debug/{services/perf-logger.js → perf-logger.js} +1 -1
  19. package/dist/features/debug/types.js +3 -0
  20. package/dist/features/headless/headless-runner.js +11 -11
  21. package/dist/features/headless/index.js +1 -4
  22. package/dist/features/headless/report.js +2 -0
  23. package/dist/features/interactive/controllers/index.js +6 -0
  24. package/dist/{ui → features/interactive}/controllers/package-info-modal-controller.js +3 -3
  25. package/dist/features/interactive/index.js +21 -0
  26. package/dist/{ui → features/interactive}/input-handler.js +3 -3
  27. package/dist/{ui → features/interactive}/modal/layout.js +2 -2
  28. package/dist/{ui/renderer/package-list.js → features/interactive/modal/package-info-sections/index.js} +3 -3
  29. package/dist/{ui → features/interactive}/modal/package-info-sections/sections.js +53 -22
  30. package/dist/{ui → features/interactive}/modal/package-info-sections/text.js +5 -5
  31. package/dist/{ui → features/interactive}/modal/package-info.js +31 -13
  32. package/dist/features/interactive/modal/types.js +3 -0
  33. package/dist/{ui → features/interactive}/presenters/health.js +2 -2
  34. package/dist/{ui → features/interactive}/renderer/index.js +0 -1
  35. package/dist/{types.js → features/interactive/renderer/package-list/index.js} +3 -4
  36. package/dist/{ui → features/interactive}/renderer/package-list/interface.js +9 -10
  37. package/dist/{ui → features/interactive}/renderer/package-list/rows.js +24 -17
  38. package/dist/features/{debug → interactive}/renderer/performance-modal.js +1 -1
  39. package/dist/{ui/utils/version.js → features/interactive/renderer/version-format.js} +6 -10
  40. package/dist/{ui → features/interactive}/session/index.js +2 -1
  41. package/dist/{ui → features/interactive}/session/interactive-session.js +39 -19
  42. package/dist/{ui → features/interactive}/session/selection-state-builder.js +20 -5
  43. package/dist/{ui → features/interactive}/state/filter-manager.js +2 -2
  44. package/dist/{ui → features/interactive}/state/state-manager.js +6 -4
  45. package/dist/{ui → features/interactive}/state/theme-manager.js +8 -4
  46. package/dist/{ui → features/interactive}/themes-colors.js +5 -2
  47. package/dist/features/upgrade/index.js +8 -0
  48. package/dist/{core → features/upgrade}/package-detector.js +74 -33
  49. package/dist/{core → features/upgrade}/upgrader.js +72 -14
  50. package/dist/index.js +2 -2
  51. package/dist/{config → shared/config}/package-meta.js +1 -1
  52. package/dist/{config → shared/config}/project-config.js +4 -1
  53. package/dist/{utils/config.js → shared/config/user-config.js} +3 -3
  54. package/dist/{ui/modal/package-info-sections.js → shared/fs/index.js} +4 -3
  55. package/dist/{utils/filesystem → shared/fs}/paths.js +3 -3
  56. package/dist/{utils/filesystem → shared/fs}/scan.js +5 -2
  57. package/dist/{services → shared}/http/etag-store.js +56 -4
  58. package/dist/{utils → shared}/local-env.js +1 -1
  59. package/dist/{services/package-manager-detector.js → shared/package-manager.js} +1 -1
  60. package/dist/shared/pnpm-catalogs.js +138 -0
  61. package/dist/{services → shared/registry}/npm-registry.js +48 -29
  62. package/dist/shared/registry/registry-config.js +76 -0
  63. package/dist/{services → shared/registry}/version-checker.js +24 -25
  64. package/dist/{ui/utils → shared/terminal}/index.js +4 -6
  65. package/dist/{ui/utils → shared/terminal}/terminal-input.js +2 -1
  66. package/dist/shared/terminal/text.js +48 -0
  67. package/dist/shared/types/index.js +20 -0
  68. package/dist/{utils/version.js → shared/versions.js} +12 -1
  69. package/package.json +15 -6
  70. package/dist/core/index.js +0 -23
  71. package/dist/features/changelog/types/changelog.types.js +0 -3
  72. package/dist/features/debug/types/debug.types.js +0 -3
  73. package/dist/services/index.js +0 -25
  74. package/dist/ui/controllers/index.js +0 -8
  75. package/dist/ui/index.js +0 -27
  76. package/dist/ui/presenters/index.js +0 -11
  77. package/dist/ui/utils/text.js +0 -76
  78. package/dist/utils/filesystem.js +0 -20
  79. package/dist/utils/index.js +0 -34
  80. /package/dist/{ui/modal → features/audit}/types.js +0 -0
  81. /package/dist/features/debug/{services/performance-tracker.js → performance-tracker.js} +0 -0
  82. /package/dist/{ui → features/interactive}/keymap.js +0 -0
  83. /package/dist/{ui → features/interactive}/modal/index.js +0 -0
  84. /package/dist/{ui → features/interactive}/modal/package-info-sections/release-notes.js +0 -0
  85. /package/dist/{ui → features/interactive}/modal/theme-selector.js +0 -0
  86. /package/dist/{ui → features/interactive}/renderer/confirmation.js +0 -0
  87. /package/dist/{ui → features/interactive}/renderer/help-modal.js +0 -0
  88. /package/dist/{ui → features/interactive}/session/action-dispatcher.js +0 -0
  89. /package/dist/{ui → features/interactive}/state/index.js +0 -0
  90. /package/dist/{ui → features/interactive}/state/modal-manager.js +0 -0
  91. /package/dist/{ui → features/interactive}/state/navigation-manager.js +0 -0
  92. /package/dist/{ui → features/interactive}/themes.js +0 -0
  93. /package/dist/{config → shared/config}/constants.js +0 -0
  94. /package/dist/{config → shared/config}/index.js +0 -0
  95. /package/dist/{utils → shared}/debug-logger.js +0 -0
  96. /package/dist/{utils → shared}/engines.js +0 -0
  97. /package/dist/{utils → shared}/exec.js +0 -0
  98. /package/dist/{utils/filesystem → shared/fs}/io.js +0 -0
  99. /package/dist/{utils → shared}/git.js +0 -0
  100. /package/dist/{services → shared}/http/adaptive-controller.js +0 -0
  101. /package/dist/{services → shared}/http/inflight.js +0 -0
  102. /package/dist/{services → shared}/http/resizable-semaphore.js +0 -0
  103. /package/dist/{services → shared}/http/retry.js +0 -0
  104. /package/dist/{utils → shared}/manifest.js +0 -0
  105. /package/dist/{utils → shared/terminal}/color.js +0 -0
  106. /package/dist/{ui/utils → shared/terminal}/cursor.js +0 -0
  107. /package/dist/{types → shared/types}/domain.js +0 -0
  108. /package/dist/{types → shared/types}/streaming.js +0 -0
  109. /package/dist/{types → shared/types}/ui.js +0 -0
@@ -6,9 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.renderInterface = renderInterface;
7
7
  exports.renderPackagesTable = renderPackagesTable;
8
8
  const chalk_1 = __importDefault(require("chalk"));
9
- const utils_1 = require("../../utils");
9
+ const version_format_1 = require("../version-format");
10
10
  const themes_colors_1 = require("../../themes-colors");
11
- const config_1 = require("../../../config");
11
+ const config_1 = require("../../../../shared/config");
12
12
  const rows_1 = require("./rows");
13
13
  const keymap_1 = require("../../keymap");
14
14
  function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _forceFullRender, renderableItems, activeFilterLabel, packageManager, filterMode, filterQuery, totalPackagesBeforeFilter, terminalWidth = 80, loadingProgress, auditProgress, options = {}, notice) {
@@ -31,7 +31,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
31
31
  (0, themes_colors_1.getThemeColor)('textSecondary')(' - ') +
32
32
  (0, themes_colors_1.getThemeColor)('primary')(activeFilterLabel)
33
33
  : headerLine;
34
- const headerPadding = Math.max(0, terminalWidth - utils_1.VersionUtils.getVisualLength(fullHeaderLine));
34
+ const headerPadding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(fullHeaderLine));
35
35
  output.push(fullHeaderLine + ' '.repeat(headerPadding));
36
36
  }
37
37
  else {
@@ -41,7 +41,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
41
41
  (0, themes_colors_1.getThemeColor)('textSecondary')(' - ') +
42
42
  (0, themes_colors_1.getThemeColor)('primary')(activeFilterLabel)
43
43
  : headerLine;
44
- const headerPadding = Math.max(0, terminalWidth - utils_1.VersionUtils.getVisualLength(fullHeaderLine));
44
+ const headerPadding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(fullHeaderLine));
45
45
  output.push(fullHeaderLine + ' '.repeat(headerPadding));
46
46
  }
47
47
  output.push('');
@@ -50,7 +50,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
50
50
  chalk_1.default.bold.white('Search: ') +
51
51
  (0, themes_colors_1.getThemeColor)('primary')(filterQuery || '') +
52
52
  (0, themes_colors_1.getThemeColor)('border')('█');
53
- const padding = Math.max(0, terminalWidth - utils_1.VersionUtils.getVisualLength(filterDisplay));
53
+ const padding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(filterDisplay));
54
54
  output.push(filterDisplay + ' '.repeat(padding));
55
55
  }
56
56
  else if (filterQuery) {
@@ -58,7 +58,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
58
58
  chalk_1.default.bold.white('Search: ') +
59
59
  (0, themes_colors_1.getThemeColor)('primary')(filterQuery) +
60
60
  (0, themes_colors_1.getThemeColor)('textSecondary')(' (press / to edit)');
61
- const padding = Math.max(0, terminalWidth - utils_1.VersionUtils.getVisualLength(filterDisplay));
61
+ const padding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(filterDisplay));
62
62
  output.push(filterDisplay + ' '.repeat(padding));
63
63
  }
64
64
  else {
@@ -107,8 +107,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
107
107
  const matchCount = totalVisualItems > maxVisibleItems
108
108
  ? (0, themes_colors_1.getThemeColor)('textSecondary')(`Showing ${chalk_1.default.white(startItem)}-${chalk_1.default.white(endItem)} of ${chalk_1.default.white(totalPackages)} matches`)
109
109
  : (0, themes_colors_1.getThemeColor)('textSecondary')(`Showing all ${chalk_1.default.white(totalPackages)} matches`);
110
- statusLine =
111
- matchCount + ' ' + chalk_1.default.bold.white('Esc ') + chalk_1.default.gray('Clear filter');
110
+ statusLine = matchCount + ' ' + chalk_1.default.bold.white('Esc ') + chalk_1.default.gray('Clear filter');
112
111
  }
113
112
  else {
114
113
  if (totalVisualItems > maxVisibleItems) {
@@ -136,7 +135,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
136
135
  // single render so the layout height stays constant.
137
136
  const statusContent = notice ? (0, themes_colors_1.getThemeColor)('warning')(notice) : statusLine;
138
137
  const statusLineFull = ' ' + statusContent;
139
- const statusPadding = Math.max(0, terminalWidth - utils_1.VersionUtils.getVisualLength(statusLineFull));
138
+ const statusPadding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(statusLineFull));
140
139
  output.push(statusLineFull + ' '.repeat(statusPadding));
141
140
  output.push('');
142
141
  if (renderableItems && renderableItems.length > 0) {
@@ -166,7 +165,7 @@ function renderInterface(states, currentRow, scrollOffset, maxVisibleItems, _for
166
165
  const loadingLine = ' ' +
167
166
  (0, themes_colors_1.getThemeColor)('textSecondary')(loadingLabel) +
168
167
  (failedLabel ? chalk_1.default.yellow(failedLabel) : '');
169
- const loadingPadding = Math.max(0, terminalWidth - utils_1.VersionUtils.getVisualLength(loadingLine));
168
+ const loadingPadding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(loadingLine));
170
169
  output.push(loadingLine + ' '.repeat(loadingPadding));
171
170
  }
172
171
  return output.map((line) => (0, rows_1.padLineToWidth)(line, terminalWidth));
@@ -8,12 +8,12 @@ exports.renderPackageLine = renderPackageLine;
8
8
  exports.renderSectionHeader = renderSectionHeader;
9
9
  exports.renderSpacer = renderSpacer;
10
10
  const chalk_1 = __importDefault(require("chalk"));
11
- const utils_1 = require("../../utils");
11
+ const version_format_1 = require("../version-format");
12
12
  const themes_colors_1 = require("../../themes-colors");
13
- const vulnerability_1 = require("../../presenters/vulnerability");
13
+ const audit_1 = require("../../../audit");
14
14
  const health_1 = require("../../presenters/health");
15
15
  function padLineToWidth(line, terminalWidth) {
16
- const padding = Math.max(0, terminalWidth - utils_1.VersionUtils.getVisualLength(line));
16
+ const padding = Math.max(0, terminalWidth - version_format_1.VersionUtils.getVisualLength(line));
17
17
  return line + ' '.repeat(padding);
18
18
  }
19
19
  function getTypeBadge(type) {
@@ -29,6 +29,10 @@ function getTypeBadge(type) {
29
29
  return '';
30
30
  }
31
31
  }
32
+ /** Marks entries whose range lives in a pnpm catalog (pnpm-workspace.yaml), not a package.json. */
33
+ function getCatalogBadge(catalog) {
34
+ return catalog ? (0, themes_colors_1.getThemeColor)('textSecondary')('[C]') : '';
35
+ }
32
36
  function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, options = {}) {
33
37
  const prefix = isCurrentRow ? (0, themes_colors_1.getThemeColor)('success')('❯ ') : ' ';
34
38
  let packageName;
@@ -74,7 +78,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
74
78
  }
75
79
  else if (state.hasRangeUpdate) {
76
80
  rangeDot = isRangeSelected ? (0, themes_colors_1.getThemeColor)('dot')('●') : (0, themes_colors_1.getThemeColor)('dotEmpty')('○');
77
- const rangeVersionWithPrefix = utils_1.VersionUtils.applyVersionPrefix(state.currentVersionSpecifier, state.rangeVersion);
81
+ const rangeVersionWithPrefix = version_format_1.VersionUtils.applyVersionPrefix(state.currentVersionSpecifier, state.rangeVersion);
78
82
  rangeVersionText = (0, themes_colors_1.getThemeColor)('versionRange')(rangeVersionWithPrefix);
79
83
  }
80
84
  else {
@@ -93,7 +97,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
93
97
  }
94
98
  else if (state.hasMajorUpdate) {
95
99
  latestDot = isLatestSelected ? (0, themes_colors_1.getThemeColor)('dot')('●') : (0, themes_colors_1.getThemeColor)('dotEmpty')('○');
96
- const latestVersionWithPrefix = utils_1.VersionUtils.applyVersionPrefix(state.currentVersionSpecifier, state.latestVersion);
100
+ const latestVersionWithPrefix = version_format_1.VersionUtils.applyVersionPrefix(state.currentVersionSpecifier, state.latestVersion);
97
101
  latestVersionText = (0, themes_colors_1.getThemeColor)('versionLatest')(latestVersionWithPrefix);
98
102
  }
99
103
  else {
@@ -110,30 +114,33 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
110
114
  const prefixWidth = 2;
111
115
  const availableForPackageName = terminalWidth - prefixWidth - otherColumnsWidth - 1;
112
116
  const packageNameWidth = Math.min(maxPackageNameWidth, Math.max(minPackageNameWidth, availableForPackageName));
113
- const badgeWidth = state.type === 'dependencies' ? 0 : 3;
114
- const truncatedName = utils_1.VersionUtils.truncateMiddle(state.name, packageNameWidth - 1 - badgeWidth);
117
+ // Trailing badges each occupy 3 columns: the dep-type marker ([D]/[P]/[O])
118
+ // and the pnpm-catalog marker ([C]); both may be present at once.
119
+ const badgeWidth = (state.type === 'dependencies' ? 0 : 3) + (state.catalog ? 3 : 0);
120
+ const truncatedName = version_format_1.VersionUtils.truncateMiddle(state.name, packageNameWidth - 1 - badgeWidth);
115
121
  const shouldShowDashes = (paddingAmount) => paddingAmount > 2;
116
122
  const dashColor = isCurrentRow ? chalk_1.default.white : chalk_1.default.gray;
117
123
  const displayName = truncatedName !== state.name ? truncatedName : packageName;
118
124
  const typeBadge = getTypeBadge(state.type);
119
- const shouldShowVulnerability = (0, vulnerability_1.shouldDisplayVulnerabilityForDependency)(state.type, options);
120
- const vulnBadge = shouldShowVulnerability ? (0, vulnerability_1.getVulnerabilityBadge)(state.vulnerability) : '';
121
- const vulnBadgeWidth = vulnBadge ? utils_1.VersionUtils.getVisualLength(vulnBadge) + 1 : 0;
125
+ const shouldShowVulnerability = (0, audit_1.shouldDisplayVulnerabilityForDependency)(state.type, options);
126
+ const vulnBadge = shouldShowVulnerability ? (0, audit_1.getVulnerabilityBadge)(state.vulnerability) : '';
127
+ const vulnBadgeWidth = vulnBadge ? version_format_1.VersionUtils.getVisualLength(vulnBadge) + 1 : 0;
122
128
  // Deprecation / engines-incompatibility marker (independent of dep type).
123
129
  const healthBadge = (0, health_1.getHealthBadge)(state);
124
- const healthBadgeWidth = healthBadge ? utils_1.VersionUtils.getVisualLength(healthBadge) + 1 : 0;
125
- const nameLength = utils_1.VersionUtils.getVisualLength(truncatedName);
130
+ const healthBadgeWidth = healthBadge ? version_format_1.VersionUtils.getVisualLength(healthBadge) + 1 : 0;
131
+ const nameLength = version_format_1.VersionUtils.getVisualLength(truncatedName);
126
132
  const namePadding = Math.max(0, packageNameWidth - nameLength - 1 - badgeWidth - vulnBadgeWidth - healthBadgeWidth);
127
133
  const nameDashes = shouldShowDashes(namePadding)
128
134
  ? dashColor('-').repeat(namePadding)
129
135
  : ' '.repeat(namePadding);
130
136
  const vulnSuffix = vulnBadge ? ` ${vulnBadge}` : '';
131
137
  const healthSuffix = healthBadge ? ` ${healthBadge}` : '';
132
- const packageNameSection = typeBadge
133
- ? `${displayName} ${nameDashes}${vulnSuffix}${healthSuffix}${typeBadge}`
138
+ const trailingBadges = `${getCatalogBadge(state.catalog)}${typeBadge}`;
139
+ const packageNameSection = trailingBadges
140
+ ? `${displayName} ${nameDashes}${vulnSuffix}${healthSuffix}${trailingBadges}`
134
141
  : `${displayName} ${nameDashes}${vulnSuffix}${healthSuffix}`;
135
142
  const currentSection = `${currentDot} ${currentVersion}`;
136
- const currentSectionLength = utils_1.VersionUtils.getVisualLength(currentSection) + 1;
143
+ const currentSectionLength = version_format_1.VersionUtils.getVisualLength(currentSection) + 1;
137
144
  const currentPadding = Math.max(0, currentColumnWidth - currentSectionLength);
138
145
  const currentPaddingText = shouldShowDashes(currentPadding)
139
146
  ? dashColor('-').repeat(currentPadding)
@@ -142,7 +149,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
142
149
  let rangeSection = '';
143
150
  if (isPending || isFailed || state.hasRangeUpdate) {
144
151
  rangeSection = `${rangeDot} ${rangeVersionText}`;
145
- const rangeSectionLength = utils_1.VersionUtils.getVisualLength(rangeSection) + 1;
152
+ const rangeSectionLength = version_format_1.VersionUtils.getVisualLength(rangeSection) + 1;
146
153
  const rangePadding = Math.max(0, rangeColumnWidth - rangeSectionLength);
147
154
  const rangePaddingText = shouldShowDashes(rangePadding)
148
155
  ? dashColor('-').repeat(rangePadding)
@@ -155,7 +162,7 @@ function renderPackageLine(state, _index, isCurrentRow, terminalWidth = 80, opti
155
162
  let latestSection = '';
156
163
  if (isPending || isFailed || state.hasMajorUpdate) {
157
164
  latestSection = `${latestDot} ${latestVersionText}`;
158
- const latestSectionLength = utils_1.VersionUtils.getVisualLength(latestSection) + 1;
165
+ const latestSectionLength = version_format_1.VersionUtils.getVisualLength(latestSection) + 1;
159
166
  const latestPadding = Math.max(0, latestColumnWidth - latestSectionLength);
160
167
  const latestPaddingText = shouldShowDashes(latestPadding)
161
168
  ? dashColor('-').repeat(latestPadding)
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.renderPerformanceModal = renderPerformanceModal;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
- const modal_1 = require("../../../ui/modal");
8
+ const modal_1 = require("../modal");
9
9
  function formatMs(value) {
10
10
  if (value === undefined || value === null)
11
11
  return chalk_1.default.gray('—');
@@ -3,19 +3,15 @@ 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.VersionUtils = exports.getVisualLength = exports.stripAnsi = void 0;
7
- exports.applyVersionPrefix = applyVersionPrefix;
6
+ exports.VersionUtils = exports.applyVersionPrefix = exports.getVisualLength = exports.stripAnsi = void 0;
8
7
  exports.truncateMiddle = truncateMiddle;
9
8
  exports.formatVersionDiff = formatVersionDiff;
10
9
  const chalk_1 = __importDefault(require("chalk"));
11
- const text_1 = require("./text");
10
+ const text_1 = require("../../../shared/terminal/text");
12
11
  Object.defineProperty(exports, "stripAnsi", { enumerable: true, get: function () { return text_1.stripAnsi; } });
13
12
  Object.defineProperty(exports, "getVisualLength", { enumerable: true, get: function () { return text_1.getVisualLength; } });
14
- function applyVersionPrefix(originalSpecifier, targetVersion) {
15
- const prefixMatch = originalSpecifier.match(/^([^\d]+)/);
16
- const prefix = prefixMatch ? prefixMatch[1] : '';
17
- return prefix + targetVersion;
18
- }
13
+ const versions_1 = require("../../../shared/versions");
14
+ Object.defineProperty(exports, "applyVersionPrefix", { enumerable: true, get: function () { return versions_1.applyVersionPrefix; } });
19
15
  function truncateMiddle(str, maxLength) {
20
16
  const visualLength = (0, text_1.getVisualLength)(str);
21
17
  if (visualLength <= maxLength) {
@@ -67,10 +63,10 @@ function formatVersionDiff(current, target, colorFn) {
67
63
  return result.join('');
68
64
  }
69
65
  exports.VersionUtils = {
70
- applyVersionPrefix,
66
+ applyVersionPrefix: versions_1.applyVersionPrefix,
71
67
  truncateMiddle,
72
68
  formatVersionDiff,
73
69
  stripAnsi: text_1.stripAnsi,
74
70
  getVisualLength: text_1.getVisualLength,
75
71
  };
76
- //# sourceMappingURL=version.js.map
72
+ //# sourceMappingURL=version-format.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dispatchAction = exports.deduplicatePackages = exports.createUpgradeChoices = exports.createPendingSelectionStates = exports.createSelectionStates = exports.runInteractiveSession = void 0;
3
+ exports.dispatchAction = exports.selectionKey = exports.deduplicatePackages = exports.createUpgradeChoices = exports.createPendingSelectionStates = exports.createSelectionStates = exports.runInteractiveSession = void 0;
4
4
  var interactive_session_1 = require("./interactive-session");
5
5
  Object.defineProperty(exports, "runInteractiveSession", { enumerable: true, get: function () { return interactive_session_1.runInteractiveSession; } });
6
6
  var selection_state_builder_1 = require("./selection-state-builder");
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "createSelectionStates", { enumerable: true, get:
8
8
  Object.defineProperty(exports, "createPendingSelectionStates", { enumerable: true, get: function () { return selection_state_builder_1.createPendingSelectionStates; } });
9
9
  Object.defineProperty(exports, "createUpgradeChoices", { enumerable: true, get: function () { return selection_state_builder_1.createUpgradeChoices; } });
10
10
  Object.defineProperty(exports, "deduplicatePackages", { enumerable: true, get: function () { return selection_state_builder_1.deduplicatePackages; } });
11
+ Object.defineProperty(exports, "selectionKey", { enumerable: true, get: function () { return selection_state_builder_1.selectionKey; } });
11
12
  var action_dispatcher_1 = require("./action-dispatcher");
12
13
  Object.defineProperty(exports, "dispatchAction", { enumerable: true, get: function () { return action_dispatcher_1.dispatchAction; } });
13
14
  //# sourceMappingURL=index.js.map
@@ -5,12 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.runInteractiveSession = runInteractiveSession;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
- const index_1 = require("../index");
9
- const cursor_1 = require("../utils/cursor");
8
+ const state_1 = require("../state");
9
+ const input_handler_1 = require("../input-handler");
10
+ const terminal_1 = require("../../../shared/terminal");
11
+ const cursor_1 = require("../../../shared/terminal/cursor");
10
12
  const themes_colors_1 = require("../themes-colors");
11
- const debug_1 = require("../../features/debug");
13
+ const debug_1 = require("../../debug");
14
+ const performance_modal_1 = require("../renderer/performance-modal");
12
15
  const help_modal_1 = require("../renderer/help-modal");
13
- const config_1 = require("../../utils/config");
16
+ const user_config_1 = require("../../../shared/config/user-config");
14
17
  const action_dispatcher_1 = require("./action-dispatcher");
15
18
  function getTerminalHeight() {
16
19
  if (process.stdout.isTTY && typeof process.stdout.rows === 'number' && process.stdout.rows > 0) {
@@ -21,7 +24,7 @@ function getTerminalHeight() {
21
24
  async function runInteractiveSession(selectionStates, packageManager, renderer, packageInfoModalController, vulnerabilityAuditController, options, onRefreshViewReady, loadingProgress, attachRefresh) {
22
25
  return new Promise((resolve) => {
23
26
  const states = selectionStates;
24
- const stateManager = new index_1.StateManager(0, getTerminalHeight(), config_1.configManager.getFilters() ?? undefined);
27
+ const stateManager = new state_1.StateManager(0, getTerminalHeight(), user_config_1.configManager.getFilters() ?? undefined);
25
28
  let isResolved = false;
26
29
  let ownsAlternateScreen = false;
27
30
  const vulnerabilityDisplayOptions = options;
@@ -32,17 +35,21 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
32
35
  let previousModalViewportLineCount = null;
33
36
  stateManager.setRenderableItems([]);
34
37
  const claimInteractiveScreen = () => {
38
+ // Claimed exactly once per session; the guard is a safety net in case a
39
+ // future caller re-claims.
40
+ /* v8 ignore start */
35
41
  if (ownsAlternateScreen)
36
42
  return;
37
- index_1.ConsoleUtils.clearProgress();
38
- index_1.CursorUtils.enterAlternateScreen();
39
- index_1.CursorUtils.clearScreen();
43
+ /* v8 ignore stop */
44
+ terminal_1.ConsoleUtils.clearProgress();
45
+ terminal_1.CursorUtils.enterAlternateScreen();
46
+ terminal_1.CursorUtils.clearScreen();
40
47
  ownsAlternateScreen = true;
41
48
  };
42
49
  const releaseInteractiveScreen = () => {
43
50
  if (!ownsAlternateScreen)
44
51
  return;
45
- index_1.CursorUtils.exitAlternateScreen();
52
+ terminal_1.CursorUtils.exitAlternateScreen();
46
53
  ownsAlternateScreen = false;
47
54
  };
48
55
  const resetAnsiPattern = /\x1b\[(?:0|49)m/g;
@@ -74,8 +81,12 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
74
81
  };
75
82
  const applyBackgroundToLine = (line, bgCode) => `${bgCode}${line.replace(resetAnsiPattern, (match) => `${match}${bgCode}`)}${(0, themes_colors_1.getTerminalResetCode)()}`;
76
83
  const writeFrame = (lines, bgCode) => {
84
+ // Viewports are always padded to the terminal height, so an empty frame
85
+ // cannot occur today; guard kept so a future caller cannot emit garbage.
86
+ /* v8 ignore start */
77
87
  if (lines.length === 0)
78
88
  return;
89
+ /* v8 ignore stop */
79
90
  process.stdout.write(lines.map((line) => applyBackgroundToLine(line, bgCode)).join('\n'));
80
91
  };
81
92
  const renderViewport = (lines, terminalWidth, terminalHeight, bgCode) => {
@@ -89,8 +100,8 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
89
100
  const viewportLineCount = buildModalHeaderLines(shortcutLabel).length + modalLines.length;
90
101
  const shouldClearBeforeRender = previousViewportMode !== mode || previousModalViewportLineCount !== viewportLineCount;
91
102
  if (shouldClearBeforeRender) {
92
- index_1.CursorUtils.clearScreen();
93
- index_1.CursorUtils.hide();
103
+ terminal_1.CursorUtils.clearScreen();
104
+ terminal_1.CursorUtils.hide();
94
105
  }
95
106
  renderViewport([...buildModalHeaderLines(shortcutLabel), ...modalLines], terminalWidth, terminalHeight, bgCode);
96
107
  previousViewportMode = mode;
@@ -104,11 +115,11 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
104
115
  const bgCode = (0, themes_colors_1.getTerminalBgColorCode)();
105
116
  process.stdout.write(bgCode);
106
117
  if (uiState.forceFullRender) {
107
- index_1.CursorUtils.clearScreen();
108
- index_1.CursorUtils.hide();
118
+ terminal_1.CursorUtils.clearScreen();
119
+ terminal_1.CursorUtils.hide();
109
120
  }
110
121
  else {
111
- index_1.CursorUtils.moveToHome();
122
+ terminal_1.CursorUtils.moveToHome();
112
123
  }
113
124
  if (uiState.showThemeModal) {
114
125
  const terminalWidth = process.stdout.columns || 80;
@@ -135,7 +146,7 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
135
146
  const terminalWidth = process.stdout.columns || 80;
136
147
  const terminalHeight = getTerminalHeight();
137
148
  const snapshot = (0, debug_1.getPerformanceTracker)().snapshot();
138
- const result = (0, debug_1.renderPerformanceModal)(snapshot, terminalWidth, Math.max(8, terminalHeight - 4), uiState.debugModalScrollOffset);
149
+ const result = (0, performance_modal_1.renderPerformanceModal)(snapshot, terminalWidth, Math.max(8, terminalHeight - 4), uiState.debugModalScrollOffset);
139
150
  debugModalMaxScrollOffset = result.maxScrollOffset;
140
151
  stateManager.clampDebugModalScrollOffset(debugModalMaxScrollOffset);
141
152
  const debugHints = [
@@ -187,6 +198,9 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
187
198
  };
188
199
  // Safety net: restore terminal if the process exits without going through finalizeSelection.
189
200
  // Only synchronous writes work in an 'exit' handler, but that's all we need here.
201
+ // Coverage: the body only runs during a real process 'exit' event, which
202
+ // cannot be fired safely inside the test process.
203
+ /* v8 ignore start */
190
204
  const emergencyCleanup = () => {
191
205
  if (ownsAlternateScreen) {
192
206
  process.stdout.write(cursor_1.RAW_EXIT_ALT_SCREEN);
@@ -196,10 +210,11 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
196
210
  process.stdin.setRawMode(false);
197
211
  }
198
212
  };
213
+ /* v8 ignore stop */
199
214
  process.on('exit', emergencyCleanup);
200
215
  let cleanupInteractiveSession = () => {
201
216
  process.stdout.write((0, themes_colors_1.getTerminalResetCode)());
202
- index_1.CursorUtils.show();
217
+ terminal_1.CursorUtils.show();
203
218
  process.stdin.off('keypress', keypressHandler);
204
219
  process.stdin.pause();
205
220
  process.off('SIGWINCH', handleResize);
@@ -209,7 +224,7 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
209
224
  onRefreshViewReady?.(undefined);
210
225
  packageInfoModalController.cancel();
211
226
  // Remember the view filters for next launch (best-effort, never throws).
212
- config_1.configManager.setFilters(stateManager.getFilterSnapshot());
227
+ user_config_1.configManager.setFilters(stateManager.getFilterSnapshot());
213
228
  releaseInteractiveScreen();
214
229
  cleanupInteractiveSession();
215
230
  process.off('exit', emergencyCleanup);
@@ -221,7 +236,7 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
221
236
  const handleCancel = () => {
222
237
  finalizeSelection(states.map((s) => ({ ...s, selectedOption: 'none' })));
223
238
  };
224
- const inputHandler = new index_1.InputHandler(stateManager, (action) => (0, action_dispatcher_1.dispatchAction)(action, {
239
+ const inputHandler = new input_handler_1.InputHandler(stateManager, (action) => (0, action_dispatcher_1.dispatchAction)(action, {
225
240
  stateManager,
226
241
  states,
227
242
  vulnerabilityDisplayOptions,
@@ -249,18 +264,23 @@ async function runInteractiveSession(selectionStates, packageManager, renderer,
249
264
  renderInterface();
250
265
  }
251
266
  });
252
- const keypressSession = index_1.TerminalInput.startKeypressSession(keypressHandler);
267
+ const keypressSession = terminal_1.TerminalInput.startKeypressSession(keypressHandler);
253
268
  const previousCleanup = cleanupInteractiveSession;
254
269
  cleanupInteractiveSession = () => {
255
270
  keypressSession.close();
256
271
  previousCleanup();
257
272
  };
258
273
  process.on('SIGWINCH', handleResize);
274
+ // The state manager was constructed with getTerminalHeight() in this same
275
+ // tick, so the height cannot have changed yet; kept as a safety net for a
276
+ // future async gap between construction and startup.
277
+ /* v8 ignore start */
259
278
  const currentHeight = getTerminalHeight();
260
279
  if (stateManager.updateTerminalHeight(currentHeight)) {
261
280
  const initialFiltered = stateManager.getFilteredStates(states, vulnerabilityDisplayOptions);
262
281
  stateManager.resetForResize(initialFiltered.length);
263
282
  }
283
+ /* v8 ignore stop */
264
284
  renderInterface();
265
285
  vulnerabilityAuditController.enqueueStates(states, () => {
266
286
  if (!isResolved)
@@ -33,16 +33,26 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.selectionKey = selectionKey;
36
37
  exports.deduplicatePackages = deduplicatePackages;
37
38
  exports.createSelectionStates = createSelectionStates;
38
39
  exports.createPendingSelectionStates = createPendingSelectionStates;
39
40
  exports.createUpgradeChoices = createUpgradeChoices;
40
41
  const semver = __importStar(require("semver"));
41
- const utils_1 = require("../utils");
42
+ const versions_1 = require("../../../shared/versions");
43
+ /**
44
+ * Identity of a selectable row. Catalog entries carry the catalog name so a
45
+ * pnpm catalog entry never merges with a direct dependency that happens to have
46
+ * the same name/range/type — they are written to different files.
47
+ */
48
+ function selectionKey(name, versionSpecifier, type, catalog) {
49
+ const base = `${name}@${versionSpecifier}@${type}`;
50
+ return catalog ? `${base}@catalog:${catalog}` : base;
51
+ }
42
52
  function deduplicatePackages(packages) {
43
53
  const uniquePackages = new Map();
44
54
  for (const pkg of packages) {
45
- const key = `${pkg.name}@${pkg.currentVersion}@${pkg.type}`;
55
+ const key = selectionKey(pkg.name, pkg.currentVersion, pkg.type, pkg.catalog);
46
56
  if (!uniquePackages.has(key)) {
47
57
  uniquePackages.set(key, {
48
58
  pkg,
@@ -70,7 +80,7 @@ function createSelectionStates(packages, getCachedSummary, previousSelections, i
70
80
  const currentClean = semver.coerce(pkg.currentVersion)?.version || pkg.currentVersion;
71
81
  const rangeClean = semver.coerce(pkg.rangeVersion)?.version || pkg.rangeVersion;
72
82
  const latestClean = semver.coerce(pkg.latestVersion)?.version || pkg.latestVersion;
73
- const key = `${pkg.name}@${pkg.currentVersion}@${pkg.type}`;
83
+ const key = selectionKey(pkg.name, pkg.currentVersion, pkg.type, pkg.catalog);
74
84
  const previousSelection = previousSelections?.get(key) || 'none';
75
85
  return {
76
86
  name: pkg.name,
@@ -85,6 +95,9 @@ function createSelectionStates(packages, getCachedSummary, previousSelections, i
85
95
  hasRangeUpdate: pkg.hasRangeUpdate,
86
96
  hasMajorUpdate: pkg.hasMajorUpdate,
87
97
  type: pkg.type,
98
+ catalog: pkg.catalog,
99
+ catalogEntries: pkg.catalogEntries,
100
+ catalogReferencedBy: pkg.catalogReferencedBy,
88
101
  deprecated: pkg.deprecated,
89
102
  enginesNode: pkg.enginesNode,
90
103
  vulnerability: getCachedSummary(pkg.name, pkg.currentVersion, pkg.type),
@@ -103,7 +116,7 @@ function createPendingSelectionStates(packages, getCachedSummary, previousSelect
103
116
  })));
104
117
  return Array.from(uniquePackages.values()).map(({ pkg, packageJsonPaths }) => {
105
118
  const currentClean = semver.coerce(pkg.currentVersion)?.version || pkg.currentVersion;
106
- const key = `${pkg.name}@${pkg.currentVersion}@${pkg.type}`;
119
+ const key = selectionKey(pkg.name, pkg.currentVersion, pkg.type, pkg.catalog);
107
120
  const previousSelection = previousSelections?.get(key) || 'none';
108
121
  return {
109
122
  name: pkg.name,
@@ -118,6 +131,7 @@ function createPendingSelectionStates(packages, getCachedSummary, previousSelect
118
131
  hasRangeUpdate: false,
119
132
  hasMajorUpdate: false,
120
133
  type: pkg.type,
134
+ catalog: pkg.catalog,
121
135
  vulnerability: getCachedSummary(pkg.name, pkg.currentVersion, pkg.type),
122
136
  };
123
137
  });
@@ -131,7 +145,7 @@ function createUpgradeChoices(selectedStates, saveExact = false) {
131
145
  // Preserve the original range prefix (^/~) by default; --save-exact writes the bare version.
132
146
  const targetVersionWithPrefix = saveExact
133
147
  ? targetVersion
134
- : (0, utils_1.applyVersionPrefix)(state.currentVersionSpecifier, targetVersion);
148
+ : (0, versions_1.applyVersionPrefix)(state.currentVersionSpecifier, targetVersion);
135
149
  const pathsToUpdate = state.packageJsonPaths || [state.packageJsonPath];
136
150
  pathsToUpdate.forEach((packageJsonPath) => {
137
151
  choices.push({
@@ -141,6 +155,7 @@ function createUpgradeChoices(selectedStates, saveExact = false) {
141
155
  upgradeType: state.selectedOption,
142
156
  targetVersion: targetVersionWithPrefix,
143
157
  currentVersionSpecifier: state.currentVersionSpecifier,
158
+ catalog: state.catalog,
144
159
  });
145
160
  });
146
161
  });
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FilterManager = void 0;
4
- const vulnerability_1 = require("../presenters/vulnerability");
4
+ const audit_1 = require("../../audit");
5
5
  class FilterManager {
6
6
  state;
7
7
  constructor(initial) {
@@ -118,7 +118,7 @@ class FilterManager {
118
118
  });
119
119
  // Apply vulnerability filter
120
120
  if (this.state.showOnlyVulnerable) {
121
- filtered = filtered.filter((state) => (0, vulnerability_1.shouldDisplayVulnerabilityForDependency)(state.type, options) &&
121
+ filtered = filtered.filter((state) => (0, audit_1.shouldDisplayVulnerabilityForDependency)(state.type, options) &&
122
122
  !!state.vulnerability &&
123
123
  state.vulnerability.count > 0);
124
124
  }
@@ -114,8 +114,9 @@ class StateManager {
114
114
  else if (currentState.selectedOption === 'range') {
115
115
  currentState.selectedOption = 'none';
116
116
  }
117
- else if (currentState.selectedOption === 'none') {
118
- // Wrap around to the last available option
117
+ else {
118
+ // selectedOption === 'none' (the union has exactly three members):
119
+ // wrap around to the last available option.
119
120
  if (currentState.hasMajorUpdate) {
120
121
  currentState.selectedOption = 'latest';
121
122
  }
@@ -143,8 +144,9 @@ class StateManager {
143
144
  currentState.selectedOption = 'none';
144
145
  }
145
146
  }
146
- else if (currentState.selectedOption === 'latest') {
147
- // Wrap around to none
147
+ else {
148
+ // selectedOption === 'latest' (the union has exactly three members):
149
+ // wrap around to none.
148
150
  currentState.selectedOption = 'none';
149
151
  }
150
152
  }
@@ -4,14 +4,14 @@ exports.ThemeManager = void 0;
4
4
  exports.getThemeColors = getThemeColors;
5
5
  exports.getCurrentThemeName = getCurrentThemeName;
6
6
  const themes_1 = require("../themes");
7
- const config_1 = require("../../utils/config");
7
+ const user_config_1 = require("../../../shared/config/user-config");
8
8
  // Global theme state for renderers to access
9
9
  let globalCurrentTheme = themes_1.defaultTheme;
10
10
  class ThemeManager {
11
11
  state;
12
12
  constructor() {
13
13
  // Load saved theme from config, fallback to default
14
- const savedTheme = config_1.configManager.getTheme();
14
+ const savedTheme = user_config_1.configManager.getTheme();
15
15
  const initialTheme = savedTheme && themes_1.themeNames.includes(savedTheme) ? savedTheme : themes_1.defaultTheme;
16
16
  this.state = {
17
17
  showThemeModal: false,
@@ -55,7 +55,7 @@ class ThemeManager {
55
55
  this.state.currentTheme = this.state.previewTheme;
56
56
  globalCurrentTheme = this.state.currentTheme;
57
57
  // Save theme to config
58
- config_1.configManager.setTheme(this.state.currentTheme);
58
+ user_config_1.configManager.setTheme(this.state.currentTheme);
59
59
  this.closeThemeModal();
60
60
  }
61
61
  setTheme(themeName) {
@@ -64,7 +64,7 @@ class ThemeManager {
64
64
  this.state.previewTheme = themeName;
65
65
  globalCurrentTheme = themeName;
66
66
  // Save theme to config
67
- config_1.configManager.setTheme(themeName);
67
+ user_config_1.configManager.setTheme(themeName);
68
68
  }
69
69
  }
70
70
  toggleThemeModal() {
@@ -79,7 +79,11 @@ class ThemeManager {
79
79
  exports.ThemeManager = ThemeManager;
80
80
  // Helper function for renderers to get current theme colors
81
81
  function getThemeColors() {
82
+ // Every setter validates against themeNames, so the fallback cannot trigger
83
+ // today; kept in case a future writer skips validation.
84
+ /* v8 ignore start */
82
85
  return themes_1.themes[globalCurrentTheme]?.colors || themes_1.themes[themes_1.defaultTheme].colors;
86
+ /* v8 ignore stop */
83
87
  }
84
88
  // Helper function to get current theme name
85
89
  function getCurrentThemeName() {
@@ -11,7 +11,7 @@ exports.getTerminalResetCode = getTerminalResetCode;
11
11
  exports.coloredInupLogo = coloredInupLogo;
12
12
  const chalk_1 = __importDefault(require("chalk"));
13
13
  const theme_manager_1 = require("./state/theme-manager");
14
- const config_1 = require("../config");
14
+ const config_1 = require("../../shared/config");
15
15
  // Centralized theme color definitions - single source of truth
16
16
  const themeColorDefinitions = {
17
17
  default: {
@@ -179,7 +179,10 @@ function hexToRgb(hex) {
179
179
  g: parseInt(result[2], 16),
180
180
  b: parseInt(result[3], 16),
181
181
  }
182
- : { r: 0, g: 0, b: 0 };
182
+ : // Unreachable with the theme definitions in this file (all valid hex);
183
+ // black is the safe answer if a malformed value ever slips in.
184
+ /* v8 ignore next */
185
+ { r: 0, g: 0, b: 0 };
183
186
  }
184
187
  /**
185
188
  * Get ANSI escape code to set terminal background color.
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PackageUpgrader = exports.PackageDetector = void 0;
4
+ var package_detector_1 = require("./package-detector");
5
+ Object.defineProperty(exports, "PackageDetector", { enumerable: true, get: function () { return package_detector_1.PackageDetector; } });
6
+ var upgrader_1 = require("./upgrader");
7
+ Object.defineProperty(exports, "PackageUpgrader", { enumerable: true, get: function () { return upgrader_1.PackageUpgrader; } });
8
+ //# sourceMappingURL=index.js.map