@openfn/cli 1.13.5 → 1.14.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/index.js CHANGED
@@ -487,6 +487,15 @@ var timeout = {
487
487
  default: 5 * 60 * 1e3
488
488
  }
489
489
  };
490
+ var trace = {
491
+ name: "trace",
492
+ yargs: {
493
+ boolean: true,
494
+ hidden: true,
495
+ description: "Show trace debugger output in the compiler",
496
+ default: false
497
+ }
498
+ };
490
499
  var useAdaptorsMonorepo = {
491
500
  name: "use-adaptors-monorepo",
492
501
  yargs: {
@@ -801,6 +810,7 @@ var options2 = [
801
810
  }),
802
811
  outputPath,
803
812
  repoDir,
813
+ trace,
804
814
  useAdaptorsMonorepo,
805
815
  workflow
806
816
  ];
@@ -889,6 +899,7 @@ var options5 = [
889
899
  statePath,
890
900
  stateStdin,
891
901
  timeout,
902
+ trace,
892
903
  useAdaptorsMonorepo
893
904
  ];
894
905
  var executeCommand = {
@@ -1041,9 +1052,20 @@ var command_default10 = {
1041
1052
  builder: (yargs2) => build(options8, yargs2).example("test", "Run the test script")
1042
1053
  };
1043
1054
 
1055
+ // src/projects/command.ts
1056
+ var options9 = [projectPath];
1057
+ var projectsCommand = {
1058
+ command: "projects [project-path]",
1059
+ describe: "List all the openfn projects available in the current directory",
1060
+ aliases: ["project"],
1061
+ handler: ensure("projects", options9),
1062
+ builder: (yargs2) => build(options9, yargs2)
1063
+ };
1064
+ var command_default11 = projectsCommand;
1065
+
1044
1066
  // src/cli.ts
1045
1067
  var y = yargs(hideBin(process.argv));
1046
- var cmd = y.command(command_default7).command(command_default3).command(command_default2).command(command_default4).command(install).command(repo).command(command_default10).command(command_default6).command(command_default).command(command_default8).command(command_default5).command(command_default9).command({
1068
+ var cmd = y.command(command_default7).command(command_default3).command(command_default2).command(command_default4).command(install).command(repo).command(command_default10).command(command_default6).command(command_default).command(command_default8).command(command_default5).command(command_default9).command(command_default11).command({
1047
1069
  command: "version",
1048
1070
  describe: "Show the currently installed version of the CLI, compiler and runtime.",
1049
1071
  handler: (argv) => {
@@ -127,14 +127,14 @@ var callApollo = async (apolloBaseUrl, serviceName, payload, logger) => {
127
127
  });
128
128
  });
129
129
  };
130
- var loadPayload = async (logger, path12) => {
131
- if (!path12) {
130
+ var loadPayload = async (logger, path13) => {
131
+ if (!path13) {
132
132
  logger.warn("No JSON payload provided");
133
133
  logger.warn("Most apollo services require JSON to be uploaded");
134
134
  return {};
135
135
  }
136
- if (path12.endsWith(".json")) {
137
- const str = await readFile(path12, "utf8");
136
+ if (path13.endsWith(".json")) {
137
+ const str = await readFile(path13, "utf8");
138
138
  const json = JSON.parse(str);
139
139
  logger.debug("Loaded JSON payload");
140
140
  return json;
@@ -256,13 +256,13 @@ var execute_default = async (plan, input, opts, logger) => {
256
256
  };
257
257
  function parseAdaptors(plan) {
258
258
  const extractInfo = (specifier) => {
259
- const [module, path12] = specifier.split("=");
259
+ const [module, path13] = specifier.split("=");
260
260
  const { name, version } = getNameAndVersion(module);
261
261
  const info = {
262
262
  name
263
263
  };
264
- if (path12) {
265
- info.path = path12;
264
+ if (path13) {
265
+ info.path = path13;
266
266
  }
267
267
  if (version) {
268
268
  info.version = version;
@@ -498,7 +498,8 @@ var compileWorkflow = async (plan, opts, log) => {
498
498
  const jobOpts = {
499
499
  ...opts,
500
500
  adaptors: job.adaptors ?? opts.adaptors,
501
- ignoreImports: globalsIgnoreList
501
+ ignoreImports: globalsIgnoreList,
502
+ trace: opts.trace
502
503
  };
503
504
  if (job.expression) {
504
505
  const { code, map } = await compileJob(
@@ -521,10 +522,10 @@ var stripVersionSpecifier = (specifier) => {
521
522
  return specifier;
522
523
  };
523
524
  var resolveSpecifierPath = async (pattern, repoDir, log) => {
524
- const [specifier, path12] = pattern.split("=");
525
- if (path12) {
526
- log.debug(`Resolved ${specifier} to path: ${path12}`);
527
- return path12;
525
+ const [specifier, path13] = pattern.split("=");
526
+ if (path13) {
527
+ log.debug(`Resolved ${specifier} to path: ${path13}`);
528
+ return path13;
528
529
  }
529
530
  const repoPath = await getModulePath(specifier, repoDir, log);
530
531
  if (repoPath) {
@@ -534,7 +535,8 @@ var resolveSpecifierPath = async (pattern, repoDir, log) => {
534
535
  };
535
536
  var loadTransformOptions = async (opts, log) => {
536
537
  const options = {
537
- logger: log || logger_default(COMPILER, opts)
538
+ logger: log || logger_default(COMPILER, opts),
539
+ trace: opts.trace
538
540
  };
539
541
  if (opts.adaptors?.length && opts.ignoreImports != true) {
540
542
  const adaptorsConfig = [];
@@ -542,12 +544,12 @@ var loadTransformOptions = async (opts, log) => {
542
544
  let exports;
543
545
  const [specifier] = adaptorInput.split("=");
544
546
  log.debug(`Trying to preload types for ${specifier}`);
545
- const path12 = await resolveSpecifierPath(adaptorInput, opts.repoDir, log);
546
- if (path12) {
547
+ const path13 = await resolveSpecifierPath(adaptorInput, opts.repoDir, log);
548
+ if (path13) {
547
549
  try {
548
- exports = await preloadAdaptorExports(path12, log);
550
+ exports = await preloadAdaptorExports(path13, log);
549
551
  } catch (e) {
550
- log.error(`Failed to load adaptor typedefs from path ${path12}`);
552
+ log.error(`Failed to load adaptor typedefs from path ${path13}`);
551
553
  log.error(e);
552
554
  }
553
555
  }
@@ -999,8 +1001,8 @@ var loadXPlan = async (plan, options, logger, defaultName = "") => {
999
1001
  };
1000
1002
 
1001
1003
  // src/util/assert-path.ts
1002
- var assert_path_default = (path12) => {
1003
- if (!path12) {
1004
+ var assert_path_default = (path13) => {
1005
+ if (!path13) {
1004
1006
  console.error("ERROR: no path provided!");
1005
1007
  console.error("\nUsage:");
1006
1008
  console.error(" open path/to/job");
@@ -1685,20 +1687,20 @@ var RETRY_COUNT = 20;
1685
1687
  var TIMEOUT_MS = 1e3 * 60;
1686
1688
  var actualDocGen = (specifier) => describePackage(specifier, {});
1687
1689
  var ensurePath = (filePath) => mkdirSync(path7.dirname(filePath), { recursive: true });
1688
- var generatePlaceholder = (path12) => {
1689
- writeFileSync(path12, `{ "loading": true, "timestamp": ${Date.now()}}`);
1690
+ var generatePlaceholder = (path13) => {
1691
+ writeFileSync(path13, `{ "loading": true, "timestamp": ${Date.now()}}`);
1690
1692
  };
1691
1693
  var finish = (logger, resultPath) => {
1692
1694
  logger.success("Done! Docs can be found at:\n");
1693
1695
  logger.print(` ${path7.resolve(resultPath)}`);
1694
1696
  };
1695
- var generateDocs = async (specifier, path12, docgen, logger) => {
1697
+ var generateDocs = async (specifier, path13, docgen, logger) => {
1696
1698
  const result = await docgen(specifier);
1697
- await writeFile5(path12, JSON.stringify(result, null, 2));
1698
- finish(logger, path12);
1699
- return path12;
1699
+ await writeFile5(path13, JSON.stringify(result, null, 2));
1700
+ finish(logger, path13);
1701
+ return path13;
1700
1702
  };
1701
- var waitForDocs = async (docs, path12, logger, retryDuration = RETRY_DURATION) => {
1703
+ var waitForDocs = async (docs, path13, logger, retryDuration = RETRY_DURATION) => {
1702
1704
  try {
1703
1705
  if (docs.hasOwnProperty("loading")) {
1704
1706
  logger.info("Docs are being loaded by another process. Waiting.");
@@ -1710,19 +1712,19 @@ var waitForDocs = async (docs, path12, logger, retryDuration = RETRY_DURATION) =
1710
1712
  clearInterval(i);
1711
1713
  reject(new Error("Timed out waiting for docs to load"));
1712
1714
  }
1713
- const updated = JSON.parse(readFileSync(path12, "utf8"));
1715
+ const updated = JSON.parse(readFileSync(path13, "utf8"));
1714
1716
  if (!updated.hasOwnProperty("loading")) {
1715
1717
  logger.info("Docs found!");
1716
1718
  clearInterval(i);
1717
- resolve(path12);
1719
+ resolve(path13);
1718
1720
  }
1719
1721
  count++;
1720
1722
  }, retryDuration);
1721
1723
  });
1722
1724
  } else {
1723
- logger.info(`Docs already written to cache at ${path12}`);
1724
- finish(logger, path12);
1725
- return path12;
1725
+ logger.info(`Docs already written to cache at ${path13}`);
1726
+ finish(logger, path13);
1727
+ return path13;
1726
1728
  }
1727
1729
  } catch (e) {
1728
1730
  logger.error("Existing doc JSON corrupt. Aborting");
@@ -1739,28 +1741,28 @@ var docgenHandler = (options, logger, docgen = actualDocGen, retryDuration = RET
1739
1741
  process.exit(9);
1740
1742
  }
1741
1743
  logger.success(`Generating docs for ${specifier}`);
1742
- const path12 = `${repoDir}/docs/${specifier}.json`;
1743
- ensurePath(path12);
1744
+ const path13 = `${repoDir}/docs/${specifier}.json`;
1745
+ ensurePath(path13);
1744
1746
  const handleError2 = () => {
1745
1747
  logger.info("Removing placeholder");
1746
- rmSync(path12);
1748
+ rmSync(path13);
1747
1749
  };
1748
1750
  try {
1749
- const existing = readFileSync(path12, "utf8");
1751
+ const existing = readFileSync(path13, "utf8");
1750
1752
  const json = JSON.parse(existing);
1751
1753
  if (json && json.timeout && Date.now() - json.timeout >= TIMEOUT_MS) {
1752
1754
  logger.info(`Expired placeholder found. Removing.`);
1753
- rmSync(path12);
1755
+ rmSync(path13);
1754
1756
  throw new Error("TIMEOUT");
1755
1757
  }
1756
- return waitForDocs(json, path12, logger, retryDuration);
1758
+ return waitForDocs(json, path13, logger, retryDuration);
1757
1759
  } catch (e) {
1758
1760
  if (e.message !== "TIMEOUT") {
1759
- logger.info(`Docs JSON not found at ${path12}`);
1761
+ logger.info(`Docs JSON not found at ${path13}`);
1760
1762
  }
1761
1763
  logger.debug("Generating placeholder");
1762
- generatePlaceholder(path12);
1763
- return generateDocs(specifier, path12, docgen, logger).catch((e2) => {
1764
+ generatePlaceholder(path13);
1765
+ return generateDocs(specifier, path13, docgen, logger).catch((e2) => {
1764
1766
  logger.error("Error generating documentation");
1765
1767
  logger.error(e2);
1766
1768
  handleError2();
@@ -1811,7 +1813,7 @@ var docsHandler = async (options, logger) => {
1811
1813
  logger.success(`Showing docs for ${adaptorName} v${version}`);
1812
1814
  }
1813
1815
  logger.info("Generating/loading documentation...");
1814
- const path12 = await handler_default7(
1816
+ const path13 = await handler_default7(
1815
1817
  {
1816
1818
  specifier: `${name}@${version}`,
1817
1819
  repoDir
@@ -1820,8 +1822,8 @@ var docsHandler = async (options, logger) => {
1820
1822
  createNullLogger()
1821
1823
  );
1822
1824
  let didError = false;
1823
- if (path12) {
1824
- const source = await readFile4(path12, "utf8");
1825
+ if (path13) {
1826
+ const source = await readFile4(path13, "utf8");
1825
1827
  const data = JSON.parse(source);
1826
1828
  let desc;
1827
1829
  if (operation) {
@@ -2267,9 +2269,33 @@ function pickFirst2(...args) {
2267
2269
  }
2268
2270
  var handler_default10 = pullHandler;
2269
2271
 
2272
+ // src/projects/handler.ts
2273
+ import { Workspace } from "@openfn/project";
2274
+ import path11 from "path";
2275
+ var projectsHandler = async (options, logger) => {
2276
+ const commandPath = path11.resolve(process.cwd(), options.projectPath ?? ".");
2277
+ const workspace = new Workspace(commandPath);
2278
+ if (!workspace.valid) {
2279
+ logger.error("Command was run in an invalid openfn workspace");
2280
+ return;
2281
+ }
2282
+ logger.success(`Available openfn projects
2283
+
2284
+ ${workspace.list().map((p) => describeProject(p, p.name === workspace.activeProjectId)).join("\n\n")}
2285
+ `);
2286
+ };
2287
+ function describeProject(project, active = false) {
2288
+ const pId = project.openfn?.uuid;
2289
+ return `${project.name} ${active ? "(active)" : ""}
2290
+ ${pId || "<project-id>"}
2291
+ workflows:
2292
+ ${project.workflows.map((w) => " - " + w.name).join("\n")}`;
2293
+ }
2294
+ var handler_default11 = projectsHandler;
2295
+
2270
2296
  // src/util/print-versions.ts
2271
2297
  import { readFileSync as readFileSync2 } from "node:fs";
2272
- import path11 from "node:path";
2298
+ import path12 from "node:path";
2273
2299
  import url from "node:url";
2274
2300
  import { getNameAndVersion as getNameAndVersion7 } from "@openfn/runtime";
2275
2301
  import { mainSymbols } from "figures";
@@ -2281,7 +2307,7 @@ var { triangleRightSmall: t } = mainSymbols;
2281
2307
  var loadVersionFromPath = (adaptorPath) => {
2282
2308
  try {
2283
2309
  const pkg = JSON.parse(
2284
- readFileSync2(path11.resolve(adaptorPath, "package.json"), "utf8")
2310
+ readFileSync2(path12.resolve(adaptorPath, "package.json"), "utf8")
2285
2311
  );
2286
2312
  return pkg.version;
2287
2313
  } catch (e) {
@@ -2316,7 +2342,7 @@ var printVersions = async (logger, options = {}, includeComponents = false) => {
2316
2342
  ...[NODE, CLI2, RUNTIME2, COMPILER2, longestAdaptorName].map((s) => s.length)
2317
2343
  );
2318
2344
  const prefix = (str) => ` ${t} ${str.padEnd(longest + 4, " ")}`;
2319
- const dirname3 = path11.dirname(url.fileURLToPath(import.meta.url));
2345
+ const dirname3 = path12.dirname(url.fileURLToPath(import.meta.url));
2320
2346
  const pkg = JSON.parse(readFileSync2(`${dirname3}/../../package.json`, "utf8"));
2321
2347
  const { version, dependencies } = pkg;
2322
2348
  const compilerVersion = dependencies["@openfn/compiler"];
@@ -2369,6 +2395,7 @@ var handlers = {
2369
2395
  docs: handler_default8,
2370
2396
  metadata: handler_default9,
2371
2397
  pull: handler_default10,
2398
+ projects: handler_default11,
2372
2399
  ["collections-get"]: handler_default4.get,
2373
2400
  ["collections-set"]: handler_default4.set,
2374
2401
  ["collections-remove"]: handler_default4.remove,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfn/cli",
3
- "version": "1.13.5",
3
+ "version": "1.14.0",
4
4
  "description": "CLI devtools for the OpenFn toolchain",
5
5
  "engines": {
6
6
  "node": ">=18",
@@ -47,13 +47,13 @@
47
47
  "undici": "7.12.0",
48
48
  "ws": "^8.18.3",
49
49
  "yargs": "^17.7.2",
50
- "@openfn/compiler": "1.1.1",
51
- "@openfn/deploy": "0.11.3",
50
+ "@openfn/compiler": "1.1.2",
52
51
  "@openfn/describe-package": "0.1.5",
53
52
  "@openfn/lexicon": "^1.2.3",
54
- "@openfn/runtime": "1.7.2",
55
53
  "@openfn/logger": "1.0.6",
56
- "@openfn/project": "^0.2.0"
54
+ "@openfn/deploy": "0.11.3",
55
+ "@openfn/project": "^0.3.0",
56
+ "@openfn/runtime": "1.7.2"
57
57
  },
58
58
  "files": [
59
59
  "dist",