dbgate-plugin-firestore 6.6.3 → 6.6.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/dist/backend.js +1 -1
- package/dist/frontend.js +1 -1
- package/package.json +3 -3
package/dist/backend.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var __webpack_modules__={994:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.oracleSplitterOptions=t.redisSplitterOptions=t.noSplitSplitterOptions=t.mongoSplitterOptions=t.sqliteSplitterOptions=t.postgreSplitterOptions=t.mssqlSplitterOptions=t.mysqlSplitterOptions=t.defaultSplitterOptions=void 0,t.defaultSplitterOptions={stringsBegins:["'"],stringsEnds:{"'":"'"},stringEscapes:{"'":"'"},allowSemicolon:!0,allowCustomDelimiter:!1,allowCustomSqlTerminator:!1,allowGoDelimiter:!1,allowSlashDelimiter:!1,allowDollarDollarString:!1,noSplit:!1,skipSeparatorBeginEnd:!1,doubleDashComments:!0,multilineComments:!0,javaScriptComments:!1,returnRichInfo:!1,splitByLines:!1,splitByEmptyLine:!1,preventSingleLineSplit:!1,adaptiveGoSplit:!1,ignoreComments:!1,copyFromStdin:!1,queryParameterStyle:null},t.mysqlSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowCustomDelimiter:!0,stringsBegins:["'","`",'"'],stringsEnds:{"'":"'","`":"`",'"':'"'},stringEscapes:{"'":"\\","`":"`",'"':"\\"}}),t.mssqlSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowSemicolon:!1,allowGoDelimiter:!0,stringsBegins:["'","["],stringsEnds:{"'":"'","[":"]"},stringEscapes:{"'":"'"}}),t.postgreSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowDollarDollarString:!0,stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"'",'"':'"'}}),t.sqliteSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{skipSeparatorBeginEnd:!0,stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"'",'"':'"'}}),t.mongoSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"\\",'"':"\\"}}),t.noSplitSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{noSplit:!0}),t.redisSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{splitByLines:!0}),t.oracleSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowCustomSqlTerminator:!0,allowSlashDelimiter:!0,stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"'",'"':'"'}})},688:(e,t,r)=>{const{DatabaseAnalyser:n}=r(355);e.exports=class extends n{constructor(e,t,r){super(e,t,r)}async _runAnalysis(){const e=await this.dbhan.client.db.listCollections();return{collections:await Promise.all(e.map((async e=>{const t=await e.count().get(),{count:r}=t.data();return{pureName:e.id,objectId:e.id,tableRowCount:r,uniqueKey:[{columnName:"_id"}],autoValueColumns:[{columnName:"_id"}]}}))),views:[],procedures:[],functions:[]}}}},831:(module,__unused_webpack_exports,__webpack_require__)=>{const stream=__webpack_require__(203),Analyser=__webpack_require__(688),driverBase=__webpack_require__(534),{getLogger}=__webpack_require__(355),admin=__webpack_require__(675),{convertToFirebaseFields,normalizeFirebaseDocumentData,getQuerySnapshotResults}=__webpack_require__(790),{isAggregateQuerySnapshot,isQuerySnapshot,isDocumentSnapshot,isReadableStream}=__webpack_require__(633),{executeFirebaseQuery}=__webpack_require__(295),{createCollection,deleteCollection,renameCollection,cloneCollection}=__webpack_require__(61),createBulkInsertStream=__webpack_require__(122),driver={...driverBase,analyserClass:Analyser,async connect({connectionDefinition:e}){const t=JSON.parse(e),r=admin.initializeApp({credential:admin.credential.cert(t)}),n=r.firestore();return{client:{app:r,db:n}}},async close(e){await e.client.app.delete()},query:async()=>({rows:[],columns:[]}),async stream(dbhan,sql,options){let func,exprValue;try{func=eval(`(db) => ${sql}`)}catch(e){return options.info?.({message:"Error compiling expression: "+e.message,time:new Date,severity:"error"}),void options.done?.(null)}try{exprValue=await func(dbhan.client.db)}catch(e){return options.info?.({message:"Error evaluating expression: "+e.message,time:new Date,severity:"error"}),void options.done?.(null)}if(options.info?.({message:"Command succesfully executed",time:new Date,severity:"info"}),isAggregateQuerySnapshot(exprValue)){const e=normalizeFirebaseDocumentData(exprValue.data());return options.recordset({__isDynamicStructure:!0}),options.row(e),void options.done?.(e)}if(isDocumentSnapshot(exprValue)){const e=normalizeFirebaseDocumentData(exprValue.data()),t={...e,_id:exprValue.id};return options.recordset({__isDynamicStructure:!0}),options.row(t),void options.done?.(t)}if(isQuerySnapshot(exprValue)){const e=getQuerySnapshotResults(exprValue);options.recordset({__isDynamicStructure:!0});for(const t of e)options.row(t);options.done?.(e.length)}else{if(isReadableStream(exprValue))return options.recordset({__isDynamicStructure:!0}),exprValue.on("data",(e=>{const t=normalizeFirebaseDocumentData(e.data()),r={_id:e.id,...t};options.row(r)})),exprValue.on("error",(e=>{options.info?.({message:e.message,time:new Date,severity:"error"}),options.done?.(null)})),void exprValue.on("end",(()=>{options.done?.(null)}));options.info?.({message:"Expression did not return a Firestore snapshot",time:new Date,severity:"info",detail:exprValue}),options.done?.(null)}},async script(e,t,{useTransaction:r}={useTransaction:!1}){throw console.warn("Script execution is not implemented for Firestore driver"),new Error("Not implemented")},async readQuery(dbhan,sql,structure){try{const e=JSON.parse(sql);e&&e.pureName&&(sql=`db.collection('${e.pureName}').stream()`)}catch(e){}const pass=new stream.PassThrough({objectMode:!0,highWaterMark:100});try{const func=eval(`(db) => ${sql}`),exprValue=func(dbhan.client.db);exprValue.on("data",(e=>{const t={...normalizeFirebaseDocumentData(e.data()),_id:e.id};pass.write(t)})),exprValue.on("end",(e=>{pass.emit("end")})),exprValue.on("error",(e=>{pass.emit("error",e)}))}catch(e){pass.emit("error",e)}return pass},async readJsonQuery(e,t,r){const{collection:n}=t,o=new stream.PassThrough({objectMode:!0,highWaterMark:100});try{const t=e.client.db.collection(n).stream();t.on("data",(e=>{const t=normalizeFirebaseDocumentData(e.data()),r={_id:e.id,...t};o.write(r)})),t.on("end",(e=>{o.emit("end")})),t.on("error",(e=>{o.emit("error",e)}))}catch(e){o.emit("error",e)}return o},async writeTable(e,t,r){return createBulkInsertStream(this,stream,e,t,r)},getVersion:async e=>({version:`Firestore DB - ${e.client.db.databaseId}`}),async loadFieldValues(e,t,r,n){try{const o=e.client.db.collection(t.pureName),i=await o.select(r).get(),s=new Set;i.forEach((e=>{const t=e.get(r);null!=t&&s.add(t)}));const a=Array.from(s).sort();return n?a.filter((e=>String(e).toLowerCase().includes(n.toLowerCase()))):a.map((e=>({value:e})))}catch(e){return{errorMessage:e.message}}},async readCollection(e,t){try{if(t.countDocuments){return(await e.client.db.collection(t.pureName).count().get()).data()}return{rows:await executeFirebaseQuery(e.client.db,t.pureName,t)}}catch(e){return{errorMessage:e.message}}},async updateCollection(e,t){try{for(const r of t.inserts){const{pureName:t,fields:n}=r,o=n._id,i=await convertToFirebaseFields(n,e.client.db);if(o){const r=e.client.db.collection(t).doc(o);await r.set(i)}else await e.client.db.collection(t).add(i)}for(const r of t.updates){const{pureName:t,condition:n,fields:o}=r,i=e.client.db.collection(t).doc(n._id),s=await convertToFirebaseFields(o,e.client.db);await i.update(s)}for(const r of t.deletes){const{pureName:t,condition:n}=r,o=e.client.db.collection(t).doc(n._id);await o.delete()}}catch(e){return console.error("Error updating collection:",e),{errorMessage:e.message}}},async operation(e,t,r){const{type:n,collection:o}=t,{db:i}=e.client;switch(n){case"createCollection":await createCollection(i,o.name);break;case"dropCollection":await deleteCollection(i,o);break;case"renameCollection":await renameCollection(i,o,t.newName);break;case"cloneCollection":await cloneCollection(i,o,t.newName);break;default:throw new Error(`Operation type ${n} not supported`)}}};module.exports=driver},122:(e,t,r)=>{const n=r(982),{getLogger:o,extractErrorLogData:i}=global.DBGATE_PACKAGES["dbgate-tools"],{normalizeFirebaseDocumentData:s}=r(790),{deleteCollection:a}=r(61),c=o("firestoreBulkInsert");e.exports=function(e,t,r,o,l){const u=o.pureName,p=r.client.db,d=new t.Writable({objectMode:!0});return d.buffer=[],d.wasHeader=!1,d.addRow=e=>{!d.wasHeader&&(d.wasHeader=!0,e.__isStreamHeader)||(l.createStringId&&(e={...e,_id:n.randomBytes(20)}),d.buffer.push(s(e)))},d.checkStructure=async()=>{try{l.dropIfExists&&(c.info(`DBGM-00134 Dropping collection ${u}`),await a(p,u)),l.truncate&&(c.info(`DBGM-00135 Truncating collection ${u}`),await a(p,u))}catch(e){c.error(i(e),"DBGM-00136 Error during preparing firestore bulk insert collection, stopped"),d.destroy(e)}},d.send=async()=>{try{const e=d.buffer;d.buffer=[];const t=p.batch();for(const r of e)if(r._id){const e=p.collection(u).doc(r._id);t.create(e,r)}else{const e=p.collection(u);t.create(e.doc(),r)}await t.commit()}catch(e){c.error(i(e),"DBGM-00196 Error bulk insert collection, stopped"),d.destroy(e)}},d.sendIfFull=async()=>{d.buffer.length>100&&await d.send()},d._write=async(e,t,r)=>{d.addRow(e),await d.sendIfFull(),r()},d._final=async e=>{await d.send(),e()},d}},633:e=>{e.exports={isAggregateQuerySnapshot:function(e){return!(!e||"object"!=typeof e||"function"!=typeof e.data)},isQuerySnapshot:function(e){return!(!e||"object"!=typeof e||!Array.isArray(e.docs)||"number"!=typeof e.size)},isDocumentSnapshot:function(e){return!(!e||"object"!=typeof e||"string"!=typeof e.id||"function"!=typeof e.exists)},isReadableStream:function(e){return e&&"object"==typeof e&&"function"==typeof e.read&&"function"==typeof e.on&&"function"==typeof e.pipe}}},790:(e,t,r)=>{const{firestore:n}=r(675);function o(e){return/^_{1,}id$/.test(e)?[e,`_${e}`]:[e,e]}function i(e){return/^_{2,}id$/.test(e)?[e,e.substring(1)]:[e,e]}function s(e){if(!e)return;const t=Object.keys(e).sort().map(o),r={};for(const[n,o]of t){const t=e[n];r[o]=c(t)}return r}async function a(e,t){if(null===e||"object"!=typeof e)return e;if("$date"in e)return n.Timestamp.fromDate(new Date(e.$date));if("$geoPoint"in e&&"object"==typeof e.$geoPoint)return new n.GeoPoint(e.$geoPoint.latitude,e.$geoPoint.longitude);if("$fsDocumentRef"in e&&"object"==typeof e.$fsDocumentRef){const{documentPath:r}=e.$fsDocumentRef;return t.doc(r)}return e}function c(e){return e instanceof n.Timestamp?{$date:e.toDate().toISOString()}:e instanceof n.GeoPoint?{$geoPoint:{latitude:e.latitude,longitude:e.longitude}}:e instanceof n.DocumentReference?{$fsDocumentRef:{documentPath:e.path}}:e}e.exports={convertToFirestoreFieldValue:a,normalizeDocumentDataFieldValue:c,normalizeFirebaseDocumentData:s,convertToFirebaseFields:async function(e,t){const r={},n=Object.keys(e).map(i);for(const[o,i]of n){const n=e[o];r[i]=await a(n,t)}return r},getQuerySnapshotResults:function(e){const t=[];return e.forEach((e=>{const r=s(e.data());t.push({_id:e.id,...r})})),t}}},61:e=>{async function t(e,t,r=256){const n=e.collection(t);for(;;){const t=await n.limit(r).get();if(t.empty)break;const o=e.batch();t.docs.forEach((e=>{o.delete(e.ref)})),await o.commit()}}async function r(e,t,r,n=256){const o=e.collection(t),i=e.collection(r);let s=0;for(;;){const t=await o.offset(s).limit(n).get();if(t.empty)break;const r=e.batch();t.docs.forEach((e=>{const t=i.doc(e.id);r.set(t,e.data())})),await r.commit(),s+=n}}e.exports={deleteCollection:t,renameCollection:async function(e,n,o,i=256){await r(e,n,o,i),await t(e,n,i)},createCollection:async function(e,t){const r=e.collection(t);await r.add({name:"First Document"})},cloneCollection:r}},295:(e,t,r)=>{const{getLogger:n}=r(355),{getQuerySnapshotResults:o}=r(790),i=n("firestoreDriver");function s(e,t,r={}){const{condition:n,sort:o,limit:i,skip:s}=r,p=o?.filter((e=>"_id"!==e.columnName));let d=e.collection(t);return n&&(d=a(d,n)),p&&(d=c(d,p)),i&&(d=l(d,i)),s&&(d=u(d,s)),d}function a(e,t){if(!t)return e;switch(t.conditionType){case"and":return t.conditions.reduce(((e,t)=>a(e,t)),e);case"or":const r=function(e){if("or"!==e.conditionType)return null;const t=e.conditions;if(!t.every((e=>"binary"===e.conditionType&&"="===e.operator||"isNull"===e.conditionType||"in"===e.conditionType))&&t.length)return null;const r=t,n=function(e){switch(e.conditionType){case"binary":return e.left.columnName||"";case"isNull":case"in":return e.expr.columnName||""}return""}(r[0]),o=r.flatMap((e=>function(e){switch(e.conditionType){case"binary":return[e.right.value];case"isNull":return[null];case"in":return e.values}return[]}(e)));return{fieldName:n,values:o}}(t);return r?e.where(r.fieldName,"in",r.values):(i.warn('OR conditions are not directly supported in Firebase. Use "in" operator for multiple values on same field.'),e);case"binary":const n=p(t.left),o=function(e){if("value"==e.exprType)return e.value;throw Error(`Unknown right operand type ${e.exprType}`)}(t.right);switch(t.operator){case"=":return e.where(n,"==",o);case"!=":case"<>":return e.where(n,"!=",o);case"<":return e.where(n,"<",o);case"<=":return e.where(n,"<=",o);case">":return e.where(n,">",o);case">=":return e.where(n,">=",o);default:return i.warn(`Unsupported binary operator ${t.operator}`),e}case"isNull":const s=p(t.expr);return e.where(s,"==",null);case"isNotNull":const c=p(t.expr);return e.where(c,"!=",null);case"not":return i.warn("NOT conditions require manual inversion in Firebase"),e;case"specificPredicate":const l=p(t.expr);switch(t.predicate){case"exists":return e.where(l,"!=",null);case"notExists":return e.where(l,"==",null);case"emptyArray":return e.where(l,"==",[]);case"notEmptyArray":return i.warn("notEmptyArray predicate requires client-side filtering in Firebase"),e;default:return i.warn(`Unknown predicate ${t.predicate}`),e}case"in":const u=p(t.expr);return e.where(u,"in",t.values);case"like":const d=t.right.value.slice(1,-1);return t.left.columnName?e.where(t.left.columnName,">=",d).where(t.left.columnName,"<=",`${d}`):e;default:return i.warn(`Unknown condition ${JSON.stringify(t)}`),e}}function c(e,t){if(!t||0===t.length)return e;let r=e;for(const{columnName:e,direction:n}of t)r=r.orderBy(e,"DESC"===n?"desc":"asc");return r}function l(e,t){return t?e.limit(t):e}function u(e,t){return t?e.offset(t):e}function p(e){if("column"==e.exprType&&e.columnName)return e.columnName;throw Error(`Unknown left operand type ${e.exprType} for column ${e.columnName||""}`)}e.exports={createFirebaseQuery:s,executeFirebaseQuery:async function(e,t,r={}){let n=s(e,t,r);const i=await n.get();return o(i)},applyFirebaseCondition:a,applyFirebaseSort:c,applyFirebaseLimit:l,applyFirebaseOffset:u}},237:(e,t,r)=>{const n=r(831);e.exports={packageName:"dbgate-plugin-firestore",drivers:[n]}},197:(e,t,r)=>{const{SqlDumper:n}=r(355);e.exports=class extends n{}},534:(e,t,r)=>{const{driverBase:n}=global.DBGATE_PACKAGES["dbgate-tools"],o=r(197),{mongoSplitterOptions:i}=r(994),{queryOptionsToString:s}=r(208),a={...n,dumperClass:o,dialect:{limitSelect:!0,rangeSelect:!0,offsetFetchRangeSyntax:!0,stringEscapeChar:"'",fallbackDataType:"nvarchar(max)",quoteIdentifier:e=>`[${e}]`},engine:"firestore@dbgate-plugin-firestore",title:"Firestore",databaseEngineTypes:["document"],multipleSchema:!1,supportsDatabaseProfiler:!1,readOnlySessions:!1,editorMode:"javascript",dataEditorTypesBehaviour:{parseJsonNull:!0,parseJsonBoolean:!0,parseNumber:!0,parseJsonArray:!0,parseJsonObject:!0,parseDateAsDollar:!0,parseGeopointAsDollar:!0,parseFsDocumentRefAsDollar:!0,explicitDataType:!0,supportNumberType:!0,supportStringType:!0,supportBooleanType:!0,supportDateType:!0,supportJsonType:!0,supportNullType:!0,supportFieldRemoval:!0},getFilterBehaviour:(e,t)=>t.firestoreFilterBehaviours,getCollectionExportQueryScript:(e,t,r)=>s(e,t,r),getCollectionExportQueryJson:(e,t,r)=>({collection:e,condition:t,sort:r}),beforeConnectionSave:e=>({...e,singleDatabase:!0,defaultDatabase:"Firestore"}),getQuerySplitterOptions:()=>i,showConnectionField:e=>["connectionDefinition"].includes(e),showConnectionTab:()=>!1,collectionSingularLabel:"collection",collectionPluralLabel:"collections",newCollectionFormParams:[{type:"text",label:"Collection name",name:"name",focused:!0}],getCollectionUpdateScript(e){let t="";for(const r of e.inserts){const{pureName:e,fields:n}=r;t+=`db.collection('${e}').add(${JSON.stringify(n)});\n`}for(const r of e.updates){const{pureName:e,condition:n,fields:o}=r;t+=`db.collection('${e}').doc(${JSON.stringify(n._id)}).set(${JSON.stringify(o)});\n`}for(const r of e.deletes){const{pureName:e,condition:n}=r;t+=`db.collection('${e}').doc(${JSON.stringify(n._id)}).delete();\n`}return t}};e.exports=a},208:e=>{function t(e){return JSON.stringify(e)}function r(e){if(!e)return"";switch(e.conditionType){case"and":return e.conditions.map((e=>r(e))).join("");case"binary":{const{operator:r,left:n,right:o}=e;if(!n.columnName)return"";let i=r;return"="===r&&(i="=="),"<>"===r&&(i="!="),`.where('${n.columnName}', '${i}', ${t(o.value)})`}case"isNull":return e.expr.columnName?`.where('${e.expr.columnName}', '==', null)`:"";case"isNotNull":return e.expr.columnName?`.where('${e.expr.columnName}', '!=', null)`:"";case"specificPredicate":if(!e.expr.columnName)return"";switch(e.predicate){case"exists":return`.where('${e.expr.columnName}', '!=', null)`;case"notExists":return`.where('${e.expr.columnName}', '==', null)`;case"emptyArray":return`.where('${e.expr.columnName}', '==', [])`;default:return""}case"in":return e.expr.columnName?`.where('${e.expr.columnName}', 'in', ${t(e.values)})`:"";case"like":{if(!e.left.columnName)return"";const r=e.right.value.slice(1,-1);return`.where('${e.left.columnName}', '>=', ${t(r)}).where('${e.left.columnName}', '<=', ${t(r+"")})`}default:return""}}e.exports={queryOptionsToString:function(e,t,n){let o=`db.collection('${e}')`;if(o+=r(t),n?.length)for(const{columnName:e,direction:t}of n)o+=`.orderBy('${e}'${t?`, '${t.toLowerCase()}'`:""})`;return o+=".stream()",o}}},355:e=>{"use strict";e.exports=require("dbgate-tools")},675:e=>{"use strict";e.exports=require("firebase-admin")},982:e=>{"use strict";e.exports=require("crypto")},203:e=>{"use strict";e.exports=require("stream")}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}var __webpack_exports__=__webpack_require__(237);module.exports=__webpack_exports__})();
|
|
1
|
+
(()=>{var __webpack_modules__={994:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.firebirdSplitterOptions=t.oracleSplitterOptions=t.redisSplitterOptions=t.noSplitSplitterOptions=t.mongoSplitterOptions=t.sqliteSplitterOptions=t.postgreSplitterOptions=t.mssqlSplitterOptions=t.mysqlSplitterOptions=t.defaultSplitterOptions=void 0,t.defaultSplitterOptions={stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"'",'"':'"'},allowSemicolon:!0,allowCustomDelimiter:!1,allowCustomSqlTerminator:!1,allowGoDelimiter:!1,allowSlashDelimiter:!1,allowDollarDollarString:!1,noSplit:!1,skipSeparatorBeginEnd:!1,doubleDashComments:!0,multilineComments:!0,javaScriptComments:!1,returnRichInfo:!1,splitByLines:!1,splitByEmptyLine:!1,preventSingleLineSplit:!1,adaptiveGoSplit:!1,ignoreComments:!1,copyFromStdin:!1,queryParameterStyle:null},t.mysqlSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowCustomDelimiter:!0,stringsBegins:["'","`",'"'],stringsEnds:{"'":"'","`":"`",'"':'"'},stringEscapes:{"'":"\\","`":"`",'"':"\\"}}),t.mssqlSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowSemicolon:!1,allowGoDelimiter:!0,stringsBegins:["'","["],stringsEnds:{"'":"'","[":"]"},stringEscapes:{"'":"'"}}),t.postgreSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowDollarDollarString:!0,stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"'",'"':'"'}}),t.sqliteSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{skipSeparatorBeginEnd:!0,stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"'",'"':'"'}}),t.mongoSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"\\",'"':"\\"}}),t.noSplitSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{noSplit:!0}),t.redisSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{splitByLines:!0}),t.oracleSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{allowCustomSqlTerminator:!0,allowSlashDelimiter:!0,stringsBegins:["'",'"'],stringsEnds:{"'":"'",'"':'"'},stringEscapes:{"'":"'",'"':'"'}}),t.firebirdSplitterOptions=Object.assign(Object.assign({},t.defaultSplitterOptions),{skipSeparatorBeginEnd:!0,queryParameterStyle:":"})},688:(e,t,r)=>{const{DatabaseAnalyser:n}=r(355);e.exports=class extends n{constructor(e,t,r){super(e,t,r)}async _runAnalysis(){const e=await this.dbhan.client.db.listCollections();return{collections:await Promise.all(e.map((async e=>{const t=await e.count().get(),{count:r}=t.data();return{pureName:e.id,objectId:e.id,tableRowCount:r,uniqueKey:[{columnName:"_id"}],autoValueColumns:[{columnName:"_id"}]}}))),views:[],procedures:[],functions:[]}}}},831:(module,__unused_webpack_exports,__webpack_require__)=>{const stream=__webpack_require__(203),Analyser=__webpack_require__(688),driverBase=__webpack_require__(534),{getLogger}=__webpack_require__(355),admin=__webpack_require__(675),{convertToFirebaseFields,normalizeFirebaseDocumentData,getQuerySnapshotResults}=__webpack_require__(790),{isAggregateQuerySnapshot,isQuerySnapshot,isDocumentSnapshot,isReadableStream}=__webpack_require__(633),{executeFirebaseQuery}=__webpack_require__(295),{createCollection,deleteCollection,renameCollection,cloneCollection}=__webpack_require__(61),createBulkInsertStream=__webpack_require__(122),driver={...driverBase,analyserClass:Analyser,async connect({connectionDefinition:e}){const t=JSON.parse(e),r=admin.initializeApp({credential:admin.credential.cert(t)}),n=r.firestore();return{client:{app:r,db:n}}},async close(e){await e.client.app.delete()},query:async()=>({rows:[],columns:[]}),async stream(dbhan,sql,options){let func,exprValue;try{func=eval(`(db) => ${sql}`)}catch(e){return options.info?.({message:"Error compiling expression: "+e.message,time:new Date,severity:"error"}),void options.done?.(null)}try{exprValue=await func(dbhan.client.db)}catch(e){return options.info?.({message:"Error evaluating expression: "+e.message,time:new Date,severity:"error"}),void options.done?.(null)}if(options.info?.({message:"Command succesfully executed",time:new Date,severity:"info"}),isAggregateQuerySnapshot(exprValue)){const e=normalizeFirebaseDocumentData(exprValue.data());return options.recordset({__isDynamicStructure:!0}),options.row(e),void options.done?.(e)}if(isDocumentSnapshot(exprValue)){const e=normalizeFirebaseDocumentData(exprValue.data()),t={...e,_id:exprValue.id};return options.recordset({__isDynamicStructure:!0}),options.row(t),void options.done?.(t)}if(isQuerySnapshot(exprValue)){const e=getQuerySnapshotResults(exprValue);options.recordset({__isDynamicStructure:!0});for(const t of e)options.row(t);options.done?.(e.length)}else{if(isReadableStream(exprValue))return options.recordset({__isDynamicStructure:!0}),exprValue.on("data",(e=>{const t=normalizeFirebaseDocumentData(e.data()),r={_id:e.id,...t};options.row(r)})),exprValue.on("error",(e=>{options.info?.({message:e.message,time:new Date,severity:"error"}),options.done?.(null)})),void exprValue.on("end",(()=>{options.done?.(null)}));options.info?.({message:"Expression did not return a Firestore snapshot",time:new Date,severity:"info",detail:exprValue}),options.done?.(null)}},async script(e,t,{useTransaction:r}={useTransaction:!1}){throw console.warn("Script execution is not implemented for Firestore driver"),new Error("Not implemented")},async readQuery(dbhan,sql,structure){try{const e=JSON.parse(sql);e&&e.pureName&&(sql=`db.collection('${e.pureName}').stream()`)}catch(e){}const pass=new stream.PassThrough({objectMode:!0,highWaterMark:100});try{const func=eval(`(db) => ${sql}`),exprValue=func(dbhan.client.db);exprValue.on("data",(e=>{const t={...normalizeFirebaseDocumentData(e.data()),_id:e.id};pass.write(t)})),exprValue.on("end",(e=>{pass.emit("end")})),exprValue.on("error",(e=>{pass.emit("error",e)}))}catch(e){pass.emit("error",e)}return pass},async readJsonQuery(e,t,r){const{collection:n}=t,o=new stream.PassThrough({objectMode:!0,highWaterMark:100});try{const t=e.client.db.collection(n).stream();t.on("data",(e=>{const t=normalizeFirebaseDocumentData(e.data()),r={_id:e.id,...t};o.write(r)})),t.on("end",(e=>{o.emit("end")})),t.on("error",(e=>{o.emit("error",e)}))}catch(e){o.emit("error",e)}return o},async writeTable(e,t,r){return createBulkInsertStream(this,stream,e,t,r)},getVersion:async e=>({version:`Firestore DB - ${e.client.db.databaseId}`}),async loadFieldValues(e,t,r,n){try{const o=e.client.db.collection(t.pureName),i=await o.select(r).get(),s=new Set;i.forEach((e=>{const t=e.get(r);null!=t&&s.add(t)}));const a=Array.from(s).sort();return n?a.filter((e=>String(e).toLowerCase().includes(n.toLowerCase()))):a.map((e=>({value:e})))}catch(e){return{errorMessage:e.message}}},async readCollection(e,t){try{if(t.countDocuments){return(await e.client.db.collection(t.pureName).count().get()).data()}return{rows:await executeFirebaseQuery(e.client.db,t.pureName,t)}}catch(e){return{errorMessage:e.message}}},async updateCollection(e,t){try{for(const r of t.inserts){const{pureName:t,fields:n}=r,o=n._id,i=await convertToFirebaseFields(n,e.client.db);if(o){const r=e.client.db.collection(t).doc(o);await r.set(i)}else await e.client.db.collection(t).add(i)}for(const r of t.updates){const{pureName:t,condition:n,fields:o}=r,i=e.client.db.collection(t).doc(n._id),s=await convertToFirebaseFields(o,e.client.db);await i.update(s)}for(const r of t.deletes){const{pureName:t,condition:n}=r,o=e.client.db.collection(t).doc(n._id);await o.delete()}}catch(e){return console.error("Error updating collection:",e),{errorMessage:e.message}}},async operation(e,t,r){const{type:n,collection:o}=t,{db:i}=e.client;switch(n){case"createCollection":await createCollection(i,o.name);break;case"dropCollection":await deleteCollection(i,o);break;case"renameCollection":await renameCollection(i,o,t.newName);break;case"cloneCollection":await cloneCollection(i,o,t.newName);break;default:throw new Error(`Operation type ${n} not supported`)}}};module.exports=driver},122:(e,t,r)=>{const n=r(982),{getLogger:o,extractErrorLogData:i}=global.DBGATE_PACKAGES["dbgate-tools"],{normalizeFirebaseDocumentData:s}=r(790),{deleteCollection:a}=r(61),c=o("firestoreBulkInsert");e.exports=function(e,t,r,o,l){const u=o.pureName,p=r.client.db,d=new t.Writable({objectMode:!0});return d.buffer=[],d.wasHeader=!1,d.addRow=e=>{!d.wasHeader&&(d.wasHeader=!0,e.__isStreamHeader)||(l.createStringId&&(e={...e,_id:n.randomBytes(20)}),d.buffer.push(s(e)))},d.checkStructure=async()=>{try{l.dropIfExists&&(c.info(`DBGM-00134 Dropping collection ${u}`),await a(p,u)),l.truncate&&(c.info(`DBGM-00135 Truncating collection ${u}`),await a(p,u))}catch(e){c.error(i(e),"DBGM-00136 Error during preparing firestore bulk insert collection, stopped"),d.destroy(e)}},d.send=async()=>{try{const e=d.buffer;d.buffer=[];const t=p.batch();for(const r of e)if(r._id){const e=p.collection(u).doc(r._id);t.create(e,r)}else{const e=p.collection(u);t.create(e.doc(),r)}await t.commit()}catch(e){c.error(i(e),"DBGM-00196 Error bulk insert collection, stopped"),d.destroy(e)}},d.sendIfFull=async()=>{d.buffer.length>100&&await d.send()},d._write=async(e,t,r)=>{d.addRow(e),await d.sendIfFull(),r()},d._final=async e=>{await d.send(),e()},d}},633:e=>{e.exports={isAggregateQuerySnapshot:function(e){return!(!e||"object"!=typeof e||"function"!=typeof e.data)},isQuerySnapshot:function(e){return!(!e||"object"!=typeof e||!Array.isArray(e.docs)||"number"!=typeof e.size)},isDocumentSnapshot:function(e){return!(!e||"object"!=typeof e||"string"!=typeof e.id||"function"!=typeof e.exists)},isReadableStream:function(e){return e&&"object"==typeof e&&"function"==typeof e.read&&"function"==typeof e.on&&"function"==typeof e.pipe}}},790:(e,t,r)=>{const{firestore:n}=r(675);function o(e){return/^_{1,}id$/.test(e)?[e,`_${e}`]:[e,e]}function i(e){return/^_{2,}id$/.test(e)?[e,e.substring(1)]:[e,e]}function s(e){if(!e)return;const t=Object.keys(e).sort().map(o),r={};for(const[n,o]of t){const t=e[n];r[o]=c(t)}return r}async function a(e,t){if(null===e||"object"!=typeof e)return e;if("$date"in e)return n.Timestamp.fromDate(new Date(e.$date));if("$geoPoint"in e&&"object"==typeof e.$geoPoint)return new n.GeoPoint(e.$geoPoint.latitude,e.$geoPoint.longitude);if("$fsDocumentRef"in e&&"object"==typeof e.$fsDocumentRef){const{documentPath:r}=e.$fsDocumentRef;return t.doc(r)}return e}function c(e){return e instanceof n.Timestamp?{$date:e.toDate().toISOString()}:e instanceof n.GeoPoint?{$geoPoint:{latitude:e.latitude,longitude:e.longitude}}:e instanceof n.DocumentReference?{$fsDocumentRef:{documentPath:e.path}}:e}e.exports={convertToFirestoreFieldValue:a,normalizeDocumentDataFieldValue:c,normalizeFirebaseDocumentData:s,convertToFirebaseFields:async function(e,t){const r={},n=Object.keys(e).map(i);for(const[o,i]of n){const n=e[o];r[i]=await a(n,t)}return r},getQuerySnapshotResults:function(e){const t=[];return e.forEach((e=>{const r=s(e.data());t.push({_id:e.id,...r})})),t}}},61:e=>{async function t(e,t,r=256){const n=e.collection(t);for(;;){const t=await n.limit(r).get();if(t.empty)break;const o=e.batch();t.docs.forEach((e=>{o.delete(e.ref)})),await o.commit()}}async function r(e,t,r,n=256){const o=e.collection(t),i=e.collection(r);let s=0;for(;;){const t=await o.offset(s).limit(n).get();if(t.empty)break;const r=e.batch();t.docs.forEach((e=>{const t=i.doc(e.id);r.set(t,e.data())})),await r.commit(),s+=n}}e.exports={deleteCollection:t,renameCollection:async function(e,n,o,i=256){await r(e,n,o,i),await t(e,n,i)},createCollection:async function(e,t){const r=e.collection(t);await r.add({name:"First Document"})},cloneCollection:r}},295:(e,t,r)=>{const{getLogger:n}=r(355),{getQuerySnapshotResults:o}=r(790),i=n("firestoreDriver");function s(e,t,r={}){const{condition:n,sort:o,limit:i,skip:s}=r,p=o?.filter((e=>"_id"!==e.columnName));let d=e.collection(t);return n&&(d=a(d,n)),p&&(d=c(d,p)),i&&(d=l(d,i)),s&&(d=u(d,s)),d}function a(e,t){if(!t)return e;switch(t.conditionType){case"and":return t.conditions.reduce(((e,t)=>a(e,t)),e);case"or":const r=function(e){if("or"!==e.conditionType)return null;const t=e.conditions;if(!t.every((e=>"binary"===e.conditionType&&"="===e.operator||"isNull"===e.conditionType||"in"===e.conditionType))&&t.length)return null;const r=t,n=function(e){switch(e.conditionType){case"binary":return e.left.columnName||"";case"isNull":case"in":return e.expr.columnName||""}return""}(r[0]),o=r.flatMap((e=>function(e){switch(e.conditionType){case"binary":return[e.right.value];case"isNull":return[null];case"in":return e.values}return[]}(e)));return{fieldName:n,values:o}}(t);return r?e.where(r.fieldName,"in",r.values):(i.warn('OR conditions are not directly supported in Firebase. Use "in" operator for multiple values on same field.'),e);case"binary":const n=p(t.left),o=function(e){if("value"==e.exprType)return e.value;throw Error(`Unknown right operand type ${e.exprType}`)}(t.right);switch(t.operator){case"=":return e.where(n,"==",o);case"!=":case"<>":return e.where(n,"!=",o);case"<":return e.where(n,"<",o);case"<=":return e.where(n,"<=",o);case">":return e.where(n,">",o);case">=":return e.where(n,">=",o);default:return i.warn(`Unsupported binary operator ${t.operator}`),e}case"isNull":const s=p(t.expr);return e.where(s,"==",null);case"isNotNull":const c=p(t.expr);return e.where(c,"!=",null);case"not":return i.warn("NOT conditions require manual inversion in Firebase"),e;case"specificPredicate":const l=p(t.expr);switch(t.predicate){case"exists":return e.where(l,"!=",null);case"notExists":return e.where(l,"==",null);case"emptyArray":return e.where(l,"==",[]);case"notEmptyArray":return i.warn("notEmptyArray predicate requires client-side filtering in Firebase"),e;default:return i.warn(`Unknown predicate ${t.predicate}`),e}case"in":const u=p(t.expr);return e.where(u,"in",t.values);case"like":const d=t.right.value.slice(1,-1);return t.left.columnName?e.where(t.left.columnName,">=",d).where(t.left.columnName,"<=",`${d}`):e;default:return i.warn(`Unknown condition ${JSON.stringify(t)}`),e}}function c(e,t){if(!t||0===t.length)return e;let r=e;for(const{columnName:e,direction:n}of t)r=r.orderBy(e,"DESC"===n?"desc":"asc");return r}function l(e,t){return t?e.limit(t):e}function u(e,t){return t?e.offset(t):e}function p(e){if("column"==e.exprType&&e.columnName)return e.columnName;throw Error(`Unknown left operand type ${e.exprType} for column ${e.columnName||""}`)}e.exports={createFirebaseQuery:s,executeFirebaseQuery:async function(e,t,r={}){let n=s(e,t,r);const i=await n.get();return o(i)},applyFirebaseCondition:a,applyFirebaseSort:c,applyFirebaseLimit:l,applyFirebaseOffset:u}},237:(e,t,r)=>{const n=r(831);e.exports={packageName:"dbgate-plugin-firestore",drivers:[n]}},197:(e,t,r)=>{const{SqlDumper:n}=r(355);e.exports=class extends n{}},534:(e,t,r)=>{const{driverBase:n}=global.DBGATE_PACKAGES["dbgate-tools"],o=r(197),{mongoSplitterOptions:i}=r(994),{queryOptionsToString:s}=r(208),a={...n,dumperClass:o,dialect:{limitSelect:!0,rangeSelect:!0,offsetFetchRangeSyntax:!0,stringEscapeChar:"'",fallbackDataType:"nvarchar(max)",quoteIdentifier:e=>`[${e}]`},engine:"firestore@dbgate-plugin-firestore",title:"Firestore",databaseEngineTypes:["document"],multipleSchema:!1,supportsDatabaseProfiler:!1,readOnlySessions:!1,editorMode:"javascript",dataEditorTypesBehaviour:{parseJsonNull:!0,parseJsonBoolean:!0,parseNumber:!0,parseJsonArray:!0,parseJsonObject:!0,parseDateAsDollar:!0,parseGeopointAsDollar:!0,parseFsDocumentRefAsDollar:!0,explicitDataType:!0,supportNumberType:!0,supportStringType:!0,supportBooleanType:!0,supportDateType:!0,supportJsonType:!0,supportNullType:!0,supportFieldRemoval:!0},getFilterBehaviour:(e,t)=>t.firestoreFilterBehaviours,getCollectionExportQueryScript:(e,t,r)=>s(e,t,r),getCollectionExportQueryJson:(e,t,r)=>({collection:e,condition:t,sort:r}),beforeConnectionSave:e=>({...e,singleDatabase:!0,defaultDatabase:"Firestore"}),getQuerySplitterOptions:()=>i,showConnectionField:e=>["connectionDefinition"].includes(e),showConnectionTab:()=>!1,collectionSingularLabel:"collection",collectionPluralLabel:"collections",newCollectionFormParams:[{type:"text",label:"Collection name",name:"name",focused:!0}],getCollectionUpdateScript(e){let t="";for(const r of e.inserts){const{pureName:e,fields:n}=r;t+=`db.collection('${e}').add(${JSON.stringify(n)});\n`}for(const r of e.updates){const{pureName:e,condition:n,fields:o}=r;t+=`db.collection('${e}').doc(${JSON.stringify(n._id)}).set(${JSON.stringify(o)});\n`}for(const r of e.deletes){const{pureName:e,condition:n}=r;t+=`db.collection('${e}').doc(${JSON.stringify(n._id)}).delete();\n`}return t}};e.exports=a},208:e=>{function t(e){return JSON.stringify(e)}function r(e){if(!e)return"";switch(e.conditionType){case"and":return e.conditions.map((e=>r(e))).join("");case"binary":{const{operator:r,left:n,right:o}=e;if(!n.columnName)return"";let i=r;return"="===r&&(i="=="),"<>"===r&&(i="!="),`.where('${n.columnName}', '${i}', ${t(o.value)})`}case"isNull":return e.expr.columnName?`.where('${e.expr.columnName}', '==', null)`:"";case"isNotNull":return e.expr.columnName?`.where('${e.expr.columnName}', '!=', null)`:"";case"specificPredicate":if(!e.expr.columnName)return"";switch(e.predicate){case"exists":return`.where('${e.expr.columnName}', '!=', null)`;case"notExists":return`.where('${e.expr.columnName}', '==', null)`;case"emptyArray":return`.where('${e.expr.columnName}', '==', [])`;default:return""}case"in":return e.expr.columnName?`.where('${e.expr.columnName}', 'in', ${t(e.values)})`:"";case"like":{if(!e.left.columnName)return"";const r=e.right.value.slice(1,-1);return`.where('${e.left.columnName}', '>=', ${t(r)}).where('${e.left.columnName}', '<=', ${t(r+"")})`}default:return""}}e.exports={queryOptionsToString:function(e,t,n){let o=`db.collection('${e}')`;if(o+=r(t),n?.length)for(const{columnName:e,direction:t}of n)o+=`.orderBy('${e}'${t?`, '${t.toLowerCase()}'`:""})`;return o+=".stream()",o}}},355:e=>{"use strict";e.exports=require("dbgate-tools")},675:e=>{"use strict";e.exports=require("firebase-admin")},982:e=>{"use strict";e.exports=require("crypto")},203:e=>{"use strict";e.exports=require("stream")}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}var __webpack_exports__=__webpack_require__(237);module.exports=__webpack_exports__})();
|