d1-sql-tag 0.1.1

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/LICENSE.txt ADDED
@@ -0,0 +1,7 @@
1
+ Copyright © 2023 Jonas Bengtsson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # `d1-sql-tag`
2
+
3
+ A template literal for working with [Cloudflare D1](https://developers.cloudflare.com/d1/)
4
+ database.
5
+
6
+ `npm install d1-sql-tag`
7
+
8
+ ## License
9
+
10
+ [MIT](./LICENSE.txt)
@@ -0,0 +1,41 @@
1
+ import { D1Result, D1Database } from '@cloudflare/workers-types';
2
+
3
+ type Primitive = string | number | boolean | null;
4
+ type SqlTag = ((strings: TemplateStringsArray, ...values: (Primitive | SqlQueryFragment)[]) => SqlQueryFragment) & {
5
+ batch<T extends readonly PreparedStatementBase<object>[]>(statements: T): Promise<{
6
+ -readonly [P in keyof T]: SqlResult<RowType<T[P]>>;
7
+ }>;
8
+ };
9
+ interface SqlQueryFragment {
10
+ build<T extends object = Record<string, Primitive>>(): RawPreparedStatement<T>;
11
+ all<T extends object = Record<string, Primitive>>(): Promise<D1Result<T>>;
12
+ run(): Promise<D1Result>;
13
+ templateStrings: TemplateStringsArray;
14
+ templateValues: (Primitive | SqlQueryFragment)[];
15
+ }
16
+ interface PreparedStatementBase<T extends object> {
17
+ query: string;
18
+ values: Primitive[];
19
+ all(): Promise<D1Result<T>>;
20
+ run(): Promise<D1Result>;
21
+ [rowTypeSymbol]: T;
22
+ }
23
+ interface MappedPreparedStatement<TRaw extends object, TMapped extends object> extends PreparedStatementBase<TMapped> {
24
+ mapper: (row: TRaw) => TMapped;
25
+ }
26
+ interface RawPreparedStatement<T extends object> extends PreparedStatementBase<T> {
27
+ map<TMapped extends object>(mapper: (row: T) => TMapped): MappedPreparedStatement<T, TMapped>;
28
+ }
29
+ type RowType<T extends PreparedStatementBase<any> | ((...args: any) => PreparedStatementBase<any>)> = T extends PreparedStatementBase<any> ? T[typeof rowTypeSymbol] : T extends (...args: any) => PreparedStatementBase<any> ? ReturnType<T>[typeof rowTypeSymbol] : never;
30
+ interface SqlResult<T extends object = Record<string, Primitive>> extends D1Result<T> {
31
+ }
32
+ interface SqlTagOptions {
33
+ beforeQuery?: (id: number, queries: string[]) => void;
34
+ afterQuery?: (id: number, queries: string[], results: SqlResult[]) => void;
35
+ }
36
+ declare const rowTypeSymbol: unique symbol;
37
+ declare function createD1SqlTag(db: D1Database, options?: SqlTagOptions): SqlTag;
38
+
39
+ declare function logQueryResults(queries: string[], results: SqlResult[], duration?: number): void;
40
+
41
+ export { type Primitive, type RowType, type SqlQueryFragment, type SqlTag, createD1SqlTag, logQueryResults };
package/dist/index.js ADDED
@@ -0,0 +1,145 @@
1
+ // src/sql-tag.ts
2
+ var batchId = 0;
3
+ var rowTypeSymbol = Symbol("rowType");
4
+ function createD1SqlTag(db, options) {
5
+ const sqlTag = (strings, ...values) => {
6
+ const fragment = {
7
+ build() {
8
+ return buildPreparedStatement(db, options, strings, values);
9
+ },
10
+ all() {
11
+ return buildPreparedStatement(db, options, strings, values).all();
12
+ },
13
+ run() {
14
+ return buildPreparedStatement(db, options, strings, values).run();
15
+ },
16
+ templateStrings: strings,
17
+ templateValues: values
18
+ };
19
+ return fragment;
20
+ };
21
+ sqlTag.batch = async (statements) => {
22
+ const queries = statements.map((it) => it.query);
23
+ const id = makeBatchId();
24
+ options?.beforeQuery?.(id, queries);
25
+ const result = await db.batch(
26
+ statements.map((it) => makeNativeStatement(db, it))
27
+ );
28
+ options?.afterQuery?.(id, queries, result);
29
+ for (let i = 0; i < result.length; i++) {
30
+ const statement = statements[i];
31
+ const statementResult = result[i];
32
+ if ("mapper" in statement) {
33
+ statementResult.results = statementResult.results.map(statement.mapper);
34
+ }
35
+ }
36
+ return result;
37
+ };
38
+ return sqlTag;
39
+ }
40
+ function buildPreparedStatement(db, options, templateStrings, templateValues) {
41
+ const { query, values } = expandTemplate(templateStrings, templateValues);
42
+ const statement = {
43
+ all() {
44
+ return executeAll(db, options, statement, null);
45
+ },
46
+ run() {
47
+ return executeRun(db, options, statement);
48
+ },
49
+ map(mapper) {
50
+ const mappedStatement = {
51
+ all() {
52
+ return executeAll(db, options, mappedStatement, mapper);
53
+ },
54
+ run() {
55
+ return executeRun(db, options, mappedStatement);
56
+ },
57
+ query,
58
+ values,
59
+ mapper,
60
+ [rowTypeSymbol]: null
61
+ };
62
+ return mappedStatement;
63
+ },
64
+ query,
65
+ values,
66
+ [rowTypeSymbol]: null
67
+ };
68
+ return statement;
69
+ }
70
+ function expandTemplate(rootTemplateStrings, rootTemplateValues) {
71
+ let query = "";
72
+ const values = [];
73
+ function expand(templateStrings, templateValues) {
74
+ for (let i = 0; i < templateStrings.length; i++) {
75
+ if (i > 0) {
76
+ const value = templateValues[i - 1];
77
+ const valueIsFragment = value && typeof value === "object" && "templateStrings" in value && "templateValues" in value;
78
+ if (valueIsFragment) {
79
+ expand(value.templateStrings, value.templateValues);
80
+ } else {
81
+ const valueIndex = values.push(value) - 1;
82
+ query += `?${valueIndex + 1}`;
83
+ }
84
+ }
85
+ query += templateStrings[i];
86
+ }
87
+ }
88
+ expand(rootTemplateStrings, rootTemplateValues);
89
+ return { query, values };
90
+ }
91
+ async function executeAll(db, options, statement, mapper) {
92
+ const batchId2 = makeBatchId();
93
+ options?.beforeQuery?.(batchId2, [statement.query]);
94
+ const result = await makeNativeStatement(
95
+ db,
96
+ statement
97
+ ).all();
98
+ options?.afterQuery?.(batchId2, [statement.query], [result]);
99
+ if (mapper) {
100
+ result.results = result.results.map(mapper);
101
+ }
102
+ return result;
103
+ }
104
+ async function executeRun(db, options, statement) {
105
+ const batchId2 = makeBatchId();
106
+ options?.beforeQuery?.(batchId2, [statement.query]);
107
+ const result = await makeNativeStatement(db, statement).run();
108
+ options?.afterQuery?.(batchId2, [statement.query], [result]);
109
+ return result;
110
+ }
111
+ function makeNativeStatement(db, statement) {
112
+ let stmt = db.prepare(statement.query);
113
+ if (statement.values.length > 0) {
114
+ stmt = stmt.bind(...statement.values);
115
+ }
116
+ return stmt;
117
+ }
118
+ function makeBatchId() {
119
+ batchId += 1;
120
+ return batchId;
121
+ }
122
+
123
+ // src/logger.ts
124
+ function logQueryResults(queries, results, duration) {
125
+ console.log(
126
+ `D1 batch: ${typeof duration === "number" ? `${duration}ms \xB7 ` : ""}${queries.length} queries`
127
+ );
128
+ for (let i = 0; i < queries.length; i++) {
129
+ const query = queries[i];
130
+ const result = results[i];
131
+ console.log(`${i + 1}: ${cleanupSqlQuery(query)}`);
132
+ const logSuffix = "rows_read" in result.meta ? ` \xB7 ${result.meta.rows_read} read \xB7 ${result.meta.rows_written} written` : "";
133
+ console.log(
134
+ ` \u21B3 ${result.meta.duration}ms \xB7 ${result.meta.changes} changed` + logSuffix
135
+ );
136
+ }
137
+ }
138
+ function cleanupSqlQuery(query) {
139
+ return query.replace(/\n/g, " ").replace(/\s+/g, " ");
140
+ }
141
+ export {
142
+ createD1SqlTag,
143
+ logQueryResults
144
+ };
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sql-tag.ts","../src/logger.ts"],"sourcesContent":["import type { D1Database, D1Result } from \"@cloudflare/workers-types\";\n\nexport type Primitive = string | number | boolean | null;\n\nexport type SqlTag = ((\n strings: TemplateStringsArray,\n ...values: (Primitive | SqlQueryFragment)[]\n) => SqlQueryFragment) & {\n batch<T extends readonly PreparedStatementBase<object>[]>(\n statements: T,\n ): Promise<{\n -readonly [P in keyof T]: SqlResult<RowType<T[P]>>;\n }>;\n};\n\nexport interface SqlQueryFragment {\n build<\n T extends object = Record<string, Primitive>,\n >(): RawPreparedStatement<T>;\n all<T extends object = Record<string, Primitive>>(): Promise<D1Result<T>>;\n run(): Promise<D1Result>;\n templateStrings: TemplateStringsArray;\n templateValues: (Primitive | SqlQueryFragment)[];\n}\n\ninterface PreparedStatementBase<T extends object> {\n query: string;\n values: Primitive[];\n all(): Promise<D1Result<T>>;\n run(): Promise<D1Result>;\n [rowTypeSymbol]: T;\n}\n\ninterface MappedPreparedStatement<TRaw extends object, TMapped extends object>\n extends PreparedStatementBase<TMapped> {\n mapper: (row: TRaw) => TMapped;\n}\n\ninterface RawPreparedStatement<T extends object>\n extends PreparedStatementBase<T> {\n map<TMapped extends object>(\n mapper: (row: T) => TMapped,\n ): MappedPreparedStatement<T, TMapped>;\n}\n\ntype PreparedStatement<\n T extends object,\n U extends object = Record<string, Primitive>,\n> = RawPreparedStatement<T> | MappedPreparedStatement<U, T>;\n\nexport type RowType<\n T extends\n | PreparedStatementBase<any>\n | ((...args: any) => PreparedStatementBase<any>),\n> = T extends PreparedStatementBase<any>\n ? T[typeof rowTypeSymbol]\n : T extends (...args: any) => PreparedStatementBase<any>\n ? ReturnType<T>[typeof rowTypeSymbol]\n : never;\n\nexport interface SqlResult<T extends object = Record<string, Primitive>>\n extends D1Result<T> {}\n\ninterface SqlTagOptions {\n beforeQuery?: (id: number, queries: string[]) => void;\n afterQuery?: (id: number, queries: string[], results: SqlResult[]) => void;\n}\n\nlet batchId = 0;\nconst rowTypeSymbol = Symbol(\"rowType\");\n\nexport function createD1SqlTag(\n db: D1Database,\n options?: SqlTagOptions,\n): SqlTag {\n const sqlTag: SqlTag = (strings, ...values): SqlQueryFragment => {\n const fragment: SqlQueryFragment = {\n build() {\n return buildPreparedStatement(db, options, strings, values);\n },\n all<T extends object>() {\n return buildPreparedStatement<T>(db, options, strings, values).all();\n },\n run() {\n return buildPreparedStatement(db, options, strings, values).run();\n },\n templateStrings: strings,\n templateValues: values,\n };\n return fragment;\n };\n sqlTag.batch = async (statements) => {\n const queries = statements.map((it) => it.query);\n\n const id = makeBatchId();\n options?.beforeQuery?.(id, queries);\n const result = (await db.batch(\n statements.map((it) => makeNativeStatement(db, it)),\n )) as any;\n options?.afterQuery?.(id, queries, result);\n\n for (let i = 0; i < result.length; i++) {\n const statement = statements[i];\n const statementResult = result[i];\n if (\"mapper\" in statement) {\n statementResult.results = statementResult.results.map(statement.mapper);\n }\n }\n\n return result;\n };\n return sqlTag;\n}\n\nfunction buildPreparedStatement<T extends object>(\n db: D1Database,\n options: SqlTagOptions | undefined,\n templateStrings: TemplateStringsArray,\n templateValues: (Primitive | SqlQueryFragment)[],\n): RawPreparedStatement<T> {\n const { query, values } = expandTemplate(templateStrings, templateValues);\n\n const statement: RawPreparedStatement<T> = {\n all() {\n return executeAll(db, options, statement, null);\n },\n run() {\n return executeRun(db, options, statement);\n },\n map<U extends object>(mapper: (row: T) => U) {\n const mappedStatement: MappedPreparedStatement<T, U> = {\n all() {\n return executeAll(db, options, mappedStatement, mapper);\n },\n run() {\n return executeRun(db, options, mappedStatement);\n },\n query,\n values,\n mapper,\n [rowTypeSymbol]: null as any,\n };\n return mappedStatement;\n },\n query,\n values,\n [rowTypeSymbol]: null as any,\n };\n\n return statement;\n}\n\nfunction expandTemplate(\n rootTemplateStrings: TemplateStringsArray,\n rootTemplateValues: (Primitive | SqlQueryFragment)[],\n) {\n let query = \"\";\n const values: Primitive[] = [];\n\n function expand(\n templateStrings: TemplateStringsArray,\n templateValues: (Primitive | SqlQueryFragment)[],\n ) {\n for (let i = 0; i < templateStrings.length; i++) {\n if (i > 0) {\n const value = templateValues[i - 1];\n const valueIsFragment =\n value &&\n typeof value === \"object\" &&\n \"templateStrings\" in value &&\n \"templateValues\" in value;\n if (valueIsFragment) {\n expand(value.templateStrings, value.templateValues);\n } else {\n const valueIndex = values.push(value as Primitive) - 1;\n query += `?${valueIndex + 1}`;\n }\n }\n query += templateStrings[i];\n }\n }\n\n expand(rootTemplateStrings, rootTemplateValues);\n\n return { query, values };\n}\n\nasync function executeAll<TRaw extends object, TMapped extends object>(\n db: D1Database,\n options: SqlTagOptions | undefined,\n statement:\n | RawPreparedStatement<TRaw>\n | MappedPreparedStatement<TRaw, TMapped>,\n mapper: ((row: TRaw) => TMapped) | null,\n) {\n const batchId = makeBatchId();\n options?.beforeQuery?.(batchId, [statement.query]);\n\n const result = (await makeNativeStatement(\n db,\n statement as any,\n ).all()) as SqlResult<TMapped>;\n\n options?.afterQuery?.(batchId, [statement.query], [result as SqlResult]);\n\n if (mapper) {\n result.results = result.results.map(mapper as any);\n }\n\n return result;\n}\n\nasync function executeRun<T extends object, U extends object>(\n db: D1Database,\n options: SqlTagOptions | undefined,\n statement: PreparedStatement<T, U>,\n) {\n const batchId = makeBatchId();\n options?.beforeQuery?.(batchId, [statement.query]);\n const result = await makeNativeStatement(db, statement).run();\n options?.afterQuery?.(batchId, [statement.query], [result as SqlResult]);\n return result;\n}\n\nfunction makeNativeStatement<T extends object>(\n db: D1Database,\n statement: PreparedStatementBase<T>,\n) {\n let stmt = db.prepare(statement.query);\n if (statement.values.length > 0) {\n stmt = stmt.bind(...statement.values);\n }\n return stmt;\n}\n\nfunction makeBatchId() {\n batchId += 1;\n return batchId;\n}\n","import type { SqlResult } from \"./sql-tag.js\";\n\nexport function logQueryResults(\n queries: string[],\n results: SqlResult[],\n duration?: number,\n) {\n console.log(\n `D1 batch: ${typeof duration === \"number\" ? `${duration}ms · ` : \"\"}${\n queries.length\n } queries`,\n );\n for (let i = 0; i < queries.length; i++) {\n const query = queries[i];\n const result = results[i];\n\n console.log(`${i + 1}: ${cleanupSqlQuery(query)}`);\n\n const logSuffix =\n \"rows_read\" in result.meta\n ? ` · ${result.meta.rows_read} read · ${result.meta.rows_written} written`\n : \"\";\n console.log(\n ` ↳ ${result.meta.duration}ms · ${result.meta.changes} changed` +\n logSuffix,\n );\n }\n}\n\nfunction cleanupSqlQuery(query: string) {\n return query.replace(/\\n/g, \" \").replace(/\\s+/g, \" \");\n}\n"],"mappings":";AAoEA,IAAI,UAAU;AACd,IAAM,gBAAgB,OAAO,SAAS;AAE/B,SAAS,eACd,IACA,SACQ;AACR,QAAM,SAAiB,CAAC,YAAY,WAA6B;AAC/D,UAAM,WAA6B;AAAA,MACjC,QAAQ;AACN,eAAO,uBAAuB,IAAI,SAAS,SAAS,MAAM;AAAA,MAC5D;AAAA,MACA,MAAwB;AACtB,eAAO,uBAA0B,IAAI,SAAS,SAAS,MAAM,EAAE,IAAI;AAAA,MACrE;AAAA,MACA,MAAM;AACJ,eAAO,uBAAuB,IAAI,SAAS,SAAS,MAAM,EAAE,IAAI;AAAA,MAClE;AAAA,MACA,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,OAAO,eAAe;AACnC,UAAM,UAAU,WAAW,IAAI,CAAC,OAAO,GAAG,KAAK;AAE/C,UAAM,KAAK,YAAY;AACvB,aAAS,cAAc,IAAI,OAAO;AAClC,UAAM,SAAU,MAAM,GAAG;AAAA,MACvB,WAAW,IAAI,CAAC,OAAO,oBAAoB,IAAI,EAAE,CAAC;AAAA,IACpD;AACA,aAAS,aAAa,IAAI,SAAS,MAAM;AAEzC,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,YAAY,WAAW,CAAC;AAC9B,YAAM,kBAAkB,OAAO,CAAC;AAChC,UAAI,YAAY,WAAW;AACzB,wBAAgB,UAAU,gBAAgB,QAAQ,IAAI,UAAU,MAAM;AAAA,MACxE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,uBACP,IACA,SACA,iBACA,gBACyB;AACzB,QAAM,EAAE,OAAO,OAAO,IAAI,eAAe,iBAAiB,cAAc;AAExE,QAAM,YAAqC;AAAA,IACzC,MAAM;AACJ,aAAO,WAAW,IAAI,SAAS,WAAW,IAAI;AAAA,IAChD;AAAA,IACA,MAAM;AACJ,aAAO,WAAW,IAAI,SAAS,SAAS;AAAA,IAC1C;AAAA,IACA,IAAsB,QAAuB;AAC3C,YAAM,kBAAiD;AAAA,QACrD,MAAM;AACJ,iBAAO,WAAW,IAAI,SAAS,iBAAiB,MAAM;AAAA,QACxD;AAAA,QACA,MAAM;AACJ,iBAAO,WAAW,IAAI,SAAS,eAAe;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,aAAa,GAAG;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,aAAa,GAAG;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,eACP,qBACA,oBACA;AACA,MAAI,QAAQ;AACZ,QAAM,SAAsB,CAAC;AAE7B,WAAS,OACP,iBACA,gBACA;AACA,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,UAAI,IAAI,GAAG;AACT,cAAM,QAAQ,eAAe,IAAI,CAAC;AAClC,cAAM,kBACJ,SACA,OAAO,UAAU,YACjB,qBAAqB,SACrB,oBAAoB;AACtB,YAAI,iBAAiB;AACnB,iBAAO,MAAM,iBAAiB,MAAM,cAAc;AAAA,QACpD,OAAO;AACL,gBAAM,aAAa,OAAO,KAAK,KAAkB,IAAI;AACrD,mBAAS,IAAI,aAAa,CAAC;AAAA,QAC7B;AAAA,MACF;AACA,eAAS,gBAAgB,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,qBAAqB,kBAAkB;AAE9C,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,eAAe,WACb,IACA,SACA,WAGA,QACA;AACA,QAAMA,WAAU,YAAY;AAC5B,WAAS,cAAcA,UAAS,CAAC,UAAU,KAAK,CAAC;AAEjD,QAAM,SAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,EACF,EAAE,IAAI;AAEN,WAAS,aAAaA,UAAS,CAAC,UAAU,KAAK,GAAG,CAAC,MAAmB,CAAC;AAEvE,MAAI,QAAQ;AACV,WAAO,UAAU,OAAO,QAAQ,IAAI,MAAa;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,eAAe,WACb,IACA,SACA,WACA;AACA,QAAMA,WAAU,YAAY;AAC5B,WAAS,cAAcA,UAAS,CAAC,UAAU,KAAK,CAAC;AACjD,QAAM,SAAS,MAAM,oBAAoB,IAAI,SAAS,EAAE,IAAI;AAC5D,WAAS,aAAaA,UAAS,CAAC,UAAU,KAAK,GAAG,CAAC,MAAmB,CAAC;AACvE,SAAO;AACT;AAEA,SAAS,oBACP,IACA,WACA;AACA,MAAI,OAAO,GAAG,QAAQ,UAAU,KAAK;AACrC,MAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,WAAO,KAAK,KAAK,GAAG,UAAU,MAAM;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,cAAc;AACrB,aAAW;AACX,SAAO;AACT;;;AC5OO,SAAS,gBACd,SACA,SACA,UACA;AACA,UAAQ;AAAA,IACN,aAAa,OAAO,aAAa,WAAW,GAAG,QAAQ,aAAU,EAAE,GACjE,QAAQ,MACV;AAAA,EACF;AACA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,QAAQ,QAAQ,CAAC;AACvB,UAAM,SAAS,QAAQ,CAAC;AAExB,YAAQ,IAAI,GAAG,IAAI,CAAC,KAAK,gBAAgB,KAAK,CAAC,EAAE;AAEjD,UAAM,YACJ,eAAe,OAAO,OAClB,SAAM,OAAO,KAAK,SAAS,cAAW,OAAO,KAAK,YAAY,aAC9D;AACN,YAAQ;AAAA,MACN,aAAQ,OAAO,KAAK,QAAQ,WAAQ,OAAO,KAAK,OAAO,aACrD;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAe;AACtC,SAAO,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,GAAG;AACtD;","names":["batchId"]}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "d1-sql-tag",
3
+ "version": "0.1.1",
4
+ "description": "A template literal for working with Cloudflare D1 database",
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "tsup src/index.ts --format esm --sourcemap --dts",
8
+ "prettier:check": "prettier --check .",
9
+ "prettier:fix": "prettier --write .",
10
+ "test": "node --import tsx --test test/sql-tag.test.ts"
11
+ },
12
+ "author": "",
13
+ "license": "MIT",
14
+ "devDependencies": {
15
+ "@changesets/cli": "^2.27.1",
16
+ "@cloudflare/workers-types": "^4.20231121.0",
17
+ "@types/node": "^20.10.3",
18
+ "prettier": "^3.1.0",
19
+ "tsup": "^8.0.1",
20
+ "tsx": "^4.6.2",
21
+ "typescript": "^5.3.2"
22
+ }
23
+ }