@memberjunction/sqlserver-dataprovider 6.2.0-edge.4 → 6.2.0-edge.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/SQLServerDataProvider.d.ts +93 -15
- package/dist/SQLServerDataProvider.d.ts.map +1 -1
- package/dist/SQLServerDataProvider.js +458 -182
- package/dist/SQLServerDataProvider.js.map +1 -1
- package/dist/SQLServerTransactionGroup.js +1 -1
- package/dist/SQLServerTransactionGroup.js.map +1 -1
- package/dist/saveParameters.d.ts +80 -0
- package/dist/saveParameters.d.ts.map +1 -0
- package/dist/saveParameters.js +229 -0
- package/dist/saveParameters.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +16 -16
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed parameters for SQL Server saves and deletes.
|
|
3
|
+
*
|
|
4
|
+
* A save reaches SQL Server as one statement whose values travel as typed parameters, so its text
|
|
5
|
+
* is the same for every record of an entity (for a given set of fields) and SQL Server reuses one
|
|
6
|
+
* plan instead of compiling every save. The statement keeps the DECLARE / SET / EXEC shape the
|
|
7
|
+
* literal batch has always had; only `SET @Name = <value>` becomes `SET @Name$ = @p$0`.
|
|
8
|
+
*
|
|
9
|
+
* Every parameter also carries the literal the batch used to contain for its value.
|
|
10
|
+
* {@link RenderSaveSQL} puts those literals back and restores the per-record variable suffix, which
|
|
11
|
+
* gives the text that is logged, captured into migrations, shown in errors and handed to
|
|
12
|
+
* transaction groups: the statement that ran, with its values written in.
|
|
13
|
+
*/
|
|
14
|
+
import sql from 'mssql';
|
|
15
|
+
import { EntityFieldTSType } from '@memberjunction/core';
|
|
16
|
+
/** One typed input of a save or delete statement. */
|
|
17
|
+
export class SQLServerSaveParameter {
|
|
18
|
+
constructor(
|
|
19
|
+
/** Name without the `@`, as the statement references it. */
|
|
20
|
+
Name,
|
|
21
|
+
/** Driver type, from the column's own SQL type. */
|
|
22
|
+
Type, Value,
|
|
23
|
+
/** The literal the batch wrote for this value; {@link RenderSaveSQL} puts it back. */
|
|
24
|
+
Literal) {
|
|
25
|
+
this.Name = Name;
|
|
26
|
+
this.Type = Type;
|
|
27
|
+
this.Value = Value;
|
|
28
|
+
this.Literal = Literal;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Variable suffix in the statement that runs. Constant, so the text repeats across records. `$` is
|
|
33
|
+
* valid inside a T-SQL variable name and never appears in a field's CodeName, so the renderer can
|
|
34
|
+
* find every variable without matching anything else.
|
|
35
|
+
*/
|
|
36
|
+
export const EXECUTED_VARIABLE_SUFFIX = '$';
|
|
37
|
+
/** `@p$<n>` (a parameter) or `@<name>$` (a variable), each not followed by more identifier characters. */
|
|
38
|
+
const STATEMENT_TOKEN = /@p\$(\d+)(?![\w$#@])|(@\w+)\$(?![\w$#@])/g;
|
|
39
|
+
/**
|
|
40
|
+
* The literal form of a statement built with {@link SaveParameterCollector}: each `@p$<n>` is
|
|
41
|
+
* replaced by that parameter's literal and each variable gets `variableSuffix` back.
|
|
42
|
+
*/
|
|
43
|
+
export function RenderSaveSQL(executedSQL, parameters, variableSuffix) {
|
|
44
|
+
return executedSQL.replace(STATEMENT_TOKEN, (match, index, variable) => index !== undefined ? (parameters[Number(index)]?.Literal ?? match) : `${variable}${variableSuffix}`);
|
|
45
|
+
}
|
|
46
|
+
/** True when `parameters` holds a save statement's typed parameters. */
|
|
47
|
+
export function IsSaveParameterList(parameters) {
|
|
48
|
+
return Array.isArray(parameters) && parameters.length > 0 && parameters.every((p) => p instanceof SQLServerSaveParameter);
|
|
49
|
+
}
|
|
50
|
+
/** Collects one statement's parameters and hands back the `@p$<n>` reference for each. */
|
|
51
|
+
export class SaveParameterCollector {
|
|
52
|
+
constructor(seed = []) {
|
|
53
|
+
this.parameters = [...seed];
|
|
54
|
+
}
|
|
55
|
+
get Parameters() {
|
|
56
|
+
return this.parameters;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Adds the parameter for a value of `field` whose literal is `literal` (what the literal batch
|
|
60
|
+
* writes for it), and returns the reference to write into the statement in its place.
|
|
61
|
+
*/
|
|
62
|
+
AddField(field, literal) {
|
|
63
|
+
if (IsKeptAsInlineLiteral(field)) {
|
|
64
|
+
return literal;
|
|
65
|
+
}
|
|
66
|
+
const { Type, Value } = SaveParameterFromLiteral(field, literal);
|
|
67
|
+
const name = `p$${this.parameters.length}`;
|
|
68
|
+
this.parameters.push(new SQLServerSaveParameter(name, Type, Value, literal));
|
|
69
|
+
return `@${name}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The typed parameter equivalent to `literal`, a value of `field` as the literal batch writes it.
|
|
74
|
+
* The value is read back from the literal, so it goes through exactly the conversions the literal
|
|
75
|
+
* always did (booleans to 1/0, dates to ISO-8601, objects to JSON, base64 to bytes) and the bound
|
|
76
|
+
* value and the logged literal cannot disagree.
|
|
77
|
+
*/
|
|
78
|
+
export function SaveParameterFromLiteral(field, literal) {
|
|
79
|
+
refuseInlineLiteralType(field);
|
|
80
|
+
const name = field.Type.trim().toLowerCase();
|
|
81
|
+
if (field.IsBinaryFieldType) {
|
|
82
|
+
return { Type: SaveParameterType(field), Value: Buffer.from(literal.slice(2), 'hex') };
|
|
83
|
+
}
|
|
84
|
+
if (TEXT_DATE_TYPES.has(name)) {
|
|
85
|
+
return { Type: SaveParameterType(field), Value: QuotedLiteralText(literal) };
|
|
86
|
+
}
|
|
87
|
+
if (EXACT_NUMERIC_TYPES.has(name)) {
|
|
88
|
+
const asNumber = finiteNumberFromLiteral(field, literal);
|
|
89
|
+
// An exponent makes the literal a float (`1e-07`), so that one is sent as a float.
|
|
90
|
+
return /e/i.test(literal) ? { Type: sql.Float(), Value: asNumber } : { Type: SaveParameterType(field), Value: literal };
|
|
91
|
+
}
|
|
92
|
+
if (SENT_AS_LITERAL_TEXT.has(name)) {
|
|
93
|
+
const value = literal.startsWith("'") || literal.startsWith("N'") ? QuotedLiteralText(literal) : literal;
|
|
94
|
+
return { Type: SaveParameterType(field), Value: value };
|
|
95
|
+
}
|
|
96
|
+
switch (field.TSType) {
|
|
97
|
+
case EntityFieldTSType.Boolean:
|
|
98
|
+
return { Type: SaveParameterType(field), Value: literal === '1' };
|
|
99
|
+
case EntityFieldTSType.Number:
|
|
100
|
+
return { Type: SaveParameterType(field), Value: name === 'bigint' ? bigintFromLiteral(field, literal) : finiteNumberFromLiteral(field, literal) };
|
|
101
|
+
default:
|
|
102
|
+
return { Type: SaveParameterType(field), Value: QuotedLiteralText(literal) };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A number literal as a number. `Number('')` and `Number(' ')` are 0, and `NaN` binds as NULL, so a
|
|
107
|
+
* literal that is not a finite number would store a value nobody wrote; the literal batch failed on
|
|
108
|
+
* it, and so does this.
|
|
109
|
+
*/
|
|
110
|
+
function finiteNumberFromLiteral(field, literal) {
|
|
111
|
+
const value = Number(literal);
|
|
112
|
+
if (literal.trim() === '' || !Number.isFinite(value)) {
|
|
113
|
+
throw new Error(`Field "${field.Name}" has value ${JSON.stringify(literal)}, which is not a number`);
|
|
114
|
+
}
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
/** A bigint literal as a BigInt; a fraction is truncated toward zero, as SQL Server converts it. */
|
|
118
|
+
function bigintFromLiteral(field, literal) {
|
|
119
|
+
return /^-?\d+$/.test(literal) ? BigInt(literal) : BigInt(Math.trunc(finiteNumberFromLiteral(field, literal)));
|
|
120
|
+
}
|
|
121
|
+
/** The text a `'…'` or `N'…'` literal stores: the quotes removed and each `''` read as one quote. */
|
|
122
|
+
export function QuotedLiteralText(literal) {
|
|
123
|
+
const open = literal.startsWith('N') ? 2 : 1;
|
|
124
|
+
return literal.slice(open, -1).replace(/''/g, "'");
|
|
125
|
+
}
|
|
126
|
+
let driverTypesByNameCache;
|
|
127
|
+
/**
|
|
128
|
+
* The driver's types keyed by lower-cased SQL Server type name (`nvarchar` → `NVarChar`, …). Built
|
|
129
|
+
* on first use, not at import: loading this module must not depend on the driver's type table.
|
|
130
|
+
*/
|
|
131
|
+
function driverTypesByName() {
|
|
132
|
+
driverTypesByNameCache ??= new Map(Object.entries(sql.TYPES).map(([name, factory]) => [name.toLowerCase(), factory]));
|
|
133
|
+
return driverTypesByNameCache;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Exact numeric types. The driver encodes these through a JavaScript double (`parseFloat`, then
|
|
137
|
+
* `value * 10^scale`), so `1.005` into `decimal(18,2)` would arrive as `1.00` where the literal
|
|
138
|
+
* stores `1.01`. They are sent as the literal's own text instead, and the statement's typed
|
|
139
|
+
* `SET @x DECIMAL(p,s) = @p$n` makes the same exact conversion the literal always got.
|
|
140
|
+
*/
|
|
141
|
+
const EXACT_NUMERIC_TYPES = new Set(['decimal', 'numeric', 'money', 'smallmoney']);
|
|
142
|
+
/**
|
|
143
|
+
* Date types sent as their ISO-8601 literal text (`varchar(34)`) so the typed `SET @x = @p$n`
|
|
144
|
+
* performs the conversion on SQL Server, exactly as the literal batch did. None is bound as a JS
|
|
145
|
+
* `Date`, because tedious mishandles each:
|
|
146
|
+
* - `datetimeoffset`: tedious encodes `sql.DateTimeOffset()` with `-date.getTimezoneOffset()`,
|
|
147
|
+
* which stamps the Node host's local offset instead of the `+00:00` written by `.toISOString()`.
|
|
148
|
+
* - `smalldatetime`: tedious truncates seconds (`date.getUTCMinutes()`) instead of rounding >=30s
|
|
149
|
+
* to the next minute as SQL Server does, and throws a Node `RangeError` for pre-1900 dates.
|
|
150
|
+
* - `date`, `time`, `datetime`, `datetime2`: tedious encodes them in UTC but range-checks them with
|
|
151
|
+
* the host's local `getFullYear()`, so on a server west of UTC `0001-01-01` fails as "Out of
|
|
152
|
+
* range", and east of UTC so do `9999-12-31` values — common "no end date" placeholders.
|
|
153
|
+
*/
|
|
154
|
+
const TEXT_DATE_TYPES = new Set(['date', 'time', 'datetime', 'datetime2', 'datetimeoffset', 'smalldatetime']);
|
|
155
|
+
/**
|
|
156
|
+
* Types a save keeps as their inline literal instead of binding a parameter.
|
|
157
|
+
* - `sql_variant`: the stored base type comes from whatever is assigned to it. MJ writes these values
|
|
158
|
+
* unquoted (`NeedsQuotes` is false), and the literal is what gives SQL Server the right base type
|
|
159
|
+
* (`0x1F` is varbinary, `1.10` is numeric(3,2), `3000000000` is numeric(10,0)). No parameter type
|
|
160
|
+
* reproduces that: `nvarchar(max)` is rejected (Msg 206), `float` loses precision past 15 digits,
|
|
161
|
+
* and `sql.Decimal` goes through a JS number. These saves don't share a plan, as before.
|
|
162
|
+
*/
|
|
163
|
+
const KEPT_AS_INLINE_LITERAL = new Set(['sql_variant']);
|
|
164
|
+
/** Whether a save writes `field`'s value as its inline literal rather than as a typed parameter. */
|
|
165
|
+
export function IsKeptAsInlineLiteral(field) {
|
|
166
|
+
return KEPT_AS_INLINE_LITERAL.has(field.Type.trim().toLowerCase());
|
|
167
|
+
}
|
|
168
|
+
/** A type kept as its inline literal has no parameter form; binding one would store the wrong base type. */
|
|
169
|
+
function refuseInlineLiteralType(field) {
|
|
170
|
+
if (IsKeptAsInlineLiteral(field)) {
|
|
171
|
+
throw new Error(`Field "${field.Name}" has SQL type "${field.Type}", which a save writes as its inline literal, not as a parameter`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Types the driver cannot send as a parameter (`xml` and the CLR types are "not implemented" in
|
|
176
|
+
* tedious), or that it does not know (`sysname` is an alias for `nvarchar(128)` that SQLServerDialect
|
|
177
|
+
* does not list in `_stringTypeNames`, so `field.TSType` defaults to `Number`). Their value is sent
|
|
178
|
+
* as text (`nvarchar(128)` for `sysname`, `nvarchar(max)` for the rest) so Unicode is preserved
|
|
179
|
+
* while the typed SET converts it as before.
|
|
180
|
+
*/
|
|
181
|
+
const SENT_AS_LITERAL_TEXT = new Set(['xml', 'hierarchyid', 'geography', 'geometry', 'json', 'vector', 'sysname']);
|
|
182
|
+
/** Server-generated types that a save never writes. */
|
|
183
|
+
const NEVER_WRITTEN = new Set(['timestamp', 'rowversion']);
|
|
184
|
+
/**
|
|
185
|
+
* The driver type for a field's parameter: the SQL Server type of the same name, with the column's
|
|
186
|
+
* length for the sized string and binary types.
|
|
187
|
+
* @throws Error for a type that has no parameter form, so a new type fails loudly instead of binding
|
|
188
|
+
* wrongly.
|
|
189
|
+
*/
|
|
190
|
+
export function SaveParameterType(field) {
|
|
191
|
+
refuseInlineLiteralType(field);
|
|
192
|
+
const name = field.Type.trim().toLowerCase();
|
|
193
|
+
const length = field.Length > 0 ? field.Length : sql.MAX;
|
|
194
|
+
switch (name) {
|
|
195
|
+
case 'varchar':
|
|
196
|
+
case 'char':
|
|
197
|
+
return driverTypesByName().get(name)(length);
|
|
198
|
+
case 'nvarchar':
|
|
199
|
+
case 'nchar':
|
|
200
|
+
return driverTypesByName().get(name)(field.Length > 0 ? field.Length / 2 : sql.MAX);
|
|
201
|
+
case 'binary':
|
|
202
|
+
case 'varbinary':
|
|
203
|
+
// The literal is a `0x…` varbinary; a binary(n) variable pads it the same way.
|
|
204
|
+
return sql.VarBinary(length);
|
|
205
|
+
case 'ntext':
|
|
206
|
+
return sql.NVarChar(sql.MAX);
|
|
207
|
+
case 'text':
|
|
208
|
+
return sql.VarChar(sql.MAX);
|
|
209
|
+
case 'image':
|
|
210
|
+
return sql.VarBinary(sql.MAX);
|
|
211
|
+
case 'sysname':
|
|
212
|
+
return sql.NVarChar(128);
|
|
213
|
+
}
|
|
214
|
+
if (TEXT_DATE_TYPES.has(name)) {
|
|
215
|
+
return sql.VarChar(34);
|
|
216
|
+
}
|
|
217
|
+
if (EXACT_NUMERIC_TYPES.has(name)) {
|
|
218
|
+
return sql.VarChar(sql.MAX);
|
|
219
|
+
}
|
|
220
|
+
if (SENT_AS_LITERAL_TEXT.has(name)) {
|
|
221
|
+
return sql.NVarChar(sql.MAX);
|
|
222
|
+
}
|
|
223
|
+
const factory = NEVER_WRITTEN.has(name) ? undefined : driverTypesByName().get(name);
|
|
224
|
+
if (!factory) {
|
|
225
|
+
throw new Error(`Field "${field.Name}" has SQL type "${field.Type}", which SQLServerDataProvider cannot send as a save parameter`);
|
|
226
|
+
}
|
|
227
|
+
return factory();
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=saveParameters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"saveParameters.js","sourceRoot":"","sources":["../src/saveParameters.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -20,6 +20,11 @@ export interface ExecuteSQLOptions {
|
|
|
20
20
|
isMutation?: boolean;
|
|
21
21
|
/** Simple SQL fallback for loggers with logRecordChangeMetadata=false (only for Save/Delete operations) */
|
|
22
22
|
simpleSQLFallback?: string;
|
|
23
|
+
/**
|
|
24
|
+
* The statement with its parameter values written in as literals. Set for saves and deletes,
|
|
25
|
+
* which run with typed parameters: logged in place of the query, and shown in error messages.
|
|
26
|
+
*/
|
|
27
|
+
literalSQL?: string;
|
|
23
28
|
/**
|
|
24
29
|
* Optional connection source to use instead of the default pool.
|
|
25
30
|
* Used by IS-A chain orchestration to execute SPs on a shared transaction.
|
|
@@ -65,6 +70,8 @@ export interface InternalSQLOptions {
|
|
|
65
70
|
isMutation?: boolean;
|
|
66
71
|
/** Simple SQL fallback for loggers */
|
|
67
72
|
simpleSQLFallback?: string;
|
|
73
|
+
/** The statement with its parameter values written in; logged and shown in errors instead of the query */
|
|
74
|
+
literalSQL?: string;
|
|
68
75
|
/** User context for logging */
|
|
69
76
|
contextUser?: UserInfo;
|
|
70
77
|
/** The longest the statement may run, in milliseconds, before it is cancelled on the server */
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2GAA2G;IAC3G,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC;IACxD;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IACzB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACrC,qCAAqC;IACrC,eAAe,CAAC,EAAE,CAAG,kLAAkL;IACrM,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,OAAO,EACvB,UAAU,CAAC,EAAE,OAAO,EACpB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,WAAW,CAAC,EAAE,QAAQ,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,sBAAsB,CAAC,8BAA8B,CAAC;IACrG;;OAEG;IACH,IAAI,cAAc,IAAI,GAAG,CAAC,cAAc,CAEvC;IAED;;OAEG;IACH,IAAI,2BAA2B,IAAI,MAAM,CAExC;gBAGC,cAAc,EAAE,GAAG,CAAC,cAAc,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,2BAA2B,GAAE,MAAU,EACvC,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,sBAAsB,GAAE,OAAc;CAazC;AAED,MAAM,WAAW,8BAA8B;IAC7C,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC;IACnC,2BAA2B,EAAE,MAAM,CAAC;CACrC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2GAA2G;IAC3G,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC;IACxD;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IACzB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACrC,qCAAqC;IACrC,eAAe,CAAC,EAAE,CAAG,kLAAkL;IACrM,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,OAAO,EACvB,UAAU,CAAC,EAAE,OAAO,EACpB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,WAAW,CAAC,EAAE,QAAQ,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,sBAAsB,CAAC,8BAA8B,CAAC;IACrG;;OAEG;IACH,IAAI,cAAc,IAAI,GAAG,CAAC,cAAc,CAEvC;IAED;;OAEG;IACH,IAAI,2BAA2B,IAAI,MAAM,CAExC;gBAGC,cAAc,EAAE,GAAG,CAAC,cAAc,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,2BAA2B,GAAE,MAAU,EACvC,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,sBAAsB,GAAE,OAAc;CAazC;AAED,MAAM,WAAW,8BAA8B;IAC7C,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC;IACnC,2BAA2B,EAAE,MAAM,CAAC;CACrC"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAY,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAY,MAAM,sBAAsB,CAAC;AAkFxE;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,sBAAsD;IACrG;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,2BAA2B;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC;IAC/C,CAAC;IAED,YACE,cAAkC,EAClC,gBAAyB,EACzB,8BAAsC,CAAC,CAAC,sCAAsC,EAC9E,cAAyB,EACzB,cAAyB,EACzB,yBAAkC,IAAI;QAEtC,KAAK,CACH;YACE,cAAc,EAAE,cAAc;YAC9B,2BAA2B,EAAE,2BAA2B;SACzD,EACD,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,sBAAsB,CACvB,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/sqlserver-dataprovider",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.2.0-edge.
|
|
4
|
+
"version": "6.2.0-edge.6",
|
|
5
5
|
"description": "MemberJunction: SQL Server Client Data Provider",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -17,21 +17,21 @@
|
|
|
17
17
|
"@types/mssql": "^9.1.9"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@memberjunction/actions": "6.2.0-edge.
|
|
21
|
-
"@memberjunction/actions-base": "6.2.0-edge.
|
|
22
|
-
"@memberjunction/ai": "6.2.0-edge.
|
|
23
|
-
"@memberjunction/ai-provider-bundle": "6.2.0-edge.
|
|
24
|
-
"@memberjunction/ai-vector-dupe": "6.2.0-edge.
|
|
25
|
-
"@memberjunction/ai-vectordb": "6.2.0-edge.
|
|
26
|
-
"@memberjunction/aiengine": "6.2.0-edge.
|
|
27
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
28
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
29
|
-
"@memberjunction/encryption": "6.2.0-edge.
|
|
30
|
-
"@memberjunction/generic-database-provider": "6.2.0-edge.
|
|
31
|
-
"@memberjunction/sql-dialect": "6.2.0-edge.
|
|
32
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
33
|
-
"@memberjunction/query-processor": "6.2.0-edge.
|
|
34
|
-
"@memberjunction/queue": "6.2.0-edge.
|
|
20
|
+
"@memberjunction/actions": "6.2.0-edge.6",
|
|
21
|
+
"@memberjunction/actions-base": "6.2.0-edge.6",
|
|
22
|
+
"@memberjunction/ai": "6.2.0-edge.6",
|
|
23
|
+
"@memberjunction/ai-provider-bundle": "6.2.0-edge.6",
|
|
24
|
+
"@memberjunction/ai-vector-dupe": "6.2.0-edge.6",
|
|
25
|
+
"@memberjunction/ai-vectordb": "6.2.0-edge.6",
|
|
26
|
+
"@memberjunction/aiengine": "6.2.0-edge.6",
|
|
27
|
+
"@memberjunction/core": "6.2.0-edge.6",
|
|
28
|
+
"@memberjunction/core-entities": "6.2.0-edge.6",
|
|
29
|
+
"@memberjunction/encryption": "6.2.0-edge.6",
|
|
30
|
+
"@memberjunction/generic-database-provider": "6.2.0-edge.6",
|
|
31
|
+
"@memberjunction/sql-dialect": "6.2.0-edge.6",
|
|
32
|
+
"@memberjunction/global": "6.2.0-edge.6",
|
|
33
|
+
"@memberjunction/query-processor": "6.2.0-edge.6",
|
|
34
|
+
"@memberjunction/queue": "6.2.0-edge.6",
|
|
35
35
|
"mssql": "^12.2.0",
|
|
36
36
|
"rxjs": "^7.8.2"
|
|
37
37
|
},
|