@dx-pkg/mksymlink 1.0.0

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 (106) hide show
  1. package/README.md +176 -0
  2. package/examples/advanced-usage.d.ts +2 -0
  3. package/examples/advanced-usage.d.ts.map +1 -0
  4. package/examples/advanced-usage.js +39 -0
  5. package/examples/advanced-usage.js.map +1 -0
  6. package/examples/basic-usage.d.ts +2 -0
  7. package/examples/basic-usage.d.ts.map +1 -0
  8. package/examples/basic-usage.js +15 -0
  9. package/examples/basic-usage.js.map +1 -0
  10. package/examples/config-usage.d.ts +3 -0
  11. package/examples/config-usage.d.ts.map +1 -0
  12. package/examples/config-usage.js +65 -0
  13. package/examples/config-usage.js.map +1 -0
  14. package/examples/cross-platform.d.ts +2 -0
  15. package/examples/cross-platform.d.ts.map +1 -0
  16. package/examples/cross-platform.js +41 -0
  17. package/examples/cross-platform.js.map +1 -0
  18. package/examples/index.d.ts +2 -0
  19. package/examples/index.d.ts.map +1 -0
  20. package/examples/index.js +7 -0
  21. package/examples/index.js.map +1 -0
  22. package/package.json +51 -0
  23. package/src/commands/config/config.command-factory.d.ts +5 -0
  24. package/src/commands/config/config.command-factory.d.ts.map +1 -0
  25. package/src/commands/config/config.command-factory.js +18 -0
  26. package/src/commands/config/config.command-factory.js.map +1 -0
  27. package/src/commands/config/config.command.d.ts +23 -0
  28. package/src/commands/config/config.command.d.ts.map +1 -0
  29. package/src/commands/config/config.command.js +94 -0
  30. package/src/commands/config/config.command.js.map +1 -0
  31. package/src/commands/config/config.option-validator.d.ts +9 -0
  32. package/src/commands/config/config.option-validator.d.ts.map +1 -0
  33. package/src/commands/config/config.option-validator.js +41 -0
  34. package/src/commands/config/config.option-validator.js.map +1 -0
  35. package/src/commands/config.command-factory.d.ts +5 -0
  36. package/src/commands/config.command-factory.d.ts.map +1 -0
  37. package/src/commands/config.command-factory.js +18 -0
  38. package/src/commands/config.command-factory.js.map +1 -0
  39. package/src/commands/config.command.d.ts +22 -0
  40. package/src/commands/config.command.d.ts.map +1 -0
  41. package/src/commands/config.command.js +80 -0
  42. package/src/commands/config.command.js.map +1 -0
  43. package/src/commands/config.option-validator.d.ts +9 -0
  44. package/src/commands/config.option-validator.d.ts.map +1 -0
  45. package/src/commands/config.option-validator.js +41 -0
  46. package/src/commands/config.option-validator.js.map +1 -0
  47. package/src/commands/create/mksymlink.command-factory.d.ts +5 -0
  48. package/src/commands/create/mksymlink.command-factory.d.ts.map +1 -0
  49. package/src/commands/create/mksymlink.command-factory.js +20 -0
  50. package/src/commands/create/mksymlink.command-factory.js.map +1 -0
  51. package/src/commands/create/mksymlink.command.d.ts +22 -0
  52. package/src/commands/create/mksymlink.command.d.ts.map +1 -0
  53. package/src/commands/create/mksymlink.command.js +68 -0
  54. package/src/commands/create/mksymlink.command.js.map +1 -0
  55. package/src/commands/create/mksymlink.option-validator.d.ts +9 -0
  56. package/src/commands/create/mksymlink.option-validator.d.ts.map +1 -0
  57. package/src/commands/create/mksymlink.option-validator.js +35 -0
  58. package/src/commands/create/mksymlink.option-validator.js.map +1 -0
  59. package/src/commands/index.d.ts +3 -0
  60. package/src/commands/index.d.ts.map +1 -0
  61. package/src/commands/index.js +118 -0
  62. package/src/commands/index.js.map +1 -0
  63. package/src/commands/mksymlink.command-factory.d.ts +5 -0
  64. package/src/commands/mksymlink.command-factory.d.ts.map +1 -0
  65. package/src/commands/mksymlink.command-factory.js +20 -0
  66. package/src/commands/mksymlink.command-factory.js.map +1 -0
  67. package/src/commands/mksymlink.command.d.ts +22 -0
  68. package/src/commands/mksymlink.command.d.ts.map +1 -0
  69. package/src/commands/mksymlink.command.js +68 -0
  70. package/src/commands/mksymlink.command.js.map +1 -0
  71. package/src/commands/mksymlink.option-validator.d.ts +9 -0
  72. package/src/commands/mksymlink.option-validator.d.ts.map +1 -0
  73. package/src/commands/mksymlink.option-validator.js +35 -0
  74. package/src/commands/mksymlink.option-validator.js.map +1 -0
  75. package/src/index.d.ts +12 -0
  76. package/src/index.d.ts.map +1 -0
  77. package/src/index.js +28 -0
  78. package/src/index.js.map +1 -0
  79. package/src/services/config.service.d.ts +45 -0
  80. package/src/services/config.service.d.ts.map +1 -0
  81. package/src/services/config.service.js +113 -0
  82. package/src/services/config.service.js.map +1 -0
  83. package/src/services/os-detector.d.ts +11 -0
  84. package/src/services/os-detector.d.ts.map +1 -0
  85. package/src/services/os-detector.js +36 -0
  86. package/src/services/os-detector.js.map +1 -0
  87. package/src/services/platform-detector.d.ts +11 -0
  88. package/src/services/platform-detector.d.ts.map +1 -0
  89. package/src/services/platform-detector.js +36 -0
  90. package/src/services/platform-detector.js.map +1 -0
  91. package/src/services/symlink-error.d.ts +12 -0
  92. package/src/services/symlink-error.d.ts.map +1 -0
  93. package/src/services/symlink-error.js +33 -0
  94. package/src/services/symlink-error.js.map +1 -0
  95. package/src/services/symlink-manager.d.ts +13 -0
  96. package/src/services/symlink-manager.d.ts.map +1 -0
  97. package/src/services/symlink-manager.js +115 -0
  98. package/src/services/symlink-manager.js.map +1 -0
  99. package/src/services/symlink.service.d.ts +13 -0
  100. package/src/services/symlink.service.d.ts.map +1 -0
  101. package/src/services/symlink.service.js +115 -0
  102. package/src/services/symlink.service.js.map +1 -0
  103. package/src/types/index.d.ts +40 -0
  104. package/src/types/index.d.ts.map +1 -0
  105. package/src/types/index.js +3 -0
  106. package/src/types/index.js.map +1 -0
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigOptionValidator = void 0;
4
+ const symlink_error_1 = require("../../services/symlink-error");
5
+ const VALID_ACTIONS = ['get', 'set', 'unset', 'list', 'info'];
6
+ class ConfigOptionValidator {
7
+ validate(options) {
8
+ this.validateAction(options.action);
9
+ this.validateKey(options.action, options.key);
10
+ this.validateValue(options.action, options.value);
11
+ }
12
+ validateAction(action) {
13
+ if (!VALID_ACTIONS.includes(action)) {
14
+ throw new symlink_error_1.SymlinkError(`Invalid config action: ${action}. Must be one of: ${VALID_ACTIONS.join(', ')}`, 'INVALID_CONFIG_ACTION');
15
+ }
16
+ }
17
+ validateKey(action, key) {
18
+ if (action === 'list' || action === 'info') {
19
+ return; // list and info don't require a key
20
+ }
21
+ if (!key) {
22
+ throw new symlink_error_1.SymlinkError(`Key is required for '${action}' action`, 'MISSING_CONFIG_KEY');
23
+ }
24
+ if (typeof key !== 'string' || key.trim().length === 0) {
25
+ throw new symlink_error_1.SymlinkError(`Invalid config key: ${key}. Key must be a non-empty string.`, 'INVALID_CONFIG_KEY');
26
+ }
27
+ }
28
+ validateValue(action, value) {
29
+ if (action !== 'set') {
30
+ return; // only 'set' requires a value
31
+ }
32
+ if (!value) {
33
+ throw new symlink_error_1.SymlinkError(`Value is required for 'set' action`, 'MISSING_CONFIG_VALUE');
34
+ }
35
+ if (typeof value !== 'string') {
36
+ throw new symlink_error_1.SymlinkError(`Invalid config value: ${value}. Value must be a string.`, 'INVALID_CONFIG_VALUE');
37
+ }
38
+ }
39
+ }
40
+ exports.ConfigOptionValidator = ConfigOptionValidator;
41
+ //# sourceMappingURL=config.option-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.option-validator.js","sourceRoot":"","sources":["../../../../../../packages/mksymlink/src/commands/config/config.option-validator.ts"],"names":[],"mappings":";;;AACA,gEAA4D;AAG5D,MAAM,aAAa,GAA4B,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAEhG,MAAa,qBAAqB;IAC9B,QAAQ,CAAC,OAA6B;QAClC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc,CAAC,MAAoB;QACvC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,4BAAY,CAClB,0BAA0B,MAAM,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC/E,uBAAuB,CAC1B,CAAC;QACN,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,MAAoB,EAAE,GAAY;QAClD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACzC,OAAO,CAAC,oCAAoC;QAChD,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,4BAAY,CAAC,wBAAwB,MAAM,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,4BAAY,CAClB,uBAAuB,GAAG,mCAAmC,EAC7D,oBAAoB,CACvB,CAAC;QACN,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,MAAoB,EAAE,KAAc;QACtD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,8BAA8B;QAC1C,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,4BAAY,CAAC,oCAAoC,EAAE,sBAAsB,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,4BAAY,CAClB,yBAAyB,KAAK,2BAA2B,EACzD,sBAAsB,CACzB,CAAC;QACN,CAAC;IACL,CAAC;CACJ;AAjDD,sDAiDC"}
@@ -0,0 +1,5 @@
1
+ import { ConfigCommand, ConfigCommandOptions } from './config.command';
2
+ export declare class ConfigCommandFactory {
3
+ static create(options: ConfigCommandOptions): ConfigCommand;
4
+ }
5
+ //# sourceMappingURL=config.command-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.command-factory.d.ts","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/config.command-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAIvE,qBAAa,oBAAoB;IAC7B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;CAS9D"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigCommandFactory = void 0;
4
+ const logger_1 = require("@dx-tools/logger");
5
+ const config_command_1 = require("./config.command");
6
+ const config_option_validator_1 = require("./config.option-validator");
7
+ const config_service_1 = require("../services/config.service");
8
+ class ConfigCommandFactory {
9
+ static create(options) {
10
+ const validator = new config_option_validator_1.ConfigOptionValidator();
11
+ validator.validate(options);
12
+ const logger = new logger_1.ConsoleLogger();
13
+ const configService = new config_service_1.ConfigService();
14
+ return new config_command_1.ConfigCommand(logger, configService, options);
15
+ }
16
+ }
17
+ exports.ConfigCommandFactory = ConfigCommandFactory;
18
+ //# sourceMappingURL=config.command-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.command-factory.js","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/config.command-factory.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AACjD,qDAAuE;AACvE,uEAAkE;AAClE,+DAA2D;AAE3D,MAAa,oBAAoB;IAC7B,MAAM,CAAC,MAAM,CAAC,OAA6B;QACvC,MAAM,SAAS,GAAG,IAAI,+CAAqB,EAAE,CAAC;QAC9C,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,sBAAa,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,IAAI,8BAAa,EAAE,CAAC;QAE1C,OAAO,IAAI,8BAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;CACJ;AAVD,oDAUC"}
@@ -0,0 +1,22 @@
1
+ import { Logger } from '@dx-tools/logger';
2
+ import { Command } from '../types';
3
+ import { ConfigService } from '../services/config.service';
4
+ export type ConfigAction = 'get' | 'set' | 'unset' | 'list';
5
+ export interface ConfigCommandOptions {
6
+ action: ConfigAction;
7
+ key?: string;
8
+ value?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ export declare class ConfigCommand implements Command<ConfigCommandOptions> {
12
+ private readonly logger;
13
+ private readonly configService;
14
+ private readonly options;
15
+ constructor(logger: Logger, configService: ConfigService, options: ConfigCommandOptions);
16
+ execute(): Promise<void>;
17
+ private handleGet;
18
+ private handleSet;
19
+ private handleUnset;
20
+ private handleList;
21
+ }
22
+ //# sourceMappingURL=config.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.command.d.ts","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/config.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,qBAAa,aAAc,YAAW,OAAO,CAAC,oBAAoB,CAAC;IAE3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,oBAAoB;IAG5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YA4BhB,SAAS;YAcT,SAAS;YAYT,WAAW;YASX,UAAU;CAc3B"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigCommand = void 0;
4
+ class ConfigCommand {
5
+ logger;
6
+ configService;
7
+ options;
8
+ constructor(logger, configService, options) {
9
+ this.logger = logger;
10
+ this.configService = configService;
11
+ this.options = options;
12
+ }
13
+ async execute() {
14
+ try {
15
+ const { action, key, value } = this.options;
16
+ switch (action) {
17
+ case 'get':
18
+ await this.handleGet(key);
19
+ break;
20
+ case 'set':
21
+ await this.handleSet(key, value);
22
+ break;
23
+ case 'unset':
24
+ await this.handleUnset(key);
25
+ break;
26
+ case 'list':
27
+ await this.handleList();
28
+ break;
29
+ default:
30
+ throw new Error(`Unknown config action: ${action}`);
31
+ }
32
+ }
33
+ catch (error) {
34
+ this.logger.error(`Config command failed: ${error instanceof Error ? error.message : String(error)}`);
35
+ throw error;
36
+ }
37
+ }
38
+ async handleGet(key) {
39
+ if (!key) {
40
+ throw new Error('Key is required for get action');
41
+ }
42
+ const value = this.configService.get(key);
43
+ if (value === undefined) {
44
+ this.logger.warning(`Config key '${key}' not found`);
45
+ return;
46
+ }
47
+ this.logger.info(value);
48
+ }
49
+ async handleSet(key, value) {
50
+ if (!key) {
51
+ throw new Error('Key is required for set action');
52
+ }
53
+ if (!value) {
54
+ throw new Error('Value is required for set action');
55
+ }
56
+ this.configService.set(key, value);
57
+ this.logger.success(`Config set: ${key} = ${value}`);
58
+ }
59
+ async handleUnset(key) {
60
+ if (!key) {
61
+ throw new Error('Key is required for unset action');
62
+ }
63
+ this.configService.unset(key);
64
+ this.logger.success(`Config unset: ${key}`);
65
+ }
66
+ async handleList() {
67
+ const config = this.configService.list();
68
+ const entries = Object.entries(config);
69
+ if (entries.length === 0) {
70
+ this.logger.info('No configuration found');
71
+ return;
72
+ }
73
+ this.logger.info('Current configuration:');
74
+ for (const [key, value] of entries) {
75
+ this.logger.info(` ${key} = ${value}`);
76
+ }
77
+ }
78
+ }
79
+ exports.ConfigCommand = ConfigCommand;
80
+ //# sourceMappingURL=config.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.command.js","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/config.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { CommandOptionsValidator } from '../types';
2
+ import { ConfigCommandOptions } from './config.command';
3
+ export declare class ConfigOptionValidator implements CommandOptionsValidator<ConfigCommandOptions> {
4
+ validate(options: ConfigCommandOptions): void;
5
+ private validateAction;
6
+ private validateKey;
7
+ private validateValue;
8
+ }
9
+ //# sourceMappingURL=config.option-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.option-validator.d.ts","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/config.option-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAgB,MAAM,kBAAkB,CAAC;AAItE,qBAAa,qBAAsB,YAAW,uBAAuB,CAAC,oBAAoB,CAAC;IACvF,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAM7C,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,aAAa;CAmBxB"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigOptionValidator = void 0;
4
+ const symlink_error_1 = require("../services/symlink-error");
5
+ const VALID_ACTIONS = ['get', 'set', 'unset', 'list'];
6
+ class ConfigOptionValidator {
7
+ validate(options) {
8
+ this.validateAction(options.action);
9
+ this.validateKey(options.action, options.key);
10
+ this.validateValue(options.action, options.value);
11
+ }
12
+ validateAction(action) {
13
+ if (!VALID_ACTIONS.includes(action)) {
14
+ throw new symlink_error_1.SymlinkError(`Invalid config action: ${action}. Must be one of: ${VALID_ACTIONS.join(', ')}`, 'INVALID_CONFIG_ACTION');
15
+ }
16
+ }
17
+ validateKey(action, key) {
18
+ if (action === 'list') {
19
+ return; // list doesn't require a key
20
+ }
21
+ if (!key) {
22
+ throw new symlink_error_1.SymlinkError(`Key is required for '${action}' action`, 'MISSING_CONFIG_KEY');
23
+ }
24
+ if (typeof key !== 'string' || key.trim().length === 0) {
25
+ throw new symlink_error_1.SymlinkError(`Invalid config key: ${key}. Key must be a non-empty string.`, 'INVALID_CONFIG_KEY');
26
+ }
27
+ }
28
+ validateValue(action, value) {
29
+ if (action !== 'set') {
30
+ return; // only 'set' requires a value
31
+ }
32
+ if (!value) {
33
+ throw new symlink_error_1.SymlinkError(`Value is required for 'set' action`, 'MISSING_CONFIG_VALUE');
34
+ }
35
+ if (typeof value !== 'string') {
36
+ throw new symlink_error_1.SymlinkError(`Invalid config value: ${value}. Value must be a string.`, 'INVALID_CONFIG_VALUE');
37
+ }
38
+ }
39
+ }
40
+ exports.ConfigOptionValidator = ConfigOptionValidator;
41
+ //# sourceMappingURL=config.option-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.option-validator.js","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/config.option-validator.ts"],"names":[],"mappings":";;;AACA,6DAAyD;AAGzD,MAAM,aAAa,GAA4B,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAExF,MAAa,qBAAqB;IAC9B,QAAQ,CAAC,OAA6B;QAClC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc,CAAC,MAAoB;QACvC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,4BAAY,CAClB,0BAA0B,MAAM,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC/E,uBAAuB,CAC1B,CAAC;QACN,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,MAAoB,EAAE,GAAY;QAClD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,6BAA6B;QACzC,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,4BAAY,CAClB,wBAAwB,MAAM,UAAU,EACxC,oBAAoB,CACvB,CAAC;QACN,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,4BAAY,CAClB,uBAAuB,GAAG,mCAAmC,EAC7D,oBAAoB,CACvB,CAAC;QACN,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,MAAoB,EAAE,KAAc;QACtD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,8BAA8B;QAC1C,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,4BAAY,CAClB,oCAAoC,EACpC,sBAAsB,CACzB,CAAC;QACN,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,4BAAY,CAClB,yBAAyB,KAAK,2BAA2B,EACzD,sBAAsB,CACzB,CAAC;QACN,CAAC;IACL,CAAC;CACJ;AAvDD,sDAuDC"}
@@ -0,0 +1,5 @@
1
+ import { MkSymlinkCommand, MkSymlinkCommandOptions } from './mksymlink.command';
2
+ export declare class MkSymlinkCommandFactory {
3
+ static create(options: MkSymlinkCommandOptions): MkSymlinkCommand;
4
+ }
5
+ //# sourceMappingURL=mksymlink.command-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.command-factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/mksymlink/src/commands/create/mksymlink.command-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAKhF,qBAAa,uBAAuB;IAChC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB;CAUpE"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MkSymlinkCommandFactory = void 0;
4
+ const logger_1 = require("@dx-tools/logger");
5
+ const mksymlink_command_1 = require("./mksymlink.command");
6
+ const mksymlink_option_validator_1 = require("./mksymlink.option-validator");
7
+ const symlink_service_1 = require("../../services/symlink.service");
8
+ const platform_detector_1 = require("../../services/platform-detector");
9
+ class MkSymlinkCommandFactory {
10
+ static create(options) {
11
+ const validator = new mksymlink_option_validator_1.MkSymlinkOptionValidator();
12
+ validator.validate(options);
13
+ const logger = new logger_1.ConsoleLogger();
14
+ const osDetector = new platform_detector_1.PlatformDetector();
15
+ const symlinkManager = new symlink_service_1.SymlinkService(logger, osDetector);
16
+ return new mksymlink_command_1.MkSymlinkCommand(logger, symlinkManager, options);
17
+ }
18
+ }
19
+ exports.MkSymlinkCommandFactory = MkSymlinkCommandFactory;
20
+ //# sourceMappingURL=mksymlink.command-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.command-factory.js","sourceRoot":"","sources":["../../../../../../packages/mksymlink/src/commands/create/mksymlink.command-factory.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AACjD,2DAAgF;AAChF,6EAAwE;AACxE,oEAAgE;AAChE,wEAAoE;AAEpE,MAAa,uBAAuB;IAChC,MAAM,CAAC,MAAM,CAAC,OAAgC;QAC1C,MAAM,SAAS,GAAG,IAAI,qDAAwB,EAAE,CAAC;QACjD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,sBAAa,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,oCAAgB,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE9D,OAAO,IAAI,oCAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;CACJ;AAXD,0DAWC"}
@@ -0,0 +1,22 @@
1
+ import { Logger } from '@dx-tools/logger';
2
+ import { Command, WindowsSymlinkType, SymlinkOperations } from '../../types';
3
+ import { ConfigService } from '../../services/config.service';
4
+ export interface MkSymlinkCommandOptions {
5
+ target?: string;
6
+ source?: string;
7
+ type?: WindowsSymlinkType;
8
+ force?: boolean;
9
+ [key: string]: unknown;
10
+ }
11
+ export declare const SYMLINK_TYPES: readonly WindowsSymlinkType[];
12
+ export declare class MkSymlinkCommand implements Command<MkSymlinkCommandOptions> {
13
+ private readonly logger;
14
+ private readonly symlinkManager;
15
+ private readonly options;
16
+ private readonly configService;
17
+ constructor(logger: Logger, symlinkManager: SymlinkOperations, options: MkSymlinkCommandOptions, configService?: ConfigService);
18
+ execute(): Promise<void>;
19
+ private resolveOptions;
20
+ private generateDefaultTarget;
21
+ }
22
+ //# sourceMappingURL=mksymlink.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.command.d.ts","sourceRoot":"","sources":["../../../../../../packages/mksymlink/src/commands/create/mksymlink.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,kBAAkB,EAAyC,CAAC;AAEjG,qBAAa,gBAAiB,YAAW,OAAO,CAAC,uBAAuB,CAAC;IAEjE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAHb,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,iBAAiB,EACjC,OAAO,EAAE,uBAAuB,EAChC,aAAa,GAAE,aAAmC;IAGjE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC9B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,qBAAqB;CAahC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MkSymlinkCommand = exports.SYMLINK_TYPES = void 0;
4
+ const path_1 = require("path");
5
+ const config_service_1 = require("../../services/config.service");
6
+ exports.SYMLINK_TYPES = ['file', 'dir', 'junction'];
7
+ class MkSymlinkCommand {
8
+ logger;
9
+ symlinkManager;
10
+ options;
11
+ configService;
12
+ constructor(logger, symlinkManager, options, configService = new config_service_1.ConfigService()) {
13
+ this.logger = logger;
14
+ this.symlinkManager = symlinkManager;
15
+ this.options = options;
16
+ this.configService = configService;
17
+ }
18
+ async execute() {
19
+ try {
20
+ const { source, target, type, force } = this.resolveOptions();
21
+ this.logger.info('Creating symlink with options:');
22
+ this.logger.info(` Source: ${source}`);
23
+ this.logger.info(` Target: ${target}`);
24
+ this.logger.info(` Type: ${type}`);
25
+ this.logger.info(` Force: ${force}`);
26
+ const result = await this.symlinkManager.createSymlink({
27
+ source,
28
+ target,
29
+ type,
30
+ force,
31
+ });
32
+ if (!result.success) {
33
+ if (result.error) {
34
+ throw result.error;
35
+ }
36
+ this.logger.warning(result.message || 'Symlink creation failed');
37
+ return;
38
+ }
39
+ this.logger.success('Symlink created successfully!');
40
+ this.logger.info(` Source: ${result.source}`);
41
+ this.logger.info(` Target: ${result.target}`);
42
+ }
43
+ catch (error) {
44
+ this.logger.error(`Failed to create symlink: ${error instanceof Error ? error.message : String(error)}`);
45
+ throw error;
46
+ }
47
+ }
48
+ resolveOptions() {
49
+ const currentDir = process.cwd();
50
+ const source = this.options.source || currentDir;
51
+ const target = this.options.target || this.generateDefaultTarget(currentDir);
52
+ const type = this.options.type || 'dir';
53
+ const force = this.options.force || false;
54
+ return { source, target, type, force };
55
+ }
56
+ generateDefaultTarget(currentDir) {
57
+ const currentBasename = (0, path_1.basename)(currentDir);
58
+ const parentDir = (0, path_1.dirname)(currentDir);
59
+ const parentBasename = (0, path_1.basename)(parentDir);
60
+ const symlinkName = `${parentBasename}--${currentBasename}`;
61
+ // Check if there's a configured default directory
62
+ const configuredDir = this.configService.getDefaultSymlinkDir();
63
+ const defaultSymlinkDir = configuredDir || currentDir;
64
+ return (0, path_1.resolve)(defaultSymlinkDir, symlinkName);
65
+ }
66
+ }
67
+ exports.MkSymlinkCommand = MkSymlinkCommand;
68
+ //# sourceMappingURL=mksymlink.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.command.js","sourceRoot":"","sources":["../../../../../../packages/mksymlink/src/commands/create/mksymlink.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { CommandOptionsValidator } from '../../types';
2
+ import { MkSymlinkCommandOptions } from './mksymlink.command';
3
+ export declare class MkSymlinkOptionValidator implements CommandOptionsValidator<MkSymlinkCommandOptions> {
4
+ validate(options: MkSymlinkCommandOptions): void;
5
+ private validateType;
6
+ private validateSource;
7
+ private validateForce;
8
+ }
9
+ //# sourceMappingURL=mksymlink.option-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.option-validator.d.ts","sourceRoot":"","sources":["../../../../../../packages/mksymlink/src/commands/create/mksymlink.option-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,uBAAuB,EAAiB,MAAM,qBAAqB,CAAC;AAI7E,qBAAa,wBAAyB,YAAW,uBAAuB,CAAC,uBAAuB,CAAC;IAC7F,QAAQ,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAMhD,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;CAQxB"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MkSymlinkOptionValidator = void 0;
4
+ const symlink_error_1 = require("../../services/symlink-error");
5
+ const mksymlink_command_1 = require("./mksymlink.command");
6
+ const fs_1 = require("fs");
7
+ const path_1 = require("path");
8
+ class MkSymlinkOptionValidator {
9
+ validate(options) {
10
+ this.validateType(options.type);
11
+ this.validateSource(options.source);
12
+ this.validateForce(options.force);
13
+ }
14
+ validateType(type) {
15
+ if (type && !mksymlink_command_1.SYMLINK_TYPES.includes(type)) {
16
+ throw new symlink_error_1.SymlinkError(`Invalid symlink type: ${type}. Must be one of: ${mksymlink_command_1.SYMLINK_TYPES.join(', ')}`, 'INVALID_SYMLINK_TYPE');
17
+ }
18
+ }
19
+ validateSource(source) {
20
+ if (!source) {
21
+ return;
22
+ }
23
+ const resolvedSource = (0, path_1.resolve)(source);
24
+ if (!(0, fs_1.existsSync)(resolvedSource)) {
25
+ throw new symlink_error_1.SymlinkError(`Source path does not exist: ${resolvedSource}`, 'SOURCE_NOT_FOUND');
26
+ }
27
+ }
28
+ validateForce(force) {
29
+ if (force !== undefined && typeof force !== 'boolean') {
30
+ throw new symlink_error_1.SymlinkError(`Invalid force option: ${force}. Must be a boolean.`, 'INVALID_FORCE_OPTION');
31
+ }
32
+ }
33
+ }
34
+ exports.MkSymlinkOptionValidator = MkSymlinkOptionValidator;
35
+ //# sourceMappingURL=mksymlink.option-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.option-validator.js","sourceRoot":"","sources":["../../../../../../packages/mksymlink/src/commands/create/mksymlink.option-validator.ts"],"names":[],"mappings":";;;AACA,gEAA4D;AAC5D,2DAA6E;AAC7E,2BAAgC;AAChC,+BAA+B;AAE/B,MAAa,wBAAwB;IACjC,QAAQ,CAAC,OAAgC;QACrC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAEO,YAAY,CAAC,IAAa;QAC9B,IAAI,IAAI,IAAI,CAAC,iCAAa,CAAC,QAAQ,CAAC,IAAW,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,4BAAY,CAClB,yBAAyB,IAAI,qBAAqB,iCAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC5E,sBAAsB,CACzB,CAAC;QACN,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,MAAe;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,MAAM,cAAc,GAAG,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC;QAEvC,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,4BAAY,CAClB,+BAA+B,cAAc,EAAE,EAC/C,kBAAkB,CACrB,CAAC;QACN,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,KAAe;QACjC,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACpD,MAAM,IAAI,4BAAY,CAClB,yBAAyB,KAAK,sBAAsB,EACpD,sBAAsB,CACzB,CAAC;QACN,CAAC;IACL,CAAC;CACJ;AAvCD,4DAuCC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const mksymlink_command_factory_1 = require("./create/mksymlink.command-factory");
6
+ const config_command_factory_1 = require("./config/config.command-factory");
7
+ const program = new commander_1.Command();
8
+ program
9
+ .name('mksymlink')
10
+ .description('Create symbolic links across platforms (macOS, Windows, Linux)')
11
+ .version('1.0.0');
12
+ program
13
+ .command('create')
14
+ .description('Create a symbolic link')
15
+ .option('-s, --source <path>', 'Source path (defaults to current directory)')
16
+ .option('-t, --target <path>', 'Target symlink path (auto-generated if not provided)')
17
+ .option('--type <type>', 'Symlink type for Windows: file, dir, junction (default: dir)', 'dir')
18
+ .option('-f, --force', 'Force overwrite existing symlink', false)
19
+ .action(async (options) => {
20
+ try {
21
+ const command = mksymlink_command_factory_1.MkSymlinkCommandFactory.create(options);
22
+ await command.execute();
23
+ process.exit(0);
24
+ }
25
+ catch (error) {
26
+ console.error('Command failed:', error instanceof Error ? error.message : String(error));
27
+ process.exit(1);
28
+ }
29
+ });
30
+ program
31
+ .command('quick', { isDefault: true })
32
+ .description('Quick symlink creation from current directory (default command)')
33
+ .option('--type <type>', 'Symlink type for Windows: file, dir, junction (default: dir)', 'dir')
34
+ .option('-f, --force', 'Force overwrite existing symlink', false)
35
+ .action(async (options) => {
36
+ try {
37
+ const command = mksymlink_command_factory_1.MkSymlinkCommandFactory.create(options);
38
+ await command.execute();
39
+ process.exit(0);
40
+ }
41
+ catch (error) {
42
+ console.error('Command failed:', error instanceof Error ? error.message : String(error));
43
+ process.exit(1);
44
+ }
45
+ });
46
+ const configCmd = program.command('config').description('Manage mksymlink configuration');
47
+ configCmd
48
+ .command('get <key>')
49
+ .description('Get a configuration value')
50
+ .action(async (key) => {
51
+ try {
52
+ const command = config_command_factory_1.ConfigCommandFactory.create({ action: 'get', key });
53
+ await command.execute();
54
+ process.exit(0);
55
+ }
56
+ catch (error) {
57
+ console.error('Config get failed:', error instanceof Error ? error.message : String(error));
58
+ process.exit(1);
59
+ }
60
+ });
61
+ configCmd
62
+ .command('set <key> <value>')
63
+ .description('Set a configuration value')
64
+ .action(async (key, value) => {
65
+ try {
66
+ const command = config_command_factory_1.ConfigCommandFactory.create({ action: 'set', key, value });
67
+ await command.execute();
68
+ process.exit(0);
69
+ }
70
+ catch (error) {
71
+ console.error('Config set failed:', error instanceof Error ? error.message : String(error));
72
+ process.exit(1);
73
+ }
74
+ });
75
+ configCmd
76
+ .command('unset <key>')
77
+ .description('Unset a configuration value')
78
+ .action(async (key) => {
79
+ try {
80
+ const command = config_command_factory_1.ConfigCommandFactory.create({ action: 'unset', key });
81
+ await command.execute();
82
+ process.exit(0);
83
+ }
84
+ catch (error) {
85
+ console.error('Config unset failed:', error instanceof Error ? error.message : String(error));
86
+ process.exit(1);
87
+ }
88
+ });
89
+ configCmd
90
+ .command('list')
91
+ .description('List all configuration values')
92
+ .action(async () => {
93
+ try {
94
+ const command = config_command_factory_1.ConfigCommandFactory.create({ action: 'list' });
95
+ await command.execute();
96
+ process.exit(0);
97
+ }
98
+ catch (error) {
99
+ console.error('Config list failed:', error instanceof Error ? error.message : String(error));
100
+ process.exit(1);
101
+ }
102
+ });
103
+ configCmd
104
+ .command('info')
105
+ .description('Show configuration file information')
106
+ .action(async () => {
107
+ try {
108
+ const command = config_command_factory_1.ConfigCommandFactory.create({ action: 'info' });
109
+ await command.execute();
110
+ process.exit(0);
111
+ }
112
+ catch (error) {
113
+ console.error('Config info failed:', error instanceof Error ? error.message : String(error));
114
+ process.exit(1);
115
+ }
116
+ });
117
+ program.parse(process.argv);
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,kFAA6E;AAE7E,4EAAuE;AAEvE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,CAAC;KAC5E,MAAM,CAAC,qBAAqB,EAAE,sDAAsD,CAAC;KACrF,MAAM,CAAC,eAAe,EAAE,8DAA8D,EAAE,KAAK,CAAC;KAC9F,MAAM,CAAC,aAAa,EAAE,kCAAkC,EAAE,KAAK,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IAC/C,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,mDAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACT,iBAAiB,EACjB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACrC,WAAW,CAAC,iEAAiE,CAAC;KAC9E,MAAM,CAAC,eAAe,EAAE,8DAA8D,EAAE,KAAK,CAAC;KAC9F,MAAM,CAAC,aAAa,EAAE,kCAAkC,EAAE,KAAK,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IAC/C,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,mDAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACT,iBAAiB,EACjB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;AAE1F,SAAS;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;IAC1B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,6CAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACT,oBAAoB,EACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,SAAS;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;IACzC,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,6CAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACT,oBAAoB,EACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,SAAS;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;IAC1B,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,6CAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACT,sBAAsB,EACtB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,SAAS;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,6CAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACT,qBAAqB,EACrB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,SAAS;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,6CAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACT,qBAAqB,EACrB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { MkSymlinkCommand, MkSymlinkCommandOptions } from './mksymlink.command';
2
+ export declare class MkSymlinkCommandFactory {
3
+ static create(options: MkSymlinkCommandOptions): MkSymlinkCommand;
4
+ }
5
+ //# sourceMappingURL=mksymlink.command-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.command-factory.d.ts","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/mksymlink.command-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAKhF,qBAAa,uBAAuB;IAChC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,gBAAgB;CAUpE"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MkSymlinkCommandFactory = void 0;
4
+ const logger_1 = require("@dx-tools/logger");
5
+ const mksymlink_command_1 = require("./mksymlink.command");
6
+ const mksymlink_option_validator_1 = require("./mksymlink.option-validator");
7
+ const symlink_manager_1 = require("../services/symlink-manager");
8
+ const os_detector_1 = require("../services/os-detector");
9
+ class MkSymlinkCommandFactory {
10
+ static create(options) {
11
+ const validator = new mksymlink_option_validator_1.MkSymlinkOptionValidator();
12
+ validator.validate(options);
13
+ const logger = new logger_1.ConsoleLogger();
14
+ const osDetector = new os_detector_1.PlatformDetector();
15
+ const symlinkManager = new symlink_manager_1.SymlinkService(logger, osDetector);
16
+ return new mksymlink_command_1.MkSymlinkCommand(logger, symlinkManager, options);
17
+ }
18
+ }
19
+ exports.MkSymlinkCommandFactory = MkSymlinkCommandFactory;
20
+ //# sourceMappingURL=mksymlink.command-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mksymlink.command-factory.js","sourceRoot":"","sources":["../../../../../packages/mksymlink/src/commands/mksymlink.command-factory.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AACjD,2DAAgF;AAChF,6EAAwE;AACxE,iEAA6D;AAC7D,yDAA2D;AAE3D,MAAa,uBAAuB;IAChC,MAAM,CAAC,MAAM,CAAC,OAAgC;QAC1C,MAAM,SAAS,GAAG,IAAI,qDAAwB,EAAE,CAAC;QACjD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,sBAAa,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,8BAAgB,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE9D,OAAO,IAAI,oCAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;CACJ;AAXD,0DAWC"}