@ducky7go/ducky-cli 0.0.1

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 (72) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +241 -0
  3. package/bin/ducky +25 -0
  4. package/dist/cli.d.ts +5 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +19 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/nuget/index.d.ts +3 -0
  9. package/dist/commands/nuget/index.d.ts.map +1 -0
  10. package/dist/commands/nuget/index.js +23 -0
  11. package/dist/commands/nuget/index.js.map +1 -0
  12. package/dist/commands/nuget/pack.d.ts +7 -0
  13. package/dist/commands/nuget/pack.d.ts.map +1 -0
  14. package/dist/commands/nuget/pack.js +78 -0
  15. package/dist/commands/nuget/pack.js.map +1 -0
  16. package/dist/commands/nuget/push.d.ts +7 -0
  17. package/dist/commands/nuget/push.d.ts.map +1 -0
  18. package/dist/commands/nuget/push.js +110 -0
  19. package/dist/commands/nuget/push.js.map +1 -0
  20. package/dist/commands/nuget/validate.d.ts +7 -0
  21. package/dist/commands/nuget/validate.d.ts.map +1 -0
  22. package/dist/commands/nuget/validate.js +78 -0
  23. package/dist/commands/nuget/validate.js.map +1 -0
  24. package/dist/formats/index.d.ts +2 -0
  25. package/dist/formats/index.d.ts.map +1 -0
  26. package/dist/formats/index.js +6 -0
  27. package/dist/formats/index.js.map +1 -0
  28. package/dist/formats/nuget/client.d.ts +59 -0
  29. package/dist/formats/nuget/client.d.ts.map +1 -0
  30. package/dist/formats/nuget/client.js +202 -0
  31. package/dist/formats/nuget/client.js.map +1 -0
  32. package/dist/formats/nuget/collector.d.ts +36 -0
  33. package/dist/formats/nuget/collector.d.ts.map +1 -0
  34. package/dist/formats/nuget/collector.js +72 -0
  35. package/dist/formats/nuget/collector.js.map +1 -0
  36. package/dist/formats/nuget/index.d.ts +6 -0
  37. package/dist/formats/nuget/index.d.ts.map +1 -0
  38. package/dist/formats/nuget/index.js +11 -0
  39. package/dist/formats/nuget/index.js.map +1 -0
  40. package/dist/formats/nuget/nuspec.d.ts +10 -0
  41. package/dist/formats/nuget/nuspec.d.ts.map +1 -0
  42. package/dist/formats/nuget/nuspec.js +59 -0
  43. package/dist/formats/nuget/nuspec.js.map +1 -0
  44. package/dist/formats/nuget/parser.d.ts +31 -0
  45. package/dist/formats/nuget/parser.d.ts.map +1 -0
  46. package/dist/formats/nuget/parser.js +140 -0
  47. package/dist/formats/nuget/parser.js.map +1 -0
  48. package/dist/formats/nuget/validator.d.ts +19 -0
  49. package/dist/formats/nuget/validator.d.ts.map +1 -0
  50. package/dist/formats/nuget/validator.js +104 -0
  51. package/dist/formats/nuget/validator.js.map +1 -0
  52. package/dist/utils/config.d.ts +31 -0
  53. package/dist/utils/config.d.ts.map +1 -0
  54. package/dist/utils/config.js +86 -0
  55. package/dist/utils/config.js.map +1 -0
  56. package/dist/utils/errors.d.ts +43 -0
  57. package/dist/utils/errors.d.ts.map +1 -0
  58. package/dist/utils/errors.js +73 -0
  59. package/dist/utils/errors.js.map +1 -0
  60. package/dist/utils/fs.d.ts +42 -0
  61. package/dist/utils/fs.d.ts.map +1 -0
  62. package/dist/utils/fs.js +125 -0
  63. package/dist/utils/fs.js.map +1 -0
  64. package/dist/utils/index.d.ts +5 -0
  65. package/dist/utils/index.d.ts.map +1 -0
  66. package/dist/utils/index.js +5 -0
  67. package/dist/utils/index.js.map +1 -0
  68. package/dist/utils/logger.d.ts +71 -0
  69. package/dist/utils/logger.d.ts.map +1 -0
  70. package/dist/utils/logger.js +119 -0
  71. package/dist/utils/logger.js.map +1 -0
  72. package/package.json +65 -0
@@ -0,0 +1,2 @@
1
+ export * from './nuget/index.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/formats/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Export format registries
2
+ export * from './nuget/index.js';
3
+ // Future formats:
4
+ // export * from './zip/index.js';
5
+ // export * from './tar/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/formats/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,cAAc,kBAAkB,CAAC;AAEjC,kBAAkB;AAClB,kCAAkC;AAClC,kCAAkC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * NuGet CLI configuration
3
+ */
4
+ interface NugetConfig {
5
+ /** Path to NuGet executable */
6
+ exePath?: string;
7
+ /** Whether to use embedded/managed NuGet */
8
+ useManaged?: boolean;
9
+ /** Custom NuGet version */
10
+ version?: string;
11
+ }
12
+ /**
13
+ * NuGet CLI manager
14
+ * Handles detection, download, and execution of NuGet CLI
15
+ */
16
+ export declare class NuGetCliManager {
17
+ private cacheDir;
18
+ private version;
19
+ private platform;
20
+ constructor(config?: NugetConfig);
21
+ /**
22
+ * Get the path to the NuGet executable
23
+ * Downloads NuGet if not found in PATH or cache
24
+ */
25
+ getExePath(): Promise<string>;
26
+ /**
27
+ * Find NuGet in system PATH
28
+ */
29
+ private findInPath;
30
+ /**
31
+ * Get the path to cached NuGet executable
32
+ */
33
+ private getCachedExePath;
34
+ /**
35
+ * Download NuGet CLI to cache directory
36
+ */
37
+ private downloadNuGet;
38
+ /**
39
+ * Execute a NuGet command
40
+ */
41
+ execute(args: string[], cwd?: string): Promise<string>;
42
+ /**
43
+ * T14: Pack a .nuspec file into a .nupkg package
44
+ * @param nuspecPath - Path to .nuspec file
45
+ * @param outputPath - Directory for output .nupkg file
46
+ * @returns Path to created .nupkg file
47
+ */
48
+ pack(nuspecPath: string, outputPath: string): Promise<string>;
49
+ /**
50
+ * T15: Push a .nupkg package to a NuGet server
51
+ * @param nupkgPath - Path to .nupkg file
52
+ * @param server - NuGet server URL
53
+ * @param apiKey - API key for authentication
54
+ * @returns Success message
55
+ */
56
+ push(nupkgPath: string, server: string, apiKey: string): Promise<void>;
57
+ }
58
+ export {};
59
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/formats/nuget/client.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,UAAU,WAAW;IACnB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,MAAM,GAAE,WAAgB;IAMpC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAoBnC;;OAEG;YACW,UAAU;IAcxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;YACW,aAAa;IA8C3B;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqC5D;;;;;OAKG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgCnE;;;;;;OAMG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAyB7E"}
@@ -0,0 +1,202 @@
1
+ import { spawn, exec } from 'child_process';
2
+ import { join, dirname, resolve } from 'path';
3
+ import { mkdir, chmod } from 'fs/promises';
4
+ import { existsSync } from 'fs';
5
+ import { homedir, platform } from 'os';
6
+ import { createLogger } from '../../utils/logger.js';
7
+ import { NuGetError } from '../../utils/errors.js';
8
+ const logger = createLogger();
9
+ /**
10
+ * NuGet CLI manager
11
+ * Handles detection, download, and execution of NuGet CLI
12
+ */
13
+ export class NuGetCliManager {
14
+ cacheDir;
15
+ version;
16
+ platform;
17
+ constructor(config = {}) {
18
+ this.cacheDir = join(homedir(), '.ducky', 'nuget');
19
+ this.version = config.version || '6.11.0';
20
+ this.platform = platform();
21
+ }
22
+ /**
23
+ * Get the path to the NuGet executable
24
+ * Downloads NuGet if not found in PATH or cache
25
+ */
26
+ async getExePath() {
27
+ // First, check if NuGet is in PATH
28
+ const pathExe = await this.findInPath();
29
+ if (pathExe) {
30
+ logger.debug(`Using NuGet from PATH: ${pathExe}`);
31
+ return pathExe;
32
+ }
33
+ // Check cache
34
+ const cachedExe = this.getCachedExePath();
35
+ if (existsSync(cachedExe)) {
36
+ logger.debug(`Using cached NuGet: ${cachedExe}`);
37
+ return cachedExe;
38
+ }
39
+ // Download to cache
40
+ logger.info(`NuGet not found in PATH or cache. Downloading v${this.version}...`);
41
+ return await this.downloadNuGet();
42
+ }
43
+ /**
44
+ * Find NuGet in system PATH
45
+ */
46
+ async findInPath() {
47
+ return new Promise((resolve) => {
48
+ const command = this.platform === 'win32' ? 'where nuget.exe' : 'which nuget';
49
+ exec(command, (error, stdout) => {
50
+ if (error) {
51
+ resolve(null);
52
+ }
53
+ else {
54
+ const path = stdout.trim().split('\n')[0];
55
+ resolve(path || null);
56
+ }
57
+ });
58
+ });
59
+ }
60
+ /**
61
+ * Get the path to cached NuGet executable
62
+ */
63
+ getCachedExePath() {
64
+ const exeName = this.platform === 'win32' ? 'nuget.exe' : 'nuget.exe';
65
+ return join(this.cacheDir, exeName);
66
+ }
67
+ /**
68
+ * Download NuGet CLI to cache directory
69
+ */
70
+ async downloadNuGet() {
71
+ const exePath = this.getCachedExePath();
72
+ // Ensure cache directory exists
73
+ await mkdir(dirname(exePath), { recursive: true });
74
+ // For now, we'll use a shell script approach for downloading
75
+ // In production, you'd want to verify checksums and handle HTTPS properly
76
+ const nugetUrl = 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe';
77
+ logger.info(`Downloading NuGet from ${nugetUrl}...`);
78
+ // Download using curl or wget (available on most systems)
79
+ const downloadCmd = this.platform === 'win32' ? 'powershell' : 'curl';
80
+ const downloadArgs = this.platform === 'win32'
81
+ ? [
82
+ '-Command',
83
+ `Invoke-WebRequest -Uri "${nugetUrl}" -OutFile "${exePath}"`,
84
+ ]
85
+ : ['-L', nugetUrl, '-o', exePath];
86
+ return new Promise((resolve, reject) => {
87
+ const child = spawn(downloadCmd, downloadArgs, { stdio: 'inherit' });
88
+ child.on('close', async (code) => {
89
+ if (code === 0) {
90
+ logger.success(`NuGet downloaded to ${exePath}`);
91
+ // Make executable on Unix-like systems
92
+ if (this.platform !== 'win32') {
93
+ await chmod(exePath, 0o755);
94
+ }
95
+ resolve(exePath);
96
+ }
97
+ else {
98
+ reject(new Error(`Failed to download NuGet (exit code ${code}). Please install manually from https://learn.microsoft.com/en-us/nuget/install-nuget-client-tools`));
99
+ }
100
+ });
101
+ });
102
+ }
103
+ /**
104
+ * Execute a NuGet command
105
+ */
106
+ async execute(args, cwd) {
107
+ const exePath = await this.getExePath();
108
+ logger.debug(`Executing: ${exePath} ${args.join(' ')}`);
109
+ return new Promise((resolve, reject) => {
110
+ const child = spawn(exePath, args, {
111
+ cwd,
112
+ stdio: ['inherit', 'pipe', 'pipe'],
113
+ shell: true,
114
+ });
115
+ let stdout = '';
116
+ let stderr = '';
117
+ child.stdout?.on('data', (data) => {
118
+ stdout += data.toString();
119
+ });
120
+ child.stderr?.on('data', (data) => {
121
+ stderr += data.toString();
122
+ });
123
+ child.on('close', (code) => {
124
+ if (code === 0) {
125
+ resolve(stdout);
126
+ }
127
+ else {
128
+ reject(new Error(`NuGet command failed (exit code ${code}): ${stderr}`));
129
+ }
130
+ });
131
+ child.on('error', (error) => {
132
+ reject(new Error(`Failed to execute NuGet: ${error.message}`));
133
+ });
134
+ });
135
+ }
136
+ /**
137
+ * T14: Pack a .nuspec file into a .nupkg package
138
+ * @param nuspecPath - Path to .nuspec file
139
+ * @param outputPath - Directory for output .nupkg file
140
+ * @returns Path to created .nupkg file
141
+ */
142
+ async pack(nuspecPath, outputPath) {
143
+ logger.info(`Creating NuGet package from ${nuspecPath}...`);
144
+ const outputDir = resolve(outputPath);
145
+ const args = ['pack', nuspecPath, '-OutputDirectory', outputDir, '-NoDefaultExcludes'];
146
+ try {
147
+ const stdout = await this.execute(args);
148
+ // Extract .nupkg path from output
149
+ const match = stdout.match(/[^/\\]+\.nupkg/g);
150
+ if (match && match.length > 0) {
151
+ const nupkgName = match[0];
152
+ const nupkgPath = join(outputDir, nupkgName);
153
+ logger.success(`Created package: ${nupkgPath}`);
154
+ return nupkgPath;
155
+ }
156
+ // Fallback: construct expected path
157
+ throw new NuGetError('Failed to determine .nupkg file path from NuGet output');
158
+ }
159
+ catch (error) {
160
+ if (error instanceof Error) {
161
+ throw new NuGetError(`Failed to create NuGet package: ${error.message}`, [
162
+ 'Check that the .nuspec file is valid',
163
+ 'Ensure all referenced files exist',
164
+ 'Run with --verbose for more details',
165
+ ]);
166
+ }
167
+ throw error;
168
+ }
169
+ }
170
+ /**
171
+ * T15: Push a .nupkg package to a NuGet server
172
+ * @param nupkgPath - Path to .nupkg file
173
+ * @param server - NuGet server URL
174
+ * @param apiKey - API key for authentication
175
+ * @returns Success message
176
+ */
177
+ async push(nupkgPath, server, apiKey) {
178
+ logger.info(`Pushing ${nupkgPath} to ${server}...`);
179
+ const args = ['push', nupkgPath, '-Source', server, '-ApiKey', apiKey];
180
+ try {
181
+ const stdout = await this.execute(args);
182
+ if (stdout.includes('Your package was pushed')) {
183
+ logger.success('Package pushed successfully!');
184
+ }
185
+ else {
186
+ logger.info('Package push completed');
187
+ }
188
+ }
189
+ catch (error) {
190
+ if (error instanceof Error) {
191
+ throw new NuGetError(`Failed to push package: ${error.message}`, [
192
+ 'Check your API key is correct',
193
+ 'Ensure the server URL is correct',
194
+ 'Verify the package version does not already exist on the server',
195
+ 'Run with --verbose for more details',
196
+ ]);
197
+ }
198
+ throw error;
199
+ }
200
+ }
201
+ }
202
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/formats/nuget/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * File collection options
3
+ */
4
+ export interface CollectOptions {
5
+ /** Include all files recursively (default: true) */
6
+ recursive?: boolean;
7
+ /** Pattern to match file names (default: all files) */
8
+ pattern?: RegExp;
9
+ /** Path to mod directory */
10
+ modPath: string;
11
+ /** Path to output directory */
12
+ outputPath: string;
13
+ }
14
+ /**
15
+ * Collected file information
16
+ */
17
+ export interface CollectedFile {
18
+ /** Source path (absolute) */
19
+ source: string;
20
+ /** Target path (relative to package root) */
21
+ target: string;
22
+ }
23
+ /**
24
+ * Collect files for packaging
25
+ * Collects DLL files, preview.png (as icon.png), and all other mod files
26
+ *
27
+ * @param options - Collection options
28
+ * @returns Array of collected files
29
+ * @throws {ValidationError} If mod directory is invalid
30
+ */
31
+ export declare function collectFilesForPackage(options: CollectOptions): Promise<CollectedFile[]>;
32
+ /**
33
+ * Calculate relative file size for display
34
+ */
35
+ export declare function formatFileSize(bytes: number): string;
36
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/formats/nuget/collector.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,EAAE,CAAC,CA2D1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWpD"}
@@ -0,0 +1,72 @@
1
+ import { join, relative } from 'path';
2
+ import { collectFiles, fileExists, directoryExists } from '../../utils/fs.js';
3
+ import { ValidationError } from '../../utils/errors.js';
4
+ /**
5
+ * Collect files for packaging
6
+ * Collects DLL files, preview.png (as icon.png), and all other mod files
7
+ *
8
+ * @param options - Collection options
9
+ * @returns Array of collected files
10
+ * @throws {ValidationError} If mod directory is invalid
11
+ */
12
+ export async function collectFilesForPackage(options) {
13
+ const { modPath, outputPath } = options;
14
+ // Validate mod directory exists
15
+ if (!(await directoryExists(modPath))) {
16
+ throw new ValidationError(`Mod directory does not exist: ${modPath}`, ['Check that the path is correct', 'Ensure the directory exists']);
17
+ }
18
+ const files = [];
19
+ // Collect DLL files
20
+ const dllFiles = await collectFiles(modPath, /\.dll$/i);
21
+ for (const file of dllFiles) {
22
+ const target = relative(modPath, file);
23
+ files.push({ source: file, target });
24
+ }
25
+ // Check for preview.png to copy as icon.png
26
+ const previewPath = join(modPath, 'preview.png');
27
+ if (await fileExists(previewPath)) {
28
+ const iconPath = join(modPath, 'icon.png');
29
+ // The icon will be copied to the package, not renamed in source
30
+ files.push({ source: previewPath, target: 'icon.png' });
31
+ }
32
+ // Collect all other files (excluding info.ini and already collected files)
33
+ const allFiles = await collectFiles(modPath);
34
+ const excludedPatterns = [
35
+ /^info\.ini$/i,
36
+ /\.nupkg$/i,
37
+ /\.nuspec$/i,
38
+ /^preview\.png$/i,
39
+ /^icon\.png$/i,
40
+ ];
41
+ for (const file of allFiles) {
42
+ const target = relative(modPath, file);
43
+ // Skip if already collected (DLLs)
44
+ if (target.endsWith('.dll')) {
45
+ continue;
46
+ }
47
+ // Skip if excluded
48
+ const fileName = target.split('/').pop() || target;
49
+ if (excludedPatterns.some((pattern) => pattern.test(fileName))) {
50
+ continue;
51
+ }
52
+ // Check if already added
53
+ if (!files.some((f) => f.target === target)) {
54
+ files.push({ source: file, target });
55
+ }
56
+ }
57
+ return files;
58
+ }
59
+ /**
60
+ * Calculate relative file size for display
61
+ */
62
+ export function formatFileSize(bytes) {
63
+ const units = ['B', 'KB', 'MB', 'GB'];
64
+ let size = bytes;
65
+ let unitIndex = 0;
66
+ while (size >= 1024 && unitIndex < units.length - 1) {
67
+ size /= 1024;
68
+ unitIndex++;
69
+ }
70
+ return `${size.toFixed(1)} ${units[unitIndex]}`;
71
+ }
72
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/formats/nuget/collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './parser.js';
2
+ export * from './nuspec.js';
3
+ export * from './collector.js';
4
+ export * from './validator.js';
5
+ export * from './client.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/formats/nuget/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAG5B,cAAc,aAAa,CAAC;AAG5B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Parser
2
+ export * from './parser.js';
3
+ // Nuspec generator
4
+ export * from './nuspec.js';
5
+ // File collector
6
+ export * from './collector.js';
7
+ // Validator
8
+ export * from './validator.js';
9
+ // Client (will be added in T13-T15)
10
+ export * from './client.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/formats/nuget/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,cAAc,aAAa,CAAC;AAE5B,mBAAmB;AACnB,cAAc,aAAa,CAAC;AAE5B,iBAAiB;AACjB,cAAc,gBAAgB,CAAC;AAE/B,YAAY;AACZ,cAAc,gBAAgB,CAAC;AAE/B,oCAAoC;AACpC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ModMetadata } from './parser.js';
2
+ /**
3
+ * Generate .nuspec XML content from mod metadata
4
+ * Based on NuGet Mod Packaging Specification v1.0
5
+ *
6
+ * @param metadata - Parsed mod metadata
7
+ * @returns .nuspec XML content
8
+ */
9
+ export declare function generateNuspec(metadata: ModMetadata): string;
10
+ //# sourceMappingURL=nuspec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuspec.d.ts","sourceRoot":"","sources":["../../../src/formats/nuget/nuspec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAoB5D"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Generate .nuspec XML content from mod metadata
3
+ * Based on NuGet Mod Packaging Specification v1.0
4
+ *
5
+ * @param metadata - Parsed mod metadata
6
+ * @returns .nuspec XML content
7
+ */
8
+ export function generateNuspec(metadata) {
9
+ const tags = metadata.tags?.join(' ') || '';
10
+ const dependencies = formatDependencies(metadata.dependencies);
11
+ const icon = metadata.icon ? `<icon>${escapeXml(metadata.icon)}</icon>` : '';
12
+ return `<?xml version="1.0" encoding="utf-8"?>
13
+ <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
14
+ <metadata>
15
+ <id>${escapeXml(metadata.name)}</id>
16
+ <version>${escapeXml(metadata.version)}</version>
17
+ ${metadata.description ? `<description>${escapeXml(metadata.description)}</description>` : ''}
18
+ ${metadata.author ? `<authors>${escapeXml(metadata.author)}</authors>` : ''}
19
+ ${metadata.projectUrl ? `<projectUrl>${escapeXml(metadata.projectUrl)}</projectUrl>` : ''}
20
+ ${metadata.license ? `<license type="expression">${escapeXml(metadata.license)}</license>` : ''}
21
+ ${metadata.copyright ? `<copyright>${escapeXml(metadata.copyright)}</copyright>` : ''}
22
+ ${tags ? `<tags>${escapeXml(tags)}</tags>` : ''}
23
+ ${icon}
24
+ ${dependencies}
25
+ </metadata>
26
+ </package>`;
27
+ }
28
+ /**
29
+ * Format dependencies as NuGet dependency groups
30
+ */
31
+ function formatDependencies(dependencies) {
32
+ if (!dependencies || dependencies.length === 0) {
33
+ return '<dependencies />';
34
+ }
35
+ const dependencyItems = dependencies
36
+ .map((dep) => {
37
+ const [id, version] = dep.split(':');
38
+ if (version) {
39
+ return `<dependency id="${escapeXml(id)}" version="${escapeXml(version)}" />`;
40
+ }
41
+ return `<dependency id="${escapeXml(dep)}" />`;
42
+ })
43
+ .join('\n ');
44
+ return `<dependencies>
45
+ ${dependencyItems}
46
+ </dependencies>`;
47
+ }
48
+ /**
49
+ * Escape special XML characters
50
+ */
51
+ function escapeXml(str) {
52
+ return str
53
+ .replace(/&/g, '&amp;')
54
+ .replace(/</g, '&lt;')
55
+ .replace(/>/g, '&gt;')
56
+ .replace(/"/g, '&quot;')
57
+ .replace(/'/g, '&apos;');
58
+ }
59
+ //# sourceMappingURL=nuspec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuspec.js","sourceRoot":"","sources":["../../../src/formats/nuget/nuspec.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAAqB;IAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7E,OAAO;;;UAGC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;eACnB,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;MACpC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;MAC3F,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;MACzE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;MACvF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;MAC7F,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;MACnF,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;MAC7C,IAAI;MACJ,YAAY;;WAEP,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,YAAuB;IACjD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,eAAe,GAAG,YAAY;SACjC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,mBAAmB,SAAS,CAAC,EAAE,CAAC,cAAc,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAChF,CAAC;QACD,OAAO,mBAAmB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;IACjD,CAAC,CAAC;SACD,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElB,OAAO;QACD,eAAe;oBACH,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Metadata structure parsed from info.ini
3
+ */
4
+ export interface ModMetadata {
5
+ name: string;
6
+ version: string;
7
+ description?: string;
8
+ author?: string;
9
+ icon?: string;
10
+ tags?: string[];
11
+ dependencies?: string[];
12
+ projectUrl?: string;
13
+ license?: string;
14
+ copyright?: string;
15
+ }
16
+ /**
17
+ * Parse info.ini file from a mod directory
18
+ * @param modPath - Path to the mod directory
19
+ * @returns Parsed metadata
20
+ * @throws {FileSystemError} If info.ini is not found
21
+ * @throws {ValidationError} If required fields are missing
22
+ */
23
+ export declare function parseInfoIni(modPath: string): Promise<ModMetadata>;
24
+ /**
25
+ * Parse info.ini content
26
+ * @param content - Raw INI content
27
+ * @returns Parsed metadata
28
+ * @throws {ValidationError} If required fields are missing or invalid
29
+ */
30
+ export declare function parseInfoIniContent(content: string): ModMetadata;
31
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/formats/nuget/parser.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkBxE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA8DhE"}