rawsql-ts 0.10.8-beta → 0.11.0-beta

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 (52) hide show
  1. package/README.md +174 -44
  2. package/dist/esm/index.js +30 -0
  3. package/dist/esm/index.js.map +1 -0
  4. package/dist/esm/index.min.js +16 -14
  5. package/dist/esm/index.min.js.map +4 -4
  6. package/dist/esm/src/index.js +4 -0
  7. package/dist/esm/src/index.js.map +1 -1
  8. package/dist/esm/src/transformers/DynamicQueryBuilder.js +155 -0
  9. package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -0
  10. package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js +16 -12
  11. package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
  12. package/dist/esm/src/transformers/SqlFormatter.js +1 -2
  13. package/dist/esm/src/transformers/SqlFormatter.js.map +1 -1
  14. package/dist/esm/src/transformers/TypeTransformationPostProcessor.js +342 -0
  15. package/dist/esm/src/transformers/TypeTransformationPostProcessor.js.map +1 -0
  16. package/dist/esm/src/transformers/UnifiedJsonMapping.js +59 -0
  17. package/dist/esm/src/transformers/UnifiedJsonMapping.js.map +1 -0
  18. package/dist/esm/src/utils/JsonSchemaValidator.js +211 -0
  19. package/dist/esm/src/utils/JsonSchemaValidator.js.map +1 -0
  20. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  21. package/dist/esm/types/src/index.d.ts +4 -0
  22. package/dist/esm/types/src/transformers/DynamicQueryBuilder.d.ts +108 -0
  23. package/dist/esm/types/src/transformers/PostgresJsonQueryBuilder.d.ts +3 -1
  24. package/dist/esm/types/src/transformers/SqlFormatter.d.ts +2 -3
  25. package/dist/esm/types/src/transformers/TypeTransformationPostProcessor.d.ts +108 -0
  26. package/dist/esm/types/src/transformers/UnifiedJsonMapping.d.ts +54 -0
  27. package/dist/esm/types/src/utils/JsonSchemaValidator.d.ts +81 -0
  28. package/dist/index.min.js +16 -14
  29. package/dist/index.min.js.map +4 -4
  30. package/dist/src/index.d.ts +4 -0
  31. package/dist/src/index.js +4 -0
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/transformers/DynamicQueryBuilder.d.ts +108 -0
  34. package/dist/src/transformers/DynamicQueryBuilder.js +159 -0
  35. package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -0
  36. package/dist/src/transformers/PostgresJsonQueryBuilder.d.ts +3 -1
  37. package/dist/src/transformers/PostgresJsonQueryBuilder.js +16 -12
  38. package/dist/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
  39. package/dist/src/transformers/SqlFormatter.d.ts +2 -3
  40. package/dist/src/transformers/SqlFormatter.js +1 -2
  41. package/dist/src/transformers/SqlFormatter.js.map +1 -1
  42. package/dist/src/transformers/TypeTransformationPostProcessor.d.ts +108 -0
  43. package/dist/src/transformers/TypeTransformationPostProcessor.js +351 -0
  44. package/dist/src/transformers/TypeTransformationPostProcessor.js.map +1 -0
  45. package/dist/src/transformers/UnifiedJsonMapping.d.ts +54 -0
  46. package/dist/src/transformers/UnifiedJsonMapping.js +62 -0
  47. package/dist/src/transformers/UnifiedJsonMapping.js.map +1 -0
  48. package/dist/src/utils/JsonSchemaValidator.d.ts +81 -0
  49. package/dist/src/utils/JsonSchemaValidator.js +215 -0
  50. package/dist/src/utils/JsonSchemaValidator.js.map +1 -0
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/package.json +7 -4
package/README.md CHANGED
@@ -23,6 +23,8 @@ It is designed for extensibility and advanced SQL analysis, with initial focus o
23
23
  - High-speed SQL parsing and AST analysis (over 3x faster than major libraries)
24
24
  - Rich utilities for SQL structure transformation and analysis
25
25
  - Advanced SQL formatting capabilities, including multi-line formatting and customizable styles
26
+ - **JSON-to-TypeScript type transformation** - Automatically convert JSON-ified SQL results (dates as strings, BigInts) back to proper TypeScript types with configurable transformation rules
27
+ - **All-in-one dynamic query building with `DynamicQueryBuilder`** - combines filtering, sorting, pagination, and JSON serialization in a single, type-safe interface
26
28
  - Dynamic SQL parameter injection for building flexible search queries with `SqlParamInjector` (supports like, ilike, in, any, range queries, OR/AND conditions and more)
27
29
  - Dynamic ORDER BY clause injection with `SqlSortInjector` for flexible sorting with support for ASC/DESC, NULLS positioning, and append mode
28
30
  - Dynamic LIMIT/OFFSET pagination injection with `SqlPaginationInjector` for efficient data pagination with page-based and offset-based support
@@ -43,14 +45,14 @@ Just import it like this:
43
45
  ```html
44
46
  <!-- Always get the latest version -->
45
47
  <script type="module">
46
- import { parse } from "https://unpkg.com/rawsql-ts/dist/esm/index.js";
48
+ import { parse } from "https://unpkg.com/rawsql-ts/dist/esm/index.min.js";
47
49
  </script>
48
50
  ```
49
51
 
50
52
  ```html
51
53
  <!-- Pin a specific version for stability -->
52
54
  <script type="module">
53
- import { parse } from "https://unpkg.com/rawsql-ts@0.1.0-beta.12/dist/esm/index.js";
55
+ import { parse } from "https://unpkg.com/rawsql-ts@0.10.9-beta/dist/esm/index.min.js";
54
56
  </script>
55
57
  ```
56
58
 
@@ -66,63 +68,126 @@ npm install rawsql-ts
66
68
 
67
69
  ## Quick Start
68
70
 
69
- Kickstart your project by dynamically injecting parameters with `SqlParamInjector` for flexible query generation right from the start!
71
+ Experience the power of rawsql-ts with `DynamicQueryBuilder` - build complex queries with filtering, sorting, pagination, and JSON serialization in one go!
70
72
 
71
73
  ```typescript
72
- import { SqlParamInjector, SqlFormatter } from 'rawsql-ts';
73
-
74
- // Define a base SQL query with an alias
75
- const baseSql = `SELECT u.user_id, u.user_name, u.email, u.phone FROM users as u WHERE u.active = TRUE`;
76
-
77
- // Search parameters with OR conditions and AND combination
78
- const searchParams = {
79
- name_or_email: {
80
- or: [
81
- { column: 'user_name', ilike: '%alice%' },
82
- { column: 'email', ilike: '%alice%' }
83
- ]
74
+ import { DynamicQueryBuilder, SqlFormatter } from 'rawsql-ts';
75
+
76
+ // Start with a simple base SQL
77
+ const baseSql = 'SELECT id, name, email, created_at FROM users WHERE active = true';
78
+
79
+ // Build a complete dynamic query with all features
80
+ const builder = new DynamicQueryBuilder();
81
+ const query = builder.buildQuery(baseSql, {
82
+ // Dynamic filtering
83
+ filter: {
84
+ status: 'premium',
85
+ created_at: { '>': '2024-01-01' }
84
86
  },
85
- phone: { like: '%080%' } // AND condition
86
- };
87
-
88
- const injector = new SqlParamInjector();
89
- // Dynamically inject searchParams into the baseSql
90
- const query = injector.inject(baseSql, searchParams);
87
+ // Dynamic sorting
88
+ sort: {
89
+ created_at: { desc: true },
90
+ name: { asc: true }
91
+ },
92
+ // Dynamic pagination
93
+ paging: {
94
+ page: 2,
95
+ pageSize: 10
96
+ },
97
+ // JSON serialization (optional)
98
+ serialize: {
99
+ rootName: 'user',
100
+ rootEntity: {
101
+ id: 'user',
102
+ name: 'User',
103
+ columns: { id: 'id', name: 'name', email: 'email', createdAt: 'created_at' }
104
+ },
105
+ nestedEntities: []
106
+ }
107
+ });
91
108
 
92
- // Format the dynamically generated query
93
- const formatter = new SqlFormatter({ preset: 'postgres' });
109
+ // Format and execute
110
+ const formatter = new SqlFormatter();
94
111
  const { formattedSql, params } = formatter.format(query);
95
112
 
96
113
  console.log('Generated SQL:');
97
114
  console.log(formattedSql);
98
- // Output:
99
- // select "u"."user_id", "u"."user_name", "u"."email", "u"."phone"
100
- // from "users" as "u"
101
- // where "u"."active" = true
102
- // and ("u"."user_name" ilike :name_or_email_or_0_ilike
103
- // or "u"."email" ilike :name_or_email_or_1_ilike)
104
- // and "u"."phone" like :phone_like
115
+ // Output: Optimized PostgreSQL JSON query with filtering, sorting, and pagination
105
116
 
106
117
  console.log('Parameters:');
107
118
  console.log(params);
108
- // Output: { name_or_email_or_0_ilike: '%alice%', name_or_email_or_1_ilike: '%alice%', phone_like: '%080%' }
119
+ // Output: { status: 'premium', created_at_gt: '2024-01-01' }
109
120
  ```
110
121
 
111
122
  ---
112
123
 
113
- ## SelectQueryParser Features
124
+ ## SelectQueryParser & Query Types
114
125
 
115
126
  rawsql-ts provides robust parsers for `SELECT`, `INSERT`, and `UPDATE` statements, automatically handling SQL comments and providing detailed error messages. By converting SQL into a generic Abstract Syntax Tree (AST), it enables a wide variety of transformation processes.
116
127
 
128
+ ### Query Type Overview
129
+
130
+ The parser returns different query types based on SQL structure:
131
+
132
+ - **`SimpleSelectQuery`**: Single SELECT statement with comprehensive manipulation API
133
+ - **`BinarySelectQuery`**: Combined queries using UNION, INTERSECT, EXCEPT operators
134
+ - **`ValuesQuery`**: VALUES clause queries for data insertion or testing
135
+ - **`SelectQuery`**: Base interface implemented by all SELECT query classes
136
+
117
137
  ```typescript
118
138
  import { SelectQueryParser } from 'rawsql-ts';
119
139
 
120
- const sql = `SELECT id, name FROM products WHERE category = 'electronics'`;
121
- const query = SelectQueryParser.parse(sql);
122
- // query object now holds the AST of the SQL
140
+ // Returns SimpleSelectQuery
141
+ const simpleQuery = SelectQueryParser.parse('SELECT id, name FROM products WHERE category = \'electronics\'');
142
+
143
+ // Returns BinarySelectQuery
144
+ const unionQuery = SelectQueryParser.parse('SELECT id, name FROM products UNION SELECT id, name FROM archived_products');
145
+
146
+ // Returns ValuesQuery
147
+ const valuesQuery = SelectQueryParser.parse('VALUES (1, \'Alice\'), (2, \'Bob\')');
148
+ ```
149
+
150
+ ### SimpleSelectQuery - Rich Programmatic API
151
+
152
+ `SimpleSelectQuery` provides extensive methods for programmatic query building and manipulation:
153
+
154
+ **Dynamic Condition Building:**
155
+ - `appendWhereExpr(columnName, exprBuilder)` - Add conditions by column name with upstream injection support
156
+ - `appendWhereRaw()`, `appendHavingRaw()` - Append raw SQL conditions
157
+ - `setParameter(name, value)` - Manage named parameters directly on the query object
158
+
159
+ **Query Composition:**
160
+ - `toUnion()`, `toIntersect()`, `toExcept()` - Combine with other queries
161
+ - `innerJoin()`, `leftJoin()`, `rightJoin()` - Add JOIN clauses programmatically
162
+ - `appendWith()` - Add Common Table Expressions (CTEs)
163
+
164
+ **Advanced Features:**
165
+ - Column-aware condition injection that resolves aliases and expressions
166
+ - Parameter management with validation and type safety
167
+ - Subquery wrapping with `toSource(alias)` for complex compositions
168
+
169
+ ```typescript
170
+ import { SelectQueryParser } from 'rawsql-ts';
171
+
172
+ const query = SelectQueryParser.parse('SELECT id, salary * 1.1 AS adjusted_salary FROM employees');
173
+
174
+ // Add condition targeting the calculated column
175
+ query.appendWhereExpr('adjusted_salary', expr => `${expr} > 50000`);
176
+
177
+ // Set parameters directly on the query
178
+ query.setParameter('dept_id', 123);
179
+
180
+ // Add JOINs programmatically
181
+ query.leftJoinRaw('departments', 'd', 'department_id');
182
+
183
+ // Combine with another query
184
+ const adminQuery = SelectQueryParser.parse('SELECT id, salary FROM admins');
185
+ const combinedQuery = query.toUnion(adminQuery);
123
186
  ```
124
187
 
125
- For more details on `SelectQueryParser`, see the [SelectQueryParser Usage Guide](./docs/usage-guides/class-SelectQueryParser-usage-guide.md).
188
+ For comprehensive API documentation and advanced examples, see the [SimpleSelectQuery Usage Guide](../../docs/usage-guides/class-SimpleSelectQuery-usage-guide.md).
189
+
190
+ For SelectQueryParser details, see the [SelectQueryParser Usage Guide](../../docs/usage-guides/class-SelectQueryParser-usage-guide.md).
126
191
 
127
192
  ---
128
193
 
@@ -168,7 +233,7 @@ order by
168
233
  */
169
234
  ```
170
235
 
171
- For more details, see the [SqlFormatter Usage Guide](./docs/usage-guides/class-SqlFormatter-usage-guide.md).
236
+ For more details, see the [SqlFormatter Usage Guide](../../docs/usage-guides/class-SqlFormatter-usage-guide.md).
172
237
 
173
238
  ---
174
239
 
@@ -202,7 +267,7 @@ console.log(params);
202
267
  // Output: { user_id: 42, user_name: 'Alice' }
203
268
  ```
204
269
 
205
- For more details, see the [SqlParamInjector Usage Guide](./docs/usage-guides/class-SqlParamInjector-usage-guide.md).
270
+ For more details, see the [SqlParamInjector Usage Guide](../../docs/usage-guides/class-SqlParamInjector-usage-guide.md).
206
271
 
207
272
  ---
208
273
 
@@ -249,7 +314,7 @@ const newSortedQuery = injector.inject(cleanQuery, { name: { desc: true } });
249
314
  // Result: SELECT id, name FROM users ORDER BY name DESC
250
315
  ```
251
316
 
252
- For more details, see the [SqlSortInjector Usage Guide](./docs/usage-guides/class-SqlSortInjector-usage-guide.md).
317
+ For more details, see the [SqlSortInjector Usage Guide](../../docs/usage-guides/class-SqlSortInjector-usage-guide.md).
253
318
 
254
319
  ---
255
320
 
@@ -305,7 +370,72 @@ query = new SqlPaginationInjector().inject(query, { page: 3, pageSize: 15 });
305
370
  // Result: Filtered, sorted, and paginated query ready for execution
306
371
  ```
307
372
 
308
- For more details, see the [SqlPaginationInjector Usage Guide](./docs/usage-guides/class-SqlPaginationInjector-usage-guide.md).
373
+ For more details, see the [SqlPaginationInjector Usage Guide](../../docs/usage-guides/class-SqlPaginationInjector-usage-guide.md).
374
+
375
+ ---
376
+
377
+ ## DynamicQueryBuilder Features
378
+
379
+ The `DynamicQueryBuilder` class is a powerful, all-in-one solution that combines SQL parsing with dynamic condition injection (filtering, sorting, pagination, and JSON serialization). It provides a unified interface for building complex queries without the need to manually chain multiple injectors, making it ideal for modern web applications that require flexible, dynamic query generation.
380
+
381
+ Key benefits include:
382
+ - **Unified Interface**: Single class that combines filtering, sorting, pagination, and JSON serialization
383
+ - **Framework-Agnostic**: Pure JavaScript/TypeScript with no file system dependencies
384
+ - **Composable Architecture**: Internally uses specialized injectors in optimal order for performance
385
+ - **Type-Safe**: Full TypeScript support with strongly typed options and return values
386
+ - **Performance Optimized**: Applies conditions in the most efficient order (filter → sort → paginate → serialize)
387
+ - **Easy Testing**: No external dependencies make unit testing straightforward
388
+
389
+ ```typescript
390
+ import { DynamicQueryBuilder, SqlFormatter } from 'rawsql-ts';
391
+
392
+ // Create a builder instance
393
+ const builder = new DynamicQueryBuilder();
394
+
395
+ // Build a complete dynamic query with all features
396
+ const baseQuery = 'SELECT id, name, email, created_at FROM users WHERE active = true';
397
+ const options = {
398
+ filter: {
399
+ status: 'premium',
400
+ created_at: { min: '2024-01-01' } // Range filter
401
+ },
402
+ sort: {
403
+ created_at: { desc: true, nullsLast: true },
404
+ name: { asc: true }
405
+ },
406
+ paging: { page: 2, pageSize: 20 },
407
+ serialize: {
408
+ rootName: 'users',
409
+ rootEntity: {
410
+ id: 'user',
411
+ name: 'User',
412
+ columns: { id: 'id', name: 'name', email: 'email', created: 'created_at' }
413
+ },
414
+ nestedEntities: []
415
+ }
416
+ };
417
+
418
+ const dynamicQuery = builder.buildQuery(baseQuery, options);
419
+
420
+ const formatter = new SqlFormatter();
421
+ const { formattedSql, params } = formatter.format(dynamicQuery);
422
+
423
+ console.log(formattedSql);
424
+ // Output: Complex JSON query with all conditions applied
425
+ console.log(params);
426
+ // Output: { status: 'premium', created_at_min: '2024-01-01', paging_limit: 20, paging_offset: 20 }
427
+
428
+ // Convenience methods for specific use cases
429
+ const filteredOnly = builder.buildFilteredQuery(baseQuery, { name: 'Alice' });
430
+ const sortedOnly = builder.buildSortedQuery(baseQuery, { created_at: { desc: true } });
431
+ const paginatedOnly = builder.buildPaginatedQuery(baseQuery, { page: 1, pageSize: 10 });
432
+
433
+ // Validate SQL without applying modifications
434
+ const isValid = builder.validateSql('SELECT id FROM users');
435
+ console.log(isValid); // true
436
+ ```
437
+
438
+ For more details, see the [DynamicQueryBuilder Usage Guide](../../docs/usage-guides/class-DynamicQueryBuilder-usage-guide.md).
309
439
 
310
440
  ---
311
441
 
@@ -352,7 +482,7 @@ const jsonQuery = builder.buildJson(baseQuery, mapping);
352
482
  // [{ "id": 1, "date": "2024-01-15", "customer": {"name": "John"}, "items": [{"product": "Widget", "qty": 2}] }]
353
483
  ```
354
484
 
355
- For more details, see the [PostgresJsonQueryBuilder Usage Guide](./docs/usage-guides/class-PostgresJsonQueryBuilder-usage-guide.md).
485
+ For more details, see the [PostgresJsonQueryBuilder Usage Guide](../../docs/usage-guides/class-PostgresJsonQueryBuilder-usage-guide.md).
356
486
 
357
487
  ---
358
488
 
@@ -404,7 +534,7 @@ try {
404
534
  }
405
535
  ```
406
536
 
407
- For more details on `SqlSchemaValidator`, see the [SqlSchemaValidator Usage Guide](./docs/usage-guides/class-SqlSchemaValidator-usage-guide.md).
537
+ For more details on `SqlSchemaValidator`, see the [SqlSchemaValidator Usage Guide](../../docs/usage-guides/class-SqlSchemaValidator-usage-guide.md).
408
538
 
409
539
  ---
410
540
 
@@ -440,7 +570,7 @@ console.log(updateSql);
440
570
  // update "users" set "email" = "d"."email", "last_login" = "d"."last_login" from (SELECT id, new_email AS email, last_login FROM user_updates_source WHERE needs_update = TRUE) as "d" where "users"."id" = "d"."id"
441
571
  ```
442
572
 
443
- For more details on `QueryBuilder`, see the [QueryBuilder Usage Guide](./docs/usage-guides/class-QueryBuilder-usage-guide.md).
573
+ For more details on `QueryBuilder`, see the [QueryBuilder Usage Guide](../../docs/usage-guides/class-QueryBuilder-usage-guide.md).
444
574
 
445
575
  ---
446
576
 
@@ -475,7 +605,7 @@ const tableColumnResolver = schemaManager.createTableColumnResolver();
475
605
  const injector = new SqlParamInjector({ tableColumnResolver });
476
606
  ```
477
607
 
478
- For more details on `SchemaManager`, see the [SchemaManager Usage Guide](./docs/usage-guides/class-SchemaManager-usage-guide.md).
608
+ For more details on `SchemaManager`, see the [SchemaManager Usage Guide](../../docs/usage-guides/class-SchemaManager-usage-guide.md).
479
609
 
480
610
  ---
481
611
 
@@ -0,0 +1,30 @@
1
+ // Entry point for rawsql-ts package
2
+ export * from './parsers/SelectQueryParser';
3
+ export * from './parsers/InsertQueryParser';
4
+ export * from './models/BinarySelectQuery';
5
+ export * from './models/SelectQuery';
6
+ export * from './models/ValueComponent';
7
+ export * from './models/ValuesQuery';
8
+ export * from './transformers/CTECollector';
9
+ export * from './transformers/CTENormalizer';
10
+ export * from './transformers/Formatter';
11
+ export * from './transformers/SqlFormatter';
12
+ export * from './transformers/PostgresJsonQueryBuilder';
13
+ export * from './transformers/QueryBuilder'; // old name:QueryConverter
14
+ export * from './transformers/SelectValueCollector';
15
+ export * from './transformers/SelectableColumnCollector';
16
+ export * from './transformers/TableColumnResolver';
17
+ export * from './transformers/TableSourceCollector';
18
+ export * from './transformers/UnifiedJsonMapping';
19
+ export * from './transformers/UpstreamSelectQueryFinder';
20
+ export * from './transformers/TypeTransformationPostProcessor';
21
+ export * from './transformers/SchemaCollector';
22
+ export * from './transformers/SqlParamInjector';
23
+ export * from './transformers/SqlSortInjector';
24
+ export * from './transformers/SqlPaginationInjector';
25
+ export * from './transformers/DynamicQueryBuilder';
26
+ export * from './utils/SqlSchemaValidator';
27
+ export * from './utils/JsonSchemaValidator';
28
+ export * from './utils/SchemaManager';
29
+ // Add more exports here if you want to expose additional public API
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAErC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC,CAAC,0BAA0B;AACvE,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,gDAAgD,CAAC;AAE/D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,oEAAoE"}