@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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin HTTP client for the asset library routes.
|
|
3
|
+
*
|
|
4
|
+
* All routes live under `/v1/contributor/arches/:archeId/...` and
|
|
5
|
+
* accept either a session cookie or `Bearer fias_sk_*`. The CLI
|
|
6
|
+
* always uses the bearer key so we don't need cookie / CSRF
|
|
7
|
+
* handling.
|
|
8
|
+
*
|
|
9
|
+
* Errors surface as `AssetApiError` with the route response body
|
|
10
|
+
* (or a synthetic `{code, message}` for transport failures), so
|
|
11
|
+
* each command can map status / code to its CLI exit-code policy
|
|
12
|
+
* without re-parsing JSON.
|
|
13
|
+
*/
|
|
14
|
+
export declare class AssetApiError extends Error {
|
|
15
|
+
readonly status: number;
|
|
16
|
+
readonly code: string;
|
|
17
|
+
readonly details?: unknown | undefined;
|
|
18
|
+
constructor(status: number, code: string, message: string, details?: unknown | undefined);
|
|
19
|
+
}
|
|
20
|
+
export interface AssetApiClient {
|
|
21
|
+
/** Convenience: GET as JSON. */
|
|
22
|
+
getJson<T = unknown>(path: string): Promise<T>;
|
|
23
|
+
/** Convenience: POST as JSON. */
|
|
24
|
+
postJson<T = unknown>(path: string, body?: unknown): Promise<T>;
|
|
25
|
+
/** PATCH JSON. */
|
|
26
|
+
patchJson<T = unknown>(path: string, body?: unknown): Promise<T>;
|
|
27
|
+
/** PUT raw bytes (for the S3 step of the upload flow). */
|
|
28
|
+
putBytes(url: string, contentType: string, bytes: Buffer): Promise<void>;
|
|
29
|
+
/** Returns the configured base URL — useful for log messages. */
|
|
30
|
+
baseUrl(): string;
|
|
31
|
+
}
|
|
32
|
+
export declare function createAssetApiClient(input: {
|
|
33
|
+
apiUrl: string;
|
|
34
|
+
apiKey: string;
|
|
35
|
+
}): AssetApiClient;
|
|
36
|
+
export interface FiasPluginManifest {
|
|
37
|
+
name: string;
|
|
38
|
+
version: string;
|
|
39
|
+
permissions?: string[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reads `fias-plugin.json` from the cwd. Throws a friendly error
|
|
43
|
+
* message if absent or malformed — the CLI catches these and exits
|
|
44
|
+
* with the validation exit code.
|
|
45
|
+
*/
|
|
46
|
+
export declare function readPluginManifest(cwd?: string): FiasPluginManifest;
|
|
47
|
+
export declare const EXIT_GENERAL = 1;
|
|
48
|
+
export declare const EXIT_AUTH = 2;
|
|
49
|
+
export declare const EXIT_QUOTA_OR_BILLING = 3;
|
|
50
|
+
export declare const EXIT_VALIDATION = 4;
|
|
51
|
+
export declare const EXIT_NOT_FOUND = 5;
|
|
52
|
+
export declare function exitCodeForApiError(err: AssetApiError): number;
|
|
53
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,qBAAa,aAAc,SAAQ,KAAK;aAEpB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,OAAO;gBAHjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/C,iCAAiC;IACjC,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,kBAAkB;IAClB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjE,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,iEAAiE;IACjE,OAAO,IAAI,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CA6D9F;AAMD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAsB,GAAG,kBAAkB,CA2BlF;AAGD,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,SAAS,IAAI,CAAC;AAC3B,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAM9D"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Thin HTTP client for the asset library routes.
|
|
4
|
+
*
|
|
5
|
+
* All routes live under `/v1/contributor/arches/:archeId/...` and
|
|
6
|
+
* accept either a session cookie or `Bearer fias_sk_*`. The CLI
|
|
7
|
+
* always uses the bearer key so we don't need cookie / CSRF
|
|
8
|
+
* handling.
|
|
9
|
+
*
|
|
10
|
+
* Errors surface as `AssetApiError` with the route response body
|
|
11
|
+
* (or a synthetic `{code, message}` for transport failures), so
|
|
12
|
+
* each command can map status / code to its CLI exit-code policy
|
|
13
|
+
* without re-parsing JSON.
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.EXIT_NOT_FOUND = exports.EXIT_VALIDATION = exports.EXIT_QUOTA_OR_BILLING = exports.EXIT_AUTH = exports.EXIT_GENERAL = exports.AssetApiError = void 0;
|
|
50
|
+
exports.createAssetApiClient = createAssetApiClient;
|
|
51
|
+
exports.readPluginManifest = readPluginManifest;
|
|
52
|
+
exports.exitCodeForApiError = exitCodeForApiError;
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
class AssetApiError extends Error {
|
|
56
|
+
constructor(status, code, message, details) {
|
|
57
|
+
super(message);
|
|
58
|
+
this.status = status;
|
|
59
|
+
this.code = code;
|
|
60
|
+
this.details = details;
|
|
61
|
+
this.name = 'AssetApiError';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.AssetApiError = AssetApiError;
|
|
65
|
+
function createAssetApiClient(input) {
|
|
66
|
+
async function call(method, relPath, body) {
|
|
67
|
+
const res = await fetch(`${input.apiUrl}${relPath}`, {
|
|
68
|
+
method,
|
|
69
|
+
headers: {
|
|
70
|
+
Authorization: `Bearer ${input.apiKey}`,
|
|
71
|
+
'Content-Type': 'application/json',
|
|
72
|
+
},
|
|
73
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
74
|
+
});
|
|
75
|
+
const text = await res.text();
|
|
76
|
+
let parsed = undefined;
|
|
77
|
+
try {
|
|
78
|
+
parsed = text ? JSON.parse(text) : undefined;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
parsed = text;
|
|
82
|
+
}
|
|
83
|
+
if (!res.ok) {
|
|
84
|
+
const errBody = parsed
|
|
85
|
+
?.error;
|
|
86
|
+
throw new AssetApiError(res.status, errBody?.code ?? `HTTP_${res.status}`, errBody?.message ?? text ?? `HTTP ${res.status}`, errBody?.details);
|
|
87
|
+
}
|
|
88
|
+
return parsed;
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
getJson: (p) => call('GET', p),
|
|
92
|
+
postJson: (p, b) => call('POST', p, b),
|
|
93
|
+
patchJson: (p, b) => call('PATCH', p, b),
|
|
94
|
+
async putBytes(url, contentType, bytes) {
|
|
95
|
+
// Direct S3 PUT — no Authorization header (the URL is presigned).
|
|
96
|
+
// The runtime fetch accepts a Node Buffer as a body, but the
|
|
97
|
+
// `node` lib's BodyInit type doesn't include it; cast through
|
|
98
|
+
// Uint8Array (which IS a BodyInit) without copying.
|
|
99
|
+
const res = await fetch(url, {
|
|
100
|
+
method: 'PUT',
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': contentType,
|
|
103
|
+
'Content-Length': String(bytes.byteLength),
|
|
104
|
+
},
|
|
105
|
+
// Node's runtime fetch accepts a Buffer; the @types/node and
|
|
106
|
+
// root-tsconfig versions differ on whether Buffer is in
|
|
107
|
+
// BodyInit, so cast through unknown to satisfy both.
|
|
108
|
+
body: bytes,
|
|
109
|
+
});
|
|
110
|
+
if (!res.ok) {
|
|
111
|
+
const text = await res.text();
|
|
112
|
+
throw new AssetApiError(res.status, `S3_PUT_${res.status}`, text || `HTTP ${res.status}`);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
baseUrl: () => input.apiUrl,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Reads `fias-plugin.json` from the cwd. Throws a friendly error
|
|
120
|
+
* message if absent or malformed — the CLI catches these and exits
|
|
121
|
+
* with the validation exit code.
|
|
122
|
+
*/
|
|
123
|
+
function readPluginManifest(cwd = process.cwd()) {
|
|
124
|
+
const manifestPath = path.resolve(cwd, 'fias-plugin.json');
|
|
125
|
+
if (!fs.existsSync(manifestPath)) {
|
|
126
|
+
throw new Error(`fias-plugin.json not found in ${cwd}. Run from the root of your plugin project.`);
|
|
127
|
+
}
|
|
128
|
+
let raw;
|
|
129
|
+
try {
|
|
130
|
+
raw = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
throw new Error(`Failed to parse fias-plugin.json: ${err instanceof Error ? err.message : String(err)}`);
|
|
134
|
+
}
|
|
135
|
+
const m = raw;
|
|
136
|
+
if (typeof m.name !== 'string' || m.name.length === 0) {
|
|
137
|
+
throw new Error('fias-plugin.json: `name` is missing or invalid');
|
|
138
|
+
}
|
|
139
|
+
if (typeof m.version !== 'string' || m.version.length === 0) {
|
|
140
|
+
throw new Error('fias-plugin.json: `version` is missing or invalid');
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
name: m.name,
|
|
144
|
+
version: m.version,
|
|
145
|
+
permissions: Array.isArray(m.permissions) ? m.permissions : undefined,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// Stable CLI exit codes — referenced by individual command files.
|
|
149
|
+
exports.EXIT_GENERAL = 1;
|
|
150
|
+
exports.EXIT_AUTH = 2;
|
|
151
|
+
exports.EXIT_QUOTA_OR_BILLING = 3;
|
|
152
|
+
exports.EXIT_VALIDATION = 4;
|
|
153
|
+
exports.EXIT_NOT_FOUND = 5;
|
|
154
|
+
function exitCodeForApiError(err) {
|
|
155
|
+
if (err.status === 401 || err.status === 403)
|
|
156
|
+
return exports.EXIT_AUTH;
|
|
157
|
+
if (err.status === 404)
|
|
158
|
+
return exports.EXIT_NOT_FOUND;
|
|
159
|
+
if (err.status === 413 || err.status === 402)
|
|
160
|
+
return exports.EXIT_QUOTA_OR_BILLING;
|
|
161
|
+
if (err.status >= 400 && err.status < 500)
|
|
162
|
+
return exports.EXIT_VALIDATION;
|
|
163
|
+
return exports.EXIT_GENERAL;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/cli/assets/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/api.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const api_1 = require("./api");
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
describe('exitCodeForApiError', () => {
|
|
41
|
+
it('maps 401/403 → EXIT_AUTH', () => {
|
|
42
|
+
expect((0, api_1.exitCodeForApiError)(new api_1.AssetApiError(401, 'X', 'm'))).toBe(api_1.EXIT_AUTH);
|
|
43
|
+
expect((0, api_1.exitCodeForApiError)(new api_1.AssetApiError(403, 'X', 'm'))).toBe(api_1.EXIT_AUTH);
|
|
44
|
+
});
|
|
45
|
+
it('maps 404 → EXIT_NOT_FOUND', () => {
|
|
46
|
+
expect((0, api_1.exitCodeForApiError)(new api_1.AssetApiError(404, 'X', 'm'))).toBe(api_1.EXIT_NOT_FOUND);
|
|
47
|
+
});
|
|
48
|
+
it('maps 413 (quota) → EXIT_QUOTA_OR_BILLING', () => {
|
|
49
|
+
expect((0, api_1.exitCodeForApiError)(new api_1.AssetApiError(413, 'STORAGE_QUOTA_EXCEEDED', 'm'))).toBe(api_1.EXIT_QUOTA_OR_BILLING);
|
|
50
|
+
});
|
|
51
|
+
it('maps 4xx → EXIT_VALIDATION', () => {
|
|
52
|
+
expect((0, api_1.exitCodeForApiError)(new api_1.AssetApiError(422, 'BAD_BYTES', 'm'))).toBe(api_1.EXIT_VALIDATION);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('readPluginManifest', () => {
|
|
56
|
+
let tmp;
|
|
57
|
+
beforeEach(() => {
|
|
58
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'fias-cli-manifest-'));
|
|
59
|
+
});
|
|
60
|
+
afterEach(() => {
|
|
61
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
62
|
+
});
|
|
63
|
+
it('reads name + version from fias-plugin.json', () => {
|
|
64
|
+
fs.writeFileSync(path.join(tmp, 'fias-plugin.json'), JSON.stringify({ name: "Blackfish Children's Books", version: '1.2.4' }));
|
|
65
|
+
const m = (0, api_1.readPluginManifest)(tmp);
|
|
66
|
+
expect(m.name).toBe("Blackfish Children's Books");
|
|
67
|
+
expect(m.version).toBe('1.2.4');
|
|
68
|
+
});
|
|
69
|
+
it('throws a friendly error when manifest is absent', () => {
|
|
70
|
+
expect(() => (0, api_1.readPluginManifest)(tmp)).toThrow(/fias-plugin.json not found/);
|
|
71
|
+
});
|
|
72
|
+
it('throws when name is missing', () => {
|
|
73
|
+
fs.writeFileSync(path.join(tmp, 'fias-plugin.json'), JSON.stringify({ version: '1.0.0' }));
|
|
74
|
+
expect(() => (0, api_1.readPluginManifest)(tmp)).toThrow(/`name` is missing/);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../../src/cli/assets/api.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAQe;AACf,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAE7B,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,IAAA,yBAAmB,EAAC,IAAI,mBAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAS,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAA,yBAAmB,EAAC,IAAI,mBAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAS,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,IAAA,yBAAmB,EAAC,IAAI,mBAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAc,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,IAAA,yBAAmB,EAAC,IAAI,mBAAa,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CACrF,2BAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAA,yBAAmB,EAAC,IAAI,mBAAa,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAe,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,GAAW,CAAC;IAChB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAClC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CACzE,CAAC;QACF,MAAM,CAAC,GAAG,IAAA,wBAAkB,EAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAClD,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,wBAAkB,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3F,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,wBAAkB,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the contributor's arche ID for the current plugin
|
|
3
|
+
* directory. External contributors don't memorize arche_… ids;
|
|
4
|
+
* the CLI looks up by plugin name from `fias-plugin.json`.
|
|
5
|
+
*
|
|
6
|
+
* Resolution order:
|
|
7
|
+
* 1. Explicit `--arche-id` flag → return as-is. Required for CI.
|
|
8
|
+
* 2. Cache hit at `.fias/<env>/arche.json` (matched on plugin
|
|
9
|
+
* name) → return cached id without a network call.
|
|
10
|
+
* 3. `GET /v1/contributor/arches?limit=100`, find by exact
|
|
11
|
+
* `name` match. If multiple, prefer the most recent (status
|
|
12
|
+
* = published > draft, then highest version).
|
|
13
|
+
* 4. None found → throw a clear error directing the contributor
|
|
14
|
+
* to `fias-dev submit` (which creates the arche server-side).
|
|
15
|
+
*/
|
|
16
|
+
import { type Environment } from '../../config/credentials';
|
|
17
|
+
import { type AssetApiClient } from './api';
|
|
18
|
+
export declare function resolveArcheId(input: {
|
|
19
|
+
cwd: string;
|
|
20
|
+
env: Environment;
|
|
21
|
+
client: AssetApiClient;
|
|
22
|
+
explicit?: string | null;
|
|
23
|
+
}): Promise<string>;
|
|
24
|
+
//# sourceMappingURL=arche-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arche-resolver.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/arche-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAqChE,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CA8ClB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the contributor's arche ID for the current plugin
|
|
4
|
+
* directory. External contributors don't memorize arche_… ids;
|
|
5
|
+
* the CLI looks up by plugin name from `fias-plugin.json`.
|
|
6
|
+
*
|
|
7
|
+
* Resolution order:
|
|
8
|
+
* 1. Explicit `--arche-id` flag → return as-is. Required for CI.
|
|
9
|
+
* 2. Cache hit at `.fias/<env>/arche.json` (matched on plugin
|
|
10
|
+
* name) → return cached id without a network call.
|
|
11
|
+
* 3. `GET /v1/contributor/arches?limit=100`, find by exact
|
|
12
|
+
* `name` match. If multiple, prefer the most recent (status
|
|
13
|
+
* = published > draft, then highest version).
|
|
14
|
+
* 4. None found → throw a clear error directing the contributor
|
|
15
|
+
* to `fias-dev submit` (which creates the arche server-side).
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.resolveArcheId = resolveArcheId;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const api_1 = require("./api");
|
|
55
|
+
const CACHE_DIRNAME = '.fias';
|
|
56
|
+
function cacheFile(cwd, env) {
|
|
57
|
+
return path.join(cwd, CACHE_DIRNAME, env, 'arche.json');
|
|
58
|
+
}
|
|
59
|
+
function readCache(cwd, env) {
|
|
60
|
+
const file = cacheFile(cwd, env);
|
|
61
|
+
if (!fs.existsSync(file))
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function writeCache(cwd, env, rec) {
|
|
71
|
+
const file = cacheFile(cwd, env);
|
|
72
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
73
|
+
fs.writeFileSync(file, JSON.stringify(rec, null, 2));
|
|
74
|
+
}
|
|
75
|
+
async function resolveArcheId(input) {
|
|
76
|
+
if (input.explicit)
|
|
77
|
+
return input.explicit;
|
|
78
|
+
const manifest = (0, api_1.readPluginManifest)(input.cwd);
|
|
79
|
+
const cached = readCache(input.cwd, input.env);
|
|
80
|
+
if (cached && cached.pluginName === manifest.name)
|
|
81
|
+
return cached.archeId;
|
|
82
|
+
// Lookup via API. The contributor portal route returns an envelope
|
|
83
|
+
// with a `result` array (matches existing list-arches shape).
|
|
84
|
+
const response = await input.client.getJson('/contributor/arches?limit=100');
|
|
85
|
+
const list = response.result?.items ?? response.items ?? [];
|
|
86
|
+
const matches = list.filter((r) => r.name === manifest.name);
|
|
87
|
+
if (matches.length === 0) {
|
|
88
|
+
throw new Error([
|
|
89
|
+
`No arche named "${manifest.name}" found for the current contributor.`,
|
|
90
|
+
'',
|
|
91
|
+
'If this is a brand-new plugin, run `fias-dev submit` first to create',
|
|
92
|
+
'the arche row server-side. If your plugin has a different display name',
|
|
93
|
+
'in the marketplace, pass --arche-id <arche_id> explicitly.',
|
|
94
|
+
].join('\n'));
|
|
95
|
+
}
|
|
96
|
+
// Prefer published over draft, then most recent version. Falling
|
|
97
|
+
// back to the first match if status / version are absent keeps the
|
|
98
|
+
// resolver robust against partial responses.
|
|
99
|
+
const ranked = [...matches].sort((a, b) => {
|
|
100
|
+
const aPub = a.status === 'published' ? 1 : 0;
|
|
101
|
+
const bPub = b.status === 'published' ? 1 : 0;
|
|
102
|
+
if (aPub !== bPub)
|
|
103
|
+
return bPub - aPub;
|
|
104
|
+
return (b.version ?? '').localeCompare(a.version ?? '');
|
|
105
|
+
});
|
|
106
|
+
const chosen = ranked[0];
|
|
107
|
+
writeCache(input.cwd, input.env, {
|
|
108
|
+
pluginName: manifest.name,
|
|
109
|
+
archeId: chosen.archId,
|
|
110
|
+
resolvedAt: new Date().toISOString(),
|
|
111
|
+
});
|
|
112
|
+
return chosen.archId;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=arche-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arche-resolver.js","sourceRoot":"","sources":["../../../src/cli/assets/arche-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arche-resolver.test.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/arche-resolver.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const arche_resolver_1 = require("./arche-resolver");
|
|
40
|
+
function mockClient(items) {
|
|
41
|
+
const calls = [];
|
|
42
|
+
const client = {
|
|
43
|
+
async getJson(p) {
|
|
44
|
+
calls.push({ method: 'GET', path: p });
|
|
45
|
+
return { result: { items } };
|
|
46
|
+
},
|
|
47
|
+
async postJson() {
|
|
48
|
+
throw new Error('not used');
|
|
49
|
+
},
|
|
50
|
+
async patchJson() {
|
|
51
|
+
throw new Error('not used');
|
|
52
|
+
},
|
|
53
|
+
async putBytes() {
|
|
54
|
+
throw new Error('not used');
|
|
55
|
+
},
|
|
56
|
+
baseUrl: () => 'https://api.staging.fias.io/v1',
|
|
57
|
+
};
|
|
58
|
+
return Object.assign(client, { __calls: calls });
|
|
59
|
+
}
|
|
60
|
+
describe('resolveArcheId', () => {
|
|
61
|
+
let tmp;
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'fias-cli-resolver-'));
|
|
64
|
+
});
|
|
65
|
+
afterEach(() => {
|
|
66
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
67
|
+
});
|
|
68
|
+
it('returns the explicit --arche-id flag when provided (no API call)', async () => {
|
|
69
|
+
fs.writeFileSync(path.join(tmp, 'fias-plugin.json'), JSON.stringify({ name: 'Blackfish', version: '1.0.0' }));
|
|
70
|
+
const client = mockClient([]);
|
|
71
|
+
const id = await (0, arche_resolver_1.resolveArcheId)({
|
|
72
|
+
cwd: tmp,
|
|
73
|
+
env: 'staging',
|
|
74
|
+
client,
|
|
75
|
+
explicit: 'arc_explicit_override_0123456789abcdef',
|
|
76
|
+
});
|
|
77
|
+
expect(id).toBe('arc_explicit_override_0123456789abcdef');
|
|
78
|
+
expect(client.__calls).toHaveLength(0);
|
|
79
|
+
});
|
|
80
|
+
it('caches the resolved arche ID and returns it on the next call without an API hit', async () => {
|
|
81
|
+
fs.writeFileSync(path.join(tmp, 'fias-plugin.json'), JSON.stringify({ name: 'Blackfish', version: '1.0.0' }));
|
|
82
|
+
const client = mockClient([
|
|
83
|
+
{ archId: 'arc_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4', name: 'Blackfish' },
|
|
84
|
+
]);
|
|
85
|
+
const id1 = await (0, arche_resolver_1.resolveArcheId)({ cwd: tmp, env: 'staging', client });
|
|
86
|
+
expect(id1).toBe('arc_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4');
|
|
87
|
+
expect(client.__calls).toHaveLength(1);
|
|
88
|
+
const id2 = await (0, arche_resolver_1.resolveArcheId)({ cwd: tmp, env: 'staging', client });
|
|
89
|
+
expect(id2).toBe('arc_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4');
|
|
90
|
+
// Cache hit — no second API call.
|
|
91
|
+
expect(client.__calls).toHaveLength(1);
|
|
92
|
+
});
|
|
93
|
+
it('prefers published over draft when multiple matches exist', async () => {
|
|
94
|
+
fs.writeFileSync(path.join(tmp, 'fias-plugin.json'), JSON.stringify({ name: 'Blackfish', version: '1.0.0' }));
|
|
95
|
+
const client = mockClient([
|
|
96
|
+
{ archId: 'arc_draft00000000000000000000000000', name: 'Blackfish', status: 'draft' },
|
|
97
|
+
{ archId: 'arc_pub0000000000000000000000000000', name: 'Blackfish', status: 'published' },
|
|
98
|
+
]);
|
|
99
|
+
const id = await (0, arche_resolver_1.resolveArcheId)({ cwd: tmp, env: 'staging', client });
|
|
100
|
+
expect(id).toBe('arc_pub0000000000000000000000000000');
|
|
101
|
+
});
|
|
102
|
+
it('throws a clear error when no match exists', async () => {
|
|
103
|
+
fs.writeFileSync(path.join(tmp, 'fias-plugin.json'), JSON.stringify({ name: 'NoSuchPlugin', version: '1.0.0' }));
|
|
104
|
+
const client = mockClient([{ archId: 'arc_x', name: 'OtherPlugin' }]);
|
|
105
|
+
await expect((0, arche_resolver_1.resolveArcheId)({ cwd: tmp, env: 'staging', client })).rejects.toThrow(/No arche named "NoSuchPlugin"/);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=arche-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arche-resolver.test.js","sourceRoot":"","sources":["../../../src/cli/assets/arche-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smoke tests for the asset CLI commands. The full happy paths
|
|
3
|
+
* involve `fetch` against a live API and presigned S3 PUT — those
|
|
4
|
+
* land in the staging smoke test. These unit tests exercise the
|
|
5
|
+
* common branches (auth missing, env validation, registration).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=commands.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.test.d.ts","sourceRoot":"","sources":["../../../src/cli/assets/commands.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|