@opengis/fcore 0.0.1-beta.24 → 0.0.1-beta.25

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 (105) hide show
  1. package/dist/config.d.ts +1 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +1 -1
  4. package/dist/context.js +1 -1
  5. package/dist/errors.js +1 -1
  6. package/dist/fastify.js +1 -1
  7. package/dist/fcore.d.ts.map +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.d.ts.map +1 -1
  26. package/dist/modules/file/services/upload-file.js +1 -1
  27. package/dist/modules/resource/route.d.ts.map +1 -1
  28. package/dist/modules/resource/route.js +1 -1
  29. package/dist/modules/resource/schema.d.ts +5 -0
  30. package/dist/modules/resource/schema.d.ts.map +1 -1
  31. package/dist/modules/resource/schema.js +1 -1
  32. package/dist/modules/resource/services/add-note.js +1 -1
  33. package/dist/modules/resource/services/add-resource-file.js +1 -1
  34. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  35. package/dist/modules/resource/services/create-resource.js +1 -1
  36. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  37. package/dist/modules/resource/services/delete-resource.js +1 -1
  38. package/dist/modules/resource/services/export-resource.js +1 -1
  39. package/dist/modules/resource/services/get-resource.js +1 -1
  40. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  41. package/dist/modules/resource/services/list-resources.js +1 -1
  42. package/dist/modules/resource/services/search-resource.js +1 -1
  43. package/dist/modules/resource/services/suggest-resource.js +1 -1
  44. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  45. package/dist/modules/resource/services/update-resource.js +1 -1
  46. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  47. package/dist/modules/system/route.js +1 -1
  48. package/dist/modules/system/schema.js +1 -1
  49. package/dist/modules/system/services/check-system.js +1 -1
  50. package/dist/modules/system/services/get-access.js +1 -1
  51. package/dist/modules/system/services/get-api-list.js +1 -1
  52. package/dist/modules/system/services/get-audit-log.js +1 -1
  53. package/dist/modules/system/services/get-dictionary.js +1 -1
  54. package/dist/modules/system/services/get-system-log.js +1 -1
  55. package/dist/modules/system/services/get-system-settings.js +1 -1
  56. package/dist/modules/system/services/list-dictionaries.js +1 -1
  57. package/dist/modules/system/services/set-access.js +1 -1
  58. package/dist/modules/system/services/update-dictionary.js +1 -1
  59. package/dist/modules/system/services/update-system-settings.js +1 -1
  60. package/dist/modules/utils/require-admin.js +1 -1
  61. package/dist/modules/utils/safe-user.js +1 -1
  62. package/dist/modules/utils/unsupported.js +1 -1
  63. package/dist/plugins/audit/audit.js +1 -1
  64. package/dist/plugins/audit/services/write-audit.js +1 -1
  65. package/dist/plugins/auth/get-user-permissions.js +1 -1
  66. package/dist/plugins/auth/index.d.ts.map +1 -1
  67. package/dist/plugins/auth/index.js +1 -1
  68. package/dist/plugins/auth/verifyUser.js +1 -1
  69. package/dist/plugins/dictionary.js +1 -1
  70. package/dist/plugins/file.d.ts +7 -3
  71. package/dist/plugins/file.d.ts.map +1 -1
  72. package/dist/plugins/file.js +1 -1
  73. package/dist/plugins/jwt.js +1 -1
  74. package/dist/plugins/logger/index.js +1 -1
  75. package/dist/plugins/logger/transport.js +1 -1
  76. package/dist/plugins/pg.js +1 -1
  77. package/dist/plugins/redis.d.ts.map +1 -1
  78. package/dist/plugins/redis.js +1 -1
  79. package/dist/plugins/resource/resource.js +1 -1
  80. package/dist/plugins/resource/resource.registry.js +1 -1
  81. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  82. package/dist/plugins/resource/services/add-file-token.js +1 -1
  83. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  84. package/dist/plugins/resource/services/create-relation.js +1 -1
  85. package/dist/plugins/resource/services/create.js +1 -1
  86. package/dist/plugins/resource/services/delete-relation.js +1 -1
  87. package/dist/plugins/resource/services/delete.js +1 -1
  88. package/dist/plugins/resource/services/find-one.d.ts.map +1 -1
  89. package/dist/plugins/resource/services/find-one.js +1 -1
  90. package/dist/plugins/resource/services/find-relation.js +1 -1
  91. package/dist/plugins/resource/services/find.d.ts.map +1 -1
  92. package/dist/plugins/resource/services/find.js +1 -1
  93. package/dist/plugins/resource/services/get-table-columns.js +1 -1
  94. package/dist/plugins/resource/services/update-relation.js +1 -1
  95. package/dist/plugins/resource/services/update.js +1 -1
  96. package/dist/plugins/resource/utils/auto-index.js +1 -1
  97. package/dist/plugins/resource/utils/fields.js +1 -1
  98. package/dist/plugins/resource/utils/filters.d.ts.map +1 -1
  99. package/dist/plugins/resource/utils/filters.js +1 -1
  100. package/dist/plugins/resource/utils/permissions.js +1 -1
  101. package/dist/plugins/resource/utils/sort.js +1 -1
  102. package/dist/plugins/resource/utils/sql.js +1 -1
  103. package/dist/plugins/resource/utils/summary.js +1 -1
  104. package/dist/shared/getIP.js +1 -1
  105. package/package.json +1 -1
@@ -1 +1 @@
1
- export async function getResource(s,J){var N=n;return J['resource']['findOne']({'name':s['resource'],'id':s['id'],'query':{'include':s[N(0xfc)]},'user':s['user']});}function n(s,J){s=s-0xfc;var N=W();var O=N[s];return O;}function W(){var O=['include'];W=function(){return O;};return W();}
1
+ export async function getResource(w,y){return y['resource']['findOne']({'name':w['resource'],'id':w['id'],'query':{'include':w['include']},'user':w['user']});}
@@ -1 +1 @@
1
- export async function listResourceRelation(s,J){const {resource:N,id:O,relation:E,query:S,user:T}=s;return J['resource']['findRelation']({'name':N,'id':O,'relation':E,'query':S,'user':T});}
1
+ export async function listResourceRelation(w,y){const s=Y,{resource:d,id:Z,relation:M,query:H,user:Q}=w;return y['resource'][s(0x18b)]({'name':d,'id':Z,'relation':M,'query':H,'user':Q});}function Y(w,y){w=w-0x18b;const d=f();let Z=d[w];return Z;}function f(){const j=['findRelation'];f=function(){return j;};return f();}
@@ -1 +1 @@
1
- function W(){var O=['resource','search','limit','max'];W=function(){return O;};return W();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function n(s,J){s=s-0xf4;var N=W();var O=N[s];return O;}export async function listResources(s,J){var N=n;return J[N(0xf4)]['find']({'name':s[N(0xf4)],'query':{'filter':parseFilterQuery(s),'sort':s['sort'],'search':s[N(0xf5)],'scope':s['scope'],'limit':s[N(0xf6)],'offset':s['offset']??(s['page']?Math[N(0xf7)](s['page']-0x1,0x0):0x0)*(s['limit']??0x14)},'user':s['user']});}
1
+ function Y(w,y){w=w-0x93;var d=f();var Z=d[w];return Z;}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function f(){var Z=['offset','max','page','limit'];f=function(){return Z;};return f();}export async function listResources(w,y){var d=Y;return y['resource']['find']({'name':w['resource'],'query':{'filter':parseFilterQuery(w),'sort':w['sort'],'search':w['search'],'scope':w['scope'],'limit':w['limit'],'offset':w[d(0x93)]??(w['page']?Math[d(0x94)](w[d(0x95)]-0x1,0x0):0x0)*(w[d(0x96)]??0x14)},'user':w['user']});}
@@ -1 +1 @@
1
- function W(){var O=['resource','find'];W=function(){return O;};return W();}import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function n(s,J){s=s-0xd3;var N=W();var O=N[s];return O;}export async function searchResource(s,J){var N=n;return J[N(0xd3)][N(0xd4)]({'name':s['resource'],'query':{...s,'filter':parseFilterQuery(s)},'user':s['user']});}
1
+ import{parseFilterQuery}from'../../../plugins/resource/utils/filters.js';function f(){var Z=['resource','user'];f=function(){return Z;};return f();}function Y(w,y){w=w-0xe6;var d=f();var Z=d[w];return Z;}export async function searchResource(w,y){var d=Y;return y['resource']['find']({'name':w[d(0xe6)],'query':{...w,'filter':parseFilterQuery(w)},'user':w[d(0xe7)]});}
@@ -1 +1 @@
1
- function n(s,J){s=s-0xd0;const N=W();let O=N[s];return O;}function W(){const Q=['limit','now','lookup','text','value','query','SELECT\x20','\x20as\x20text\x20FROM\x20','length','field','code','startsWith'];W=function(){return Q;};return W();}import{ValidationError}from'../../../errors.js';import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(s,J){const i=n,N=J['resource']['get'](s['resource']),O=String(s['search']??s['q']??'')['toLowerCase'](),E=Math['min'](Math['max'](Number(s[i(0xd0)]??0x14),0x1),0xc8),S=Date[i(0xd1)](),T=N['fields'][s['field']],f=T?.['dictionary'],a=T?.[i(0xd2)]?.['table'];if(a){const D=T['lookup']?.[i(0xd3)]??'name',R=T['lookup']?.[i(0xd4)]??'id';autoIndex(a,D,'text',J['pg']);const v=await J['pg'][i(0xd5)](i(0xd6)+R+'\x20as\x20id,\x20'+D+i(0xd7)+a+'\x20WHERE\x20lower('+D+')\x20~\x20$1\x20LIMIT\x20$2',[''+O['toLowerCase'](),E])['then'](o=>o['rows']);return{'limit':E,'count':v[i(0xd8)],'search':O,'time':Date['now']()-S,'data':v};}if(!f)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+s[i(0xd9)]);const g=await J['dictionary']['get'](f),p=g['filter'](o=>!O||o[i(0xda)][i(0xdb)](O)||o['name']['startsWith'](O))['slice'](0x0,E)['map'](o=>({'id':o['code']||o['id'],'text':o['name']||o[i(0xd3)]}));return{'search':O,'limit':E,'count':p['length'],'time':Date['now']()-S,'data':p};}
1
+ function f(){const U=['resource','get','now','lookup','query','\x20as\x20text\x20FROM\x20','toLowerCase','then','dictionary','filter','code','name'];f=function(){return U;};return f();}import{ValidationError}from'../../../errors.js';function Y(w,y){w=w-0x1eb;const d=f();let Z=d[w];return Z;}import{autoIndex}from'../../../plugins/resource/utils/auto-index.js';export async function suggestResource(w,y){const G=Y,d=y[G(0x1eb)][G(0x1ec)](w['resource']),Z=String(w['search']??w['q']??'')['toLowerCase'](),M=Math['min'](Math['max'](Number(w['limit']??0x14),0x1),0xc8),H=Date[G(0x1ed)](),Q=d['fields'][w['field']],s=Q?.['dictionary'],j=Q?.[G(0x1ee)]?.['table'];if(j){const K=Q['lookup']?.['text']??'name',T=Q[G(0x1ee)]?.['value']??'id';autoIndex(j,K,'text',y['pg']);const h=await y['pg'][G(0x1ef)]('SELECT\x20'+T+'\x20as\x20id,\x20'+K+G(0x1f0)+j+'\x20WHERE\x20lower('+K+')\x20~\x20$1\x20LIMIT\x20$2',[''+Z[G(0x1f1)](),M])[G(0x1f2)](i=>i['rows']);return{'limit':M,'count':h['length'],'search':Z,'time':Date[G(0x1ed)]()-H,'data':h};}if(!s)throw new ValidationError('Field\x20has\x20no\x20lookup\x20dictionary:\x20'+w['field']);const n=await y[G(0x1f3)]['get'](s),t=n[G(0x1f4)](i=>!Z||i['code']['startsWith'](Z)||i['name']['startsWith'](Z))['slice'](0x0,M)['map'](i=>({'id':i[G(0x1f5)]||i['id'],'text':i[G(0x1f6)]||i['text']}));return{'search':Z,'limit':M,'count':t['length'],'time':Date['now']()-H,'data':t};}
@@ -1 +1 @@
1
- export async function updateResourceRelation(s,J){const {resource:N,id:O,relation:E,relationId:S,data:T,user:f}=s;return J['resource']['updateRelation']({'name':N,'id':O,'relation':E,'relationId':S,'data':T,'user':f});}
1
+ function f(){const n=['resource'];f=function(){return n;};return f();}function Y(w,y){w=w-0xcf;const d=f();let Z=d[w];return Z;}export async function updateResourceRelation(w,y){const j=Y,{resource:d,id:Z,relation:M,relationId:H,data:Q,user:s}=w;return y[j(0xcf)]['updateRelation']({'name':d,'id':Z,'relation':M,'relationId':H,'data':Q,'user':s});}
@@ -1 +1 @@
1
- function n(s,J){s=s-0xb8;var N=W();var O=N[s];return O;}function W(){var O=['resource','update'];W=function(){return O;};return W();}export async function updateResource(s,J){var N=n;return J[N(0xb8)][N(0xb9)]({'name':s['resource'],'id':s['id'],'data':s['patch'],'user':s['user']});}
1
+ function Y(w,y){w=w-0x14c;var d=f();var Z=d[w];return Z;}function f(){var Z=['resource','user'];f=function(){return Z;};return f();}export async function updateResource(w,y){var d=Y;return y[d(0x14c)]['update']({'name':w[d(0x14c)],'id':w['id'],'data':w['patch'],'user':w[d(0x14d)]});}
@@ -1 +1 @@
1
- import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';function n(s,J){s=s-0x1b3;const N=W();let O=N[s];return O;}export async function uploadResourceFile(s,J){const T=n,N=J['resource']['get'](s['resource']);if(N['access']==='admin'&&s['user']?.['type']!=='admin')throw new ForbiddenError(T(0x1b3));if(s['user']?.[T(0x1b4)]!=='admin'&&!s[T(0x1b5)]?.[T(0x1b6)]?.['includes']((N[T(0x1b7)]??N['name'])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(N['permission']??N['name'])+':update');if(!Buffer['isBuffer'](s['file'])||s['file']['length']===0x0)throw new ValidationError('File\x20is\x20required');const O=s['fileName']['replace'](/[^A-Za-z0-9._-]/g,'_');if(!O)throw new ValidationError(T(0x1b8));const E='files/'+s[T(0x1b9)]+'/'+String(s['id'])+'/'+O;await J[T(0x1ba)]['put'](E,s['file']);if(!await J['file']['exists'](E))throw new NotFoundError(T(0x1bb));const S=await J['pg']['query'](T(0x1bc),[s[T(0x1b9)],String(s['id']),E,s['file'][T(0x1bd)]]);return S['rows'][0x0];}function W(){const f=['Admin\x20access\x20required','type','user','permissions','permission','File\x20name\x20is\x20required','resource','file','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','length'];W=function(){return f;};return W();}
1
+ import{ForbiddenError,NotFoundError,ValidationError}from'../../../errors.js';function f(){const s=['resource','get','admin','user','name','permission',':update','isBuffer','file','length','File\x20name\x20is\x20required','Uploaded\x20file\x20not\x20found','rows'];f=function(){return s;};return f();}function Y(w,y){w=w-0x1ac;const d=f();let Z=d[w];return Z;}export async function uploadResourceFile(w,y){const Q=Y,d=y[Q(0x1ac)][Q(0x1ad)](w['resource']);if(d['access']==='admin'&&w['user']?.['type']!==Q(0x1ae))throw new ForbiddenError('Admin\x20access\x20required');if(w['user']?.['type']!==Q(0x1ae)&&!w[Q(0x1af)]?.['permissions']?.['includes']((d['permission']??d[Q(0x1b0)])+':update'))throw new ForbiddenError('Missing\x20permission:\x20'+(d[Q(0x1b1)]??d[Q(0x1b0)])+Q(0x1b2));if(!Buffer[Q(0x1b3)](w['file'])||w[Q(0x1b4)][Q(0x1b5)]===0x0)throw new ValidationError('File\x20is\x20required');const Z=w['fileName']['replace'](/[^A-Za-z0-9._-]/g,'_');if(!Z)throw new ValidationError(Q(0x1b6));const M='files/'+w['resource']+'/'+String(w['id'])+'/'+Z;await y['file']['put'](M,w['file']);if(!await y['file']['exists'](M))throw new NotFoundError(Q(0x1b7));const H=await y['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*\x0a\x20\x20\x20\x20',[w[Q(0x1ac)],String(w['id']),M,w[Q(0x1b4)]['length']]);return H[Q(0x1b8)][0x0];}
@@ -1 +1 @@
1
- import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';function n(s,J){s=s-0x1da;const N=W();let O=N[s];return O;}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=s=>s['user'];export function systemRoutes(s,J=new Map()){return async N=>{const a=n;N['get']('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async E=>({'items':await getDictionary({...E['params'],'user':u(E)},s)})),N[a(0x1da)](a(0x1db),{'schema':{'tags':['fcore','system'],'summary':'Update\x20platform\x20dictionary','description':a(0x1dc),'access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas['dictionaryItems']}},async E=>updateDictionary({...E[a(0x1dd)],...E[a(0x1de)],'user':u(E)},s));const O=async E=>getAccess({...E['params'],'user':u(E)},s);N[a(0x1df)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':a(0x1e0),'description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},O),N['post']('/api/access/:type/:id',{'schema':{'tags':[a(0x1e1),a(0x1e2)],'summary':'Set\x20access\x20rules','description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async E=>setAccess({...E['params'],...E[a(0x1de)],'user':u(E)},s)),N[a(0x1df)](a(0x1e3),{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':'admin','permissions':['system:settings']}},async E=>getSystemSettings({...E['params'],'user':u(E)},s)),N['post']('/api/system/settings',{'schema':{'tags':['fcore',a(0x1e2)],'summary':'Update\x20system\x20settings','description':a(0x1e4),'access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async E=>updateSystemSettings({...E[a(0x1dd)],'patch':E[a(0x1de)],'user':u(E)},s)),N['get']('/api/system/logger',{'schema':{'tags':['fcore','system'],'summary':a(0x1e5),'description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':a(0x1e6),'permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(E,S)=>{const g=a,{contentType:T,body:f}=await getSystemLog({...E['query'],'user':u(E)},s);return S[g(0x1e7)](T)['send'](f);}),N['get']('/api/system/audit',{'schema':{'tags':['fcore','system'],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':['system:audit']}},async E=>getAuditLog({...E['query'],'user':u(E)},s)),N[a(0x1df)]('/api/system/check',{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':a(0x1e8),'access':'user','permissions':['system:check']}},async E=>checkSystem({'user':u(E)},s)),N[a(0x1df)]('/api/system/list',{'schema':{'tags':[a(0x1e1),'system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':a(0x1e9),'permissions':[],'querystring':systemSchemas['apiListQuery']}},async E=>getApiList({'user':u(E),'apiRoutes':J,...E['query']},s));};}function W(){const p=['post','/api/dictionary/:name','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','params','body','get','Get\x20access\x20rules','fcore','system','/api/system/settings','Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','Get\x20system\x20log','user','type','Checks\x20the\x20availability\x20of\x20system\x20dependencies.','admin'];W=function(){return p;};return W();}
1
+ const j=Y;import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';function f(){const t=['user','system','dictionaryName','/api/dictionary/:name','system:dictionaries','body','get','/api/access/:type/:id','fcore','admin','post','Set\x20access\x20rules','system:access','/api/system/settings','Update\x20system\x20settings','Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','apiListQuery'];f=function(){return t;};return f();}import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';function Y(w,y){w=w-0x186;const d=f();let Z=d[w];return Z;}import{systemSchemas}from'./schema.js';const u=w=>w[j(0x186)];export function systemRoutes(w,y=new Map()){return async d=>{const n=Y;d['get']('/api/dictionary/:name',{'schema':{'tags':['fcore',n(0x187)],'summary':'Get\x20platform\x20dictionary','description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas[n(0x188)]}},async M=>({'items':await getDictionary({...M['params'],'user':u(M)},w)})),d['post'](n(0x189),{'schema':{'tags':['fcore',n(0x187)],'summary':'Update\x20platform\x20dictionary','description':'Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','access':'user','permissions':[n(0x18a)],'params':systemSchemas[n(0x188)],'body':systemSchemas['dictionaryItems']}},async M=>updateDictionary({...M['params'],...M[n(0x18b)],'user':u(M)},w));const Z=async M=>getAccess({...M['params'],'user':u(M)},w);d[n(0x18c)](n(0x18d),{'schema':{'tags':[n(0x18e),n(0x187)],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':n(0x18f),'permissions':['system:access'],'params':systemSchemas['accessTarget']}},Z),d[n(0x190)](n(0x18d),{'schema':{'tags':[n(0x18e),'system'],'summary':n(0x191),'description':'Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':[n(0x192)],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async M=>setAccess({...M['params'],...M['body'],'user':u(M)},w)),d['get']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':n(0x18f),'permissions':['system:settings']}},async M=>getSystemSettings({...M['params'],'user':u(M)},w)),d['post'](n(0x193),{'schema':{'tags':['fcore','system'],'summary':n(0x194),'description':n(0x195),'access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async M=>updateSystemSettings({...M['params'],'patch':M['body'],'user':u(M)},w)),d['get']('/api/system/logger',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20log','description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':'user','permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(M,H)=>{const {contentType:Q,body:s}=await getSystemLog({...M['query'],'user':u(M)},w);return H['type'](Q)['send'](s);}),d[n(0x18c)]('/api/system/audit',{'schema':{'tags':['fcore','system'],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':n(0x186),'permissions':['system:audit']}},async M=>getAuditLog({...M['query'],'user':u(M)},w)),d['get']('/api/system/check',{'schema':{'tags':[n(0x18e),'system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':'user','permissions':['system:check']}},async M=>checkSystem({'user':u(M)},w)),d['get']('/api/system/list',{'schema':{'tags':[n(0x18e),'system'],'summary':'List\x20APIs','description':n(0x196),'access':n(0x18f),'permissions':[],'querystring':systemSchemas[n(0x197)]}},async M=>getApiList({'user':u(M),'apiRoutes':y,...M['query']},w));};}
@@ -1 +1 @@
1
- function W(){const J=['^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$','Optional','Union','extended','Object','String'];W=function(){return J;};return W();}const s=n;import{Type}from'@sinclair/typebox';function n(s,J){s=s-0xfc;const N=W();let O=N[s];return O;}export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':s(0xfc)});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type['Object']({'items':Type['Array'](Type['Object']({'id':Type[s(0xfd)](Type['Union']([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type[s(0xfe)]([Type['String'](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal']('user'),Type['Literal']('role')]),'id':identifier}),'access':Type['Object']({'permissions':Type['Optional'](Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9_-]+(?::[A-Za-z0-9_-]+)?$'}))),'access':Type['Optional'](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[s(0xfe)]([Type['Literal']('short'),Type['Literal'](s(0xff))]))}),'settingsEntity':Type[s(0x100)]({'entity':Type[s(0xfd)](identifier)}),'settings':Type['Record'](Type[s(0x101)]({'minLength':0x1}),Type['Unknown']()),'logger':Type[s(0x100)]({'path':Type[s(0xfd)](Type['String']({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
1
+ function f(){const y=['Object','Optional','Number','user','Literal','String','Union','Unknown'];f=function(){return y;};return f();}const w=Y;import{Type}from'@sinclair/typebox';function Y(w,y){w=w-0x108;const d=f();let Z=d[w];return Z;}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[w(0x108)]({'name':identifier}),'dictionaryItems':Type[w(0x108)]({'items':Type['Array'](Type['Object']({'id':Type[w(0x109)](Type['Union']([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type['Union']([Type['String'](),Type[w(0x10a)](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type['Object']({'type':Type['Union']([Type['Literal'](w(0x10b)),Type[w(0x10c)]('role')]),'id':identifier}),'access':Type[w(0x108)]({'permissions':Type[w(0x109)](Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9_-]+(?::[A-Za-z0-9_-]+)?$'}))),'access':Type['Optional'](Type['Array'](Type['Object']({'resource':Type[w(0x10d)]({'minLength':0x1,'maxLength':0x80}),'actions':Type['Array'](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})})))}),'apiListQuery':Type[w(0x108)]({'format':Type[w(0x109)](Type[w(0x10e)]([Type['Literal']('short'),Type[w(0x10c)]('extended')]))}),'settingsEntity':Type[w(0x108)]({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type[w(0x10d)]({'minLength':0x1}),Type[w(0x10f)]()),'logger':Type['Object']({'path':Type['Optional'](Type[w(0x10d)]({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
@@ -1 +1 @@
1
- function n(s,J){s=s-0x1a5;const N=W();let O=N[s];return O;}function W(){const S=['query','SELECT\x201','ping','fulfilled','degraded'];W=function(){return S;};return W();}export async function checkSystem(s,J){const E=n,[N,O]=await Promise['allSettled']([J['pg'][E(0x1a5)](E(0x1a6)),J['redis'][E(0x1a7)]()]);return{'status':N['status']==='fulfilled'&&O['status']===E(0x1a8)?'ok':E(0x1a9),'pg':N['status'],'redis':O['status']};}
1
+ export async function checkSystem(w,y){const M=Y,[d,Z]=await Promise['allSettled']([y['pg'][M(0x15a)]('SELECT\x201'),y[M(0x15b)]['ping']()]);return{'status':d['status']==='fulfilled'&&Z[M(0x15c)]===M(0x15d)?'ok':'degraded','pg':d[M(0x15c)],'redis':Z['status']};}function Y(w,y){w=w-0x15a;const d=f();let Z=d[w];return Z;}function f(){const H=['query','redis','status','fulfilled'];f=function(){return H;};return f();}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x1a9;const N=W();let O=N[s];return O;}function W(){const f=['query','filter','rows'];W=function(){return f;};return W();}export async function getAccess(s,J){const T=n,N=s['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20',O=await J['pg'][T(0x1a9)](N,[s['id']]),E=[...new Set(O['rows']['map'](S=>S['resource'])[T(0x1aa)](S=>S!==null))];return{'access':O[T(0x1ab)],'resources':E};}
1
+ function Y(w,y){w=w-0x119;const d=f();let Z=d[w];return Z;}export async function getAccess(w,y){const Q=Y,d=w['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':Q(0x119),Z=await y['pg']['query'](d,[w['id']]),M=[...new Set(Z['rows']['map'](H=>H[Q(0x11a)])['filter'](H=>H!==null))];return{'access':Z['rows'],'resources':M};}function f(){const s=['\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','resource'];f=function(){return s;};return f();}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x78;const N=W();let O=N[s];return O;}export async function getApiList(s,J){const f=n,N=[...s[f(0x78)]['values']()][f(0x79)]((O,E)=>(O[f(0x7a)]+'\x20'+O['method'])['localeCompare'](E[f(0x7a)]+'\x20'+E['method']));if(s['format']!=='short')return N;return N['map'](({method:O,endpoint:E,access:S,permissions:T})=>O+'\x20'+E);}function W(){const a=['apiRoutes','sort','endpoint'];W=function(){return a;};return W();}
1
+ function Y(w,y){w=w-0x187;const d=f();let Z=d[w];return Z;}function f(){const j=['values','sort','method','short'];f=function(){return j;};return f();}export async function getApiList(w,y){const s=Y,d=[...w['apiRoutes'][s(0x187)]()][s(0x188)]((Z,M)=>(Z['endpoint']+'\x20'+Z['method'])['localeCompare'](M['endpoint']+'\x20'+M[s(0x189)]));if(w['format']!==s(0x18a))return d;return d['map'](({method:Z,endpoint:M,access:H,permissions:Q})=>Z+'\x20'+M);}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x173;const N=W();let O=N[s];return O;}function W(){const T=['min','limit','max','SELECT\x0a\x20\x20\x20\x20\x20\x20l.*,\x0a\x20\x20\x20\x20\x20\x20case\x20when\x20u.first_name\x20is\x20not\x20null\x20then\x20coalesce(u.last_name,\x27\x27)||coalesce(\x27\x20\x27||u.first_name,\x27\x27)\x20else\x20coalesce(u.login,\x20u.email,\x27\x27)\x20end\x20as\x20user_id_text\x0a\x20\x20\x20\x20FROM\x20admin.audit_log\x20l\x0a\x20\x20\x20\x20JOIN\x20admin.users\x20u\x20ON\x20l.user_id=u.uid\x0a\x20\x20\x20\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2'];W=function(){return T;};return W();}export async function getAuditLog(s,J){const S=n,N=Math[S(0x173)](Math['max'](s[S(0x174)]??0x32,0x1),0xc8),O=Math[S(0x175)]((s['page']??0x1)-0x1,0x0)*N,E=await J['pg']['query'](S(0x176),[N,O]);return{'rows':E['rows'],'page':s['page']??0x1,'limit':N};}
1
+ function Y(w,y){w=w-0x9d;const d=f();let Z=d[w];return Z;}function f(){const Q=['limit','page'];f=function(){return Q;};return f();}export async function getAuditLog(w,y){const H=Y,d=Math['min'](Math['max'](w[H(0x9d)]??0x32,0x1),0xc8),Z=Math['max']((w[H(0x9e)]??0x1)-0x1,0x0)*d,M=await y['pg']['query']('SELECT\x0a\x20\x20\x20\x20\x20\x20l.*,\x0a\x20\x20\x20\x20\x20\x20case\x20when\x20u.first_name\x20is\x20not\x20null\x20then\x20coalesce(u.last_name,\x27\x27)||coalesce(\x27\x20\x27||u.first_name,\x27\x27)\x20else\x20coalesce(u.login,\x20u.email,\x27\x27)\x20end\x20as\x20user_id_text\x0a\x20\x20\x20\x20FROM\x20admin.audit_log\x20l\x0a\x20\x20\x20\x20JOIN\x20admin.users\x20u\x20ON\x20l.user_id=u.uid\x0a\x20\x20\x20\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[d,Z]);return{'rows':M['rows'],'page':w[H(0x9e)]??0x1,'limit':d};}
@@ -1 +1 @@
1
- function W(){var O=['dictionary','name'];W=function(){return O;};return W();}function n(s,J){s=s-0xab;var N=W();var O=N[s];return O;}export async function getDictionary(s,J){var N=n;return J[N(0xab)]['get'](s[N(0xac)]);}
1
+ export async function getDictionary(w,y){return y['dictionary']['get'](w['name']);}
@@ -1 +1 @@
1
- import s from'node:fs/promises';import J from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=J['resolve'](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(N,O){const o=n,E=normalizePath(N['path']),S=J['resolve'](LOGS_ROOT,E);if(S!==LOGS_ROOT&&!S['startsWith'](LOGS_ROOT+J['sep']))throw new ValidationError('Invalid\x20log\x20path');const T=await s['stat'](S)['catch'](()=>null);if(!T)throw new NotFoundError('Log\x20path\x20not\x20found');if(T['isDirectory']()){const a=await s['readdir'](S,{'withFileTypes':!![]}),g=await Promise[o(0x121)](a['map'](async p=>{const i=o,D=await s['stat'](J[i(0x122)](S,p['name']));return{'name':p['name'],'path':E?E+'/'+p['name']:p['name'],'type':p[i(0x123)]()?i(0x124):'file','size':p['isDirectory']()?undefined:D[i(0x125)],'modified':D['mtime']['toISOString']()};}));g[o(0x126)]((p,D)=>p['name']['localeCompare'](D['name']));if(E){const p=E['split']('/')['slice'](0x0,-0x1)['join']('/');g[o(0x127)]({'name':'..','path':p,'type':'directory'});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(E,g)};}const f=await tailFile(S,TAIL_LINES);return{'contentType':o(0x128),'body':f['join']('\x0a')};}function W(){const L=['all','join','isDirectory','directory','size','sort','unshift','text/plain;\x20charset=utf-8','?path=','logs/','</title></head>\x0a<body>\x0a<h1>','replace','&gt;','alloc','min','utf8','split','slice','reverse'];W=function(){return L;};return W();}function renderDirectory(N,O){const u=n,E=O['map'](T=>{const Q=n,f=Q(0x129)+encodeURIComponent(T['path']),a=T['type']==='directory'?T['name']+'/':T['name'];return'<li><a\x20href=\x22'+f+'\x22>'+escapeHtml(a)+'</a></li>';})['join']('\x0a'),S=escapeHtml(u(0x12a)+N);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+S+u(0x12b)+S+'</h1>\x0a<ul>\x0a'+E+'\x0a</ul>\x0a</body>\x0a</html>';}function n(s,J){s=s-0x121;const N=W();let O=N[s];return O;}function escapeHtml(N){const e=n;return N['replace'](/&/g,'&amp;')[e(0x12c)](/</g,'&lt;')['replace'](/>/g,e(0x12d))[e(0x12c)](/"/g,'&quot;');}function normalizePath(N){const x=n,O=(N??'')[x(0x12c)](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(O['split']('/')['some'](E=>E==='..'))throw new ValidationError('Invalid\x20log\x20path');return O;}async function tailFile(N,O){const G=n,E=await s['open'](N,'r');try{const {size:S}=await E['stat'](),T=0x40*0x400;let f=S,a=Buffer[G(0x12e)](0x0),g=0x0;while(f>0x0&&g<=O){const D=Math[G(0x12f)](T,f);f-=D;const R=Buffer['alloc'](D);await E['read'](R,0x0,D,f),a=Buffer['concat']([R,a]),g+=countNewlines(R);}const p=a['toString'](G(0x130))[G(0x131)]('\x0a')['filter'](v=>v['length']>0x0);return p[G(0x132)](-O)[G(0x133)]();}finally{await E['close']();}}function countNewlines(N){let O=0x0;for(const E of N){if(E===0xa)O++;}return O;}
1
+ import w from'node:fs/promises';import y from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=y['resolve'](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(d,Z){const i=Y,M=normalizePath(d['path']),H=y['resolve'](LOGS_ROOT,M);if(H!==LOGS_ROOT&&!H['startsWith'](LOGS_ROOT+y['sep']))throw new ValidationError('Invalid\x20log\x20path');const Q=await w[i(0xbc)](H)[i(0xbd)](()=>null);if(!Q)throw new NotFoundError('Log\x20path\x20not\x20found');if(Q['isDirectory']()){const j=await w['readdir'](H,{'withFileTypes':!![]}),n=await Promise['all'](j[i(0xbe)](async t=>{const G=i,K=await w['stat'](y['join'](H,t['name']));return{'name':t[G(0xbf)],'path':M?M+'/'+t['name']:t['name'],'type':t[G(0xc0)]()?G(0xc1):'file','size':t[G(0xc0)]()?undefined:K['size'],'modified':K['mtime'][G(0xc2)]()};}));n['sort']((t,K)=>t['name'][i(0xc3)](K[i(0xbf)]));if(M){const t=M['split']('/')['slice'](0x0,-0x1)['join']('/');n['unshift']({'name':'..','path':t,'type':i(0xc1)});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(M,n)};}const s=await tailFile(H,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':s['join']('\x0a')};}function renderDirectory(d,Z){const U=Y,M=Z['map'](Q=>{const s='?path='+encodeURIComponent(Q['path']),j=Q['type']==='directory'?Q['name']+'/':Q['name'];return'<li><a\x20href=\x22'+s+'\x22>'+escapeHtml(j)+'</a></li>';})['join']('\x0a'),H=escapeHtml('logs/'+d);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+H+'</title></head>\x0a<body>\x0a<h1>'+H+U(0xc4)+M+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(d){const E=Y;return d['replace'](/&/g,'&amp;')['replace'](/</g,'&lt;')['replace'](/>/g,'&gt;')['replace'](/"/g,E(0xc5));}function Y(w,y){w=w-0xbc;const d=f();let Z=d[w];return Z;}function normalizePath(d){const e=Y,Z=(d??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(Z['split']('/')[e(0xc6)](M=>M==='..'))throw new ValidationError('Invalid\x20log\x20path');return Z;}function f(){const A=['stat','catch','map','name','isDirectory','directory','toISOString','localeCompare','</h1>\x0a<ul>\x0a','&quot;','some','open','alloc','read','utf8','split','close'];f=function(){return A;};return f();}async function tailFile(d,Z){const l=Y,M=await w[l(0xc7)](d,'r');try{const {size:H}=await M['stat'](),Q=0x40*0x400;let s=H,j=Buffer[l(0xc8)](0x0),n=0x0;while(s>0x0&&n<=Z){const K=Math['min'](Q,s);s-=K;const T=Buffer['alloc'](K);await M[l(0xc9)](T,0x0,K,s),j=Buffer['concat']([T,j]),n+=countNewlines(T);}const t=j['toString'](l(0xca))[l(0xcb)]('\x0a')['filter'](h=>h['length']>0x0);return t['slice'](-Z)['reverse']();}finally{await M[l(0xcc)]();}}function countNewlines(d){let Z=0x0;for(const M of d){if(M===0xa)Z++;}return Z;}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x9c;const N=W();let O=N[s];return O;}export async function getSystemSettings(s,J){const a=n,N=await J['pg'][a(0x9c)]('\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 N[a(0x9d)]['reduce']((O,E)=>{const g=a,S=String(E[g(0x9e)])['split']('.');let T=O;for(const f of S['slice'](0x0,-0x1)){T[f]??={},T=T[f];}return T[S['at'](-0x1)]=E['value'],O;},{});}function W(){const p=['query','rows','key'];W=function(){return p;};return W();}
1
+ export async function getSystemSettings(w,y){const j=Y,d=await y['pg']['query'](j(0x1b1));return d['rows']['reduce']((Z,M)=>{const n=j,H=String(M['key'])[n(0x1b2)]('.');let Q=Z;for(const s of H[n(0x1b3)](0x0,-0x1)){Q[s]??={},Q=Q[s];}return Q[H['at'](-0x1)]=M[n(0x1b4)],Z;},{});}function Y(w,y){w=w-0x1b1;const d=f();let Z=d[w];return Z;}function f(){const t=['\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','split','slice','value'];f=function(){return t;};return f();}
@@ -1 +1 @@
1
- function W(){var O=['dictionary'];W=function(){return O;};return W();}function n(s,J){s=s-0x1a6;var N=W();var O=N[s];return O;}export async function listDictionaries(s,J){var N=n;return J[N(0x1a6)]['list']();}
1
+ function f(){var Z=['list'];f=function(){return Z;};return f();}function Y(w,y){w=w-0x1ce;var d=f();var Z=d[w];return Z;}export async function listDictionaries(w,y){var d=Y;return y['dictionary'][d(0x1ce)]();}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x9e;const N=W();let O=N[s];return O;}function W(){const v=['create','get','add','map','connect','query','BEGIN','type','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','permissions','user','actions','COMMIT'];W=function(){return v;};return W();}const p=n;import{getAccess}from'./get-access.js';const CRUD_ACTIONS=['read','update',p(0x9e),'delete'];function permissionsToAccess(s){const D=p,J=new Map();for(const N of s){const [O,E]=N['split'](':');if(!O)continue;const S=E==='edit'?'update':E,T=J[D(0x9f)](O)??new Set();for(const f of S?[S]:CRUD_ACTIONS)T[D(0xa0)](f);J['set'](O,T);}return[...J][D(0xa1)](([a,g])=>({'resource':a,'actions':[...g]}));}export async function setAccess(s,J){const R=p,N=await J['pg'][R(0xa2)]();try{await N[R(0xa3)](R(0xa4));s[R(0xa5)]==='user'?await N['query'](R(0xa6),[s['id']]):await N['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[s['id']]);const O=s[R(0xa7)]?permissionsToAccess(s[R(0xa7)]):s['access']??[];for(const E of O){s['type']==='user'?await N['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)',[E['resource'],E['actions'],s['id'],s[R(0xa8)]['id'],s['user']['id']]):await N['query']('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[E['resource'],E[R(0xa9)],s['id'],s[R(0xa8)]['id'],s[R(0xa8)]['id']]);}await N['query'](R(0xaa));}catch(S){await N['query']('ROLLBACK');throw S;}finally{N['release']();}return getAccess(s,J);}
1
+ const t=Y;function Y(w,y){w=w-0x7d;const d=f();let Z=d[w];return Z;}import{getAccess}from'./get-access.js';const CRUD_ACTIONS=[t(0x7d),'update','create','delete'];function permissionsToAccess(w){const K=t,y=new Map();for(const d of w){const [Z,M]=d['split'](':');if(!Z)continue;const H=M==='edit'?'update':M,Q=y['get'](Z)??new Set();for(const s of H?[H]:CRUD_ACTIONS)Q['add'](s);y[K(0x7e)](Z,Q);}return[...y][K(0x7f)](([j,n])=>({'resource':j,'actions':[...n]}));}export async function setAccess(w,y){const T=t,d=await y['pg'][T(0x80)]();try{await d['query'](T(0x81));w['type']==='user'?await d[T(0x82)](T(0x83),[w['id']]):await d[T(0x82)]('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[w['id']]);const Z=w['permissions']?permissionsToAccess(w['permissions']):w[T(0x84)]??[];for(const M of Z){w[T(0x85)]==='user'?await d['query'](T(0x86),[M['resource'],M[T(0x87)],w['id'],w['user']['id'],w['user']['id']]):await d[T(0x82)](T(0x88),[M[T(0x89)],M['actions'],w['id'],w['user']['id'],w[T(0x8a)]['id']]);}await d['query']('COMMIT');}catch(H){await d['query']('ROLLBACK');throw H;}finally{d[T(0x8b)]();}return getAccess(w,y);}function f(){const h=['read','set','map','connect','BEGIN','query','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','access','type','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)','actions','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)','resource','user','release'];f=function(){return h;};return f();}
@@ -1 +1 @@
1
- export async function updateDictionary(s,J){var N=n;return await J[N(0xc0)]['put'](s['name'],s[N(0xc1)]),{'success':!![]};}function n(s,J){s=s-0xc0;var N=W();var O=N[s];return O;}function W(){var O=['dictionary','items'];W=function(){return O;};return W();}
1
+ function f(){var Z=['name','items'];f=function(){return Z;};return f();}function Y(w,y){w=w-0xe7;var d=f();var Z=d[w];return Z;}export async function updateDictionary(w,y){var d=Y;return await y['dictionary']['put'](w[d(0xe7)],w[d(0xe8)]),{'success':!![]};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(s,J){const E=n;if(!Object[E(0xd5)](s['patch'])[E(0xd6)])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [N,O]of Object[E(0xd7)](s[E(0xd8)])){if(!N['trim']()||N[E(0xd9)]('..'))throw new ValidationError(E(0xda)+N);await J['pg']['query'](E(0xdb),[N,JSON['stringify'](O),s[E(0xdc)]['id']]);}return{'success':!![]};}function n(s,J){s=s-0xd5;const N=W();let O=N[s];return O;}function W(){const S=['keys','length','entries','patch','includes','Invalid\x20setting\x20key:\x20','\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','user'];W=function(){return S;};return W();}
1
+ function Y(w,y){w=w-0xc4;const d=f();let Z=d[w];return Z;}import{ValidationError}from'../../../errors.js';function f(){const H=['patch','length','query','user'];f=function(){return H;};return f();}export async function updateSystemSettings(w,y){const M=Y;if(!Object['keys'](w[M(0xc4)])[M(0xc5)])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [d,Z]of Object['entries'](w['patch'])){if(!d['trim']()||d['includes']('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+d);await y['pg'][M(0xc6)]('\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',[d,JSON['stringify'](Z),w[M(0xc7)]['id']]);}return{'success':!![]};}
@@ -1 +1 @@
1
- function W(){var O=['includes'];W=function(){return O;};return W();}function n(s,J){s=s-0x1d2;var N=W();var O=N[s];return O;}import{ForbiddenError}from'../../errors.js';export function requireAdmin(s,J){var N=n;if(!s)throw new ForbiddenError('User\x20required');if(s['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(s['type']!=='admin'&&J&&!s['permissions']?.[N(0x1d2)](J))throw new ForbiddenError('Missing\x20permission:\x20'+J);}
1
+ import{ForbiddenError}from'../../errors.js';function f(){var Z=['User\x20required','type','Admin\x20access\x20required','permissions'];f=function(){return Z;};return f();}function Y(w,y){w=w-0x6a;var d=f();var Z=d[w];return Z;}export function requireAdmin(w,y){var d=Y;if(!w)throw new ForbiddenError(d(0x6a));if(w[d(0x6b)]!=='admin')throw new ForbiddenError(d(0x6c));if(w['type']!=='admin'&&y&&!w[d(0x6d)]?.['includes'](y))throw new ForbiddenError('Missing\x20permission:\x20'+y);}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x1dc;const N=W();let O=N[s];return O;}function W(){const S=['salt','credentials','fromEntries','entries','includes'];W=function(){return S;};return W();}export const safeUser=s=>{const E=n,J=['password',E(0x1dc),'secret',E(0x1dd)];return Object[E(0x1de)](Object[E(0x1df)](s)['filter'](([N])=>!J['some'](O=>N['toLowerCase']()[E(0x1e0)](O))));};
1
+ function f(){const H=['password','secret','some'];f=function(){return H;};return f();}function Y(w,y){w=w-0xd2;const d=f();let Z=d[w];return Z;}export const safeUser=w=>{const M=Y,y=[M(0xd2),'salt',M(0xd3),'credentials'];return Object['fromEntries'](Object['entries'](w)['filter'](([d])=>!y[M(0xd4)](Z=>d['toLowerCase']()['includes'](Z))));};
@@ -1 +1 @@
1
- function n(s,J){s=s-0x1e6;var N=W();var O=N[s];return O;}function W(){var N=['\x20requires\x20a\x20project/provider\x20implementation'];W=function(){return N;};return W();}import{UnsupportedError}from'../../errors.js';export function unsupported(s){var J=n;throw new UnsupportedError(s+J(0x1e6));}
1
+ import{UnsupportedError}from'../../errors.js';function f(){var d=['\x20requires\x20a\x20project/provider\x20implementation'];f=function(){return d;};return f();}function Y(w,y){w=w-0xbb;var d=f();var Z=d[w];return Z;}export function unsupported(w){var y=Y;throw new UnsupportedError(w+y(0xbb));}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(s){const J=writeAudit(s);return{'write':J};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(w){const y=writeAudit(w);return{'write':y};}
@@ -1 +1 @@
1
- const secretPattern=/password|token|secret|credential|salt/i;function n(s,J){s=s-0x1ba;const N=W();let O=N[s];return O;}function clean(s){const g=n;if(Array[g(0x1ba)](s))return s['map'](clean);if(s&&typeof s==='object')return Object['fromEntries'](Object['entries'](s)['map'](([J,N])=>[J,secretPattern['test'](J)?'[REDACTED]':clean(N)]));return s;}export function writeAudit(s){let J,N;async function O(){const p=n;if(!s['pg'])return![];if(J!==undefined)return J;return N??=s['pg']['query'](p(0x1bb))['then'](E=>{const D=p,S=new Set(E['rows']['map'](T=>T['table_name']));return J=S[D(0x1bc)](D(0x1bd))&&S['has']('audit_log_data'),!J&&s[D(0x1be)]['warn']({'expectedTables':[D(0x1bf),D(0x1c0)],'foundTables':[...S]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),J;})['catch'](E=>{return J=![],s['logger']['warn']({'err':E},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),N;}return async function E(S){const R=n;if(!await O())return s['logger']['info']({'auditFallback':!![],'event':clean({...S,'changes':S[R(0x1c1)]?.[R(0x1c2)](a=>({...a,'oldValue':clean(a['oldValue']),'newValue':clean(a[R(0x1c3)])}))})},'audit'),0x0;if(!s['pg'])throw new Error(R(0x1c4));const T=await s['pg'][R(0x1c5)]('\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',[S['userId']??null,S[R(0x1c6)],S['resource'],S['resourceId']==null?null:String(S['resourceId']),S['fields']??null,S['action'],S['requestId']??null,S['ipAddress']??null,clean(S['metadata']??{})]),f=T[R(0x1c7)][0x0]['id'];for(const a of S['changes']??[]){if(secretPattern['test'](a[R(0x1c8)]))continue;await s['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',[f,a['field'],JSON[R(0x1c9)](clean(a['oldValue'])),JSON['stringify'](clean(a[R(0x1c3)]))]);}return f;};}function W(){const v=['isArray','\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','has','audit_log','logger','admin.audit_log','admin.audit_log_data','changes','map','newValue','empty\x20pg','query','module','rows','field','stringify'];W=function(){return v;};return W();}
1
+ function f(){const i=['fromEntries','entries','query','then','map','audit_log_data','logger','warn','audit','module','ipAddress','metadata','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20'];f=function(){return i;};return f();}const secretPattern=/password|token|secret|credential|salt/i;function clean(w){const n=Y;if(Array['isArray'](w))return w['map'](clean);if(w&&typeof w==='object')return Object[n(0x1b9)](Object[n(0x1ba)](w)['map'](([y,d])=>[y,secretPattern['test'](y)?'[REDACTED]':clean(d)]));return w;}function Y(w,y){w=w-0x1b9;const d=f();let Z=d[w];return Z;}export function writeAudit(w){let y,d;async function Z(){const t=Y;if(!w['pg'])return![];if(y!==undefined)return y;return d??=w['pg'][t(0x1bb)]('\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')[t(0x1bc)](M=>{const K=t,H=new Set(M['rows'][K(0x1bd)](Q=>Q['table_name']));return y=H['has']('audit_log')&&H['has'](K(0x1be)),!y&&w[K(0x1bf)][K(0x1c0)]({'expectedTables':['admin.audit_log','admin.audit_log_data'],'foundTables':[...H]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),y;})['catch'](M=>{const T=t;return y=![],w[T(0x1bf)][T(0x1c0)]({'err':M},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),d;}return async function M(H){const h=Y;if(!await Z())return w[h(0x1bf)]['info']({'auditFallback':!![],'event':clean({...H,'changes':H['changes']?.['map'](j=>({...j,'oldValue':clean(j['oldValue']),'newValue':clean(j['newValue'])}))})},h(0x1c1)),0x0;if(!w['pg'])throw new Error('empty\x20pg');const Q=await w['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',[H['userId']??null,H[h(0x1c2)],H['resource'],H['resourceId']==null?null:String(H['resourceId']),H['fields']??null,H['action'],H['requestId']??null,H[h(0x1c3)]??null,clean(H[h(0x1c4)]??{})]),s=Q['rows'][0x0]['id'];for(const j of H['changes']??[]){if(secretPattern['test'](j['field']))continue;await w['pg'][h(0x1bb)](h(0x1c5),[s,j['field'],JSON['stringify'](clean(j['oldValue'])),JSON['stringify'](clean(j['newValue']))]);}return s;};}
@@ -1 +1 @@
1
- export async function getUserPermissions(s,J){const N=await J['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',[s]);return N['rows']['map'](O=>O['permission']);}
1
+ function Y(w,y){w=w-0x151;const d=f();let Z=d[w];return Z;}export async function getUserPermissions(w,y){const M=Y,d=await y['pg'][M(0x151)]('\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',[w]);return d['rows']['map'](Z=>Z['permission']);}function f(){const H=['query'];f=function(){return H;};return f();}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBA6CzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAYhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAwD5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBAmDzB"}
@@ -1 +1 @@
1
- export*from'./auth.types.js';import{randomBytes,scrypt as s,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(s);import J from'@fastify/cookie';import N from'@fastify/session';import{Authenticator}from'@fastify/passport';import O from'fastify-session-redis-store';function W(){const Q=['scrypt$','toString','hex','split','scrypt','from','test','cookieOptions','auth','register','registerUserSerializer','registerUserDeserializer','user'];W=function(){return Q;};return W();}import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();function n(s,J){s=s-0x192;const N=W();let O=N[s];return O;}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(E){const R=n,S=randomBytes(0x10),T=await scrypt(E,S,0x40);return R(0x192)+S[R(0x193)](R(0x194))+'$'+T[R(0x193)]('hex');}export async function verifyPassword(E,S){const v=n,[T,f,a]=S?.[v(0x195)]('$')||[];if(T!==v(0x196)||!f||!a)return![];const g=Buffer[v(0x197)](f,'hex'),p=Buffer['from'](a,'hex'),D=await scrypt(E,g,p['length']);return timingSafeEqual(D,p);}export async function createSessionStore(E,S){const o=n,{config:T,redis:f}=S;if(!T||!f){console['warn']('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV===o(0x198)||process.env.VITEST)return;await E['register'](J,{'parseOptions':T['auth'][o(0x199)]}),await E['register'](N,{'secret':T['auth']['secret'],'cookieName':T['auth']['cookieName'],'cookie':T[o(0x19a)]['cookieOptions'],'store':new O({'prefix':T['auth']['cookieName']+':'+(T['pg']?.['database']||'db')+':','client':f})}),await E['register'](fastifyPassport['initialize']()),await E[o(0x19b)](fastifyPassport['secureSession']()),fastifyPassport[o(0x19c)](async a=>({'user':a})),fastifyPassport[o(0x19d)](async a=>{const i=o,g=a?.[i(0x19e)]||a;return g?.['id']&&(g['permissions']=await getUserPermissions(g['id'],S)),g;});}
1
+ const T=Y;export*from'./auth.types.js';import{randomBytes,scrypt as w,timingSafeEqual}from'node:crypto';import{mkdir,readFile,unlink,writeFile}from'node:fs/promises';import{join,resolve}from'node:path';function Y(w,y){w=w-0x75;const d=f();let Z=d[w];return Z;}import{promisify}from'node:util';const scrypt=promisify(w);import y from'@fastify/cookie';import d from'@fastify/session';import{Authenticator}from'@fastify/passport';import Z from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';function f(){const e=['path','fileFor','code','stringify','from','warn','cookieOptions','host','auth','database'];f=function(){return e;};return f();}const fastifyPassport=new Authenticator();class FileSessionStore{[T(0x75)];constructor(M){const h=T;this[h(0x75)]=M,void mkdir(this[h(0x75)],{'recursive':!![]});}[T(0x76)](M){return join(this['path'],M+'.json');}async['get'](M,H){const i=T;try{const Q=await readFile(this[i(0x76)](M),'utf8');H(null,JSON['parse'](Q));}catch(s){const j=s;if(j[i(0x77)]==='ENOENT'){H(null,undefined);return;}H(j,undefined);}}async['set'](M,H,Q){const G=T;try{await mkdir(this['path'],{'recursive':!![]}),await writeFile(this['fileFor'](M),JSON[G(0x78)](H),'utf8'),Q();}catch(s){Q(s);}}async['destroy'](M,H){try{await unlink(this['fileFor'](M))['catch'](Q=>{if(Q['code']!=='ENOENT')throw Q;}),H();}catch(Q){H(Q);}}}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(M){const H=randomBytes(0x10),Q=await scrypt(M,H,0x40);return'scrypt$'+H['toString']('hex')+'$'+Q['toString']('hex');}export async function verifyPassword(M,H){const U=T,[Q,s,j]=H?.['split']('$')||[];if(Q!=='scrypt'||!s||!j)return![];const n=Buffer['from'](s,'hex'),t=Buffer[U(0x79)](j,'hex'),K=await scrypt(M,n,t['length']);return timingSafeEqual(K,t);}export async function createSessionStore(M,H){const E=T,{config:Q,redis:s}=H;if(!Q){console[E(0x7a)]('Missing\x20config\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await M['register'](y,{'parseOptions':Q['auth'][E(0x7b)]});const j=Q['redis'][E(0x7c)]?new Z({'prefix':Q[E(0x7d)]['cookieName']+':'+(Q['pg']?.[E(0x7e)]||'db')+':','client':s}):new FileSessionStore(resolve(Q['storagePath']??'./storage','sessions'));await M['register'](d,{'secret':Q['auth']['secret'],'cookieName':Q['auth']['cookieName'],'cookie':Q['auth']['cookieOptions'],'store':j}),await M['register'](fastifyPassport['initialize']()),await M['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async n=>({'user':n})),fastifyPassport['registerUserDeserializer'](async n=>{const t=n?.['user']||n;return t?.['id']&&(t['permissions']=await getUserPermissions(t['id'],H)),t;});}
@@ -1 +1 @@
1
- import{BadRequestError}from'../../errors.js';import{verifyPassword}from'./index.js';function n(s,J){s=s-0x184;const N=W();let O=N[s];return O;}export async function verifyUser({user:s,password:J,ip:N},{pg:O,logger:E}){const p=n;if(!s||s==='')throw new BadRequestError(p(0x184));if(!J||J==='')throw new BadRequestError(p(0x185));E['metrics']('user.login');const S='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',T=await O['query'](S,[s])[p(0x186)](a=>a['rows']?.[0x0]);if(!T){const a='user\x20not\x20found';E['info']({'file':p(0x187),'error':a,'user':s,'ip':N});throw new BadRequestError(a);}const f=await verifyPassword(J,T[p(0x188)]);if(!f){const g='Wrong\x20password';E['info']({'file':'auth/warn','error':g,'user':s,'ip':N});throw new BadRequestError(g);}return delete T['password_hash'],T;}function W(){const D=['not\x20enough\x20params:\x20user','not\x20enough\x20params:\x20password','then','auth/warn','password_hash'];W=function(){return D;};return W();}
1
+ function Y(w,y){w=w-0x77;const d=f();let Z=d[w];return Z;}import{BadRequestError}from'../../errors.js';function f(){const K=['not\x20enough\x20params:\x20user','not\x20enough\x20params:\x20password','metrics','then','info'];f=function(){return K;};return f();}import{verifyPassword}from'./index.js';export async function verifyUser({user:w,password:y,ip:d},{pg:Z,logger:M}){const t=Y;if(!w||w==='')throw new BadRequestError(t(0x77));if(!y||y==='')throw new BadRequestError(t(0x78));M[t(0x79)]('user.login');const H='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',Q=await Z['query'](H,[w])[t(0x7a)](j=>j['rows']?.[0x0]);if(!Q){const j='user\x20not\x20found';M[t(0x7b)]({'file':'auth/warn','error':j,'user':w,'ip':d});throw new BadRequestError(j);}const s=await verifyPassword(y,Q['password_hash']);if(!s){const n='Wrong\x20password';M['info']({'file':'auth/warn','error':n,'user':w,'ip':d});throw new BadRequestError(n);}return delete Q['password_hash'],Q;}
@@ -1 +1 @@
1
- function W(){const P=['empty\x20pg','query','Invalid\x20dictionary\x20name:\x20','code','has','items','Dictionary\x20table\x20not\x20found','rows','database','checked','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','parentId','COMMIT','ROLLBACK','values'];W=function(){return P;};return W();}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function n(s,J){s=s-0x19d;const N=W();let O=N[s];return O;}export function createDictionary({pg:s,dictionaries:dictionaries=[]}){const J=new Map(),N=new Map();let O,E;async function S(){const l=n;if(O!==undefined)return O;if(!s)throw new Error(l(0x19d));return E??=s[l(0x19e)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](o=>{const i=o['rows'][0x0]?.['table_name'];O=i==='dictionaries'?i:null;}),await E,O;}function T(o){const H=n;if(!dictionaryName['test'](o))throw new ValidationError(H(0x19f)+o);}function f(o){const U=n;for(const i of Array['isArray'](o)?o:[o]){T(i[U(0x1a0)]);if(!Array['isArray'](i['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+i['code']);if(J['has'](i['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+i[U(0x1a0)]);J['set'](i['code'],{...i,'source':'static'});}}function a(o){const F=n;return J[F(0x1a1)](o);}async function g(o){const B=n;T(o);const i=J['get'](o);if(i&&i['checked'])return i[B(0x1a2)];const Q=await S();if(!Q)throw new NotFoundError(B(0x1a3));const u=await s?.['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',[o]);if(u?.[B(0x1a4)]?.['length']){const e=u?.['rows'];return J['set'](o,{'code':o,'name':o,'items':e,'source':B(0x1a5),'checked':!![]}),e;}if(!i?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+o);return i[B(0x1a6)]=!![],i[B(0x1a2)];}async function p(o,i){const k=n;T(o);if(!Array['isArray'](i))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const Q=await S();if(!Q)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!s)throw new Error('empty\x20pg');const u=await s['connect']();try{await u['query']('BEGIN');const e=await u['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',[o,o,'fcore','custom',!![]]),x=e[k(0x1a4)][0x0]['id'];await u['query'](k(0x1a7),[x]);for(const G of i){await u[k(0x19e)]('\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',[x,G['code'],G['name'],G[k(0x1a8)]??null]);}await u['query'](k(0x1a9));}catch(L){await u['query'](k(0x1aa));throw L;}finally{u['release']();}J['set'](o,{'items':i,'code':o,'source':'static','checked':!![]}),N['set'](o,(N['get'](o)??0x0)+0x1);}function D(o){return T(o),N['set'](o,(N['get'](o)??0x0)+0x1),J['delete'](o);}function R(o){return N['get'](o)??0x0;}async function v(){const q=n,o=[...J[q(0x1ab)]()]['map'](({code:u,name:e,source:x})=>({'code':u,'name':e??u,'source':x})),i=await S();if(!i)return o;if(!s)throw new Error('empty\x20pg');const Q=await s['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 u of Q['rows']){!J['has'](u[q(0x1a0)])&&o['push'](u);}return o;}return f(dictionaries),{'register':f,'get':g,'put':p,'clear':D,'revision':R,'list':v,'has':a};}
1
+ import{ConflictError,NotFoundError,ValidationError}from'../errors.js';function Y(w,y){w=w-0x1cc;const d=f();let Z=d[w];return Z;}function f(){const b=['query','table_name','Invalid\x20dictionary\x20name:\x20','code','items','Dictionary\x20already\x20registered:\x20','static','rows','isArray','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionaries\x20(code,\x20name,\x20module,\x20source,\x20editable)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(code)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20name\x20=\x20EXCLUDED.name,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module\x20=\x20EXCLUDED.module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20source\x20=\x20EXCLUDED.source,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20editable\x20=\x20EXCLUDED.editable,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','fcore','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','COMMIT','release','set','get','values','map'];f=function(){return b;};return f();}const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:w,dictionaries:dictionaries=[]}){const y=new Map(),d=new Map();let Z,M;async function H(){const x=Y;if(Z!==undefined)return Z;if(!w)throw new Error('empty\x20pg');return M??=w[x(0x1cc)]('\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'](i=>{const o=x,G=i['rows'][0x0]?.[o(0x1cd)];Z=G==='dictionaries'?G:null;}),await M,Z;}function Q(i){const r=Y;if(!dictionaryName['test'](i))throw new ValidationError(r(0x1ce)+i);}function s(i){const S=Y;for(const G of Array['isArray'](i)?i:[i]){Q(G[S(0x1cf)]);if(!Array['isArray'](G[S(0x1d0)]))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+G['code']);if(y['has'](G['code']))throw new ConflictError(S(0x1d1)+G[S(0x1cf)]);y['set'](G[S(0x1cf)],{...G,'source':S(0x1d2)});}}function j(i){return y['has'](i);}async function n(i){const D=Y;Q(i);const G=y['get'](i);if(G&&G['checked'])return G['items'];const U=await H();if(!U)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const E=await w?.['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',[i]);if(E?.[D(0x1d3)]?.['length']){const e=E?.['rows'];return y['set'](i,{'code':i,'name':i,'items':e,'source':'database','checked':!![]}),e;}if(!G?.[D(0x1d0)])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+i);return G['checked']=!![],G['items'];}async function t(i,G){const p=Y;Q(i);if(!Array[p(0x1d4)](G))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const U=await H();if(!U)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!w)throw new Error('empty\x20pg');const E=await w['connect']();try{await E['query']('BEGIN');const e=await E[p(0x1cc)](p(0x1d5),[i,i,p(0x1d6),'custom',!![]]),l=e['rows'][0x0]['id'];await E['query'](p(0x1d7),[l]);for(const A of G){await E['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',[l,A['code'],A['name'],A['parentId']??null]);}await E[p(0x1cc)](p(0x1d8));}catch(c){await E[p(0x1cc)]('ROLLBACK');throw c;}finally{E[p(0x1d9)]();}y['set'](i,{'items':G,'code':i,'source':'static','checked':!![]}),d['set'](i,(d['get'](i)??0x0)+0x1);}function K(i){const W=Y;return Q(i),d[W(0x1da)](i,(d['get'](i)??0x0)+0x1),y['delete'](i);}function T(i){const I=Y;return d[I(0x1db)](i)??0x0;}async function h(){const a=Y,i=[...y[a(0x1dc)]()][a(0x1dd)](({code:E,name:e,source:l})=>({'code':E,'name':e??E,'source':l})),G=await H();if(!G)return i;if(!w)throw new Error('empty\x20pg');const U=await w['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 E of U[a(0x1d3)]){!y['has'](E['code'])&&i['push'](E);}return i;}return s(dictionaries),{'register':s,'get':n,'put':t,'clear':K,'revision':T,'list':h,'has':j};}
@@ -1,6 +1,3 @@
1
- /**
2
- * Implements the S3-compatible file storage adapter and its contracts.
3
- */
4
1
  import type { Readable } from "node:stream";
5
2
  export interface FileAdapter {
6
3
  put(path: string, body: Buffer | Readable): Promise<void>;
@@ -23,5 +20,12 @@ export interface FileS3Config {
23
20
  tokenSecret?: string;
24
21
  tokenTtl?: number;
25
22
  }
23
+ export interface FileLocalConfig {
24
+ storagePath: string;
25
+ folder?: string;
26
+ tokenSecret?: string;
27
+ tokenTtl?: number;
28
+ }
29
+ export declare function createFileLocal(config: FileLocalConfig): FileAdapter;
26
30
  export declare function createFileS3(config: FileS3Config): FileAdapter;
27
31
  //# sourceMappingURL=file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/plugins/file.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,WAAW;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAKD,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAgCD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAiF9D"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/plugins/file.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,WAAW;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAKD,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAoCD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,CAiFpE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAiF9D"}
@@ -1 +1 @@
1
- import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';function W(){const x=['replace','push','from','accessKeyId','accessKey','send','Body','$metadata','httpStatusCode','tokenTtl','toString','update','Invalid\x20file\x20token','sha256','digest','length'];W=function(){return x;};return W();}import s from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(J,N){const D=n;if(!N||N['startsWith']('/')||N['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const O=N[D(0xb7)](/\\/g,'/')['replace'](/^\/+/,''),E=(J??'')['replace'](/^\/+|\/+$/g,'');return E?E+'/'+O:O;}function n(s,J){s=s-0xb7;const N=W();let O=N[s];return O;}async function bodyToBuffer(J){const R=n;if(!J)return Buffer['alloc'](0x0);const N=J;if(typeof N['transformToByteArray']==='function')return Buffer['from'](await N['transformToByteArray']());const O=[];for await(const E of J){O[R(0xb8)](Buffer[R(0xb9)](E));}return Buffer['concat'](O);}export function createFileS3(J){const v=n,N=J['tokenSecret']??process.env.FILE_TOKEN_SECRET??s['randomBytes'](0x20)['toString']('hex'),O=new S3Client({'endpoint':J['endpoint'],'region':J['region']??'us-east-1','forcePathStyle':J['forcePathStyle']??!![],'credentials':J[v(0xba)]||J[v(0xbb)]?{'accessKeyId':J[v(0xba)]??J['accessKey'],'secretAccessKey':J['secretAccessKey']??J['secretKey']}:undefined}),E=S=>keyFor(J['folder'],S);return{async 'put'(S,T){await O['send'](new PutObjectCommand({'Bucket':J['bucket'],'Key':E(S),'Body':T}));},async 'get'(S){const o=v,T=await O[o(0xbc)](new GetObjectCommand({'Bucket':J['bucket'],'Key':E(S)}));return bodyToBuffer(T[o(0xbd)]);},async 'exists'(S){const i=v;try{return await O['send'](new HeadObjectCommand({'Bucket':J['bucket'],'Key':E(S)})),!![];}catch(T){const f=T;if(f[i(0xbe)]?.[i(0xbf)]===0x194||f['name']==='NotFound')return![];throw T;}},async 'delete'(S){const Q=v;await O[Q(0xbc)](new DeleteObjectCommand({'Bucket':J['bucket'],'Key':E(S)}));},'create'(S,T=J[v(0xc0)]??0xe10){const u=v,f=Buffer['from'](S)[u(0xc1)]('base64url'),a=s['createHmac']('sha256',N)[u(0xc2)](f)['digest']('base64url');return f+'.'+a;},'verify'(S){const e=v,[T,f]=S['split']('.');if(!T||!f)throw new UnauthorizedError(e(0xc3));const a=s['createHmac'](e(0xc4),N)['update'](T)[e(0xc5)](),g=Buffer['from'](f,'base64url');if(a[e(0xc6)]!==g['length']||!s['timingSafeEqual'](a,g))throw new UnauthorizedError('Invalid\x20file\x20token');const p=Buffer['from'](T,'base64url')[e(0xc1)]('utf8');return p;}};}
1
+ function Y(w,y){w=w-0x16f;const d=f();let Z=d[w];return Z;}function f(){const F=['startsWith','Invalid\x20file\x20path','replace','alloc','transformToByteArray','function','from','toString','hex','files','isAbsolute','resolve','readFile','mkdir','createHmac','base64url','length','endpoint','us-east-1','send','bucket','Body','sha256','update','timingSafeEqual'];f=function(){return F;};return f();}import w from'node:fs/promises';import y from'node:path';import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import d from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function normalizeRelativePath(Z){const U=Y;if(!Z||Z[U(0x16f)]('/')||Z['includes']('..'))throw new ValidationError(U(0x170));return Z[U(0x171)](/\\/g,'/')['replace'](/^\/+/,'');}function keyFor(Z,M){return''+((Z??'')['replace'](/^\/+|\/+$/g,'')?(Z??'')['replace'](/^\/+|\/+$/g,'')+'/':'')+normalizeRelativePath(M);}async function bodyToBuffer(Z){const E=Y;if(!Z)return Buffer[E(0x172)](0x0);const M=Z;if(typeof M[E(0x173)]===E(0x174))return Buffer['from'](await M[E(0x173)]());const H=[];for await(const Q of Z){H['push'](Buffer[E(0x175)](Q));}return Buffer['concat'](H);}export function createFileLocal(Z){const e=Y,M=y['resolve'](Z['storagePath']||'./storage'),H=y['join'](M,'removed'),Q=Z['tokenSecret']??process.env.FILE_TOKEN_SECRET??d['randomBytes'](0x20)[e(0x176)](e(0x177)),s=t=>{const l=e,K=normalizeRelativePath(t),T=(Z['folder']??l(0x178))['replace'](/^\/+|\/+$/g,'');return T?y['join'](T,K):K;},j=t=>{const A=e,K=s(t),T=y['resolve'](M,K),h=y['relative'](M,T);if(h['startsWith']('..')||y[A(0x179)](h))throw new ValidationError('Invalid\x20file\x20path');return T;},n=t=>{const c=e,K=s(t),T=y[c(0x17a)](H,K),h=y['relative'](H,T);if(h[c(0x16f)]('..')||y['isAbsolute'](h))throw new ValidationError('Invalid\x20file\x20path');return T;};return{async 'put'(t,K){const T=j(t);await w['mkdir'](y['dirname'](T),{'recursive':!![]}),await w['writeFile'](T,K instanceof Buffer?K:await bodyToBuffer(K));},async 'get'(t){const x=e;return w[x(0x17b)](j(t));},async 'exists'(t){try{return await w['access'](j(t)),!![];}catch{return![];}},async 'delete'(t){const o=e,K=j(t),T=n(t);try{await w[o(0x17c)](y['dirname'](T),{'recursive':!![]}),await w['rename'](K,T);}catch(h){const i=h;if(i['code']!=='ENOENT')throw h;}},'create'(t,K=Z['tokenTtl']??0xe10){const r=e,T=Buffer['from'](t)['toString']('base64url'),h=d[r(0x17d)]('sha256',Q)['update'](T)['digest']('base64url');return T+'.'+h;},'verify'(t){const S=e,[K,T]=t['split']('.');if(!K||!T)throw new UnauthorizedError('Invalid\x20file\x20token');const h=d['createHmac']('sha256',Q)['update'](K)['digest'](),i=Buffer[S(0x175)](T,S(0x17e));if(h['length']!==i[S(0x17f)]||!d['timingSafeEqual'](h,i))throw new UnauthorizedError('Invalid\x20file\x20token');const G=Buffer[S(0x175)](K,'base64url')['toString']('utf8');return G;}};}export function createFileS3(Z){const D=Y,M=Z['tokenSecret']??process.env.FILE_TOKEN_SECRET??d['randomBytes'](0x20)['toString']('hex'),H=new S3Client({'endpoint':Z[D(0x180)],'region':Z['region']??D(0x181),'forcePathStyle':Z['forcePathStyle']??!![],'credentials':Z['accessKeyId']||Z['accessKey']?{'accessKeyId':Z['accessKeyId']??Z['accessKey'],'secretAccessKey':Z['secretAccessKey']??Z['secretKey']}:undefined}),Q=s=>keyFor(Z['folder'],s);return{async 'put'(s,j){const p=D;await H[p(0x182)](new PutObjectCommand({'Bucket':Z[p(0x183)],'Key':Q(s),'Body':j}));},async 'get'(s){const W=D,j=await H['send'](new GetObjectCommand({'Bucket':Z['bucket'],'Key':Q(s)}));return bodyToBuffer(j[W(0x184)]);},async 'exists'(s){const I=D;try{return await H['send'](new HeadObjectCommand({'Bucket':Z[I(0x183)],'Key':Q(s)})),!![];}catch(j){const n=j;if(n['$metadata']?.['httpStatusCode']===0x194||n['name']==='NotFound')return![];throw j;}},async 'delete'(s){const a=D;await H[a(0x182)](new DeleteObjectCommand({'Bucket':Z['bucket'],'Key':Q(s)}));},'create'(s,j=Z['tokenTtl']??0xe10){const b=D,n=Buffer[b(0x175)](s)['toString']('base64url'),t=d['createHmac'](b(0x185),M)[b(0x186)](n)['digest'](b(0x17e));return n+'.'+t;},'verify'(s){const C=D,[j,n]=s['split']('.');if(!j||!n)throw new UnauthorizedError('Invalid\x20file\x20token');const t=d['createHmac']('sha256',M)[C(0x186)](j)['digest'](),K=Buffer[C(0x175)](n,'base64url');if(t['length']!==K['length']||!d[C(0x187)](t,K))throw new UnauthorizedError('Invalid\x20file\x20token');const T=Buffer[C(0x175)](j,C(0x17e))[C(0x176)]('utf8');return T;}};}
@@ -1 +1 @@
1
- function n(s,J){s=s-0xe7;const N=W();let O=N[s];return O;}import{SignJWT,jwtVerify}from'jose';function W(){const f=['HS256','setIssuedAt','catch','payload'];W=function(){return f;};return W();}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(s){const S=n;if(!process.env.AUTH_JWT_SECRET)return;const {id:J,type:N,permissions:O}=s,E=await new SignJWT({'id':J,'type':N,'permissions':O})['setProtectedHeader']({'alg':S(0xe7)})[S(0xe8)]()['setExpirationTime']('1h')['sign'](secret);return E;}export async function jwtVerifyToken(s){const T=n,J=await jwtVerify(s,secret,{'algorithms':['HS256']})[T(0xe9)](N=>{console['log'](N['message']);});return J?.[T(0xea)];}
1
+ const H=Y;import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()[H(0xa0)](process.env.AUTH_JWT_SECRET);function f(){const n=['encode','HS256','setIssuedAt','sign','catch','log','message','payload'];f=function(){return n;};return f();}function Y(w,y){w=w-0xa0;const d=f();let Z=d[w];return Z;}export async function jwtSignToken(w){const Q=H;if(!process.env.AUTH_JWT_SECRET)return;const {id:y,type:d,permissions:Z}=w,M=await new SignJWT({'id':y,'type':d,'permissions':Z})['setProtectedHeader']({'alg':Q(0xa1)})[Q(0xa2)]()['setExpirationTime']('1h')[Q(0xa3)](secret);return M;}export async function jwtVerifyToken(w){const s=H,y=await jwtVerify(w,secret,{'algorithms':[s(0xa1)]})[s(0xa4)](d=>{const j=s;console[j(0xa5)](d[j(0xa6)]);});return y?.[s(0xa7)];}
@@ -1 +1 @@
1
- function W(){const a=['app','password','accessToken','[REDACTED]','bind'];W=function(){return a;};return W();}function n(s,J){s=s-0x92;const N=W();let O=N[s];return O;}import s from'pino';export function createLogger(){const f=n,J=s['transport']({'target':'./transport.js'}),N=s({'level':'info','timestamp':s['stdTimeFunctions']['isoTime'],'base':{'service':f(0x92)},'redact':{'paths':['req.headers.authorization',f(0x93),'token',f(0x94),'refreshToken'],'censor':f(0x95)}},J),O={};function E(S,T){if(S===undefined)return{...O};O[S]=(O[S]??0x0)+(T??0x1);}return Object['assign'](N,{'close':async()=>J['end'](),'metrics':E,'file':()=>N['info'][f(0x96)](N)});}
1
+ import w from'pino';function f(){const j=['stdTimeFunctions','accessToken','refreshToken'];f=function(){return j;};return f();}function Y(w,y){w=w-0x192;const d=f();let Z=d[w];return Z;}export function createLogger(){const s=Y,y=w['transport']({'target':'./transport.js'}),d=w({'level':'info','timestamp':w[s(0x192)]['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization','password','token',s(0x193),s(0x194)],'censor':'[REDACTED]'}},y),Z={};function M(H,Q){if(H===undefined)return{...Z};Z[H]=(Z[H]??0x0)+(Q??0x1);}return Object['assign'](d,{'close':async()=>y['end'](),'metrics':M,'file':()=>d['info']['bind'](d)});}
@@ -1 +1 @@
1
- const f=n;import s from'node:fs';import J from'node:path';import N from'pino-abstract-transport';const LEVELS={0x1e:f(0xdd),0x28:f(0xde),0x32:'error',0x3c:f(0xdf)},streams=new Map();function n(s,J){s=s-0xdd;const N=W();let O=N[s];return O;}function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(O,E){const a=f,S=J[a(0xe0)]('logs',O);return s['mkdirSync'](S,{'recursive':!![]}),s['createWriteStream'](J[a(0xe1)](S,E+'.log'),{'flags':'a'});}function getStream(O){const g=f,E=getDate(),S=streams['get'](O);if(S&&S[g(0xe2)]===E)return S[g(0xe3)];S?.['stream']['end']();const T=createStream(O,E);return streams['set'](O,{'date':E,'stream':T}),T;}function closeStreams(){const p=f;for(const {stream:O}of streams[p(0xe4)]()){O['end']();}streams['clear']();}function W(){const R=['info','warn','error','resolve','join','date','stream','values','file'];W=function(){return R;};return W();}export default async function loggerTransport(){return N(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(O){const D=f;for await(const E of O){const S=LEVELS[E['level']];if(!S)continue;const T=getStream(E[D(0xe5)]||S);delete E['file'],T['write'](JSON['stringify'](E)+'\x0a');}}
1
+ function Y(w,y){w=w-0x14b;const d=f();let Z=d[w];return Z;}const s=Y;import w from'node:fs';import y from'node:path';import d from'pino-abstract-transport';function f(){const h=['error','slice','logs','createWriteStream','.log','stream','clear','file','write'];f=function(){return h;};return f();}const LEVELS={0x1e:'info',0x28:'warn',0x32:'error',0x3c:s(0x14b)},streams=new Map();function getDate(){const j=s;return new Date()['toISOString']()[j(0x14c)](0x0,0xa);}function createStream(Z,M){const n=s,H=y['resolve'](n(0x14d),Z);return w['mkdirSync'](H,{'recursive':!![]}),w[n(0x14e)](y['join'](H,M+n(0x14f)),{'flags':'a'});}function getStream(Z){const t=s,M=getDate(),H=streams['get'](Z);if(H&&H['date']===M)return H[t(0x150)];H?.['stream']['end']();const Q=createStream(Z,M);return streams['set'](Z,{'date':M,'stream':Q}),Q;}function closeStreams(){const K=s;for(const {stream:Z}of streams['values']()){Z['end']();}streams[K(0x151)]();}export default async function loggerTransport(){return d(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(Z){const T=s;for await(const M of Z){const H=LEVELS[M['level']];if(!H)continue;const Q=getStream(M[T(0x152)]||H);delete M[T(0x152)],Q[T(0x153)](JSON['stringify'](M)+'\x0a');}}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x174;const N=W();let O=N[s];return O;}import s from'pg';const {Pool}=s;function W(){const i=['captureStackTrace','callerStack','query','BEGIN','ROLLBACK'];W=function(){return i;};return W();}export function createDatabase(J){const v=n,N=new Pool(J),O=N['query']['bind'](N);function E(S,T){const D=n,f=new Error();return Error[D(0x174)]?.(f,E),O(S,T)['catch'](a=>{const R=D,g=a;g['sql']=S,g[R(0x175)]=f['stack'];throw g;});}return N[v(0x176)]=E,N['transaction']=async function(S){const o=v,T=new Error();Error[o(0x174)]?.(T,N['transaction']);const f=await N['connect']();try{await f[o(0x176)](o(0x177));const a=await S(f);return await f['query']('COMMIT'),a;}catch(g){await f['query'](o(0x178));const p=g;p['callerStack']=T['stack'];throw p;}finally{f['release']();}},N;}
1
+ function Y(w,y){w=w-0xae;const d=f();let Z=d[w];return Z;}import w from'pg';const {Pool}=w;export function createDatabase(y){const K=Y,d=new Pool(y),Z=d['query'][K(0xae)](d);function M(H,Q){const s=new Error();return Error['captureStackTrace']?.(s,M),Z(H,Q)['catch'](j=>{const n=j;n['sql']=H,n['callerStack']=s['stack'];throw n;});}return d['query']=M,d['transaction']=async function(H){const T=K,Q=new Error();Error['captureStackTrace']?.(Q,d[T(0xaf)]);const s=await d['connect']();try{await s[T(0xb0)](T(0xb1));const j=await H(s);return await s[T(0xb0)](T(0xb2)),j;}catch(n){await s['query']('ROLLBACK');const t=n;t['callerStack']=Q[T(0xb3)];throw t;}finally{s['release']();}},d;}function f(){const h=['bind','transaction','query','BEGIN','COMMIT','stack'];f=function(){return h;};return f();}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/plugins/redis.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AACD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW;IAG3C,GAAG,QAAQ,MAAM;IACjB,GAAG,QACI,MAAM,SACJ,MAAM,WACJ,MAAM,GAAG,MAAM,QAClB,MAAM;IAWd,GAAG,QAAQ,MAAM;IACjB,MAAM,QAAQ,MAAM;IACpB,KAAK;IACL,IAAI;IACJ,OAAO,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM;IAEjD,MAAM,QAAQ,MAAM,OAAO,MAAM;EAEpC;AACD,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/plugins/redis.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AACD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW;IAI3C,GAAG,QAAQ,MAAM;IACjB,GAAG,QACI,MAAM,SACJ,MAAM,WACJ,MAAM,GAAG,MAAM,QAClB,MAAM;IAWd,GAAG,QAAQ,MAAM;IACjB,MAAM,QAAQ,MAAM;IACpB,KAAK;IACL,IAAI;IACJ,OAAO,QAAQ,MAAM,SAAS,MAAM,OAAO,MAAM;IAEjD,MAAM,QAAQ,MAAM,OAAO,MAAM;EAEpC;AACD,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC"}
@@ -1 +1 @@
1
- import{Redis}from'ioredis';function n(s,J){s=s-0x1c9;const N=W();let O=N[s];return O;}export function createRedis(s){const f=n,J=new Redis(s);return{'get':N=>J['get'](N),'set':(N,O,E,S)=>{const T=n;if(S)return J['set'](N,O,'EX',S);if(typeof E===T(0x1c9))return J['set'](N,O,'EX',E);return J['set'](N,O);},'del':N=>J['del'](N),'delete':N=>J['del'](N),'close':()=>J['quit'](),'ping':()=>J[f(0x1ca)](),'hincrby':(N,O,E)=>J[f(0x1cb)](N,O,E),'incrby':(N,O)=>J['incrby'](N,O)};}function W(){const a=['number','ping','hincrby'];W=function(){return a;};return W();}
1
+ function f(){const j=['Creating\x20Redis\x20client\x20with\x20config:','set','del','quit','ping','incrby'];f=function(){return j;};return f();}import{Redis}from'ioredis';function Y(w,y){w=w-0x14e;const d=f();let Z=d[w];return Z;}export function createRedis(w){const Q=Y;console['log'](Q(0x14e),w);const y=new Redis(w);return{'get':d=>y['get'](d),'set':(d,Z,M,H)=>{const s=Q;if(H)return y['set'](d,Z,'EX',H);if(typeof M==='number')return y[s(0x14f)](d,Z,'EX',M);return y['set'](d,Z);},'del':d=>y[Q(0x150)](d),'delete':d=>y['del'](d),'close':()=>y[Q(0x151)](),'ping':()=>y[Q(0x152)](),'hincrby':(d,Z,M)=>y['hincrby'](d,Z,M),'incrby':(d,Z)=>y[Q(0x153)](d,Z)};}
@@ -1 +1 @@
1
- function n(s,J){s=s-0x83;const N=W();let O=N[s];return O;}import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';function W(){const R=['bind','get','list'];W=function(){return R;};return W();}import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(s){const D=n,J=new ResourceRegistry(),N=createFind(s,J),O=createFindOne(s,J),E=createCreate(s,J),S=createUpdate(s,J),T=createRemove(s,J),f=createFindRelation(s,J),a=createCreateRelation(s,J),g=createUpdateRelation(s,J),p=createDeleteRelation(s,J);return{'register':J['register'][D(0x83)](J),'has':J['has'][D(0x83)](J),'get':J[D(0x84)]['bind'](J),'list':J[D(0x85)]['bind'](J),'find':N,'findOne':O,'create':E,'update':S,'delete':T,'findRelation':f,'createRelation':a,'updateRelation':g,'deleteRelation':p};}
1
+ import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';function f(){const T=['has','bind'];f=function(){return T;};return f();}import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';function Y(w,y){w=w-0x1eb;const d=f();let Z=d[w];return Z;}import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(w){const K=Y,y=new ResourceRegistry(),d=createFind(w,y),Z=createFindOne(w,y),M=createCreate(w,y),H=createUpdate(w,y),Q=createRemove(w,y),s=createFindRelation(w,y),j=createCreateRelation(w,y),n=createUpdateRelation(w,y),t=createDeleteRelation(w,y);return{'register':y['register']['bind'](y),'has':y[K(0x1eb)]['bind'](y),'get':y['get']['bind'](y),'list':y['list'][K(0x1ec)](y),'find':d,'findOne':Z,'create':M,'update':H,'delete':Q,'findRelation':s,'createRelation':j,'updateRelation':n,'deleteRelation':t};}