@opengis/fcore 0.0.27 → 0.0.28

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 (107) hide show
  1. package/LICENSE +3 -3
  2. package/README.md +71 -71
  3. package/dist/config.js +1 -1
  4. package/dist/context.js +1 -1
  5. package/dist/errors.js +1 -1
  6. package/dist/fastify.js +1 -1
  7. package/dist/fcore.js +1 -1
  8. package/dist/migrations/cli.js +1 -1
  9. package/dist/migrations/runner.js +1 -1
  10. package/dist/modules/auth/adduser-cli.js +1 -1
  11. package/dist/modules/auth/passwd-cli.js +1 -1
  12. package/dist/modules/auth/permission-cli.js +1 -1
  13. package/dist/modules/auth/route.js +1 -1
  14. package/dist/modules/auth/schema.js +1 -1
  15. package/dist/modules/auth/services/change-password.js +1 -1
  16. package/dist/modules/auth/services/get-current-user.js +1 -1
  17. package/dist/modules/auth/services/registration.js +1 -1
  18. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  19. package/dist/modules/file/mime.js +1 -1
  20. package/dist/modules/file/route.js +1 -1
  21. package/dist/modules/file/schema.js +1 -1
  22. package/dist/modules/file/services/get-file.js +1 -1
  23. package/dist/modules/file/services/resize-file.js +1 -1
  24. package/dist/modules/file/services/upload-file.js +1 -1
  25. package/dist/modules/resource/route.js +1 -1
  26. package/dist/modules/resource/schema.js +1 -1
  27. package/dist/modules/resource/services/add-note.js +1 -1
  28. package/dist/modules/resource/services/add-resource-file.js +1 -1
  29. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  30. package/dist/modules/resource/services/create-resource.js +1 -1
  31. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  32. package/dist/modules/resource/services/delete-resource.js +1 -1
  33. package/dist/modules/resource/services/export-resource.js +1 -1
  34. package/dist/modules/resource/services/generate-resource-code.js +1 -1
  35. package/dist/modules/resource/services/get-resource-schema.js +1 -1
  36. package/dist/modules/resource/services/get-resource.js +1 -1
  37. package/dist/modules/resource/services/list-resource-as-user.js +1 -1
  38. package/dist/modules/resource/services/list-resource-list.js +1 -1
  39. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  40. package/dist/modules/resource/services/list-resources.js +1 -1
  41. package/dist/modules/resource/services/search-resource.js +1 -1
  42. package/dist/modules/resource/services/suggest-resource.js +1 -1
  43. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  44. package/dist/modules/resource/services/update-resource.js +1 -1
  45. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  46. package/dist/modules/system/route.js +1 -1
  47. package/dist/modules/system/schema.js +1 -1
  48. package/dist/modules/system/services/check-system.js +1 -1
  49. package/dist/modules/system/services/get-access.js +1 -1
  50. package/dist/modules/system/services/get-api-list.js +1 -1
  51. package/dist/modules/system/services/get-audit-log.js +1 -1
  52. package/dist/modules/system/services/get-dictionary.js +1 -1
  53. package/dist/modules/system/services/get-resource-access.js +1 -1
  54. package/dist/modules/system/services/get-resource-scopes.js +1 -1
  55. package/dist/modules/system/services/get-system-log.js +1 -1
  56. package/dist/modules/system/services/get-system-settings.js +1 -1
  57. package/dist/modules/system/services/list-dictionaries.js +1 -1
  58. package/dist/modules/system/services/set-access.js +1 -1
  59. package/dist/modules/system/services/set-resource-access.js +1 -1
  60. package/dist/modules/system/services/set-resource-scopes.js +1 -1
  61. package/dist/modules/system/services/update-dictionary.js +1 -1
  62. package/dist/modules/system/services/update-system-settings.js +1 -1
  63. package/dist/modules/utils/require-admin.js +1 -1
  64. package/dist/modules/utils/safe-user.js +1 -1
  65. package/dist/modules/utils/unsupported.js +1 -1
  66. package/dist/plugins/audit/audit.js +1 -1
  67. package/dist/plugins/audit/services/write-audit.js +1 -1
  68. package/dist/plugins/auth/get-user-permissions.js +1 -1
  69. package/dist/plugins/auth/index.js +1 -1
  70. package/dist/plugins/auth/verifyUser.js +1 -1
  71. package/dist/plugins/dictionary.js +1 -1
  72. package/dist/plugins/file.js +1 -1
  73. package/dist/plugins/jwt.js +1 -1
  74. package/dist/plugins/logger/index.js +1 -1
  75. package/dist/plugins/logger/transport.js +1 -1
  76. package/dist/plugins/pg.js +1 -1
  77. package/dist/plugins/redis.js +1 -1
  78. package/dist/plugins/resource/resource.js +1 -1
  79. package/dist/plugins/resource/resource.registry.js +1 -1
  80. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  81. package/dist/plugins/resource/services/add-file-token.js +1 -1
  82. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  83. package/dist/plugins/resource/services/create-relation.d.ts.map +1 -1
  84. package/dist/plugins/resource/services/create-relation.js +1 -1
  85. package/dist/plugins/resource/services/create.js +1 -1
  86. package/dist/plugins/resource/services/delete-relation.d.ts.map +1 -1
  87. package/dist/plugins/resource/services/delete-relation.js +1 -1
  88. package/dist/plugins/resource/services/delete.js +1 -1
  89. package/dist/plugins/resource/services/find-one.js +1 -1
  90. package/dist/plugins/resource/services/find-relation.js +1 -1
  91. package/dist/plugins/resource/services/find.js +1 -1
  92. package/dist/plugins/resource/services/get-table-columns.js +1 -1
  93. package/dist/plugins/resource/services/update-relation.js +1 -1
  94. package/dist/plugins/resource/services/update.js +1 -1
  95. package/dist/plugins/resource/utils/auto-index.js +1 -1
  96. package/dist/plugins/resource/utils/fields.js +1 -1
  97. package/dist/plugins/resource/utils/filters.js +1 -1
  98. package/dist/plugins/resource/utils/permissions.js +1 -1
  99. package/dist/plugins/resource/utils/scope.js +1 -1
  100. package/dist/plugins/resource/utils/sort.js +1 -1
  101. package/dist/plugins/resource/utils/sql.js +1 -1
  102. package/dist/plugins/resource/utils/summary.js +1 -1
  103. package/dist/shared/getIP.js +1 -1
  104. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  105. package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
  106. package/migrations/20260929120000_allow_user_only_role_scopes.sql +1 -1
  107. package/package.json +92 -92
@@ -1 +1 @@
1
- const secretPattern=/password|token|secret|credential|salt/i;function clean(P){const H=C;if(Array['isArray'](P))return P['map'](clean);if(P&&typeof P===H(0xc2))return Object[H(0xc3)](Object['entries'](P)['map'](([G,j])=>[G,secretPattern[H(0xc4)](G)?H(0xc5):clean(j)]));return P;}export function writeAudit(P){let G,j;async function Z(){const b=C;if(!P['pg'])return![];if(G!==undefined)return G;return j??=P['pg'][b(0xc6)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](q=>{const E=b,p=new Set(q['rows']['map'](X=>X[E(0xc7)]));return G=p[E(0xc8)]('audit_log')&&p['has']('audit_log_data'),!G&&P['logger']['warn']({'expectedTables':[E(0xc9),'admin.audit_log_data'],'foundTables':[...p]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),G;})['catch'](q=>{const z=b;return G=![],P['logger'][z(0xca)]({'err':q},z(0xcb)),![];}),j;}return async function q(p){const x=C;if(!await Z())return P[x(0xcc)]['info']({'auditFallback':!![],'event':clean({...p,'changes':p[x(0xcd)]?.['map'](A=>({...A,'oldValue':clean(A['oldValue']),'newValue':clean(A['newValue'])}))})},'audit'),0x0;if(!P['pg'])throw new Error('empty\x20pg');const X=await P['pg'][x(0xc6)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fields,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20action,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip_address,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20metadata\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6,\x20$7,\x20$8,\x20$9)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20',[p[x(0xce)]??null,p['module'],p['resource'],p['resourceId']==null?null:String(p[x(0xcf)]),p[x(0xd0)]??null,p[x(0xd1)],p['requestId']??null,p['ipAddress']??null,clean(p['metadata']??{})]),F=X['rows'][0x0]['id'];for(const A of p['changes']??[]){if(secretPattern[x(0xc4)](A['field']))continue;await P['pg'][x(0xc6)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[F,A['field'],JSON['stringify'](clean(A['oldValue'])),JSON['stringify'](clean(A['newValue']))]);}return F;};}function C(P,G){P=P-0xc2;const j=m();let Z=j[P];return Z;}function m(){const o=['object','fromEntries','test','[REDACTED]','query','table_name','has','admin.audit_log','warn','Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled','logger','changes','userId','resourceId','fields','action'];m=function(){return o;};return m();}
1
+ const secretPattern=/password|token|secret|credential|salt/i;function f(p,Z){p=p-0x84;const A=s();let I=A[p];return I;}function clean(p){const H=f;if(Array['isArray'](p))return p[H(0x84)](clean);if(p&&typeof p==='object')return Object['fromEntries'](Object['entries'](p)[H(0x84)](([Z,A])=>[Z,secretPattern['test'](Z)?'[REDACTED]':clean(A)]));return p;}function s(){const E=['map','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20','audit_log','audit_log_data','logger','query','userId','resourceId','ipAddress','changes','field','stringify','newValue'];s=function(){return E;};return s();}export function writeAudit(p){let Z,A;async function I(){const e=f;if(!p['pg'])return![];if(Z!==undefined)return Z;return A??=p['pg']['query'](e(0x85))['then'](j=>{const g=e,D=new Set(j['rows']['map'](o=>o['table_name']));return Z=D['has'](g(0x86))&&D['has'](g(0x87)),!Z&&p[g(0x88)]['warn']({'expectedTables':['admin.audit_log','admin.audit_log_data'],'foundTables':[...D]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),Z;})['catch'](j=>{const N=e;return Z=![],p[N(0x88)]['warn']({'err':j},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),A;}return async function j(D){const h=f;if(!await I())return p[h(0x88)]['info']({'auditFallback':!![],'event':clean({...D,'changes':D['changes']?.['map'](B=>({...B,'oldValue':clean(B['oldValue']),'newValue':clean(B['newValue'])}))})},'audit'),0x0;if(!p['pg'])throw new Error('empty\x20pg');const o=await p['pg'][h(0x89)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fields,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20action,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip_address,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20metadata\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6,\x20$7,\x20$8,\x20$9)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20',[D[h(0x8a)]??null,D['module'],D['resource'],D['resourceId']==null?null:String(D[h(0x8b)]),D['fields']??null,D['action'],D['requestId']??null,D[h(0x8c)]??null,clean(D['metadata']??{})]),R=o['rows'][0x0]['id'];for(const B of D[h(0x8d)]??[]){if(secretPattern['test'](B['field']))continue;await p['pg'][h(0x89)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[R,B[h(0x8e)],JSON[h(0x8f)](clean(B['oldValue'])),JSON['stringify'](clean(B[h(0x90)]))]);}return R;};}
@@ -1 +1 @@
1
- export async function getUserPermissions(P,G){const q=C,j=await G['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20DISTINCT\x20ra.resource\x20||\x20\x27:\x27\x20||\x20action\x20AS\x20permission\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x20ON\x20ur.role_id\x20=\x20ra.role_id\x0a\x20\x20\x20\x20\x20\x20CROSS\x20JOIN\x20LATERAL\x20unnest(COALESCE(ra.actions,\x20\x27{}\x27::text[]))\x20AS\x20action\x0a\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20',[P]);return j[q(0x1a7)]['map'](Z=>Z['permission']);}function C(P,G){P=P-0x1a7;const j=m();let Z=j[P];return Z;}function m(){const p=['rows'];m=function(){return p;};return m();}
1
+ function f(p,Z){p=p-0x10d;const A=s();let I=A[p];return I;}export async function getUserPermissions(p,Z){const j=f,A=await Z['pg'][j(0x10d)]('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20DISTINCT\x20ra.resource\x20||\x20\x27:\x27\x20||\x20action\x20AS\x20permission\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x20ON\x20ur.role_id\x20=\x20ra.role_id\x0a\x20\x20\x20\x20\x20\x20CROSS\x20JOIN\x20LATERAL\x20unnest(COALESCE(ra.actions,\x20\x27{}\x27::text[]))\x20AS\x20action\x0a\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20',[p]);return A['rows']['map'](I=>I[j(0x10e)]);}function s(){const D=['query','permission'];s=function(){return D;};return s();}
@@ -1 +1 @@
1
- export*from'./auth.types.js';import{randomBytes,scrypt as P,timingSafeEqual}from'node:crypto';function m(){const L=['path','.json','fileFor','parse','code','utf8','catch','hex','test','cookieName','storagePath','register','secret','initialize','permissions'];m=function(){return L;};return m();}import{mkdir,readFile,unlink,writeFile}from'node:fs/promises';import{join,resolve}from'node:path';import{promisify}from'node:util';const scrypt=promisify(P);import G from'@fastify/cookie';import j from'@fastify/session';import{Authenticator}from'@fastify/passport';import Z from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();class FileSessionStore{['path'];constructor(q){const z=C;this['path']=q,void mkdir(this[z(0x146)],{'recursive':!![]});}['fileFor'](q){const x=C;return join(this['path'],q+x(0x147));}async['get'](q,p){const o=C;try{const X=await readFile(this[o(0x148)](q),'utf8');p(null,JSON[o(0x149)](X));}catch(F){const A=F;if(A[o(0x14a)]==='ENOENT'){p(null,undefined);return;}p(A,undefined);}}async['set'](q,p,X){const i=C;try{await mkdir(this[i(0x146)],{'recursive':!![]}),await writeFile(this['fileFor'](q),JSON['stringify'](p),i(0x14b)),X();}catch(F){X(F);}}async['destroy'](q,p){const y=C;try{await unlink(this[y(0x148)](q))[y(0x14c)](X=>{if(X['code']!=='ENOENT')throw X;}),p();}catch(X){p(X);}}}function C(P,G){P=P-0x146;const j=m();let Z=j[P];return Z;}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(q){const T=C,p=randomBytes(0x10),X=await scrypt(q,p,0x40);return'scrypt$'+p['toString']('hex')+'$'+X['toString'](T(0x14d));}export async function verifyPassword(q,p){const [X,F,A]=p?.['split']('$')||[];if(X!=='scrypt'||!F||!A)return![];const H=Buffer['from'](F,'hex'),b=Buffer['from'](A,'hex'),E=await scrypt(q,H,b['length']);return timingSafeEqual(E,b);}export async function createSessionStore(q,p){const D=C,{config:X,redis:F}=p;if(!X){console['warn']('Missing\x20config\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV===D(0x14e)||process.env.VITEST)return;await q['register'](G,{'parseOptions':X['auth']['cookieOptions']});const A=X['redis']['host']?new Z({'prefix':X['auth'][D(0x14f)]+':'+(X['pg']?.['database']||'db')+':','client':F}):new FileSessionStore(resolve(X[D(0x150)]??'./storage','sessions'));await q[D(0x151)](j,{'secret':X['auth'][D(0x152)],'cookieName':X['auth']['cookieName'],'cookie':X['auth']['cookieOptions'],'store':A}),await q[D(0x151)](fastifyPassport[D(0x153)]()),await q[D(0x151)](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async H=>({'user':H})),fastifyPassport['registerUserDeserializer'](async H=>{const h=D,b=H?.['user']||H;return b?.['id']&&(b[h(0x154)]=await getUserPermissions(b['id'],p)),b;});}
1
+ export*from'./auth.types.js';import{randomBytes,scrypt as p,timingSafeEqual}from'node:crypto';import{mkdir,readFile,unlink,writeFile}from'node:fs/promises';import{join,resolve}from'node:path';import{promisify}from'node:util';function s(){const G=['path','.json','fileFor','stringify','utf8','toString','hex','scrypt','from','warn','register','redis','host','auth','database','./storage','sessions','cookieName','secureSession','permissions'];s=function(){return G;};return s();}const scrypt=promisify(p);import Z from'@fastify/cookie';import A from'@fastify/session';import{Authenticator}from'@fastify/passport';function f(p,Z){p=p-0xc7;const A=s();let I=A[p];return I;}import I from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();class FileSessionStore{['path'];constructor(j){this['path']=j,void mkdir(this['path'],{'recursive':!![]});}['fileFor'](j){const N=f;return join(this[N(0xc7)],j+N(0xc8));}async['get'](j,D){try{const o=await readFile(this['fileFor'](j),'utf8');D(null,JSON['parse'](o));}catch(R){const B=R;if(B['code']==='ENOENT'){D(null,undefined);return;}D(B,undefined);}}async['set'](j,D,o){const h=f;try{await mkdir(this[h(0xc7)],{'recursive':!![]}),await writeFile(this[h(0xc9)](j),JSON[h(0xca)](D),h(0xcb)),o();}catch(R){o(R);}}async['destroy'](j,D){const E=f;try{await unlink(this[E(0xc9)](j))['catch'](o=>{if(o['code']!=='ENOENT')throw o;}),D();}catch(o){D(o);}}}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(j){const a=f,D=randomBytes(0x10),o=await scrypt(j,D,0x40);return'scrypt$'+D[a(0xcc)]('hex')+'$'+o['toString'](a(0xcd));}export async function verifyPassword(j,D){const X=f,[o,R,B]=D?.['split']('$')||[];if(o!==X(0xce)||!R||!B)return![];const H=Buffer['from'](R,X(0xcd)),e=Buffer[X(0xcf)](B,X(0xcd)),g=await scrypt(j,H,e['length']);return timingSafeEqual(g,e);}export async function createSessionStore(j,D){const K=f,{config:o,redis:R}=D;if(!o){console[K(0xd0)]('Missing\x20config\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await j[K(0xd1)](Z,{'parseOptions':o['auth']['cookieOptions']});const B=o[K(0xd2)][K(0xd3)]?new I({'prefix':o[K(0xd4)]['cookieName']+':'+(o['pg']?.[K(0xd5)]||'db')+':','client':R}):new FileSessionStore(resolve(o['storagePath']??K(0xd6),K(0xd7)));await j[K(0xd1)](A,{'secret':o[K(0xd4)]['secret'],'cookieName':o['auth'][K(0xd8)],'cookie':o['auth']['cookieOptions'],'store':B}),await j[K(0xd1)](fastifyPassport['initialize']()),await j['register'](fastifyPassport[K(0xd9)]()),fastifyPassport['registerUserSerializer'](async H=>({'user':H})),fastifyPassport['registerUserDeserializer'](async H=>{const Q=K,e=H?.['user']||H;return e?.['id']&&(e[Q(0xda)]=await getUserPermissions(e['id'],D)),e;});}
@@ -1 +1 @@
1
- import{BadRequestError}from'../../errors.js';function C(P,G){P=P-0x144;const j=m();let Z=j[P];return Z;}import{verifyPassword}from'./index.js';export async function verifyUser({user:P,password:G,ip:j},{pg:Z,logger:q}){const b=C;if(!P||P==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!G||G==='')throw new BadRequestError('not\x20enough\x20params:\x20password');q[b(0x144)](b(0x145));const p='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa,\x20first_name,\x20middle_name,last_name,email,phone,avatar,last_activity_date\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',X=await Z['query'](p,[P])['then'](A=>A['rows']?.[0x0]);if(!X){const A='user\x20not\x20found';q['info']({'file':'auth/warn','error':A,'user':P,'ip':j});throw new BadRequestError(A);}const F=await verifyPassword(G,X['password_hash']);if(!F){const H=b(0x146);q['info']({'file':b(0x147),'error':H,'user':P,'ip':j});throw new BadRequestError(H);}return Z['query']('update\x20admin.users\x20set\x20last_activity_date\x20=\x20now()\x20where\x20uid\x20=\x20$1',[X['id']]),delete X['password_hash'],X;}function m(){const E=['metrics','user.login','Wrong\x20password','auth/warn'];m=function(){return E;};return m();}
1
+ import{BadRequestError}from'../../errors.js';function f(p,Z){p=p-0xd8;const A=s();let I=A[p];return I;}function s(){const g=['select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa,\x20first_name,\x20middle_name,last_name,email,phone,avatar,last_activity_date\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201','then','auth/warn','update\x20admin.users\x20set\x20last_activity_date\x20=\x20now()\x20where\x20uid\x20=\x20$1','password_hash'];s=function(){return g;};return s();}import{verifyPassword}from'./index.js';export async function verifyUser({user:p,password:Z,ip:A},{pg:I,logger:j}){const e=f;if(!p||p==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!Z||Z==='')throw new BadRequestError('not\x20enough\x20params:\x20password');j['metrics']('user.login');const D=e(0xd8),o=await I['query'](D,[p])[e(0xd9)](B=>B['rows']?.[0x0]);if(!o){const B='user\x20not\x20found';j['info']({'file':e(0xda),'error':B,'user':p,'ip':A});throw new BadRequestError(B);}const R=await verifyPassword(Z,o['password_hash']);if(!R){const H='Wrong\x20password';j['info']({'file':'auth/warn','error':H,'user':p,'ip':A});throw new BadRequestError(H);}return I['query'](e(0xdb),[o['id']]),delete o[e(0xdc)],o;}
@@ -1 +1 @@
1
- function C(P,G){P=P-0x1ee;const j=m();let Z=j[P];return Z;}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function m(){const Q=['empty\x20pg','dictionaries','Invalid\x20dictionary\x20name:\x20','Invalid\x20dictionary\x20items:\x20','query','rows','set','items','Dictionary\x20items\x20must\x20be\x20an\x20array','Dictionary\x20table\x20not\x20found','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionaries\x20(code,\x20name,\x20module,\x20source,\x20editable)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(code)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20name\x20=\x20EXCLUDED.name,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module\x20=\x20EXCLUDED.module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20source\x20=\x20EXCLUDED.source,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20editable\x20=\x20EXCLUDED.editable,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','fcore','custom','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionary_items\x20(dictionary_id,\x20code,\x20name,\x20parent_id)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','code','parentId','COMMIT','ROLLBACK','static','get','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20code,\x20name,\x20\x27database\x27\x20AS\x20source\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionaries\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20','push'];m=function(){return Q;};return m();}export function createDictionary({pg:P,dictionaries:dictionaries=[]}){const G=new Map(),j=new Map();let Z,q;async function p(){const N=C;if(Z!==undefined)return Z;if(!P)throw new Error(N(0x1ee));return q??=P['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](o=>{const a=N,i=o['rows'][0x0]?.['table_name'];Z=i===a(0x1ef)?i:null;}),await q,Z;}function X(o){const n=C;if(!dictionaryName['test'](o))throw new ValidationError(n(0x1f0)+o);}function F(o){const f=C;for(const i of Array['isArray'](o)?o:[o]){X(i['code']);if(!Array['isArray'](i['items']))throw new ValidationError(f(0x1f1)+i['code']);if(G['has'](i['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+i['code']);G['set'](i['code'],{...i,'source':'static'});}}function A(o){return G['has'](o);}async function H(o){const I=C;X(o);const i=G['get'](o);if(i&&i['checked'])return i['items'];const y=await p();if(!y)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const T=await P?.[I(0x1f2)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20di.code,\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionary_items\x20di\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20admin.dictionaries\x20d\x20ON\x20d.id\x20=\x20di.dictionary_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20d.code\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[o]);if(T?.['rows']?.['length']){const D=T?.[I(0x1f3)];return G[I(0x1f4)](o,{'code':o,'name':o,'items':D,'source':'database','checked':!![]}),D;}if(!i?.[I(0x1f5)])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+o);return i['checked']=!![],i['items'];}async function b(o,i){const k=C;X(o);if(!Array['isArray'](i))throw new ValidationError(k(0x1f6));const y=await p();if(!y)throw new NotFoundError(k(0x1f7));if(!P)throw new Error('empty\x20pg');const T=await P['connect']();try{await T['query']('BEGIN');const D=await T['query'](k(0x1f8),[o,o,k(0x1f9),k(0x1fa),!![]]),h=D[k(0x1f3)][0x0]['id'];await T['query'](k(0x1fb),[h]);for(const L of i){await T[k(0x1f2)](k(0x1fc),[h,L[k(0x1fd)],L['name'],L[k(0x1fe)]??null]);}await T[k(0x1f2)](k(0x1ff));}catch(O){await T['query'](k(0x200));throw O;}finally{T['release']();}G[k(0x1f4)](o,{'items':i,'code':o,'source':k(0x201),'checked':!![]}),j[k(0x1f4)](o,(j['get'](o)??0x0)+0x1);}function E(o){return X(o),j['set'](o,(j['get'](o)??0x0)+0x1),G['delete'](o);}function z(o){const M=C;return j[M(0x202)](o)??0x0;}async function x(){const l=C,o=[...G['values']()]['map'](({code:T,name:D,source:h})=>({'code':T,'name':D??T,'source':h})),i=await p();if(!i)return o;if(!P)throw new Error('empty\x20pg');const y=await P['query'](l(0x203));for(const T of y['rows']){!G['has'](T[l(0x1fd)])&&o[l(0x204)](T);}return o;}return F(dictionaries),{'register':F,'get':H,'put':b,'clear':E,'revision':z,'list':x,'has':A};}
1
+ import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function f(p,Z){p=p-0x1a3;const A=s();let I=A[p];return I;}function s(){const m=['\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20','then','rows','table_name','isArray','code','Dictionary\x20already\x20registered:\x20','get','set','empty\x20pg','query','custom','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','name','parentId','COMMIT','ROLLBACK','values','push'];s=function(){return m;};return s();}export function createDictionary({pg:p,dictionaries:dictionaries=[]}){const Z=new Map(),A=new Map();let I,j;async function D(){const F=f;if(I!==undefined)return I;if(!p)throw new Error('empty\x20pg');return j??=p['query'](F(0x1a3))[F(0x1a4)](E=>{const T=F,a=E[T(0x1a5)][0x0]?.[T(0x1a6)];I=a==='dictionaries'?a:null;}),await j,I;}function o(E){if(!dictionaryName['test'](E))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+E);}function R(E){const L=f;for(const a of Array[L(0x1a7)](E)?E:[E]){o(a[L(0x1a8)]);if(!Array['isArray'](a['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+a['code']);if(Z['has'](a['code']))throw new ConflictError(L(0x1a9)+a[L(0x1a8)]);Z['set'](a['code'],{...a,'source':'static'});}}function B(E){return Z['has'](E);}async function H(E){const y=f;o(E);const a=Z[y(0x1aa)](E);if(a&&a['checked'])return a['items'];const X=await D();if(!X)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const K=await p?.['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20di.code,\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionary_items\x20di\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20admin.dictionaries\x20d\x20ON\x20d.id\x20=\x20di.dictionary_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20d.code\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[E]);if(K?.[y(0x1a5)]?.['length']){const Q=K?.[y(0x1a5)];return Z[y(0x1ab)](E,{'code':E,'name':E,'items':Q,'source':'database','checked':!![]}),Q;}if(!a?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+E);return a['checked']=!![],a['items'];}async function e(E,a){const z=f;o(E);if(!Array[z(0x1a7)](a))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const X=await D();if(!X)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!p)throw new Error(z(0x1ac));const K=await p['connect']();try{await K[z(0x1ad)]('BEGIN');const Q=await K['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionaries\x20(code,\x20name,\x20module,\x20source,\x20editable)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(code)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20name\x20=\x20EXCLUDED.name,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module\x20=\x20EXCLUDED.module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20source\x20=\x20EXCLUDED.source,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20editable\x20=\x20EXCLUDED.editable,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20',[E,E,'fcore',z(0x1ae),!![]]),G=Q[z(0x1a5)][0x0]['id'];await K['query'](z(0x1af),[G]);for(const V of a){await K['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionary_items\x20(dictionary_id,\x20code,\x20name,\x20parent_id)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20',[G,V['code'],V[z(0x1b0)],V[z(0x1b1)]??null]);}await K[z(0x1ad)](z(0x1b2));}catch(O){await K['query'](z(0x1b3));throw O;}finally{K['release']();}Z['set'](E,{'items':a,'code':E,'source':'static','checked':!![]}),A['set'](E,(A['get'](E)??0x0)+0x1);}function g(E){return o(E),A['set'](E,(A['get'](E)??0x0)+0x1),Z['delete'](E);}function N(E){return A['get'](E)??0x0;}async function h(){const t=f,E=[...Z[t(0x1b4)]()]['map'](({code:K,name:Q,source:G})=>({'code':K,'name':Q??K,'source':G})),a=await D();if(!a)return E;if(!p)throw new Error('empty\x20pg');const X=await p['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20code,\x20name,\x20\x27database\x27\x20AS\x20source\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionaries\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20');for(const K of X['rows']){!Z['has'](K['code'])&&E[t(0x1b5)](K);}return E;}return R(dictionaries),{'register':R,'get':H,'put':e,'clear':g,'revision':N,'list':h,'has':B};}
@@ -1 +1 @@
1
- function C(P,G){P=P-0xf5;const j=m();let Z=j[P];return Z;}import P from'node:fs/promises';import G from'node:path';import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import j from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function normalizeRelativePath(Z){const y=C;if(!Z||Z[y(0xf5)]('/')||Z['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');return Z['replace'](/\\/g,'/')[y(0xf6)](/^\/+/,'');}function keyFor(Z,q){const T=C;return''+((Z??'')['replace'](/^\/+|\/+$/g,'')?(Z??'')[T(0xf6)](/^\/+|\/+$/g,'')+'/':'')+normalizeRelativePath(q);}async function bodyToBuffer(Z){const D=C;if(!Z)return Buffer[D(0xf7)](0x0);const q=Z;if(typeof q['transformToByteArray']===D(0xf8))return Buffer['from'](await q['transformToByteArray']());const p=[];for await(const X of Z){p['push'](Buffer['from'](X));}return Buffer['concat'](p);}function m(){const R=['startsWith','replace','alloc','function','storagePath','randomBytes','toString','files','join','resolve','mkdir','writeFile','rename','ENOENT','split','sha256','update','from','timingSafeEqual','base64url','region','send','bucket','name','tokenTtl','digest','Invalid\x20file\x20token','createHmac','length','utf8'];m=function(){return R;};return m();}export function createFileLocal(Z){const h=C,q=G['resolve'](Z[h(0xf9)]||'./storage'),p=G['join'](q,'removed'),X=Z['tokenSecret']??process.env.FILE_TOKEN_SECRET??j[h(0xfa)](0x20)[h(0xfb)]('hex'),F=b=>{const L=h,E=normalizeRelativePath(b),z=(Z['folder']??L(0xfc))[L(0xf6)](/^\/+|\/+$/g,'');return z?G[L(0xfd)](z,E):E;},A=b=>{const E=F(b),z=G['resolve'](q,E),x=G['relative'](q,z);if(x['startsWith']('..')||G['isAbsolute'](x))throw new ValidationError('Invalid\x20file\x20path');return z;},H=b=>{const O=h,E=F(b),z=G[O(0xfe)](p,E),x=G['relative'](p,z);if(x['startsWith']('..')||G['isAbsolute'](x))throw new ValidationError('Invalid\x20file\x20path');return z;};return{async 'put'(b,E){const N=h,z=A(b);await P[N(0xff)](G['dirname'](z),{'recursive':!![]}),await P[N(0x100)](z,E instanceof Buffer?E:await bodyToBuffer(E));},async 'get'(b){return P['readFile'](A(b));},async 'exists'(b){try{return await P['access'](A(b)),!![];}catch{return![];}},async 'delete'(b){const a=h,E=A(b),z=H(b);try{await P['mkdir'](G['dirname'](z),{'recursive':!![]}),await P[a(0x101)](E,z);}catch(x){const o=x;if(o['code']!==a(0x102))throw x;}},'create'(b,E=Z['tokenTtl']??0xe10){const z=Buffer['from'](b)['toString']('base64url'),x=j['createHmac']('sha256',X)['update'](z)['digest']('base64url');return z+'.'+x;},'verify'(b){const n=h,[E,z]=b[n(0x103)]('.');if(!E||!z)throw new UnauthorizedError('Invalid\x20file\x20token');const x=j['createHmac'](n(0x104),X)[n(0x105)](E)['digest'](),o=Buffer[n(0x106)](z,'base64url');if(x['length']!==o['length']||!j[n(0x107)](x,o))throw new UnauthorizedError('Invalid\x20file\x20token');const i=Buffer['from'](E,n(0x108))['toString']('utf8');return i;}};}export function createFileS3(Z){const f=C,q=Z['tokenSecret']??process.env.FILE_TOKEN_SECRET??j['randomBytes'](0x20)[f(0xfb)]('hex'),p=new S3Client({'endpoint':Z['endpoint'],'region':Z[f(0x109)]??'us-east-1','forcePathStyle':Z['forcePathStyle']??!![],'credentials':Z['accessKeyId']||Z['accessKey']?{'accessKeyId':Z['accessKeyId']??Z['accessKey'],'secretAccessKey':Z['secretAccessKey']??Z['secretKey']}:undefined}),X=F=>keyFor(Z['folder'],F);return{async 'put'(F,A){const I=f;await p[I(0x10a)](new PutObjectCommand({'Bucket':Z[I(0x10b)],'Key':X(F),'Body':A}));},async 'get'(F){const A=await p['send'](new GetObjectCommand({'Bucket':Z['bucket'],'Key':X(F)}));return bodyToBuffer(A['Body']);},async 'exists'(F){const k=f;try{return await p['send'](new HeadObjectCommand({'Bucket':Z['bucket'],'Key':X(F)})),!![];}catch(A){const H=A;if(H['$metadata']?.['httpStatusCode']===0x194||H[k(0x10c)]==='NotFound')return![];throw A;}},async 'delete'(F){const M=f;await p[M(0x10a)](new DeleteObjectCommand({'Bucket':Z[M(0x10b)],'Key':X(F)}));},'create'(F,A=Z[f(0x10d)]??0xe10){const l=f,H=Buffer['from'](F)['toString'](l(0x108)),b=j['createHmac']('sha256',q)[l(0x105)](H)[l(0x10e)]('base64url');return H+'.'+b;},'verify'(F){const Q=f,[A,H]=F['split']('.');if(!A||!H)throw new UnauthorizedError(Q(0x10f));const b=j[Q(0x110)]('sha256',q)['update'](A)['digest'](),E=Buffer['from'](H,Q(0x108));if(b[Q(0x111)]!==E[Q(0x111)]||!j[Q(0x107)](b,E))throw new UnauthorizedError('Invalid\x20file\x20token');const z=Buffer['from'](A,'base64url')['toString'](Q(0x112));return z;}};}
1
+ function s(){const b=['alloc','transformToByteArray','resolve','tokenSecret','join','startsWith','dirname','access','code','ENOENT','toString','createHmac','Invalid\x20file\x20token','length','from','base64url','randomBytes','us-east-1','accessKeyId','bucket','tokenTtl','sha256','digest','split','utf8'];s=function(){return b;};return s();}import p from'node:fs/promises';import Z from'node:path';import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';function f(p,Z){p=p-0x1a8;const A=s();let I=A[p];return I;}import A from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function normalizeRelativePath(I){if(!I||I['startsWith']('/')||I['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');return I['replace'](/\\/g,'/')['replace'](/^\/+/,'');}function keyFor(I,j){return''+((I??'')['replace'](/^\/+|\/+$/g,'')?(I??'')['replace'](/^\/+|\/+$/g,'')+'/':'')+normalizeRelativePath(j);}async function bodyToBuffer(I){const X=f;if(!I)return Buffer[X(0x1a8)](0x0);const j=I;if(typeof j[X(0x1a9)]==='function')return Buffer['from'](await j['transformToByteArray']());const D=[];for await(const o of I){D['push'](Buffer['from'](o));}return Buffer['concat'](D);}export function createFileLocal(I){const K=f,j=Z[K(0x1aa)](I['storagePath']||'./storage'),D=Z['join'](j,'removed'),o=I[K(0x1ab)]??process.env.FILE_TOKEN_SECRET??A['randomBytes'](0x20)['toString']('hex'),R=e=>{const Q=K,g=normalizeRelativePath(e),N=(I['folder']??'files')['replace'](/^\/+|\/+$/g,'');return N?Z[Q(0x1ac)](N,g):g;},B=e=>{const G=K,g=R(e),N=Z['resolve'](j,g),h=Z['relative'](j,N);if(h[G(0x1ad)]('..')||Z['isAbsolute'](h))throw new ValidationError('Invalid\x20file\x20path');return N;},H=e=>{const V=K,g=R(e),N=Z['resolve'](D,g),h=Z['relative'](D,N);if(h[V(0x1ad)]('..')||Z['isAbsolute'](h))throw new ValidationError('Invalid\x20file\x20path');return N;};return{async 'put'(e,g){const O=K,N=B(e);await p['mkdir'](Z[O(0x1ae)](N),{'recursive':!![]}),await p['writeFile'](N,g instanceof Buffer?g:await bodyToBuffer(g));},async 'get'(e){return p['readFile'](B(e));},async 'exists'(e){const F=K;try{return await p[F(0x1af)](B(e)),!![];}catch{return![];}},async 'delete'(e){const T=K,g=B(e),N=H(e);try{await p['mkdir'](Z['dirname'](N),{'recursive':!![]}),await p['rename'](g,N);}catch(h){const E=h;if(E[T(0x1b0)]!==T(0x1b1))throw h;}},'create'(e,g=I['tokenTtl']??0xe10){const L=K,N=Buffer['from'](e)[L(0x1b2)]('base64url'),h=A[L(0x1b3)]('sha256',o)['update'](N)['digest']('base64url');return N+'.'+h;},'verify'(e){const y=K,[g,N]=e['split']('.');if(!g||!N)throw new UnauthorizedError(y(0x1b4));const h=A['createHmac']('sha256',o)['update'](g)['digest'](),E=Buffer['from'](N,'base64url');if(h[y(0x1b5)]!==E['length']||!A['timingSafeEqual'](h,E))throw new UnauthorizedError(y(0x1b4));const a=Buffer[y(0x1b6)](g,y(0x1b7))[y(0x1b2)]('utf8');return a;}};}export function createFileS3(I){const z=f,j=I['tokenSecret']??process.env.FILE_TOKEN_SECRET??A[z(0x1b8)](0x20)[z(0x1b2)]('hex'),D=new S3Client({'endpoint':I['endpoint'],'region':I['region']??z(0x1b9),'forcePathStyle':I['forcePathStyle']??!![],'credentials':I['accessKeyId']||I['accessKey']?{'accessKeyId':I[z(0x1ba)]??I['accessKey'],'secretAccessKey':I['secretAccessKey']??I['secretKey']}:undefined}),o=R=>keyFor(I['folder'],R);return{async 'put'(R,B){await D['send'](new PutObjectCommand({'Bucket':I['bucket'],'Key':o(R),'Body':B}));},async 'get'(R){const B=await D['send'](new GetObjectCommand({'Bucket':I['bucket'],'Key':o(R)}));return bodyToBuffer(B['Body']);},async 'exists'(R){try{return await D['send'](new HeadObjectCommand({'Bucket':I['bucket'],'Key':o(R)})),!![];}catch(B){const H=B;if(H['$metadata']?.['httpStatusCode']===0x194||H['name']==='NotFound')return![];throw B;}},async 'delete'(R){const t=z;await D['send'](new DeleteObjectCommand({'Bucket':I[t(0x1bb)],'Key':o(R)}));},'create'(R,B=I[z(0x1bc)]??0xe10){const m=z,H=Buffer[m(0x1b6)](R)['toString']('base64url'),e=A['createHmac'](m(0x1bd),j)['update'](H)[m(0x1be)](m(0x1b7));return H+'.'+e;},'verify'(R){const r=z,[B,H]=R[r(0x1bf)]('.');if(!B||!H)throw new UnauthorizedError('Invalid\x20file\x20token');const e=A['createHmac']('sha256',j)['update'](B)['digest'](),g=Buffer['from'](H,r(0x1b7));if(e[r(0x1b5)]!==g['length']||!A['timingSafeEqual'](e,g))throw new UnauthorizedError(r(0x1b4));const N=Buffer[r(0x1b6)](B,'base64url')['toString'](r(0x1c0));return N;}};}
@@ -1 +1 @@
1
- const p=C;import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()[p(0x1f4)](process.env.AUTH_JWT_SECRET);function m(){const H=['encode','HS256','message'];m=function(){return H;};return m();}export async function jwtSignToken(P){const X=p;if(!process.env.AUTH_JWT_SECRET)return;const {id:G,type:j,permissions:Z}=P,q=await new SignJWT({'id':G,'type':j,'permissions':Z})['setProtectedHeader']({'alg':X(0x1f5)})['setIssuedAt']()['setExpirationTime']('1h')['sign'](secret);return q;}function C(P,G){P=P-0x1f4;const j=m();let Z=j[P];return Z;}export async function jwtVerifyToken(P){const F=p,G=await jwtVerify(P,secret,{'algorithms':[F(0x1f5)]})['catch'](j=>{const A=F;console['log'](j[A(0x1f6)]);});return G?.['payload'];}
1
+ import{SignJWT,jwtVerify}from'jose';function f(p,Z){p=p-0x7f;const A=s();let I=A[p];return I;}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(p){const D=f;if(!process.env.AUTH_JWT_SECRET)return;const {id:Z,type:A,permissions:I}=p,j=await new SignJWT({'id':Z,'type':A,'permissions':I})[D(0x7f)]({'alg':'HS256'})[D(0x80)]()[D(0x81)]('1h')['sign'](secret);return j;}export async function jwtVerifyToken(p){const o=f,Z=await jwtVerify(p,secret,{'algorithms':[o(0x82)]})['catch'](A=>{console['log'](A['message']);});return Z?.['payload'];}function s(){const R=['setProtectedHeader','setIssuedAt','setExpirationTime','HS256'];s=function(){return R;};return s();}
@@ -1 +1 @@
1
- function m(){const A=['./transport.js','info','token','[REDACTED]'];m=function(){return A;};return m();}import P from'pino';function C(P,G){P=P-0x1d2;const j=m();let Z=j[P];return Z;}export function createLogger(){const F=C,G=P['transport']({'target':F(0x1d2)}),j=P({'level':F(0x1d3),'timestamp':P['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization','password',F(0x1d4),'accessToken','refreshToken'],'censor':F(0x1d5)}},G),Z={};function q(p,X){if(p===undefined)return{...Z};Z[p]=(Z[p]??0x0)+(X??0x1);}return Object['assign'](j,{'close':async()=>G['end'](),'metrics':q,'file':()=>j['info']['bind'](j)});}
1
+ import p from'pino';function f(p,Z){p=p-0x80;const A=s();let I=A[p];return I;}export function createLogger(){const R=f,Z=p['transport']({'target':'./transport.js'}),A=p({'level':'info','timestamp':p[R(0x80)]['isoTime'],'base':{'service':'app'},'redact':{'paths':[R(0x81),'password',R(0x82),'accessToken',R(0x83)],'censor':'[REDACTED]'}},Z),I={};function j(D,o){if(D===undefined)return{...I};I[D]=(I[D]??0x0)+(o??0x1);}return Object['assign'](A,{'close':async()=>Z['end'](),'metrics':j,'file':()=>A[R(0x84)]['bind'](A)});}function s(){const B=['stdTimeFunctions','req.headers.authorization','token','refreshToken','info'];s=function(){return B;};return s();}
@@ -1 +1 @@
1
- const F=C;import P from'node:fs';function m(){const E=['warn','error','toISOString','createWriteStream','get'];m=function(){return E;};return m();}import G from'node:path';import j from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:F(0x162),0x32:F(0x163),0x3c:'error'},streams=new Map();function getDate(){const A=F;return new Date()[A(0x164)]()['slice'](0x0,0xa);}function createStream(Z,q){const H=F,p=G['resolve']('logs',Z);return P['mkdirSync'](p,{'recursive':!![]}),P[H(0x165)](G['join'](p,q+'.log'),{'flags':'a'});}function getStream(Z){const b=F,q=getDate(),p=streams[b(0x166)](Z);if(p&&p['date']===q)return p['stream'];p?.['stream']['end']();const X=createStream(Z,q);return streams['set'](Z,{'date':q,'stream':X}),X;}function closeStreams(){for(const {stream:Z}of streams['values']()){Z['end']();}streams['clear']();}export default async function loggerTransport(){return j(writeLogs,{'close':async()=>{closeStreams();}});}function C(P,G){P=P-0x162;const j=m();let Z=j[P];return Z;}async function writeLogs(Z){for await(const q of Z){const p=LEVELS[q['level']];if(!p)continue;const X=getStream(q['file']||p);delete q['file'],X['write'](JSON['stringify'](q)+'\x0a');}}
1
+ const R=f;function s(){const h=['info','warn','slice','resolve','mkdirSync','get','stream','end','write'];s=function(){return h;};return s();}import p from'node:fs';import Z from'node:path';import A from'pino-abstract-transport';const LEVELS={0x1e:R(0xa0),0x28:R(0xa1),0x32:'error',0x3c:'error'},streams=new Map();function getDate(){const B=R;return new Date()['toISOString']()[B(0xa2)](0x0,0xa);}function createStream(I,j){const H=R,D=Z[H(0xa3)]('logs',I);return p[H(0xa4)](D,{'recursive':!![]}),p['createWriteStream'](Z['join'](D,j+'.log'),{'flags':'a'});}function f(p,Z){p=p-0xa0;const A=s();let I=A[p];return I;}function getStream(I){const e=R,j=getDate(),D=streams[e(0xa5)](I);if(D&&D['date']===j)return D[e(0xa6)];D?.['stream']['end']();const o=createStream(I,j);return streams['set'](I,{'date':j,'stream':o}),o;}function closeStreams(){const g=R;for(const {stream:I}of streams['values']()){I[g(0xa7)]();}streams['clear']();}export default async function loggerTransport(){return A(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(I){const N=R;for await(const j of I){const D=LEVELS[j['level']];if(!D)continue;const o=getStream(j['file']||D);delete j['file'],o[N(0xa8)](JSON['stringify'](j)+'\x0a');}}
@@ -1 +1 @@
1
- import P from'pg';function m(){const i=['bind','captureStackTrace','catch','callerStack','query','COMMIT'];m=function(){return i;};return m();}const {Pool}=P;function C(P,G){P=P-0x18a;const j=m();let Z=j[P];return Z;}export function createDatabase(G){const E=C,j=new Pool(G),Z=j['query'][E(0x18a)](j);function q(p,X){const z=E,F=new Error();return Error[z(0x18b)]?.(F,q),Z(p,X)[z(0x18c)](A=>{const x=z,H=A;H['sql']=p,H[x(0x18d)]=F['stack'];throw H;});}return j[E(0x18e)]=q,j['transaction']=async function(p){const o=E,X=new Error();Error['captureStackTrace']?.(X,j['transaction']);const F=await j['connect']();try{await F[o(0x18e)]('BEGIN');const A=await p(F);return await F['query'](o(0x18f)),A;}catch(H){await F[o(0x18e)]('ROLLBACK');const b=H;b['callerStack']=X['stack'];throw b;}finally{F['release']();}},j;}
1
+ import p from'pg';function s(){const E=['query','stack','callerStack'];s=function(){return E;};return s();}function f(p,Z){p=p-0x179;const A=s();let I=A[p];return I;}const {Pool}=p;export function createDatabase(Z){const g=f,A=new Pool(Z),I=A[g(0x179)]['bind'](A);function j(D,o){const R=new Error();return Error['captureStackTrace']?.(R,j),I(D,o)['catch'](B=>{const N=f,H=B;H['sql']=D,H['callerStack']=R[N(0x17a)];throw H;});}return A['query']=j,A['transaction']=async function(D){const h=g,o=new Error();Error['captureStackTrace']?.(o,A['transaction']);const R=await A['connect']();try{await R[h(0x179)]('BEGIN');const B=await D(R);return await R[h(0x179)]('COMMIT'),B;}catch(H){await R[h(0x179)]('ROLLBACK');const e=H;e[h(0x17b)]=o[h(0x17a)];throw e;}finally{R['release']();}},A;}
@@ -1 +1 @@
1
- function m(){const F=['log','Creating\x20Redis\x20client\x20with\x20config:','del','quit','hincrby'];m=function(){return F;};return m();}function C(P,G){P=P-0xc4;const j=m();let Z=j[P];return Z;}import{Redis}from'ioredis';export function createRedis(P){const X=C;console[X(0xc4)](X(0xc5),P);const G=new Redis(P);return{'get':j=>G['get'](j),'set':(j,Z,q,p)=>{if(p)return G['set'](j,Z,'EX',p);if(typeof q==='number')return G['set'](j,Z,'EX',q);return G['set'](j,Z);},'del':j=>G[X(0xc6)](j),'delete':j=>G['del'](j),'close':()=>G[X(0xc7)](),'ping':()=>G['ping'](),'hincrby':(j,Z,q)=>G[X(0xc8)](j,Z,q),'incrby':(j,Z)=>G['incrby'](j,Z)};}
1
+ import{Redis}from'ioredis';export function createRedis(p){const o=f;console['log'](o(0x1ac),p);const Z=new Redis(p);return{'get':A=>Z['get'](A),'set':(A,I,j,D)=>{if(D)return Z['set'](A,I,'EX',D);if(typeof j==='number')return Z['set'](A,I,'EX',j);return Z['set'](A,I);},'del':A=>Z['del'](A),'delete':A=>Z['del'](A),'close':()=>Z[o(0x1ad)](),'ping':()=>Z['ping'](),'hincrby':(A,I,j)=>Z['hincrby'](A,I,j),'incrby':(A,I)=>Z['incrby'](A,I)};}function f(p,Z){p=p-0x1ac;const A=s();let I=A[p];return I;}function s(){const R=['Creating\x20Redis\x20client\x20with\x20config:','quit'];s=function(){return R;};return s();}
@@ -1 +1 @@
1
- import{ResourceRegistry}from'./resource.registry.js';function C(P,G){P=P-0x1a3;const j=m();let Z=j[P];return Z;}import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';function m(){const z=['bind'];m=function(){return z;};return m();}import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(P){const E=C,G=new ResourceRegistry(),j=createFind(P,G),Z=createFindOne(P,G),q=createCreate(P,G),p=createUpdate(P,G),X=createRemove(P,G),F=createFindRelation(P,G),A=createCreateRelation(P,G),H=createUpdateRelation(P,G),b=createDeleteRelation(P,G);return{'register':G['register']['bind'](G),'unregister':G['unregister']['bind'](G),'has':G['has']['bind'](G),'get':G['get']['bind'](G),'list':G['list'][E(0x1a3)](G),'find':j,'findOne':Z,'create':q,'update':p,'delete':X,'findRelation':F,'createRelation':A,'updateRelation':H,'deleteRelation':b};}
1
+ function f(p,Z){p=p-0x1a5;const A=s();let I=A[p];return I;}import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(p){const g=f,Z=new ResourceRegistry(),A=createFind(p,Z),I=createFindOne(p,Z),j=createCreate(p,Z),D=createUpdate(p,Z),o=createRemove(p,Z),R=createFindRelation(p,Z),B=createCreateRelation(p,Z),H=createUpdateRelation(p,Z),e=createDeleteRelation(p,Z);return{'register':Z['register']['bind'](Z),'unregister':Z['unregister'][g(0x1a5)](Z),'has':Z['has']['bind'](Z),'get':Z[g(0x1a6)]['bind'](Z),'list':Z['list']['bind'](Z),'find':A,'findOne':I,'create':j,'update':D,'delete':o,'findRelation':R,'createRelation':B,'updateRelation':H,'deleteRelation':e};}function s(){const N=['bind','get'];s=function(){return N;};return s();}
@@ -1 +1 @@
1
- import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function C(P,G){P=P-0x10f;const j=m();let Z=j[P];return Z;}function validQualified(P){const Z=C;return P[Z(0x10f)]('.')['length']<=0x2&&P['split']('.')['every'](G=>ident['test'](G));}export class ResourceRegistry{['resources']=new Map();['unregister'](P){const q=C;this[q(0x110)]['delete'](P);}['register'](P,G=![]){const p=C;for(const j of Array['isArray'](P)?P:[P]){this[p(0x111)](j);if(this['resources'][p(0x112)](j['name'])&&!G)throw new ConflictError('Resource\x20already\x20registered:\x20'+j[p(0x113)]);this['resources'][p(0x114)](j[p(0x113)],j);}}['has'](P){return this['resources']['has'](P);}['get'](P){const G=this['resources']['get'](P);if(!G)throw new NotFoundError('Resource\x20not\x20registered:\x20'+P);return G;}['list'](){return[...this['resources']['values']()];}['validate'](P){const X=C;if(P['version']!==0x1||!ident[X(0x115)](P[X(0x113)])||!validQualified(P['table'])||!ident['test'](P[X(0x116)]))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+P[X(0x113)]);for(const [G,j]of Object[X(0x117)](P[X(0x118)])){if(!ident['test'](G)||!ident['test'](j['column']??G))throw new ValidationError(X(0x119)+G);}}}function m(){const F=['split','resources','validate','has','name','set','test','key','entries','fields','Invalid\x20resource\x20field:\x20'];m=function(){return F;};return m();}
1
+ const j=f;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';function f(p,Z){p=p-0x146;const A=s();let I=A[p];return I;}const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(p){const I=f;return p['split']('.')[I(0x146)]<=0x2&&p[I(0x147)]('.')['every'](Z=>ident[I(0x148)](Z));}export class ResourceRegistry{[j(0x149)]=new Map();['unregister'](p){const D=j;this[D(0x149)][D(0x14a)](p);}['register'](p,Z=![]){const o=j;for(const A of Array['isArray'](p)?p:[p]){this['validate'](A);if(this['resources']['has'](A[o(0x14b)])&&!Z)throw new ConflictError(o(0x14c)+A[o(0x14b)]);this['resources']['set'](A['name'],A);}}['has'](p){const R=j;return this['resources'][R(0x14d)](p);}['get'](p){const B=j,Z=this[B(0x149)][B(0x14e)](p);if(!Z)throw new NotFoundError(B(0x14f)+p);return Z;}['list'](){return[...this['resources']['values']()];}[j(0x150)](p){const H=j;if(p[H(0x151)]!==0x1||!ident['test'](p['name'])||!validQualified(p['table'])||!ident['test'](p['key']))throw new ValidationError(H(0x152)+p['name']);for(const [Z,A]of Object['entries'](p['fields'])){if(!ident[H(0x148)](Z)||!ident['test'](A['column']??Z))throw new ValidationError('Invalid\x20resource\x20field:\x20'+Z);}}}function s(){const e=['length','split','test','resources','delete','name','Resource\x20already\x20registered:\x20','has','get','Resource\x20not\x20registered:\x20','validate','version','Invalid\x20resource\x20contract:\x20'];s=function(){return e;};return s();}
@@ -1 +1 @@
1
- function m(){const i=['filter','get','revision','set','text','color','icon','length','flatMap','dictionary','map'];m=function(){return i;};return m();}const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(P,G){const E=C,j=dictionaryIndexesCache['get'](G)??new Map(),Z=dictionaryRevisionsCache['get'](G)??new Map();dictionaryIndexesCache['set'](G,j),dictionaryRevisionsCache['set'](G,Z);const q=P[E(0x1f3)](X=>Z[E(0x1f4)](X)!==G[E(0x1f5)](X));if(q['length']===0x0)return j;const p=await Promise['all'](q['map'](async X=>{const z=E;if(!G['has'](X))return[X,new Map()];const F=await G['get'](X),A=new Map();for(const H of F){const b=H['code']??H['id'];if(b==null)continue;A[z(0x1f6)](String(b),{'id':b,'text':H['name']??H[z(0x1f7)],...H['color']!==undefined?{'color':H[z(0x1f8)]}:{},...H[z(0x1f9)]!==undefined?{'icon':H['icon']}:{}});}return[X,A];}));for(const [X,F]of p){j['set'](X,F),Z[E(0x1f6)](X,G['revision'](X));}return j;}function C(P,G){P=P-0x1f3;const j=m();let Z=j[P];return Z;}export async function addDictionaryLookupData(P,G,j){const x=C;if(!j||P[x(0x1fa)]===0x0)return P;const Z=Object['entries'](G)[x(0x1fb)](([p,X])=>{const o=x,F=X[o(0x1fc)];return F?[{'field':p,'dictionaryName':F}]:[];});if(Z['length']===0x0)return P;const q=await getDictionaryIndexes([...new Set(Z[x(0x1fd)](({dictionaryName:p})=>p))],j);for(const p of P){for(const {field:X,dictionaryName:F}of Z){const A=p[X];p[X+'_data']=A==null?null:q['get'](F)?.[x(0x1f4)](String(A))??null;}}return P;}
1
+ const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(p,Z){const g=f,A=dictionaryIndexesCache['get'](Z)??new Map(),I=dictionaryRevisionsCache[g(0x103)](Z)??new Map();dictionaryIndexesCache['set'](Z,A),dictionaryRevisionsCache[g(0x104)](Z,I);const j=p['filter'](o=>I['get'](o)!==Z[g(0x105)](o));if(j['length']===0x0)return A;const D=await Promise[g(0x106)](j['map'](async o=>{const N=g;if(!Z[N(0x107)](o))return[o,new Map()];const R=await Z[N(0x103)](o),B=new Map();for(const H of R){const e=H['code']??H['id'];if(e==null)continue;B['set'](String(e),{'id':e,'text':H[N(0x108)]??H[N(0x109)],...H['color']!==undefined?{'color':H[N(0x10a)]}:{},...H['icon']!==undefined?{'icon':H[N(0x10b)]}:{}});}return[o,B];}));for(const [o,R]of D){A[g(0x104)](o,R),I[g(0x104)](o,Z['revision'](o));}return A;}function s(){const E=['get','set','revision','all','has','name','text','color','icon','_data'];s=function(){return E;};return s();}function f(p,Z){p=p-0x103;const A=s();let I=A[p];return I;}export async function addDictionaryLookupData(p,Z,A){const h=f;if(!A||p['length']===0x0)return p;const I=Object['entries'](Z)['flatMap'](([D,o])=>{const R=o['dictionary'];return R?[{'field':D,'dictionaryName':R}]:[];});if(I['length']===0x0)return p;const j=await getDictionaryIndexes([...new Set(I['map'](({dictionaryName:D})=>D))],A);for(const D of p){for(const {field:o,dictionaryName:R}of I){const B=D[o];D[o+h(0x10c)]=B==null?null:j[h(0x103)](R)?.[h(0x103)](String(B))??null;}}return p;}
@@ -1 +1 @@
1
- function m(){const A=['file','string'];m=function(){return A;};return m();}function C(P,G){P=P-0x155;const j=m();let Z=j[P];return Z;}export function addFileToken(P,G,j){const F=C;if(!j||P['length']===0x0)return P;const Z=Object['entries'](G)['filter'](([,q])=>q['type']===F(0x155))['map'](([q])=>q);for(const q of P){for(const p of Z){const X=q[p];typeof X===F(0x156)&&X['length']>0x0&&(q[p]=j['create'](X));}}return P;}
1
+ export function addFileToken(p,Z,A){const R=f;if(!A||p['length']===0x0)return p;const I=Object['entries'](Z)['filter'](([,j])=>j['type']===R(0x179))['map'](([j])=>j);for(const j of p){for(const D of I){const o=j[D];typeof o===R(0x17a)&&o[R(0x17b)]>0x0&&(j[D]=A['create'](o));}}return p;}function f(p,Z){p=p-0x179;const A=s();let I=A[p];return I;}function s(){const B=['file','string','length'];s=function(){return B;};return s();}
@@ -1 +1 @@
1
- import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();function C(P,G){P=P-0xd7;const j=m();let Z=j[P];return Z;}export function clearTableLookupCache(P,G){const T=C,j=tableLookupCache['get'](G);if(!j)return;for(const Z of j['keys']()){Z[T(0xd7)](P+':')&&j['delete'](Z);}}export async function addTableLookupData(P,G,j){const D=C;if(!j||P['length']===0x0)return P;const Z=tableLookupCache[D(0xd8)](j)??new Map();tableLookupCache[D(0xd9)](j,Z);const q=Object['entries'](G)['flatMap'](([p,X])=>{const h=D,{table:F,value:value='id',text:text=h(0xda)}=X[h(0xdb)]??{};return F?[{'field':p,'table':F,'value':value,'text':text}]:[];});for(const p of q){const X=new Map();for(const b of P){const E=b[p['field']];(typeof E===D(0xdc)||typeof E==='number')&&X[D(0xd9)](String(E),E);}const F=p['table']+':'+p['value']+':'+p[D(0xdd)],A=Z[D(0xd8)](F)??new Map();Z[D(0xd9)](F,A);const H=[...X[D(0xde)]()]['filter'](([z])=>!A['has'](z))['map'](([,z])=>z);if(H['length']>0x0){const z=await j['query']('SELECT\x20'+qi(p[D(0xdf)])+'\x20AS\x20id,\x20'+qi(p['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(p[D(0xe0)])+D(0xe1)+qi(p['value'])+D(0xe2),[H]);for(const x of z['rows']){A[D(0xd9)](String(x['id']),x);}for(const o of H){!A['has'](String(o))&&A[D(0xd9)](String(o),null);}}for(const i of P){const y=i[p['field']];i[p['field']+D(0xe3)]=y==null?null:A['get'](String(y))??null;}}return P;}function m(){const L=['startsWith','get','set','name','lookup','string','text','entries','value','table','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','\x20=\x20ANY($1)','_data'];m=function(){return L;};return m();}
1
+ function f(p,Z){p=p-0x199;const A=s();let I=A[p];return I;}import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();export function clearTableLookupCache(p,Z){const K=f,A=tableLookupCache[K(0x199)](Z);if(!A)return;for(const I of A['keys']()){I['startsWith'](p+':')&&A['delete'](I);}}export async function addTableLookupData(p,Z,A){const Q=f;if(!A||p['length']===0x0)return p;const I=tableLookupCache['get'](A)??new Map();tableLookupCache['set'](A,I);const j=Object[Q(0x19a)](Z)['flatMap'](([D,o])=>{const G=Q,{table:R,value:value='id',text:text=G(0x19b)}=o['lookup']??{};return R?[{'field':D,'table':R,'value':value,'text':text}]:[];});for(const D of j){const o=new Map();for(const e of p){const g=e[D['field']];(typeof g===Q(0x19c)||typeof g===Q(0x19d))&&o[Q(0x19e)](String(g),g);}const R=D[Q(0x19f)]+':'+D['value']+':'+D['text'],B=I['get'](R)??new Map();I['set'](R,B);const H=[...o[Q(0x19a)]()]['filter'](([N])=>!B['has'](N))[Q(0x1a0)](([,N])=>N);if(H['length']>0x0){const N=await A[Q(0x1a1)](Q(0x1a2)+qi(D['value'])+Q(0x1a3)+qi(D['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(D['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(D['value'])+'\x20=\x20ANY($1)',[H]);for(const h of N['rows']){B['set'](String(h['id']),h);}for(const E of H){!B[Q(0x1a4)](String(E))&&B['set'](String(E),null);}}for(const a of p){const X=a[D['field']];a[D[Q(0x1a5)]+'_data']=X==null?null:B['get'](String(X))??null;}}return p;}function s(){const V=['get','entries','name','string','number','set','table','map','query','SELECT\x20','\x20AS\x20id,\x20','has','field'];s=function(){return V;};return s();}
@@ -1 +1 @@
1
- {"version":3,"file":"create-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/create-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,wCAKY,oBAAoB,QAClD,UAAU,KACf,OAAO,CAAC,GAAG,CAAC,CAyFhB"}
1
+ {"version":3,"file":"create-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/create-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,wCAKY,oBAAoB,QAClD,UAAU,KACf,OAAO,CAAC,GAAG,CAAC,CAyEhB"}
@@ -1 +1 @@
1
- function m(){const D=['files','includes','\x22\x20requires\x20a\x20capabilities\x20\x22','query','INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*','filePath','rows','Generic\x20Resource\x20relation\x20\x22','\x22\x20requires\x20a\x20project/provider\x20implementation','Relation\x20update\x20is\x20not\x20configured:\x20','resource'];m=function(){return D;};return m();}import{UnsupportedError}from'../../../errors.js';function C(P,G){P=P-0xf5;const j=m();let Z=j[P];return Z;}import{createCreate}from'./create.js';export function createCreateRelation(P,G){const j=createCreate(P,G);return async function Z({name:q,id:p,relation:X,data:F,user:A},H){const T=C,b=H?.['pg']??P['pg'],E=G['get'](q);if(['notes',T(0xf5),'gallery']['includes'](X)&&!E['capabilities']?.[T(0xf6)](X))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+X+T(0xf7)+X+'\x22');if(X==='notes'){const o=await b[T(0xf8)](T(0xf9),[q,String(p),F?.['body']]);return o['rows'][0x0];}if(X==='files'){const i=await b['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[q,String(p),F?.[T(0xfa)],F?.['size']??null]);return i['rows'][0x0];}if(X==='gallery'){const y=await b[T(0xf8)]('INSERT\x20INTO\x20admin.gallery\x20(resource,\x20resource_id,\x20file_path,\x20size,\x20mime_type)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[q,String(p),F?.['filePath'],F?.['size']??null,F?.['mimeType']??'image/jpeg']);return y[T(0xfb)][0x0];}const z=E['relations']?.[X];if(!z?.['foreignKey']||!z['resource']&&!z['table'])throw new UnsupportedError(T(0xfc)+X+T(0xfd));if(!F)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+F);if(!z['resource'])throw new UnsupportedError(T(0xfe)+X);F[z['foreignKey']]=p;const x=await j({'name':z[T(0xff)],'data':F??{},'user':A});return x;};}
1
+ function f(p,Z){p=p-0x1e8;const A=s();let I=A[p];return I;}import{UnsupportedError}from'../../../errors.js';function s(){const K=['get','files','includes','Generic\x20Resource\x20relation\x20\x22','INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*','rows','foreignKey','table','resource','Relation\x20update\x20is\x20not\x20configured:\x20'];s=function(){return K;};return s();}import{createCreate}from'./create.js';export function createCreateRelation(p,Z){const A=createCreate(p,Z);return async function I({name:j,id:D,relation:o,data:R,user:B},H){const X=f,e=H?.['pg']??p['pg'],g=Z[X(0x1e8)](j);if(['notes',X(0x1e9)][X(0x1ea)](o)&&!g['capabilities']?.[X(0x1ea)](o))throw new UnsupportedError(X(0x1eb)+o+'\x22\x20requires\x20a\x20capabilities\x20\x22'+o+'\x22');if(o==='notes'){const E=await e['query'](X(0x1ec),[j,String(D),R?.['body']]);return E[X(0x1ed)][0x0];}if(o===X(0x1e9)){const a=await e['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[j,String(D),R?.['filePath'],R?.['size']??null]);return a[X(0x1ed)][0x0];}const N=g['relations']?.[o];if(!N?.[X(0x1ee)]||!N['resource']&&!N[X(0x1ef)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+o+'\x22\x20requires\x20a\x20project/provider\x20implementation');if(!R)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+R);if(!N[X(0x1f0)])throw new UnsupportedError(X(0x1f1)+o);R[N['foreignKey']]=D;const h=await A({'name':N[X(0x1f0)],'data':R??{},'user':B});return h;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function m(){const D=['created_at','push','created_by','length','query','join','rows','table','audit','module','keys'];m=function(){return D;};return m();}import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function C(P,G){P=P-0x1e0;const j=m();let Z=j[P];return Z;}export function createCreate(P,G){return async function j({name:Z,data:q,user:p},X){const T=C,F=G['get'](Z);assertOperation(F,'create',p),validateInputData({'resource':F,'data':q});const A=writableData(F,q);F['fields']['created_at']&&A['push']([T(0x1e0),new Date()]);F['fields']['created_by']&&A[T(0x1e1)]([T(0x1e2),p?.['id']]);if(!A[T(0x1e3)])throw new ValidationError('No\x20writable\x20fields');const H=A['map'](([i])=>qi(i)),b=A['map']((i,y)=>'$'+(y+0x1)),E=A['map'](([,i])=>i),z=X?.['pg']??P['pg'],x=await z[T(0x1e4)]('INSERT\x20INTO\x20'+qt(F['table'])+'\x20('+H['join'](',\x20')+')\x20'+('VALUES\x20('+b[T(0x1e5)](',\x20')+')\x20')+'RETURNING\x20*',E),o=x[T(0x1e6)][0x0];return clearTableLookupCache(F[T(0x1e7)],z),await(X?.[T(0x1e8)]??P['audit'])?.['write']({'userId':p?.['id'],'module':F[T(0x1e9)],'resource':F['name'],'resourceId':o[F['key']],'action':'create','fields':Object[T(0x1ea)](q)}),o;};}
1
+ import{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 f(p,Z){p=p-0x1b4;const A=s();let I=A[p];return I;}import{clearTableLookupCache}from'./add-table-lookup-data.js';function s(){const Q=['created_by','length','map','rows','table','module','name','create','keys'];s=function(){return Q;};return s();}export function createCreate(p,Z){return async function A({name:I,data:j,user:D},o){const K=f,R=Z['get'](I);assertOperation(R,'create',D),validateInputData({'resource':R,'data':j});const B=writableData(R,j);R['fields']['created_at']&&B['push'](['created_at',new Date()]);R['fields'][K(0x1b4)]&&B['push'](['created_by',D?.['id']]);if(!B[K(0x1b5)])throw new ValidationError('No\x20writable\x20fields');const H=B['map'](([a])=>qi(a)),e=B[K(0x1b6)]((a,X)=>'$'+(X+0x1)),g=B[K(0x1b6)](([,a])=>a),N=o?.['pg']??p['pg'],h=await N['query']('INSERT\x20INTO\x20'+qt(R['table'])+'\x20('+H['join'](',\x20')+')\x20'+('VALUES\x20('+e['join'](',\x20')+')\x20')+'RETURNING\x20*',g),E=h[K(0x1b7)][0x0];return clearTableLookupCache(R[K(0x1b8)],N),await(o?.['audit']??p['audit'])?.['write']({'userId':D?.['id'],'module':R[K(0x1b9)],'resource':R[K(0x1ba)],'resourceId':E[R['key']],'action':K(0x1bb),'fields':Object[K(0x1bc)](j)}),E;};}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,8CAKkB,oBAAoB,QACxD,UAAU,KACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuDjC"}
1
+ {"version":3,"file":"delete-relation.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/delete-relation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,CAAC;AACF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,8CAKkB,oBAAoB,QACxD,UAAU,KACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+CjC"}
@@ -1 +1 @@
1
- function m(){const i=['get','notes','includes','query','DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','foreignKey','Generic\x20Resource\x20relation\x20\x22','\x22\x20requires\x20a\x20project/provider\x20implementation','resource'];m=function(){return i;};return m();}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function C(P,G){P=P-0x1b1;const j=m();let Z=j[P];return Z;}export function createDeleteRelation(P,G){const j=createRemove(P,G);return async function Z({name:q,id:p,relation:X,relationId:F,user:A},H){const o=C,b=H?.['pg']??P['pg'],E=G[o(0x1b1)](q);if([o(0x1b2),'files','gallery']['includes'](X)&&!E['capabilities']?.[o(0x1b3)](X))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+X+'\x22\x20requires\x20a\x20capabilities\x20\x22'+X+'\x22');if(X==='notes')return await b[o(0x1b4)](o(0x1b5),[F,q,String(p)]),{'success':!![]};if(X==='files')return await b[o(0x1b4)]('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[F,q,String(p)]),{'success':!![]};if(X==='gallery')return await b['query']('DELETE\x20FROM\x20admin.gallery\x20WHERE\x20id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[F,q,String(p)]),{'success':!![]};const z=E['relations']?.[X];if(!z?.['resource']||!z[o(0x1b6)])throw new UnsupportedError(o(0x1b7)+X+o(0x1b8));const x=await j({'name':z[o(0x1b9)],'id':F,'user':A,'where':{'column':z[o(0x1b6)],'value':p}},H);return{'success':x};};}
1
+ function f(p,Z){p=p-0x156;const A=s();let I=A[p];return I;}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';export function createDeleteRelation(p,Z){const A=createRemove(p,Z);return async function I({name:j,id:D,relation:o,relationId:R,user:B},H){const E=f,e=H?.['pg']??p['pg'],g=Z['get'](j);if([E(0x156),'files'][E(0x157)](o)&&!g['capabilities']?.['includes'](o))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+o+'\x22\x20requires\x20a\x20capabilities\x20\x22'+o+'\x22');if(o==='notes')return await e['query'](E(0x158),[R,j,String(D)]),{'success':!![]};if(o==='files')return await e['query'](E(0x159),[R,j,String(D)]),{'success':!![]};const N=g[E(0x15a)]?.[o];if(!N?.['resource']||!N['foreignKey'])throw new UnsupportedError(E(0x15b)+o+'\x22\x20requires\x20a\x20project/provider\x20implementation');const h=await A({'name':N[E(0x15c)],'id':R,'user':B,'where':{'column':N['foreignKey'],'value':D}},H);return{'success':h};};}function s(){const a=['notes','includes','DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','relations','Generic\x20Resource\x20relation\x20\x22','resource'];s=function(){return a;};return s();}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';function C(P,G){P=P-0x17e;const j=m();let Z=j[P];return Z;}function m(){const o=['WHERE\x20','\x20=\x20$1','\x20=\x20$','length','\x20AND\x20(','DELETE\x20FROM\x20','table','write','module','delete'];m=function(){return o;};return m();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(P,G){return async function j({name:Z,id:q,user:p,where:X},F){const x=C,A=G['get'](Z);assertOperation(A,'delete',p);const H=F?.['pg']??P['pg'],b=[q];let E=x(0x17e)+qi(A['key'])+x(0x17f);X&&(b['push'](X['value']),E+='\x20AND\x20'+qi(X['column'])+x(0x180)+b[x(0x181)]);A['where']&&(E+=x(0x182)+A['where']+')');const z=await H['query'](x(0x183)+qt(A[x(0x184)])+'\x20'+E,b);if((z['rowCount']??0x0)>0x0)clearTableLookupCache(A[x(0x184)],H);if((z['rowCount']??0x0)>0x0)await(F?.['audit']??P['audit'])?.[x(0x185)]({'module':A[x(0x186)],'resource':A['name'],'resourceId':q,'action':x(0x187)});return(z['rowCount']??0x0)>0x0;};}
1
+ function f(p,Z){p=p-0x1d2;const A=s();let I=A[p];return I;}function s(){const E=['delete','column','\x20=\x20$','where','query','DELETE\x20FROM\x20','table','write','name','rowCount'];s=function(){return E;};return s();}import{assertOperation}from'../utils/permissions.js';import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(p,Z){return async function A({name:I,id:j,user:D,where:o},R){const h=f,B=Z['get'](I);assertOperation(B,h(0x1d2),D);const H=R?.['pg']??p['pg'],e=[j];let g='WHERE\x20'+qi(B['key'])+'\x20=\x20$1';o&&(e['push'](o['value']),g+='\x20AND\x20'+qi(o[h(0x1d3)])+h(0x1d4)+e['length']);B['where']&&(g+='\x20AND\x20('+B[h(0x1d5)]+')');const N=await H[h(0x1d6)](h(0x1d7)+qt(B[h(0x1d8)])+'\x20'+g,e);if((N['rowCount']??0x0)>0x0)clearTableLookupCache(B['table'],H);if((N['rowCount']??0x0)>0x0)await(R?.['audit']??p['audit'])?.[h(0x1d9)]({'module':B['module'],'resource':B[h(0x1da)],'resourceId':j,'action':h(0x1d2)});return(N[h(0x1db)]??0x0)>0x0;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function C(P,G){P=P-0x184;const j=m();let Z=j[P];return Z;}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';import{createFindRelation}from'./find-relation.js';function m(){const T=['now','read','Invalid\x20id:\x20','joins','sql','\x20AND\x20(','SELECT\x20','\x20FROM\x20','\x20WHERE\x20','dictionary','fields','file','keys','isArray','include','split','type'];m=function(){return T;};return m();}export function createFindOne(P,G){return async function j({name:Z,id:q,query:query={},user:p}){const y=C,X=Date[y(0x184)](),F=G['get'](Z);assertOperation(F,y(0x185),p);if(F['fields'][F['key']]?.['type']==='integer'&&!Number['isInteger'](Number(q)))throw new ValidationError(y(0x186)+q+'\x20name:'+Z);const A=F[y(0x187)]?.['map'](o=>o[y(0x188)]+'\x20')['join']('\x20')||'',H=F['where']?y(0x189)+F['where']+')':'',b=await P['pg']['query'](y(0x18a)+readableFields(F)['join'](',\x20')+y(0x18b)+qt(F['table'])+'\x20t\x20'+A+y(0x18c)+qi(F['key'])+'=$1'+H+'\x20LIMIT\x201',[q]),E=b['rows'][0x0];if(!E)return null;await addDictionaryLookupData([E],F['fields'],P[y(0x18d)]),await addTableLookupData([E],F[y(0x18e)],P['pg']),addFileToken([E],F['fields'],P[y(0x18f)]);const z=(query['include']==='all'?Object[y(0x190)](F['relations']||{}):null)||(Array[y(0x191)](query['include'])?query[y(0x192)]:query['include']?.[y(0x193)](',')??[]),x=createFindRelation(P,G);for(const o of z){E[o]=await x({'name':Z,'id':q,'relation':o,'query':query,'user':p})['then'](i=>i['rows']??[])['then'](i=>F['relations']?.[o]?.[y(0x194)]==='one'?i[0x0]??null:i);}return E['time']=Date['now']()-X,E;};}
1
+ function f(p,Z){p=p-0x74;const A=s();let I=A[p];return I;}import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function s(){const K=['get','read','type','query','join','table','rows','fields','all','relations'];s=function(){return K;};return s();}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';import{createFindRelation}from'./find-relation.js';export function createFindOne(p,Z){return async function A({name:I,id:j,query:query={},user:D}){const X=f,o=Date['now'](),R=Z[X(0x74)](I);assertOperation(R,X(0x75),D);if(R['fields'][R['key']]?.[X(0x76)]==='integer'&&!Number['isInteger'](Number(j)))throw new ValidationError('Invalid\x20id:\x20'+j+'\x20name:'+I);const B=R['joins']?.['map'](E=>E['sql']+'\x20')['join']('\x20')||'',H=R['where']?'\x20AND\x20('+R['where']+')':'',e=await p['pg'][X(0x77)]('SELECT\x20'+readableFields(R)[X(0x78)](',\x20')+'\x20FROM\x20'+qt(R[X(0x79)])+'\x20t\x20'+B+'\x20WHERE\x20'+qi(R['key'])+'=$1'+H+'\x20LIMIT\x201',[j]),g=e[X(0x7a)][0x0];if(!g)return null;await addDictionaryLookupData([g],R['fields'],p['dictionary']),await addTableLookupData([g],R['fields'],p['pg']),addFileToken([g],R[X(0x7b)],p['file']);const N=(query['include']===X(0x7c)?Object['keys'](R[X(0x7d)]||{}):null)||(Array['isArray'](query['include'])?query['include']:query['include']?.['split'](',')??[]),h=createFindRelation(p,Z);for(const E of N){g[E]=await h({'name':I,'id':j,'relation':E,'query':query,'user':D})['then'](a=>a['rows']??[])['then'](a=>R['relations']?.[E]?.[X(0x76)]==='one'?a[0x0]??null:a);}return g['time']=Date['now']()-o,g;};}
@@ -1 +1 @@
1
- function C(P,G){P=P-0x137;const j=m();let Z=j[P];return Z;}import{UnsupportedError,ValidationError}from'../../../errors.js';function m(){const n=['now','max','isFinite','includes','\x22\x20requires\x20a\x20capabilities\x20\x22','notes','query','rows','files','SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','resource','get','key','keys','junctionTable','JOIN\x20','junctionForeignKey','\x20=\x20t.','\x20=\x20(SELECT\x20','\x20FROM\x20','table','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20','sql','\x20t\x20','fields'];m=function(){return n;};return m();}import{qi,qt}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 createFindRelation(P,G){return async function j({name:Z,id:q,relation:p,query:query={}}){const a=C,X=Date[a(0x137)](),F=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),A=Math[a(0x138)](query['offset']??0x0,0x0);if(!Number['isFinite'](F)||!Number[a(0x139)](A))throw new ValidationError('Invalid\x20pagination');const H=G['get'](Z),b=H['relations']?.[p];if(['notes','files'][a(0x13a)](p)&&!H['capabilities']?.['includes'](p))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+p+a(0x13b)+p+'\x22');if(p===a(0x13c)){const L=await P['pg'][a(0x13d)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[Z,String(q)]);return{'total':L[a(0x13e)]['length'],'time':Date['now']()-X,'rows':L['rows']};}if(p===a(0x13f)){const O=await P['pg'][a(0x13d)](a(0x140),[Z,String(q)]);return addFileToken(O['rows'],{'file_path':{'type':'file'}},P['file']),{'total':O[a(0x13e)]['length'],'time':Date['now']()-X,'rows':O['rows']};}if(!b?.[a(0x141)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+p+'\x22\x20requires\x20a\x20project/provider\x20implementation');const E=G[a(0x142)](b['resource']),z=E?.[a(0x143)]??'id',x=E?.['table'],o=Object[a(0x144)](E?.['fields']??{})['filter'](N=>E?.['fields'][N]?.['read']&&E?.['fields'][N]?.['scope']!=='item')['map'](qi)['join'](',\x20'),i=b['fields']?.['join'](',\x20')||o||'*';b['foreignKey']&&autoIndex(x,b['foreignKey'],'btree',P['pg']);const y=b[a(0x145)]?a(0x146)+qt(b['junctionTable'])+'\x20j\x20ON\x20j.'+qi(b[a(0x147)])+a(0x148)+(b['junctionTargetKey']||qi(z))+'\x20WHERE\x20'+qi(b['junctionLocalKey'])+'\x20=\x20$1\x20':'where\x20'+(b['foreignKey']||qi(z))+a(0x149)+qi(b['localKey']||H[a(0x143)])+a(0x14a)+qt(H[a(0x14b)])+a(0x14c)+qi(H['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20'+(b['where']?'AND\x20('+b['where']+')':''),T=E['joins']?.['map'](N=>N[a(0x14d)]+'\x20')['join']('\x20')||'',D='SELECT\x20'+i+'\x20FROM\x20'+qt(x)+a(0x14e)+T+'\x20'+y+'\x20LIMIT\x20$2\x20OFFSET\x20$3',h=await P['pg']['query'](D,[q,F,A]);return E&&(await addDictionaryLookupData(h[a(0x13e)],E[a(0x14f)],P['dictionary']),await addTableLookupData(h['rows'],E['fields'],P['pg']),addFileToken(h['rows'],E['fields'],P['file'])),{'limit':F,'offset':A,'total':h['rows']['length'],'time':Date['now']()-X,'rows':h['rows']??null};};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';function f(p,Z){p=p-0x126;const A=s();let I=A[p];return I;}import{qi,qt}from'../utils/sql.js';function s(){const L=['files','Generic\x20Resource\x20relation\x20\x22','query','rows','SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','get','key','keys','filter','fields','\x20WHERE\x20','foreignKey','\x20=\x20(SELECT\x20','localKey','table','\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20','AND\x20(','where','join','\x20LIMIT\x20$2\x20OFFSET\x20$3','file','now'];s=function(){return L;};return s();}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 createFindRelation(p,Z){return async function A({name:I,id:j,relation:D,query:query={}}){const T=f,o=Date['now'](),R=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),B=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](R)||!Number['isFinite'](B))throw new ValidationError('Invalid\x20pagination');const H=Z['get'](I),e=H['relations']?.[D];if(['notes',T(0x126)]['includes'](D)&&!H['capabilities']?.['includes'](D))throw new UnsupportedError(T(0x127)+D+'\x22\x20requires\x20a\x20capabilities\x20\x22'+D+'\x22');if(D==='notes'){const V=await p['pg'][T(0x128)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[I,String(j)]);return{'total':V['rows']['length'],'time':Date['now']()-o,'rows':V[T(0x129)]};}if(D==='files'){const O=await p['pg'][T(0x128)](T(0x12a),[I,String(j)]);return addFileToken(O['rows'],{'file_path':{'type':'file'}},p['file']),{'total':O['rows']['length'],'time':Date['now']()-o,'rows':O[T(0x129)]};}if(!e?.['resource'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+D+'\x22\x20requires\x20a\x20project/provider\x20implementation');const g=Z[T(0x12b)](e['resource']),N=g?.[T(0x12c)]??'id',h=g?.['table'],E=Object[T(0x12d)](g?.['fields']??{})[T(0x12e)](F=>g?.[T(0x12f)][F]?.['read']&&g?.[T(0x12f)][F]?.['scope']!=='item')['map'](qi)['join'](',\x20'),a=e[T(0x12f)]?.['join'](',\x20')||E||'*';e['foreignKey']&&autoIndex(h,e['foreignKey'],'btree',p['pg']);const X=e['junctionTable']?'JOIN\x20'+qt(e['junctionTable'])+'\x20j\x20ON\x20j.'+qi(e['junctionForeignKey'])+'\x20=\x20t.'+(e['junctionTargetKey']||qi(N))+T(0x130)+qi(e['junctionLocalKey'])+'\x20=\x20$1\x20':'where\x20'+(e[T(0x131)]||qi(N))+T(0x132)+qi(e[T(0x133)]||H['key'])+'\x20FROM\x20'+qt(H[T(0x134)])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(H['key'])+T(0x135)+(e['where']?T(0x136)+e[T(0x137)]+')':''),K=g['joins']?.['map'](F=>F['sql']+'\x20')[T(0x138)]('\x20')||'',Q='SELECT\x20'+a+'\x20FROM\x20'+qt(h)+'\x20t\x20'+K+'\x20'+X+T(0x139),G=await p['pg'][T(0x128)](Q,[j,R,B]);return g&&(await addDictionaryLookupData(G['rows'],g['fields'],p['dictionary']),await addTableLookupData(G['rows'],g['fields'],p['pg']),addFileToken(G['rows'],g['fields'],p[T(0x13a)])),{'limit':R,'offset':B,'total':G[T(0x129)]['length'],'time':Date[T(0x13b)]()-o,'rows':G['rows']??null};};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{buildFilters,buildIndex}from'../utils/filters.js';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';function C(P,G){P=P-0x1bf;const j=m();let Z=j[P];return Z;}function m(){const N=['now','read','min','max','where','table','text','values','push','lower(',')\x20LIKE\x20$','length','scope','scopes','\x20WHERE\x20','true','sql','joins','item','join','\x20t\x20','replace','query','rowCount','fields'];m=function(){return N;};return m();}import{buildSummary}from'../utils/summary.js';import{buildUserResourceScopeFilter}from'../utils/scope.js';export function createFind(P,G){return async function j({name:Z,query:query={},user:q}){const O=C,p=Date[O(0x1bf)](),X=G['get'](Z);assertOperation(X,O(0x1c0),q);const F=Math[O(0x1c1)](Math['max'](query['limit']??0x14,0x1),0xc8),A=Math[O(0x1c2)](query['offset']??0x0,0x0);buildIndex(X,query['filter'],P['pg']);const H=buildFilters(X,query['filter']);X[O(0x1c3)]&&(H['sql']+=(H['sql']?'\x20AND\x20':'\x20WHERE\x20')+('('+X[O(0x1c3)]+')'));const b=buildSort(X,query['sort']);if(!Number['isFinite'](F)||!Number['isFinite'](A))throw new ValidationError('Invalid\x20pagination');const E=X['searchable']||Object['keys'](X['fields'])['filter'](L=>X['fields'][L]?.['searchable']);query['search']&&E['length']&&(E['map'](L=>autoIndex(X[O(0x1c4)],L,O(0x1c5),P['pg'])),H[O(0x1c6)][O(0x1c7)](query['search']['toLowerCase']()+'%'),H['sql']+=(H['sql']?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+E?.['map'](L=>O(0x1c8)+qt(L)+O(0x1c9)+H[O(0x1c6)][O(0x1ca)])['join']('\x20OR\x20')+')'));if(query[O(0x1cb)]&&X[O(0x1cc)]?.[query[O(0x1cb)]]===undefined)throw new ValidationError('Unknown\x20scope:\x20'+query[O(0x1cb)]);const z=query[O(0x1cb)]||(X[O(0x1cc)]?.['default']?'default':undefined);z&&(H['sql']+=(H['sql']?'\x20AND\x20':O(0x1cd))+('('+(X['scopes']?.[z]||O(0x1ce))+')'));const x=await buildUserResourceScopeFilter(X,q,P['pg'],H['values']['length']+0x1);x['sql']&&(H[O(0x1cf)]+=(H[O(0x1cf)]?'\x20AND\x20':'\x20WHERE\x20')+('('+x['sql']+')'),H[O(0x1c6)][O(0x1c7)](...x[O(0x1c6)]));const o=X[O(0x1d0)]?.['filter'](L=>L[O(0x1cb)]!==O(0x1d1))['map'](L=>L[O(0x1cf)]+'\x20')[O(0x1d2)]('\x20')||'',i='SELECT\x20'+readableFields(X,'all')['join'](',\x20')+'\x20'+('FROM\x20'+qt(X[O(0x1c4)])+O(0x1d3))+(o+'\x20'+H[O(0x1cf)][O(0x1d4)](/:uid/g,'\x27'+(q?.['id']??'NULL')+'\x27')+'\x20'+b+'\x20')+('LIMIT\x20$'+(H['values'][O(0x1ca)]+0x1)+'\x20')+('OFFSET\x20$'+(H['values']['length']+0x2)),y=buildSummary(X,query,q,x),[T,D]=await Promise['all']([P['pg'][O(0x1d5)](i,[...H['values'],F,A]),P['pg']['query'](y['sql'],y['values'])['then'](L=>L['rows'][0x0]??{})]),h=T['rows'];return await addDictionaryLookupData(h,X['fields'],P['dictionary']),await addTableLookupData(h,X['fields'],P['pg']),addFileToken(h,X['fields'],P['file']),{'time':Date[O(0x1bf)]()-p,'limit':F,'offset':A,'count':T[O(0x1d6)],'total':D?.['count']??0x0,'summary':D,'rows':h,...query['include']?.['includes'](O(0x1d7))?{'fields':X[O(0x1d7)]}:{}};};}
1
+ function s(){const F=['now','get','read','min','where','sql','\x20WHERE\x20','isFinite','searchable','text','join','scope','default','\x20AND\x20','values','joins','filter','SELECT\x20','length','query','fields','count'];s=function(){return F;};return s();}import{ValidationError}from'../../../errors.js';import{buildFilters,buildIndex}from'../utils/filters.js';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';import{buildSummary}from'../utils/summary.js';import{buildUserResourceScopeFilter}from'../utils/scope.js';function f(p,Z){p=p-0x11e;const A=s();let I=A[p];return I;}export function createFind(p,Z){return async function A({name:I,query:query={},user:j}){const O=f,D=Date[O(0x11e)](),o=Z[O(0x11f)](I);assertOperation(o,O(0x120),j);const R=Math[O(0x121)](Math['max'](query['limit']??0x14,0x1),0xc8),B=Math['max'](query['offset']??0x0,0x0);buildIndex(o,query['filter'],p['pg']);const H=buildFilters(o,query['filter']);o[O(0x122)]&&(H['sql']+=(H[O(0x123)]?'\x20AND\x20':O(0x124))+('('+o[O(0x122)]+')'));const e=buildSort(o,query['sort']);if(!Number[O(0x125)](R)||!Number['isFinite'](B))throw new ValidationError('Invalid\x20pagination');const g=o[O(0x126)]||Object['keys'](o['fields'])['filter'](V=>o['fields'][V]?.[O(0x126)]);query['search']&&g['length']&&(g['map'](V=>autoIndex(o['table'],V,O(0x127),p['pg'])),H['values']['push'](query['search']['toLowerCase']()+'%'),H['sql']+=(H['sql']?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+g?.['map'](V=>'lower('+qt(V)+')\x20LIKE\x20$'+H['values']['length'])[O(0x128)]('\x20OR\x20')+')'));if(query['scope']&&o['scopes']?.[query[O(0x129)]]===undefined)throw new ValidationError('Unknown\x20scope:\x20'+query['scope']);const N=query['scope']||(o['scopes']?.['default']?O(0x12a):undefined);N&&(H['sql']+=(H['sql']?'\x20AND\x20':'\x20WHERE\x20')+('('+(o['scopes']?.[N]||'true')+')'));const h=await buildUserResourceScopeFilter(o,j,p['pg'],H['values']['length']+0x1);h['sql']&&(H['sql']+=(H['sql']?O(0x12b):'\x20WHERE\x20')+('('+h['sql']+')'),H['values']['push'](...h[O(0x12c)]));const E=o[O(0x12d)]?.[O(0x12e)](V=>V['scope']!=='item')['map'](V=>V[O(0x123)]+'\x20')['join']('\x20')||'',a=O(0x12f)+readableFields(o,'all')['join'](',\x20')+'\x20'+('FROM\x20'+qt(o['table'])+'\x20t\x20')+(E+'\x20'+H['sql']['replace'](/:uid/g,'\x27'+(j?.['id']??'NULL')+'\x27')+'\x20'+e+'\x20')+('LIMIT\x20$'+(H['values']['length']+0x1)+'\x20')+('OFFSET\x20$'+(H[O(0x12c)][O(0x130)]+0x2)),X=buildSummary(o,query,j,h),[K,Q]=await Promise['all']([p['pg']['query'](a,[...H[O(0x12c)],R,B]),p['pg'][O(0x131)](X[O(0x123)],X['values'])['then'](V=>V['rows'][0x0]??{})]),G=K['rows'];return await addDictionaryLookupData(G,o[O(0x132)],p['dictionary']),await addTableLookupData(G,o['fields'],p['pg']),addFileToken(G,o['fields'],p['file']),{'time':Date['now']()-D,'limit':R,'offset':B,'count':K['rowCount'],'total':Q?.[O(0x133)]??0x0,'summary':Q,'rows':G,...query['include']?.['includes']('fields')?{'fields':o[O(0x132)]}:{}};};}
@@ -1 +1 @@
1
- function m(){const p=['not\x20enough\x20params:\x20table','then'];m=function(){return p;};return m();}function C(P,G){P=P-0x134;const j=m();let Z=j[P];return Z;}export async function getTableColumns(P,G){const q=C;if(!P)throw new Error(q(0x134));if(!G?.['pg'])return[];const j=await G['pg']['query']('\x0a\x20\x20\x20\x20select\x0a\x20\x20\x20\x20\x20\x20\x20\x20attname\x20as\x20name,\x20pg_catalog.col_description(attrelid,attnum)\x20as\x20title\x0a\x20\x20\x20\x20from\x20pg_catalog.pg_attribute\x20where\x20attrelid=$1::regclass\x20and\x20attnum>0\x20and\x20NOT\x20attisdropped',[P])[q(0x135)](Z=>Z['rows']||[]);return j;}
1
+ function s(){const D=['query'];s=function(){return D;};return s();}function f(p,Z){p=p-0x68;const A=s();let I=A[p];return I;}export async function getTableColumns(p,Z){const j=f;if(!p)throw new Error('not\x20enough\x20params:\x20table');if(!Z?.['pg'])return[];const A=await Z['pg'][j(0x68)]('\x0a\x20\x20\x20\x20select\x0a\x20\x20\x20\x20\x20\x20\x20\x20attname\x20as\x20name,\x20pg_catalog.col_description(attrelid,attnum)\x20as\x20title\x0a\x20\x20\x20\x20from\x20pg_catalog.pg_attribute\x20where\x20attrelid=$1::regclass\x20and\x20attnum>0\x20and\x20NOT\x20attisdropped',[p])['then'](I=>I['rows']||[]);return A;}
@@ -1 +1 @@
1
- function C(P,G){P=P-0x96;const j=m();let Z=j[P];return Z;}import{UnsupportedError,ValidationError}from'../../../errors.js';import{createUpdate}from'./update.js';function m(){const o=['relations','resource','foreignKey','Relation\x20update\x20is\x20not\x20configured:\x20','hasOwn'];m=function(){return o;};return m();}export function createUpdateRelation(P,G){const j=createUpdate(P,G);return async function Z({name:q,id:p,relation:X,relationId:F,data:A,user:H},b){const x=C,E=G['get'](q),z=E[x(0x96)]?.[X];if(!z?.[x(0x97)]||!z[x(0x98)])throw new UnsupportedError(x(0x99)+X);if(Object[x(0x9a)](A,z['foreignKey'])&&A[z[x(0x98)]]!==p)throw new ValidationError('Cannot\x20change\x20relation:\x20'+z[x(0x98)]);return j({'name':z['resource'],'id':F,'data':A,'user':H,'where':{'column':z[x(0x98)],'value':p}},b);};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';function s(){const E=['resource','Relation\x20update\x20is\x20not\x20configured:\x20','hasOwn','Cannot\x20change\x20relation:\x20','foreignKey'];s=function(){return E;};return s();}function f(p,Z){p=p-0x1df;const A=s();let I=A[p];return I;}import{createUpdate}from'./update.js';export function createUpdateRelation(p,Z){const A=createUpdate(p,Z);return async function I({name:j,id:D,relation:o,relationId:R,data:B,user:H},e){const h=f,g=Z['get'](j),N=g['relations']?.[o];if(!N?.[h(0x1df)]||!N['foreignKey'])throw new UnsupportedError(h(0x1e0)+o);if(Object[h(0x1e1)](B,N['foreignKey'])&&B[N['foreignKey']]!==D)throw new ValidationError(h(0x1e2)+N[h(0x1e3)]);return A({'name':N['resource'],'id':R,'data':B,'user':H,'where':{'column':N['foreignKey'],'value':D}},e);};}
@@ -1 +1 @@
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 C(P,G){P=P-0x197;const j=m();let Z=j[P];return Z;}import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(P,G){return async function j({name:Z,id:q,data:p,user:X,where:F},A){const h=C,H=G['get'](Z);assertOperation(H,'update',X);const b=writableData(H,p);if(!b['length'])throw new ValidationError('No\x20writable\x20fields');const E=A?.['pg']??P['pg'];validateInputData({'resource':H,'data':p,'update':!![]});H['fields']['updated_at']&&b[h(0x197)]([h(0x198),new Date()]);H[h(0x199)]['updated_by']&&b['push']([h(0x19a),X?.['id']]);delete p[h(0x19b)];const z=b['map'](([T],D)=>qi(T)+'\x20=\x20$'+(D+0x1)),x=[...b['map'](([,T])=>T),q];let o='WHERE\x20'+qi(H['key'])+'\x20=\x20$'+x['length'];F&&(x[h(0x197)](F['value']),o+='\x20AND\x20'+qi(F['column'])+'\x20=\x20$'+x['length']);H[h(0x19c)]&&(o+='\x20AND\x20('+H['where']+')');const i=await E['query']('UPDATE\x20'+qt(H['table'])+'\x20'+('SET\x20'+z['join'](',\x20')+'\x20')+(o+'\x20')+(h(0x19d)+Object['keys'](p)['map'](qi)['join'](',\x20')),x),y=i['rows'][0x0];if(!y)throw new NotFoundError(Z+':'+q);return clearTableLookupCache(H[h(0x19e)],E),await(A?.[h(0x19f)]??P[h(0x19f)])?.['write']({'userId':X?.['id'],'module':H['module'],'resource':H['name'],'resourceId':q,'action':'update','fields':Object[h(0x1a0)](p)}),y;};}function m(){const L=['push','updated_at','fields','updated_by','user_type','where','RETURNING\x20','table','audit','keys'];m=function(){return L;};return m();}
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 f(p,Z){p=p-0x113;const A=s();let I=A[p];return I;}import{clearTableLookupCache}from'./add-table-lookup-data.js';function s(){const V=['get','length','updated_at','push','user_type','key','\x20=\x20$','column','query','UPDATE\x20','SET\x20','join','table','audit','update','keys'];s=function(){return V;};return s();}export function createUpdate(p,Z){return async function A({name:I,id:j,data:D,user:o,where:R},B){const G=f,H=Z[G(0x113)](I);assertOperation(H,'update',o);const e=writableData(H,D);if(!e[G(0x114)])throw new ValidationError('No\x20writable\x20fields');const g=B?.['pg']??p['pg'];validateInputData({'resource':H,'data':D,'update':!![]});H['fields']['updated_at']&&e['push']([G(0x115),new Date()]);H['fields']['updated_by']&&e[G(0x116)](['updated_by',o?.['id']]);delete D[G(0x117)];const N=e['map'](([K],Q)=>qi(K)+'\x20=\x20$'+(Q+0x1)),h=[...e['map'](([,K])=>K),j];let E='WHERE\x20'+qi(H[G(0x118)])+G(0x119)+h[G(0x114)];R&&(h['push'](R['value']),E+='\x20AND\x20'+qi(R[G(0x11a)])+'\x20=\x20$'+h[G(0x114)]);H['where']&&(E+='\x20AND\x20('+H['where']+')');const a=await g[G(0x11b)](G(0x11c)+qt(H['table'])+'\x20'+(G(0x11d)+N[G(0x11e)](',\x20')+'\x20')+(E+'\x20')+('RETURNING\x20'+Object['keys'](D)['map'](qi)['join'](',\x20')),h),X=a['rows'][0x0];if(!X)throw new NotFoundError(I+':'+j);return clearTableLookupCache(H[G(0x11f)],g),await(B?.[G(0x120)]??p['audit'])?.['write']({'userId':o?.['id'],'module':H['module'],'resource':H['name'],'resourceId':j,'action':G(0x121),'fields':Object[G(0x122)](D)}),X;};}
@@ -1 +1 @@
1
- import{qi,qt}from'./sql.js';function C(P,G){P=P-0x72;const j=m();let Z=j[P];return Z;}const requestedIndexes=new WeakMap();export function autoIndex(P,G,j='btree',Z){const A=C,q=requestedIndexes['get'](Z)??new Set();requestedIndexes['set'](Z,q);const p=P+':'+G+':'+j;if(q[A(0x72)](p))return;q[A(0x73)](p),void ensureIndex(P,G,j,Z)[A(0x74)](()=>{q['delete'](p);});}async function ensureIndex(P,G,j,Z){const H=C,q=P['split']('.'),p=q['length']===0x2?q[0x0]:'public',X=(P+'_'+G+'_'+j+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),F=await Z[H(0x75)]('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[p,X]);if(F[H(0x76)])return;if(j===H(0x77)){await Z['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await Z['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(X+'_l')+'\x20ON\x20'+qt(P)+'\x20USING\x20btree\x20(lower('+qi(G)+')\x20text_pattern_ops)'),await Z['query'](H(0x78)+qi(X)+'\x20ON\x20'+qt(P)+'\x20USING\x20gin\x20(lower('+qi(G)+')\x20gin_trgm_ops)');return;}await Z[H(0x75)]('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(X)+'\x20ON\x20'+qt(P)+'\x20USING\x20'+j+'\x20('+qi(G)+')');}function m(){const b=['has','add','catch','query','rowCount','text','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'];m=function(){return b;};return m();}
1
+ const B=f;import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(p,Z,A=B(0x1b2),I){const H=B,j=requestedIndexes[H(0x1b3)](I)??new Set();requestedIndexes['set'](I,j);const D=p+':'+Z+':'+A;if(j['has'](D))return;j[H(0x1b4)](D),void ensureIndex(p,Z,A,I)['catch'](()=>{j['delete'](D);});}function s(){const g=['btree','get','add','split','query','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'];s=function(){return g;};return s();}function f(p,Z){p=p-0x1b2;const A=s();let I=A[p];return I;}async function ensureIndex(p,Z,A,I){const e=B,j=p[e(0x1b5)]('.'),D=j['length']===0x2?j[0x0]:'public',o=(p+'_'+Z+'_'+A+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),R=await I[e(0x1b6)]('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[D,o]);if(R['rowCount'])return;if(A==='text'){await I['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await I['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(o+'_l')+'\x20ON\x20'+qt(p)+'\x20USING\x20btree\x20(lower('+qi(Z)+')\x20text_pattern_ops)'),await I['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(o)+'\x20ON\x20'+qt(p)+'\x20USING\x20gin\x20(lower('+qi(Z)+')\x20gin_trgm_ops)');return;}await I['query'](e(0x1b7)+qi(o)+'\x20ON\x20'+qt(p)+'\x20USING\x20'+A+'\x20('+qi(Z)+')');}
@@ -1 +1 @@
1
- function m(){const p=['entries','fields','writable','length','minLength\x20not\x20met:\x20','\x20should\x20be\x20>=\x20','number','maximum','enum','pattern','\x20should\x20match\x20regular\x20expression\x20('];m=function(){return p;};return m();}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';function C(P,G){P=P-0x1ab;const j=m();let Z=j[P];return Z;}const validateInputData=({resource:P,data:G,update:update=![]})=>{const q=C;for(const [j,Z]of Object[q(0x1ab)](P[q(0x1ac)])){if(Z['required']&&Z[q(0x1ad)]!==![]&&(G[j]===undefined||G[j]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+j);if(Z['required']&&Z['writable']!==![]&&Object['hasOwn'](G,j)&&(G[j]===undefined||G[j]===null)&&update)throw new ValidationError('Required\x20field:\x20'+j);if(Z['minLength']&&typeof G[j]==='string'&&G[j][q(0x1ae)]<Z['minLength'])throw new ValidationError(q(0x1af)+j);if(Z['maxLength']&&typeof G[j]==='string'&&G[j][q(0x1ae)]>Z['maxLength'])throw new ValidationError('maxLength\x20exceeded:\x20'+j);if(Z['minimum']&&typeof G[j]==='number'&&G[j]<Z['minimum'])throw new ValidationError(j+q(0x1b0)+Z['minimum']);if(Z['maximum']&&typeof G[j]===q(0x1b1)&&G[j]>Z[q(0x1b2)])throw new ValidationError(j+'\x20should\x20be\x20<=\x20'+Z['maximum']);if(Z['enum']&&G[j]&&!Z[q(0x1b3)]['includes'](G[j]))throw new ValidationError(j+'\x20should\x20be\x20one\x20of\x20('+Z['enum']['join'](',\x20')+')');if(Z['pattern']&&typeof G[j]==='string'&&!new RegExp(Z[q(0x1b4)])['test'](G[j]))throw new ValidationError(j+q(0x1b5)+Z[q(0x1b4)]+')');}};export{validateInputData};
1
+ function s(){const D=['fields','writable','required','hasOwn','string','length','maximum','includes','\x20should\x20be\x20one\x20of\x20(','join','test','\x20should\x20match\x20regular\x20expression\x20('];s=function(){return D;};return s();}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';function f(p,Z){p=p-0x15a;const A=s();let I=A[p];return I;}const validateInputData=({resource:p,data:Z,update:update=![]})=>{const j=f;for(const [A,I]of Object['entries'](p[j(0x15a)])){if(I['required']&&I[j(0x15b)]!==![]&&(Z[A]===undefined||Z[A]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+A);if(I[j(0x15c)]&&I['writable']!==![]&&Object[j(0x15d)](Z,A)&&(Z[A]===undefined||Z[A]===null)&&update)throw new ValidationError('Required\x20field:\x20'+A);if(I['minLength']&&typeof Z[A]===j(0x15e)&&Z[A]['length']<I['minLength'])throw new ValidationError('minLength\x20not\x20met:\x20'+A);if(I['maxLength']&&typeof Z[A]==='string'&&Z[A][j(0x15f)]>I['maxLength'])throw new ValidationError('maxLength\x20exceeded:\x20'+A);if(I['minimum']&&typeof Z[A]==='number'&&Z[A]<I['minimum'])throw new ValidationError(A+'\x20should\x20be\x20>=\x20'+I['minimum']);if(I['maximum']&&typeof Z[A]==='number'&&Z[A]>I[j(0x160)])throw new ValidationError(A+'\x20should\x20be\x20<=\x20'+I['maximum']);if(I['enum']&&Z[A]&&!I['enum'][j(0x161)](Z[A]))throw new ValidationError(A+j(0x162)+I['enum'][j(0x163)](',\x20')+')');if(I['pattern']&&typeof Z[A]==='string'&&!new RegExp(I['pattern'])[j(0x164)](Z[A]))throw new ValidationError(A+j(0x165)+I['pattern']+')');}};export{validateInputData};