@dx-pkg/mksymlink 1.0.4 → 1.0.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.
- package/README.md +1 -0
- package/package.json +2 -2
- package/src/commands/create/mksymlink.command-factory.js +3 -5
- package/src/commands/create/mksymlink.command.d.ts +3 -2
- package/src/commands/create/mksymlink.command.js +5 -3
- package/src/commands/create/mksymlink.option-validator.js +0 -1
- package/src/commands/index.js +0 -1
- package/src/index.js +0 -1
- package/examples/advanced-usage.d.ts +0 -2
- package/examples/advanced-usage.js +0 -39
- package/examples/basic-usage.d.ts +0 -2
- package/examples/basic-usage.js +0 -15
- package/examples/config-usage.d.ts +0 -3
- package/examples/config-usage.js +0 -65
- package/examples/cross-platform.d.ts +0 -2
- package/examples/cross-platform.js +0 -41
- package/examples/index.d.ts +0 -2
- package/examples/index.js +0 -7
- package/src/commands/config/config.command-factory.d.ts +0 -5
- package/src/commands/config/config.command-factory.js +0 -18
- package/src/commands/config/config.command.d.ts +0 -23
- package/src/commands/config/config.command.js +0 -94
- package/src/commands/config/config.option-validator.d.ts +0 -9
- package/src/commands/config/config.option-validator.js +0 -41
- package/src/commands/config.command-factory.d.ts +0 -5
- package/src/commands/config.command-factory.js +0 -18
- package/src/commands/config.command.d.ts +0 -22
- package/src/commands/config.command.js +0 -80
- package/src/commands/config.option-validator.d.ts +0 -9
- package/src/commands/config.option-validator.js +0 -41
- package/src/commands/create/mksymlink.command-factory.d.ts +0 -5
- package/src/commands/create/mksymlink.option-validator.d.ts +0 -9
- package/src/commands/index.d.ts +0 -3
- package/src/commands/mksymlink.command-factory.d.ts +0 -5
- package/src/commands/mksymlink.command-factory.js +0 -20
- package/src/commands/mksymlink.command.d.ts +0 -22
- package/src/commands/mksymlink.command.js +0 -68
- package/src/commands/mksymlink.option-validator.d.ts +0 -9
- package/src/commands/mksymlink.option-validator.js +0 -35
- package/src/index.d.ts +0 -12
- package/src/services/config.service.d.ts +0 -45
- package/src/services/config.service.js +0 -113
- package/src/services/os-detector.d.ts +0 -11
- package/src/services/os-detector.js +0 -36
- package/src/services/platform-detector.d.ts +0 -11
- package/src/services/platform-detector.js +0 -36
- package/src/services/symlink-error.d.ts +0 -12
- package/src/services/symlink-error.js +0 -33
- package/src/services/symlink-manager.d.ts +0 -13
- package/src/services/symlink-manager.js +0 -115
- package/src/services/symlink.service.d.ts +0 -13
- package/src/services/symlink.service.js +0 -115
- package/src/types/index.d.ts +0 -40
- package/src/types/index.js +0 -3
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SymlinkService = void 0;
|
|
4
|
-
const child_process_1 = require("child_process");
|
|
5
|
-
const util_1 = require("util");
|
|
6
|
-
const promises_1 = require("fs/promises");
|
|
7
|
-
const symlink_error_1 = require("./symlink-error");
|
|
8
|
-
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
9
|
-
class SymlinkService {
|
|
10
|
-
logger;
|
|
11
|
-
osDetector;
|
|
12
|
-
constructor(logger, osDetector) {
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
this.osDetector = osDetector;
|
|
15
|
-
}
|
|
16
|
-
async createSymlink(options) {
|
|
17
|
-
const { source, target, type = 'dir', force = false } = options;
|
|
18
|
-
try {
|
|
19
|
-
// this.logger.info(`Creating symlink: ${target} -> ${source}`);
|
|
20
|
-
if (await this.symlinkExists(target)) {
|
|
21
|
-
if (!force) {
|
|
22
|
-
return {
|
|
23
|
-
success: false,
|
|
24
|
-
source,
|
|
25
|
-
target,
|
|
26
|
-
message: `Symlink already exists: ${target}`,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
this.logger.info(`Force mode enabled. Removing existing symlink: ${target}`);
|
|
30
|
-
await this.removeSymlink(target);
|
|
31
|
-
}
|
|
32
|
-
if (this.osDetector.isWindows()) {
|
|
33
|
-
await this.createWindowsSymlink(source, target, type);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
await this.createUnixSymlink(source, target);
|
|
37
|
-
}
|
|
38
|
-
// this.logger.success(`Symlink created successfully: ${target} -> ${source}`);
|
|
39
|
-
return {
|
|
40
|
-
success: true,
|
|
41
|
-
source,
|
|
42
|
-
target,
|
|
43
|
-
message: 'Symlink created successfully',
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
this.logger.error(`Failed to create symlink: ${error instanceof Error ? error.message : String(error)}`);
|
|
48
|
-
return {
|
|
49
|
-
success: false,
|
|
50
|
-
source,
|
|
51
|
-
target,
|
|
52
|
-
error: error instanceof Error ? error : new Error(String(error)),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
async createWindowsSymlink(source, target, type) {
|
|
57
|
-
let flag;
|
|
58
|
-
switch (type) {
|
|
59
|
-
case 'junction':
|
|
60
|
-
flag = '/J';
|
|
61
|
-
break;
|
|
62
|
-
case 'file':
|
|
63
|
-
flag = '';
|
|
64
|
-
break;
|
|
65
|
-
case 'dir':
|
|
66
|
-
default:
|
|
67
|
-
flag = '/D';
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
const command = flag
|
|
71
|
-
? `mklink ${flag} "${target}" "${source}"`
|
|
72
|
-
: `mklink "${target}" "${source}"`;
|
|
73
|
-
this.logger.info(`Executing Windows command: ${command}`);
|
|
74
|
-
try {
|
|
75
|
-
const { stdout, stderr } = await execAsync(command, { shell: 'cmd.exe' });
|
|
76
|
-
if (stderr && !stderr.includes('Junction') && !stderr.includes('symbolic link')) {
|
|
77
|
-
throw new symlink_error_1.SymlinkError(stderr, 'WINDOWS_MKLINK_ERROR');
|
|
78
|
-
}
|
|
79
|
-
this.logger.info(`Windows mklink output: ${stdout}`);
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
throw new symlink_error_1.SymlinkError(`Failed to create Windows symlink: ${error instanceof Error ? error.message : String(error)}`, 'WINDOWS_MKLINK_FAILED');
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
async createUnixSymlink(source, target) {
|
|
86
|
-
try {
|
|
87
|
-
await (0, promises_1.symlink)(source, target);
|
|
88
|
-
this.logger.info(`Unix symlink created: ln -s ${source} ${target}`);
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
throw new symlink_error_1.SymlinkError(`Failed to create Unix symlink: ${error instanceof Error ? error.message : String(error)}`, 'UNIX_SYMLINK_FAILED');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
async symlinkExists(path) {
|
|
95
|
-
try {
|
|
96
|
-
const stats = await (0, promises_1.lstat)(path);
|
|
97
|
-
return stats.isSymbolicLink();
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async removeSymlink(path) {
|
|
104
|
-
try {
|
|
105
|
-
await (0, promises_1.access)(path);
|
|
106
|
-
await (0, promises_1.unlink)(path);
|
|
107
|
-
this.logger.info(`Symlink removed: ${path}`);
|
|
108
|
-
}
|
|
109
|
-
catch (error) {
|
|
110
|
-
throw new symlink_error_1.SymlinkError(`Failed to remove symlink: ${error instanceof Error ? error.message : String(error)}`, 'REMOVE_SYMLINK_FAILED');
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
exports.SymlinkService = SymlinkService;
|
|
115
|
-
//# sourceMappingURL=symlink-manager.js.map
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Logger } from '@dx-pkg/logger';
|
|
2
|
-
import { SymlinkOperations, SymlinkOptions, SymlinkResult, PlatformInformation } from '../types';
|
|
3
|
-
export declare class SymlinkService implements SymlinkOperations {
|
|
4
|
-
private readonly logger;
|
|
5
|
-
private readonly osDetector;
|
|
6
|
-
constructor(logger: Logger, osDetector: PlatformInformation);
|
|
7
|
-
createSymlink(options: SymlinkOptions): Promise<SymlinkResult>;
|
|
8
|
-
private createWindowsSymlink;
|
|
9
|
-
private createUnixSymlink;
|
|
10
|
-
symlinkExists(path: string): Promise<boolean>;
|
|
11
|
-
removeSymlink(path: string): Promise<void>;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=symlink.service.d.ts.map
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SymlinkService = void 0;
|
|
4
|
-
const child_process_1 = require("child_process");
|
|
5
|
-
const util_1 = require("util");
|
|
6
|
-
const promises_1 = require("fs/promises");
|
|
7
|
-
const symlink_error_1 = require("./symlink-error");
|
|
8
|
-
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
9
|
-
class SymlinkService {
|
|
10
|
-
logger;
|
|
11
|
-
osDetector;
|
|
12
|
-
constructor(logger, osDetector) {
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
this.osDetector = osDetector;
|
|
15
|
-
}
|
|
16
|
-
async createSymlink(options) {
|
|
17
|
-
const { source, target, type = 'dir', force = false } = options;
|
|
18
|
-
try {
|
|
19
|
-
// this.logger.info(`Creating symlink: ${target} -> ${source}`);
|
|
20
|
-
if (await this.symlinkExists(target)) {
|
|
21
|
-
if (!force) {
|
|
22
|
-
return {
|
|
23
|
-
success: false,
|
|
24
|
-
source,
|
|
25
|
-
target,
|
|
26
|
-
message: `Symlink already exists: ${target}`,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
this.logger.info(`Force mode enabled. Removing existing symlink: ${target}`);
|
|
30
|
-
await this.removeSymlink(target);
|
|
31
|
-
}
|
|
32
|
-
if (this.osDetector.isWindows()) {
|
|
33
|
-
await this.createWindowsSymlink(source, target, type);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
await this.createUnixSymlink(source, target);
|
|
37
|
-
}
|
|
38
|
-
// this.logger.success(`Symlink created successfully: ${target} -> ${source}`);
|
|
39
|
-
return {
|
|
40
|
-
success: true,
|
|
41
|
-
source,
|
|
42
|
-
target,
|
|
43
|
-
message: 'Symlink created successfully',
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
this.logger.error(`Failed to create symlink: ${error instanceof Error ? error.message : String(error)}`);
|
|
48
|
-
return {
|
|
49
|
-
success: false,
|
|
50
|
-
source,
|
|
51
|
-
target,
|
|
52
|
-
error: error instanceof Error ? error : new Error(String(error)),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
async createWindowsSymlink(source, target, type) {
|
|
57
|
-
let flag;
|
|
58
|
-
switch (type) {
|
|
59
|
-
case 'junction':
|
|
60
|
-
flag = '/J';
|
|
61
|
-
break;
|
|
62
|
-
case 'file':
|
|
63
|
-
flag = '';
|
|
64
|
-
break;
|
|
65
|
-
case 'dir':
|
|
66
|
-
default:
|
|
67
|
-
flag = '/D';
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
const command = flag
|
|
71
|
-
? `mklink ${flag} "${target}" "${source}"`
|
|
72
|
-
: `mklink "${target}" "${source}"`;
|
|
73
|
-
this.logger.info(`Executing Windows command: ${command}`);
|
|
74
|
-
try {
|
|
75
|
-
const { stdout, stderr } = await execAsync(command, { shell: 'cmd.exe' });
|
|
76
|
-
if (stderr && !stderr.includes('Junction') && !stderr.includes('symbolic link')) {
|
|
77
|
-
throw new symlink_error_1.SymlinkError(stderr, 'WINDOWS_MKLINK_ERROR');
|
|
78
|
-
}
|
|
79
|
-
this.logger.info(`Windows mklink output: ${stdout}`);
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
throw new symlink_error_1.SymlinkError(`Failed to create Windows symlink: ${error instanceof Error ? error.message : String(error)}`, 'WINDOWS_MKLINK_FAILED');
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
async createUnixSymlink(source, target) {
|
|
86
|
-
try {
|
|
87
|
-
await (0, promises_1.symlink)(source, target);
|
|
88
|
-
this.logger.info(`Unix symlink created: ln -s ${source} ${target}`);
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
throw new symlink_error_1.SymlinkError(`Failed to create Unix symlink: ${error instanceof Error ? error.message : String(error)}`, 'UNIX_SYMLINK_FAILED');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
async symlinkExists(path) {
|
|
95
|
-
try {
|
|
96
|
-
const stats = await (0, promises_1.lstat)(path);
|
|
97
|
-
return stats.isSymbolicLink();
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async removeSymlink(path) {
|
|
104
|
-
try {
|
|
105
|
-
await (0, promises_1.access)(path);
|
|
106
|
-
await (0, promises_1.unlink)(path);
|
|
107
|
-
this.logger.info(`Symlink removed: ${path}`);
|
|
108
|
-
}
|
|
109
|
-
catch (error) {
|
|
110
|
-
throw new symlink_error_1.SymlinkError(`Failed to remove symlink: ${error instanceof Error ? error.message : String(error)}`, 'REMOVE_SYMLINK_FAILED');
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
exports.SymlinkService = SymlinkService;
|
|
115
|
-
//# sourceMappingURL=symlink.service.js.map
|
package/src/types/index.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export type CommandName = string;
|
|
2
|
-
export interface CommandOptions {
|
|
3
|
-
[key: string]: unknown;
|
|
4
|
-
}
|
|
5
|
-
export interface Command<TOptions extends CommandOptions> {
|
|
6
|
-
execute(options: TOptions): Promise<void>;
|
|
7
|
-
}
|
|
8
|
-
export interface CommandError extends Error {
|
|
9
|
-
code?: string;
|
|
10
|
-
}
|
|
11
|
-
export interface CommandOptionsValidator<TOptions extends CommandOptions> {
|
|
12
|
-
validate(options: TOptions): void;
|
|
13
|
-
}
|
|
14
|
-
export type OSPlatform = 'darwin' | 'win32' | 'linux' | 'unknown';
|
|
15
|
-
export type WindowsSymlinkType = 'file' | 'dir' | 'junction';
|
|
16
|
-
export interface SymlinkOptions {
|
|
17
|
-
source: string;
|
|
18
|
-
target: string;
|
|
19
|
-
type?: WindowsSymlinkType;
|
|
20
|
-
force?: boolean;
|
|
21
|
-
}
|
|
22
|
-
export interface SymlinkResult {
|
|
23
|
-
success: boolean;
|
|
24
|
-
source: string;
|
|
25
|
-
target: string;
|
|
26
|
-
message?: string;
|
|
27
|
-
error?: Error;
|
|
28
|
-
}
|
|
29
|
-
export interface PlatformInformation {
|
|
30
|
-
getPlatform(): OSPlatform;
|
|
31
|
-
isWindows(): boolean;
|
|
32
|
-
isMacOS(): boolean;
|
|
33
|
-
isLinux(): boolean;
|
|
34
|
-
}
|
|
35
|
-
export interface SymlinkOperations {
|
|
36
|
-
createSymlink(options: SymlinkOptions): Promise<SymlinkResult>;
|
|
37
|
-
symlinkExists(path: string): Promise<boolean>;
|
|
38
|
-
removeSymlink(path: string): Promise<void>;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=index.d.ts.map
|
package/src/types/index.js
DELETED