@canaryai/cli 0.2.5 → 0.2.7
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/{chunk-ILEPYWZX.js → chunk-A44B2PEA.js} +2 -2
- package/dist/chunk-P5Z2Y5VV.js +94 -0
- package/dist/chunk-P5Z2Y5VV.js.map +1 -0
- package/dist/chunk-RL5Y6V3C.js +46918 -0
- package/dist/chunk-RL5Y6V3C.js.map +1 -0
- package/dist/{chunk-FIQBGAKW.js → chunk-TEHABH2E.js} +4 -4
- package/dist/{chunk-FIQBGAKW.js.map → chunk-TEHABH2E.js.map} +1 -1
- package/dist/chunk-VKVL7WBN.js +50 -0
- package/dist/chunk-XAA5VQ5N.js +37 -0
- package/dist/chunk-XAA5VQ5N.js.map +1 -0
- package/dist/{debug-workflow-PT3OUR3V.js → debug-workflow-ZFRF3JMY.js} +6 -3
- package/dist/{debug-workflow-PT3OUR3V.js.map → debug-workflow-ZFRF3JMY.js.map} +1 -1
- package/dist/dist-5CSYV6PJ.js +336 -0
- package/dist/dist-5CSYV6PJ.js.map +1 -0
- package/dist/{docs-RUZXLATL.js → docs-RPFT7ZJB.js} +5 -3
- package/dist/{docs-RUZXLATL.js.map → docs-RPFT7ZJB.js.map} +1 -1
- package/dist/{feature-flag-S5B5GLPP.js → feature-flag-2FDSKOVX.js} +2 -2
- package/dist/index.js +110 -15
- package/dist/index.js.map +1 -1
- package/dist/{issues-4ZEDHPLW.js → issues-6ZDNDSD6.js} +2 -2
- package/dist/{knobs-RKUVK3HC.js → knobs-MZRTYS3P.js} +2 -2
- package/dist/{local-browser-J6WGFLVD.js → local-browser-I2ANCFFH.js} +6 -3
- package/dist/{local-browser-J6WGFLVD.js.map → local-browser-I2ANCFFH.js.map} +1 -1
- package/dist/{mcp-HGYBMDYZ.js → mcp-EOWUKFEB.js} +14 -13
- package/dist/mcp-EOWUKFEB.js.map +1 -0
- package/dist/pdf-extract-XYDS42VL.js +13 -0
- package/dist/pdf-extract-XYDS42VL.js.map +1 -0
- package/dist/pdfjs-HMUKB5WW.js +35243 -0
- package/dist/pdfjs-HMUKB5WW.js.map +1 -0
- package/dist/{psql-WVIHMC6A.js → psql-2YPIRMDY.js} +2 -2
- package/dist/{record-MMFESD4M.js → record-TSF726OB.js} +7 -5
- package/dist/record-TSF726OB.js.map +1 -0
- package/dist/{redis-RGHECKV5.js → redis-A7GWM23E.js} +2 -2
- package/dist/{release-ZOD4Y2BF.js → release-L4IXOHDF.js} +2 -2
- package/dist/runner/preload.js +2 -2
- package/dist/src-SCKO6YUB.js +146 -0
- package/dist/src-SCKO6YUB.js.map +1 -0
- package/dist/test.js +2 -2
- package/package.json +2 -3
- package/dist/chunk-VLFUCAPZ.js +0 -12
- package/dist/mcp-HGYBMDYZ.js.map +0 -1
- package/dist/record-MMFESD4M.js.map +0 -1
- /package/dist/{chunk-ILEPYWZX.js.map → chunk-A44B2PEA.js.map} +0 -0
- /package/dist/{chunk-VLFUCAPZ.js.map → chunk-VKVL7WBN.js.map} +0 -0
- /package/dist/{feature-flag-S5B5GLPP.js.map → feature-flag-2FDSKOVX.js.map} +0 -0
- /package/dist/{issues-4ZEDHPLW.js.map → issues-6ZDNDSD6.js.map} +0 -0
- /package/dist/{knobs-RKUVK3HC.js.map → knobs-MZRTYS3P.js.map} +0 -0
- /package/dist/{psql-WVIHMC6A.js.map → psql-2YPIRMDY.js.map} +0 -0
- /package/dist/{redis-RGHECKV5.js.map → redis-A7GWM23E.js.map} +0 -0
- /package/dist/{release-ZOD4Y2BF.js.map → release-L4IXOHDF.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -17,9 +17,12 @@ import {
|
|
|
17
17
|
resolveConfig,
|
|
18
18
|
saveAuth
|
|
19
19
|
} from "./chunk-PWWQGYFG.js";
|
|
20
|
+
import {
|
|
21
|
+
makeTempDirSync
|
|
22
|
+
} from "./chunk-XAA5VQ5N.js";
|
|
20
23
|
import {
|
|
21
24
|
__require
|
|
22
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-VKVL7WBN.js";
|
|
23
26
|
|
|
24
27
|
// src/index.ts
|
|
25
28
|
import { spawnSync as spawnSync2 } from "child_process";
|
|
@@ -120,7 +123,6 @@ import { spawn } from "child_process";
|
|
|
120
123
|
import fs2 from "fs";
|
|
121
124
|
import path2 from "path";
|
|
122
125
|
import { fileURLToPath } from "url";
|
|
123
|
-
import { makeTempDirSync } from "@chatsdet/tmp";
|
|
124
126
|
async function run(request = {}) {
|
|
125
127
|
const cwd = request.projectRoot ?? process.cwd();
|
|
126
128
|
const stdio = request.stdio ?? "inherit";
|
|
@@ -634,11 +636,84 @@ function formatFailedTests(failedTests, appUrl) {
|
|
|
634
636
|
}
|
|
635
637
|
return lines.join("\n");
|
|
636
638
|
}
|
|
639
|
+
var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
640
|
+
async function resolveTestConfig(apiUrl, token, propertyArg, environmentArg) {
|
|
641
|
+
if (!propertyArg && !environmentArg) return {};
|
|
642
|
+
const res = await fetch(`${apiUrl}/workflows/test-config`, {
|
|
643
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
644
|
+
});
|
|
645
|
+
if (!res.ok) {
|
|
646
|
+
const text = await res.text();
|
|
647
|
+
throw new Error(`Failed to fetch test config: ${res.status} ${text}`);
|
|
648
|
+
}
|
|
649
|
+
const data = await res.json();
|
|
650
|
+
if (!data.ok || !data.properties) {
|
|
651
|
+
throw new Error(`Failed to fetch test config: ${data.error ?? "Unknown error"}`);
|
|
652
|
+
}
|
|
653
|
+
const { properties } = data;
|
|
654
|
+
let property;
|
|
655
|
+
if (propertyArg) {
|
|
656
|
+
if (UUID_RE.test(propertyArg)) {
|
|
657
|
+
property = properties.find((p) => p.id === propertyArg);
|
|
658
|
+
} else {
|
|
659
|
+
property = properties.find(
|
|
660
|
+
(p) => p.name.toLowerCase() === propertyArg.toLowerCase()
|
|
661
|
+
);
|
|
662
|
+
}
|
|
663
|
+
if (!property) {
|
|
664
|
+
const available = properties.map((p) => ` - ${p.name} (${p.id})`).join("\n");
|
|
665
|
+
throw new Error(
|
|
666
|
+
`Property "${propertyArg}" not found.
|
|
667
|
+
Available properties:
|
|
668
|
+
${available}`
|
|
669
|
+
);
|
|
670
|
+
}
|
|
671
|
+
} else if (environmentArg) {
|
|
672
|
+
if (properties.length === 0) {
|
|
673
|
+
throw new Error("No properties found in your organization.");
|
|
674
|
+
}
|
|
675
|
+
if (properties.length > 1) {
|
|
676
|
+
const available = properties.map((p) => ` - ${p.name} (${p.id})`).join("\n");
|
|
677
|
+
throw new Error(
|
|
678
|
+
`--environment requires --property when multiple properties exist.
|
|
679
|
+
Available properties:
|
|
680
|
+
${available}`
|
|
681
|
+
);
|
|
682
|
+
}
|
|
683
|
+
property = properties[0];
|
|
684
|
+
}
|
|
685
|
+
const result = {};
|
|
686
|
+
if (property) {
|
|
687
|
+
result.propertyId = property.id;
|
|
688
|
+
if (environmentArg) {
|
|
689
|
+
let env;
|
|
690
|
+
if (UUID_RE.test(environmentArg)) {
|
|
691
|
+
env = property.environments.find((e) => e.id === environmentArg);
|
|
692
|
+
} else {
|
|
693
|
+
env = property.environments.find(
|
|
694
|
+
(e) => e.name.toLowerCase() === environmentArg.toLowerCase()
|
|
695
|
+
);
|
|
696
|
+
}
|
|
697
|
+
if (!env) {
|
|
698
|
+
const available = property.environments.map((e) => ` - ${e.name}${e.isDefault ? " (default)" : ""} (${e.id})`).join("\n");
|
|
699
|
+
throw new Error(
|
|
700
|
+
`Environment "${environmentArg}" not found for property "${property.name}".
|
|
701
|
+
Available environments:
|
|
702
|
+
${available}`
|
|
703
|
+
);
|
|
704
|
+
}
|
|
705
|
+
result.environmentId = env.id;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
return result;
|
|
709
|
+
}
|
|
637
710
|
async function runRemoteTest(argv) {
|
|
638
711
|
const apiUrl = getArgValue3(argv, "--api-url") ?? process5.env.CANARY_API_URL ?? "https://api.trycanary.ai";
|
|
639
712
|
const token = getArgValue3(argv, "--token") ?? process5.env.CANARY_API_TOKEN ?? await readStoredToken();
|
|
640
713
|
const tag = getArgValue3(argv, "--tag");
|
|
641
714
|
const namePattern = getArgValue3(argv, "--name-pattern");
|
|
715
|
+
const propertyArg = getArgValue3(argv, "--property");
|
|
716
|
+
const environmentArg = getArgValue3(argv, "--environment");
|
|
642
717
|
const verbose = hasFlag2(argv, "--verbose", "-v");
|
|
643
718
|
if (!token) {
|
|
644
719
|
console.error("Error: No API token found.");
|
|
@@ -650,7 +725,18 @@ async function runRemoteTest(argv) {
|
|
|
650
725
|
console.error(" canary test --remote --token cnry_...");
|
|
651
726
|
process5.exit(1);
|
|
652
727
|
}
|
|
728
|
+
let resolvedConfig = {};
|
|
729
|
+
if (propertyArg || environmentArg) {
|
|
730
|
+
try {
|
|
731
|
+
resolvedConfig = await resolveTestConfig(apiUrl, token, propertyArg, environmentArg);
|
|
732
|
+
} catch (err) {
|
|
733
|
+
console.error(`${err instanceof Error ? err.message : String(err)}`);
|
|
734
|
+
process5.exit(1);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
653
737
|
console.log("Starting remote workflow tests...");
|
|
738
|
+
if (resolvedConfig.propertyId) console.log(` Property: ${propertyArg}`);
|
|
739
|
+
if (resolvedConfig.environmentId) console.log(` Environment: ${environmentArg}`);
|
|
654
740
|
if (tag) console.log(` Filtering by tag: ${tag}`);
|
|
655
741
|
if (namePattern) console.log(` Filtering by name pattern: ${namePattern}`);
|
|
656
742
|
console.log("");
|
|
@@ -658,6 +744,9 @@ async function runRemoteTest(argv) {
|
|
|
658
744
|
if (tag) queryParams.set("tag", tag);
|
|
659
745
|
if (namePattern) queryParams.set("namePattern", namePattern);
|
|
660
746
|
const triggerUrl = `${apiUrl}/workflows/test-runs${queryParams.toString() ? `?${queryParams}` : ""}`;
|
|
747
|
+
const body = {};
|
|
748
|
+
if (resolvedConfig.propertyId) body.propertyId = resolvedConfig.propertyId;
|
|
749
|
+
if (resolvedConfig.environmentId) body.environmentId = resolvedConfig.environmentId;
|
|
661
750
|
let triggerRes;
|
|
662
751
|
try {
|
|
663
752
|
triggerRes = await fetch(triggerUrl, {
|
|
@@ -665,7 +754,8 @@ async function runRemoteTest(argv) {
|
|
|
665
754
|
headers: {
|
|
666
755
|
Authorization: `Bearer ${token}`,
|
|
667
756
|
"Content-Type": "application/json"
|
|
668
|
-
}
|
|
757
|
+
},
|
|
758
|
+
body: JSON.stringify(body)
|
|
669
759
|
});
|
|
670
760
|
} catch (err) {
|
|
671
761
|
console.error(`Failed to connect to API: ${err}`);
|
|
@@ -910,10 +1000,10 @@ function isSuperadminToken(token) {
|
|
|
910
1000
|
// src/index.ts
|
|
911
1001
|
var require2 = createRequire2(import.meta.url);
|
|
912
1002
|
var pkg = require2("../package.json");
|
|
913
|
-
var loadMcp = () => import("./mcp-
|
|
914
|
-
var loadLocalBrowser = () => import("./local-browser-
|
|
915
|
-
var loadDebugWorkflow = () => import("./debug-workflow-
|
|
916
|
-
var loadRecord = () => import("./record-
|
|
1003
|
+
var loadMcp = () => import("./mcp-EOWUKFEB.js").then((m) => m.runMcp);
|
|
1004
|
+
var loadLocalBrowser = () => import("./local-browser-I2ANCFFH.js").then((m) => m.runLocalBrowser);
|
|
1005
|
+
var loadDebugWorkflow = () => import("./debug-workflow-ZFRF3JMY.js").then((m) => m.runDebugWorkflow);
|
|
1006
|
+
var loadRecord = () => import("./record-TSF726OB.js").then((m) => m.runRecord);
|
|
917
1007
|
var canary = { run };
|
|
918
1008
|
var baseDir = typeof __dirname !== "undefined" ? __dirname : path4.dirname(fileURLToPath2(import.meta.url));
|
|
919
1009
|
var preloadPath = path4.join(baseDir, "runner", "preload.js");
|
|
@@ -980,6 +1070,8 @@ function printHelp({ isSuperadmin }) {
|
|
|
980
1070
|
"Remote test options:",
|
|
981
1071
|
" --token <key> API key (or set CANARY_API_TOKEN)",
|
|
982
1072
|
" --api-url <url> API URL (default: https://api.trycanary.ai)",
|
|
1073
|
+
" --property <name|id> Target a specific property",
|
|
1074
|
+
" --environment <name|id> Target a specific environment",
|
|
983
1075
|
" --tag <tag> Filter workflows by tag",
|
|
984
1076
|
" --name-pattern <pat> Filter workflows by name pattern",
|
|
985
1077
|
" --verbose, -v Show all events",
|
|
@@ -1094,6 +1186,8 @@ function printTestHelp() {
|
|
|
1094
1186
|
" --remote Run tests remotely (required)",
|
|
1095
1187
|
" --token <key> API key (or set CANARY_API_TOKEN)",
|
|
1096
1188
|
" --api-url <url> API URL (default: https://api.trycanary.ai)",
|
|
1189
|
+
" --property <name|id> Target a specific property",
|
|
1190
|
+
" --environment <name|id> Target a specific environment",
|
|
1097
1191
|
" --tag <tag> Filter workflows by tag",
|
|
1098
1192
|
" --name-pattern <pat> Filter workflows by name pattern",
|
|
1099
1193
|
" --verbose, -v Show all events",
|
|
@@ -1102,7 +1196,8 @@ function printTestHelp() {
|
|
|
1102
1196
|
" canary test Run all local tests",
|
|
1103
1197
|
' canary test --grep "login" Run tests matching "login"',
|
|
1104
1198
|
" canary test --headed --workers 1 Debug with visible browser",
|
|
1105
|
-
" canary test --remote --tag smoke Run remote smoke tests"
|
|
1199
|
+
" canary test --remote --tag smoke Run remote smoke tests",
|
|
1200
|
+
' canary test --remote --property "My App" --environment staging'
|
|
1106
1201
|
].join("\n")
|
|
1107
1202
|
);
|
|
1108
1203
|
}
|
|
@@ -1190,37 +1285,37 @@ async function main(argv) {
|
|
|
1190
1285
|
return;
|
|
1191
1286
|
}
|
|
1192
1287
|
if (command === "psql") {
|
|
1193
|
-
const { runPsql } = await import("./psql-
|
|
1288
|
+
const { runPsql } = await import("./psql-2YPIRMDY.js");
|
|
1194
1289
|
await runPsql(rest);
|
|
1195
1290
|
return;
|
|
1196
1291
|
}
|
|
1197
1292
|
if (command === "redis") {
|
|
1198
|
-
const { runRedis } = await import("./redis-
|
|
1293
|
+
const { runRedis } = await import("./redis-A7GWM23E.js");
|
|
1199
1294
|
await runRedis(rest);
|
|
1200
1295
|
return;
|
|
1201
1296
|
}
|
|
1202
1297
|
if (command === "release") {
|
|
1203
|
-
const { runRelease } = await import("./release-
|
|
1298
|
+
const { runRelease } = await import("./release-L4IXOHDF.js");
|
|
1204
1299
|
await runRelease(rest);
|
|
1205
1300
|
return;
|
|
1206
1301
|
}
|
|
1207
1302
|
if (command === "docs") {
|
|
1208
|
-
const { runDocs } = await import("./docs-
|
|
1303
|
+
const { runDocs } = await import("./docs-RPFT7ZJB.js");
|
|
1209
1304
|
await runDocs(rest);
|
|
1210
1305
|
return;
|
|
1211
1306
|
}
|
|
1212
1307
|
if (command === "feature-flag") {
|
|
1213
|
-
const { runFeatureFlag } = await import("./feature-flag-
|
|
1308
|
+
const { runFeatureFlag } = await import("./feature-flag-2FDSKOVX.js");
|
|
1214
1309
|
await runFeatureFlag(rest);
|
|
1215
1310
|
return;
|
|
1216
1311
|
}
|
|
1217
1312
|
if (command === "knobs") {
|
|
1218
|
-
const { runKnobs } = await import("./knobs-
|
|
1313
|
+
const { runKnobs } = await import("./knobs-MZRTYS3P.js");
|
|
1219
1314
|
await runKnobs(rest);
|
|
1220
1315
|
return;
|
|
1221
1316
|
}
|
|
1222
1317
|
if (command === "issues") {
|
|
1223
|
-
const { runIssues } = await import("./issues-
|
|
1318
|
+
const { runIssues } = await import("./issues-6ZDNDSD6.js");
|
|
1224
1319
|
await runIssues(rest);
|
|
1225
1320
|
return;
|
|
1226
1321
|
}
|