d1-sql-tag 0.4.0 → 0.4.2

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/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import { D1Database as D1Database$1, D1Result, D1Response } from '@cloudflare/workers-types';
1
+ import { D1Database, D1Result, D1Response } from '@cloudflare/workers-types/experimental/index.js';
2
2
 
3
- type D1Database = Omit<D1Database$1, "withSession">;
4
3
  type Primitive = string | number | boolean | null;
5
4
  type SqlTag = ((strings: TemplateStringsArray, ...values: (Primitive | SqlQueryFragment)[]) => SqlQueryFragment) & {
6
5
  batch<T extends readonly PreparedStatementBase<object>[]>(statements: T): Promise<{
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sql-tag.ts","../src/logger.ts"],"sourcesContent":["import type { D1Database as D1Db, D1Response, D1Result } from \"@cloudflare/workers-types\";\n\n// The types generated by `wrangler types` is not fully compatible with @cloudflare/workers-types\ntype D1Database = Omit<D1Db, \"withSession\">;\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<T extends object = Record<string, Primitive>>(): RawPreparedStatement<T>;\n all<T extends object = Record<string, Primitive>>(): Promise<D1Result<T>>;\n run(): Promise<D1Response>;\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<D1Response>;\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> extends PreparedStatementBase<T> {\n map<TMapped extends object>(mapper: (row: T) => TMapped): MappedPreparedStatement<T, TMapped>;\n}\n\ntype PreparedStatement<T extends object, U extends object = Record<string, Primitive>> =\n | RawPreparedStatement<T>\n | MappedPreparedStatement<U, T>;\n\nexport type RowType<\n T extends PreparedStatementBase<any> | ((...args: any) => PreparedStatementBase<any>),\n> =\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>> extends D1Result<T> {}\n\ninterface SqlTagOptions {\n beforeQuery?: (id: number, queries: string[]) => void;\n afterQuery?: (id: number, queries: string[], results: SqlResult[], duration: number) => void;\n}\n\nlet batchId = 0;\nconst rowTypeSymbol = Symbol(\"rowType\");\n\nexport function createD1SqlTag(db: D1Database, options?: SqlTagOptions): 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 start = Date.now();\n const result = (await db.batch(statements.map((it) => makeNativeStatement(db, it)))) as any;\n const duration = Date.now() - start;\n options?.afterQuery?.(id, queries, result, duration);\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\n if (valueIsFragment) {\n expand(value.templateStrings, value.templateValues);\n } else {\n let valueIndex = values.indexOf(value);\n if (valueIndex === -1) {\n valueIndex = values.push(value) - 1;\n }\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: RawPreparedStatement<TRaw> | MappedPreparedStatement<TRaw, TMapped>,\n mapper: ((row: TRaw) => TMapped) | null,\n) {\n const batchId = makeBatchId();\n options?.beforeQuery?.(batchId, [statement.query]);\n const start = Date.now();\n\n const result = (await makeNativeStatement(db, statement as any).all()) as SqlResult<TMapped>;\n\n const duration = Date.now() - start;\n options?.afterQuery?.(batchId, [statement.query], [result as SqlResult], duration);\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 start = Date.now();\n const result = await makeNativeStatement(db, statement).run();\n const duration = Date.now() - start;\n options?.afterQuery?.(batchId, [statement.query], [result as SqlResult], duration);\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(queries: string[], results: SqlResult[], duration?: number) {\n console.log(\n `D1 batch: ${typeof duration === \"number\" ? `${duration}ms · ` : \"\"}${queries.length} 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(` ↳ ${result.meta.duration}ms · ${result.meta.changes} changed` + logSuffix);\n }\n}\n\nfunction cleanupSqlQuery(query: string) {\n return query.replace(/\\n/g, \" \").replace(/\\s+/g, \" \");\n}\n"],"mappings":";AA+DA,IAAI,UAAU;AACd,IAAM,gBAAgB,OAAO,SAAS;AAE/B,SAAS,eAAe,IAAgB,SAAiC;AAC9E,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,QAAQ,KAAK,IAAI;AACvB,UAAM,SAAU,MAAM,GAAG,MAAM,WAAW,IAAI,CAAC,OAAO,oBAAoB,IAAI,EAAE,CAAC,CAAC;AAClF,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAS,aAAa,IAAI,SAAS,QAAQ,QAAQ;AAEnD,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;AAEtB,YAAI,iBAAiB;AACnB,iBAAO,MAAM,iBAAiB,MAAM,cAAc;AAAA,QACpD,OAAO;AACL,cAAI,aAAa,OAAO,QAAQ,KAAK;AACrC,cAAI,eAAe,IAAI;AACrB,yBAAa,OAAO,KAAK,KAAK,IAAI;AAAA,UACpC;AACA,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,WACA,QACA;AACA,QAAMA,WAAU,YAAY;AAC5B,WAAS,cAAcA,UAAS,CAAC,UAAU,KAAK,CAAC;AACjD,QAAM,QAAQ,KAAK,IAAI;AAEvB,QAAM,SAAU,MAAM,oBAAoB,IAAI,SAAgB,EAAE,IAAI;AAEpE,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAS,aAAaA,UAAS,CAAC,UAAU,KAAK,GAAG,CAAC,MAAmB,GAAG,QAAQ;AAEjF,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,QAAQ,KAAK,IAAI;AACvB,QAAM,SAAS,MAAM,oBAAoB,IAAI,SAAS,EAAE,IAAI;AAC5D,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAS,aAAaA,UAAS,CAAC,UAAU,KAAK,GAAG,CAAC,MAAmB,GAAG,QAAQ;AACjF,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;;;ACvOO,SAAS,gBAAgB,SAAmB,SAAsB,UAAmB;AAC1F,UAAQ;AAAA,IACN,aAAa,OAAO,aAAa,WAAW,GAAG,QAAQ,aAAU,EAAE,GAAG,QAAQ,MAAM;AAAA,EACtF;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,IAAI,aAAQ,OAAO,KAAK,QAAQ,WAAQ,OAAO,KAAK,OAAO,aAAa,SAAS;AAAA,EAC3F;AACF;AAEA,SAAS,gBAAgB,OAAe;AACtC,SAAO,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,GAAG;AACtD;","names":["batchId"]}
1
+ {"version":3,"sources":["../src/sql-tag.ts","../src/logger.ts"],"sourcesContent":["import type {\n D1Database,\n D1Response,\n D1Result,\n} from \"@cloudflare/workers-types/experimental/index.js\";\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<T extends object = Record<string, Primitive>>(): RawPreparedStatement<T>;\n all<T extends object = Record<string, Primitive>>(): Promise<D1Result<T>>;\n run(): Promise<D1Response>;\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<D1Response>;\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> extends PreparedStatementBase<T> {\n map<TMapped extends object>(mapper: (row: T) => TMapped): MappedPreparedStatement<T, TMapped>;\n}\n\ntype PreparedStatement<T extends object, U extends object = Record<string, Primitive>> =\n | RawPreparedStatement<T>\n | MappedPreparedStatement<U, T>;\n\nexport type RowType<\n T extends PreparedStatementBase<any> | ((...args: any) => PreparedStatementBase<any>),\n> =\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>> extends D1Result<T> {}\n\ninterface SqlTagOptions {\n beforeQuery?: (id: number, queries: string[]) => void;\n afterQuery?: (id: number, queries: string[], results: SqlResult[], duration: number) => void;\n}\n\nlet batchId = 0;\nconst rowTypeSymbol = Symbol(\"rowType\");\n\nexport function createD1SqlTag(db: D1Database, options?: SqlTagOptions): 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 start = Date.now();\n const result = (await db.batch(statements.map((it) => makeNativeStatement(db, it)))) as any;\n const duration = Date.now() - start;\n options?.afterQuery?.(id, queries, result, duration);\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\n if (valueIsFragment) {\n expand(value.templateStrings, value.templateValues);\n } else {\n let valueIndex = values.indexOf(value);\n if (valueIndex === -1) {\n valueIndex = values.push(value) - 1;\n }\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: RawPreparedStatement<TRaw> | MappedPreparedStatement<TRaw, TMapped>,\n mapper: ((row: TRaw) => TMapped) | null,\n) {\n const batchId = makeBatchId();\n options?.beforeQuery?.(batchId, [statement.query]);\n const start = Date.now();\n\n const result = (await makeNativeStatement(db, statement as any).all()) as SqlResult<TMapped>;\n\n const duration = Date.now() - start;\n options?.afterQuery?.(batchId, [statement.query], [result as SqlResult], duration);\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 start = Date.now();\n const result = await makeNativeStatement(db, statement).run();\n const duration = Date.now() - start;\n options?.afterQuery?.(batchId, [statement.query], [result as SqlResult], duration);\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(queries: string[], results: SqlResult[], duration?: number) {\n console.log(\n `D1 batch: ${typeof duration === \"number\" ? `${duration}ms · ` : \"\"}${queries.length} 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(` ↳ ${result.meta.duration}ms · ${result.meta.changes} changed` + logSuffix);\n }\n}\n\nfunction cleanupSqlQuery(query: string) {\n return query.replace(/\\n/g, \" \").replace(/\\s+/g, \" \");\n}\n"],"mappings":"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","names":["batchId"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "d1-sql-tag",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "A template literal for working with Cloudflare D1 database",
5
5
  "keywords": [
6
6
  "d1",
@@ -31,11 +31,11 @@
31
31
  },
32
32
  "devDependencies": {
33
33
  "@changesets/cli": "^2.27.1",
34
- "@cloudflare/workers-types": "^4.20250319.0",
35
- "@types/node": "^22.0.0",
34
+ "@cloudflare/workers-types": "^4.20250408.0",
35
+ "@types/node": "^22.14.0",
36
36
  "prettier": "^3.1.0",
37
37
  "tsup": "^8.0.1",
38
38
  "tsx": "^4.6.2",
39
- "typescript": "^5.3.2"
39
+ "typescript": "^5.8.3"
40
40
  }
41
41
  }