testblocks-agent 1.0.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/README.md +76 -0
- package/dist/__tests__/unit/client.test.d.ts +1 -0
- package/dist/__tests__/unit/client.test.js +429 -0
- package/dist/__tests__/unit/client.test.js.map +1 -0
- package/dist/__tests__/unit/config.test.d.ts +1 -0
- package/dist/__tests__/unit/config.test.js +387 -0
- package/dist/__tests__/unit/config.test.js.map +1 -0
- package/dist/__tests__/unit/executor.test.d.ts +1 -0
- package/dist/__tests__/unit/executor.test.js +1017 -0
- package/dist/__tests__/unit/executor.test.js.map +1 -0
- package/dist/__tests__/unit/index.test.d.ts +1 -0
- package/dist/__tests__/unit/index.test.js +406 -0
- package/dist/__tests__/unit/index.test.js.map +1 -0
- package/dist/client.d.ts +71 -0
- package/dist/client.js +66 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.js +96 -0
- package/dist/config.js.map +1 -0
- package/dist/executor.d.ts +36 -0
- package/dist/executor.js +375 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +151 -0
- package/dist/index.js.map +1 -0
- package/package.json +44 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ensurePlaywright = ensurePlaywright;
|
|
38
|
+
const config_1 = require("./config");
|
|
39
|
+
const client_1 = require("./client");
|
|
40
|
+
const executor_1 = require("./executor");
|
|
41
|
+
const POLL_INTERVAL = 3000; // 3 seconds
|
|
42
|
+
async function ensurePlaywright() {
|
|
43
|
+
const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
44
|
+
try {
|
|
45
|
+
execSync('npx playwright --version', { stdio: 'ignore' });
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
console.log('Playwright not found. Installing...');
|
|
49
|
+
execSync('npm install @playwright/test', { stdio: 'inherit' });
|
|
50
|
+
}
|
|
51
|
+
// Check if browser binaries are installed
|
|
52
|
+
try {
|
|
53
|
+
const result = execSync('npx playwright install --dry-run chromium 2>&1', { encoding: 'utf-8' });
|
|
54
|
+
// If dry-run shows browsers need installing, or if the command isn't supported, try launching
|
|
55
|
+
if (result.includes('browser') || result.includes('install')) {
|
|
56
|
+
throw new Error('need install');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Browser binaries not installed or dry-run not supported — install them
|
|
61
|
+
console.log('Installing Chromium browser (first-time setup, ~130MB)...');
|
|
62
|
+
execSync('npx playwright install chromium', { stdio: 'inherit' });
|
|
63
|
+
console.log('Chromium installed successfully.');
|
|
64
|
+
console.log('');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function main() {
|
|
68
|
+
console.log('TestBlocks Agent v1.0.0');
|
|
69
|
+
console.log('');
|
|
70
|
+
// Handle `testblocks-agent config` subcommand
|
|
71
|
+
if ((0, config_1.isConfigCommand)()) {
|
|
72
|
+
(0, config_1.handleConfigCommand)();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Check for help flag
|
|
76
|
+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
77
|
+
console.log('Usage: testblocks-agent --server <url> --token <token>');
|
|
78
|
+
console.log('');
|
|
79
|
+
console.log('Options:');
|
|
80
|
+
console.log(' --server, -s <url> TestBlocks server URL');
|
|
81
|
+
console.log(' --token, -t <token> Agent token (tbat_...)');
|
|
82
|
+
console.log(' --project, -p <id> Project ID (optional, derived from token)');
|
|
83
|
+
console.log(' --help, -h Show this help');
|
|
84
|
+
console.log('');
|
|
85
|
+
console.log('Subcommands:');
|
|
86
|
+
console.log(' config Save configuration to ~/.testblocks/agent.json');
|
|
87
|
+
console.log('');
|
|
88
|
+
console.log('Environment variables:');
|
|
89
|
+
console.log(' TESTBLOCKS_SERVER Server URL');
|
|
90
|
+
console.log(' TESTBLOCKS_TOKEN Agent token');
|
|
91
|
+
console.log(' TESTBLOCKS_PROJECT Project ID (optional)');
|
|
92
|
+
console.log('');
|
|
93
|
+
console.log('Quick start:');
|
|
94
|
+
console.log(' npx testblocks-agent --server https://api.testblocks.io --token tbat_...');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const config = (0, config_1.loadConfig)();
|
|
98
|
+
const client = new client_1.AgentClient(config);
|
|
99
|
+
// Validate token
|
|
100
|
+
console.log(`Connecting to ${config.serverUrl}...`);
|
|
101
|
+
try {
|
|
102
|
+
const validation = await client.validate();
|
|
103
|
+
console.log(`Authenticated. Project: "${validation.projectName}"`);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
console.error('Failed to connect:', err instanceof Error ? err.message : err);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
// Ensure Playwright + browser binaries are installed
|
|
110
|
+
await ensurePlaywright();
|
|
111
|
+
console.log('Listening for test jobs... (Ctrl+C to stop)');
|
|
112
|
+
console.log('');
|
|
113
|
+
// Handle graceful shutdown
|
|
114
|
+
let running = true;
|
|
115
|
+
let currentExecution = null;
|
|
116
|
+
const shutdown = () => {
|
|
117
|
+
console.log('\nShutting down...');
|
|
118
|
+
running = false;
|
|
119
|
+
// If executing a job, it will handle its own cleanup
|
|
120
|
+
};
|
|
121
|
+
process.on('SIGINT', shutdown);
|
|
122
|
+
process.on('SIGTERM', shutdown);
|
|
123
|
+
// Main poll loop
|
|
124
|
+
while (running) {
|
|
125
|
+
try {
|
|
126
|
+
const job = await client.poll();
|
|
127
|
+
if (job) {
|
|
128
|
+
console.log(`Received job: ${job.specs.length} test(s)`);
|
|
129
|
+
currentExecution = (0, executor_1.executeJob)(job, client);
|
|
130
|
+
await currentExecution;
|
|
131
|
+
currentExecution = null;
|
|
132
|
+
console.log('Job complete. Listening for more...');
|
|
133
|
+
console.log('');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
// Only log non-connection errors to avoid noise during server downtime
|
|
138
|
+
if (err instanceof Error && !err.message.includes('fetch failed') && !err.message.includes('ECONNREFUSED')) {
|
|
139
|
+
console.error('Poll error:', err.message);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (running) {
|
|
143
|
+
await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
main().catch((err) => {
|
|
148
|
+
console.error('Fatal error:', err);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "testblocks-agent",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "TestBlocks local agent — run Playwright tests on your machine",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"testblocks-agent": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"dev": "tsx src/index.ts",
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"start": "node dist/index.js",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:coverage": "vitest run --coverage"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"testblocks",
|
|
21
|
+
"testing",
|
|
22
|
+
"playwright",
|
|
23
|
+
"test-runner",
|
|
24
|
+
"e2e",
|
|
25
|
+
"automation"
|
|
26
|
+
],
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/automatewithalex/testblocks.git",
|
|
30
|
+
"directory": "agent"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@playwright/test": "^1.58.2",
|
|
35
|
+
"dotenv": "^17.3.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^25.4.0",
|
|
39
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
40
|
+
"tsx": "^4.21.0",
|
|
41
|
+
"typescript": "^5.9.3",
|
|
42
|
+
"vitest": "^4.0.18"
|
|
43
|
+
}
|
|
44
|
+
}
|