@opengis/fcore 0.0.1-beta.17 → 0.0.1-beta.18

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 (98) 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.d.ts.map +1 -1
  7. package/dist/fastify.js +1 -1
  8. package/dist/fcore.js +1 -1
  9. package/dist/migrations/cli.js +1 -1
  10. package/dist/migrations/runner.js +1 -1
  11. package/dist/modules/auth/adduser-cli.js +1 -1
  12. package/dist/modules/auth/passwd-cli.js +1 -1
  13. package/dist/modules/auth/permission-cli.js +1 -1
  14. package/dist/modules/auth/route.js +1 -1
  15. package/dist/modules/auth/schema.js +1 -1
  16. package/dist/modules/auth/services/change-password.js +1 -1
  17. package/dist/modules/auth/services/get-current-user.js +1 -1
  18. package/dist/modules/auth/services/registration.js +1 -1
  19. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  20. package/dist/modules/file/mime.js +1 -1
  21. package/dist/modules/file/route.js +1 -1
  22. package/dist/modules/file/schema.js +1 -1
  23. package/dist/modules/file/services/get-file.js +1 -1
  24. package/dist/modules/file/services/resize-file.js +1 -1
  25. package/dist/modules/file/services/upload-file.js +1 -1
  26. package/dist/modules/resource/route.js +1 -1
  27. package/dist/modules/resource/schema.js +1 -1
  28. package/dist/modules/resource/services/add-note.js +1 -1
  29. package/dist/modules/resource/services/add-resource-file.js +1 -1
  30. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  31. package/dist/modules/resource/services/create-resource.js +1 -1
  32. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  33. package/dist/modules/resource/services/delete-resource.js +1 -1
  34. package/dist/modules/resource/services/export-resource.js +1 -1
  35. package/dist/modules/resource/services/get-resource.js +1 -1
  36. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  37. package/dist/modules/resource/services/list-resources.js +1 -1
  38. package/dist/modules/resource/services/search-resource.js +1 -1
  39. package/dist/modules/resource/services/suggest-resource.js +1 -1
  40. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  41. package/dist/modules/resource/services/update-resource.js +1 -1
  42. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  43. package/dist/modules/system/route.js +1 -1
  44. package/dist/modules/system/schema.js +1 -1
  45. package/dist/modules/system/services/check-system.js +1 -1
  46. package/dist/modules/system/services/get-access.js +1 -1
  47. package/dist/modules/system/services/get-api-list.js +1 -1
  48. package/dist/modules/system/services/get-audit-log.js +1 -1
  49. package/dist/modules/system/services/get-dictionary.js +1 -1
  50. package/dist/modules/system/services/get-system-log.js +1 -1
  51. package/dist/modules/system/services/get-system-settings.js +1 -1
  52. package/dist/modules/system/services/list-dictionaries.js +1 -1
  53. package/dist/modules/system/services/set-access.js +1 -1
  54. package/dist/modules/system/services/update-dictionary.js +1 -1
  55. package/dist/modules/system/services/update-system-settings.js +1 -1
  56. package/dist/modules/utils/require-admin.js +1 -1
  57. package/dist/modules/utils/safe-user.js +1 -1
  58. package/dist/modules/utils/unsupported.js +1 -1
  59. package/dist/plugins/audit/audit.js +1 -1
  60. package/dist/plugins/audit/services/write-audit.js +1 -1
  61. package/dist/plugins/auth/get-user-permissions.js +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 +0 -3
  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.js +1 -1
  78. package/dist/plugins/resource/services/create-relation.js +1 -1
  79. package/dist/plugins/resource/services/create.js +1 -1
  80. package/dist/plugins/resource/services/delete-relation.js +1 -1
  81. package/dist/plugins/resource/services/delete.js +1 -1
  82. package/dist/plugins/resource/services/find-one.js +1 -1
  83. package/dist/plugins/resource/services/find-relation.js +1 -1
  84. package/dist/plugins/resource/services/find.js +1 -1
  85. package/dist/plugins/resource/services/update-relation.js +1 -1
  86. package/dist/plugins/resource/services/update.js +1 -1
  87. package/dist/plugins/resource/utils/auto-index.js +1 -1
  88. package/dist/plugins/resource/utils/fields.js +1 -1
  89. package/dist/plugins/resource/utils/filters.js +1 -1
  90. package/dist/plugins/resource/utils/permissions.js +1 -1
  91. package/dist/plugins/resource/utils/sort.d.ts +1 -1
  92. package/dist/plugins/resource/utils/sort.d.ts.map +1 -1
  93. package/dist/plugins/resource/utils/sort.js +1 -1
  94. package/dist/plugins/resource/utils/sql.js +1 -1
  95. package/dist/shared/getIP.js +1 -1
  96. package/migrations/20260903130000_move_notes_files_to_admin.sql +17 -17
  97. package/migrations/20260903140000_settings_nulls_not_distinct.sql +18 -18
  98. package/package.json +93 -93
@@ -1 +1 @@
1
- function u(i,n){i=i-0x68;const U=D();let O=U[i];return O;}function D(){const o=['\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\x20\x20'];D=function(){return o;};return D();}export async function addResourceFile(i,n){const O=u,U=await n['pg']['query'](O(0x68),[i['resource'],String(i['id']),i['filePath'],i['size']??null]);return U['rows'][0x0];}
1
+ export async function addResourceFile(d,X){const a=p,F=await X['pg'][a(0x1d5)]('\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\x20\x20',[d[a(0x1d6)],String(d['id']),d[a(0x1d7)],d[a(0x1d8)]??null]);return F[a(0x1d9)][0x0];}function p(d,X){d=d-0x1d5;const F=D();let a=F[d];return a;}function D(){const s=['query','resource','filePath','size','rows'];D=function(){return s;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x116;const U=D();let O=U[i];return O;}export async function createResourceRelation(i,n){const T=u,{resource:U,id:O,relation:o,data:I,user:X}=i;return n[T(0x116)]['createRelation']({'name':U,'id':O,'relation':o,'data':I,'user':X});}function D(){const R=['resource'];D=function(){return R;};return D();}
1
+ function D(){const f=['resource'];D=function(){return f;};return D();}function p(d,X){d=d-0x6a;const F=D();let a=F[d];return a;}export async function createResourceRelation(d,X){const q=p,{resource:F,id:a,relation:s,data:y,user:k}=d;return X[q(0x6a)]['createRelation']({'name':F,'id':a,'relation':s,'data':y,'user':k});}
@@ -1 +1 @@
1
- function u(i,n){i=i-0xdb;var U=D();var O=U[i];return O;}function D(){var O=['resource'];D=function(){return O;};return D();}export async function createResource(i,n){var U=u;return n['resource']['create']({'name':i[U(0xdb)],'data':i['data'],'user':i['user']});}
1
+ export async function createResource(d,X){return X['resource']['create']({'name':d['resource'],'data':d['data'],'user':d['user']});}
@@ -1 +1 @@
1
- function u(i,n){i=i-0xa7;const U=D();let O=U[i];return O;}export async function deleteResourceRelation(i,n){const X=u,{resource:U,id:O,relation:o,relationId:I}=i;return n['resource'][X(0xa7)]({'name':U,'id':O,'relation':o,'relationId':I});}function D(){const T=['deleteRelation'];D=function(){return T;};return D();}
1
+ export async function deleteResourceRelation(d,X){const {resource:F,id:a,relation:s,relationId:y}=d;return X['resource']['deleteRelation']({'name':F,'id':a,'relation':s,'relationId':y});}
@@ -1 +1 @@
1
- export async function deleteResource(i,n){var U=u;return n[U(0xf5)]['delete']({'name':i['resource'],'id':i['id'],'user':i['user']});}function u(i,n){i=i-0xf5;var U=D();var O=U[i];return O;}function D(){var O=['resource'];D=function(){return O;};return D();}
1
+ export async function deleteResource(d,X){return X['resource']['delete']({'name':d['resource'],'id':d['id'],'user':d['user']});}
@@ -1 +1 @@
1
- import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function D(){const o=['search','fields'];D=function(){return o;};return D();}function u(i,n){i=i-0x74;const U=D();let O=U[i];return O;}export async function exportResource(i,n){const O=u,U=await n['resource']['find']({'name':i['resource'],'query':{'filter':parseFilterQuery(i),'sort':i['sort'],'search':i[O(0x74)],'limit':i['limit'],'offset':i['offset'],'fields':i[O(0x75)]},'user':i['user']});return U['rows'];}
1
+ function D(){const s=['resource','find','sort'];D=function(){return s;};return D();}function p(d,X){d=d-0x1e8;const F=D();let a=F[d];return a;}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function exportResource(d,X){const a=p,F=await X[a(0x1e8)][a(0x1e9)]({'name':d['resource'],'query':{'filter':parseFilterQuery(d),'sort':d[a(0x1ea)],'search':d['search'],'limit':d['limit'],'offset':d['offset'],'fields':d['fields']},'user':d['user']});return F['rows'];}
@@ -1 +1 @@
1
- function u(i,n){i=i-0xd4;var U=D();var O=U[i];return O;}export async function getResource(i,n){var U=u;return n[U(0xd4)]['findOne']({'name':i['resource'],'id':i['id'],'query':{'include':i['include']},'user':i['user']});}function D(){var O=['resource'];D=function(){return O;};return D();}
1
+ function p(d,X){d=d-0x100;var F=D();var a=F[d];return a;}export async function getResource(d,X){var F=p;return X['resource'][F(0x100)]({'name':d['resource'],'id':d['id'],'query':{'include':d['include']},'user':d['user']});}function D(){var a=['findOne'];D=function(){return a;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x126;const U=D();let O=U[i];return O;}export async function listResourceRelation(i,n){const T=u,{resource:U,id:O,relation:o,query:I,user:X}=i;return n[T(0x126)]['findRelation']({'name':U,'id':O,'relation':o,'query':I,'user':X});}function D(){const R=['resource'];D=function(){return R;};return D();}
1
+ export async function listResourceRelation(d,X){const q=p,{resource:F,id:a,relation:s,query:y,user:k}=d;return X[q(0x161)]['findRelation']({'name':F,'id':a,'relation':s,'query':y,'user':k});}function p(d,X){d=d-0x161;const F=D();let a=F[d];return a;}function D(){const f=['resource'];D=function(){return f;};return D();}
@@ -1 +1 @@
1
- import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function listResources(i,n){var U=u;return n[U(0x16d)][U(0x16e)]({'name':i['resource'],'query':{'filter':parseFilterQuery(i),'sort':i[U(0x16f)],'search':i['search'],'limit':i['limit'],'offset':i['offset']??(i['page']?Math[U(0x170)](i['page']-0x1,0x0):0x0)*(i[U(0x171)]??0x14)},'user':i['user']});}function u(i,n){i=i-0x16d;var U=D();var O=U[i];return O;}function D(){var O=['resource','find','sort','max','limit'];D=function(){return O;};return D();}
1
+ import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function listResources(d,X){var F=p;return X['resource']['find']({'name':d['resource'],'query':{'filter':parseFilterQuery(d),'sort':d[F(0x1c6)],'search':d[F(0x1c7)],'limit':d['limit'],'offset':d['offset']??(d['page']?Math['max'](d['page']-0x1,0x0):0x0)*(d['limit']??0x14)},'user':d['user']});}function p(d,X){d=d-0x1c6;var F=D();var a=F[d];return a;}function D(){var a=['sort','search'];D=function(){return a;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0xa8;var U=D();var O=U[i];return O;}function D(){var O=['resource'];D=function(){return O;};return D();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function searchResource(i,n){var U=u;return n[U(0xa8)]['find']({'name':i['resource'],'query':{...i,'filter':parseFilterQuery(i)},'user':i['user']});}
1
+ function D(){var a=['find'];D=function(){return a;};return D();}function p(d,X){d=d-0x198;var F=D();var a=F[d];return a;}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';export async function searchResource(d,X){var F=p;return X['resource'][F(0x198)]({'name':d['resource'],'query':{...d,'filter':parseFilterQuery(d)},'user':d['user']});}
@@ -1 +1 @@
1
- function u(i,n){i=i-0xd6;const U=D();let O=U[i];return O;}import{ValidationError}from'../../../errors.js';function D(){const y=['resource','max','limit','fields','field','dictionary','lookup','table','text',')\x20~\x20$1\x20LIMIT\x20$2','get','code','length'];D=function(){return y;};return D();}import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(i,n){const M=u,U=n['resource']['get'](i[M(0xd6)]),O=String(i['search']??i['q']??'')['toLowerCase'](),o=Math['min'](Math[M(0xd7)](Number(i[M(0xd8)]??0x14),0x1),0xc8),I=Date['now'](),X=U[M(0xd9)][i[M(0xda)]],T=X?.[M(0xdb)],R=X?.[M(0xdc)]?.[M(0xdd)];if(R){const d=X['lookup']?.['text']??'name',L=X[M(0xdc)]?.['value']??'id';autoIndex(R,d,M(0xde),n['pg']);const h=await n['pg']['query']('SELECT\x20'+L+'\x20as\x20id,\x20'+d+'\x20as\x20text\x20FROM\x20'+R+'\x20WHERE\x20lower('+d+M(0xdf),[''+O['toLowerCase'](),o])['then'](q=>q['rows']);return{'limit':o,'count':h['length'],'search':O,'time':Date['now']()-I,'data':h};}if(!T)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+i['field']);const g=await n['dictionary'][M(0xe0)](T),k=g['filter'](q=>!O||q['code']['startsWith'](O)||q['name']['startsWith'](O))['slice'](0x0,o)['map'](q=>({'id':q[M(0xe1)]||q['id'],'text':q['name']||q['text']}));return{'search':O,'limit':o,'count':k[M(0xe2)],'time':Date['now']()-I,'data':k};}
1
+ import{ValidationError}from'../../../errors.js';function p(d,X){d=d-0x19c;const F=D();let a=F[d];return a;}import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';function D(){const J=['min','now','lookup','value','text','\x20as\x20id,\x20','\x20WHERE\x20lower(','length','get','slice','code'];D=function(){return J;};return D();}export async function suggestResource(d,X){const v=p,F=X['resource']['get'](d['resource']),a=String(d['search']??d['q']??'')['toLowerCase'](),s=Math[v(0x19c)](Math['max'](Number(d['limit']??0x14),0x1),0xc8),y=Date[v(0x19d)](),k=F['fields'][d['field']],q=k?.['dictionary'],f=k?.['lookup']?.['table'];if(f){const H=k[v(0x19e)]?.['text']??'name',T=k[v(0x19e)]?.[v(0x19f)]??'id';autoIndex(f,H,v(0x1a0),X['pg']);const W=await X['pg']['query']('SELECT\x20'+T+v(0x1a1)+H+'\x20as\x20text\x20FROM\x20'+f+v(0x1a2)+H+')\x20~\x20$1\x20LIMIT\x20$2',[''+a['toLowerCase'](),s])['then'](P=>P['rows']);return{'limit':s,'count':W[v(0x1a3)],'search':a,'time':Date['now']()-y,'data':W};}if(!q)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+d['field']);const G=await X['dictionary'][v(0x1a4)](q),b=G['filter'](P=>!a||P['code']['startsWith'](a)||P['name']['startsWith'](a))[v(0x1a5)](0x0,s)['map'](P=>({'id':P[v(0x1a6)]||P['id'],'text':P['name']||P[v(0x1a0)]}));return{'search':a,'limit':s,'count':b['length'],'time':Date[v(0x19d)]()-y,'data':b};}
@@ -1 +1 @@
1
- export async function updateResourceRelation(i,n){const {resource:U,id:O,relation:o,relationId:I,data:X,user:T}=i;return n['resource']['updateRelation']({'name':U,'id':O,'relation':o,'relationId':I,'data':X,'user':T});}
1
+ function p(d,X){d=d-0x96;const F=D();let a=F[d];return a;}function D(){const G=['updateRelation'];D=function(){return G;};return D();}export async function updateResourceRelation(d,X){const f=p,{resource:F,id:a,relation:s,relationId:y,data:k,user:q}=d;return X['resource'][f(0x96)]({'name':F,'id':a,'relation':s,'relationId':y,'data':k,'user':q});}
@@ -1 +1 @@
1
- function D(){var O=['patch'];D=function(){return O;};return D();}function u(i,n){i=i-0x9f;var U=D();var O=U[i];return O;}export async function updateResource(i,n){var U=u;return n['resource']['update']({'name':i['resource'],'id':i['id'],'data':i[U(0x9f)],'user':i['user']});}
1
+ function D(){var a=['resource','update'];D=function(){return a;};return D();}function p(d,X){d=d-0x16f;var F=D();var a=F[d];return a;}export async function updateResource(d,X){var F=p;return X[F(0x16f)][F(0x170)]({'name':d[F(0x16f)],'id':d['id'],'data':d['patch'],'user':d['user']});}
@@ -1 +1 @@
1
- function D(){const T=['user','type','Admin\x20access\x20required','permissions','includes','permission','name','file','File\x20is\x20required','fileName','replace','File\x20name\x20is\x20required','query'];D=function(){return T;};return D();}function u(i,n){i=i-0x123;const U=D();let O=U[i];return O;}import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';export async function uploadResourceFile(i,n){const X=u,U=n['resource']['get'](i['resource']);if(U['access']==='admin'&&i[X(0x123)]?.[X(0x124)]!=='admin')throw new ForbiddenError(X(0x125));if(i['user']?.[X(0x124)]!=='admin'&&!i['user']?.[X(0x126)]?.[X(0x127)]((U[X(0x128)]??U['name'])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(U[X(0x128)]??U[X(0x129)])+':update');if(!Buffer['isBuffer'](i[X(0x12a)])||i['file']['length']===0x0)throw new ValidationError(X(0x12b));const O=i[X(0x12c)][X(0x12d)](/[^A-Za-z0-9._-]/g,'_');if(!O)throw new ValidationError(X(0x12e));const o='files/'+i['resource']+'/'+String(i['id'])+'/'+O;await n['file']['put'](o,i['file']);if(!await n['file']['exists'](o))throw new NotFoundError('Uploaded\x20file\x20not\x20found');const I=await n['pg'][X(0x12f)]('\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',[i['resource'],String(i['id']),o,i['file']['length']]);return I['rows'][0x0];}
1
+ function D(){const q=['admin','includes','File\x20is\x20required','replace','resource','Uploaded\x20file\x20not\x20found','\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'];D=function(){return q;};return D();}import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';function p(d,X){d=d-0x1aa;const F=D();let a=F[d];return a;}export async function uploadResourceFile(d,X){const k=p,F=X['resource']['get'](d['resource']);if(F['access']===k(0x1aa)&&d['user']?.['type']!==k(0x1aa))throw new ForbiddenError('Admin\x20access\x20required');if(d['user']?.['type']!=='admin'&&!d['user']?.['permissions']?.[k(0x1ab)]((F['permission']??F['name'])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(F['permission']??F['name'])+':update');if(!Buffer['isBuffer'](d['file'])||d['file']['length']===0x0)throw new ValidationError(k(0x1ac));const a=d['fileName'][k(0x1ad)](/[^A-Za-z0-9._-]/g,'_');if(!a)throw new ValidationError('File\x20name\x20is\x20required');const s='files/'+d[k(0x1ae)]+'/'+String(d['id'])+'/'+a;await X['file']['put'](s,d['file']);if(!await X['file']['exists'](s))throw new NotFoundError(k(0x1af));const y=await X['pg']['query'](k(0x1b0),[d[k(0x1ae)],String(d['id']),s,d['file']['length']]);return y['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';function D(){const d=['/api/dictionary/:name','user','fcore','system','post','admin','access','body','system:settings','Update\x20system\x20settings','Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','get','/api/system/logger','Get\x20system\x20log','system:logs','query','send','system:check'];D=function(){return d;};return D();}import{getApiList}from'./services/get-api-list.js';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';import{systemSchemas}from'./schema.js';function i(u,n){u=u-0x198;const U=D();let O=U[u];return O;}const u=n=>n['user'];export function systemRoutes(n,U=new Map()){return async O=>{const g=i;O['get'](g(0x198),{'schema':{'tags':['fcore','system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':g(0x199),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async I=>({'items':await getDictionary({...I['params'],'user':u(I)},n)})),O['post']('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':'Update\x20platform\x20dictionary','description':'Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas['dictionaryItems']}},async I=>updateDictionary({...I['params'],...I['body'],'user':u(I)},n));const o=async I=>getAccess({...I['params'],'user':u(I)},n);O['get']('/api/access/:type/:id',{'schema':{'tags':[g(0x19a),g(0x19b)],'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']}},o),O[g(0x19c)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':g(0x19d),'permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas[g(0x19e)]}},async I=>setAccess({...I['params'],...I[g(0x19f)],'user':u(I)},n)),O['get']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':g(0x19d),'permissions':[g(0x1a0)]}},async I=>getSystemSettings({...I['params'],'user':u(I)},n)),O['post']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':g(0x1a1),'description':g(0x1a2),'access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async I=>updateSystemSettings({...I['params'],'patch':I[g(0x19f)],'user':u(I)},n)),O[g(0x1a3)](g(0x1a4),{'schema':{'tags':['fcore',g(0x19b)],'summary':g(0x1a5),'description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':'user','permissions':[g(0x1a6)],'querystring':systemSchemas['logger']}},async(I,X)=>{const k=g,{contentType:T,body:R}=await getSystemLog({...I[k(0x1a7)],'user':u(I)},n);return X['type'](T)[k(0x1a8)](R);}),O['get']('/api/system/audit',{'schema':{'tags':[g(0x19a),g(0x19b)],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':['system:audit']}},async I=>getAuditLog({...I['query'],'user':u(I)},n)),O['get']('/api/system/check',{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':'user','permissions':[g(0x1a9)]}},async I=>checkSystem({'user':u(I)},n)),O['get']('/api/system/list',{'schema':{'tags':['fcore',g(0x19b)],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async I=>getApiList({'user':u(I),'apiRoutes':U,...I['query']},n));};}
1
+ import{getSystemSettings}from'./services/get-system-settings.js';function D(){const b=['/api/dictionary/:name','dictionaryName','post','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','user','params','body','system','admin','system:access','fcore','Set\x20access\x20rules','Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','system:settings','/api/system/settings','/api/system/logger','Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','query','type','get','system:audit','system:check'];D=function(){return b;};return D();}import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';function p(d,X){d=d-0x199;const F=D();let a=F[d];return a;}import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';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';import{systemSchemas}from'./schema.js';const u=d=>d['user'];export function systemRoutes(d,X=new Map()){return async F=>{const f=p;F['get'](f(0x199),{'schema':{'tags':['fcore','system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas[f(0x19a)]}},async s=>({'items':await getDictionary({...s['params'],'user':u(s)},d)})),F[f(0x19b)]('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':'Update\x20platform\x20dictionary','description':f(0x19c),'access':f(0x19d),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas['dictionaryItems']}},async s=>updateDictionary({...s[f(0x19e)],...s[f(0x19f)],'user':u(s)},d));const a=async s=>getAccess({...s['params'],'user':u(s)},d);F['get']('/api/access/:type/:id',{'schema':{'tags':['fcore',f(0x1a0)],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':f(0x1a1),'permissions':[f(0x1a2)],'params':systemSchemas['accessTarget']}},a),F['post']('/api/access/:type/:id',{'schema':{'tags':[f(0x1a3),'system'],'summary':f(0x1a4),'description':f(0x1a5),'access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async s=>setAccess({...s['params'],...s['body'],'user':u(s)},d)),F['get']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':f(0x1a1),'permissions':[f(0x1a6)]}},async s=>getSystemSettings({...s['params'],'user':u(s)},d)),F['post'](f(0x1a7),{'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 s=>updateSystemSettings({...s['params'],'patch':s['body'],'user':u(s)},d)),F['get'](f(0x1a8),{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20log','description':f(0x1a9),'access':f(0x19d),'permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(s,y)=>{const G=f,{contentType:k,body:q}=await getSystemLog({...s[G(0x1aa)],'user':u(s)},d);return y[G(0x1ab)](k)['send'](q);}),F[f(0x1ac)]('/api/system/audit',{'schema':{'tags':['fcore',f(0x1a0)],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':f(0x19d),'permissions':[f(0x1ad)]}},async s=>getAuditLog({...s['query'],'user':u(s)},d)),F[f(0x1ac)]('/api/system/check',{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':'user','permissions':[f(0x1ae)]}},async s=>checkSystem({'user':u(s)},d)),F['get']('/api/system/list',{'schema':{'tags':['fcore','system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async s=>getApiList({'user':u(s),'apiRoutes':X,...s['query']},d));};}
@@ -1 +1 @@
1
- function D(){const n=['Object','Optional','Union','Number','Literal','Array','^[A-Za-z0-9_.\x5c-/]*$'];D=function(){return n;};return D();}function u(i,n){i=i-0xaa;const U=D();let O=U[i];return O;}const i=u;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[i(0xaa)]({'name':identifier}),'dictionaryItems':Type['Object']({'items':Type['Array'](Type['Object']({'id':Type[i(0xab)](Type[i(0xac)]([Type['String'](),Type[i(0xad)]()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type[i(0xab)](Type[i(0xac)]([Type['String'](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal']('user'),Type[i(0xae)]('role')]),'id':identifier}),'access':Type['Object']({'access':Type[i(0xaf)](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type[i(0xac)]([Type['Literal']('short'),Type['Literal']('extended')]))}),'settingsEntity':Type[i(0xaa)]({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type['Unknown']()),'logger':Type[i(0xaa)]({'path':Type[i(0xab)](Type['String']({'maxLength':0x100,'pattern':i(0xb0)}))})};
1
+ const d=p;function p(d,X){d=d-0xb9;const F=D();let a=F[d];return a;}import{Type}from'@sinclair/typebox';function D(){const X=['Object','Union','String','Optional','Null','Literal','Record','Unknown'];D=function(){return X;};return D();}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[d(0xb9)]({'name':identifier}),'dictionaryItems':Type['Object']({'items':Type['Array'](Type['Object']({'id':Type['Optional'](Type[d(0xba)]([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type[d(0xbb)]({'minLength':0x1}),'parentId':Type[d(0xbc)](Type['Union']([Type[d(0xbb)](),Type['Number'](),Type[d(0xbd)]()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type[d(0xba)]([Type[d(0xbe)]('user'),Type['Literal']('role')]),'id':identifier}),'access':Type[d(0xb9)]({'access':Type['Array'](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type['Union']([Type['Literal']('short'),Type['Literal']('extended')]))}),'settingsEntity':Type[d(0xb9)]({'entity':Type[d(0xbc)](identifier)}),'settings':Type[d(0xbf)](Type['String']({'minLength':0x1}),Type[d(0xc0)]()),'logger':Type['Object']({'path':Type[d(0xbc)](Type[d(0xbb)]({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
@@ -1 +1 @@
1
- function D(){const I=['redis','ping'];D=function(){return I;};return D();}function u(i,n){i=i-0x1aa;const U=D();let O=U[i];return O;}export async function checkSystem(i,n){const o=u,[U,O]=await Promise['allSettled']([n['pg']['query']('SELECT\x201'),n[o(0x1aa)][o(0x1ab)]()]);return{'status':U['status']==='fulfilled'&&O['status']==='fulfilled'?'ok':'degraded','pg':U['status'],'redis':O['status']};}
1
+ function p(d,X){d=d-0x14f;const F=D();let a=F[d];return a;}export async function checkSystem(d,X){const s=p,[F,a]=await Promise['allSettled']([X['pg'][s(0x14f)]('SELECT\x201'),X[s(0x150)]['ping']()]);return{'status':F['status']==='fulfilled'&&a[s(0x151)]==='fulfilled'?'ok':'degraded','pg':F['status'],'redis':a['status']};}function D(){const y=['query','redis','status'];D=function(){return y;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x109;const U=D();let O=U[i];return O;}function D(){const I=['user'];D=function(){return I;};return D();}export async function getAccess(i,n){const o=u,U=i['type']===o(0x109)?'\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',O=await n['pg']['query'](U,[i['id']]);return{'access':O['rows']};}
1
+ function p(d,X){d=d-0xd6;const F=D();let a=F[d];return a;}export async function getAccess(d,X){const s=p,F=d['type']===s(0xd6)?'\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',a=await X['pg']['query'](F,[d['id']]);return{'access':a['rows']};}function D(){const y=['user'];D=function(){return y;};return D();}
@@ -1 +1 @@
1
- function D(){const R=['sort','method','localeCompare','endpoint','short','map'];D=function(){return R;};return D();}function u(i,n){i=i-0xd2;const U=D();let O=U[i];return O;}export async function getApiList(i,n){const T=u,U=[...i['apiRoutes']['values']()][T(0xd2)]((O,o)=>(O['endpoint']+'\x20'+O[T(0xd3)])[T(0xd4)](o[T(0xd5)]+'\x20'+o['method']));if(i['format']!==T(0xd6))return U;return U[T(0xd7)](({method:O,endpoint:o,access:I,permissions:X})=>O+'\x20'+o);}
1
+ export async function getApiList(d,X){const q=p,F=[...d['apiRoutes']['values']()][q(0x106)]((a,s)=>(a['endpoint']+'\x20'+a['method'])['localeCompare'](s[q(0x107)]+'\x20'+s['method']));if(d['format']!=='short')return F;return F['map'](({method:a,endpoint:s,access:y,permissions:k})=>a+'\x20'+s);}function p(d,X){d=d-0x106;const F=D();let a=F[d];return a;}function D(){const f=['sort','endpoint'];D=function(){return f;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x12f;const U=D();let O=U[i];return O;}function D(){const X=['min','query','rows'];D=function(){return X;};return D();}export async function getAuditLog(i,n){const I=u,U=Math[I(0x12f)](Math['max'](i['limit']??0x32,0x1),0xc8),O=Math['max']((i['page']??0x1)-0x1,0x0)*U,o=await n['pg'][I(0x130)]('SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[U,O]);return{'rows':o[I(0x131)],'page':i['page']??0x1,'limit':U};}
1
+ function p(d,X){d=d-0xe3;const F=D();let a=F[d];return a;}function D(){const k=['max','query','SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2','rows'];D=function(){return k;};return D();}export async function getAuditLog(d,X){const y=p,F=Math['min'](Math['max'](d['limit']??0x32,0x1),0xc8),a=Math[y(0xe3)]((d['page']??0x1)-0x1,0x0)*F,s=await X['pg'][y(0xe4)](y(0xe5),[F,a]);return{'rows':s[y(0xe6)],'page':d['page']??0x1,'limit':F};}
@@ -1 +1 @@
1
- function D(){var O=['dictionary'];D=function(){return O;};return D();}function u(i,n){i=i-0x159;var U=D();var O=U[i];return O;}export async function getDictionary(i,n){var U=u;return n[U(0x159)]['get'](i['name']);}
1
+ export async function getDictionary(d,X){var F=p;return X['dictionary']['get'](d[F(0x137)]);}function p(d,X){d=d-0x137;var F=D();var a=F[d];return a;}function D(){var a=['name'];D=function(){return a;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x15a;const U=D();let O=U[i];return O;}const q=u;import i from'node:fs/promises';import n from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';function D(){const l=['resolve','cwd','map','name','directory','size','split','unshift','text/html;\x20charset=utf-8','join','logs/','</title></head>\x0a<body>\x0a<h1>','replace','&amp;','&lt;','open','close'];D=function(){return l;};return D();}const LOGS_ROOT=n[q(0x15a)](process[q(0x15b)](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(U,O){const M=q,o=normalizePath(U['path']),I=n['resolve'](LOGS_ROOT,o);if(I!==LOGS_ROOT&&!I['startsWith'](LOGS_ROOT+n['sep']))throw new ValidationError('Invalid\x20log\x20path');const X=await i['stat'](I)['catch'](()=>null);if(!X)throw new NotFoundError('Log\x20path\x20not\x20found');if(X['isDirectory']()){const R=await i['readdir'](I,{'withFileTypes':!![]}),g=await Promise['all'](R[M(0x15c)](async k=>{const y=M,d=await i['stat'](n['join'](I,k[y(0x15d)]));return{'name':k['name'],'path':o?o+'/'+k['name']:k[y(0x15d)],'type':k['isDirectory']()?y(0x15e):'file','size':k['isDirectory']()?undefined:d[y(0x15f)],'modified':d['mtime']['toISOString']()};}));g['sort']((k,d)=>k['name']['localeCompare'](d['name']));if(o){const k=o[M(0x160)]('/')['slice'](0x0,-0x1)['join']('/');g[M(0x161)]({'name':'..','path':k,'type':'directory'});}return{'contentType':M(0x162),'body':renderDirectory(o,g)};}const T=await tailFile(I,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':T['join']('\x0a')};}function renderDirectory(U,O){const b=q,o=O['map'](X=>{const Z=u,T='?path='+encodeURIComponent(X['path']),R=X['type']===Z(0x15e)?X[Z(0x15d)]+'/':X[Z(0x15d)];return'<li><a\x20href=\x22'+T+'\x22>'+escapeHtml(R)+'</a></li>';})[b(0x163)]('\x0a'),I=escapeHtml(b(0x164)+U);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+I+b(0x165)+I+'</h1>\x0a<ul>\x0a'+o+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(U){const c=q;return U[c(0x166)](/&/g,c(0x167))[c(0x166)](/</g,c(0x168))['replace'](/>/g,'&gt;')['replace'](/"/g,'&quot;');}function normalizePath(U){const A=q,O=(U??'')[A(0x166)](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(O[A(0x160)]('/')['some'](o=>o==='..'))throw new ValidationError('Invalid\x20log\x20path');return O;}async function tailFile(U,O){const K=q,o=await i[K(0x169)](U,'r');try{const {size:I}=await o['stat'](),X=0x40*0x400;let T=I,R=Buffer['alloc'](0x0),g=0x0;while(T>0x0&&g<=O){const d=Math['min'](X,T);T-=d;const L=Buffer['alloc'](d);await o['read'](L,0x0,d,T),R=Buffer['concat']([L,R]),g+=countNewlines(L);}const k=R['toString']('utf8')[K(0x160)]('\x0a')['filter'](h=>h['length']>0x0);return k['slice'](-O)['reverse']();}finally{await o[K(0x16a)]();}}function countNewlines(U){let O=0x0;for(const o of U){if(o===0xa)O++;}return O;}
1
+ function p(d,X){d=d-0x7f;const F=D();let a=F[d];return a;}import d from'node:fs/promises';import X from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';function D(){const U=['resolve','sep','stat','all','name','mtime','toISOString','split','text/html;\x20charset=utf-8','text/plain;\x20charset=utf-8','map','?path=','path','type','logs/','<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>','</title></head>\x0a<body>\x0a<h1>','</h1>\x0a<ul>\x0a','replace','&quot;','some','open','alloc','read','filter'];D=function(){return U;};return D();}const LOGS_ROOT=X['resolve'](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(F,a){const P=p,s=normalizePath(F['path']),y=X[P(0x7f)](LOGS_ROOT,s);if(y!==LOGS_ROOT&&!y['startsWith'](LOGS_ROOT+X[P(0x80)]))throw new ValidationError('Invalid\x20log\x20path');const k=await d[P(0x81)](y)['catch'](()=>null);if(!k)throw new NotFoundError('Log\x20path\x20not\x20found');if(k['isDirectory']()){const f=await d['readdir'](y,{'withFileTypes':!![]}),G=await Promise[P(0x82)](f['map'](async b=>{const v=P,H=await d[v(0x81)](X['join'](y,b['name']));return{'name':b['name'],'path':s?s+'/'+b['name']:b[v(0x83)],'type':b['isDirectory']()?'directory':'file','size':b['isDirectory']()?undefined:H['size'],'modified':H[v(0x84)][v(0x85)]()};}));G['sort']((H,T)=>H[P(0x83)]['localeCompare'](T['name']));if(s){const b=s[P(0x86)]('/')['slice'](0x0,-0x1)['join']('/');G['unshift']({'name':'..','path':b,'type':'directory'});}return{'contentType':P(0x87),'body':renderDirectory(s,G)};}const q=await tailFile(y,TAIL_LINES);return{'contentType':P(0x88),'body':q['join']('\x0a')};}function renderDirectory(F,a){const J=p,s=a[J(0x89)](k=>{const R=J,q=R(0x8a)+encodeURIComponent(k[R(0x8b)]),f=k[R(0x8c)]==='directory'?k['name']+'/':k[R(0x83)];return'<li><a\x20href=\x22'+q+'\x22>'+escapeHtml(f)+'</a></li>';})['join']('\x0a'),y=escapeHtml(J(0x8d)+F);return J(0x8e)+y+J(0x8f)+y+J(0x90)+s+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(F){const V=p;return F[V(0x91)](/&/g,'&amp;')['replace'](/</g,'&lt;')[V(0x91)](/>/g,'&gt;')['replace'](/"/g,V(0x92));}function normalizePath(F){const M=p,a=(F??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(a['split']('/')[M(0x93)](s=>s==='..'))throw new ValidationError('Invalid\x20log\x20path');return a;}async function tailFile(F,a){const z=p,s=await d[z(0x94)](F,'r');try{const {size:y}=await s[z(0x81)](),k=0x40*0x400;let q=y,f=Buffer['alloc'](0x0),G=0x0;while(q>0x0&&G<=a){const H=Math['min'](k,q);q-=H;const T=Buffer[z(0x95)](H);await s[z(0x96)](T,0x0,H,q),f=Buffer['concat']([T,f]),G+=countNewlines(T);}const b=f['toString']('utf8')['split']('\x0a')[z(0x97)](W=>W['length']>0x0);return b['slice'](-a)['reverse']();}finally{await s['close']();}}function countNewlines(F){let a=0x0;for(const s of F){if(s===0xa)a++;}return a;}
@@ -1 +1 @@
1
- export async function getSystemSettings(i,n){const U=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 U['rows']['reduce']((O,o)=>{const I=String(o['key'])['split']('.');let X=O;for(const T of I['slice'](0x0,-0x1)){X[T]??={},X=X[T];}return X[I['at'](-0x1)]=o['value'],O;},{});}
1
+ function p(d,X){d=d-0x11b;const F=D();let a=F[d];return a;}function D(){const b=['rows','slice'];D=function(){return b;};return D();}export async function getSystemSettings(d,X){const f=p,F=await X['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 F[f(0x11b)]['reduce']((a,s)=>{const G=f,y=String(s['key'])['split']('.');let k=a;for(const q of y[G(0x11c)](0x0,-0x1)){k[q]??={},k=k[q];}return k[y['at'](-0x1)]=s['value'],a;},{});}
@@ -1 +1 @@
1
- function D(){var O=['dictionary','list'];D=function(){return O;};return D();}function u(i,n){i=i-0x17c;var U=D();var O=U[i];return O;}export async function listDictionaries(i,n){var U=u;return n[U(0x17c)][U(0x17d)]();}
1
+ export async function listDictionaries(d,X){return X['dictionary']['list']();}
@@ -1 +1 @@
1
- function D(){const X=['user','access','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)','query','actions'];D=function(){return X;};return D();}function u(i,n){i=i-0xbb;const U=D();let O=U[i];return O;}import{getAccess}from'./get-access.js';export async function setAccess(i,n){const I=u,U=await n['pg']['connect']();try{await U['query']('BEGIN');i['type']===I(0xbb)?await U['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL',[i['id']]):await U['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[i['id']]);for(const O of i[I(0xbc)]){i['type']===I(0xbb)?await U['query'](I(0xbd),[O['resource'],O['actions'],i['id'],i[I(0xbb)]['id'],i['user']['id']]):await U[I(0xbe)]('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)',[O['resource'],O[I(0xbf)],i['id'],i[I(0xbb)]['id'],i['user']['id']]);}await U['query']('COMMIT');}catch(o){await U['query']('ROLLBACK');throw o;}finally{U['release']();}return getAccess(i,n);}
1
+ function p(d,X){d=d-0x79;const F=D();let a=F[d];return a;}function D(){const k=['user','query','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)','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)','actions'];D=function(){return k;};return D();}import{getAccess}from'./get-access.js';export async function setAccess(d,X){const y=p,F=await X['pg']['connect']();try{await F['query']('BEGIN');d['type']===y(0x79)?await F['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL',[d['id']]):await F[y(0x7a)]('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[d['id']]);for(const a of d['access']){d['type']==='user'?await F['query'](y(0x7b),[a['resource'],a['actions'],d['id'],d[y(0x79)]['id'],d['user']['id']]):await F['query'](y(0x7c),[a['resource'],a[y(0x7d)],d['id'],d[y(0x79)]['id'],d[y(0x79)]['id']]);}await F[y(0x7a)]('COMMIT');}catch(s){await F['query']('ROLLBACK');throw s;}finally{F['release']();}return getAccess(d,X);}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x93;var U=D();var O=U[i];return O;}export async function updateDictionary(i,n){var U=u;return await n['dictionary'][U(0x93)](i['name'],i[U(0x94)]),{'success':!![]};}function D(){var O=['put','items'];D=function(){return O;};return D();}
1
+ export async function updateDictionary(d,X){var F=p;return await X['dictionary'][F(0x65)](d['name'],d['items']),{'success':!![]};}function p(d,X){d=d-0x65;var F=D();var a=F[d];return a;}function D(){var a=['put'];D=function(){return a;};return D();}
@@ -1 +1 @@
1
- function D(){const I=['patch','query'];D=function(){return I;};return D();}import{ValidationError}from'../../../errors.js';function u(i,n){i=i-0xcd;const U=D();let O=U[i];return O;}export async function updateSystemSettings(i,n){const o=u;if(!Object['keys'](i['patch'])['length'])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [U,O]of Object['entries'](i[o(0xcd)])){if(!U['trim']()||U['includes']('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+U);await n['pg'][o(0xce)]('\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',[U,JSON['stringify'](O),i['user']['id']]);}return{'success':!![]};}
1
+ function p(d,X){d=d-0xc4;const F=D();let a=F[d];return a;}function D(){const y=['keys','Settings\x20patch\x20is\x20empty','trim','includes'];D=function(){return y;};return D();}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(d,X){const s=p;if(!Object[s(0xc4)](d['patch'])['length'])throw new ValidationError(s(0xc5));for(const [F,a]of Object['entries'](d['patch'])){if(!F[s(0xc6)]()||F[s(0xc7)]('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+F);await X['pg']['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',[F,JSON['stringify'](a),d['user']['id']]);}return{'success':!![]};}
@@ -1 +1 @@
1
- function D(){var O=['User\x20required','Admin\x20access\x20required'];D=function(){return O;};return D();}import{ForbiddenError}from'../../errors.js';function u(i,n){i=i-0xf0;var U=D();var O=U[i];return O;}export function requireAdmin(i,n){var U=u;if(!i)throw new ForbiddenError(U(0xf0));if(i['type']!=='admin')throw new ForbiddenError(U(0xf1));if(i['type']!=='admin'&&n&&!i['permissions']?.['includes'](n))throw new ForbiddenError('Missing\x20permission:\x20'+n);}
1
+ import{ForbiddenError}from'../../errors.js';function p(d,X){d=d-0xe5;var F=D();var a=F[d];return a;}function D(){var a=['Admin\x20access\x20required','type','admin','permissions','Missing\x20permission:\x20'];D=function(){return a;};return D();}export function requireAdmin(d,X){var F=p;if(!d)throw new ForbiddenError('User\x20required');if(d['type']!=='admin')throw new ForbiddenError(F(0xe5));if(d[F(0xe6)]!==F(0xe7)&&X&&!d[F(0xe8)]?.['includes'](X))throw new ForbiddenError(F(0xe9)+X);}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x1c1;const U=D();let O=U[i];return O;}function D(){const I=['password','salt','entries'];D=function(){return I;};return D();}export const safeUser=i=>{const o=u,n=[o(0x1c1),o(0x1c2),'secret','credentials'];return Object['fromEntries'](Object[o(0x1c3)](i)['filter'](([U])=>!n['some'](O=>U['toLowerCase']()['includes'](O))));};
1
+ function p(d,X){d=d-0x14f;const F=D();let a=F[d];return a;}export const safeUser=d=>{const s=p,X=['password','salt','secret','credentials'];return Object['fromEntries'](Object['entries'](d)[s(0x14f)](([F])=>!X[s(0x150)](a=>F['toLowerCase']()[s(0x151)](a))));};function D(){const y=['filter','some','includes'];D=function(){return y;};return D();}
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../errors.js';export function unsupported(i){throw new UnsupportedError(i+'\x20requires\x20a\x20project/provider\x20implementation');}
1
+ import{UnsupportedError}from'../../errors.js';export function unsupported(d){throw new UnsupportedError(d+'\x20requires\x20a\x20project/provider\x20implementation');}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(i){const n=writeAudit(i);return{'write':n};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(d){const X=writeAudit(d);return{'write':X};}
@@ -1 +1 @@
1
- const secretPattern=/password|token|secret|credential|salt/i;function u(i,n){i=i-0x152;const U=D();let O=U[i];return O;}function clean(i){const g=u;if(Array['isArray'](i))return i[g(0x152)](clean);if(i&&typeof i==='object')return Object['fromEntries'](Object['entries'](i)['map'](([n,U])=>[n,secretPattern[g(0x153)](n)?'[REDACTED]':clean(U)]));return i;}function D(){const L=['map','test','Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled','info','empty\x20pg','resourceId','query','field','oldValue'];D=function(){return L;};return D();}export function writeAudit(i){let n,U;async function O(){if(!i['pg'])return![];if(n!==undefined)return n;return U??=i['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'](o=>{const k=u,I=new Set(o['rows']['map'](X=>X['table_name']));return n=I['has']('audit_log')&&I['has']('audit_log_data'),!n&&i['logger']['warn']({'expectedTables':['admin.audit_log','admin.audit_log_data'],'foundTables':[...I]},k(0x154)),n;})['catch'](o=>{return n=![],i['logger']['warn']({'err':o},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),U;}return async function o(I){const d=u;if(!await O())return i['logger'][d(0x155)]({'auditFallback':!![],'event':clean({...I,'changes':I['changes']?.['map'](R=>({...R,'oldValue':clean(R['oldValue']),'newValue':clean(R['newValue'])}))})},'audit'),0x0;if(!i['pg'])throw new Error(d(0x156));const X=await i['pg']['query']('\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',[I['userId']??null,I['module'],I['resource'],I['resourceId']==null?null:String(I[d(0x157)]),I['fields']??null,I['action'],I['requestId']??null,I['ipAddress']??null,clean(I['metadata']??{})]),T=X['rows'][0x0]['id'];for(const R of I['changes']??[]){if(secretPattern['test'](R['field']))continue;await i['pg'][d(0x158)]('\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',[T,R[d(0x159)],JSON['stringify'](clean(R[d(0x15a)])),JSON['stringify'](clean(R['newValue']))]);}return T;};}
1
+ const secretPattern=/password|token|secret|credential|salt/i;function clean(d){const G=p;if(Array['isArray'](d))return d['map'](clean);if(d&&typeof d==='object')return Object[G(0x16f)](Object['entries'](d)['map'](([X,F])=>[X,secretPattern['test'](X)?'[REDACTED]':clean(F)]));return d;}export function writeAudit(d){let X,F;async function a(){const b=p;if(!d['pg'])return![];if(X!==undefined)return X;return F??=d['pg']['query'](b(0x170))['then'](s=>{const H=b,y=new Set(s['rows']['map'](k=>k[H(0x171)]));return X=y[H(0x172)](H(0x173))&&y[H(0x172)]('audit_log_data'),!X&&d['logger']['warn']({'expectedTables':['admin.audit_log',H(0x174)],'foundTables':[...y]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),X;})['catch'](s=>{return X=![],d['logger']['warn']({'err':s},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),F;}return async function s(y){const T=p;if(!await a())return d['logger'][T(0x175)]({'auditFallback':!![],'event':clean({...y,'changes':y['changes']?.['map'](f=>({...f,'oldValue':clean(f['oldValue']),'newValue':clean(f[T(0x176)])}))})},'audit'),0x0;if(!d['pg'])throw new Error('empty\x20pg');const k=await d['pg']['query']('\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',[y['userId']??null,y['module'],y['resource'],y[T(0x177)]==null?null:String(y['resourceId']),y['fields']??null,y['action'],y['requestId']??null,y[T(0x178)]??null,clean(y[T(0x179)]??{})]),q=k['rows'][0x0]['id'];for(const f of y[T(0x17a)]??[]){if(secretPattern['test'](f['field']))continue;await d['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',[q,f['field'],JSON['stringify'](clean(f['oldValue'])),JSON['stringify'](clean(f['newValue']))]);}return q;};}function p(d,X){d=d-0x16f;const F=D();let a=F[d];return a;}function D(){const W=['fromEntries','\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','audit_log','admin.audit_log_data','info','newValue','resourceId','ipAddress','metadata','changes'];D=function(){return W;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x168;const U=D();let O=U[i];return O;}export async function getUserPermissions(i,n){const o=u,U=await n['pg']['query'](o(0x168),[i]);return U['rows']['map'](O=>O[o(0x169)]);}function D(){const I=['\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','permission'];D=function(){return I;};return D();}
1
+ function p(d,X){d=d-0x13c;const F=D();let a=F[d];return a;}export async function getUserPermissions(d,X){const s=p,F=await X['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',[d]);return F['rows'][s(0x13c)](a=>a[s(0x13d)]);}function D(){const y=['map','permission'];D=function(){return y;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x1b5;const U=D();let O=U[i];return O;}export*from'./auth.types.js';import{randomBytes,scrypt as i,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(i);import n from'@fastify/cookie';import U from'@fastify/session';import{Authenticator}from'@fastify/passport';import O from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();function D(){const y=['scrypt$','toString','split','from','length','warn','Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation','register','auth','cookieName','user'];D=function(){return y;};return D();}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(o){const L=u,I=randomBytes(0x10),X=await scrypt(o,I,0x40);return L(0x1b5)+I[L(0x1b6)]('hex')+'$'+X['toString']('hex');}export async function verifyPassword(o,I){const h=u,[X,T,R]=I?.[h(0x1b7)]('$')||[];if(X!=='scrypt'||!T||!R)return![];const g=Buffer['from'](T,'hex'),k=Buffer[h(0x1b8)](R,'hex'),d=await scrypt(o,g,k[h(0x1b9)]);return timingSafeEqual(d,k);}export async function createSessionStore(o,I){const q=u,{config:X,redis:T}=I;if(!X||!T){console[q(0x1ba)](q(0x1bb));return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await o['register'](n,{'parseOptions':X['auth']['cookieOptions']}),await o[q(0x1bc)](U,{'secret':X['auth']['secret'],'cookieName':X['auth']['cookieName'],'cookie':X[q(0x1bd)]['cookieOptions'],'store':new O({'prefix':X['auth'][q(0x1be)]+':'+(X['pg']?.['database']||'db')+':','client':T})}),await o['register'](fastifyPassport['initialize']()),await o['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async R=>({'user':R})),fastifyPassport['registerUserDeserializer'](async R=>{const M=q,g=R?.[M(0x1bf)]||R;return g?.['id']&&(g['permissions']=await getUserPermissions(g['id'],I)),g;});}
1
+ export*from'./auth.types.js';import{randomBytes,scrypt as d,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(d);import X from'@fastify/cookie';function p(d,X){d=d-0x19e;const F=D();let a=F[d];return a;}import F from'@fastify/session';import{Authenticator}from'@fastify/passport';function D(){const v=['scrypt$','toString','hex','scrypt','length','auth','cookieOptions','secret','database','register','secureSession','registerUserDeserializer'];D=function(){return v;};return D();}import a 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(s){const T=p,y=randomBytes(0x10),k=await scrypt(s,y,0x40);return T(0x19e)+y[T(0x19f)](T(0x1a0))+'$'+k[T(0x19f)]('hex');}export async function verifyPassword(s,y){const W=p,[k,q,f]=y?.['split']('$')||[];if(k!==W(0x1a1)||!q||!f)return![];const G=Buffer['from'](q,'hex'),b=Buffer['from'](f,W(0x1a0)),H=await scrypt(s,G,b[W(0x1a2)]);return timingSafeEqual(H,b);}export async function createSessionStore(s,y){const P=p,{config:k,redis:q}=y;if(!k||!q){console['warn']('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await s['register'](X,{'parseOptions':k[P(0x1a3)][P(0x1a4)]}),await s['register'](F,{'secret':k['auth'][P(0x1a5)],'cookieName':k[P(0x1a3)]['cookieName'],'cookie':k[P(0x1a3)]['cookieOptions'],'store':new a({'prefix':k[P(0x1a3)]['cookieName']+':'+(k['pg']?.[P(0x1a6)]||'db')+':','client':q})}),await s[P(0x1a7)](fastifyPassport['initialize']()),await s['register'](fastifyPassport[P(0x1a8)]()),fastifyPassport['registerUserSerializer'](async f=>({'user':f})),fastifyPassport[P(0x1a9)](async f=>{const G=f?.['user']||f;return G?.['id']&&(G['permissions']=await getUserPermissions(G['id'],y)),G;});}
@@ -1 +1 @@
1
- import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';function D(){const d=['not\x20enough\x20params:\x20password','query','info','password_hash'];D=function(){return d;};return D();}function u(i,n){i=i-0x100;const U=D();let O=U[i];return O;}export async function verifyUser({user:i,password:n,ip:U},{pg:O,logger:o}){const k=u;if(!i||i==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!n||n==='')throw new BadRequestError(k(0x100));o['metrics']('user.login');const I='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',X=await O[k(0x101)](I,[i])['then'](R=>R['rows']?.[0x0]);if(!X){const R='user\x20not\x20found';o['info']({'file':'auth/warn','error':R,'user':i,'ip':U});throw new BadRequestError(R);}const T=await verifyPassword(n,X['password_hash']);if(!T){const g='Wrong\x20password';o[k(0x102)]({'file':'auth/warn','error':g,'user':i,'ip':U});throw new BadRequestError(g);}return delete X[k(0x103)],X;}
1
+ function D(){const H=['auth/warn'];D=function(){return H;};return D();}import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';function p(d,X){d=d-0x97;const F=D();let a=F[d];return a;}export async function verifyUser({user:d,password:X,ip:F},{pg:a,logger:s}){const b=p;if(!d||d==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!X||X==='')throw new BadRequestError('not\x20enough\x20params:\x20password');s['metrics']('user.login');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',k=await a['query'](y,[d])['then'](f=>f['rows']?.[0x0]);if(!k){const f='user\x20not\x20found';s['info']({'file':'auth/warn','error':f,'user':d,'ip':F});throw new BadRequestError(f);}const q=await verifyPassword(X,k['password_hash']);if(!q){const G='Wrong\x20password';s['info']({'file':b(0x97),'error':G,'user':d,'ip':F});throw new BadRequestError(G);}return delete k['password_hash'],k;}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x16d;const U=D();let O=U[i];return O;}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';function D(){const F=['table_name','Invalid\x20dictionary\x20name:\x20','code','has','Dictionary\x20already\x20registered:\x20','set','checked','query','Dictionary\x20not\x20found:\x20','BEGIN','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','name','parentId','delete','get','values','map'];D=function(){return F;};return D();}const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:i,dictionaries:dictionaries=[]}){const n=new Map(),U=new Map();let O,o;async function I(){if(O!==undefined)return O;if(!i)throw new Error('empty\x20pg');return o??=i['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](q=>{const l=u,M=q['rows'][0x0]?.[l(0x16d)];O=M==='dictionaries'?M:null;}),await o,O;}function X(q){const x=u;if(!dictionaryName['test'](q))throw new ValidationError(x(0x16e)+q);}function T(q){const V=u;for(const M of Array['isArray'](q)?q:[q]){X(M['code']);if(!Array['isArray'](M['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+M[V(0x16f)]);if(n[V(0x170)](M[V(0x16f)]))throw new ConflictError(V(0x171)+M[V(0x16f)]);n[V(0x172)](M[V(0x16f)],{...M,'source':'static'});}}function R(q){const f=u;return n[f(0x170)](q);}async function g(q){const s=u;X(q);const M=n['get'](q);if(M&&M[s(0x173)])return M['items'];const y=await I();if(!y)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const Z=await i?.[s(0x174)]('\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(Z?.['rows']?.['length']){const b=Z?.['rows'];return n['set'](q,{'code':q,'name':q,'items':b,'source':'database','checked':!![]}),b;}if(!M?.['items'])throw new NotFoundError(s(0x175)+q);return M['checked']=!![],M['items'];}async function k(q,M){const t=u;X(q);if(!Array['isArray'](M))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const y=await I();if(!y)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!i)throw new Error('empty\x20pg');const Z=await i['connect']();try{await Z['query'](t(0x176));const b=await Z['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,'fcore','custom',!![]]),c=b['rows'][0x0]['id'];await Z['query'](t(0x177),[c]);for(const A of M){await Z['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',[c,A['code'],A[t(0x178)],A[t(0x179)]??null]);}await Z['query']('COMMIT');}catch(K){await Z['query']('ROLLBACK');throw K;}finally{Z['release']();}n['set'](q,{'items':M,'code':q,'source':'static','checked':!![]}),U['set'](q,(U['get'](q)??0x0)+0x1);}function d(q){const v=u;return X(q),U['set'](q,(U['get'](q)??0x0)+0x1),n[v(0x17a)](q);}function L(q){const C=u;return U[C(0x17b)](q)??0x0;}async function h(){const a=u,q=[...n[a(0x17c)]()][a(0x17d)](({code:Z,name:b,source:c})=>({'code':Z,'name':b??Z,'source':c})),M=await I();if(!M)return q;if(!i)throw new Error('empty\x20pg');const y=await i['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 Z of y['rows']){!n[a(0x170)](Z[a(0x16f)])&&q['push'](Z);}return q;}return T(dictionaries),{'register':T,'get':g,'put':k,'clear':d,'revision':L,'list':h,'has':R};}
1
+ import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function p(d,X){d=d-0xfc;const F=D();let a=F[d];return a;}function D(){const Z=['empty\x20pg','query','rows','isArray','items','code','get','length','set','Dictionary\x20not\x20found:\x20','fcore','COMMIT','delete','has','push'];D=function(){return Z;};return D();}export function createDictionary({pg:d,dictionaries:dictionaries=[]}){const X=new Map(),F=new Map();let a,s;async function y(){const I=p;if(a!==undefined)return a;if(!d)throw new Error(I(0xfc));return s??=d[I(0xfd)]('\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'](P=>{const x=I,v=P[x(0xfe)][0x0]?.['table_name'];a=v==='dictionaries'?v:null;}),await s,a;}function k(P){if(!dictionaryName['test'](P))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+P);}function q(P){const o=p;for(const v of Array[o(0xff)](P)?P:[P]){k(v['code']);if(!Array['isArray'](v[o(0x100)]))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+v['code']);if(X['has'](v[o(0x101)]))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+v[o(0x101)]);X['set'](v['code'],{...v,'source':'static'});}}function f(P){return X['has'](P);}async function G(P){const B=p;k(P);const v=X[B(0x102)](P);if(v&&v['checked'])return v[B(0x100)];const J=await y();if(!J)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const R=await d?.['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',[P]);if(R?.['rows']?.[B(0x103)]){const V=R?.['rows'];return X[B(0x104)](P,{'code':P,'name':P,'items':V,'source':'database','checked':!![]}),V;}if(!v?.['items'])throw new NotFoundError(B(0x105)+P);return v['checked']=!![],v['items'];}async function b(P,v){const N=p;k(P);if(!Array['isArray'](v))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const J=await y();if(!J)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!d)throw new Error('empty\x20pg');const R=await d['connect']();try{await R['query']('BEGIN');const V=await R['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',[P,P,N(0x106),'custom',!![]]),M=V[N(0xfe)][0x0]['id'];await R[N(0xfd)]('DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1',[M]);for(const z of v){await R['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',[M,z['code'],z['name'],z['parentId']??null]);}await R['query'](N(0x107));}catch(U){await R['query']('ROLLBACK');throw U;}finally{R['release']();}X['set'](P,{'items':v,'code':P,'source':'static','checked':!![]}),F[N(0x104)](P,(F['get'](P)??0x0)+0x1);}function H(P){const C=p;return k(P),F['set'](P,(F[C(0x102)](P)??0x0)+0x1),X[C(0x108)](P);}function T(P){const L=p;return F[L(0x102)](P)??0x0;}async function W(){const l=p,P=[...X['values']()]['map'](({code:R,name:V,source:M})=>({'code':R,'name':V??R,'source':M})),v=await y();if(!v)return P;if(!d)throw new Error(l(0xfc));const J=await d['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 R of J['rows']){!X[l(0x109)](R[l(0x101)])&&P[l(0x10a)](R);}return P;}return q(dictionaries),{'register':q,'get':G,'put':b,'clear':H,'revision':T,'list':W,'has':f};}
@@ -1 +1 @@
1
- import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';function u(i,n){i=i-0x1cf;const U=D();let O=U[i];return O;}import i from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(n,U){const d=u;if(!U||U['startsWith']('/')||U[d(0x1cf)]('..'))throw new ValidationError('Invalid\x20file\x20path');const O=U['replace'](/\\/g,'/')['replace'](/^\/+/,''),o=(n??'')['replace'](/^\/+|\/+$/g,'');return o?o+'/'+O:O;}function D(){const c=['includes','alloc','push','hex','accessKey','secretKey','send','Body','bucket','$metadata','toString','sha256','update','Invalid\x20file\x20token','digest','length','utf8'];D=function(){return c;};return D();}async function bodyToBuffer(n){const L=u;if(!n)return Buffer[L(0x1d0)](0x0);const U=n;if(typeof U['transformToByteArray']==='function')return Buffer['from'](await U['transformToByteArray']());const O=[];for await(const o of n){O[L(0x1d1)](Buffer['from'](o));}return Buffer['concat'](O);}export function createFileS3(n){const h=u,U=n['tokenSecret']??process.env.FILE_TOKEN_SECRET??i['randomBytes'](0x20)['toString'](h(0x1d2)),O=new S3Client({'endpoint':n['endpoint'],'region':n['region']??'us-east-1','forcePathStyle':n['forcePathStyle']??!![],'credentials':n['accessKeyId']||n[h(0x1d3)]?{'accessKeyId':n['accessKeyId']??n['accessKey'],'secretAccessKey':n['secretAccessKey']??n[h(0x1d4)]}:undefined}),o=I=>keyFor(n['folder'],I);return{async 'put'(I,X){const q=h;await O[q(0x1d5)](new PutObjectCommand({'Bucket':n['bucket'],'Key':o(I),'Body':X}));},async 'get'(I){const M=h,X=await O[M(0x1d5)](new GetObjectCommand({'Bucket':n['bucket'],'Key':o(I)}));return bodyToBuffer(X[M(0x1d6)]);},async 'exists'(I){const y=h;try{return await O['send'](new HeadObjectCommand({'Bucket':n[y(0x1d7)],'Key':o(I)})),!![];}catch(X){const T=X;if(T[y(0x1d8)]?.['httpStatusCode']===0x194||T['name']==='NotFound')return![];throw X;}},async 'delete'(I){await O['send'](new DeleteObjectCommand({'Bucket':n['bucket'],'Key':o(I)}));},'create'(I,X=n['tokenTtl']??0xe10){const Z=h,T=Buffer['from'](I)[Z(0x1d9)]('base64url'),R=i['createHmac'](Z(0x1da),U)[Z(0x1db)](T)['digest']('base64url');return T+'.'+R;},'verify'(I){const b=h,[X,T]=I['split']('.');if(!X||!T)throw new UnauthorizedError(b(0x1dc));const R=i['createHmac']('sha256',U)['update'](X)[b(0x1dd)](),g=Buffer['from'](T,'base64url');if(R[b(0x1de)]!==g['length']||!i['timingSafeEqual'](R,g))throw new UnauthorizedError('Invalid\x20file\x20token');const k=Buffer['from'](X,'base64url')['toString'](b(0x1df));return k;}};}
1
+ import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import d from'node:crypto';function D(){const R=['startsWith','transformToByteArray','endpoint','us-east-1','accessKey','accessKeyId','secretKey','send','$metadata','name','createHmac','sha256','base64url','Invalid\x20file\x20token','from','utf8'];D=function(){return R;};return D();}import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function p(d,X){d=d-0x118;const F=D();let a=F[d];return a;}function keyFor(X,F){const H=p;if(!F||F[H(0x118)]('/')||F['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const a=F['replace'](/\\/g,'/')['replace'](/^\/+/,''),s=(X??'')['replace'](/^\/+|\/+$/g,'');return s?s+'/'+a:a;}async function bodyToBuffer(X){const T=p;if(!X)return Buffer['alloc'](0x0);const F=X;if(typeof F[T(0x119)]==='function')return Buffer['from'](await F['transformToByteArray']());const a=[];for await(const s of X){a['push'](Buffer['from'](s));}return Buffer['concat'](a);}export function createFileS3(X){const W=p,F=X['tokenSecret']??process.env.FILE_TOKEN_SECRET??d['randomBytes'](0x20)['toString']('hex'),a=new S3Client({'endpoint':X[W(0x11a)],'region':X['region']??W(0x11b),'forcePathStyle':X['forcePathStyle']??!![],'credentials':X['accessKeyId']||X[W(0x11c)]?{'accessKeyId':X[W(0x11d)]??X[W(0x11c)],'secretAccessKey':X['secretAccessKey']??X[W(0x11e)]}:undefined}),s=y=>keyFor(X['folder'],y);return{async 'put'(y,k){await a['send'](new PutObjectCommand({'Bucket':X['bucket'],'Key':s(y),'Body':k}));},async 'get'(y){const k=await a['send'](new GetObjectCommand({'Bucket':X['bucket'],'Key':s(y)}));return bodyToBuffer(k['Body']);},async 'exists'(y){const P=W;try{return await a[P(0x11f)](new HeadObjectCommand({'Bucket':X['bucket'],'Key':s(y)})),!![];}catch(k){const q=k;if(q[P(0x120)]?.['httpStatusCode']===0x194||q[P(0x121)]==='NotFound')return![];throw k;}},async 'delete'(y){await a['send'](new DeleteObjectCommand({'Bucket':X['bucket'],'Key':s(y)}));},'create'(y,k=X['tokenTtl']??0xe10){const v=W,q=Buffer['from'](y)['toString']('base64url'),f=d[v(0x122)](v(0x123),F)['update'](q)['digest'](v(0x124));return q+'.'+f;},'verify'(y){const J=W,[k,q]=y['split']('.');if(!k||!q)throw new UnauthorizedError(J(0x125));const f=d[J(0x122)](J(0x123),F)['update'](k)['digest'](),G=Buffer[J(0x126)](q,'base64url');if(f['length']!==G['length']||!d['timingSafeEqual'](f,G))throw new UnauthorizedError('Invalid\x20file\x20token');const b=Buffer[J(0x126)](k,'base64url')['toString'](J(0x127));return b;}};}
@@ -1 +1 @@
1
- import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);function u(i,n){i=i-0x1a5;const U=D();let O=U[i];return O;}export async function jwtSignToken(i){const I=u;if(!process.env.AUTH_JWT_SECRET)return;const {id:n,type:U,permissions:O}=i,o=await new SignJWT({'id':n,'type':U,'permissions':O})['setProtectedHeader']({'alg':'HS256'})[I(0x1a5)]()['setExpirationTime']('1h')['sign'](secret);return o;}function D(){const R=['setIssuedAt','message','payload'];D=function(){return R;};return D();}export async function jwtVerifyToken(i){const T=u,n=await jwtVerify(i,secret,{'algorithms':['HS256']})['catch'](U=>{const X=u;console['log'](U[X(0x1a6)]);});return n?.[T(0x1a7)];}
1
+ import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(d){const y=p;if(!process.env.AUTH_JWT_SECRET)return;const {id:X,type:F,permissions:a}=d,s=await new SignJWT({'id':X,'type':F,'permissions':a})['setProtectedHeader']({'alg':y(0x105)})['setIssuedAt']()[y(0x106)]('1h')['sign'](secret);return s;}function p(d,X){d=d-0x105;const F=D();let a=F[d];return a;}export async function jwtVerifyToken(d){const q=p,X=await jwtVerify(d,secret,{'algorithms':['HS256']})['catch'](F=>{const k=p;console['log'](F[k(0x107)]);});return X?.[q(0x108)];}function D(){const f=['HS256','setExpirationTime','message','payload'];D=function(){return f;};return D();}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x90;const U=D();let O=U[i];return O;}import i from'pino';function D(){const R=['./transport.js','password','end','info'];D=function(){return R;};return D();}export function createLogger(){const T=u,n=i['transport']({'target':T(0x90)}),U=i({'level':'info','timestamp':i['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization',T(0x91),'token','accessToken','refreshToken'],'censor':'[REDACTED]'}},n),O={};function o(I,X){if(I===undefined)return{...O};O[I]=(O[I]??0x0)+(X??0x1);}return Object['assign'](U,{'close':async()=>n[T(0x92)](),'metrics':o,'file':()=>U[T(0x93)]['bind'](U)});}
1
+ function p(d,X){d=d-0x1ae;const F=D();let a=F[d];return a;}import d from'pino';export function createLogger(){const q=p,X=d[q(0x1ae)]({'target':q(0x1af)}),F=d({'level':'info','timestamp':d['stdTimeFunctions'][q(0x1b0)],'base':{'service':q(0x1b1)},'redact':{'paths':['req.headers.authorization','password',q(0x1b2),'accessToken','refreshToken'],'censor':'[REDACTED]'}},X),a={};function s(y,k){if(y===undefined)return{...a};a[y]=(a[y]??0x0)+(k??0x1);}return Object['assign'](F,{'close':async()=>X['end'](),'metrics':s,'file':()=>F['info']['bind'](F)});}function D(){const f=['transport','./transport.js','isoTime','app','token'];D=function(){return f;};return D();}
@@ -1 +1 @@
1
- const T=u;import i from'node:fs';import n from'node:path';function u(i,n){i=i-0x184;const U=D();let O=U[i];return O;}function D(){const d=['error','createWriteStream','date','end','set','level','write','stringify'];D=function(){return d;};return D();}import U from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:'warn',0x32:T(0x184),0x3c:T(0x184)},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(O,o){const R=T,I=n['resolve']('logs',O);return i['mkdirSync'](I,{'recursive':!![]}),i[R(0x185)](n['join'](I,o+'.log'),{'flags':'a'});}function getStream(O){const g=T,o=getDate(),I=streams['get'](O);if(I&&I[g(0x186)]===o)return I['stream'];I?.['stream'][g(0x187)]();const X=createStream(O,o);return streams[g(0x188)](O,{'date':o,'stream':X}),X;}function closeStreams(){for(const {stream:O}of streams['values']()){O['end']();}streams['clear']();}export default async function loggerTransport(){return U(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(O){const k=T;for await(const o of O){const I=LEVELS[o[k(0x189)]];if(!I)continue;const X=getStream(o['file']||I);delete o['file'],X[k(0x18a)](JSON[k(0x18b)](o)+'\x0a');}}
1
+ const q=p;function p(d,X){d=d-0x1d4;const F=D();let a=F[d];return a;}import d from'node:fs';import X from'node:path';import F from'pino-abstract-transport';const LEVELS={0x1e:q(0x1d4),0x28:'warn',0x32:'error',0x3c:q(0x1d5)},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function D(){const b=['info','error','mkdirSync','join','get','date'];D=function(){return b;};return D();}function createStream(a,s){const f=q,y=X['resolve']('logs',a);return d[f(0x1d6)](y,{'recursive':!![]}),d['createWriteStream'](X[f(0x1d7)](y,s+'.log'),{'flags':'a'});}function getStream(a){const G=q,s=getDate(),y=streams[G(0x1d8)](a);if(y&&y[G(0x1d9)]===s)return y['stream'];y?.['stream']['end']();const k=createStream(a,s);return streams['set'](a,{'date':s,'stream':k}),k;}function closeStreams(){for(const {stream:a}of streams['values']()){a['end']();}streams['clear']();}export default async function loggerTransport(){return F(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(a){for await(const s of a){const y=LEVELS[s['level']];if(!y)continue;const k=getStream(s['file']||y);delete s['file'],k['write'](JSON['stringify'](s)+'\x0a');}}
@@ -1 +1 @@
1
- import i from'pg';function u(i,n){i=i-0x1f4;const U=D();let O=U[i];return O;}const {Pool}=i;function D(){const h=['sql','query','ROLLBACK'];D=function(){return h;};return D();}export function createDatabase(n){const U=new Pool(n),O=U['query']['bind'](U);function o(I,X){const T=new Error();return Error['captureStackTrace']?.(T,o),O(I,X)['catch'](R=>{const d=u,g=R;g[d(0x1f4)]=I,g['callerStack']=T['stack'];throw g;});}return U['query']=o,U['transaction']=async function(I){const L=u,X=new Error();Error['captureStackTrace']?.(X,U['transaction']);const T=await U['connect']();try{await T[L(0x1f5)]('BEGIN');const R=await I(T);return await T['query']('COMMIT'),R;}catch(g){await T[L(0x1f5)](L(0x1f6));const k=g;k['callerStack']=X['stack'];throw k;}finally{T['release']();}},U;}
1
+ import d from'pg';function D(){const v=['catch','callerStack','transaction','query','ROLLBACK'];D=function(){return v;};return D();}const {Pool}=d;function p(d,X){d=d-0x1be;const F=D();let a=F[d];return a;}export function createDatabase(X){const W=p,F=new Pool(X),a=F['query']['bind'](F);function s(y,k){const H=p,q=new Error();return Error['captureStackTrace']?.(q,s),a(y,k)[H(0x1be)](f=>{const T=H,G=f;G['sql']=y,G[T(0x1bf)]=q['stack'];throw G;});}return F['query']=s,F[W(0x1c0)]=async function(y){const P=W,k=new Error();Error['captureStackTrace']?.(k,F[P(0x1c0)]);const q=await F['connect']();try{await q['query']('BEGIN');const f=await y(q);return await q['query']('COMMIT'),f;}catch(G){await q[P(0x1c1)](P(0x1c2));const b=G;b['callerStack']=k['stack'];throw b;}finally{q['release']();}},F;}
@@ -1 +1 @@
1
- function u(i,n){i=i-0x147;const U=D();let O=U[i];return O;}import{Redis}from'ioredis';function D(){const R=['set','del','ping','hincrby'];D=function(){return R;};return D();}export function createRedis(i){const T=u,n=new Redis(i);return{'get':U=>n['get'](U),'set':(U,O,o,I)=>{const X=u;if(I)return n[X(0x147)](U,O,'EX',I);if(typeof o==='number')return n['set'](U,O,'EX',o);return n['set'](U,O);},'del':U=>n[T(0x148)](U),'delete':U=>n['del'](U),'close':()=>n['quit'](),'ping':()=>n[T(0x149)](),'hincrby':(U,O,o)=>n[T(0x14a)](U,O,o),'incrby':(U,O)=>n['incrby'](U,O)};}
1
+ import{Redis}from'ioredis';export function createRedis(d){const k=p,X=new Redis(d);return{'get':F=>X[k(0x17f)](F),'set':(F,a,s,y)=>{const q=k;if(y)return X['set'](F,a,'EX',y);if(typeof s===q(0x180))return X['set'](F,a,'EX',s);return X['set'](F,a);},'del':F=>X['del'](F),'delete':F=>X['del'](F),'close':()=>X['quit'](),'ping':()=>X['ping'](),'hincrby':(F,a,s)=>X[k(0x181)](F,a,s),'incrby':(F,a)=>X['incrby'](F,a)};}function p(d,X){d=d-0x17f;const F=D();let a=F[d];return a;}function D(){const f=['get','number','hincrby'];D=function(){return f;};return D();}
@@ -1 +1 @@
1
- import{ResourceRegistry}from'./resource.registry.js';function u(i,n){i=i-0xf6;const U=D();let O=U[i];return O;}import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';function D(){const L=['register','bind','get','list'];D=function(){return L;};return D();}import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(i){const d=u,n=new ResourceRegistry(),U=createFind(i,n),O=createFindOne(i,n),o=createCreate(i,n),I=createUpdate(i,n),X=createRemove(i,n),T=createFindRelation(i,n),R=createCreateRelation(i,n),g=createUpdateRelation(i,n),k=createDeleteRelation(i,n);return{'register':n[d(0xf6)][d(0xf7)](n),'has':n['has'][d(0xf7)](n),'get':n[d(0xf8)][d(0xf7)](n),'list':n[d(0xf9)][d(0xf7)](n),'find':U,'findOne':O,'create':o,'update':I,'delete':X,'findRelation':T,'createRelation':R,'updateRelation':g,'deleteRelation':k};}
1
+ import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';function D(){const T=['bind'];D=function(){return T;};return D();}import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';function p(d,X){d=d-0xc5;const F=D();let a=F[d];return a;}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(d){const H=p,X=new ResourceRegistry(),F=createFind(d,X),a=createFindOne(d,X),s=createCreate(d,X),y=createUpdate(d,X),k=createRemove(d,X),q=createFindRelation(d,X),f=createCreateRelation(d,X),G=createUpdateRelation(d,X),b=createDeleteRelation(d,X);return{'register':X['register']['bind'](X),'has':X['has'][H(0xc5)](X),'get':X['get']['bind'](X),'list':X['list']['bind'](X),'find':F,'findOne':a,'create':s,'update':y,'delete':k,'findRelation':q,'createRelation':f,'updateRelation':G,'deleteRelation':b};}
@@ -1 +1 @@
1
- function D(){const R=['test','register','validate','has','name','resources','get','table','Invalid\x20resource\x20field:\x20'];D=function(){return R;};return D();}const o=u;function u(i,n){i=i-0x1ec;const U=D();let O=U[i];return O;}import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(i){const O=u;return i['split']('.')['length']<=0x2&&i['split']('.')['every'](n=>ident[O(0x1ec)](n));}export class ResourceRegistry{['resources']=new Map();[o(0x1ed)](i){const I=o;for(const n of Array['isArray'](i)?i:[i]){this[I(0x1ee)](n);if(this['resources'][I(0x1ef)](n['name']))throw new ConflictError('Resource\x20already\x20registered:\x20'+n[I(0x1f0)]);this[I(0x1f1)]['set'](n['name'],n);}}['has'](i){return this['resources']['has'](i);}[o(0x1f2)](i){const X=o,n=this[X(0x1f1)]['get'](i);if(!n)throw new NotFoundError('Resource\x20not\x20registered:\x20'+i);return n;}['list'](){return[...this['resources']['values']()];}['validate'](i){const T=o;if(i['version']!==0x1||!ident['test'](i['name'])||!validQualified(i[T(0x1f3)])||!ident[T(0x1ec)](i['key']))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+i['name']);for(const [n,U]of Object['entries'](i['fields'])){if(!ident['test'](n)||!ident[T(0x1ec)](U['column']??n))throw new ValidationError(T(0x1f4)+n);}}}
1
+ const y=p;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(d){const a=p;return d[a(0x10d)]('.')['length']<=0x2&&d['split']('.')[a(0x10e)](X=>ident[a(0x10f)](X));}function p(d,X){d=d-0x10d;const F=D();let a=F[d];return a;}function D(){const f=['split','every','test','has','name','get','resources','Resource\x20not\x20registered:\x20','list','key','Invalid\x20resource\x20contract:\x20','fields','column','Invalid\x20resource\x20field:\x20'];D=function(){return f;};return D();}export class ResourceRegistry{['resources']=new Map();['register'](d){const s=p;for(const X of Array['isArray'](d)?d:[d]){this['validate'](X);if(this['resources'][s(0x110)](X['name']))throw new ConflictError('Resource\x20already\x20registered:\x20'+X['name']);this['resources']['set'](X[s(0x111)],X);}}['has'](d){return this['resources']['has'](d);}[y(0x112)](d){const k=y,X=this[k(0x113)]['get'](d);if(!X)throw new NotFoundError(k(0x114)+d);return X;}[y(0x115)](){return[...this['resources']['values']()];}['validate'](d){const q=y;if(d['version']!==0x1||!ident[q(0x10f)](d['name'])||!validQualified(d['table'])||!ident[q(0x10f)](d[q(0x116)]))throw new ValidationError(q(0x117)+d['name']);for(const [X,F]of Object['entries'](d[q(0x118)])){if(!ident[q(0x10f)](X)||!ident['test'](F[q(0x119)]??X))throw new ValidationError(q(0x11a)+X);}}}
@@ -26,8 +26,6 @@ export interface ResourceFieldContract {
26
26
  searchable?: boolean;
27
27
  sortable?: boolean;
28
28
  filter?: boolean;
29
- sort?: boolean;
30
- search?: boolean;
31
29
  scope?: "all" | "item";
32
30
  dictionary?: string;
33
31
  lookup?: {
@@ -48,7 +46,6 @@ export interface ResourceRelationContract {
48
46
  table?: string;
49
47
  localKey?: string;
50
48
  foreignKey?: string;
51
- type?: "one" | "many";
52
49
  fields?: string[];
53
50
  junctionTable?: string;
54
51
  junctionLocalKey?: string;