@actual-app/cli 26.8.0-nightly.20260721 → 26.8.0-nightly.20260723
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/cli.js +68 -39
- package/dist/stats.json +1250 -1250
- package/package.json +5 -5
package/dist/cli.js
CHANGED
|
@@ -33,7 +33,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
33
33
|
value: mod,
|
|
34
34
|
enumerable: true
|
|
35
35
|
}) : target, mod));
|
|
36
|
-
var __require = /*
|
|
36
|
+
var __require = /* #__PURE__ */ (() => createRequire(import.meta.url))();
|
|
37
37
|
//#endregion
|
|
38
38
|
//#region ../../node_modules/commander/lib/error.js
|
|
39
39
|
/**
|
|
@@ -1560,10 +1560,12 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
|
1560
1560
|
this.setOptionValueWithSource(name, val, valueSource);
|
|
1561
1561
|
};
|
|
1562
1562
|
this.on("option:" + oname, (val) => {
|
|
1563
|
-
|
|
1563
|
+
const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;
|
|
1564
|
+
handleOptionValue(val, invalidValueMessage, "cli");
|
|
1564
1565
|
});
|
|
1565
1566
|
if (option.envVar) this.on("optionEnv:" + oname, (val) => {
|
|
1566
|
-
|
|
1567
|
+
const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;
|
|
1568
|
+
handleOptionValue(val, invalidValueMessage, "env");
|
|
1567
1569
|
});
|
|
1568
1570
|
return this;
|
|
1569
1571
|
}
|
|
@@ -3387,7 +3389,9 @@ var require_build = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
3387
3389
|
//#endregion
|
|
3388
3390
|
//#region ../../node_modules/picocolors/picocolors.js
|
|
3389
3391
|
var require_picocolors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
3390
|
-
var p = process || {}
|
|
3392
|
+
var p = process || {};
|
|
3393
|
+
var argv = p.argv || [];
|
|
3394
|
+
var env = p.env || {};
|
|
3391
3395
|
var isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
|
|
3392
3396
|
var formatter = (open, close, replace = open) => (input) => {
|
|
3393
3397
|
let string = "" + input, index = string.indexOf(close, open.length);
|
|
@@ -4649,7 +4653,7 @@ var require_lib = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
|
4649
4653
|
function getDefs(enabled) {
|
|
4650
4654
|
return enabled ? defsOn : defsOff;
|
|
4651
4655
|
}
|
|
4652
|
-
var sometimesKeywords = new Set([
|
|
4656
|
+
var sometimesKeywords = /* @__PURE__ */ new Set([
|
|
4653
4657
|
"as",
|
|
4654
4658
|
"async",
|
|
4655
4659
|
"from",
|
|
@@ -6557,7 +6561,8 @@ var require_dumper = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
6557
6561
|
} else throw new YAMLException("code point within a string may not be greater than 0xFFFFFFFF");
|
|
6558
6562
|
return "\\" + handle + common.repeat("0", length - string.length) + string;
|
|
6559
6563
|
}
|
|
6560
|
-
var QUOTING_TYPE_SINGLE = 1
|
|
6564
|
+
var QUOTING_TYPE_SINGLE = 1;
|
|
6565
|
+
var QUOTING_TYPE_DOUBLE = 2;
|
|
6561
6566
|
function State(options) {
|
|
6562
6567
|
this.schema = options["schema"] || DEFAULT_SCHEMA;
|
|
6563
6568
|
this.indent = Math.max(1, options["indent"] || 2);
|
|
@@ -6638,7 +6643,11 @@ var require_dumper = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
6638
6643
|
function needIndentIndicator(string) {
|
|
6639
6644
|
return /^\n* /.test(string);
|
|
6640
6645
|
}
|
|
6641
|
-
var STYLE_PLAIN = 1
|
|
6646
|
+
var STYLE_PLAIN = 1;
|
|
6647
|
+
var STYLE_SINGLE = 2;
|
|
6648
|
+
var STYLE_LITERAL = 3;
|
|
6649
|
+
var STYLE_FOLDED = 4;
|
|
6650
|
+
var STYLE_DOUBLE = 5;
|
|
6642
6651
|
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType, quotingType, forceQuotes, inblock) {
|
|
6643
6652
|
var i;
|
|
6644
6653
|
var char = 0;
|
|
@@ -50898,7 +50907,8 @@ ${lanes.join("\n")}
|
|
|
50898
50907
|
directoryToModuleNameMap.update(options2);
|
|
50899
50908
|
}
|
|
50900
50909
|
function getOrCreateCacheForDirectory(directoryName, redirectedReference) {
|
|
50901
|
-
|
|
50910
|
+
const path = toPath(directoryName, currentDirectory, getCanonicalFileName);
|
|
50911
|
+
return getOrCreateCache(directoryToModuleNameMap, redirectedReference, path, () => createModeAwareCache());
|
|
50902
50912
|
}
|
|
50903
50913
|
function getFromDirectoryCache(name, mode, directoryName, redirectedReference) {
|
|
50904
50914
|
var _a, _b;
|
|
@@ -59550,10 +59560,11 @@ ${lanes.join("\n")}
|
|
|
59550
59560
|
if (!specifier) {
|
|
59551
59561
|
const isBundle2 = !!compilerOptions.outFile;
|
|
59552
59562
|
const { moduleResolverHost } = context.tracker;
|
|
59553
|
-
|
|
59563
|
+
const specifierCompilerOptions = isBundle2 ? {
|
|
59554
59564
|
...compilerOptions,
|
|
59555
59565
|
baseUrl: moduleResolverHost.getCommonSourceDirectory()
|
|
59556
|
-
} : compilerOptions
|
|
59566
|
+
} : compilerOptions;
|
|
59567
|
+
specifier = first(getModuleSpecifiers(symbol, checker, specifierCompilerOptions, contextFile, moduleResolverHost, {
|
|
59557
59568
|
importModuleSpecifierPreference: isBundle2 ? "non-relative" : "project-relative",
|
|
59558
59569
|
importModuleSpecifierEnding: isBundle2 ? "minimal" : resolutionMode === 99 ? "js" : void 0
|
|
59559
59570
|
}, { overrideImportMode }));
|
|
@@ -60236,7 +60247,8 @@ ${lanes.join("\n")}
|
|
|
60236
60247
|
if (some(symbol.declarations, isPartOfParameterDeclaration)) return;
|
|
60237
60248
|
Debug.assertIsDefined(deferredPrivatesStack[deferredPrivatesStack.length - 1]);
|
|
60238
60249
|
getUnusedName(unescapeLeadingUnderscores(symbol.escapedName), symbol);
|
|
60239
|
-
|
|
60250
|
+
const isExternalImportAlias = !!(symbol.flags & 2097152) && !some(symbol.declarations, (d) => !!findAncestor(d, isExportDeclaration) || isNamespaceExport(d) || isImportEqualsDeclaration(d) && !isExternalModuleReference(d.moduleReference));
|
|
60251
|
+
deferredPrivatesStack[isExternalImportAlias ? 0 : deferredPrivatesStack.length - 1].set(getSymbolId(symbol), symbol);
|
|
60240
60252
|
}
|
|
60241
60253
|
function isExportingScope(enclosingDeclaration2) {
|
|
60242
60254
|
return isSourceFile(enclosingDeclaration2) && (isExternalOrCommonJsModule(enclosingDeclaration2) || isJsonSourceFile(enclosingDeclaration2)) || isAmbientModule(enclosingDeclaration2) && !isGlobalScopeAugmentation(enclosingDeclaration2);
|
|
@@ -76085,7 +76097,8 @@ ${lanes.join("\n")}
|
|
|
76085
76097
|
const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(links.assertionExpressionType));
|
|
76086
76098
|
const targetType = getTypeFromTypeNode(type);
|
|
76087
76099
|
if (!isErrorType(targetType)) addLazyDiagnostic(() => {
|
|
76088
|
-
|
|
76100
|
+
const widenedType = getWidenedType(exprType);
|
|
76101
|
+
if (!isTypeComparableTo(targetType, widenedType)) checkTypeComparableTo(exprType, targetType, errNode, Diagnostics.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first);
|
|
76089
76102
|
});
|
|
76090
76103
|
}
|
|
76091
76104
|
function checkNonNullChain(node) {
|
|
@@ -87833,7 +87846,8 @@ ${lanes.join("\n")}
|
|
|
87833
87846
|
setOriginalNode(getter, node);
|
|
87834
87847
|
setCommentRange(getter, commentRange);
|
|
87835
87848
|
setSourceMapRange(getter, sourceMapRange);
|
|
87836
|
-
const
|
|
87849
|
+
const setterModifiers = factory2.createModifiersFromModifierFlags(modifiersToFlags(modifiers));
|
|
87850
|
+
const setter = createAccessorPropertySetRedirector(factory2, node, setterModifiers, setterName, receiver);
|
|
87837
87851
|
setOriginalNode(setter, node);
|
|
87838
87852
|
setEmitFlags(setter, 3072);
|
|
87839
87853
|
setSourceMapRange(setter, sourceMapRange);
|
|
@@ -92276,7 +92290,8 @@ ${lanes.join("\n")}
|
|
|
92276
92290
|
const tagName = getTagName(node);
|
|
92277
92291
|
const attrs = node.attributes.properties;
|
|
92278
92292
|
const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs) : factory2.createNull();
|
|
92279
|
-
const
|
|
92293
|
+
const callee = currentFileState.importSpecifier === void 0 ? createJsxFactoryExpression(factory2, context.getEmitResolver().getJsxFactoryEntity(currentSourceFile), compilerOptions.reactNamespace, node) : getImplicitImportForName("createElement");
|
|
92294
|
+
const element = createExpressionForJsxElement(factory2, callee, tagName, objectProperties, mapDefined(children, transformJsxChildToExpression), location);
|
|
92280
92295
|
if (isChild) startOnNewLine(element);
|
|
92281
92296
|
return element;
|
|
92282
92297
|
}
|
|
@@ -108880,7 +108895,8 @@ ${lanes.join("\n")}
|
|
|
108880
108895
|
}
|
|
108881
108896
|
function scheduleInvalidateResolutionsOfFailedLookupLocations() {
|
|
108882
108897
|
if (!host.setTimeout || !host.clearTimeout) return resolutionCache.invalidateResolutionsOfFailedLookupLocations();
|
|
108883
|
-
|
|
108898
|
+
const pending = clearInvalidateResolutionsOfFailedLookupLocations();
|
|
108899
|
+
writeLog(`Scheduling invalidateFailedLookup${pending ? ", Cancelled earlier one" : ""}`);
|
|
108884
108900
|
timerToInvalidateFailedLookupResolutions = host.setTimeout(invalidateResolutionsOfFailedLookup, 250, "timerToInvalidateFailedLookupResolutions");
|
|
108885
108901
|
}
|
|
108886
108902
|
function invalidateResolutionsOfFailedLookup() {
|
|
@@ -124586,7 +124602,8 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")}
|
|
|
124586
124602
|
const { sourceFile } = context;
|
|
124587
124603
|
const fixedDeclarations = /* @__PURE__ */ new Set();
|
|
124588
124604
|
return codeFixAll(context, errorCodes2, (t, diagnostic) => {
|
|
124589
|
-
const
|
|
124605
|
+
const span = diagnostic.relatedInformation && find(diagnostic.relatedInformation, (r) => r.code === Diagnostics.Did_you_mean_to_mark_this_function_as_async.code);
|
|
124606
|
+
const decl = getFixableErrorSpanDeclaration(sourceFile, span);
|
|
124590
124607
|
if (!decl) return;
|
|
124591
124608
|
const trackChanges = (cb) => (cb(t), []);
|
|
124592
124609
|
return getFix(context, decl, trackChanges, fixedDeclarations);
|
|
@@ -127171,7 +127188,8 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")}
|
|
|
127171
127188
|
return createModuleSpecifierResolutionHost(isFromPackageJson ? host.getPackageJsonAutoImportProvider() : program, host);
|
|
127172
127189
|
});
|
|
127173
127190
|
function addSymbol(moduleSymbol, toFile, exportedSymbol, exportKind, program2, isFromPackageJson) {
|
|
127174
|
-
|
|
127191
|
+
const moduleSpecifierResolutionHost = getModuleSpecifierResolutionHost(isFromPackageJson);
|
|
127192
|
+
if (isImportable(program2, fromFile, toFile, moduleSymbol, preferences, packageJsonFilter, moduleSpecifierResolutionHost, moduleSpecifierCache)) {
|
|
127175
127193
|
const checker = program2.getTypeChecker();
|
|
127176
127194
|
originalSymbolToExportInfos.add(getUniqueSymbolId(exportedSymbol, checker).toString(), {
|
|
127177
127195
|
symbol: exportedSymbol,
|
|
@@ -128148,7 +128166,8 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")}
|
|
|
128148
128166
|
eachDiagnostic(context, errorCodes28, (diag2) => {
|
|
128149
128167
|
const info = getInfo10(diag2.file, diag2.start, diag2.code, checker, context.program);
|
|
128150
128168
|
if (info === void 0) return;
|
|
128151
|
-
|
|
128169
|
+
const nodeId = getNodeId(info.parentDeclaration) + "#" + (info.kind === 3 ? info.identifier || getNodeId(info.token) : info.token.text);
|
|
128170
|
+
if (!addToSeen(seen, nodeId)) return;
|
|
128152
128171
|
if (fixId56 === fixMissingFunctionDeclaration && (info.kind === 2 || info.kind === 5)) addFunctionDeclaration(changes, context, info);
|
|
128153
128172
|
else if (fixId56 === fixMissingProperties && info.kind === 3) addObjectLiteralProperties(changes, context, info);
|
|
128154
128173
|
else if (fixId56 === fixMissingAttributes && info.kind === 4) addJsxAttributes(changes, context, info);
|
|
@@ -129531,7 +129550,8 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")}
|
|
|
129531
129550
|
const info = getInfo15(err.file, err.start, checker);
|
|
129532
129551
|
if (!info) return;
|
|
129533
129552
|
const { typeNode, type } = info;
|
|
129534
|
-
|
|
129553
|
+
const fixedType = typeNode.kind === 315 && fixId56 === fixIdNullable ? checker.getNullableType(type, 4) : type;
|
|
129554
|
+
doChange29(changes, sourceFile, typeNode, fixedType, checker);
|
|
129535
129555
|
});
|
|
129536
129556
|
}
|
|
129537
129557
|
});
|
|
@@ -133931,15 +133951,18 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")}
|
|
|
133931
133951
|
symbol: firstAccessibleSymbol,
|
|
133932
133952
|
targetFlags: skipAlias(firstAccessibleSymbol, typeChecker).flags
|
|
133933
133953
|
}], position, isValidTypeOnlyAliasUseSite(location)) || {};
|
|
133934
|
-
if (moduleSpecifier)
|
|
133935
|
-
|
|
133936
|
-
|
|
133937
|
-
|
|
133938
|
-
|
|
133939
|
-
|
|
133940
|
-
|
|
133941
|
-
|
|
133942
|
-
|
|
133954
|
+
if (moduleSpecifier) {
|
|
133955
|
+
const origin = {
|
|
133956
|
+
kind: getNullableSymbolOriginInfoKind(34),
|
|
133957
|
+
moduleSymbol,
|
|
133958
|
+
isDefaultExport: false,
|
|
133959
|
+
symbolName: firstAccessibleSymbol.name,
|
|
133960
|
+
exportName: firstAccessibleSymbol.name,
|
|
133961
|
+
fileName,
|
|
133962
|
+
moduleSpecifier
|
|
133963
|
+
};
|
|
133964
|
+
symbolToOriginInfoMap[index] = origin;
|
|
133965
|
+
}
|
|
133943
133966
|
}
|
|
133944
133967
|
} else if (preferences.includeCompletionsWithInsertText) {
|
|
133945
133968
|
if (firstAccessibleSymbolId && seenPropertySymbols.has(firstAccessibleSymbolId)) return;
|
|
@@ -134460,10 +134483,13 @@ ${newComment.split("\n").map((c) => ` * ${c}`).join("\n")}
|
|
|
134460
134483
|
symbols = concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
|
|
134461
134484
|
forEach(symbols, (symbol, index) => {
|
|
134462
134485
|
const declaration = symbol == null ? void 0 : symbol.valueDeclaration;
|
|
134463
|
-
if (declaration && isClassElement(declaration) && declaration.name && isComputedPropertyName(declaration.name))
|
|
134464
|
-
|
|
134465
|
-
|
|
134466
|
-
|
|
134486
|
+
if (declaration && isClassElement(declaration) && declaration.name && isComputedPropertyName(declaration.name)) {
|
|
134487
|
+
const origin = {
|
|
134488
|
+
kind: 512,
|
|
134489
|
+
symbolName: typeChecker.symbolToString(symbol)
|
|
134490
|
+
};
|
|
134491
|
+
symbolToOriginInfoMap[index] = origin;
|
|
134492
|
+
}
|
|
134467
134493
|
});
|
|
134468
134494
|
}
|
|
134469
134495
|
return 1;
|
|
@@ -141398,7 +141424,7 @@ ${content}
|
|
|
141398
141424
|
if (symbolWasExpanded) return true;
|
|
141399
141425
|
if (canExpandSymbol(symbol2, typeWriterOut)) {
|
|
141400
141426
|
const symbolMeaning = semanticToSymbolMeaning(meaning);
|
|
141401
|
-
|
|
141427
|
+
const expandedDisplayParts = mapToDisplayParts((writer) => {
|
|
141402
141428
|
const nodes = typeChecker.getEmitResolver().symbolToDeclarations(symbol2, symbolMeaning, 17408, maximumLength, verbosityLevel !== void 0 ? verbosityLevel - 1 : void 0, typeWriterOut);
|
|
141403
141429
|
const printer = getPrinter();
|
|
141404
141430
|
const sourceFile2 = symbol2.valueDeclaration && getSourceFileOfNode(symbol2.valueDeclaration);
|
|
@@ -141406,7 +141432,8 @@ ${content}
|
|
|
141406
141432
|
if (i > 0) writer.writeLine();
|
|
141407
141433
|
printer.writeNode(4, node, sourceFile2, writer);
|
|
141408
141434
|
});
|
|
141409
|
-
}, maximumLength)
|
|
141435
|
+
}, maximumLength);
|
|
141436
|
+
addRange(displayParts, expandedDisplayParts);
|
|
141410
141437
|
symbolWasExpanded = true;
|
|
141411
141438
|
return true;
|
|
141412
141439
|
}
|
|
@@ -141480,10 +141507,11 @@ ${content}
|
|
|
141480
141507
|
}
|
|
141481
141508
|
}
|
|
141482
141509
|
function writeTypeParametersOfSymbol(symbol2, enclosingDeclaration2) {
|
|
141483
|
-
|
|
141510
|
+
const typeParameterParts = mapToDisplayParts((writer) => {
|
|
141484
141511
|
const params = typeChecker.symbolToTypeParameterDeclarations(symbol2, enclosingDeclaration2, symbolDisplayNodeBuilderFlags);
|
|
141485
141512
|
getPrinter().writeList(53776, params, getSourceFileOfNode(getParseTreeNode(enclosingDeclaration2)), writer);
|
|
141486
|
-
})
|
|
141513
|
+
});
|
|
141514
|
+
addRange(displayParts, typeParameterParts);
|
|
141487
141515
|
}
|
|
141488
141516
|
}
|
|
141489
141517
|
function getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker, symbol, sourceFile, enclosingDeclaration, location, semanticMeaning = getMeaningFromLocation(location), alias, maximumLength, verbosityLevel) {
|
|
@@ -147515,12 +147543,13 @@ ${options.prefix}` : "\n" : options.prefix
|
|
|
147515
147543
|
if (this.installTypingHost.fileExists(combinePaths(directory, "package.json"))) return directory;
|
|
147516
147544
|
}) || projectRootPath;
|
|
147517
147545
|
if (cwd) this.installWorker(-1, [packageName], cwd, (success) => {
|
|
147546
|
+
const message = success ? `Package ${packageName} installed.` : `There was an error installing ${packageName}.`;
|
|
147518
147547
|
const response = {
|
|
147519
147548
|
kind: ActionPackageInstalled,
|
|
147520
147549
|
projectName,
|
|
147521
147550
|
id,
|
|
147522
147551
|
success,
|
|
147523
|
-
message
|
|
147552
|
+
message
|
|
147524
147553
|
};
|
|
147525
147554
|
this.sendResponse(response);
|
|
147526
147555
|
});
|
|
@@ -161387,7 +161416,7 @@ var require_table = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
|
161387
161416
|
var import_cli_table3 = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
161388
161417
|
module.exports = require_table();
|
|
161389
161418
|
})))(), 1);
|
|
161390
|
-
var AMOUNT_FIELDS = new Set([
|
|
161419
|
+
var AMOUNT_FIELDS = /* @__PURE__ */ new Set([
|
|
161391
161420
|
"amount",
|
|
161392
161421
|
"balance",
|
|
161393
161422
|
"balance_available",
|
|
@@ -162297,7 +162326,7 @@ function registerTransactionsCommand(program) {
|
|
|
162297
162326
|
//#endregion
|
|
162298
162327
|
//#region src/index.ts
|
|
162299
162328
|
var program = new Command();
|
|
162300
|
-
program.name("actual").description("CLI for Actual Budget").version("26.8.0-nightly.
|
|
162329
|
+
program.name("actual").description("CLI for Actual Budget").version("26.8.0-nightly.20260723").option("--server-url <url>", "Actual server URL (env: ACTUAL_SERVER_URL)").option("--password <password>", "Server password (env: ACTUAL_PASSWORD)").option("--session-token <token>", "Session token (env: ACTUAL_SESSION_TOKEN)").option("--sync-id <id>", "Budget sync ID (env: ACTUAL_SYNC_ID)").option("--data-dir <path>", "Data directory (env: ACTUAL_DATA_DIR)").option("--encryption-password <password>", "E2E encryption password (env: ACTUAL_ENCRYPTION_PASSWORD)").option("--cache-ttl <seconds>", "Cache TTL in seconds (env: ACTUAL_CACHE_TTL; default: 60)", (value) => parseNonNegativeIntFlag(value, "--cache-ttl")).option("--refresh", "Force a sync on this call, ignoring the cache", false).option("--no-cache", "Alias for --refresh").option("--lock-timeout <seconds>", "How long to wait for another CLI process to release the lock (env: ACTUAL_LOCK_TIMEOUT; default: 10)", (value) => parseNonNegativeIntFlag(value, "--lock-timeout")).option("--no-lock", "Disable the budget directory lock (use with care, env: ACTUAL_NO_LOCK)").addOption(new Option("--format <format>", "Output format: json, table, csv").choices([
|
|
162301
162330
|
"json",
|
|
162302
162331
|
"table",
|
|
162303
162332
|
"csv"
|