@openfn/cli 0.0.30 → 0.0.31

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.
@@ -0,0 +1,149 @@
1
+ // src/util/expand-adaptors.ts
2
+ var expand_adaptors_default = (names) => names?.map((name) => {
3
+ if (typeof name === "string") {
4
+ if (name.startsWith("@openfn/language-")) {
5
+ return name;
6
+ }
7
+ return `@openfn/language-${name}`;
8
+ }
9
+ return name;
10
+ });
11
+
12
+ // src/util/logger.ts
13
+ import actualCreateLogger, { printDuration } from "@openfn/logger";
14
+ import { isValidLogLevel, defaultLogger } from "@openfn/logger";
15
+ var CLI = "cli";
16
+ var COMPILER = "compiler";
17
+ var RUNTIME = "runtime";
18
+ var JOB = "job";
19
+ var namespaces = {
20
+ [CLI]: "CLI",
21
+ [RUNTIME]: "R/T",
22
+ [COMPILER]: "CMP",
23
+ [JOB]: "JOB"
24
+ };
25
+ var createLogger = (name = "", options) => {
26
+ const logOptions = options.log;
27
+ let level = logOptions[name] || logOptions.default || "default";
28
+ if (options.logJson) {
29
+ logOptions.json = true;
30
+ }
31
+ return actualCreateLogger(namespaces[name] || name, {
32
+ level,
33
+ ...logOptions
34
+ });
35
+ };
36
+ var logger_default = createLogger;
37
+ var createNullLogger = () => createLogger(void 0, { log: { default: "none" } });
38
+
39
+ // src/util/ensure-opts.ts
40
+ import path from "node:path";
41
+ var defaultLoggerOptions = {
42
+ default: "default",
43
+ job: "debug"
44
+ };
45
+ var ERROR_MESSAGE_LOG_LEVEL = "Unknown log level. Valid levels are none, debug, info and default.";
46
+ var ERROR_MESSAGE_LOG_COMPONENT = "Unknown log component. Valid components are cli, compiler, runtime and job.";
47
+ var DEFAULT_REPO_DIR = "/tmp/openfn/repo";
48
+ var componentShorthands = {
49
+ cmp: "compiler",
50
+ rt: "runtime",
51
+ "r/t": "runtime"
52
+ };
53
+ var isValidComponent = (v) => /^(cli|runtime|compiler|job|default)$/i.test(v);
54
+ var ensureLogOpts = (opts) => {
55
+ const components = {};
56
+ if (!opts.log && /^(version|test)$/.test(opts.command)) {
57
+ opts.log = { default: "info" };
58
+ return opts;
59
+ } else if (opts.log) {
60
+ opts.log.forEach((l) => {
61
+ let component = "";
62
+ let level = "";
63
+ if (l.match(/=/)) {
64
+ const parts = l.split("=");
65
+ component = parts[0].toLowerCase();
66
+ if (componentShorthands[component]) {
67
+ component = componentShorthands[component];
68
+ }
69
+ level = parts[1].toLowerCase();
70
+ } else {
71
+ component = "default";
72
+ level = l.toLowerCase();
73
+ }
74
+ if (!isValidComponent(component)) {
75
+ throw new Error(ERROR_MESSAGE_LOG_COMPONENT);
76
+ }
77
+ level = level.toLowerCase();
78
+ if (!isValidLogLevel(level)) {
79
+ throw new Error(ERROR_MESSAGE_LOG_LEVEL);
80
+ }
81
+ components[component] = level;
82
+ });
83
+ }
84
+ opts.log = {
85
+ ...defaultLoggerOptions,
86
+ ...components
87
+ };
88
+ return opts;
89
+ };
90
+ function ensureOpts(basePath = ".", opts) {
91
+ const newOpts = {
92
+ adaptor: opts.adaptor,
93
+ adaptors: opts.adaptors || [],
94
+ autoinstall: opts.autoinstall,
95
+ command: opts.command,
96
+ expandAdaptors: opts.expandAdaptors !== false,
97
+ force: opts.force || false,
98
+ immutable: opts.immutable || false,
99
+ log: opts.log,
100
+ logJson: typeof opts.logJson == "boolean" ? opts.logJson : Boolean(process.env.OPENFN_LOG_JSON),
101
+ compile: Boolean(opts.compile),
102
+ operation: opts.operation,
103
+ outputStdout: Boolean(opts.outputStdout),
104
+ packages: opts.packages,
105
+ repoDir: opts.repoDir || process.env.OPENFN_REPO_DIR || DEFAULT_REPO_DIR,
106
+ skipAdaptorValidation: opts.skipAdaptorValidation ?? false,
107
+ specifier: opts.specifier,
108
+ stateStdin: opts.stateStdin,
109
+ strictOutput: opts.strictOutput ?? true,
110
+ timeout: opts.timeout
111
+ };
112
+ const set = (key, value) => {
113
+ newOpts[key] = opts.hasOwnProperty(key) ? opts[key] : value;
114
+ };
115
+ if (opts.useAdaptorsMonorepo) {
116
+ newOpts.monorepoPath = process.env.OPENFN_ADAPTORS_REPO || "ERR";
117
+ }
118
+ let baseDir = basePath;
119
+ if (basePath.endsWith(".js")) {
120
+ baseDir = path.dirname(basePath);
121
+ set("jobPath", basePath);
122
+ } else {
123
+ set("jobPath", `${baseDir}/job.js`);
124
+ }
125
+ set("statePath", `${baseDir}/state.json`);
126
+ if (!opts.outputStdout) {
127
+ set(
128
+ "outputPath",
129
+ newOpts.command === "compile" ? `${baseDir}/output.js` : `${baseDir}/output.json`
130
+ );
131
+ }
132
+ ensureLogOpts(newOpts);
133
+ return newOpts;
134
+ }
135
+
136
+ export {
137
+ expand_adaptors_default,
138
+ printDuration,
139
+ CLI,
140
+ COMPILER,
141
+ RUNTIME,
142
+ JOB,
143
+ logger_default,
144
+ createNullLogger,
145
+ defaultLogger,
146
+ DEFAULT_REPO_DIR,
147
+ ensureLogOpts,
148
+ ensureOpts
149
+ };
package/dist/index.js CHANGED
@@ -1,4 +1,8 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ DEFAULT_REPO_DIR,
4
+ expand_adaptors_default
5
+ } from "./chunk-Q2H7WYJB.js";
2
6
 
3
7
  // src/process/spawn.ts
4
8
  import path from "node:path";
@@ -83,92 +87,282 @@ var list = {
83
87
  }
84
88
  };
85
89
 
90
+ // src/util/command-builders.ts
91
+ var build = (opts2, yargs2) => opts2.reduce((_y, o) => yargs2.option(o.name, o.yargs), yargs2);
92
+ var ensure = (command, opts2) => (yargs2) => {
93
+ yargs2.command = command;
94
+ opts2.filter((opt) => opt.ensure).forEach((opt) => {
95
+ opt.ensure(yargs2);
96
+ });
97
+ };
98
+ var override = (command, yargs2) => {
99
+ return {
100
+ ...command,
101
+ yargs: {
102
+ ...command.yargs || {},
103
+ ...yargs2
104
+ }
105
+ };
106
+ };
107
+
108
+ // src/options.ts
109
+ import path2 from "node:path";
110
+ var setDefaultValue = (opts2, key, value) => {
111
+ const v = opts2[key];
112
+ if (isNaN(v) && !v) {
113
+ opts2[key] = value;
114
+ }
115
+ };
116
+ var adaptors = {
117
+ name: "adaptors",
118
+ yargs: {
119
+ alias: ["a", "adaptor"],
120
+ description: "A language adaptor to use for the job. Short-form names are allowed. Can include an explicit path to a local adaptor build"
121
+ },
122
+ ensure: (opts2) => {
123
+ if (opts2.adaptors) {
124
+ if (!Array.isArray(opts2.adaptors)) {
125
+ opts2.adaptors = [opts2.adaptors];
126
+ }
127
+ } else {
128
+ opts2.adaptors = [];
129
+ }
130
+ if (opts2.expandAdaptors) {
131
+ opts2.adaptors = expand_adaptors_default(opts2.adaptors);
132
+ }
133
+ delete opts2.adaptor;
134
+ delete opts2.a;
135
+ }
136
+ };
137
+ var autoinstall = {
138
+ name: "autoinstall",
139
+ yargs: {
140
+ alias: ["i"],
141
+ boolean: true,
142
+ description: "Auto-install the language adaptor",
143
+ default: false
144
+ }
145
+ };
146
+ var compile = {
147
+ name: "no-compile",
148
+ yargs: {
149
+ boolean: true,
150
+ description: "Disable compilation of the incoming source"
151
+ },
152
+ ensure: (opts2) => {
153
+ setDefaultValue(opts2, "compile", true);
154
+ }
155
+ };
156
+ var expandAdaptors = {
157
+ name: "no-expand-adaptors",
158
+ yargs: {
159
+ boolean: true,
160
+ description: "Don't attempt to auto-expand adaptor shorthand names"
161
+ },
162
+ ensure: (opts2) => {
163
+ setDefaultValue(opts2, "expandAdaptors", true);
164
+ }
165
+ };
166
+ var immutable = {
167
+ name: "immutable",
168
+ yargs: {
169
+ description: "Enforce immutabilty on state object",
170
+ boolean: true,
171
+ default: false
172
+ }
173
+ };
174
+ var getBaseDir = (opts2) => {
175
+ const basePath = opts2.path ?? ".";
176
+ if (basePath.endsWith(".js")) {
177
+ return path2.dirname(basePath);
178
+ }
179
+ return basePath;
180
+ };
181
+ var jobPath = {
182
+ name: "job-path",
183
+ yargs: {
184
+ hidden: true
185
+ },
186
+ ensure: (opts2) => {
187
+ const { path: basePath } = opts2;
188
+ if (basePath?.endsWith(".js")) {
189
+ opts2.jobPath = basePath;
190
+ } else {
191
+ const base = getBaseDir(opts2);
192
+ setDefaultValue(opts2, "jobPath", path2.join(base, "job.js"));
193
+ }
194
+ }
195
+ };
196
+ var logJson = {
197
+ name: "log-json",
198
+ yargs: {
199
+ description: "Output all logs as JSON objects",
200
+ boolean: true
201
+ },
202
+ ensure: () => {
203
+ }
204
+ };
205
+ var outputStdout = {
206
+ name: "output-stdout",
207
+ yargs: {
208
+ alias: "O",
209
+ boolean: true,
210
+ description: "Print output to stdout (instead of a file)"
211
+ },
212
+ ensure: (opts2) => {
213
+ setDefaultValue(opts2, "outputStdout", false);
214
+ }
215
+ };
216
+ var outputPath = {
217
+ name: "output-path",
218
+ yargs: {
219
+ alias: "o",
220
+ description: "Path to the output file"
221
+ },
222
+ ensure: (opts2) => {
223
+ if (opts2.command == "compile") {
224
+ if (opts2.outputPath) {
225
+ delete opts2.outputStdout;
226
+ }
227
+ } else {
228
+ if (opts2.outputStdout) {
229
+ delete opts2.outputPath;
230
+ } else {
231
+ const base = getBaseDir(opts2);
232
+ setDefaultValue(opts2, "outputPath", path2.join(base, "output.json"));
233
+ }
234
+ }
235
+ delete opts2.o;
236
+ }
237
+ };
238
+ var repoDir = {
239
+ name: "repo-dir",
240
+ yargs: {
241
+ description: "Provide a path to the repo root dir",
242
+ default: process.env.OPENFN_REPO_DIR || DEFAULT_REPO_DIR
243
+ }
244
+ };
245
+ var strictOutput = {
246
+ name: "no-strict-output",
247
+ yargs: {
248
+ boolean: true,
249
+ description: "Allow properties other than data to be returned in the output"
250
+ },
251
+ ensure: (opts2) => {
252
+ setDefaultValue(opts2, "strictOutput", true);
253
+ }
254
+ };
255
+ var skipAdaptorValidation = {
256
+ name: "skip-adaptor-validation",
257
+ yargs: {
258
+ boolean: true,
259
+ description: "Suppress warning message for jobs which don't use an adaptor",
260
+ default: false
261
+ }
262
+ };
263
+ var statePath = {
264
+ name: "state-path",
265
+ yargs: {
266
+ alias: ["s"],
267
+ description: "Path to the state file"
268
+ }
269
+ };
270
+ var stateStdin = {
271
+ name: "state-stdin",
272
+ yargs: {
273
+ alias: ["S"],
274
+ description: "Read state from stdin (instead of a file)"
275
+ }
276
+ };
277
+ var timeout = {
278
+ name: "timeout",
279
+ yargs: {
280
+ alias: ["t"],
281
+ number: true,
282
+ description: "Set the timeout duration (ms). Defaults to 5 minutes.",
283
+ default: 5 * 60 * 1e3
284
+ }
285
+ };
286
+ var useAdaptorsMonorepo = {
287
+ name: "use-adaptors-monorepo",
288
+ yargs: {
289
+ alias: ["m"],
290
+ boolean: true,
291
+ description: "Load adaptors from the monorepo. The OPENFN_ADAPTORS_REPO env var must be set to a valid path"
292
+ },
293
+ ensure: (opts2) => {
294
+ if (opts2.useAdaptorsMonorepo) {
295
+ opts2.monorepoPath = process.env.OPENFN_ADAPTORS_REPO || "ERR";
296
+ }
297
+ }
298
+ };
299
+
86
300
  // src/execute/command.ts
301
+ var options = [
302
+ expandAdaptors,
303
+ adaptors,
304
+ autoinstall,
305
+ compile,
306
+ immutable,
307
+ jobPath,
308
+ logJson,
309
+ outputPath,
310
+ outputStdout,
311
+ repoDir,
312
+ skipAdaptorValidation,
313
+ statePath,
314
+ stateStdin,
315
+ strictOutput,
316
+ timeout,
317
+ useAdaptorsMonorepo
318
+ ];
87
319
  var executeCommand = {
88
320
  command: "execute [path]",
89
321
  desc: `Run an openfn job. Get more help by running openfn <command> help`,
90
322
  aliases: ["$0"],
91
- handler: (argv) => {
92
- argv.command = "execute";
93
- },
94
- builder: (yargs2) => {
95
- return applyExecuteOptions(yargs2).option("immutable", {
96
- boolean: true,
97
- description: "Treat state as immutable"
98
- }).option("use-adaptors-monorepo", {
99
- alias: "m",
100
- boolean: true,
101
- description: "Load adaptors from the monorepo. The OPENFN_ADAPTORS_REPO env var must be set to a valid path"
102
- }).option("autoinstall", {
103
- alias: "i",
104
- boolean: true,
105
- description: "Auto-install the language adaptor"
106
- }).option("state-path", {
107
- alias: "s",
108
- description: "Path to the state file"
109
- }).option("state-stdin", {
110
- alias: "S",
111
- description: "Read state from stdin (instead of a file)"
112
- }).option("skip-adaptor-validation", {
113
- boolean: true,
114
- description: "Skip adaptor validation warnings"
115
- }).option("timeout", {
116
- alias: "-t",
117
- description: "Set the timeout duration in MS"
118
- }).option("no-compile", {
119
- boolean: true,
120
- description: "Skip compilation"
121
- }).option("no-strict-output", {
122
- boolean: true,
123
- description: "Allow properties other than data to be returned in the output"
124
- }).example(
125
- "openfn foo/job.js",
126
- "Reads foo/job.js, looks for state and output in foo"
127
- ).example(
128
- "openfn job.js -a common",
129
- "Run job.js using @openfn/language-common"
130
- ).example(
131
- "openfn install -a common",
132
- "Install the latest version of language-common to the repo"
133
- );
134
- }
323
+ handler: ensure("execute", options),
324
+ builder: (yargs2) => build(options, yargs2).positional("path", {
325
+ describe: "The path to load the job from (a .js file or a dir containing a job.js file)",
326
+ demandOption: true
327
+ }).example(
328
+ "openfn foo/job.js",
329
+ "Reads foo/job.js, looks for state and output in foo"
330
+ ).example(
331
+ "openfn job.js -a common",
332
+ "Run job.js using @openfn/language-common"
333
+ ).example(
334
+ "openfn install -a common",
335
+ "Install the latest version of language-common to the repo"
336
+ )
135
337
  };
136
- var applyExecuteOptions = (yargs2) => yargs2.positional("path", {
137
- describe: "The path to load the job from (a .js file or a dir containing a job.js file)",
138
- demandOption: true
139
- }).option("output-path", {
140
- alias: "o",
141
- description: "Path to the output file"
142
- }).option("output-stdout", {
143
- alias: "O",
144
- boolean: true,
145
- description: "Print output to stdout (instead of a file)"
146
- }).option("adaptors", {
147
- alias: ["a", "adaptor"],
148
- description: "A language adaptor to use for the job. Short-form names are allowed. Can include an explicit path to a local adaptor build",
149
- array: true
150
- }).option("no-expand", {
151
- description: "Don attempt to auto-expand adaptor shorthand names",
152
- boolean: true
153
- });
154
338
  var command_default = executeCommand;
155
339
 
156
340
  // src/compile/command.ts
341
+ var options2 = [
342
+ expandAdaptors,
343
+ adaptors,
344
+ jobPath,
345
+ logJson,
346
+ override(outputStdout, {
347
+ default: true
348
+ }),
349
+ outputPath,
350
+ useAdaptorsMonorepo
351
+ ];
157
352
  var compileCommand = {
158
353
  command: "compile [path]",
159
- desc: "compile a openfn job and print or save the resulting js",
160
- handler: (argv) => {
161
- argv.command = "compile";
162
- },
163
- builder: (yargs2) => {
164
- return applyExecuteOptions(yargs2).example(
165
- "compile foo/job.js -O",
166
- "Compiles foo/job.js and prints the result to stdout"
167
- ).example(
168
- "compile foo/job.js -o foo/job-compiled.js",
169
- "Compiles foo/job.js and saves the result to foo/job-compiled.js"
170
- );
171
- }
354
+ desc: "Compile an openfn job and print or save the resulting JavaScript.",
355
+ handler: ensure("compile", options2),
356
+ builder: (yargs2) => build(options2, yargs2).positional("path", {
357
+ describe: "The path to load the job from (a .js file or a dir containing a job.js file)",
358
+ demandOption: true
359
+ }).example(
360
+ "compile foo/job.js -O",
361
+ "Compiles foo/job.js and prints the result to stdout"
362
+ ).example(
363
+ "compile foo/job.js -o foo/job-compiled.js",
364
+ "Compiles foo/job.js and saves the result to foo/job-compiled.js"
365
+ )
172
366
  };
173
367
  var command_default2 = compileCommand;
174
368
 
@@ -1,124 +1,19 @@
1
- // src/util/logger.ts
2
- import actualCreateLogger, { printDuration } from "@openfn/logger";
3
- import { isValidLogLevel, defaultLogger } from "@openfn/logger";
4
- var CLI = "cli";
5
- var COMPILER = "compiler";
6
- var RUNTIME = "runtime";
7
- var JOB = "job";
8
- var namespaces = {
9
- [CLI]: "CLI",
10
- [RUNTIME]: "R/T",
11
- [COMPILER]: "CMP",
12
- [JOB]: "JOB"
13
- };
14
- var createLogger = (name = "", options) => {
15
- const logOptions = options.log || { json: true };
16
- let level = logOptions[name] || logOptions.default || "default";
17
- if (options.logJson) {
18
- logOptions.json = true;
19
- }
20
- return actualCreateLogger(namespaces[name] || name, {
21
- level,
22
- ...logOptions
23
- });
24
- };
25
- var logger_default = createLogger;
26
- var createNullLogger = () => createLogger(void 0, { log: { default: "none" } });
1
+ import {
2
+ CLI,
3
+ COMPILER,
4
+ JOB,
5
+ RUNTIME,
6
+ createNullLogger,
7
+ defaultLogger,
8
+ ensureLogOpts,
9
+ ensureOpts,
10
+ expand_adaptors_default,
11
+ logger_default,
12
+ printDuration
13
+ } from "../chunk-Q2H7WYJB.js";
27
14
 
28
- // src/util/ensure-opts.ts
29
- import path from "node:path";
30
- var defaultLoggerOptions = {
31
- default: "default",
32
- job: "debug"
33
- };
34
- var ERROR_MESSAGE_LOG_LEVEL = "Unknown log level. Valid levels are none, debug, info and default.";
35
- var ERROR_MESSAGE_LOG_COMPONENT = "Unknown log component. Valid components are cli, compiler, runtime and job.";
36
- var DEFAULT_REPO_DIR = "/tmp/openfn/repo";
37
- var componentShorthands = {
38
- cmp: "compiler",
39
- rt: "runtime",
40
- "r/t": "runtime"
41
- };
42
- var isValidComponent = (v) => /^(cli|runtime|compiler|job|default)$/i.test(v);
43
- var ensureLogOpts = (opts) => {
44
- const components = {};
45
- if (opts.command === "version" || opts.command === "test" && !opts.log) {
46
- return { default: "info" };
47
- }
48
- if (opts.log) {
49
- opts.log.forEach((l) => {
50
- let component = "";
51
- let level = "";
52
- if (l.match(/=/)) {
53
- const parts = l.split("=");
54
- component = parts[0].toLowerCase();
55
- if (componentShorthands[component]) {
56
- component = componentShorthands[component];
57
- }
58
- level = parts[1].toLowerCase();
59
- } else {
60
- component = "default";
61
- level = l.toLowerCase();
62
- }
63
- if (!isValidComponent(component)) {
64
- throw new Error(ERROR_MESSAGE_LOG_COMPONENT);
65
- }
66
- level = level.toLowerCase();
67
- if (!isValidLogLevel(level)) {
68
- throw new Error(ERROR_MESSAGE_LOG_LEVEL);
69
- }
70
- components[component] = level;
71
- });
72
- }
73
- return {
74
- ...defaultLoggerOptions,
75
- ...components
76
- };
77
- };
78
- function ensureOpts(basePath = ".", opts) {
79
- const newOpts = {
80
- adaptor: opts.adaptor,
81
- adaptors: opts.adaptors || [],
82
- autoinstall: opts.autoinstall,
83
- command: opts.command,
84
- expand: opts.expand !== false,
85
- force: opts.force || false,
86
- immutable: opts.immutable || false,
87
- logJson: typeof opts.logJson == "boolean" ? opts.logJson : Boolean(process.env.OPENFN_LOG_JSON),
88
- noCompile: Boolean(opts.noCompile),
89
- operation: opts.operation,
90
- outputStdout: Boolean(opts.outputStdout),
91
- packages: opts.packages,
92
- repoDir: opts.repoDir || process.env.OPENFN_REPO_DIR || DEFAULT_REPO_DIR,
93
- skipAdaptorValidation: opts.skipAdaptorValidation ?? false,
94
- specifier: opts.specifier,
95
- stateStdin: opts.stateStdin,
96
- strictOutput: opts.strictOutput ?? true,
97
- statePath: opts.statePath,
98
- timeout: opts.timeout
99
- };
100
- const set = (key, value) => {
101
- newOpts[key] = opts.hasOwnProperty(key) ? opts[key] : value;
102
- };
103
- if (opts.useAdaptorsMonorepo) {
104
- newOpts.monorepoPath = process.env.OPENFN_ADAPTORS_REPO || "ERR";
105
- }
106
- let baseDir = basePath;
107
- if (basePath.endsWith(".js")) {
108
- baseDir = path.dirname(basePath);
109
- set("jobPath", basePath);
110
- } else {
111
- set("jobPath", `${baseDir}/job.js`);
112
- }
113
- if (!opts.outputStdout) {
114
- set(
115
- "outputPath",
116
- newOpts.command === "compile" ? `${baseDir}/output.js` : `${baseDir}/output.json`
117
- );
118
- }
119
- newOpts.log = ensureLogOpts(opts);
120
- return newOpts;
121
- }
15
+ // src/execute/handler.ts
16
+ import { readFile } from "node:fs/promises";
122
17
 
123
18
  // src/execute/load-state.ts
124
19
  import fs from "node:fs/promises";
@@ -150,7 +45,9 @@ var load_state_default = async (opts, log) => {
150
45
  log.warn(e);
151
46
  }
152
47
  }
153
- log.info("No state provided - using default state { data: {}, configuration: {}");
48
+ log.info(
49
+ "No state provided - using default state { data: {}, configuration: {}"
50
+ );
154
51
  return {
155
52
  data: {},
156
53
  configuration: {}
@@ -174,11 +71,11 @@ var execute_default = (code, state, opts) => {
174
71
  function parseAdaptors(opts) {
175
72
  const adaptors = {};
176
73
  opts.adaptors.reduce((obj, exp) => {
177
- const [module, path5] = exp.split("=");
74
+ const [module, path4] = exp.split("=");
178
75
  const { name, version } = getNameAndVersion(module);
179
76
  const info = {};
180
- if (path5) {
181
- info.path = path5;
77
+ if (path4) {
78
+ info.path = path4;
182
79
  }
183
80
  if (version) {
184
81
  info.version = version;
@@ -190,25 +87,17 @@ function parseAdaptors(opts) {
190
87
  }
191
88
 
192
89
  // src/compile/compile.ts
193
- import fs2 from "node:fs/promises";
194
90
  import compile, { preloadAdaptorExports } from "@openfn/compiler";
195
91
  import { getModulePath } from "@openfn/runtime";
196
92
  var compile_default = async (opts, log) => {
197
93
  log.debug("Loading job...");
198
- let job;
199
- if (opts.noCompile) {
200
- log.info("Skipping compilation as noCompile is set");
201
- job = fs2.readFile(opts.jobPath, "utf8");
202
- log.success(`Loaded job from ${opts.jobPath} (no compilation)`);
94
+ const compilerOptions = await loadTransformOptions(opts, log);
95
+ compilerOptions.logger = logger_default(COMPILER, opts);
96
+ const job = compile(opts.jobSource || opts.jobPath, compilerOptions);
97
+ if (opts.jobPath) {
98
+ log.success(`Compiled job from ${opts.jobPath}`);
203
99
  } else {
204
- const complilerOptions = await loadTransformOptions(opts, log);
205
- complilerOptions.logger = logger_default(COMPILER, opts);
206
- job = compile(opts.jobSource || opts.jobPath, complilerOptions);
207
- if (opts.jobPath) {
208
- log.success(`Compiled job from ${opts.jobPath}`);
209
- } else {
210
- log.success("Compiled job");
211
- }
100
+ log.success("Compiled job");
212
101
  }
213
102
  return job;
214
103
  };
@@ -220,10 +109,10 @@ var stripVersionSpecifier = (specifier) => {
220
109
  return specifier;
221
110
  };
222
111
  var resolveSpecifierPath = async (pattern, repoDir, log) => {
223
- const [specifier, path5] = pattern.split("=");
224
- if (path5) {
225
- log.debug(`Resolved ${specifier} to path: ${path5}`);
226
- return path5;
112
+ const [specifier, path4] = pattern.split("=");
113
+ if (path4) {
114
+ log.debug(`Resolved ${specifier} to path: ${path4}`);
115
+ return path4;
227
116
  }
228
117
  const repoPath = await getModulePath(specifier, repoDir, log);
229
118
  if (repoPath) {
@@ -240,15 +129,15 @@ var loadTransformOptions = async (opts, log) => {
240
129
  const [pattern] = opts.adaptors;
241
130
  const [specifier] = pattern.split("=");
242
131
  log.debug(`Attempting to preload typedefs for ${specifier}`);
243
- const path5 = await resolveSpecifierPath(pattern, opts.repoDir, log);
244
- if (path5) {
132
+ const path4 = await resolveSpecifierPath(pattern, opts.repoDir, log);
133
+ if (path4) {
245
134
  try {
246
- exports = await preloadAdaptorExports(path5);
135
+ exports = await preloadAdaptorExports(path4);
247
136
  if (exports) {
248
137
  log.info(`Loaded typedefs for ${specifier}`);
249
138
  }
250
139
  } catch (e) {
251
- log.error(`Failed to load adaptor typedefs from path ${path5}`);
140
+ log.error(`Failed to load adaptor typedefs from path ${path4}`);
252
141
  log.error(e);
253
142
  }
254
143
  }
@@ -302,19 +191,6 @@ var serialize_output_default = serializeOutput;
302
191
  import { exec } from "node:child_process";
303
192
  import treeify from "treeify";
304
193
  import { install as rtInstall, loadRepoPkg } from "@openfn/runtime";
305
-
306
- // src/util/expand-adaptors.ts
307
- var nullLogger = createNullLogger();
308
- var expand_adaptors_default = (names, log = nullLogger) => names?.map((name) => {
309
- if (name.startsWith("@openfn/language-")) {
310
- return name;
311
- }
312
- const expanded = `@openfn/language-${name}`;
313
- log.debug(`Expanded adaptor ${name} to ${expanded}`);
314
- return expanded;
315
- });
316
-
317
- // src/repo/handler.ts
318
194
  var install = async (opts, log = defaultLogger) => {
319
195
  let { packages, adaptor, repoDir } = opts;
320
196
  if (packages) {
@@ -322,7 +198,7 @@ var install = async (opts, log = defaultLogger) => {
322
198
  log.success("Installing packages...");
323
199
  log.debug("repoDir is set to:", repoDir);
324
200
  if (adaptor) {
325
- packages = expand_adaptors_default(packages, log);
201
+ packages = expand_adaptors_default(packages);
326
202
  }
327
203
  await rtInstall(packages, repoDir, log);
328
204
  const duration = log.timer("install");
@@ -421,7 +297,16 @@ var executeHandler = async (options, logger) => {
421
297
  }
422
298
  }
423
299
  const state = await load_state_default(options, logger);
424
- const code = await compile_default(options, logger);
300
+ let code = "";
301
+ if (options.compile) {
302
+ code = await compile_default(options, logger);
303
+ } else {
304
+ logger.info("Skipping compilation as noCompile is set");
305
+ if (options.jobPath) {
306
+ code = await readFile(options.jobPath, "utf8");
307
+ logger.success(`Loaded job from ${options.jobPath} (no compilation)`);
308
+ }
309
+ }
425
310
  try {
426
311
  const result = await execute_default(code, state, options);
427
312
  await serialize_output_default(options, result, logger);
@@ -454,6 +339,7 @@ var handler_default2 = compileHandler;
454
339
  var sillyMessage = "Calculating the answer to life, the universe, and everything...";
455
340
  var testHandler = async (options, logger) => {
456
341
  logger.log("Running test job...");
342
+ options.compile = true;
457
343
  options.jobSource = `const fn = () => state => { console.log('${sillyMessage}'); return state * 2; } ; fn()`;
458
344
  delete options.jobPath;
459
345
  if (!options.stateStdin) {
@@ -472,28 +358,28 @@ var handler_default3 = testHandler;
472
358
  // src/docgen/handler.ts
473
359
  import { writeFile as writeFile3 } from "node:fs/promises";
474
360
  import { readFileSync, writeFileSync, mkdirSync, rmSync } from "node:fs";
475
- import path2 from "node:path";
361
+ import path from "node:path";
476
362
  import { describePackage } from "@openfn/describe-package";
477
363
  import { getNameAndVersion as getNameAndVersion2 } from "@openfn/runtime";
478
364
  var RETRY_DURATION = 500;
479
365
  var RETRY_COUNT = 20;
480
366
  var TIMEOUT_MS = 1e3 * 60;
481
367
  var actualDocGen = (specifier) => describePackage(specifier, {});
482
- var ensurePath = (filePath) => mkdirSync(path2.dirname(filePath), { recursive: true });
483
- var generatePlaceholder = (path5) => {
484
- writeFileSync(path5, `{ "loading": true, "timestamp": ${Date.now()}}`);
368
+ var ensurePath = (filePath) => mkdirSync(path.dirname(filePath), { recursive: true });
369
+ var generatePlaceholder = (path4) => {
370
+ writeFileSync(path4, `{ "loading": true, "timestamp": ${Date.now()}}`);
485
371
  };
486
372
  var finish = (logger, resultPath) => {
487
373
  logger.success("Done! Docs can be found at:\n");
488
- logger.print(` ${path2.resolve(resultPath)}`);
374
+ logger.print(` ${path.resolve(resultPath)}`);
489
375
  };
490
- var generateDocs = async (specifier, path5, docgen, logger) => {
376
+ var generateDocs = async (specifier, path4, docgen, logger) => {
491
377
  const result = await docgen(specifier);
492
- await writeFile3(path5, JSON.stringify(result, null, 2));
493
- finish(logger, path5);
494
- return path5;
378
+ await writeFile3(path4, JSON.stringify(result, null, 2));
379
+ finish(logger, path4);
380
+ return path4;
495
381
  };
496
- var waitForDocs = async (docs, path5, logger, retryDuration = RETRY_DURATION) => {
382
+ var waitForDocs = async (docs, path4, logger, retryDuration = RETRY_DURATION) => {
497
383
  try {
498
384
  if (docs.hasOwnProperty("loading")) {
499
385
  logger.info("Docs are being loaded by another process. Waiting.");
@@ -505,19 +391,19 @@ var waitForDocs = async (docs, path5, logger, retryDuration = RETRY_DURATION) =>
505
391
  clearInterval(i);
506
392
  reject(new Error("Timed out waiting for docs to load"));
507
393
  }
508
- const updated = JSON.parse(readFileSync(path5, "utf8"));
394
+ const updated = JSON.parse(readFileSync(path4, "utf8"));
509
395
  if (!updated.hasOwnProperty("loading")) {
510
396
  logger.info("Docs found!");
511
397
  clearInterval(i);
512
- resolve(path5);
398
+ resolve(path4);
513
399
  }
514
400
  count++;
515
401
  }, retryDuration);
516
402
  });
517
403
  } else {
518
- logger.info(`Docs already written to cache at ${path5}`);
519
- finish(logger, path5);
520
- return path5;
404
+ logger.info(`Docs already written to cache at ${path4}`);
405
+ finish(logger, path4);
406
+ return path4;
521
407
  }
522
408
  } catch (e) {
523
409
  logger.error("Existing doc JSON corrupt. Aborting");
@@ -534,28 +420,28 @@ var docgenHandler = (options, logger, docgen = actualDocGen, retryDuration = RET
534
420
  process.exit(9);
535
421
  }
536
422
  logger.success(`Generating docs for ${specifier}`);
537
- const path5 = `${repoDir}/docs/${specifier}.json`;
538
- ensurePath(path5);
423
+ const path4 = `${repoDir}/docs/${specifier}.json`;
424
+ ensurePath(path4);
539
425
  const handleError = () => {
540
426
  logger.info("Removing placeholder");
541
- rmSync(path5);
427
+ rmSync(path4);
542
428
  };
543
429
  try {
544
- const existing = readFileSync(path5, "utf8");
430
+ const existing = readFileSync(path4, "utf8");
545
431
  const json = JSON.parse(existing);
546
432
  if (json && json.timeout && Date.now() - json.timeout >= TIMEOUT_MS) {
547
433
  logger.info(`Expired placeholder found. Removing.`);
548
- rmSync(path5);
434
+ rmSync(path4);
549
435
  throw new Error("TIMEOUT");
550
436
  }
551
- return waitForDocs(json, path5, logger, retryDuration);
437
+ return waitForDocs(json, path4, logger, retryDuration);
552
438
  } catch (e) {
553
439
  if (e.message !== "TIMEOUT") {
554
- logger.info(`Docs JSON not found at ${path5}`);
440
+ logger.info(`Docs JSON not found at ${path4}`);
555
441
  }
556
442
  logger.debug("Generating placeholder");
557
- generatePlaceholder(path5);
558
- return generateDocs(specifier, path5, docgen, logger).catch((e2) => {
443
+ generatePlaceholder(path4);
444
+ return generateDocs(specifier, path4, docgen, logger).catch((e2) => {
559
445
  logger.error("Error generating documentation");
560
446
  logger.error(e2);
561
447
  handleError();
@@ -565,7 +451,7 @@ var docgenHandler = (options, logger, docgen = actualDocGen, retryDuration = RET
565
451
  var handler_default4 = docgenHandler;
566
452
 
567
453
  // src/docs/handler.ts
568
- import { readFile } from "node:fs/promises";
454
+ import { readFile as readFile2 } from "node:fs/promises";
569
455
  import { getNameAndVersion as getNameAndVersion3, getLatestVersion } from "@openfn/runtime";
570
456
  var describeFn = (adaptorName, fn) => `## ${fn.name}(${fn.parameters.map(({ name }) => name).join(",")})
571
457
 
@@ -603,15 +489,15 @@ var docsHandler = async (options, logger) => {
603
489
  logger.success(`Showing docs for ${adaptorName} v${version}`);
604
490
  }
605
491
  logger.info("Generating/loading documentation...");
606
- const path5 = await handler_default4(
492
+ const path4 = await handler_default4(
607
493
  {
608
494
  specifier: `${name}@${version}`,
609
495
  repoDir
610
496
  },
611
497
  createNullLogger()
612
498
  );
613
- if (path5) {
614
- const source = await readFile(path5, "utf8");
499
+ if (path4) {
500
+ const source = await readFile2(path4, "utf8");
615
501
  const data = JSON.parse(source);
616
502
  let desc;
617
503
  if (operation) {
@@ -633,13 +519,13 @@ var docsHandler = async (options, logger) => {
633
519
  var handler_default5 = docsHandler;
634
520
 
635
521
  // src/util/use-adaptors-repo.ts
636
- import { readFile as readFile2 } from "node:fs/promises";
637
- import path3 from "node:path";
522
+ import { readFile as readFile3 } from "node:fs/promises";
523
+ import path2 from "node:path";
638
524
  import assert from "node:assert";
639
525
  import { getNameAndVersion as getNameAndVersion4 } from "@openfn/runtime";
640
526
  var validateMonoRepo = async (repoPath, log) => {
641
527
  try {
642
- const raw = await readFile2(`${repoPath}/package.json`, "utf8");
528
+ const raw = await readFile3(`${repoPath}/package.json`, "utf8");
643
529
  const pkg = JSON.parse(raw);
644
530
  assert(pkg.name === "adaptors");
645
531
  } catch (e) {
@@ -658,7 +544,7 @@ var updatePath = (adaptor, repoPath, log) => {
658
544
  );
659
545
  }
660
546
  const shortName = name.replace("@openfn/language-", "");
661
- const abspath = path3.resolve(repoPath, "packages", shortName);
547
+ const abspath = path2.resolve(repoPath, "packages", shortName);
662
548
  return `${name}=${abspath}`;
663
549
  };
664
550
  var useAdaptorsRepo = async (adaptors, repoPath, log) => {
@@ -675,7 +561,7 @@ var use_adaptors_repo_default = useAdaptorsRepo;
675
561
 
676
562
  // src/util/print-versions.ts
677
563
  import { readFileSync as readFileSync2 } from "node:fs";
678
- import path4 from "node:path";
564
+ import path3 from "node:path";
679
565
  import { getNameAndVersion as getNameAndVersion5 } from "@openfn/runtime";
680
566
  import { mainSymbols } from "figures";
681
567
  var NODE = "node.js";
@@ -685,7 +571,7 @@ var COMPILER2 = "compiler";
685
571
  var { triangleRightSmall: t } = mainSymbols;
686
572
  var loadVersionFromPath = (adaptorPath) => {
687
573
  try {
688
- const pkg = JSON.parse(readFileSync2(path4.resolve(adaptorPath, "package.json"), "utf8"));
574
+ const pkg = JSON.parse(readFileSync2(path3.resolve(adaptorPath, "package.json"), "utf8"));
689
575
  return pkg.version;
690
576
  } catch (e) {
691
577
  return "unknown";
@@ -761,8 +647,9 @@ var handlers = {
761
647
  ["repo-list"]: list,
762
648
  version: async (opts, logger) => print_versions_default(logger, opts)
763
649
  };
650
+ var maybeEnsureOpts = (basePath, options) => /^(execute|compile)$/.test(options.command) ? ensureLogOpts(options) : ensureOpts(basePath, options);
764
651
  var parse = async (basePath, options, log) => {
765
- const opts = ensureOpts(basePath, options);
652
+ const opts = maybeEnsureOpts(basePath, options);
766
653
  const logger = log || logger_default(CLI, opts);
767
654
  if (opts.command === "execute" || opts.command === "test") {
768
655
  await print_versions_default(logger, opts);
@@ -780,8 +667,8 @@ var parse = async (basePath, options, log) => {
780
667
  opts.monorepoPath,
781
668
  logger
782
669
  );
783
- } else if (opts.adaptors && opts.expand) {
784
- opts.adaptors = expand_adaptors_default(opts.adaptors, logger);
670
+ } else if (opts.adaptors && opts.expandAdaptors) {
671
+ opts.adaptors = expand_adaptors_default(opts.adaptors);
785
672
  }
786
673
  if (/^(test|version)$/.test(opts.command) && !opts.repoDir) {
787
674
  logger.warn(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfn/cli",
3
- "version": "0.0.30",
3
+ "version": "0.0.31",
4
4
  "description": "CLI devtools for the openfn toolchain.",
5
5
  "engines": {
6
6
  "node": ">=18",
@@ -43,8 +43,8 @@
43
43
  "yargs": "^17.5.1",
44
44
  "@openfn/compiler": "0.0.25",
45
45
  "@openfn/describe-package": "0.0.14",
46
- "@openfn/runtime": "0.0.19",
47
- "@openfn/logger": "0.0.10"
46
+ "@openfn/logger": "0.0.10",
47
+ "@openfn/runtime": "0.0.19"
48
48
  },
49
49
  "files": [
50
50
  "dist",