@slonik/sql-tag 40.2.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.
Files changed (233) hide show
  1. package/README.md +2 -0
  2. package/dist/Logger.d.ts +2 -0
  3. package/dist/Logger.d.ts.map +1 -0
  4. package/dist/Logger.js +8 -0
  5. package/dist/Logger.js.map +1 -0
  6. package/dist/factories/createPrimitiveValueExpressions.d.ts +3 -0
  7. package/dist/factories/createPrimitiveValueExpressions.d.ts.map +1 -0
  8. package/dist/factories/createPrimitiveValueExpressions.js +33 -0
  9. package/dist/factories/createPrimitiveValueExpressions.js.map +1 -0
  10. package/dist/factories/createSqlTag.d.ts +38 -0
  11. package/dist/factories/createSqlTag.d.ts.map +1 -0
  12. package/dist/factories/createSqlTag.js +170 -0
  13. package/dist/factories/createSqlTag.js.map +1 -0
  14. package/dist/factories/createSqlTag.test/array.test.d.ts +2 -0
  15. package/dist/factories/createSqlTag.test/array.test.d.ts.map +1 -0
  16. package/dist/factories/createSqlTag.test/array.test.js +76 -0
  17. package/dist/factories/createSqlTag.test/array.test.js.map +1 -0
  18. package/dist/factories/createSqlTag.test/date.test.d.ts +2 -0
  19. package/dist/factories/createSqlTag.test/date.test.d.ts.map +1 -0
  20. package/dist/factories/createSqlTag.test/date.test.js +25 -0
  21. package/dist/factories/createSqlTag.test/date.test.js.map +1 -0
  22. package/dist/factories/createSqlTag.test/identifier.test.d.ts +2 -0
  23. package/dist/factories/createSqlTag.test/identifier.test.d.ts.map +1 -0
  24. package/dist/factories/createSqlTag.test/identifier.test.js +38 -0
  25. package/dist/factories/createSqlTag.test/identifier.test.js.map +1 -0
  26. package/dist/factories/createSqlTag.test/interval.test.d.ts +2 -0
  27. package/dist/factories/createSqlTag.test/interval.test.d.ts.map +1 -0
  28. package/dist/factories/createSqlTag.test/interval.test.js +43 -0
  29. package/dist/factories/createSqlTag.test/interval.test.js.map +1 -0
  30. package/dist/factories/createSqlTag.test/join.test.d.ts +2 -0
  31. package/dist/factories/createSqlTag.test/join.test.d.ts.map +1 -0
  32. package/dist/factories/createSqlTag.test/join.test.js +87 -0
  33. package/dist/factories/createSqlTag.test/join.test.js.map +1 -0
  34. package/dist/factories/createSqlTag.test/json.test.d.ts +2 -0
  35. package/dist/factories/createSqlTag.test/json.test.d.ts.map +1 -0
  36. package/dist/factories/createSqlTag.test/json.test.js +88 -0
  37. package/dist/factories/createSqlTag.test/json.test.js.map +1 -0
  38. package/dist/factories/createSqlTag.test/jsonb.test.d.ts +2 -0
  39. package/dist/factories/createSqlTag.test/jsonb.test.d.ts.map +1 -0
  40. package/dist/factories/createSqlTag.test/jsonb.test.js +88 -0
  41. package/dist/factories/createSqlTag.test/jsonb.test.js.map +1 -0
  42. package/dist/factories/createSqlTag.test/literalValue.test.d.ts +2 -0
  43. package/dist/factories/createSqlTag.test/literalValue.test.d.ts.map +1 -0
  44. package/dist/factories/createSqlTag.test/literalValue.test.js +18 -0
  45. package/dist/factories/createSqlTag.test/literalValue.test.js.map +1 -0
  46. package/dist/factories/createSqlTag.test/sql.test.d.ts +2 -0
  47. package/dist/factories/createSqlTag.test/sql.test.d.ts.map +1 -0
  48. package/dist/factories/createSqlTag.test/sql.test.js +138 -0
  49. package/dist/factories/createSqlTag.test/sql.test.js.map +1 -0
  50. package/dist/factories/createSqlTag.test/timestamp.test.d.ts +2 -0
  51. package/dist/factories/createSqlTag.test/timestamp.test.d.ts.map +1 -0
  52. package/dist/factories/createSqlTag.test/timestamp.test.js +25 -0
  53. package/dist/factories/createSqlTag.test/timestamp.test.js.map +1 -0
  54. package/dist/factories/createSqlTag.test/type.test.d.ts +2 -0
  55. package/dist/factories/createSqlTag.test/type.test.d.ts.map +1 -0
  56. package/dist/factories/createSqlTag.test/type.test.js +19 -0
  57. package/dist/factories/createSqlTag.test/type.test.js.map +1 -0
  58. package/dist/factories/createSqlTag.test/typeAlias.test.d.ts +2 -0
  59. package/dist/factories/createSqlTag.test/typeAlias.test.d.ts.map +1 -0
  60. package/dist/factories/createSqlTag.test/typeAlias.test.js +47 -0
  61. package/dist/factories/createSqlTag.test/typeAlias.test.js.map +1 -0
  62. package/dist/factories/createSqlTag.test/unnest.test.d.ts +2 -0
  63. package/dist/factories/createSqlTag.test/unnest.test.d.ts.map +1 -0
  64. package/dist/factories/createSqlTag.test/unnest.test.js +127 -0
  65. package/dist/factories/createSqlTag.test/unnest.test.js.map +1 -0
  66. package/dist/factories/createSqlTokenSqlFragment.d.ts +3 -0
  67. package/dist/factories/createSqlTokenSqlFragment.d.ts.map +1 -0
  68. package/dist/factories/createSqlTokenSqlFragment.js +57 -0
  69. package/dist/factories/createSqlTokenSqlFragment.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +6 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/regexRules/slonikPlaceholderRegexRule.d.ts +2 -0
  75. package/dist/regexRules/slonikPlaceholderRegexRule.d.ts.map +1 -0
  76. package/dist/regexRules/slonikPlaceholderRegexRule.js +5 -0
  77. package/dist/regexRules/slonikPlaceholderRegexRule.js.map +1 -0
  78. package/dist/sqlFragmentFactories/createArraySqlFragment.d.ts +3 -0
  79. package/dist/sqlFragmentFactories/createArraySqlFragment.d.ts.map +1 -0
  80. package/dist/sqlFragmentFactories/createArraySqlFragment.js +48 -0
  81. package/dist/sqlFragmentFactories/createArraySqlFragment.js.map +1 -0
  82. package/dist/sqlFragmentFactories/createBinarySqlFragment.d.ts +3 -0
  83. package/dist/sqlFragmentFactories/createBinarySqlFragment.d.ts.map +1 -0
  84. package/dist/sqlFragmentFactories/createBinarySqlFragment.js +16 -0
  85. package/dist/sqlFragmentFactories/createBinarySqlFragment.js.map +1 -0
  86. package/dist/sqlFragmentFactories/createDateSqlFragment.d.ts +3 -0
  87. package/dist/sqlFragmentFactories/createDateSqlFragment.d.ts.map +1 -0
  88. package/dist/sqlFragmentFactories/createDateSqlFragment.js +16 -0
  89. package/dist/sqlFragmentFactories/createDateSqlFragment.js.map +1 -0
  90. package/dist/sqlFragmentFactories/createFragmentSqlFragment.d.ts +3 -0
  91. package/dist/sqlFragmentFactories/createFragmentSqlFragment.d.ts.map +1 -0
  92. package/dist/sqlFragmentFactories/createFragmentSqlFragment.js +34 -0
  93. package/dist/sqlFragmentFactories/createFragmentSqlFragment.js.map +1 -0
  94. package/dist/sqlFragmentFactories/createIdentifierSqlFragment.d.ts +3 -0
  95. package/dist/sqlFragmentFactories/createIdentifierSqlFragment.d.ts.map +1 -0
  96. package/dist/sqlFragmentFactories/createIdentifierSqlFragment.js +21 -0
  97. package/dist/sqlFragmentFactories/createIdentifierSqlFragment.js.map +1 -0
  98. package/dist/sqlFragmentFactories/createIntervalSqlFragment.d.ts +3 -0
  99. package/dist/sqlFragmentFactories/createIntervalSqlFragment.d.ts.map +1 -0
  100. package/dist/sqlFragmentFactories/createIntervalSqlFragment.js +57 -0
  101. package/dist/sqlFragmentFactories/createIntervalSqlFragment.js.map +1 -0
  102. package/dist/sqlFragmentFactories/createJsonSqlFragment.d.ts +3 -0
  103. package/dist/sqlFragmentFactories/createJsonSqlFragment.d.ts.map +1 -0
  104. package/dist/sqlFragmentFactories/createJsonSqlFragment.js +49 -0
  105. package/dist/sqlFragmentFactories/createJsonSqlFragment.js.map +1 -0
  106. package/dist/sqlFragmentFactories/createListSqlFragment.d.ts +3 -0
  107. package/dist/sqlFragmentFactories/createListSqlFragment.d.ts.map +1 -0
  108. package/dist/sqlFragmentFactories/createListSqlFragment.js +38 -0
  109. package/dist/sqlFragmentFactories/createListSqlFragment.js.map +1 -0
  110. package/dist/sqlFragmentFactories/createQuerySqlFragment.d.ts +3 -0
  111. package/dist/sqlFragmentFactories/createQuerySqlFragment.d.ts.map +1 -0
  112. package/dist/sqlFragmentFactories/createQuerySqlFragment.js +34 -0
  113. package/dist/sqlFragmentFactories/createQuerySqlFragment.js.map +1 -0
  114. package/dist/sqlFragmentFactories/createTimestampSqlFragment.d.ts +3 -0
  115. package/dist/sqlFragmentFactories/createTimestampSqlFragment.d.ts.map +1 -0
  116. package/dist/sqlFragmentFactories/createTimestampSqlFragment.js +18 -0
  117. package/dist/sqlFragmentFactories/createTimestampSqlFragment.js.map +1 -0
  118. package/dist/sqlFragmentFactories/createUnnestSqlFragment.d.ts +3 -0
  119. package/dist/sqlFragmentFactories/createUnnestSqlFragment.d.ts.map +1 -0
  120. package/dist/sqlFragmentFactories/createUnnestSqlFragment.js +81 -0
  121. package/dist/sqlFragmentFactories/createUnnestSqlFragment.js.map +1 -0
  122. package/dist/tokens.d.ts +14 -0
  123. package/dist/tokens.d.ts.map +1 -0
  124. package/dist/tokens.js +17 -0
  125. package/dist/tokens.js.map +1 -0
  126. package/dist/types.d.ts +99 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +3 -0
  129. package/dist/types.js.map +1 -0
  130. package/dist/utilities/countArrayDimensions.d.ts +2 -0
  131. package/dist/utilities/countArrayDimensions.d.ts.map +1 -0
  132. package/dist/utilities/countArrayDimensions.js +14 -0
  133. package/dist/utilities/countArrayDimensions.js.map +1 -0
  134. package/dist/utilities/countArrayDimensions.test.d.ts +2 -0
  135. package/dist/utilities/countArrayDimensions.test.d.ts.map +1 -0
  136. package/dist/utilities/countArrayDimensions.test.js +13 -0
  137. package/dist/utilities/countArrayDimensions.test.js.map +1 -0
  138. package/dist/utilities/escapeIdentifier.d.ts +5 -0
  139. package/dist/utilities/escapeIdentifier.d.ts.map +1 -0
  140. package/dist/utilities/escapeIdentifier.js +12 -0
  141. package/dist/utilities/escapeIdentifier.js.map +1 -0
  142. package/dist/utilities/escapeIdentifier.test.d.ts +2 -0
  143. package/dist/utilities/escapeIdentifier.test.d.ts.map +1 -0
  144. package/dist/utilities/escapeIdentifier.test.js +13 -0
  145. package/dist/utilities/escapeIdentifier.test.js.map +1 -0
  146. package/dist/utilities/escapeLiteralValue.d.ts +5 -0
  147. package/dist/utilities/escapeLiteralValue.d.ts.map +1 -0
  148. package/dist/utilities/escapeLiteralValue.js +29 -0
  149. package/dist/utilities/escapeLiteralValue.js.map +1 -0
  150. package/dist/utilities/escapeLiteralValue.test.d.ts +2 -0
  151. package/dist/utilities/escapeLiteralValue.test.d.ts.map +1 -0
  152. package/dist/utilities/escapeLiteralValue.test.js +14 -0
  153. package/dist/utilities/escapeLiteralValue.test.js.map +1 -0
  154. package/dist/utilities/formatSlonikPlaceholder.d.ts +14 -0
  155. package/dist/utilities/formatSlonikPlaceholder.d.ts.map +1 -0
  156. package/dist/utilities/formatSlonikPlaceholder.js +20 -0
  157. package/dist/utilities/formatSlonikPlaceholder.js.map +1 -0
  158. package/dist/utilities/hasOwnProperty.d.ts +6 -0
  159. package/dist/utilities/hasOwnProperty.d.ts.map +1 -0
  160. package/dist/utilities/hasOwnProperty.js +12 -0
  161. package/dist/utilities/hasOwnProperty.js.map +1 -0
  162. package/dist/utilities/isPlainObject.d.ts +2 -0
  163. package/dist/utilities/isPlainObject.d.ts.map +1 -0
  164. package/dist/utilities/isPlainObject.js +16 -0
  165. package/dist/utilities/isPlainObject.js.map +1 -0
  166. package/dist/utilities/isPrimitiveValueExpression.d.ts +2 -0
  167. package/dist/utilities/isPrimitiveValueExpression.d.ts.map +1 -0
  168. package/dist/utilities/isPrimitiveValueExpression.js +12 -0
  169. package/dist/utilities/isPrimitiveValueExpression.js.map +1 -0
  170. package/dist/utilities/isSqlToken.d.ts +3 -0
  171. package/dist/utilities/isSqlToken.d.ts.map +1 -0
  172. package/dist/utilities/isSqlToken.js +35 -0
  173. package/dist/utilities/isSqlToken.js.map +1 -0
  174. package/dist/utilities/safeStringify.d.ts +2 -0
  175. package/dist/utilities/safeStringify.d.ts.map +1 -0
  176. package/dist/utilities/safeStringify.js +18 -0
  177. package/dist/utilities/safeStringify.js.map +1 -0
  178. package/dist/utilities/stripArrayNotation.d.ts +2 -0
  179. package/dist/utilities/stripArrayNotation.d.ts.map +1 -0
  180. package/dist/utilities/stripArrayNotation.js +12 -0
  181. package/dist/utilities/stripArrayNotation.js.map +1 -0
  182. package/dist/utilities/stripArrayNotation.test.d.ts +2 -0
  183. package/dist/utilities/stripArrayNotation.test.d.ts.map +1 -0
  184. package/dist/utilities/stripArrayNotation.test.js +13 -0
  185. package/dist/utilities/stripArrayNotation.test.js.map +1 -0
  186. package/package.json +88 -0
  187. package/src/Logger.ts +5 -0
  188. package/src/declarations.d.ts +8 -0
  189. package/src/factories/createPrimitiveValueExpressions.ts +43 -0
  190. package/src/factories/createSqlTag.test/array.test.ts +107 -0
  191. package/src/factories/createSqlTag.test/date.test.ts +26 -0
  192. package/src/factories/createSqlTag.test/identifier.test.ts +39 -0
  193. package/src/factories/createSqlTag.test/interval.test.ts +44 -0
  194. package/src/factories/createSqlTag.test/join.test.ts +127 -0
  195. package/src/factories/createSqlTag.test/json.test.ts +106 -0
  196. package/src/factories/createSqlTag.test/jsonb.test.ts +106 -0
  197. package/src/factories/createSqlTag.test/literalValue.test.ts +17 -0
  198. package/src/factories/createSqlTag.test/sql.test.ts +165 -0
  199. package/src/factories/createSqlTag.test/timestamp.test.ts +29 -0
  200. package/src/factories/createSqlTag.test/type.test.ts +17 -0
  201. package/src/factories/createSqlTag.test/typeAlias.test.ts +53 -0
  202. package/src/factories/createSqlTag.test/unnest.test.ts +173 -0
  203. package/src/factories/createSqlTag.ts +256 -0
  204. package/src/factories/createSqlTokenSqlFragment.ts +60 -0
  205. package/src/index.ts +2 -0
  206. package/src/regexRules/slonikPlaceholderRegexRule.ts +1 -0
  207. package/src/sqlFragmentFactories/createArraySqlFragment.ts +67 -0
  208. package/src/sqlFragmentFactories/createBinarySqlFragment.ts +17 -0
  209. package/src/sqlFragmentFactories/createDateSqlFragment.ts +19 -0
  210. package/src/sqlFragmentFactories/createFragmentSqlFragment.ts +48 -0
  211. package/src/sqlFragmentFactories/createIdentifierSqlFragment.ts +24 -0
  212. package/src/sqlFragmentFactories/createIntervalSqlFragment.ts +71 -0
  213. package/src/sqlFragmentFactories/createJsonSqlFragment.ts +66 -0
  214. package/src/sqlFragmentFactories/createListSqlFragment.ts +48 -0
  215. package/src/sqlFragmentFactories/createQuerySqlFragment.ts +48 -0
  216. package/src/sqlFragmentFactories/createTimestampSqlFragment.ts +22 -0
  217. package/src/sqlFragmentFactories/createUnnestSqlFragment.ts +118 -0
  218. package/src/tokens.ts +14 -0
  219. package/src/types.ts +189 -0
  220. package/src/utilities/countArrayDimensions.test.ts +8 -0
  221. package/src/utilities/countArrayDimensions.ts +12 -0
  222. package/src/utilities/escapeIdentifier.test.ts +8 -0
  223. package/src/utilities/escapeIdentifier.ts +8 -0
  224. package/src/utilities/escapeLiteralValue.test.ts +9 -0
  225. package/src/utilities/escapeLiteralValue.ts +26 -0
  226. package/src/utilities/formatSlonikPlaceholder.ts +15 -0
  227. package/src/utilities/hasOwnProperty.ts +10 -0
  228. package/src/utilities/isPlainObject.ts +14 -0
  229. package/src/utilities/isPrimitiveValueExpression.ts +11 -0
  230. package/src/utilities/isSqlToken.ts +52 -0
  231. package/src/utilities/safeStringify.ts +25 -0
  232. package/src/utilities/stripArrayNotation.test.ts +8 -0
  233. package/src/utilities/stripArrayNotation.ts +9 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A stricter type guard.
3
+ * @see https://tsplay.dev/WK8zGw
4
+ */
5
+ export declare const hasOwnProperty: <X extends {}, Y extends PropertyKey>(object: X, property: Y) => object is Record<Y, unknown> & X;
6
+ //# sourceMappingURL=hasOwnProperty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasOwnProperty.d.ts","sourceRoot":"","sources":["../../src/utilities/hasOwnProperty.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,cAAc,gDACjB,CAAC,YACC,CAAC,qCAGZ,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasOwnProperty = void 0;
4
+ /**
5
+ * A stricter type guard.
6
+ * @see https://tsplay.dev/WK8zGw
7
+ */
8
+ const hasOwnProperty = (object, property) => {
9
+ return Object.prototype.hasOwnProperty.call(object, property);
10
+ };
11
+ exports.hasOwnProperty = hasOwnProperty;
12
+ //# sourceMappingURL=hasOwnProperty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasOwnProperty.js","sourceRoot":"","sources":["../../src/utilities/hasOwnProperty.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACI,MAAM,cAAc,GAAG,CAC5B,MAAS,EACT,QAAW,EACuB,EAAE;IACpC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAChE,CAAC,CAAC;AALW,QAAA,cAAc,kBAKzB"}
@@ -0,0 +1,2 @@
1
+ export declare const isPlainObject: (subject: unknown) => boolean;
2
+ //# sourceMappingURL=isPlainObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isPlainObject.d.ts","sourceRoot":"","sources":["../../src/utilities/isPlainObject.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,YAAa,OAAO,YAa7C,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPlainObject = void 0;
4
+ const isPlainObject = (subject) => {
5
+ if (typeof subject !== 'object' || subject === null) {
6
+ return false;
7
+ }
8
+ const prototype = Object.getPrototypeOf(subject);
9
+ return ((prototype === null ||
10
+ prototype === Object.prototype ||
11
+ Object.getPrototypeOf(prototype) === null) &&
12
+ !(Symbol.toStringTag in subject) &&
13
+ !(Symbol.iterator in subject));
14
+ };
15
+ exports.isPlainObject = isPlainObject;
16
+ //# sourceMappingURL=isPlainObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isPlainObject.js","sourceRoot":"","sources":["../../src/utilities/isPlainObject.ts"],"names":[],"mappings":";;;AAAO,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,EAAE;IAChD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO,CACL,CAAC,SAAS,KAAK,IAAI;QACjB,SAAS,KAAK,MAAM,CAAC,SAAS;QAC9B,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;QAC5C,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC;QAChC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAC9B,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,aAAa,iBAaxB"}
@@ -0,0 +1,2 @@
1
+ export declare const isPrimitiveValueExpression: (maybe: unknown) => maybe is string | number | bigint | boolean | null;
2
+ //# sourceMappingURL=isPrimitiveValueExpression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isPrimitiveValueExpression.d.ts","sourceRoot":"","sources":["../../src/utilities/isPrimitiveValueExpression.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,UAC9B,OAAO,uDASf,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPrimitiveValueExpression = void 0;
4
+ const isPrimitiveValueExpression = (maybe) => {
5
+ return (typeof maybe === 'string' ||
6
+ typeof maybe === 'number' ||
7
+ typeof maybe === 'boolean' ||
8
+ typeof maybe === 'bigint' ||
9
+ maybe === null);
10
+ };
11
+ exports.isPrimitiveValueExpression = isPrimitiveValueExpression;
12
+ //# sourceMappingURL=isPrimitiveValueExpression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isPrimitiveValueExpression.js","sourceRoot":"","sources":["../../src/utilities/isPrimitiveValueExpression.ts"],"names":[],"mappings":";;;AAAO,MAAM,0BAA0B,GAAG,CACxC,KAAc,EACsC,EAAE;IACtD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,KAAK,KAAK,SAAS;QAC1B,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI,CACf,CAAC;AACJ,CAAC,CAAC;AAVW,QAAA,0BAA0B,8BAUrC"}
@@ -0,0 +1,3 @@
1
+ import { type SqlToken as SqlTokenType } from '../types';
2
+ export declare const isSqlToken: (subject: unknown) => subject is SqlTokenType;
3
+ //# sourceMappingURL=isSqlToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isSqlToken.d.ts","sourceRoot":"","sources":["../../src/utilities/isSqlToken.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,QAAQ,IAAI,YAAY,EAAE,MAAM,UAAU,CAAC;AAoBzD,eAAO,MAAM,UAAU,YAAa,OAAO,4BAgB1C,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSqlToken = void 0;
4
+ const tokens_1 = require("../tokens");
5
+ const hasOwnProperty_1 = require("./hasOwnProperty");
6
+ const errors_1 = require("@slonik/errors");
7
+ const Tokens = [
8
+ tokens_1.ArrayToken,
9
+ tokens_1.BinaryToken,
10
+ tokens_1.ComparisonPredicateToken,
11
+ tokens_1.DateToken,
12
+ tokens_1.FragmentToken,
13
+ tokens_1.IdentifierToken,
14
+ tokens_1.IntervalToken,
15
+ tokens_1.JsonBinaryToken,
16
+ tokens_1.JsonToken,
17
+ tokens_1.ListToken,
18
+ tokens_1.QueryToken,
19
+ tokens_1.TimestampToken,
20
+ tokens_1.UnnestToken,
21
+ ];
22
+ const isSqlToken = (subject) => {
23
+ if (typeof subject !== 'object' || subject === null) {
24
+ return false;
25
+ }
26
+ if (!(0, hasOwnProperty_1.hasOwnProperty)(subject, 'type')) {
27
+ throw new errors_1.UnexpectedStateError('Expected token to include "type" property.');
28
+ }
29
+ if (typeof subject.type !== 'string') {
30
+ throw new errors_1.UnexpectedStateError('Expected type to be string.');
31
+ }
32
+ return Tokens.includes(subject.type);
33
+ };
34
+ exports.isSqlToken = isSqlToken;
35
+ //# sourceMappingURL=isSqlToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isSqlToken.js","sourceRoot":"","sources":["../../src/utilities/isSqlToken.ts"],"names":[],"mappings":";;;AAAA,sCAcmB;AAEnB,qDAAkD;AAClD,2CAAsD;AAEtD,MAAM,MAAM,GAAG;IACb,mBAAU;IACV,oBAAW;IACX,iCAAwB;IACxB,kBAAS;IACT,sBAAa;IACb,wBAAe;IACf,sBAAa;IACb,wBAAe;IACf,kBAAS;IACT,kBAAS;IACT,mBAAU;IACV,uBAAc;IACd,oBAAW;CACH,CAAC;AAEJ,MAAM,UAAU,GAAG,CAAC,OAAgB,EAA2B,EAAE;IACtE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,IAAA,+BAAc,EAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,6BAAoB,CAC5B,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,6BAAoB,CAAC,6BAA6B,CAAC,CAAC;IAChE,CAAC;IAED,OAAQ,MAA4B,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC,CAAC;AAhBW,QAAA,UAAU,cAgBrB"}
@@ -0,0 +1,2 @@
1
+ export declare const safeStringify: (subject: unknown, replacer?: Array<number | string> | ((key: string, value: unknown) => unknown) | null | undefined, space?: number | string) => string;
2
+ //# sourceMappingURL=safeStringify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeStringify.d.ts","sourceRoot":"","sources":["../../src/utilities/safeStringify.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa,YACf,OAAO,aAEZ,MAAM,MAAM,GAAG,MAAM,CAAC,GACtB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,GAC1C,IAAI,GACJ,SAAS,UACL,MAAM,GAAG,MAAM,KACtB,MAQF,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeStringify = void 0;
4
+ const safe_stable_stringify_1 = require("safe-stable-stringify");
5
+ const stringify = (0, safe_stable_stringify_1.configure)({
6
+ bigint: true,
7
+ circularValue: '[Circular]',
8
+ strict: true,
9
+ });
10
+ const safeStringify = (subject, replacer, space) => {
11
+ const result = stringify(subject, replacer, space);
12
+ if (result === undefined) {
13
+ throw new Error('Expected result to be string');
14
+ }
15
+ return result;
16
+ };
17
+ exports.safeStringify = safeStringify;
18
+ //# sourceMappingURL=safeStringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeStringify.js","sourceRoot":"","sources":["../../src/utilities/safeStringify.ts"],"names":[],"mappings":";;;AAAA,iEAAkD;AAElD,MAAM,SAAS,GAAG,IAAA,iCAAS,EAAC;IAC1B,MAAM,EAAE,IAAI;IACZ,aAAa,EAAE,YAAY;IAC3B,MAAM,EAAE,IAAI;CACb,CAAC,CAAC;AAEI,MAAM,aAAa,GAAG,CAC3B,OAAgB,EAChB,QAIa,EACb,KAAuB,EACf,EAAE;IACV,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEnD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAhBW,QAAA,aAAa,iBAgBxB"}
@@ -0,0 +1,2 @@
1
+ export declare const stripArrayNotation: (identifierName: string) => string;
2
+ //# sourceMappingURL=stripArrayNotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripArrayNotation.d.ts","sourceRoot":"","sources":["../../src/utilities/stripArrayNotation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,mBAAoB,MAAM,KAAG,MAQ3D,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripArrayNotation = void 0;
4
+ const stripArrayNotation = (identifierName) => {
5
+ let tail = identifierName.trim();
6
+ while (tail.endsWith('[]')) {
7
+ tail = tail.trim().slice(0, -2);
8
+ }
9
+ return tail;
10
+ };
11
+ exports.stripArrayNotation = stripArrayNotation;
12
+ //# sourceMappingURL=stripArrayNotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripArrayNotation.js","sourceRoot":"","sources":["../../src/utilities/stripArrayNotation.ts"],"names":[],"mappings":";;;AAAO,MAAM,kBAAkB,GAAG,CAAC,cAAsB,EAAU,EAAE;IACnE,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;IAEjC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stripArrayNotation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripArrayNotation.test.d.ts","sourceRoot":"","sources":["../../src/utilities/stripArrayNotation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const stripArrayNotation_1 = require("./stripArrayNotation");
7
+ const ava_1 = __importDefault(require("ava"));
8
+ (0, ava_1.default)('strips array notation', (t) => {
9
+ t.is((0, stripArrayNotation_1.stripArrayNotation)('foo'), 'foo');
10
+ t.is((0, stripArrayNotation_1.stripArrayNotation)('foo[]'), 'foo');
11
+ t.is((0, stripArrayNotation_1.stripArrayNotation)('foo[][]'), 'foo');
12
+ });
13
+ //# sourceMappingURL=stripArrayNotation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripArrayNotation.test.js","sourceRoot":"","sources":["../../src/utilities/stripArrayNotation.test.ts"],"names":[],"mappings":";;;;;AAAA,6DAA0D;AAC1D,8CAAuB;AAEvB,IAAA,aAAI,EAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE;IAClC,CAAC,CAAC,EAAE,CAAC,IAAA,uCAAkB,EAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,EAAE,CAAC,IAAA,uCAAkB,EAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,EAAE,CAAC,IAAA,uCAAkB,EAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "author": {
3
+ "email": "gajus@gajus.com",
4
+ "name": "Gajus Kuizinas",
5
+ "url": "http://gajus.com"
6
+ },
7
+ "ava": {
8
+ "extensions": [
9
+ "ts"
10
+ ],
11
+ "files": [
12
+ "src/**/*.test.ts"
13
+ ],
14
+ "require": [
15
+ "ts-node/register/transpile-only"
16
+ ]
17
+ },
18
+ "dependencies": {
19
+ "@slonik/errors": "^40.2.2",
20
+ "roarr": "^7.21.1",
21
+ "safe-stable-stringify": "^2.4.3",
22
+ "serialize-error": "^8.0.0"
23
+ },
24
+ "description": "A Node.js PostgreSQL client with strict types, detailed logging and assertions.",
25
+ "devDependencies": {
26
+ "@types/node": "^18.15.3",
27
+ "ava": "^5.3.1",
28
+ "cspell": "^8.6.0",
29
+ "eslint": "^8.57.0",
30
+ "eslint-config-canonical": "^42.8.1",
31
+ "nyc": "^15.1.0",
32
+ "ts-node": "^10.9.1",
33
+ "typescript": "^5.4.3",
34
+ "zod": "^3.22.4"
35
+ },
36
+ "engines": {
37
+ "node": ">=18"
38
+ },
39
+ "files": [
40
+ "./src",
41
+ "./dist"
42
+ ],
43
+ "keywords": [
44
+ "postgresql",
45
+ "promise",
46
+ "types"
47
+ ],
48
+ "license": "BSD-3-Clause",
49
+ "main": "./dist/index.js",
50
+ "name": "@slonik/sql-tag",
51
+ "nyc": {
52
+ "all": true,
53
+ "exclude": [
54
+ "src/bin",
55
+ "src/queries/*.ts",
56
+ "**/*.d.ts"
57
+ ],
58
+ "include": [
59
+ "src/**/*.ts"
60
+ ],
61
+ "reporter": [
62
+ "html",
63
+ "text-summary"
64
+ ],
65
+ "require": [
66
+ "ts-node/register/transpile-only"
67
+ ],
68
+ "silent": true,
69
+ "sourceMap": false
70
+ },
71
+ "peerDependencies": {
72
+ "zod": "^3"
73
+ },
74
+ "repository": {
75
+ "type": "git",
76
+ "url": "https://github.com/gajus/slonik"
77
+ },
78
+ "scripts": {
79
+ "build": "rm -fr ./dist && tsc --project ./tsconfig.json",
80
+ "lint": "npm run lint:cspell && npm run lint:eslint && npm run lint:tsc",
81
+ "lint:cspell": "cspell . --no-progress --gitignore",
82
+ "lint:eslint": "eslint --cache ./src",
83
+ "lint:tsc": "tsc --noEmit",
84
+ "test": "nyc ava --verbose --serial"
85
+ },
86
+ "types": "./dist/index.d.ts",
87
+ "version": "40.2.2"
88
+ }
package/src/Logger.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { Roarr } from 'roarr';
2
+
3
+ export const Logger = Roarr.child({
4
+ package: 'slonik',
5
+ });
@@ -0,0 +1,8 @@
1
+ declare module 'pg-cursor';
2
+ declare module 'pg/lib/type-overrides' {
3
+ const TypeOverrides: new () => {
4
+ setTypeParser: (type: string, parser: (value: string) => unknown) => void;
5
+ };
6
+
7
+ export default TypeOverrides;
8
+ }
@@ -0,0 +1,43 @@
1
+ import { Logger } from '../Logger';
2
+ import { type PrimitiveValueExpression } from '../types';
3
+ import { safeStringify } from '../utilities/safeStringify';
4
+ import { UnexpectedStateError } from '@slonik/errors';
5
+
6
+ const log = Logger.child({
7
+ namespace: 'createPrimitiveValueExpressions',
8
+ });
9
+
10
+ export const createPrimitiveValueExpressions = (
11
+ values: readonly unknown[],
12
+ ): readonly PrimitiveValueExpression[] => {
13
+ const primitiveValueExpressions: Array<
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ any[] | Buffer | boolean | number | string | bigint | null
16
+ > = [];
17
+
18
+ for (const value of values) {
19
+ if (
20
+ Array.isArray(value) ||
21
+ Buffer.isBuffer(value) ||
22
+ typeof value === 'string' ||
23
+ typeof value === 'number' ||
24
+ typeof value === 'boolean' ||
25
+ typeof value === 'bigint' ||
26
+ value === null
27
+ ) {
28
+ primitiveValueExpressions.push(value);
29
+ } else {
30
+ log.warn(
31
+ {
32
+ value: JSON.parse(safeStringify(value)),
33
+ values: JSON.parse(safeStringify(values)),
34
+ },
35
+ 'unexpected value expression',
36
+ );
37
+
38
+ throw new UnexpectedStateError('Unexpected value expression.');
39
+ }
40
+ }
41
+
42
+ return primitiveValueExpressions;
43
+ };
@@ -0,0 +1,107 @@
1
+ import { FragmentToken } from '../../tokens';
2
+ import { createSqlTag } from '../createSqlTag';
3
+ import test from 'ava';
4
+
5
+ const sql = createSqlTag();
6
+
7
+ test('binds an empty array', (t) => {
8
+ const query = sql.fragment`SELECT ${sql.array([], 'int4')}`;
9
+
10
+ t.deepEqual(query, {
11
+ sql: 'SELECT $slonik_1::"int4"[]',
12
+ type: FragmentToken,
13
+ values: [[]],
14
+ });
15
+ });
16
+
17
+ test('binds bigint', (t) => {
18
+ const query = sql.fragment`SELECT ${sql.array(
19
+ // eslint-disable-next-line unicorn/numeric-separators-style
20
+ [9007199254740999n],
21
+ 'int8',
22
+ )}`;
23
+
24
+ t.deepEqual(query, {
25
+ sql: 'SELECT $slonik_1::"int8"[]',
26
+ type: FragmentToken,
27
+ // eslint-disable-next-line unicorn/numeric-separators-style
28
+ values: [[BigInt(9007199254740999n)]],
29
+ });
30
+ });
31
+
32
+ test('binds an array with multiple values', (t) => {
33
+ const query = sql.fragment`SELECT ${sql.array([1, 2, 3], 'int4')}`;
34
+
35
+ t.deepEqual(query, {
36
+ sql: 'SELECT $slonik_1::"int4"[]',
37
+ type: FragmentToken,
38
+ values: [[1, 2, 3]],
39
+ });
40
+ });
41
+
42
+ test('binds an array with bytea values', (t) => {
43
+ const query = sql.fragment`SELECT ${sql.array(
44
+ [Buffer.from('foo')],
45
+ 'bytea',
46
+ )}`;
47
+
48
+ t.deepEqual(query, {
49
+ sql: 'SELECT $slonik_1::"bytea"[]',
50
+ type: FragmentToken,
51
+ values: [[Buffer.from('foo')]],
52
+ });
53
+ });
54
+
55
+ test('offsets positional parameter indexes', (t) => {
56
+ const query = sql.fragment`SELECT ${1}, ${sql.array(
57
+ [1, 2, 3],
58
+ 'int4',
59
+ )}, ${3}`;
60
+
61
+ t.deepEqual(query, {
62
+ sql: 'SELECT $slonik_1, $slonik_2::"int4"[], $slonik_3',
63
+ type: FragmentToken,
64
+ values: [1, [1, 2, 3], 3],
65
+ });
66
+ });
67
+
68
+ test('binds a SQL token', (t) => {
69
+ const query = sql.fragment`SELECT ${sql.array(
70
+ [1, 2, 3],
71
+ sql.fragment`int[]`,
72
+ )}`;
73
+
74
+ t.deepEqual(query, {
75
+ sql: 'SELECT $slonik_1::int[]',
76
+ type: FragmentToken,
77
+ values: [[1, 2, 3]],
78
+ });
79
+ });
80
+
81
+ test('throws if array member is not a primitive value expression', (t) => {
82
+ const error = t.throws(() => {
83
+ sql.fragment`SELECT ${sql.array(
84
+ [
85
+ // @ts-expect-error - intentional
86
+ () => {},
87
+ ],
88
+ 'int',
89
+ )}`;
90
+ });
91
+
92
+ t.is(
93
+ error?.message,
94
+ 'Invalid array member type. Must be a primitive value expression.',
95
+ );
96
+ });
97
+
98
+ test('throws if memberType is not a string or SqlToken of different type than "SLONIK_TOKEN_FRAGMENT"', (t) => {
99
+ const error = t.throws(() => {
100
+ sql.fragment`SELECT ${sql.array([1, 2, 3], sql.identifier(['int']))}`;
101
+ });
102
+
103
+ t.is(
104
+ error?.message,
105
+ 'Unsupported `memberType`. `memberType` must be a string or SqlToken of "SLONIK_TOKEN_FRAGMENT" type.',
106
+ );
107
+ });
@@ -0,0 +1,26 @@
1
+ import { FragmentToken } from '../../tokens';
2
+ import { createSqlTag } from '../createSqlTag';
3
+ import test from 'ava';
4
+
5
+ const sql = createSqlTag();
6
+
7
+ test('binds a date', (t) => {
8
+ const query = sql.fragment`SELECT ${sql.date(
9
+ new Date('2022-08-19T03:27:24.951Z'),
10
+ )}`;
11
+
12
+ t.deepEqual(query, {
13
+ sql: 'SELECT $slonik_1::date',
14
+ type: FragmentToken,
15
+ values: ['2022-08-19'],
16
+ });
17
+ });
18
+
19
+ test('throws if not instance of Date', (t) => {
20
+ const error = t.throws(() => {
21
+ // @ts-expect-error - intentional
22
+ sql.fragment`SELECT ${sql.date(1)}`;
23
+ });
24
+
25
+ t.is(error?.message, 'Date parameter value must be an instance of Date.');
26
+ });
@@ -0,0 +1,39 @@
1
+ import { FragmentToken } from '../../tokens';
2
+ import { createSqlTag } from '../createSqlTag';
3
+ import test from 'ava';
4
+
5
+ const sql = createSqlTag();
6
+
7
+ test('creates an object describing a query with inlined identifiers', (t) => {
8
+ const query = sql.fragment`SELECT ${'foo'} FROM ${sql.identifier(['bar'])}`;
9
+
10
+ t.deepEqual(query, {
11
+ sql: 'SELECT $slonik_1 FROM "bar"',
12
+ type: FragmentToken,
13
+ values: ['foo'],
14
+ });
15
+ });
16
+
17
+ test('creates an object describing a query with inlined identifiers (specifier)', (t) => {
18
+ const query = sql.fragment`SELECT ${'foo'} FROM ${sql.identifier([
19
+ 'bar',
20
+ 'baz',
21
+ ])}`;
22
+
23
+ t.deepEqual(query, {
24
+ sql: 'SELECT $slonik_1 FROM "bar"."baz"',
25
+ type: FragmentToken,
26
+ values: ['foo'],
27
+ });
28
+ });
29
+
30
+ test('throws if an identifier name array member type is not a string', (t) => {
31
+ const error = t.throws(() => {
32
+ sql.fragment`${sql.identifier([
33
+ // @ts-expect-error - intentional
34
+ () => {},
35
+ ])}`;
36
+ });
37
+
38
+ t.is(error?.message, 'Identifier name array member type must be a string.');
39
+ });
@@ -0,0 +1,44 @@
1
+ import { FragmentToken } from '../../tokens';
2
+ import { createSqlTag } from '../createSqlTag';
3
+ import test from 'ava';
4
+
5
+ const sql = createSqlTag();
6
+
7
+ test('creates an empty make_interval invocation', (t) => {
8
+ const query = sql.fragment`SELECT ${sql.interval({})}`;
9
+
10
+ t.deepEqual(query, {
11
+ sql: 'SELECT make_interval()',
12
+ type: FragmentToken,
13
+ values: [],
14
+ });
15
+ });
16
+
17
+ test('creates an interval', (t) => {
18
+ const query = sql.fragment`SELECT ${sql.interval({
19
+ days: 4,
20
+ hours: 5,
21
+ minutes: 6,
22
+ months: 2,
23
+ seconds: 7,
24
+ weeks: 3,
25
+ years: 1,
26
+ })}`;
27
+
28
+ t.deepEqual(query, {
29
+ sql: 'SELECT make_interval(years => $slonik_1, months => $slonik_2, weeks => $slonik_3, days => $slonik_4, hours => $slonik_5, mins => $slonik_6, secs => $slonik_7)',
30
+ type: FragmentToken,
31
+ values: [1, 2, 3, 4, 5, 6, 7],
32
+ });
33
+ });
34
+
35
+ test('throws if contains unknown properties', (t) => {
36
+ const error = t.throws(() => {
37
+ sql.fragment`SELECT ${sql.interval({
38
+ // @ts-expect-error - intentional
39
+ foo: 'bar',
40
+ })}`;
41
+ });
42
+
43
+ t.is(error?.message, 'Interval input must not contain unknown properties.');
44
+ });