@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.
- package/dist/cli/assets/api.d.ts +53 -0
- package/dist/cli/assets/api.d.ts.map +1 -0
- package/dist/cli/assets/api.js +165 -0
- package/dist/cli/assets/api.js.map +1 -0
- package/dist/cli/assets/api.test.d.ts +2 -0
- package/dist/cli/assets/api.test.d.ts.map +1 -0
- package/dist/cli/assets/api.test.js +77 -0
- package/dist/cli/assets/api.test.js.map +1 -0
- package/dist/cli/assets/arche-resolver.d.ts +24 -0
- package/dist/cli/assets/arche-resolver.d.ts.map +1 -0
- package/dist/cli/assets/arche-resolver.js +114 -0
- package/dist/cli/assets/arche-resolver.js.map +1 -0
- package/dist/cli/assets/arche-resolver.test.d.ts +2 -0
- package/dist/cli/assets/arche-resolver.test.d.ts.map +1 -0
- package/dist/cli/assets/arche-resolver.test.js +108 -0
- package/dist/cli/assets/arche-resolver.test.js.map +1 -0
- package/dist/cli/assets/commands.test.d.ts +8 -0
- package/dist/cli/assets/commands.test.d.ts.map +1 -0
- package/dist/cli/assets/commands.test.js +158 -0
- package/dist/cli/assets/commands.test.js.map +1 -0
- package/dist/cli/assets/delete.d.ts +3 -0
- package/dist/cli/assets/delete.d.ts.map +1 -0
- package/dist/cli/assets/delete.js +104 -0
- package/dist/cli/assets/delete.js.map +1 -0
- package/dist/cli/assets/disable.d.ts +3 -0
- package/dist/cli/assets/disable.d.ts.map +1 -0
- package/dist/cli/assets/disable.js +101 -0
- package/dist/cli/assets/disable.js.map +1 -0
- package/dist/cli/assets/enable.d.ts +8 -0
- package/dist/cli/assets/enable.d.ts.map +1 -0
- package/dist/cli/assets/enable.js +80 -0
- package/dist/cli/assets/enable.js.map +1 -0
- package/dist/cli/assets/index.d.ts +11 -0
- package/dist/cli/assets/index.d.ts.map +1 -0
- package/dist/cli/assets/index.js +31 -0
- package/dist/cli/assets/index.js.map +1 -0
- package/dist/cli/assets/list.d.ts +3 -0
- package/dist/cli/assets/list.d.ts.map +1 -0
- package/dist/cli/assets/list.js +80 -0
- package/dist/cli/assets/list.js.map +1 -0
- package/dist/cli/assets/status.d.ts +3 -0
- package/dist/cli/assets/status.d.ts.map +1 -0
- package/dist/cli/assets/status.js +75 -0
- package/dist/cli/assets/status.js.map +1 -0
- package/dist/cli/assets/tag.d.ts +3 -0
- package/dist/cli/assets/tag.d.ts.map +1 -0
- package/dist/cli/assets/tag.js +76 -0
- package/dist/cli/assets/tag.js.map +1 -0
- package/dist/cli/assets/upload.d.ts +25 -0
- package/dist/cli/assets/upload.d.ts.map +1 -0
- package/dist/cli/assets/upload.js +289 -0
- package/dist/cli/assets/upload.js.map +1 -0
- package/dist/cli/assets/upload.test.d.ts +15 -0
- package/dist/cli/assets/upload.test.d.ts.map +1 -0
- package/dist/cli/assets/upload.test.js +222 -0
- package/dist/cli/assets/upload.test.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.test.js +7 -2
- package/dist/cli/index.test.js.map +1 -1
- 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 @@
|
|
|
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":";;;;;AAsDA,sDA2EC;AAhID,kDAA0B;AAC1B,0DAAuE;AACvE,8DAA8D;AAC9D,+BAA6C;AAC7C,qDAAkD;AAClD,qCAAiF;AAgDjF,SAAgB,qBAAqB,CAAC,MAAe;IACnD,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,EAAE,SAAS,CAAC;SAClE,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAA,yBAAgB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAA,yCAA2B,EAAC,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM;gBAAE,IAAA,oBAAW,EAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAA,0BAAoB,EAAC;gBAClC,MAAM,EAAE,gCAAgB,CAAC,GAAG,CAAC,CAAC,MAAM;gBACpC,MAAM,EAAE,MAAO;aAChB,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,+BAAc,EAAC;gBACnC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;gBAClB,GAAG;gBACH,MAAM;gBACN,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;aAClC,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvC,MAAM,CAAC,OAAO,CAAiB,uBAAuB,OAAO,uBAAuB,CAAC;gBACrF,MAAM,CAAC,OAAO,CAAkB,uBAAuB,OAAO,kBAAkB,CAAC;aAClF,CAAC,CAAC;YAEH,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;YACrB,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAE1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW;gBAC9B,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,aAAa,IAAI,WAAW,GAAG,CAAC;gBAC5D,CAAC,CAAC,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,SAAS,CAAC;oBACxB,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;YAEzC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC;YACxC,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC;YAC5C,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5D,OAAO,CAAC,GAAG,CACT,eAAe,IAAA,oBAAW,EAAC,IAAI,CAAC,MAAM,IAAA,oBAAW,EAAC,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAC3K,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;gBACtB,OAAO,CAAC,GAAG,CACT,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,YAAY,EAAE,CACvJ,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC;YACxF,OAAO,CAAC,GAAG,CACT,cAAc,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CACpL,CAAC;YACF,OAAO,CAAC,GAAG,CACT,mBAAmB,CAAC,CAAC,WAAW,CAAC,WAAW,gBAAgB,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,CACvF,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CACT,cAAc,IAAA,oBAAW,EAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,qBAAqB,IAAA,oBAAW,EAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAClI,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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"}
|