@deterministic-code/datasources 0.1.29 → 0.1.35
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/BatchCommandIBulkWriteStrategy.js +4 -4
- package/dist/CRUDRepository.d.ts +2 -0
- package/dist/CRUDRepository.js +33 -6
- package/dist/Datasource.js +2 -2
- package/dist/Schema.d.ts +8 -2
- package/dist/Schema.js +1 -0
- package/dist/SchemaDefault.d.ts +5 -0
- package/dist/SchemaDefault.js +11 -0
- package/dist/StatementMappers.js +1 -1
- package/dist/index.d.ts +3 -9
- package/dist/index.js +1 -2
- package/dist/statements/ConstraintName.d.ts +2 -0
- package/dist/statements/ConstraintName.js +3 -0
- package/dist/statements/CreateIndexStatement.d.ts +2 -0
- package/dist/statements/CreateIndexStatement.js +2 -0
- package/dist/statements/CreateNestedReadStoredProcedureStatement.d.ts +1 -1
- package/dist/statements/CreateTableStatement.d.ts +3 -0
- package/dist/statements/CreateTableStatement.js +4 -0
- package/dist/statements/CreateTriggerStatement.d.ts +2 -0
- package/dist/statements/CreateTriggerStatement.js +6 -0
- package/dist/statements/ForeignKey.d.ts +2 -0
- package/dist/statements/ForeignKey.js +2 -0
- package/dist/statements/ForeignKeyStatement.d.ts +2 -0
- package/dist/statements/ForeignKeyStatement.js +2 -0
- package/dist/statements/ICreateNestedReadStoredProcedureStatement.d.ts +1 -1
- package/dist/statements/KeywordCasing.d.ts +5 -0
- package/dist/statements/KeywordCasing.js +4 -0
- package/dist/statements/NestedSelectBuilder.d.ts +6 -0
- package/dist/statements/NestedSelectBuilder.js +63 -0
- package/dist/statements/NestedSelectBuilderOptions.d.ts +5 -0
- package/dist/statements/NestedSelectBuilderOptions.js +1 -0
- package/dist/statements/NestedSelectRelation.d.ts +9 -0
- package/dist/statements/NestedSelectRelation.js +1 -0
- package/dist/statements/NestedSelectRelationKind.d.ts +1 -0
- package/dist/statements/NestedSelectRelationKind.js +1 -0
- package/dist/statements/NestedSelectStatement.d.ts +10 -0
- package/dist/statements/NestedSelectStatement.js +1 -0
- package/dist/statements/NestedSelectType.d.ts +7 -0
- package/dist/statements/NestedSelectType.js +1 -0
- package/dist/statements/PrimaryKey.d.ts +2 -0
- package/dist/statements/PrimaryKey.js +2 -0
- package/dist/statements/ProcedureSource.d.ts +23 -0
- package/dist/statements/ProcedureSource.js +1 -0
- package/dist/statements/SelectFieldAliases.d.ts +14 -0
- package/dist/statements/SelectFieldAliases.js +62 -0
- package/dist/statements/SelectStatementTextRenderer.js +1 -1
- package/dist/statements/SqlProcedureStatements.d.ts +4 -0
- package/dist/statements/SqlProcedureStatements.js +34 -0
- package/dist/statements/StatementNaming.d.ts +26 -0
- package/dist/statements/StatementNaming.js +64 -0
- package/dist/statements/StatementRenderer.d.ts +1 -0
- package/dist/statements/StatementRenderer.js +3 -0
- package/dist/statements/StatementTextRenderer.d.ts +11 -1
- package/dist/statements/StatementTextRenderer.js +18 -1
- package/dist/statements/UniqueConstraint.d.ts +2 -0
- package/dist/statements/UniqueConstraint.js +2 -0
- package/dist/statements/index.d.ts +11 -0
- package/dist/statements/index.js +5 -0
- package/package.json +1 -1
|
@@ -89,7 +89,7 @@ export class BatchCommandIBulkWriteStrategy {
|
|
|
89
89
|
};
|
|
90
90
|
mappedUpdate = (item) => {
|
|
91
91
|
const record = this.reverse(item);
|
|
92
|
-
const fields = this.fields(record, (col) => listed(this.options.updateProperties, col, !this.ids.includes(col)));
|
|
92
|
+
const fields = this.fields(record, (col) => listed(this.options.updateProperties, col, !this.ids.includes(col)), false);
|
|
93
93
|
if (fields.length === 0)
|
|
94
94
|
throw new DatasourceError("Update requires at least one non-Id field");
|
|
95
95
|
const statement = this.statements().update(fields, this.idsWhere(record), (name, value) => this.cell(name, value, true));
|
|
@@ -102,7 +102,7 @@ export class BatchCommandIBulkWriteStrategy {
|
|
|
102
102
|
};
|
|
103
103
|
updateCommand = (item, byWhere) => {
|
|
104
104
|
const record = this.reverse(item);
|
|
105
|
-
const fields = this.fields(record, (col) => listed(this.options.updateProperties, col, !this.ids.includes(col)));
|
|
105
|
+
const fields = this.fields(record, (col) => listed(this.options.updateProperties, col, !this.ids.includes(col)), false);
|
|
106
106
|
if (fields.length === 0)
|
|
107
107
|
throw new DatasourceError("Update requires at least one non-Id field");
|
|
108
108
|
const statement = this.statements().update(fields, byWhere ?? this.idsWhere(record), (name, value) => this.cell(name, value, byWhere === undefined));
|
|
@@ -135,8 +135,8 @@ export class BatchCommandIBulkWriteStrategy {
|
|
|
135
135
|
columns.includes(key) ||
|
|
136
136
|
(map !== undefined && columns.some((name) => map.map(name) === key)));
|
|
137
137
|
};
|
|
138
|
-
fields = (record, include) => Object.entries(record)
|
|
139
|
-
.filter(([key, value]) => include(key) && this.writable(key) && value !==
|
|
138
|
+
fields = (record, include, omitNull = true) => Object.entries(record)
|
|
139
|
+
.filter(([key, value]) => include(key) && this.writable(key) && value !== undefined && (!omitNull || value !== null))
|
|
140
140
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
141
141
|
.map(([name, value]) => ({ name, value: this.cell(name, value, true) }));
|
|
142
142
|
cell = (property, value, fieldsApplied) => fieldsApplied
|
package/dist/CRUDRepository.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export declare class CRUDRepository<T = Cells> extends ReadonlyRepository<T> imp
|
|
|
15
15
|
private readonly createProperties?;
|
|
16
16
|
private readonly updateProperties?;
|
|
17
17
|
protected createZeros?: Cells;
|
|
18
|
+
private readonly schema;
|
|
18
19
|
private readonly crudStatements;
|
|
19
20
|
private readonly tree;
|
|
20
21
|
private readonly write;
|
|
@@ -41,4 +42,5 @@ export declare class CRUDRepository<T = Cells> extends ReadonlyRepository<T> imp
|
|
|
41
42
|
private reverseConvert;
|
|
42
43
|
private idWhere;
|
|
43
44
|
protected enrichmentInto: (name: string) => boolean;
|
|
45
|
+
private enrichmentSource;
|
|
44
46
|
}
|
package/dist/CRUDRepository.js
CHANGED
|
@@ -11,14 +11,31 @@ import { DefaultWriteEnrichmentStrategy } from "./DefaultWriteEnrichmentStrategy
|
|
|
11
11
|
import { UnitOfWorkTransaction } from "./UnitOfWorkTransaction.js";
|
|
12
12
|
import { RepositoryTree } from "./RepositoryTree.js";
|
|
13
13
|
import { RepositoryTreeNode } from "./RepositoryTreeNode.js";
|
|
14
|
+
import { Schema } from "./Schema.js";
|
|
15
|
+
import { SchemaDefault } from "./SchemaDefault.js";
|
|
14
16
|
const assigned = (value) => value !== null && value !== "" && value !== 0 && value !== 0n;
|
|
15
17
|
const listed = (list, col, fallback) => list === undefined ? fallback : list.includes(col);
|
|
18
|
+
const languageZero = (value) => value === "" || value === false;
|
|
19
|
+
const applyEmptyDefaults = (record, schema, ids, properties, fillMissing, skip) => {
|
|
20
|
+
const filled = { ...record };
|
|
21
|
+
for (const [name, column] of Object.entries(schema.columns)) {
|
|
22
|
+
if (ids.includes(name) || !listed(properties, name, true) || column.hasDefault || skip(name))
|
|
23
|
+
continue;
|
|
24
|
+
const zero = SchemaDefault.of(column);
|
|
25
|
+
if (filled[name] === "")
|
|
26
|
+
filled[name] = zero;
|
|
27
|
+
else if (fillMissing && filled[name] === undefined && languageZero(zero))
|
|
28
|
+
filled[name] = zero;
|
|
29
|
+
}
|
|
30
|
+
return filled;
|
|
31
|
+
};
|
|
32
|
+
const zerosFromSchema = (schema, ids, createProperties, skip) => applyEmptyDefaults({}, schema, ids, createProperties, true, skip);
|
|
16
33
|
const writable = (key, columns, column) => columns.length === 0 || columns.includes(key) || columns.some((name) => column(name) === key);
|
|
17
|
-
const fieldsOf = (record, include, extras, cell, enrichmentInto, columns, column) => Object.entries(record)
|
|
34
|
+
const fieldsOf = (record, include, extras, cell, enrichmentInto, columns, column, omitNull = true) => Object.entries(record)
|
|
18
35
|
.filter(([key, value]) => include(key) &&
|
|
19
36
|
(extras.has(key) || (writable(key, columns, column) && !enrichmentInto(key))) &&
|
|
20
|
-
value !==
|
|
21
|
-
value !==
|
|
37
|
+
value !== undefined &&
|
|
38
|
+
(!omitNull || value !== null))
|
|
22
39
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
23
40
|
.map(([name, value]) => ({ name, value: cell(name, value, true) }));
|
|
24
41
|
const isCells = (id) => typeof id === "object" && id !== null;
|
|
@@ -38,6 +55,7 @@ export class CRUDRepository extends ReadonlyRepository {
|
|
|
38
55
|
createProperties;
|
|
39
56
|
updateProperties;
|
|
40
57
|
createZeros;
|
|
58
|
+
schema;
|
|
41
59
|
crudStatements;
|
|
42
60
|
tree;
|
|
43
61
|
write;
|
|
@@ -51,6 +69,7 @@ export class CRUDRepository extends ReadonlyRepository {
|
|
|
51
69
|
this.ids = opened.built.ids;
|
|
52
70
|
this.createProperties = options.createProperties;
|
|
53
71
|
this.updateProperties = options.updateProperties;
|
|
72
|
+
this.schema = options.schema ?? new Schema({});
|
|
54
73
|
this.crudStatements = opened.statements;
|
|
55
74
|
this.tree = new RepositoryTree(new RepositoryTreeNode(this, ""));
|
|
56
75
|
this.write = options.write ?? new DefaultWriteEnrichmentStrategy();
|
|
@@ -155,8 +174,8 @@ export class CRUDRepository extends ReadonlyRepository {
|
|
|
155
174
|
idValue = (item) => scalarOf(item[this.ids[0]]);
|
|
156
175
|
save = async (item, byWhere) => {
|
|
157
176
|
const extras = lookupKeys(item);
|
|
158
|
-
const record = this.reverseConvert(item);
|
|
159
|
-
const fields = fieldsOf(record, (col) => extras.has(col) || listed(this.updateProperties, col, !this.ids.includes(col)), extras, this.cell, this.enrichmentInto, this.crudStatements.readColumns, this.column);
|
|
177
|
+
const record = applyEmptyDefaults(this.reverseConvert(item), this.schema, this.ids, this.updateProperties, false, (name) => this.enrichmentSource(name));
|
|
178
|
+
const fields = fieldsOf(record, (col) => extras.has(col) || listed(this.updateProperties, col, !this.ids.includes(col)), extras, this.cell, this.enrichmentInto, this.crudStatements.readColumns, this.column, false);
|
|
160
179
|
if (fields.length === 0)
|
|
161
180
|
throw new DatasourceError("Update requires at least one non-Id field");
|
|
162
181
|
const statement = this.crudStatements.update(fields, byWhere ?? this.idWhere(record), (name, value) => this.cell(name, value, byWhere === undefined));
|
|
@@ -182,7 +201,14 @@ export class CRUDRepository extends ReadonlyRepository {
|
|
|
182
201
|
throw new DatasourceError("Composite id requires a row keyed by each Id column");
|
|
183
202
|
return this.idWhere({ [this.ids[0]]: id });
|
|
184
203
|
};
|
|
185
|
-
fillCreateZeros = (record) =>
|
|
204
|
+
fillCreateZeros = (record) => {
|
|
205
|
+
const skip = (name) => this.enrichmentSource(name);
|
|
206
|
+
const zeros = this.createZeros !== undefined && Object.keys(this.createZeros).length > 0
|
|
207
|
+
? this.createZeros
|
|
208
|
+
: zerosFromSchema(this.schema, this.ids, this.createProperties, skip);
|
|
209
|
+
const filled = Object.keys(zeros).length === 0 ? { ...record } : { ...zeros, ...record };
|
|
210
|
+
return applyEmptyDefaults(filled, this.schema, this.ids, this.createProperties, false, skip);
|
|
211
|
+
};
|
|
186
212
|
reverseConvert = (item) => {
|
|
187
213
|
const row = this.objectConverter.reverseConvert(item);
|
|
188
214
|
const converted = this.rowConverter ? this.rowConverter.reverseConvert(row) : row;
|
|
@@ -200,6 +226,7 @@ export class CRUDRepository extends ReadonlyRepository {
|
|
|
200
226
|
: parts.reduce((left, right) => new Operator.And(left, right)));
|
|
201
227
|
};
|
|
202
228
|
enrichmentInto = (name) => enrichmentsOf(this).some((entry) => entry.enrichment.destinationProperty === name);
|
|
229
|
+
enrichmentSource = (name) => enrichmentsOf(this).some((entry) => entry.enrichment.sourceProperty === name);
|
|
203
230
|
}
|
|
204
231
|
const writerOf = (via) => "create" in via && typeof via.create === "function" ? via : undefined;
|
|
205
232
|
const lastEnrichment = (host) => enrichmentsOf(host).at(-1);
|
package/dist/Datasource.js
CHANGED
|
@@ -49,7 +49,7 @@ export class Datasource {
|
|
|
49
49
|
const built = createCRUDRepositoryOptions(type, this.driver.rowTypeConverters);
|
|
50
50
|
const types = this.driver.rowTypeConverters;
|
|
51
51
|
const schema = options?.schema ?? new Schema({});
|
|
52
|
-
const rows = options?.rowConverter ?? RowTypeConverter.from(this.driver.rowTypeConverters, schema.
|
|
52
|
+
const rows = options?.rowConverter ?? RowTypeConverter.from(this.driver.rowTypeConverters, schema.types());
|
|
53
53
|
return {
|
|
54
54
|
...(options ?? built),
|
|
55
55
|
entity: options?.entity ?? built.entity,
|
|
@@ -63,7 +63,7 @@ export class Datasource {
|
|
|
63
63
|
const built = createReadonlyRepositoryMappingOptions(type, this.driver.rowTypeConverters);
|
|
64
64
|
const types = this.driver.rowTypeConverters;
|
|
65
65
|
const schema = options?.schema ?? new Schema({});
|
|
66
|
-
const rows = options?.rowConverter ?? RowTypeConverter.from(this.driver.rowTypeConverters, schema.
|
|
66
|
+
const rows = options?.rowConverter ?? RowTypeConverter.from(this.driver.rowTypeConverters, schema.types());
|
|
67
67
|
return {
|
|
68
68
|
...(options ?? built),
|
|
69
69
|
entity: options?.entity ?? built.entity,
|
package/dist/Schema.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
export type SchemaColumn = {
|
|
2
|
+
type: string;
|
|
3
|
+
nullable: boolean;
|
|
4
|
+
hasDefault: boolean;
|
|
5
|
+
};
|
|
1
6
|
export declare class Schema {
|
|
2
|
-
readonly columns: Readonly<Record<string,
|
|
3
|
-
constructor(columns: Readonly<Record<string,
|
|
7
|
+
readonly columns: Readonly<Record<string, SchemaColumn>>;
|
|
8
|
+
constructor(columns: Readonly<Record<string, SchemaColumn>>);
|
|
9
|
+
types: () => Record<string, string>;
|
|
4
10
|
}
|
package/dist/Schema.js
CHANGED
package/dist/StatementMappers.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DatasourceError } from "./DatasourceError.js";
|
|
2
|
-
import { applySelectFieldAlias, asIndexOf, functionOf, segments, selectFieldAliases } from "./SelectFieldAliases.js";
|
|
2
|
+
import { applySelectFieldAlias, asIndexOf, functionOf, segments, selectFieldAliases } from "./statements/SelectFieldAliases.js";
|
|
3
3
|
import { DeleteStatement } from "./statements/DeleteStatement.js";
|
|
4
4
|
import { InsertStatement } from "./statements/InsertStatement.js";
|
|
5
5
|
import { SelectInsertedIdStatement } from "./statements/SelectInsertedIdStatement.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -54,12 +54,6 @@ export { ReadonlyRepositoryBuilder } from "./ReadonlyRepositoryBuilder.js";
|
|
|
54
54
|
export { CRUDRepositoryBuilder } from "./CRUDRepositoryBuilder.js";
|
|
55
55
|
export { RepositoryBuilderOptionsFactory } from "./RepositoryBuilderOptionsFactory.js";
|
|
56
56
|
export { StatementMappers } from "./StatementMappers.js";
|
|
57
|
-
export { NestedSelectBuilder } from "./NestedSelectBuilder.js";
|
|
58
|
-
export type { NestedSelectBuilderOptions } from "./NestedSelectBuilderOptions.js";
|
|
59
|
-
export type { NestedSelectRelation } from "./NestedSelectRelation.js";
|
|
60
|
-
export type { NestedSelectRelationKind } from "./NestedSelectRelationKind.js";
|
|
61
|
-
export type { NestedSelectStatement } from "./NestedSelectStatement.js";
|
|
62
|
-
export type { NestedSelectType } from "./NestedSelectType.js";
|
|
63
57
|
export { ReadonlyRepositoryStatements } from "./ReadonlyRepositoryStatements.js";
|
|
64
58
|
export { CRUDRepositoryStatements } from "./CRUDRepositoryStatements.js";
|
|
65
59
|
export type { BuiltRepository } from "./BuiltRepository.js";
|
|
@@ -74,7 +68,7 @@ export { UnitOfWorkTransaction } from "./UnitOfWorkTransaction.js";
|
|
|
74
68
|
export { IsolationLevel } from "./IsolationLevel.js";
|
|
75
69
|
export type { IsolationLevel as IsolationLevelName } from "./IsolationLevel.js";
|
|
76
70
|
export type { Comparison } from "./statements/index.js";
|
|
77
|
-
export { ArrayExpression, CheckConstraint, ColumnDefault, Condition, ConditionRenderer, ExpressionRenderer, CreateIndexStatement, CreateTableStatement, CreateTableStatementTextRenderer, CreateIndexStatementTextRenderer, DropTableStatement, DropTableStatementTextRenderer, AlterTableStatement, AlterTableStatementTextRenderer, DropIndexStatement, DropIndexStatementTextRenderer, DropTriggerStatement, DropTriggerStatementTextRenderer, CreateTriggerStatement, CreateTriggerStatementTextRenderer, IdentityInsertStatement, IdentityInsertStatementTextRenderer, SqlSeedStatement, ForeignKeyStatement, CreateCreateStoredProcedureStatement, CreateReadStoredProcedureStatement, CreateNestedReadStoredProcedureStatement, CreateUpdateStoredProcedureStatement, CreateDeleteStoredProcedureStatement, CreateBulkCreateStoredProcedureStatement, CreateBulkUpdateStoredProcedureStatement, CreateBulkDeleteStoredProcedureStatement, CreateCreateStoredProcedureStatementTextRenderer, CreateReadStoredProcedureStatementTextRenderer, CreateNestedReadStoredProcedureStatementTextRenderer, CreateUpdateStoredProcedureStatementTextRenderer, CreateDeleteStoredProcedureStatementTextRenderer, CreateBulkCreateStoredProcedureStatementTextRenderer, CreateBulkUpdateStoredProcedureStatementTextRenderer, CreateBulkDeleteStoredProcedureStatementTextRenderer, DropRoutineStatement, DropRoutineStatementTextRenderer, SelectStatementTextRenderer, InsertStatementTextRenderer, UpdateStatementTextRenderer, DeleteStatementTextRenderer, BulkInsertStatementTextRenderer, BulkUpdateStatementTextRenderer, BulkDeleteStatementTextRenderer, ExecuteStoredProcedureStatementTextRenderer, ReturnStatementTextRenderer, SelectInsertedIdStatementTextRenderer, DefaultStatementTextRenderer, DeleteStatement, ForeignKey, Identifier, InsertStatement, BulkInsertStatement, BulkUpdateStatement, BulkDeleteStatement, Literal, NotNull, Operator, eq, ne, gt, lt, ge, le, PrimaryKey, Aggregate, OrderBy, SelectStatement, StatementParser, StatementRenderer, StatementTextRenderer, Native, n, Subquery, ReferentialAction, ExpressionEvaluator, StatementEvaluator, ExecuteStoredProcedureStatement, SelectInsertedIdStatement, ReturnStatement, UniqueConstraint, UpdateStatement, WhereText, Where, Join, } from "./statements/index.js";
|
|
71
|
+
export { ArrayExpression, CheckConstraint, ColumnDefault, Condition, ConditionRenderer, ExpressionRenderer, CreateIndexStatement, CreateTableStatement, CreateTableStatementTextRenderer, CreateIndexStatementTextRenderer, DropTableStatement, DropTableStatementTextRenderer, AlterTableStatement, AlterTableStatementTextRenderer, DropIndexStatement, DropIndexStatementTextRenderer, DropTriggerStatement, DropTriggerStatementTextRenderer, CreateTriggerStatement, CreateTriggerStatementTextRenderer, IdentityInsertStatement, IdentityInsertStatementTextRenderer, SqlSeedStatement, ForeignKeyStatement, CreateCreateStoredProcedureStatement, CreateReadStoredProcedureStatement, CreateNestedReadStoredProcedureStatement, CreateUpdateStoredProcedureStatement, CreateDeleteStoredProcedureStatement, CreateBulkCreateStoredProcedureStatement, CreateBulkUpdateStoredProcedureStatement, CreateBulkDeleteStoredProcedureStatement, CreateCreateStoredProcedureStatementTextRenderer, CreateReadStoredProcedureStatementTextRenderer, CreateNestedReadStoredProcedureStatementTextRenderer, CreateUpdateStoredProcedureStatementTextRenderer, CreateDeleteStoredProcedureStatementTextRenderer, CreateBulkCreateStoredProcedureStatementTextRenderer, CreateBulkUpdateStoredProcedureStatementTextRenderer, CreateBulkDeleteStoredProcedureStatementTextRenderer, DropRoutineStatement, DropRoutineStatementTextRenderer, SelectStatementTextRenderer, InsertStatementTextRenderer, UpdateStatementTextRenderer, DeleteStatementTextRenderer, BulkInsertStatementTextRenderer, BulkUpdateStatementTextRenderer, BulkDeleteStatementTextRenderer, ExecuteStoredProcedureStatementTextRenderer, ReturnStatementTextRenderer, SelectInsertedIdStatementTextRenderer, DefaultStatementTextRenderer, DeleteStatement, ForeignKey, Identifier, InsertStatement, BulkInsertStatement, BulkUpdateStatement, BulkDeleteStatement, Literal, NotNull, Operator, eq, ne, gt, lt, ge, le, PrimaryKey, Aggregate, OrderBy, SelectStatement, NestedSelectBuilder, StatementParser, StatementRenderer, StatementTextRenderer, StatementNaming, KeywordCasing, constraintNameOf, sqlProcedureStatementsOf, procedureNameOf, Native, n, Subquery, ReferentialAction, ExpressionEvaluator, StatementEvaluator, ExecuteStoredProcedureStatement, SelectInsertedIdStatement, ReturnStatement, UniqueConstraint, UpdateStatement, WhereText, Where, Join, } from "./statements/index.js";
|
|
78
72
|
export type { IDatasourceFactory } from "./IDatasourceFactory.js";
|
|
79
73
|
export type { Parameter } from "./Parameter.js";
|
|
80
74
|
export { ParameterDirection } from "./ParameterDirection.js";
|
|
@@ -115,7 +109,7 @@ export { FlatToNestedMapper } from "./mappers/FlatToNestedMapper.js";
|
|
|
115
109
|
export { ChangeCasingMapper } from "./mappers/ChangeCasingMapper.js";
|
|
116
110
|
export { DictionaryMapper } from "./mappers/DictionaryMapper.js";
|
|
117
111
|
export { DeterministicTypeMapper } from "./mappers/DeterministicTypeMapper.js";
|
|
118
|
-
export { Schema } from "./Schema.js";
|
|
112
|
+
export { Schema, type SchemaColumn } from "./Schema.js";
|
|
119
113
|
export { IdentityMapper } from "./mappers/IdentityMapper.js";
|
|
120
114
|
export { PluralizerMapper } from "./mappers/PluralizerMapper.js";
|
|
121
115
|
export { TransformMapper } from "./mappers/TransformMapper.js";
|
|
@@ -124,7 +118,7 @@ export { RowTypeMapper } from "./mappers/RowTypeMapper.js";
|
|
|
124
118
|
export { parametersToRecord } from "./parametersToRecord.js";
|
|
125
119
|
export { ProviderNotImplementedError } from "./ProviderNotImplementedError.js";
|
|
126
120
|
export { ProviderNotInstalledError } from "./ProviderNotInstalledError.js";
|
|
127
|
-
export type { Column, JoinKind, SelectStatementOptions, ReferentialAction as ReferentialActionName, SortDirection } from "./statements/index.js";
|
|
121
|
+
export type { Column, JoinKind, SelectStatementOptions, ReferentialAction as ReferentialActionName, SortDirection, ProcedureSource, ProcedureByGroup, NestedSelectBuilderOptions, NestedSelectRelation, NestedSelectRelationKind, NestedSelectStatement, NestedSelectType } from "./statements/index.js";
|
|
128
122
|
export type { Field, Scalar } from "./builders/index.js";
|
|
129
123
|
export { readerToAsyncIterable } from "./readerToAsyncIterable.js";
|
|
130
124
|
export { StubCommand, StubConnection, StubDatasource, StubReader, StubRepository, StubTransaction, createStubDatasource, } from "./stubs/index.js";
|
package/dist/index.js
CHANGED
|
@@ -31,7 +31,6 @@ export { ReadonlyRepositoryBuilder } from "./ReadonlyRepositoryBuilder.js";
|
|
|
31
31
|
export { CRUDRepositoryBuilder } from "./CRUDRepositoryBuilder.js";
|
|
32
32
|
export { RepositoryBuilderOptionsFactory } from "./RepositoryBuilderOptionsFactory.js";
|
|
33
33
|
export { StatementMappers } from "./StatementMappers.js";
|
|
34
|
-
export { NestedSelectBuilder } from "./NestedSelectBuilder.js";
|
|
35
34
|
export { ReadonlyRepositoryStatements } from "./ReadonlyRepositoryStatements.js";
|
|
36
35
|
export { CRUDRepositoryStatements } from "./CRUDRepositoryStatements.js";
|
|
37
36
|
export { createCRUDRepositoryOptions } from "./createCRUDRepositoryOptions.js";
|
|
@@ -39,7 +38,7 @@ export { createReadonlyRepositoryMappingOptions } from "./createReadonlyReposito
|
|
|
39
38
|
export { Response } from "./Response.js";
|
|
40
39
|
export { UnitOfWorkTransaction } from "./UnitOfWorkTransaction.js";
|
|
41
40
|
export { IsolationLevel } from "./IsolationLevel.js";
|
|
42
|
-
export { ArrayExpression, CheckConstraint, ColumnDefault, Condition, ConditionRenderer, ExpressionRenderer, CreateIndexStatement, CreateTableStatement, CreateTableStatementTextRenderer, CreateIndexStatementTextRenderer, DropTableStatement, DropTableStatementTextRenderer, AlterTableStatement, AlterTableStatementTextRenderer, DropIndexStatement, DropIndexStatementTextRenderer, DropTriggerStatement, DropTriggerStatementTextRenderer, CreateTriggerStatement, CreateTriggerStatementTextRenderer, IdentityInsertStatement, IdentityInsertStatementTextRenderer, SqlSeedStatement, ForeignKeyStatement, CreateCreateStoredProcedureStatement, CreateReadStoredProcedureStatement, CreateNestedReadStoredProcedureStatement, CreateUpdateStoredProcedureStatement, CreateDeleteStoredProcedureStatement, CreateBulkCreateStoredProcedureStatement, CreateBulkUpdateStoredProcedureStatement, CreateBulkDeleteStoredProcedureStatement, CreateCreateStoredProcedureStatementTextRenderer, CreateReadStoredProcedureStatementTextRenderer, CreateNestedReadStoredProcedureStatementTextRenderer, CreateUpdateStoredProcedureStatementTextRenderer, CreateDeleteStoredProcedureStatementTextRenderer, CreateBulkCreateStoredProcedureStatementTextRenderer, CreateBulkUpdateStoredProcedureStatementTextRenderer, CreateBulkDeleteStoredProcedureStatementTextRenderer, DropRoutineStatement, DropRoutineStatementTextRenderer, SelectStatementTextRenderer, InsertStatementTextRenderer, UpdateStatementTextRenderer, DeleteStatementTextRenderer, BulkInsertStatementTextRenderer, BulkUpdateStatementTextRenderer, BulkDeleteStatementTextRenderer, ExecuteStoredProcedureStatementTextRenderer, ReturnStatementTextRenderer, SelectInsertedIdStatementTextRenderer, DefaultStatementTextRenderer, DeleteStatement, ForeignKey, Identifier, InsertStatement, BulkInsertStatement, BulkUpdateStatement, BulkDeleteStatement, Literal, NotNull, Operator, eq, ne, gt, lt, ge, le, PrimaryKey, Aggregate, OrderBy, SelectStatement, StatementParser, StatementRenderer, StatementTextRenderer, Native, n, Subquery, ReferentialAction, ExpressionEvaluator, StatementEvaluator, ExecuteStoredProcedureStatement, SelectInsertedIdStatement, ReturnStatement, UniqueConstraint, UpdateStatement, WhereText, Where, Join, } from "./statements/index.js";
|
|
41
|
+
export { ArrayExpression, CheckConstraint, ColumnDefault, Condition, ConditionRenderer, ExpressionRenderer, CreateIndexStatement, CreateTableStatement, CreateTableStatementTextRenderer, CreateIndexStatementTextRenderer, DropTableStatement, DropTableStatementTextRenderer, AlterTableStatement, AlterTableStatementTextRenderer, DropIndexStatement, DropIndexStatementTextRenderer, DropTriggerStatement, DropTriggerStatementTextRenderer, CreateTriggerStatement, CreateTriggerStatementTextRenderer, IdentityInsertStatement, IdentityInsertStatementTextRenderer, SqlSeedStatement, ForeignKeyStatement, CreateCreateStoredProcedureStatement, CreateReadStoredProcedureStatement, CreateNestedReadStoredProcedureStatement, CreateUpdateStoredProcedureStatement, CreateDeleteStoredProcedureStatement, CreateBulkCreateStoredProcedureStatement, CreateBulkUpdateStoredProcedureStatement, CreateBulkDeleteStoredProcedureStatement, CreateCreateStoredProcedureStatementTextRenderer, CreateReadStoredProcedureStatementTextRenderer, CreateNestedReadStoredProcedureStatementTextRenderer, CreateUpdateStoredProcedureStatementTextRenderer, CreateDeleteStoredProcedureStatementTextRenderer, CreateBulkCreateStoredProcedureStatementTextRenderer, CreateBulkUpdateStoredProcedureStatementTextRenderer, CreateBulkDeleteStoredProcedureStatementTextRenderer, DropRoutineStatement, DropRoutineStatementTextRenderer, SelectStatementTextRenderer, InsertStatementTextRenderer, UpdateStatementTextRenderer, DeleteStatementTextRenderer, BulkInsertStatementTextRenderer, BulkUpdateStatementTextRenderer, BulkDeleteStatementTextRenderer, ExecuteStoredProcedureStatementTextRenderer, ReturnStatementTextRenderer, SelectInsertedIdStatementTextRenderer, DefaultStatementTextRenderer, DeleteStatement, ForeignKey, Identifier, InsertStatement, BulkInsertStatement, BulkUpdateStatement, BulkDeleteStatement, Literal, NotNull, Operator, eq, ne, gt, lt, ge, le, PrimaryKey, Aggregate, OrderBy, SelectStatement, NestedSelectBuilder, StatementParser, StatementRenderer, StatementTextRenderer, StatementNaming, KeywordCasing, constraintNameOf, sqlProcedureStatementsOf, procedureNameOf, Native, n, Subquery, ReferentialAction, ExpressionEvaluator, StatementEvaluator, ExecuteStoredProcedureStatement, SelectInsertedIdStatement, ReturnStatement, UniqueConstraint, UpdateStatement, WhereText, Where, Join, } from "./statements/index.js";
|
|
43
42
|
export { ParameterDirection } from "./ParameterDirection.js";
|
|
44
43
|
export { ArrayReader } from "./ArrayReader.js";
|
|
45
44
|
export { FirstResultReader } from "./FirstResultReader.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ICreateIndexStatement } from "./ICreateIndexStatement.js";
|
|
2
2
|
import type { IStatementVisitor } from "./IStatementVisitor.js";
|
|
3
|
+
import type { StatementNaming } from "./StatementNaming.js";
|
|
3
4
|
export declare class CreateIndexStatement implements ICreateIndexStatement {
|
|
4
5
|
readonly name: string;
|
|
5
6
|
readonly table: string;
|
|
@@ -7,4 +8,5 @@ export declare class CreateIndexStatement implements ICreateIndexStatement {
|
|
|
7
8
|
readonly unique: boolean;
|
|
8
9
|
constructor(name: string, table: string, columns: string[], unique?: boolean);
|
|
9
10
|
accept: (visitor: IStatementVisitor) => string;
|
|
11
|
+
static nameOf: (entity: string, naming: StatementNaming, ...parts: string[]) => string;
|
|
10
12
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { constraintNameOf } from "./ConstraintName.js";
|
|
1
2
|
export class CreateIndexStatement {
|
|
2
3
|
name;
|
|
3
4
|
table;
|
|
@@ -10,4 +11,5 @@ export class CreateIndexStatement {
|
|
|
10
11
|
this.unique = unique;
|
|
11
12
|
}
|
|
12
13
|
accept = (visitor) => visitor.visit(this);
|
|
14
|
+
static nameOf = (entity, naming, ...parts) => constraintNameOf(entity, naming, ...parts);
|
|
13
15
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NestedSelectStatement } from "
|
|
1
|
+
import type { NestedSelectStatement } from "./NestedSelectStatement.js";
|
|
2
2
|
import type { ICreateNestedReadStoredProcedureStatement } from "./ICreateNestedReadStoredProcedureStatement.js";
|
|
3
3
|
import type { IStatementVisitor } from "./IStatementVisitor.js";
|
|
4
4
|
import type { NestedWhereArgument } from "./NestedWhereArgument.js";
|
|
@@ -2,10 +2,13 @@ import type { Column } from "./Column.js";
|
|
|
2
2
|
import type { ICreateTableStatement } from "./ICreateTableStatement.js";
|
|
3
3
|
import type { IStatementVisitor } from "./IStatementVisitor.js";
|
|
4
4
|
import type { ITableConstraint } from "./ITableConstraint.js";
|
|
5
|
+
import type { StatementNaming } from "./StatementNaming.js";
|
|
5
6
|
export declare class CreateTableStatement implements ICreateTableStatement {
|
|
6
7
|
readonly table: string;
|
|
7
8
|
readonly columns: Column[];
|
|
8
9
|
readonly constraints: ITableConstraint[];
|
|
9
10
|
constructor(table: string, columns: Column[], constraints?: ITableConstraint[]);
|
|
10
11
|
accept: (visitor: IStatementVisitor) => string;
|
|
12
|
+
static tableName: (entity: string, naming: StatementNaming) => string;
|
|
13
|
+
static columnName: (field: string, naming: StatementNaming) => string;
|
|
11
14
|
}
|
|
@@ -8,4 +8,8 @@ export class CreateTableStatement {
|
|
|
8
8
|
this.constraints = constraints;
|
|
9
9
|
}
|
|
10
10
|
accept = (visitor) => visitor.visit(this);
|
|
11
|
+
static tableName = (entity, naming) => naming.isVerbatim(entity)
|
|
12
|
+
? entity
|
|
13
|
+
: naming.letter(naming.convert(naming.physicalStem(entity), naming.tableNameCasing));
|
|
14
|
+
static columnName = (field, naming) => naming.isVerbatim(field) ? field : naming.convert(field, naming.fieldNameCasing);
|
|
11
15
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ICreateTriggerStatement } from "./ICreateTriggerStatement.js";
|
|
2
2
|
import type { IStatementVisitor } from "./IStatementVisitor.js";
|
|
3
|
+
import type { StatementNaming } from "./StatementNaming.js";
|
|
3
4
|
export declare class CreateTriggerStatement implements ICreateTriggerStatement {
|
|
4
5
|
readonly table: string;
|
|
5
6
|
readonly name: string;
|
|
@@ -7,4 +8,5 @@ export declare class CreateTriggerStatement implements ICreateTriggerStatement {
|
|
|
7
8
|
readonly keyColumn: string;
|
|
8
9
|
constructor(table: string, name: string, updatedColumn: string, keyColumn: string);
|
|
9
10
|
accept: (visitor: IStatementVisitor) => string;
|
|
11
|
+
static nameOf: (entity: string, naming: StatementNaming) => string;
|
|
10
12
|
}
|
|
@@ -10,4 +10,10 @@ export class CreateTriggerStatement {
|
|
|
10
10
|
this.keyColumn = keyColumn;
|
|
11
11
|
}
|
|
12
12
|
accept = (visitor) => visitor.visit(this);
|
|
13
|
+
static nameOf = (entity, naming) => {
|
|
14
|
+
if (naming.isVerbatim(entity))
|
|
15
|
+
return `trg_${entity}_updated_at`;
|
|
16
|
+
const stem = naming.physicalStem(entity);
|
|
17
|
+
return naming.letter(naming.convert(`trg_${stem}_updated_at`, naming.triggerNameCasing));
|
|
18
|
+
};
|
|
13
19
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ITableConstraint } from "./ITableConstraint.js";
|
|
2
|
+
import type { StatementNaming } from "./StatementNaming.js";
|
|
2
3
|
export declare const ReferentialAction: {
|
|
3
4
|
readonly Cascade: "cascade";
|
|
4
5
|
readonly SetNull: "setNull";
|
|
@@ -16,4 +17,5 @@ export declare class ForeignKey implements ITableConstraint {
|
|
|
16
17
|
readonly onUpdate?: ReferentialAction | undefined;
|
|
17
18
|
readonly kind: "foreignKey";
|
|
18
19
|
constructor(name: string, columns: string[], referencesTable: string, referencesColumns: string[], onDelete?: ReferentialAction | undefined, onUpdate?: ReferentialAction | undefined);
|
|
20
|
+
static nameOf: (entity: string, naming: StatementNaming, ...parts: string[]) => string;
|
|
19
21
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { constraintNameOf } from "./ConstraintName.js";
|
|
1
2
|
export const ReferentialAction = {
|
|
2
3
|
Cascade: "cascade",
|
|
3
4
|
SetNull: "setNull",
|
|
@@ -21,4 +22,5 @@ export class ForeignKey {
|
|
|
21
22
|
this.onDelete = onDelete;
|
|
22
23
|
this.onUpdate = onUpdate;
|
|
23
24
|
}
|
|
25
|
+
static nameOf = (entity, naming, ...parts) => constraintNameOf(entity, naming, ...parts);
|
|
24
26
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { IForeignKeyStatement } from "./IForeignKeyStatement.js";
|
|
2
2
|
import type { IStatementVisitor } from "./IStatementVisitor.js";
|
|
3
3
|
import type { ReferentialAction } from "./ForeignKey.js";
|
|
4
|
+
import type { StatementNaming } from "./StatementNaming.js";
|
|
4
5
|
export declare class ForeignKeyStatement implements IForeignKeyStatement {
|
|
5
6
|
readonly table: string;
|
|
6
7
|
readonly name: string;
|
|
@@ -12,4 +13,5 @@ export declare class ForeignKeyStatement implements IForeignKeyStatement {
|
|
|
12
13
|
readonly onUpdate?: ReferentialAction | undefined;
|
|
13
14
|
constructor(table: string, name: string, columns: readonly string[], referencesTable: string, referencesColumns: readonly string[], kind?: "add" | "drop", onDelete?: ReferentialAction | undefined, onUpdate?: ReferentialAction | undefined);
|
|
14
15
|
accept: (visitor: IStatementVisitor) => string;
|
|
16
|
+
static nameOf: (entity: string, naming: StatementNaming, ...parts: string[]) => string;
|
|
15
17
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { constraintNameOf } from "./ConstraintName.js";
|
|
1
2
|
export class ForeignKeyStatement {
|
|
2
3
|
table;
|
|
3
4
|
name;
|
|
@@ -18,4 +19,5 @@ export class ForeignKeyStatement {
|
|
|
18
19
|
this.onUpdate = onUpdate;
|
|
19
20
|
}
|
|
20
21
|
accept = (visitor) => visitor.visit(this);
|
|
22
|
+
static nameOf = (entity, naming, ...parts) => constraintNameOf(entity, naming, ...parts);
|
|
21
23
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NestedSelectStatement } from "
|
|
1
|
+
import type { NestedSelectStatement } from "./NestedSelectStatement.js";
|
|
2
2
|
import type { IStatement } from "./IStatement.js";
|
|
3
3
|
import type { NestedWhereArgument } from "./NestedWhereArgument.js";
|
|
4
4
|
export interface ICreateNestedReadStoredProcedureStatement extends IStatement {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { NestedSelectBuilderOptions } from "./NestedSelectBuilderOptions.js";
|
|
2
|
+
import type { NestedSelectStatement } from "./NestedSelectStatement.js";
|
|
3
|
+
import type { NestedSelectType } from "./NestedSelectType.js";
|
|
4
|
+
export declare class NestedSelectBuilder {
|
|
5
|
+
build(root: NestedSelectType, options?: NestedSelectBuilderOptions): NestedSelectStatement;
|
|
6
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { selectFieldAliases } from "./SelectFieldAliases.js";
|
|
2
|
+
import { Join } from "./Join.js";
|
|
3
|
+
import { SelectStatement } from "./SelectStatement.js";
|
|
4
|
+
export class NestedSelectBuilder {
|
|
5
|
+
build(root, options) {
|
|
6
|
+
const stopAt = options?.stopAt ?? [];
|
|
7
|
+
const fields = [];
|
|
8
|
+
const joins = [];
|
|
9
|
+
walk(root, root.name, root.name, "", stopAt, false, fields, joins);
|
|
10
|
+
const aliases = selectFieldAliases(root.name, fields);
|
|
11
|
+
const byPath = Object.fromEntries(fields.map((field, i) => [field, aliases[i]]));
|
|
12
|
+
return {
|
|
13
|
+
select: new SelectStatement({
|
|
14
|
+
table: root.name,
|
|
15
|
+
fields,
|
|
16
|
+
joins,
|
|
17
|
+
where: options?.where,
|
|
18
|
+
}),
|
|
19
|
+
map: mapOf(root, root.name, "", stopAt, byPath),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const walk = (type, fieldPrefix, joinEntity, stopPrefix, stopAt, outer, fields, joins) => {
|
|
24
|
+
for (const property of type.properties)
|
|
25
|
+
fields.push(`${fieldPrefix}.${property}`);
|
|
26
|
+
for (const relation of type.relations) {
|
|
27
|
+
const path = stopPrefix.length === 0 ? relation.name : `${stopPrefix}.${relation.name}`;
|
|
28
|
+
if (stopped(stopAt, path))
|
|
29
|
+
continue;
|
|
30
|
+
const list = relation.kind === "list";
|
|
31
|
+
joins.push(list || outer
|
|
32
|
+
? Join.left(relation.target.name, `${joinEntity}.${relation.from}`, `${relation.target.name}.${relation.to}`)
|
|
33
|
+
: Join.inner(relation.target.name, `${joinEntity}.${relation.from}`, `${relation.target.name}.${relation.to}`));
|
|
34
|
+
walk(relation.target, `${fieldPrefix}.${relation.target.name}`, relation.target.name, path, stopAt, outer || list, fields, joins);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const mapOf = (type, fieldPrefix, stopPrefix, stopAt, aliases) => ({
|
|
38
|
+
key: aliases[`${fieldPrefix}.${type.key}`],
|
|
39
|
+
fields: fieldsOf(type, fieldPrefix, stopPrefix, stopAt, aliases),
|
|
40
|
+
});
|
|
41
|
+
const fieldsOf = (type, fieldPrefix, stopPrefix, stopAt, aliases) => {
|
|
42
|
+
const fields = {};
|
|
43
|
+
for (const property of type.properties) {
|
|
44
|
+
const alias = aliases[`${fieldPrefix}.${property}`];
|
|
45
|
+
fields[alias] = alias;
|
|
46
|
+
}
|
|
47
|
+
for (const relation of type.relations) {
|
|
48
|
+
const path = stopPrefix.length === 0 ? relation.name : `${stopPrefix}.${relation.name}`;
|
|
49
|
+
if (stopped(stopAt, path))
|
|
50
|
+
continue;
|
|
51
|
+
const childPrefix = `${fieldPrefix}.${relation.target.name}`;
|
|
52
|
+
if (relation.kind === "list") {
|
|
53
|
+
fields[relation.name] = {
|
|
54
|
+
key: aliases[`${childPrefix}.${relation.target.key}`],
|
|
55
|
+
fields: fieldsOf(relation.target, childPrefix, path, stopAt, aliases),
|
|
56
|
+
};
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
Object.assign(fields, fieldsOf(relation.target, childPrefix, path, stopAt, aliases));
|
|
60
|
+
}
|
|
61
|
+
return fields;
|
|
62
|
+
};
|
|
63
|
+
const stopped = (stopAt, path) => stopAt.some((item) => item === path || path.startsWith(`${item}.`));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { NestedSelectRelationKind } from "./NestedSelectRelationKind.js";
|
|
2
|
+
import type { NestedSelectType } from "./NestedSelectType.js";
|
|
3
|
+
export type NestedSelectRelation = {
|
|
4
|
+
name: string;
|
|
5
|
+
kind: NestedSelectRelationKind;
|
|
6
|
+
from: string;
|
|
7
|
+
to: string;
|
|
8
|
+
target: NestedSelectType;
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type NestedSelectRelationKind = "object" | "list";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TypeMapGroup } from "../mappers/TypeMapGroup.js";
|
|
2
|
+
import type { SelectStatement } from "./SelectStatement.js";
|
|
3
|
+
export type NestedSelectMapField = string | TypeMapGroup<Record<string, string>>;
|
|
4
|
+
export type NestedSelectStatement = {
|
|
5
|
+
select: SelectStatement;
|
|
6
|
+
map: {
|
|
7
|
+
key: string;
|
|
8
|
+
fields: Record<string, NestedSelectMapField>;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ITableConstraint } from "./ITableConstraint.js";
|
|
2
|
+
import type { StatementNaming } from "./StatementNaming.js";
|
|
2
3
|
export declare class PrimaryKey implements ITableConstraint {
|
|
3
4
|
readonly name: string;
|
|
4
5
|
readonly columns: string[];
|
|
5
6
|
readonly kind: "primaryKey";
|
|
6
7
|
constructor(name: string, columns: string[]);
|
|
8
|
+
static nameOf: (entity: string, naming: StatementNaming, ...parts: string[]) => string;
|
|
7
9
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { constraintNameOf } from "./ConstraintName.js";
|
|
1
2
|
export class PrimaryKey {
|
|
2
3
|
name;
|
|
3
4
|
columns;
|
|
@@ -6,4 +7,5 @@ export class PrimaryKey {
|
|
|
6
7
|
this.name = name;
|
|
7
8
|
this.columns = columns;
|
|
8
9
|
}
|
|
10
|
+
static nameOf = (entity, naming, ...parts) => constraintNameOf(entity, naming, ...parts);
|
|
9
11
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RoutineParameter } from "./RoutineParameter.js";
|
|
2
|
+
export type ProcedureByGroup = {
|
|
3
|
+
logical: readonly string[];
|
|
4
|
+
columns: readonly string[];
|
|
5
|
+
parameters: readonly RoutineParameter[];
|
|
6
|
+
updateParameters: readonly RoutineParameter[];
|
|
7
|
+
};
|
|
8
|
+
export type ProcedureSource = {
|
|
9
|
+
plural: string;
|
|
10
|
+
table: string;
|
|
11
|
+
columns: readonly string[];
|
|
12
|
+
createParameters: readonly RoutineParameter[];
|
|
13
|
+
writable: readonly string[];
|
|
14
|
+
createColumns: readonly RoutineParameter[];
|
|
15
|
+
updateColumns: readonly RoutineParameter[];
|
|
16
|
+
typedColumns: readonly RoutineParameter[];
|
|
17
|
+
byGroups: readonly ProcedureByGroup[];
|
|
18
|
+
key: string;
|
|
19
|
+
keyType: string;
|
|
20
|
+
auditUpdated?: string;
|
|
21
|
+
generatedKey: boolean;
|
|
22
|
+
routineName: (stem: string) => string;
|
|
23
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type PathParts = {
|
|
2
|
+
owner: string;
|
|
3
|
+
last: string;
|
|
4
|
+
root: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare const selectFieldAliases: (table: string, fields: readonly string[], aliases?: readonly (string | undefined)[]) => (string | undefined)[];
|
|
7
|
+
export declare const applySelectFieldAlias: (field: string, alias?: string) => string;
|
|
8
|
+
export declare const pathOf: (field: string, table: string) => PathParts | undefined;
|
|
9
|
+
export declare const functionOf: (field: string) => {
|
|
10
|
+
name: string;
|
|
11
|
+
inner: string;
|
|
12
|
+
} | undefined;
|
|
13
|
+
export declare const asIndexOf: (field: string) => number;
|
|
14
|
+
export declare const segments: (name: string) => string[];
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export const selectFieldAliases = (table, fields, aliases = []) => {
|
|
2
|
+
const result = fields.map(() => undefined);
|
|
3
|
+
const used = new Set();
|
|
4
|
+
for (const [i] of fields.entries()) {
|
|
5
|
+
const alias = aliases[i];
|
|
6
|
+
if (alias !== undefined) {
|
|
7
|
+
result[i] = alias;
|
|
8
|
+
used.add(alias);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
for (const [i, field] of fields.entries()) {
|
|
12
|
+
const path = pathOf(field, table);
|
|
13
|
+
if (result[i] === undefined && path?.root) {
|
|
14
|
+
result[i] = path.last;
|
|
15
|
+
used.add(path.last);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (const [i, field] of fields.entries()) {
|
|
19
|
+
const path = pathOf(field, table);
|
|
20
|
+
if (result[i] === undefined && path && !path.root) {
|
|
21
|
+
const alias = used.has(path.last) ? `${path.owner}${path.last}` : path.last;
|
|
22
|
+
result[i] = alias;
|
|
23
|
+
used.add(alias);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
export const applySelectFieldAlias = (field, alias) => alias === undefined ? field : `${field} AS ${alias}`;
|
|
29
|
+
export const pathOf = (field, table) => {
|
|
30
|
+
if (asIndexOf(field) >= 0 || field.includes("("))
|
|
31
|
+
return undefined;
|
|
32
|
+
const parts = segments(field);
|
|
33
|
+
if (parts.length < 2)
|
|
34
|
+
return undefined;
|
|
35
|
+
return {
|
|
36
|
+
owner: parts[parts.length - 2],
|
|
37
|
+
last: parts[parts.length - 1],
|
|
38
|
+
root: parts.length === 2 && parts[0] === table,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export const functionOf = (field) => {
|
|
42
|
+
const open = field.indexOf("(");
|
|
43
|
+
return open <= 0 || !field.endsWith(")")
|
|
44
|
+
? undefined
|
|
45
|
+
: { name: field.slice(0, open).trim(), inner: field.slice(open + 1, -1).trim() };
|
|
46
|
+
};
|
|
47
|
+
export const asIndexOf = (field) => field.toUpperCase().indexOf(" AS ");
|
|
48
|
+
export const segments = (name) => {
|
|
49
|
+
const parts = [];
|
|
50
|
+
let quoted = false;
|
|
51
|
+
let start = 0;
|
|
52
|
+
for (let i = 0; i < name.length; i++) {
|
|
53
|
+
if (name[i] === '"')
|
|
54
|
+
quoted = !quoted;
|
|
55
|
+
if (name[i] === "." && !quoted) {
|
|
56
|
+
parts.push(name.slice(start, i));
|
|
57
|
+
start = i + 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
parts.push(name.slice(start));
|
|
61
|
+
return parts;
|
|
62
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IStatement } from "./IStatement.js";
|
|
2
|
+
import type { ProcedureSource } from "./ProcedureSource.js";
|
|
3
|
+
export declare const sqlProcedureStatementsOf: (source: ProcedureSource) => IStatement[];
|
|
4
|
+
export declare const procedureNameOf: (statement: IStatement) => string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CreateBulkCreateStoredProcedureStatement } from "./CreateBulkCreateStoredProcedureStatement.js";
|
|
2
|
+
import { CreateBulkDeleteStoredProcedureStatement } from "./CreateBulkDeleteStoredProcedureStatement.js";
|
|
3
|
+
import { CreateBulkUpdateStoredProcedureStatement } from "./CreateBulkUpdateStoredProcedureStatement.js";
|
|
4
|
+
import { CreateCreateStoredProcedureStatement } from "./CreateCreateStoredProcedureStatement.js";
|
|
5
|
+
import { CreateDeleteStoredProcedureStatement } from "./CreateDeleteStoredProcedureStatement.js";
|
|
6
|
+
import { CreateReadStoredProcedureStatement } from "./CreateReadStoredProcedureStatement.js";
|
|
7
|
+
import { CreateUpdateStoredProcedureStatement } from "./CreateUpdateStoredProcedureStatement.js";
|
|
8
|
+
export const sqlProcedureStatementsOf = (source) => {
|
|
9
|
+
const name = (stem) => source.routineName(stem);
|
|
10
|
+
const plural = source.plural;
|
|
11
|
+
const payload = { name: "payload", type: "payload" };
|
|
12
|
+
const statements = [
|
|
13
|
+
new CreateCreateStoredProcedureStatement(name(`create_${plural}`), source.table, source.columns, source.createParameters, source.key, source.keyType, source.writable, source.generatedKey, source.auditUpdated),
|
|
14
|
+
new CreateReadStoredProcedureStatement(name(`read_${plural}`), source.table, source.columns, [], source.key, source.keyType, source.writable, [], source.generatedKey, source.auditUpdated),
|
|
15
|
+
];
|
|
16
|
+
for (const group of source.byGroups) {
|
|
17
|
+
const suffix = `_by_${group.logical.join("_")}`;
|
|
18
|
+
statements.push(new CreateReadStoredProcedureStatement(name(`read_${plural}${suffix}`), source.table, source.columns, group.parameters, source.key, source.keyType, source.writable, group.columns, source.generatedKey, source.auditUpdated), new CreateUpdateStoredProcedureStatement(name(`update_${plural}${suffix}`), source.table, source.columns, group.updateParameters, source.key, source.keyType, source.writable, group.columns, source.generatedKey, source.auditUpdated), new CreateDeleteStoredProcedureStatement(name(`delete_${plural}${suffix}`), source.table, source.columns, group.parameters, source.key, source.keyType, source.writable, group.columns, source.generatedKey, source.auditUpdated));
|
|
19
|
+
}
|
|
20
|
+
statements.push(new CreateBulkCreateStoredProcedureStatement(name(`bulk_create_${plural}`), source.table, source.createColumns, payload, source.key, source.keyType), new CreateBulkUpdateStoredProcedureStatement(name(`bulk_update_${plural}`), source.table, source.updateColumns, payload, source.key, source.keyType), new CreateBulkDeleteStoredProcedureStatement(name(`bulk_delete_${plural}`), source.table, source.typedColumns, payload, source.key, source.keyType));
|
|
21
|
+
return statements;
|
|
22
|
+
};
|
|
23
|
+
export const procedureNameOf = (statement) => {
|
|
24
|
+
if (statement instanceof CreateCreateStoredProcedureStatement ||
|
|
25
|
+
statement instanceof CreateReadStoredProcedureStatement ||
|
|
26
|
+
statement instanceof CreateUpdateStoredProcedureStatement ||
|
|
27
|
+
statement instanceof CreateDeleteStoredProcedureStatement ||
|
|
28
|
+
statement instanceof CreateBulkCreateStoredProcedureStatement ||
|
|
29
|
+
statement instanceof CreateBulkUpdateStoredProcedureStatement ||
|
|
30
|
+
statement instanceof CreateBulkDeleteStoredProcedureStatement) {
|
|
31
|
+
return statement.name;
|
|
32
|
+
}
|
|
33
|
+
throw new Error("procedure statement has no name");
|
|
34
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Casing } from "../converters/ChangeCasingConverter.js";
|
|
2
|
+
import { KeywordCasing } from "./KeywordCasing.js";
|
|
3
|
+
export declare class StatementNaming {
|
|
4
|
+
readonly tableNameCasing: Casing;
|
|
5
|
+
readonly fieldNameCasing: Casing;
|
|
6
|
+
readonly constraintNameCasing: Casing;
|
|
7
|
+
readonly triggerNameCasing: Casing;
|
|
8
|
+
readonly keywordCasing: KeywordCasing;
|
|
9
|
+
readonly pluralizeTables: boolean;
|
|
10
|
+
readonly objects: "preserve" | "upper" | "lower";
|
|
11
|
+
static readonly sql: StatementNaming;
|
|
12
|
+
constructor(options?: {
|
|
13
|
+
tableNameCasing?: Casing;
|
|
14
|
+
fieldNameCasing?: Casing;
|
|
15
|
+
constraintNameCasing?: Casing;
|
|
16
|
+
triggerNameCasing?: Casing;
|
|
17
|
+
keywordCasing?: KeywordCasing;
|
|
18
|
+
pluralizeTables?: boolean;
|
|
19
|
+
objects?: "preserve" | "upper" | "lower";
|
|
20
|
+
});
|
|
21
|
+
isVerbatim: (mapping: string) => boolean;
|
|
22
|
+
physicalStem: (name: string) => string;
|
|
23
|
+
convert: (text: string, casing: Casing) => string;
|
|
24
|
+
letter: (text: string) => string;
|
|
25
|
+
keyword: (text: string) => string;
|
|
26
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ChangeCasingConverter } from "../converters/ChangeCasingConverter.js";
|
|
2
|
+
import { PluralizerConverter } from "../converters/PluralizerConverter.js";
|
|
3
|
+
import { KeywordCasing } from "./KeywordCasing.js";
|
|
4
|
+
const snake = /^[a-z_][a-z0-9_]*$/;
|
|
5
|
+
const pluralizer = new PluralizerConverter();
|
|
6
|
+
export class StatementNaming {
|
|
7
|
+
tableNameCasing;
|
|
8
|
+
fieldNameCasing;
|
|
9
|
+
constraintNameCasing;
|
|
10
|
+
triggerNameCasing;
|
|
11
|
+
keywordCasing;
|
|
12
|
+
pluralizeTables;
|
|
13
|
+
objects;
|
|
14
|
+
static sql = new StatementNaming();
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.tableNameCasing = options.tableNameCasing ?? "snakeCase";
|
|
17
|
+
this.fieldNameCasing = options.fieldNameCasing ?? "snakeCase";
|
|
18
|
+
this.constraintNameCasing = options.constraintNameCasing ?? "snakeCase";
|
|
19
|
+
this.triggerNameCasing = options.triggerNameCasing ?? "snakeCase";
|
|
20
|
+
this.keywordCasing = options.keywordCasing ?? KeywordCasing.Upper;
|
|
21
|
+
this.pluralizeTables = options.pluralizeTables ?? true;
|
|
22
|
+
this.objects = options.objects ?? "preserve";
|
|
23
|
+
}
|
|
24
|
+
isVerbatim = (mapping) => !snake.test(mapping);
|
|
25
|
+
physicalStem = (name) => this.isVerbatim(name) ? name : this.pluralizeTables ? lastToken(name) : name;
|
|
26
|
+
convert = (text, casing) => {
|
|
27
|
+
const words = identifierWords(text);
|
|
28
|
+
if (words.length === 0)
|
|
29
|
+
return text;
|
|
30
|
+
switch (casing) {
|
|
31
|
+
case "camelCase":
|
|
32
|
+
return words.map((word, i) => (i === 0 ? word : cap(word))).join("");
|
|
33
|
+
case "pascalCase":
|
|
34
|
+
return words.map(cap).join("");
|
|
35
|
+
case "snakeCase":
|
|
36
|
+
return words.join("_");
|
|
37
|
+
case "kebabCase":
|
|
38
|
+
return words.join("-");
|
|
39
|
+
default:
|
|
40
|
+
return new ChangeCasingConverter(casing).convert(text);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
letter = (text) => this.objects === "upper"
|
|
44
|
+
? text.toUpperCase()
|
|
45
|
+
: this.objects === "lower"
|
|
46
|
+
? text.toLowerCase()
|
|
47
|
+
: text;
|
|
48
|
+
keyword = (text) => this.keywordCasing === KeywordCasing.Lower ? text.toLowerCase() : text.toUpperCase();
|
|
49
|
+
}
|
|
50
|
+
const identifierWords = (name) => name
|
|
51
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
52
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
|
|
53
|
+
.replace(/[_\-.]+/g, " ")
|
|
54
|
+
.trim()
|
|
55
|
+
.split(/\s+/)
|
|
56
|
+
.filter((word) => word.length > 0)
|
|
57
|
+
.map((word) => word.toLowerCase());
|
|
58
|
+
const cap = (word) => word[0].toUpperCase() + word.slice(1);
|
|
59
|
+
const lastToken = (name) => {
|
|
60
|
+
const at = name.lastIndexOf("_");
|
|
61
|
+
return at < 0
|
|
62
|
+
? pluralizer.convert(name)
|
|
63
|
+
: `${name.slice(0, at + 1)}${pluralizer.convert(name.slice(at + 1))}`;
|
|
64
|
+
};
|
|
@@ -32,6 +32,7 @@ import { UpdateStatement } from "./UpdateStatement.js";
|
|
|
32
32
|
export declare class StatementRenderer implements IStatementVisitor {
|
|
33
33
|
protected readonly text: StatementTextRenderer;
|
|
34
34
|
constructor(text: StatementTextRenderer);
|
|
35
|
+
procedures(_source: import("./ProcedureSource.js").ProcedureSource): import("./IStatement.js").IStatement[];
|
|
35
36
|
visit(statement: SelectStatement): string;
|
|
36
37
|
visit(statement: InsertStatement): string;
|
|
37
38
|
visit(statement: UpdateStatement): string;
|
|
@@ -4,11 +4,21 @@ import type { IStatement } from "./IStatement.js";
|
|
|
4
4
|
import type { IStatementVisitor } from "./IStatementVisitor.js";
|
|
5
5
|
import { ConditionRenderer } from "./ConditionRenderer.js";
|
|
6
6
|
import { ExpressionRenderer } from "./ExpressionRenderer.js";
|
|
7
|
+
import type { ProcedureSource } from "./ProcedureSource.js";
|
|
7
8
|
import { StatementRenderer } from "./StatementRenderer.js";
|
|
9
|
+
import { StatementNaming } from "./StatementNaming.js";
|
|
8
10
|
export declare class StatementTextRenderer {
|
|
9
11
|
protected readonly statements: IStatementVisitor;
|
|
10
12
|
protected readonly conditions: IConditionVisitor;
|
|
11
|
-
|
|
13
|
+
readonly naming: StatementNaming;
|
|
14
|
+
private readonly statementsFactory?;
|
|
15
|
+
private readonly conditionsFactory?;
|
|
16
|
+
private readonly expressionsFactory?;
|
|
17
|
+
private readonly applyKeywordsFn?;
|
|
18
|
+
constructor(statements?: (text: StatementTextRenderer) => StatementRenderer, conditions?: (expressions: ExpressionRenderer) => ConditionRenderer, expressions?: (text: StatementTextRenderer) => ExpressionRenderer, naming?: StatementNaming, applyKeywords?: (sql: string, keyword: (word: string) => string) => string);
|
|
19
|
+
withNaming: (naming: StatementNaming) => StatementTextRenderer;
|
|
20
|
+
procedures: (source: ProcedureSource) => IStatement[];
|
|
21
|
+
applyKeywords: (sql: string) => string;
|
|
12
22
|
render(statement: IStatement): string;
|
|
13
23
|
render(condition: ICondition): string;
|
|
14
24
|
}
|
|
@@ -1,17 +1,34 @@
|
|
|
1
1
|
import { is } from "./brand.js";
|
|
2
2
|
import { ConditionRenderer } from "./ConditionRenderer.js";
|
|
3
3
|
import { ExpressionRenderer } from "./ExpressionRenderer.js";
|
|
4
|
+
import { KeywordCasing } from "./KeywordCasing.js";
|
|
4
5
|
import { StatementRenderer } from "./StatementRenderer.js";
|
|
6
|
+
import { StatementNaming } from "./StatementNaming.js";
|
|
5
7
|
import { Where } from "./Where.js";
|
|
6
8
|
import { WhereText } from "./WhereText.js";
|
|
7
9
|
export class StatementTextRenderer {
|
|
8
10
|
statements;
|
|
9
11
|
conditions;
|
|
10
|
-
|
|
12
|
+
naming;
|
|
13
|
+
statementsFactory;
|
|
14
|
+
conditionsFactory;
|
|
15
|
+
expressionsFactory;
|
|
16
|
+
applyKeywordsFn;
|
|
17
|
+
constructor(statements, conditions, expressions, naming, applyKeywords) {
|
|
18
|
+
this.statementsFactory = statements;
|
|
19
|
+
this.conditionsFactory = conditions;
|
|
20
|
+
this.expressionsFactory = expressions;
|
|
21
|
+
this.applyKeywordsFn = applyKeywords;
|
|
22
|
+
this.naming = naming ?? StatementNaming.sql;
|
|
11
23
|
const expressionRenderer = expressions?.(this) ?? new ExpressionRenderer(this);
|
|
12
24
|
this.statements = statements?.(this) ?? new StatementRenderer(this);
|
|
13
25
|
this.conditions = conditions?.(expressionRenderer) ?? new ConditionRenderer(expressionRenderer);
|
|
14
26
|
}
|
|
27
|
+
withNaming = (naming) => new StatementTextRenderer(this.statementsFactory, this.conditionsFactory, this.expressionsFactory, naming, this.applyKeywordsFn);
|
|
28
|
+
procedures = (source) => this.statements instanceof StatementRenderer ? this.statements.procedures(source) : [];
|
|
29
|
+
applyKeywords = (sql) => this.naming.keywordCasing === KeywordCasing.Lower && this.applyKeywordsFn !== undefined
|
|
30
|
+
? this.applyKeywordsFn(sql, this.naming.keyword)
|
|
31
|
+
: sql;
|
|
15
32
|
render(target) {
|
|
16
33
|
return is(target, Where) || is(target, WhereText)
|
|
17
34
|
? target.accept(this.conditions)
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ITableConstraint } from "./ITableConstraint.js";
|
|
2
|
+
import type { StatementNaming } from "./StatementNaming.js";
|
|
2
3
|
export declare class UniqueConstraint implements ITableConstraint {
|
|
3
4
|
readonly name: string;
|
|
4
5
|
readonly columns: string[];
|
|
5
6
|
readonly kind: "unique";
|
|
6
7
|
constructor(name: string, columns: string[]);
|
|
8
|
+
static nameOf: (entity: string, naming: StatementNaming, ...parts: string[]) => string;
|
|
7
9
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { constraintNameOf } from "./ConstraintName.js";
|
|
1
2
|
export class UniqueConstraint {
|
|
2
3
|
name;
|
|
3
4
|
columns;
|
|
@@ -6,4 +7,5 @@ export class UniqueConstraint {
|
|
|
6
7
|
this.name = name;
|
|
7
8
|
this.columns = columns;
|
|
8
9
|
}
|
|
10
|
+
static nameOf = (entity, naming, ...parts) => constraintNameOf(entity, naming, ...parts);
|
|
9
11
|
}
|
|
@@ -58,8 +58,19 @@ export { ExpressionEvaluator } from "./ExpressionEvaluator.js";
|
|
|
58
58
|
export { StatementEvaluator } from "./StatementEvaluator.js";
|
|
59
59
|
export { WhereText } from "./WhereText.js";
|
|
60
60
|
export { SelectStatement } from "./SelectStatement.js";
|
|
61
|
+
export { NestedSelectBuilder } from "./NestedSelectBuilder.js";
|
|
62
|
+
export type { NestedSelectBuilderOptions } from "./NestedSelectBuilderOptions.js";
|
|
63
|
+
export type { NestedSelectRelation } from "./NestedSelectRelation.js";
|
|
64
|
+
export type { NestedSelectRelationKind } from "./NestedSelectRelationKind.js";
|
|
65
|
+
export type { NestedSelectStatement } from "./NestedSelectStatement.js";
|
|
66
|
+
export type { NestedSelectType } from "./NestedSelectType.js";
|
|
61
67
|
export { StatementParser } from "./StatementParser.js";
|
|
62
68
|
export { StatementTextRenderer } from "./StatementTextRenderer.js";
|
|
69
|
+
export { StatementNaming } from "./StatementNaming.js";
|
|
70
|
+
export { KeywordCasing } from "./KeywordCasing.js";
|
|
71
|
+
export { constraintNameOf } from "./ConstraintName.js";
|
|
72
|
+
export type { ProcedureSource, ProcedureByGroup } from "./ProcedureSource.js";
|
|
73
|
+
export { sqlProcedureStatementsOf, procedureNameOf } from "./SqlProcedureStatements.js";
|
|
63
74
|
export { DefaultStatementTextRenderer } from "./DefaultStatementTextRenderer.js";
|
|
64
75
|
export { StatementRenderer } from "./StatementRenderer.js";
|
|
65
76
|
export { ExpressionRenderer } from "./ExpressionRenderer.js";
|
package/dist/statements/index.js
CHANGED
|
@@ -14,8 +14,13 @@ export { ExpressionEvaluator } from "./ExpressionEvaluator.js";
|
|
|
14
14
|
export { StatementEvaluator } from "./StatementEvaluator.js";
|
|
15
15
|
export { WhereText } from "./WhereText.js";
|
|
16
16
|
export { SelectStatement } from "./SelectStatement.js";
|
|
17
|
+
export { NestedSelectBuilder } from "./NestedSelectBuilder.js";
|
|
17
18
|
export { StatementParser } from "./StatementParser.js";
|
|
18
19
|
export { StatementTextRenderer } from "./StatementTextRenderer.js";
|
|
20
|
+
export { StatementNaming } from "./StatementNaming.js";
|
|
21
|
+
export { KeywordCasing } from "./KeywordCasing.js";
|
|
22
|
+
export { constraintNameOf } from "./ConstraintName.js";
|
|
23
|
+
export { sqlProcedureStatementsOf, procedureNameOf } from "./SqlProcedureStatements.js";
|
|
19
24
|
export { DefaultStatementTextRenderer } from "./DefaultStatementTextRenderer.js";
|
|
20
25
|
export { StatementRenderer } from "./StatementRenderer.js";
|
|
21
26
|
export { ExpressionRenderer } from "./ExpressionRenderer.js";
|