@fias/plugin-dev-harness 1.11.0 → 1.12.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 (62) hide show
  1. package/dist/cli/assets/api.d.ts +53 -0
  2. package/dist/cli/assets/api.d.ts.map +1 -0
  3. package/dist/cli/assets/api.js +165 -0
  4. package/dist/cli/assets/api.js.map +1 -0
  5. package/dist/cli/assets/api.test.d.ts +2 -0
  6. package/dist/cli/assets/api.test.d.ts.map +1 -0
  7. package/dist/cli/assets/api.test.js +77 -0
  8. package/dist/cli/assets/api.test.js.map +1 -0
  9. package/dist/cli/assets/arche-resolver.d.ts +24 -0
  10. package/dist/cli/assets/arche-resolver.d.ts.map +1 -0
  11. package/dist/cli/assets/arche-resolver.js +114 -0
  12. package/dist/cli/assets/arche-resolver.js.map +1 -0
  13. package/dist/cli/assets/arche-resolver.test.d.ts +2 -0
  14. package/dist/cli/assets/arche-resolver.test.d.ts.map +1 -0
  15. package/dist/cli/assets/arche-resolver.test.js +108 -0
  16. package/dist/cli/assets/arche-resolver.test.js.map +1 -0
  17. package/dist/cli/assets/commands.test.d.ts +8 -0
  18. package/dist/cli/assets/commands.test.d.ts.map +1 -0
  19. package/dist/cli/assets/commands.test.js +158 -0
  20. package/dist/cli/assets/commands.test.js.map +1 -0
  21. package/dist/cli/assets/delete.d.ts +3 -0
  22. package/dist/cli/assets/delete.d.ts.map +1 -0
  23. package/dist/cli/assets/delete.js +104 -0
  24. package/dist/cli/assets/delete.js.map +1 -0
  25. package/dist/cli/assets/disable.d.ts +3 -0
  26. package/dist/cli/assets/disable.d.ts.map +1 -0
  27. package/dist/cli/assets/disable.js +101 -0
  28. package/dist/cli/assets/disable.js.map +1 -0
  29. package/dist/cli/assets/enable.d.ts +8 -0
  30. package/dist/cli/assets/enable.d.ts.map +1 -0
  31. package/dist/cli/assets/enable.js +80 -0
  32. package/dist/cli/assets/enable.js.map +1 -0
  33. package/dist/cli/assets/index.d.ts +11 -0
  34. package/dist/cli/assets/index.d.ts.map +1 -0
  35. package/dist/cli/assets/index.js +31 -0
  36. package/dist/cli/assets/index.js.map +1 -0
  37. package/dist/cli/assets/list.d.ts +3 -0
  38. package/dist/cli/assets/list.d.ts.map +1 -0
  39. package/dist/cli/assets/list.js +80 -0
  40. package/dist/cli/assets/list.js.map +1 -0
  41. package/dist/cli/assets/status.d.ts +3 -0
  42. package/dist/cli/assets/status.d.ts.map +1 -0
  43. package/dist/cli/assets/status.js +75 -0
  44. package/dist/cli/assets/status.js.map +1 -0
  45. package/dist/cli/assets/tag.d.ts +3 -0
  46. package/dist/cli/assets/tag.d.ts.map +1 -0
  47. package/dist/cli/assets/tag.js +76 -0
  48. package/dist/cli/assets/tag.js.map +1 -0
  49. package/dist/cli/assets/upload.d.ts +25 -0
  50. package/dist/cli/assets/upload.d.ts.map +1 -0
  51. package/dist/cli/assets/upload.js +289 -0
  52. package/dist/cli/assets/upload.js.map +1 -0
  53. package/dist/cli/assets/upload.test.d.ts +15 -0
  54. package/dist/cli/assets/upload.test.d.ts.map +1 -0
  55. package/dist/cli/assets/upload.test.js +222 -0
  56. package/dist/cli/assets/upload.test.js.map +1 -0
  57. package/dist/cli/index.d.ts.map +1 -1
  58. package/dist/cli/index.js +2 -0
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/index.test.js +7 -2
  61. package/dist/cli/index.test.js.map +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/assets/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommand(parent: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsDpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2E3D"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerStatusCommand = registerStatusCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const credentials_1 = require("../../config/credentials");
9
+ const config_loader_1 = require("../../config/config-loader");
10
+ const api_1 = require("./api");
11
+ const arche_resolver_1 = require("./arche-resolver");
12
+ const enable_1 = require("./enable");
13
+ function registerStatusCommand(parent) {
14
+ parent
15
+ .command('status')
16
+ .description('Show asset library status, quota usage, and billing summary')
17
+ .option('--env <environment>', 'staging | prod | local', 'staging')
18
+ .option('--arche-id <archeId>', 'Explicit arche ID')
19
+ .action(async (options) => {
20
+ try {
21
+ const env = (0, enable_1.normalizeAndAuth)(options.env);
22
+ const apiKey = (0, credentials_1.loadAuthTokenForEnvironment)(env);
23
+ if (!apiKey)
24
+ (0, enable_1.authMissing)(env);
25
+ const client = (0, api_1.createAssetApiClient)({
26
+ apiUrl: config_loader_1.ENVIRONMENT_URLS[env].apiUrl,
27
+ apiKey: apiKey,
28
+ });
29
+ const archeId = await (0, arche_resolver_1.resolveArcheId)({
30
+ cwd: process.cwd(),
31
+ env,
32
+ client,
33
+ explicit: options.archeId ?? null,
34
+ });
35
+ const [cfg, billing] = await Promise.all([
36
+ client.getJson(`/contributor/arches/${archeId}/asset-library/config`),
37
+ client.getJson(`/contributor/arches/${archeId}/billing/summary`),
38
+ ]);
39
+ const c = cfg.config;
40
+ const b = billing.summary;
41
+ console.log(chalk_1.default.bold(`Asset Library — ${archeId}`));
42
+ const stateLabel = c.suspendedAt
43
+ ? chalk_1.default.red(`SUSPENDED (${c.suspendReason ?? 'no reason'})`)
44
+ : c.enabled
45
+ ? chalk_1.default.green('enabled')
46
+ : chalk_1.default.dim('disabled');
47
+ console.log(` State: ${stateLabel}`);
48
+ const used = c.usage.activeStorageBytes;
49
+ const cap = c.effectiveCaps.maxStorageBytes;
50
+ const pct = cap > 0 ? ((used / cap) * 100).toFixed(2) : '0';
51
+ console.log(` Storage: ${(0, enable_1.formatBytes)(used)} / ${(0, enable_1.formatBytes)(cap)} (${pct}%) · ${c.usage.activeAssetCount.toLocaleString()} / ${c.effectiveCaps.maxAssets.toLocaleString()} assets`);
52
+ console.log('');
53
+ console.log(chalk_1.default.bold('Yesterday'));
54
+ if (!b.yesterday) {
55
+ console.log(chalk_1.default.dim(' No snapshot yet for yesterday.'));
56
+ }
57
+ else {
58
+ const y = b.yesterday;
59
+ console.log(` Storage charge: ${y.storageChargeCredits.toFixed(4)} credits · Egress: ${y.egressChargeCredits.toFixed(4)} credits · Status: ${y.chargeStatus}`);
60
+ }
61
+ console.log('');
62
+ console.log(chalk_1.default.bold('Month to date'));
63
+ const mtdTotal = b.monthToDate.storageChargeCredits + b.monthToDate.egressChargeCredits;
64
+ console.log(` Storage: ${b.monthToDate.storageChargeCredits.toFixed(4)} credits · Egress: ${b.monthToDate.egressChargeCredits.toFixed(4)} credits · Total: ${mtdTotal.toFixed(4)} credits`);
65
+ console.log(` Days charged: ${b.monthToDate.daysCharged} · Failed: ${b.monthToDate.daysFailed}`);
66
+ console.log('');
67
+ console.log(chalk_1.default.bold('Free tier remaining'));
68
+ console.log(` Storage: ${(0, enable_1.formatBytes)(b.freeTier.storageByteDaysRemaining)}-days · Egress: ${(0, enable_1.formatBytes)(b.freeTier.egressBytesRemaining)}`);
69
+ }
70
+ catch (err) {
71
+ (0, enable_1.handleErr)(err);
72
+ }
73
+ });
74
+ }
75
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/assets/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTagCommand(parent: Command): void;
3
+ //# sourceMappingURL=tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA8DxD"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerTagCommand = registerTagCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const credentials_1 = require("../../config/credentials");
9
+ const config_loader_1 = require("../../config/config-loader");
10
+ const api_1 = require("./api");
11
+ const arche_resolver_1 = require("./arche-resolver");
12
+ const enable_1 = require("./enable");
13
+ function collect(value, previous = []) {
14
+ return previous.concat([value]);
15
+ }
16
+ function registerTagCommand(parent) {
17
+ parent
18
+ .command('tag <assetId>')
19
+ .description('Add or remove tags on an asset (preserves untouched tags)')
20
+ .option('--env <environment>', 'staging | prod | local', 'staging')
21
+ .option('--arche-id <archeId>', 'Explicit arche ID')
22
+ .option('--add <tag>', 'Tag to add (repeatable)', collect, [])
23
+ .option('--remove <tag>', 'Tag to remove (repeatable)', collect, [])
24
+ .action(async (assetId, options) => {
25
+ try {
26
+ if ((options.add?.length ?? 0) === 0 && (options.remove?.length ?? 0) === 0) {
27
+ console.error(chalk_1.default.red('Provide at least one --add <tag> or --remove <tag>.'));
28
+ process.exit(4);
29
+ }
30
+ const env = (0, enable_1.normalizeAndAuth)(options.env);
31
+ const apiKey = (0, credentials_1.loadAuthTokenForEnvironment)(env);
32
+ if (!apiKey)
33
+ (0, enable_1.authMissing)(env);
34
+ const client = (0, api_1.createAssetApiClient)({
35
+ apiUrl: config_loader_1.ENVIRONMENT_URLS[env].apiUrl,
36
+ apiKey: apiKey,
37
+ });
38
+ const archeId = await (0, arche_resolver_1.resolveArcheId)({
39
+ cwd: process.cwd(),
40
+ env,
41
+ client,
42
+ explicit: options.archeId ?? null,
43
+ });
44
+ // Read current tags, compute new set, PATCH. The route's PATCH
45
+ // overwrites the tags array, so we have to send the full
46
+ // resulting list — there's no add/remove server-side semantic.
47
+ const existing = await client
48
+ .getJson(`/contributor/arches/${archeId}/assets/${assetId}`)
49
+ .catch(async () => {
50
+ // The contributor list route is `/assets`; there's no GET
51
+ // single-asset route in v1. Fall back to listing and
52
+ // filtering — small set.
53
+ const list = await client.getJson(`/contributor/arches/${archeId}/assets?limit=100`);
54
+ const found = list.assets.find((a) => a.assetId === assetId);
55
+ if (!found) {
56
+ throw new Error(`Asset ${assetId} not found in this arche.`);
57
+ }
58
+ return { asset: { assetId: found.assetId, tags: found.tags } };
59
+ });
60
+ const currentTags = new Set(existing.asset.tags ?? []);
61
+ for (const t of options.add ?? [])
62
+ currentTags.add(t);
63
+ for (const t of options.remove ?? [])
64
+ currentTags.delete(t);
65
+ const next = [...currentTags];
66
+ await client.patchJson(`/contributor/arches/${archeId}/assets/${assetId}`, {
67
+ tags: next,
68
+ });
69
+ console.log(chalk_1.default.green(` ✓ Tags updated: [${next.join(', ')}]`));
70
+ }
71
+ catch (err) {
72
+ (0, enable_1.handleErr)(err);
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag.js","sourceRoot":"","sources":["../../../src/cli/assets/tag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `fias-dev assets upload <dir>` — bulk-upload images.
3
+ *
4
+ * Walks <dir> for png / jpeg / webp files. For each:
5
+ * 1. Read bytes; compute SHA-256 locally.
6
+ * 2. Skip if a prior run already finalized this exact (relativePath,
7
+ * sizeBytes, sha256) — keyed by all three for false-positive-proof
8
+ * resume.
9
+ * 3. Local fail-fast on > 50 MB to spare a server round-trip.
10
+ * 4. POST upload-init → 3-step server flow.
11
+ * 5. PUT bytes to S3.
12
+ * 6. POST finalize.
13
+ * 7. Append a {status: 'finalized'|'failed', ...} row to the
14
+ * append-only resume log.
15
+ *
16
+ * Concurrency: bounded pool of 4 by default. Subdirectory name
17
+ * becomes default tag unless `--tag` overrides; multiple `--tag`
18
+ * flags additively apply.
19
+ *
20
+ * No automatic retry on validation failure (magic-byte mismatch,
21
+ * pixel-cap exceeded). Print a clear error + remediation hint.
22
+ */
23
+ import { Command } from 'commander';
24
+ export declare function registerUploadCommand(parent: Command): void;
25
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA+M3D"}
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ /**
3
+ * `fias-dev assets upload <dir>` — bulk-upload images.
4
+ *
5
+ * Walks <dir> for png / jpeg / webp files. For each:
6
+ * 1. Read bytes; compute SHA-256 locally.
7
+ * 2. Skip if a prior run already finalized this exact (relativePath,
8
+ * sizeBytes, sha256) — keyed by all three for false-positive-proof
9
+ * resume.
10
+ * 3. Local fail-fast on > 50 MB to spare a server round-trip.
11
+ * 4. POST upload-init → 3-step server flow.
12
+ * 5. PUT bytes to S3.
13
+ * 6. POST finalize.
14
+ * 7. Append a {status: 'finalized'|'failed', ...} row to the
15
+ * append-only resume log.
16
+ *
17
+ * Concurrency: bounded pool of 4 by default. Subdirectory name
18
+ * becomes default tag unless `--tag` overrides; multiple `--tag`
19
+ * flags additively apply.
20
+ *
21
+ * No automatic retry on validation failure (magic-byte mismatch,
22
+ * pixel-cap exceeded). Print a clear error + remediation hint.
23
+ */
24
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ var desc = Object.getOwnPropertyDescriptor(m, k);
27
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
28
+ desc = { enumerable: true, get: function() { return m[k]; } };
29
+ }
30
+ Object.defineProperty(o, k2, desc);
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar = (this && this.__importStar) || (function () {
41
+ var ownKeys = function(o) {
42
+ ownKeys = Object.getOwnPropertyNames || function (o) {
43
+ var ar = [];
44
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
45
+ return ar;
46
+ };
47
+ return ownKeys(o);
48
+ };
49
+ return function (mod) {
50
+ if (mod && mod.__esModule) return mod;
51
+ var result = {};
52
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
53
+ __setModuleDefault(result, mod);
54
+ return result;
55
+ };
56
+ })();
57
+ var __importDefault = (this && this.__importDefault) || function (mod) {
58
+ return (mod && mod.__esModule) ? mod : { "default": mod };
59
+ };
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ exports.registerUploadCommand = registerUploadCommand;
62
+ const chalk_1 = __importDefault(require("chalk"));
63
+ const fs = __importStar(require("fs"));
64
+ const path = __importStar(require("path"));
65
+ const crypto = __importStar(require("crypto"));
66
+ const credentials_1 = require("../../config/credentials");
67
+ const config_loader_1 = require("../../config/config-loader");
68
+ const api_1 = require("./api");
69
+ const arche_resolver_1 = require("./arche-resolver");
70
+ const enable_1 = require("./enable");
71
+ const ACCEPTED_EXTS = new Set(['.png', '.jpg', '.jpeg', '.webp']);
72
+ const EXT_TO_CT = {
73
+ '.png': 'image/png',
74
+ '.jpg': 'image/jpeg',
75
+ '.jpeg': 'image/jpeg',
76
+ '.webp': 'image/webp',
77
+ };
78
+ const MAX_UPLOAD_BYTES = 50 * 1024 * 1024;
79
+ function collect(value, previous = []) {
80
+ return previous.concat([value]);
81
+ }
82
+ function walk(root, files = []) {
83
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
84
+ if (entry.name.startsWith('.'))
85
+ continue; // skip dotfiles + .fias dir
86
+ const full = path.join(root, entry.name);
87
+ if (entry.isDirectory()) {
88
+ walk(full, files);
89
+ }
90
+ else if (entry.isFile()) {
91
+ const ext = path.extname(entry.name).toLowerCase();
92
+ if (ACCEPTED_EXTS.has(ext))
93
+ files.push(full);
94
+ }
95
+ }
96
+ return files;
97
+ }
98
+ function sha256(b) {
99
+ return crypto.createHash('sha256').update(b).digest('hex');
100
+ }
101
+ function resumeLogPath(cwd, env, archeId) {
102
+ return path.join(cwd, '.fias', env, `upload-state.${archeId}.jsonl`);
103
+ }
104
+ function loadResumeLog(file) {
105
+ const out = new Map();
106
+ if (!fs.existsSync(file))
107
+ return out;
108
+ const lines = fs.readFileSync(file, 'utf-8').split('\n');
109
+ for (const line of lines) {
110
+ if (!line.trim())
111
+ continue;
112
+ try {
113
+ const r = JSON.parse(line);
114
+ // Triple-key: path + size + sha. False skips impossible — even
115
+ // if the contributor swapped a file for a same-named one with
116
+ // different bytes, the size or sha will differ and we re-upload.
117
+ out.set(`${r.path}::${r.sizeBytes}::${r.sha256}`, r);
118
+ }
119
+ catch {
120
+ // Skip malformed lines.
121
+ }
122
+ }
123
+ return out;
124
+ }
125
+ function appendResumeRow(file, row) {
126
+ fs.mkdirSync(path.dirname(file), { recursive: true });
127
+ fs.appendFileSync(file, JSON.stringify(row) + '\n');
128
+ }
129
+ function registerUploadCommand(parent) {
130
+ parent
131
+ .command('upload <dir>')
132
+ .description('Bulk-upload images from <dir> (subfolder name → default tag)')
133
+ .option('--env <environment>', 'staging | prod | local', 'staging')
134
+ .option('--arche-id <archeId>', 'Explicit arche ID')
135
+ .option('--tag <tag>', 'Tag to apply (repeatable). Without this flag, immediate parent dir name is used.', collect, [])
136
+ .option('--concurrency <n>', 'In-flight uploads (1..16)', '4')
137
+ .option('--dry-run', 'Plan and print without making API calls')
138
+ .action(async (dir, options) => {
139
+ try {
140
+ const absDir = path.resolve(dir);
141
+ if (!fs.existsSync(absDir)) {
142
+ console.error(chalk_1.default.red(`Directory not found: ${absDir}`));
143
+ process.exit(api_1.EXIT_VALIDATION);
144
+ }
145
+ const env = (0, enable_1.normalizeAndAuth)(options.env);
146
+ const apiKey = options.dryRun ? 'DRY_RUN' : (0, credentials_1.loadAuthTokenForEnvironment)(env);
147
+ if (!apiKey && !options.dryRun)
148
+ (0, enable_1.authMissing)(env);
149
+ const client = (0, api_1.createAssetApiClient)({
150
+ apiUrl: config_loader_1.ENVIRONMENT_URLS[env].apiUrl,
151
+ apiKey: apiKey,
152
+ });
153
+ const archeId = options.dryRun
154
+ ? (options.archeId ?? '(would resolve from fias-plugin.json)')
155
+ : await (0, arche_resolver_1.resolveArcheId)({
156
+ cwd: process.cwd(),
157
+ env,
158
+ client,
159
+ explicit: options.archeId ?? null,
160
+ });
161
+ const files = walk(absDir);
162
+ if (files.length === 0) {
163
+ console.log(chalk_1.default.dim('No png / jpg / webp files found.'));
164
+ return;
165
+ }
166
+ const concurrency = Math.max(1, Math.min(16, parseInt(options.concurrency ?? '4', 10)));
167
+ const explicitTags = options.tag ?? [];
168
+ const resumeFile = options.dryRun ? '' : resumeLogPath(process.cwd(), env, archeId);
169
+ const resumeLog = options.dryRun ? new Map() : loadResumeLog(resumeFile);
170
+ let totalBytes = 0;
171
+ const planned = [];
172
+ for (const file of files) {
173
+ const relPath = path.relative(absDir, file);
174
+ const ext = path.extname(file).toLowerCase();
175
+ const stat = fs.statSync(file);
176
+ if (stat.size > MAX_UPLOAD_BYTES) {
177
+ console.log(chalk_1.default.yellow(`skip ${relPath} — ${(0, enable_1.formatBytes)(stat.size)} exceeds 50 MB upload cap`));
178
+ continue;
179
+ }
180
+ const buf = fs.readFileSync(file);
181
+ const hash = sha256(buf);
182
+ const key = `${relPath}::${stat.size}::${hash}`;
183
+ if (resumeLog.has(key) && resumeLog.get(key)?.status === 'finalized') {
184
+ // Already finalized in a prior run — skip silently.
185
+ continue;
186
+ }
187
+ // Default tag = immediate parent directory name (relative to
188
+ // <dir>); falls back to none if file is at the root.
189
+ const parentDir = path.dirname(relPath);
190
+ const dirTag = parentDir === '.' ? null : path.basename(parentDir);
191
+ const tags = explicitTags.length > 0 ? explicitTags : dirTag ? [dirTag] : [];
192
+ planned.push({
193
+ file,
194
+ relPath,
195
+ sizeBytes: stat.size,
196
+ contentType: EXT_TO_CT[ext],
197
+ tags,
198
+ name: path.basename(file),
199
+ sha256: hash,
200
+ });
201
+ totalBytes += stat.size;
202
+ }
203
+ console.log(chalk_1.default.bold(`${planned.length} file${planned.length === 1 ? '' : 's'} planned · ${(0, enable_1.formatBytes)(totalBytes)} total · concurrency ${concurrency}`));
204
+ if (planned.length === 0) {
205
+ console.log(chalk_1.default.dim('Nothing to upload (all files already finalized).'));
206
+ return;
207
+ }
208
+ if (options.dryRun) {
209
+ // Show first 10 files in the plan.
210
+ for (const p of planned.slice(0, 10)) {
211
+ console.log(chalk_1.default.dim(` ${p.relPath} ${(0, enable_1.formatBytes)(p.sizeBytes)} tags=[${p.tags.join(',')}]`));
212
+ }
213
+ if (planned.length > 10) {
214
+ console.log(chalk_1.default.dim(` ... and ${planned.length - 10} more`));
215
+ }
216
+ return;
217
+ }
218
+ // Bounded-concurrency runner. Sequential next-out-of-queue
219
+ // pattern. Each worker pulls from the shared array index.
220
+ let nextIndex = 0;
221
+ let charged = 0;
222
+ let failed = 0;
223
+ const startedAt = Date.now();
224
+ async function worker() {
225
+ for (;;) {
226
+ const i = nextIndex++;
227
+ if (i >= planned.length)
228
+ return;
229
+ const p = planned[i];
230
+ const buf = fs.readFileSync(p.file);
231
+ try {
232
+ const init = await client.postJson(`/contributor/arches/${archeId}/assets/upload-init`, {
233
+ contentType: p.contentType,
234
+ sizeBytes: p.sizeBytes,
235
+ name: p.name,
236
+ tags: p.tags,
237
+ });
238
+ await client.putBytes(init.uploadUrl, p.contentType, buf);
239
+ await client.postJson(`/contributor/arches/${archeId}/assets/${init.assetId}/finalize`, { name: p.name, tags: p.tags });
240
+ appendResumeRow(resumeFile, {
241
+ path: p.relPath,
242
+ sizeBytes: p.sizeBytes,
243
+ sha256: p.sha256,
244
+ status: 'finalized',
245
+ assetId: init.assetId,
246
+ finalizedAt: new Date().toISOString(),
247
+ });
248
+ charged += 1;
249
+ process.stdout.write(chalk_1.default.green(`✓ ${p.relPath} (${(0, enable_1.formatBytes)(p.sizeBytes)})\n`));
250
+ }
251
+ catch (err) {
252
+ failed += 1;
253
+ const msg = err instanceof api_1.AssetApiError ? `${err.code}: ${err.message}` : String(err);
254
+ appendResumeRow(resumeFile, {
255
+ path: p.relPath,
256
+ sizeBytes: p.sizeBytes,
257
+ sha256: p.sha256,
258
+ status: 'failed',
259
+ error: msg,
260
+ finalizedAt: new Date().toISOString(),
261
+ });
262
+ process.stdout.write(chalk_1.default.red(`✗ ${p.relPath} ${msg}\n`));
263
+ // Magic-byte / dimension-cap rejections: surface a
264
+ // remediation hint. No automatic retry — auto-correcting
265
+ // content types would mask malformed source assets.
266
+ if (err instanceof api_1.AssetApiError && err.status === 422) {
267
+ process.stdout.write(chalk_1.default.dim(' hint: file extension and bytes may disagree (e.g. .png with JPEG bytes). Re-export or rename.\n'));
268
+ }
269
+ if (err instanceof api_1.AssetApiError && err.status === 413) {
270
+ // Storage quota — abort the rest of the run early.
271
+ process.stdout.write(chalk_1.default.red('Storage quota exceeded — aborting remaining uploads.\n'));
272
+ nextIndex = planned.length; // stop the queue
273
+ }
274
+ }
275
+ }
276
+ }
277
+ await Promise.all(Array.from({ length: concurrency }, () => worker()));
278
+ const ms = Date.now() - startedAt;
279
+ console.log('');
280
+ console.log(chalk_1.default.bold(`Done — ${charged} uploaded · ${failed} failed · ${(ms / 1000).toFixed(1)}s elapsed`));
281
+ if (failed > 0)
282
+ process.exit(1);
283
+ }
284
+ catch (err) {
285
+ (0, enable_1.handleErr)(err);
286
+ }
287
+ });
288
+ }
289
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/cli/assets/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tests for the upload command's resume behavior + tag derivation.
3
+ *
4
+ * The full end-to-end CLI execution (commander wiring, file walk,
5
+ * concurrency) is covered by the manual staging smoke test in the
6
+ * plan. The unit tests here focus on the two pieces most likely to
7
+ * regress:
8
+ *
9
+ * 1. The resume log key — must be (relativePath, sizeBytes, sha256)
10
+ * so that swapping a same-named file with different bytes does
11
+ * NOT skip on a future run.
12
+ * 2. Subdirectory-as-default-tag logic.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=upload.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.test.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/upload.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}