bussing 0.0.1 → 0.0.4

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bussing.js","sourceRoot":"","sources":["../src/bussing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DependencyField, Problem, ProblemCategory, ProblemKind } from './types.js';
2
+ /**
3
+ * De la más grave a la menos grave. Primero lo que puede hacer perder trabajo, después lo que hace fallar en otros entornos.
4
+ * Las dependencias desactualizadas van antes de subir la versión porque al corregirlas cambia el package.json.
5
+ * Entre ellas pesa primero el campo (productivas, peer, opcionales, dev) y, dentro de un campo, esperar va antes.
6
+ */
7
+ export declare const PROBLEM_CATEGORIES: readonly ProblemCategory[];
8
+ /** Categoría de cada tipo de problema, salvo las dependencias desactualizadas (ver `DEPENDENCY_CATEGORY`). */
9
+ export declare const PROBLEM_CATEGORY: Record<Exclude<ProblemKind, 'outdated-dependency'>, ProblemCategory>;
10
+ /** Categoría de una dependencia desactualizada según el campo en que figura y si hay que esperarla. */
11
+ export declare const DEPENDENCY_CATEGORY: Record<DependencyField, {
12
+ waiting: ProblemCategory;
13
+ outdated: ProblemCategory;
14
+ }>;
15
+ /**
16
+ * Si el problema llega a quien usa el paquete (y por lo tanto los repositorios que dependen de él entran en la lista de
17
+ * limpieza). No llegan las devDependencies desactualizadas ni node_modules alterado (es la instalación local, no el contenido).
18
+ */
19
+ export declare const REACHES_DEPENDENTS: Record<ProblemCategory, boolean>;
20
+ /** Gravedad de un campo de dependencias (menor es más grave), según el lugar de sus categorías en `PROBLEM_CATEGORIES`. */
21
+ export declare function fieldGravity(field: DependencyField): number;
22
+ /** Categoría de un problema. Una dependencia desactualizada es `waiting-*` si hay que esperarla (`mustWait`). */
23
+ export declare function problemCategory(problem: Problem, mustWait: (name: string) => boolean): ProblemCategory;
24
+ /** Categoría más grave entre los problemas; `null` si no hay problemas. */
25
+ export declare function mainCategory(problems: Problem[], mustWait: (name: string) => boolean): ProblemCategory | null;
@@ -0,0 +1,81 @@
1
+ // Categorías de problemas y su gravedad.
2
+ /**
3
+ * De la más grave a la menos grave. Primero lo que puede hacer perder trabajo, después lo que hace fallar en otros entornos.
4
+ * Las dependencias desactualizadas van antes de subir la versión porque al corregirlas cambia el package.json.
5
+ * Entre ellas pesa primero el campo (productivas, peer, opcionales, dev) y, dentro de un campo, esperar va antes.
6
+ */
7
+ export const PROBLEM_CATEGORIES = [
8
+ 'uncommitted',
9
+ 'unpushed',
10
+ 'altered-node-modules',
11
+ 'waiting-dependencies',
12
+ 'outdated-dependencies',
13
+ 'waiting-peer-dependencies',
14
+ 'outdated-peer-dependencies',
15
+ 'waiting-optional-dependencies',
16
+ 'outdated-optional-dependencies',
17
+ 'waiting-dev-dependencies',
18
+ 'outdated-dev-dependencies',
19
+ 'version-not-bumped',
20
+ 'unpublished',
21
+ ];
22
+ /** Categoría de cada tipo de problema, salvo las dependencias desactualizadas (ver `DEPENDENCY_CATEGORY`). */
23
+ export const PROBLEM_CATEGORY = {
24
+ 'uncommitted': 'uncommitted',
25
+ 'unpushed': 'unpushed',
26
+ 'no-upstream': 'unpushed',
27
+ 'linked-dependency': 'altered-node-modules',
28
+ 'copied-dependency': 'altered-node-modules',
29
+ 'version-not-bumped': 'version-not-bumped',
30
+ 'unpublished-version': 'unpublished',
31
+ 'not-published': 'unpublished',
32
+ };
33
+ /** Categoría de una dependencia desactualizada según el campo en que figura y si hay que esperarla. */
34
+ export const DEPENDENCY_CATEGORY = {
35
+ 'dependencies': { waiting: 'waiting-dependencies', outdated: 'outdated-dependencies' },
36
+ 'peerDependencies': { waiting: 'waiting-peer-dependencies', outdated: 'outdated-peer-dependencies' },
37
+ 'optionalDependencies': { waiting: 'waiting-optional-dependencies', outdated: 'outdated-optional-dependencies' },
38
+ 'devDependencies': { waiting: 'waiting-dev-dependencies', outdated: 'outdated-dev-dependencies' },
39
+ };
40
+ /**
41
+ * Si el problema llega a quien usa el paquete (y por lo tanto los repositorios que dependen de él entran en la lista de
42
+ * limpieza). No llegan las devDependencies desactualizadas ni node_modules alterado (es la instalación local, no el contenido).
43
+ */
44
+ export const REACHES_DEPENDENTS = {
45
+ 'uncommitted': true,
46
+ 'unpushed': true,
47
+ 'altered-node-modules': false,
48
+ 'waiting-dependencies': true,
49
+ 'outdated-dependencies': true,
50
+ 'waiting-peer-dependencies': true,
51
+ 'outdated-peer-dependencies': true,
52
+ 'waiting-optional-dependencies': true,
53
+ 'outdated-optional-dependencies': true,
54
+ 'waiting-dev-dependencies': false,
55
+ 'outdated-dev-dependencies': false,
56
+ 'version-not-bumped': true,
57
+ 'unpublished': true,
58
+ };
59
+ /** Gravedad de un campo de dependencias (menor es más grave), según el lugar de sus categorías en `PROBLEM_CATEGORIES`. */
60
+ export function fieldGravity(field) {
61
+ return PROBLEM_CATEGORIES.indexOf(DEPENDENCY_CATEGORY[field].outdated);
62
+ }
63
+ /** Categoría de un problema. Una dependencia desactualizada es `waiting-*` si hay que esperarla (`mustWait`). */
64
+ export function problemCategory(problem, mustWait) {
65
+ if (problem.kind === 'outdated-dependency') {
66
+ const categories = DEPENDENCY_CATEGORY[problem.field];
67
+ return mustWait(problem.dependency) ? categories.waiting : categories.outdated;
68
+ }
69
+ return PROBLEM_CATEGORY[problem.kind];
70
+ }
71
+ /** Categoría más grave entre los problemas; `null` si no hay problemas. */
72
+ export function mainCategory(problems, mustWait) {
73
+ let best = null;
74
+ for (const problem of problems) {
75
+ const index = PROBLEM_CATEGORIES.indexOf(problemCategory(problem, mustWait));
76
+ if (best === null || index < best)
77
+ best = index;
78
+ }
79
+ return best === null ? null : PROBLEM_CATEGORIES[best] ?? null;
80
+ }
81
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../src/categories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import * as git from './git.js';
2
+ import { type PackageJson } from './repos.js';
3
+ import type { CopyDifference, Problem, Registry, Warning } from './types.js';
4
+ export interface CheckResult {
5
+ problems: Problem[];
6
+ warnings: Warning[];
7
+ }
8
+ export interface GitCheckResult extends CheckResult {
9
+ /** `null` si la carpeta no es un repositorio git. */
10
+ state: git.GitState | null;
11
+ }
12
+ export declare function checkGit(dir: string): Promise<GitCheckResult>;
13
+ export declare function checkPublication(dir: string, pkg: PackageJson, state: git.GitState | null, registry: Registry): Promise<CheckResult>;
14
+ /** Versión local de cada paquete revisado (solo los nombres que corresponden a un único repositorio). */
15
+ export type LocalVersions = Map<string, string>;
16
+ export declare function checkCrossDependencies(pkg: PackageJson, localVersions: LocalVersions): CheckResult;
17
+ /** Archivos declarados en `bin` del package.json publicado. */
18
+ export declare function binFiles(tarball: Map<string, Uint8Array>): Set<string>;
19
+ /**
20
+ * Al instalar, npm (bin-links) cambia el fin de línea CRLF de la primera línea (el shebang) de los ejecutables por LF.
21
+ * Devuelve el contenido publicado con ese mismo cambio aplicado.
22
+ */
23
+ export declare function installedBinContent(content: Uint8Array): Uint8Array;
24
+ export declare function compareWithTarball(installedDir: string, tarball: Map<string, Uint8Array>): Promise<CopyDifference[]>;
25
+ /**
26
+ * Busca en `node_modules` enlaces simbólicos (todas las dependencias) y copias que no coinciden con lo publicado
27
+ * (solo las dependencias que son repositorios revisados, `localNames`).
28
+ */
29
+ export declare function checkInstallation(dir: string, localNames: Set<string>, registry: Registry): Promise<CheckResult>;
package/dist/checks.js ADDED
@@ -0,0 +1,255 @@
1
+ // Controles por repositorio: git, publicación, dependencias cruzadas e instalación.
2
+ import { lstat, readdir, readFile, readlink, stat } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { guarantee, is } from 'guarantee-type';
5
+ import semver from 'semver';
6
+ import * as git from './git.js';
7
+ import { declaredDependencies, readPackageJson } from './repos.js';
8
+ function emptyResult() {
9
+ return { problems: [], warnings: [] };
10
+ }
11
+ function isNotFound(err) {
12
+ return err instanceof Error && 'code' in err && err.code === 'ENOENT';
13
+ }
14
+ async function exists(path) {
15
+ try {
16
+ await lstat(path);
17
+ return true;
18
+ }
19
+ catch (err) {
20
+ if (isNotFound(err))
21
+ return false;
22
+ throw err;
23
+ }
24
+ }
25
+ export async function checkGit(dir) {
26
+ if (!await exists(join(dir, '.git'))) {
27
+ return { state: null, problems: [], warnings: [{ check: 'git', message: 'no es un repositorio git' }] };
28
+ }
29
+ const state = await git.getState(dir);
30
+ const result = { state, problems: [], warnings: [] };
31
+ if (state.changed.length > 0)
32
+ result.problems.push({ kind: 'uncommitted', files: state.changed });
33
+ if (state.branch === null) {
34
+ result.warnings.push({ check: 'git', message: 'HEAD desacoplado (no está en ninguna rama)' });
35
+ }
36
+ else if (state.upstream === null) {
37
+ result.problems.push({ kind: 'no-upstream', branch: state.branch });
38
+ }
39
+ if (state.ahead > 0)
40
+ result.problems.push({ kind: 'unpushed', commits: state.ahead });
41
+ return result;
42
+ }
43
+ // ---------------------------------------------------------------- publicación
44
+ export async function checkPublication(dir, pkg, state, registry) {
45
+ const result = emptyResult();
46
+ if (pkg.private === true)
47
+ return result;
48
+ if (pkg.name === undefined || pkg.version === undefined) {
49
+ result.warnings.push({ check: 'publication', message: 'el package.json no tiene name o version' });
50
+ return result;
51
+ }
52
+ const packument = await registry.getPackument(pkg.name);
53
+ if (packument === null) {
54
+ result.problems.push({ kind: 'not-published', version: pkg.version });
55
+ return result;
56
+ }
57
+ const published = packument.versions[pkg.version];
58
+ if (published === undefined) {
59
+ result.problems.push({ kind: 'unpublished-version', version: pkg.version, latest: packument.distTags['latest'] ?? null });
60
+ return result;
61
+ }
62
+ const gitHead = published.gitHead;
63
+ if (gitHead === undefined) {
64
+ result.warnings.push({ check: 'publication', message: `npm no registró el commit (gitHead) de la versión ${pkg.version}; no se puede saber si hay cambios posteriores` });
65
+ }
66
+ else if (state === null || state.head === null) {
67
+ result.warnings.push({ check: 'publication', message: 'no hay commit local para comparar con el publicado' });
68
+ }
69
+ else if (gitHead !== state.head) {
70
+ if (!await git.commitExists(dir, gitHead)) {
71
+ result.warnings.push({ check: 'publication', message: `el commit publicado (${gitHead}) no está en el repositorio local` });
72
+ }
73
+ else if (await git.isAncestor(dir, gitHead, state.head)) {
74
+ result.problems.push({ kind: 'version-not-bumped', version: pkg.version, commitsAfterPublish: await git.countCommits(dir, gitHead, state.head) });
75
+ }
76
+ else {
77
+ result.warnings.push({ check: 'publication', message: `el HEAD local no desciende del commit publicado (${gitHead})` });
78
+ }
79
+ }
80
+ return result;
81
+ }
82
+ export function checkCrossDependencies(pkg, localVersions) {
83
+ const result = emptyResult();
84
+ for (const dep of declaredDependencies(pkg)) {
85
+ const local = localVersions.get(dep.name);
86
+ if (local === undefined || dep.name === pkg.name)
87
+ continue;
88
+ const minimum = semver.validRange(dep.spec) === null ? null : semver.minVersion(dep.spec);
89
+ if (minimum === null) {
90
+ result.warnings.push({ check: 'cross-dependencies', message: `${dep.name}: la versión declarada "${dep.spec}" (${dep.field}) no es un rango semver` });
91
+ }
92
+ else if (semver.valid(local) === null) {
93
+ result.warnings.push({ check: 'cross-dependencies', message: `${dep.name}: la versión local "${local}" no es semver` });
94
+ }
95
+ else if (semver.lt(minimum, local)) {
96
+ result.problems.push({ kind: 'outdated-dependency', dependency: dep.name, field: dep.field, declared: dep.spec, local });
97
+ }
98
+ }
99
+ return result;
100
+ }
101
+ // ---------------------------------------------------------------- instalación
102
+ const lockDescription = is.object({
103
+ lockfileVersion: is.number,
104
+ packages: is.optional.recordString.object({
105
+ version: is.optional.string,
106
+ resolved: is.optional.string,
107
+ integrity: is.optional.string,
108
+ link: is.optional.boolean,
109
+ }),
110
+ });
111
+ /** Nombres de los paquetes instalados en `node_modules` (incluye los que tienen scope). */
112
+ async function installedNames(nodeModules) {
113
+ const names = [];
114
+ for (const entry of await readdir(nodeModules, { withFileTypes: true })) {
115
+ if (entry.name.startsWith('.'))
116
+ continue;
117
+ if (entry.name.startsWith('@') && entry.isDirectory()) {
118
+ for (const scoped of await readdir(join(nodeModules, entry.name)))
119
+ names.push(`${entry.name}/${scoped}`);
120
+ }
121
+ else {
122
+ names.push(entry.name);
123
+ }
124
+ }
125
+ return names;
126
+ }
127
+ /** Rutas relativas (con `/`) de los archivos de un paquete instalado, sin su `node_modules` interno. */
128
+ async function installedFiles(root, relative = '') {
129
+ const files = [];
130
+ for (const entry of await readdir(join(root, relative), { withFileTypes: true })) {
131
+ const path = relative === '' ? entry.name : `${relative}/${entry.name}`;
132
+ if (entry.isDirectory()) {
133
+ if (path !== 'node_modules')
134
+ files.push(...await installedFiles(root, path));
135
+ }
136
+ else {
137
+ files.push(path);
138
+ }
139
+ }
140
+ return files;
141
+ }
142
+ const binDescription = is.object({
143
+ bin: { optional: is.union([is.string, is.recordString.string]) },
144
+ });
145
+ function normalizePath(path) {
146
+ return path.replace(/\\/g, '/').replace(/^(\.\/)+/, '');
147
+ }
148
+ /** Archivos declarados en `bin` del package.json publicado. */
149
+ export function binFiles(tarball) {
150
+ const packageJson = tarball.get('package.json');
151
+ if (packageJson === undefined)
152
+ return new Set();
153
+ const bin = guarantee(binDescription, JSON.parse(Buffer.from(packageJson).toString('utf8'))).bin;
154
+ const paths = bin === undefined ? [] : typeof bin === 'string' ? [bin] : Object.values(bin);
155
+ return new Set(paths.map(normalizePath));
156
+ }
157
+ /**
158
+ * Al instalar, npm (bin-links) cambia el fin de línea CRLF de la primera línea (el shebang) de los ejecutables por LF.
159
+ * Devuelve el contenido publicado con ese mismo cambio aplicado.
160
+ */
161
+ export function installedBinContent(content) {
162
+ const buffer = Buffer.from(content);
163
+ const firstLineEnd = buffer.indexOf(0x0a);
164
+ if (buffer.subarray(0, 2).toString('latin1') === '#!' && firstLineEnd > 0 && buffer[firstLineEnd - 1] === 0x0d) {
165
+ return Buffer.concat([buffer.subarray(0, firstLineEnd - 1), buffer.subarray(firstLineEnd)]);
166
+ }
167
+ return content;
168
+ }
169
+ export async function compareWithTarball(installedDir, tarball) {
170
+ const differences = [];
171
+ const installed = new Set(await installedFiles(installedDir));
172
+ const bins = binFiles(tarball);
173
+ for (const [path, published] of tarball) {
174
+ const expected = bins.has(path) ? installedBinContent(published) : published;
175
+ if (!installed.has(path)) {
176
+ differences.push({ path, kind: 'missing' });
177
+ }
178
+ else if (Buffer.compare(await readFile(join(installedDir, path)), expected) !== 0) {
179
+ differences.push({ path, kind: 'modified' });
180
+ }
181
+ }
182
+ for (const path of installed) {
183
+ if (!tarball.has(path))
184
+ differences.push({ path, kind: 'extra' });
185
+ }
186
+ return differences.sort(function (a, b) { return a.path < b.path ? -1 : a.path > b.path ? 1 : 0; });
187
+ }
188
+ /**
189
+ * Busca en `node_modules` enlaces simbólicos (todas las dependencias) y copias que no coinciden con lo publicado
190
+ * (solo las dependencias que son repositorios revisados, `localNames`).
191
+ */
192
+ export async function checkInstallation(dir, localNames, registry) {
193
+ const result = emptyResult();
194
+ const nodeModules = join(dir, 'node_modules');
195
+ if (!await exists(nodeModules))
196
+ return result;
197
+ const toCompare = [];
198
+ for (const name of await installedNames(nodeModules)) {
199
+ const path = join(nodeModules, name);
200
+ if ((await lstat(path)).isSymbolicLink()) {
201
+ result.problems.push({ kind: 'linked-dependency', dependency: name, target: await readlink(path) });
202
+ }
203
+ else if (localNames.has(name) && (await stat(path)).isDirectory()) {
204
+ toCompare.push(name);
205
+ }
206
+ }
207
+ if (toCompare.length === 0)
208
+ return result;
209
+ let lockText;
210
+ try {
211
+ lockText = await readFile(join(dir, 'package-lock.json'), 'utf8');
212
+ }
213
+ catch (err) {
214
+ if (!isNotFound(err))
215
+ throw err;
216
+ result.warnings.push({ check: 'installation', message: `no hay package-lock.json; no se puede verificar ${toCompare.join(', ')}` });
217
+ return result;
218
+ }
219
+ const lock = guarantee(lockDescription, JSON.parse(lockText));
220
+ if (lock.packages === undefined) {
221
+ result.warnings.push({ check: 'installation', message: `package-lock.json versión ${lock.lockfileVersion} sin "packages"; no se puede verificar ${toCompare.join(', ')}` });
222
+ return result;
223
+ }
224
+ for (const name of toCompare) {
225
+ const entry = lock.packages[`node_modules/${name}`];
226
+ if (entry === undefined || entry.version === undefined) {
227
+ result.warnings.push({ check: 'installation', message: `${name} no figura en package-lock.json` });
228
+ continue;
229
+ }
230
+ let tarballUrl = entry.resolved;
231
+ if (tarballUrl === undefined) {
232
+ const packument = await registry.getPackument(name);
233
+ tarballUrl = packument?.versions[entry.version]?.tarball;
234
+ }
235
+ if (tarballUrl === undefined || !/^https?:\/\//.test(tarballUrl)) {
236
+ result.warnings.push({ check: 'installation', message: `${name}@${entry.version}: no se encontró el tarball publicado (${tarballUrl ?? 'sin resolved'})` });
237
+ continue;
238
+ }
239
+ const installedDir = join(nodeModules, name);
240
+ const differences = await compareWithTarball(installedDir, await registry.getTarballFiles(tarballUrl, entry.integrity));
241
+ if (differences.length > 0) {
242
+ let installedVersion;
243
+ try {
244
+ installedVersion = (await readPackageJson(installedDir)).version ?? null;
245
+ }
246
+ catch (err) {
247
+ installedVersion = null;
248
+ result.warnings.push({ check: 'installation', message: `no se pudo leer node_modules/${name}/package.json: ${err instanceof Error ? err.message : String(err)}` });
249
+ }
250
+ result.problems.push({ kind: 'copied-dependency', dependency: name, version: entry.version, installedVersion, differences });
251
+ }
252
+ }
253
+ return result;
254
+ }
255
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../src/checks.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ export interface GitState {
2
+ /** Rama actual; `null` si el HEAD está desacoplado. */
3
+ branch: string | null;
4
+ /** Commit actual; `null` si el repositorio todavía no tiene commits. */
5
+ head: string | null;
6
+ upstream: string | null;
7
+ ahead: number;
8
+ behind: number;
9
+ /** Archivos modificados, en conflicto o no versionados (los ignorados no se incluyen). */
10
+ changed: string[];
11
+ }
12
+ /** Interpreta la salida de `git status --porcelain=v2 --branch -z`. */
13
+ export declare function parseStatus(output: string): GitState;
14
+ export declare function getState(dir: string): Promise<GitState>;
15
+ /** `true` si el commit existe en el repositorio local. */
16
+ export declare function commitExists(dir: string, commit: string): Promise<boolean>;
17
+ /** `true` si `ancestor` es ancestro de `descendant` (o es el mismo commit). */
18
+ export declare function isAncestor(dir: string, ancestor: string, descendant: string): Promise<boolean>;
19
+ /** Cantidad de commits alcanzables desde `to` que no lo son desde `from`. */
20
+ export declare function countCommits(dir: string, from: string, to: string): Promise<number>;
package/dist/git.js ADDED
@@ -0,0 +1,88 @@
1
+ // Consultas a git. Se invoca el ejecutable `git` sin shell.
2
+ import { execFile } from 'node:child_process';
3
+ function runGit(dir, args) {
4
+ return new Promise(function (resolve, reject) {
5
+ execFile('git', ['-C', dir, ...args], { maxBuffer: 64 * 1024 * 1024, encoding: 'utf8' }, function (err, stdout, stderr) {
6
+ if (err === null) {
7
+ resolve({ code: 0, stdout, stderr });
8
+ }
9
+ else if (typeof err.code === 'number') {
10
+ resolve({ code: err.code, stdout, stderr });
11
+ }
12
+ else {
13
+ reject(err);
14
+ }
15
+ });
16
+ });
17
+ }
18
+ async function git(dir, args) {
19
+ const result = await runGit(dir, args);
20
+ if (result.code !== 0)
21
+ throw new Error(`git ${args.join(' ')} (en ${dir}) terminó con código ${result.code}: ${result.stderr.trim()}`);
22
+ return result.stdout;
23
+ }
24
+ /** Interpreta la salida de `git status --porcelain=v2 --branch -z`. */
25
+ export function parseStatus(output) {
26
+ const state = { branch: null, head: null, upstream: null, ahead: 0, behind: 0, changed: [] };
27
+ const items = output.split('\0');
28
+ for (let i = 0; i < items.length; i++) {
29
+ const item = items[i] ?? '';
30
+ if (item.startsWith('# branch.oid ')) {
31
+ const oid = item.slice('# branch.oid '.length);
32
+ state.head = oid === '(initial)' ? null : oid;
33
+ }
34
+ else if (item.startsWith('# branch.head ')) {
35
+ const branch = item.slice('# branch.head '.length);
36
+ state.branch = branch === '(detached)' ? null : branch;
37
+ }
38
+ else if (item.startsWith('# branch.upstream ')) {
39
+ state.upstream = item.slice('# branch.upstream '.length);
40
+ }
41
+ else if (item.startsWith('# branch.ab ')) {
42
+ const match = /^# branch\.ab \+(\d+) -(\d+)$/.exec(item);
43
+ if (match === null)
44
+ throw new Error(`Línea de git status no reconocida: ${item}`);
45
+ state.ahead = Number(match[1]);
46
+ state.behind = Number(match[2]);
47
+ }
48
+ else if (item.startsWith('1 ')) {
49
+ state.changed.push(item.split(' ').slice(8).join(' '));
50
+ }
51
+ else if (item.startsWith('2 ')) {
52
+ state.changed.push(item.split(' ').slice(9).join(' '));
53
+ i++; // el siguiente elemento es la ruta original del renombre
54
+ }
55
+ else if (item.startsWith('u ')) {
56
+ state.changed.push(item.split(' ').slice(10).join(' '));
57
+ }
58
+ else if (item.startsWith('? ')) {
59
+ state.changed.push(item.slice(2));
60
+ }
61
+ else if (item !== '' && !item.startsWith('# ')) {
62
+ throw new Error(`Línea de git status no reconocida: ${item}`);
63
+ }
64
+ }
65
+ return state;
66
+ }
67
+ export async function getState(dir) {
68
+ return parseStatus(await git(dir, ['status', '--porcelain=v2', '--branch', '-z', '--untracked-files=normal']));
69
+ }
70
+ /** `true` si el commit existe en el repositorio local. */
71
+ export async function commitExists(dir, commit) {
72
+ const result = await runGit(dir, ['cat-file', '-e', `${commit}^{commit}`]);
73
+ return result.code === 0;
74
+ }
75
+ /** `true` si `ancestor` es ancestro de `descendant` (o es el mismo commit). */
76
+ export async function isAncestor(dir, ancestor, descendant) {
77
+ const result = await runGit(dir, ['merge-base', '--is-ancestor', ancestor, descendant]);
78
+ if (result.code === 0)
79
+ return true;
80
+ if (result.code === 1)
81
+ return false;
82
+ throw new Error(`git merge-base --is-ancestor (en ${dir}) terminó con código ${result.code}: ${result.stderr.trim()}`);
83
+ }
84
+ /** Cantidad de commits alcanzables desde `to` que no lo son desde `from`. */
85
+ export async function countCommits(dir, from, to) {
86
+ return Number((await git(dir, ['rev-list', '--count', `${from}..${to}`])).trim());
87
+ }
88
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { CleanupStep, DependencyField, ProblemCategory } from './types.js';
2
+ export interface OrderNode {
3
+ /** Identifica al nodo (la carpeta del repositorio, porque dos repositorios pueden tener el mismo nombre). */
4
+ dir: string;
5
+ name: string;
6
+ /** Categoría del problema propio más grave; `null` si no tiene problemas propios. */
7
+ mainProblem: ProblemCategory | null;
8
+ /** Si tiene algún problema que llega a quien usa el paquete (ver `REACHES_DEPENDENTS`). */
9
+ reachesDependents: boolean;
10
+ /** Repositorios revisados de los que depende (dependencias fuertes: siempre se respetan en el orden), con el campo más grave. */
11
+ dependsOn: {
12
+ dir: string;
13
+ field: DependencyField;
14
+ }[];
15
+ /** Carpetas de los repositorios revisados de los que depende como devDependency (débiles: se respetan salvo que cierren un ciclo). */
16
+ weakDependsOn: string[];
17
+ }
18
+ /** `priority`: prioridad de cada paquete como dependencia débil (por omisión 0); ver `BussingOptions.dependencyPriority`. */
19
+ export declare function computeCleanupOrder(nodes: OrderNode[], priority?: ReadonlyMap<string, number>): CleanupStep[];