@xansql/bridge 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base.cjs.map +1 -1
- package/base.js.map +1 -1
- package/dialect.cjs +99 -0
- package/dialect.cjs.map +1 -0
- package/dialect.d.ts +13 -0
- package/dialect.js +97 -0
- package/dialect.js.map +1 -0
- package/index.cjs +5 -94
- package/index.cjs.map +1 -1
- package/index.d.ts +3 -13
- package/index.js +2 -96
- package/index.js.map +1 -1
- package/package.json +7 -5
- package/server.cjs +1 -1
- package/server.cjs.map +1 -1
- package/server.d.ts +1 -1
- package/server.js +1 -1
- package/server.js.map +1 -1
- package/types.d.ts +11 -1
package/base.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.cjs","sources":["../src/base.ts"],"sourcesContent":["import { crypto } from \"securequ\";\r\nimport { Xansql, Foreign } from \"@xansql/core\";\r\n\r\nlet secretCache: string | null = null;\r\nexport const makeSecret = async (xansql: Xansql) => {\r\n if (secretCache) return secretCache;\r\n const models = xansql.models\r\n let uid = []\r\n for (let model of models.values()) {\r\n uid.push(model.table)\r\n for (let column in model.schema) {\r\n const field = model.schema[column]\r\n if (!Foreign.isArray(model.schema[column])) {\r\n uid.push(column)\r\n const meta = field.meta || {}\r\n const keys = Object.keys(meta)\r\n if (keys.length) {\r\n keys.sort()\r\n uid.push(...keys)\r\n }\r\n }\r\n }\r\n }\r\n uid = Array.from(new Set(uid)) // unique\r\n uid = uid.sort()\r\n\r\n secretCache = await crypto.hash(uid.join(\"\"))\r\n return secretCache;\r\n}\r\n\r\nexport const makePath = async (path: string, xansql: Xansql) => {\r\n const secret = await makeSecret(xansql)\r\n const gen = `/${await crypto.hash(path + secret)}`\r\n return gen;\r\n}\r\n\r\n\r\nexport type XansqlBridgeAction =\r\n | \"SELECT\"\r\n | \"INSERT\"\r\n | \"UPDATE\"\r\n | \"DELETE\"\r\n | \"DROP\"\r\n | \"ALTER\"\r\n | \"CREATE\"\r\n | \"TRUNCATE\"\r\n | \"REPLACE\"\r\n | \"DESCRIBE\"\r\n | \"SHOW\"\r\n | \"USE\"\r\n | \"UNKNOWN\";\r\n\r\nexport interface SqlParserResult {\r\n action: XansqlBridgeAction;\r\n table: string | null;\r\n}\r\n\r\nexport const sqlparser = (sql: string): SqlParserResult => {\r\n const normalized = sql.trim().replace(/\\s+/g, \" \");\r\n\r\n // Detect the primary verb (first SQL keyword)\r\n const verbMatch = normalized.match(\r\n /^(SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|REPLACE|DESCRIBE|DESC|SHOW|USE)\\b/i\r\n );\r\n\r\n let verb: XansqlBridgeAction = \"UNKNOWN\";\r\n\r\n if (verbMatch) {\r\n const v = verbMatch[1].toUpperCase();\r\n verb = v === \"DESC\" ? \"DESCRIBE\" : (v as XansqlBridgeAction);\r\n }\r\n\r\n // Matches identifiers: table, `table`, \"table\", [table]\r\n const IDENT = `([\\\\\\`\"\\\\[]?)([A-Za-z0-9_.-]+)\\\\1`;\r\n\r\n const extractTable = (): string | null => {\r\n switch (verb) {\r\n case \"SELECT\": {\r\n // 1. Normal SELECT ... FROM table\r\n const normal = normalized.match(/\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i);\r\n if (normal && normal[2] !== \"(\") {\r\n return normal[2]; // real table\r\n }\r\n\r\n // 2. Extract real tables inside a subquery: SELECT ... FROM ( SELECT ... FROM table )\r\n const inner = normalized.match(\r\n /\\(\\s*SELECT[\\s\\S]+?\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i\r\n );\r\n if (inner) return inner[2];\r\n\r\n return null;\r\n }\r\n case \"INSERT\": {\r\n const match = new RegExp(`\\\\bINTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"UPDATE\": {\r\n const match = new RegExp(`^UPDATE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"DELETE\": {\r\n const match = new RegExp(`\\\\bFROM\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // CREATE TABLE tableName\r\n case \"CREATE\": {\r\n const match = new RegExp(`\\\\bCREATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DROP TABLE tableName\r\n case \"DROP\": {\r\n const match = new RegExp(`\\\\bDROP\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // ALTER TABLE tableName\r\n case \"ALTER\": {\r\n const match = new RegExp(`\\\\bALTER\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // TRUNCATE TABLE tableName\r\n case \"TRUNCATE\": {\r\n const match = new RegExp(`\\\\bTRUNCATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // REPLACE INTO tableName\r\n case \"REPLACE\": {\r\n const match = new RegExp(`\\\\bREPLACE\\\\s+INTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DESCRIBE tableName\r\n case \"DESCRIBE\": {\r\n const match = new RegExp(`\\\\b(DESCRIBE|DESC)\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // SHOW TABLES / SHOW DATABASES => no table\r\n case \"SHOW\": {\r\n const match = new RegExp(`\\\\bSHOW\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null; // e.g. SHOW TABLES\r\n }\r\n\r\n // USE databaseName\r\n case \"USE\": {\r\n const match = new RegExp(`\\\\bUSE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return {\r\n action: verb,\r\n table: extractTable(),\r\n };\r\n};\r\n"],"names":["Foreign","crypto"],"mappings":";;;;;AAGA,IAAI,WAAW,GAAkB,IAAI;MACxB,UAAU,GAAG,OAAO,MAAc,KAAI;AAChD,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,WAAW;AACnC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;IAC5B,IAAI,GAAG,GAAG,EAAE;IACZ,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;AAChC,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACrB,QAAA,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;YAC9B,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"base.cjs","sources":["../src/base.ts"],"sourcesContent":["import { crypto } from \"securequ\";\r\nimport { Xansql, Foreign } from \"@xansql/core\";\r\n\r\nlet secretCache: string | null = null;\r\nexport const makeSecret = async (xansql: Xansql) => {\r\n if (secretCache) return secretCache;\r\n const models = xansql.models\r\n let uid = []\r\n for (let model of models.values()) {\r\n uid.push(model.table)\r\n for (let column in model.schema) {\r\n const field: any = model.schema[column]\r\n if (!Foreign.isArray(model.schema[column])) {\r\n uid.push(column)\r\n const meta = field.meta || {}\r\n const keys = Object.keys(meta)\r\n if (keys.length) {\r\n keys.sort()\r\n uid.push(...keys)\r\n }\r\n }\r\n }\r\n }\r\n uid = Array.from(new Set(uid)) // unique\r\n uid = uid.sort()\r\n\r\n secretCache = await crypto.hash(uid.join(\"\"))\r\n return secretCache;\r\n}\r\n\r\nexport const makePath = async (path: string, xansql: Xansql) => {\r\n const secret = await makeSecret(xansql)\r\n const gen = `/${await crypto.hash(path + secret)}`\r\n return gen;\r\n}\r\n\r\n\r\nexport type XansqlBridgeAction =\r\n | \"SELECT\"\r\n | \"INSERT\"\r\n | \"UPDATE\"\r\n | \"DELETE\"\r\n | \"DROP\"\r\n | \"ALTER\"\r\n | \"CREATE\"\r\n | \"TRUNCATE\"\r\n | \"REPLACE\"\r\n | \"DESCRIBE\"\r\n | \"SHOW\"\r\n | \"USE\"\r\n | \"UNKNOWN\";\r\n\r\nexport interface SqlParserResult {\r\n action: XansqlBridgeAction;\r\n table: string | null;\r\n}\r\n\r\nexport const sqlparser = (sql: string): SqlParserResult => {\r\n const normalized = sql.trim().replace(/\\s+/g, \" \");\r\n\r\n // Detect the primary verb (first SQL keyword)\r\n const verbMatch = normalized.match(\r\n /^(SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|REPLACE|DESCRIBE|DESC|SHOW|USE)\\b/i\r\n );\r\n\r\n let verb: XansqlBridgeAction = \"UNKNOWN\";\r\n\r\n if (verbMatch) {\r\n const v = verbMatch[1].toUpperCase();\r\n verb = v === \"DESC\" ? \"DESCRIBE\" : (v as XansqlBridgeAction);\r\n }\r\n\r\n // Matches identifiers: table, `table`, \"table\", [table]\r\n const IDENT = `([\\\\\\`\"\\\\[]?)([A-Za-z0-9_.-]+)\\\\1`;\r\n\r\n const extractTable = (): string | null => {\r\n switch (verb) {\r\n case \"SELECT\": {\r\n // 1. Normal SELECT ... FROM table\r\n const normal = normalized.match(/\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i);\r\n if (normal && normal[2] !== \"(\") {\r\n return normal[2]; // real table\r\n }\r\n\r\n // 2. Extract real tables inside a subquery: SELECT ... FROM ( SELECT ... FROM table )\r\n const inner = normalized.match(\r\n /\\(\\s*SELECT[\\s\\S]+?\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i\r\n );\r\n if (inner) return inner[2];\r\n\r\n return null;\r\n }\r\n case \"INSERT\": {\r\n const match = new RegExp(`\\\\bINTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"UPDATE\": {\r\n const match = new RegExp(`^UPDATE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"DELETE\": {\r\n const match = new RegExp(`\\\\bFROM\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // CREATE TABLE tableName\r\n case \"CREATE\": {\r\n const match = new RegExp(`\\\\bCREATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DROP TABLE tableName\r\n case \"DROP\": {\r\n const match = new RegExp(`\\\\bDROP\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // ALTER TABLE tableName\r\n case \"ALTER\": {\r\n const match = new RegExp(`\\\\bALTER\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // TRUNCATE TABLE tableName\r\n case \"TRUNCATE\": {\r\n const match = new RegExp(`\\\\bTRUNCATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // REPLACE INTO tableName\r\n case \"REPLACE\": {\r\n const match = new RegExp(`\\\\bREPLACE\\\\s+INTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DESCRIBE tableName\r\n case \"DESCRIBE\": {\r\n const match = new RegExp(`\\\\b(DESCRIBE|DESC)\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // SHOW TABLES / SHOW DATABASES => no table\r\n case \"SHOW\": {\r\n const match = new RegExp(`\\\\bSHOW\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null; // e.g. SHOW TABLES\r\n }\r\n\r\n // USE databaseName\r\n case \"USE\": {\r\n const match = new RegExp(`\\\\bUSE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return {\r\n action: verb,\r\n table: extractTable(),\r\n };\r\n};\r\n"],"names":["Foreign","crypto"],"mappings":";;;;;AAGA,IAAI,WAAW,GAAkB,IAAI;MACxB,UAAU,GAAG,OAAO,MAAc,KAAI;AAChD,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,WAAW;AACnC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;IAC5B,IAAI,GAAG,GAAG,EAAE;IACZ,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;AAChC,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACrB,QAAA,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;YAC9B,MAAM,KAAK,GAAQ,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AACvC,YAAA,IAAI,CAACA,YAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;AACzC,gBAAA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;AAChB,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;oBACd,IAAI,CAAC,IAAI,EAAE;AACX,oBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBACpB;YACH;QACH;IACH;AACA,IAAA,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9B,IAAA,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;AAEhB,IAAA,WAAW,GAAG,MAAMC,eAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7C,IAAA,OAAO,WAAW;AACrB;AAEO,MAAM,QAAQ,GAAG,OAAO,IAAY,EAAE,MAAc,KAAI;AAC5D,IAAA,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC;AACvC,IAAA,MAAM,GAAG,GAAG,CAAA,CAAA,EAAI,MAAMA,eAAM,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE;AAClD,IAAA,OAAO,GAAG;AACb;AAuBO,MAAM,SAAS,GAAG,CAAC,GAAW,KAAqB;AACvD,IAAA,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;;IAGlD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAC/B,6FAA6F,CAC/F;IAED,IAAI,IAAI,GAAuB,SAAS;IAExC,IAAI,SAAS,EAAE;QACZ,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AACpC,QAAA,IAAI,GAAG,CAAC,KAAK,MAAM,GAAG,UAAU,GAAI,CAAwB;IAC/D;;IAGA,MAAM,KAAK,GAAG,CAAA,iCAAA,CAAmC;IAEjD,MAAM,YAAY,GAAG,MAAoB;QACtC,QAAQ,IAAI;YACT,KAAK,QAAQ,EAAE;;gBAEZ,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,wCAAwC,CAAC;gBACzE,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAC9B,oBAAA,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpB;;gBAGA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAC3B,2DAA2D,CAC7D;AACD,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK,CAAC,CAAC,CAAC;AAE1B,gBAAA,OAAO,IAAI;YACd;YACA,KAAK,QAAQ,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACrE,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;YACA,KAAK,QAAQ,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACrE,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;YACA,KAAK,QAAQ,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACrE,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;;YAGA,KAAK,QAAQ,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,yBAAyB,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAChF,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;;YAGA,KAAK,MAAM,EAAE;AACV,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,uBAAuB,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9E,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;;YAGA,KAAK,OAAO,EAAE;AACX,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,wBAAwB,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAC/E,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;;YAGA,KAAK,UAAU,EAAE;AACd,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,2BAA2B,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAClF,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;;YAGA,KAAK,SAAS,EAAE;AACb,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,yBAAyB,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAChF,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;;YAGA,KAAK,UAAU,EAAE;AACd,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,yBAAyB,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAChF,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;;YAGA,KAAK,MAAM,EAAE;AACV,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACrE,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAClC;;YAGA,KAAK,KAAK,EAAE;AACT,gBAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,aAAa,KAAK,CAAA,CAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AACpE,gBAAA,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACjC;AAEA,YAAA;AACG,gBAAA,OAAO,IAAI;;AAEpB,IAAA,CAAC;IAED,OAAO;AACJ,QAAA,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,YAAY,EAAE;KACvB;AACJ;;;;;;"}
|
package/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sources":["../src/base.ts"],"sourcesContent":["import { crypto } from \"securequ\";\r\nimport { Xansql, Foreign } from \"@xansql/core\";\r\n\r\nlet secretCache: string | null = null;\r\nexport const makeSecret = async (xansql: Xansql) => {\r\n if (secretCache) return secretCache;\r\n const models = xansql.models\r\n let uid = []\r\n for (let model of models.values()) {\r\n uid.push(model.table)\r\n for (let column in model.schema) {\r\n const field = model.schema[column]\r\n if (!Foreign.isArray(model.schema[column])) {\r\n uid.push(column)\r\n const meta = field.meta || {}\r\n const keys = Object.keys(meta)\r\n if (keys.length) {\r\n keys.sort()\r\n uid.push(...keys)\r\n }\r\n }\r\n }\r\n }\r\n uid = Array.from(new Set(uid)) // unique\r\n uid = uid.sort()\r\n\r\n secretCache = await crypto.hash(uid.join(\"\"))\r\n return secretCache;\r\n}\r\n\r\nexport const makePath = async (path: string, xansql: Xansql) => {\r\n const secret = await makeSecret(xansql)\r\n const gen = `/${await crypto.hash(path + secret)}`\r\n return gen;\r\n}\r\n\r\n\r\nexport type XansqlBridgeAction =\r\n | \"SELECT\"\r\n | \"INSERT\"\r\n | \"UPDATE\"\r\n | \"DELETE\"\r\n | \"DROP\"\r\n | \"ALTER\"\r\n | \"CREATE\"\r\n | \"TRUNCATE\"\r\n | \"REPLACE\"\r\n | \"DESCRIBE\"\r\n | \"SHOW\"\r\n | \"USE\"\r\n | \"UNKNOWN\";\r\n\r\nexport interface SqlParserResult {\r\n action: XansqlBridgeAction;\r\n table: string | null;\r\n}\r\n\r\nexport const sqlparser = (sql: string): SqlParserResult => {\r\n const normalized = sql.trim().replace(/\\s+/g, \" \");\r\n\r\n // Detect the primary verb (first SQL keyword)\r\n const verbMatch = normalized.match(\r\n /^(SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|REPLACE|DESCRIBE|DESC|SHOW|USE)\\b/i\r\n );\r\n\r\n let verb: XansqlBridgeAction = \"UNKNOWN\";\r\n\r\n if (verbMatch) {\r\n const v = verbMatch[1].toUpperCase();\r\n verb = v === \"DESC\" ? \"DESCRIBE\" : (v as XansqlBridgeAction);\r\n }\r\n\r\n // Matches identifiers: table, `table`, \"table\", [table]\r\n const IDENT = `([\\\\\\`\"\\\\[]?)([A-Za-z0-9_.-]+)\\\\1`;\r\n\r\n const extractTable = (): string | null => {\r\n switch (verb) {\r\n case \"SELECT\": {\r\n // 1. Normal SELECT ... FROM table\r\n const normal = normalized.match(/\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i);\r\n if (normal && normal[2] !== \"(\") {\r\n return normal[2]; // real table\r\n }\r\n\r\n // 2. Extract real tables inside a subquery: SELECT ... FROM ( SELECT ... FROM table )\r\n const inner = normalized.match(\r\n /\\(\\s*SELECT[\\s\\S]+?\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i\r\n );\r\n if (inner) return inner[2];\r\n\r\n return null;\r\n }\r\n case \"INSERT\": {\r\n const match = new RegExp(`\\\\bINTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"UPDATE\": {\r\n const match = new RegExp(`^UPDATE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"DELETE\": {\r\n const match = new RegExp(`\\\\bFROM\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // CREATE TABLE tableName\r\n case \"CREATE\": {\r\n const match = new RegExp(`\\\\bCREATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DROP TABLE tableName\r\n case \"DROP\": {\r\n const match = new RegExp(`\\\\bDROP\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // ALTER TABLE tableName\r\n case \"ALTER\": {\r\n const match = new RegExp(`\\\\bALTER\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // TRUNCATE TABLE tableName\r\n case \"TRUNCATE\": {\r\n const match = new RegExp(`\\\\bTRUNCATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // REPLACE INTO tableName\r\n case \"REPLACE\": {\r\n const match = new RegExp(`\\\\bREPLACE\\\\s+INTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DESCRIBE tableName\r\n case \"DESCRIBE\": {\r\n const match = new RegExp(`\\\\b(DESCRIBE|DESC)\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // SHOW TABLES / SHOW DATABASES => no table\r\n case \"SHOW\": {\r\n const match = new RegExp(`\\\\bSHOW\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null; // e.g. SHOW TABLES\r\n }\r\n\r\n // USE databaseName\r\n case \"USE\": {\r\n const match = new RegExp(`\\\\bUSE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return {\r\n action: verb,\r\n table: extractTable(),\r\n };\r\n};\r\n"],"names":[],"mappings":";;;AAGA,IAAI,WAAW,GAAkB,IAAI;MACxB,UAAU,GAAG,OAAO,MAAc,KAAI;AAChD,IAAA,IAAI,WAAW;AAAE,QAAA,OAAO,WAAW;AACnC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;IAC5B,IAAI,GAAG,GAAG,EAAE;IACZ,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;AAChC,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACrB,QAAA,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;YAC9B,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"base.js","sources":["../src/base.ts"],"sourcesContent":["import { crypto } from \"securequ\";\r\nimport { Xansql, Foreign } from \"@xansql/core\";\r\n\r\nlet secretCache: string | null = null;\r\nexport const makeSecret = async (xansql: Xansql) => {\r\n if (secretCache) return secretCache;\r\n const models = xansql.models\r\n let uid = []\r\n for (let model of models.values()) {\r\n uid.push(model.table)\r\n for (let column in model.schema) {\r\n const field: any = model.schema[column]\r\n if (!Foreign.isArray(model.schema[column])) {\r\n uid.push(column)\r\n const meta = field.meta || {}\r\n const keys = Object.keys(meta)\r\n if (keys.length) {\r\n keys.sort()\r\n uid.push(...keys)\r\n }\r\n }\r\n }\r\n }\r\n uid = Array.from(new Set(uid)) // unique\r\n uid = uid.sort()\r\n\r\n secretCache = await crypto.hash(uid.join(\"\"))\r\n return secretCache;\r\n}\r\n\r\nexport const makePath = async (path: string, xansql: Xansql) => {\r\n const secret = await makeSecret(xansql)\r\n const gen = `/${await crypto.hash(path + secret)}`\r\n return gen;\r\n}\r\n\r\n\r\nexport type XansqlBridgeAction =\r\n | \"SELECT\"\r\n | \"INSERT\"\r\n | \"UPDATE\"\r\n | \"DELETE\"\r\n | \"DROP\"\r\n | \"ALTER\"\r\n | \"CREATE\"\r\n | \"TRUNCATE\"\r\n | \"REPLACE\"\r\n | \"DESCRIBE\"\r\n | \"SHOW\"\r\n | \"USE\"\r\n | \"UNKNOWN\";\r\n\r\nexport interface SqlParserResult {\r\n action: XansqlBridgeAction;\r\n table: string | null;\r\n}\r\n\r\nexport const sqlparser = (sql: string): SqlParserResult => {\r\n const normalized = sql.trim().replace(/\\s+/g, \" \");\r\n\r\n // Detect the primary verb (first SQL keyword)\r\n const verbMatch = normalized.match(\r\n /^(SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|REPLACE|DESCRIBE|DESC|SHOW|USE)\\b/i\r\n );\r\n\r\n let verb: XansqlBridgeAction = \"UNKNOWN\";\r\n\r\n if (verbMatch) {\r\n const v = verbMatch[1].toUpperCase();\r\n verb = v === \"DESC\" ? \"DESCRIBE\" : (v as XansqlBridgeAction);\r\n }\r\n\r\n // Matches identifiers: table, `table`, \"table\", [table]\r\n const IDENT = `([\\\\\\`\"\\\\[]?)([A-Za-z0-9_.-]+)\\\\1`;\r\n\r\n const extractTable = (): string | null => {\r\n switch (verb) {\r\n case \"SELECT\": {\r\n // 1. Normal SELECT ... FROM table\r\n const normal = normalized.match(/\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i);\r\n if (normal && normal[2] !== \"(\") {\r\n return normal[2]; // real table\r\n }\r\n\r\n // 2. Extract real tables inside a subquery: SELECT ... FROM ( SELECT ... FROM table )\r\n const inner = normalized.match(\r\n /\\(\\s*SELECT[\\s\\S]+?\\bFROM\\s+([`\"\\[]?)([A-Za-z0-9_.-]+)\\1/i\r\n );\r\n if (inner) return inner[2];\r\n\r\n return null;\r\n }\r\n case \"INSERT\": {\r\n const match = new RegExp(`\\\\bINTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"UPDATE\": {\r\n const match = new RegExp(`^UPDATE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n case \"DELETE\": {\r\n const match = new RegExp(`\\\\bFROM\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // CREATE TABLE tableName\r\n case \"CREATE\": {\r\n const match = new RegExp(`\\\\bCREATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DROP TABLE tableName\r\n case \"DROP\": {\r\n const match = new RegExp(`\\\\bDROP\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // ALTER TABLE tableName\r\n case \"ALTER\": {\r\n const match = new RegExp(`\\\\bALTER\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // TRUNCATE TABLE tableName\r\n case \"TRUNCATE\": {\r\n const match = new RegExp(`\\\\bTRUNCATE\\\\s+TABLE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // REPLACE INTO tableName\r\n case \"REPLACE\": {\r\n const match = new RegExp(`\\\\bREPLACE\\\\s+INTO\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // DESCRIBE tableName\r\n case \"DESCRIBE\": {\r\n const match = new RegExp(`\\\\b(DESCRIBE|DESC)\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n // SHOW TABLES / SHOW DATABASES => no table\r\n case \"SHOW\": {\r\n const match = new RegExp(`\\\\bSHOW\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null; // e.g. SHOW TABLES\r\n }\r\n\r\n // USE databaseName\r\n case \"USE\": {\r\n const match = new RegExp(`\\\\bUSE\\\\s+${IDENT}`, \"i\").exec(normalized);\r\n return match ? match[2] : null;\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return {\r\n action: verb,\r\n table: extractTable(),\r\n };\r\n};\r\n"],"names":[],"mappings":"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"}
|
package/dialect.cjs
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var securequ = require('securequ');
|
|
4
|
+
var core = require('@xansql/core');
|
|
5
|
+
var base = require('./base.cjs');
|
|
6
|
+
|
|
7
|
+
const XansqlBridgeDialect = (url, engine) => {
|
|
8
|
+
let clientInstance = null;
|
|
9
|
+
const getClient = async (xansql) => {
|
|
10
|
+
if (!clientInstance) {
|
|
11
|
+
const secret = await base.makeSecret(xansql);
|
|
12
|
+
clientInstance = new securequ.SecurequClient({
|
|
13
|
+
secret,
|
|
14
|
+
url
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return clientInstance;
|
|
18
|
+
};
|
|
19
|
+
const execute = async (sql, xansql) => {
|
|
20
|
+
if (typeof window === 'undefined') {
|
|
21
|
+
throw new core.XansqlError({
|
|
22
|
+
message: "XansqlBridge dialect can only be used in browser environment.",
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const client = await getClient(xansql);
|
|
26
|
+
const meta = base.sqlparser(sql);
|
|
27
|
+
const data = {
|
|
28
|
+
sql,
|
|
29
|
+
table: meta.table,
|
|
30
|
+
action: meta.action,
|
|
31
|
+
};
|
|
32
|
+
if (meta.action === "SELECT") {
|
|
33
|
+
let res = await client.get(await base.makePath('find', xansql), { params: data });
|
|
34
|
+
if (!res.success) {
|
|
35
|
+
throw new core.XansqlError(res.message);
|
|
36
|
+
}
|
|
37
|
+
return res.data || null;
|
|
38
|
+
}
|
|
39
|
+
else if (meta.action === "INSERT") {
|
|
40
|
+
let res = await client.post(await base.makePath('insert', xansql), { body: data });
|
|
41
|
+
if (!res.success) {
|
|
42
|
+
throw new core.XansqlError(res.message);
|
|
43
|
+
}
|
|
44
|
+
return res.data || null;
|
|
45
|
+
}
|
|
46
|
+
else if (meta.action === "UPDATE") {
|
|
47
|
+
let res = await client.put(await base.makePath('update', xansql), { body: data });
|
|
48
|
+
if (!res.success) {
|
|
49
|
+
throw new core.XansqlError(res.message);
|
|
50
|
+
}
|
|
51
|
+
return res.data || null;
|
|
52
|
+
}
|
|
53
|
+
else if (meta.action === "DELETE") {
|
|
54
|
+
let res = await client.delete(await base.makePath('delete', xansql), { params: data });
|
|
55
|
+
if (!res.success) {
|
|
56
|
+
throw new core.XansqlError(res.message);
|
|
57
|
+
}
|
|
58
|
+
return res.data || null;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
let res = await client.post(await base.makePath('executer', xansql), { body: data });
|
|
62
|
+
if (!res.success) {
|
|
63
|
+
throw new core.XansqlError(res.message);
|
|
64
|
+
}
|
|
65
|
+
return res.data || null;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const getSchema = async (xansql) => {
|
|
69
|
+
const client = await getClient(xansql);
|
|
70
|
+
const res = await client.get(await base.makePath('raw_schema', xansql));
|
|
71
|
+
if (!res.success) {
|
|
72
|
+
throw new core.XansqlError({
|
|
73
|
+
message: `Failed to fetch schema: ${res.message || 'Unknown error'}`
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return res.data;
|
|
77
|
+
};
|
|
78
|
+
const uploadFile = async (file, xansql) => {
|
|
79
|
+
const client = await getClient(xansql);
|
|
80
|
+
const res = await client.uploadFile(file);
|
|
81
|
+
return res.data;
|
|
82
|
+
};
|
|
83
|
+
const deleteFile = async (fileId, xansql) => {
|
|
84
|
+
const client = await getClient(xansql);
|
|
85
|
+
await client.deleteFile(fileId);
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
engine: engine || 'mysql',
|
|
89
|
+
execute,
|
|
90
|
+
getSchema,
|
|
91
|
+
file: {
|
|
92
|
+
upload: uploadFile,
|
|
93
|
+
delete: deleteFile
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
module.exports = XansqlBridgeDialect;
|
|
99
|
+
//# sourceMappingURL=dialect.cjs.map
|
package/dialect.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.cjs","sources":["../src/dialect.ts"],"sourcesContent":["import { SecurequClient } from \"securequ\";\r\nimport { Xansql, XansqlError, ExecuterResult, XansqlDialectEngine, XansqlFileMeta } from \"@xansql/core\";\r\nimport { makePath, makeSecret, sqlparser } from \"./base\";\r\n\r\nconst XansqlBridgeDialect = (url: string, engine?: XansqlDialectEngine) => {\r\n\r\n let clientInstance: SecurequClient | null = null;\r\n const getClient = async (xansql: Xansql) => {\r\n if (!clientInstance) {\r\n const secret = await makeSecret(xansql)\r\n clientInstance = new SecurequClient({\r\n secret,\r\n url\r\n });\r\n }\r\n return clientInstance;\r\n }\r\n\r\n const execute = async (sql: string, xansql: Xansql): Promise<ExecuterResult> => {\r\n if (typeof window === 'undefined') {\r\n throw new XansqlError({\r\n message: \"XansqlBridge dialect can only be used in browser environment.\",\r\n })\r\n }\r\n const client = await getClient(xansql)\r\n const meta = sqlparser(sql);\r\n const data = {\r\n sql,\r\n table: meta.table,\r\n action: meta.action,\r\n };\r\n\r\n if (meta.action === \"SELECT\") {\r\n let res = await client.get(await makePath('find', xansql), { params: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else if (meta.action === \"INSERT\") {\r\n let res = await client.post(await makePath('insert', xansql), { body: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else if (meta.action === \"UPDATE\") {\r\n let res = await client.put(await makePath('update', xansql), { body: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else if (meta.action === \"DELETE\") {\r\n let res = await client.delete(await makePath('delete', xansql), { params: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else {\r\n let res = await client.post(await makePath('executer', xansql), { body: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n }\r\n };\r\n\r\n const getSchema = async (xansql: Xansql) => {\r\n const client = await getClient(xansql)\r\n const res = await client.get(await makePath('raw_schema', xansql))\r\n if (!res.success) {\r\n throw new XansqlError({\r\n message: `Failed to fetch schema: ${res.message || 'Unknown error'}`\r\n })\r\n }\r\n return res.data\r\n };\r\n\r\n const uploadFile = async (file: File, xansql: Xansql): Promise<XansqlFileMeta> => {\r\n const client = await getClient(xansql);\r\n const res = await client.uploadFile(file);\r\n return res.data\r\n }\r\n\r\n const deleteFile = async (fileId: string, xansql: Xansql) => {\r\n const client = await getClient(xansql);\r\n await client.deleteFile(fileId);\r\n }\r\n\r\n return {\r\n engine: engine || 'mysql',\r\n execute,\r\n getSchema,\r\n file: {\r\n upload: uploadFile,\r\n delete: deleteFile\r\n }\r\n };\r\n};\r\n\r\n\r\nexport default XansqlBridgeDialect;\r\n"],"names":["makeSecret","SecurequClient","XansqlError","sqlparser","makePath"],"mappings":"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"}
|
package/dialect.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { XansqlDialectEngine, Xansql, ExecuterResult, XansqlFileMeta } from '@xansql/core';
|
|
2
|
+
|
|
3
|
+
declare const XansqlBridgeDialect: (url: string, engine?: XansqlDialectEngine) => {
|
|
4
|
+
engine: XansqlDialectEngine;
|
|
5
|
+
execute: (sql: string, xansql: Xansql) => Promise<ExecuterResult>;
|
|
6
|
+
getSchema: (xansql: Xansql) => Promise<any>;
|
|
7
|
+
file: {
|
|
8
|
+
upload: (file: File, xansql: Xansql) => Promise<XansqlFileMeta>;
|
|
9
|
+
delete: (fileId: string, xansql: Xansql) => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { XansqlBridgeDialect as default };
|
package/dialect.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { SecurequClient } from 'securequ';
|
|
2
|
+
import { XansqlError } from '@xansql/core';
|
|
3
|
+
import { makePath, sqlparser, makeSecret } from './base.js';
|
|
4
|
+
|
|
5
|
+
const XansqlBridgeDialect = (url, engine) => {
|
|
6
|
+
let clientInstance = null;
|
|
7
|
+
const getClient = async (xansql) => {
|
|
8
|
+
if (!clientInstance) {
|
|
9
|
+
const secret = await makeSecret(xansql);
|
|
10
|
+
clientInstance = new SecurequClient({
|
|
11
|
+
secret,
|
|
12
|
+
url
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return clientInstance;
|
|
16
|
+
};
|
|
17
|
+
const execute = async (sql, xansql) => {
|
|
18
|
+
if (typeof window === 'undefined') {
|
|
19
|
+
throw new XansqlError({
|
|
20
|
+
message: "XansqlBridge dialect can only be used in browser environment.",
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const client = await getClient(xansql);
|
|
24
|
+
const meta = sqlparser(sql);
|
|
25
|
+
const data = {
|
|
26
|
+
sql,
|
|
27
|
+
table: meta.table,
|
|
28
|
+
action: meta.action,
|
|
29
|
+
};
|
|
30
|
+
if (meta.action === "SELECT") {
|
|
31
|
+
let res = await client.get(await makePath('find', xansql), { params: data });
|
|
32
|
+
if (!res.success) {
|
|
33
|
+
throw new XansqlError(res.message);
|
|
34
|
+
}
|
|
35
|
+
return res.data || null;
|
|
36
|
+
}
|
|
37
|
+
else if (meta.action === "INSERT") {
|
|
38
|
+
let res = await client.post(await makePath('insert', xansql), { body: data });
|
|
39
|
+
if (!res.success) {
|
|
40
|
+
throw new XansqlError(res.message);
|
|
41
|
+
}
|
|
42
|
+
return res.data || null;
|
|
43
|
+
}
|
|
44
|
+
else if (meta.action === "UPDATE") {
|
|
45
|
+
let res = await client.put(await makePath('update', xansql), { body: data });
|
|
46
|
+
if (!res.success) {
|
|
47
|
+
throw new XansqlError(res.message);
|
|
48
|
+
}
|
|
49
|
+
return res.data || null;
|
|
50
|
+
}
|
|
51
|
+
else if (meta.action === "DELETE") {
|
|
52
|
+
let res = await client.delete(await makePath('delete', xansql), { params: data });
|
|
53
|
+
if (!res.success) {
|
|
54
|
+
throw new XansqlError(res.message);
|
|
55
|
+
}
|
|
56
|
+
return res.data || null;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
let res = await client.post(await makePath('executer', xansql), { body: data });
|
|
60
|
+
if (!res.success) {
|
|
61
|
+
throw new XansqlError(res.message);
|
|
62
|
+
}
|
|
63
|
+
return res.data || null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const getSchema = async (xansql) => {
|
|
67
|
+
const client = await getClient(xansql);
|
|
68
|
+
const res = await client.get(await makePath('raw_schema', xansql));
|
|
69
|
+
if (!res.success) {
|
|
70
|
+
throw new XansqlError({
|
|
71
|
+
message: `Failed to fetch schema: ${res.message || 'Unknown error'}`
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return res.data;
|
|
75
|
+
};
|
|
76
|
+
const uploadFile = async (file, xansql) => {
|
|
77
|
+
const client = await getClient(xansql);
|
|
78
|
+
const res = await client.uploadFile(file);
|
|
79
|
+
return res.data;
|
|
80
|
+
};
|
|
81
|
+
const deleteFile = async (fileId, xansql) => {
|
|
82
|
+
const client = await getClient(xansql);
|
|
83
|
+
await client.deleteFile(fileId);
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
engine: engine || 'mysql',
|
|
87
|
+
execute,
|
|
88
|
+
getSchema,
|
|
89
|
+
file: {
|
|
90
|
+
upload: uploadFile,
|
|
91
|
+
delete: deleteFile
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export { XansqlBridgeDialect as default };
|
|
97
|
+
//# sourceMappingURL=dialect.js.map
|
package/dialect.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.js","sources":["../src/dialect.ts"],"sourcesContent":["import { SecurequClient } from \"securequ\";\r\nimport { Xansql, XansqlError, ExecuterResult, XansqlDialectEngine, XansqlFileMeta } from \"@xansql/core\";\r\nimport { makePath, makeSecret, sqlparser } from \"./base\";\r\n\r\nconst XansqlBridgeDialect = (url: string, engine?: XansqlDialectEngine) => {\r\n\r\n let clientInstance: SecurequClient | null = null;\r\n const getClient = async (xansql: Xansql) => {\r\n if (!clientInstance) {\r\n const secret = await makeSecret(xansql)\r\n clientInstance = new SecurequClient({\r\n secret,\r\n url\r\n });\r\n }\r\n return clientInstance;\r\n }\r\n\r\n const execute = async (sql: string, xansql: Xansql): Promise<ExecuterResult> => {\r\n if (typeof window === 'undefined') {\r\n throw new XansqlError({\r\n message: \"XansqlBridge dialect can only be used in browser environment.\",\r\n })\r\n }\r\n const client = await getClient(xansql)\r\n const meta = sqlparser(sql);\r\n const data = {\r\n sql,\r\n table: meta.table,\r\n action: meta.action,\r\n };\r\n\r\n if (meta.action === \"SELECT\") {\r\n let res = await client.get(await makePath('find', xansql), { params: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else if (meta.action === \"INSERT\") {\r\n let res = await client.post(await makePath('insert', xansql), { body: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else if (meta.action === \"UPDATE\") {\r\n let res = await client.put(await makePath('update', xansql), { body: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else if (meta.action === \"DELETE\") {\r\n let res = await client.delete(await makePath('delete', xansql), { params: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n } else {\r\n let res = await client.post(await makePath('executer', xansql), { body: data })\r\n if (!res.success) {\r\n throw new XansqlError(res.message);\r\n }\r\n return res.data || null\r\n }\r\n };\r\n\r\n const getSchema = async (xansql: Xansql) => {\r\n const client = await getClient(xansql)\r\n const res = await client.get(await makePath('raw_schema', xansql))\r\n if (!res.success) {\r\n throw new XansqlError({\r\n message: `Failed to fetch schema: ${res.message || 'Unknown error'}`\r\n })\r\n }\r\n return res.data\r\n };\r\n\r\n const uploadFile = async (file: File, xansql: Xansql): Promise<XansqlFileMeta> => {\r\n const client = await getClient(xansql);\r\n const res = await client.uploadFile(file);\r\n return res.data\r\n }\r\n\r\n const deleteFile = async (fileId: string, xansql: Xansql) => {\r\n const client = await getClient(xansql);\r\n await client.deleteFile(fileId);\r\n }\r\n\r\n return {\r\n engine: engine || 'mysql',\r\n execute,\r\n getSchema,\r\n file: {\r\n upload: uploadFile,\r\n delete: deleteFile\r\n }\r\n };\r\n};\r\n\r\n\r\nexport default XansqlBridgeDialect;\r\n"],"names":[],"mappings":"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"}
|
package/index.cjs
CHANGED
|
@@ -1,99 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var base = require('./base.cjs');
|
|
3
|
+
var dialect = require('./dialect.cjs');
|
|
4
|
+
var server = require('./server.cjs');
|
|
6
5
|
|
|
7
|
-
const XansqlBridge = (url, engine) => {
|
|
8
|
-
let clientInstance = null;
|
|
9
|
-
const getClient = async (xansql) => {
|
|
10
|
-
if (!clientInstance) {
|
|
11
|
-
const secret = await base.makeSecret(xansql);
|
|
12
|
-
clientInstance = new securequ.SecurequClient({
|
|
13
|
-
secret,
|
|
14
|
-
url
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
return clientInstance;
|
|
18
|
-
};
|
|
19
|
-
const execute = async (sql, xansql) => {
|
|
20
|
-
if (typeof window === 'undefined') {
|
|
21
|
-
throw new core.XansqlError({
|
|
22
|
-
message: "XansqlBridge dialect can only be used in browser environment.",
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
const client = await getClient(xansql);
|
|
26
|
-
const meta = base.sqlparser(sql);
|
|
27
|
-
const data = {
|
|
28
|
-
sql,
|
|
29
|
-
table: meta.table,
|
|
30
|
-
action: meta.action,
|
|
31
|
-
};
|
|
32
|
-
if (meta.action === "SELECT") {
|
|
33
|
-
let res = await client.get(await base.makePath('find', xansql), { params: data });
|
|
34
|
-
if (!res.success) {
|
|
35
|
-
throw new core.XansqlError(res.message);
|
|
36
|
-
}
|
|
37
|
-
return res.data || null;
|
|
38
|
-
}
|
|
39
|
-
else if (meta.action === "INSERT") {
|
|
40
|
-
let res = await client.post(await base.makePath('insert', xansql), { body: data });
|
|
41
|
-
if (!res.success) {
|
|
42
|
-
throw new core.XansqlError(res.message);
|
|
43
|
-
}
|
|
44
|
-
return res.data || null;
|
|
45
|
-
}
|
|
46
|
-
else if (meta.action === "UPDATE") {
|
|
47
|
-
let res = await client.put(await base.makePath('update', xansql), { body: data });
|
|
48
|
-
if (!res.success) {
|
|
49
|
-
throw new core.XansqlError(res.message);
|
|
50
|
-
}
|
|
51
|
-
return res.data || null;
|
|
52
|
-
}
|
|
53
|
-
else if (meta.action === "DELETE") {
|
|
54
|
-
let res = await client.delete(await base.makePath('delete', xansql), { params: data });
|
|
55
|
-
if (!res.success) {
|
|
56
|
-
throw new core.XansqlError(res.message);
|
|
57
|
-
}
|
|
58
|
-
return res.data || null;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
let res = await client.post(await base.makePath('executer', xansql), { body: data });
|
|
62
|
-
if (!res.success) {
|
|
63
|
-
throw new core.XansqlError(res.message);
|
|
64
|
-
}
|
|
65
|
-
return res.data || null;
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
const getSchema = async (xansql) => {
|
|
69
|
-
const client = await getClient(xansql);
|
|
70
|
-
const res = await client.get(await base.makePath('raw_schema', xansql));
|
|
71
|
-
if (!res.success) {
|
|
72
|
-
throw new core.XansqlError({
|
|
73
|
-
message: `Failed to fetch schema: ${res.message || 'Unknown error'}`
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
return res.data;
|
|
77
|
-
};
|
|
78
|
-
const uploadFile = async (file, xansql) => {
|
|
79
|
-
const client = await getClient(xansql);
|
|
80
|
-
const res = await client.uploadFile(file);
|
|
81
|
-
return res.data;
|
|
82
|
-
};
|
|
83
|
-
const deleteFile = async (fileId, xansql) => {
|
|
84
|
-
const client = await getClient(xansql);
|
|
85
|
-
await client.deleteFile(fileId);
|
|
86
|
-
};
|
|
87
|
-
return {
|
|
88
|
-
engine: engine || 'mysql',
|
|
89
|
-
execute,
|
|
90
|
-
getSchema,
|
|
91
|
-
file: {
|
|
92
|
-
upload: uploadFile,
|
|
93
|
-
delete: deleteFile
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
};
|
|
97
6
|
|
|
98
|
-
|
|
7
|
+
|
|
8
|
+
exports.XansqlBridgeDialect = dialect;
|
|
9
|
+
exports.XansqlBridgeServer = server;
|
|
99
10
|
//# sourceMappingURL=index.cjs.map
|
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
package/index.d.ts
CHANGED
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
engine: XansqlDialectEngine;
|
|
5
|
-
execute: (sql: string, xansql: Xansql) => Promise<ExecuterResult>;
|
|
6
|
-
getSchema: (xansql: Xansql) => Promise<any>;
|
|
7
|
-
file: {
|
|
8
|
-
upload: (file: File, xansql: Xansql) => Promise<XansqlFileMeta>;
|
|
9
|
-
delete: (fileId: string, xansql: Xansql) => Promise<void>;
|
|
10
|
-
};
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export { XansqlBridge as default };
|
|
1
|
+
export { default as XansqlBridgeDialect } from './dialect.js';
|
|
2
|
+
export { default as XansqlBridgeServer } from './server.js';
|
|
3
|
+
export { ListenOptions, XansqlBridgeAuthorizedInfo, XansqlBridgeInfo, XansqlBridgeResponse, XansqlBridgeServerConfig } from './types.js';
|
package/index.js
CHANGED
|
@@ -1,97 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { makePath, sqlparser, makeSecret } from './base.js';
|
|
4
|
-
|
|
5
|
-
const XansqlBridge = (url, engine) => {
|
|
6
|
-
let clientInstance = null;
|
|
7
|
-
const getClient = async (xansql) => {
|
|
8
|
-
if (!clientInstance) {
|
|
9
|
-
const secret = await makeSecret(xansql);
|
|
10
|
-
clientInstance = new SecurequClient({
|
|
11
|
-
secret,
|
|
12
|
-
url
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
return clientInstance;
|
|
16
|
-
};
|
|
17
|
-
const execute = async (sql, xansql) => {
|
|
18
|
-
if (typeof window === 'undefined') {
|
|
19
|
-
throw new XansqlError({
|
|
20
|
-
message: "XansqlBridge dialect can only be used in browser environment.",
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
const client = await getClient(xansql);
|
|
24
|
-
const meta = sqlparser(sql);
|
|
25
|
-
const data = {
|
|
26
|
-
sql,
|
|
27
|
-
table: meta.table,
|
|
28
|
-
action: meta.action,
|
|
29
|
-
};
|
|
30
|
-
if (meta.action === "SELECT") {
|
|
31
|
-
let res = await client.get(await makePath('find', xansql), { params: data });
|
|
32
|
-
if (!res.success) {
|
|
33
|
-
throw new XansqlError(res.message);
|
|
34
|
-
}
|
|
35
|
-
return res.data || null;
|
|
36
|
-
}
|
|
37
|
-
else if (meta.action === "INSERT") {
|
|
38
|
-
let res = await client.post(await makePath('insert', xansql), { body: data });
|
|
39
|
-
if (!res.success) {
|
|
40
|
-
throw new XansqlError(res.message);
|
|
41
|
-
}
|
|
42
|
-
return res.data || null;
|
|
43
|
-
}
|
|
44
|
-
else if (meta.action === "UPDATE") {
|
|
45
|
-
let res = await client.put(await makePath('update', xansql), { body: data });
|
|
46
|
-
if (!res.success) {
|
|
47
|
-
throw new XansqlError(res.message);
|
|
48
|
-
}
|
|
49
|
-
return res.data || null;
|
|
50
|
-
}
|
|
51
|
-
else if (meta.action === "DELETE") {
|
|
52
|
-
let res = await client.delete(await makePath('delete', xansql), { params: data });
|
|
53
|
-
if (!res.success) {
|
|
54
|
-
throw new XansqlError(res.message);
|
|
55
|
-
}
|
|
56
|
-
return res.data || null;
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
let res = await client.post(await makePath('executer', xansql), { body: data });
|
|
60
|
-
if (!res.success) {
|
|
61
|
-
throw new XansqlError(res.message);
|
|
62
|
-
}
|
|
63
|
-
return res.data || null;
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
const getSchema = async (xansql) => {
|
|
67
|
-
const client = await getClient(xansql);
|
|
68
|
-
const res = await client.get(await makePath('raw_schema', xansql));
|
|
69
|
-
if (!res.success) {
|
|
70
|
-
throw new XansqlError({
|
|
71
|
-
message: `Failed to fetch schema: ${res.message || 'Unknown error'}`
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
return res.data;
|
|
75
|
-
};
|
|
76
|
-
const uploadFile = async (file, xansql) => {
|
|
77
|
-
const client = await getClient(xansql);
|
|
78
|
-
const res = await client.uploadFile(file);
|
|
79
|
-
return res.data;
|
|
80
|
-
};
|
|
81
|
-
const deleteFile = async (fileId, xansql) => {
|
|
82
|
-
const client = await getClient(xansql);
|
|
83
|
-
await client.deleteFile(fileId);
|
|
84
|
-
};
|
|
85
|
-
return {
|
|
86
|
-
engine: engine || 'mysql',
|
|
87
|
-
execute,
|
|
88
|
-
getSchema,
|
|
89
|
-
file: {
|
|
90
|
-
upload: uploadFile,
|
|
91
|
-
delete: deleteFile
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
export { XansqlBridge as default };
|
|
1
|
+
export { default as XansqlBridgeDialect } from './dialect.js';
|
|
2
|
+
export { default as XansqlBridgeServer } from './server.js';
|
|
97
3
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xansql/bridge",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"main": "./index.cjs",
|
|
5
|
-
"module": "./index.js",
|
|
6
|
-
"types": "./index.d.ts",
|
|
3
|
+
"version": "1.0.4",
|
|
7
4
|
"description": "Xansql bridge",
|
|
8
5
|
"author": "Devnax",
|
|
9
6
|
"publishConfig": {
|
|
@@ -16,7 +13,7 @@
|
|
|
16
13
|
"url": "https://github.com/xansql/bridge.git"
|
|
17
14
|
},
|
|
18
15
|
"dependencies": {
|
|
19
|
-
"securequ": "^1.1.
|
|
16
|
+
"securequ": "^1.1.19"
|
|
20
17
|
},
|
|
21
18
|
"exports": {
|
|
22
19
|
".": {
|
|
@@ -24,6 +21,11 @@
|
|
|
24
21
|
"require": "./index.cjs",
|
|
25
22
|
"types": "./index.d.ts"
|
|
26
23
|
},
|
|
24
|
+
"./dialect": {
|
|
25
|
+
"import": "./dialect.js",
|
|
26
|
+
"require": "./dialect.cjs",
|
|
27
|
+
"types": "./dialect.d.ts"
|
|
28
|
+
},
|
|
27
29
|
"./server": {
|
|
28
30
|
"import": "./server.js",
|
|
29
31
|
"require": "./server.cjs",
|
package/server.cjs
CHANGED
package/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","sources":["../src/server.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"server.cjs","sources":["../src/server.ts"],"sourcesContent":["import { Xansql, XansqlError, Model } from \"@xansql/core\";\r\nimport { makePath, makeSecret } from \"./base\";\r\nimport { ListenOptions, XansqlBridgeAuthorizedInfo, XansqlBridgeServerConfig } from \"./types\";\r\nimport { crypto, SecurequServer } from \"securequ\";\r\n\r\nclass XansqlBridgeServer {\r\n readonly REQUEST_CONTENT_TYPE = 'application/octet-stream';\r\n xansql: Xansql;\r\n config: XansqlBridgeServerConfig;\r\n private server: SecurequServer | null = null;\r\n\r\n constructor(xansql: Xansql, config: XansqlBridgeServerConfig) {\r\n this.xansql = xansql;\r\n this.config = config;\r\n }\r\n\r\n async authorized(info: XansqlBridgeAuthorizedInfo) {\r\n const config = this.config;\r\n if (config.isAuthorized) {\r\n const isPermit = await config.isAuthorized(info)\r\n if (!isPermit) throw new XansqlError({\r\n message: \"isAuthorized denied for server initialization.\",\r\n model: info.model ? info.model.table : undefined,\r\n })\r\n }\r\n }\r\n\r\n async initial() {\r\n if (this.server) return this.server;\r\n\r\n const config = this.config;\r\n const xansql = this.xansql\r\n const secret = await makeSecret(this.xansql);\r\n\r\n const server = new SecurequServer({\r\n ...(config || {}),\r\n clients: [\r\n {\r\n origin: `*`,\r\n secret\r\n }\r\n ]\r\n });\r\n\r\n server.get(await makePath('find', xansql), async (req: any) => {\r\n\r\n const params: any = req.searchParams\r\n await this.authorized({\r\n method: \"GET\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n\r\n server.post(await makePath('insert', xansql), async (req: any) => {\r\n const params: any = req.body\r\n await this.authorized({\r\n method: \"POST\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n server.put(await makePath('update', xansql), async (req: any) => {\r\n const params: any = req.body\r\n await this.authorized({\r\n method: \"PUT\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n server.delete(await makePath('delete', xansql), async (req: any) => {\r\n const params: any = req.searchParams\r\n await this.authorized({\r\n method: \"DELETE\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n\r\n server.post(await makePath('executer', xansql), async (req: any) => {\r\n const params: any = req.body\r\n await this.authorized({\r\n method: \"POST\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n server.get(await makePath('raw_schema', xansql), async (req: any) => {\r\n throw await xansql.dialect.getSchema(xansql);\r\n })\r\n\r\n this.server = server;\r\n return this.server;\r\n }\r\n\r\n async listen(url: string, options: ListenOptions) {\r\n\r\n const server = await this.initial()\r\n try {\r\n const res = await server.listen(url, options)\r\n return {\r\n status: res.status,\r\n value: res.value,\r\n }\r\n } catch (error: any) {\r\n\r\n const secret = await makeSecret(this.xansql)\r\n return {\r\n status: 500,\r\n value: await crypto.encryptBuffer({\r\n success: false,\r\n message: error.message || 'Internal Server Error'\r\n }, secret)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default XansqlBridgeServer"],"names":["XansqlError","makeSecret","SecurequServer","makePath","crypto"],"mappings":"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"}
|
package/server.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { SecurequServer } from 'securequ';
|
|
2
1
|
import { Xansql } from '@xansql/core';
|
|
3
2
|
import { XansqlBridgeServerConfig, XansqlBridgeAuthorizedInfo, ListenOptions } from './types.js';
|
|
3
|
+
import { SecurequServer } from 'securequ';
|
|
4
4
|
|
|
5
5
|
declare class XansqlBridgeServer {
|
|
6
6
|
readonly REQUEST_CONTENT_TYPE = "application/octet-stream";
|
package/server.js
CHANGED
package/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":["import { Xansql, XansqlError, Model } from \"@xansql/core\";\r\nimport { makePath, makeSecret } from \"./base\";\r\nimport { ListenOptions, XansqlBridgeAuthorizedInfo, XansqlBridgeServerConfig } from \"./types\";\r\nimport { crypto, SecurequServer } from \"securequ\";\r\n\r\nclass XansqlBridgeServer {\r\n readonly REQUEST_CONTENT_TYPE = 'application/octet-stream';\r\n xansql: Xansql;\r\n config: XansqlBridgeServerConfig;\r\n private server: SecurequServer | null = null;\r\n\r\n constructor(xansql: Xansql, config: XansqlBridgeServerConfig) {\r\n this.xansql = xansql;\r\n this.config = config;\r\n }\r\n\r\n async authorized(info: XansqlBridgeAuthorizedInfo) {\r\n const config = this.config;\r\n if (config.isAuthorized) {\r\n const isPermit = await config.isAuthorized(info)\r\n if (!isPermit) throw new XansqlError({\r\n message: \"isAuthorized denied for server initialization.\",\r\n model: info.model ? info.model.table : undefined,\r\n })\r\n }\r\n }\r\n\r\n async initial() {\r\n if (this.server) return this.server;\r\n\r\n const config = this.config;\r\n const xansql = this.xansql\r\n const secret = await makeSecret(this.xansql);\r\n\r\n const server = new SecurequServer({\r\n ...(config || {}),\r\n clients: [\r\n {\r\n origin: `*`,\r\n secret\r\n }\r\n ]\r\n });\r\n\r\n server.get(await makePath('find', xansql), async (req: any) => {\r\n\r\n const params: any = req.searchParams\r\n await this.authorized({\r\n method: \"GET\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n\r\n server.post(await makePath('insert', xansql), async (req: any) => {\r\n const params: any = req.body\r\n await this.authorized({\r\n method: \"POST\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n server.put(await makePath('update', xansql), async (req: any) => {\r\n const params: any = req.body\r\n await this.authorized({\r\n method: \"PUT\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n server.delete(await makePath('delete', xansql), async (req: any) => {\r\n const params: any = req.searchParams\r\n await this.authorized({\r\n method: \"DELETE\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n\r\n server.post(await makePath('executer', xansql), async (req: any) => {\r\n const params: any = req.body\r\n await this.authorized({\r\n method: \"POST\",\r\n model: xansql.models.get(params.table) as Model,\r\n action: params.action,\r\n })\r\n throw await xansql.execute(params.sql);\r\n })\r\n\r\n server.get(await makePath('raw_schema', xansql), async (req: any) => {\r\n throw await xansql.dialect.getSchema(xansql);\r\n })\r\n\r\n this.server = server;\r\n return this.server;\r\n }\r\n\r\n async listen(url: string, options: ListenOptions) {\r\n\r\n const server = await this.initial()\r\n try {\r\n const res = await server.listen(url, options)\r\n return {\r\n status: res.status,\r\n value: res.value,\r\n }\r\n } catch (error: any) {\r\n\r\n const secret = await makeSecret(this.xansql)\r\n return {\r\n status: 500,\r\n value: await crypto.encryptBuffer({\r\n success: false,\r\n message: error.message || 'Internal Server Error'\r\n }, secret)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default XansqlBridgeServer"],"names":[],"mappings":";;;;AAKA,MAAM,kBAAkB,CAAA;IAMrB,WAAA,CAAY,MAAc,EAAE,MAAgC,EAAA;QALnD,IAAA,CAAA,oBAAoB,GAAG,0BAA0B;QAGlD,IAAA,CAAA,MAAM,GAA0B,IAAI;AAGzC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;IACvB;IAEA,MAAM,UAAU,CAAC,IAAgC,EAAA;AAC9C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACtB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;AAChD,YAAA,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,WAAW,CAAC;AAClC,oBAAA,OAAO,EAAE,gDAAgD;AACzD,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS;AAClD,iBAAA,CAAC;QACL;IACH;AAEA,IAAA,MAAM,OAAO,GAAA;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM;AAEnC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;AAE5C,QAAA,MAAM,MAAM,GAAG,IAAI,cAAc,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,GAC1B,MAAM,IAAI,EAAE,EAAC,EAAA,EACjB,OAAO,EAAE;AACN,gBAAA;AACG,oBAAA,MAAM,EAAE,CAAA,CAAA,CAAG;oBACX;AACF;AACH,aAAA,EAAA,CAAA,CACF;AAEF,QAAA,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAQ,KAAI;AAE3D,YAAA,MAAM,MAAM,GAAQ,GAAG,CAAC,YAAY;YACpC,MAAM,IAAI,CAAC,UAAU,CAAC;AACnB,gBAAA,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAU;gBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;AACvB,aAAA,CAAC;YACF,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;AAGF,QAAA,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAQ,KAAI;AAC9D,YAAA,MAAM,MAAM,GAAQ,GAAG,CAAC,IAAI;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC;AACnB,gBAAA,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAU;gBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;AACvB,aAAA,CAAC;YACF,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAQ,KAAI;AAC7D,YAAA,MAAM,MAAM,GAAQ,GAAG,CAAC,IAAI;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC;AACnB,gBAAA,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAU;gBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;AACvB,aAAA,CAAC;YACF,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,MAAM,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAQ,KAAI;AAChE,YAAA,MAAM,MAAM,GAAQ,GAAG,CAAC,YAAY;YACpC,MAAM,IAAI,CAAC,UAAU,CAAC;AACnB,gBAAA,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAU;gBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;AACvB,aAAA,CAAC;YACF,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;AAGF,QAAA,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,GAAQ,KAAI;AAChE,YAAA,MAAM,MAAM,GAAQ,GAAG,CAAC,IAAI;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC;AACnB,gBAAA,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAU;gBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;AACvB,aAAA,CAAC;YACF,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAQ,KAAI;YACjE,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;AAC/C,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,OAAO,IAAI,CAAC,MAAM;IACrB;AAEA,IAAA,MAAM,MAAM,CAAC,GAAW,EAAE,OAAsB,EAAA;AAE7C,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI;YACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC;YAC7C,OAAO;gBACJ,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;aAClB;QACJ;QAAE,OAAO,KAAU,EAAE;YAElB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5C,OAAO;AACJ,gBAAA,MAAM,EAAE,GAAG;AACX,gBAAA,KAAK,EAAE,MAAM,MAAM,CAAC,aAAa,CAAC;AAC/B,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI;AAC5B,iBAAA,EAAE,MAAM;aACX;QACJ;IACH;AACF;;;;"}
|
package/types.d.ts
CHANGED
|
@@ -6,6 +6,16 @@ type XansqlBridgeAuthorizedInfo = {
|
|
|
6
6
|
model: Model | null;
|
|
7
7
|
action: string;
|
|
8
8
|
};
|
|
9
|
+
type XansqlBridgeInfo = {
|
|
10
|
+
body: any;
|
|
11
|
+
headers: {
|
|
12
|
+
[key: string]: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
type XansqlBridgeResponse = {
|
|
16
|
+
status: number;
|
|
17
|
+
value: any;
|
|
18
|
+
};
|
|
9
19
|
type XansqlBridgeServerConfig = {
|
|
10
20
|
basepath: string;
|
|
11
21
|
mode?: "production" | "development";
|
|
@@ -14,4 +24,4 @@ type XansqlBridgeServerConfig = {
|
|
|
14
24
|
};
|
|
15
25
|
type ListenOptions = ListenerInfo;
|
|
16
26
|
|
|
17
|
-
export type { ListenOptions, XansqlBridgeAuthorizedInfo, XansqlBridgeServerConfig };
|
|
27
|
+
export type { ListenOptions, XansqlBridgeAuthorizedInfo, XansqlBridgeInfo, XansqlBridgeResponse, XansqlBridgeServerConfig };
|