@opengis/fcore 0.0.1-beta.20 → 0.0.1-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/config.js +1 -1
  2. package/dist/context.js +1 -1
  3. package/dist/errors.js +1 -1
  4. package/dist/fastify.js +1 -1
  5. package/dist/fcore.js +1 -1
  6. package/dist/migrations/cli.js +1 -1
  7. package/dist/migrations/runner.js +1 -1
  8. package/dist/modules/auth/adduser-cli.js +1 -1
  9. package/dist/modules/auth/passwd-cli.js +1 -1
  10. package/dist/modules/auth/permission-cli.js +1 -1
  11. package/dist/modules/auth/route.js +1 -1
  12. package/dist/modules/auth/schema.js +1 -1
  13. package/dist/modules/auth/services/change-password.js +1 -1
  14. package/dist/modules/auth/services/get-current-user.js +1 -1
  15. package/dist/modules/auth/services/registration.js +1 -1
  16. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  17. package/dist/modules/file/mime.js +1 -1
  18. package/dist/modules/file/route.js +1 -1
  19. package/dist/modules/file/schema.js +1 -1
  20. package/dist/modules/file/services/get-file.js +1 -1
  21. package/dist/modules/file/services/resize-file.js +1 -1
  22. package/dist/modules/file/services/upload-file.js +1 -1
  23. package/dist/modules/resource/route.js +1 -1
  24. package/dist/modules/resource/schema.js +1 -1
  25. package/dist/modules/resource/services/add-note.js +1 -1
  26. package/dist/modules/resource/services/add-resource-file.js +1 -1
  27. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  28. package/dist/modules/resource/services/create-resource.js +1 -1
  29. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  30. package/dist/modules/resource/services/delete-resource.js +1 -1
  31. package/dist/modules/resource/services/export-resource.js +1 -1
  32. package/dist/modules/resource/services/get-resource.js +1 -1
  33. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  34. package/dist/modules/resource/services/list-resources.js +1 -1
  35. package/dist/modules/resource/services/search-resource.js +1 -1
  36. package/dist/modules/resource/services/suggest-resource.js +1 -1
  37. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  38. package/dist/modules/resource/services/update-resource.js +1 -1
  39. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  40. package/dist/modules/system/route.js +1 -1
  41. package/dist/modules/system/schema.js +1 -1
  42. package/dist/modules/system/services/check-system.js +1 -1
  43. package/dist/modules/system/services/get-access.js +1 -1
  44. package/dist/modules/system/services/get-api-list.js +1 -1
  45. package/dist/modules/system/services/get-audit-log.js +1 -1
  46. package/dist/modules/system/services/get-dictionary.js +1 -1
  47. package/dist/modules/system/services/get-system-log.js +1 -1
  48. package/dist/modules/system/services/get-system-settings.js +1 -1
  49. package/dist/modules/system/services/list-dictionaries.js +1 -1
  50. package/dist/modules/system/services/set-access.js +1 -1
  51. package/dist/modules/system/services/update-dictionary.js +1 -1
  52. package/dist/modules/system/services/update-system-settings.js +1 -1
  53. package/dist/modules/utils/require-admin.js +1 -1
  54. package/dist/modules/utils/safe-user.js +1 -1
  55. package/dist/modules/utils/unsupported.js +1 -1
  56. package/dist/plugins/audit/audit.js +1 -1
  57. package/dist/plugins/audit/services/write-audit.js +1 -1
  58. package/dist/plugins/auth/get-user-permissions.js +1 -1
  59. package/dist/plugins/auth/index.js +1 -1
  60. package/dist/plugins/auth/verifyUser.js +1 -1
  61. package/dist/plugins/dictionary.js +1 -1
  62. package/dist/plugins/file.js +1 -1
  63. package/dist/plugins/jwt.js +1 -1
  64. package/dist/plugins/logger/index.js +1 -1
  65. package/dist/plugins/logger/transport.js +1 -1
  66. package/dist/plugins/pg.js +1 -1
  67. package/dist/plugins/redis.js +1 -1
  68. package/dist/plugins/resource/resource.js +1 -1
  69. package/dist/plugins/resource/resource.registry.js +1 -1
  70. package/dist/plugins/resource/resource.types.d.ts +2 -0
  71. package/dist/plugins/resource/resource.types.d.ts.map +1 -1
  72. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  73. package/dist/plugins/resource/services/add-file-token.js +1 -1
  74. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  75. package/dist/plugins/resource/services/create-relation.js +1 -1
  76. package/dist/plugins/resource/services/create.js +1 -1
  77. package/dist/plugins/resource/services/delete-relation.js +1 -1
  78. package/dist/plugins/resource/services/delete.js +1 -1
  79. package/dist/plugins/resource/services/find-one.d.ts.map +1 -1
  80. package/dist/plugins/resource/services/find-one.js +1 -1
  81. package/dist/plugins/resource/services/find-relation.d.ts.map +1 -1
  82. package/dist/plugins/resource/services/find-relation.js +1 -1
  83. package/dist/plugins/resource/services/find.js +1 -1
  84. package/dist/plugins/resource/services/update-relation.js +1 -1
  85. package/dist/plugins/resource/services/update.js +1 -1
  86. package/dist/plugins/resource/utils/auto-index.js +1 -1
  87. package/dist/plugins/resource/utils/fields.js +1 -1
  88. package/dist/plugins/resource/utils/filters.js +1 -1
  89. package/dist/plugins/resource/utils/permissions.js +1 -1
  90. package/dist/plugins/resource/utils/sort.js +1 -1
  91. package/dist/plugins/resource/utils/sql.js +1 -1
  92. package/dist/shared/getIP.js +1 -1
  93. package/package.json +1 -1
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function u(I,X){I=I-0xf3;const o=f();let b=o[I];return b;}export function createDeleteRelation(I,X){const o=createRemove(I,X);return async function b({name:A,id:t,relation:p,relationId:V,user:O},P){const F=u,M=P?.['pg']??I['pg'],r=X['get'](A);if(['notes','files']['includes'](p)&&!r['capabilities']?.[F(0xf3)](p))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+p+'\x22\x20requires\x20a\x20capabilities\x20\x22'+p+'\x22');if(p==='notes')return await M[F(0xf4)]('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[V,A,String(t)]),{'success':!![]};if(p===F(0xf5))return await M['query'](F(0xf6),[V,A,String(t)]),{'success':!![]};const B=r['relations']?.[p];if(!B?.[F(0xf7)]||!B['foreignKey'])throw new UnsupportedError(F(0xf8)+p+'\x22\x20requires\x20a\x20project/provider\x20implementation');const s=await o({'name':B['resource'],'id':V,'user':O,'where':{'column':B['foreignKey'],'value':t}},P);return{'success':s};};}function f(){const Z=['includes','query','files','DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','resource','Generic\x20Resource\x20relation\x20\x22'];f=function(){return Z;};return f();}
1
+ function r(n,k){n=n-0xca;const Z=g();let K=Z[n];return K;}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';export function createDeleteRelation(n,k){const Z=createRemove(n,k);return async function K({name:d,id:J,relation:B,relationId:l,user:f},R){const I=r,Q=R?.['pg']??n['pg'],a=k[I(0xca)](d);if(['notes','files']['includes'](B)&&!a['capabilities']?.[I(0xcb)](B))throw new UnsupportedError(I(0xcc)+B+'\x22\x20requires\x20a\x20capabilities\x20\x22'+B+'\x22');if(B===I(0xcd))return await Q['query']('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[l,d,String(J)]),{'success':!![]};if(B===I(0xce))return await Q['query']('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[l,d,String(J)]),{'success':!![]};const H=a['relations']?.[B];if(!H?.['resource']||!H['foreignKey'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+B+'\x22\x20requires\x20a\x20project/provider\x20implementation');const A=await Z({'name':H['resource'],'id':l,'user':f,'where':{'column':H['foreignKey'],'value':J}},R);return{'success':A};};}function g(){const O=['get','includes','Generic\x20Resource\x20relation\x20\x22','notes','files'];g=function(){return O;};return g();}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';function f(){const F=['WHERE\x20','\x20=\x20$1','\x20AND\x20','audit','name','rowCount'];f=function(){return F;};return f();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function u(I,X){I=I-0x71;const o=f();let b=o[I];return b;}export function createRemove(I,X){return async function o({name:b,id:A,user:t,where:p},V){const s=u,O=X['get'](b);assertOperation(O,'delete',t);const P=V?.['pg']??I['pg'],M=[A];let r=s(0x71)+qi(O['key'])+s(0x72);p&&(M['push'](p['value']),r+=s(0x73)+qi(p['column'])+'\x20=\x20$'+M['length']);O['where']&&(r+='\x20AND\x20('+O['where']+')');const B=await P['query']('DELETE\x20FROM\x20'+qt(O['table'])+'\x20'+r,M);if((B['rowCount']??0x0)>0x0)clearTableLookupCache(O['table'],P);if((B['rowCount']??0x0)>0x0)await(V?.[s(0x74)]??I['audit'])?.['write']({'module':O['module'],'resource':O[s(0x75)],'resourceId':A,'action':'delete'});return(B[s(0x76)]??0x0)>0x0;};}
1
+ import{assertOperation}from'../utils/permissions.js';function g(){const I=['get','delete','WHERE\x20','value','column','length','module','name'];g=function(){return I;};return g();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function r(n,k){n=n-0x1d2;const Z=g();let K=Z[n];return K;}export function createRemove(n,k){return async function Z({name:K,id:d,user:J,where:B},l){const A=r,f=k[A(0x1d2)](K);assertOperation(f,A(0x1d3),J);const R=l?.['pg']??n['pg'],Q=[d];let a=A(0x1d4)+qi(f['key'])+'\x20=\x20$1';B&&(Q['push'](B[A(0x1d5)]),a+='\x20AND\x20'+qi(B[A(0x1d6)])+'\x20=\x20$'+Q[A(0x1d7)]);f['where']&&(a+='\x20AND\x20('+f['where']+')');const H=await R['query']('DELETE\x20FROM\x20'+qt(f['table'])+'\x20'+a,Q);if((H['rowCount']??0x0)>0x0)clearTableLookupCache(f['table'],R);if((H['rowCount']??0x0)>0x0)await(l?.['audit']??n['audit'])?.['write']({'module':f[A(0x1d8)],'resource':f[A(0x1d9)],'resourceId':d,'action':'delete'});return(H['rowCount']??0x0)>0x0;};}
@@ -1 +1 @@
1
- {"version":3,"file":"find-one.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-one.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAK9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,gCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,6CAuDF"}
1
+ {"version":3,"file":"find-one.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-one.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,gCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,6CAsGF"}
@@ -1 +1 @@
1
- function u(I,X){I=I-0xce;const o=f();let b=o[I];return b;}import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function f(){const D=['get','key','dictionary','fields','join','\x20WHERE\x20','\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','query','file'];f=function(){return D;};return f();}export function createFindOne(I,X){return async function o({name:b,id:A,query:query={},user:t}){const q=u,p=Date['now'](),V=X[q(0xce)](b);assertOperation(V,'read',t);if(V['fields'][V[q(0xcf)]]?.['type']==='integer'&&!Number['isInteger'](Number(A)))throw new ValidationError('Invalid\x20id:\x20'+A+'\x20name:'+b);const O=V['joins']?.['map'](s=>s['sql']+'\x20')['join']('\x20')||'',P=V['where']?'\x20AND\x20('+V['where']+')':'',M=await I['pg']['query']('SELECT\x20'+readableFields(V)['join'](',\x20')+'\x20FROM\x20'+qt(V['table'])+'\x20t\x20'+O+'\x20WHERE\x20'+qi(V[q(0xcf)])+'=$1'+P+'\x20LIMIT\x201',[A]),r=M['rows'][0x0];if(!r)return null;await addDictionaryLookupData([r],V['fields'],I[q(0xd0)]),await addTableLookupData([r],V[q(0xd1)],I['pg']),addFileToken([r],V[q(0xd1)],I['file']);const B=Array['isArray'](query['include'])?query['include']:query['include']?.['split'](',')??[];for(const s of B){const F=V['relations']?.[s];if(!F?.['foreignKey']||!F['resource']&&!F['table'])throw new ValidationError('Unknown\x20relation:\x20'+s);const Z=F['resource']?X['get'](F['resource']):undefined,W=F['table']??Z['table'],K=Z?.['key']??'id',y=Z?readableFields(Z)[q(0xd2)](',\x20'):'*',c='SELECT\x20'+y+'\x20FROM\x20'+qt(W)+q(0xd3)+qi(K)+q(0xd4)+qi(F['foreignKey'])+'\x20FROM\x20'+qt(V['table'])+q(0xd5)+qi(V[q(0xcf)])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',Y=(await I['pg'][q(0xd6)](c,[A]))['rows'];Z&&(await addDictionaryLookupData(Y,Z['fields'],I['dictionary']),await addTableLookupData(Y,Z['fields'],I['pg']),addFileToken(Y,Z['fields'],I[q(0xd7)])),r[s]=Y;}return r['time']=Date['now']()-p,r;};}
1
+ import{ValidationError}from'../../../errors.js';function r(n,k){n=n-0x166;const Z=g();let K=Z[n];return K;}import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';function g(){const z=['key','integer','Invalid\x20id:\x20','where','SELECT\x20','\x20FROM\x20','\x20LIMIT\x201','fields','split','junctionTable','junctionForeignKey','foreignKey','resource','table','targetKey','\x20t\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20','\x20j\x20ON\x20j.','junctionLocalKey','query','dictionary','time','now'];g=function(){return z;};return g();}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';export function createFindOne(n,k){return async function Z({name:K,id:d,query:query={},user:J}){const q=r,B=Date['now'](),l=k['get'](K);assertOperation(l,'read',J);if(l['fields'][l[q(0x166)]]?.['type']===q(0x167)&&!Number['isInteger'](Number(d)))throw new ValidationError(q(0x168)+d+'\x20name:'+K);const f=l['joins']?.['map'](A=>A['sql']+'\x20')['join']('\x20')||'',R=l[q(0x169)]?'\x20AND\x20('+l['where']+')':'',Q=await n['pg']['query'](q(0x16a)+readableFields(l)['join'](',\x20')+q(0x16b)+qt(l['table'])+'\x20t\x20'+f+'\x20WHERE\x20'+qi(l['key'])+'=$1'+R+q(0x16c),[d]),a=Q['rows'][0x0];if(!a)return null;await addDictionaryLookupData([a],l['fields'],n['dictionary']),await addTableLookupData([a],l['fields'],n['pg']),addFileToken([a],l[q(0x16d)],n['file']);const H=Array['isArray'](query['include'])?query['include']:query['include']?.[q(0x16e)](',')??[];for(const A of H){const I=l['relations']?.[A];if(!I)throw new ValidationError('Unknown\x20relation:\x20'+A);const O=!!(I?.[q(0x16f)]&&I['junctionLocalKey']&&I[q(0x170)]);if(!I?.[q(0x171)]&&!O||!I[q(0x172)]&&!I['table'])throw new ValidationError('Invalid\x20relation:\x20'+A);const m=I['resource']?k['get'](I['resource']):undefined,p=I[q(0x173)]??m['table'],C=m?.['key']??'id',T=m?readableFields(m)['join'](',\x20'):'*',c=I[q(0x171)]?'SELECT\x20'+T+'\x20FROM\x20'+qt(p)+'\x20WHERE\x20'+(I[q(0x174)]||qi(C))+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(I['foreignKey'])+'\x20FROM\x20'+qt(l['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(l[q(0x166)])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)':q(0x16a)+T+q(0x16b)+qt(p)+q(0x175)+qt(I['junctionTable'])+q(0x176)+qi(I['junctionForeignKey'])+'\x20=\x20t.'+(I['junctionTargetKey']||qi(C))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20j.'+qi(I[q(0x177)])+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(l['key'])+q(0x16b)+qt(l['table'])+'\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(l['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',b=(await n['pg'][q(0x178)](c,[d]))['rows'];m&&(await addDictionaryLookupData(b,m['fields'],n[q(0x179)]),await addTableLookupData(b,m[q(0x16d)],n['pg']),addFileToken(b,m[q(0x16d)],n['file'])),a[A]=b;}return a[q(0x17a)]=Date[q(0x17b)]()-B,a;};}
@@ -1 +1 @@
1
- {"version":3,"file":"find-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,oCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,KAAG,OAAO,CAAC,GAAG,CAAC,CAuGjB"}
1
+ {"version":3,"file":"find-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,oCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,KAAG,OAAO,CAAC,GAAG,CAAC,CA6IjB"}
@@ -1 +1 @@
1
- import{UnsupportedError,ValidationError}from'../../../errors.js';function u(I,X){I=I-0x117;const o=f();let b=o[I];return b;}import{qi,qt}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';function f(){const m=['now','min','max','get','relations','notes','query','rows','file','junctionTable','junctionLocalKey','localKey','resource','table','key','scope','fields','joins','map','sql','where','SELECT\x20','\x20j\x20ON\x20j.','\x0a\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x20$2\x20OFFSET\x20$3','foreignKey','\x20=\x20$1','\x20FROM\x20','\x20=\x20(select\x20','\x20=\x20$1\x20limit\x201)','\x20LIMIT\x20$2\x20OFFSET\x20$3'];f=function(){return m;};return f();}import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(I,X){return async function o({name:b,id:A,relation:t,query:query={}}){const N=u,p=Date[N(0x117)](),V=Math[N(0x118)](Math['max'](query['limit']??0x14,0x1),0xc8),O=Math[N(0x119)](query['offset']??0x0,0x0);if(!Number['isFinite'](V)||!Number['isFinite'](O))throw new ValidationError('Invalid\x20pagination');const P=X[N(0x11a)](b),M=P[N(0x11b)]?.[t];if(['notes','files']['includes'](t)&&!P['capabilities']?.['includes'](t))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+t+'\x22\x20requires\x20a\x20capabilities\x20\x22'+t+'\x22');if(t===N(0x11c)){const q=await I['pg'][N(0x11d)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[b,String(A)]);return{'total':q[N(0x11e)]['length'],'time':Date['now']()-p,'rows':q['rows']};}if(t==='files'){const D=await I['pg'][N(0x11d)]('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[b,String(A)]);return addFileToken(D[N(0x11e)],{'file_path':{'type':'file'}},I[N(0x11f)]),{'total':D['rows']['length'],'time':Date['now']()-p,'rows':D['rows']};}const r=!!(M?.[N(0x120)]&&M[N(0x121)]&&M['junctionForeignKey']);if(!M||!r&&!M['foreignKey']&&!M[N(0x122)]||!M[N(0x123)]&&!M['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+t+'\x22\x20requires\x20a\x20project/provider\x20implementation');const B=M['resource']?X[N(0x11a)](M['resource']):undefined,s=M[N(0x124)]??B['table'],F=B?.[N(0x125)]??'id',Z=!r&&Object['keys'](B?.['fields']??{})['filter'](d=>B?.['fields'][d]?.['read']&&B?.['fields'][d]?.[N(0x126)]!=='item')['map'](qi)['join'](',\x20'),W=M[N(0x127)]?.['join'](',\x20')||Z||'*';M['foreignKey']&&autoIndex(s,M['foreignKey'],'btree',I['pg']);const K=B?.[N(0x128)]?.['filter'](d=>d['scope']!=='item')[N(0x129)](d=>d[N(0x12a)]+'\x20')['join']('\x20')||'',y=M[N(0x12b)]?'\x20AND\x20('+M[N(0x12b)]+')':'',c=(r?N(0x12c)+W+'\x20FROM\x20'+qt(s)+'\x20t\x20'+K+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20'+qt(M['junctionTable'])+N(0x12d)+qi(M['junctionForeignKey'])+'\x20=\x20t.'+qi(F)+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20j.'+qi(M['junctionLocalKey'])+'\x20=\x20$1'+y+N(0x12e):'')||(M['foreignKey']?'SELECT\x20'+W+'\x20FROM\x20'+qt(s)+'\x20t\x20'+K+'\x20WHERE\x20t.'+qi(M[N(0x12f)])+N(0x130)+y+'\x20LIMIT\x20$2\x20OFFSET\x20$3':'SELECT\x20'+W+N(0x131)+qt(s)+'\x20t\x20'+K+'\x20WHERE\x20t.'+qi(M['foreignKey']||F)+N(0x132)+qi(M[N(0x122)])+N(0x131)+qt(P[N(0x124)])+'\x20where\x20'+qi(P['key'])+N(0x133)+y+N(0x134)),Y=await I['pg']['query'](c,[A,V,O]);return B&&(await addDictionaryLookupData(Y['rows'],B['fields'],I['dictionary']),await addTableLookupData(Y['rows'],B[N(0x127)],I['pg']),addFileToken(Y[N(0x11e)],B['fields'],I['file'])),{'limit':V,'offset':O,'total':Y['rows']['length'],'time':Date['now']()-p,'rows':Y[N(0x11e)]??null};};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function r(n,k){n=n-0x162;const Z=g();let K=Z[n];return K;}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';function g(){const w=['offset','isFinite','get','relations','length','now','SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','rows','foreignKey','localKey','table','\x22\x20requires\x20a\x20project/provider\x20implementation','fields','filter','read','item','join','joins','scope','\x20AND\x20(','\x20t\x20','\x0a\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20','\x20j\x20ON\x20j.','junctionTargetKey','\x20=\x20$1','\x20FROM\x20','\x20LIMIT\x20$2\x20OFFSET\x20$3','\x20=\x20$1\x20limit\x201)'];g=function(){return w;};return g();}export function createFindRelation(n,k){return async function Z({name:K,id:d,relation:J,query:query={}}){const j=r,B=Date['now'](),l=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),f=Math['max'](query[j(0x162)]??0x0,0x0);if(!Number[j(0x163)](l)||!Number['isFinite'](f))throw new ValidationError('Invalid\x20pagination');const R=k[j(0x164)](K),Q=R[j(0x165)]?.[J];if(['notes','files']['includes'](J)&&!R['capabilities']?.['includes'](J))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+J+'\x22\x20requires\x20a\x20capabilities\x20\x22'+J+'\x22');if(J==='notes'){const b=await n['pg']['query']('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[K,String(d)]);return{'total':b['rows'][j(0x166)],'time':Date[j(0x167)]()-B,'rows':b['rows']};}if(J==='files'){const q=await n['pg']['query'](j(0x168),[K,String(d)]);return addFileToken(q['rows'],{'file_path':{'type':'file'}},n['file']),{'total':q[j(0x169)]['length'],'time':Date['now']()-B,'rows':q['rows']};}const a=!!(Q?.['junctionTable']&&Q['junctionLocalKey']&&Q['junctionForeignKey']);if(!Q||!a&&!Q[j(0x16a)]&&!Q[j(0x16b)]||!Q['resource']&&!Q[j(0x16c)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+J+j(0x16d));const H=Q['resource']?k['get'](Q['resource']):undefined,A=Q['table']??H[j(0x16c)],I=H?.['key']??'id',O=!a&&Object['keys'](H?.[j(0x16e)]??{})[j(0x16f)](z=>H?.[j(0x16e)][z]?.[j(0x170)]&&H?.['fields'][z]?.['scope']!==j(0x171))['map'](qi)['join'](',\x20'),m=Q['fields']?.[j(0x172)](',\x20')||O||'*';Q['foreignKey']&&autoIndex(A,Q['foreignKey'],'btree',n['pg']);const p=H?.[j(0x173)]?.['filter'](z=>z[j(0x174)]!=='item')['map'](z=>z['sql']+'\x20')['join']('\x20')||'',C=Q['where']?j(0x175)+Q['where']+')':'',T=(a?'SELECT\x20'+m+'\x20FROM\x20'+qt(A)+j(0x176)+p+j(0x177)+qt(Q['junctionTable'])+j(0x178)+qi(Q['junctionForeignKey'])+'\x20=\x20t.'+(Q[j(0x179)]||qi(I))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20j.'+qi(Q['junctionLocalKey'])+j(0x17a)+C+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x20$2\x20OFFSET\x20$3':'')||(Q['foreignKey']?'SELECT\x20'+m+j(0x17b)+qt(A)+'\x20t\x20'+p+'\x20WHERE\x20t.'+qi(Q['foreignKey'])+'\x20=\x20$1'+C+j(0x17c):'SELECT\x20'+m+'\x20FROM\x20'+qt(A)+'\x20t\x20'+p+'\x20WHERE\x20t.'+qi(Q[j(0x16a)]||I)+'\x20=\x20(select\x20'+qi(Q[j(0x16b)])+'\x20FROM\x20'+qt(R['table'])+'\x20where\x20'+qi(R['key'])+j(0x17d)+C+j(0x17c)),c=await n['pg']['query'](T,[d,l,f]);return H&&(await addDictionaryLookupData(c['rows'],H['fields'],n['dictionary']),await addTableLookupData(c['rows'],H['fields'],n['pg']),addFileToken(c[j(0x169)],H['fields'],n['file'])),{'limit':l,'offset':f,'total':c[j(0x169)]['length'],'time':Date[j(0x167)]()-B,'rows':c[j(0x169)]??null};};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{buildFilters}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';import{buildSort}from'../utils/sort.js';function f(){const y=['read','min','limit','\x20AND\x20','sort','filter','fields','values','push','search','map','join','SELECT\x20','FROM\x20','\x20t\x20','LIMIT\x20$','dictionary'];f=function(){return y;};return f();}import{qt,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';function u(I,X){I=I-0x1dc;const o=f();let b=o[I];return b;}import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';export function createFind(I,X){return async function o({name:b,query:query={},user:A}){const K=u,t=Date['now'](),p=X['get'](b);assertOperation(p,K(0x1dc),A);const V=Math[K(0x1dd)](Math['max'](query[K(0x1de)]??0x14,0x1),0xc8),O=Math['max'](query['offset']??0x0,0x0),P=buildFilters(p,query['filter'],0x1,I['pg']);p['where']&&(P['sql']+=(P['sql']?K(0x1df):'\x20WHERE\x20')+('('+p['where']+')'));const M=buildSort(p,query[K(0x1e0)]);if(!Number['isFinite'](V)||!Number['isFinite'](O))throw new ValidationError('Invalid\x20pagination');const r=p['searchable']||Object['keys'](p['fields'])[K(0x1e1)](W=>p[K(0x1e2)][W]?.['searchable']);query['search']&&r['length']&&(r['map'](W=>autoIndex(p['table'],W,'text',I['pg'])),P[K(0x1e3)][K(0x1e4)](query[K(0x1e5)]['toLowerCase']()+'%'),P['sql']+=(P['sql']?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+r?.[K(0x1e6)](W=>'lower('+qt(W)+')\x20LIKE\x20$'+P['values']['length'])[K(0x1e7)]('\x20OR\x20')+')'));const B=p['joins']?.[K(0x1e1)](W=>W['scope']!=='item')['map'](W=>W['sql']+'\x20')['join']('\x20')||'',s=K(0x1e8)+readableFields(p,'all')['join'](',\x20')+'\x20'+(K(0x1e9)+qt(p['table'])+K(0x1ea))+(B+'\x20'+P['sql']+'\x20'+M+'\x20')+(K(0x1eb)+(P[K(0x1e3)]['length']+0x1)+'\x20')+('OFFSET\x20$'+(P['values']['length']+0x2)),F=await I['pg']['query'](s,[...P['values'],V,O]),Z=F['rows'];return await addDictionaryLookupData(Z,p['fields'],I[K(0x1ec)]),await addTableLookupData(Z,p[K(0x1e2)],I['pg']),addFileToken(Z,p['fields'],I['file']),{'limit':V,'offset':O,'total':F['rowCount'],'time':Date['now']()-t,'rows':Z};};}
1
+ import{ValidationError}from'../../../errors.js';import{buildFilters}from'../utils/filters.js';function r(n,k){n=n-0x9f;const Z=g();let K=Z[n];return K;}function g(){const C=['now','sql','Invalid\x20pagination','fields','search','text','values','toLowerCase','\x20AND\x20','joins','join','table','\x20t\x20','LIMIT\x20$','OFFSET\x20$','query','rows','file','rowCount'];g=function(){return C;};return g();}import{assertOperation}from'../utils/permissions.js';import{buildSort}from'../utils/sort.js';import{qt,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';export function createFind(n,k){return async function Z({name:K,query:query={},user:d}){const p=r,J=Date[p(0x9f)](),B=k['get'](K);assertOperation(B,'read',d);const l=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),f=Math['max'](query['offset']??0x0,0x0),R=buildFilters(B,query['filter'],0x1,n['pg']);B['where']&&(R['sql']+=(R[p(0xa0)]?'\x20AND\x20':'\x20WHERE\x20')+('('+B['where']+')'));const Q=buildSort(B,query['sort']);if(!Number['isFinite'](l)||!Number['isFinite'](f))throw new ValidationError(p(0xa1));const a=B['searchable']||Object['keys'](B['fields'])['filter'](m=>B[p(0xa2)][m]?.['searchable']);query[p(0xa3)]&&a['length']&&(a['map'](m=>autoIndex(B['table'],m,p(0xa4),n['pg'])),R[p(0xa5)]['push'](query['search'][p(0xa6)]()+'%'),R[p(0xa0)]+=(R['sql']?p(0xa7):'\x20WHERE\x20')+('\x20('+a?.['map'](m=>'lower('+qt(m)+')\x20LIKE\x20$'+R['values']['length'])['join']('\x20OR\x20')+')'));const H=B[p(0xa8)]?.['filter'](m=>m['scope']!=='item')['map'](m=>m['sql']+'\x20')[p(0xa9)]('\x20')||'',A='SELECT\x20'+readableFields(B,'all')['join'](',\x20')+'\x20'+('FROM\x20'+qt(B[p(0xaa)])+p(0xab))+(H+'\x20'+R['sql']+'\x20'+Q+'\x20')+(p(0xac)+(R[p(0xa5)]['length']+0x1)+'\x20')+(p(0xad)+(R['values']['length']+0x2)),I=await n['pg'][p(0xae)](A,[...R[p(0xa5)],l,f]),O=I[p(0xaf)];return await addDictionaryLookupData(O,B['fields'],n['dictionary']),await addTableLookupData(O,B[p(0xa2)],n['pg']),addFileToken(O,B['fields'],n[p(0xb0)]),{'limit':l,'offset':f,'total':I[p(0xb1)],'time':Date['now']()-J,'rows':O};};}
@@ -1 +1 @@
1
- function u(I,X){I=I-0x17d;const o=f();let b=o[I];return b;}import{UnsupportedError,ValidationError}from'../../../errors.js';import{createUpdate}from'./update.js';function f(){const F=['relations','foreignKey'];f=function(){return F;};return f();}export function createUpdateRelation(I,X){const o=createUpdate(I,X);return async function b({name:A,id:t,relation:p,relationId:V,data:O,user:P},M){const s=u,r=X['get'](A),B=r[s(0x17d)]?.[p];if(!B?.['resource']||!B[s(0x17e)])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+p);if(Object['hasOwn'](O,B['foreignKey'])&&O[B[s(0x17e)]]!==t)throw new ValidationError('Cannot\x20change\x20relation:\x20'+B['foreignKey']);return o({'name':B['resource'],'id':V,'data':O,'user':P,'where':{'column':B['foreignKey'],'value':t}},M);};}
1
+ function r(n,k){n=n-0x11b;const Z=g();let K=Z[n];return K;}function g(){const I=['relations'];g=function(){return I;};return g();}import{UnsupportedError,ValidationError}from'../../../errors.js';import{createUpdate}from'./update.js';export function createUpdateRelation(n,k){const Z=createUpdate(n,k);return async function K({name:d,id:J,relation:B,relationId:l,data:f,user:R},Q){const A=r,a=k['get'](d),H=a[A(0x11b)]?.[B];if(!H?.['resource']||!H['foreignKey'])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+B);if(Object['hasOwn'](f,H['foreignKey'])&&f[H['foreignKey']]!==J)throw new ValidationError('Cannot\x20change\x20relation:\x20'+H['foreignKey']);return Z({'name':H['resource'],'id':l,'data':f,'user':R,'where':{'column':H['foreignKey'],'value':J}},Q);};}
@@ -1 +1 @@
1
- function f(){const Y=['get','length','No\x20writable\x20fields','fields','updated_at','push','map','WHERE\x20','\x20=\x20$','\x20AND\x20','where','RETURNING\x20','audit'];f=function(){return Y;};return f();}import{NotFoundError,ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';function u(I,X){I=I-0x164;const o=f();let b=o[I];return b;}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(I,X){return async function o({name:b,id:A,data:t,user:p,where:V},O){const c=u,P=X[c(0x164)](b);assertOperation(P,'update',p);const M=writableData(P,t);if(!M[c(0x165)])throw new ValidationError(c(0x166));const r=O?.['pg']??I['pg'];validateInputData({'resource':P,'data':t,'update':!![]});P[c(0x167)][c(0x168)]&&M[c(0x169)](['updated_at',new Date()]);P['fields']['updated_by']&&M[c(0x169)](['updated_by',p?.['id']]);delete t['user_type'];const B=M[c(0x16a)](([K],y)=>qi(K)+'\x20=\x20$'+(y+0x1)),s=[...M['map'](([,K])=>K),A];let F=c(0x16b)+qi(P['key'])+c(0x16c)+s['length'];V&&(s['push'](V['value']),F+=c(0x16d)+qi(V['column'])+c(0x16c)+s['length']);P[c(0x16e)]&&(F+='\x20AND\x20('+P['where']+')');const Z=await r['query']('UPDATE\x20'+qt(P['table'])+'\x20'+('SET\x20'+B['join'](',\x20')+'\x20')+(F+'\x20')+(c(0x16f)+Object['keys'](t)['map'](qi)['join'](',\x20')),s),W=Z['rows'][0x0];if(!W)throw new NotFoundError(b+':'+A);return clearTableLookupCache(P['table'],r),await(O?.[c(0x170)]??I['audit'])?.['write']({'userId':p?.['id'],'module':P['module'],'resource':P['name'],'resourceId':A,'action':'update','fields':Object['keys'](t)}),W;};}
1
+ import{NotFoundError,ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';function g(){const c=['fields','updated_by','user_type','\x20=\x20$','value','length','keys','join','audit','write'];g=function(){return c;};return g();}function r(n,k){n=n-0x1a6;const Z=g();let K=Z[n];return K;}import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(n,k){return async function Z({name:K,id:d,data:J,user:B,where:l},f){const T=r,R=k['get'](K);assertOperation(R,'update',B);const Q=writableData(R,J);if(!Q['length'])throw new ValidationError('No\x20writable\x20fields');const a=f?.['pg']??n['pg'];validateInputData({'resource':R,'data':J,'update':!![]});R['fields']['updated_at']&&Q['push'](['updated_at',new Date()]);R[T(0x1a6)][T(0x1a7)]&&Q['push'](['updated_by',B?.['id']]);delete J[T(0x1a8)];const H=Q['map'](([p],C)=>qi(p)+T(0x1a9)+(C+0x1)),A=[...Q['map'](([,p])=>p),d];let I='WHERE\x20'+qi(R['key'])+'\x20=\x20$'+A['length'];l&&(A['push'](l[T(0x1aa)]),I+='\x20AND\x20'+qi(l['column'])+'\x20=\x20$'+A[T(0x1ab)]);R['where']&&(I+='\x20AND\x20('+R['where']+')');const O=await a['query']('UPDATE\x20'+qt(R['table'])+'\x20'+('SET\x20'+H['join'](',\x20')+'\x20')+(I+'\x20')+('RETURNING\x20'+Object[T(0x1ac)](J)['map'](qi)[T(0x1ad)](',\x20')),A),m=O['rows'][0x0];if(!m)throw new NotFoundError(K+':'+d);return clearTableLookupCache(R['table'],a),await(f?.[T(0x1ae)]??n['audit'])?.[T(0x1af)]({'userId':B?.['id'],'module':R['module'],'resource':R['name'],'resourceId':d,'action':'update','fields':Object['keys'](J)}),m;};}
@@ -1 +1 @@
1
- const O=u;import{qi,qt}from'./sql.js';function u(I,X){I=I-0x98;const o=f();let b=o[I];return b;}const requestedIndexes=new WeakMap();export function autoIndex(I,X,o=O(0x98),b){const P=O,A=requestedIndexes['get'](b)??new Set();requestedIndexes[P(0x99)](b,A);const t=I+':'+X+':'+o;if(A['has'](t))return;A['add'](t),void ensureIndex(I,X,o,b)['catch'](()=>{A['delete'](t);});}function f(){const r=['btree','set','split','query'];f=function(){return r;};return f();}async function ensureIndex(I,X,o,b){const M=O,A=I[M(0x9a)]('.'),t=A['length']===0x2?A[0x0]:'public',p=(I+'_'+X+'_'+o+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),V=await b[M(0x9b)]('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[t,p]);if(V['rowCount'])return;if(o==='text'){await b['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await b[M(0x9b)]('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(p+'_l')+'\x20ON\x20'+qt(I)+'\x20USING\x20btree\x20(lower('+qi(X)+')\x20text_pattern_ops)'),await b['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(p)+'\x20ON\x20'+qt(I)+'\x20USING\x20gin\x20(lower('+qi(X)+')\x20gin_trgm_ops)');return;}await b['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(p)+'\x20ON\x20'+qt(I)+'\x20USING\x20'+o+'\x20('+qi(X)+')');}
1
+ function r(n,k){n=n-0x102;const Z=g();let K=Z[n];return K;}const f=r;import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(n,k,Z=f(0x102),K){const R=f,d=requestedIndexes['get'](K)??new Set();requestedIndexes['set'](K,d);const J=n+':'+k+':'+Z;if(d['has'](J))return;d['add'](J),void ensureIndex(n,k,Z,K)[R(0x103)](()=>{d['delete'](J);});}async function ensureIndex(n,k,Z,K){const Q=f,d=n['split']('.'),J=d['length']===0x2?d[0x0]:'public',B=(n+'_'+k+'_'+Z+'_idx')[Q(0x104)](/[^A-Za-z0-9_]/g,'_'),l=await K[Q(0x105)](Q(0x106),[J,B]);if(l[Q(0x107)])return;if(Z==='text'){await K['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await K['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(B+'_l')+Q(0x108)+qt(n)+Q(0x109)+qi(k)+')\x20text_pattern_ops)'),await K[Q(0x105)]('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(B)+'\x20ON\x20'+qt(n)+'\x20USING\x20gin\x20(lower('+qi(k)+')\x20gin_trgm_ops)');return;}await K['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(B)+Q(0x108)+qt(n)+Q(0x10a)+Z+'\x20('+qi(k)+')');}function g(){const a=['btree','catch','replace','query','SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2','rowCount','\x20ON\x20','\x20USING\x20btree\x20(lower(','\x20USING\x20'];g=function(){return a;};return g();}
@@ -1 +1 @@
1
- function u(I,X){I=I-0x1c8;const o=f();let b=o[I];return b;}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';const validateInputData=({resource:I,data:X,update:update=![]})=>{const A=u;for(const [o,b]of Object['entries'](I['fields'])){if(b['required']&&b['writable']!==![]&&(X[o]===undefined||X[o]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+o);if(b[A(0x1c8)]&&b['writable']!==![]&&Object[A(0x1c9)](X,o)&&(X[o]===undefined||X[o]===null)&&update)throw new ValidationError('Required\x20field:\x20'+o);if(b['minLength']&&typeof X[o]==='string'&&X[o]['length']<b[A(0x1ca)])throw new ValidationError('minLength\x20not\x20met:\x20'+o);if(b[A(0x1cb)]&&typeof X[o]==='string'&&X[o]['length']>b['maxLength'])throw new ValidationError('maxLength\x20exceeded:\x20'+o);if(b[A(0x1cc)]&&typeof X[o]===A(0x1cd)&&X[o]<b[A(0x1cc)])throw new ValidationError(o+'\x20should\x20be\x20>=\x20'+b['minimum']);if(b[A(0x1ce)]&&typeof X[o]===A(0x1cd)&&X[o]>b['maximum'])throw new ValidationError(o+'\x20should\x20be\x20<=\x20'+b['maximum']);if(b[A(0x1cf)]&&X[o]&&!b['enum']['includes'](X[o]))throw new ValidationError(o+'\x20should\x20be\x20one\x20of\x20('+b['enum']['join'](',\x20')+')');if(b[A(0x1d0)]&&typeof X[o]==='string'&&!new RegExp(b['pattern'])['test'](X[o]))throw new ValidationError(o+A(0x1d1)+b['pattern']+')');}};export{validateInputData};function f(){const t=['required','hasOwn','minLength','maxLength','minimum','number','maximum','enum','pattern','\x20should\x20match\x20regular\x20expression\x20('];f=function(){return t;};return f();}
1
+ function r(n,k){n=n-0x18c;const Z=g();let K=Z[n];return K;}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';const validateInputData=({resource:n,data:k,update:update=![]})=>{const d=r;for(const [Z,K]of Object['entries'](n['fields'])){if(K['required']&&K['writable']!==![]&&(k[Z]===undefined||k[Z]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+Z);if(K['required']&&K[d(0x18c)]!==![]&&Object[d(0x18d)](k,Z)&&(k[Z]===undefined||k[Z]===null)&&update)throw new ValidationError('Required\x20field:\x20'+Z);if(K['minLength']&&typeof k[Z]==='string'&&k[Z]['length']<K[d(0x18e)])throw new ValidationError('minLength\x20not\x20met:\x20'+Z);if(K[d(0x18f)]&&typeof k[Z]===d(0x190)&&k[Z][d(0x191)]>K[d(0x18f)])throw new ValidationError('maxLength\x20exceeded:\x20'+Z);if(K[d(0x192)]&&typeof k[Z]==='number'&&k[Z]<K['minimum'])throw new ValidationError(Z+'\x20should\x20be\x20>=\x20'+K['minimum']);if(K['maximum']&&typeof k[Z]==='number'&&k[Z]>K['maximum'])throw new ValidationError(Z+'\x20should\x20be\x20<=\x20'+K['maximum']);if(K['enum']&&k[Z]&&!K['enum'][d(0x193)](k[Z]))throw new ValidationError(Z+'\x20should\x20be\x20one\x20of\x20('+K['enum']['join'](',\x20')+')');if(K['pattern']&&typeof k[Z]==='string'&&!new RegExp(K[d(0x194)])[d(0x195)](k[Z]))throw new ValidationError(Z+'\x20should\x20match\x20regular\x20expression\x20('+K[d(0x194)]+')');}};function g(){const J=['writable','hasOwn','minLength','maxLength','string','length','minimum','includes','pattern','test'];g=function(){return J;};return g();}export{validateInputData};
@@ -1 +1 @@
1
- const W=u;import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';import{autoIndex}from'./auto-index.js';function u(I,X){I=I-0x171;const o=f();let b=o[I];return b;}function f(){const c=['gte','nin','like','ilike','null','Field\x20is\x20not\x20filterable:\x20','text','table','FALSE','TRUE','push','join','geometry'];f=function(){return c;};return f();}const filterOperators=new Set(['eq','ne','gt',W(0x171),'lt','lte','in',W(0x172),W(0x173),W(0x174),W(0x175)]);export function parseFilterQuery(I){const X={...isRecord(I['filter'])?I['filter']:{}};for(const [o,b]of Object['entries'](I)){const A=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/['exec'](o);if(!A)continue;const [,t,p]=A;if(!t)continue;if(!p){X[t]=b;continue;}if(!filterOperators['has'](p))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+p);const V=isRecord(X[t])?X[t]:{};V[p]=(p==='in'||p==='nin')&&typeof b==='string'?b['split'](','):b,X[t]=V;}return Object['keys'](X)['length']?X:undefined;}export function buildFilters(I,X,o=0x1,b){const K=W,A=[],t=[];for(const [p,V]of Object['entries'](X??{})){const O=I['fields'][p];if(!O||O['filter']!==!![]&&O['filterable']!==!![])throw new ValidationError(K(0x176)+p);const P=qi(fieldColumn(I,p)),M=isRecord(V)?V:{'eq':V};for(const [r,B]of Object['entries'](M)){if(!filterOperators['has'](r))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+r);if((r==='like'||r==='ilike')&&O['type']!=='string'&&O['type']!==K(0x177))throw new ValidationError('Operator\x20'+r+'\x20requires\x20a\x20text\x20field:\x20'+p);b&&autoIndex(I[K(0x178)],fieldColumn(I,p),indexTypeFor(O['type'],r),b);if(r===K(0x175)){A['push'](P+'\x20IS\x20'+(isTruthy(B)?'':'NOT\x20')+'NULL');continue;}if(r==='in'||r==='nin'){const Z=Array['isArray'](B)?B:[B];if(Z['length']===0x0){A['push'](r==='in'?K(0x179):K(0x17a));continue;}t[K(0x17b)](Z),A[K(0x17b)](P+'\x20'+(r==='in'?'=\x20ANY':'<>\x20ALL')+'($'+(o+t['length']-0x1)+')');continue;}const s={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':K(0x173)},F='$'+(o+t['length']);if(r===K(0x173)){t[K(0x17b)](B+'%'),A['push']('lower('+P+')\x20like\x20lower('+F+')');continue;}t['push'](B),A['push'](P+'\x20'+s[r]+'\x20'+F);}}return{'sql':A['length']?'\x20WHERE\x20'+A[K(0x17c)]('\x20AND\x20'):'','values':t};}function isRecord(I){return typeof I==='object'&&I!==null&&!Array['isArray'](I);}function isTruthy(I){return I===!![]||I==='true'||I==='1'||I===0x1;}function indexTypeFor(I,X){const y=W;if(X===y(0x173)||X==='ilike')return'text';if(I==='geom'||I===y(0x17d))return'gist';return'btree';}
1
+ import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';function r(n,k){n=n-0x122;const Z=g();let K=Z[n];return K;}import{autoIndex}from'./auto-index.js';const filterOperators=new Set(['eq','ne','gt','gte','lt','lte','in','nin','like','ilike','null']);export function parseFilterQuery(n){const m=r,k={...isRecord(n['filter'])?n['filter']:{}};for(const [Z,K]of Object['entries'](n)){const d=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/['exec'](Z);if(!d)continue;const [,J,B]=d;if(!J)continue;if(!B){k[J]=K;continue;}if(!filterOperators['has'](B))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+B);const l=isRecord(k[J])?k[J]:{};l[B]=(B==='in'||B==='nin')&&typeof K==='string'?K['split'](','):K,k[J]=l;}return Object[m(0x122)](k)['length']?k:undefined;}export function buildFilters(n,k,Z=0x1,K){const p=r,d=[],J=[];for(const [B,l]of Object['entries'](k??{})){const f=n['fields'][B];if(!f||f[p(0x123)]!==!![]&&f[p(0x124)]!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+B);const R=qi(fieldColumn(n,B)),Q=isRecord(l)?l:{'eq':l};for(const [a,H]of Object['entries'](Q)){if(!filterOperators['has'](a))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+a);if((a===p(0x125)||a==='ilike')&&f['type']!=='string'&&f[p(0x126)]!=='text')throw new ValidationError('Operator\x20'+a+p(0x127)+B);K&&autoIndex(n[p(0x128)],fieldColumn(n,B),indexTypeFor(f['type'],a),K);if(a==='null'){d['push'](R+'\x20IS\x20'+(isTruthy(H)?'':'NOT\x20')+p(0x129));continue;}if(a==='in'||a===p(0x12a)){const O=Array['isArray'](H)?H:[H];if(O[p(0x12b)]===0x0){d[p(0x12c)](a==='in'?'FALSE':'TRUE');continue;}J[p(0x12c)](O),d['push'](R+'\x20'+(a==='in'?p(0x12d):'<>\x20ALL')+'($'+(Z+J['length']-0x1)+')');continue;}const A={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':'like'},I='$'+(Z+J['length']);if(a==='like'){J['push'](H+'%'),d['push']('lower('+R+')\x20like\x20lower('+I+')');continue;}J['push'](H),d['push'](R+'\x20'+A[a]+'\x20'+I);}}return{'sql':d['length']?'\x20WHERE\x20'+d['join']('\x20AND\x20'):'','values':J};}function isRecord(n){const C=r;return typeof n==='object'&&n!==null&&!Array[C(0x12e)](n);}function isTruthy(n){return n===!![]||n==='true'||n==='1'||n===0x1;}function indexTypeFor(n,k){const T=r;if(k==='like'||k==='ilike')return T(0x12f);if(n==='geom'||n==='geometry')return'gist';return'btree';}function g(){const c=['keys','filter','filterable','like','type','\x20requires\x20a\x20text\x20field:\x20','table','NULL','nin','length','push','=\x20ANY','isArray','text'];g=function(){return c;};return g();}
@@ -1 +1 @@
1
- function f(){const p=['includes','public','Authentication\x20required','type','permissions','Missing\x20permission:\x20'];f=function(){return p;};return f();}function u(I,X){I=I-0x1d1;const o=f();let b=o[I];return b;}import{ForbiddenError}from'../../../errors.js';import{getContext}from'../../../index.js';export function assertOperation(I,X,o){const t=u,b=getContext()['config'];if(b['debug'])return;if(!I['operations'][t(0x1d1)](X))throw new ForbiddenError(I['name']+'.'+X+'\x20is\x20disabled');if(I['access']!==t(0x1d2)&&o===undefined)throw new ForbiddenError(t(0x1d3));if(I['access']==='admin'&&o?.[t(0x1d4)]!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(o?.['type']!=='admin'){const A=(I['permission']??I['name'])+':'+X;if(!o?.[t(0x1d5)]?.[t(0x1d1)](A))throw new ForbiddenError(t(0x1d6)+A);}}
1
+ import{ForbiddenError}from'../../../errors.js';function g(){const B=['config','debug','public','access','admin','permissions','Missing\x20permission:\x20'];g=function(){return B;};return g();}function r(n,k){n=n-0x123;const Z=g();let K=Z[n];return K;}import{getContext}from'../../../index.js';export function assertOperation(n,k,Z){const J=r,K=getContext()[J(0x123)];if(K[J(0x124)])return;if(!n['operations']['includes'](k))throw new ForbiddenError(n['name']+'.'+k+'\x20is\x20disabled');if(n['access']!==J(0x125)&&Z===undefined)throw new ForbiddenError('Authentication\x20required');if(n[J(0x126)]===J(0x127)&&Z?.['type']!==J(0x127))throw new ForbiddenError('Admin\x20access\x20required');if(Z?.['type']!=='admin'){const d=(n['permission']??n['name'])+':'+k;if(!Z?.[J(0x128)]?.['includes'](d))throw new ForbiddenError(J(0x129)+d);}}
@@ -1 +1 @@
1
- import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';function u(I,X){I=I-0x12d;const o=f();let b=o[I];return b;}function f(){const O=['startsWith','Field\x20is\x20not\x20sortable:\x20','DESC'];f=function(){return O;};return f();}export function buildSort(I,X){if(!X?.['length'])return'';typeof X==='string'&&(X=[X]);const o=X['map'](b=>{const V=u,A=b[V(0x12d)]('-'),t=A?b['slice'](0x1):b,p=I['fields'][t];if(!p||p['sortable']!==!![])throw new ValidationError(V(0x12e)+t);return qi(fieldColumn(I,t))+'\x20'+(A?V(0x12f):'ASC');});return'\x20ORDER\x20BY\x20'+o['join'](',\x20');}
1
+ function g(){const R=['map','DESC','join'];g=function(){return R;};return g();}function r(n,k){n=n-0x6b;const Z=g();let K=Z[n];return K;}import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';export function buildSort(n,k){const l=r;if(!k?.['length'])return'';typeof k==='string'&&(k=[k]);const Z=k[l(0x6b)](K=>{const f=l,d=K['startsWith']('-'),J=d?K['slice'](0x1):K,B=n['fields'][J];if(!B||B['sortable']!==!![])throw new ValidationError('Field\x20is\x20not\x20sortable:\x20'+J);return qi(fieldColumn(n,J))+'\x20'+(d?f(0x6c):'ASC');});return'\x20ORDER\x20BY\x20'+Z[l(0x6d)](',\x20');}
@@ -1 +1 @@
1
- const p=u;import{ValidationError}from'../../../errors.js';function f(){const M=['replace','map','join','fields','column','entries','key','writable','write','date'];f=function(){return M;};return f();}export const quoteIdentifier=I=>'\x22'+I[p(0x145)](/"/g,'\x22\x22')+'\x22';export const quoteTable=I=>I['split']('.')[p(0x146)](quoteIdentifier)[p(0x147)]('.');function u(I,X){I=I-0x145;const o=f();let b=o[I];return b;}export function fieldColumn(I,X){const V=p;if(X===I['key'])return I['key'];const o=I[V(0x148)][X];if(!o)throw new ValidationError('Unknown\x20field:\x20'+X);return o[V(0x149)]??X;}export function readableFields(I,X){const O=p,o=Object[O(0x14a)](I['fields'])['filter'](([,b])=>b['read']!==![]&&b['readable']!==![]&&(X?(b['scope']??'all')===X:!![]))[O(0x146)](([b,A])=>quoteIdentifier(A['column']??b)+'\x20AS\x20'+quoteIdentifier(b));return!I['fields'][I['key']]&&o['unshift'](quoteIdentifier(I[O(0x14b)])),o;}export function writableData(I,X){const P=p,o=[];for(const [b,A]of Object['entries'](X)){const t=I[P(0x148)][b];if(!t||t['write']===![]||t[P(0x14c)]===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+b);if((t[P(0x14d)]??t['writable'])!==!![])continue;if(t['type']===P(0x14e)&&!X[b])continue;o['push']([t[P(0x149)]??b,A]);}return o;}export const qi=quoteIdentifier;export const qt=quoteTable;
1
+ function r(n,k){n=n-0xee;const Z=g();let K=Z[n];return K;}import{ValidationError}from'../../../errors.js';export const quoteIdentifier=n=>'\x22'+n['replace'](/"/g,'\x22\x22')+'\x22';export const quoteTable=n=>n['split']('.')['map'](quoteIdentifier)['join']('.');export function fieldColumn(n,k){const B=r;if(k===n['key'])return n[B(0xee)];const Z=n['fields'][k];if(!Z)throw new ValidationError(B(0xef)+k);return Z['column']??k;}function g(){const R=['key','Unknown\x20field:\x20','entries','read','all','map','column','\x20AS\x20','unshift','write','date','push'];g=function(){return R;};return g();}export function readableFields(n,k){const l=r,Z=Object[l(0xf0)](n['fields'])['filter'](([,K])=>K[l(0xf1)]!==![]&&K['readable']!==![]&&(k?(K['scope']??l(0xf2))===k:!![]))[l(0xf3)](([K,d])=>quoteIdentifier(d[l(0xf4)]??K)+l(0xf5)+quoteIdentifier(K));return!n['fields'][n['key']]&&Z[l(0xf6)](quoteIdentifier(n['key'])),Z;}export function writableData(n,k){const f=r,Z=[];for(const [K,d]of Object['entries'](k)){const J=n['fields'][K];if(!J||J[f(0xf7)]===![]||J['writable']===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+K);if((J['write']??J['writable'])!==!![])continue;if(J['type']===f(0xf8)&&!k[K])continue;Z[f(0xf9)]([J[f(0xf4)]??K,d]);}return Z;}export const qi=quoteIdentifier;export const qt=quoteTable;
@@ -1 +1 @@
1
- const X=u,getIP=I=>(I[X(0x68)]?.['x-real-ip']||I['headers']?.['x-forwarded-for']||I['ip']||I['connection']?.[X(0x69)]||'')[X(0x6a)](':')['pop']();function u(I,X){I=I-0x68;const o=f();let b=o[I];return b;}function f(){const o=['headers','remoteAddress','split'];f=function(){return o;};return f();}export default getIP;
1
+ function r(n,k){n=n-0x190;const Z=g();let K=Z[n];return K;}const k=r,getIP=n=>(n['headers']?.['x-real-ip']||n['headers']?.[k(0x190)]||n['ip']||n['connection']?.[k(0x191)]||'')[k(0x192)](':')['pop']();function g(){const Z=['x-forwarded-for','remoteAddress','split'];g=function(){return Z;};return g();}export default getIP;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fcore",
3
- "version": "0.0.1-beta.20",
3
+ "version": "0.0.1-beta.21",
4
4
  "description": "Reusable backend foundation for OpenGIS Node.js applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",