obsidian-integration-testing 2.2.2 → 2.3.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/lib/cjs/exec.cjs +13 -2
- package/dist/lib/cjs/exec.d.cts +4 -0
- package/dist/lib/cjs/global-setup-core.cjs +28 -20
- package/dist/lib/cjs/index.cjs +2 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/log.cjs +11 -2
- package/dist/lib/cjs/transport-desktop-cli.cjs +21 -5
- package/dist/lib/cjs/transport-factory.cjs +314 -281
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +4 -0
- package/dist/lib/cjs/vitest/global-setup.cjs +15 -2
- package/dist/lib/cjs/vitest/typings.cjs +3 -1
- package/dist/lib/cjs/vitest/typings.d.cts +13 -2
- package/dist/lib/esm/exec.d.mts +4 -0
- package/dist/lib/esm/exec.mjs +13 -2
- package/dist/lib/esm/global-setup-core.mjs +28 -20
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +2 -1
- package/dist/lib/esm/log.mjs +11 -2
- package/dist/lib/esm/transport-desktop-cli.mjs +21 -5
- package/dist/lib/esm/transport-factory.mjs +315 -281
- package/dist/lib/esm/transport.d.mts +4 -0
- package/dist/lib/esm/vitest/global-setup.mjs +15 -2
- package/dist/lib/esm/vitest/typings.d.mts +13 -2
- package/dist/lib/esm/vitest/typings.mjs +3 -1
- package/dist/obsidian-integration-testing-2.3.0.tgz +0 -0
- package/package.json +1 -9
- package/dist/obsidian-integration-testing-2.2.2.tgz +0 -0
|
@@ -4,17 +4,30 @@ import {
|
|
|
4
4
|
coreSetup,
|
|
5
5
|
coreTeardown
|
|
6
6
|
} from "../global-setup-core.mjs";
|
|
7
|
+
import { log } from "../log.mjs";
|
|
8
|
+
import { serializeError } from "../serialize-error.mjs";
|
|
7
9
|
import { TempVault } from "../temp-vault.mjs";
|
|
8
10
|
setTransportOptionsResolver(() => inject("obsidianTransport"));
|
|
9
11
|
let setupResult;
|
|
10
12
|
function getTempVault() {
|
|
11
13
|
const tempVaultPath = inject("tempVaultPath");
|
|
14
|
+
const setupErrorMessage = inject("setupError");
|
|
15
|
+
if (setupErrorMessage) {
|
|
16
|
+
throw new Error(`Integration setup failed \u2014 cannot get temp vault: ${setupErrorMessage}`);
|
|
17
|
+
}
|
|
12
18
|
return new TempVault(tempVaultPath);
|
|
13
19
|
}
|
|
14
20
|
async function setup(project) {
|
|
15
21
|
const environmentOptions = project.config.environmentOptions;
|
|
16
22
|
const transportOptions = environmentOptions?.["obsidianTransport"];
|
|
17
|
-
|
|
23
|
+
const label = transportOptions?.type ?? "obsidian-cli";
|
|
24
|
+
try {
|
|
25
|
+
setupResult = await coreSetup({ transportOptions });
|
|
26
|
+
} catch (error) {
|
|
27
|
+
log(`[integration-setup:${label}] Setup failed (tests for this project will be skipped): ${serializeError(error)}`);
|
|
28
|
+
project.provide("setupError", serializeError(error));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
18
31
|
project.provide("obsidianTransport", setupResult.transportOptions);
|
|
19
32
|
project.provide("tempVaultPath", setupResult.tempVault.path);
|
|
20
33
|
}
|
|
@@ -26,4 +39,4 @@ export {
|
|
|
26
39
|
setup,
|
|
27
40
|
teardown
|
|
28
41
|
};
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7IHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlciB9IGZyb20gJy4uL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7XG4gIGNvcmVTZXR1cCxcbiAgY29yZVRlYXJkb3duXG59IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuLi9sb2cubWpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi4vc2VyaWFsaXplLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuLi90ZW1wLXZhdWx0Lm1qcyc7XG5cbnNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcigoKSA9PiBpbmplY3QoJ29ic2lkaWFuVHJhbnNwb3J0JykpO1xuXG5sZXQgc2V0dXBSZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFZhdWx0KCk6IFRlbXBWYXVsdCB7XG4gIGNvbnN0IHRlbXBWYXVsdFBhdGggPSBpbmplY3QoJ3RlbXBWYXVsdFBhdGgnKTtcbiAgY29uc3Qgc2V0dXBFcnJvck1lc3NhZ2UgPSBpbmplY3QoJ3NldHVwRXJyb3InKTtcbiAgaWYgKHNldHVwRXJyb3JNZXNzYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlZ3JhdGlvbiBzZXR1cCBmYWlsZWQgXHUyMDE0IGNhbm5vdCBnZXQgdGVtcCB2YXVsdDogJHtzZXR1cEVycm9yTWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gbmV3IFRlbXBWYXVsdCh0ZW1wVmF1bHRQYXRoKTtcbn1cblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGZ1bmN0aW9uLlxuICpcbiAqIENvcGllcyB0aGUgYnVpbHQgcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIGVuYWJsZXMgaXQgdmlhIHRoZSBPYnNpZGlhbiBDTEksXG4gKiBhbmQgcHJvdmlkZXMgYHRlbXBWYXVsdFBhdGhgIHRvIHRlc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0IC0gVGhlIFZpdGVzdCBwcm9qZWN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXAocHJvamVjdDogVGVzdFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zID0gcHJvamVjdC5jb25maWcuZW52aXJvbm1lbnRPcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gZW52aXJvbm1lbnRPcHRpb25zPy5bJ29ic2lkaWFuVHJhbnNwb3J0J10gYXMgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPz8gJ29ic2lkaWFuLWNsaSc7XG5cbiAgdHJ5IHtcbiAgICBzZXR1cFJlc3VsdCA9IGF3YWl0IGNvcmVTZXR1cCh7IHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLy8gQ2F0Y2ggc2V0dXAgZXJyb3JzIHNvIHRoYXQgb3RoZXIgcHJvamVjdHMnIHRlc3RzIGNhbiBzdGlsbCBydW4uXG4gICAgLy8gSW5kaXZpZHVhbCB0ZXN0cyBpbiB0aGlzIHByb2plY3Qgd2lsbCBmYWlsIHdpdGggdGhlIHN0b3JlZCBlcnJvclxuICAgIC8vIFdoZW4gdGhleSB0cnkgdG8gaW5qZWN0IHRoZSB0ZW1wIHZhdWx0IHBhdGguXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCAodGVzdHMgZm9yIHRoaXMgcHJvamVjdCB3aWxsIGJlIHNraXBwZWQpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICBwcm9qZWN0LnByb3ZpZGUoJ3NldHVwRXJyb3InLCBzZXJpYWxpemVFcnJvcihlcnJvcikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb2plY3QucHJvdmlkZSgnb2JzaWRpYW5UcmFuc3BvcnQnLCBzZXR1cFJlc3VsdC50cmFuc3BvcnRPcHRpb25zKTtcbiAgcHJvamVjdC5wcm92aWRlKCd0ZW1wVmF1bHRQYXRoJywgc2V0dXBSZXN1bHQudGVtcFZhdWx0LnBhdGgpO1xufVxuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgdGVhcmRvd24gZnVuY3Rpb24uXG4gKlxuICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNvcmVUZWFyZG93bihzZXR1cFJlc3VsdCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFhQSxTQUFTLGNBQWM7QUFLdkIsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFdBQVc7QUFDcEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxpQkFBaUI7QUFFMUIsNEJBQTRCLE1BQU0sT0FBTyxtQkFBbUIsQ0FBQztBQUU3RCxJQUFJO0FBT0csU0FBUyxlQUEwQjtBQUN4QyxRQUFNLGdCQUFnQixPQUFPLGVBQWU7QUFDNUMsUUFBTSxvQkFBb0IsT0FBTyxZQUFZO0FBQzdDLE1BQUksbUJBQW1CO0FBQ3JCLFVBQU0sSUFBSSxNQUFNLDBEQUFxRCxpQkFBaUIsRUFBRTtBQUFBLEVBQzFGO0FBQ0EsU0FBTyxJQUFJLFVBQVUsYUFBYTtBQUNwQztBQVVBLGVBQXNCLE1BQU0sU0FBcUM7QUFDL0QsUUFBTSxxQkFBcUIsUUFBUSxPQUFPO0FBQzFDLFFBQU0sbUJBQW1CLHFCQUFxQixtQkFBbUI7QUFDakUsUUFBTSxRQUFRLGtCQUFrQixRQUFRO0FBRXhDLE1BQUk7QUFDRixrQkFBYyxNQUFNLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQztBQUFBLEVBQ3BELFNBQVMsT0FBZ0I7QUFJdkIsUUFBSSxzQkFBc0IsS0FBSyw0REFBNEQsZUFBZSxLQUFLLENBQUMsRUFBRTtBQUNsSCxZQUFRLFFBQVEsY0FBYyxlQUFlLEtBQUssQ0FBQztBQUNuRDtBQUFBLEVBQ0Y7QUFFQSxVQUFRLFFBQVEscUJBQXFCLFlBQVksZ0JBQWdCO0FBQ2pFLFVBQVEsUUFBUSxpQkFBaUIsWUFBWSxVQUFVLElBQUk7QUFDN0Q7QUFPQSxlQUFzQixXQUEwQjtBQUM5QyxRQUFNLGFBQWEsV0FBVztBQUNoQzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -3,11 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Vitest module augmentation for `obsidian-integration-testing`.
|
|
5
5
|
*
|
|
6
|
-
* Automatically included
|
|
7
|
-
*
|
|
6
|
+
* Automatically included via a side-effect import in the main entry
|
|
7
|
+
* point, so consumers get these augmentations when importing from
|
|
8
|
+
* `obsidian-integration-testing`.
|
|
9
|
+
*
|
|
10
|
+
* Provides IntelliSense for `environmentOptions.obsidianTransport`
|
|
8
11
|
* and `inject('obsidianTransport')` / `inject('tempVaultPath')`.
|
|
9
12
|
*/
|
|
10
13
|
import type { ObsidianTransportOptions } from '../transport-options.mjs';
|
|
14
|
+
import 'vitest';
|
|
15
|
+
import 'vitest/node';
|
|
11
16
|
declare module 'vitest' {
|
|
12
17
|
interface ProvidedContext {
|
|
13
18
|
/**
|
|
@@ -15,6 +20,12 @@ declare module 'vitest' {
|
|
|
15
20
|
* `evalInObsidian` and other library functions via `inject()`.
|
|
16
21
|
*/
|
|
17
22
|
obsidianTransport?: ObsidianTransportOptions;
|
|
23
|
+
/**
|
|
24
|
+
* Serialized error message from global setup failure.
|
|
25
|
+
* Present only when setup failed — tests should check this
|
|
26
|
+
* before attempting to use the temp vault or transport.
|
|
27
|
+
*/
|
|
28
|
+
setupError?: string;
|
|
18
29
|
/**
|
|
19
30
|
* Path to the temporary vault created by the global setup.
|
|
20
31
|
*/
|
|
@@ -1 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import "vitest";
|
|
2
|
+
import "vitest/node";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC90eXBpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVml0ZXN0IG1vZHVsZSBhdWdtZW50YXRpb24gZm9yIGBvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nYC5cbiAqXG4gKiBBdXRvbWF0aWNhbGx5IGluY2x1ZGVkIHZpYSBhIHNpZGUtZWZmZWN0IGltcG9ydCBpbiB0aGUgbWFpbiBlbnRyeVxuICogcG9pbnQsIHNvIGNvbnN1bWVycyBnZXQgdGhlc2UgYXVnbWVudGF0aW9ucyB3aGVuIGltcG9ydGluZyBmcm9tXG4gKiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AuXG4gKlxuICogUHJvdmlkZXMgSW50ZWxsaVNlbnNlIGZvciBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YFxuICogYW5kIGBpbmplY3QoJ29ic2lkaWFuVHJhbnNwb3J0JylgIC8gYGluamVjdCgndGVtcFZhdWx0UGF0aCcpYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby11bmFzc2lnbmVkLWltcG9ydCAtLSBGb3JjZXMgbW9kdWxlIHJlc29sdXRpb24gc28gZGVjbGFyZSBtb2R1bGUgYXVnbWVudGF0aW9ucyBtZXJnZSBjb3JyZWN0bHkuXG5pbXBvcnQgJ3ZpdGVzdCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tdW5hc3NpZ25lZC1pbXBvcnQgLS0gRm9yY2VzIG1vZHVsZSByZXNvbHV0aW9uIHNvIGRlY2xhcmUgbW9kdWxlIGF1Z21lbnRhdGlvbnMgbWVyZ2UgY29ycmVjdGx5LlxuaW1wb3J0ICd2aXRlc3Qvbm9kZSc7XG5cbmRlY2xhcmUgbW9kdWxlICd2aXRlc3QnIHtcbiAgaW50ZXJmYWNlIFByb3ZpZGVkQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogVHJhbnNwb3J0IG9wdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cCwgY29uc3VtZWQgYnlcbiAgICAgKiBgZXZhbEluT2JzaWRpYW5gIGFuZCBvdGhlciBsaWJyYXJ5IGZ1bmN0aW9ucyB2aWEgYGluamVjdCgpYC5cbiAgICAgKi9cbiAgICBvYnNpZGlhblRyYW5zcG9ydD86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZWQgZXJyb3IgbWVzc2FnZSBmcm9tIGdsb2JhbCBzZXR1cCBmYWlsdXJlLlxuICAgICAqIFByZXNlbnQgb25seSB3aGVuIHNldHVwIGZhaWxlZCBcdTIwMTQgdGVzdHMgc2hvdWxkIGNoZWNrIHRoaXNcbiAgICAgKiBiZWZvcmUgYXR0ZW1wdGluZyB0byB1c2UgdGhlIHRlbXAgdmF1bHQgb3IgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIHNldHVwRXJyb3I/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQYXRoIHRvIHRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBieSB0aGUgZ2xvYmFsIHNldHVwLlxuICAgICAqL1xuICAgIHRlbXBWYXVsdFBhdGg6IHN0cmluZztcbiAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSAndml0ZXN0L25vZGUnIHtcbiAgaW50ZXJmYWNlIEVudmlyb25tZW50T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgdHJhbnNwb3J0IHVzZWQgYnkgYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgIHRvXG4gICAgICogY29tbXVuaWNhdGUgd2l0aCBhIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHRoZSBDTEkgdHJhbnNwb3J0IChgb2JzaWRpYW4tY2xpYCkuXG4gICAgICovXG4gICAgb2JzaWRpYW5UcmFuc3BvcnQ/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWdCQSxPQUFPO0FBRVAsT0FBTzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obsidian-integration-testing",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Simplifies integration testing of Obsidian plugins.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -52,14 +52,6 @@
|
|
|
52
52
|
"types": "./dist/lib/cjs/vitest/global-setup.d.cts",
|
|
53
53
|
"default": "./dist/lib/cjs/vitest/global-setup.cjs"
|
|
54
54
|
}
|
|
55
|
-
},
|
|
56
|
-
"./vitest-typings": {
|
|
57
|
-
"import": {
|
|
58
|
-
"types": "./dist/lib/esm/vitest/typings.d.mts"
|
|
59
|
-
},
|
|
60
|
-
"require": {
|
|
61
|
-
"types": "./dist/lib/cjs/vitest/typings.d.cts"
|
|
62
|
-
}
|
|
63
55
|
}
|
|
64
56
|
},
|
|
65
57
|
"files": [
|
|
Binary file
|