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

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 (92) hide show
  1. package/dist/config.js +1 -1
  2. package/dist/context.js +1 -1
  3. package/dist/errors.js +1 -1
  4. package/dist/fastify.js +1 -1
  5. package/dist/fcore.js +1 -1
  6. package/dist/migrations/cli.js +1 -1
  7. package/dist/migrations/runner.js +1 -1
  8. package/dist/modules/auth/adduser-cli.js +1 -1
  9. package/dist/modules/auth/passwd-cli.js +1 -1
  10. package/dist/modules/auth/permission-cli.js +1 -1
  11. package/dist/modules/auth/route.js +1 -1
  12. package/dist/modules/auth/schema.js +1 -1
  13. package/dist/modules/auth/services/change-password.js +1 -1
  14. package/dist/modules/auth/services/get-current-user.js +1 -1
  15. package/dist/modules/auth/services/registration.js +1 -1
  16. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  17. package/dist/modules/file/mime.js +1 -1
  18. package/dist/modules/file/route.js +1 -1
  19. package/dist/modules/file/schema.js +1 -1
  20. package/dist/modules/file/services/get-file.js +1 -1
  21. package/dist/modules/file/services/resize-file.js +1 -1
  22. package/dist/modules/file/services/upload-file.js +1 -1
  23. package/dist/modules/resource/route.js +1 -1
  24. package/dist/modules/resource/schema.js +1 -1
  25. package/dist/modules/resource/services/add-note.js +1 -1
  26. package/dist/modules/resource/services/add-resource-file.js +1 -1
  27. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  28. package/dist/modules/resource/services/create-resource.js +1 -1
  29. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  30. package/dist/modules/resource/services/delete-resource.js +1 -1
  31. package/dist/modules/resource/services/export-resource.js +1 -1
  32. package/dist/modules/resource/services/get-resource.js +1 -1
  33. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  34. package/dist/modules/resource/services/list-resources.js +1 -1
  35. package/dist/modules/resource/services/search-resource.js +1 -1
  36. package/dist/modules/resource/services/suggest-resource.js +1 -1
  37. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  38. package/dist/modules/resource/services/update-resource.js +1 -1
  39. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  40. package/dist/modules/system/route.js +1 -1
  41. package/dist/modules/system/schema.js +1 -1
  42. package/dist/modules/system/services/check-system.js +1 -1
  43. package/dist/modules/system/services/get-access.js +1 -1
  44. package/dist/modules/system/services/get-api-list.js +1 -1
  45. package/dist/modules/system/services/get-audit-log.js +1 -1
  46. package/dist/modules/system/services/get-dictionary.js +1 -1
  47. package/dist/modules/system/services/get-system-log.js +1 -1
  48. package/dist/modules/system/services/get-system-settings.js +1 -1
  49. package/dist/modules/system/services/list-dictionaries.js +1 -1
  50. package/dist/modules/system/services/set-access.js +1 -1
  51. package/dist/modules/system/services/update-dictionary.js +1 -1
  52. package/dist/modules/system/services/update-system-settings.js +1 -1
  53. package/dist/modules/utils/require-admin.js +1 -1
  54. package/dist/modules/utils/safe-user.js +1 -1
  55. package/dist/modules/utils/unsupported.js +1 -1
  56. package/dist/plugins/audit/audit.js +1 -1
  57. package/dist/plugins/audit/services/write-audit.js +1 -1
  58. package/dist/plugins/auth/get-user-permissions.js +1 -1
  59. package/dist/plugins/auth/index.d.ts.map +1 -1
  60. package/dist/plugins/auth/index.js +1 -1
  61. package/dist/plugins/auth/verifyUser.js +1 -1
  62. package/dist/plugins/dictionary.js +1 -1
  63. package/dist/plugins/file.js +1 -1
  64. package/dist/plugins/jwt.js +1 -1
  65. package/dist/plugins/logger/index.js +1 -1
  66. package/dist/plugins/logger/transport.js +1 -1
  67. package/dist/plugins/pg.js +1 -1
  68. package/dist/plugins/redis.js +1 -1
  69. package/dist/plugins/resource/resource.js +1 -1
  70. package/dist/plugins/resource/resource.registry.js +1 -1
  71. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  72. package/dist/plugins/resource/services/add-file-token.js +1 -1
  73. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  74. package/dist/plugins/resource/services/create-relation.js +1 -1
  75. package/dist/plugins/resource/services/create.js +1 -1
  76. package/dist/plugins/resource/services/delete-relation.js +1 -1
  77. package/dist/plugins/resource/services/delete.js +1 -1
  78. package/dist/plugins/resource/services/find-one.js +1 -1
  79. package/dist/plugins/resource/services/find-relation.js +1 -1
  80. package/dist/plugins/resource/services/find.js +1 -1
  81. package/dist/plugins/resource/services/update-relation.js +1 -1
  82. package/dist/plugins/resource/services/update.js +1 -1
  83. package/dist/plugins/resource/utils/auto-index.js +1 -1
  84. package/dist/plugins/resource/utils/fields.js +1 -1
  85. package/dist/plugins/resource/utils/filters.js +1 -1
  86. package/dist/plugins/resource/utils/permissions.js +1 -1
  87. package/dist/plugins/resource/utils/sort.js +1 -1
  88. package/dist/plugins/resource/utils/sql.js +1 -1
  89. package/dist/shared/getIP.js +1 -1
  90. package/migrations/20260905120000_add_user_foreign_keys.sql +42 -42
  91. package/migrations/20260907090000_core_schema.sql +2 -0
  92. package/package.json +93 -93
@@ -1 +1 @@
1
- import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';function z(C,N){C=C-0x181;const r=U();let p=r[C];return p;}import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';function U(){const Y=['system','Get\x20platform\x20dictionary','user','system:dictionaries','dictionaryName','params','Replaces\x20direct\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','admin','get','/api/system/settings','Get\x20system\x20log','logger','type','/api/system/check','fcore','apiListQuery'];U=function(){return Y;};return U();}const u=C=>C['user'];export function systemRoutes(C,N=new Map()){return async r=>{const L=z;r['get']('/api/dictionary/:name',{'schema':{'tags':['fcore',L(0x181)],'summary':L(0x182),'description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async c=>({'items':await getDictionary({...c['params'],'user':u(c)},C)})),r['post']('/api/dictionary/:name',{'schema':{'tags':['fcore',L(0x181)],'summary':'Update\x20platform\x20dictionary','description':'Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','access':L(0x183),'permissions':[L(0x184)],'params':systemSchemas[L(0x185)],'body':systemSchemas['dictionaryItems']}},async c=>updateDictionary({...c[L(0x186)],...c['body'],'user':u(c)},C));const p=async c=>getAccess({...c['params'],'user':u(c)},C);r['get']('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Get\x20access\x20rules','description':'Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','access':'admin','permissions':['system:access'],'params':systemSchemas['accessTarget']}},p),r['post']('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'summary':'Set\x20access\x20rules','description':L(0x187),'access':L(0x188),'permissions':['system:access'],'params':systemSchemas['accessTarget'],'body':systemSchemas['access']}},async c=>setAccess({...c['params'],...c['body'],'user':u(c)},C)),r[L(0x189)](L(0x18a),{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':'admin','permissions':['system:settings']}},async c=>getSystemSettings({...c['params'],'user':u(c)},C)),r['post']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Update\x20system\x20settings','description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':['system:settings'],'body':systemSchemas['settings']}},async c=>updateSystemSettings({...c['params'],'patch':c['body'],'user':u(c)},C)),r[L(0x189)]('/api/system/logger',{'schema':{'tags':['fcore','system'],'summary':L(0x18b),'description':'Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','access':L(0x183),'permissions':['system:logs'],'querystring':systemSchemas[L(0x18c)]}},async(c,x)=>{const T=L,{contentType:m,body:Q}=await getSystemLog({...c['query'],'user':u(c)},C);return x[T(0x18d)](m)['send'](Q);}),r[L(0x189)]('/api/system/audit',{'schema':{'tags':['fcore','system'],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':L(0x183),'permissions':['system:audit']}},async c=>getAuditLog({...c['query'],'user':u(c)},C)),r['get'](L(0x18e),{'schema':{'tags':['fcore','system'],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':L(0x183),'permissions':['system:check']}},async c=>checkSystem({'user':u(c)},C)),r[L(0x189)]('/api/system/list',{'schema':{'tags':[L(0x18f),'system'],'summary':'List\x20APIs','description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':L(0x188),'permissions':[],'querystring':systemSchemas[L(0x190)]}},async c=>getApiList({'user':u(c),'apiRoutes':N,...c['query']},C));};}
1
+ const n=A;function U(){const r=['user','/api/dictionary/:name','fcore','Get\x20platform\x20dictionary','params','post','Update\x20platform\x20dictionary','Replaces\x20the\x20items\x20of\x20a\x20registered\x20platform\x20dictionary.','body','system','Get\x20access\x20rules','Returns\x20direct\x20and\x20role-based\x20access\x20rules\x20for\x20a\x20user\x20or\x20role.','accessTarget','admin','system:settings','Update\x20system\x20settings','settings','get','/api/system/logger','Get\x20system\x20log','Returns\x20system\x20logger\x20entries\x20for\x20the\x20requested\x20path.','List\x20APIs'];U=function(){return r;};return U();}import{getSystemSettings}from'./services/get-system-settings.js';import{updateSystemSettings}from'./services/update-system-settings.js';import{getAuditLog}from'./services/get-audit-log.js';import{checkSystem}from'./services/check-system.js';import{getApiList}from'./services/get-api-list.js';import{getSystemLog}from'./services/get-system-log.js';function A(z,j){z=z-0x1c8;const c=U();let p=c[z];return p;}import{getDictionary}from'./services/get-dictionary.js';import{updateDictionary}from'./services/update-dictionary.js';import{getAccess}from'./services/get-access.js';import{setAccess}from'./services/set-access.js';import{systemSchemas}from'./schema.js';const u=z=>z[n(0x1c8)];export function systemRoutes(z,j=new Map()){return async c=>{const v=A;c['get'](v(0x1c9),{'schema':{'tags':[v(0x1ca),'system'],'summary':v(0x1cb),'description':'Returns\x20a\x20registered\x20platform\x20dictionary\x20by\x20name.','access':v(0x1c8),'permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName']}},async M=>({'items':await getDictionary({...M[v(0x1cc)],'user':u(M)},z)})),c[v(0x1cd)]('/api/dictionary/:name',{'schema':{'tags':['fcore','system'],'summary':v(0x1ce),'description':v(0x1cf),'access':'user','permissions':['system:dictionaries'],'params':systemSchemas['dictionaryName'],'body':systemSchemas['dictionaryItems']}},async M=>updateDictionary({...M[v(0x1cc)],...M[v(0x1d0)],'user':u(M)},z));const p=async M=>getAccess({...M['params'],'user':u(M)},z);c['get']('/api/access/:type/:id',{'schema':{'tags':[v(0x1ca),v(0x1d1)],'summary':v(0x1d2),'description':v(0x1d3),'access':'admin','permissions':['system:access'],'params':systemSchemas[v(0x1d4)]}},p),c[v(0x1cd)]('/api/access/:type/:id',{'schema':{'tags':['fcore','system'],'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 M=>setAccess({...M['params'],...M['body'],'user':u(M)},z)),c['get']('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':'Get\x20system\x20settings','description':'Returns\x20system\x20settings\x20as\x20nested\x20JSON.','access':v(0x1d5),'permissions':[v(0x1d6)]}},async M=>getSystemSettings({...M[v(0x1cc)],'user':u(M)},z)),c[v(0x1cd)]('/api/system/settings',{'schema':{'tags':['fcore','system'],'summary':v(0x1d7),'description':'Updates\x20system\x20settings\x20using\x20flat\x20dot-notation\x20keys.','access':'admin','permissions':['system:settings'],'body':systemSchemas[v(0x1d8)]}},async M=>updateSystemSettings({...M['params'],'patch':M[v(0x1d0)],'user':u(M)},z)),c[v(0x1d9)](v(0x1da),{'schema':{'tags':['fcore','system'],'summary':v(0x1db),'description':v(0x1dc),'access':v(0x1c8),'permissions':['system:logs'],'querystring':systemSchemas['logger']}},async(M,H)=>{const {contentType:i,body:b}=await getSystemLog({...M['query'],'user':u(M)},z);return H['type'](i)['send'](b);}),c['get']('/api/system/audit',{'schema':{'tags':['fcore',v(0x1d1)],'summary':'Get\x20audit\x20log','description':'Returns\x20the\x20system\x20audit\x20log\x20entries.','access':'user','permissions':['system:audit']}},async M=>getAuditLog({...M['query'],'user':u(M)},z)),c['get']('/api/system/check',{'schema':{'tags':['fcore',v(0x1d1)],'summary':'Check\x20system\x20health','description':'Checks\x20the\x20availability\x20of\x20system\x20dependencies.','access':'user','permissions':['system:check']}},async M=>checkSystem({'user':u(M)},z)),c['get']('/api/system/list',{'schema':{'tags':[v(0x1ca),'system'],'summary':v(0x1dd),'description':'Returns\x20the\x20list\x20of\x20registered\x20platform\x20APIs.','access':'admin','permissions':[],'querystring':systemSchemas['apiListQuery']}},async M=>getApiList({'user':u(M),'apiRoutes':j,...M['query']},z));};}
@@ -1 +1 @@
1
- const C=z;function U(){const N=['Object','Array','Union','Null','Literal','short'];U=function(){return N;};return U();}function z(C,N){C=C-0x7e;const r=U();let p=r[C];return p;}import{Type}from'@sinclair/typebox';export const identifier=Type['String']({'minLength':0x1,'maxLength':0x80,'pattern':'^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$'});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type[C(0x7e)]({'items':Type[C(0x7f)](Type['Object']({'id':Type['Optional'](Type[C(0x80)]([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type['Union']([Type['String'](),Type['Number'](),Type[C(0x81)]()]))},{'additionalProperties':!![]}))}),'accessTarget':Type[C(0x7e)]({'type':Type[C(0x80)]([Type['Literal']('user'),Type[C(0x82)]('role')]),'id':identifier}),'access':Type['Object']({'access':Type[C(0x7f)](Type['Object']({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type[C(0x7f)](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type[C(0x7e)]({'format':Type['Optional'](Type['Union']([Type['Literal'](C(0x83)),Type[C(0x82)]('extended')]))}),'settingsEntity':Type['Object']({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type['Unknown']()),'logger':Type[C(0x7e)]({'path':Type['Optional'](Type['String']({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
1
+ function A(z,j){z=z-0x110;const c=U();let p=c[z];return p;}function U(){const j=['String','^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$','Object','Union','Literal','user','Array','Unknown','Optional'];U=function(){return j;};return U();}const z=A;import{Type}from'@sinclair/typebox';export const identifier=Type[z(0x110)]({'minLength':0x1,'maxLength':0x80,'pattern':z(0x111)});export const systemSchemas={'dictionaryName':Type['Object']({'name':identifier}),'dictionaryItems':Type[z(0x112)]({'items':Type['Array'](Type[z(0x112)]({'id':Type['Optional'](Type[z(0x113)]([Type['String'](),Type['Number']()])),'code':Type['String']({'minLength':0x1}),'name':Type['String']({'minLength':0x1}),'parentId':Type['Optional'](Type['Union']([Type[z(0x110)](),Type['Number'](),Type['Null']()]))},{'additionalProperties':!![]}))}),'accessTarget':Type[z(0x112)]({'type':Type['Union']([Type[z(0x114)](z(0x115)),Type['Literal']('role')]),'id':identifier}),'access':Type['Object']({'access':Type['Array'](Type[z(0x112)]({'resource':Type['String']({'minLength':0x1,'maxLength':0x80}),'actions':Type[z(0x116)](Type['String']({'minLength':0x1,'maxLength':0x80}),{'minItems':0x1})}))}),'apiListQuery':Type['Object']({'format':Type['Optional'](Type['Union']([Type['Literal']('short'),Type['Literal']('extended')]))}),'settingsEntity':Type['Object']({'entity':Type['Optional'](identifier)}),'settings':Type['Record'](Type['String']({'minLength':0x1}),Type[z(0x117)]()),'logger':Type[z(0x112)]({'path':Type[z(0x118)](Type[z(0x110)]({'maxLength':0x100,'pattern':'^[A-Za-z0-9_.\x5c-/]*$'}))})};
@@ -1 +1 @@
1
- function z(C,N){C=C-0x199;const r=U();let p=r[C];return p;}export async function checkSystem(C,N){const c=z,[r,p]=await Promise['allSettled']([N['pg']['query']('SELECT\x201'),N['redis'][c(0x199)]()]);return{'status':r[c(0x19a)]==='fulfilled'&&p['status']===c(0x19b)?'ok':c(0x19c),'pg':r['status'],'redis':p['status']};}function U(){const x=['ping','status','fulfilled','degraded'];U=function(){return x;};return U();}
1
+ function U(){const H=['fulfilled','degraded'];U=function(){return H;};return U();}function A(z,j){z=z-0x136;const c=U();let p=c[z];return p;}export async function checkSystem(z,j){const M=A,[c,p]=await Promise['allSettled']([j['pg']['query']('SELECT\x201'),j['redis']['ping']()]);return{'status':c['status']===M(0x136)&&p['status']==='fulfilled'?'ok':M(0x137),'pg':c['status'],'redis':p['status']};}
@@ -1 +1 @@
1
- export async function getAccess(C,N){const c=z,r=C['type']==='user'?'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20ur.role_id\x20=\x20ra.role_id\x20AND\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20':'\x0a\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ra.resource,\x20ra.actions,\x20ra.role_id\x20AS\x20role\x0a\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ra.role_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20',p=await N['pg'][c(0x118)](r,[C['id']]);return{'access':p[c(0x119)]};}function z(C,N){C=C-0x118;const r=U();let p=r[C];return p;}function U(){const x=['query','rows'];U=function(){return x;};return U();}
1
+ function A(z,j){z=z-0x119;const c=U();let p=c[z];return p;}export async function getAccess(z,j){const M=A,c=z[M(0x119)]===M(0x11a)?M(0x11b):M(0x11c),p=await j['pg']['query'](c,[z['id']]);return{'access':p['rows']};}function U(){const H=['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'];U=function(){return H;};return U();}
@@ -1 +1 @@
1
- function U(){const u=['values','endpoint','method','format'];U=function(){return u;};return U();}function z(C,N){C=C-0x140;const r=U();let p=r[C];return p;}export async function getApiList(C,N){const Q=z,r=[...C['apiRoutes'][Q(0x140)]()]['sort']((p,c)=>(p[Q(0x141)]+'\x20'+p['method'])['localeCompare'](c[Q(0x141)]+'\x20'+c[Q(0x142)]));if(C[Q(0x143)]!=='short')return r;return r['map'](({method:p,endpoint:c,access:x,permissions:m})=>p+'\x20'+c);}
1
+ function U(){const n=['sort','endpoint','format','map'];U=function(){return n;};return U();}function A(z,j){z=z-0x184;const c=U();let p=c[z];return p;}export async function getApiList(z,j){const b=A,c=[...z['apiRoutes']['values']()][b(0x184)]((p,M)=>(p[b(0x185)]+'\x20'+p['method'])['localeCompare'](M['endpoint']+'\x20'+M['method']));if(z[b(0x186)]!=='short')return c;return c[b(0x187)](({method:p,endpoint:M,access:H,permissions:i})=>p+'\x20'+M);}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x103;const r=U();let p=r[C];return p;}export async function getAuditLog(C,N){const m=z,p=Math['min'](Math['max'](C['limit']??0x32,0x1),0xc8),c=Math['max']((C['page']??0x1)-0x1,0x0)*p,x=await N['pg']['query']('SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[p,c]);return{'rows':x['rows'],'page':C[m(0x103)]??0x1,'limit':p};}function U(){const Q=['page'];U=function(){return Q;};return U();}
1
+ function A(z,j){z=z-0x1be;const c=U();let p=c[z];return p;}export async function getAuditLog(z,j){const H=A,c=Math[H(0x1be)](Math[H(0x1bf)](z['limit']??0x32,0x1),0xc8),p=Math['max']((z['page']??0x1)-0x1,0x0)*c,M=await j['pg'][H(0x1c0)]('SELECT\x20*\x20FROM\x20admin.audit_log\x20ORDER\x20BY\x20id\x20DESC\x20LIMIT\x20$1\x20OFFSET\x20$2',[c,p]);return{'rows':M['rows'],'page':z['page']??0x1,'limit':c};}function U(){const i=['min','max','query'];U=function(){return i;};return U();}
@@ -1 +1 @@
1
- export async function getDictionary(C,N){return N['dictionary']['get'](C['name']);}
1
+ export async function getDictionary(z,j){var c=A;return j['dictionary']['get'](z[c(0x72)]);}function A(z,j){z=z-0x72;var c=U();var p=c[z];return p;}function U(){var p=['name'];U=function(){return p;};return U();}
@@ -1 +1 @@
1
- const t=z;import C from'node:fs/promises';function z(C,N){C=C-0x8e;const r=U();let p=r[C];return p;}import N from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';function U(){const a=['resolve','sep','stat','join','name','file','size','sort','directory','path','type','</a></li>','<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>','replace','&quot;','split','Invalid\x20log\x20path','filter','slice','reverse'];U=function(){return a;};return U();}const LOGS_ROOT=N[t(0x8e)](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(r,p){const h=t,c=normalizePath(r['path']),x=N['resolve'](LOGS_ROOT,c);if(x!==LOGS_ROOT&&!x['startsWith'](LOGS_ROOT+N[h(0x8f)]))throw new ValidationError('Invalid\x20log\x20path');const m=await C[h(0x90)](x)['catch'](()=>null);if(!m)throw new NotFoundError('Log\x20path\x20not\x20found');if(m['isDirectory']()){const u=await C['readdir'](x,{'withFileTypes':!![]}),L=await Promise['all'](u['map'](async T=>{const D=h,Y=await C['stat'](N[D(0x91)](x,T['name']));return{'name':T['name'],'path':c?c+'/'+T['name']:T[D(0x92)],'type':T['isDirectory']()?'directory':D(0x93),'size':T['isDirectory']()?undefined:Y[D(0x94)],'modified':Y['mtime']['toISOString']()};}));L[h(0x95)]((T,Y)=>T['name']['localeCompare'](Y['name']));if(c){const T=c['split']('/')['slice'](0x0,-0x1)['join']('/');L['unshift']({'name':'..','path':T,'type':h(0x96)});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(c,L)};}const Q=await tailFile(x,TAIL_LINES);return{'contentType':'text/plain;\x20charset=utf-8','body':Q['join']('\x0a')};}function renderDirectory(r,p){const V=t,c=p['map'](m=>{const d=z,Q='?path='+encodeURIComponent(m[d(0x97)]),u=m[d(0x98)]==='directory'?m[d(0x92)]+'/':m['name'];return'<li><a\x20href=\x22'+Q+'\x22>'+escapeHtml(u)+d(0x99);})['join']('\x0a'),x=escapeHtml('logs/'+r);return V(0x9a)+x+'</title></head>\x0a<body>\x0a<h1>'+x+'</h1>\x0a<ul>\x0a'+c+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(r){const q=t;return r[q(0x9b)](/&/g,'&amp;')[q(0x9b)](/</g,'&lt;')['replace'](/>/g,'&gt;')[q(0x9b)](/"/g,q(0x9c));}function normalizePath(r){const w=t,p=(r??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(p[w(0x9d)]('/')['some'](c=>c==='..'))throw new ValidationError(w(0x9e));return p;}async function tailFile(r,p){const O=t,c=await C['open'](r,'r');try{const {size:x}=await c[O(0x90)](),m=0x40*0x400;let Q=x,u=Buffer['alloc'](0x0),L=0x0;while(Q>0x0&&L<=p){const Y=Math['min'](m,Q);Q-=Y;const f=Buffer['alloc'](Y);await c['read'](f,0x0,Y,Q),u=Buffer['concat']([f,u]),L+=countNewlines(f);}const T=u['toString']('utf8')['split']('\x0a')[O(0x9f)](F=>F['length']>0x0);return T[O(0xa0)](-p)[O(0xa1)]();}finally{await c['close']();}}function countNewlines(r){let p=0x0;for(const c of r){if(c===0xa)p++;}return p;}
1
+ function U(){const R=['resolve','startsWith','sep','catch','all','join','name','directory','isDirectory','mtime','toISOString','localeCompare','slice','text/plain;\x20charset=utf-8','type','</h1>\x0a<ul>\x0a','&amp;','&lt;','split','stat','min','concat','length'];U=function(){return R;};return U();}function A(z,j){z=z-0x1e1;const c=U();let p=c[z];return p;}const o=A;import z from'node:fs/promises';import j from'node:path';import{NotFoundError,ValidationError}from'../../../errors.js';const LOGS_ROOT=j[o(0x1e1)](process['cwd'](),'logs'),TAIL_LINES=0x64;export async function getSystemLog(c,p){const P=o,M=normalizePath(c['path']),H=j['resolve'](LOGS_ROOT,M);if(H!==LOGS_ROOT&&!H[P(0x1e2)](LOGS_ROOT+j[P(0x1e3)]))throw new ValidationError('Invalid\x20log\x20path');const i=await z['stat'](H)[P(0x1e4)](()=>null);if(!i)throw new NotFoundError('Log\x20path\x20not\x20found');if(i['isDirectory']()){const n=await z['readdir'](H,{'withFileTypes':!![]}),v=await Promise[P(0x1e5)](n['map'](async r=>{const t=P,q=await z['stat'](j[t(0x1e6)](H,r[t(0x1e7)]));return{'name':r[t(0x1e7)],'path':M?M+'/'+r[t(0x1e7)]:r[t(0x1e7)],'type':r['isDirectory']()?t(0x1e8):'file','size':r[t(0x1e9)]()?undefined:q['size'],'modified':q[t(0x1ea)][t(0x1eb)]()};}));v['sort']((r,q)=>r[P(0x1e7)][P(0x1ec)](q['name']));if(M){const r=M['split']('/')[P(0x1ed)](0x0,-0x1)['join']('/');v['unshift']({'name':'..','path':r,'type':'directory'});}return{'contentType':'text/html;\x20charset=utf-8','body':renderDirectory(M,v)};}const b=await tailFile(H,TAIL_LINES);return{'contentType':P(0x1ee),'body':b[P(0x1e6)]('\x0a')};}function renderDirectory(c,p){const y=o,M=p['map'](i=>{const g=A,b='?path='+encodeURIComponent(i['path']),n=i[g(0x1ef)]==='directory'?i[g(0x1e7)]+'/':i['name'];return'<li><a\x20href=\x22'+b+'\x22>'+escapeHtml(n)+'</a></li>';})['join']('\x0a'),H=escapeHtml('logs/'+c);return'<!DOCTYPE\x20html>\x0a<html>\x0a<head><meta\x20charset=\x22utf-8\x22><title>'+H+'</title></head>\x0a<body>\x0a<h1>'+H+y(0x1f0)+M+'\x0a</ul>\x0a</body>\x0a</html>';}function escapeHtml(c){const B=o;return c['replace'](/&/g,B(0x1f1))['replace'](/</g,B(0x1f2))['replace'](/>/g,'&gt;')['replace'](/"/g,'&quot;');}function normalizePath(c){const Y=o,p=(c??'')['replace'](/\\/g,'/')['replace'](/^\/+|\/+$/g,'');if(p[Y(0x1f3)]('/')['some'](M=>M==='..'))throw new ValidationError('Invalid\x20log\x20path');return p;}async function tailFile(c,p){const s=o,M=await z['open'](c,'r');try{const {size:H}=await M[s(0x1f4)](),i=0x40*0x400;let b=H,n=Buffer['alloc'](0x0),v=0x0;while(b>0x0&&v<=p){const q=Math[s(0x1f5)](i,b);b-=q;const Z=Buffer['alloc'](q);await M['read'](Z,0x0,q,b),n=Buffer[s(0x1f6)]([Z,n]),v+=countNewlines(Z);}const r=n['toString']('utf8')[s(0x1f3)]('\x0a')['filter'](e=>e[s(0x1f7)]>0x0);return r['slice'](-p)['reverse']();}finally{await M['close']();}}function countNewlines(c){let p=0x0;for(const M of c){if(M===0xa)p++;}return p;}
@@ -1 +1 @@
1
- function U(){const L=['reduce'];U=function(){return L;};return U();}function z(C,N){C=C-0x174;const r=U();let p=r[C];return p;}export async function getSystemSettings(C,N){const u=z,r=await N['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20key,\x20value\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.settings\x0a\x20\x20\x20\x20\x20\x20WHERE\x20resource\x20=\x20\x27system\x27\x20AND\x20resource_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20key\x0a\x20\x20\x20\x20');return r['rows'][u(0x174)]((p,c)=>{const x=String(c['key'])['split']('.');let m=p;for(const Q of x['slice'](0x0,-0x1)){m[Q]??={},m=m[Q];}return m[x['at'](-0x1)]=c['value'],p;},{});}
1
+ function A(z,j){z=z-0x85;const c=U();let p=c[z];return p;}export async function getSystemSettings(z,j){const n=A,c=await j['pg']['query'](n(0x85));return c['rows']['reduce']((p,M)=>{const v=n,H=String(M[v(0x86)])[v(0x87)]('.');let i=p;for(const b of H['slice'](0x0,-0x1)){i[b]??={},i=i[b];}return i[H['at'](-0x1)]=M['value'],p;},{});}function U(){const r=['\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','key','split'];U=function(){return r;};return U();}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x1c0;var r=U();var p=r[C];return p;}export async function listDictionaries(C,N){var r=z;return N[r(0x1c0)]['list']();}function U(){var p=['dictionary'];U=function(){return p;};return U();}
1
+ export async function listDictionaries(z,j){return j['dictionary']['list']();}
@@ -1 +1 @@
1
- import{getAccess}from'./get-access.js';function z(C,N){C=C-0x1d4;const r=U();let p=r[C];return p;}export async function setAccess(C,N){const x=z,r=await N['pg']['connect']();try{await r['query']('BEGIN');C[x(0x1d4)]==='user'?await r[x(0x1d5)](x(0x1d6),[C['id']]):await r['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[C['id']]);for(const p of C['access']){C['type']===x(0x1d7)?await r[x(0x1d5)]('INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20user_uid,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)',[p[x(0x1d8)],p['actions'],C['id'],C['user']['id'],C[x(0x1d7)]['id']]):await r[x(0x1d5)](x(0x1d9),[p['resource'],p['actions'],C['id'],C['user']['id'],C['user']['id']]);}await r['query']('COMMIT');}catch(c){await r['query']('ROLLBACK');throw c;}finally{r['release']();}return getAccess(C,N);}function U(){const m=['type','query','DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL','user','resource','INSERT\x20INTO\x20admin.role_access\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20(\x20resource,\x20actions,\x20role_id,\x20created_by,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)'];U=function(){return m;};return U();}
1
+ import{getAccess}from'./get-access.js';function U(){const i=['user','query','type','COMMIT'];U=function(){return i;};return U();}function A(z,j){z=z-0x1d5;const c=U();let p=c[z];return p;}export async function setAccess(z,j){const H=A,c=await j['pg']['connect']();try{await c['query']('BEGIN');z['type']===H(0x1d5)?await c['query']('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20user_uid\x20=\x20$1\x20AND\x20role_id\x20IS\x20NULL',[z['id']]):await c[H(0x1d6)]('DELETE\x20FROM\x20admin.role_access\x20WHERE\x20role_id\x20=\x20$1\x20AND\x20user_uid\x20IS\x20NULL',[z['id']]);for(const p of z['access']){z[H(0x1d7)]==='user'?await c['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)',[p['resource'],p['actions'],z['id'],z['user']['id'],z[H(0x1d5)]['id']]):await c['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)',[p['resource'],p['actions'],z['id'],z['user']['id'],z[H(0x1d5)]['id']]);}await c['query'](H(0x1d8));}catch(M){await c['query']('ROLLBACK');throw M;}finally{c['release']();}return getAccess(z,j);}
@@ -1 +1 @@
1
- export async function updateDictionary(C,N){return await N['dictionary']['put'](C['name'],C['items']),{'success':!![]};}
1
+ function A(z,j){z=z-0xb5;var c=U();var p=c[z];return p;}export async function updateDictionary(z,j){var c=A;return await j['dictionary'][c(0xb5)](z['name'],z['items']),{'success':!![]};}function U(){var p=['put'];U=function(){return p;};return U();}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x18a;const r=U();let p=r[C];return p;}function U(){const x=['patch','length','includes','query','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.settings\x20(resource,\x20resource_id,\x20key,\x20value,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20(\x27system\x27,\x20NULL,\x20$1,\x20$2::jsonb,\x20$3)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(resource,\x20resource_id,\x20key)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x20value\x20=\x20EXCLUDED.value,\x20updated_by\x20=\x20EXCLUDED.updated_by,\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20','stringify'];U=function(){return x;};return U();}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(C,N){const c=z;if(!Object['keys'](C[c(0x18a)])[c(0x18b)])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [r,p]of Object['entries'](C['patch'])){if(!r['trim']()||r[c(0x18c)]('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+r);await N['pg'][c(0x18d)](c(0x18e),[r,JSON[c(0x18f)](p),C['user']['id']]);}return{'success':!![]};}
1
+ function A(z,j){z=z-0x120;const c=U();let p=c[z];return p;}import{ValidationError}from'../../../errors.js';export async function updateSystemSettings(z,j){const M=A;if(!Object[M(0x120)](z['patch'])['length'])throw new ValidationError('Settings\x20patch\x20is\x20empty');for(const [c,p]of Object['entries'](z['patch'])){if(!c['trim']()||c[M(0x121)]('..'))throw new ValidationError('Invalid\x20setting\x20key:\x20'+c);await j['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.settings\x20(resource,\x20resource_id,\x20key,\x20value,\x20updated_by)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20(\x27system\x27,\x20NULL,\x20$1,\x20$2::jsonb,\x20$3)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(resource,\x20resource_id,\x20key)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20UPDATE\x20SET\x20value\x20=\x20EXCLUDED.value,\x20updated_by\x20=\x20EXCLUDED.updated_by,\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[c,JSON[M(0x122)](p),z['user']['id']]);}return{'success':!![]};}function U(){const H=['keys','includes','stringify'];U=function(){return H;};return U();}
@@ -1 +1 @@
1
- import{ForbiddenError}from'../../errors.js';function z(C,N){C=C-0x188;var r=U();var p=r[C];return p;}function U(){var p=['admin','Admin\x20access\x20required','includes'];U=function(){return p;};return U();}export function requireAdmin(C,N){var r=z;if(!C)throw new ForbiddenError('User\x20required');if(C['type']!==r(0x188))throw new ForbiddenError(r(0x189));if(C['type']!=='admin'&&N&&!C['permissions']?.[r(0x18a)](N))throw new ForbiddenError('Missing\x20permission:\x20'+N);}
1
+ function A(z,j){z=z-0x131;var c=U();var p=c[z];return p;}function U(){var p=['User\x20required','admin'];U=function(){return p;};return U();}import{ForbiddenError}from'../../errors.js';export function requireAdmin(z,j){var c=A;if(!z)throw new ForbiddenError(c(0x131));if(z['type']!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(z['type']!==c(0x132)&&j&&!z['permissions']?.['includes'](j))throw new ForbiddenError('Missing\x20permission:\x20'+j);}
@@ -1 +1 @@
1
- function U(){const x=['salt','credentials','fromEntries','toLowerCase'];U=function(){return x;};return U();}function z(C,N){C=C-0x16a;const r=U();let p=r[C];return p;}export const safeUser=C=>{const c=z,N=['password',c(0x16a),'secret',c(0x16b)];return Object[c(0x16c)](Object['entries'](C)['filter'](([r])=>!N['some'](p=>r[c(0x16d)]()['includes'](p))));};
1
+ function U(){const H=['password','includes'];U=function(){return H;};return U();}function A(z,j){z=z-0x16e;const c=U();let p=c[z];return p;}export const safeUser=z=>{const M=A,j=[M(0x16e),'salt','secret','credentials'];return Object['fromEntries'](Object['entries'](z)['filter'](([c])=>!j['some'](p=>c['toLowerCase']()[M(0x16f)](p))));};
@@ -1 +1 @@
1
- import{UnsupportedError}from'../../errors.js';export function unsupported(C){throw new UnsupportedError(C+'\x20requires\x20a\x20project/provider\x20implementation');}
1
+ import{UnsupportedError}from'../../errors.js';export function unsupported(z){throw new UnsupportedError(z+'\x20requires\x20a\x20project/provider\x20implementation');}
@@ -1 +1 @@
1
- import{writeAudit}from'./services/write-audit.js';export function createAudit(C){const N=writeAudit(C);return{'write':N};}
1
+ import{writeAudit}from'./services/write-audit.js';export function createAudit(z){const j=writeAudit(z);return{'write':j};}
@@ -1 +1 @@
1
- function U(){const F=['test','map','has','warn','catch','logger','newValue','\x0a\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20user_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resource_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fields,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20action,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20request_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ip_address,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20metadata\x0a\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5,\x20$6,\x20$7,\x20$8,\x20$9)\x0a\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20','resourceId','metadata','changes','query','stringify'];U=function(){return F;};return U();}const secretPattern=/password|token|secret|credential|salt/i;function z(C,N){C=C-0xd6;const r=U();let p=r[C];return p;}function clean(C){const L=z;if(Array['isArray'](C))return C['map'](clean);if(C&&typeof C==='object')return Object['fromEntries'](Object['entries'](C)['map'](([N,r])=>[N,secretPattern[L(0xd6)](N)?'[REDACTED]':clean(r)]));return C;}export function writeAudit(C){let N,r;async function p(){const Y=z;if(!C['pg'])return![];if(N!==undefined)return N;return r??=C['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](c=>{const T=z,x=new Set(c['rows'][T(0xd7)](m=>m['table_name']));return N=x[T(0xd8)]('audit_log')&&x[T(0xd8)]('audit_log_data'),!N&&C['logger'][T(0xd9)]({'expectedTables':['admin.audit_log','admin.audit_log_data'],'foundTables':[...x]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),N;})[Y(0xda)](c=>{return N=![],C['logger']['warn']({'err':c},'Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled'),![];}),r;}return async function c(x){const f=z;if(!await p())return C[f(0xdb)]['info']({'auditFallback':!![],'event':clean({...x,'changes':x['changes']?.[f(0xd7)](u=>({...u,'oldValue':clean(u['oldValue']),'newValue':clean(u[f(0xdc)])}))})},'audit'),0x0;if(!C['pg'])throw new Error('empty\x20pg');const m=await C['pg']['query'](f(0xdd),[x['userId']??null,x['module'],x['resource'],x['resourceId']==null?null:String(x[f(0xde)]),x['fields']??null,x['action'],x['requestId']??null,x['ipAddress']??null,clean(x[f(0xdf)]??{})]),Q=m['rows'][0x0]['id'];for(const u of x[f(0xe0)]??[]){if(secretPattern['test'](u['field']))continue;await C['pg'][f(0xe1)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.audit_log_data\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20audit_log_id,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20field,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20old_value,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20new_value\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[Q,u['field'],JSON['stringify'](clean(u['oldValue'])),JSON[f(0xe2)](clean(u['newValue']))]);}return Q;};}
1
+ const secretPattern=/password|token|secret|credential|salt/i;function clean(z){const v=A;if(Array['isArray'](z))return z['map'](clean);if(z&&typeof z==='object')return Object[v(0x10c)](Object['entries'](z)['map'](([j,c])=>[j,secretPattern['test'](j)?'[REDACTED]':clean(c)]));return z;}function U(){const e=['fromEntries','rows','warn','admin.audit_log','Unable\x20to\x20check\x20audit\x20tables;\x20audit\x20writes\x20are\x20disabled','audit','empty\x20pg','query','resourceId','action','field'];U=function(){return e;};return U();}function A(z,j){z=z-0x10c;const c=U();let p=c[z];return p;}export function writeAudit(z){let j,c;async function p(){if(!z['pg'])return![];if(j!==undefined)return j;return c??=z['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20IN\x20(\x27audit_log\x27,\x20\x27audit_log_data\x27)\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](M=>{const r=A,H=new Set(M[r(0x10d)]['map'](i=>i['table_name']));return j=H['has']('audit_log')&&H['has']('audit_log_data'),!j&&z['logger'][r(0x10e)]({'expectedTables':[r(0x10f),'admin.audit_log_data'],'foundTables':[...H]},'Audit\x20tables\x20are\x20unavailable;\x20audit\x20writes\x20are\x20disabled'),j;})['catch'](M=>{const q=A;return j=![],z['logger']['warn']({'err':M},q(0x110)),![];}),c;}return async function M(H){const Z=A;if(!await p())return z['logger']['info']({'auditFallback':!![],'event':clean({...H,'changes':H['changes']?.['map'](n=>({...n,'oldValue':clean(n['oldValue']),'newValue':clean(n['newValue'])}))})},Z(0x111)),0x0;if(!z['pg'])throw new Error(Z(0x112));const i=await z['pg'][Z(0x113)]('\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['module'],H['resource'],H[Z(0x114)]==null?null:String(H[Z(0x114)]),H['fields']??null,H[Z(0x115)],H['requestId']??null,H['ipAddress']??null,clean(H['metadata']??{})]),b=i['rows'][0x0]['id'];for(const n of H['changes']??[]){if(secretPattern['test'](n[Z(0x116)]))continue;await z['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',[b,n[Z(0x116)],JSON['stringify'](clean(n['oldValue'])),JSON['stringify'](clean(n['newValue']))]);}return b;};}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x1a9;const r=U();let p=r[C];return p;}export async function getUserPermissions(C,N){const c=z,r=await N['pg']['query']('\x0a\x20\x20\x20\x20\x20\x20SELECT\x20DISTINCT\x20ra.resource\x20||\x20\x27:\x27\x20||\x20action\x20AS\x20permission\x0a\x20\x20\x20\x20\x20\x20FROM\x20admin.role_access\x20ra\x0a\x20\x20\x20\x20\x20\x20LEFT\x20JOIN\x20admin.user_roles\x20ur\x20ON\x20ur.role_id\x20=\x20ra.role_id\x0a\x20\x20\x20\x20\x20\x20CROSS\x20JOIN\x20LATERAL\x20unnest(COALESCE(ra.actions,\x20\x27{}\x27::text[]))\x20AS\x20action\x0a\x20\x20\x20\x20\x20\x20WHERE\x20ra.user_uid\x20=\x20$1\x20OR\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20',[C]);return r['rows'][c(0x1a9)](p=>p['permission']);}function U(){const x=['map'];U=function(){return x;};return U();}
1
+ function A(z,j){z=z-0x1ea;const c=U();let p=c[z];return p;}function U(){const H=['map','permission'];U=function(){return H;};return U();}export async function getUserPermissions(z,j){const M=A,c=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',[z]);return c['rows'][M(0x1ea)](p=>p[M(0x1eb)]);}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBA6CzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAUhC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAE1C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpE;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAalB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,mBAAmB,iBA6CzB"}
@@ -1 +1 @@
1
- export*from'./auth.types.js';import{randomBytes,scrypt as C,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(C);function U(){const D=['scrypt$','toString','scrypt','hex','from','auth','database','register','initialize','registerUserDeserializer','user'];U=function(){return D;};return U();}import N from'@fastify/cookie';function z(C,N){C=C-0x12f;const r=U();let p=r[C];return p;}import r from'@fastify/session';import{Authenticator}from'@fastify/passport';import p from'fastify-session-redis-store';import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(c){const f=z,x=randomBytes(0x10),m=await scrypt(c,x,0x40);return f(0x12f)+x['toString']('hex')+'$'+m[f(0x130)]('hex');}export async function verifyPassword(c,x){const F=z,[m,Q,u]=x['split']('$');if(m!==F(0x131)||!Q||!u)return![];const L=Buffer['from'](Q,F(0x132)),T=Buffer[F(0x133)](u,F(0x132)),Y=await scrypt(c,L,T['length']);return timingSafeEqual(Y,T);}export async function createSessionStore(c,x){const t=z,{config:m,redis:Q}=x;if(!m||!Q){console['warn']('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV==='test'||process.env.VITEST)return;await c['register'](N,{'parseOptions':m['auth']['cookieOptions']}),await c['register'](r,{'secret':m[t(0x134)]['secret'],'cookieName':m['auth']['cookieName'],'cookie':m['auth']['cookieOptions'],'store':new p({'prefix':m['auth']['cookieName']+':'+(m['pg']?.[t(0x135)]||'db')+':','client':Q})}),await c[t(0x136)](fastifyPassport[t(0x137)]()),await c['register'](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async u=>({'user':u})),fastifyPassport[t(0x138)](async u=>{const h=t,L=u?.[h(0x139)]||u;return L?.['id']&&(L['permissions']=await getUserPermissions(L['id'],x)),L;});}
1
+ export*from'./auth.types.js';import{randomBytes,scrypt as z,timingSafeEqual}from'node:crypto';import{promisify}from'node:util';const scrypt=promisify(z);import j from'@fastify/cookie';import c from'@fastify/session';import{Authenticator}from'@fastify/passport';import p from'fastify-session-redis-store';function U(){const o=['hex','warn','test','auth','secret','database','register'];U=function(){return o;};return U();}import{getUserPermissions}from'./get-user-permissions.js';const fastifyPassport=new Authenticator();function A(z,j){z=z-0x185;const c=U();let p=c[z];return p;}export*from'./verifyUser.js';export*from'./get-user-permissions.js';export async function hashPassword(M){const H=randomBytes(0x10),i=await scrypt(M,H,0x40);return'scrypt$'+H['toString']('hex')+'$'+i['toString']('hex');}export async function verifyPassword(M,H){const Z=A,[i,b,n]=H?.['split']('$')||[];if(i!=='scrypt'||!b||!n)return![];const v=Buffer['from'](b,Z(0x185)),r=Buffer['from'](n,'hex'),q=await scrypt(M,v,r['length']);return timingSafeEqual(q,r);}export async function createSessionStore(M,H){const e=A,{config:i,redis:b}=H;if(!i||!b){console[e(0x186)]('Missing\x20config\x20or\x20redis\x20-\x20skipping\x20session\x20store\x20creation');return;}if(process.env.NODE_ENV===e(0x187)||process.env.VITEST)return;await M['register'](j,{'parseOptions':i[e(0x188)]['cookieOptions']}),await M['register'](c,{'secret':i['auth'][e(0x189)],'cookieName':i['auth']['cookieName'],'cookie':i[e(0x188)]['cookieOptions'],'store':new p({'prefix':i['auth']['cookieName']+':'+(i['pg']?.[e(0x18a)]||'db')+':','client':b})}),await M['register'](fastifyPassport['initialize']()),await M[e(0x18b)](fastifyPassport['secureSession']()),fastifyPassport['registerUserSerializer'](async n=>({'user':n})),fastifyPassport['registerUserDeserializer'](async n=>{const v=n?.['user']||n;return v?.['id']&&(v['permissions']=await getUserPermissions(v['id'],H)),v;});}
@@ -1 +1 @@
1
- import{BadRequestError}from'../../errors.js';function z(C,N){C=C-0x10d;const r=U();let p=r[C];return p;}import{verifyPassword}from'./index.js';function U(){const Y=['select\x20uid\x20as\x20id,\x20user_type\x20as\x20type,\x20password_hash,\x20twofa\x20from\x20admin.users\x20where\x20$1\x20in\x20(login,email,phone)\x20and\x20enabled\x20limit\x201'];U=function(){return Y;};return U();}export async function verifyUser({user:C,password:N,ip:r},{pg:p,logger:c}){const T=z;if(!C||C==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!N||N==='')throw new BadRequestError('not\x20enough\x20params:\x20password');c['metrics']('user.login');const x=T(0x10d),m=await p['query'](x,[C])['then'](u=>u['rows']?.[0x0]);if(!m){const u='user\x20not\x20found';c['info']({'file':'auth/warn','error':u,'user':C,'ip':r});throw new BadRequestError(u);}const Q=await verifyPassword(N,m['password_hash']);if(!Q){const L='Wrong\x20password';c['info']({'file':'auth/warn','error':L,'user':C,'ip':r});throw new BadRequestError(L);}return delete m['password_hash'],m;}
1
+ function U(){const q=['then','info','Wrong\x20password'];U=function(){return q;};return U();}import{BadRequestError}from'../../errors.js';function A(z,j){z=z-0x168;const c=U();let p=c[z];return p;}import{verifyPassword}from'./index.js';export async function verifyUser({user:z,password:j,ip:c},{pg:p,logger:M}){const r=A;if(!z||z==='')throw new BadRequestError('not\x20enough\x20params:\x20user');if(!j||j==='')throw new BadRequestError('not\x20enough\x20params:\x20password');M['metrics']('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',i=await p['query'](H,[z])[r(0x168)](n=>n['rows']?.[0x0]);if(!i){const n='user\x20not\x20found';M[r(0x169)]({'file':'auth/warn','error':n,'user':z,'ip':c});throw new BadRequestError(n);}const b=await verifyPassword(j,i['password_hash']);if(!b){const v=r(0x16a);M['info']({'file':'auth/warn','error':v,'user':z,'ip':c});throw new BadRequestError(v);}return delete i['password_hash'],i;}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x19b;const r=U();let p=r[C];return p;}function U(){const A=['query','rows','table_name','dictionaries','code','items','Invalid\x20dictionary\x20items:\x20','has','Dictionary\x20table\x20not\x20found','set','database','Dictionary\x20items\x20must\x20be\x20an\x20array','connect','BEGIN','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionaries\x20(code,\x20name,\x20module,\x20source,\x20editable)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4,\x20$5)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ON\x20CONFLICT\x20(code)\x20DO\x20UPDATE\x20SET\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20name\x20=\x20EXCLUDED.name,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20module\x20=\x20EXCLUDED.module,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20source\x20=\x20EXCLUDED.source,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20editable\x20=\x20EXCLUDED.editable,\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updated_at\x20=\x20now()\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionary_items\x20(dictionary_id,\x20code,\x20name,\x20parent_id)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','COMMIT','ROLLBACK','get','values','push'];U=function(){return A;};return U();}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:C,dictionaries:dictionaries=[]}){const N=new Map(),r=new Map();let p,c;async function x(){const a=z;if(p!==undefined)return p;if(!C)throw new Error('empty\x20pg');return c??=C[a(0x19b)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](t=>{const Z=a,h=t[Z(0x19c)][0x0]?.[Z(0x19d)];p=h===Z(0x19e)?h:null;}),await c,p;}function m(t){if(!dictionaryName['test'](t))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+t);}function Q(t){const H=z;for(const h of Array['isArray'](t)?t:[t]){m(h[H(0x19f)]);if(!Array['isArray'](h[H(0x1a0)]))throw new ValidationError(H(0x1a1)+h['code']);if(N[H(0x1a2)](h[H(0x19f)]))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+h['code']);N['set'](h['code'],{...h,'source':'static'});}}function u(t){return N['has'](t);}async function L(t){const v=z;m(t);const h=N['get'](t);if(h&&h['checked'])return h[v(0x1a0)];const D=await x();if(!D)throw new NotFoundError(v(0x1a3));const d=await C?.[v(0x19b)]('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20di.code,\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionary_items\x20di\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20admin.dictionaries\x20d\x20ON\x20d.id\x20=\x20di.dictionary_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20d.code\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20di.name\x0a\x20\x20\x20\x20\x20\x20\x20\x20',[t]);if(d?.['rows']?.['length']){const V=d?.['rows'];return N[v(0x1a4)](t,{'code':t,'name':t,'items':V,'source':v(0x1a5),'checked':!![]}),V;}if(!h?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+t);return h['checked']=!![],h['items'];}async function T(t,h){const n=z;m(t);if(!Array['isArray'](h))throw new ValidationError(n(0x1a6));const D=await x();if(!D)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!C)throw new Error('empty\x20pg');const d=await C[n(0x1a7)]();try{await d['query'](n(0x1a8));const V=await d[n(0x19b)](n(0x1a9),[t,t,'fcore','custom',!![]]),q=V[n(0x19c)][0x0]['id'];await d[n(0x19b)]('DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1',[q]);for(const w of h){await d['query'](n(0x1aa),[q,w[n(0x19f)],w['name'],w['parentId']??null]);}await d['query'](n(0x1ab));}catch(O){await d['query'](n(0x1ac));throw O;}finally{d['release']();}N['set'](t,{'items':h,'code':t,'source':'static','checked':!![]}),r[n(0x1a4)](t,(r[n(0x1ad)](t)??0x0)+0x1);}function Y(t){const R=z;return m(t),r['set'](t,(r[R(0x1ad)](t)??0x0)+0x1),N['delete'](t);}function f(t){return r['get'](t)??0x0;}async function F(){const o=z,t=[...N[o(0x1ae)]()]['map'](({code:d,name:V,source:q})=>({'code':d,'name':V??d,'source':q})),h=await x();if(!h)return t;if(!C)throw new Error('empty\x20pg');const D=await C['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20code,\x20name,\x20\x27database\x27\x20AS\x20source\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionaries\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20');for(const d of D[o(0x19c)]){!N['has'](d['code'])&&t[o(0x1af)](d);}return t;}return Q(dictionaries),{'register':Q,'get':L,'put':T,'clear':Y,'revision':f,'list':F,'has':u};}
1
+ import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function A(z,j){z=z-0x1c6;const c=U();let p=c[z];return p;}function U(){const u=['empty\x20pg','dictionaries','isArray','Invalid\x20dictionary\x20items:\x20','set','code','get','checked','items','\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','length','rows','Dictionary\x20not\x20found:\x20','Dictionary\x20table\x20not\x20found','BEGIN','query','fcore','custom','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20INSERT\x20INTO\x20admin.dictionary_items\x20(dictionary_id,\x20code,\x20name,\x20parent_id)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','static'];U=function(){return u;};return U();}export function createDictionary({pg:z,dictionaries:dictionaries=[]}){const j=new Map(),c=new Map();let p,M;async function H(){const R=A;if(p!==undefined)return p;if(!z)throw new Error(R(0x1c6));return M??=z['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20table_name\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20information_schema.tables\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20table_schema\x20=\x20\x27admin\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20table_name\x20=\x20\x27dictionaries\x27\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20')['then'](o=>{const D=R,P=o['rows'][0x0]?.['table_name'];p=P===D(0x1c7)?P:null;}),await M,p;}function i(o){if(!dictionaryName['test'](o))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+o);}function b(o){const C=A;for(const P of Array[C(0x1c8)](o)?o:[o]){i(P['code']);if(!Array['isArray'](P['items']))throw new ValidationError(C(0x1c9)+P['code']);if(j['has'](P['code']))throw new ConflictError('Dictionary\x20already\x20registered:\x20'+P['code']);j[C(0x1ca)](P[C(0x1cb)],{...P,'source':'static'});}}function n(o){return j['has'](o);}async function v(o){const I=A;i(o);const P=j[I(0x1cc)](o);if(P&&P[I(0x1cd)])return P[I(0x1ce)];const t=await H();if(!t)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const g=await z?.['query'](I(0x1cf),[o]);if(g?.['rows']?.[I(0x1d0)]){const y=g?.[I(0x1d1)];return j['set'](o,{'code':o,'name':o,'items':y,'source':'database','checked':!![]}),y;}if(!P?.['items'])throw new NotFoundError(I(0x1d2)+o);return P['checked']=!![],P['items'];}async function r(o,P){const l=A;i(o);if(!Array['isArray'](P))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const t=await H();if(!t)throw new NotFoundError(l(0x1d3));if(!z)throw new Error('empty\x20pg');const g=await z['connect']();try{await g['query'](l(0x1d4));const y=await g[l(0x1d5)]('\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,l(0x1d6),l(0x1d7),!![]]),B=y[l(0x1d1)][0x0]['id'];await g[l(0x1d5)](l(0x1d8),[B]);for(const Y of P){await g['query'](l(0x1d9),[B,Y['code'],Y['name'],Y['parentId']??null]);}await g['query']('COMMIT');}catch(s){await g[l(0x1d5)]('ROLLBACK');throw s;}finally{g['release']();}j[l(0x1ca)](o,{'items':P,'code':o,'source':l(0x1da),'checked':!![]}),c[l(0x1ca)](o,(c[l(0x1cc)](o)??0x0)+0x1);}function q(o){const x=A;return i(o),c[x(0x1ca)](o,(c[x(0x1cc)](o)??0x0)+0x1),j['delete'](o);}function Z(o){return c['get'](o)??0x0;}async function e(){const o=[...j['values']()]['map'](({code:g,name:y,source:B})=>({'code':g,'name':y??g,'source':B})),P=await H();if(!P)return o;if(!z)throw new Error('empty\x20pg');const t=await z['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 g of t['rows']){!j['has'](g['code'])&&o['push'](g);}return o;}return b(dictionaries),{'register':b,'get':v,'put':r,'clear':q,'revision':Z,'list':e,'has':n};}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x100;const r=U();let p=r[C];return p;}function U(){const d=['replace','alloc','transformToByteArray','from','toString','endpoint','accessKey','accessKeyId','secretKey','folder','name','sha256','update','digest','length','Invalid\x20file\x20token','base64url'];U=function(){return d;};return U();}import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import C from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function keyFor(N,r){const Y=z;if(!r||r['startsWith']('/')||r['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const p=r['replace'](/\\/g,'/')['replace'](/^\/+/,''),c=(N??'')[Y(0x100)](/^\/+|\/+$/g,'');return c?c+'/'+p:p;}async function bodyToBuffer(N){const f=z;if(!N)return Buffer[f(0x101)](0x0);const r=N;if(typeof r[f(0x102)]==='function')return Buffer['from'](await r['transformToByteArray']());const p=[];for await(const c of N){p['push'](Buffer[f(0x103)](c));}return Buffer['concat'](p);}export function createFileS3(N){const F=z,r=N['tokenSecret']??process.env.FILE_TOKEN_SECRET??C['randomBytes'](0x20)[F(0x104)]('hex'),p=new S3Client({'endpoint':N[F(0x105)],'region':N['region']??'us-east-1','forcePathStyle':N['forcePathStyle']??!![],'credentials':N['accessKeyId']||N[F(0x106)]?{'accessKeyId':N[F(0x107)]??N['accessKey'],'secretAccessKey':N['secretAccessKey']??N[F(0x108)]}:undefined}),c=x=>keyFor(N[F(0x109)],x);return{async 'put'(x,m){await p['send'](new PutObjectCommand({'Bucket':N['bucket'],'Key':c(x),'Body':m}));},async 'get'(x){const m=await p['send'](new GetObjectCommand({'Bucket':N['bucket'],'Key':c(x)}));return bodyToBuffer(m['Body']);},async 'exists'(x){const t=F;try{return await p['send'](new HeadObjectCommand({'Bucket':N['bucket'],'Key':c(x)})),!![];}catch(m){const Q=m;if(Q['$metadata']?.['httpStatusCode']===0x194||Q[t(0x10a)]==='NotFound')return![];throw m;}},async 'delete'(x){await p['send'](new DeleteObjectCommand({'Bucket':N['bucket'],'Key':c(x)}));},'create'(x,m=N['tokenTtl']??0xe10){const h=F,Q=Buffer['from'](x)['toString']('base64url'),u=C['createHmac'](h(0x10b),r)[h(0x10c)](Q)[h(0x10d)]('base64url');return Q+'.'+u;},'verify'(x){const D=F,[m,Q]=x['split']('.');if(!m||!Q)throw new UnauthorizedError('Invalid\x20file\x20token');const u=C['createHmac']('sha256',r)[D(0x10c)](m)[D(0x10d)](),L=Buffer['from'](Q,'base64url');if(u[D(0x10e)]!==L[D(0x10e)]||!C['timingSafeEqual'](u,L))throw new UnauthorizedError(D(0x10f));const T=Buffer[D(0x103)](m,D(0x110))['toString']('utf8');return T;}};}
1
+ import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import z from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function A(z,j){z=z-0x13c;const c=U();let p=c[z];return p;}function keyFor(j,c){const q=A;if(!c||c['startsWith']('/')||c['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');const p=c['replace'](/\\/g,'/')[q(0x13c)](/^\/+/,''),M=(j??'')['replace'](/^\/+|\/+$/g,'');return M?M+'/'+p:p;}function U(){const y=['replace','alloc','from','transformToByteArray','accessKeyId','secretKey','bucket','Body','send','tokenTtl','createHmac','update','split','base64url','length'];U=function(){return y;};return U();}async function bodyToBuffer(j){const Z=A;if(!j)return Buffer[Z(0x13d)](0x0);const c=j;if(typeof c['transformToByteArray']==='function')return Buffer[Z(0x13e)](await c[Z(0x13f)]());const p=[];for await(const M of j){p['push'](Buffer['from'](M));}return Buffer['concat'](p);}export function createFileS3(j){const e=A,c=j['tokenSecret']??process.env.FILE_TOKEN_SECRET??z['randomBytes'](0x20)['toString']('hex'),p=new S3Client({'endpoint':j['endpoint'],'region':j['region']??'us-east-1','forcePathStyle':j['forcePathStyle']??!![],'credentials':j[e(0x140)]||j['accessKey']?{'accessKeyId':j['accessKeyId']??j['accessKey'],'secretAccessKey':j['secretAccessKey']??j[e(0x141)]}:undefined}),M=H=>keyFor(j['folder'],H);return{async 'put'(H,i){await p['send'](new PutObjectCommand({'Bucket':j['bucket'],'Key':M(H),'Body':i}));},async 'get'(H){const o=e,i=await p['send'](new GetObjectCommand({'Bucket':j[o(0x142)],'Key':M(H)}));return bodyToBuffer(i[o(0x143)]);},async 'exists'(H){const P=e;try{return await p[P(0x144)](new HeadObjectCommand({'Bucket':j['bucket'],'Key':M(H)})),!![];}catch(i){const b=i;if(b['$metadata']?.['httpStatusCode']===0x194||b['name']==='NotFound')return![];throw i;}},async 'delete'(H){await p['send'](new DeleteObjectCommand({'Bucket':j['bucket'],'Key':M(H)}));},'create'(H,i=j[e(0x145)]??0xe10){const t=e,b=Buffer['from'](H)['toString']('base64url'),n=z[t(0x146)]('sha256',c)[t(0x147)](b)['digest']('base64url');return b+'.'+n;},'verify'(H){const g=e,[i,b]=H[g(0x148)]('.');if(!i||!b)throw new UnauthorizedError('Invalid\x20file\x20token');const n=z['createHmac']('sha256',c)['update'](i)['digest'](),v=Buffer['from'](b,g(0x149));if(n['length']!==v[g(0x14a)]||!z['timingSafeEqual'](n,v))throw new UnauthorizedError('Invalid\x20file\x20token');const r=Buffer['from'](i,'base64url')['toString']('utf8');return r;}};}
@@ -1 +1 @@
1
- const x=z;import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()[x(0x64)](process.env.AUTH_JWT_SECRET);function U(){const u=['encode','setProtectedHeader','HS256'];U=function(){return u;};return U();}export async function jwtSignToken(C){const m=x;if(!process.env.AUTH_JWT_SECRET)return;const {id:N,type:r,permissions:p}=C,c=await new SignJWT({'id':N,'type':r,'permissions':p})[m(0x65)]({'alg':m(0x66)})['setIssuedAt']()['setExpirationTime']('1h')['sign'](secret);return c;}function z(C,N){C=C-0x64;const r=U();let p=r[C];return p;}export async function jwtVerifyToken(C){const Q=x,N=await jwtVerify(C,secret,{'algorithms':[Q(0x66)]})['catch'](r=>{console['log'](r['message']);});return N?.['payload'];}
1
+ import{SignJWT,jwtVerify}from'jose';function A(z,j){z=z-0x9c;const c=U();let p=c[z];return p;}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(z){const H=A;if(!process.env.AUTH_JWT_SECRET)return;const {id:j,type:c,permissions:p}=z,M=await new SignJWT({'id':j,'type':c,'permissions':p})['setProtectedHeader']({'alg':H(0x9c)})['setIssuedAt']()[H(0x9d)]('1h')[H(0x9e)](secret);return M;}export async function jwtVerifyToken(z){const i=A,j=await jwtVerify(z,secret,{'algorithms':['HS256']})[i(0x9f)](c=>{const b=i;console['log'](c[b(0xa0)]);});return j?.['payload'];}function U(){const n=['HS256','setExpirationTime','sign','catch','message'];U=function(){return n;};return U();}
@@ -1 +1 @@
1
- function U(){const u=['password','token','end','bind'];U=function(){return u;};return U();}import C from'pino';function z(C,N){C=C-0x100;const r=U();let p=r[C];return p;}export function createLogger(){const Q=z,N=C['transport']({'target':'./transport.js'}),r=C({'level':'info','timestamp':C['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':['req.headers.authorization',Q(0x100),Q(0x101),'accessToken','refreshToken'],'censor':'[REDACTED]'}},N),p={};function c(x,m){if(x===undefined)return{...p};p[x]=(p[x]??0x0)+(m??0x1);}return Object['assign'](r,{'close':async()=>N[Q(0x102)](),'metrics':c,'file':()=>r['info'][Q(0x103)](r)});}
1
+ import z from'pino';function U(){const n=['transport','./transport.js','stdTimeFunctions','app','req.headers.authorization','[REDACTED]','info','bind'];U=function(){return n;};return U();}function A(z,j){z=z-0x19e;const c=U();let p=c[z];return p;}export function createLogger(){const b=A,j=z[b(0x19e)]({'target':b(0x19f)}),c=z({'level':'info','timestamp':z[b(0x1a0)]['isoTime'],'base':{'service':b(0x1a1)},'redact':{'paths':[b(0x1a2),'password','token','accessToken','refreshToken'],'censor':b(0x1a3)}},j),p={};function M(H,i){if(H===undefined)return{...p};p[H]=(p[H]??0x0)+(i??0x1);}return Object['assign'](c,{'close':async()=>j['end'](),'metrics':M,'file':()=>c[b(0x1a4)][b(0x1a5)](c)});}
@@ -1 +1 @@
1
- function U(){const f=['slice','join','date','stream','values','end','level','stringify'];U=function(){return f;};return U();}import C from'node:fs';import N from'node:path';function z(C,N){C=C-0x8e;const r=U();let p=r[C];return p;}import r from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:'warn',0x32:'error',0x3c:'error'},streams=new Map();function getDate(){const Q=z;return new Date()['toISOString']()[Q(0x8e)](0x0,0xa);}function createStream(p,c){const u=z,x=N['resolve']('logs',p);return C['mkdirSync'](x,{'recursive':!![]}),C['createWriteStream'](N[u(0x8f)](x,c+'.log'),{'flags':'a'});}function getStream(p){const L=z,c=getDate(),x=streams['get'](p);if(x&&x[L(0x90)]===c)return x['stream'];x?.[L(0x91)]['end']();const m=createStream(p,c);return streams['set'](p,{'date':c,'stream':m}),m;}function closeStreams(){const T=z;for(const {stream:p}of streams[T(0x92)]()){p[T(0x93)]();}streams['clear']();}export default async function loggerTransport(){return r(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(p){const Y=z;for await(const c of p){const x=LEVELS[c[Y(0x94)]];if(!x)continue;const m=getStream(c['file']||x);delete c['file'],m['write'](JSON[Y(0x95)](c)+'\x0a');}}
1
+ const b=A;function A(z,j){z=z-0x1d8;const c=U();let p=c[z];return p;}import z from'node:fs';import j from'node:path';import c from'pino-abstract-transport';const LEVELS={0x1e:b(0x1d8),0x28:'warn',0x32:'error',0x3c:'error'},streams=new Map();function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(p,M){const n=b,H=j['resolve'](n(0x1d9),p);return z['mkdirSync'](H,{'recursive':!![]}),z[n(0x1da)](j[n(0x1db)](H,M+n(0x1dc)),{'flags':'a'});}function getStream(p){const v=b,M=getDate(),H=streams[v(0x1dd)](p);if(H&&H['date']===M)return H['stream'];H?.[v(0x1de)]['end']();const i=createStream(p,M);return streams['set'](p,{'date':M,'stream':i}),i;}function U(){const Z=['info','logs','createWriteStream','join','.log','get','stream','values','level','write'];U=function(){return Z;};return U();}function closeStreams(){const r=b;for(const {stream:p}of streams[r(0x1df)]()){p['end']();}streams['clear']();}export default async function loggerTransport(){return c(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(p){const q=b;for await(const M of p){const H=LEVELS[M[q(0x1e0)]];if(!H)continue;const i=getStream(M['file']||H);delete M['file'],i[q(0x1e1)](JSON['stringify'](M)+'\x0a');}}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x1f0;const r=U();let p=r[C];return p;}import C from'pg';const {Pool}=C;function U(){const f=['captureStackTrace','sql','callerStack'];U=function(){return f;};return U();}export function createDatabase(N){const r=new Pool(N),p=r['query']['bind'](r);function c(x,m){const T=z,Q=new Error();return Error[T(0x1f0)]?.(Q,c),p(x,m)['catch'](u=>{const Y=T,L=u;L[Y(0x1f1)]=x,L[Y(0x1f2)]=Q['stack'];throw L;});}return r['query']=c,r;}
1
+ import z from'pg';const {Pool}=z;function U(){const Z=['callerStack','stack','query'];U=function(){return Z;};return U();}function A(z,j){z=z-0xaf;const c=U();let p=c[z];return p;}export function createDatabase(j){const q=A,c=new Pool(j),p=c['query']['bind'](c);function M(H,i){const b=new Error();return Error['captureStackTrace']?.(b,M),p(H,i)['catch'](n=>{const r=A,v=n;v['sql']=H,v[r(0xaf)]=b[r(0xb0)];throw v;});}return c[q(0xb1)]=M,c;}
@@ -1 +1 @@
1
- function z(C,N){C=C-0xae;const r=U();let p=r[C];return p;}import{Redis}from'ioredis';export function createRedis(C){const m=z,N=new Redis(C);return{'get':r=>N['get'](r),'set':(r,p,c,x)=>{if(x)return N['set'](r,p,'EX',x);if(typeof c==='number')return N['set'](r,p,'EX',c);return N['set'](r,p);},'del':r=>N['del'](r),'delete':r=>N[m(0xae)](r),'close':()=>N['quit'](),'ping':()=>N['ping'](),'hincrby':(r,p,c)=>N[m(0xaf)](r,p,c),'incrby':(r,p)=>N['incrby'](r,p)};}function U(){const Q=['del','hincrby'];U=function(){return Q;};return U();}
1
+ function A(z,j){z=z-0x8e;const c=U();let p=c[z];return p;}import{Redis}from'ioredis';function U(){const b=['set'];U=function(){return b;};return U();}export function createRedis(z){const j=new Redis(z);return{'get':c=>j['get'](c),'set':(c,p,M,H)=>{const i=A;if(H)return j['set'](c,p,'EX',H);if(typeof M==='number')return j['set'](c,p,'EX',M);return j[i(0x8e)](c,p);},'del':c=>j['del'](c),'delete':c=>j['del'](c),'close':()=>j['quit'](),'ping':()=>j['ping'](),'hincrby':(c,p,M)=>j['hincrby'](c,p,M),'incrby':(c,p)=>j['incrby'](c,p)};}
@@ -1 +1 @@
1
- import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(C){const N=new ResourceRegistry(),r=createFind(C,N),p=createFindOne(C,N),c=createCreate(C,N),x=createUpdate(C,N),m=createRemove(C,N),Q=createFindRelation(C,N),u=createCreateRelation(C,N),L=createUpdateRelation(C,N),T=createDeleteRelation(C,N);return{'register':N['register']['bind'](N),'has':N['has']['bind'](N),'get':N['get']['bind'](N),'list':N['list']['bind'](N),'find':r,'findOne':p,'create':c,'update':x,'delete':m,'findRelation':Q,'createRelation':u,'updateRelation':L,'deleteRelation':T};}
1
+ import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';function U(){const Z=['has','bind','list'];U=function(){return Z;};return U();}import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';function A(z,j){z=z-0x15b;const c=U();let p=c[z];return p;}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(z){const q=A,j=new ResourceRegistry(),c=createFind(z,j),p=createFindOne(z,j),M=createCreate(z,j),H=createUpdate(z,j),i=createRemove(z,j),b=createFindRelation(z,j),n=createCreateRelation(z,j),v=createUpdateRelation(z,j),r=createDeleteRelation(z,j);return{'register':j['register']['bind'](j),'has':j[q(0x15b)][q(0x15c)](j),'get':j['get']['bind'](j),'list':j[q(0x15d)]['bind'](j),'find':c,'findOne':p,'create':M,'update':H,'delete':i,'findRelation':b,'createRelation':n,'updateRelation':v,'deleteRelation':r};}
@@ -1 +1 @@
1
- const x=z;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';function z(C,N){C=C-0x164;const r=U();let p=r[C];return p;}function U(){const u=['split','test','name','get','Resource\x20not\x20registered:\x20','version','table','entries','fields'];U=function(){return u;};return U();}const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(C){const p=z;return C['split']('.')['length']<=0x2&&C[p(0x164)]('.')['every'](N=>ident[p(0x165)](N));}export class ResourceRegistry{['resources']=new Map();['register'](C){const c=z;for(const N of Array['isArray'](C)?C:[C]){this['validate'](N);if(this['resources']['has'](N[c(0x166)]))throw new ConflictError('Resource\x20already\x20registered:\x20'+N[c(0x166)]);this['resources']['set'](N['name'],N);}}['has'](C){return this['resources']['has'](C);}[x(0x167)](C){const m=x,N=this['resources']['get'](C);if(!N)throw new NotFoundError(m(0x168)+C);return N;}['list'](){return[...this['resources']['values']()];}['validate'](C){const Q=x;if(C[Q(0x169)]!==0x1||!ident['test'](C['name'])||!validQualified(C[Q(0x16a)])||!ident['test'](C['key']))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+C['name']);for(const [N,r]of Object[Q(0x16b)](C[Q(0x16c)])){if(!ident['test'](N)||!ident['test'](r['column']??N))throw new ValidationError('Invalid\x20resource\x20field:\x20'+N);}}}
1
+ const p=A;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';const ident=/^[a-zA-Z0-9_-]*$/;function A(z,j){z=z-0x193;const c=U();let p=c[z];return p;}function validQualified(z){return z['split']('.')['length']<=0x2&&z['split']('.')['every'](j=>ident['test'](j));}export class ResourceRegistry{['resources']=new Map();[p(0x193)](z){const M=p;for(const j of Array[M(0x194)](z)?z:[z]){this[M(0x195)](j);if(this['resources'][M(0x196)](j['name']))throw new ConflictError('Resource\x20already\x20registered:\x20'+j['name']);this['resources']['set'](j['name'],j);}}['has'](z){const H=p;return this['resources'][H(0x196)](z);}['get'](z){const j=this['resources']['get'](z);if(!j)throw new NotFoundError('Resource\x20not\x20registered:\x20'+z);return j;}['list'](){const i=p;return[...this[i(0x197)]['values']()];}['validate'](z){const b=p;if(z['version']!==0x1||!ident[b(0x198)](z['name'])||!validQualified(z['table'])||!ident['test'](z['key']))throw new ValidationError('Invalid\x20resource\x20contract:\x20'+z['name']);for(const [j,c]of Object['entries'](z[b(0x199)])){if(!ident[b(0x198)](j)||!ident[b(0x198)](c['column']??j))throw new ValidationError(b(0x19a)+j);}}}function U(){const n=['register','isArray','validate','has','resources','test','fields','Invalid\x20resource\x20field:\x20'];U=function(){return n;};return U();}
@@ -1 +1 @@
1
- function U(){const h=['get','set','revision','length','all','has','color','icon','dictionary','_data'];U=function(){return h;};return U();}function z(C,N){C=C-0x196;const r=U();let p=r[C];return p;}const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(C,N){const Y=z,r=dictionaryIndexesCache[Y(0x196)](N)??new Map(),p=dictionaryRevisionsCache[Y(0x196)](N)??new Map();dictionaryIndexesCache[Y(0x197)](N,r),dictionaryRevisionsCache['set'](N,p);const c=C['filter'](m=>p['get'](m)!==N[Y(0x198)](m));if(c[Y(0x199)]===0x0)return r;const x=await Promise[Y(0x19a)](c['map'](async m=>{const f=Y;if(!N[f(0x19b)](m))return[m,new Map()];const Q=await N['get'](m),u=new Map();for(const L of Q){const T=L['code']??L['id'];if(T==null)continue;u['set'](String(T),{'id':T,'text':L['name']??L['text'],...L[f(0x19c)]!==undefined?{'color':L['color']}:{},...L[f(0x19d)]!==undefined?{'icon':L[f(0x19d)]}:{}});}return[m,u];}));for(const [m,Q]of x){r['set'](m,Q),p[Y(0x197)](m,N['revision'](m));}return r;}export async function addDictionaryLookupData(C,N,r){const t=z;if(!r||C['length']===0x0)return C;const p=Object['entries'](N)['flatMap'](([x,m])=>{const F=z,Q=m['lookup']?.[F(0x19e)];return Q?[{'field':x,'dictionaryName':Q}]:[];});if(p[t(0x199)]===0x0)return C;const c=await getDictionaryIndexes([...new Set(p['map'](({dictionaryName:x})=>x))],r);for(const x of C){for(const {field:m,dictionaryName:Q}of p){const u=x[m];x[m+t(0x19f)]=u==null?null:c['get'](Q)?.['get'](String(u))??null;}}return C;}
1
+ function A(z,j){z=z-0x1b7;const c=U();let p=c[z];return p;}function U(){const o=['set','map','has','get','code','text','color','icon','length'];U=function(){return o;};return U();}const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(z,j){const q=A,c=dictionaryIndexesCache['get'](j)??new Map(),p=dictionaryRevisionsCache['get'](j)??new Map();dictionaryIndexesCache['set'](j,c),dictionaryRevisionsCache[q(0x1b7)](j,p);const M=z['filter'](i=>p['get'](i)!==j['revision'](i));if(M['length']===0x0)return c;const H=await Promise['all'](M[q(0x1b8)](async i=>{const Z=q;if(!j[Z(0x1b9)](i))return[i,new Map()];const b=await j[Z(0x1ba)](i),n=new Map();for(const v of b){const r=v[Z(0x1bb)]??v['id'];if(r==null)continue;n[Z(0x1b7)](String(r),{'id':r,'text':v['name']??v[Z(0x1bc)],...v[Z(0x1bd)]!==undefined?{'color':v['color']}:{},...v[Z(0x1be)]!==undefined?{'icon':v['icon']}:{}});}return[i,n];}));for(const [i,b]of H){c[q(0x1b7)](i,b),p[q(0x1b7)](i,j['revision'](i));}return c;}export async function addDictionaryLookupData(z,j,c){const e=A;if(!c||z[e(0x1bf)]===0x0)return z;const p=Object['entries'](j)['flatMap'](([H,i])=>{const b=i['lookup']?.['dictionary'];return b?[{'field':H,'dictionaryName':b}]:[];});if(p['length']===0x0)return z;const M=await getDictionaryIndexes([...new Set(p['map'](({dictionaryName:H})=>H))],c);for(const H of z){for(const {field:i,dictionaryName:b}of p){const n=H[i];H[i+'_data']=n==null?null:M['get'](b)?.['get'](String(n))??null;}}return z;}
@@ -1 +1 @@
1
- function z(C,N){C=C-0x84;const r=U();let p=r[C];return p;}function U(){const u=['file','map'];U=function(){return u;};return U();}export function addFileToken(C,N,r){const Q=z;if(!r||C['length']===0x0)return C;const p=Object['entries'](N)['filter'](([,c])=>c['type']===Q(0x84))[Q(0x85)](([c])=>c);for(const c of C){for(const x of p){const m=c[x];typeof m==='string'&&m['length']>0x0&&(c[x]=r['create'](m));}}return C;}
1
+ function A(z,j){z=z-0x83;const c=U();let p=c[z];return p;}export function addFileToken(z,j,c){const b=A;if(!c||z[b(0x83)]===0x0)return z;const p=Object[b(0x84)](j)[b(0x85)](([,M])=>M[b(0x86)]==='file')['map'](([M])=>M);for(const M of z){for(const H of p){const i=M[H];typeof i==='string'&&i['length']>0x0&&(M[H]=c['create'](i));}}return z;}function U(){const n=['length','entries','filter','type'];U=function(){return n;};return U();}
@@ -1 +1 @@
1
- function U(){const q=['startsWith','get','entries','field','valueField','filter','SELECT\x20'];U=function(){return q;};return U();}import{qi,qt}from'../utils/sql.js';function z(C,N){C=C-0x1a2;const r=U();let p=r[C];return p;}const tableLookupCache=new WeakMap();export function clearTableLookupCache(C,N){const d=z,r=tableLookupCache['get'](N);if(!r)return;for(const p of r['keys']()){p[d(0x1a2)](C+':')&&r['delete'](p);}}export async function addTableLookupData(C,N,r){const V=z;if(!r||C['length']===0x0)return C;const p=tableLookupCache[V(0x1a3)](r)??new Map();tableLookupCache['set'](r,p);const c=Object[V(0x1a4)](N)['flatMap'](([x,m])=>{const {table:Q,valueField:valueField='id',textField:textField='name'}=m['lookup']??{};return Q?[{'field':x,'table':Q,'valueField':valueField,'textField':textField}]:[];});for(const x of c){const m=new Map();for(const T of C){const Y=T[x[V(0x1a5)]];(typeof Y==='string'||typeof Y==='number')&&m['set'](String(Y),Y);}const Q=x['table']+':'+x[V(0x1a6)]+':'+x['textField'],u=p['get'](Q)??new Map();p['set'](Q,u);const L=[...m['entries']()][V(0x1a7)](([f])=>!u['has'](f))['map'](([,f])=>f);if(L['length']>0x0){const f=await r['query'](V(0x1a8)+qi(x[V(0x1a6)])+'\x20AS\x20id,\x20'+qi(x['textField'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(x['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(x['valueField'])+'\x20=\x20ANY($1)',[L]);for(const F of f['rows']){u['set'](String(F['id']),F);}for(const t of L){!u['has'](String(t))&&u['set'](String(t),null);}}for(const h of C){const D=h[x[V(0x1a5)]];h[x[V(0x1a5)]+'_data']=D==null?null:u['get'](String(D))??null;}}return C;}
1
+ import{qi,qt}from'../utils/sql.js';function U(){const B=['entries','name','lookup','set','textField','get','has','query','\x20AS\x20id,\x20','valueField','field'];U=function(){return B;};return U();}function A(z,j){z=z-0x150;const c=U();let p=c[z];return p;}const tableLookupCache=new WeakMap();export function clearTableLookupCache(z,j){const c=tableLookupCache['get'](j);if(!c)return;for(const p of c['keys']()){p['startsWith'](z+':')&&c['delete'](p);}}export async function addTableLookupData(z,j,c){const g=A;if(!c||z['length']===0x0)return z;const p=tableLookupCache['get'](c)??new Map();tableLookupCache['set'](c,p);const M=Object[g(0x150)](j)['flatMap'](([H,i])=>{const y=g,{table:b,valueField:valueField='id',textField:textField=y(0x151)}=i[y(0x152)]??{};return b?[{'field':H,'table':b,'valueField':valueField,'textField':textField}]:[];});for(const H of M){const i=new Map();for(const r of z){const q=r[H['field']];(typeof q==='string'||typeof q==='number')&&i[g(0x153)](String(q),q);}const b=H['table']+':'+H['valueField']+':'+H[g(0x154)],n=p[g(0x155)](b)??new Map();p['set'](b,n);const v=[...i['entries']()]['filter'](([Z])=>!n[g(0x156)](Z))['map'](([,Z])=>Z);if(v['length']>0x0){const Z=await c[g(0x157)]('SELECT\x20'+qi(H['valueField'])+g(0x158)+qi(H['textField'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(H['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(H[g(0x159)])+'\x20=\x20ANY($1)',[v]);for(const e of Z['rows']){n['set'](String(e['id']),e);}for(const o of v){!n['has'](String(o))&&n['set'](String(o),null);}}for(const P of z){const t=P[H[g(0x15a)]];P[H[g(0x15a)]+'_data']=t==null?null:n['get'](String(t))??null;}}return z;}
@@ -1 +1 @@
1
- function z(C,N){C=C-0xdb;const r=U();let p=r[C];return p;}import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function U(){const H=['empty\x20pg','notes','size','get','relations','resource','table','Generic\x20Resource\x20relation\x20\x22','entries','filter','includes','INSERT\x20INTO\x20','join','query','\x20=\x20$1\x20WHERE\x20'];U=function(){return H;};return U();}import{createCreate}from'./create.js';export function createCreateRelation(C,N){const r=createCreate(C,N);return async function p({name:c,id:x,relation:m,data:Q,user:u}){const Z=z;if(!C['pg'])throw new Error(Z(0xdb));if(m===Z(0xdc)){const F=await C['pg']['query']('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[c,String(x),Q?.['body']]);return F['rows'][0x0];}if(m==='files'){const t=await C['pg']['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[c,String(x),Q?.['filePath'],Q?.[Z(0xdd)]??null]);return t['rows'][0x0];}const L=N[Z(0xde)](c),T=L[Z(0xdf)]?.[m];if(!T?.['foreignKey']||!T[Z(0xe0)]&&!T[Z(0xe1)])throw new UnsupportedError(Z(0xe2)+m+'\x22\x20requires\x20a\x20project/provider\x20implementation');let Y,f;if(T['resource'])Y=await r({'name':T[Z(0xe0)],'data':Q??{},'user':u}),f=Y[N['get'](T['resource'])['key']];else{const h=T['fields'];if(!h?.['length'])throw new UnsupportedError(Z(0xe2)+m+'\x22\x20requires\x20a\x20project/provider\x20implementation');const D=Object[Z(0xe3)](Q??{})[Z(0xe4)](([O])=>h[Z(0xe5)](O));if(!D['length'])throw new ValidationError('No\x20writable\x20fields');const d=D['map'](([O])=>qi(O)),V=D['map']((O,a)=>'$'+(a+0x1)),q=D['map'](([,O])=>O),w=await C['pg']['query'](Z(0xe6)+qt(T['table'])+'\x20('+d[Z(0xe7)](',\x20')+')\x20VALUES\x20('+V['join'](',\x20')+')\x20RETURNING\x20*',q);Y=w['rows'][0x0],f=Y['id'];}return await C['pg'][Z(0xe8)]('UPDATE\x20'+qt(L[Z(0xe1)])+'\x20SET\x20'+qi(T['foreignKey'])+Z(0xe9)+qi(L['key'])+'\x20=\x20$2',[f,x]),Y;};}
1
+ function U(){const C=['body','files','resource','includes','No\x20writable\x20fields','map','query','rows','UPDATE\x20','foreignKey','key'];U=function(){return C;};return U();}import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function A(z,j){z=z-0xb6;const c=U();let p=c[z];return p;}import{createCreate}from'./create.js';export function createCreateRelation(z,j){const c=createCreate(z,j);return async function p({name:M,id:H,relation:i,data:b,user:n}){const D=A;if(!z['pg'])throw new Error('empty\x20pg');if(i==='notes'){const e=await z['pg']['query']('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[M,String(H),b?.[D(0xb6)]]);return e['rows'][0x0];}if(i===D(0xb7)){const o=await z['pg']['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[M,String(H),b?.['filePath'],b?.['size']??null]);return o['rows'][0x0];}const v=j['get'](M),r=v['relations']?.[i];if(!r?.['foreignKey']||!r[D(0xb8)]&&!r['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+i+'\x22\x20requires\x20a\x20project/provider\x20implementation');let q,Z;if(r['resource'])q=await c({'name':r[D(0xb8)],'data':b??{},'user':n}),Z=q[j['get'](r['resource'])['key']];else{const P=r['fields'];if(!P?.['length'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+i+'\x22\x20requires\x20a\x20project/provider\x20implementation');const t=Object['entries'](b??{})['filter'](([s])=>P[D(0xb9)](s));if(!t['length'])throw new ValidationError(D(0xba));const g=t[D(0xbb)](([s])=>qi(s)),y=t['map']((s,R)=>'$'+(R+0x1)),B=t[D(0xbb)](([,s])=>s),Y=await z['pg'][D(0xbc)]('INSERT\x20INTO\x20'+qt(r['table'])+'\x20('+g['join'](',\x20')+')\x20VALUES\x20('+y['join'](',\x20')+')\x20RETURNING\x20*',B);q=Y[D(0xbd)][0x0],Z=q['id'];}return await z['pg'][D(0xbc)](D(0xbe)+qt(v['table'])+'\x20SET\x20'+qi(r[D(0xbf)])+'\x20=\x20$1\x20WHERE\x20'+qi(v[D(0xc0)])+'\x20=\x20$2',[Z,H]),q;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';function z(C,N){C=C-0x192;const r=U();let p=r[C];return p;}import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';function U(){const D=['create','map','empty\x20pg','query','join','VALUES\x20('];U=function(){return D;};return U();}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(C,N){return async function r({name:p,data:c,user:x}){const h=z,m=N['get'](p);assertOperation(m,h(0x192),x),validateInputData({'resource':m,'data':c});const Q=writableData(m,c);if(!Q['length'])throw new ValidationError('No\x20writable\x20fields');const u=Q[h(0x193)](([F])=>qi(F)),L=Q['map']((F,t)=>'$'+(t+0x1)),T=Q[h(0x193)](([,F])=>F);if(!C['pg'])throw new Error(h(0x194));const Y=await C['pg'][h(0x195)]('INSERT\x20INTO\x20'+qt(m['table'])+'\x20('+u[h(0x196)](',\x20')+')\x20'+(h(0x197)+L['join'](',\x20')+')\x20')+('RETURNING\x20'+readableFields(m)['join'](',\x20')),T),f=Y['rows'][0x0];return clearTableLookupCache(m['table'],C['pg']),await C['audit']?.['write']({'userId':x?.['id'],'module':m['module'],'resource':m['name'],'resourceId':f[m['key']],'action':'create','fields':Object['keys'](c)}),f;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,readableFields,writableData}from'../utils/sql.js';function U(){const t=['map','empty\x20pg','VALUES\x20(','RETURNING\x20','rows','table','audit','name','create'];U=function(){return t;};return U();}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function A(z,j){z=z-0x178;const c=U();let p=c[z];return p;}export function createCreate(z,j){return async function c({name:p,data:M,user:H}){const P=A,i=j['get'](p);assertOperation(i,'create',H),validateInputData({'resource':i,'data':M});const b=writableData(i,M);if(!b['length'])throw new ValidationError('No\x20writable\x20fields');const n=b[P(0x178)](([e])=>qi(e)),v=b['map']((e,o)=>'$'+(o+0x1)),r=b[P(0x178)](([,e])=>e);if(!z['pg'])throw new Error(P(0x179));const q=await z['pg']['query']('INSERT\x20INTO\x20'+qt(i['table'])+'\x20('+n['join'](',\x20')+')\x20'+(P(0x17a)+v['join'](',\x20')+')\x20')+(P(0x17b)+readableFields(i)['join'](',\x20')),r),Z=q[P(0x17c)][0x0];return clearTableLookupCache(i[P(0x17d)],z['pg']),await z[P(0x17e)]?.['write']({'userId':H?.['id'],'module':i['module'],'resource':i[P(0x17f)],'resourceId':Z[i['key']],'action':P(0x180),'fields':Object['keys'](M)}),Z;};}
@@ -1 +1 @@
1
- function z(C,N){C=C-0xe6;var r=U();var p=r[C];return p;}import{UnsupportedError}from'../../../errors.js';function U(){var u=['query'];U=function(){return u;};return U();}export function createDeleteRelation(C,N){return async function r({name:p,id:c,relation:x,relationId:m}){var Q=z;if(!C['pg'])throw new Error('empty\x20pg');if(x==='notes')return await C['pg']['query']('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[m,p,String(c)]),{'success':!![]};if(x==='files')return await C['pg'][Q(0xe6)]('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[m,p,String(c)]),{'success':!![]};throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+x+'\x22\x20requires\x20a\x20project/provider\x20implementation');};}
1
+ function A(z,j){z=z-0x78;var c=U();var p=c[z];return p;}import{UnsupportedError}from'../../../errors.js';export function createDeleteRelation(z,j){return async function c({name:p,id:M,relation:H,relationId:i}){var b=A;if(!z['pg'])throw new Error('empty\x20pg');if(H==='notes')return await z['pg'][b(0x78)]('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[i,p,String(M)]),{'success':!![]};if(H===b(0x79))return await z['pg'][b(0x78)]('DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[i,p,String(M)]),{'success':!![]};throw new UnsupportedError(b(0x7a)+H+'\x22\x20requires\x20a\x20project/provider\x20implementation');};}function U(){var n=['query','files','Generic\x20Resource\x20relation\x20\x22'];U=function(){return n;};return U();}
@@ -1 +1 @@
1
- import{assertOperation}from'../utils/permissions.js';import{qt,qi}from'../utils/sql.js';function z(C,N){C=C-0x1ab;const r=U();let p=r[C];return p;}import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(C,N){return async function r({name:p,id:c,user:x}){const u=z,m=N['get'](p);assertOperation(m,'delete',x);if(!C['pg'])throw new Error('empty\x20pg');const Q=await C['pg']['query']('DELETE\x20FROM\x20'+qt(m['table'])+'\x20WHERE\x20'+qi(m[u(0x1ab)])+u(0x1ac),[c]);if((Q['rowCount']??0x0)>0x0)clearTableLookupCache(m['table'],C['pg']);if((Q['rowCount']??0x0)>0x0)await C[u(0x1ad)]?.['write']({'module':m['module'],'resource':m[u(0x1ae)],'resourceId':c,'action':'delete'});return(Q['rowCount']??0x0)>0x0;};}function U(){const L=['key','=$1','audit','name'];U=function(){return L;};return U();}
1
+ import{assertOperation}from'../utils/permissions.js';function U(){const v=['=$1','delete'];U=function(){return v;};return U();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function A(z,j){z=z-0x79;const c=U();let p=c[z];return p;}export function createRemove(z,j){return async function c({name:p,id:M,user:H}){const n=A,i=j['get'](p);assertOperation(i,'delete',H);if(!z['pg'])throw new Error('empty\x20pg');const b=await z['pg']['query']('DELETE\x20FROM\x20'+qt(i['table'])+'\x20WHERE\x20'+qi(i['key'])+n(0x79),[M]);if((b['rowCount']??0x0)>0x0)clearTableLookupCache(i['table'],z['pg']);if((b['rowCount']??0x0)>0x0)await z['audit']?.['write']({'module':i['module'],'resource':i['name'],'resourceId':M,'action':n(0x7a)});return(b['rowCount']??0x0)>0x0;};}
@@ -1 +1 @@
1
- function z(C,N){C=C-0xaf;const r=U();let p=r[C];return p;}function U(){const w=['now','get','read','SELECT\x20','table','fields','dictionary','foreignKey','join','\x20WHERE\x20','\x20FROM\x20'];U=function(){return w;};return U();}import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';export function createFindOne(C,N){return async function r({name:p,id:c,query:query={},user:x}){const q=z,m=Date[q(0xaf)](),Q=N[q(0xb0)](p);assertOperation(Q,q(0xb1),x);if(!C['pg'])throw new Error('empty\x20pg');const u=await C['pg']['query'](q(0xb2)+readableFields(Q)['join'](',\x20')+'\x20FROM\x20'+qt(Q[q(0xb3)])+'\x20WHERE\x20'+qi(Q['key'])+'=$1\x20LIMIT\x201',[c]),L=u['rows'][0x0];if(!L)return null;await addDictionaryLookupData([L],Q[q(0xb4)],C[q(0xb5)]),await addTableLookupData([L],Q['fields'],C['pg']),addFileToken([L],Q[q(0xb4)],C['file']);const T=Array['isArray'](query['include'])?query['include']:query['include']?.['split'](',')??[];for(const Y of T){const f=Q['relations']?.[Y];if(!f?.[q(0xb6)]||!f['resource']&&!f[q(0xb3)])throw new ValidationError('Unknown\x20relation:\x20'+Y);const F=f['resource']?N[q(0xb0)](f['resource']):undefined,t=f['table']??F['table'],h=F?.['key']??'id',D=F?readableFields(F)[q(0xb7)](',\x20'):'*',d='SELECT\x20'+D+'\x20FROM\x20'+qt(t)+q(0xb8)+qi(h)+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(f['foreignKey'])+q(0xb9)+qt(Q['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(Q['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',V=(await C['pg']['query'](d,[c]))['rows'];F&&(await addDictionaryLookupData(V,F['fields'],C['dictionary']),await addTableLookupData(V,F['fields'],C['pg']),addFileToken(V,F['fields'],C['file'])),L[Y]=V;}return L['time']=Date['now']()-m,L;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';function A(z,j){z=z-0x1c0;const c=U();let p=c[z];return p;}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';function U(){const Y=['read','query','join','=$1\x20LIMIT\x201','dictionary','file','include','split','relations','table','Unknown\x20relation:\x20','resource','key','SELECT\x20'];U=function(){return Y;};return U();}import{addFileToken}from'./add-file-token.js';export function createFindOne(z,j){return async function c({name:p,id:M,query:query={},user:H}){const B=A,i=Date['now'](),b=j['get'](p);assertOperation(b,B(0x1c0),H);if(!z['pg'])throw new Error('empty\x20pg');const n=await z['pg'][B(0x1c1)]('SELECT\x20'+readableFields(b)[B(0x1c2)](',\x20')+'\x20FROM\x20'+qt(b['table'])+'\x20WHERE\x20'+qi(b['key'])+B(0x1c3),[M]),v=n['rows'][0x0];if(!v)return null;await addDictionaryLookupData([v],b['fields'],z[B(0x1c4)]),await addTableLookupData([v],b['fields'],z['pg']),addFileToken([v],b['fields'],z[B(0x1c5)]);const r=Array['isArray'](query[B(0x1c6)])?query['include']:query[B(0x1c6)]?.[B(0x1c7)](',')??[];for(const q of r){const Z=b[B(0x1c8)]?.[q];if(!Z?.['foreignKey']||!Z['resource']&&!Z[B(0x1c9)])throw new ValidationError(B(0x1ca)+q);const e=Z['resource']?j['get'](Z[B(0x1cb)]):undefined,o=Z['table']??e[B(0x1c9)],P=e?.[B(0x1cc)]??'id',t=e?readableFields(e)['join'](',\x20'):'*',g=B(0x1cd)+t+'\x20FROM\x20'+qt(o)+'\x20WHERE\x20'+qi(P)+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(Z['foreignKey'])+'\x20FROM\x20'+qt(b['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(b[B(0x1cc)])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',y=(await z['pg']['query'](g,[M]))['rows'];e&&(await addDictionaryLookupData(y,e['fields'],z['dictionary']),await addTableLookupData(y,e['fields'],z['pg']),addFileToken(y,e['fields'],z['file'])),v[q]=y;}return v['time']=Date['now']()-i,v;};}