@teambit/doctor 0.0.0-00997c6fe4e832b4e5a012dc136eed546275ebcb
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.
- package/core-diagnoses/broken-symlink-files.ts +78 -0
- package/core-diagnoses/orphan-symlink-objects.ts +50 -0
- package/core-diagnoses/validate-bit-version.ts +55 -0
- package/core-diagnoses/validate-git-exec.ts +39 -0
- package/core-diagnoses/validate-npm-exec.ts +41 -0
- package/core-diagnoses/validate-scope-objects.ts +83 -0
- package/core-diagnoses/validate-workspace-bit-json-syntax.ts +36 -0
- package/core-diagnoses/validate-yarn-exec.ts +41 -0
- package/dist/core-diagnoses/broken-symlink-files.d.ts +16 -0
- package/dist/core-diagnoses/broken-symlink-files.js +126 -0
- package/dist/core-diagnoses/broken-symlink-files.js.map +1 -0
- package/dist/core-diagnoses/orphan-symlink-objects.d.ts +11 -0
- package/dist/core-diagnoses/orphan-symlink-objects.js +82 -0
- package/dist/core-diagnoses/orphan-symlink-objects.js.map +1 -0
- package/dist/core-diagnoses/validate-bit-version.d.ts +10 -0
- package/dist/core-diagnoses/validate-bit-version.js +92 -0
- package/dist/core-diagnoses/validate-bit-version.js.map +1 -0
- package/dist/core-diagnoses/validate-git-exec.d.ts +11 -0
- package/dist/core-diagnoses/validate-git-exec.js +68 -0
- package/dist/core-diagnoses/validate-git-exec.js.map +1 -0
- package/dist/core-diagnoses/validate-npm-exec.d.ts +11 -0
- package/dist/core-diagnoses/validate-npm-exec.js +73 -0
- package/dist/core-diagnoses/validate-npm-exec.js.map +1 -0
- package/dist/core-diagnoses/validate-scope-objects.d.ts +11 -0
- package/dist/core-diagnoses/validate-scope-objects.js +113 -0
- package/dist/core-diagnoses/validate-scope-objects.js.map +1 -0
- package/dist/core-diagnoses/validate-workspace-bit-json-syntax.d.ts +10 -0
- package/dist/core-diagnoses/validate-workspace-bit-json-syntax.js +66 -0
- package/dist/core-diagnoses/validate-workspace-bit-json-syntax.js.map +1 -0
- package/dist/core-diagnoses/validate-yarn-exec.d.ts +11 -0
- package/dist/core-diagnoses/validate-yarn-exec.js +72 -0
- package/dist/core-diagnoses/validate-yarn-exec.js.map +1 -0
- package/dist/diagnosis-list-template.d.ts +2 -0
- package/dist/diagnosis-list-template.js +42 -0
- package/dist/diagnosis-list-template.js.map +1 -0
- package/dist/diagnosis.d.ts +41 -0
- package/dist/diagnosis.js +70 -0
- package/dist/diagnosis.js.map +1 -0
- package/dist/doctor-cmd.d.ts +26 -0
- package/dist/doctor-cmd.js +122 -0
- package/dist/doctor-cmd.js.map +1 -0
- package/dist/doctor-context.d.ts +49 -0
- package/dist/doctor-context.js +69 -0
- package/dist/doctor-context.js.map +1 -0
- package/dist/doctor-registrar-builder.d.ts +2 -0
- package/dist/doctor-registrar-builder.js +76 -0
- package/dist/doctor-registrar-builder.js.map +1 -0
- package/dist/doctor-registrar.d.ts +21 -0
- package/dist/doctor-registrar.js +62 -0
- package/dist/doctor-registrar.js.map +1 -0
- package/dist/doctor-results-template.d.ts +2 -0
- package/dist/doctor-results-template.js +115 -0
- package/dist/doctor-results-template.js.map +1 -0
- package/dist/doctor.aspect.d.ts +2 -0
- package/dist/doctor.aspect.js +18 -0
- package/dist/doctor.aspect.js.map +1 -0
- package/dist/doctor.graphql.d.ts +3 -0
- package/dist/doctor.graphql.js +74 -0
- package/dist/doctor.graphql.js.map +1 -0
- package/dist/doctor.main.runtime.d.ts +63 -0
- package/dist/doctor.main.runtime.js +524 -0
- package/dist/doctor.main.runtime.js.map +1 -0
- package/dist/esm.mjs +8 -0
- package/dist/exceptions/diagnosis-not-found.d.ts +5 -0
- package/dist/exceptions/diagnosis-not-found.js +30 -0
- package/dist/exceptions/diagnosis-not-found.js.map +1 -0
- package/dist/exceptions/missing-diagnosis-name.d.ts +4 -0
- package/dist/exceptions/missing-diagnosis-name.js +21 -0
- package/dist/exceptions/missing-diagnosis-name.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/preview-1764777197370.js +7 -0
- package/dist/run-doctor-on-scope.d.ts +3 -0
- package/dist/run-doctor-on-scope.js +140 -0
- package/dist/run-doctor-on-scope.js.map +1 -0
- package/esm.mjs +8 -0
- package/exceptions/diagnosis-not-found.ts +8 -0
- package/exceptions/missing-diagnosis-name.ts +7 -0
- package/package.json +85 -0
- package/types/asset.d.ts +41 -0
- package/types/style.d.ts +42 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import { globSync } from 'glob';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { loadConsumer } from '@teambit/legacy.consumer';
|
|
5
|
+
import { Scope } from '@teambit/legacy.scope';
|
|
6
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
7
|
+
import Diagnosis from '../diagnosis';
|
|
8
|
+
import { uniq } from 'lodash';
|
|
9
|
+
|
|
10
|
+
type BrokenSymlink = { symlinkPath: string; brokenPath: string; pathToDelete: string };
|
|
11
|
+
export const DIAGNOSIS_NAME = 'check environment symlinks';
|
|
12
|
+
|
|
13
|
+
export default class BrokenSymlinkFiles extends Diagnosis {
|
|
14
|
+
name = DIAGNOSIS_NAME;
|
|
15
|
+
description = 'validate generated symlinks for workspace environments';
|
|
16
|
+
category = 'local environments';
|
|
17
|
+
|
|
18
|
+
_formatSymptoms(bareResult: ExamineBareResult): string {
|
|
19
|
+
if (!bareResult.data) throw new Error('BrokenSymlinkFiles, bareResult.data is missing');
|
|
20
|
+
const toString = bareResult.data.brokenSymlinks
|
|
21
|
+
.map(
|
|
22
|
+
(brokenSymlink) => `symlink path: "${brokenSymlink.symlinkPath}", broken link: "${brokenSymlink.brokenPath}"`
|
|
23
|
+
)
|
|
24
|
+
.join('\n');
|
|
25
|
+
return `the following symlinks points to non-existing paths\n${toString}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
_formatManualTreat(bareResult: ExamineBareResult) {
|
|
29
|
+
if (!bareResult.data) throw new Error('BrokenSymlinkFiles, bareResult.data is missing');
|
|
30
|
+
const toString = uniq(bareResult.data.brokenSymlinks.map((b) => b.pathToDelete)).join('\n');
|
|
31
|
+
return `please delete the following paths:\n${toString}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
35
|
+
const consumer = await loadConsumer();
|
|
36
|
+
const envComponentsDir = path.join(consumer.scope.getPath(), Scope.getComponentsRelativePath());
|
|
37
|
+
const potentialSymlinks = globSync('**/node_modules/@bit/**', { cwd: envComponentsDir });
|
|
38
|
+
const potentialSymlinksAbs = potentialSymlinks.map((p) => path.join(envComponentsDir, p));
|
|
39
|
+
const brokenSymlinks: BrokenSymlink[] = [];
|
|
40
|
+
const results = potentialSymlinksAbs.map(async (potentialSymlink) => {
|
|
41
|
+
const link = await this._getLinkIfExist(potentialSymlink);
|
|
42
|
+
if (!link) return;
|
|
43
|
+
const exists = await fs.pathExists(link);
|
|
44
|
+
if (exists) return;
|
|
45
|
+
const brokenSymlink = {
|
|
46
|
+
symlinkPath: potentialSymlink,
|
|
47
|
+
brokenPath: link,
|
|
48
|
+
pathToDelete: this._getPathToDelete(potentialSymlink),
|
|
49
|
+
};
|
|
50
|
+
brokenSymlinks.push(brokenSymlink);
|
|
51
|
+
});
|
|
52
|
+
await Promise.all(results);
|
|
53
|
+
return {
|
|
54
|
+
valid: brokenSymlinks.length === 0,
|
|
55
|
+
data: {
|
|
56
|
+
brokenSymlinks,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async _getLinkIfExist(symlinkPath: string): Promise<string | null | undefined> {
|
|
62
|
+
try {
|
|
63
|
+
const link = await fs.readlink(symlinkPath);
|
|
64
|
+
return link;
|
|
65
|
+
} catch {
|
|
66
|
+
// probably not a symlink
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* deleting the environment directory causes Bit to reinstall it next time
|
|
73
|
+
*/
|
|
74
|
+
_getPathToDelete(symlinkPath: string): string {
|
|
75
|
+
const envDirectory = symlinkPath.split(path.join('node_modules', '@bit'))[0];
|
|
76
|
+
return envDirectory.slice(0, -1); // remove the last slash
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ComponentIdList } from '@teambit/component-id';
|
|
2
|
+
import { loadConsumer } from '@teambit/legacy.consumer';
|
|
3
|
+
import { ModelComponent, Symlink } from '@teambit/objects';
|
|
4
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
5
|
+
import Diagnosis from '../diagnosis';
|
|
6
|
+
|
|
7
|
+
export const DIAGNOSIS_NAME = 'check orphan refs';
|
|
8
|
+
export default class OrphanSymlinkObjects extends Diagnosis {
|
|
9
|
+
name = DIAGNOSIS_NAME;
|
|
10
|
+
description = 'checks for empty internal refs in local workspace';
|
|
11
|
+
category = 'internal store';
|
|
12
|
+
|
|
13
|
+
_formatSymptoms(bareResult: ExamineBareResult): string {
|
|
14
|
+
if (!bareResult.data) throw new Error('OrphanSymlinkObjects, bareResult.data is missing');
|
|
15
|
+
return `the following refs points to non-existing components "${bareResult.data.orphanSymlinks.toString()}"`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
_formatManualTreat(bareResult: ExamineBareResult) {
|
|
19
|
+
if (!bareResult.data) throw new Error('OrphanSymlinkObjects, bareResult.data is missing');
|
|
20
|
+
return `please delete the following paths:\n${bareResult.data.objectsToDelete.join('\n')}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
24
|
+
const consumer = await loadConsumer();
|
|
25
|
+
const symlinks = await consumer.scope.objects.list([Symlink]);
|
|
26
|
+
const orphanSymlinks = new ComponentIdList();
|
|
27
|
+
const objectsToDelete = [];
|
|
28
|
+
await Promise.all(
|
|
29
|
+
symlinks.map(async (symlink) => {
|
|
30
|
+
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
|
|
31
|
+
const realComponentId: ComponentID = symlink.getRealComponentId();
|
|
32
|
+
const realModelComponent = ModelComponent.fromBitId(realComponentId);
|
|
33
|
+
const foundComponent = await consumer.scope.objects.load(realModelComponent.hash());
|
|
34
|
+
if (!foundComponent) {
|
|
35
|
+
orphanSymlinks.push(realComponentId);
|
|
36
|
+
// @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
|
|
37
|
+
objectsToDelete.push(consumer.scope.objects.objectPath(symlink.hash()));
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
valid: orphanSymlinks.length === 0,
|
|
44
|
+
data: {
|
|
45
|
+
orphanSymlinks,
|
|
46
|
+
objectsToDelete,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import semver from 'semver';
|
|
2
|
+
import { listRemote } from '@teambit/bvm.list';
|
|
3
|
+
import { getBitVersion } from '@teambit/bit.get-bit-version';
|
|
4
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
5
|
+
import Diagnosis from '../diagnosis';
|
|
6
|
+
|
|
7
|
+
export default class ValidateBitVersion extends Diagnosis {
|
|
8
|
+
name = 'validate bit version';
|
|
9
|
+
description = 'validate that bit version is up to date';
|
|
10
|
+
category = 'core';
|
|
11
|
+
|
|
12
|
+
_formatSymptoms(bareResult: ExamineBareResult): string {
|
|
13
|
+
if (!bareResult.data) throw new Error('ValidateBitVersion, bareResult.data is missing');
|
|
14
|
+
if (!bareResult.data.latestVersion) {
|
|
15
|
+
return 'could not fetch bit latest version';
|
|
16
|
+
}
|
|
17
|
+
return `bit is not up to date.
|
|
18
|
+
your version: ${bareResult.data.currentVersion}
|
|
19
|
+
latest version: ${bareResult.data.latestVersion}`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
_formatManualTreat(bareResult: ExamineBareResult) {
|
|
23
|
+
if (!bareResult.data) throw new Error('ValidateBitVersion, bareResult.data is missing');
|
|
24
|
+
if (!bareResult.data.latestVersion) {
|
|
25
|
+
return 'please make sure you have an internet connection';
|
|
26
|
+
}
|
|
27
|
+
return 'please upgrade your bit version (bvm upgrade)';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
31
|
+
const bitRemoteVersionOnBvm = await listRemote({ limit: 1 });
|
|
32
|
+
const bitLatestVersion = bitRemoteVersionOnBvm.entries[0].version;
|
|
33
|
+
const bitCurrentVersion = getBitVersion();
|
|
34
|
+
if (bitLatestVersion) {
|
|
35
|
+
if (semver.lt(bitCurrentVersion, bitLatestVersion)) {
|
|
36
|
+
return {
|
|
37
|
+
valid: false,
|
|
38
|
+
data: {
|
|
39
|
+
latestVersion: bitLatestVersion,
|
|
40
|
+
currentVersion: bitCurrentVersion,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
valid: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
valid: false,
|
|
50
|
+
data: {
|
|
51
|
+
latestVersion: null,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import execa from 'execa';
|
|
2
|
+
import { getGitExecutablePath } from '@teambit/git.modules.git-executable';
|
|
3
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
4
|
+
import Diagnosis from '../diagnosis';
|
|
5
|
+
|
|
6
|
+
export const DIAGNOSIS_NAME_VALIDATE_GIT_EXEC = 'validate git exec';
|
|
7
|
+
export default class ValidateGitExec extends Diagnosis {
|
|
8
|
+
name = DIAGNOSIS_NAME_VALIDATE_GIT_EXEC;
|
|
9
|
+
description = 'validate that git executable found';
|
|
10
|
+
category = 'vendors';
|
|
11
|
+
|
|
12
|
+
_formatSymptoms(bareResult: ExamineBareResult): string {
|
|
13
|
+
const gitExecutablePath = bareResult?.data?.gitExecutablePath;
|
|
14
|
+
return `git executable not found (path '${gitExecutablePath}')`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
_formatManualTreat() {
|
|
18
|
+
return "please ensure that git is installed and/or git_path is configured correctly - 'bit config set git_path <GIT_PATH>'";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
22
|
+
const gitExecutablePath = getGitExecutablePath();
|
|
23
|
+
try {
|
|
24
|
+
await execa(gitExecutablePath, ['--version']);
|
|
25
|
+
return {
|
|
26
|
+
valid: true,
|
|
27
|
+
};
|
|
28
|
+
} catch {
|
|
29
|
+
// if (err.code === 'ENOENT') {
|
|
30
|
+
// }
|
|
31
|
+
return {
|
|
32
|
+
valid: false,
|
|
33
|
+
data: {
|
|
34
|
+
gitExecutablePath,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import execa from 'execa';
|
|
2
|
+
import { logger } from '@teambit/legacy.logger';
|
|
3
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
4
|
+
import Diagnosis from '../diagnosis';
|
|
5
|
+
|
|
6
|
+
export default class ValidateNpmExec extends Diagnosis {
|
|
7
|
+
name = 'validate npm exec';
|
|
8
|
+
description = 'validate that npm executable found';
|
|
9
|
+
category = 'vendors';
|
|
10
|
+
|
|
11
|
+
_formatSymptoms(): string {
|
|
12
|
+
return 'npm executable not found';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
_formatManualTreat() {
|
|
16
|
+
return 'please ensure npm is installed';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
20
|
+
const npmVersion = await getNpmVersion();
|
|
21
|
+
if (npmVersion) {
|
|
22
|
+
return {
|
|
23
|
+
valid: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
valid: false,
|
|
28
|
+
data: {},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function getNpmVersion(): Promise<string | null | undefined> {
|
|
34
|
+
try {
|
|
35
|
+
const { stdout, stderr } = await execa('npm', ['--version']);
|
|
36
|
+
if (stdout && !stderr) return stdout;
|
|
37
|
+
} catch (err: any) {
|
|
38
|
+
logger.debugAndAddBreadCrumb('npm-client', `got an error when executing "npm --version". ${err.message}`);
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { loadConsumerIfExist } from '@teambit/legacy.consumer';
|
|
2
|
+
import { loadScope } from '@teambit/legacy.scope';
|
|
3
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
4
|
+
import Diagnosis from '../diagnosis';
|
|
5
|
+
import { getRemoteScope } from '../doctor-context';
|
|
6
|
+
|
|
7
|
+
export const DIAGNOSIS_NAME = 'validate scope objects';
|
|
8
|
+
|
|
9
|
+
type ComponentWithMissingHead = {
|
|
10
|
+
id: string;
|
|
11
|
+
head: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default class ValidateScopeObjects extends Diagnosis {
|
|
15
|
+
name = DIAGNOSIS_NAME;
|
|
16
|
+
description = 'check if all components have their head version objects';
|
|
17
|
+
category = 'scope integrity';
|
|
18
|
+
|
|
19
|
+
_formatSymptoms(bareResult: ExamineBareResult): string {
|
|
20
|
+
if (!bareResult.data) throw new Error('ValidateScopeObjects, bareResult.data is missing');
|
|
21
|
+
const { componentsWithMissingHeads } = bareResult.data;
|
|
22
|
+
if (!componentsWithMissingHeads || componentsWithMissingHeads.length === 0) {
|
|
23
|
+
return 'No issues found';
|
|
24
|
+
}
|
|
25
|
+
return `the following components have missing head version objects:\n${componentsWithMissingHeads
|
|
26
|
+
.map((c: ComponentWithMissingHead) => ` ${c.id} (head: ${c.head})`)
|
|
27
|
+
.join('\n')}`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
_formatManualTreat() {
|
|
31
|
+
return 'The missing objects need to be restored from backups or re-exported from workspaces that have these components.';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
35
|
+
// Check if running against a remote scope
|
|
36
|
+
const remoteScope = getRemoteScope();
|
|
37
|
+
let scope = remoteScope;
|
|
38
|
+
|
|
39
|
+
// If not remote, try to get scope locally
|
|
40
|
+
if (!scope) {
|
|
41
|
+
// First try workspace
|
|
42
|
+
const consumer = await loadConsumerIfExist();
|
|
43
|
+
scope = consumer?.scope;
|
|
44
|
+
|
|
45
|
+
// If no workspace, try to load bare scope directly
|
|
46
|
+
if (!scope) {
|
|
47
|
+
try {
|
|
48
|
+
scope = await loadScope();
|
|
49
|
+
} catch {
|
|
50
|
+
// Not in a scope, that's fine
|
|
51
|
+
return { valid: true };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Get all local components only
|
|
57
|
+
const modelComponents = await scope.list(true);
|
|
58
|
+
const componentsWithMissingHeads: ComponentWithMissingHead[] = [];
|
|
59
|
+
|
|
60
|
+
// Check each component
|
|
61
|
+
for (const modelComponent of modelComponents) {
|
|
62
|
+
const head = modelComponent.getHead();
|
|
63
|
+
if (!head) continue;
|
|
64
|
+
|
|
65
|
+
// Check if the head version object exists
|
|
66
|
+
const headVersion = await scope.objects.load(head, false);
|
|
67
|
+
if (!headVersion) {
|
|
68
|
+
componentsWithMissingHeads.push({
|
|
69
|
+
id: modelComponent.id(),
|
|
70
|
+
head: head.toString(),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
valid: componentsWithMissingHeads.length === 0,
|
|
77
|
+
data: {
|
|
78
|
+
componentsWithMissingHeads,
|
|
79
|
+
totalComponents: modelComponents.length,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { loadConsumer } from '@teambit/legacy.consumer';
|
|
2
|
+
import { LegacyWorkspaceConfig } from '@teambit/legacy.consumer-config';
|
|
3
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
4
|
+
import Diagnosis from '../diagnosis';
|
|
5
|
+
|
|
6
|
+
export default class ValidateWorkspaceBitJsonSyntax extends Diagnosis {
|
|
7
|
+
name = "validate workspace's bit config";
|
|
8
|
+
description = 'validate workspace configuration object';
|
|
9
|
+
category = 'configuration';
|
|
10
|
+
|
|
11
|
+
_formatSymptoms(bareResult: ExamineBareResult): string {
|
|
12
|
+
const bitJsonPath = bareResult?.data?.bitJsonPath;
|
|
13
|
+
return `invalid workspace.jsonc: ${bitJsonPath} is not a valid JSON file.`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
_formatManualTreat() {
|
|
17
|
+
return 'manually fix the workspace.jsonc or consider running bit init --reset to recreate the file';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// TODO: support configuration from package.json
|
|
21
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
22
|
+
const consumer = await loadConsumer();
|
|
23
|
+
const consumerPath = consumer.getPath();
|
|
24
|
+
try {
|
|
25
|
+
await LegacyWorkspaceConfig.loadIfExist(consumerPath, consumer.scope.path);
|
|
26
|
+
return {
|
|
27
|
+
valid: true,
|
|
28
|
+
};
|
|
29
|
+
} catch {
|
|
30
|
+
return {
|
|
31
|
+
valid: false,
|
|
32
|
+
data: {},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import execa from 'execa';
|
|
2
|
+
import { logger } from '@teambit/legacy.logger';
|
|
3
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
4
|
+
import Diagnosis from '../diagnosis';
|
|
5
|
+
|
|
6
|
+
export default class ValidateYarnExec extends Diagnosis {
|
|
7
|
+
name = 'validate yarn exec';
|
|
8
|
+
description = 'validate that yarn executable found';
|
|
9
|
+
category = 'vendors';
|
|
10
|
+
|
|
11
|
+
_formatSymptoms(): string {
|
|
12
|
+
return 'yarn executable not found';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
_formatManualTreat() {
|
|
16
|
+
return 'please ensure yarn is installed';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async _runExamine(): Promise<ExamineBareResult> {
|
|
20
|
+
const yarnVersion = await getYarnVersion();
|
|
21
|
+
if (yarnVersion) {
|
|
22
|
+
return {
|
|
23
|
+
valid: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
valid: false,
|
|
28
|
+
data: {},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function getYarnVersion(): Promise<string | null | undefined> {
|
|
34
|
+
try {
|
|
35
|
+
const { stdout } = await execa('yarn', ['-v']);
|
|
36
|
+
return stdout;
|
|
37
|
+
} catch (e: any) {
|
|
38
|
+
logger.debugAndAddBreadCrumb('npm-client', `can't find yarn version by running yarn -v. ${e.message}`);
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
2
|
+
import Diagnosis from '../diagnosis';
|
|
3
|
+
export declare const DIAGNOSIS_NAME = "check environment symlinks";
|
|
4
|
+
export default class BrokenSymlinkFiles extends Diagnosis {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
category: string;
|
|
8
|
+
_formatSymptoms(bareResult: ExamineBareResult): string;
|
|
9
|
+
_formatManualTreat(bareResult: ExamineBareResult): string;
|
|
10
|
+
_runExamine(): Promise<ExamineBareResult>;
|
|
11
|
+
_getLinkIfExist(symlinkPath: string): Promise<string | null | undefined>;
|
|
12
|
+
/**
|
|
13
|
+
* deleting the environment directory causes Bit to reinstall it next time
|
|
14
|
+
*/
|
|
15
|
+
_getPathToDelete(symlinkPath: string): string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.DIAGNOSIS_NAME = void 0;
|
|
7
|
+
function _fsExtra() {
|
|
8
|
+
const data = _interopRequireDefault(require("fs-extra"));
|
|
9
|
+
_fsExtra = function () {
|
|
10
|
+
return data;
|
|
11
|
+
};
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
function _glob() {
|
|
15
|
+
const data = require("glob");
|
|
16
|
+
_glob = function () {
|
|
17
|
+
return data;
|
|
18
|
+
};
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
function _path() {
|
|
22
|
+
const data = _interopRequireDefault(require("path"));
|
|
23
|
+
_path = function () {
|
|
24
|
+
return data;
|
|
25
|
+
};
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
function _legacy() {
|
|
29
|
+
const data = require("@teambit/legacy.consumer");
|
|
30
|
+
_legacy = function () {
|
|
31
|
+
return data;
|
|
32
|
+
};
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
function _legacy2() {
|
|
36
|
+
const data = require("@teambit/legacy.scope");
|
|
37
|
+
_legacy2 = function () {
|
|
38
|
+
return data;
|
|
39
|
+
};
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
function _diagnosis() {
|
|
43
|
+
const data = _interopRequireDefault(require("../diagnosis"));
|
|
44
|
+
_diagnosis = function () {
|
|
45
|
+
return data;
|
|
46
|
+
};
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
function _lodash() {
|
|
50
|
+
const data = require("lodash");
|
|
51
|
+
_lodash = function () {
|
|
52
|
+
return data;
|
|
53
|
+
};
|
|
54
|
+
return data;
|
|
55
|
+
}
|
|
56
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
57
|
+
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; }
|
|
58
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
59
|
+
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); }
|
|
60
|
+
const DIAGNOSIS_NAME = exports.DIAGNOSIS_NAME = 'check environment symlinks';
|
|
61
|
+
class BrokenSymlinkFiles extends _diagnosis().default {
|
|
62
|
+
constructor(...args) {
|
|
63
|
+
super(...args);
|
|
64
|
+
_defineProperty(this, "name", DIAGNOSIS_NAME);
|
|
65
|
+
_defineProperty(this, "description", 'validate generated symlinks for workspace environments');
|
|
66
|
+
_defineProperty(this, "category", 'local environments');
|
|
67
|
+
}
|
|
68
|
+
_formatSymptoms(bareResult) {
|
|
69
|
+
if (!bareResult.data) throw new Error('BrokenSymlinkFiles, bareResult.data is missing');
|
|
70
|
+
const toString = bareResult.data.brokenSymlinks.map(brokenSymlink => `symlink path: "${brokenSymlink.symlinkPath}", broken link: "${brokenSymlink.brokenPath}"`).join('\n');
|
|
71
|
+
return `the following symlinks points to non-existing paths\n${toString}`;
|
|
72
|
+
}
|
|
73
|
+
_formatManualTreat(bareResult) {
|
|
74
|
+
if (!bareResult.data) throw new Error('BrokenSymlinkFiles, bareResult.data is missing');
|
|
75
|
+
const toString = (0, _lodash().uniq)(bareResult.data.brokenSymlinks.map(b => b.pathToDelete)).join('\n');
|
|
76
|
+
return `please delete the following paths:\n${toString}`;
|
|
77
|
+
}
|
|
78
|
+
async _runExamine() {
|
|
79
|
+
const consumer = await (0, _legacy().loadConsumer)();
|
|
80
|
+
const envComponentsDir = _path().default.join(consumer.scope.getPath(), _legacy2().Scope.getComponentsRelativePath());
|
|
81
|
+
const potentialSymlinks = (0, _glob().globSync)('**/node_modules/@bit/**', {
|
|
82
|
+
cwd: envComponentsDir
|
|
83
|
+
});
|
|
84
|
+
const potentialSymlinksAbs = potentialSymlinks.map(p => _path().default.join(envComponentsDir, p));
|
|
85
|
+
const brokenSymlinks = [];
|
|
86
|
+
const results = potentialSymlinksAbs.map(async potentialSymlink => {
|
|
87
|
+
const link = await this._getLinkIfExist(potentialSymlink);
|
|
88
|
+
if (!link) return;
|
|
89
|
+
const exists = await _fsExtra().default.pathExists(link);
|
|
90
|
+
if (exists) return;
|
|
91
|
+
const brokenSymlink = {
|
|
92
|
+
symlinkPath: potentialSymlink,
|
|
93
|
+
brokenPath: link,
|
|
94
|
+
pathToDelete: this._getPathToDelete(potentialSymlink)
|
|
95
|
+
};
|
|
96
|
+
brokenSymlinks.push(brokenSymlink);
|
|
97
|
+
});
|
|
98
|
+
await Promise.all(results);
|
|
99
|
+
return {
|
|
100
|
+
valid: brokenSymlinks.length === 0,
|
|
101
|
+
data: {
|
|
102
|
+
brokenSymlinks
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async _getLinkIfExist(symlinkPath) {
|
|
107
|
+
try {
|
|
108
|
+
const link = await _fsExtra().default.readlink(symlinkPath);
|
|
109
|
+
return link;
|
|
110
|
+
} catch {
|
|
111
|
+
// probably not a symlink
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* deleting the environment directory causes Bit to reinstall it next time
|
|
118
|
+
*/
|
|
119
|
+
_getPathToDelete(symlinkPath) {
|
|
120
|
+
const envDirectory = symlinkPath.split(_path().default.join('node_modules', '@bit'))[0];
|
|
121
|
+
return envDirectory.slice(0, -1); // remove the last slash
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.default = BrokenSymlinkFiles;
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=broken-symlink-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_glob","_path","_legacy","_legacy2","_diagnosis","_lodash","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","DIAGNOSIS_NAME","exports","BrokenSymlinkFiles","Diagnosis","constructor","args","_formatSymptoms","bareResult","Error","toString","brokenSymlinks","map","brokenSymlink","symlinkPath","brokenPath","join","_formatManualTreat","uniq","b","pathToDelete","_runExamine","consumer","loadConsumer","envComponentsDir","path","scope","getPath","Scope","getComponentsRelativePath","potentialSymlinks","globSync","cwd","potentialSymlinksAbs","p","results","potentialSymlink","link","_getLinkIfExist","exists","fs","pathExists","_getPathToDelete","push","Promise","all","valid","length","readlink","envDirectory","split","slice"],"sources":["broken-symlink-files.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { globSync } from 'glob';\nimport path from 'path';\nimport { loadConsumer } from '@teambit/legacy.consumer';\nimport { Scope } from '@teambit/legacy.scope';\nimport type { ExamineBareResult } from '../diagnosis';\nimport Diagnosis from '../diagnosis';\nimport { uniq } from 'lodash';\n\ntype BrokenSymlink = { symlinkPath: string; brokenPath: string; pathToDelete: string };\nexport const DIAGNOSIS_NAME = 'check environment symlinks';\n\nexport default class BrokenSymlinkFiles extends Diagnosis {\n name = DIAGNOSIS_NAME;\n description = 'validate generated symlinks for workspace environments';\n category = 'local environments';\n\n _formatSymptoms(bareResult: ExamineBareResult): string {\n if (!bareResult.data) throw new Error('BrokenSymlinkFiles, bareResult.data is missing');\n const toString = bareResult.data.brokenSymlinks\n .map(\n (brokenSymlink) => `symlink path: \"${brokenSymlink.symlinkPath}\", broken link: \"${brokenSymlink.brokenPath}\"`\n )\n .join('\\n');\n return `the following symlinks points to non-existing paths\\n${toString}`;\n }\n\n _formatManualTreat(bareResult: ExamineBareResult) {\n if (!bareResult.data) throw new Error('BrokenSymlinkFiles, bareResult.data is missing');\n const toString = uniq(bareResult.data.brokenSymlinks.map((b) => b.pathToDelete)).join('\\n');\n return `please delete the following paths:\\n${toString}`;\n }\n\n async _runExamine(): Promise<ExamineBareResult> {\n const consumer = await loadConsumer();\n const envComponentsDir = path.join(consumer.scope.getPath(), Scope.getComponentsRelativePath());\n const potentialSymlinks = globSync('**/node_modules/@bit/**', { cwd: envComponentsDir });\n const potentialSymlinksAbs = potentialSymlinks.map((p) => path.join(envComponentsDir, p));\n const brokenSymlinks: BrokenSymlink[] = [];\n const results = potentialSymlinksAbs.map(async (potentialSymlink) => {\n const link = await this._getLinkIfExist(potentialSymlink);\n if (!link) return;\n const exists = await fs.pathExists(link);\n if (exists) return;\n const brokenSymlink = {\n symlinkPath: potentialSymlink,\n brokenPath: link,\n pathToDelete: this._getPathToDelete(potentialSymlink),\n };\n brokenSymlinks.push(brokenSymlink);\n });\n await Promise.all(results);\n return {\n valid: brokenSymlinks.length === 0,\n data: {\n brokenSymlinks,\n },\n };\n }\n\n async _getLinkIfExist(symlinkPath: string): Promise<string | null | undefined> {\n try {\n const link = await fs.readlink(symlinkPath);\n return link;\n } catch {\n // probably not a symlink\n return null;\n }\n }\n\n /**\n * deleting the environment directory causes Bit to reinstall it next time\n */\n _getPathToDelete(symlinkPath: string): string {\n const envDirectory = symlinkPath.split(path.join('node_modules', '@bit'))[0];\n return envDirectory.slice(0, -1); // remove the last slash\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ExamineBareResult } from '../diagnosis';
|
|
2
|
+
import Diagnosis from '../diagnosis';
|
|
3
|
+
export declare const DIAGNOSIS_NAME = "check orphan refs";
|
|
4
|
+
export default class OrphanSymlinkObjects extends Diagnosis {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
category: string;
|
|
8
|
+
_formatSymptoms(bareResult: ExamineBareResult): string;
|
|
9
|
+
_formatManualTreat(bareResult: ExamineBareResult): string;
|
|
10
|
+
_runExamine(): Promise<ExamineBareResult>;
|
|
11
|
+
}
|