@opengis/fcore 0.0.1-beta.7 → 0.0.1-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) 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/get-resource.js +1 -1
  35. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  36. package/dist/modules/resource/services/list-resources.js +1 -1
  37. package/dist/modules/resource/services/search-resource.js +1 -1
  38. package/dist/modules/resource/services/suggest-resource.js +1 -1
  39. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  40. package/dist/modules/resource/services/update-resource.js +1 -1
  41. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  42. package/dist/modules/system/route.js +1 -1
  43. package/dist/modules/system/schema.js +1 -1
  44. package/dist/modules/system/services/check-system.js +1 -1
  45. package/dist/modules/system/services/get-access.js +1 -1
  46. package/dist/modules/system/services/get-api-list.js +1 -1
  47. package/dist/modules/system/services/get-audit-log.js +1 -1
  48. package/dist/modules/system/services/get-dictionary.js +1 -1
  49. package/dist/modules/system/services/get-system-log.js +1 -1
  50. package/dist/modules/system/services/get-system-settings.js +1 -1
  51. package/dist/modules/system/services/list-dictionaries.js +1 -1
  52. package/dist/modules/system/services/set-access.js +1 -1
  53. package/dist/modules/system/services/update-dictionary.js +1 -1
  54. package/dist/modules/system/services/update-system-settings.js +1 -1
  55. package/dist/modules/utils/require-admin.js +1 -1
  56. package/dist/modules/utils/safe-user.js +1 -1
  57. package/dist/modules/utils/unsupported.js +1 -1
  58. package/dist/plugins/audit/audit.js +1 -1
  59. package/dist/plugins/audit/services/write-audit.js +1 -1
  60. package/dist/plugins/auth/get-user-permissions.js +1 -1
  61. package/dist/plugins/auth/index.d.ts.map +1 -1
  62. package/dist/plugins/auth/index.js +1 -1
  63. package/dist/plugins/auth/verifyUser.js +1 -1
  64. package/dist/plugins/dictionary.js +1 -1
  65. package/dist/plugins/file.js +1 -1
  66. package/dist/plugins/jwt.js +1 -1
  67. package/dist/plugins/logger/index.js +1 -1
  68. package/dist/plugins/logger/transport.js +1 -1
  69. package/dist/plugins/pg.js +1 -1
  70. package/dist/plugins/redis.js +1 -1
  71. package/dist/plugins/resource/resource.js +1 -1
  72. package/dist/plugins/resource/resource.registry.js +1 -1
  73. package/dist/plugins/resource/resource.types.d.ts +6 -4
  74. package/dist/plugins/resource/resource.types.d.ts.map +1 -1
  75. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  76. package/dist/plugins/resource/services/add-file-token.js +1 -1
  77. package/dist/plugins/resource/services/add-table-lookup-data.d.ts.map +1 -1
  78. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  79. package/dist/plugins/resource/services/create-relation.js +1 -1
  80. package/dist/plugins/resource/services/create.js +1 -1
  81. package/dist/plugins/resource/services/delete-relation.js +1 -1
  82. package/dist/plugins/resource/services/delete.js +1 -1
  83. package/dist/plugins/resource/services/find-one.js +1 -1
  84. package/dist/plugins/resource/services/find-relation.js +1 -1
  85. package/dist/plugins/resource/services/find.js +1 -1
  86. package/dist/plugins/resource/services/update-relation.js +1 -1
  87. package/dist/plugins/resource/services/update.js +1 -1
  88. package/dist/plugins/resource/utils/auto-index.js +1 -1
  89. package/dist/plugins/resource/utils/fields.js +1 -1
  90. package/dist/plugins/resource/utils/filters.js +1 -1
  91. package/dist/plugins/resource/utils/permissions.js +1 -1
  92. package/dist/plugins/resource/utils/sort.js +1 -1
  93. package/dist/plugins/resource/utils/sql.js +1 -1
  94. package/dist/shared/getIP.js +1 -1
  95. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  96. package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
  97. package/migrations/20260905120000_add_user_foreign_keys.sql +42 -42
  98. package/migrations/20260907090000_core_schema.sql +32 -0
  99. package/package.json +2 -2
@@ -1 +1 @@
1
- function z(C,N){C=C-0x64;const r=U();let p=r[C];return p;}export async function createResourceRelation(C,N){const Q=z,{resource:r,id:p,relation:c,data:x,user:m}=C;return N['resource'][Q(0x64)]({'name':r,'id':p,'relation':c,'data':x,'user':m});}function U(){const u=['createRelation'];U=function(){return u;};return U();}
1
+ export async function createResourceRelation(J,e){const u=c,{resource:p,id:b,relation:F,data:P,user:h}=J;return e['resource'][u(0x100)]({'name':p,'id':b,'relation':F,'data':P,'user':h});}function c(J,e){J=J-0x100;const p=L();let b=p[J];return b;}function L(){const H=['createRelation'];L=function(){return H;};return L();}
@@ -1 +1 @@
1
- export async function createResource(C,N){var r=z;return N[r(0xd3)]['create']({'name':C[r(0xd3)],'data':C[r(0xd4)],'user':C['user']});}function z(C,N){C=C-0xd3;var r=U();var p=r[C];return p;}function U(){var p=['resource','data'];U=function(){return p;};return U();}
1
+ function c(J,e){J=J-0xa4;var p=L();var b=p[J];return b;}export async function createResource(J,e){var p=c;return e['resource'][p(0xa4)]({'name':J['resource'],'data':J['data'],'user':J['user']});}function L(){var b=['create'];L=function(){return b;};return L();}
@@ -1 +1 @@
1
- export async function deleteResourceRelation(C,N){const m=z,{resource:r,id:p,relation:c,relationId:x}=C;return N['resource'][m(0x144)]({'name':r,'id':p,'relation':c,'relationId':x});}function z(C,N){C=C-0x144;const r=U();let p=r[C];return p;}function U(){const Q=['deleteRelation'];U=function(){return Q;};return U();}
1
+ export async function deleteResourceRelation(J,e){const h=c,{resource:p,id:b,relation:F,relationId:P}=J;return e['resource'][h(0x110)]({'name':p,'id':b,'relation':F,'relationId':P});}function c(J,e){J=J-0x110;const p=L();let b=p[J];return b;}function L(){const u=['deleteRelation'];L=function(){return u;};return L();}
@@ -1 +1 @@
1
- export async function deleteResource(C,N){var r=z;return N['resource']['delete']({'name':C['resource'],'id':C['id'],'user':C[r(0x12e)]});}function z(C,N){C=C-0x12e;var r=U();var p=r[C];return p;}function U(){var p=['user'];U=function(){return p;};return U();}
1
+ function L(){var b=['resource'];L=function(){return b;};return L();}function c(J,e){J=J-0xd5;var p=L();var b=p[J];return b;}export async function deleteResource(J,e){var p=c;return e['resource']['delete']({'name':J[p(0xd5)],'id':J['id'],'user':J['user']});}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x1e1;const r=U();let p=r[C];return p;}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function U(){const c=['find','sort','limit'];U=function(){return c;};return U();}export async function exportResource(C,N){const p=z,r=await N['resource'][p(0x1e1)]({'name':C['resource'],'query':{'filter':parseFilterQuery(C),'sort':C[p(0x1e2)],'search':C['search'],'limit':C[p(0x1e3)],'offset':C['offset'],'fields':C['fields']},'user':C['user']});return r['rows'];}
1
+ function c(J,e){J=J-0x16c;const p=L();let b=p[J];return b;}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function L(){const F=['find','resource','user'];L=function(){return F;};return L();}export async function exportResource(J,e){const b=c,p=await e['resource'][b(0x16c)]({'name':J[b(0x16d)],'query':{'filter':parseFilterQuery(J),'sort':J['sort'],'search':J['search'],'limit':J['limit'],'offset':J['offset'],'fields':J['fields']},'user':J[b(0x16e)]});return p['rows'];}
@@ -1 +1 @@
1
- function U(){var p=['resource','findOne','include'];U=function(){return p;};return U();}function z(C,N){C=C-0xa4;var r=U();var p=r[C];return p;}export async function getResource(C,N){var r=z;return N[r(0xa4)][r(0xa5)]({'name':C['resource'],'id':C['id'],'query':{'include':C[r(0xa6)]},'user':C['user']});}
1
+ export async function getResource(J,e){var p=c;return e[p(0x1ce)][p(0x1cf)]({'name':J[p(0x1ce)],'id':J['id'],'query':{'include':J[p(0x1d0)]},'user':J['user']});}function c(J,e){J=J-0x1ce;var p=L();var b=p[J];return b;}function L(){var b=['resource','findOne','include'];L=function(){return b;};return L();}
@@ -1 +1 @@
1
- export async function listResourceRelation(C,N){const {resource:r,id:p,relation:c,query:x,user:m}=C;return N['resource']['findRelation']({'name':r,'id':p,'relation':c,'query':x,'user':m});}
1
+ export async function listResourceRelation(J,e){const {resource:p,id:b,relation:F,query:P,user:h}=J;return e['resource']['findRelation']({'name':p,'id':b,'relation':F,'query':P,'user':h});}
@@ -1 +1 @@
1
- import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function z(C,N){C=C-0x1d5;var r=U();var p=r[C];return p;}function U(){var p=['resource','offset','page','limit'];U=function(){return p;};return U();}export async function listResources(C,N){var r=z;return N['resource']['find']({'name':C[r(0x1d5)],'query':{'filter':parseFilterQuery(C),'sort':C['sort'],'search':C['search'],'limit':C['limit'],'offset':C[r(0x1d6)]??(C['page']?Math['max'](C[r(0x1d7)]-0x1,0x0):0x0)*(C[r(0x1d8)]??0x14)},'user':C['user']});}
1
+ function L(){var b=['resource','max'];L=function(){return b;};return L();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function c(J,e){J=J-0xbb;var p=L();var b=p[J];return b;}export async function listResources(J,e){var p=c;return e[p(0xbb)]['find']({'name':J['resource'],'query':{'filter':parseFilterQuery(J),'sort':J['sort'],'search':J['search'],'limit':J['limit'],'offset':J['offset']??(J['page']?Math[p(0xbc)](J['page']-0x1,0x0):0x0)*(J['limit']??0x14)},'user':J['user']});}
@@ -1 +1 @@
1
- import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function z(C,N){C=C-0x121;var r=U();var p=r[C];return p;}function U(){var p=['user'];U=function(){return p;};return U();}export async function searchResource(C,N){var r=z;return N['resource']['find']({'name':C['resource'],'query':{...C,'filter':parseFilterQuery(C)},'user':C[r(0x121)]});}
1
+ import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function c(J,e){J=J-0x139;var p=L();var b=p[J];return b;}function L(){var b=['find'];L=function(){return b;};return L();}export async function searchResource(J,e){var p=c;return e['resource'][p(0x139)]({'name':J['resource'],'query':{...J,'filter':parseFilterQuery(J)},'user':J['user']});}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';function U(){const D=['resource','toLowerCase','min','max','fields','lookup','query','SELECT\x20','now','field','name','startsWith','map','code','text'];U=function(){return D;};return U();}import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';function z(C,N){C=C-0x11f;const r=U();let p=r[C];return p;}export async function suggestResource(C,N){const h=z,r=N[h(0x11f)]['get'](C['resource']),p=String(C['search']??C['q']??'')[h(0x120)](),c=Math[h(0x121)](Math[h(0x122)](Number(C['limit']??0x14),0x1),0xc8),x=Date['now'](),m=r[h(0x123)][C['field']],Q=m?.[h(0x124)]?.['dictionary'],u=m?.['lookup']?.['table'];if(u){const Y=m[h(0x124)]?.['textField']??'name',f=m['lookup']?.['valueField']??'id';autoIndex(u,Y,'text',N['pg']);const F=await N['pg'][h(0x125)](h(0x126)+f+'\x20as\x20id,\x20'+Y+'\x20as\x20text\x20FROM\x20'+u+'\x20WHERE\x20lower('+Y+')\x20~\x20$1\x20LIMIT\x20$2',[''+p[h(0x120)](),c])['then'](t=>t['rows']);return{'limit':c,'count':F['length'],'search':p,'time':Date[h(0x127)]()-x,'data':F};}if(!Q)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+C[h(0x128)]);const L=await N['dictionary']['get'](Q),T=L['filter'](t=>!p||t['code']['startsWith'](p)||t[h(0x129)][h(0x12a)](p))['slice'](0x0,c)[h(0x12b)](t=>({'id':t[h(0x12c)]||t['id'],'text':t['name']||t[h(0x12d)]}));return{'search':p,'limit':c,'count':T['length'],'time':Date['now']()-x,'data':T};}
1
+ function c(J,e){J=J-0x1af;const p=L();let b=p[J];return b;}import{ValidationError}from'../../../errors.js';import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(J,e){const T=c,p=e['resource']['get'](J['resource']),b=String(J['search']??J['q']??'')['toLowerCase'](),F=Math['min'](Math['max'](Number(J['limit']??0x14),0x1),0xc8),P=Date['now'](),h=p[T(0x1af)][J['field']],u=h?.['dictionary'],H=h?.['lookup']?.[T(0x1b0)];if(H){const w=h['lookup']?.['text']??'name',X=h['lookup']?.[T(0x1b1)]??'id';autoIndex(H,w,'text',e['pg']);const E=await e['pg']['query'](T(0x1b2)+X+'\x20as\x20id,\x20'+w+T(0x1b3)+H+'\x20WHERE\x20lower('+w+T(0x1b4),[''+b['toLowerCase'](),F])[T(0x1b5)](Q=>Q[T(0x1b6)]);return{'limit':F,'count':E['length'],'search':b,'time':Date[T(0x1b7)]()-P,'data':E};}if(!u)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+J['field']);const D=await e['dictionary']['get'](u),U=D[T(0x1b8)](Q=>!b||Q['code']['startsWith'](b)||Q['name'][T(0x1b9)](b))['slice'](0x0,F)['map'](Q=>({'id':Q['code']||Q['id'],'text':Q[T(0x1ba)]||Q[T(0x1bb)]}));return{'search':b,'limit':F,'count':U[T(0x1bc)],'time':Date['now']()-P,'data':U};}function L(){const l=['fields','table','value','SELECT\x20','\x20as\x20text\x20FROM\x20',')\x20~\x20$1\x20LIMIT\x20$2','then','rows','now','filter','startsWith','name','text','length'];L=function(){return l;};return L();}
@@ -1 +1 @@
1
- export async function updateResourceRelation(C,N){const {resource:r,id:p,relation:c,relationId:x,data:m,user:Q}=C;return N['resource']['updateRelation']({'name':r,'id':p,'relation':c,'relationId':x,'data':m,'user':Q});}
1
+ function c(J,e){J=J-0x12b;const p=L();let b=p[J];return b;}export async function updateResourceRelation(J,e){const H=c,{resource:p,id:b,relation:F,relationId:P,data:h,user:u}=J;return e[H(0x12b)][H(0x12c)]({'name':p,'id':b,'relation':F,'relationId':P,'data':h,'user':u});}function L(){const D=['resource','updateRelation'];L=function(){return D;};return L();}
@@ -1 +1 @@
1
- function U(){var p=['resource','user'];U=function(){return p;};return U();}function z(C,N){C=C-0x1a8;var r=U();var p=r[C];return p;}export async function updateResource(C,N){var r=z;return N[r(0x1a8)]['update']({'name':C['resource'],'id':C['id'],'data':C['patch'],'user':C[r(0x1a9)]});}
1
+ export async function updateResource(J,e){return e['resource']['update']({'name':J['resource'],'id':J['id'],'data':J['patch'],'user':J['user']});}
@@ -1 +1 @@
1
- import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';export async function uploadResourceFile(C,N){const m=z,r=N[m(0x1bf)][m(0x1c0)](C['resource']);if(r['access']==='admin'&&C['user']?.['type']!=='admin')throw new ForbiddenError(m(0x1c1));if(C['user']?.[m(0x1c2)]!=='admin'&&!C[m(0x1c3)]?.['permissions']?.[m(0x1c4)]((r[m(0x1c5)]??r['name'])+m(0x1c6)))throw new ForbiddenError('Missing\x20permission:\x20'+(r['permission']??r[m(0x1c7)])+':update');if(!Buffer[m(0x1c8)](C['file'])||C['file']['length']===0x0)throw new ValidationError('File\x20is\x20required');const p=C[m(0x1c9)][m(0x1ca)](/[^A-Za-z0-9._-]/g,'_');if(!p)throw new ValidationError('File\x20name\x20is\x20required');const c='files/'+C[m(0x1bf)]+'/'+String(C['id'])+'/'+p;await N[m(0x1cb)]['put'](c,C[m(0x1cb)]);if(!await N['file']['exists'](c))throw new NotFoundError('Uploaded\x20file\x20not\x20found');const x=await N['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20',[C['resource'],String(C['id']),c,C['file']['length']]);return x['rows'][0x0];}function z(C,N){C=C-0x1bf;const r=U();let p=r[C];return p;}function U(){const Q=['resource','get','Admin\x20access\x20required','type','user','includes','permission',':update','name','isBuffer','fileName','replace','file'];U=function(){return Q;};return U();}
1
+ import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';function L(){const u=['resource','access','user','includes','Missing\x20permission:\x20','name',':update','file','fileName','replace','File\x20name\x20is\x20required','files/','put','Uploaded\x20file\x20not\x20found','query','length'];L=function(){return u;};return L();}function c(J,e){J=J-0x166;const p=L();let b=p[J];return b;}export async function uploadResourceFile(J,e){const h=c,p=e[h(0x166)]['get'](J['resource']);if(p[h(0x167)]==='admin'&&J[h(0x168)]?.['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(J[h(0x168)]?.['type']!=='admin'&&!J[h(0x168)]?.['permissions']?.[h(0x169)]((p['permission']??p['name'])+':update'))throw new ForbiddenError(h(0x16a)+(p['permission']??p[h(0x16b)])+h(0x16c));if(!Buffer['isBuffer'](J[h(0x16d)])||J['file']['length']===0x0)throw new ValidationError('File\x20is\x20required');const b=J[h(0x16e)][h(0x16f)](/[^A-Za-z0-9._-]/g,'_');if(!b)throw new ValidationError(h(0x170));const F=h(0x171)+J['resource']+'/'+String(J['id'])+'/'+b;await e[h(0x16d)][h(0x172)](F,J['file']);if(!await e['file']['exists'](F))throw new NotFoundError(h(0x173));const P=await e['pg'][h(0x174)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20',[J['resource'],String(J['id']),F,J['file'][h(0x175)]]);return P['rows'][0x0];}
@@ -1 +1 @@
1
- import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';function z(C,N){C=C-0x181;const r=U();let p=r[C];return p;}import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';function U(){const Y=['system','Get\x20platform\x20dictionary','user','system:dictionaries','dictionaryName','params','Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','admin','get','/api/system/settings','Get\x20system\x20log','logger','type','/api/system/check','fcore','apiListQuery'];U=function(){return Y;};return U();}const u=C=>C['user'];export function systemRoutes(C,N=new Map()){return async r=>{const L=z;r['get']('/api/dictionary/:name',{'schema':{'tags':['fcore',L(0x181)],'summary':L(0x182),'description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async c=>({'items':await getDictionary({...c['params'],'user':u(c)},C)})),r['post']('/api/dictionary/:name',{'schema':{'tags':['fcore',L(0x181)],'summary':'Update\x20platform\x20dictionary','description':'Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','access':L(0x183),'permissions':[L(0x184)],'params':systemSchemas[L(0x185)],'body':systemSchemas['dictionaryItems']}},async c=>updateDictionary({...c[L(0x186)],...c['body'],'user':u(c)},C));const p=async c=>getAccess({...c['params'],'user':u(c)},C);r['get']('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},p),r['post']('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':L(0x187),'access':L(0x188),'permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async c=>setAccess({...c['params'],...c['body'],'user':u(c)},C)),r[L(0x189)](L(0x18a),{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':'admin','permissions':['system:settings']}},async c=>getSystemSettings({...c['params'],'user':u(c)},C)),r['post']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Update\x20system\x20settings','description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async c=>updateSystemSettings({...c['params'],'patch':c['body'],'user':u(c)},C)),r[L(0x189)]('/api/system/logger',{'schema':{'tags':['fcore','system'],'summary':L(0x18b),'description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':L(0x183),'permissions':['system:logs'],'querystring':systemSchemas[L(0x18c)]}},async(c,x)=>{const T=L,{contentType:m,body:Q}=await getSystemLog({...c['query'],'user':u(c)},C);return x[T(0x18d)](m)['send'](Q);}),r[L(0x189)]('/api/system/audit',{'schema':{'tags':['fcore','system'],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':L(0x183),'permissions':['system:audit']}},async c=>getAuditLog({...c['query'],'user':u(c)},C)),r['get'](L(0x18e),{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':L(0x183),'permissions':['system:check']}},async c=>checkSystem({'user':u(c)},C)),r[L(0x189)]('/api/system/list',{'schema':{'tags':[L(0x18f),'system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':L(0x188),'permissions':[],'querystring':systemSchemas[L(0x190)]}},async c=>getApiList({'user':u(c),'apiRoutes':N,...c['query']},C));};}
1
+ import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';function c(J,e){J=J-0xc9;const p=L();let b=p[J];return b;}import{getSystemLog}from'./services/get-system-log.js';import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';function L(){const w=['system','system:dictionaries','post','fcore','user','dictionaryName','body','params','get','/api/access/:type/:id','system:access','Set\x20access\x20rules','/api/system/settings','system:settings','/api/system/logger','system:logs','query','Get\x20audit\x20log','system:audit','Checks\x20the\x20availability\x20of\x20system\x20dependencies.','/api/system/list'];L=function(){return w;};return L();}import{systemSchemas}from'./schema.js';const u=J=>J['user'];export function systemRoutes(J,e=new Map()){return async p=>{const D=c;p['get']('/api/dictionary/:name',{'schema':{'tags':['fcore',D(0xc9)],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':[D(0xca)],'params':systemSchemas['dictionaryName']}},async F=>({'items':await getDictionary({...F['params'],'user':u(F)},J)})),p[D(0xcb)]('/api/dictionary/:name',{'schema':{'tags':[D(0xcc),'system'],'summary':'Update\x20platform\x20dictionary','description':'Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','access':D(0xcd),'permissions':['system:dictionaries'],'params':systemSchemas[D(0xce)],'body':systemSchemas['dictionaryItems']}},async F=>updateDictionary({...F['params'],...F[D(0xcf)],'user':u(F)},J));const b=async F=>getAccess({...F[D(0xd0)],'user':u(F)},J);p[D(0xd1)](D(0xd2),{'schema':{'tags':[D(0xcc),'system'],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':[D(0xd3)],'params':systemSchemas['accessTarget']}},b),p['post'](D(0xd2),{'schema':{'tags':['fcore','system'],'summary':D(0xd4),'description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':[D(0xd3)],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async F=>setAccess({...F[D(0xd0)],...F[D(0xcf)],'user':u(F)},J)),p[D(0xd1)](D(0xd5),{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':'admin','permissions':[D(0xd6)]}},async F=>getSystemSettings({...F['params'],'user':u(F)},J)),p['post']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Update\x20system\x20settings','description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async F=>updateSystemSettings({...F['params'],'patch':F['body'],'user':u(F)},J)),p[D(0xd1)](D(0xd7),{'schema':{'tags':[D(0xcc),'system'],'summary':'Get\x20system\x20log','description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':'user','permissions':[D(0xd8)],'querystring':systemSchemas['logger']}},async(F,P)=>{const U=D,{contentType:h,body:H}=await getSystemLog({...F[U(0xd9)],'user':u(F)},J);return P['type'](h)['send'](H);}),p['get']('/api/system/audit',{'schema':{'tags':[D(0xcc),D(0xc9)],'summary':D(0xda),'description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':[D(0xdb)]}},async F=>getAuditLog({...F['query'],'user':u(F)},J)),p[D(0xd1)]('/api/system/check',{'schema':{'tags':['fcore',D(0xc9)],'summary':'Check\x20system\x20health','description':D(0xdc),'access':'user','permissions':['system:check']}},async F=>checkSystem({'user':u(F)},J)),p['get'](D(0xdd),{'schema':{'tags':['fcore','system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async F=>getApiList({'user':u(F),'apiRoutes':e,...F[D(0xd9)]},J));};}
@@ -1 +1 @@
1
- const C=z;function U(){const N=['Object','Array','Union','Null','Literal','short'];U=function(){return N;};return U();}function z(C,N){C=C-0x7e;const r=U();let p=r[C];return p;}import{Type}from'@sinclair/typebox';export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type[C(0x7e)]({'items':Type[C(0x7f)](Type['Object']({'id':Type['Optional'](Type[C(0x80)]([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type['Union']([Type['String'](),Type['Number'](),Type[C(0x81)]()]))},{'additionalProperties':!![]}))}),'accessTarget':Type[C(0x7e)]({'type':Type[C(0x80)]([Type['Literal']('user'),Type[C(0x82)]('role')]),'id':identifier}),'access':Type['Object']({'access':Type[C(0x7f)](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type[C(0x7f)](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type[C(0x7e)]({'format':Type['Optional'](Type['Union']([Type['Literal'](C(0x83)),Type[C(0x82)]('extended')]))}),'settingsEntity':Type['Object']({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type['Unknown']()),'logger':Type[C(0x7e)]({'path':Type['Optional'](Type['String']({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
1
+ const J=c;function c(J,e){J=J-0x78;const p=L();let b=p[J];return b;}function L(){const e=['Object','Union','Null','String','Optional','Unknown'];L=function(){return e;};return L();}import{Type}from'@sinclair/typebox';export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});export const systemSchemas={'dictionaryName':Type[J(0x78)]({'name':identifier}),'dictionaryItems':Type['Object']({'items':Type['Array'](Type[J(0x78)]({'id':Type['Optional'](Type['Union']([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type[J(0x79)]([Type['String'](),Type['Number'](),Type[J(0x7a)]()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal']('user'),Type['Literal']('role')]),'id':identifier}),'access':Type[J(0x78)]({'access':Type['Array'](Type[J(0x78)]({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type['Array'](Type[J(0x7b)]({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type[J(0x78)]({'format':Type[J(0x7c)](Type['Union']([Type['Literal']('short'),Type['Literal']('extended')]))}),'settingsEntity':Type[J(0x78)]({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type[J(0x7d)]()),'logger':Type['Object']({'path':Type[J(0x7c)](Type[J(0x7b)]({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
@@ -1 +1 @@
1
- function z(C,N){C=C-0x199;const r=U();let p=r[C];return p;}export async function checkSystem(C,N){const c=z,[r,p]=await Promise['allSettled']([N['pg']['query']('SELECT\x201'),N['redis'][c(0x199)]()]);return{'status':r[c(0x19a)]==='fulfilled'&&p['status']===c(0x19b)?'ok':c(0x19c),'pg':r['status'],'redis':p['status']};}function U(){const x=['ping','status','fulfilled','degraded'];U=function(){return x;};return U();}
1
+ function c(J,e){J=J-0x14a;const p=L();let b=p[J];return b;}export async function checkSystem(J,e){const F=c,[p,b]=await Promise['allSettled']([e['pg'][F(0x14a)]('SELECT\x201'),e[F(0x14b)]['ping']()]);return{'status':p['status']===F(0x14c)&&b['status']==='fulfilled'?'ok':'degraded','pg':p[F(0x14d)],'redis':b[F(0x14d)]};}function L(){const P=['query','redis','fulfilled','status'];L=function(){return P;};return L();}
@@ -1 +1 @@
1
- export async function getAccess(C,N){const c=z,r=C['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20',p=await N['pg'][c(0x118)](r,[C['id']]);return{'access':p[c(0x119)]};}function z(C,N){C=C-0x118;const r=U();let p=r[C];return p;}function U(){const x=['query','rows'];U=function(){return x;};return U();}
1
+ function L(){const P=['query'];L=function(){return P;};return L();}function c(J,e){J=J-0x118;const p=L();let b=p[J];return b;}export async function getAccess(J,e){const F=c,p=J['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20',b=await e['pg'][F(0x118)](p,[J['id']]);return{'access':b['rows']};}
@@ -1 +1 @@
1
- function U(){const u=['values','endpoint','method','format'];U=function(){return u;};return U();}function z(C,N){C=C-0x140;const r=U();let p=r[C];return p;}export async function getApiList(C,N){const Q=z,r=[...C['apiRoutes'][Q(0x140)]()]['sort']((p,c)=>(p[Q(0x141)]+'\x20'+p['method'])['localeCompare'](c[Q(0x141)]+'\x20'+c[Q(0x142)]));if(C[Q(0x143)]!=='short')return r;return r['map'](({method:p,endpoint:c,access:x,permissions:m})=>p+'\x20'+c);}
1
+ function c(J,e){J=J-0x10a;const p=L();let b=p[J];return b;}export async function getApiList(J,e){const u=c,p=[...J['apiRoutes'][u(0x10a)]()][u(0x10b)]((b,F)=>(b['endpoint']+'\x20'+b[u(0x10c)])['localeCompare'](F[u(0x10d)]+'\x20'+F['method']));if(J['format']!=='short')return p;return p[u(0x10e)](({method:b,endpoint:F,access:P,permissions:h})=>b+'\x20'+F);}function L(){const H=['values','sort','method','endpoint','map'];L=function(){return H;};return L();}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x103;const r=U();let p=r[C];return p;}export async function getAuditLog(C,N){const m=z,p=Math['min'](Math['max'](C['limit']??0x32,0x1),0xc8),c=Math['max']((C['page']??0x1)-0x1,0x0)*p,x=await N['pg']['query']('SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[p,c]);return{'rows':x['rows'],'page':C[m(0x103)]??0x1,'limit':p};}function U(){const Q=['page'];U=function(){return Q;};return U();}
1
+ export async function getAuditLog(J,e){const P=c,p=Math['min'](Math[P(0x1a7)](J['limit']??0x32,0x1),0xc8),b=Math['max']((J[P(0x1a8)]??0x1)-0x1,0x0)*p,F=await e['pg']['query'](P(0x1a9),[p,b]);return{'rows':F['rows'],'page':J[P(0x1a8)]??0x1,'limit':p};}function c(J,e){J=J-0x1a7;const p=L();let b=p[J];return b;}function L(){const h=['max','page','SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2'];L=function(){return h;};return L();}
@@ -1 +1 @@
1
- export async function getDictionary(C,N){return N['dictionary']['get'](C['name']);}
1
+ function c(J,e){J=J-0x1b3;var p=L();var b=p[J];return b;}function L(){var b=['dictionary'];L=function(){return b;};return L();}export async function getDictionary(J,e){var p=c;return e[p(0x1b3)]['get'](J['name']);}
@@ -1 +1 @@
1
- const t=z;import C from'node:fs/promises';function z(C,N){C=C-0x8e;const r=U();let p=r[C];return p;}import N from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';function U(){const a=['resolve','sep','stat','join','name','file','size','sort','directory','path','type','</a></li>','<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>','replace','&quot;','split','Invalid\x20log\x20path','filter','slice','reverse'];U=function(){return a;};return U();}const LOGS_ROOT=N[t(0x8e)](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(r,p){const h=t,c=normalizePath(r['path']),x=N['resolve'](LOGS_ROOT,c);if(x!==LOGS_ROOT&&!x['startsWith'](LOGS_ROOT+N[h(0x8f)]))throw new ValidationError('Invalid\x20log\x20path');const m=await C[h(0x90)](x)['catch'](()=>null);if(!m)throw new NotFoundError('Log\x20path\x20not\x20found');if(m['isDirectory']()){const u=await C['readdir'](x,{'withFileTypes':!![]}),L=await Promise['all'](u['map'](async T=>{const D=h,Y=await C['stat'](N[D(0x91)](x,T['name']));return{'name':T['name'],'path':c?c+'/'+T['name']:T[D(0x92)],'type':T['isDirectory']()?'directory':D(0x93),'size':T['isDirectory']()?undefined:Y[D(0x94)],'modified':Y['mtime']['toISOString']()};}));L[h(0x95)]((T,Y)=>T['name']['localeCompare'](Y['name']));if(c){const T=c['split']('/')['slice'](0x0,-0x1)['join']('/');L['unshift']({'name':'..','path':T,'type':h(0x96)});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(c,L)};}const Q=await tailFile(x,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':Q['join']('\x0a')};}function renderDirectory(r,p){const V=t,c=p['map'](m=>{const d=z,Q='?path='+encodeURIComponent(m[d(0x97)]),u=m[d(0x98)]==='directory'?m[d(0x92)]+'/':m['name'];return'<li><a\x20href=\x22'+Q+'\x22>'+escapeHtml(u)+d(0x99);})['join']('\x0a'),x=escapeHtml('logs/'+r);return V(0x9a)+x+'</title></head>\x0a<body>\x0a<h1>'+x+'</h1>\x0a<ul>\x0a'+c+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(r){const q=t;return r[q(0x9b)](/&/g,'&amp;')[q(0x9b)](/</g,'&lt;')['replace'](/>/g,'&gt;')[q(0x9b)](/"/g,q(0x9c));}function normalizePath(r){const w=t,p=(r??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(p[w(0x9d)]('/')['some'](c=>c==='..'))throw new ValidationError(w(0x9e));return p;}async function tailFile(r,p){const O=t,c=await C['open'](r,'r');try{const {size:x}=await c[O(0x90)](),m=0x40*0x400;let Q=x,u=Buffer['alloc'](0x0),L=0x0;while(Q>0x0&&L<=p){const Y=Math['min'](m,Q);Q-=Y;const f=Buffer['alloc'](Y);await c['read'](f,0x0,Y,Q),u=Buffer['concat']([f,u]),L+=countNewlines(f);}const T=u['toString']('utf8')['split']('\x0a')[O(0x9f)](F=>F['length']>0x0);return T[O(0xa0)](-p)[O(0xa1)]();}finally{await c['close']();}}function countNewlines(r){let p=0x0;for(const c of r){if(c===0xa)p++;}return p;}
1
+ const Q=c;import J from'node:fs/promises';import e from'node:path';function L(){const Y=['logs','Log\x20path\x20not\x20found','name','isDirectory','toISOString','split','join','directory','map','type','logs/','<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>','replace','Invalid\x20log\x20path','min','read','toString'];L=function(){return Y;};return L();}import{NotFoundError,ValidationError}from'../../../errors.js';function c(J,e){J=J-0xf5;const p=L();let b=p[J];return b;}const LOGS_ROOT=e['resolve'](process['cwd'](),Q(0xf5)),TAIL_LINES=0x64;export async function getSystemLog(p,b){const T=Q,F=normalizePath(p['path']),P=e['resolve'](LOGS_ROOT,F);if(P!==LOGS_ROOT&&!P['startsWith'](LOGS_ROOT+e['sep']))throw new ValidationError('Invalid\x20log\x20path');const h=await J['stat'](P)['catch'](()=>null);if(!h)throw new NotFoundError(T(0xf6));if(h['isDirectory']()){const H=await J['readdir'](P,{'withFileTypes':!![]}),D=await Promise['all'](H['map'](async U=>{const l=T,w=await J['stat'](e['join'](P,U[l(0xf7)]));return{'name':U['name'],'path':F?F+'/'+U[l(0xf7)]:U['name'],'type':U[l(0xf8)]()?'directory':'file','size':U[l(0xf8)]()?undefined:w['size'],'modified':w['mtime'][l(0xf9)]()};}));D['sort']((U,w)=>U['name']['localeCompare'](w['name']));if(F){const U=F[T(0xfa)]('/')['slice'](0x0,-0x1)[T(0xfb)]('/');D['unshift']({'name':'..','path':U,'type':T(0xfc)});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(F,D)};}const u=await tailFile(P,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':u['join']('\x0a')};}function renderDirectory(p,b){const a=Q,F=b[a(0xfd)](h=>{const M=a,u='?path='+encodeURIComponent(h['path']),H=h[M(0xfe)]===M(0xfc)?h['name']+'/':h['name'];return'<li><a\x20href=\x22'+u+'\x22>'+escapeHtml(H)+'</a></li>';})['join']('\x0a'),P=escapeHtml(a(0xff)+p);return a(0x100)+P+'</title></head>\x0a<body>\x0a<h1>'+P+'</h1>\x0a<ul>\x0a'+F+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(p){return p['replace'](/&/g,'&amp;')['replace'](/</g,'&lt;')['replace'](/>/g,'&gt;')['replace'](/"/g,'&quot;');}function normalizePath(p){const d=Q,b=(p??'')[d(0x101)](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(b['split']('/')['some'](F=>F==='..'))throw new ValidationError(d(0x102));return b;}async function tailFile(p,b){const A=Q,F=await J['open'](p,'r');try{const {size:P}=await F['stat'](),h=0x40*0x400;let u=P,H=Buffer['alloc'](0x0),D=0x0;while(u>0x0&&D<=b){const w=Math[A(0x103)](h,u);u-=w;const X=Buffer['alloc'](w);await F[A(0x104)](X,0x0,w,u),H=Buffer['concat']([X,H]),D+=countNewlines(X);}const U=H[A(0x105)]('utf8')['split']('\x0a')['filter'](E=>E['length']>0x0);return U['slice'](-b)['reverse']();}finally{await F['close']();}}function countNewlines(p){let b=0x0;for(const F of p){if(F===0xa)b++;}return b;}
@@ -1 +1 @@
1
- function U(){const L=['reduce'];U=function(){return L;};return U();}function z(C,N){C=C-0x174;const r=U();let p=r[C];return p;}export async function getSystemSettings(C,N){const u=z,r=await N['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20');return r['rows'][u(0x174)]((p,c)=>{const x=String(c['key'])['split']('.');let m=p;for(const Q of x['slice'](0x0,-0x1)){m[Q]??={},m=m[Q];}return m[x['at'](-0x1)]=c['value'],p;},{});}
1
+ export async function getSystemSettings(J,e){const H=c,p=await e['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20');return p[H(0x154)]['reduce']((b,F)=>{const P=String(F['key'])['split']('.');let h=b;for(const u of P['slice'](0x0,-0x1)){h[u]??={},h=h[u];}return h[P['at'](-0x1)]=F['value'],b;},{});}function c(J,e){J=J-0x154;const p=L();let b=p[J];return b;}function L(){const D=['rows'];L=function(){return D;};return L();}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x1c0;var r=U();var p=r[C];return p;}export async function listDictionaries(C,N){var r=z;return N[r(0x1c0)]['list']();}function U(){var p=['dictionary'];U=function(){return p;};return U();}
1
+ export async function listDictionaries(J,e){var p=c;return e['dictionary'][p(0x169)]();}function c(J,e){J=J-0x169;var p=L();var b=p[J];return b;}function L(){var b=['list'];L=function(){return b;};return L();}
@@ -1 +1 @@
1
- import{getAccess}from'./get-access.js';function z(C,N){C=C-0x1d4;const r=U();let p=r[C];return p;}export async function setAccess(C,N){const x=z,r=await N['pg']['connect']();try{await r['query']('BEGIN');C[x(0x1d4)]==='user'?await r[x(0x1d5)](x(0x1d6),[C['id']]):await r['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[C['id']]);for(const p of C['access']){C['type']===x(0x1d7)?await r[x(0x1d5)]('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[p[x(0x1d8)],p['actions'],C['id'],C['user']['id'],C[x(0x1d7)]['id']]):await r[x(0x1d5)](x(0x1d9),[p['resource'],p['actions'],C['id'],C['user']['id'],C['user']['id']]);}await r['query']('COMMIT');}catch(c){await r['query']('ROLLBACK');throw c;}finally{r['release']();}return getAccess(C,N);}function U(){const m=['type','query','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','user','resource','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)'];U=function(){return m;};return U();}
1
+ function c(J,e){J=J-0xa0;const p=L();let b=p[J];return b;}import{getAccess}from'./get-access.js';export async function setAccess(J,e){const P=c,p=await e['pg']['connect']();try{await p[P(0xa0)]('BEGIN');J['type']==='user'?await p[P(0xa0)](P(0xa1),[J['id']]):await p['query'](P(0xa2),[J['id']]);for(const b of J['access']){J[P(0xa3)]==='user'?await p[P(0xa0)](P(0xa4),[b[P(0xa5)],b['actions'],J['id'],J[P(0xa6)]['id'],J['user']['id']]):await p['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[b['resource'],b['actions'],J['id'],J[P(0xa6)]['id'],J[P(0xa6)]['id']]);}await p['query'](P(0xa7));}catch(F){await p['query'](P(0xa8));throw F;}finally{p['release']();}return getAccess(J,e);}function L(){const h=['query','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL','type','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)','resource','user','COMMIT','ROLLBACK'];L=function(){return h;};return L();}
@@ -1 +1 @@
1
- export async function updateDictionary(C,N){return await N['dictionary']['put'](C['name'],C['items']),{'success':!![]};}
1
+ export async function updateDictionary(J,e){return await e['dictionary']['put'](J['name'],J['items']),{'success':!![]};}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x18a;const r=U();let p=r[C];return p;}function U(){const x=['patch','length','includes','query','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.settings\x20(resource,\x20resource_id,\x20key,\x20value,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20(\x27system\x27,\x20NULL,\x20$1,\x20$2::jsonb,\x20$3)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(resource,\x20resource_id,\x20key)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x20value\x20=\x20EXCLUDED.value,\x20updated_by\x20=\x20EXCLUDED.updated_by,\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20','stringify'];U=function(){return x;};return U();}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(C,N){const c=z;if(!Object['keys'](C[c(0x18a)])[c(0x18b)])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [r,p]of Object['entries'](C['patch'])){if(!r['trim']()||r[c(0x18c)]('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+r);await N['pg'][c(0x18d)](c(0x18e),[r,JSON[c(0x18f)](p),C['user']['id']]);}return{'success':!![]};}
1
+ function L(){const P=['patch','length','entries','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.settings\x20(resource,\x20resource_id,\x20key,\x20value,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20(\x27system\x27,\x20NULL,\x20$1,\x20$2::jsonb,\x20$3)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(resource,\x20resource_id,\x20key)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x20value\x20=\x20EXCLUDED.value,\x20updated_by\x20=\x20EXCLUDED.updated_by,\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20'];L=function(){return P;};return L();}function c(J,e){J=J-0xb5;const p=L();let b=p[J];return b;}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(J,e){const F=c;if(!Object['keys'](J[F(0xb5)])[F(0xb6)])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [p,b]of Object[F(0xb7)](J['patch'])){if(!p['trim']()||p['includes']('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+p);await e['pg']['query'](F(0xb8),[p,JSON['stringify'](b),J['user']['id']]);}return{'success':!![]};}
@@ -1 +1 @@
1
- import{ForbiddenError}from'../../errors.js';function z(C,N){C=C-0x188;var r=U();var p=r[C];return p;}function U(){var p=['admin','Admin\x20access\x20required','includes'];U=function(){return p;};return U();}export function requireAdmin(C,N){var r=z;if(!C)throw new ForbiddenError('User\x20required');if(C['type']!==r(0x188))throw new ForbiddenError(r(0x189));if(C['type']!=='admin'&&N&&!C['permissions']?.[r(0x18a)](N))throw new ForbiddenError('Missing\x20permission:\x20'+N);}
1
+ import{ForbiddenError}from'../../errors.js';function c(J,e){J=J-0xf0;var p=L();var b=p[J];return b;}export function requireAdmin(J,e){var p=c;if(!J)throw new ForbiddenError('User\x20required');if(J['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(J[p(0xf0)]!==p(0xf1)&&e&&!J[p(0xf2)]?.[p(0xf3)](e))throw new ForbiddenError('Missing\x20permission:\x20'+e);}function L(){var b=['type','admin','permissions','includes'];L=function(){return b;};return L();}
@@ -1 +1 @@
1
- function U(){const x=['salt','credentials','fromEntries','toLowerCase'];U=function(){return x;};return U();}function z(C,N){C=C-0x16a;const r=U();let p=r[C];return p;}export const safeUser=C=>{const c=z,N=['password',c(0x16a),'secret',c(0x16b)];return Object[c(0x16c)](Object['entries'](C)['filter'](([r])=>!N['some'](p=>r[c(0x16d)]()['includes'](p))));};
1
+ function c(J,e){J=J-0xb3;const p=L();let b=p[J];return b;}function L(){const P=['password','salt','some'];L=function(){return P;};return L();}export const safeUser=J=>{const F=c,e=[F(0xb3),F(0xb4),'secret','credentials'];return Object['fromEntries'](Object['entries'](J)['filter'](([p])=>!e[F(0xb5)](b=>p['toLowerCase']()['includes'](b))));};
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../errors.js';export function unsupported(C){throw new UnsupportedError(C+'\x20requires\x20a\x20project/provider\x20implementation');}
1
+ import{UnsupportedError}from'../../errors.js';export function unsupported(J){throw new UnsupportedError(J+'\x20requires\x20a\x20project/provider\x20implementation');}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(C){const N=writeAudit(C);return{'write':N};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(J){const e=writeAudit(J);return{'write':e};}
@@ -1 +1 @@
1
- function U(){const F=['test','map','has','warn','catch','logger','newValue','\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','resourceId','metadata','changes','query','stringify'];U=function(){return F;};return U();}const secretPattern=/password|token|secret|credential|salt/i;function z(C,N){C=C-0xd6;const r=U();let p=r[C];return p;}function clean(C){const L=z;if(Array['isArray'](C))return C['map'](clean);if(C&&typeof C==='object')return Object['fromEntries'](Object['entries'](C)['map'](([N,r])=>[N,secretPattern[L(0xd6)](N)?'[REDACTED]':clean(r)]));return C;}export function writeAudit(C){let N,r;async function p(){const Y=z;if(!C['pg'])return![];if(N!==undefined)return N;return r??=C['pg']['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\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](c=>{const T=z,x=new Set(c['rows'][T(0xd7)](m=>m['table_name']));return N=x[T(0xd8)]('audit_log')&&x[T(0xd8)]('audit_log_data'),!N&&C['logger'][T(0xd9)]({'expectedTables':['admin.audit_log','admin.audit_log_data'],'foundTables':[...x]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),N;})[Y(0xda)](c=>{return N=![],C['logger']['warn']({'err':c},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),r;}return async function c(x){const f=z;if(!await p())return C[f(0xdb)]['info']({'auditFallback':!![],'event':clean({...x,'changes':x['changes']?.[f(0xd7)](u=>({...u,'oldValue':clean(u['oldValue']),'newValue':clean(u[f(0xdc)])}))})},'audit'),0x0;if(!C['pg'])throw new Error('empty\x20pg');const m=await C['pg']['query'](f(0xdd),[x['userId']??null,x['module'],x['resource'],x['resourceId']==null?null:String(x[f(0xde)]),x['fields']??null,x['action'],x['requestId']??null,x['ipAddress']??null,clean(x[f(0xdf)]??{})]),Q=m['rows'][0x0]['id'];for(const u of x[f(0xe0)]??[]){if(secretPattern['test'](u['field']))continue;await C['pg'][f(0xe1)]('\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',[Q,u['field'],JSON['stringify'](clean(u['oldValue'])),JSON[f(0xe2)](clean(u['newValue']))]);}return Q;};}
1
+ function c(J,e){J=J-0xbb;const p=L();let b=p[J];return b;}const secretPattern=/password|token|secret|credential|salt/i;function clean(J){const D=c;if(Array['isArray'](J))return J['map'](clean);if(J&&typeof J==='object')return Object['fromEntries'](Object['entries'](J)['map'](([e,p])=>[e,secretPattern[D(0xbb)](e)?D(0xbc):clean(p)]));return J;}export function writeAudit(J){let e,p;async function b(){const U=c;if(!J['pg'])return![];if(e!==undefined)return e;return p??=J['pg']['query'](U(0xbd))['then'](F=>{const w=U,P=new Set(F['rows']['map'](h=>h[w(0xbe)]));return e=P['has']('audit_log')&&P[w(0xbf)]('audit_log_data'),!e&&J['logger'][w(0xc0)]({'expectedTables':['admin.audit_log',w(0xc1)],'foundTables':[...P]},w(0xc2)),e;})['catch'](F=>{const X=U;return e=![],J['logger']['warn']({'err':F},X(0xc3)),![];}),p;}return async function F(P){const E=c;if(!await b())return J['logger'][E(0xc4)]({'auditFallback':!![],'event':clean({...P,'changes':P['changes']?.['map'](H=>({...H,'oldValue':clean(H['oldValue']),'newValue':clean(H['newValue'])}))})},E(0xc5)),0x0;if(!J['pg'])throw new Error(E(0xc6));const h=await J['pg']['query'](E(0xc7),[P[E(0xc8)]??null,P['module'],P['resource'],P['resourceId']==null?null:String(P['resourceId']),P['fields']??null,P['action'],P['requestId']??null,P['ipAddress']??null,clean(P[E(0xc9)]??{})]),u=h[E(0xca)][0x0]['id'];for(const H of P['changes']??[]){if(secretPattern['test'](H['field']))continue;await J['pg']['query']('\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',[u,H['field'],JSON['stringify'](clean(H['oldValue'])),JSON['stringify'](clean(H['newValue']))]);}return u;};}function L(){const Q=['test','[REDACTED]','\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','table_name','has','warn','admin.audit_log_data','Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled','Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled','info','audit','empty\x20pg','\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','userId','metadata','rows'];L=function(){return Q;};return L();}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x1a9;const r=U();let p=r[C];return p;}export async function getUserPermissions(C,N){const c=z,r=await N['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',[C]);return r['rows'][c(0x1a9)](p=>p['permission']);}function U(){const x=['map'];U=function(){return x;};return U();}
1
+ export async function getUserPermissions(J,e){const p=await e['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',[J]);return p['rows']['map'](b=>b['permission']);}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBA6CzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBA6CzB"}
@@ -1 +1 @@
1
- export*from'./auth.types.js';import{randomBytes,scrypt as C,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(C);function U(){const D=['scrypt$','toString','scrypt','hex','from','auth','database','register','initialize','registerUserDeserializer','user'];U=function(){return D;};return U();}import N from'@fastify/cookie';function z(C,N){C=C-0x12f;const r=U();let p=r[C];return p;}import r from'@fastify/session';import{Authenticator}from'@fastify/passport';import p from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(c){const f=z,x=randomBytes(0x10),m=await scrypt(c,x,0x40);return f(0x12f)+x['toString']('hex')+'$'+m[f(0x130)]('hex');}export async function verifyPassword(c,x){const F=z,[m,Q,u]=x['split']('$');if(m!==F(0x131)||!Q||!u)return![];const L=Buffer['from'](Q,F(0x132)),T=Buffer[F(0x133)](u,F(0x132)),Y=await scrypt(c,L,T['length']);return timingSafeEqual(Y,T);}export async function createSessionStore(c,x){const t=z,{config:m,redis:Q}=x;if(!m||!Q){console['warn']('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await c['register'](N,{'parseOptions':m['auth']['cookieOptions']}),await c['register'](r,{'secret':m[t(0x134)]['secret'],'cookieName':m['auth']['cookieName'],'cookie':m['auth']['cookieOptions'],'store':new p({'prefix':m['auth']['cookieName']+':'+(m['pg']?.[t(0x135)]||'db')+':','client':Q})}),await c[t(0x136)](fastifyPassport[t(0x137)]()),await c['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async u=>({'user':u})),fastifyPassport[t(0x138)](async u=>{const h=t,L=u?.[h(0x139)]||u;return L?.['id']&&(L['permissions']=await getUserPermissions(L['id'],x)),L;});}
1
+ export*from'./auth.types.js';import{randomBytes,scrypt as J,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(J);import e from'@fastify/cookie';import p from'@fastify/session';import{Authenticator}from'@fastify/passport';import b from'fastify-session-redis-store';function c(J,e){J=J-0x15b;const p=L();let b=p[J];return b;}import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(F){const X=c,P=randomBytes(0x10),h=await scrypt(F,P,0x40);return X(0x15b)+P['toString'](X(0x15c))+'$'+h['toString']('hex');}export async function verifyPassword(F,P){const E=c,[h,u,H]=P?.[E(0x15d)]('$')||[];if(h!=='scrypt'||!u||!H)return![];const D=Buffer[E(0x15e)](u,'hex'),U=Buffer[E(0x15e)](H,E(0x15c)),w=await scrypt(F,D,U[E(0x15f)]);return timingSafeEqual(w,U);}export async function createSessionStore(F,P){const Q=c,{config:h,redis:u}=P;if(!h||!u){console[Q(0x160)](Q(0x161));return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await F[Q(0x162)](e,{'parseOptions':h['auth'][Q(0x163)]}),await F['register'](p,{'secret':h['auth']['secret'],'cookieName':h['auth']['cookieName'],'cookie':h[Q(0x164)]['cookieOptions'],'store':new b({'prefix':h['auth'][Q(0x165)]+':'+(h['pg']?.['database']||'db')+':','client':u})}),await F['register'](fastifyPassport['initialize']()),await F[Q(0x162)](fastifyPassport[Q(0x166)]()),fastifyPassport['registerUserSerializer'](async H=>({'user':H})),fastifyPassport[Q(0x167)](async H=>{const T=Q,D=H?.['user']||H;return D?.['id']&&(D[T(0x168)]=await getUserPermissions(D['id'],P)),D;});}function L(){const l=['scrypt$','hex','split','from','length','warn','Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation','register','cookieOptions','auth','cookieName','secureSession','registerUserDeserializer','permissions'];L=function(){return l;};return L();}
@@ -1 +1 @@
1
- import{BadRequestError}from'../../errors.js';function z(C,N){C=C-0x10d;const r=U();let p=r[C];return p;}import{verifyPassword}from'./index.js';function U(){const Y=['select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201'];U=function(){return Y;};return U();}export async function verifyUser({user:C,password:N,ip:r},{pg:p,logger:c}){const T=z;if(!C||C==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!N||N==='')throw new BadRequestError('not\x20enough\x20params:\x20password');c['metrics']('user.login');const x=T(0x10d),m=await p['query'](x,[C])['then'](u=>u['rows']?.[0x0]);if(!m){const u='user\x20not\x20found';c['info']({'file':'auth/warn','error':u,'user':C,'ip':r});throw new BadRequestError(u);}const Q=await verifyPassword(N,m['password_hash']);if(!Q){const L='Wrong\x20password';c['info']({'file':'auth/warn','error':L,'user':C,'ip':r});throw new BadRequestError(L);}return delete m['password_hash'],m;}
1
+ function c(J,e){J=J-0x1b3;const p=L();let b=p[J];return b;}import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';export async function verifyUser({user:J,password:e,ip:p},{pg:b,logger:F}){const U=c;if(!J||J==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!e||e==='')throw new BadRequestError(U(0x1b3));F['metrics']('user.login');const P='select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201',h=await b[U(0x1b4)](P,[J])[U(0x1b5)](H=>H['rows']?.[0x0]);if(!h){const H='user\x20not\x20found';F['info']({'file':U(0x1b6),'error':H,'user':J,'ip':p});throw new BadRequestError(H);}const u=await verifyPassword(e,h[U(0x1b7)]);if(!u){const D='Wrong\x20password';F['info']({'file':'auth/warn','error':D,'user':J,'ip':p});throw new BadRequestError(D);}return delete h['password_hash'],h;}function L(){const w=['not\x20enough\x20params:\x20password','query','then','auth/warn','password_hash'];L=function(){return w;};return L();}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x19b;const r=U();let p=r[C];return p;}function U(){const A=['query','rows','table_name','dictionaries','code','items','Invalid\x20dictionary\x20items:\x20','has','Dictionary\x20table\x20not\x20found','set','database','Dictionary\x20items\x20must\x20be\x20an\x20array','connect','BEGIN','\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','\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','COMMIT','ROLLBACK','get','values','push'];U=function(){return A;};return U();}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:C,dictionaries:dictionaries=[]}){const N=new Map(),r=new Map();let p,c;async function x(){const a=z;if(p!==undefined)return p;if(!C)throw new Error('empty\x20pg');return c??=C[a(0x19b)]('\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'](t=>{const Z=a,h=t[Z(0x19c)][0x0]?.[Z(0x19d)];p=h===Z(0x19e)?h:null;}),await c,p;}function m(t){if(!dictionaryName['test'](t))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+t);}function Q(t){const H=z;for(const h of Array['isArray'](t)?t:[t]){m(h[H(0x19f)]);if(!Array['isArray'](h[H(0x1a0)]))throw new ValidationError(H(0x1a1)+h['code']);if(N[H(0x1a2)](h[H(0x19f)]))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+h['code']);N['set'](h['code'],{...h,'source':'static'});}}function u(t){return N['has'](t);}async function L(t){const v=z;m(t);const h=N['get'](t);if(h&&h['checked'])return h[v(0x1a0)];const D=await x();if(!D)throw new NotFoundError(v(0x1a3));const d=await C?.[v(0x19b)]('\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',[t]);if(d?.['rows']?.['length']){const V=d?.['rows'];return N[v(0x1a4)](t,{'code':t,'name':t,'items':V,'source':v(0x1a5),'checked':!![]}),V;}if(!h?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+t);return h['checked']=!![],h['items'];}async function T(t,h){const n=z;m(t);if(!Array['isArray'](h))throw new ValidationError(n(0x1a6));const D=await x();if(!D)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!C)throw new Error('empty\x20pg');const d=await C[n(0x1a7)]();try{await d['query'](n(0x1a8));const V=await d[n(0x19b)](n(0x1a9),[t,t,'fcore','custom',!![]]),q=V[n(0x19c)][0x0]['id'];await d[n(0x19b)]('DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1',[q]);for(const w of h){await d['query'](n(0x1aa),[q,w[n(0x19f)],w['name'],w['parentId']??null]);}await d['query'](n(0x1ab));}catch(O){await d['query'](n(0x1ac));throw O;}finally{d['release']();}N['set'](t,{'items':h,'code':t,'source':'static','checked':!![]}),r[n(0x1a4)](t,(r[n(0x1ad)](t)??0x0)+0x1);}function Y(t){const R=z;return m(t),r['set'](t,(r[R(0x1ad)](t)??0x0)+0x1),N['delete'](t);}function f(t){return r['get'](t)??0x0;}async function F(){const o=z,t=[...N[o(0x1ae)]()]['map'](({code:d,name:V,source:q})=>({'code':d,'name':V??d,'source':q})),h=await x();if(!h)return t;if(!C)throw new Error('empty\x20pg');const D=await C['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 d of D[o(0x19c)]){!N['has'](d['code'])&&t[o(0x1af)](d);}return t;}return Q(dictionaries),{'register':Q,'get':L,'put':T,'clear':Y,'revision':f,'list':F,'has':u};}
1
+ import{ConflictError,NotFoundError,ValidationError}from'../errors.js';function c(J,e){J=J-0x189;const p=L();let b=p[J];return b;}const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:J,dictionaries:dictionaries=[]}){const e=new Map(),p=new Map();let b,F;async function P(){const q=c;if(b!==undefined)return b;if(!J)throw new Error('empty\x20pg');return F??=J[q(0x189)]('\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'](Q=>{const T=Q['rows'][0x0]?.['table_name'];b=T==='dictionaries'?T:null;}),await F,b;}function h(Q){const z=c;if(!dictionaryName['test'](Q))throw new ValidationError(z(0x18a)+Q);}function u(Q){const R=c;for(const T of Array['isArray'](Q)?Q:[Q]){h(T['code']);if(!Array[R(0x18b)](T['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+T['code']);if(e['has'](T['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+T['code']);e['set'](T[R(0x18c)],{...T,'source':'static'});}}function H(Q){const y=c;return e[y(0x18d)](Q);}async function D(Q){const B=c;h(Q);const T=e[B(0x18e)](Q);if(T&&T['checked'])return T[B(0x18f)];const l=await P();if(!l)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const a=await J?.['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',[Q]);if(a?.['rows']?.[B(0x190)]){const M=a?.['rows'];return e[B(0x191)](Q,{'code':Q,'name':Q,'items':M,'source':'database','checked':!![]}),M;}if(!T?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+Q);return T['checked']=!![],T['items'];}async function U(Q,T){const s=c;h(Q);if(!Array['isArray'](T))throw new ValidationError(s(0x192));const l=await P();if(!l)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!J)throw new Error(s(0x193));const a=await J[s(0x194)]();try{await a[s(0x189)]('BEGIN');const M=await a['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',[Q,Q,s(0x195),s(0x196),!![]]),d=M[s(0x197)][0x0]['id'];await a['query']('DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1',[d]);for(const A of T){await a['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',[d,A['code'],A['name'],A['parentId']??null]);}await a['query']('COMMIT');}catch(Y){await a[s(0x189)](s(0x198));throw Y;}finally{a['release']();}e[s(0x191)](Q,{'items':T,'code':Q,'source':'static','checked':!![]}),p['set'](Q,(p['get'](Q)??0x0)+0x1);}function w(Q){const C=c;return h(Q),p['set'](Q,(p[C(0x18e)](Q)??0x0)+0x1),e[C(0x199)](Q);}function X(Q){return p['get'](Q)??0x0;}async function E(){const K=c,Q=[...e['values']()]['map'](({code:a,name:M,source:d})=>({'code':a,'name':M??a,'source':d})),T=await P();if(!T)return Q;if(!J)throw new Error('empty\x20pg');const l=await J['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 a of l['rows']){!e[K(0x18d)](a['code'])&&Q['push'](a);}return Q;}return u(dictionaries),{'register':u,'get':D,'put':U,'clear':w,'revision':X,'list':E,'has':H};}function L(){const k=['query','Invalid\x20dictionary\x20name:\x20','isArray','code','has','get','items','length','set','Dictionary\x20items\x20must\x20be\x20an\x20array','empty\x20pg','connect','fcore','custom','rows','ROLLBACK','delete'];L=function(){return k;};return L();}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x100;const r=U();let p=r[C];return p;}function U(){const d=['replace','alloc','transformToByteArray','from','toString','endpoint','accessKey','accessKeyId','secretKey','folder','name','sha256','update','digest','length','Invalid\x20file\x20token','base64url'];U=function(){return d;};return U();}import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import C from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(N,r){const Y=z;if(!r||r['startsWith']('/')||r['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const p=r['replace'](/\\/g,'/')['replace'](/^\/+/,''),c=(N??'')[Y(0x100)](/^\/+|\/+$/g,'');return c?c+'/'+p:p;}async function bodyToBuffer(N){const f=z;if(!N)return Buffer[f(0x101)](0x0);const r=N;if(typeof r[f(0x102)]==='function')return Buffer['from'](await r['transformToByteArray']());const p=[];for await(const c of N){p['push'](Buffer[f(0x103)](c));}return Buffer['concat'](p);}export function createFileS3(N){const F=z,r=N['tokenSecret']??process.env.FILE_TOKEN_SECRET??C['randomBytes'](0x20)[F(0x104)]('hex'),p=new S3Client({'endpoint':N[F(0x105)],'region':N['region']??'us-east-1','forcePathStyle':N['forcePathStyle']??!![],'credentials':N['accessKeyId']||N[F(0x106)]?{'accessKeyId':N[F(0x107)]??N['accessKey'],'secretAccessKey':N['secretAccessKey']??N[F(0x108)]}:undefined}),c=x=>keyFor(N[F(0x109)],x);return{async 'put'(x,m){await p['send'](new PutObjectCommand({'Bucket':N['bucket'],'Key':c(x),'Body':m}));},async 'get'(x){const m=await p['send'](new GetObjectCommand({'Bucket':N['bucket'],'Key':c(x)}));return bodyToBuffer(m['Body']);},async 'exists'(x){const t=F;try{return await p['send'](new HeadObjectCommand({'Bucket':N['bucket'],'Key':c(x)})),!![];}catch(m){const Q=m;if(Q['$metadata']?.['httpStatusCode']===0x194||Q[t(0x10a)]==='NotFound')return![];throw m;}},async 'delete'(x){await p['send'](new DeleteObjectCommand({'Bucket':N['bucket'],'Key':c(x)}));},'create'(x,m=N['tokenTtl']??0xe10){const h=F,Q=Buffer['from'](x)['toString']('base64url'),u=C['createHmac'](h(0x10b),r)[h(0x10c)](Q)[h(0x10d)]('base64url');return Q+'.'+u;},'verify'(x){const D=F,[m,Q]=x['split']('.');if(!m||!Q)throw new UnauthorizedError('Invalid\x20file\x20token');const u=C['createHmac']('sha256',r)[D(0x10c)](m)[D(0x10d)](),L=Buffer['from'](Q,'base64url');if(u[D(0x10e)]!==L[D(0x10e)]||!C['timingSafeEqual'](u,L))throw new UnauthorizedError(D(0x10f));const T=Buffer[D(0x103)](m,D(0x110))['toString']('utf8');return T;}};}
1
+ function c(J,e){J=J-0xb7;const p=L();let b=p[J];return b;}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 L(){const d=['includes','alloc','randomBytes','forcePathStyle','secretKey','folder','Body','send','httpStatusCode','bucket','from','base64url','update','split','Invalid\x20file\x20token','createHmac','sha256','length'];L=function(){return d;};return L();}function keyFor(e,p){const w=c;if(!p||p['startsWith']('/')||p[w(0xb7)]('..'))throw new ValidationError('Invalid\x20file\x20path');const b=p['replace'](/\\/g,'/')['replace'](/^\/+/,''),F=(e??'')['replace'](/^\/+|\/+$/g,'');return F?F+'/'+b:b;}async function bodyToBuffer(e){const X=c;if(!e)return Buffer[X(0xb8)](0x0);const p=e;if(typeof p['transformToByteArray']==='function')return Buffer['from'](await p['transformToByteArray']());const b=[];for await(const F of e){b['push'](Buffer['from'](F));}return Buffer['concat'](b);}export function createFileS3(e){const E=c,p=e['tokenSecret']??process.env.FILE_TOKEN_SECRET??J[E(0xb9)](0x20)['toString']('hex'),b=new S3Client({'endpoint':e['endpoint'],'region':e['region']??'us-east-1','forcePathStyle':e[E(0xba)]??!![],'credentials':e['accessKeyId']||e['accessKey']?{'accessKeyId':e['accessKeyId']??e['accessKey'],'secretAccessKey':e['secretAccessKey']??e[E(0xbb)]}:undefined}),F=P=>keyFor(e[E(0xbc)],P);return{async 'put'(P,h){await b['send'](new PutObjectCommand({'Bucket':e['bucket'],'Key':F(P),'Body':h}));},async 'get'(P){const Q=E,h=await b['send'](new GetObjectCommand({'Bucket':e['bucket'],'Key':F(P)}));return bodyToBuffer(h[Q(0xbd)]);},async 'exists'(P){const T=E;try{return await b[T(0xbe)](new HeadObjectCommand({'Bucket':e['bucket'],'Key':F(P)})),!![];}catch(h){const u=h;if(u['$metadata']?.[T(0xbf)]===0x194||u['name']==='NotFound')return![];throw h;}},async 'delete'(P){const l=E;await b['send'](new DeleteObjectCommand({'Bucket':e[l(0xc0)],'Key':F(P)}));},'create'(P,h=e['tokenTtl']??0xe10){const a=E,u=Buffer[a(0xc1)](P)['toString'](a(0xc2)),H=J['createHmac']('sha256',p)[a(0xc3)](u)['digest'](a(0xc2));return u+'.'+H;},'verify'(P){const M=E,[h,u]=P[M(0xc4)]('.');if(!h||!u)throw new UnauthorizedError(M(0xc5));const H=J[M(0xc6)](M(0xc7),p)['update'](h)['digest'](),D=Buffer['from'](u,'base64url');if(H[M(0xc8)]!==D['length']||!J['timingSafeEqual'](H,D))throw new UnauthorizedError('Invalid\x20file\x20token');const U=Buffer['from'](h,'base64url')['toString']('utf8');return U;}};}
@@ -1 +1 @@
1
- const x=z;import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()[x(0x64)](process.env.AUTH_JWT_SECRET);function U(){const u=['encode','setProtectedHeader','HS256'];U=function(){return u;};return U();}export async function jwtSignToken(C){const m=x;if(!process.env.AUTH_JWT_SECRET)return;const {id:N,type:r,permissions:p}=C,c=await new SignJWT({'id':N,'type':r,'permissions':p})[m(0x65)]({'alg':m(0x66)})['setIssuedAt']()['setExpirationTime']('1h')['sign'](secret);return c;}function z(C,N){C=C-0x64;const r=U();let p=r[C];return p;}export async function jwtVerifyToken(C){const Q=x,N=await jwtVerify(C,secret,{'algorithms':[Q(0x66)]})['catch'](r=>{console['log'](r['message']);});return N?.['payload'];}
1
+ const P=c;import{SignJWT,jwtVerify}from'jose';function c(J,e){J=J-0xfa;const p=L();let b=p[J];return b;}const secret=new TextEncoder()[P(0xfa)](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(J){if(!process.env.AUTH_JWT_SECRET)return;const {id:e,type:p,permissions:b}=J,F=await new SignJWT({'id':e,'type':p,'permissions':b})['setProtectedHeader']({'alg':'HS256'})['setIssuedAt']()['setExpirationTime']('1h')['sign'](secret);return F;}function L(){const u=['encode','log','message'];L=function(){return u;};return L();}export async function jwtVerifyToken(J){const e=await jwtVerify(J,secret,{'algorithms':['HS256']})['catch'](p=>{const h=c;console[h(0xfb)](p[h(0xfc)]);});return e?.['payload'];}
@@ -1 +1 @@
1
- function U(){const u=['password','token','end','bind'];U=function(){return u;};return U();}import C from'pino';function z(C,N){C=C-0x100;const r=U();let p=r[C];return p;}export function createLogger(){const Q=z,N=C['transport']({'target':'./transport.js'}),r=C({'level':'info','timestamp':C['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization',Q(0x100),Q(0x101),'accessToken','refreshToken'],'censor':'[REDACTED]'}},N),p={};function c(x,m){if(x===undefined)return{...p};p[x]=(p[x]??0x0)+(m??0x1);}return Object['assign'](r,{'close':async()=>N[Q(0x102)](),'metrics':c,'file':()=>r['info'][Q(0x103)](r)});}
1
+ function c(J,e){J=J-0x107;const p=L();let b=p[J];return b;}function L(){const H=['transport','app','password','accessToken','assign','bind'];L=function(){return H;};return L();}import J from'pino';export function createLogger(){const u=c,e=J[u(0x107)]({'target':'./transport.js'}),p=J({'level':'info','timestamp':J['stdTimeFunctions']['isoTime'],'base':{'service':u(0x108)},'redact':{'paths':['req.headers.authorization',u(0x109),'token',u(0x10a),'refreshToken'],'censor':'[REDACTED]'}},e),b={};function F(P,h){if(P===undefined)return{...b};b[P]=(b[P]??0x0)+(h??0x1);}return Object[u(0x10b)](p,{'close':async()=>e['end'](),'metrics':F,'file':()=>p['info'][u(0x10c)](p)});}
@@ -1 +1 @@
1
- function U(){const f=['slice','join','date','stream','values','end','level','stringify'];U=function(){return f;};return U();}import C from'node:fs';import N from'node:path';function z(C,N){C=C-0x8e;const r=U();let p=r[C];return p;}import r from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:'warn',0x32:'error',0x3c:'error'},streams=new Map();function getDate(){const Q=z;return new Date()['toISOString']()[Q(0x8e)](0x0,0xa);}function createStream(p,c){const u=z,x=N['resolve']('logs',p);return C['mkdirSync'](x,{'recursive':!![]}),C['createWriteStream'](N[u(0x8f)](x,c+'.log'),{'flags':'a'});}function getStream(p){const L=z,c=getDate(),x=streams['get'](p);if(x&&x[L(0x90)]===c)return x['stream'];x?.[L(0x91)]['end']();const m=createStream(p,c);return streams['set'](p,{'date':c,'stream':m}),m;}function closeStreams(){const T=z;for(const {stream:p}of streams[T(0x92)]()){p[T(0x93)]();}streams['clear']();}export default async function loggerTransport(){return r(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(p){const Y=z;for await(const c of p){const x=LEVELS[c[Y(0x94)]];if(!x)continue;const m=getStream(c['file']||x);delete c['file'],m['write'](JSON[Y(0x95)](c)+'\x0a');}}
1
+ const u=c;import J from'node:fs';import e from'node:path';function c(J,e){J=J-0xd1;const p=L();let b=p[J];return b;}import p from'pino-abstract-transport';const LEVELS={0x1e:u(0xd1),0x28:'warn',0x32:'error',0x3c:u(0xd2)},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(b,F){const H=u,P=e['resolve'](H(0xd3),b);return J['mkdirSync'](P,{'recursive':!![]}),J[H(0xd4)](e['join'](P,F+H(0xd5)),{'flags':'a'});}function getStream(b){const D=u,F=getDate(),P=streams['get'](b);if(P&&P[D(0xd6)]===F)return P['stream'];P?.['stream'][D(0xd7)]();const h=createStream(b,F);return streams['set'](b,{'date':F,'stream':h}),h;}function L(){const X=['info','error','logs','createWriteStream','.log','date','end','values','file'];L=function(){return X;};return L();}function closeStreams(){const U=u;for(const {stream:b}of streams[U(0xd8)]()){b['end']();}streams['clear']();}export default async function loggerTransport(){return p(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(b){const w=u;for await(const F of b){const P=LEVELS[F['level']];if(!P)continue;const h=getStream(F[w(0xd9)]||P);delete F['file'],h['write'](JSON['stringify'](F)+'\x0a');}}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x1f0;const r=U();let p=r[C];return p;}import C from'pg';const {Pool}=C;function U(){const f=['captureStackTrace','sql','callerStack'];U=function(){return f;};return U();}export function createDatabase(N){const r=new Pool(N),p=r['query']['bind'](r);function c(x,m){const T=z,Q=new Error();return Error[T(0x1f0)]?.(Q,c),p(x,m)['catch'](u=>{const Y=T,L=u;L[Y(0x1f1)]=x,L[Y(0x1f2)]=Q['stack'];throw L;});}return r['query']=c,r;}
1
+ import J from'pg';function c(J,e){J=J-0x84;const p=L();let b=p[J];return b;}const {Pool}=J;function L(){const w=['bind'];L=function(){return w;};return L();}export function createDatabase(e){const U=c,p=new Pool(e),b=p['query'][U(0x84)](p);function F(P,h){const u=new Error();return Error['captureStackTrace']?.(u,F),b(P,h)['catch'](H=>{const D=H;D['sql']=P,D['callerStack']=u['stack'];throw D;});}return p['query']=F,p;}
@@ -1 +1 @@
1
- function z(C,N){C=C-0xae;const r=U();let p=r[C];return p;}import{Redis}from'ioredis';export function createRedis(C){const m=z,N=new Redis(C);return{'get':r=>N['get'](r),'set':(r,p,c,x)=>{if(x)return N['set'](r,p,'EX',x);if(typeof c==='number')return N['set'](r,p,'EX',c);return N['set'](r,p);},'del':r=>N['del'](r),'delete':r=>N[m(0xae)](r),'close':()=>N['quit'](),'ping':()=>N['ping'](),'hincrby':(r,p,c)=>N[m(0xaf)](r,p,c),'incrby':(r,p)=>N['incrby'](r,p)};}function U(){const Q=['del','hincrby'];U=function(){return Q;};return U();}
1
+ function L(){const u=['del'];L=function(){return u;};return L();}function c(J,e){J=J-0xe0;const p=L();let b=p[J];return b;}import{Redis}from'ioredis';export function createRedis(J){const h=c,e=new Redis(J);return{'get':p=>e['get'](p),'set':(p,b,F,P)=>{if(P)return e['set'](p,b,'EX',P);if(typeof F==='number')return e['set'](p,b,'EX',F);return e['set'](p,b);},'del':p=>e[h(0xe0)](p),'delete':p=>e['del'](p),'close':()=>e['quit'](),'ping':()=>e['ping'](),'hincrby':(p,b,F)=>e['hincrby'](p,b,F),'incrby':(p,b)=>e['incrby'](p,b)};}
@@ -1 +1 @@
1
- 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(C){const N=new ResourceRegistry(),r=createFind(C,N),p=createFindOne(C,N),c=createCreate(C,N),x=createUpdate(C,N),m=createRemove(C,N),Q=createFindRelation(C,N),u=createCreateRelation(C,N),L=createUpdateRelation(C,N),T=createDeleteRelation(C,N);return{'register':N['register']['bind'](N),'has':N['has']['bind'](N),'get':N['get']['bind'](N),'list':N['list']['bind'](N),'find':r,'findOne':p,'create':c,'update':x,'delete':m,'findRelation':Q,'createRelation':u,'updateRelation':L,'deleteRelation':T};}
1
+ import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';function L(){const X=['has','bind'];L=function(){return X;};return L();}import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';function c(J,e){J=J-0x67;const p=L();let b=p[J];return b;}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(J){const w=c,e=new ResourceRegistry(),p=createFind(J,e),b=createFindOne(J,e),F=createCreate(J,e),P=createUpdate(J,e),h=createRemove(J,e),u=createFindRelation(J,e),H=createCreateRelation(J,e),D=createUpdateRelation(J,e),U=createDeleteRelation(J,e);return{'register':e['register']['bind'](e),'has':e[w(0x67)]['bind'](e),'get':e['get'][w(0x68)](e),'list':e['list']['bind'](e),'find':p,'findOne':b,'create':F,'update':P,'delete':h,'findRelation':u,'createRelation':H,'updateRelation':D,'deleteRelation':U};}
@@ -1 +1 @@
1
- const x=z;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';function z(C,N){C=C-0x164;const r=U();let p=r[C];return p;}function U(){const u=['split','test','name','get','Resource\x20not\x20registered:\x20','version','table','entries','fields'];U=function(){return u;};return U();}const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(C){const p=z;return C['split']('.')['length']<=0x2&&C[p(0x164)]('.')['every'](N=>ident[p(0x165)](N));}export class ResourceRegistry{['resources']=new Map();['register'](C){const c=z;for(const N of Array['isArray'](C)?C:[C]){this['validate'](N);if(this['resources']['has'](N[c(0x166)]))throw new ConflictError('Resource\x20already\x20registered:\x20'+N[c(0x166)]);this['resources']['set'](N['name'],N);}}['has'](C){return this['resources']['has'](C);}[x(0x167)](C){const m=x,N=this['resources']['get'](C);if(!N)throw new NotFoundError(m(0x168)+C);return N;}['list'](){return[...this['resources']['values']()];}['validate'](C){const Q=x;if(C[Q(0x169)]!==0x1||!ident['test'](C['name'])||!validQualified(C[Q(0x16a)])||!ident['test'](C['key']))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+C['name']);for(const [N,r]of Object[Q(0x16b)](C[Q(0x16c)])){if(!ident['test'](N)||!ident['test'](r['column']??N))throw new ValidationError('Invalid\x20resource\x20field:\x20'+N);}}}
1
+ const P=c;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';function c(J,e){J=J-0x134;const p=L();let b=p[J];return b;}const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(J){const b=c;return J['split']('.')[b(0x134)]<=0x2&&J['split']('.')[b(0x135)](e=>ident[b(0x136)](e));}export class ResourceRegistry{['resources']=new Map();['register'](J){const F=c;for(const e of Array[F(0x137)](J)?J:[J]){this[F(0x138)](e);if(this['resources']['has'](e[F(0x139)]))throw new ConflictError(F(0x13a)+e['name']);this['resources'][F(0x13b)](e['name'],e);}}[P(0x13c)](J){const h=P;return this[h(0x13d)]['has'](J);}['get'](J){const e=this['resources']['get'](J);if(!e)throw new NotFoundError('Resource\x20not\x20registered:\x20'+J);return e;}['list'](){return[...this['resources']['values']()];}[P(0x138)](J){const u=P;if(J['version']!==0x1||!ident['test'](J[u(0x139)])||!validQualified(J[u(0x13e)])||!ident[u(0x136)](J[u(0x13f)]))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+J['name']);for(const [e,p]of Object[u(0x140)](J['fields'])){if(!ident[u(0x136)](e)||!ident['test'](p[u(0x141)]??e))throw new ValidationError('Invalid\x20resource\x20field:\x20'+e);}}}function L(){const H=['length','every','test','isArray','validate','name','Resource\x20already\x20registered:\x20','set','has','resources','table','key','entries','column'];L=function(){return H;};return L();}