@zukhruf/testing 0.3.2 → 0.3.4
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/README.md +4 -6
- package/dist/databases/mysql-family-server.d.ts +24 -0
- package/dist/databases/mysql-family-server.d.ts.map +1 -0
- package/dist/databases/mysql-family-server.js +125 -0
- package/dist/databases/mysql-family-server.js.map +1 -0
- package/dist/databases/mysql.d.ts +12 -14
- package/dist/databases/mysql.d.ts.map +1 -1
- package/dist/databases/mysql.js +9 -113
- package/dist/databases/mysql.js.map +1 -1
- package/dist/docker/host.d.ts.map +1 -1
- package/dist/docker/host.js +4 -2
- package/dist/docker/host.js.map +1 -1
- package/package.json +1 -4
package/README.md
CHANGED
|
@@ -22,11 +22,9 @@ Each area has its own import path, so a test loads only the drivers it uses. The
|
|
|
22
22
|
| `@zukhruf/testing/http` | `HttpServer` | |
|
|
23
23
|
| `@zukhruf/testing/streams` | `StreamHarness` | |
|
|
24
24
|
|
|
25
|
-
It needs Node.js 24.4 or later.
|
|
26
|
-
|
|
27
25
|
## Docker
|
|
28
26
|
|
|
29
|
-
A `Docker` is the engine the Docker CLI selects. It resolves the engine once, on first use, and every handle it returns keeps that engine. It supports local Unix sockets and SSH engines (`ssh://`)
|
|
27
|
+
A `Docker` is the engine the Docker CLI selects. It resolves the engine once, on first use, and every handle it returns keeps that engine. It supports local Unix sockets, Docker Desktop's named pipe on Windows (`npipe://`), and SSH engines (`ssh://`). On Windows, volumes and containers are tested; `directory()` is not.
|
|
30
28
|
|
|
31
29
|
```ts
|
|
32
30
|
import { Docker, TestRun, skipWithoutDocker } from '@zukhruf/testing/docker';
|
|
@@ -37,14 +35,14 @@ const skip = await skipWithoutDocker(docker, process.env);
|
|
|
37
35
|
test('a holder in another container', { skip }, async () => {
|
|
38
36
|
await using volume = await docker.volume();
|
|
39
37
|
await using holder = await docker.start({
|
|
40
|
-
image: 'node:
|
|
38
|
+
image: 'node:lts-alpine',
|
|
41
39
|
hostname: 'app',
|
|
42
40
|
mounts: [{ source: volume.name, target: '/locks' }],
|
|
43
41
|
command: ['node', '--eval', 'setInterval(() => {}, 1000)'],
|
|
44
42
|
});
|
|
45
43
|
await holder.kill();
|
|
46
44
|
const output = await docker.run({
|
|
47
|
-
image: 'node:
|
|
45
|
+
image: 'node:lts-alpine',
|
|
48
46
|
mounts: [{ source: volume.name, target: '/locks', readOnly: true }],
|
|
49
47
|
command: ['ls', '/locks'],
|
|
50
48
|
});
|
|
@@ -143,4 +141,4 @@ npx nx run testing:test # builds, then runs the tests
|
|
|
143
141
|
npx nx run testing:typecheck # formats, lints, then type checks
|
|
144
142
|
```
|
|
145
143
|
|
|
146
|
-
The Docker-backed tests follow `ZUKHRUF_TESTING_DOCKER`. CI skips them on every operating system, and `.github/workflows/docker.yml` runs them
|
|
144
|
+
The Docker-backed tests follow `ZUKHRUF_TESTING_DOCKER`. CI skips them on every operating system, and `.github/workflows/docker.yml` runs them with `required` when this package changes: on Linux, and on Windows through Docker Desktop for the mutex's container tests.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Database, DatabaseOptions } from './database.ts';
|
|
2
|
+
export interface MysqlFamilyDatabase extends Database {
|
|
3
|
+
query: (sql: string) => Promise<Record<string, string | null>[]>;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* A template method for servers that speak MySQL's protocol and client flags:
|
|
7
|
+
* acquisitions, readiness, queries and the batch parser stay the same. A
|
|
8
|
+
* subclass names the client in its image, the connection string's scheme and
|
|
9
|
+
* the environment, and passes its default image to this constructor.
|
|
10
|
+
*/
|
|
11
|
+
export declare abstract class MysqlFamilyServer {
|
|
12
|
+
#private;
|
|
13
|
+
protected abstract readonly client: string;
|
|
14
|
+
protected abstract readonly scheme: string;
|
|
15
|
+
protected abstract environment(password: string, database: string): Record<string, string>;
|
|
16
|
+
constructor({ docker, image, password, database, labels, }: DatabaseOptions & {
|
|
17
|
+
image: string;
|
|
18
|
+
});
|
|
19
|
+
/** Create an isolated database on the persistent shared server. */
|
|
20
|
+
database(): Promise<MysqlFamilyDatabase>;
|
|
21
|
+
/** Start a dedicated server; the returned handle owns its container. */
|
|
22
|
+
start(): Promise<MysqlFamilyDatabase>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=mysql-family-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-family-server.d.ts","sourceRoot":"","sources":["../../src/databases/mysql-family-server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;CAClE;AAKD;;;;;GAKG;AACH,8BAAsB,iBAAiB;;IAIrC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEb,EACV,MAAM,EACN,KAAK,EACL,QAAyB,EACzB,QAAgB,EAChB,MAAM,GACP,EAAE,eAAe,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IAKtC,mEAAmE;IAC7D,QAAQ,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAoB9C,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC;CA6G5C"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { timebox } from "../async/timebox.js";
|
|
3
|
+
/** The image creates only root, from the root password in its environment. */
|
|
4
|
+
const user = 'root';
|
|
5
|
+
/**
|
|
6
|
+
* A template method for servers that speak MySQL's protocol and client flags:
|
|
7
|
+
* acquisitions, readiness, queries and the batch parser stay the same. A
|
|
8
|
+
* subclass names the client in its image, the connection string's scheme and
|
|
9
|
+
* the environment, and passes its default image to this constructor.
|
|
10
|
+
*/
|
|
11
|
+
export class MysqlFamilyServer {
|
|
12
|
+
#docker;
|
|
13
|
+
#options;
|
|
14
|
+
constructor({ docker, image, password = 'testpassword', database = 'app', labels, }) {
|
|
15
|
+
this.#docker = docker;
|
|
16
|
+
this.#options = { image, password, database, labels };
|
|
17
|
+
}
|
|
18
|
+
/** Create an isolated database on the persistent shared server. */
|
|
19
|
+
async database() {
|
|
20
|
+
const container = await this.#acquire('app', 'reuse');
|
|
21
|
+
const database = `test_${randomUUID().replaceAll('-', '')}`;
|
|
22
|
+
try {
|
|
23
|
+
await this.#sql(container, `CREATE DATABASE \`${database}\``);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
await container.disconnect();
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
return this.#handle(container, database, async () => {
|
|
30
|
+
await this.#sql(container, `DROP DATABASE IF EXISTS \`${database}\``).catch(() => {
|
|
31
|
+
/* Best-effort cleanup after external removal. */
|
|
32
|
+
});
|
|
33
|
+
await container.disconnect();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Start a dedicated server; the returned handle owns its container. */
|
|
37
|
+
async start() {
|
|
38
|
+
const { database } = this.#options;
|
|
39
|
+
const container = await this.#acquire(database, 'serve');
|
|
40
|
+
return this.#handle(container, database, () => container.cleanup());
|
|
41
|
+
}
|
|
42
|
+
#sql(container, sql) {
|
|
43
|
+
const { password } = this.#options;
|
|
44
|
+
return container.exec([
|
|
45
|
+
this.client,
|
|
46
|
+
`-u${user}`,
|
|
47
|
+
`-p${password}`,
|
|
48
|
+
'--execute',
|
|
49
|
+
sql,
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
async #query(container, database, sql) {
|
|
53
|
+
const { password } = this.#options;
|
|
54
|
+
const { stdout } = await container.exec([
|
|
55
|
+
this.client,
|
|
56
|
+
`-u${user}`,
|
|
57
|
+
`-p${password}`,
|
|
58
|
+
'--database',
|
|
59
|
+
database,
|
|
60
|
+
'--batch',
|
|
61
|
+
'--raw',
|
|
62
|
+
'--execute',
|
|
63
|
+
sql,
|
|
64
|
+
]);
|
|
65
|
+
return this.#parseBatch(stdout);
|
|
66
|
+
}
|
|
67
|
+
#parseBatch(stdout) {
|
|
68
|
+
const [headerLine, ...rows] = stdout.trimEnd().split('\n').filter(Boolean);
|
|
69
|
+
if (headerLine === undefined)
|
|
70
|
+
return [];
|
|
71
|
+
const headers = headerLine.split('\t');
|
|
72
|
+
return rows.map((line) => {
|
|
73
|
+
const values = line.split('\t');
|
|
74
|
+
return Object.fromEntries(headers.map((header, index) => {
|
|
75
|
+
const value = values[index];
|
|
76
|
+
return [
|
|
77
|
+
header,
|
|
78
|
+
value === undefined || value === 'NULL' ? null : value,
|
|
79
|
+
];
|
|
80
|
+
}));
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
#acquire(database, mode) {
|
|
84
|
+
const { image, password, labels } = this.#options;
|
|
85
|
+
return this.#docker[mode]({
|
|
86
|
+
image,
|
|
87
|
+
labels,
|
|
88
|
+
internalPort: 3306,
|
|
89
|
+
env: this.environment(password, database),
|
|
90
|
+
tmpfs: ['/var/lib/mysql:rw,size=512m'],
|
|
91
|
+
memorySwappiness: 0,
|
|
92
|
+
healthy: (container) => this.#ready(container),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
#ready(container) {
|
|
96
|
+
const { password } = this.#options;
|
|
97
|
+
// TCP excludes the entrypoint's temporary, socket-only initialization server.
|
|
98
|
+
return timebox(() => container.exec([
|
|
99
|
+
this.client,
|
|
100
|
+
'-h',
|
|
101
|
+
'127.0.0.1',
|
|
102
|
+
`-u${user}`,
|
|
103
|
+
`-p${password}`,
|
|
104
|
+
'--execute',
|
|
105
|
+
'SELECT 1',
|
|
106
|
+
]), { maxRetryTime: 90_000 });
|
|
107
|
+
}
|
|
108
|
+
#handle(container, database, cleanup) {
|
|
109
|
+
const { image, password } = this.#options;
|
|
110
|
+
return {
|
|
111
|
+
connectionString: `${this.scheme}://${user}:${password}@${container.host}:${container.port}/${database}`,
|
|
112
|
+
image,
|
|
113
|
+
user,
|
|
114
|
+
password,
|
|
115
|
+
database,
|
|
116
|
+
containerId: container.containerId,
|
|
117
|
+
host: container.host,
|
|
118
|
+
port: container.port,
|
|
119
|
+
query: (sql) => this.#query(container, database, sql),
|
|
120
|
+
cleanup,
|
|
121
|
+
[Symbol.asyncDispose]: cleanup,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=mysql-family-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-family-server.js","sourceRoot":"","sources":["../../src/databases/mysql-family-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DatabaseOptions } from './database.ts';
|
|
2
|
+
import { type MysqlFamilyDatabase, MysqlFamilyServer } from './mysql-family-server.ts';
|
|
2
3
|
export type { Database, DatabaseOptions } from './database.ts';
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
database(): Promise<MysqlDatabase>;
|
|
14
|
-
/** Start a dedicated server; the returned handle owns its container. */
|
|
15
|
-
start(): Promise<MysqlDatabase>;
|
|
4
|
+
export type MysqlOptions = DatabaseOptions;
|
|
5
|
+
export type MysqlDatabase = MysqlFamilyDatabase;
|
|
6
|
+
export declare class Mysql extends MysqlFamilyServer {
|
|
7
|
+
protected readonly client = "mysql";
|
|
8
|
+
protected readonly scheme = "mysql";
|
|
9
|
+
constructor({ image, ...options }: MysqlOptions);
|
|
10
|
+
protected environment(password: string, database: string): {
|
|
11
|
+
MYSQL_ROOT_PASSWORD: string;
|
|
12
|
+
MYSQL_DATABASE: string;
|
|
13
|
+
};
|
|
16
14
|
}
|
|
17
15
|
//# sourceMappingURL=mysql.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/databases/mysql.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/databases/mysql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,KAAK,mBAAmB,EACxB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG,eAAe,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEhD,qBAAa,KAAM,SAAQ,iBAAiB;IAC1C,mBAA4B,MAAM,WAAW;IAC7C,mBAA4B,MAAM,WAAW;gBAEjC,EAAE,KAAmB,EAAE,GAAG,OAAO,EAAE,EAAE,YAAY;cAI1C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;CAGlE"}
|
package/dist/databases/mysql.js
CHANGED
|
@@ -1,116 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/** Create an isolated database on the persistent shared server. */
|
|
11
|
-
async database() {
|
|
12
|
-
const container = await this.#acquire('app', 'reuse');
|
|
13
|
-
const database = `test_${randomUUID().replaceAll('-', '')}`;
|
|
14
|
-
try {
|
|
15
|
-
await this.#sql(container, `CREATE DATABASE \`${database}\``);
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
await container.disconnect();
|
|
19
|
-
throw error;
|
|
20
|
-
}
|
|
21
|
-
return this.#handle(container, database, async () => {
|
|
22
|
-
await this.#sql(container, `DROP DATABASE IF EXISTS \`${database}\``).catch(() => {
|
|
23
|
-
/* Best-effort cleanup after external removal. */
|
|
24
|
-
});
|
|
25
|
-
await container.disconnect();
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
/** Start a dedicated server; the returned handle owns its container. */
|
|
29
|
-
async start() {
|
|
30
|
-
const { database } = this.#options;
|
|
31
|
-
const container = await this.#acquire(database, 'serve');
|
|
32
|
-
return this.#handle(container, database, () => container.cleanup());
|
|
33
|
-
}
|
|
34
|
-
#sql(container, sql) {
|
|
35
|
-
const { user, password } = this.#options;
|
|
36
|
-
return container.exec([
|
|
37
|
-
'mysql',
|
|
38
|
-
`-u${user}`,
|
|
39
|
-
`-p${password}`,
|
|
40
|
-
'--execute',
|
|
41
|
-
sql,
|
|
42
|
-
]);
|
|
43
|
-
}
|
|
44
|
-
async #query(container, database, sql) {
|
|
45
|
-
const { user, password } = this.#options;
|
|
46
|
-
const { stdout } = await container.exec([
|
|
47
|
-
'mysql',
|
|
48
|
-
`-u${user}`,
|
|
49
|
-
`-p${password}`,
|
|
50
|
-
'--database',
|
|
51
|
-
database,
|
|
52
|
-
'--batch',
|
|
53
|
-
'--raw',
|
|
54
|
-
'--execute',
|
|
55
|
-
sql,
|
|
56
|
-
]);
|
|
57
|
-
return this.#parseBatch(stdout);
|
|
58
|
-
}
|
|
59
|
-
#parseBatch(stdout) {
|
|
60
|
-
const [headerLine, ...rows] = stdout.trimEnd().split('\n').filter(Boolean);
|
|
61
|
-
if (headerLine === undefined)
|
|
62
|
-
return [];
|
|
63
|
-
const headers = headerLine.split('\t');
|
|
64
|
-
return rows.map((line) => {
|
|
65
|
-
const values = line.split('\t');
|
|
66
|
-
return Object.fromEntries(headers.map((header, index) => {
|
|
67
|
-
const value = values[index];
|
|
68
|
-
return [
|
|
69
|
-
header,
|
|
70
|
-
value === undefined || value === 'NULL' ? null : value,
|
|
71
|
-
];
|
|
72
|
-
}));
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
#acquire(database, mode) {
|
|
76
|
-
const { image, password, labels } = this.#options;
|
|
77
|
-
return this.#docker[mode]({
|
|
78
|
-
image,
|
|
79
|
-
labels,
|
|
80
|
-
internalPort: 3306,
|
|
81
|
-
env: { MYSQL_ROOT_PASSWORD: password, MYSQL_DATABASE: database },
|
|
82
|
-
tmpfs: ['/var/lib/mysql:rw,size=512m'],
|
|
83
|
-
memorySwappiness: 0,
|
|
84
|
-
healthy: (container) => this.#ready(container),
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
#ready(container) {
|
|
88
|
-
const { user, password } = this.#options;
|
|
89
|
-
return timebox(() => container.exec([
|
|
90
|
-
'mysqladmin',
|
|
91
|
-
'ping',
|
|
92
|
-
'-h',
|
|
93
|
-
'127.0.0.1',
|
|
94
|
-
`-u${user}`,
|
|
95
|
-
`-p${password}`,
|
|
96
|
-
'--silent',
|
|
97
|
-
]), { maxRetryTime: 90_000 });
|
|
98
|
-
}
|
|
99
|
-
#handle(container, database, cleanup) {
|
|
100
|
-
const { image, user, password } = this.#options;
|
|
101
|
-
return {
|
|
102
|
-
connectionString: `mysql://${user}:${password}@${container.host}:${container.port}/${database}`,
|
|
103
|
-
image,
|
|
104
|
-
user,
|
|
105
|
-
password,
|
|
106
|
-
database,
|
|
107
|
-
containerId: container.containerId,
|
|
108
|
-
host: container.host,
|
|
109
|
-
port: container.port,
|
|
110
|
-
query: (sql) => this.#query(container, database, sql),
|
|
111
|
-
cleanup,
|
|
112
|
-
[Symbol.asyncDispose]: cleanup,
|
|
113
|
-
};
|
|
1
|
+
import { MysqlFamilyServer, } from "./mysql-family-server.js";
|
|
2
|
+
export class Mysql extends MysqlFamilyServer {
|
|
3
|
+
client = 'mysql';
|
|
4
|
+
scheme = 'mysql';
|
|
5
|
+
constructor({ image = 'mysql:lts', ...options }) {
|
|
6
|
+
super({ ...options, image });
|
|
7
|
+
}
|
|
8
|
+
environment(password, database) {
|
|
9
|
+
return { MYSQL_ROOT_PASSWORD: password, MYSQL_DATABASE: database };
|
|
114
10
|
}
|
|
115
11
|
}
|
|
116
12
|
//# sourceMappingURL=mysql.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/databases/mysql.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/databases/mysql.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAQlC,MAAM,OAAO,KAAM,SAAQ,iBAAiB;IACd,MAAM,GAAG,OAAO,CAAC;IACjB,MAAM,GAAG,OAAO,CAAC;IAE7C,YAAY,EAAE,KAAK,GAAG,WAAW,EAAE,GAAG,OAAO,EAAgB;QAC3D,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IAEkB,WAAW,CAAC,QAAgB,EAAE,QAAgB;QAC/D,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;IACrE,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/docker/host.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,eAAe,CAAC;AAE5D,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,KAAG,MACC,CAAC;
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/docker/host.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,eAAe,CAAC;AAE5D,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,KAAG,MACC,CAAC;AAKxC,qFAAqF;AACrF,qBAAa,UAAU;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,OAAO;WAIM,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAgB3C,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,QAAQ,CAAC,OAAO,GAAI,MAAM,MAAM,EAAE,qCAI7B;IAEL,OAAO,CAAC,OAAO,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE;IAqBzC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAO9B,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,GAAG,SAAS,GACvB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;CAuHzD"}
|
package/dist/docker/host.js
CHANGED
|
@@ -7,6 +7,8 @@ import command from 'nano-spawn';
|
|
|
7
7
|
import { timebox } from "../async/timebox.js";
|
|
8
8
|
import { forwardPrefix } from "./test-run.js";
|
|
9
9
|
export const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
|
|
10
|
+
/** Local Unix sockets, Docker Desktop's named pipe on Windows, and SSH engines. A `tcp://` engine may be on another machine. */
|
|
11
|
+
const supportedEndpoints = ['unix://', 'npipe://', 'ssh://'];
|
|
10
12
|
/** Resolve with the Docker CLI so its native context/environment precedence wins. */
|
|
11
13
|
export class DockerHost {
|
|
12
14
|
endpoint;
|
|
@@ -21,8 +23,8 @@ export class DockerHost {
|
|
|
21
23
|
'{{.Endpoints.docker.Host}}',
|
|
22
24
|
]);
|
|
23
25
|
const endpoint = stdout.trim();
|
|
24
|
-
if (!
|
|
25
|
-
throw new Error(`Unsupported Docker endpoint ${endpoint}; tests support
|
|
26
|
+
if (!supportedEndpoints.some((scheme) => endpoint.startsWith(scheme))) {
|
|
27
|
+
throw new Error(`Unsupported Docker endpoint ${endpoint}; tests support ${supportedEndpoints.join(', ')}`);
|
|
26
28
|
}
|
|
27
29
|
return new DockerHost(endpoint);
|
|
28
30
|
}
|
package/dist/docker/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/docker/host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAe,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAgB,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAExC,qFAAqF;AACrF,MAAM,OAAO,UAAU;IACZ,QAAQ,CAAS;IAE1B,YAAoB,QAAgB;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO;QAClB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;YACzC,SAAS;YACT,SAAS;YACT,UAAU;YACV,4BAA4B;SAC7B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/docker/host.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zukhruf/testing",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "Disposable fixtures for integration tests: Docker containers and database servers, SQLite and DuckDB databases, HTTP servers and streams. A supervisor removes what a killed test run left behind.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -23,9 +23,6 @@
|
|
|
23
23
|
"disposable"
|
|
24
24
|
],
|
|
25
25
|
"type": "module",
|
|
26
|
-
"engines": {
|
|
27
|
-
"node": ">=24.4.0"
|
|
28
|
-
},
|
|
29
26
|
"bin": {
|
|
30
27
|
"zukhruf-docker-tests": "./dist/scripts/run-docker-tests.js"
|
|
31
28
|
},
|