romm-uploader 0.1.1-beta.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 (120) hide show
  1. package/.env.example +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +228 -0
  4. package/dist/cache/checksum-cache.d.ts +20 -0
  5. package/dist/cache/checksum-cache.d.ts.map +1 -0
  6. package/dist/cache/checksum-cache.js +134 -0
  7. package/dist/cache/checksum-cache.js.map +1 -0
  8. package/dist/checksum/compute-checksum.d.ts +16 -0
  9. package/dist/checksum/compute-checksum.d.ts.map +1 -0
  10. package/dist/checksum/compute-checksum.js +71 -0
  11. package/dist/checksum/compute-checksum.js.map +1 -0
  12. package/dist/cli.d.ts +7 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +165 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/config.d.ts +34 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +95 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/files/discover-files.d.ts +9 -0
  21. package/dist/files/discover-files.d.ts.map +1 -0
  22. package/dist/files/discover-files.js +34 -0
  23. package/dist/files/discover-files.js.map +1 -0
  24. package/dist/files/discover-sources.d.ts +6 -0
  25. package/dist/files/discover-sources.d.ts.map +1 -0
  26. package/dist/files/discover-sources.js +69 -0
  27. package/dist/files/discover-sources.js.map +1 -0
  28. package/dist/files/discover-types.d.ts +8 -0
  29. package/dist/files/discover-types.d.ts.map +1 -0
  30. package/dist/files/discover-types.js +2 -0
  31. package/dist/files/discover-types.js.map +1 -0
  32. package/dist/files/file-info.d.ts +6 -0
  33. package/dist/files/file-info.d.ts.map +1 -0
  34. package/dist/files/file-info.js +44 -0
  35. package/dist/files/file-info.js.map +1 -0
  36. package/dist/output/planner.d.ts +6 -0
  37. package/dist/output/planner.d.ts.map +1 -0
  38. package/dist/output/planner.js +77 -0
  39. package/dist/output/planner.js.map +1 -0
  40. package/dist/output/records.d.ts +16 -0
  41. package/dist/output/records.d.ts.map +1 -0
  42. package/dist/output/records.js +31 -0
  43. package/dist/output/records.js.map +1 -0
  44. package/dist/output/reporter.d.ts +38 -0
  45. package/dist/output/reporter.d.ts.map +1 -0
  46. package/dist/output/reporter.js +66 -0
  47. package/dist/output/reporter.js.map +1 -0
  48. package/dist/romm/auth-cache.d.ts +27 -0
  49. package/dist/romm/auth-cache.d.ts.map +1 -0
  50. package/dist/romm/auth-cache.js +115 -0
  51. package/dist/romm/auth-cache.js.map +1 -0
  52. package/dist/romm/client-http.d.ts +5 -0
  53. package/dist/romm/client-http.d.ts.map +1 -0
  54. package/dist/romm/client-http.js +44 -0
  55. package/dist/romm/client-http.js.map +1 -0
  56. package/dist/romm/client-mappers.d.ts +18 -0
  57. package/dist/romm/client-mappers.d.ts.map +1 -0
  58. package/dist/romm/client-mappers.js +66 -0
  59. package/dist/romm/client-mappers.js.map +1 -0
  60. package/dist/romm/client-session.d.ts +23 -0
  61. package/dist/romm/client-session.d.ts.map +1 -0
  62. package/dist/romm/client-session.js +116 -0
  63. package/dist/romm/client-session.js.map +1 -0
  64. package/dist/romm/client-types.d.ts +29 -0
  65. package/dist/romm/client-types.d.ts.map +1 -0
  66. package/dist/romm/client-types.js +2 -0
  67. package/dist/romm/client-types.js.map +1 -0
  68. package/dist/romm/client.d.ts +86 -0
  69. package/dist/romm/client.d.ts.map +1 -0
  70. package/dist/romm/client.js +168 -0
  71. package/dist/romm/client.js.map +1 -0
  72. package/dist/romm/upload-duplicate-check.d.ts +16 -0
  73. package/dist/romm/upload-duplicate-check.d.ts.map +1 -0
  74. package/dist/romm/upload-duplicate-check.js +16 -0
  75. package/dist/romm/upload-duplicate-check.js.map +1 -0
  76. package/dist/romm/upload-utils.d.ts +9 -0
  77. package/dist/romm/upload-utils.d.ts.map +1 -0
  78. package/dist/romm/upload-utils.js +31 -0
  79. package/dist/romm/upload-utils.js.map +1 -0
  80. package/dist/types.d.ts +98 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +5 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/workflow/create-client.d.ts +7 -0
  85. package/dist/workflow/create-client.d.ts.map +1 -0
  86. package/dist/workflow/create-client.js +19 -0
  87. package/dist/workflow/create-client.js.map +1 -0
  88. package/dist/workflow/discover-input.d.ts +6 -0
  89. package/dist/workflow/discover-input.d.ts.map +1 -0
  90. package/dist/workflow/discover-input.js +14 -0
  91. package/dist/workflow/discover-input.js.map +1 -0
  92. package/dist/workflow/io.d.ts +6 -0
  93. package/dist/workflow/io.d.ts.map +1 -0
  94. package/dist/workflow/io.js +13 -0
  95. package/dist/workflow/io.js.map +1 -0
  96. package/dist/workflow/process-dry-file.d.ts +26 -0
  97. package/dist/workflow/process-dry-file.d.ts.map +1 -0
  98. package/dist/workflow/process-dry-file.js +51 -0
  99. package/dist/workflow/process-dry-file.js.map +1 -0
  100. package/dist/workflow/process-roms.d.ts +15 -0
  101. package/dist/workflow/process-roms.d.ts.map +1 -0
  102. package/dist/workflow/process-roms.js +26 -0
  103. package/dist/workflow/process-roms.js.map +1 -0
  104. package/dist/workflow/process-upload-file.d.ts +22 -0
  105. package/dist/workflow/process-upload-file.d.ts.map +1 -0
  106. package/dist/workflow/process-upload-file.js +55 -0
  107. package/dist/workflow/process-upload-file.js.map +1 -0
  108. package/dist/workflow/resolve-checksums.d.ts +10 -0
  109. package/dist/workflow/resolve-checksums.d.ts.map +1 -0
  110. package/dist/workflow/resolve-checksums.js +28 -0
  111. package/dist/workflow/resolve-checksums.js.map +1 -0
  112. package/dist/workflow/run-dry.d.ts +6 -0
  113. package/dist/workflow/run-dry.d.ts.map +1 -0
  114. package/dist/workflow/run-dry.js +96 -0
  115. package/dist/workflow/run-dry.js.map +1 -0
  116. package/dist/workflow/run-upload.d.ts +6 -0
  117. package/dist/workflow/run-upload.d.ts.map +1 -0
  118. package/dist/workflow/run-upload.js +131 -0
  119. package/dist/workflow/run-upload.js.map +1 -0
  120. package/package.json +68 -0
@@ -0,0 +1,29 @@
1
+ export interface TokenResponse {
2
+ access_token: string;
3
+ token_type: string;
4
+ expires: number;
5
+ refresh_token?: string;
6
+ }
7
+ export interface RommPlatformResponse {
8
+ id: number;
9
+ slug: string;
10
+ fs_slug: string;
11
+ name: string;
12
+ custom_name?: string;
13
+ }
14
+ export interface RommRomResponse {
15
+ id: number;
16
+ name: string;
17
+ platform_id: number;
18
+ platform_slug: string;
19
+ file_name: string;
20
+ file_size: number;
21
+ crc_hash?: string;
22
+ md5_hash?: string;
23
+ sha1_hash?: string;
24
+ ra_hash?: string;
25
+ }
26
+ export interface RommFilesResponse {
27
+ items: RommRomResponse[];
28
+ }
29
+ //# sourceMappingURL=client-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-types.d.ts","sourceRoot":"","sources":["../../src/romm/client-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-types.js","sourceRoot":"","sources":["../../src/romm/client-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * ROMM API client
3
+ * API wrapper for auth, search, upload, retries, errors
4
+ */
5
+ import { Platform, RomLookupResult } from '../types.js';
6
+ export interface RommClientOptions {
7
+ baseUrl: string;
8
+ username: string;
9
+ password?: string;
10
+ authCacheEnabled: boolean;
11
+ authCachePath?: string;
12
+ authReauthSkewSeconds: number;
13
+ requestTimeoutSeconds: number;
14
+ retryCount: number;
15
+ dryRun?: boolean;
16
+ }
17
+ export declare class RommClient {
18
+ private _options;
19
+ private _session;
20
+ constructor(options: RommClientOptions);
21
+ /**
22
+ * Initialize client - check for cached token
23
+ */
24
+ initialize(): Promise<void>;
25
+ /**
26
+ * Get the full API URL for a path
27
+ */
28
+ private _getUrl;
29
+ /**
30
+ * Execute fetch with retries and exponential backoff
31
+ */
32
+ private _fetchWithRetry;
33
+ /**
34
+ * Make an authenticated API request
35
+ */
36
+ private _fetch;
37
+ /**
38
+ * Authenticate with ROMM
39
+ */
40
+ authenticate(): Promise<void>;
41
+ /**
42
+ * Resolve platform ID from slug, name, or numeric ID
43
+ */
44
+ resolvePlatform(platformValue: string): Promise<number>;
45
+ /**
46
+ * Get all platforms
47
+ */
48
+ getPlatforms(): Promise<Platform[]>;
49
+ /**
50
+ * Lookup ROM by hash
51
+ */
52
+ lookupRomByHash(options: {
53
+ crc32?: string;
54
+ md5?: string;
55
+ sha1?: string;
56
+ raHash?: string;
57
+ }): Promise<RomLookupResult>;
58
+ /**
59
+ * Fetch CSRF token from RomM
60
+ */
61
+ private _fetchCsrfToken;
62
+ /**
63
+ * Upload a ROM file
64
+ */
65
+ uploadRom(options: {
66
+ filePath: string;
67
+ platformId: number;
68
+ filename: string;
69
+ dryRun?: boolean;
70
+ }): Promise<void>;
71
+ /**
72
+ * Get files by filename
73
+ */
74
+ getFilesByFilename(filename: string): Promise<Array<{
75
+ id: number;
76
+ name: string;
77
+ platformId: number;
78
+ platformSlug: string;
79
+ fileName: string;
80
+ fileSize: number;
81
+ crcHash?: string;
82
+ md5Hash?: string;
83
+ sha1Hash?: string;
84
+ }>>;
85
+ }
86
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/romm/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAuBxD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAc;gBAElB,OAAO,EAAE,iBAAiB;IAQtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACH,OAAO,CAAC,OAAO;IAKf;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;YACW,MAAM;IAIpB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;OAEG;IACG,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK7D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAWzC;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,eAAe,CAAC;IAqB5B;;OAEG;YACW,eAAe;IAsB7B;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CjB;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CACjD,KAAK,CAAC;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CACH;CAeF"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * ROMM API client
3
+ * API wrapper for auth, search, upload, retries, errors
4
+ */
5
+ import { RommSession } from './client-session.js';
6
+ import { fetchWithRetry } from './client-http.js';
7
+ import { mapFilesByFilename, mapLookupResult, mapPlatforms, resolvePlatformId, } from './client-mappers.js';
8
+ import { computeUploadChecksums, createUploadFormData, createUploadHeaders, readUploadFile, } from './upload-utils.js';
9
+ import { buildDuplicateError, findDuplicateMatches, isDuplicateError, shouldWarnDuplicateLookupFailure, } from './upload-duplicate-check.js';
10
+ export class RommClient {
11
+ _options;
12
+ _session;
13
+ constructor(options) {
14
+ this._options = options;
15
+ this._session = new RommSession(options, {
16
+ fetchWithRetry: this._fetchWithRetry.bind(this),
17
+ getUrl: this._getUrl.bind(this),
18
+ });
19
+ }
20
+ /**
21
+ * Initialize client - check for cached token
22
+ */
23
+ async initialize() {
24
+ await this._session.initialize();
25
+ }
26
+ /**
27
+ * Get the full API URL for a path
28
+ */
29
+ _getUrl(path) {
30
+ const base = this._options.baseUrl.replace(/\/$/, '');
31
+ return `${base}/api${path}`;
32
+ }
33
+ /**
34
+ * Execute fetch with retries and exponential backoff
35
+ */
36
+ _fetchWithRetry(url, options) {
37
+ return fetchWithRetry(url, options, this._options.requestTimeoutSeconds, this._options.retryCount);
38
+ }
39
+ /**
40
+ * Make an authenticated API request
41
+ */
42
+ async _fetch(path, options = {}) {
43
+ return this._session.fetch(path, options);
44
+ }
45
+ /**
46
+ * Authenticate with ROMM
47
+ */
48
+ async authenticate() {
49
+ await this._session.authenticate();
50
+ }
51
+ /**
52
+ * Resolve platform ID from slug, name, or numeric ID
53
+ */
54
+ async resolvePlatform(platformValue) {
55
+ const platforms = await this.getPlatforms();
56
+ return resolvePlatformId(platforms, platformValue);
57
+ }
58
+ /**
59
+ * Get all platforms
60
+ */
61
+ async getPlatforms() {
62
+ const response = await this._fetch('/platforms');
63
+ if (!response.ok) {
64
+ throw new Error(`Failed to fetch platforms: ${response.status}`);
65
+ }
66
+ const data = (await response.json());
67
+ return mapPlatforms(data);
68
+ }
69
+ /**
70
+ * Lookup ROM by hash
71
+ */
72
+ async lookupRomByHash(options) {
73
+ const params = new URLSearchParams();
74
+ if (options.crc32)
75
+ params.set('crc_hash', options.crc32);
76
+ if (options.md5)
77
+ params.set('md5_hash', options.md5);
78
+ if (options.sha1)
79
+ params.set('sha1_hash', options.sha1);
80
+ if (options.raHash)
81
+ params.set('ra_hash', options.raHash);
82
+ const response = await this._fetch(`/roms/by-hash?${params.toString()}`);
83
+ if (response.status === 404) {
84
+ return { exists: false };
85
+ }
86
+ if (!response.ok) {
87
+ throw new Error(`Hash lookup failed: ${response.status}`);
88
+ }
89
+ const data = (await response.json());
90
+ return mapLookupResult(data);
91
+ }
92
+ /**
93
+ * Fetch CSRF token from RomM
94
+ */
95
+ async _fetchCsrfToken() {
96
+ try {
97
+ const response = await this._fetchWithRetry(this._getUrl('/platforms'), {
98
+ method: 'GET',
99
+ headers: {
100
+ Authorization: `Bearer ${this._session.accessToken}`,
101
+ },
102
+ });
103
+ if (!response.ok)
104
+ return null;
105
+ const csrfToken = response.headers.get('x-csrftoken') ||
106
+ response.headers.get('X-CSRFToken') ||
107
+ response.headers.get('csrftoken');
108
+ return csrfToken;
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ /**
115
+ * Upload a ROM file
116
+ */
117
+ async uploadRom(options) {
118
+ const { filePath, platformId, filename, dryRun = false } = options;
119
+ const accessToken = await this._session.ensureAuthenticated();
120
+ const csrfToken = await this._fetchCsrfToken();
121
+ const checksums = await computeUploadChecksums(filePath);
122
+ if (!dryRun) {
123
+ try {
124
+ const existingFiles = await this.getFilesByFilename(filename);
125
+ const duplicateMatches = findDuplicateMatches(existingFiles, checksums);
126
+ if (duplicateMatches.length > 0) {
127
+ const duplicateNames = duplicateMatches.map((f) => f.fileName).join(', ');
128
+ throw buildDuplicateError(duplicateNames);
129
+ }
130
+ }
131
+ catch (error) {
132
+ if (isDuplicateError(error)) {
133
+ throw error;
134
+ }
135
+ if (shouldWarnDuplicateLookupFailure(error)) {
136
+ console.warn(`⚠️ Warning: Duplicate check failed but proceeding with upload. Details: ${error instanceof Error ? error.message : 'unknown error'}`);
137
+ }
138
+ }
139
+ }
140
+ const fileData = await readUploadFile(filePath);
141
+ const body = createUploadFormData(fileData, filename, platformId);
142
+ const headers = createUploadHeaders(accessToken, platformId, filename, csrfToken);
143
+ const response = await this._fetchWithRetry(this._getUrl('/roms'), {
144
+ method: 'POST',
145
+ headers,
146
+ body,
147
+ });
148
+ if (!response.ok) {
149
+ const errorText = await response.text().catch(() => 'Unknown error');
150
+ throw new Error(`Upload failed: ${response.status} ${errorText}`);
151
+ }
152
+ }
153
+ /**
154
+ * Get files by filename
155
+ */
156
+ async getFilesByFilename(filename) {
157
+ await this._session.ensureAuthenticated();
158
+ const params = new URLSearchParams();
159
+ params.set('filename', filename);
160
+ const response = await this._fetch(`/roms?${params.toString()}`);
161
+ if (!response.ok) {
162
+ throw new Error(`Failed to get files by filename: ${response.status}`);
163
+ }
164
+ const data = (await response.json());
165
+ return mapFilesByFilename(data);
166
+ }
167
+ }
168
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/romm/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface ExistingRomFile {
2
+ fileName: string;
3
+ crcHash?: string;
4
+ md5Hash?: string;
5
+ sha1Hash?: string;
6
+ }
7
+ export interface UploadChecksums {
8
+ crc32: string;
9
+ md5: string;
10
+ sha1: string;
11
+ }
12
+ export declare function buildDuplicateError(duplicateNames: string): Error;
13
+ export declare function isDuplicateError(error: unknown): boolean;
14
+ export declare function findDuplicateMatches(existingFiles: ExistingRomFile[], checksums: UploadChecksums): ExistingRomFile[];
15
+ export declare function shouldWarnDuplicateLookupFailure(error: unknown): boolean;
16
+ //# sourceMappingURL=upload-duplicate-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-duplicate-check.d.ts","sourceRoot":"","sources":["../../src/romm/upload-duplicate-check.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,KAAK,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAExD;AAED,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,eAAe,EAAE,EAChC,SAAS,EAAE,eAAe,GACzB,eAAe,EAAE,CAOnB;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAExE"}
@@ -0,0 +1,16 @@
1
+ const DUPLICATE_PREFIX = '❌ File with the same checksum already exists in RomM';
2
+ export function buildDuplicateError(duplicateNames) {
3
+ return new Error(`${DUPLICATE_PREFIX}: ${duplicateNames}`);
4
+ }
5
+ export function isDuplicateError(error) {
6
+ return error instanceof Error && error.message.startsWith(DUPLICATE_PREFIX);
7
+ }
8
+ export function findDuplicateMatches(existingFiles, checksums) {
9
+ return existingFiles.filter((file) => file.crcHash === checksums.crc32 ||
10
+ file.md5Hash === checksums.md5 ||
11
+ file.sha1Hash === checksums.sha1);
12
+ }
13
+ export function shouldWarnDuplicateLookupFailure(error) {
14
+ return !(error instanceof Error && error.message.includes('404'));
15
+ }
16
+ //# sourceMappingURL=upload-duplicate-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-duplicate-check.js","sourceRoot":"","sources":["../../src/romm/upload-duplicate-check.ts"],"names":[],"mappings":"AAaA,MAAM,gBAAgB,GAAG,sDAAsD,CAAC;AAEhF,MAAM,UAAU,mBAAmB,CAAC,cAAsB;IACxD,OAAO,IAAI,KAAK,CAAC,GAAG,gBAAgB,KAAK,cAAc,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,aAAgC,EAChC,SAA0B;IAE1B,OAAO,aAAa,CAAC,MAAM,CACzB,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,KAAK;QAChC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,GAAG;QAC9B,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,IAAI,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAc;IAC7D,OAAO,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function readUploadFile(filePath: string): Promise<Uint8Array>;
2
+ export declare function computeUploadChecksums(filePath: string): Promise<{
3
+ crc32: string;
4
+ md5: string;
5
+ sha1: string;
6
+ }>;
7
+ export declare function createUploadFormData(fileData: Uint8Array, filename: string, platformId: number): FormData;
8
+ export declare function createUploadHeaders(accessToken: string, platformId: number, filename: string, csrfToken?: string | null): Record<string, string>;
9
+ //# sourceMappingURL=upload-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-utils.d.ts","sourceRoot":"","sources":["../../src/romm/upload-utils.ts"],"names":[],"mappings":"AAAA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAG1E;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAQD;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,QAAQ,CAKV;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB"}
@@ -0,0 +1,31 @@
1
+ export async function readUploadFile(filePath) {
2
+ const { readFile } = await import('fs/promises');
3
+ return readFile(filePath);
4
+ }
5
+ export async function computeUploadChecksums(filePath) {
6
+ const { computeChecksums } = await import('../checksum/compute-checksum.js');
7
+ const checksums = await computeChecksums(filePath, ['crc32', 'md5', 'sha1']);
8
+ return {
9
+ crc32: checksums.crc32,
10
+ md5: checksums.md5,
11
+ sha1: checksums.sha1,
12
+ };
13
+ }
14
+ export function createUploadFormData(fileData, filename, platformId) {
15
+ const body = new FormData();
16
+ body.append(filename, new Blob([fileData], { type: 'application/octet-stream' }), filename);
17
+ body.append('x-upload-platform', String(platformId));
18
+ return body;
19
+ }
20
+ export function createUploadHeaders(accessToken, platformId, filename, csrfToken) {
21
+ const headers = {
22
+ Authorization: `Bearer ${accessToken}`,
23
+ 'X-Upload-Platform': String(platformId),
24
+ 'X-Upload-Filename': filename,
25
+ };
26
+ if (csrfToken) {
27
+ headers['X-CSRFToken'] = csrfToken;
28
+ }
29
+ return headers;
30
+ }
31
+ //# sourceMappingURL=upload-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-utils.js","sourceRoot":"","sources":["../../src/romm/upload-utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACjD,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAgB;IAK3D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,GAAG,EAAE,SAAS,CAAC,GAAG;QAClB,IAAI,EAAE,SAAS,CAAC,IAAI;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAoB,EACpB,QAAgB,EAChB,UAAkB;IAElB,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5F,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,UAAkB,EAClB,QAAgB,EAChB,SAAyB;IAEzB,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,mBAAmB,EAAE,MAAM,CAAC,UAAU,CAAC;QACvC,mBAAmB,EAAE,QAAQ;KAC9B,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;IACrC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Core type definitions for romm-uploader
3
+ */
4
+ /** CLI configuration options */
5
+ export interface CliOptions {
6
+ baseUrl: string;
7
+ username: string;
8
+ password?: string;
9
+ platform?: string;
10
+ paths: string[];
11
+ uploadFiles: string[];
12
+ uploadDirs: string[];
13
+ globs: string[];
14
+ checksum: string[];
15
+ cacheEnabled: boolean;
16
+ cacheMaxMb: number;
17
+ cachePath?: string;
18
+ authCacheEnabled: boolean;
19
+ authCachePath?: string;
20
+ authReauthSkewSeconds: number;
21
+ requestTimeoutSeconds: number;
22
+ retryCount: number;
23
+ recursive: boolean;
24
+ dryRun: boolean;
25
+ concurrency: number;
26
+ json: boolean;
27
+ verbose: boolean;
28
+ listPlatforms: boolean;
29
+ }
30
+ /** File information discovered during scanning */
31
+ export interface FileInfo {
32
+ absolutePath: string;
33
+ size: number;
34
+ mtime: number;
35
+ }
36
+ /** Checksum data for a file */
37
+ export interface ChecksumData {
38
+ crc32: string;
39
+ md5: string;
40
+ sha1: string;
41
+ raHash?: string;
42
+ }
43
+ /** ROM lookup result from ROMM */
44
+ export interface RomLookupResult {
45
+ exists: boolean;
46
+ rom?: RomDetails;
47
+ }
48
+ /** ROM details from ROMM API */
49
+ export interface RomDetails {
50
+ id: number;
51
+ name: string;
52
+ platformId: number;
53
+ platformSlug: string;
54
+ fileName: string;
55
+ fileSize: number;
56
+ crcHash?: string;
57
+ md5Hash?: string;
58
+ sha1Hash?: string;
59
+ raHash?: string;
60
+ }
61
+ /** Platform information from ROMM */
62
+ export interface Platform {
63
+ id: number;
64
+ slug: string;
65
+ fsSlug: string;
66
+ name: string;
67
+ customName?: string;
68
+ }
69
+ /** Authentication token cache entry */
70
+ export interface AuthTokenCache {
71
+ accessToken: string;
72
+ tokenType: string;
73
+ expiresAtEpochMs: number;
74
+ issuedAtEpochMs: number;
75
+ }
76
+ /** Checksum cache entry */
77
+ export interface ChecksumCacheEntry {
78
+ path: string;
79
+ size: number;
80
+ mtime: number;
81
+ checksums: ChecksumData;
82
+ }
83
+ /** Per-file processing result */
84
+ export interface FileResult {
85
+ path: string;
86
+ status: 'skipped_exists' | 'uploaded' | 'failed' | 'pending';
87
+ checksums?: ChecksumData;
88
+ error?: string;
89
+ }
90
+ /** Final run summary */
91
+ export interface RunSummary {
92
+ totalScanned: number;
93
+ alreadyExisting: number;
94
+ uploaded: number;
95
+ failed: number;
96
+ elapsedMs: number;
97
+ }
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core type definitions for romm-uploader
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,7 @@
1
+ import { RommClient } from '../romm/client.js';
2
+ import { CliOptions } from '../types.js';
3
+ /**
4
+ * Create and initialize RomM client
5
+ */
6
+ export declare function createClient(config: CliOptions): Promise<RommClient>;
7
+ //# sourceMappingURL=create-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-client.d.ts","sourceRoot":"","sources":["../../src/workflow/create-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAc1E"}
@@ -0,0 +1,19 @@
1
+ import { RommClient } from '../romm/client.js';
2
+ /**
3
+ * Create and initialize RomM client
4
+ */
5
+ export async function createClient(config) {
6
+ const client = new RommClient({
7
+ baseUrl: config.baseUrl,
8
+ username: config.username,
9
+ password: config.password,
10
+ authCacheEnabled: config.authCacheEnabled,
11
+ authCachePath: config.authCachePath,
12
+ authReauthSkewSeconds: config.authReauthSkewSeconds,
13
+ requestTimeoutSeconds: config.requestTimeoutSeconds,
14
+ retryCount: config.retryCount,
15
+ });
16
+ await client.initialize();
17
+ return client;
18
+ }
19
+ //# sourceMappingURL=create-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-client.js","sourceRoot":"","sources":["../../src/workflow/create-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAkB;IACnD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;QACnD,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;QACnD,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { CliOptions, FileInfo } from '../types.js';
2
+ /**
3
+ * Resolve all input files from CLI options.
4
+ */
5
+ export declare function discoverInputFiles(config: CliOptions): Promise<FileInfo[]>;
6
+ //# sourceMappingURL=discover-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-input.d.ts","sourceRoot":"","sources":["../../src/workflow/discover-input.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAQhF"}
@@ -0,0 +1,14 @@
1
+ import { discoverFiles } from '../files/discover-files.js';
2
+ /**
3
+ * Resolve all input files from CLI options.
4
+ */
5
+ export async function discoverInputFiles(config) {
6
+ return discoverFiles({
7
+ paths: config.paths,
8
+ uploadFiles: config.uploadFiles,
9
+ uploadDirs: config.uploadDirs,
10
+ globs: config.globs,
11
+ recursive: config.recursive,
12
+ });
13
+ }
14
+ //# sourceMappingURL=discover-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-input.js","sourceRoot":"","sources":["../../src/workflow/discover-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAkB;IACzD,OAAO,aAAa,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { CliOptions } from '../types.js';
2
+ export declare function writeStdout(message: string): void;
3
+ export declare function writeStderr(message: string): void;
4
+ export declare function isHuman(config: CliOptions): boolean;
5
+ export declare function isVerbose(config: CliOptions): boolean;
6
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/workflow/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEnD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAErD"}
@@ -0,0 +1,13 @@
1
+ export function writeStdout(message) {
2
+ process.stdout.write(`${message}\n`);
3
+ }
4
+ export function writeStderr(message) {
5
+ process.stderr.write(`${message}\n`);
6
+ }
7
+ export function isHuman(config) {
8
+ return !config.json;
9
+ }
10
+ export function isVerbose(config) {
11
+ return config.verbose && !config.json;
12
+ }
13
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/workflow/io.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAkB;IACxC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAkB;IAC1C,OAAO,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACxC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { RommClient } from '../romm/client.js';
2
+ import { ChecksumData, CliOptions, FileInfo } from '../types.js';
3
+ export interface DryRunFileResult {
4
+ file: FileInfo;
5
+ checksums: ChecksumData;
6
+ cached: boolean;
7
+ exists?: boolean;
8
+ romName?: string;
9
+ }
10
+ export interface DryRunFileError {
11
+ file: FileInfo;
12
+ error: string;
13
+ }
14
+ /**
15
+ * Process a single file for dry-run mode.
16
+ */
17
+ export declare function processDryFile(options: {
18
+ config: CliOptions;
19
+ file: FileInfo;
20
+ client?: RommClient;
21
+ onDebug?: (message: string) => void;
22
+ }): Promise<{
23
+ result?: DryRunFileResult;
24
+ error?: DryRunFileError;
25
+ }>;
26
+ //# sourceMappingURL=process-dry-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-dry-file.d.ts","sourceRoot":"","sources":["../../src/workflow/process-dry-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGjE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GAAG,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAiDlE"}