@wxn0brp/db-string-query 0.0.8 → 0.0.9

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 (97) hide show
  1. package/.github/workflows/build.yml +1 -1
  2. package/CHANGELOG.md +13 -0
  3. package/bun.lock +9 -6
  4. package/dist/sql/handle/collection.d.ts +4 -0
  5. package/dist/sql/handle/collection.js +26 -0
  6. package/dist/sql/handle/delete.d.ts +1 -0
  7. package/dist/sql/handle/delete.js +11 -0
  8. package/dist/sql/handle/insert.d.ts +1 -0
  9. package/dist/sql/handle/insert.js +52 -0
  10. package/dist/sql/handle/select.d.ts +7 -0
  11. package/dist/sql/handle/select.js +55 -0
  12. package/dist/sql/handle/update.d.ts +1 -0
  13. package/dist/sql/handle/update.js +12 -0
  14. package/dist/sql/index.d.ts +2 -2
  15. package/dist/sql/index.js +10 -4
  16. package/dist/sql/utils/join.util.d.ts +10 -0
  17. package/dist/sql/utils/join.util.js +55 -0
  18. package/dist/sql/where.js +4 -1
  19. package/dist/types.d.ts +5 -1
  20. package/package.json +7 -2
  21. package/src/sql/handle/collection.ts +28 -0
  22. package/src/sql/handle/delete.ts +12 -0
  23. package/src/sql/handle/insert.ts +50 -0
  24. package/src/sql/handle/select.ts +68 -0
  25. package/src/sql/handle/update.ts +13 -0
  26. package/src/sql/index.ts +12 -13
  27. package/src/sql/utils/join.util.ts +73 -0
  28. package/src/sql/where.ts +3 -0
  29. package/src/types.ts +9 -1
  30. package/{src/test → test}/js.test.ts +1 -1
  31. package/{src/test → test}/sql/delete.test.ts +2 -2
  32. package/test/sql/index.test.ts +17 -0
  33. package/{src/test → test}/sql/insert.test.ts +2 -2
  34. package/{src/test → test}/sql/select.test.ts +23 -2
  35. package/{src/test → test}/sql/update.test.ts +2 -2
  36. package/test/sql/utils/join.test.ts +42 -0
  37. package/test/tsconfig.json +19 -0
  38. package/tsconfig.json +7 -3
  39. package/typedocs-generated/404.html +76 -0
  40. package/typedocs-generated/assets/hierarchy.js +1 -1
  41. package/typedocs-generated/assets/highlight.css +1 -1
  42. package/typedocs-generated/assets/navigation.js +1 -1
  43. package/typedocs-generated/assets/search.js +1 -1
  44. package/typedocs-generated/assets/style.css +3 -3
  45. package/typedocs-generated/classes/sql_index.default.html +2 -2
  46. package/typedocs-generated/classes/sql_utils_join.util.JoinToRelationsEngine.html +3 -0
  47. package/typedocs-generated/functions/sql_handle_collection.handleCreate.html +1 -0
  48. package/typedocs-generated/functions/sql_handle_collection.handleDrop.html +1 -0
  49. package/typedocs-generated/functions/sql_handle_collection.handleExists.html +1 -0
  50. package/typedocs-generated/functions/sql_handle_collection.handleGet.html +1 -0
  51. package/typedocs-generated/functions/sql_handle_delete.handleDelete.html +1 -0
  52. package/typedocs-generated/functions/sql_handle_insert.handleInsert.html +1 -0
  53. package/typedocs-generated/functions/sql_handle_select.handleSelect.html +1 -0
  54. package/typedocs-generated/functions/sql_handle_select.parseJoinClauses.html +1 -0
  55. package/typedocs-generated/functions/sql_handle_select.parseSelectClause.html +1 -0
  56. package/typedocs-generated/functions/sql_handle_update.handleUpdate.html +1 -0
  57. package/typedocs-generated/hierarchy.html +1 -1
  58. package/typedocs-generated/interfaces/types.Opts.html +3 -0
  59. package/typedocs-generated/interfaces/types.ValtheraParser.html +2 -2
  60. package/typedocs-generated/modules/index.html +1 -1
  61. package/typedocs-generated/modules/sql_handle_collection.html +1 -0
  62. package/typedocs-generated/modules/sql_handle_delete.html +1 -0
  63. package/typedocs-generated/modules/sql_handle_insert.html +1 -0
  64. package/typedocs-generated/modules/sql_handle_select.html +1 -0
  65. package/typedocs-generated/modules/sql_handle_update.html +1 -0
  66. package/typedocs-generated/modules/sql_utils_join.util.html +1 -0
  67. package/typedocs-generated/modules/types.html +1 -1
  68. package/typedocs-generated/modules.html +1 -1
  69. package/typedocs-generated/types/sql_utils_join.util.JoinClause.html +1 -0
  70. package/dist/sql/handle.d.ts +0 -12
  71. package/dist/sql/handle.js +0 -119
  72. package/dist/test/js.test.d.ts +0 -1
  73. package/dist/test/js.test.js +0 -85
  74. package/dist/test/sql/delete.test.d.ts +0 -1
  75. package/dist/test/sql/delete.test.js +0 -79
  76. package/dist/test/sql/insert.test.d.ts +0 -1
  77. package/dist/test/sql/insert.test.js +0 -79
  78. package/dist/test/sql/select.test.d.ts +0 -1
  79. package/dist/test/sql/select.test.js +0 -59
  80. package/dist/test/sql/update.test.d.ts +0 -1
  81. package/dist/test/sql/update.test.js +0 -71
  82. package/src/sql/handle.ts +0 -129
  83. package/typedocs-generated/functions/sql_handle.handleCreate.html +0 -1
  84. package/typedocs-generated/functions/sql_handle.handleDelete.html +0 -1
  85. package/typedocs-generated/functions/sql_handle.handleDrop.html +0 -1
  86. package/typedocs-generated/functions/sql_handle.handleExists.html +0 -1
  87. package/typedocs-generated/functions/sql_handle.handleGet.html +0 -1
  88. package/typedocs-generated/functions/sql_handle.handleInsert.html +0 -1
  89. package/typedocs-generated/functions/sql_handle.handleSelect.html +0 -1
  90. package/typedocs-generated/functions/sql_handle.handleUpdate.html +0 -1
  91. package/typedocs-generated/functions/sql_handle.parseSelectClause.html +0 -1
  92. package/typedocs-generated/modules/sql_handle.html +0 -1
  93. package/typedocs-generated/modules/test_js.test.html +0 -1
  94. package/typedocs-generated/modules/test_sql_delete.test.html +0 -1
  95. package/typedocs-generated/modules/test_sql_insert.test.html +0 -1
  96. package/typedocs-generated/modules/test_sql_select.test.html +0 -1
  97. package/typedocs-generated/modules/test_sql_update.test.html +0 -1
@@ -0,0 +1,68 @@
1
+ import { parseReturn } from "#sql/utils";
2
+ import { parseWhere } from "#sql/where";
3
+ import { Opts } from "#types.js";
4
+ import { JoinToRelationsEngine } from "../utils/join.util.js";
5
+
6
+ export function handleSelect(
7
+ query: string,
8
+ opts?: Opts,
9
+ ) {
10
+ let whereClauseStr: string | undefined;
11
+ let mainQueryPart = query;
12
+
13
+ const whereIndex = query.toUpperCase().lastIndexOf(" WHERE ");
14
+ if (whereIndex !== -1) {
15
+ whereClauseStr = query.substring(whereIndex + 7).trim();
16
+ mainQueryPart = query.substring(0, whereIndex);
17
+ }
18
+
19
+ const match = mainQueryPart.match(/SELECT\s+(.+?)\s+FROM\s+([\w\/]+)((?:\s+JOIN\s+.+)*)?/i);
20
+ if (!match) throw new Error("Invalid SELECT syntax");
21
+
22
+ const columnsPart = match[1].trim();
23
+ const collection = match[2];
24
+ const joinPart = match[3] || "";
25
+ const whereClause = whereClauseStr ? parseWhere(whereClauseStr) : {};
26
+
27
+ const findOpts = parseSelectClause(columnsPart);
28
+
29
+ if (joinPart && opts?.defaultDbKey) {
30
+ const joinClauses = parseJoinClauses(joinPart);
31
+ const relationsEngine = new JoinToRelationsEngine(opts.defaultDbKey, opts.tableDbMap);
32
+ const relations = relationsEngine.buildRelations(joinClauses, collection);
33
+ const path = [opts.defaultDbKey, collection];
34
+ return parseReturn("relation-find", [path, whereClause, relations, findOpts]);
35
+ }
36
+
37
+ return parseReturn("find", [collection, whereClause, {}, findOpts]);
38
+ }
39
+
40
+ export function parseJoinClauses(joinPart: string): Record<string, string> {
41
+ const joinClauses: Record<string, string> = {};
42
+ const joinRegex = /\s+JOIN\s+([\w\/]+)(?:\s+AS\s+)?([\w\/]+)?\s+ON\s+([^\s]+)\s*=\s*([^\s]+)/gi;
43
+ let match;
44
+ while ((match = joinRegex.exec(joinPart)) !== null) {
45
+ const table = match[1];
46
+ const alias = match[2] || table;
47
+ const condition = `${match[3]} = ${match[4]}`;
48
+ joinClauses[alias] = condition;
49
+ }
50
+ return joinClauses;
51
+ }
52
+
53
+ export function parseSelectClause(selectClause: string): { select?: string[]; exclude?: string[] } {
54
+ selectClause = selectClause.trim();
55
+
56
+ if (selectClause === "*") return {};
57
+
58
+ const excludeMatch = selectClause.match(/\*\s+EXCLUDE\s+(.+)/i);
59
+ if (excludeMatch) {
60
+ return {
61
+ exclude: excludeMatch[1].split(/\s*,\s*/),
62
+ };
63
+ }
64
+
65
+ return {
66
+ select: selectClause.split(/\s*,\s*/),
67
+ };
68
+ }
@@ -0,0 +1,13 @@
1
+ import { parseReturn, parseSet } from "#sql/utils";
2
+ import { parseWhere } from "#sql/where";
3
+
4
+ export function handleUpdate(query: string) {
5
+ const match = query.match(/UPDATE\s+([\w\/]+)\s+SET\s+(.+)\s+WHERE\s+(.+)/i);
6
+ if (!match) throw new Error("Invalid UPDATE syntax");
7
+
8
+ const collection = match[1];
9
+ const setClause = parseSet(match[2]);
10
+ const whereClause = parseWhere(match[3]);
11
+
12
+ return parseReturn("update", [collection, whereClause, setClause]);
13
+ }
package/src/sql/index.ts CHANGED
@@ -1,23 +1,22 @@
1
- import { ValtheraParser } from "../types";
2
- import {
3
- handleCreate,
4
- handleDelete,
5
- handleDrop,
6
- handleExists,
7
- handleGet,
8
- handleInsert,
9
- handleSelect,
10
- handleUpdate
11
- } from "./handle";
1
+ import { Opts, ValtheraParser } from "../types";
2
+ import { handleCreate, handleDrop, handleExists, handleGet } from "./handle/collection";
3
+ import { handleDelete } from "./handle/delete";
4
+ import { handleInsert } from "./handle/insert";
5
+ import { handleSelect } from "./handle/select";
6
+ import { handleUpdate } from "./handle/update";
12
7
 
13
8
  class SQLParser implements ValtheraParser {
14
- parse(query: string) {
9
+ parse(
10
+ query: string,
11
+ opts?: Opts
12
+ ) {
15
13
  query = query.replace(/\s+/g, " ").trim();
14
+ if (query.endsWith(";")) query = query.slice(0, -1);
16
15
  const tokens = query.split(/\s+/);
17
16
  const method = tokens[0].toUpperCase();
18
17
 
19
18
  if (method === "SELECT") {
20
- return handleSelect(query);
19
+ return handleSelect(query, opts);
21
20
  } else if (method === "INSERT") {
22
21
  return handleInsert(query);
23
22
  } else if (method === "UPDATE") {
@@ -0,0 +1,73 @@
1
+ import { RelationTypes } from "@wxn0brp/db-core";
2
+ export type JoinClause = Record<string, string>;
3
+
4
+ export class JoinToRelationsEngine {
5
+ private knownForeignKeys: Set<string> = new Set();
6
+
7
+ constructor(
8
+ private defaultDbKey: string,
9
+ private tableDbMap?: Record<string, string>
10
+ ) { }
11
+
12
+ private identifyPkFk(left: string, right: string, mainTable: string, knownFks: Set<string>): { pk: string, fk: string } {
13
+ const [leftTable, leftField] = left.split(".");
14
+ const [rightTable, rightField] = right.split(".");
15
+
16
+ // Check if one of the fields is already known as a foreign key
17
+ const leftFull = `${leftTable}.${leftField}`;
18
+ const rightFull = `${rightTable}.${rightField}`;
19
+
20
+ if (knownFks.has(leftFull))
21
+ return { pk: right, fk: left };
22
+ else if (knownFks.has(rightFull))
23
+ return { pk: left, fk: right };
24
+
25
+ // If either of the above conditions are met, use a heuristic: set pk to the field named "id" or "_id"
26
+ if (leftField === "id" || leftField === "_id") {
27
+ return { pk: left, fk: right };
28
+ } else if (rightField === "id" || rightField === "_id") {
29
+ return { pk: right, fk: left };
30
+ }
31
+
32
+ if (leftTable === mainTable)
33
+ return { pk: left, fk: right };
34
+ else if (rightTable === mainTable)
35
+ return { pk: right, fk: left };
36
+
37
+ // If still unsure, throw an error
38
+ throw new Error(`Cannot determine pk/fk from condition: "${left} = ${right}"`);
39
+ }
40
+
41
+ public buildRelations(
42
+ joinClauses: JoinClause,
43
+ mainTable: string
44
+ ): RelationTypes.Relation {
45
+ const relations: RelationTypes.Relation = {};
46
+ const knownFks = new Set(this.knownForeignKeys);
47
+
48
+ for (const [alias, condition] of Object.entries(joinClauses)) {
49
+ const [left, right] = condition.split(/\s*=\s*/);
50
+
51
+ const { pk, fk } = this.identifyPkFk(left, right, mainTable, knownFks);
52
+
53
+ const [pkTable, pkField] = pk.split(".");
54
+ const [fkTable, fkField] = fk.split(".");
55
+
56
+ knownFks.add(`${fkTable}.${fkField}`);
57
+
58
+ const dbKey = this.tableDbMap?.[fkTable] || this.defaultDbKey;
59
+
60
+ relations[alias] = {
61
+ type: "1n",
62
+ path: [dbKey, fkTable],
63
+ pk: pkField,
64
+ fk: fkField,
65
+ as: alias,
66
+ };
67
+ }
68
+
69
+ this.knownForeignKeys = knownFks;
70
+
71
+ return relations;
72
+ }
73
+ }
package/src/sql/where.ts CHANGED
@@ -109,6 +109,9 @@ export function parseWhere(where: string): QueryObject {
109
109
  }
110
110
 
111
111
  let key = token;
112
+ if (key.includes(".")) {
113
+ key = key.split(".").pop()!;
114
+ }
112
115
  let opToken = tokens[++i]?.trim();
113
116
  let value: any = tokens[++i]?.trim();
114
117
 
package/src/types.ts CHANGED
@@ -3,6 +3,14 @@ export interface ValtheraQuery {
3
3
  args: any[];
4
4
  }
5
5
 
6
+ export interface Opts {
7
+ defaultDbKey: string;
8
+ tableDbMap?: Record<string, string>;
9
+ }
10
+
6
11
  export interface ValtheraParser {
7
- parse(query: string): ValtheraQuery;
12
+ parse(
13
+ query: string,
14
+ opts?: Opts,
15
+ ): ValtheraQuery;
8
16
  }
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from "bun:test";
2
- import { ValtheraDbParsers } from "..";
2
+ import { ValtheraDbParsers } from "#index";
3
3
 
4
4
  const jsParser = new ValtheraDbParsers.js();
5
5
 
@@ -1,7 +1,7 @@
1
+ import SQLParser from "#sql";
1
2
  import { describe, expect, test } from "bun:test";
2
- import { ValtheraDbParsers } from "../..";
3
3
 
4
- const sqlParser = new ValtheraDbParsers.sql();
4
+ const sqlParser = new SQLParser();
5
5
 
6
6
  describe("SQL Parser - DELETE", () => {
7
7
  test("should parse a simple DELETE query", () => {
@@ -0,0 +1,17 @@
1
+ import SQLParser from "#sql";
2
+ import { describe, expect, test } from "bun:test";
3
+
4
+ const sqlParser = new SQLParser();
5
+
6
+ describe("SQL Parser - SELECT", () => {
7
+ test("should parse with ;", () => {
8
+ const query = "SELECT * FROM users WHERE id = 1;";
9
+ const parsedQuery = sqlParser.parse(query);
10
+
11
+ expect(parsedQuery).toBeDefined();
12
+ expect(parsedQuery.method).toBe("find");
13
+ expect(parsedQuery.args).toHaveLength(4);
14
+ expect(parsedQuery.args[0]).toBe("users"); // collection name
15
+ expect(parsedQuery.args[1]).toEqual({ id: 1 }); // where clause
16
+ });
17
+ });
@@ -1,7 +1,7 @@
1
+ import SQLParser from "#sql";
1
2
  import { describe, expect, test } from "bun:test";
2
- import { ValtheraDbParsers } from "../..";
3
3
 
4
- const sqlParser = new ValtheraDbParsers.sql();
4
+ const sqlParser = new SQLParser();
5
5
 
6
6
  describe("SQL Parser - INSERT", () => {
7
7
  test("should parse a simple INSERT query", () => {
@@ -1,7 +1,7 @@
1
+ import SQLParser from "#sql";
1
2
  import { describe, expect, test } from "bun:test";
2
- import { ValtheraDbParsers } from "../..";
3
3
 
4
- const sqlParser = new ValtheraDbParsers.sql();
4
+ const sqlParser = new SQLParser();
5
5
 
6
6
  describe("SQL Parser - SELECT", () => {
7
7
  test("should parse a simple SELECT query", () => {
@@ -61,6 +61,27 @@ describe("SQL Parser - SELECT", () => {
61
61
  expect(parsedQuery.args[1]).toEqual({ $gt: { age: 18 }, status: "active" }); // where clause
62
62
  });
63
63
 
64
+ test("should parse a SELECT query with a JOIN clause", () => {
65
+ const query = "SELECT posts.*, users.name FROM posts JOIN users ON posts.userId = users.id WHERE posts.id = 1";
66
+ const parsedQuery = sqlParser.parse(query, { defaultDbKey: "db" });
67
+
68
+ expect(parsedQuery).toBeDefined();
69
+ expect(parsedQuery.method).toBe("relation-find");
70
+ expect(parsedQuery.args).toHaveLength(4);
71
+ expect(parsedQuery.args[0]).toEqual(["db", "posts"]); // path
72
+ expect(parsedQuery.args[1]).toEqual({ id: 1 }); // where clause
73
+ expect(parsedQuery.args[2]).toEqual({
74
+ users: {
75
+ type: '1n',
76
+ path: ['db', 'posts'],
77
+ pk: 'id',
78
+ fk: 'userId',
79
+ as: 'users'
80
+ }
81
+ }); // relations
82
+ expect(parsedQuery.args[3]).toEqual({ select: ["posts.*", "users.name"] }); // select options
83
+ });
84
+
64
85
  test("should throw error for invalid SELECT syntax", () => {
65
86
  const query = "SELECT FROM users";
66
87
 
@@ -1,7 +1,7 @@
1
+ import SQLParser from "#sql";
1
2
  import { describe, expect, test } from "bun:test";
2
- import { ValtheraDbParsers } from "../..";
3
3
 
4
- const sqlParser = new ValtheraDbParsers.sql();
4
+ const sqlParser = new SQLParser();
5
5
 
6
6
  describe("SQL Parser - UPDATE", () => {
7
7
  test("should parse a simple UPDATE query", () => {
@@ -0,0 +1,42 @@
1
+ import { JoinClause, JoinToRelationsEngine } from "#sql/utils/join.util";
2
+ import { describe, expect, test } from "bun:test";
3
+
4
+ describe("SQL Utils - Join", () => {
5
+ test("works", () => {
6
+ const joinClauses: JoinClause = {
7
+ comments: "posts.id = comments.post_id",
8
+ users: "comments.user_id = users.id",
9
+ tags: "posts.id = tags.post_id"
10
+ };
11
+
12
+ const engine = new JoinToRelationsEngine(
13
+ "defaultDb",
14
+ { comments: "blogDb", users: "userDb" }
15
+ );
16
+
17
+ const relations = engine.buildRelations(joinClauses, "posts");
18
+
19
+ expect(relations).toBeDefined();
20
+ expect(relations.comments).toEqual({
21
+ type: "1n",
22
+ path: ["blogDb", "comments"],
23
+ pk: "id",
24
+ fk: "post_id",
25
+ as: "comments",
26
+ })
27
+ expect(relations.users).toEqual({
28
+ type: "1n",
29
+ path: ["blogDb", "comments"],
30
+ pk: "id",
31
+ fk: "user_id",
32
+ as: "users",
33
+ })
34
+ expect(relations.tags).toEqual({
35
+ type: "1n",
36
+ path: ["defaultDb", "tags"],
37
+ pk: "id",
38
+ fk: "post_id",
39
+ as: "tags",
40
+ })
41
+ });
42
+ });
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "ES2022",
4
+ "target": "ES2022",
5
+ "moduleResolution": "bundler",
6
+ "paths": {
7
+ "#*": [
8
+ "../src/*"
9
+ ]
10
+ },
11
+ "esModuleInterop": true,
12
+ "skipLibCheck": true,
13
+ "outDir": "./dist",
14
+ "declaration": true
15
+ },
16
+ "include": [
17
+ "."
18
+ ]
19
+ }
package/tsconfig.json CHANGED
@@ -3,7 +3,11 @@
3
3
  "module": "ES2022",
4
4
  "target": "ES2022",
5
5
  "moduleResolution": "bundler",
6
- "paths": {},
6
+ "paths": {
7
+ "#*": [
8
+ "./src/*"
9
+ ]
10
+ },
7
11
  "esModuleInterop": true,
8
12
  "skipLibCheck": true,
9
13
  "outDir": "./dist",
@@ -11,7 +15,7 @@
11
15
  "declaration": true
12
16
  },
13
17
  "include": [
14
- "./src"
18
+ "./src"
15
19
  ],
16
20
  "exclude": [
17
21
  "node_modules"
@@ -20,4 +24,4 @@
20
24
  "resolveFullPaths": true,
21
25
  "verbose": false
22
26
  }
23
- }
27
+ }
@@ -0,0 +1,76 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>404 - Page Not Found</title>
8
+ <style>
9
+ body {
10
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
11
+ display: flex;
12
+ justify-content: center;
13
+ align-items: center;
14
+ min-height: 100vh;
15
+ margin: 0;
16
+ background-color: #121212;
17
+ color: #e0e0e0;
18
+ text-align: center;
19
+ }
20
+
21
+ .container {
22
+ padding: 20px;
23
+ border-radius: 8px;
24
+ background-color: #1e1e1e;
25
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
26
+ }
27
+
28
+ h1 {
29
+ font-size: 3em;
30
+ color: #cf6679;
31
+ margin-bottom: 10px;
32
+ }
33
+
34
+ p {
35
+ font-size: 1.2em;
36
+ margin-bottom: 20px;
37
+ }
38
+
39
+ a {
40
+ color: #bb86fc;
41
+ text-decoration: none;
42
+ }
43
+
44
+ a:hover {
45
+ text-decoration: underline;
46
+ }
47
+
48
+ #go-back {
49
+ background-color: #03dac6;
50
+ color: #121212;
51
+ border: none;
52
+ padding: 10px 20px;
53
+ border-radius: 4px;
54
+ cursor: pointer;
55
+ font-size: 1em;
56
+ margin-top: 10px;
57
+ }
58
+ </style>
59
+ </head>
60
+
61
+ <body>
62
+ <div class="container">
63
+ <h1>404</h1>
64
+ <p>Oops! The page you're looking for doesn't exist.</p>
65
+ <p>You might have mistyped the address or the page may have moved.</p>
66
+ <p><a id="home-link" href="/">Go to Homepage</a></p>
67
+ <button onclick="history.back()" id="go-back">Go Back</button>
68
+ </div>
69
+
70
+ <script type="module">
71
+ const segments = window.location.pathname.split("/").filter(Boolean);
72
+ document.querySelector("#home-link").href = "/" + (segments.length > 1 ? segments[0] : "");
73
+ </script>
74
+ </body>
75
+
76
+ </html>
@@ -1 +1 @@
1
- window.hierarchyData = "eJyVjssKwjAQRf/lrtNKBEObr3DlRoqEZkqjaaqZFBTpv0t9FF0IupnFzL3nzBWx7xNDb6WqBCI1nurk+sDQV0g1zWA6gsbG+NRSNGsTmSIEDi5Y6OVKCQzRQ8OFRLExNfEiXY7E+Wclb1PnIVB7wwyNxDabGNncm46t8zZSgN6qUhSyGgVU+faGpcYMPs1+uSxe/juYeLHn/Jn6qnwsRoFC/sfmk9+5YOn8q2Icb1X9dqM="
1
+ window.hierarchyData = "eJyVjssKwjAQRf/lrmPLCIrJV7hyI0VCM6XRmGomgiL9d6mPogtBN7OYmXvuuSJ1XRaYNelKIXETuM6+iwJzBelhRrtnGKxsyC0nu7RJOEFh56ODmc7mCqcUYOBj5tTYmqXMlwNL8Rkp2rwPUKiDFYFBFjcZGJMxNxxbH1ziCLPWWhFR1Svodw/HjT2FPArQdPESuJNZyq0Uz6+vnY9Fr0BE/8HlGDY+Oj7/2tH3Nx6zdwM="
@@ -6,7 +6,7 @@
6
6
  --light-hl-2: #A31515;
7
7
  --dark-hl-2: #CE9178;
8
8
  --light-hl-3: #AF00DB;
9
- --dark-hl-3: #CE92A4;
9
+ --dark-hl-3: #C586C0;
10
10
  --light-hl-4: #001080;
11
11
  --dark-hl-4: #9CDCFE;
12
12
  --light-hl-5: #0000FF;
@@ -1 +1 @@
1
- window.navigationData = "eJyl1slOwzAQBuB3MdeKpS0Iei2o4sYi4IAq5MZTxcW4wXagCPHuKJ6qsbPUg7jGf77MOBkrz9/MwcaxCWMDVnCXswl7W4tSgT06zN2bYgP2KrVgk+GAZblUwoBmk+fdbY9cuRwMv1zccGPB2Nr54EbyhZdaqdgeDX8GHeIdKO7kWqfMXa6lzgNXagGbdpf+8n9bbWMHH9u0WBS7NPLjk4vx6HhMbXmvbYJ8rIetrzq4lSU1LWDJS+Xq+zPFrcX7t2uxczI8j55t36u1LjrnWihoV2bf1QuukSrE6NQAdwG2LHXmNybigmhsn4WvA2OXoIAoYjQtmnVB88y6SGpXG2mdJXkYTYozcCRuBi5pXWsLhsZhNCneg4KMJmI0KT4UgvrNYHSP6IccnztVvLQptpVv2YSzq/Lo51fvKNcMaaJLJ1XHgVIpfolUjO//DlxpdN9OIRYE09vf+3kE1n3H1xu295mD6TmV/BK9vadYiitCq8511BRW5cC6nnN0ZQ+3q42Sq6sv29VG1aQDWuCxtgevGglS/Q+ROOMJKkjtqReHO0EFqX6qxKlOUEGqSTXe0VcBHYPhL//pDwP/L2pJagdmybMdFgcb9ulZx6/FbQnmiyD6XBuc/8x/AWLth2k="
1
+ window.navigationData = "eJylll9P2zAUxb+L9xoxGgobfaUIbS/bgLEHVFVufLuYGSfYDhQhvvsUu03sxHEc8Rqf8/O5vv6T+zekYKfQAqEElVjlaIEeC1IxkJ+PcvXIUIL+UU7QIk1QllNGBHC0uG9sd5ipHARebn5iIUHIlvOMBcUbTeqpXPZJ+p54iNfAsKIFH2M2uh51ZXEpJ7DrV6k/f7TUPuzT815NNmWjNvj57Hx+cjyPLTnIFpbepdulP3hwDzKqaAJbXDHV+jOGpTT+/ZjLmaVfnbnlUz3mQ+eYEwYDg1nBGGR1af3o8omtjXndyqKqMa4LAVhBy91WXCMGyZbLnebM7qKRLUVRTkXXnlHw5Y5KJaeijWsUfgVqKvkKVA9rN54AA3uVPd0zkgmdW3aY3qQHquUIBqVcglDBoEYyIei3DtMb9EC1HMGgEuoOBIMayYSgNx2mN+iBajkCO0rfd98Lyi8YriSMbdk9vOsam8DEMOIJM9i24GJXJcEj29dIJiz27w7Tm/ZAtRyeoBEvW82Mf90GL/oWE3XfV4oyz3NTU/RQVBjdqmtQleBDq2VglnB8wwxuc4t147nVrIe0oPyoVgcKXDeiqFLrLX9bNO/+Jf9LOfi70MV7rf3uJM5c3ROjXssA3ndQ0uPzL7PTtLMJX3IQA8dFD8X3/Y9LcltlWK1u5Gjo6vqp9OeoRD9K+82lXIHY4qxB1MMdzumZ58/O/DEGQK4wBvmrAvEaQdS6PnD1vvoPAUgwPQ=="
@@ -1 +1 @@
1
- window.searchData = "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";
1
+ window.searchData = "eJytmttu2zgQht+FuRUc8yCfbpui6C4Wu9vudi+MIJAtpnGqSK4kpy2MvHtBirJmzJFMZXuVwOb8c+A3FEX6yMriW8VW6yP7sstTtpIiYnnypNmKfUqy+kGXyc3mr6SsdFmxiB3KjK3Yc1Lukk2mq+uJN2jyUD9lLGLbLKkqXbEVYxHbJ6XOa/P/S9R64lOhTr4eR4hf2cG0PmFyd1f/2Os+x9XXbITnZvTrXZPV/aCzpN4V+YUSnIYFV7hztstT/f0k/1SkByNuPyXUOgXFl0pOVQASvubVsxucbvanwXTMTXghbv1aDTouwfAw14JCsvXxSNUegCUWJ+tU3yeHrD5JOAMj4b4ansbHCgjHvAtrW+RVXR62dVFeEr/CY/sctTawClPVpWJn76KvdtQYL7ALrx+SPM309bbIMr01k+aVv/qa3TWj7rpRgzMy6xhqDN+UOqm7ZO4PuRXp1QZGw/NFZzAQyU1Z7EfGYUx+cRRvv++quhoZR2P0iyN5p+uRYbzTF3roUgwkf6nONCCEYK8ZMY67G6xKJtjqAoPg/FzUF3Lb5ZUu66HcmhHjcnuPVcncWl1gEJybi/pCbpU2EzyUWzNiXG4fsSqZW6sLDIJzc1GTEdgV9bdil7/JkoNRCYni3OjXRdJk1siGhwKtXh8LOeOHfZoMd2ozYtyM/4tVyQRbXWAQnJuLui83eqdmfF/erYXsPzqloG1IF9L43QjtKmhTcnL7ur1Jj+fhLcqgTzRHh3qX+ZtD49R+E8qbDeeDrg9l3oNbIwfGXZ6sJrahLu5bzYCzjyFP1nNPRI2uH4tdPjH/9lfr7jQmmG2zvP1TnF4F3uafdzkNwbkH0jIwVZDM63ohPJjgHjkLjJbs653NYZel/gvVK0O2apfft14X9XLOY4Hm/+w5ZN6z+0MOffz0zzOG+9uDLukHj/1m1ALwH9LCLdmodcMuZ9BERsVtK+TFbD8djFfEs5PGn3vwrrDLa13eJ9uTivl2OMImhp6TGLfq3mx+1z8CnFy58enmix0/4NEa9bmtzUHLzeaPZB/i1I5ON0929AiXsIrtaUZzhNLvFY8bV9mBh2SInwuPSsruQrJ/H3Q5MK1o2P+AKCk/DxDqe7lyBiF5Nin0OH7S9UORjnJ9Mhnh/DZyJ1arI3vWZWVeaFdMTORkySJ2v9NZak5zm6giti2enoxaxNJie7D/3rphn7R5upjBzejrKYvW00gsJ8t4fnsbrVtj+4X9oNXoPrGGnEVrThlyz5AjQ8GitYhkPJnOZshQeIYCGUoWrSXlUXqGEhkqFq0V5VF5hgoZxn3FiT3DGBnO+kKdeYYzZDjvq+rcM5wjwwWL1jFluPAMF8hwyaL1LBKzSbyUyHDpGS4xAIaHOWXJfXb4GTwGiQU1JZzAB/PDDRVL0tYniGOEuAGDT0ljnyKOMeIGDs5JY58kjlHiBhBOcs99mjjGiRtIuCSNfaI4Ropbpkj+uU8Vx1hxAwuPSWOfLI7R4gYYPiONfbo4xksYYvicXCh8vgTmS9jViQRM+ICJswXKMMNJwgSxRmHChGFGkIQJnzCBCROGGUESJnzCBCZMGGYEvbL6hAlMmDDMCJIw4RMmMGFi3rf4CB8wgQETi771R/h8CcyXWPatQMLHS2C8pAFGkF0hfbwkxksaYATZFdLHS2K8pH0Akl0hfbzk2TPQ4kV2hSQegxgvafEiu0L6eEmMl4z7Jkr6dElMl7R0kR0lfbokpksaYCTZUdLHS2K8pCFGkh0lfb4k5ksaZCTZUdIHTGLAlEFGkh2lfMAUBkwZZCS9Z/EBUxgwZZCRJJ3KB0xhwJTdZZF0Kh8wdbbRMshIkk5F7LUwYCru62blA6YwYMpuuEiylQ+YwoApCxhJp/IBUxgwZZBRJJ3KB8x9ZPfzz7qsdfq+2dev1+4l5sju3FZfLtvXjCNTc7Y6vrx0W/vV8QXs7s13xs/5aUwnJoCYnAWJodOoTmnWCS0bS7Fo/so4SPd0Rt1pxp2m0xJhCePTAFA7oKhEkFRzUL91N8WdFCgcH6PU3ih2SlwBqbD8nJS9NAZCUyAkRwhpd+8LpDiQUiOkPms0g92B6JHxMA4anfZyEkgBwvhyhFR7FwikFp2U4COk2ksm0EAgQRGWoLvU6TTA/IeV2pxJbt2RJ4AbTL8M48gI1cVpZdDu7BykByolA4PDIIFJawzCImuPQ0CVQHpqESRS7DHVElY6bN7d0VenMQcJTd2i5BY8FTb/VrKbQlwusKyIsGWl+TmVuzgCMweWOjki16ZbfLoEKL8IW1ycHmo9AbpYjkjQHbKDuQSNJ8OWA/t7PRAKSCjUnvpdUqcImoWHlZz4qQmAQQK9sIcz8fMOoAeQ4GEdRPykAuiBXhDTsXrEWgoWCxG22IBLcqAD6ibC6+YucoEOWC5keH7eZSdQBBWTYU0EbpgA/KBSMmwm4V0FEALtqMICcldHQAOUW4WVifgxaKcHFhq3wIatq+QPPUGYoGSNQhgarezeXdAARTCbKozXVuxrcwECtMDaoQICu43YfrfXmXler9a3Ly8/AbG3+80=";
@@ -1595,9 +1595,9 @@
1595
1595
  .container-main {
1596
1596
  grid-template-columns:
1597
1597
  minmax(0, 1fr) minmax(0, 2.5fr) minmax(
1598
- 0,
1599
- 20rem
1600
- );
1598
+ 0,
1599
+ 20rem
1600
+ );
1601
1601
  grid-template-areas: "sidebar content toc";
1602
1602
  }
1603
1603
 
@@ -1,3 +1,3 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @wxn0brp/db-string-query</title><meta name="description" content="Documentation for @wxn0brp/db-string-query"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@wxn0brp/db-string-query</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="../modules/sql_index.html">sql/index</a></li><li><a href="" aria-current="page">default</a></li></ul><h1>Class default</h1></div><section class="tsd-panel"><h4>Implements</h4><ul class="tsd-hierarchy"><li><a href="../interfaces/types.ValtheraParser.html" class="tsd-signature-type tsd-kind-interface">ValtheraParser</a></li></ul></section><aside class="tsd-sources"><ul><li>Defined in sql/index.ts:13</li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h5 class="tsd-index-heading uppercase">Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Constructors</h3><div class="tsd-index-list"><a href="#constructor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Constructor"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @wxn0brp/db-string-query</title><meta name="description" content="Documentation for @wxn0brp/db-string-query"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@wxn0brp/db-string-query</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="../modules/sql_index.html">sql/index</a></li><li><a href="" aria-current="page">default</a></li></ul><h1>Class default</h1></div><section class="tsd-panel"><h4>Implements</h4><ul class="tsd-hierarchy"><li><a href="../interfaces/types.ValtheraParser.html" class="tsd-signature-type tsd-kind-interface">ValtheraParser</a></li></ul></section><aside class="tsd-sources"><ul><li>Defined in sql/index.ts:8</li></ul></aside><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h5 class="tsd-index-heading uppercase">Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Constructors</h3><div class="tsd-index-list"><a href="#constructor" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Constructor"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a>
2
2
  </div></section><section class="tsd-index-section"><h3 class="tsd-index-heading">Methods</h3><div class="tsd-index-list"><a href="#parse" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>parse</span></a>
3
- </div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h2>Constructors</h2></summary><section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="constructor"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link" id="constructordefault"><span class="tsd-signature-keyword">new</span> <span class="tsd-kind-constructor-signature">default</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <a href="" class="tsd-signature-type tsd-kind-class">default</a><a href="#constructordefault" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></div><div class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="" class="tsd-signature-type tsd-kind-class">default</a></h4></div></li></ul></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h2>Methods</h2></summary><section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="parse"><span>parse</span><a href="#parse" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link" id="parse-1"><span class="tsd-kind-call-signature">parse</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">query</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <a href="../interfaces/types.ValtheraQuery.html" class="tsd-signature-type tsd-kind-interface">ValtheraQuery</a><a href="#parse-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></div><div class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">query</span>: <span class="tsd-signature-type">string</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="../interfaces/types.ValtheraQuery.html" class="tsd-signature-type tsd-kind-interface">ValtheraQuery</a></h4><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.ValtheraParser.html">ValtheraParser</a>.<a href="../interfaces/types.ValtheraParser.html#parse">parse</a></p><ul><li>Defined in sql/index.ts:14</li></ul></aside></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Constructor"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#parse"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>parse</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@wxn0brp/db-string-query</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
3
+ </div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h2>Constructors</h2></summary><section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="constructor"><span>constructor</span><a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link" id="constructordefault"><span class="tsd-signature-keyword">new</span> <span class="tsd-kind-constructor-signature">default</span><span class="tsd-signature-symbol">()</span><span class="tsd-signature-symbol">:</span> <a href="" class="tsd-signature-type tsd-kind-class">default</a><a href="#constructordefault" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></div><div class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="" class="tsd-signature-type tsd-kind-class">default</a></h4></div></li></ul></section></section></details><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h2>Methods</h2></summary><section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="parse"><span>parse</span><a href="#parse" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link" id="parse-1"><span class="tsd-kind-call-signature">parse</span><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">query</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">,</span> <span class="tsd-kind-parameter">opts</span><span class="tsd-signature-symbol">?:</span> <a href="../interfaces/types.Opts.html" class="tsd-signature-type tsd-kind-interface">Opts</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <a href="../interfaces/types.ValtheraQuery.html" class="tsd-signature-type tsd-kind-interface">ValtheraQuery</a><a href="#parse-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></div><div class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">query</span>: <span class="tsd-signature-type">string</span></span></li><li><span><code class="tsd-tag">Optional</code><span class="tsd-kind-parameter">opts</span>: <a href="../interfaces/types.Opts.html" class="tsd-signature-type tsd-kind-interface">Opts</a></span></li></ul></div><h4 class="tsd-returns-title">Returns <a href="../interfaces/types.ValtheraQuery.html" class="tsd-signature-type tsd-kind-interface">ValtheraQuery</a></h4><aside class="tsd-sources"><p>Implementation of <a href="../interfaces/types.ValtheraParser.html">ValtheraParser</a>.<a href="../interfaces/types.ValtheraParser.html#parse">parse</a></p><ul><li>Defined in sql/index.ts:9</li></ul></aside></div></li></ul></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Constructors"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Constructors</summary><div><a href="#constructor"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Constructor"><use href="../assets/icons.svg#icon-512"></use></svg><span>constructor</span></a></div></details><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Methods"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Methods</summary><div><a href="#parse"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Method"><use href="../assets/icons.svg#icon-2048"></use></svg><span>parse</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@wxn0brp/db-string-query</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>