@openfn/cli 1.12.1 → 1.13.1
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 +1 -0
- package/dist/index.js +9 -0
- package/dist/process/runner.js +215 -49
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -317,6 +317,7 @@ A workflow has a structure like this:
|
|
|
317
317
|
{
|
|
318
318
|
"workflow": {
|
|
319
319
|
"name": "my-workflow", // human readable name used in logging
|
|
320
|
+
"globals": "./common-funcs.js", // code or path to functions that can be accessed in any step. globally scoped
|
|
320
321
|
"steps": [
|
|
321
322
|
{
|
|
322
323
|
"name": "a", // human readable name used in logging
|
package/dist/index.js
CHANGED
|
@@ -291,6 +291,14 @@ var force = {
|
|
|
291
291
|
default: false
|
|
292
292
|
}
|
|
293
293
|
};
|
|
294
|
+
var keepUnsupported = {
|
|
295
|
+
name: "keep-unsupported",
|
|
296
|
+
yargs: {
|
|
297
|
+
boolean: true,
|
|
298
|
+
description: "Keep adaptors that do not support metadata (do not remove them)",
|
|
299
|
+
default: false
|
|
300
|
+
}
|
|
301
|
+
};
|
|
294
302
|
var immutable = {
|
|
295
303
|
name: "immutable",
|
|
296
304
|
yargs: {
|
|
@@ -916,6 +924,7 @@ var options6 = [
|
|
|
916
924
|
expandAdaptors,
|
|
917
925
|
adaptors,
|
|
918
926
|
force,
|
|
927
|
+
keepUnsupported,
|
|
919
928
|
log,
|
|
920
929
|
logJson,
|
|
921
930
|
repoDir,
|
package/dist/process/runner.js
CHANGED
|
@@ -320,7 +320,11 @@ var get_autoinstall_targets_default = getAutoinstallTargets;
|
|
|
320
320
|
// src/repo/handler.ts
|
|
321
321
|
import { exec } from "node:child_process";
|
|
322
322
|
import treeify from "treeify";
|
|
323
|
-
import {
|
|
323
|
+
import {
|
|
324
|
+
install as rtInstall,
|
|
325
|
+
loadRepoPkg,
|
|
326
|
+
getNameAndVersion as getNameAndVersion2
|
|
327
|
+
} from "@openfn/runtime";
|
|
324
328
|
var install = async (opts, log = defaultLogger) => {
|
|
325
329
|
let { packages, adaptors, repoDir } = opts;
|
|
326
330
|
const targets = [].concat(packages ?? [], adaptors ?? []);
|
|
@@ -335,6 +339,29 @@ var install = async (opts, log = defaultLogger) => {
|
|
|
335
339
|
}
|
|
336
340
|
return [];
|
|
337
341
|
};
|
|
342
|
+
var removePackage = async (packageSpecifier, repoDir, logger) => {
|
|
343
|
+
const { name, version } = getNameAndVersion2(packageSpecifier);
|
|
344
|
+
if (!version) {
|
|
345
|
+
logger.warn(`Cannot remove ${packageSpecifier}: no version specified`);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const aliasedName = `${name}_${version}`;
|
|
349
|
+
logger.info(`Removing package ${aliasedName} from repo...`);
|
|
350
|
+
try {
|
|
351
|
+
await new Promise((resolve, reject) => {
|
|
352
|
+
exec(`npm uninstall ${aliasedName}`, { cwd: repoDir }, (error) => {
|
|
353
|
+
if (error) {
|
|
354
|
+
reject(error);
|
|
355
|
+
} else {
|
|
356
|
+
resolve();
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
logger.success(`Successfully removed ${aliasedName}`);
|
|
361
|
+
} catch (error) {
|
|
362
|
+
logger.warn(`Failed to remove ${aliasedName}: ${error.message}`);
|
|
363
|
+
}
|
|
364
|
+
};
|
|
338
365
|
var clean = async (options, logger) => {
|
|
339
366
|
if (options.repoDir) {
|
|
340
367
|
const doIt = await logger.confirm(
|
|
@@ -390,7 +417,10 @@ var list = async (options, logger) => {
|
|
|
390
417
|
};
|
|
391
418
|
|
|
392
419
|
// src/compile/compile.ts
|
|
393
|
-
import compile, {
|
|
420
|
+
import compile, {
|
|
421
|
+
preloadAdaptorExports,
|
|
422
|
+
getExports
|
|
423
|
+
} from "@openfn/compiler";
|
|
394
424
|
import { getModulePath } from "@openfn/runtime";
|
|
395
425
|
|
|
396
426
|
// src/util/abort.ts
|
|
@@ -459,11 +489,13 @@ var compileJob = async (job, opts, log, jobName) => {
|
|
|
459
489
|
}
|
|
460
490
|
};
|
|
461
491
|
var compileWorkflow = async (plan, opts, log) => {
|
|
492
|
+
let globalsIgnoreList = getExports(plan.workflow.globals);
|
|
462
493
|
for (const step of plan.workflow.steps) {
|
|
463
494
|
const job = step;
|
|
464
495
|
const jobOpts = {
|
|
465
496
|
...opts,
|
|
466
|
-
adaptors: job.adaptors ?? opts.adaptors
|
|
497
|
+
adaptors: job.adaptors ?? opts.adaptors,
|
|
498
|
+
ignoreImports: globalsIgnoreList
|
|
467
499
|
};
|
|
468
500
|
if (job.expression) {
|
|
469
501
|
const { code, map } = await compileJob(
|
|
@@ -683,7 +715,7 @@ var expand_adaptors_default = (input) => {
|
|
|
683
715
|
import { readFile as readFile2 } from "node:fs/promises";
|
|
684
716
|
import path3 from "node:path";
|
|
685
717
|
import assert from "node:assert";
|
|
686
|
-
import { getNameAndVersion as
|
|
718
|
+
import { getNameAndVersion as getNameAndVersion3 } from "@openfn/runtime";
|
|
687
719
|
var validateMonoRepo = async (repoPath, log) => {
|
|
688
720
|
try {
|
|
689
721
|
const raw = await readFile2(`${repoPath}/package.json`, "utf8");
|
|
@@ -698,7 +730,7 @@ var updatePath = (adaptor, repoPath, log) => {
|
|
|
698
730
|
if (adaptor.match("=")) {
|
|
699
731
|
return adaptor;
|
|
700
732
|
}
|
|
701
|
-
const { name, version } =
|
|
733
|
+
const { name, version } = getNameAndVersion3(adaptor);
|
|
702
734
|
if (version) {
|
|
703
735
|
log.warn(
|
|
704
736
|
`Warning: Ignoring version specifier on ${adaptor} as loading from the adaptors monorepo`
|
|
@@ -822,7 +854,8 @@ var loadExpression = async (options, logger) => {
|
|
|
822
854
|
const plan = {
|
|
823
855
|
workflow: {
|
|
824
856
|
name,
|
|
825
|
-
steps: [step]
|
|
857
|
+
steps: [step],
|
|
858
|
+
globals: options.globals
|
|
826
859
|
},
|
|
827
860
|
options: wfOptions
|
|
828
861
|
};
|
|
@@ -854,7 +887,8 @@ var loadOldWorkflow = async (workflow, options, logger, defaultName = "") => {
|
|
|
854
887
|
logger.warn(final);
|
|
855
888
|
return final;
|
|
856
889
|
};
|
|
857
|
-
var fetchFile = async (
|
|
890
|
+
var fetchFile = async (fileInfo, log) => {
|
|
891
|
+
const { rootDir = "", filePath, name } = fileInfo;
|
|
858
892
|
try {
|
|
859
893
|
const fullPath = filePath.startsWith("~") ? filePath : path4.resolve(rootDir, filePath);
|
|
860
894
|
const result = await fs3.readFile(fullPath, "utf8");
|
|
@@ -863,7 +897,7 @@ var fetchFile = async (jobId, rootDir = "", filePath, log) => {
|
|
|
863
897
|
} catch (e) {
|
|
864
898
|
abort_default(
|
|
865
899
|
log,
|
|
866
|
-
`File not found for
|
|
900
|
+
`File not found for ${name}: ${filePath}`,
|
|
867
901
|
void 0,
|
|
868
902
|
`This workflow references a file which cannot be found at ${filePath}
|
|
869
903
|
|
|
@@ -872,6 +906,19 @@ Paths inside the workflow are relative to the workflow.json`
|
|
|
872
906
|
return ".";
|
|
873
907
|
}
|
|
874
908
|
};
|
|
909
|
+
var importGlobals = async (plan, rootDir, log) => {
|
|
910
|
+
const fnStr = plan.workflow?.globals;
|
|
911
|
+
if (fnStr) {
|
|
912
|
+
if (isPath(fnStr)) {
|
|
913
|
+
plan.workflow.globals = await fetchFile(
|
|
914
|
+
{ name: "globals", rootDir, filePath: fnStr },
|
|
915
|
+
log
|
|
916
|
+
);
|
|
917
|
+
} else {
|
|
918
|
+
plan.workflow.globals = fnStr;
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
};
|
|
875
922
|
var importExpressions = async (plan, rootDir, log) => {
|
|
876
923
|
let idx = 0;
|
|
877
924
|
for (const step of plan.workflow.steps) {
|
|
@@ -885,26 +932,32 @@ var importExpressions = async (plan, rootDir, log) => {
|
|
|
885
932
|
const stateStr = typeof job.state === "string" && job.state?.trim();
|
|
886
933
|
if (expressionStr && isPath(expressionStr)) {
|
|
887
934
|
job.expression = await fetchFile(
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
935
|
+
{
|
|
936
|
+
name: `job ${job.id || idx}`,
|
|
937
|
+
rootDir,
|
|
938
|
+
filePath: expressionStr
|
|
939
|
+
},
|
|
891
940
|
log
|
|
892
941
|
);
|
|
893
942
|
}
|
|
894
943
|
if (configurationStr && isPath(configurationStr)) {
|
|
895
944
|
const configString = await fetchFile(
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
945
|
+
{
|
|
946
|
+
name: `job configuration ${job.id || idx}`,
|
|
947
|
+
rootDir,
|
|
948
|
+
filePath: configurationStr
|
|
949
|
+
},
|
|
899
950
|
log
|
|
900
951
|
);
|
|
901
952
|
job.configuration = JSON.parse(configString);
|
|
902
953
|
}
|
|
903
954
|
if (stateStr && isPath(stateStr)) {
|
|
904
955
|
const stateString = await fetchFile(
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
956
|
+
{
|
|
957
|
+
name: `job state ${job.id || idx}`,
|
|
958
|
+
rootDir,
|
|
959
|
+
filePath: stateStr
|
|
960
|
+
},
|
|
908
961
|
log
|
|
909
962
|
);
|
|
910
963
|
job.state = JSON.parse(stateString);
|
|
@@ -929,6 +982,9 @@ var loadXPlan = async (plan, options, logger, defaultName = "") => {
|
|
|
929
982
|
plan.workflow.name = defaultName;
|
|
930
983
|
}
|
|
931
984
|
ensureAdaptors(plan);
|
|
985
|
+
if (options.globals)
|
|
986
|
+
plan.workflow.globals = options.globals;
|
|
987
|
+
await importGlobals(plan, options.baseDir, logger);
|
|
932
988
|
await importExpressions(plan, options.baseDir, logger);
|
|
933
989
|
if (options.expandAdaptors) {
|
|
934
990
|
expand_adaptors_default(plan);
|
|
@@ -1620,7 +1676,7 @@ import { writeFile as writeFile5 } from "node:fs/promises";
|
|
|
1620
1676
|
import { readFileSync, writeFileSync, mkdirSync, rmSync } from "node:fs";
|
|
1621
1677
|
import path7 from "node:path";
|
|
1622
1678
|
import { describePackage } from "@openfn/describe-package";
|
|
1623
|
-
import { getNameAndVersion as
|
|
1679
|
+
import { getNameAndVersion as getNameAndVersion4 } from "@openfn/runtime";
|
|
1624
1680
|
var RETRY_DURATION = 500;
|
|
1625
1681
|
var RETRY_COUNT = 20;
|
|
1626
1682
|
var TIMEOUT_MS = 1e3 * 60;
|
|
@@ -1672,7 +1728,7 @@ var waitForDocs = async (docs, path12, logger, retryDuration = RETRY_DURATION) =
|
|
|
1672
1728
|
};
|
|
1673
1729
|
var docgenHandler = (options, logger, docgen = actualDocGen, retryDuration = RETRY_DURATION) => {
|
|
1674
1730
|
const { specifier, repoDir } = options;
|
|
1675
|
-
const { version } =
|
|
1731
|
+
const { version } = getNameAndVersion4(specifier);
|
|
1676
1732
|
if (!version) {
|
|
1677
1733
|
logger.error("Error: No version number detected");
|
|
1678
1734
|
logger.error("eg, @openfn/language-common@1.7.5");
|
|
@@ -1713,7 +1769,7 @@ var handler_default7 = docgenHandler;
|
|
|
1713
1769
|
// src/docs/handler.ts
|
|
1714
1770
|
import { readFile as readFile4 } from "node:fs/promises";
|
|
1715
1771
|
import c from "chalk";
|
|
1716
|
-
import { getNameAndVersion as
|
|
1772
|
+
import { getNameAndVersion as getNameAndVersion5, getLatestVersion } from "@openfn/runtime";
|
|
1717
1773
|
var describeFn = (adaptorName, fn) => [
|
|
1718
1774
|
c.green(
|
|
1719
1775
|
`## ${fn.name}(${fn.parameters.map(({ name }) => name).join(",")})`
|
|
@@ -1744,7 +1800,7 @@ var docsHandler = async (options, logger) => {
|
|
|
1744
1800
|
const { adaptor, operation, repoDir } = options;
|
|
1745
1801
|
const adaptors = expand_adaptors_default([adaptor]);
|
|
1746
1802
|
const [adaptorName] = adaptors;
|
|
1747
|
-
let { name, version } =
|
|
1803
|
+
let { name, version } = getNameAndVersion5(adaptorName);
|
|
1748
1804
|
if (!version) {
|
|
1749
1805
|
logger.info("No version number provided, looking for latest...");
|
|
1750
1806
|
version = await getLatestVersion(name);
|
|
@@ -1798,11 +1854,28 @@ var docsHandler = async (options, logger) => {
|
|
|
1798
1854
|
var handler_default8 = docsHandler;
|
|
1799
1855
|
|
|
1800
1856
|
// src/metadata/cache.ts
|
|
1857
|
+
import { getNameAndVersion as getNameAndVersion6 } from "@openfn/runtime";
|
|
1801
1858
|
import { createHash } from "node:crypto";
|
|
1802
|
-
import {
|
|
1859
|
+
import { mkdir as mkdir3, readFile as readFile5, writeFile as writeFile6, readdir, rm } from "node:fs/promises";
|
|
1803
1860
|
import path8 from "node:path";
|
|
1804
|
-
|
|
1805
|
-
var
|
|
1861
|
+
var UNSUPPORTED_FILE_NAME = "unsupported.json";
|
|
1862
|
+
var getCachePath2 = (repoDir, key) => {
|
|
1863
|
+
const base = path8.join(repoDir, "meta");
|
|
1864
|
+
if (key) {
|
|
1865
|
+
return path8.join(base, key.endsWith(".json") ? key : `${key}.json`);
|
|
1866
|
+
}
|
|
1867
|
+
return base;
|
|
1868
|
+
};
|
|
1869
|
+
var getCache = async (repoDir, key) => {
|
|
1870
|
+
try {
|
|
1871
|
+
const cachePath = getCachePath2(repoDir, key);
|
|
1872
|
+
const content = await readFile5(cachePath, "utf8");
|
|
1873
|
+
return JSON.parse(content);
|
|
1874
|
+
} catch (e) {
|
|
1875
|
+
return null;
|
|
1876
|
+
}
|
|
1877
|
+
};
|
|
1878
|
+
var getUnsupportedCache = (repoDir) => getCache(repoDir, UNSUPPORTED_FILE_NAME);
|
|
1806
1879
|
var sortKeys = (obj) => {
|
|
1807
1880
|
const newObj = {};
|
|
1808
1881
|
Object.keys(obj).sort().forEach((k) => {
|
|
@@ -1817,24 +1890,83 @@ var sortKeys = (obj) => {
|
|
|
1817
1890
|
};
|
|
1818
1891
|
var generateKey = (config, adaptor) => {
|
|
1819
1892
|
const sorted = sortKeys(config);
|
|
1820
|
-
const key = `${JSON.stringify(sorted)}-${adaptor}
|
|
1893
|
+
const key = `${JSON.stringify(sorted)}-${adaptor}`;
|
|
1821
1894
|
return createHash("sha256").update(key).digest("hex");
|
|
1822
1895
|
};
|
|
1823
|
-
var get2 = (repoPath, key) => {
|
|
1896
|
+
var get2 = async (repoPath, key) => {
|
|
1897
|
+
const p = getCachePath2(repoPath, key);
|
|
1824
1898
|
try {
|
|
1825
|
-
const
|
|
1826
|
-
|
|
1827
|
-
return json;
|
|
1899
|
+
const result = await readFile5(p, "utf8");
|
|
1900
|
+
return JSON.parse(result);
|
|
1828
1901
|
} catch (e) {
|
|
1829
1902
|
return null;
|
|
1830
1903
|
}
|
|
1831
1904
|
};
|
|
1832
|
-
var set2 = async (repoPath, key,
|
|
1833
|
-
const
|
|
1834
|
-
await mkdir3(path8.dirname(
|
|
1835
|
-
await writeFile6(
|
|
1905
|
+
var set2 = async (repoPath, key, result) => {
|
|
1906
|
+
const p = getCachePath2(repoPath, key);
|
|
1907
|
+
await mkdir3(path8.dirname(p), { recursive: true });
|
|
1908
|
+
await writeFile6(p, JSON.stringify(result));
|
|
1909
|
+
};
|
|
1910
|
+
var getUnsupportedCachePath = (repoDir) => {
|
|
1911
|
+
return getCachePath2(repoDir, UNSUPPORTED_FILE_NAME);
|
|
1912
|
+
};
|
|
1913
|
+
var parseVersion = (version) => {
|
|
1914
|
+
const parts = version.split(".").map(Number);
|
|
1915
|
+
return {
|
|
1916
|
+
major: parts[0] || 0,
|
|
1917
|
+
minor: parts[1] || 0,
|
|
1918
|
+
patch: parts[2] || 0,
|
|
1919
|
+
majorMinor: `${parts[0] || 0}.${parts[1] || 0}`
|
|
1920
|
+
};
|
|
1921
|
+
};
|
|
1922
|
+
var compareVersions = (version1, version2) => {
|
|
1923
|
+
const v1 = parseVersion(version1);
|
|
1924
|
+
const v2 = parseVersion(version2);
|
|
1925
|
+
if (v1.major !== v2.major)
|
|
1926
|
+
return v1.major - v2.major;
|
|
1927
|
+
if (v1.minor !== v2.minor)
|
|
1928
|
+
return v1.minor - v2.minor;
|
|
1929
|
+
return v1.patch - v2.patch;
|
|
1930
|
+
};
|
|
1931
|
+
var isAdaptorUnsupported = async (adaptorSpecifier, repoDir) => {
|
|
1932
|
+
const { name, version } = getNameAndVersion6(adaptorSpecifier);
|
|
1933
|
+
if (!version)
|
|
1934
|
+
return false;
|
|
1935
|
+
const cache = await getUnsupportedCache(repoDir);
|
|
1936
|
+
if (!cache || !cache[name]) {
|
|
1937
|
+
return false;
|
|
1938
|
+
}
|
|
1939
|
+
const cached = cache[name];
|
|
1940
|
+
const currentParsed = parseVersion(version);
|
|
1941
|
+
const cachedParsed = parseVersion(cached.lastCheckedVersion);
|
|
1942
|
+
if (currentParsed.major > cachedParsed.major || currentParsed.major === cachedParsed.major && currentParsed.minor > cachedParsed.minor) {
|
|
1943
|
+
return false;
|
|
1944
|
+
}
|
|
1945
|
+
return true;
|
|
1946
|
+
};
|
|
1947
|
+
var markAdaptorAsUnsupported = async (adaptorSpecifier, repoDir) => {
|
|
1948
|
+
const { name, version } = getNameAndVersion6(adaptorSpecifier);
|
|
1949
|
+
if (!version)
|
|
1950
|
+
return;
|
|
1951
|
+
const cachePath = getUnsupportedCachePath(repoDir);
|
|
1952
|
+
let cache = {};
|
|
1953
|
+
try {
|
|
1954
|
+
const cacheContent = await readFile5(cachePath, "utf8");
|
|
1955
|
+
cache = JSON.parse(cacheContent);
|
|
1956
|
+
} catch (error) {
|
|
1957
|
+
}
|
|
1958
|
+
const parsed = parseVersion(version);
|
|
1959
|
+
const existing = cache[name];
|
|
1960
|
+
if (!existing || compareVersions(version, existing.lastCheckedVersion) > 0) {
|
|
1961
|
+
cache[name] = {
|
|
1962
|
+
lastCheckedVersion: version,
|
|
1963
|
+
majorMinor: parsed.majorMinor,
|
|
1964
|
+
timestamp: Date.now()
|
|
1965
|
+
};
|
|
1966
|
+
await mkdir3(path8.dirname(cachePath), { recursive: true });
|
|
1967
|
+
await writeFile6(cachePath, JSON.stringify(cache, null, 2));
|
|
1968
|
+
}
|
|
1836
1969
|
};
|
|
1837
|
-
var cache_default = { get: get2, set: set2, generateKey, getPath, sortKeys };
|
|
1838
1970
|
|
|
1839
1971
|
// src/metadata/handler.ts
|
|
1840
1972
|
import { getModuleEntryPoint } from "@openfn/runtime";
|
|
@@ -1871,8 +2003,15 @@ var getAdaptorPath = async (adaptor, logger, repoDir) => {
|
|
|
1871
2003
|
};
|
|
1872
2004
|
var shouldAutoinstall = (adaptor) => adaptor?.length > 0 && !adaptor.startsWith("/") && !adaptor.includes("=");
|
|
1873
2005
|
var metadataHandler = async (options, logger) => {
|
|
1874
|
-
const { repoDir, adaptors } = options;
|
|
1875
|
-
|
|
2006
|
+
const { repoDir, adaptors, keepUnsupported } = options;
|
|
2007
|
+
let adaptor = adaptors[0];
|
|
2008
|
+
if (await isAdaptorUnsupported(adaptor, repoDir)) {
|
|
2009
|
+
logger.info(
|
|
2010
|
+
`Adaptor ${adaptor} is known to not support metadata (cached) - skipping lookup`
|
|
2011
|
+
);
|
|
2012
|
+
logger.error("No metadata helper found");
|
|
2013
|
+
process.exit(1);
|
|
2014
|
+
}
|
|
1876
2015
|
const state = await load_state_default({}, options, logger);
|
|
1877
2016
|
logger.success(`Generating metadata`);
|
|
1878
2017
|
logger.info("config:", state);
|
|
@@ -1883,31 +2022,58 @@ var metadataHandler = async (options, logger) => {
|
|
|
1883
2022
|
}
|
|
1884
2023
|
const finish2 = () => {
|
|
1885
2024
|
logger.success("Done!");
|
|
1886
|
-
logger.print(
|
|
2025
|
+
logger.print(getCachePath2(repoDir, id));
|
|
1887
2026
|
};
|
|
1888
|
-
const id =
|
|
2027
|
+
const id = generateKey(config, adaptor);
|
|
1889
2028
|
if (!options.force) {
|
|
1890
2029
|
logger.debug("config hash: ", id);
|
|
1891
|
-
const cached = await
|
|
2030
|
+
const cached = await get2(repoDir, id);
|
|
1892
2031
|
if (cached) {
|
|
1893
2032
|
logger.success("Returning metadata from cache");
|
|
1894
2033
|
return finish2();
|
|
1895
2034
|
}
|
|
1896
2035
|
}
|
|
2036
|
+
let wasAutoInstalled = false;
|
|
1897
2037
|
try {
|
|
1898
2038
|
if (shouldAutoinstall(adaptor)) {
|
|
1899
|
-
await install(
|
|
2039
|
+
const autoinstallResult = await install(
|
|
2040
|
+
{ packages: [adaptor], repoDir },
|
|
2041
|
+
logger
|
|
2042
|
+
);
|
|
2043
|
+
wasAutoInstalled = true;
|
|
2044
|
+
adaptor = autoinstallResult[0];
|
|
1900
2045
|
}
|
|
1901
2046
|
const adaptorPath = await getAdaptorPath(adaptor, logger, options.repoDir);
|
|
2047
|
+
if (!adaptorPath) {
|
|
2048
|
+
throw new Error(`Could not resolve adaptor path for ${adaptor}`);
|
|
2049
|
+
}
|
|
1902
2050
|
const mod = await import(adaptorPath);
|
|
1903
|
-
if (mod.metadata) {
|
|
2051
|
+
if (mod.metadata && typeof mod.metadata === "function") {
|
|
1904
2052
|
logger.info("Metadata function found. Generating metadata...");
|
|
1905
2053
|
const result = await mod.metadata(config);
|
|
1906
2054
|
decorateMetadata(result);
|
|
1907
|
-
await
|
|
2055
|
+
await set2(
|
|
2056
|
+
repoDir,
|
|
2057
|
+
id,
|
|
2058
|
+
result
|
|
2059
|
+
);
|
|
1908
2060
|
finish2();
|
|
1909
2061
|
} else {
|
|
1910
2062
|
logger.error("No metadata helper found");
|
|
2063
|
+
if (wasAutoInstalled && !keepUnsupported) {
|
|
2064
|
+
logger.info("Removing unsupported adaptor from disk...");
|
|
2065
|
+
await removePackage(adaptor, repoDir, logger);
|
|
2066
|
+
await markAdaptorAsUnsupported(adaptor, repoDir);
|
|
2067
|
+
logger.info("Adaptor removed and marked as unsupported");
|
|
2068
|
+
} else if (wasAutoInstalled && keepUnsupported) {
|
|
2069
|
+
if (adaptor === "@openfn/language-openfn") {
|
|
2070
|
+
logger.log({ wasAutoInstalled, keepUnsupported });
|
|
2071
|
+
}
|
|
2072
|
+
logger.info(
|
|
2073
|
+
"Keeping unsupported adaptor as requested by --keep-unsupported flag"
|
|
2074
|
+
);
|
|
2075
|
+
await markAdaptorAsUnsupported(adaptor, repoDir);
|
|
2076
|
+
}
|
|
1911
2077
|
process.exit(1);
|
|
1912
2078
|
}
|
|
1913
2079
|
} catch (e) {
|
|
@@ -2099,10 +2265,10 @@ function pickFirst2(...args) {
|
|
|
2099
2265
|
var handler_default10 = pullHandler;
|
|
2100
2266
|
|
|
2101
2267
|
// src/util/print-versions.ts
|
|
2102
|
-
import { readFileSync as
|
|
2268
|
+
import { readFileSync as readFileSync2 } from "node:fs";
|
|
2103
2269
|
import path11 from "node:path";
|
|
2104
2270
|
import url from "node:url";
|
|
2105
|
-
import { getNameAndVersion as
|
|
2271
|
+
import { getNameAndVersion as getNameAndVersion7 } from "@openfn/runtime";
|
|
2106
2272
|
import { mainSymbols } from "figures";
|
|
2107
2273
|
var NODE = "node.js";
|
|
2108
2274
|
var CLI2 = "cli";
|
|
@@ -2112,7 +2278,7 @@ var { triangleRightSmall: t } = mainSymbols;
|
|
|
2112
2278
|
var loadVersionFromPath = (adaptorPath) => {
|
|
2113
2279
|
try {
|
|
2114
2280
|
const pkg = JSON.parse(
|
|
2115
|
-
|
|
2281
|
+
readFileSync2(path11.resolve(adaptorPath, "package.json"), "utf8")
|
|
2116
2282
|
);
|
|
2117
2283
|
return pkg.version;
|
|
2118
2284
|
} catch (e) {
|
|
@@ -2129,12 +2295,12 @@ var printVersions = async (logger, options = {}, includeComponents = false) => {
|
|
|
2129
2295
|
if (adaptor.match("=")) {
|
|
2130
2296
|
const [namePart, pathPart] = adaptor.split("=");
|
|
2131
2297
|
adaptorVersion = loadVersionFromPath(pathPart);
|
|
2132
|
-
adaptorName =
|
|
2298
|
+
adaptorName = getNameAndVersion7(namePart).name;
|
|
2133
2299
|
} else if (options.monorepoPath) {
|
|
2134
|
-
adaptorName =
|
|
2300
|
+
adaptorName = getNameAndVersion7(adaptor).name;
|
|
2135
2301
|
adaptorVersion = "monorepo";
|
|
2136
2302
|
} else {
|
|
2137
|
-
const { name, version: version2 } =
|
|
2303
|
+
const { name, version: version2 } = getNameAndVersion7(adaptor);
|
|
2138
2304
|
adaptorName = name;
|
|
2139
2305
|
adaptorVersion = version2 || "latest";
|
|
2140
2306
|
}
|
|
@@ -2148,7 +2314,7 @@ var printVersions = async (logger, options = {}, includeComponents = false) => {
|
|
|
2148
2314
|
);
|
|
2149
2315
|
const prefix = (str) => ` ${t} ${str.padEnd(longest + 4, " ")}`;
|
|
2150
2316
|
const dirname3 = path11.dirname(url.fileURLToPath(import.meta.url));
|
|
2151
|
-
const pkg = JSON.parse(
|
|
2317
|
+
const pkg = JSON.parse(readFileSync2(`${dirname3}/../../package.json`, "utf8"));
|
|
2152
2318
|
const { version, dependencies } = pkg;
|
|
2153
2319
|
const compilerVersion = dependencies["@openfn/compiler"];
|
|
2154
2320
|
const runtimeVersion = dependencies["@openfn/runtime"];
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openfn/cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "CLI devtools for the
|
|
3
|
+
"version": "1.13.1",
|
|
4
|
+
"description": "CLI devtools for the OpenFn toolchain",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18",
|
|
7
7
|
"pnpm": ">=7"
|
|
@@ -48,12 +48,12 @@
|
|
|
48
48
|
"ws": "^8.18.0",
|
|
49
49
|
"yargs": "^17.7.2",
|
|
50
50
|
"@openfn/deploy": "0.11.2",
|
|
51
|
-
"@openfn/compiler": "1.0
|
|
51
|
+
"@openfn/compiler": "1.1.0",
|
|
52
52
|
"@openfn/lexicon": "^1.2.2",
|
|
53
|
-
"@openfn/
|
|
53
|
+
"@openfn/describe-package": "0.1.4",
|
|
54
54
|
"@openfn/project": "^0.1.0",
|
|
55
|
-
"@openfn/
|
|
56
|
-
"@openfn/
|
|
55
|
+
"@openfn/logger": "1.0.5",
|
|
56
|
+
"@openfn/runtime": "1.7.1"
|
|
57
57
|
},
|
|
58
58
|
"files": [
|
|
59
59
|
"dist",
|