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

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