@dartfx/n8n-nodes-qsv 0.2.1 → 0.26.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.
Files changed (31) hide show
  1. package/README.md +4 -0
  2. package/dist/nodes/Qsv/Qsv.node.js +2 -2
  3. package/dist/nodes/Qsv/actions/executeCount.js +0 -3
  4. package/dist/nodes/Qsv/actions/executeGeocode.js +15 -0
  5. package/dist/nodes/Qsv/actions/executeGeoconvert.js +3 -0
  6. package/dist/nodes/Qsv/actions/executeJoinp.js +0 -3
  7. package/dist/nodes/Qsv/actions/executePivotp.js +3 -0
  8. package/dist/nodes/Qsv/actions/executeSqlp.js +0 -3
  9. package/dist/nodes/Qsv/actions/executeValidate.js +3 -0
  10. package/dist/nodes/Qsv/actions/executeViz.js +12 -0
  11. package/dist/nodes/Qsv/descriptions/CatDescription.js +1 -1
  12. package/dist/nodes/Qsv/descriptions/CountDescription.js +2 -9
  13. package/dist/nodes/Qsv/descriptions/DescribegptDescription.js +1 -1
  14. package/dist/nodes/Qsv/descriptions/ExcelDescription.js +2 -2
  15. package/dist/nodes/Qsv/descriptions/FrequencyDescription.js +3 -3
  16. package/dist/nodes/Qsv/descriptions/GeocodeDescription.js +55 -16
  17. package/dist/nodes/Qsv/descriptions/GeoconvertDescription.js +8 -1
  18. package/dist/nodes/Qsv/descriptions/GetDescription.js +1 -1
  19. package/dist/nodes/Qsv/descriptions/JoinpDescription.js +1 -8
  20. package/dist/nodes/Qsv/descriptions/JsonlDescription.js +2 -2
  21. package/dist/nodes/Qsv/descriptions/PivotpDescription.js +10 -3
  22. package/dist/nodes/Qsv/descriptions/ReadstatDescription.js +2 -2
  23. package/dist/nodes/Qsv/descriptions/SchemaDescription.js +1 -1
  24. package/dist/nodes/Qsv/descriptions/ScoresqlDescription.js +2 -2
  25. package/dist/nodes/Qsv/descriptions/SqlpDescription.js +3 -10
  26. package/dist/nodes/Qsv/descriptions/StatsDescription.js +2 -2
  27. package/dist/nodes/Qsv/descriptions/TemplateDescription.js +2 -2
  28. package/dist/nodes/Qsv/descriptions/ToDescription.js +1 -1
  29. package/dist/nodes/Qsv/descriptions/ValidateDescription.js +9 -2
  30. package/dist/nodes/Qsv/descriptions/VizDescription.js +40 -9
  31. package/package.json +7 -1
package/README.md CHANGED
@@ -201,6 +201,10 @@ pnpm install
201
201
  # Regenerate QSV node definitions from latest CLI help (if updating QSV commands)
202
202
  pnpm run generate:qsv
203
203
 
204
+ # Or synchronize, test, and release against new QSV builds (with optional --otp):
205
+ pnpm run sync:qsv --dry-run
206
+ pnpm run sync:qsv --staging --publish --otp 123456
207
+
204
208
  # Build package
205
209
  pnpm run build
206
210
 
@@ -156,7 +156,7 @@ class Qsv {
156
156
  group: ['transform'],
157
157
  version: 1,
158
158
  subtitle: '={{$parameter["operation"]}}',
159
- description: 'Ultra-fast tabular data wrangling, stats, and transformations via QSV (generated for QSV 24.0.0; requires qsv CLI on host)',
159
+ description: 'Ultra-fast tabular data wrangling, stats, and transformations via QSV (generated for QSV 26.0.0; requires qsv CLI on host)',
160
160
  defaults: {
161
161
  name: 'QSV',
162
162
  },
@@ -328,7 +328,7 @@ class Qsv {
328
328
  {
329
329
  name: 'Geocode (geocode) [Feature: geocode]',
330
330
  value: 'geocode',
331
- description: 'Geocodes a location against an updatable local copy of the Geonames cities & the Maxmind GeoLite2 databases — with caching and multi-threading, this offline path geocodes up to 360,000 records/sec! Can also geocode online (forward & reverse) via the OpenCage geocoder. (Category: utility | Docs: https://github.com/dathere/qsv/blob/master/docs/help/geocode.md)',
331
+ description: 'Geocodes a location against an updatable local copy of the Geonames cities & the Maxmind GeoLite2 databases — with caching and multi-threading, this offline path geocodes up to 360,000 records/sec! Can also geocode online (forward & reverse) via the OpenCage geocoder, geocode New York City addresses, BBLs and BINs via NYC\'s Geoclient API, which also returns NYC attributes such as council districts and census tracts, and geocode US addresses & coordinates via the free US Census Geocoder - single or batch - returning Census state, county, tract, block group & block GEOIDs for Census data enrichment. (Category: utility | Docs: https://github.com/dathere/qsv/blob/master/docs/help/geocode.md)',
332
332
  action: 'Geocode',
333
333
  },
334
334
  {
@@ -26,9 +26,6 @@ async function executeCount(itemIndex) {
26
26
  if (options.json === true) {
27
27
  args.push('--json');
28
28
  }
29
- if (options.lowMemory === true) {
30
- args.push('--low-memory');
31
- }
32
29
  if (options.noHeaders === true) {
33
30
  args.push('--no-headers');
34
31
  }
@@ -30,12 +30,18 @@ async function executeGeocode(itemIndex) {
30
30
  if (options.batch !== undefined && options.batch !== '') {
31
31
  args.push('--batch', String(options.batch));
32
32
  }
33
+ if (options.benchmark !== undefined && options.benchmark !== '') {
34
+ args.push('--benchmark', String(options.benchmark));
35
+ }
33
36
  if (options.cacheDir !== undefined && options.cacheDir !== '') {
34
37
  args.push('--cache-dir', String(options.cacheDir));
35
38
  }
36
39
  if (options.cacheTtl !== undefined && options.cacheTtl !== '') {
37
40
  args.push('--cache-ttl', String(options.cacheTtl));
38
41
  }
42
+ if (options.censusMode !== undefined && options.censusMode !== '') {
43
+ args.push('--census-mode', String(options.censusMode));
44
+ }
39
45
  if (options.citiesUrl !== undefined && options.citiesUrl !== '') {
40
46
  args.push('--cities-url', String(options.citiesUrl));
41
47
  }
@@ -45,6 +51,9 @@ async function executeGeocode(itemIndex) {
45
51
  if (options.delimiter !== undefined && options.delimiter !== '') {
46
52
  args.push('--delimiter', String(options.delimiter));
47
53
  }
54
+ if (options.endpoint !== undefined && options.endpoint !== '') {
55
+ args.push('--endpoint', String(options.endpoint));
56
+ }
48
57
  if (options.force === true) {
49
58
  args.push('--force');
50
59
  }
@@ -78,6 +87,9 @@ async function executeGeocode(itemIndex) {
78
87
  if (options.olderThan !== undefined && options.olderThan !== '') {
79
88
  args.push('--older-than', String(options.olderThan));
80
89
  }
90
+ if (options.params !== undefined && options.params !== '') {
91
+ args.push('--params', String(options.params));
92
+ }
81
93
  if (options.rateLimit !== undefined && options.rateLimit !== '') {
82
94
  args.push('--rate-limit', String(options.rateLimit));
83
95
  }
@@ -90,6 +102,9 @@ async function executeGeocode(itemIndex) {
90
102
  if (options.timeout !== undefined && options.timeout !== '') {
91
103
  args.push('--timeout', String(options.timeout));
92
104
  }
105
+ if (options.vintage !== undefined && options.vintage !== '') {
106
+ args.push('--vintage', String(options.vintage));
107
+ }
93
108
  if (additionalArgs.trim()) {
94
109
  const rawMatches = additionalArgs.match(/[^\s"']+|"[^"]*"|'[^']*'/g) || [];
95
110
  const parsedArgs = rawMatches.map((arg) => {
@@ -22,6 +22,9 @@ async function executeGeoconvert(itemIndex) {
22
22
  const additionalArgs = this.getNodeParameter('additionalArgs', itemIndex, '') || '';
23
23
  const options = this.getNodeParameter('options', itemIndex, {}) || {};
24
24
  const args = ['geoconvert'];
25
+ if (options.delimiter !== undefined && options.delimiter !== '') {
26
+ args.push('--delimiter', String(options.delimiter));
27
+ }
25
28
  if (options.geometry !== undefined && options.geometry !== '') {
26
29
  args.push('--geometry', String(options.geometry));
27
30
  }
@@ -83,9 +83,6 @@ async function executeJoinp(itemIndex) {
83
83
  if (options.left_by !== undefined && options.left_by !== '') {
84
84
  args.push('--left_by', String(options.left_by));
85
85
  }
86
- if (options.lowMemory === true) {
87
- args.push('--low-memory');
88
- }
89
86
  if (options.maintainOrder !== undefined && options.maintainOrder !== '') {
90
87
  args.push('--maintain-order', String(options.maintainOrder));
91
88
  }
@@ -45,6 +45,9 @@ async function executePivotp(itemIndex) {
45
45
  if (options.maxColumns !== undefined && options.maxColumns !== '') {
46
46
  args.push('--max-columns', String(options.maxColumns));
47
47
  }
48
+ if (options.noMoarstats === true) {
49
+ args.push('--no-moarstats');
50
+ }
48
51
  if (options.sortColumns === true) {
49
52
  args.push('--sort-columns');
50
53
  }
@@ -51,9 +51,6 @@ async function executeSqlp(itemIndex) {
51
51
  if (options.inferLen !== undefined && options.inferLen !== '') {
52
52
  args.push('--infer-len', String(options.inferLen));
53
53
  }
54
- if (options.lowMemory === true) {
55
- args.push('--low-memory');
56
- }
57
54
  if (options.noOptimizations === true) {
58
55
  args.push('--no-optimizations');
59
56
  }
@@ -67,6 +67,9 @@ async function executeValidate(itemIndex) {
67
67
  if (options.noHeaders === true) {
68
68
  args.push('--no-headers');
69
69
  }
70
+ if (options.offline === true) {
71
+ args.push('--offline');
72
+ }
70
73
  if (options.prettyJson === true) {
71
74
  args.push('--pretty-json');
72
75
  }
@@ -27,6 +27,9 @@ async function executeViz(itemIndex) {
27
27
  if (options.annotation !== undefined && options.annotation !== '') {
28
28
  args.push('--annotation', String(options.annotation));
29
29
  }
30
+ if (options.area === true) {
31
+ args.push('--area');
32
+ }
30
33
  if (options.bins !== undefined && options.bins !== '') {
31
34
  args.push('--bins', String(options.bins));
32
35
  }
@@ -57,6 +60,9 @@ async function executeViz(itemIndex) {
57
60
  if (options.datasetPid !== undefined && options.datasetPid !== '') {
58
61
  args.push('--dataset-pid', String(options.datasetPid));
59
62
  }
63
+ if (options.degrees === true) {
64
+ args.push('--degrees');
65
+ }
60
66
  if (options.delimiter !== undefined && options.delimiter !== '') {
61
67
  args.push('--delimiter', String(options.delimiter));
62
68
  }
@@ -147,6 +153,9 @@ async function executeViz(itemIndex) {
147
153
  if (options.maxCharts !== undefined && options.maxCharts !== '') {
148
154
  args.push('--max-charts', String(options.maxCharts));
149
155
  }
156
+ if (options.noDaemonBridge === true) {
157
+ args.push('--no-daemon-bridge');
158
+ }
150
159
  if (options.noHeaders === true) {
151
160
  args.push('--no-headers');
152
161
  }
@@ -156,6 +165,9 @@ async function executeViz(itemIndex) {
156
165
  if (options.noOther === true) {
157
166
  args.push('--no-other');
158
167
  }
168
+ if (options.noParcoords === true) {
169
+ args.push('--no-parcoords');
170
+ }
159
171
  if (options.noSnap === true) {
160
172
  args.push('--no-snap');
161
173
  }
@@ -88,7 +88,7 @@ exports.CatDescription = [
88
88
  name: 'group',
89
89
  type: 'string',
90
90
  default: 'none',
91
- description: 'When concatenating with rowskey, you can specify a grouping value which will be used as the first column in the output. This is useful when you want to know which file a row came from. Valid values are \'fullpath\', \'parentdirfname\', \'parentdirfstem\', \'fname\', \'fstem\' and \'none\'. A new column will be added to the beginning of each row using --group-name. If \'none\' is specified, no grouping column will be added.',
91
+ description: 'When concatenating with rowskey, you can specify a grouping value which will be used as the first column in the output. This is useful when you want to know which file a row came from. Valid values are \'fullpath\', \'parentdirfname\', \'parentdirfstem\', \'fname\', \'fstem\' and \'none\'. For a file at /data/2024/jan/sales.csv, \'fullpath\' gives \'/data/2024/jan/sales.csv\', \'parentdirfname\' gives \'jan/sales.csv\', \'parentdirfstem\' gives \'jan/sales\', \'fname\' gives \'sales.csv\' and \'fstem\' gives \'sales\'. \'fullpath\' and the parentdir kinds use the file\'s real location (symlinks and relative paths resolved), so the result does not depend on how the path was typed. Use a parentdir kind to tell apart same-named files in different directories. For a compressed input, \'fullpath\' names the real file (/data/jan/sales.csv.sz, or /data/jan/2024.zip/sales.csv for an entry sales.csv in a zip archive). The other kinds treat it as if unpacked in place, so \'parentdirfname\' gives jan/sales.csv and 2024/sales.csv. Piped stdin is named \'stdin.csv\' (\'<stdin>\' for \'fullpath\'). A new column will be added to the beginning of each row using --group-name. If \'none\' is specified, no grouping column will be added.',
92
92
  },
93
93
  {
94
94
  displayName: 'Group Name',
@@ -43,8 +43,8 @@ exports.CountDescription = [
43
43
  displayName: 'Delimiter',
44
44
  name: 'delimiter',
45
45
  type: 'string',
46
- default: ',',
47
- description: 'The delimiter to use when reading CSV data. Must be a single character.',
46
+ default: '',
47
+ description: 'The field delimiter for reading CSV data. Must be a single character. (default: ,)',
48
48
  },
49
49
  {
50
50
  displayName: 'Flexible',
@@ -67,13 +67,6 @@ exports.CountDescription = [
67
67
  default: false,
68
68
  description: 'Output the width stats in JSON format.',
69
69
  },
70
- {
71
- displayName: 'Low Memory',
72
- name: 'lowMemory',
73
- type: 'boolean',
74
- default: false,
75
- description: 'Use the Polars CSV Reader\'s low-memory mode. This mode is slower but uses less memory. If counting still fails, use --no-polars instead to use the streaming CSV reader.',
76
- },
77
70
  {
78
71
  displayName: 'No Headers',
79
72
  name: 'noHeaders',
@@ -154,7 +154,7 @@ exports.DescribegptDescription = [
154
154
  name: 'format',
155
155
  type: 'string',
156
156
  default: 'Markdown',
157
- description: 'Output format: Markdown, TSV, JSON, TOON, JSONSchema, SemanticMd, or OKF. TOON is a compact, human-readable encoding of the JSON data model for LLM prompts. See https://toonformat.dev/ for more info. JSONSchema emits the Data Dictionary as a JSON Schema (draft 2020-12) document, enriched with LLM-inferred Label, Description and Content Type (the latter only when the infer-content-type flag is set). qsv- and LLM- specific metadata not modeled by the JSON Schema spec (cardinality, null_count, weighted example counts, content_type, null_values, null_candidates, addl stats columns) is preserved via a single x-qsv annotation object per property; unknown keywords are ignored by validators per the 2020-12 spec. The JSONSchema format requires the dictionary inference phase (the dictionary or all flag). The description inference, when also run, becomes the schema\'s top-level description; tags, when also run, are embedded at x-qsv.tags. The prompt inference is not supported. SemanticMd emits the Data Dictionary as a Semantic Markdown document (https://semanticmd.org/) - human-readable markdown with light, agent-parseable conventions that a companion converter turns into JSON. It enriches each column with a catalog-wide Concept ID (for cross-dataset join discovery), an analytical Role (dimension/measure/identifier/timestamp), join keys & cardinality, data-quality flags, and a richer per-column statistics block; it also emits a dataset grain and a temporal/spatial envelope. To populate Concept/Role/grain, SemanticMd implies --infer-content-type. Like JSONSchema, it requires the dictionary inference phase (the dictionary or all flag). The description inference, when also run, becomes the \'# Dataset\' description; tags, when also run, are embedded in the document frontmatter. The prompt inference is not supported. OKF emits the Data Dictionary as an Open Knowledge Format document (https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf) - a leaner, vendor-neutral plain-markdown-plus-YAML-frontmatter format. It emits frontmatter (type/title/description/resource/timestamp/tags) and a Schema section with a Column/Type/Content Type/Description/Enumeration table. The type frontmatter key is set via the okf-type flag (default "CSV Table"); ds-source maps to resource and ds-updated maps to timestamp. Like SemanticMd, OKF implies infer-content-type, requires the dictionary inference phase (the dictionary or all flag), folds the description inference into the body prose and a single-sentence frontmatter description, and embeds tags in the frontmatter. The prompt inference is not supported.',
157
+ description: 'Output format: Markdown, TSV, JSON, TOON, JSONSchema, SemanticMd, or OKF. TOON is a compact, human-readable encoding of the JSON data model for LLM prompts. Output conforms to the latest TOON v4 spec. See https://toonformat.dev/ & https://toonformat.dev/guide/whats-new-in-v4.html JSONSchema emits the Data Dictionary as a JSON Schema (draft 2020-12) document, enriched with LLM-inferred Label, Description and Content Type (the latter only when the infer-content-type flag is set). qsv- and LLM- specific metadata not modeled by the JSON Schema spec (cardinality, null_count, weighted example counts, content_type, null_values, null_candidates, addl stats columns) is preserved via a single x-qsv annotation object per property; unknown keywords are ignored by validators per the 2020-12 spec. The JSONSchema format requires the dictionary inference phase (the dictionary or all flag). The description inference, when also run, becomes the schema\'s top-level description; tags, when also run, are embedded at x-qsv.tags. The prompt inference is not supported. SemanticMd emits the Data Dictionary as a Semantic Markdown document (https://semanticmd.org/) - human-readable markdown with light, agent-parseable conventions that a companion converter turns into JSON. It enriches each column with a catalog-wide Concept ID (for cross-dataset join discovery), an analytical Role (dimension/measure/identifier/timestamp), join keys & cardinality, data-quality flags, and a richer per-column statistics block; it also emits a dataset grain and a temporal/spatial envelope. To populate Concept/Role/grain, SemanticMd implies --infer-content-type. Like JSONSchema, it requires the dictionary inference phase (the dictionary or all flag). The description inference, when also run, becomes the \'# Dataset\' description; tags, when also run, are embedded in the document frontmatter. The prompt inference is not supported. OKF emits the Data Dictionary as an Open Knowledge Format document (https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf) - a leaner, vendor-neutral plain-markdown-plus-YAML-frontmatter format. It emits frontmatter (type/title/description/resource/timestamp/tags) and a Schema section with a Column/Type/Content Type/Description/Enumeration table. The type frontmatter key is set via the okf-type flag (default "CSV Table"); ds-source maps to resource and ds-updated maps to timestamp. Like SemanticMd, OKF implies infer-content-type, requires the dictionary inference phase (the dictionary or all flag), folds the description inference into the body prose and a single-sentence frontmatter description, and embeds tags in the frontmatter. The prompt inference is not supported.',
158
158
  },
159
159
  {
160
160
  displayName: 'Freq Options',
@@ -69,8 +69,8 @@ exports.ExcelDescription = [
69
69
  displayName: 'Delimiter',
70
70
  name: 'delimiter',
71
71
  type: 'string',
72
- default: ',',
73
- description: 'The delimiter to use when writing CSV data. Must be a single character.',
72
+ default: '',
73
+ description: 'The delimiter to use when writing CSV data. Must be a single character. (default: ,)',
74
74
  },
75
75
  {
76
76
  displayName: 'Error Format',
@@ -91,7 +91,7 @@ exports.FrequencyDescription = [
91
91
  name: 'frequencyJsonl',
92
92
  type: 'boolean',
93
93
  default: false,
94
- description: 'Write the complete frequency distribution as a JSONL cache file (FILESTEM.freq.csv.data.jsonl). Requires a non-stdin input file. The cache contains metadata and per-column frequency data. ALL_UNIQUE columns (rowcount == cardinality) get a single ALL_UNIQUE sentinel. HIGH_CARDINALITY columns (cardinality exceeds the smaller of --high-card-threshold/--high-card-pct of rowcount) get a single HIGH_CARDINALITY sentinel. When a valid (fresh) cache already exists, frequency will automatically reuse it instead of recomputing from the CSV. Use --force to regenerate the cache even when it is valid. Cache is NOT used when --ignore-case, --no-trim, or --weight are active, as these change how values are computed.',
94
+ description: 'Write the complete frequency distribution as a JSONL cache file (FILESTEM.freq.csv.data.jsonl). Requires a non-stdin input file. The cache contains metadata and per-column frequency data. ALL_UNIQUE columns (rowcount == cardinality) get a single ALL_UNIQUE sentinel. HIGH_CARDINALITY columns (cardinality exceeds the smaller of --high-card-threshold/--high-card-pct of rowcount) get a single HIGH_CARDINALITY sentinel. Columns with any value that is not valid UTF-8 get a single NON_UTF8 sentinel, since the cache stores values as UTF-8 text. HIGH_CARDINALITY and NON_UTF8 columns are recomputed when the cache is reused. When a valid (fresh) cache already exists, frequency will automatically reuse it instead of recomputing from the CSV. Use --force to regenerate the cache even when it is valid. Cache is NOT used when --ignore-case, --no-trim, or --weight are active, as these change how values are computed.',
95
95
  },
96
96
  {
97
97
  displayName: 'High Card Pct',
@@ -112,7 +112,7 @@ exports.FrequencyDescription = [
112
112
  name: 'ignoreCase',
113
113
  type: 'boolean',
114
114
  default: false,
115
- description: 'Ignore case when computing frequencies.',
115
+ description: 'Ignore case when computing frequencies. The stats cache\'s cardinality is case-sensitive, so it cannot prove that case-folded values are unique. All-unique columns are therefore counted in full instead of being short-circuited to <ALL_UNIQUE> - except Integer columns, which have no letters to fold (unless trimming changes one of their values). On large files with all-unique text columns (e.g. emails), this can use memory proportional to the row count. Exclude such columns with -s if you don\'t need them.',
116
116
  },
117
117
  {
118
118
  displayName: 'Json',
@@ -259,7 +259,7 @@ exports.FrequencyDescription = [
259
259
  name: 'sketchMethod',
260
260
  type: 'string',
261
261
  default: 'exact',
262
- description: 'Algorithm used to compute the frequency table. Choices: \'exact\' (default) tracks every distinct value in a HashMap; \'frequent_items\' uses the Apache DataSketches Frequent Items (Misra-Gries) sketch to track top-K heavy hitters with bounded error and constant memory. The frequent_items mode rejects asc, weight, ignore-case, no-trim, other-sorted, null-sorted, frequency-jsonl, stats-filter, and json/pretty-json/toon output; the frequency cache is bypassed. Counts are estimates. The flags rank-strategy, lmt-threshold, and unq-limit are silently ignored under this mode (the sketch\'s natural ordering is top-K by estimate descending; tied counts use the sketch\'s hash-table iteration order). The \'Other\' row format diverges from exact: label is the bare other-text (no unique-count suffix since the sketch cannot recover the true count of items not in the top-K); rank is 0 to match the exact convention. Note: \'frequent_items\' requires a little-endian target. Apache DataSketches does not support big-endian platforms (e.g., s390x); on those builds, this choice is rejected.',
262
+ description: 'Algorithm used to compute the frequency table. Choices: \'exact\' (default) tracks every distinct value in a HashMap; \'frequent_items\' uses the Apache DataSketches Frequent Items (Misra-Gries) sketch to track top-K heavy hitters with bounded error and constant memory. The frequent_items mode rejects asc, weight, ignore-case, no-trim, other-sorted, null-sorted, frequency-jsonl, stats-filter, and json/pretty-json/toon output; the frequency cache is bypassed. Counts are estimates. The flags rank-strategy, lmt-threshold, and unq-limit are silently ignored under this mode (the sketch\'s natural ordering is top-K by estimate descending; tied counts use the sketch\'s hash-table iteration order). The \'Other\' row format diverges from exact: label is the bare other-text (no unique-count suffix since the sketch cannot recover the true count of items not in the top-K); rank is 0 to match the exact convention. Its count is approximate. NULLs are counted exactly, outside the sketch, and are reported as in exact mode (after "Other"). Note: \'frequent_items\' requires a little-endian target. Apache DataSketches does not support big-endian platforms (e.g., s390x); on those builds, this choice is rejected.',
263
263
  },
264
264
  {
265
265
  displayName: 'Stats Filter',
@@ -25,8 +25,12 @@ exports.GeocodeDescription = [
25
25
  { name: 'cache-clear', value: 'cache-clear' },
26
26
  { name: 'cache-info', value: 'cache-info' },
27
27
  { name: 'cache-prune', value: 'cache-prune' },
28
+ { name: 'census', value: 'census' },
29
+ { name: 'censusnow', value: 'censusnow' },
28
30
  { name: 'countryinfo', value: 'countryinfo' },
29
31
  { name: 'countryinfonow', value: 'countryinfonow' },
32
+ { name: 'geoclient', value: 'geoclient' },
33
+ { name: 'geoclientnow', value: 'geoclientnow' },
30
34
  { name: 'iplookup', value: 'iplookup' },
31
35
  { name: 'iplookupnow', value: 'iplookupnow' },
32
36
  { name: 'opencage', value: 'opencage' },
@@ -36,7 +40,7 @@ exports.GeocodeDescription = [
36
40
  { name: 'suggest', value: 'suggest' },
37
41
  { name: 'suggestnow', value: 'suggestnow' },
38
42
  ],
39
- description: 'Subcommand to execute. Valid values: cache-clear, cache-info, cache-prune, countryinfo, countryinfonow, iplookup, iplookupnow, opencage, opencagenow, reverse, reversenow, suggest, suggestnow',
43
+ description: 'Subcommand to execute. Valid values: cache-clear, cache-info, cache-prune, census, censusnow, countryinfo, countryinfonow, geoclient, geoclientnow, iplookup, iplookupnow, opencage, opencagenow, reverse, reversenow, suggest, suggestnow',
40
44
  displayOptions: {
41
45
  show: {
42
46
  operation: ['geocode'],
@@ -49,7 +53,7 @@ exports.GeocodeDescription = [
49
53
  type: 'string',
50
54
  required: false,
51
55
  default: '',
52
- description: 'The column to geocode. Used by suggest, reverse & countryinfo subcommands. For suggest, it must be a column with a City string pattern. For reverse, it must be a column using WGS 84 coordinates in "lat, long" or "(lat, long)" format. For countryinfo, it must be a column with a ISO 3166-1 alpha-2 country code. For iplookup, it must be a column with an IP address or a URL. For opencage, it may be a free-form address OR a WGS 84 coordinate. Note that you can use column selector syntax to select the column, but only the first column will be used. See `select --help` for more information.',
56
+ description: 'The column to geocode. Used by suggest, reverse & countryinfo subcommands. For suggest, it must be a column with a City string pattern. For reverse, it must be a column using WGS 84 coordinates in "lat, long" or "(lat, long)" format. For countryinfo, it must be a column with a ISO 3166-1 alpha-2 country code. For iplookup, it must be a column with an IP address or a URL. For opencage, it may be a free-form address OR a WGS 84 coordinate. For geoclient, it is the NYC location, BIN, BBL, street name or street code (see --endpoint). For census, it is a one-line US address or, with --reverse, a WGS 84 coordinate (with --params, the column the result goes in). Note that you can use column selector syntax to select the column, but only the first column will be used. See `select --help` for more information.',
53
57
  displayOptions: {
54
58
  show: {
55
59
  operation: ['geocode'],
@@ -62,7 +66,7 @@ exports.GeocodeDescription = [
62
66
  type: 'string',
63
67
  required: false,
64
68
  default: '',
65
- description: 'The location to geocode for suggestnow, reversenow, countryinfonow and iplookupnow subcommands. For suggestnow, its a City string pattern. For reversenow, it must be a WGS 84 coordinate. For countryinfonow, it must be a ISO 3166-1 alpha-2 code. For iplookupnow, it must be an IP address or a URL. For opencagenow, it must be an address OR a WGS 84 coordinate.',
69
+ description: 'The location to geocode for suggestnow, reversenow, countryinfonow and iplookupnow subcommands. For suggestnow, its a City string pattern. For reversenow, it must be a WGS 84 coordinate. For countryinfonow, it must be a ISO 3166-1 alpha-2 code. For iplookupnow, it must be an IP address or a URL. For opencagenow, it must be an address OR a WGS 84 coordinate. For geoclientnow, it is a NYC location, BIN, BBL, street name or street code. For censusnow, it is a one-line US address or, with --reverse, a WGS 84 coordinate.',
66
70
  displayOptions: {
67
71
  show: {
68
72
  operation: ['geocode'],
@@ -132,26 +136,40 @@ exports.GeocodeDescription = [
132
136
  default: 50000,
133
137
  description: 'The number of rows per batch to load into memory, before running in parallel. Set to 0 to load all rows in one batch.',
134
138
  },
139
+ {
140
+ displayName: 'Benchmark',
141
+ name: 'benchmark',
142
+ type: 'string',
143
+ default: '',
144
+ description: 'The Census Geocoder benchmark (address ranges release). Default: Public_AR_Current.',
145
+ },
135
146
  {
136
147
  displayName: 'Cache Dir',
137
148
  name: 'cacheDir',
138
149
  type: 'string',
139
150
  default: '~/.qsv-cache',
140
- description: 'The directory to use for caching the Geonames cities index and the persistent on-disk OpenCage result cache. If the directory does not exist, qsv will attempt to create it. If the QSV_CACHE_DIR envvar is set, it will be used instead.',
151
+ description: 'The directory to use for caching the Geonames cities index and the persistent on-disk OpenCage, Geoclient and Census result caches. If the directory does not exist, qsv will attempt to create it. If the QSV_CACHE_DIR envvar is set, it will be used instead. The index file is named for the qsv release, so each upgrade downloads a new one. When it does, qsv deletes the index files of all but the 5 most recent releases found in this directory.',
141
152
  },
142
153
  {
143
154
  displayName: 'Cache Ttl',
144
155
  name: 'cacheTtl',
145
156
  type: 'number',
146
157
  default: 1209600,
147
- description: 'Time-to-live for the persistent on-disk OpenCage result cache. A value of 0 disables time-based expiration (entries are cached indefinitely). Use --no-cache to disable caching entirely.',
158
+ description: 'Time-to-live for the persistent on-disk result cache. A value of 0 disables time-based expiration (entries are cached indefinitely). Use --no-cache to disable caching entirely.',
159
+ },
160
+ {
161
+ displayName: 'Census Mode',
162
+ name: 'censusMode',
163
+ type: 'string',
164
+ default: '',
165
+ description: 'Whether to use the Census batch endpoints: auto - (default) batch when the output only needs batch fields and at least 50 rows of a --batch still need a lookup. batch - always batch. An output that needs more than the batch fields (e.g. %json) is an error. single - one request per location. The address parts for census --params are street, city, state and zip, e.g. "street={Street},city={City},state=NY". A street needs a zip, or a city and state.',
148
166
  },
149
167
  {
150
168
  displayName: 'Cities Url',
151
169
  name: 'citiesUrl',
152
170
  type: 'string',
153
- default: 'https://download.geonames.org/export/dump/cities15000.zip',
154
- description: 'The URL to download the Geonames cities file from. There are several available at https://download.geonames.org/export/dump/. cities500.zip - cities with populations > 500; ~200k cities, 56mb cities1000.zip - population > 1000; ~140k cities, 44mb cities5000.zip - population > 5000; ~53k cities, 21mb cities15000.zip - population > 15000; ~26k cities, 13mb Note that the more cities are included, the larger the local index file will be, lookup times will be slower, and the search results will be different. For convenience, if this is set to 500, 1000, 5000 or 15000, it will be converted to a geonames cities URL.',
171
+ default: '',
172
+ description: 'The URL to download the Geonames cities file from. There are several available at https://download.geonames.org/export/dump/. cities500.zip - cities with populations > 500; ~200k cities, 56mb cities1000.zip - population > 1000; ~140k cities, 44mb cities5000.zip - population > 5000; ~53k cities, 21mb cities15000.zip - population > 15000; ~26k cities, 13mb Note that the more cities are included, the larger the local index file will be, lookup times will be slower, and the search results will be different. For convenience, if this is set to 500, 1000, 5000 or 15000, it will be converted to a geonames cities URL. If not set, the cities file the current index was built from is used (cities15000.zip if there is no current index). Setting it to a different URL than the current index\'s forces a rebuild.',
155
173
  },
156
174
  {
157
175
  displayName: 'Country',
@@ -167,12 +185,19 @@ exports.GeocodeDescription = [
167
185
  default: '',
168
186
  description: 'The field delimiter for reading CSV data. Must be a single character. (default: ,)',
169
187
  },
188
+ {
189
+ displayName: 'Endpoint',
190
+ name: 'endpoint',
191
+ type: 'string',
192
+ default: '',
193
+ description: 'The Geoclient lookup: search (default), bin, bbl, normalize, streetcode, address, addresspoint, intersection, place or blockface. See GEOCLIENT above.',
194
+ },
170
195
  {
171
196
  displayName: 'Force',
172
197
  name: 'force',
173
198
  type: 'boolean',
174
199
  default: false,
175
- description: 'Force update the Geonames cities index. If not set, qsv will check if there are updates available at Geonames.org before updating the index.',
200
+ description: 'Force update the Geonames cities index. If not set, qsv will check if there are updates available at Geonames.org before updating the index. With --force, the index is built even if there is no current index.',
176
201
  },
177
202
  {
178
203
  displayName: 'Formatstr',
@@ -206,8 +231,8 @@ exports.GeocodeDescription = [
206
231
  displayName: 'Languages',
207
232
  name: 'languages',
208
233
  type: 'string',
209
- default: 'en',
210
- description: 'The comma-delimited, case-insensitive list of languages to use when building the Geonames cities index. The languages are specified as a comma-separated list of ISO 639-2 codes. See https://download.geonames.org/export/dump/iso-languagecodes.txt to look up codes and https://download.geonames.org/export/dump/alternatenames/ for the supported language files. 253 languages are currently supported.',
234
+ default: '',
235
+ description: 'The comma-delimited, case-insensitive list of languages to use when building the Geonames cities index. The languages are specified as Geonames language codes - the ISO 639-1 2-letter code where one exists (e.g. en,fr,de,es), else the ISO 639-2/3 code. See https://download.geonames.org/export/dump/iso-languagecodes.txt to look up codes and https://download.geonames.org/export/dump/alternatenames/ for the supported language files. 253 languages are currently supported. If not set, the languages the current index was built with are used (en if there is no current index). Setting it to a different list than the current index\'s forces a rebuild.',
211
236
  },
212
237
  {
213
238
  displayName: 'Min Score',
@@ -235,21 +260,28 @@ exports.GeocodeDescription = [
235
260
  name: 'noCache',
236
261
  type: 'boolean',
237
262
  default: false,
238
- description: 'Disable the persistent on-disk OpenCage cache. Duplicate queries within a run are still de-duplicated.',
263
+ description: 'Disable the persistent on-disk result cache. Duplicate queries within a run are still de-duplicated (for geoclient and census, within each --batch).',
239
264
  },
240
265
  {
241
266
  displayName: 'Older Than',
242
267
  name: 'olderThan',
243
268
  type: 'string',
244
269
  default: '',
245
- description: 'Delete OpenCage cache entries older than this value. Accepts an absolute date/datetime (e.g. 2025-01-31) or a relative age with a unit suffix (s/m/h/d/w = seconds, minutes, hours, days or weeks; e.g. 30d, 2w, 48h). Required by the cache-prune subcommand.',
270
+ description: 'Delete OpenCage, Geoclient and Census cache entries older than this value. Accepts an absolute date/datetime (e.g. 2025-01-31) or a relative age with a unit suffix (s/m/h/d/w = seconds, minutes, hours, days or weeks; e.g. 30d, 2w, 48h). Required by the cache-prune subcommand.',
271
+ },
272
+ {
273
+ displayName: 'Params',
274
+ name: 'params',
275
+ type: 'string',
276
+ default: '',
277
+ description: 'Comma-separated Geoclient parameters for the structured endpoints, each "name={Column}" or "name=value", e.g. "houseNumber={HouseNo},street={Street},borough={Boro}". For search, only fixed options are allowed, e.g. "exactMatchMaxLevel=5". Also used by census to read an address from several columns: see CENSUS only options.',
246
278
  },
247
279
  {
248
280
  displayName: 'Rate Limit',
249
281
  name: 'rateLimit',
250
282
  type: 'number',
251
- default: 1,
252
- description: 'Maximum number of OpenCage API requests per second. The free tier allows 1 request/second (2,500/day).',
283
+ default: 0,
284
+ description: 'Maximum number of API requests per second. Defaults to 1 for opencage (its free trial allows 1 request/second, 2,500/day), 40 for geoclient (the public API allows 100/second per IP but only 2,500/minute, so 41.6/second sustained, and 500,000/day) and 5 for census (single-record lookups; batch uploads are paced separately).',
253
285
  },
254
286
  {
255
287
  displayName: 'Rename',
@@ -263,14 +295,21 @@ exports.GeocodeDescription = [
263
295
  name: 'reverse',
264
296
  type: 'boolean',
265
297
  default: false,
266
- description: 'Force reverse geocoding for opencage/opencagenow (treat the query as a "lat, long" WGS-84 coordinate). If not set, forward and reverse mode is auto-detected per row.',
298
+ description: 'Force reverse geocoding for opencage/opencagenow (treat the query as a "lat, long" WGS-84 coordinate). If not set, forward and reverse mode is auto-detected per row. For census/censusnow, <column> holds "lat, long" coordinates and the Census geographies at that point are returned.',
267
299
  },
268
300
  {
269
301
  displayName: 'Timeout',
270
302
  name: 'timeout',
271
303
  type: 'number',
272
304
  default: 120,
273
- description: 'Timeout for downloading Geonames cities index. Also applies to each Geonames source file downloaded when rebuilding the index with index-update - raise it on slow connections.',
305
+ description: 'Timeout for downloading Geonames cities index. Also applies to each Geonames source file downloaded when rebuilding the index with index-update, and to the prebuilt index downloaded by index-load and index-reset - raise it on slow connections. For opencage, geoclient and census, it is the timeout for each API request.',
306
+ },
307
+ {
308
+ displayName: 'Vintage',
309
+ name: 'vintage',
310
+ type: 'string',
311
+ default: '',
312
+ description: 'The Census Geocoder vintage (geography release), e.g. Current_Current, Census2020_Current or ACS2026_Current. Default: Current_Current.',
274
313
  },
275
314
  ],
276
315
  },
@@ -77,6 +77,13 @@ exports.GeoconvertDescription = [
77
77
  },
78
78
  },
79
79
  options: [
80
+ {
81
+ displayName: 'Delimiter',
82
+ name: 'delimiter',
83
+ type: 'string',
84
+ default: '',
85
+ description: 'The field delimiter for reading CSV input. Must be a single character. (default: ,)',
86
+ },
80
87
  {
81
88
  displayName: 'Geometry',
82
89
  name: 'geometry',
@@ -103,7 +110,7 @@ exports.GeoconvertDescription = [
103
110
  name: 'maxLength',
104
111
  type: 'number',
105
112
  default: 0,
106
- description: 'The maximum column length when the output format is CSV. Oftentimes, the geometry column is too long to fit in a CSV file, causing other tools like Python & PostgreSQL to fail. If a column is too long, it will be truncated to the specified length and an ellipsis ("...") will be appended.',
113
+ description: 'The maximum column length in bytes when the output format is CSV. Oftentimes, the geometry column is too long to fit in a CSV file, causing other tools like Python & PostgreSQL to fail. If a column is too long, it will be truncated to the specified length and an ellipsis ("...") will be appended, so a truncated value is up to 3 bytes longer.',
107
114
  },
108
115
  ],
109
116
  },
@@ -104,7 +104,7 @@ exports.GetDescription = [
104
104
  name: 'cacheDir',
105
105
  type: 'string',
106
106
  default: '~/.qsv-cache',
107
- description: 'The qsv cache directory. Overrides the QSV_CACHE_DIR env var.',
107
+ description: 'The qsv cache directory. If the QSV_CACHE_DIR envvar is set, it will be used instead.',
108
108
  },
109
109
  {
110
110
  displayName: 'Ckan Api',
@@ -237,13 +237,6 @@ exports.JoinpDescription = [
237
237
  default: false,
238
238
  description: 'This returns only the rows in the first CSV data set that have a corresponding row in the second data set. The output schema is the same as the first data set.',
239
239
  },
240
- {
241
- displayName: 'Low Memory',
242
- name: 'lowMemory',
243
- type: 'boolean',
244
- default: false,
245
- description: 'Use low memory mode when parsing CSVs. This will use less memory but will be slower. It will also process the join in streaming mode. Only use this when you get out of memory errors.',
246
- },
247
240
  {
248
241
  displayName: 'Maintain Order',
249
242
  name: 'maintainOrder',
@@ -340,7 +333,7 @@ exports.JoinpDescription = [
340
333
  name: 'streaming',
341
334
  type: 'boolean',
342
335
  default: false,
343
- description: 'When set, the join will be done in a streaming fashion. Only use this when you get out of memory errors.',
336
+ description: 'Write the join result as it is computed, batch by batch, instead of collecting the whole result in memory first. Use this when the result is too big for memory: it uses less memory but is slower. An --output file is written beside its target and only moved into place if the join succeeds; overwriting an existing file copies the result into it, so it keeps its owner, group, mode and links, and briefly needs disk space for two copies. On stdout, rows are sent as they are computed, so a join that fails part-way leaves its output cut short; check the exit code.',
344
337
  },
345
338
  {
346
339
  displayName: 'Time Format',
@@ -62,8 +62,8 @@ exports.JsonlDescription = [
62
62
  displayName: 'Delimiter',
63
63
  name: 'delimiter',
64
64
  type: 'string',
65
- default: ',',
66
- description: 'The delimiter to use when writing CSV data. Must be a single character.',
65
+ default: '',
66
+ description: 'The delimiter to use when writing CSV data. Must be a single character. (default: ,)',
67
67
  },
68
68
  {
69
69
  displayName: 'Ignore Errors',
@@ -69,7 +69,7 @@ exports.PivotpDescription = [
69
69
  name: 'agg',
70
70
  type: 'string',
71
71
  default: 'smart',
72
- description: 'The aggregation function to use: first - First value encountered last - Last value encountered sum - Sum of values min - Minimum value max - Maximum value mean - Average value median - Median value quantile@<p> - Quantile at probability p in [0, 1] using linear interpolation. Alias: q@<p>. Examples: quantile@0.95, q@0.5 (q@0.5 is equivalent to median for even-length groups). len - Count of values item - Get single value from group. Raises error if there are multiple values. smart - use value column data type & statistics to pick an aggregation. Always uses type, cardinality, sparsity, CV, sign distribution (n_negative/n_positive), and sort_order from streaming stats. When the stats cache includes non-streaming stats (from a prior `stats --everything` or `stats --mode --quartiles`), also uses skewness and mode_count. When moarstats has been run, also leverages outlier profile, Pearson skewness, MAD/stddev ratio, median/mean ratio, and quartile coefficient of dispersion for smarter selection. With moarstats --advanced, also uses kurtosis, bimodality (bimodality coefficient >= 0.555 with negative excess kurtosis), entropy and Gini coefficient. For Date/DateTime values, checks sparsity and sort order. Will only work if there is one value column, otherwise it falls back to `first`',
72
+ description: 'The aggregation function to use: first - First value encountered last - Last value encountered sum - Sum of values min - Minimum value max - Maximum value mean - Average value median - Median value quantile@<p> - Quantile at probability p in [0, 1] using linear interpolation. Alias: q@<p>. Examples: quantile@0.95, q@0.5 (q@0.5 is equivalent to median for even-length groups). len - Count of values item - Get single value from group. Raises error if there are multiple values. smart - use value column data type & statistics to pick an aggregation. Always uses type, cardinality, sparsity, CV, sign distribution (n_negative/n_positive), and sort_order from streaming stats. High variability means a CV above 100% (stddev > mean). When the stats cache includes non-streaming stats (from a prior `stats --everything` or `stats --mode`), also uses mode_count. With a single --values column, smart first runs moarstats --advanced to enrich the input\'s stats cache (writing <stem>.stats.csv, .stats.csv.json and .stats.csv.data.jsonl beside it) unless the cache already has those stats. This one-time pass reads the whole file; skip it with --no-moarstats. It is also skipped with an explicit --delimiter, stdin and special formats. The moarstats stats used are outlier profile, Pearson skewness, MAD/stddev ratio, median/mean ratio and quartile coefficient of dispersion (the two ratios only for positive data), moment skewness (|G1| >= 1 picks median; Pearson skewness is the fallback), kurtosis, bimodality (bimodality coefficient >= 0.60 with negative excess kurtosis), entropy and Gini coefficient. A single-value column uses first. The choice depends on the data, so pass an explicit --agg to pin a result across qsv versions. For Date/DateTime values, checks sparsity and sort order. Will only work if there is one value column, otherwise it falls back to `first`',
73
73
  },
74
74
  {
75
75
  displayName: 'Col Separator',
@@ -90,7 +90,7 @@ exports.PivotpDescription = [
90
90
  name: 'delimiter',
91
91
  type: 'string',
92
92
  default: '',
93
- description: 'The field delimiter for reading/writing CSV data. Must be a single character. (default: ,)',
93
+ description: 'The field delimiter for reading/writing CSV data. Must be a single character. If not set, QSV_DEFAULT_DELIMITER is used, else \',\'. A .tsv/.tab (tab) or .ssv (semicolon) extension on the input or --output file sets that file\'s delimiter. (default: ,)',
94
94
  },
95
95
  {
96
96
  displayName: 'Grand Total',
@@ -125,7 +125,7 @@ exports.PivotpDescription = [
125
125
  name: 'maintainOrder',
126
126
  type: 'boolean',
127
127
  default: false,
128
- description: 'Maintain output order: preserve input column order in pivot mode, and preserve group/row order in group-by mode.',
128
+ description: 'Accepted for compatibility. Output is always in first-appearance order: rows follow their index values\' first appearance and pivoted columns their <on-cols> values\' first appearance.',
129
129
  },
130
130
  {
131
131
  displayName: 'Max Columns',
@@ -134,6 +134,13 @@ exports.PivotpDescription = [
134
134
  default: 100000,
135
135
  description: 'Maximum number of columns the pivot may create before it is refused. Guards against pivoting on a high-cardinality column, which can exhaust memory. Unlike --validate, this ALWAYS runs. Set to 0 for no limit, for a deliberately wide pivot. (pivot mode only; ignored in group-by mode)',
136
136
  },
137
+ {
138
+ displayName: 'No Moarstats',
139
+ name: 'noMoarstats',
140
+ type: 'boolean',
141
+ default: false,
142
+ description: 'For smart aggregation, do not run moarstats --advanced to enrich the stats cache. Smart aggregation then uses whatever stats are already cached (or basic `stats --cardinality` stats).',
143
+ },
137
144
  {
138
145
  displayName: 'Sort Columns',
139
146
  name: 'sortColumns',
@@ -69,8 +69,8 @@ exports.ReadstatDescription = [
69
69
  displayName: 'Delimiter',
70
70
  name: 'delimiter',
71
71
  type: 'string',
72
- default: ',',
73
- description: 'The delimiter to use when writing CSV data. Must be a single character.',
72
+ default: '',
73
+ description: 'The delimiter to use when writing CSV data. Must be a single character. (default: ,)',
74
74
  },
75
75
  {
76
76
  displayName: 'Dictionary',
@@ -84,7 +84,7 @@ exports.SchemaDescription = [
84
84
  name: 'ignoreCase',
85
85
  type: 'boolean',
86
86
  default: false,
87
- description: 'Ignore case when compiling unique values for enum constraints. Do note however that the `validate` command is case-sensitive when validating against enum constraints.',
87
+ description: 'Ignore case when compiling unique values for enum constraints. String columns are then checked against the enum threshold by their case-insensitive cardinality. As the `validate` command is case-sensitive, the enum & const constraints of String columns are written as equivalent case-insensitive regex patterns instead (e.g. "^(?i:false|true)$"). These use the inline `(?i:...)` modifier, which other JSON Schema validators may not support, e.g. on older JavaScript engines.',
88
88
  },
89
89
  {
90
90
  displayName: 'Memcheck',
@@ -68,8 +68,8 @@ exports.ScoresqlDescription = [
68
68
  displayName: 'Delimiter',
69
69
  name: 'delimiter',
70
70
  type: 'string',
71
- default: ',',
72
- description: 'The field delimiter for reading CSV data. Must be a single character.',
71
+ default: '',
72
+ description: 'The field delimiter for reading CSV data. Must be a single character. (default: ,)',
73
73
  },
74
74
  {
75
75
  displayName: 'Duckdb',
@@ -110,8 +110,8 @@ exports.SqlpDescription = [
110
110
  displayName: 'Delimiter',
111
111
  name: 'delimiter',
112
112
  type: 'string',
113
- default: ',',
114
- description: 'The field delimiter for reading and writing CSV data. Must be a single character.',
113
+ default: '',
114
+ description: 'The field delimiter for reading and writing CSV data. Must be a single character. (default: ,)',
115
115
  },
116
116
  {
117
117
  displayName: 'Float Precision',
@@ -141,13 +141,6 @@ exports.SqlpDescription = [
141
141
  default: 10000,
142
142
  description: 'The number of rows to scan when inferring the schema of the CSV. Set to 0 to do a full table scan (warning: can be slow).',
143
143
  },
144
- {
145
- displayName: 'Low Memory',
146
- name: 'lowMemory',
147
- type: 'boolean',
148
- default: false,
149
- description: 'Use low memory mode when parsing CSVs. This will use less memory but will be slower. Only use this when you get out of memory errors.',
150
- },
151
144
  {
152
145
  displayName: 'No Optimizations',
153
146
  name: 'noOptimizations',
@@ -174,7 +167,7 @@ exports.SqlpDescription = [
174
167
  name: 'streaming',
175
168
  type: 'boolean',
176
169
  default: false,
177
- description: 'Use streaming mode when parsing CSVs. This will use less memory but will be slower. Only use this when you get out of memory errors.',
170
+ description: 'Write the query result as it is computed, batch by batch, instead of collecting the whole result in memory first. Use this when the result is too big for memory. Works with the csv, jsonl, parquet and arrow formats; json and avro output still collect the whole result. Queries already run on Polars\' streaming engine either way. An --output file is written beside its target and only moved into place if the query succeeds. Overwriting an existing file copies the result into it, so it keeps its owner, group, mode and links; that briefly needs disk space for two copies. On stdout, rows are sent as they are computed, so a query that fails part-way leaves its output cut short; check sqlp\'s exit code before using it.',
178
171
  },
179
172
  {
180
173
  displayName: 'Time Format',
@@ -77,7 +77,7 @@ exports.StatsDescription = [
77
77
  name: 'cardinalityMethod',
78
78
  type: 'string',
79
79
  default: 'exact',
80
- description: 'Algorithm used to compute the --cardinality column. Choices: exact - track every unique value in a frequency map (current behavior). O(cardinality) memory per column. Subject to --mode-cardinality-cap, which emits the ">=<n>" sentinel on overflow. approx - use HyperLogLog (Apache DataSketches port, lg_k=12). O(1) memory per column (~5KB), ~1.5% relative standard error. Notes: * --mode-cardinality-cap no longer affects the cardinality column under approx; the ">=<n>" sentinel is never emitted. * The cap STILL governs mode/antimode tracking (mode columns still emit "*HIGH_CARDINALITY" on overflow). * --infer-boolean forces exact (boolean inference needs cardinality == 2 exactness); a one-time warning is emitted. * Reproducible across PARALLEL --jobs values: the HLL union used at merge time is associative and order-invariant, so chunk completion order does not affect the final estimate. --jobs 1 never reaches that union and so can report a different estimate than a parallel run - pin --jobs when comparing cardinality across runs. * Requires a little-endian target. Apache DataSketches does not support big-endian platforms (e.g., s390x); on those builds, this choice is rejected.',
80
+ description: 'Algorithm used to compute the --cardinality column. Choices: exact - track every unique value in a frequency map (current behavior). O(cardinality) memory per column. Subject to --mode-cardinality-cap, which emits the ">=<n>" sentinel on overflow. approx - use HyperLogLog (Apache DataSketches port, lg_k=12). O(1) memory per column (~5KB), ~1.5% relative standard error. Notes: * --mode-cardinality-cap no longer affects the cardinality column under approx; the ">=<n>" sentinel is never emitted. * The cap STILL governs mode/antimode tracking (mode columns still emit "*HIGH_CARDINALITY" on overflow). * --infer-boolean forces exact (boolean inference needs cardinality == 2 exactness); a one-time warning is emitted. * When modes are computed (with --mode or with --everything) and no mode cardinality cap is set, the exact mode tracker counts every unique value, so that exact count is reported and no sketch is built. With a cap, the estimate is used only for columns whose tracker was dropped. * The estimate never exceeds the row count. * Reproducible across PARALLEL --jobs values: the HLL union used at merge time is associative and order-invariant, so chunk completion order does not affect the final estimate. --jobs 1 never reaches that union and so can report a different estimate than a parallel run - pin --jobs when comparing cardinality across runs. * Requires a little-endian target. Apache DataSketches does not support big-endian platforms (e.g., s390x); on those builds, this choice is rejected.',
81
81
  },
82
82
  {
83
83
  displayName: 'Dates Whitelist',
@@ -154,7 +154,7 @@ exports.StatsDescription = [
154
154
  name: 'memcheck',
155
155
  type: 'boolean',
156
156
  default: false,
157
- description: 'Use CONSERVATIVE heuristics for the in-memory load check (file size vs. available + free_swap × platform factor − headroom), instead of the default NORMAL check (file size vs. total memory − headroom). The CONSERVATIVE check is stricter and trips OOM far more readily. Ignored when computing default, streaming statistics. (See also: QSV_MEMORY_CHECK env var, equivalent to passing --memcheck.) Independently of this flag, the in-memory load check runs whenever stats takes the non-parallel path with non-streaming columns. On OOM (in either NORMAL or CONSERVATIVE mode), qsv auto-creates an index when no index exists (skipped for stdin) AND switches to approx quantile + approx cardinality methods (DataSketches t-digest and HyperLogLog) where compatible. The sketch fallback can also fire when an index is already present and the OOM still trips (e.g., when jobs is pinned to 1 on a pre-indexed file). A wwarn is emitted listing the auto-enabled estimators.',
157
+ description: 'Use CONSERVATIVE heuristics for the in-memory load check (file size vs. available + free_swap × platform factor − headroom), instead of the default NORMAL check (file size vs. total memory − headroom). The CONSERVATIVE check is stricter and trips OOM far more readily. Ignored when computing default, streaming statistics. (See also: QSV_MEMORY_CHECK env var, equivalent to passing --memcheck.) Independently of this flag, the in-memory load check runs whenever stats takes the non-parallel path with non-streaming columns. On OOM (in either NORMAL or CONSERVATIVE mode), qsv auto-creates an index when no index exists (skipped for stdin) AND switches to approx quantile + approx cardinality methods (DataSketches t-digest and HyperLogLog) where compatible. The sketch fallback can also fire when an index is already present and the OOM still trips (e.g., when jobs is pinned to 1 on a pre-indexed file). A wwarn is emitted listing the auto-enabled estimators. When modes are computed (with --mode or with the everything option) and no mode cardinality cap is set, approx cardinality is NOT auto-enabled: the exact mode table is kept either way, so it would save nothing. A wwarn suggests --mode-cardinality-cap, which is what bounds that table.',
158
158
  },
159
159
  {
160
160
  displayName: 'Mode',
@@ -96,8 +96,8 @@ exports.TemplateDescription = [
96
96
  displayName: 'Delimiter',
97
97
  name: 'delimiter',
98
98
  type: 'string',
99
- default: ',',
100
- description: 'Field separator for reading CSV',
99
+ default: '',
100
+ description: 'Field separator for reading CSV (default: ,)',
101
101
  },
102
102
  {
103
103
  displayName: 'Globals Json',
@@ -78,7 +78,7 @@ exports.ToDescription = [
78
78
  name: 'allStrings',
79
79
  type: 'boolean',
80
80
  default: false,
81
- description: 'Convert all fields to strings.',
81
+ description: 'Convert all fields to strings. For parquet, columns are read as strings without type inference, so the inference length and any pschema.json are not used.',
82
82
  },
83
83
  {
84
84
  displayName: 'Compress Level',
@@ -171,7 +171,7 @@ exports.ValidateDescription = [
171
171
  name: 'noFormatValidation',
172
172
  type: 'boolean',
173
173
  default: false,
174
- description: 'Disable JSON Schema format validation. Ignores all JSON Schema "format" keywords (e.g. date,email, uri, currency, etc.). This is useful when you want to validate the structure of the CSV file w/o worrying about the data types and domain/range of the fields.',
174
+ description: 'Disable JSON Schema format validation. Ignores all JSON Schema "format" keywords (e.g. date,email, uri, currency, etc.). This is useful when you want to validate the structure of the CSV file w/o worrying about the data types and domain/range of the fields. Without this option, a "format" that qsv does not know (e.g. a typo like "emial") is not checked, and a warning names it.',
175
175
  },
176
176
  {
177
177
  displayName: 'No Headers',
@@ -180,6 +180,13 @@ exports.ValidateDescription = [
180
180
  default: false,
181
181
  description: 'When set, the first row will not be interpreted as headers. It will be validated with the rest of the rows. Otherwise, the first row will always appear as the header row in the output. Note that this option is only valid when running in RFC 4180 validation mode as JSON Schema validation requires headers.',
182
182
  },
183
+ {
184
+ displayName: 'Offline',
185
+ name: 'offline',
186
+ type: 'boolean',
187
+ default: false,
188
+ description: 'Do not resolve "$ref"s to schemas outside the JSON Schema file, whether they are URLs or local files; a schema that has them fails to compile. Use this with JSON Schemas you do not trust. The JSON Schema file itself and dynamicEnum lookups are still loaded as usual.',
189
+ },
183
190
  {
184
191
  displayName: 'Pretty Json',
185
192
  name: 'prettyJson',
@@ -199,7 +206,7 @@ exports.ValidateDescription = [
199
206
  name: 'splitRagged',
200
207
  type: 'boolean',
201
208
  default: false,
202
- description: 'Opt-in mode: instead of aborting on the first row with the wrong number of columns (a "ragged" row), write well-formed rows to the \'<input>.<valid>\' file and the ragged rows to the \'<input>.<invalid>\' file, with a report appended to \'<input>.validation-errors.tsv\'. Returns a non-zero exit code when any ragged row is found. Only column-count mismatches are diverted; malformed quoting and non-UTF-8 data still abort validation. Works in both RFC 4180 and JSON Schema validation modes. The split files are written next to each input file, so this is intended for on-disk file input(s).',
209
+ description: 'Opt-in mode: instead of aborting on the first row with the wrong number of columns (a "ragged" row), write well-formed rows to the \'<input>.<valid>\' file and the ragged rows to the \'<input>.<invalid>\' file, with a report appended to \'<input>.validation-errors.tsv\'. Returns a non-zero exit code when any ragged row is found. Only column-count mismatches are diverted; malformed quoting and non-UTF-8 data still abort validation. Works in both RFC 4180 and JSON Schema validation modes. The split files are written next to each input file, so this is intended for on-disk file input(s). A compressed input keeps its full name (data.csv.sz.valid). In RFC 4180 mode, which checks every entry in a zip archive, an entry is named for both (data.zip.data.csv.valid; data.zip.sub/x.csv.valid for an entry in a folder). Piped stdin\'s are \'stdin.csv.*\' in the current directory. If any split file would be written twice, or would overwrite an input, nothing is written.',
203
210
  },
204
211
  {
205
212
  displayName: 'Timeout',
@@ -23,6 +23,7 @@ exports.VizDescription = [
23
23
  default: 'bar',
24
24
  options: [
25
25
  { name: 'bar', value: 'bar' },
26
+ { name: 'barpolar', value: 'barpolar' },
26
27
  { name: 'box', value: 'box' },
27
28
  { name: 'candlestick', value: 'candlestick' },
28
29
  { name: 'choropleth', value: 'choropleth' },
@@ -36,6 +37,7 @@ exports.VizDescription = [
36
37
  { name: 'map', value: 'map' },
37
38
  { name: 'ohlc', value: 'ohlc' },
38
39
  { name: 'parcats', value: 'parcats' },
40
+ { name: 'parcoords', value: 'parcoords' },
39
41
  { name: 'pie', value: 'pie' },
40
42
  { name: 'radar', value: 'radar' },
41
43
  { name: 'sankey', value: 'sankey' },
@@ -44,10 +46,11 @@ exports.VizDescription = [
44
46
  { name: 'smart', value: 'smart' },
45
47
  { name: 'splom', value: 'splom' },
46
48
  { name: 'sunburst', value: 'sunburst' },
49
+ { name: 'ternary', value: 'ternary' },
47
50
  { name: 'treemap', value: 'treemap' },
48
51
  { name: 'violin', value: 'violin' },
49
52
  ],
50
- description: 'Subcommand to execute. Valid values: bar, box, candlestick, choropleth, contour, funnel, geo, heatmap, histogram, icicle, line, map, ohlc, parcats, pie, radar, sankey, scatter, scatter3d, smart, splom, sunburst, treemap, violin',
53
+ description: 'Subcommand to execute. Valid values: bar, barpolar, box, candlestick, choropleth, contour, funnel, geo, heatmap, histogram, icicle, line, map, ohlc, parcats, parcoords, pie, radar, sankey, scatter, scatter3d, smart, splom, sunburst, ternary, treemap, violin',
51
54
  displayOptions: {
52
55
  show: {
53
56
  operation: ['viz'],
@@ -95,7 +98,7 @@ exports.VizDescription = [
95
98
  name: 'agg',
96
99
  type: 'string',
97
100
  default: '',
98
- description: 'How to combine values. For bar/line, aggregate the y values when the x value repeats: one of sum, mean, count, min, max. For treemap/sunburst/icicle, only the additive aggregations apply: count (the default) or sum (which requires --value). For choropleth, how rows sharing a region are combined: sum when --value is given, else count; pass mean for an intensive measure (a density, rate, index or per-capita figure), since summing those is meaningless and the count/sum hover\'s "share of total" line would be too. On a bubble animation (see the slider option), it collapses each entity x frame cell to a single bubble and defaults to mean, the cell centroid; count is rejected there, since a row count is not a position. For smart (with a GeoJSON), how its region map combines the value column per region: sum (the default, and the only one that also gets a rate panel when a denominator is available), mean, min or max; count keeps the row-count map even when every region has the same number of rows, and takes no value column.',
101
+ description: 'How to combine values. For bar/line, aggregate the y values when the x value repeats: one of sum, mean, count, min, max. For barpolar, the same per category (and series): sum by default, and only count when the y column is omitted. For treemap/sunburst/icicle, only the additive aggregations apply: count (the default) or sum (which requires --value). For choropleth, how rows sharing a region are combined: sum when --value is given, else count; pass mean for an intensive measure (a density, rate, index or per-capita figure), since summing those is meaningless and the count/sum hover\'s "share of total" line would be too. On a bubble animation (see the slider option), it collapses each entity x frame cell to a single bubble and defaults to mean, the cell centroid; count is rejected there, since a row count is not a position. For smart (with a GeoJSON), how its region map combines the value column per region: sum (the default, and the only one that also gets a rate panel when a denominator is available), mean, min or max; count keeps the row-count map even when every region has the same number of rows, and takes no value column.',
99
102
  },
100
103
  {
101
104
  displayName: 'Annotation',
@@ -104,6 +107,13 @@ exports.VizDescription = [
104
107
  default: '',
105
108
  description: 'Caption note drawn at the bottom of the plot (e.g. to note a clipped outlier). Cartesian charts only.',
106
109
  },
110
+ {
111
+ displayName: 'Area',
112
+ name: 'area',
113
+ type: 'boolean',
114
+ default: false,
115
+ description: 'For funnel: draw a funnel area, whose stacked sections are sized by each stage\'s share of the total and labeled with its value and percent of the total, instead of bars labeled with the conversion from the previous stage. Its outline always narrows, so a stage larger than the one before it can\'t show as growth; a warning names the first such stage.',
116
+ },
107
117
  {
108
118
  displayName: 'Bins',
109
119
  name: 'bins',
@@ -151,7 +161,7 @@ exports.VizDescription = [
151
161
  name: 'color',
152
162
  type: 'string',
153
163
  default: '',
154
- description: 'For scatter/scatter3d/map/geo: a numeric column to encode as marker color (a continuous colorscale with a colorbar). For categorical coloring, use the --series option instead. Cannot be combined with --series. In map density mode, this column is the heatmap weight.',
164
+ description: 'For scatter/scatter3d/ternary/map/geo: a numeric column to encode as marker color (a continuous colorscale with a colorbar). For categorical coloring, use the --series option instead. Cannot be combined with --series. In map density mode, this column is the heatmap weight. For parcoords: the numeric column that colors each line (default: the first axis).',
155
165
  },
156
166
  {
157
167
  displayName: 'Color Scale',
@@ -165,7 +175,7 @@ exports.VizDescription = [
165
175
  name: 'cols',
166
176
  type: 'string',
167
177
  default: '',
168
- description: 'Columns to use. For heatmap: numeric columns for the correlation matrix (default: all numeric). For radar: the numeric axes to plot. For treemap/sunburst/icicle: the categorical dimensions that form the hierarchy levels, outermost first (e.g. region,category,subcategory). For splom: the numeric columns to cross-plot (default: all numeric). For parcats: the categorical dimensions to flow across (best with 3-4).',
178
+ description: 'Columns to use. For heatmap: numeric columns for the correlation matrix (default: all numeric). For radar: the numeric axes to plot. For treemap/sunburst/icicle: the categorical dimensions that form the hierarchy levels, outermost first (e.g. region,category,subcategory). For splom: the numeric columns to cross-plot (default: all numeric). For parcats: the categorical dimensions to flow across (best with 3-4). For parcoords: the numeric axes, in order (default: all numeric). For ternary: exactly 3 numeric columns, the a, b and c parts.',
169
179
  },
170
180
  {
171
181
  displayName: 'Dataset Pid',
@@ -174,6 +184,13 @@ exports.VizDescription = [
174
184
  default: '',
175
185
  description: 'A persistent identifier (PID) for the dataset - typically a full URL such as a DOI (https://doi.org/10.1234/abc) or other citable link. When set, a "PID" row is added to the metadata table at the top of the Data Schematic. http(s) and mailto values become a clickable link; any other scheme is shown as plain text. HTML output only. Only affects `smart`.',
176
186
  },
187
+ {
188
+ displayName: 'Degrees',
189
+ name: 'degrees',
190
+ type: 'boolean',
191
+ default: false,
192
+ description: 'For barpolar: read --x as an angle in degrees (0 = north, clockwise) and draw each bar at that angle, so gaps in the data stay gaps. Without it, each distinct --x value gets an evenly spaced slot, which suits hours, months and complete degree bins (compass names are placed by bearing either way).',
193
+ },
177
194
  {
178
195
  displayName: 'Delimiter',
179
196
  name: 'delimiter',
@@ -339,8 +356,8 @@ exports.VizDescription = [
339
356
  displayName: 'Location Mode',
340
357
  name: 'locationMode',
341
358
  type: 'string',
342
- default: 'iso3',
343
- description: 'How --locations values are matched to regions. One of: iso3 (the default, ISO-3166-1 alpha-3 country codes), usa-states (2-letter US state codes), country-names (full country names), geojson-id (match a --geojson feature id).',
359
+ default: '',
360
+ description: 'How --locations values are matched to regions. One of: iso3 (ISO-3166-1 alpha-3 country codes), usa-states (2-letter US state codes), country-names (full country names), geojson-id (match a --geojson feature id). Defaults to geojson-id when a --geojson source is given (without --geocode), else iso3.',
344
361
  },
345
362
  {
346
363
  displayName: 'Locations',
@@ -382,7 +399,14 @@ exports.VizDescription = [
382
399
  name: 'maxCharts',
383
400
  type: 'number',
384
401
  default: 0,
385
- description: 'Maximum number of panels in the Data Schematic. 0 (the default) means auto: draw every eligible column (up to 64), for both HTML and static image export. Up to 8 cartesian panels render as one typed subplot grid; beyond 8, HTML switches to an inline-div grid and static export uses domain-positioned axes to fit one image. Set a positive <n> to cap the panel count instead; eligible columns beyond the cap are reported but not drawn.',
402
+ description: 'Maximum number of panels in the Data Schematic. 0 (the default) means auto: draw every eligible column (up to 65), for both HTML and static image export. Up to 8 cartesian panels render as one typed subplot grid; beyond 8, HTML switches to an inline-div grid and static export uses domain-positioned axes to fit one image. Set a positive <n> to cap the panel count instead; eligible columns beyond the cap are reported but not drawn.',
403
+ },
404
+ {
405
+ displayName: 'No Daemon Bridge',
406
+ name: 'noDaemonBridge',
407
+ type: 'boolean',
408
+ default: false,
409
+ description: 'Leave out the qsv-clientd bridge script. By default a `smart` HTML Data Schematic sends one "hello" request to 127.0.0.1 when opened (port 14470, or QSV_CLIENTD_PORT at render time) and, only if a qsv-clientd daemon answers, offers a "Live data" chip to pair with it (approved in a shell) for drill-down, refresh, re-render and read-only queries. With no daemon it does nothing, so the page stays self-contained. Setting QSV_VIZ_NO_DAEMON=1 has the same effect. The page\'s qsv-schematic-source provenance JSON is kept either way, but without the input fingerprint (which costs an extra read of the input) and without the source URL of a dc: input. HTML output only. Only affects `smart`. See https://github.com/dathere/qsv/blob/master/docs/DATA_SCHEMATIC.md',
386
410
  },
387
411
  {
388
412
  displayName: 'No Headers',
@@ -405,6 +429,13 @@ exports.VizDescription = [
405
429
  default: false,
406
430
  description: 'Omit the "Other (N)" aggregate bar from frequency bar charts. It collects the categories beyond --limit (N = how many distinct categories were rolled up) and is shown by default. When just ONE category is left over, it is charted under its own name instead of as an opaque "Other (1)" bar.',
407
431
  },
432
+ {
433
+ displayName: 'No Parcoords',
434
+ name: 'noParcoords',
435
+ type: 'boolean',
436
+ default: false,
437
+ description: 'Don\'t add the parallel-coordinates panel, which `smart` otherwise draws when 3 or more numeric columns correlate (|r| >= 0.3). Only affects `smart`.',
438
+ },
408
439
  {
409
440
  displayName: 'No Snap',
410
441
  name: 'noSnap',
@@ -480,14 +511,14 @@ exports.VizDescription = [
480
511
  name: 'series',
481
512
  type: 'string',
482
513
  default: '',
483
- description: 'Column to split into multiple series (one trace per distinct value). Applies to bar, line, scatter, scatter3d, radar, map and geo.',
514
+ description: 'Column to split into multiple series (one trace per distinct value). Applies to bar, line, scatter, scatter3d, radar, barpolar (stacked), ternary, map and geo.',
484
515
  },
485
516
  {
486
517
  displayName: 'Size',
487
518
  name: 'size',
488
519
  type: 'string',
489
520
  default: '',
490
- description: 'For scatter/scatter3d/map/geo: a numeric column to encode as marker size, producing a bubble chart (values are rescaled to a readable pixel range). Cannot be combined with --series, EXCEPT on an animated scatter (see the --slider option), where the --series column names the entity and this column is the third data variable. In map density mode, this column is the heatmap weight.',
521
+ description: 'For scatter/scatter3d/ternary/map/geo: a numeric column to encode as marker size, producing a bubble chart (values are rescaled to a readable pixel range). Cannot be combined with --series, EXCEPT on an animated scatter (see the --slider option), where the --series column names the entity and this column is the third data variable. In map density mode, this column is the heatmap weight.',
491
522
  },
492
523
  {
493
524
  displayName: 'Slider',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dartfx/n8n-nodes-qsv",
3
- "version": "0.2.1",
3
+ "version": "0.26.0",
4
4
  "description": "n8n community node for datHere QSV ultra-fast tabular data wrangling, stats, and transformations (requires 'qsv' CLI on host)",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",
@@ -54,10 +54,16 @@
54
54
  "tsx": "^4.19.3",
55
55
  "typescript": "^5.7.3"
56
56
  },
57
+ "qsvVersion": "26.0.0",
57
58
  "scripts": {
58
59
  "build": "tsc && gulp build:icons",
59
60
  "dev": "tsc --watch",
60
61
  "generate:qsv": "tsx scripts/generate-qsv-nodes.ts",
62
+ "sync:qsv": "tsx scripts/sync-qsv-release.ts --local --align-minor",
63
+ "sync:qsv:upstream": "tsx scripts/sync-qsv-release.ts --align-minor",
64
+ "sync:qsv:check": "tsx scripts/sync-qsv-release.ts --check-only",
65
+ "release:staging": "tsx scripts/sync-qsv-release.ts --local --align-minor --staging --publish",
66
+ "release:prod": "tsx scripts/sync-qsv-release.ts --local --align-minor --git-tag --push",
61
67
  "format": "prettier --write \"**/*.{ts,js,json,md}\"",
62
68
  "lint": "eslint \"**/*.ts\"",
63
69
  "test": "jest --passWithNoTests",