csv-sql-engine 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/csv/csv-text.d.ts +0 -16
- package/dist/csv/csv-text.js +1 -24
- package/dist/engine/define-ast-handler.d.ts +5 -2
- package/dist/engine/engine.d.ts +1 -1
- package/dist/engine/engine.js +1 -1
- package/dist/engine/handlers/row-delete.handler.js +10 -11
- package/dist/engine/handlers/row-insert.handler.js +18 -17
- package/dist/engine/handlers/row-select.handler.js +7 -10
- package/dist/engine/handlers/row-update.handler.js +12 -12
- package/dist/engine/sort-values.d.ts +21 -0
- package/dist/engine/sort-values.js +44 -0
- package/dist/errors/sql.error.js +1 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/sql/sql.d.ts +11 -2
- package/dist/sql/sql.js +14 -1
- package/package.json +6 -6
- package/dist/augments/trim-lines.d.ts +0 -6
- package/dist/augments/trim-lines.js +0 -12
package/dist/csv/csv-text.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type RequireExactlyOne } from 'type-fest';
|
|
2
1
|
/**
|
|
3
2
|
* Converts multiple rows of values into a CSV file string.
|
|
4
3
|
*
|
|
@@ -11,21 +10,6 @@ export declare function convertRowsToCsv(rows: ReadonlyArray<ReadonlyArray<strin
|
|
|
11
10
|
* @category CSV
|
|
12
11
|
*/
|
|
13
12
|
export declare function convertRowToCsv(row: ReadonlyArray<string>): string;
|
|
14
|
-
/**
|
|
15
|
-
* Sorts values for CSV insertion or reading.
|
|
16
|
-
*
|
|
17
|
-
* @category CSV
|
|
18
|
-
*/
|
|
19
|
-
export declare function sortValues({ csvFileHeaderOrder, sqlQueryHeaderOrder, from, }: Readonly<{
|
|
20
|
-
csvFileHeaderOrder: ReadonlyArray<string>;
|
|
21
|
-
sqlQueryHeaderOrder: ReadonlyArray<string>;
|
|
22
|
-
from: RequireExactlyOne<{
|
|
23
|
-
/** When a CSV value array is provided, they are sorted to the SQL header order. */
|
|
24
|
-
csvFile: ReadonlyArray<string>;
|
|
25
|
-
/** When a SQL value array is provided, they are sorted to the CSV header order. */
|
|
26
|
-
sqlQuery: ReadonlyArray<string>;
|
|
27
|
-
}>;
|
|
28
|
-
}>): string[];
|
|
29
13
|
/**
|
|
30
14
|
* Reads a CSV file contents string and converts it into multiple rows of strings.
|
|
31
15
|
*
|
package/dist/csv/csv-text.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { wrapString } from '@augment-vir/common';
|
|
1
|
+
import { trimLines, wrapString } from '@augment-vir/common';
|
|
2
2
|
import { csvParseRows } from 'd3-dsv';
|
|
3
|
-
import { trimLines } from '../augments/trim-lines.js';
|
|
4
3
|
/**
|
|
5
4
|
* Converts multiple rows of values into a CSV file string.
|
|
6
5
|
*
|
|
@@ -26,28 +25,6 @@ export function convertRowToCsv(row) {
|
|
|
26
25
|
})
|
|
27
26
|
.join(',');
|
|
28
27
|
}
|
|
29
|
-
/**
|
|
30
|
-
* Sorts values for CSV insertion or reading.
|
|
31
|
-
*
|
|
32
|
-
* @category CSV
|
|
33
|
-
*/
|
|
34
|
-
export function sortValues({ csvFileHeaderOrder, sqlQueryHeaderOrder, from, }) {
|
|
35
|
-
const fromOrder = from.sqlQuery ? sqlQueryHeaderOrder : csvFileHeaderOrder;
|
|
36
|
-
const toOrder = (from.sqlQuery ? csvFileHeaderOrder : sqlQueryHeaderOrder).flatMap((header) => {
|
|
37
|
-
if (header === '*') {
|
|
38
|
-
return csvFileHeaderOrder;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
return header;
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
const values = from.csvFile || from.sqlQuery;
|
|
45
|
-
return toOrder.map((header) => {
|
|
46
|
-
const sourceIndex = fromOrder.indexOf(header);
|
|
47
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
48
|
-
return values[sourceIndex];
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
28
|
/**
|
|
52
29
|
* Reads a CSV file contents string and converts it into multiple rows of strings.
|
|
53
30
|
*
|
|
@@ -5,7 +5,10 @@ import { type AstHandlerParams } from './params.js';
|
|
|
5
5
|
*
|
|
6
6
|
* @category Internal
|
|
7
7
|
*/
|
|
8
|
-
export type AstHandlerResult =
|
|
8
|
+
export type AstHandlerResult = {
|
|
9
|
+
columnNames: string[];
|
|
10
|
+
values: string[][];
|
|
11
|
+
};
|
|
9
12
|
/**
|
|
10
13
|
* An AST / SQL handler.
|
|
11
14
|
*
|
|
@@ -17,7 +20,7 @@ export type AstHandler = {
|
|
|
17
20
|
* Return `undefined` to mark this AST as not-handled. That means that other handlers should be
|
|
18
21
|
* used instead.
|
|
19
22
|
*/
|
|
20
|
-
handler: (params: Readonly<AstHandlerParams>) => MaybePromise<AstHandlerResult | undefined>;
|
|
23
|
+
handler: (params: Readonly<AstHandlerParams>) => MaybePromise<AstHandlerResult[] | undefined>;
|
|
21
24
|
};
|
|
22
25
|
/**
|
|
23
26
|
* Used to define new handlers.
|
package/dist/engine/engine.d.ts
CHANGED
|
@@ -13,4 +13,4 @@ export declare const allAstHandlers: ReadonlyArray<Readonly<AstHandler>>;
|
|
|
13
13
|
*
|
|
14
14
|
* @category Main
|
|
15
15
|
*/
|
|
16
|
-
export declare function executeSql(sqlInput: Sql | string, params: Readonly<ExecuteSqlParams>): Promise<AstHandlerResult[]>;
|
|
16
|
+
export declare function executeSql(sqlInput: Sql | string, params: Readonly<ExecuteSqlParams>): Promise<AstHandlerResult[][]>;
|
package/dist/engine/engine.js
CHANGED
|
@@ -51,7 +51,7 @@ async function executeIndividualCommand(params) {
|
|
|
51
51
|
for (const handler of allAstHandlers) {
|
|
52
52
|
const output = await handler.handler(params);
|
|
53
53
|
if (output) {
|
|
54
|
-
return output;
|
|
54
|
+
return output.filter((entry) => entry.values.length);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
/** If nothing handled the query, then we don't support it. */
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { check } from '@augment-vir/assert';
|
|
2
2
|
import { awaitedBlockingMap } from '@augment-vir/common';
|
|
3
3
|
import { nameCsvTableFile, readCsvFile, readCsvHeaders, writeCsvFile } from '../../csv/csv-file.js';
|
|
4
|
-
import { sortValues } from '../../csv/csv-text.js';
|
|
5
4
|
import { AstType } from '../../sql/ast.js';
|
|
6
5
|
import { defineAstHandler } from '../define-ast-handler.js';
|
|
6
|
+
import { sortValues } from '../sort-values.js';
|
|
7
7
|
import { findWhereMatches } from '../where-matcher.js';
|
|
8
8
|
/**
|
|
9
9
|
* Handles deleting rows.
|
|
@@ -12,10 +12,10 @@ import { findWhereMatches } from '../where-matcher.js';
|
|
|
12
12
|
*/
|
|
13
13
|
export const rowDeleteHandler = defineAstHandler({
|
|
14
14
|
name: 'row-delete',
|
|
15
|
-
async handler({ ast, csvDirPath }) {
|
|
15
|
+
async handler({ ast, csvDirPath, sql }) {
|
|
16
16
|
if (ast.type === AstType.Delete) {
|
|
17
17
|
const tableNames = ast.table.map((table) => table.table);
|
|
18
|
-
const
|
|
18
|
+
const results = await awaitedBlockingMap(tableNames, async (tableName) => {
|
|
19
19
|
const { tableFilePath, sanitizedTableName } = nameCsvTableFile({
|
|
20
20
|
csvDirPath,
|
|
21
21
|
tableName,
|
|
@@ -27,24 +27,23 @@ export const rowDeleteHandler = defineAstHandler({
|
|
|
27
27
|
});
|
|
28
28
|
const rowIndexesToDelete = findWhereMatches(ast.where, csvContents, tableFilePath);
|
|
29
29
|
const returningRequirement = ast.returning;
|
|
30
|
-
const
|
|
31
|
-
?
|
|
32
|
-
.filter((row, index) => rowIndexesToDelete.includes(index))
|
|
33
|
-
.map((row) => sortValues({
|
|
30
|
+
const result = returningRequirement
|
|
31
|
+
? sortValues({
|
|
34
32
|
csvFileHeaderOrder: csvHeaders,
|
|
35
33
|
sqlQueryHeaderOrder: returningRequirement.columns.map((column) => column.expr.column),
|
|
36
34
|
from: {
|
|
37
|
-
csvFile: row,
|
|
35
|
+
csvFile: csvContents.filter((row, index) => rowIndexesToDelete.includes(index)),
|
|
38
36
|
},
|
|
39
|
-
|
|
37
|
+
unconsumedInterpolationValues: sql.unconsumedValues,
|
|
38
|
+
})
|
|
40
39
|
: undefined;
|
|
41
40
|
rowIndexesToDelete.forEach((rowIndexToDelete) => {
|
|
42
41
|
csvContents.splice(rowIndexToDelete, 1);
|
|
43
42
|
});
|
|
44
43
|
await writeCsvFile(tableFilePath, csvContents);
|
|
45
|
-
return
|
|
44
|
+
return result;
|
|
46
45
|
});
|
|
47
|
-
return
|
|
46
|
+
return results.flat().filter(check.isTruthy);
|
|
48
47
|
}
|
|
49
48
|
return undefined;
|
|
50
49
|
},
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { check } from '@augment-vir/assert';
|
|
1
|
+
import { assertWrap, check } from '@augment-vir/assert';
|
|
2
2
|
import { awaitedBlockingMap } from '@augment-vir/common';
|
|
3
3
|
import { appendCsvRow, nameCsvTableFile, readCsvHeaders } from '../../csv/csv-file.js';
|
|
4
|
-
import { sortValues } from '../../csv/csv-text.js';
|
|
5
4
|
import { AstType } from '../../sql/ast.js';
|
|
6
5
|
import { defineAstHandler } from '../define-ast-handler.js';
|
|
6
|
+
import { sortValues } from '../sort-values.js';
|
|
7
7
|
/**
|
|
8
8
|
* Handles inserting rows.
|
|
9
9
|
*
|
|
@@ -11,10 +11,10 @@ import { defineAstHandler } from '../define-ast-handler.js';
|
|
|
11
11
|
*/
|
|
12
12
|
export const rowInsertHandler = defineAstHandler({
|
|
13
13
|
name: 'row-insert',
|
|
14
|
-
async handler({ ast, csvDirPath }) {
|
|
14
|
+
async handler({ ast, csvDirPath, sql }) {
|
|
15
15
|
if (ast.type === AstType.Insert) {
|
|
16
16
|
const tableNames = ast.table.map((table) => table.table);
|
|
17
|
-
const
|
|
17
|
+
const results = await awaitedBlockingMap(tableNames, async (tableName) => {
|
|
18
18
|
const { tableFilePath, sanitizedTableName } = nameCsvTableFile({
|
|
19
19
|
csvDirPath,
|
|
20
20
|
tableName,
|
|
@@ -24,30 +24,31 @@ export const rowInsertHandler = defineAstHandler({
|
|
|
24
24
|
csvFilePath: tableFilePath,
|
|
25
25
|
sanitizedTableName,
|
|
26
26
|
});
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
await appendCsvRow(values, tableFilePath);
|
|
27
|
+
const newRow = assertWrap.isDefined(sortValues({
|
|
28
|
+
csvFileHeaderOrder,
|
|
29
|
+
sqlQueryHeaderOrder: ast.columns || csvFileHeaderOrder,
|
|
30
|
+
from: {
|
|
31
|
+
sqlQuery: [rawValues],
|
|
32
|
+
},
|
|
33
|
+
unconsumedInterpolationValues: sql.unconsumedValues,
|
|
34
|
+
}).values[0], 'No sorted row retrieved.');
|
|
35
|
+
await appendCsvRow(newRow, tableFilePath);
|
|
37
36
|
if (ast.returning) {
|
|
37
|
+
const sqlHeaders = ast.returning.columns.map((column) => column.expr.column);
|
|
38
38
|
return sortValues({
|
|
39
39
|
csvFileHeaderOrder,
|
|
40
|
-
sqlQueryHeaderOrder:
|
|
40
|
+
sqlQueryHeaderOrder: sqlHeaders,
|
|
41
41
|
from: {
|
|
42
|
-
csvFile:
|
|
42
|
+
csvFile: [newRow],
|
|
43
43
|
},
|
|
44
|
+
unconsumedInterpolationValues: undefined,
|
|
44
45
|
});
|
|
45
46
|
}
|
|
46
47
|
else {
|
|
47
48
|
return undefined;
|
|
48
49
|
}
|
|
49
50
|
});
|
|
50
|
-
return
|
|
51
|
+
return results.filter(check.isTruthy);
|
|
51
52
|
}
|
|
52
53
|
return undefined;
|
|
53
54
|
},
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { check } from '@augment-vir/assert';
|
|
2
2
|
import { awaitedBlockingMap } from '@augment-vir/common';
|
|
3
|
-
import { nameCsvTableFile, readCsvFile, readCsvHeaders
|
|
4
|
-
import { sortValues } from '../../csv/csv-text.js';
|
|
3
|
+
import { nameCsvTableFile, readCsvFile, readCsvHeaders } from '../../csv/csv-file.js';
|
|
5
4
|
import { AstType } from '../../sql/ast.js';
|
|
6
5
|
import { defineAstHandler } from '../define-ast-handler.js';
|
|
6
|
+
import { sortValues } from '../sort-values.js';
|
|
7
7
|
import { findWhereMatches } from '../where-matcher.js';
|
|
8
8
|
/**
|
|
9
9
|
* Handles SQL selection.
|
|
@@ -12,7 +12,7 @@ import { findWhereMatches } from '../where-matcher.js';
|
|
|
12
12
|
*/
|
|
13
13
|
export const rowSelectHandler = defineAstHandler({
|
|
14
14
|
name: 'row-select',
|
|
15
|
-
async handler({ ast, csvDirPath }) {
|
|
15
|
+
async handler({ ast, csvDirPath, sql }) {
|
|
16
16
|
if (ast.type === AstType.Select) {
|
|
17
17
|
const tableNames = ast.from.map((table) => table.table);
|
|
18
18
|
const allSelections = await awaitedBlockingMap(tableNames, async (tableName) => {
|
|
@@ -27,17 +27,14 @@ export const rowSelectHandler = defineAstHandler({
|
|
|
27
27
|
});
|
|
28
28
|
const rowIndexesToSelect = findWhereMatches(ast.where, csvContents, tableFilePath);
|
|
29
29
|
const columnNames = ast.columns.map((column) => column.expr.column);
|
|
30
|
-
|
|
31
|
-
.filter((row, index) => rowIndexesToSelect.includes(index))
|
|
32
|
-
.map((row) => sortValues({
|
|
30
|
+
return sortValues({
|
|
33
31
|
csvFileHeaderOrder: csvHeaders,
|
|
34
32
|
sqlQueryHeaderOrder: columnNames,
|
|
35
33
|
from: {
|
|
36
|
-
csvFile: row,
|
|
34
|
+
csvFile: csvContents.filter((row, index) => rowIndexesToSelect.includes(index)),
|
|
37
35
|
},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return selection;
|
|
36
|
+
unconsumedInterpolationValues: sql.unconsumedValues,
|
|
37
|
+
});
|
|
41
38
|
});
|
|
42
39
|
return allSelections.flat().filter(check.isTruthy);
|
|
43
40
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { assertWrap, check } from '@augment-vir/assert';
|
|
2
2
|
import { awaitedBlockingMap } from '@augment-vir/common';
|
|
3
3
|
import { createCsvHeaderMaps, nameCsvTableFile, readCsvFile, readCsvHeaders, writeCsvFile, } from '../../csv/csv-file.js';
|
|
4
|
-
import { sortValues } from '../../csv/csv-text.js';
|
|
5
4
|
import { CsvColumnDoesNotExistError } from '../../errors/csv.error.js';
|
|
6
5
|
import { AstType } from '../../sql/ast.js';
|
|
7
6
|
import { defineAstHandler } from '../define-ast-handler.js';
|
|
7
|
+
import { sortValues } from '../sort-values.js';
|
|
8
8
|
import { findWhereMatches } from '../where-matcher.js';
|
|
9
9
|
/**
|
|
10
10
|
* Handles updating rows.
|
|
@@ -13,10 +13,10 @@ import { findWhereMatches } from '../where-matcher.js';
|
|
|
13
13
|
*/
|
|
14
14
|
export const rowUpdateHandler = defineAstHandler({
|
|
15
15
|
name: 'row-update',
|
|
16
|
-
async handler({ ast, csvDirPath }) {
|
|
16
|
+
async handler({ ast, csvDirPath, sql }) {
|
|
17
17
|
if (ast.type === AstType.Update) {
|
|
18
18
|
const tableNames = ast.table.map((table) => table.table);
|
|
19
|
-
const
|
|
19
|
+
const results = await awaitedBlockingMap(tableNames, async (tableName) => {
|
|
20
20
|
const { tableFilePath, sanitizedTableName } = nameCsvTableFile({
|
|
21
21
|
csvDirPath,
|
|
22
22
|
tableName,
|
|
@@ -40,21 +40,21 @@ export const rowUpdateHandler = defineAstHandler({
|
|
|
40
40
|
row[headerIndex] = set.value.value;
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.map((row) => sortValues({
|
|
43
|
+
const sqlHeaders = returningRequirement?.columns.map((column) => column.expr.column) || [];
|
|
44
|
+
const result = returningRequirement
|
|
45
|
+
? sortValues({
|
|
47
46
|
csvFileHeaderOrder: csvHeaders,
|
|
48
|
-
sqlQueryHeaderOrder:
|
|
47
|
+
sqlQueryHeaderOrder: sqlHeaders,
|
|
49
48
|
from: {
|
|
50
|
-
csvFile: row,
|
|
49
|
+
csvFile: csvContents.filter((row, index) => rowIndexesToUpdate.includes(index)),
|
|
51
50
|
},
|
|
52
|
-
|
|
51
|
+
unconsumedInterpolationValues: sql.unconsumedValues,
|
|
52
|
+
})
|
|
53
53
|
: undefined;
|
|
54
54
|
await writeCsvFile(tableFilePath, csvContents);
|
|
55
|
-
return
|
|
55
|
+
return result;
|
|
56
56
|
});
|
|
57
|
-
return
|
|
57
|
+
return results.flat().filter(check.isTruthy);
|
|
58
58
|
}
|
|
59
59
|
return undefined;
|
|
60
60
|
},
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type RequireExactlyOne } from 'type-fest';
|
|
2
|
+
import { type ConsumableValue } from '../sql/sql.js';
|
|
3
|
+
/**
|
|
4
|
+
* Sorts values for CSV insertion or reading and handle interpolated values.
|
|
5
|
+
*
|
|
6
|
+
* @category Internal
|
|
7
|
+
*/
|
|
8
|
+
export declare function sortValues({ csvFileHeaderOrder, sqlQueryHeaderOrder, from, unconsumedInterpolationValues, }: Readonly<{
|
|
9
|
+
csvFileHeaderOrder: ReadonlyArray<string>;
|
|
10
|
+
sqlQueryHeaderOrder: ReadonlyArray<string>;
|
|
11
|
+
from: RequireExactlyOne<{
|
|
12
|
+
/** When a CSV value array is provided, they are sorted to the SQL header order. */
|
|
13
|
+
csvFile: ReadonlyArray<ReadonlyArray<string>>;
|
|
14
|
+
/** When a SQL value array is provided, they are sorted to the CSV header order. */
|
|
15
|
+
sqlQuery: ReadonlyArray<ReadonlyArray<string>>;
|
|
16
|
+
}>;
|
|
17
|
+
unconsumedInterpolationValues: undefined | ConsumableValue[];
|
|
18
|
+
}>): {
|
|
19
|
+
values: string[][];
|
|
20
|
+
columnNames: string[];
|
|
21
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sorts values for CSV insertion or reading and handle interpolated values.
|
|
3
|
+
*
|
|
4
|
+
* @category Internal
|
|
5
|
+
*/
|
|
6
|
+
export function sortValues({ csvFileHeaderOrder, sqlQueryHeaderOrder, from, unconsumedInterpolationValues, }) {
|
|
7
|
+
const fromOrder = from.sqlQuery ? sqlQueryHeaderOrder : csvFileHeaderOrder;
|
|
8
|
+
const toOrder = (from.sqlQuery ? csvFileHeaderOrder : sqlQueryHeaderOrder).flatMap((header) => {
|
|
9
|
+
if (header === '*') {
|
|
10
|
+
return csvFileHeaderOrder;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return header;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const values = (from.csvFile || from.sqlQuery).map((valueRow) => {
|
|
17
|
+
const mappedValueRow = valueRow.map((value) => {
|
|
18
|
+
if (value === '?') {
|
|
19
|
+
if (unconsumedInterpolationValues) {
|
|
20
|
+
if (unconsumedInterpolationValues.length) {
|
|
21
|
+
return unconsumedInterpolationValues.shift() || '';
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
throw new Error('Encountered ? but all interpolation values have already been used.');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
throw new Error('Encountered ? but received no interpolation values.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return toOrder.map((header) => {
|
|
36
|
+
const sourceIndex = fromOrder.indexOf(header);
|
|
37
|
+
return mappedValueRow[sourceIndex] ?? '';
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
columnNames: toOrder,
|
|
42
|
+
values,
|
|
43
|
+
};
|
|
44
|
+
}
|
package/dist/errors/sql.error.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { addSuffix, extractErrorMessage, indent } from '@augment-vir/common';
|
|
2
|
-
import { trimLines } from '../augments/trim-lines.js';
|
|
1
|
+
import { addSuffix, extractErrorMessage, indent, trimLines } from '@augment-vir/common';
|
|
3
2
|
import { CsvSqlEngineError } from './csv-sql-engine.error.js';
|
|
4
3
|
/**
|
|
5
4
|
* Generic SQL related error thrown by the csv-sql-engine package. All SQL related errors from this
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export * from './augments/trim-lines.js';
|
|
2
1
|
export * from './csv/csv-file.js';
|
|
3
2
|
export * from './csv/csv-text.js';
|
|
4
3
|
export * from './engine/define-ast-handler.js';
|
|
@@ -11,6 +10,7 @@ export * from './engine/handlers/table-alter.handler.js';
|
|
|
11
10
|
export * from './engine/handlers/table-create.handler.js';
|
|
12
11
|
export * from './engine/handlers/table-drop.handler.js';
|
|
13
12
|
export * from './engine/params.js';
|
|
13
|
+
export * from './engine/sort-values.js';
|
|
14
14
|
export * from './engine/where-matcher.js';
|
|
15
15
|
export * from './errors/csv-sql-engine.error.js';
|
|
16
16
|
export * from './errors/csv.error.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export * from './augments/trim-lines.js';
|
|
2
1
|
export * from './csv/csv-file.js';
|
|
3
2
|
export * from './csv/csv-text.js';
|
|
4
3
|
export * from './engine/define-ast-handler.js';
|
|
@@ -11,6 +10,7 @@ export * from './engine/handlers/table-alter.handler.js';
|
|
|
11
10
|
export * from './engine/handlers/table-create.handler.js';
|
|
12
11
|
export * from './engine/handlers/table-drop.handler.js';
|
|
13
12
|
export * from './engine/params.js';
|
|
13
|
+
export * from './engine/sort-values.js';
|
|
14
14
|
export * from './engine/where-matcher.js';
|
|
15
15
|
export * from './errors/csv-sql-engine.error.js';
|
|
16
16
|
export * from './errors/csv.error.js';
|
package/dist/sql/sql.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Branded } from '@augment-vir/common';
|
|
2
2
|
import { Sql as OriginalSql } from 'sql-template-tag';
|
|
3
|
+
/**
|
|
4
|
+
* Used to mark consumable values so we don't accidentally assign the wrong array for mutation.
|
|
5
|
+
*
|
|
6
|
+
* @category Internal
|
|
7
|
+
*/
|
|
8
|
+
export type ConsumableValue = Branded<string, 'consumable-values'>;
|
|
3
9
|
/**
|
|
4
10
|
* A SQL command's strings and values.
|
|
5
11
|
*
|
|
@@ -7,6 +13,9 @@ import { Sql as OriginalSql } from 'sql-template-tag';
|
|
|
7
13
|
*/
|
|
8
14
|
export declare class Sql extends OriginalSql {
|
|
9
15
|
values: string[];
|
|
16
|
+
/** This will be mutated by whatever is reading this SQL. */
|
|
17
|
+
unconsumedValues: ConsumableValue[];
|
|
18
|
+
constructor(rawStrings: readonly string[], rawValues: readonly (Sql | string)[]);
|
|
10
19
|
}
|
|
11
20
|
/**
|
|
12
21
|
* Parses a SQL string with interpolations extracted into values so that they can be properly
|
|
@@ -14,7 +23,7 @@ export declare class Sql extends OriginalSql {
|
|
|
14
23
|
*
|
|
15
24
|
* @category SQL
|
|
16
25
|
*/
|
|
17
|
-
export declare function sql(strings: ReadonlyArray<string>, ...values: Array<
|
|
26
|
+
export declare function sql(strings: ReadonlyArray<string>, ...values: Array<string | number | Sql>): Sql;
|
|
18
27
|
/**
|
|
19
28
|
* Creates a raw, _unsafe_, {@link Sql} command. Prefer {@link sql} whenever possible.
|
|
20
29
|
*
|
package/dist/sql/sql.js
CHANGED
|
@@ -5,6 +5,12 @@ import { Sql as OriginalSql } from 'sql-template-tag';
|
|
|
5
5
|
* @category Internal
|
|
6
6
|
*/
|
|
7
7
|
export class Sql extends OriginalSql {
|
|
8
|
+
/** This will be mutated by whatever is reading this SQL. */
|
|
9
|
+
unconsumedValues;
|
|
10
|
+
constructor(rawStrings, rawValues) {
|
|
11
|
+
super(rawStrings, rawValues);
|
|
12
|
+
this.unconsumedValues = [...this.values];
|
|
13
|
+
}
|
|
8
14
|
}
|
|
9
15
|
/**
|
|
10
16
|
* Parses a SQL string with interpolations extracted into values so that they can be properly
|
|
@@ -13,7 +19,14 @@ export class Sql extends OriginalSql {
|
|
|
13
19
|
* @category SQL
|
|
14
20
|
*/
|
|
15
21
|
export function sql(strings, ...values) {
|
|
16
|
-
return new Sql(strings, values)
|
|
22
|
+
return new Sql(strings, values.map((value) => {
|
|
23
|
+
if (value instanceof Sql) {
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
return String(value);
|
|
28
|
+
}
|
|
29
|
+
}));
|
|
17
30
|
}
|
|
18
31
|
/**
|
|
19
32
|
* Creates a raw, _unsafe_, {@link Sql} command. Prefer {@link sql} whenever possible.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "csv-sql-engine",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "API for executing SQL statements on CSV files.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"CSV",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"test:update": "npm run test update"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@augment-vir/assert": "^31.
|
|
47
|
-
"@augment-vir/common": "^31.
|
|
48
|
-
"@augment-vir/node": "^31.
|
|
46
|
+
"@augment-vir/assert": "^31.56.0",
|
|
47
|
+
"@augment-vir/common": "^31.56.0",
|
|
48
|
+
"@augment-vir/node": "^31.56.0",
|
|
49
49
|
"@sinclair/typebox": "^0.34.45",
|
|
50
50
|
"d3-dsv": "^3.0.1",
|
|
51
51
|
"node-sql-parser": "^5.3.13",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"sql-template-tag": "^5.2.1"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@augment-vir/test": "^31.
|
|
56
|
+
"@augment-vir/test": "^31.56.0",
|
|
57
57
|
"@eslint/eslintrc": "^3.3.3",
|
|
58
58
|
"@eslint/js": "^9.39.2",
|
|
59
59
|
"@stylistic/eslint-plugin": "^5.6.1",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"typedoc": "^0.28.15",
|
|
94
94
|
"typescript": "^5.9.3",
|
|
95
95
|
"typescript-eslint": "^8.50.1",
|
|
96
|
-
"virmator": "^14.
|
|
96
|
+
"virmator": "^14.4.0"
|
|
97
97
|
},
|
|
98
98
|
"engines": {
|
|
99
99
|
"node": ">=22"
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { check } from '@augment-vir/assert';
|
|
2
|
-
import { filterMap } from '@augment-vir/common';
|
|
3
|
-
/**
|
|
4
|
-
* Trims every line in the given string.
|
|
5
|
-
*
|
|
6
|
-
* @category Internal
|
|
7
|
-
*/
|
|
8
|
-
export function trimLines(value) {
|
|
9
|
-
return filterMap(value.trim().split('\n'), (line) => line.trim(), check.isTruthy)
|
|
10
|
-
.join('\n')
|
|
11
|
-
.trim();
|
|
12
|
-
}
|