@opengis/fcore 0.0.28 → 0.0.29

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 (102) hide show
  1. package/dist/config.js +1 -1
  2. package/dist/context.js +1 -1
  3. package/dist/errors.js +1 -1
  4. package/dist/fastify.js +1 -1
  5. package/dist/fcore.js +1 -1
  6. package/dist/migrations/cli.js +1 -1
  7. package/dist/migrations/runner.js +1 -1
  8. package/dist/modules/auth/adduser-cli.js +1 -1
  9. package/dist/modules/auth/passwd-cli.js +1 -1
  10. package/dist/modules/auth/permission-cli.js +1 -1
  11. package/dist/modules/auth/route.js +1 -1
  12. package/dist/modules/auth/schema.js +1 -1
  13. package/dist/modules/auth/services/change-password.js +1 -1
  14. package/dist/modules/auth/services/get-current-user.js +1 -1
  15. package/dist/modules/auth/services/registration.js +1 -1
  16. package/dist/modules/auth/services/verify-two-factor.js +1 -1
  17. package/dist/modules/file/mime.js +1 -1
  18. package/dist/modules/file/route.js +1 -1
  19. package/dist/modules/file/schema.js +1 -1
  20. package/dist/modules/file/services/get-file.js +1 -1
  21. package/dist/modules/file/services/resize-file.js +1 -1
  22. package/dist/modules/file/services/upload-file.js +1 -1
  23. package/dist/modules/resource/route.js +1 -1
  24. package/dist/modules/resource/schema.js +1 -1
  25. package/dist/modules/resource/services/add-note.js +1 -1
  26. package/dist/modules/resource/services/add-resource-file.js +1 -1
  27. package/dist/modules/resource/services/create-resource-relation.js +1 -1
  28. package/dist/modules/resource/services/create-resource.js +1 -1
  29. package/dist/modules/resource/services/delete-resource-relation.js +1 -1
  30. package/dist/modules/resource/services/delete-resource.js +1 -1
  31. package/dist/modules/resource/services/export-resource.js +1 -1
  32. package/dist/modules/resource/services/generate-resource-code.js +1 -1
  33. package/dist/modules/resource/services/get-resource-schema.js +1 -1
  34. package/dist/modules/resource/services/get-resource.js +1 -1
  35. package/dist/modules/resource/services/list-resource-as-user.js +1 -1
  36. package/dist/modules/resource/services/list-resource-list.js +1 -1
  37. package/dist/modules/resource/services/list-resource-relation.js +1 -1
  38. package/dist/modules/resource/services/list-resources.js +1 -1
  39. package/dist/modules/resource/services/search-resource.js +1 -1
  40. package/dist/modules/resource/services/suggest-resource.js +1 -1
  41. package/dist/modules/resource/services/update-resource-relation.js +1 -1
  42. package/dist/modules/resource/services/update-resource.js +1 -1
  43. package/dist/modules/resource/services/upload-resource-file.js +1 -1
  44. package/dist/modules/system/route.js +1 -1
  45. package/dist/modules/system/schema.js +1 -1
  46. package/dist/modules/system/services/check-system.js +1 -1
  47. package/dist/modules/system/services/get-access.js +1 -1
  48. package/dist/modules/system/services/get-api-list.js +1 -1
  49. package/dist/modules/system/services/get-audit-log.js +1 -1
  50. package/dist/modules/system/services/get-dictionary.js +1 -1
  51. package/dist/modules/system/services/get-resource-access.js +1 -1
  52. package/dist/modules/system/services/get-resource-scopes.js +1 -1
  53. package/dist/modules/system/services/get-system-log.js +1 -1
  54. package/dist/modules/system/services/get-system-settings.js +1 -1
  55. package/dist/modules/system/services/list-dictionaries.js +1 -1
  56. package/dist/modules/system/services/set-access.js +1 -1
  57. package/dist/modules/system/services/set-resource-access.js +1 -1
  58. package/dist/modules/system/services/set-resource-scopes.js +1 -1
  59. package/dist/modules/system/services/update-dictionary.js +1 -1
  60. package/dist/modules/system/services/update-system-settings.js +1 -1
  61. package/dist/modules/utils/require-admin.js +1 -1
  62. package/dist/modules/utils/safe-user.js +1 -1
  63. package/dist/modules/utils/unsupported.js +1 -1
  64. package/dist/plugins/audit/audit.js +1 -1
  65. package/dist/plugins/audit/services/write-audit.js +1 -1
  66. package/dist/plugins/auth/get-user-permissions.js +1 -1
  67. package/dist/plugins/auth/index.js +1 -1
  68. package/dist/plugins/auth/verifyUser.js +1 -1
  69. package/dist/plugins/dictionary.js +1 -1
  70. package/dist/plugins/file.js +1 -1
  71. package/dist/plugins/jwt.js +1 -1
  72. package/dist/plugins/logger/index.js +1 -1
  73. package/dist/plugins/logger/transport.js +1 -1
  74. package/dist/plugins/pg.js +1 -1
  75. package/dist/plugins/redis.js +1 -1
  76. package/dist/plugins/resource/resource.js +1 -1
  77. package/dist/plugins/resource/resource.registry.js +1 -1
  78. package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
  79. package/dist/plugins/resource/services/add-file-token.js +1 -1
  80. package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
  81. package/dist/plugins/resource/services/create-relation.js +1 -1
  82. package/dist/plugins/resource/services/create.js +1 -1
  83. package/dist/plugins/resource/services/delete-relation.js +1 -1
  84. package/dist/plugins/resource/services/delete.js +1 -1
  85. package/dist/plugins/resource/services/find-one.js +1 -1
  86. package/dist/plugins/resource/services/find-relation.js +1 -1
  87. package/dist/plugins/resource/services/find.js +1 -1
  88. package/dist/plugins/resource/services/get-table-columns.js +1 -1
  89. package/dist/plugins/resource/services/update-relation.js +1 -1
  90. package/dist/plugins/resource/services/update.js +1 -1
  91. package/dist/plugins/resource/utils/auto-index.js +1 -1
  92. package/dist/plugins/resource/utils/fields.js +1 -1
  93. package/dist/plugins/resource/utils/filters.js +1 -1
  94. package/dist/plugins/resource/utils/permissions.js +1 -1
  95. package/dist/plugins/resource/utils/scope.js +1 -1
  96. package/dist/plugins/resource/utils/sort.js +1 -1
  97. package/dist/plugins/resource/utils/sql.js +1 -1
  98. package/dist/plugins/resource/utils/summary.js +1 -1
  99. package/dist/shared/getIP.js +1 -1
  100. package/migrations/20260903140000_settings_nulls_not_distinct.sql +1 -1
  101. package/migrations/20260905120000_add_user_foreign_keys.sql +15 -0
  102. package/package.json +1 -1
@@ -1 +1 @@
1
- import{ConflictError,NotFoundError,ValidationError}from'../errors.js';const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;function f(p,Z){p=p-0x1a3;const A=s();let I=A[p];return I;}function s(){const m=['\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','rows','table_name','isArray','code','Dictionary\x20already\x20registered:\x20','get','set','empty\x20pg','query','custom','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','name','parentId','COMMIT','ROLLBACK','values','push'];s=function(){return m;};return s();}export function createDictionary({pg:p,dictionaries:dictionaries=[]}){const Z=new Map(),A=new Map();let I,j;async function D(){const F=f;if(I!==undefined)return I;if(!p)throw new Error('empty\x20pg');return j??=p['query'](F(0x1a3))[F(0x1a4)](E=>{const T=F,a=E[T(0x1a5)][0x0]?.[T(0x1a6)];I=a==='dictionaries'?a:null;}),await j,I;}function o(E){if(!dictionaryName['test'](E))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+E);}function R(E){const L=f;for(const a of Array[L(0x1a7)](E)?E:[E]){o(a[L(0x1a8)]);if(!Array['isArray'](a['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+a['code']);if(Z['has'](a['code']))throw new ConflictError(L(0x1a9)+a[L(0x1a8)]);Z['set'](a['code'],{...a,'source':'static'});}}function B(E){return Z['has'](E);}async function H(E){const y=f;o(E);const a=Z[y(0x1aa)](E);if(a&&a['checked'])return a['items'];const X=await D();if(!X)throw new NotFoundError('Dictionary\x20table\x20not\x20found');const K=await p?.['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',[E]);if(K?.[y(0x1a5)]?.['length']){const Q=K?.[y(0x1a5)];return Z[y(0x1ab)](E,{'code':E,'name':E,'items':Q,'source':'database','checked':!![]}),Q;}if(!a?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+E);return a['checked']=!![],a['items'];}async function e(E,a){const z=f;o(E);if(!Array[z(0x1a7)](a))throw new ValidationError('Dictionary\x20items\x20must\x20be\x20an\x20array');const X=await D();if(!X)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!p)throw new Error(z(0x1ac));const K=await p['connect']();try{await K[z(0x1ad)]('BEGIN');const Q=await K['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',[E,E,'fcore',z(0x1ae),!![]]),G=Q[z(0x1a5)][0x0]['id'];await K['query'](z(0x1af),[G]);for(const V of a){await K['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',[G,V['code'],V[z(0x1b0)],V[z(0x1b1)]??null]);}await K[z(0x1ad)](z(0x1b2));}catch(O){await K['query'](z(0x1b3));throw O;}finally{K['release']();}Z['set'](E,{'items':a,'code':E,'source':'static','checked':!![]}),A['set'](E,(A['get'](E)??0x0)+0x1);}function g(E){return o(E),A['set'](E,(A['get'](E)??0x0)+0x1),Z['delete'](E);}function N(E){return A['get'](E)??0x0;}async function h(){const t=f,E=[...Z[t(0x1b4)]()]['map'](({code:K,name:Q,source:G})=>({'code':K,'name':Q??K,'source':G})),a=await D();if(!a)return E;if(!p)throw new Error('empty\x20pg');const X=await p['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 K of X['rows']){!Z['has'](K['code'])&&E[t(0x1b5)](K);}return E;}return R(dictionaries),{'register':R,'get':H,'put':e,'clear':g,'revision':N,'list':h,'has':B};}
1
+ function O(){const F=['test','has','Dictionary\x20already\x20registered:\x20','code','set','Dictionary\x20table\x20not\x20found','\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','database','checked','isArray','Dictionary\x20items\x20must\x20be\x20an\x20array','empty\x20pg','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','DELETE\x20FROM\x20admin.dictionary_items\x20WHERE\x20dictionary_id\x20=\x20$1','name','static','get','delete','values','map'];O=function(){return F;};return O();}import{ConflictError,NotFoundError,ValidationError}from'../errors.js';function c(S,Z){S=S-0x113;const h=O();let U=h[S];return U;}const dictionaryName=/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/;export function createDictionary({pg:S,dictionaries:dictionaries=[]}){const Z=new Map(),h=new Map();let U,D;async function u(){if(U!==undefined)return U;if(!S)throw new Error('empty\x20pg');return D??=S['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'](i=>{const l=i['rows'][0x0]?.['table_name'];U=l==='dictionaries'?l:null;}),await D,U;}function e(i){const k=c;if(!dictionaryName[k(0x113)](i))throw new ValidationError('Invalid\x20dictionary\x20name:\x20'+i);}function q(i){const I=c;for(const l of Array['isArray'](i)?i:[i]){e(l['code']);if(!Array['isArray'](l['items']))throw new ValidationError('Invalid\x20dictionary\x20items:\x20'+l['code']);if(Z[I(0x114)](l['code']))throw new ConflictError(I(0x115)+l[I(0x116)]);Z[I(0x117)](l['code'],{...l,'source':'static'});}}function x(i){const B=c;return Z[B(0x114)](i);}async function n(i){const M=c;e(i);const l=Z['get'](i);if(l&&l['checked'])return l['items'];const b=await u();if(!b)throw new NotFoundError(M(0x118));const Y=await S?.['query'](M(0x119),[i]);if(Y?.['rows']?.['length']){const r=Y?.['rows'];return Z[M(0x117)](i,{'code':i,'name':i,'items':r,'source':M(0x11a),'checked':!![]}),r;}if(!l?.['items'])throw new NotFoundError('Dictionary\x20not\x20found:\x20'+i);return l[M(0x11b)]=!![],l['items'];}async function N(i,l){const g=c;e(i);if(!Array[g(0x11c)](l))throw new ValidationError(g(0x11d));const b=await u();if(!b)throw new NotFoundError('Dictionary\x20table\x20not\x20found');if(!S)throw new Error(g(0x11e));const Y=await S['connect']();try{await Y[g(0x11f)]('BEGIN');const r=await Y[g(0x11f)](g(0x120),[i,i,'fcore','custom',!![]]),E=r['rows'][0x0]['id'];await Y['query'](g(0x121),[E]);for(const L of l){await Y[g(0x11f)]('\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',[E,L['code'],L[g(0x122)],L['parentId']??null]);}await Y[g(0x11f)]('COMMIT');}catch(V){await Y['query']('ROLLBACK');throw V;}finally{Y['release']();}Z[g(0x117)](i,{'items':l,'code':i,'source':g(0x123),'checked':!![]}),h[g(0x117)](i,(h[g(0x124)](i)??0x0)+0x1);}function o(i){const d=c;return e(i),h[d(0x117)](i,(h['get'](i)??0x0)+0x1),Z[d(0x125)](i);}function j(i){return h['get'](i)??0x0;}async function X(){const J=c,i=[...Z[J(0x126)]()][J(0x127)](({code:Y,name:r,source:E})=>({'code':Y,'name':r??Y,'source':E})),l=await u();if(!l)return i;if(!S)throw new Error(J(0x11e));const b=await S['query']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20code,\x20name,\x20\x27database\x27\x20AS\x20source\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.dictionaries\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ORDER\x20BY\x20name\x0a\x20\x20\x20\x20\x20\x20\x20\x20');for(const Y of b['rows']){!Z['has'](Y['code'])&&i['push'](Y);}return i;}return q(dictionaries),{'register':q,'get':n,'put':N,'clear':o,'revision':j,'list':X,'has':x};}
@@ -1 +1 @@
1
- function s(){const b=['alloc','transformToByteArray','resolve','tokenSecret','join','startsWith','dirname','access','code','ENOENT','toString','createHmac','Invalid\x20file\x20token','length','from','base64url','randomBytes','us-east-1','accessKeyId','bucket','tokenTtl','sha256','digest','split','utf8'];s=function(){return b;};return s();}import p from'node:fs/promises';import Z from'node:path';import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';function f(p,Z){p=p-0x1a8;const A=s();let I=A[p];return I;}import A from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function normalizeRelativePath(I){if(!I||I['startsWith']('/')||I['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');return I['replace'](/\\/g,'/')['replace'](/^\/+/,'');}function keyFor(I,j){return''+((I??'')['replace'](/^\/+|\/+$/g,'')?(I??'')['replace'](/^\/+|\/+$/g,'')+'/':'')+normalizeRelativePath(j);}async function bodyToBuffer(I){const X=f;if(!I)return Buffer[X(0x1a8)](0x0);const j=I;if(typeof j[X(0x1a9)]==='function')return Buffer['from'](await j['transformToByteArray']());const D=[];for await(const o of I){D['push'](Buffer['from'](o));}return Buffer['concat'](D);}export function createFileLocal(I){const K=f,j=Z[K(0x1aa)](I['storagePath']||'./storage'),D=Z['join'](j,'removed'),o=I[K(0x1ab)]??process.env.FILE_TOKEN_SECRET??A['randomBytes'](0x20)['toString']('hex'),R=e=>{const Q=K,g=normalizeRelativePath(e),N=(I['folder']??'files')['replace'](/^\/+|\/+$/g,'');return N?Z[Q(0x1ac)](N,g):g;},B=e=>{const G=K,g=R(e),N=Z['resolve'](j,g),h=Z['relative'](j,N);if(h[G(0x1ad)]('..')||Z['isAbsolute'](h))throw new ValidationError('Invalid\x20file\x20path');return N;},H=e=>{const V=K,g=R(e),N=Z['resolve'](D,g),h=Z['relative'](D,N);if(h[V(0x1ad)]('..')||Z['isAbsolute'](h))throw new ValidationError('Invalid\x20file\x20path');return N;};return{async 'put'(e,g){const O=K,N=B(e);await p['mkdir'](Z[O(0x1ae)](N),{'recursive':!![]}),await p['writeFile'](N,g instanceof Buffer?g:await bodyToBuffer(g));},async 'get'(e){return p['readFile'](B(e));},async 'exists'(e){const F=K;try{return await p[F(0x1af)](B(e)),!![];}catch{return![];}},async 'delete'(e){const T=K,g=B(e),N=H(e);try{await p['mkdir'](Z['dirname'](N),{'recursive':!![]}),await p['rename'](g,N);}catch(h){const E=h;if(E[T(0x1b0)]!==T(0x1b1))throw h;}},'create'(e,g=I['tokenTtl']??0xe10){const L=K,N=Buffer['from'](e)[L(0x1b2)]('base64url'),h=A[L(0x1b3)]('sha256',o)['update'](N)['digest']('base64url');return N+'.'+h;},'verify'(e){const y=K,[g,N]=e['split']('.');if(!g||!N)throw new UnauthorizedError(y(0x1b4));const h=A['createHmac']('sha256',o)['update'](g)['digest'](),E=Buffer['from'](N,'base64url');if(h[y(0x1b5)]!==E['length']||!A['timingSafeEqual'](h,E))throw new UnauthorizedError(y(0x1b4));const a=Buffer[y(0x1b6)](g,y(0x1b7))[y(0x1b2)]('utf8');return a;}};}export function createFileS3(I){const z=f,j=I['tokenSecret']??process.env.FILE_TOKEN_SECRET??A[z(0x1b8)](0x20)[z(0x1b2)]('hex'),D=new S3Client({'endpoint':I['endpoint'],'region':I['region']??z(0x1b9),'forcePathStyle':I['forcePathStyle']??!![],'credentials':I['accessKeyId']||I['accessKey']?{'accessKeyId':I[z(0x1ba)]??I['accessKey'],'secretAccessKey':I['secretAccessKey']??I['secretKey']}:undefined}),o=R=>keyFor(I['folder'],R);return{async 'put'(R,B){await D['send'](new PutObjectCommand({'Bucket':I['bucket'],'Key':o(R),'Body':B}));},async 'get'(R){const B=await D['send'](new GetObjectCommand({'Bucket':I['bucket'],'Key':o(R)}));return bodyToBuffer(B['Body']);},async 'exists'(R){try{return await D['send'](new HeadObjectCommand({'Bucket':I['bucket'],'Key':o(R)})),!![];}catch(B){const H=B;if(H['$metadata']?.['httpStatusCode']===0x194||H['name']==='NotFound')return![];throw B;}},async 'delete'(R){const t=z;await D['send'](new DeleteObjectCommand({'Bucket':I[t(0x1bb)],'Key':o(R)}));},'create'(R,B=I[z(0x1bc)]??0xe10){const m=z,H=Buffer[m(0x1b6)](R)['toString']('base64url'),e=A['createHmac'](m(0x1bd),j)['update'](H)[m(0x1be)](m(0x1b7));return H+'.'+e;},'verify'(R){const r=z,[B,H]=R[r(0x1bf)]('.');if(!B||!H)throw new UnauthorizedError('Invalid\x20file\x20token');const e=A['createHmac']('sha256',j)['update'](B)['digest'](),g=Buffer['from'](H,r(0x1b7));if(e[r(0x1b5)]!==g['length']||!A['timingSafeEqual'](e,g))throw new UnauthorizedError(r(0x1b4));const N=Buffer[r(0x1b6)](B,'base64url')['toString'](r(0x1c0));return N;}};}
1
+ import S from'node:fs/promises';function O(){const T=['replace','alloc','from','randomBytes','relative','Invalid\x20file\x20path','readFile','dirname','rename','code','tokenTtl','toString','base64url','createHmac','split','update','digest','length','timingSafeEqual','region','accessKey','accessKeyId','send','bucket','sha256'];O=function(){return T;};return O();}import Z from'node:path';import{DeleteObjectCommand,GetObjectCommand,HeadObjectCommand,PutObjectCommand,S3Client}from'@aws-sdk/client-s3';import h from'node:crypto';import{ValidationError}from'../errors.js';import{UnauthorizedError}from'../errors.js';function normalizeRelativePath(U){const b=c;if(!U||U['startsWith']('/')||U['includes']('..'))throw new ValidationError('Invalid\x20file\x20path');return U[b(0x1a5)](/\\/g,'/')['replace'](/^\/+/,'');}function keyFor(U,D){const Y=c;return''+((U??'')[Y(0x1a5)](/^\/+|\/+$/g,'')?(U??'')[Y(0x1a5)](/^\/+|\/+$/g,'')+'/':'')+normalizeRelativePath(D);}async function bodyToBuffer(U){const r=c;if(!U)return Buffer[r(0x1a6)](0x0);const D=U;if(typeof D['transformToByteArray']==='function')return Buffer[r(0x1a7)](await D['transformToByteArray']());const u=[];for await(const e of U){u['push'](Buffer['from'](e));}return Buffer['concat'](u);}function c(S,Z){S=S-0x1a5;const h=O();let U=h[S];return U;}export function createFileLocal(U){const E=c,D=Z['resolve'](U['storagePath']||'./storage'),u=Z['join'](D,'removed'),e=U['tokenSecret']??process.env.FILE_TOKEN_SECRET??h[E(0x1a8)](0x20)['toString']('hex'),q=N=>{const L=E,o=normalizeRelativePath(N),j=(U['folder']??'files')[L(0x1a5)](/^\/+|\/+$/g,'');return j?Z['join'](j,o):o;},x=N=>{const V=E,o=q(N),j=Z['resolve'](D,o),X=Z[V(0x1a9)](D,j);if(X['startsWith']('..')||Z['isAbsolute'](X))throw new ValidationError(V(0x1aa));return j;},n=N=>{const o=q(N),j=Z['resolve'](u,o),X=Z['relative'](u,j);if(X['startsWith']('..')||Z['isAbsolute'](X))throw new ValidationError('Invalid\x20file\x20path');return j;};return{async 'put'(N,o){const j=x(N);await S['mkdir'](Z['dirname'](j),{'recursive':!![]}),await S['writeFile'](j,o instanceof Buffer?o:await bodyToBuffer(o));},async 'get'(N){const k=E;return S[k(0x1ab)](x(N));},async 'exists'(N){try{return await S['access'](x(N)),!![];}catch{return![];}},async 'delete'(N){const I=E,o=x(N),j=n(N);try{await S['mkdir'](Z[I(0x1ac)](j),{'recursive':!![]}),await S[I(0x1ad)](o,j);}catch(X){const i=X;if(i[I(0x1ae)]!=='ENOENT')throw X;}},'create'(N,o=U[E(0x1af)]??0xe10){const B=E,j=Buffer['from'](N)[B(0x1b0)](B(0x1b1)),X=h[B(0x1b2)]('sha256',e)['update'](j)['digest']('base64url');return j+'.'+X;},'verify'(N){const M=E,[o,j]=N[M(0x1b3)]('.');if(!o||!j)throw new UnauthorizedError('Invalid\x20file\x20token');const X=h['createHmac']('sha256',e)[M(0x1b4)](o)[M(0x1b5)](),i=Buffer['from'](j,'base64url');if(X[M(0x1b6)]!==i['length']||!h[M(0x1b7)](X,i))throw new UnauthorizedError('Invalid\x20file\x20token');const l=Buffer['from'](o,M(0x1b1))['toString']('utf8');return l;}};}export function createFileS3(U){const g=c,D=U['tokenSecret']??process.env.FILE_TOKEN_SECRET??h[g(0x1a8)](0x20)['toString']('hex'),u=new S3Client({'endpoint':U['endpoint'],'region':U[g(0x1b8)]??'us-east-1','forcePathStyle':U['forcePathStyle']??!![],'credentials':U['accessKeyId']||U[g(0x1b9)]?{'accessKeyId':U[g(0x1ba)]??U['accessKey'],'secretAccessKey':U['secretAccessKey']??U['secretKey']}:undefined}),e=q=>keyFor(U['folder'],q);return{async 'put'(q,x){const d=g;await u[d(0x1bb)](new PutObjectCommand({'Bucket':U[d(0x1bc)],'Key':e(q),'Body':x}));},async 'get'(q){const J=g,x=await u['send'](new GetObjectCommand({'Bucket':U[J(0x1bc)],'Key':e(q)}));return bodyToBuffer(x['Body']);},async 'exists'(q){try{return await u['send'](new HeadObjectCommand({'Bucket':U['bucket'],'Key':e(q)})),!![];}catch(x){const n=x;if(n['$metadata']?.['httpStatusCode']===0x194||n['name']==='NotFound')return![];throw x;}},async 'delete'(q){await u['send'](new DeleteObjectCommand({'Bucket':U['bucket'],'Key':e(q)}));},'create'(q,x=U[g(0x1af)]??0xe10){const F=g,n=Buffer['from'](q)['toString']('base64url'),N=h['createHmac'](F(0x1bd),D)['update'](n)[F(0x1b5)]('base64url');return n+'.'+N;},'verify'(q){const G=g,[x,n]=q['split']('.');if(!x||!n)throw new UnauthorizedError('Invalid\x20file\x20token');const N=h['createHmac']('sha256',D)['update'](x)[G(0x1b5)](),o=Buffer['from'](n,'base64url');if(N['length']!==o['length']||!h['timingSafeEqual'](N,o))throw new UnauthorizedError('Invalid\x20file\x20token');const j=Buffer[G(0x1a7)](x,'base64url')['toString']('utf8');return j;}};}
@@ -1 +1 @@
1
- import{SignJWT,jwtVerify}from'jose';function f(p,Z){p=p-0x7f;const A=s();let I=A[p];return I;}const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(p){const D=f;if(!process.env.AUTH_JWT_SECRET)return;const {id:Z,type:A,permissions:I}=p,j=await new SignJWT({'id':Z,'type':A,'permissions':I})[D(0x7f)]({'alg':'HS256'})[D(0x80)]()[D(0x81)]('1h')['sign'](secret);return j;}export async function jwtVerifyToken(p){const o=f,Z=await jwtVerify(p,secret,{'algorithms':[o(0x82)]})['catch'](A=>{console['log'](A['message']);});return Z?.['payload'];}function s(){const R=['setProtectedHeader','setIssuedAt','setExpirationTime','HS256'];s=function(){return R;};return s();}
1
+ function c(S,Z){S=S-0x7d;const h=O();let U=h[S];return U;}import{SignJWT,jwtVerify}from'jose';const secret=new TextEncoder()['encode'](process.env.AUTH_JWT_SECRET);export async function jwtSignToken(S){const u=c;if(!process.env.AUTH_JWT_SECRET)return;const {id:Z,type:h,permissions:U}=S,D=await new SignJWT({'id':Z,'type':h,'permissions':U})['setProtectedHeader']({'alg':'HS256'})[u(0x7d)]()['setExpirationTime']('1h')[u(0x7e)](secret);return D;}function O(){const x=['setIssuedAt','sign','catch','log','message'];O=function(){return x;};return O();}export async function jwtVerifyToken(S){const e=c,Z=await jwtVerify(S,secret,{'algorithms':['HS256']})[e(0x7f)](h=>{const q=e;console[q(0x80)](h[q(0x81)]);});return Z?.['payload'];}
@@ -1 +1 @@
1
- import p from'pino';function f(p,Z){p=p-0x80;const A=s();let I=A[p];return I;}export function createLogger(){const R=f,Z=p['transport']({'target':'./transport.js'}),A=p({'level':'info','timestamp':p[R(0x80)]['isoTime'],'base':{'service':'app'},'redact':{'paths':[R(0x81),'password',R(0x82),'accessToken',R(0x83)],'censor':'[REDACTED]'}},Z),I={};function j(D,o){if(D===undefined)return{...I};I[D]=(I[D]??0x0)+(o??0x1);}return Object['assign'](A,{'close':async()=>Z['end'](),'metrics':j,'file':()=>A[R(0x84)]['bind'](A)});}function s(){const B=['stdTimeFunctions','req.headers.authorization','token','refreshToken','info'];s=function(){return B;};return s();}
1
+ import S from'pino';function O(){const x=['req.headers.authorization','password','refreshToken'];O=function(){return x;};return O();}function c(S,Z){S=S-0x163;const h=O();let U=h[S];return U;}export function createLogger(){const q=c,Z=S['transport']({'target':'./transport.js'}),h=S({'level':'info','timestamp':S['stdTimeFunctions']['isoTime'],'base':{'service':'app'},'redact':{'paths':[q(0x163),q(0x164),'token','accessToken',q(0x165)],'censor':'[REDACTED]'}},Z),U={};function D(u,e){if(u===undefined)return{...U};U[u]=(U[u]??0x0)+(e??0x1);}return Object['assign'](h,{'close':async()=>Z['end'](),'metrics':D,'file':()=>h['info']['bind'](h)});}
@@ -1 +1 @@
1
- const R=f;function s(){const h=['info','warn','slice','resolve','mkdirSync','get','stream','end','write'];s=function(){return h;};return s();}import p from'node:fs';import Z from'node:path';import A from'pino-abstract-transport';const LEVELS={0x1e:R(0xa0),0x28:R(0xa1),0x32:'error',0x3c:'error'},streams=new Map();function getDate(){const B=R;return new Date()['toISOString']()[B(0xa2)](0x0,0xa);}function createStream(I,j){const H=R,D=Z[H(0xa3)]('logs',I);return p[H(0xa4)](D,{'recursive':!![]}),p['createWriteStream'](Z['join'](D,j+'.log'),{'flags':'a'});}function f(p,Z){p=p-0xa0;const A=s();let I=A[p];return I;}function getStream(I){const e=R,j=getDate(),D=streams[e(0xa5)](I);if(D&&D['date']===j)return D[e(0xa6)];D?.['stream']['end']();const o=createStream(I,j);return streams['set'](I,{'date':j,'stream':o}),o;}function closeStreams(){const g=R;for(const {stream:I}of streams['values']()){I[g(0xa7)]();}streams['clear']();}export default async function loggerTransport(){return A(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(I){const N=R;for await(const j of I){const D=LEVELS[j['level']];if(!D)continue;const o=getStream(j['file']||D);delete j['file'],o[N(0xa8)](JSON['stringify'](j)+'\x0a');}}
1
+ const q=c;import S from'node:fs';import Z from'node:path';import h from'pino-abstract-transport';const LEVELS={0x1e:'info',0x28:'warn',0x32:q(0x82),0x3c:'error'},streams=new Map();function c(S,Z){S=S-0x82;const h=O();let U=h[S];return U;}function getDate(){return new Date()['toISOString']()['slice'](0x0,0xa);}function createStream(U,D){const x=q,u=Z['resolve']('logs',U);return S[x(0x83)](u,{'recursive':!![]}),S['createWriteStream'](Z[x(0x84)](u,D+x(0x85)),{'flags':'a'});}function O(){const j=['error','mkdirSync','join','.log','stream','set','values','file'];O=function(){return j;};return O();}function getStream(U){const n=q,D=getDate(),u=streams['get'](U);if(u&&u['date']===D)return u[n(0x86)];u?.['stream']['end']();const e=createStream(U,D);return streams[n(0x87)](U,{'date':D,'stream':e}),e;}function closeStreams(){const N=q;for(const {stream:U}of streams[N(0x88)]()){U['end']();}streams['clear']();}export default async function loggerTransport(){return h(writeLogs,{'close':async()=>{closeStreams();}});}async function writeLogs(U){const o=q;for await(const D of U){const u=LEVELS[D['level']];if(!u)continue;const e=getStream(D['file']||u);delete D[o(0x89)],e['write'](JSON['stringify'](D)+'\x0a');}}
@@ -1 +1 @@
1
- import p from'pg';function s(){const E=['query','stack','callerStack'];s=function(){return E;};return s();}function f(p,Z){p=p-0x179;const A=s();let I=A[p];return I;}const {Pool}=p;export function createDatabase(Z){const g=f,A=new Pool(Z),I=A[g(0x179)]['bind'](A);function j(D,o){const R=new Error();return Error['captureStackTrace']?.(R,j),I(D,o)['catch'](B=>{const N=f,H=B;H['sql']=D,H['callerStack']=R[N(0x17a)];throw H;});}return A['query']=j,A['transaction']=async function(D){const h=g,o=new Error();Error['captureStackTrace']?.(o,A['transaction']);const R=await A['connect']();try{await R[h(0x179)]('BEGIN');const B=await D(R);return await R[h(0x179)]('COMMIT'),B;}catch(H){await R[h(0x179)]('ROLLBACK');const e=H;e[h(0x17b)]=o[h(0x17a)];throw e;}finally{R['release']();}},A;}
1
+ import S from'pg';function O(){const i=['catch','stack','BEGIN','COMMIT','query','ROLLBACK'];O=function(){return i;};return O();}const {Pool}=S;function c(S,Z){S=S-0x176;const h=O();let U=h[S];return U;}export function createDatabase(Z){const h=new Pool(Z),U=h['query']['bind'](h);function D(u,e){const o=c,q=new Error();return Error['captureStackTrace']?.(q,D),U(u,e)[o(0x176)](x=>{const j=o,n=x;n['sql']=u,n['callerStack']=q[j(0x177)];throw n;});}return h['query']=D,h['transaction']=async function(u){const X=c,e=new Error();Error['captureStackTrace']?.(e,h['transaction']);const q=await h['connect']();try{await q['query'](X(0x178));const x=await u(q);return await q['query'](X(0x179)),x;}catch(n){await q[X(0x17a)](X(0x17b));const N=n;N['callerStack']=e[X(0x177)];throw N;}finally{q['release']();}},h;}
@@ -1 +1 @@
1
- import{Redis}from'ioredis';export function createRedis(p){const o=f;console['log'](o(0x1ac),p);const Z=new Redis(p);return{'get':A=>Z['get'](A),'set':(A,I,j,D)=>{if(D)return Z['set'](A,I,'EX',D);if(typeof j==='number')return Z['set'](A,I,'EX',j);return Z['set'](A,I);},'del':A=>Z['del'](A),'delete':A=>Z['del'](A),'close':()=>Z[o(0x1ad)](),'ping':()=>Z['ping'](),'hincrby':(A,I,j)=>Z['hincrby'](A,I,j),'incrby':(A,I)=>Z['incrby'](A,I)};}function f(p,Z){p=p-0x1ac;const A=s();let I=A[p];return I;}function s(){const R=['Creating\x20Redis\x20client\x20with\x20config:','quit'];s=function(){return R;};return s();}
1
+ import{Redis}from'ioredis';function O(){const q=['set'];O=function(){return q;};return O();}function c(S,Z){S=S-0x1a1;const h=O();let U=h[S];return U;}export function createRedis(S){console['log']('Creating\x20Redis\x20client\x20with\x20config:',S);const Z=new Redis(S);return{'get':h=>Z['get'](h),'set':(h,U,D,u)=>{const e=c;if(u)return Z['set'](h,U,'EX',u);if(typeof D==='number')return Z[e(0x1a1)](h,U,'EX',D);return Z[e(0x1a1)](h,U);},'del':h=>Z['del'](h),'delete':h=>Z['del'](h),'close':()=>Z['quit'](),'ping':()=>Z['ping'](),'hincrby':(h,U,D)=>Z['hincrby'](h,U,D),'incrby':(h,U)=>Z['incrby'](h,U)};}
@@ -1 +1 @@
1
- function f(p,Z){p=p-0x1a5;const A=s();let I=A[p];return I;}import{ResourceRegistry}from'./resource.registry.js';import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(p){const g=f,Z=new ResourceRegistry(),A=createFind(p,Z),I=createFindOne(p,Z),j=createCreate(p,Z),D=createUpdate(p,Z),o=createRemove(p,Z),R=createFindRelation(p,Z),B=createCreateRelation(p,Z),H=createUpdateRelation(p,Z),e=createDeleteRelation(p,Z);return{'register':Z['register']['bind'](Z),'unregister':Z['unregister'][g(0x1a5)](Z),'has':Z['has']['bind'](Z),'get':Z[g(0x1a6)]['bind'](Z),'list':Z['list']['bind'](Z),'find':A,'findOne':I,'create':j,'update':D,'delete':o,'findRelation':R,'createRelation':B,'updateRelation':H,'deleteRelation':e};}function s(){const N=['bind','get'];s=function(){return N;};return s();}
1
+ import{ResourceRegistry}from'./resource.registry.js';function c(S,Z){S=S-0x16e;const h=O();let U=h[S];return U;}import{createFind}from'./services/find.js';import{createFindOne}from'./services/find-one.js';import{createCreate}from'./services/create.js';import{createUpdate}from'./services/update.js';import{createRemove}from'./services/delete.js';function O(){const j=['register','bind'];O=function(){return j;};return O();}import{createFindRelation}from'./services/find-relation.js';import{createCreateRelation}from'./services/create-relation.js';import{createDeleteRelation}from'./services/delete-relation.js';import{createUpdateRelation}from'./services/update-relation.js';export function createResource(S){const o=c,Z=new ResourceRegistry(),h=createFind(S,Z),U=createFindOne(S,Z),D=createCreate(S,Z),u=createUpdate(S,Z),e=createRemove(S,Z),q=createFindRelation(S,Z),x=createCreateRelation(S,Z),n=createUpdateRelation(S,Z),N=createDeleteRelation(S,Z);return{'register':Z[o(0x16e)]['bind'](Z),'unregister':Z['unregister']['bind'](Z),'has':Z['has']['bind'](Z),'get':Z['get'][o(0x16f)](Z),'list':Z['list'][o(0x16f)](Z),'find':h,'findOne':U,'create':D,'update':u,'delete':e,'findRelation':q,'createRelation':x,'updateRelation':n,'deleteRelation':N};}
@@ -1 +1 @@
1
- const j=f;import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';function f(p,Z){p=p-0x146;const A=s();let I=A[p];return I;}const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(p){const I=f;return p['split']('.')[I(0x146)]<=0x2&&p[I(0x147)]('.')['every'](Z=>ident[I(0x148)](Z));}export class ResourceRegistry{[j(0x149)]=new Map();['unregister'](p){const D=j;this[D(0x149)][D(0x14a)](p);}['register'](p,Z=![]){const o=j;for(const A of Array['isArray'](p)?p:[p]){this['validate'](A);if(this['resources']['has'](A[o(0x14b)])&&!Z)throw new ConflictError(o(0x14c)+A[o(0x14b)]);this['resources']['set'](A['name'],A);}}['has'](p){const R=j;return this['resources'][R(0x14d)](p);}['get'](p){const B=j,Z=this[B(0x149)][B(0x14e)](p);if(!Z)throw new NotFoundError(B(0x14f)+p);return Z;}['list'](){return[...this['resources']['values']()];}[j(0x150)](p){const H=j;if(p[H(0x151)]!==0x1||!ident['test'](p['name'])||!validQualified(p['table'])||!ident['test'](p['key']))throw new ValidationError(H(0x152)+p['name']);for(const [Z,A]of Object['entries'](p['fields'])){if(!ident[H(0x148)](Z)||!ident['test'](A['column']??Z))throw new ValidationError('Invalid\x20resource\x20field:\x20'+Z);}}}function s(){const e=['length','split','test','resources','delete','name','Resource\x20already\x20registered:\x20','has','get','Resource\x20not\x20registered:\x20','validate','version','Invalid\x20resource\x20contract:\x20'];s=function(){return e;};return s();}
1
+ import{ValidationError,ConflictError,NotFoundError}from'../../errors.js';function c(S,Z){S=S-0x95;const h=O();let U=h[S];return U;}const ident=/^[a-zA-Z0-9_-]*$/;function validQualified(S){const U=c;return S['split']('.')[U(0x95)]<=0x2&&S['split']('.')['every'](Z=>ident['test'](Z));}function O(){const n=['length','resources','delete','Resource\x20already\x20registered:\x20','name','get','version','Invalid\x20resource\x20contract:\x20','test'];O=function(){return n;};return O();}export class ResourceRegistry{['resources']=new Map();['unregister'](S){const D=c;this[D(0x96)][D(0x97)](S);}['register'](S,Z=![]){const u=c;for(const h of Array['isArray'](S)?S:[S]){this['validate'](h);if(this['resources']['has'](h['name'])&&!Z)throw new ConflictError(u(0x98)+h[u(0x99)]);this[u(0x96)]['set'](h['name'],h);}}['has'](S){const e=c;return this[e(0x96)]['has'](S);}['get'](S){const q=c,Z=this['resources'][q(0x9a)](S);if(!Z)throw new NotFoundError('Resource\x20not\x20registered:\x20'+S);return Z;}['list'](){return[...this['resources']['values']()];}['validate'](S){const x=c;if(S[x(0x9b)]!==0x1||!ident['test'](S['name'])||!validQualified(S['table'])||!ident['test'](S['key']))throw new ValidationError(x(0x9c)+S['name']);for(const [Z,h]of Object['entries'](S['fields'])){if(!ident[x(0x9d)](Z)||!ident['test'](h['column']??Z))throw new ValidationError('Invalid\x20resource\x20field:\x20'+Z);}}}
@@ -1 +1 @@
1
- const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(p,Z){const g=f,A=dictionaryIndexesCache['get'](Z)??new Map(),I=dictionaryRevisionsCache[g(0x103)](Z)??new Map();dictionaryIndexesCache['set'](Z,A),dictionaryRevisionsCache[g(0x104)](Z,I);const j=p['filter'](o=>I['get'](o)!==Z[g(0x105)](o));if(j['length']===0x0)return A;const D=await Promise[g(0x106)](j['map'](async o=>{const N=g;if(!Z[N(0x107)](o))return[o,new Map()];const R=await Z[N(0x103)](o),B=new Map();for(const H of R){const e=H['code']??H['id'];if(e==null)continue;B['set'](String(e),{'id':e,'text':H[N(0x108)]??H[N(0x109)],...H['color']!==undefined?{'color':H[N(0x10a)]}:{},...H['icon']!==undefined?{'icon':H[N(0x10b)]}:{}});}return[o,B];}));for(const [o,R]of D){A[g(0x104)](o,R),I[g(0x104)](o,Z['revision'](o));}return A;}function s(){const E=['get','set','revision','all','has','name','text','color','icon','_data'];s=function(){return E;};return s();}function f(p,Z){p=p-0x103;const A=s();let I=A[p];return I;}export async function addDictionaryLookupData(p,Z,A){const h=f;if(!A||p['length']===0x0)return p;const I=Object['entries'](Z)['flatMap'](([D,o])=>{const R=o['dictionary'];return R?[{'field':D,'dictionaryName':R}]:[];});if(I['length']===0x0)return p;const j=await getDictionaryIndexes([...new Set(I['map'](({dictionaryName:D})=>D))],A);for(const D of p){for(const {field:o,dictionaryName:R}of I){const B=D[o];D[o+h(0x10c)]=B==null?null:j[h(0x103)](R)?.[h(0x103)](String(B))??null;}}return p;}
1
+ const dictionaryIndexesCache=new WeakMap(),dictionaryRevisionsCache=new WeakMap();async function getDictionaryIndexes(S,Z){const o=c,h=dictionaryIndexesCache['get'](Z)??new Map(),U=dictionaryRevisionsCache['get'](Z)??new Map();dictionaryIndexesCache[o(0x7d)](Z,h),dictionaryRevisionsCache[o(0x7d)](Z,U);const D=S['filter'](e=>U['get'](e)!==Z[o(0x7e)](e));if(D[o(0x7f)]===0x0)return h;const u=await Promise[o(0x80)](D['map'](async e=>{const j=o;if(!Z['has'](e))return[e,new Map()];const q=await Z[j(0x81)](e),x=new Map();for(const n of q){const N=n[j(0x82)]??n['id'];if(N==null)continue;x['set'](String(N),{'id':N,'text':n['name']??n['text'],...n['color']!==undefined?{'color':n[j(0x83)]}:{},...n['icon']!==undefined?{'icon':n['icon']}:{}});}return[e,x];}));for(const [e,q]of u){h['set'](e,q),U['set'](e,Z['revision'](e));}return h;}export async function addDictionaryLookupData(S,Z,h){const i=c;if(!h||S['length']===0x0)return S;const U=Object['entries'](Z)['flatMap'](([u,e])=>{const X=c,q=e[X(0x84)];return q?[{'field':u,'dictionaryName':q}]:[];});if(U['length']===0x0)return S;const D=await getDictionaryIndexes([...new Set(U['map'](({dictionaryName:u})=>u))],h);for(const u of S){for(const {field:e,dictionaryName:q}of U){const x=u[e];u[e+'_data']=x==null?null:D['get'](q)?.[i(0x81)](String(x))??null;}}return S;}function c(S,Z){S=S-0x7d;const h=O();let U=h[S];return U;}function O(){const l=['set','revision','length','all','get','code','color','dictionary'];O=function(){return l;};return O();}
@@ -1 +1 @@
1
- export function addFileToken(p,Z,A){const R=f;if(!A||p['length']===0x0)return p;const I=Object['entries'](Z)['filter'](([,j])=>j['type']===R(0x179))['map'](([j])=>j);for(const j of p){for(const D of I){const o=j[D];typeof o===R(0x17a)&&o[R(0x17b)]>0x0&&(j[D]=A['create'](o));}}return p;}function f(p,Z){p=p-0x179;const A=s();let I=A[p];return I;}function s(){const B=['file','string','length'];s=function(){return B;};return s();}
1
+ function O(){const x=['length'];O=function(){return x;};return O();}function c(S,Z){S=S-0x1b4;const h=O();let U=h[S];return U;}export function addFileToken(S,Z,h){const q=c;if(!h||S[q(0x1b4)]===0x0)return S;const U=Object['entries'](Z)['filter'](([,D])=>D['type']==='file')['map'](([D])=>D);for(const D of S){for(const u of U){const e=D[u];typeof e==='string'&&e['length']>0x0&&(D[u]=h['create'](e));}}return S;}
@@ -1 +1 @@
1
- function f(p,Z){p=p-0x199;const A=s();let I=A[p];return I;}import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();export function clearTableLookupCache(p,Z){const K=f,A=tableLookupCache[K(0x199)](Z);if(!A)return;for(const I of A['keys']()){I['startsWith'](p+':')&&A['delete'](I);}}export async function addTableLookupData(p,Z,A){const Q=f;if(!A||p['length']===0x0)return p;const I=tableLookupCache['get'](A)??new Map();tableLookupCache['set'](A,I);const j=Object[Q(0x19a)](Z)['flatMap'](([D,o])=>{const G=Q,{table:R,value:value='id',text:text=G(0x19b)}=o['lookup']??{};return R?[{'field':D,'table':R,'value':value,'text':text}]:[];});for(const D of j){const o=new Map();for(const e of p){const g=e[D['field']];(typeof g===Q(0x19c)||typeof g===Q(0x19d))&&o[Q(0x19e)](String(g),g);}const R=D[Q(0x19f)]+':'+D['value']+':'+D['text'],B=I['get'](R)??new Map();I['set'](R,B);const H=[...o[Q(0x19a)]()]['filter'](([N])=>!B['has'](N))[Q(0x1a0)](([,N])=>N);if(H['length']>0x0){const N=await A[Q(0x1a1)](Q(0x1a2)+qi(D['value'])+Q(0x1a3)+qi(D['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(D['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(D['value'])+'\x20=\x20ANY($1)',[H]);for(const h of N['rows']){B['set'](String(h['id']),h);}for(const E of H){!B[Q(0x1a4)](String(E))&&B['set'](String(E),null);}}for(const a of p){const X=a[D['field']];a[D[Q(0x1a5)]+'_data']=X==null?null:B['get'](String(X))??null;}}return p;}function s(){const V=['get','entries','name','string','number','set','table','map','query','SELECT\x20','\x20AS\x20id,\x20','has','field'];s=function(){return V;};return s();}
1
+ import{qi,qt}from'../utils/sql.js';const tableLookupCache=new WeakMap();function c(S,Z){S=S-0xda;const h=O();let U=h[S];return U;}function O(){const E=['get','startsWith','string','number','table','set','\x20AS\x20id,\x20','value','has','field','_data'];O=function(){return E;};return O();}export function clearTableLookupCache(S,Z){const Y=c,h=tableLookupCache[Y(0xda)](Z);if(!h)return;for(const U of h['keys']()){U[Y(0xdb)](S+':')&&h['delete'](U);}}export async function addTableLookupData(S,Z,h){const r=c;if(!h||S['length']===0x0)return S;const U=tableLookupCache[r(0xda)](h)??new Map();tableLookupCache['set'](h,U);const D=Object['entries'](Z)['flatMap'](([u,e])=>{const {table:q,value:value='id',text:text='name'}=e['lookup']??{};return q?[{'field':u,'table':q,'value':value,'text':text}]:[];});for(const u of D){const e=new Map();for(const N of S){const o=N[u['field']];(typeof o===r(0xdc)||typeof o===r(0xdd))&&e['set'](String(o),o);}const q=u[r(0xde)]+':'+u['value']+':'+u['text'],x=U[r(0xda)](q)??new Map();U[r(0xdf)](q,x);const n=[...e['entries']()]['filter'](([j])=>!x['has'](j))['map'](([,j])=>j);if(n['length']>0x0){const j=await h['query']('SELECT\x20'+qi(u['value'])+r(0xe0)+qi(u['text'])+'\x20AS\x20text\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20'+qt(u['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(u[r(0xe1)])+'\x20=\x20ANY($1)',[n]);for(const X of j['rows']){x['set'](String(X['id']),X);}for(const i of n){!x[r(0xe2)](String(i))&&x['set'](String(i),null);}}for(const l of S){const b=l[u[r(0xe3)]];l[u[r(0xe3)]+r(0xe4)]=b==null?null:x['get'](String(b))??null;}}return S;}
@@ -1 +1 @@
1
- function f(p,Z){p=p-0x1e8;const A=s();let I=A[p];return I;}import{UnsupportedError}from'../../../errors.js';function s(){const K=['get','files','includes','Generic\x20Resource\x20relation\x20\x22','INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*','rows','foreignKey','table','resource','Relation\x20update\x20is\x20not\x20configured:\x20'];s=function(){return K;};return s();}import{createCreate}from'./create.js';export function createCreateRelation(p,Z){const A=createCreate(p,Z);return async function I({name:j,id:D,relation:o,data:R,user:B},H){const X=f,e=H?.['pg']??p['pg'],g=Z[X(0x1e8)](j);if(['notes',X(0x1e9)][X(0x1ea)](o)&&!g['capabilities']?.[X(0x1ea)](o))throw new UnsupportedError(X(0x1eb)+o+'\x22\x20requires\x20a\x20capabilities\x20\x22'+o+'\x22');if(o==='notes'){const E=await e['query'](X(0x1ec),[j,String(D),R?.['body']]);return E[X(0x1ed)][0x0];}if(o===X(0x1e9)){const a=await e['query']('INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*',[j,String(D),R?.['filePath'],R?.['size']??null]);return a[X(0x1ed)][0x0];}const N=g['relations']?.[o];if(!N?.[X(0x1ee)]||!N['resource']&&!N[X(0x1ef)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+o+'\x22\x20requires\x20a\x20project/provider\x20implementation');if(!R)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+R);if(!N[X(0x1f0)])throw new UnsupportedError(X(0x1f1)+o);R[N['foreignKey']]=D;const h=await A({'name':N[X(0x1f0)],'data':R??{},'user':B});return h;};}
1
+ import{UnsupportedError}from'../../../errors.js';function c(S,Z){S=S-0xd7;const h=O();let U=h[S];return U;}function O(){const Y=['includes','\x22\x20requires\x20a\x20capabilities\x20\x22','query','body','INSERT\x20INTO\x20admin.files\x20(resource,\x20resource_id,\x20file_path,\x20size)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20VALUES\x20($1,\x20$2,\x20$3,\x20$4)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20RETURNING\x20*','filePath','size','foreignKey','\x22\x20requires\x20a\x20project/provider\x20implementation','resource','Relation\x20update\x20is\x20not\x20configured:\x20'];O=function(){return Y;};return O();}import{createCreate}from'./create.js';export function createCreateRelation(S,Z){const h=createCreate(S,Z);return async function U({name:D,id:u,relation:e,data:q,user:x},n){const b=c,N=n?.['pg']??S['pg'],o=Z['get'](D);if(['notes','files'][b(0xd7)](e)&&!o['capabilities']?.['includes'](e))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+b(0xd8)+e+'\x22');if(e==='notes'){const i=await N[b(0xd9)]('INSERT\x20INTO\x20admin.notes(resource,resource_id,body)\x20VALUES\x20($1,$2,$3)\x20RETURNING\x20*',[D,String(u),q?.[b(0xda)]]);return i['rows'][0x0];}if(e==='files'){const l=await N['query'](b(0xdb),[D,String(u),q?.[b(0xdc)],q?.[b(0xdd)]??null]);return l['rows'][0x0];}const j=o['relations']?.[e];if(!j?.[b(0xde)]||!j['resource']&&!j['table'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+b(0xdf));if(!q)throw new UnsupportedError('No\x20data\x20provided\x20for\x20relation:\x20'+q);if(!j[b(0xe0)])throw new UnsupportedError(b(0xe1)+e);q[j['foreignKey']]=u;const X=await h({'name':j['resource'],'data':q??{},'user':x});return X;};}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';function f(p,Z){p=p-0x1b4;const A=s();let I=A[p];return I;}import{clearTableLookupCache}from'./add-table-lookup-data.js';function s(){const Q=['created_by','length','map','rows','table','module','name','create','keys'];s=function(){return Q;};return s();}export function createCreate(p,Z){return async function A({name:I,data:j,user:D},o){const K=f,R=Z['get'](I);assertOperation(R,'create',D),validateInputData({'resource':R,'data':j});const B=writableData(R,j);R['fields']['created_at']&&B['push'](['created_at',new Date()]);R['fields'][K(0x1b4)]&&B['push'](['created_by',D?.['id']]);if(!B[K(0x1b5)])throw new ValidationError('No\x20writable\x20fields');const H=B['map'](([a])=>qi(a)),e=B[K(0x1b6)]((a,X)=>'$'+(X+0x1)),g=B[K(0x1b6)](([,a])=>a),N=o?.['pg']??p['pg'],h=await N['query']('INSERT\x20INTO\x20'+qt(R['table'])+'\x20('+H['join'](',\x20')+')\x20'+('VALUES\x20('+e['join'](',\x20')+')\x20')+'RETURNING\x20*',g),E=h[K(0x1b7)][0x0];return clearTableLookupCache(R[K(0x1b8)],N),await(o?.['audit']??p['audit'])?.['write']({'userId':D?.['id'],'module':R[K(0x1b9)],'resource':R[K(0x1ba)],'resourceId':E[R['key']],'action':K(0x1bb),'fields':Object[K(0x1bc)](j)}),E;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';function c(S,Z){S=S-0x14d;const h=O();let U=h[S];return U;}function O(){const r=['get','fields','created_by','push','No\x20writable\x20fields','map','query','join','audit','module','name','keys'];O=function(){return r;};return O();}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createCreate(S,Z){return async function h({name:U,data:D,user:u},e){const Y=c,q=Z[Y(0x14d)](U);assertOperation(q,'create',u),validateInputData({'resource':q,'data':D});const x=writableData(q,D);q[Y(0x14e)]['created_at']&&x['push'](['created_at',new Date()]);q['fields'][Y(0x14f)]&&x[Y(0x150)]([Y(0x14f),u?.['id']]);if(!x['length'])throw new ValidationError(Y(0x151));const n=x[Y(0x152)](([l])=>qi(l)),N=x[Y(0x152)]((l,b)=>'$'+(b+0x1)),o=x['map'](([,l])=>l),j=e?.['pg']??S['pg'],X=await j[Y(0x153)]('INSERT\x20INTO\x20'+qt(q['table'])+'\x20('+n['join'](',\x20')+')\x20'+('VALUES\x20('+N[Y(0x154)](',\x20')+')\x20')+'RETURNING\x20*',o),i=X['rows'][0x0];return clearTableLookupCache(q['table'],j),await(e?.[Y(0x155)]??S['audit'])?.['write']({'userId':u?.['id'],'module':q[Y(0x156)],'resource':q[Y(0x157)],'resourceId':i[q['key']],'action':'create','fields':Object[Y(0x158)](D)}),i;};}
@@ -1 +1 @@
1
- function f(p,Z){p=p-0x156;const A=s();let I=A[p];return I;}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';export function createDeleteRelation(p,Z){const A=createRemove(p,Z);return async function I({name:j,id:D,relation:o,relationId:R,user:B},H){const E=f,e=H?.['pg']??p['pg'],g=Z['get'](j);if([E(0x156),'files'][E(0x157)](o)&&!g['capabilities']?.['includes'](o))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+o+'\x22\x20requires\x20a\x20capabilities\x20\x22'+o+'\x22');if(o==='notes')return await e['query'](E(0x158),[R,j,String(D)]),{'success':!![]};if(o==='files')return await e['query'](E(0x159),[R,j,String(D)]),{'success':!![]};const N=g[E(0x15a)]?.[o];if(!N?.['resource']||!N['foreignKey'])throw new UnsupportedError(E(0x15b)+o+'\x22\x20requires\x20a\x20project/provider\x20implementation');const h=await A({'name':N[E(0x15c)],'id':R,'user':B,'where':{'column':N['foreignKey'],'value':D}},H);return{'success':h};};}function s(){const a=['notes','includes','DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','relations','Generic\x20Resource\x20relation\x20\x22','resource'];s=function(){return a;};return s();}
1
+ function O(){const l=['get','\x22\x20requires\x20a\x20capabilities\x20\x22','DELETE\x20FROM\x20admin.files\x20WHERE\x20file_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3','relations','foreignKey'];O=function(){return l;};return O();}import{UnsupportedError}from'../../../errors.js';import{createRemove}from'./delete.js';function c(S,Z){S=S-0x98;const h=O();let U=h[S];return U;}export function createDeleteRelation(S,Z){const h=createRemove(S,Z);return async function U({name:D,id:u,relation:e,relationId:q,user:x},n){const i=c,N=n?.['pg']??S['pg'],o=Z[i(0x98)](D);if(['notes','files']['includes'](e)&&!o['capabilities']?.['includes'](e))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+i(0x99)+e+'\x22');if(e==='notes')return await N['query']('DELETE\x20FROM\x20admin.notes\x20WHERE\x20note_id\x20=\x20$1\x20AND\x20resource\x20=\x20$2\x20AND\x20resource_id\x20=\x20$3',[q,D,String(u)]),{'success':!![]};if(e==='files')return await N['query'](i(0x9a),[q,D,String(u)]),{'success':!![]};const j=o[i(0x9b)]?.[e];if(!j?.['resource']||!j[i(0x9c)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+e+'\x22\x20requires\x20a\x20project/provider\x20implementation');const X=await h({'name':j['resource'],'id':q,'user':x,'where':{'column':j['foreignKey'],'value':u}},n);return{'success':X};};}
@@ -1 +1 @@
1
- function f(p,Z){p=p-0x1d2;const A=s();let I=A[p];return I;}function s(){const E=['delete','column','\x20=\x20$','where','query','DELETE\x20FROM\x20','table','write','name','rowCount'];s=function(){return E;};return s();}import{assertOperation}from'../utils/permissions.js';import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(p,Z){return async function A({name:I,id:j,user:D,where:o},R){const h=f,B=Z['get'](I);assertOperation(B,h(0x1d2),D);const H=R?.['pg']??p['pg'],e=[j];let g='WHERE\x20'+qi(B['key'])+'\x20=\x20$1';o&&(e['push'](o['value']),g+='\x20AND\x20'+qi(o[h(0x1d3)])+h(0x1d4)+e['length']);B['where']&&(g+='\x20AND\x20('+B[h(0x1d5)]+')');const N=await H[h(0x1d6)](h(0x1d7)+qt(B[h(0x1d8)])+'\x20'+g,e);if((N['rowCount']??0x0)>0x0)clearTableLookupCache(B['table'],H);if((N['rowCount']??0x0)>0x0)await(R?.['audit']??p['audit'])?.[h(0x1d9)]({'module':B['module'],'resource':B[h(0x1da)],'resourceId':j,'action':h(0x1d2)});return(N[h(0x1db)]??0x0)>0x0;};}
1
+ import{assertOperation}from'../utils/permissions.js';function O(){const i=['push','value','column','\x20=\x20$','table','rowCount','audit','module','name'];O=function(){return i;};return O();}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';function c(S,Z){S=S-0x140;const h=O();let U=h[S];return U;}export function createRemove(S,Z){return async function h({name:U,id:D,user:u,where:e},q){const X=c,x=Z['get'](U);assertOperation(x,'delete',u);const n=q?.['pg']??S['pg'],N=[D];let o='WHERE\x20'+qi(x['key'])+'\x20=\x20$1';e&&(N[X(0x140)](e[X(0x141)]),o+='\x20AND\x20'+qi(e[X(0x142)])+X(0x143)+N['length']);x['where']&&(o+='\x20AND\x20('+x['where']+')');const j=await n['query']('DELETE\x20FROM\x20'+qt(x[X(0x144)])+'\x20'+o,N);if((j['rowCount']??0x0)>0x0)clearTableLookupCache(x[X(0x144)],n);if((j[X(0x145)]??0x0)>0x0)await(q?.[X(0x146)]??S[X(0x146)])?.['write']({'module':x[X(0x147)],'resource':x[X(0x148)],'resourceId':D,'action':'delete'});return(j[X(0x145)]??0x0)>0x0;};}
@@ -1 +1 @@
1
- function f(p,Z){p=p-0x74;const A=s();let I=A[p];return I;}import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function s(){const K=['get','read','type','query','join','table','rows','fields','all','relations'];s=function(){return K;};return s();}import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{createFindRelation}from'./find-relation.js';export function createFindOne(p,Z){return async function A({name:I,id:j,query:query={},user:D}){const X=f,o=Date['now'](),R=Z[X(0x74)](I);assertOperation(R,X(0x75),D);if(R['fields'][R['key']]?.[X(0x76)]==='integer'&&!Number['isInteger'](Number(j)))throw new ValidationError('Invalid\x20id:\x20'+j+'\x20name:'+I);const B=R['joins']?.['map'](E=>E['sql']+'\x20')['join']('\x20')||'',H=R['where']?'\x20AND\x20('+R['where']+')':'',e=await p['pg'][X(0x77)]('SELECT\x20'+readableFields(R)[X(0x78)](',\x20')+'\x20FROM\x20'+qt(R[X(0x79)])+'\x20t\x20'+B+'\x20WHERE\x20'+qi(R['key'])+'=$1'+H+'\x20LIMIT\x201',[j]),g=e[X(0x7a)][0x0];if(!g)return null;await addDictionaryLookupData([g],R['fields'],p['dictionary']),await addTableLookupData([g],R['fields'],p['pg']),addFileToken([g],R[X(0x7b)],p['file']);const N=(query['include']===X(0x7c)?Object['keys'](R[X(0x7d)]||{}):null)||(Array['isArray'](query['include'])?query['include']:query['include']?.['split'](',')??[]),h=createFindRelation(p,Z);for(const E of N){g[E]=await h({'name':I,'id':j,'relation':E,'query':query,'user':D})['then'](a=>a['rows']??[])['then'](a=>R['relations']?.[E]?.[X(0x76)]==='one'?a[0x0]??null:a);}return g['time']=Date['now']()-o,g;};}
1
+ import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qt,qi,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function O(){const Y=['type','integer','isInteger','Invalid\x20id:\x20','join','where','rows','fields','include','isArray','then','one','time','now'];O=function(){return Y;};return O();}function c(S,Z){S=S-0x161;const h=O();let U=h[S];return U;}import{createFindRelation}from'./find-relation.js';export function createFindOne(S,Z){return async function h({name:U,id:D,query:query={},user:u}){const b=c,e=Date['now'](),q=Z['get'](U);assertOperation(q,'read',u);if(q['fields'][q['key']]?.[b(0x161)]===b(0x162)&&!Number[b(0x163)](Number(D)))throw new ValidationError(b(0x164)+D+'\x20name:'+U);const x=q['joins']?.['map'](i=>i['sql']+'\x20')[b(0x165)]('\x20')||'',n=q[b(0x166)]?'\x20AND\x20('+q[b(0x166)]+')':'',N=await S['pg']['query']('SELECT\x20'+readableFields(q)['join'](',\x20')+'\x20FROM\x20'+qt(q['table'])+'\x20t\x20'+x+'\x20WHERE\x20'+qi(q['key'])+'=$1'+n+'\x20LIMIT\x201',[D]),o=N[b(0x167)][0x0];if(!o)return null;await addDictionaryLookupData([o],q['fields'],S['dictionary']),await addTableLookupData([o],q['fields'],S['pg']),addFileToken([o],q[b(0x168)],S['file']);const j=(query[b(0x169)]==='all'?Object['keys'](q['relations']||{}):null)||(Array[b(0x16a)](query['include'])?query['include']:query['include']?.['split'](',')??[]),X=createFindRelation(S,Z);for(const i of j){o[i]=await X({'name':U,'id':D,'relation':i,'query':query,'user':u})[b(0x16b)](l=>l['rows']??[])['then'](l=>q['relations']?.[i]?.['type']===b(0x16c)?l[0x0]??null:l);}return o[b(0x16d)]=Date[b(0x16e)]()-e,o;};}
@@ -1 +1 @@
1
- import{UnsupportedError,ValidationError}from'../../../errors.js';function f(p,Z){p=p-0x126;const A=s();let I=A[p];return I;}import{qi,qt}from'../utils/sql.js';function s(){const L=['files','Generic\x20Resource\x20relation\x20\x22','query','rows','SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','get','key','keys','filter','fields','\x20WHERE\x20','foreignKey','\x20=\x20(SELECT\x20','localKey','table','\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20','AND\x20(','where','join','\x20LIMIT\x20$2\x20OFFSET\x20$3','file','now'];s=function(){return L;};return s();}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(p,Z){return async function A({name:I,id:j,relation:D,query:query={}}){const T=f,o=Date['now'](),R=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),B=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](R)||!Number['isFinite'](B))throw new ValidationError('Invalid\x20pagination');const H=Z['get'](I),e=H['relations']?.[D];if(['notes',T(0x126)]['includes'](D)&&!H['capabilities']?.['includes'](D))throw new UnsupportedError(T(0x127)+D+'\x22\x20requires\x20a\x20capabilities\x20\x22'+D+'\x22');if(D==='notes'){const V=await p['pg'][T(0x128)]('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[I,String(j)]);return{'total':V['rows']['length'],'time':Date['now']()-o,'rows':V[T(0x129)]};}if(D==='files'){const O=await p['pg'][T(0x128)](T(0x12a),[I,String(j)]);return addFileToken(O['rows'],{'file_path':{'type':'file'}},p['file']),{'total':O['rows']['length'],'time':Date['now']()-o,'rows':O[T(0x129)]};}if(!e?.['resource'])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+D+'\x22\x20requires\x20a\x20project/provider\x20implementation');const g=Z[T(0x12b)](e['resource']),N=g?.[T(0x12c)]??'id',h=g?.['table'],E=Object[T(0x12d)](g?.['fields']??{})[T(0x12e)](F=>g?.[T(0x12f)][F]?.['read']&&g?.[T(0x12f)][F]?.['scope']!=='item')['map'](qi)['join'](',\x20'),a=e[T(0x12f)]?.['join'](',\x20')||E||'*';e['foreignKey']&&autoIndex(h,e['foreignKey'],'btree',p['pg']);const X=e['junctionTable']?'JOIN\x20'+qt(e['junctionTable'])+'\x20j\x20ON\x20j.'+qi(e['junctionForeignKey'])+'\x20=\x20t.'+(e['junctionTargetKey']||qi(N))+T(0x130)+qi(e['junctionLocalKey'])+'\x20=\x20$1\x20':'where\x20'+(e[T(0x131)]||qi(N))+T(0x132)+qi(e[T(0x133)]||H['key'])+'\x20FROM\x20'+qt(H[T(0x134)])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(H['key'])+T(0x135)+(e['where']?T(0x136)+e[T(0x137)]+')':''),K=g['joins']?.['map'](F=>F['sql']+'\x20')[T(0x138)]('\x20')||'',Q='SELECT\x20'+a+'\x20FROM\x20'+qt(h)+'\x20t\x20'+K+'\x20'+X+T(0x139),G=await p['pg'][T(0x128)](Q,[j,R,B]);return g&&(await addDictionaryLookupData(G['rows'],g['fields'],p['dictionary']),await addTableLookupData(G['rows'],g['fields'],p['pg']),addFileToken(G['rows'],g['fields'],p[T(0x13a)])),{'limit':R,'offset':B,'total':G[T(0x129)]['length'],'time':Date[T(0x13b)]()-o,'rows':G['rows']??null};};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function O(){const B=['limit','isFinite','get','relations','notes','includes','now','files','resource','fields','filter','scope','foreignKey','btree','JOIN\x20','junctionTable','\x20j\x20ON\x20j.','junctionForeignKey','localKey','where','join','\x20t\x20','query','file'];O=function(){return B;};return O();}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function c(S,Z){S=S-0x1d1;const h=O();let U=h[S];return U;}import{autoIndex}from'../utils/auto-index.js';export function createFindRelation(S,Z){return async function h({name:U,id:D,relation:u,query:query={}}){const I=c,e=Date['now'](),q=Math['min'](Math['max'](query[I(0x1d1)]??0x14,0x1),0xc8),x=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](q)||!Number[I(0x1d2)](x))throw new ValidationError('Invalid\x20pagination');const n=Z[I(0x1d3)](U),N=n[I(0x1d4)]?.[u];if([I(0x1d5),'files']['includes'](u)&&!n['capabilities']?.[I(0x1d6)](u))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+u+'\x22\x20requires\x20a\x20capabilities\x20\x22'+u+'\x22');if(u==='notes'){const L=await S['pg']['query']('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[U,String(D)]);return{'total':L['rows']['length'],'time':Date[I(0x1d7)]()-e,'rows':L['rows']};}if(u===I(0x1d8)){const V=await S['pg']['query']('SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[U,String(D)]);return addFileToken(V['rows'],{'file_path':{'type':'file'}},S['file']),{'total':V['rows']['length'],'time':Date['now']()-e,'rows':V['rows']};}if(!N?.[I(0x1d9)])throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+u+'\x22\x20requires\x20a\x20project/provider\x20implementation');const o=Z['get'](N['resource']),j=o?.['key']??'id',X=o?.['table'],i=Object['keys'](o?.[I(0x1da)]??{})[I(0x1db)](k=>o?.[I(0x1da)][k]?.['read']&&o?.['fields'][k]?.[I(0x1dc)]!=='item')['map'](qi)['join'](',\x20'),l=N['fields']?.['join'](',\x20')||i||'*';N[I(0x1dd)]&&autoIndex(X,N[I(0x1dd)],I(0x1de),S['pg']);const b=N['junctionTable']?I(0x1df)+qt(N[I(0x1e0)])+I(0x1e1)+qi(N[I(0x1e2)])+'\x20=\x20t.'+(N['junctionTargetKey']||qi(j))+'\x20WHERE\x20'+qi(N['junctionLocalKey'])+'\x20=\x20$1\x20':'where\x20'+(N['foreignKey']||qi(j))+'\x20=\x20(SELECT\x20'+qi(N[I(0x1e3)]||n['key'])+'\x20FROM\x20'+qt(n['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(n['key'])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x20'+(N[I(0x1e4)]?'AND\x20('+N[I(0x1e4)]+')':''),Y=o['joins']?.['map'](k=>k['sql']+'\x20')[I(0x1e5)]('\x20')||'',r='SELECT\x20'+l+'\x20FROM\x20'+qt(X)+I(0x1e6)+Y+'\x20'+b+'\x20LIMIT\x20$2\x20OFFSET\x20$3',E=await S['pg'][I(0x1e7)](r,[D,q,x]);return o&&(await addDictionaryLookupData(E['rows'],o[I(0x1da)],S['dictionary']),await addTableLookupData(E['rows'],o['fields'],S['pg']),addFileToken(E['rows'],o['fields'],S[I(0x1e8)])),{'limit':q,'offset':x,'total':E['rows']['length'],'time':Date['now']()-e,'rows':E['rows']??null};};}
@@ -1 +1 @@
1
- function s(){const F=['now','get','read','min','where','sql','\x20WHERE\x20','isFinite','searchable','text','join','scope','default','\x20AND\x20','values','joins','filter','SELECT\x20','length','query','fields','count'];s=function(){return F;};return s();}import{ValidationError}from'../../../errors.js';import{buildFilters,buildIndex}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';import{buildSort}from'../utils/sort.js';import{qt,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{autoIndex}from'../utils/auto-index.js';import{buildSummary}from'../utils/summary.js';import{buildUserResourceScopeFilter}from'../utils/scope.js';function f(p,Z){p=p-0x11e;const A=s();let I=A[p];return I;}export function createFind(p,Z){return async function A({name:I,query:query={},user:j}){const O=f,D=Date[O(0x11e)](),o=Z[O(0x11f)](I);assertOperation(o,O(0x120),j);const R=Math[O(0x121)](Math['max'](query['limit']??0x14,0x1),0xc8),B=Math['max'](query['offset']??0x0,0x0);buildIndex(o,query['filter'],p['pg']);const H=buildFilters(o,query['filter']);o[O(0x122)]&&(H['sql']+=(H[O(0x123)]?'\x20AND\x20':O(0x124))+('('+o[O(0x122)]+')'));const e=buildSort(o,query['sort']);if(!Number[O(0x125)](R)||!Number['isFinite'](B))throw new ValidationError('Invalid\x20pagination');const g=o[O(0x126)]||Object['keys'](o['fields'])['filter'](V=>o['fields'][V]?.[O(0x126)]);query['search']&&g['length']&&(g['map'](V=>autoIndex(o['table'],V,O(0x127),p['pg'])),H['values']['push'](query['search']['toLowerCase']()+'%'),H['sql']+=(H['sql']?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+g?.['map'](V=>'lower('+qt(V)+')\x20LIKE\x20$'+H['values']['length'])[O(0x128)]('\x20OR\x20')+')'));if(query['scope']&&o['scopes']?.[query[O(0x129)]]===undefined)throw new ValidationError('Unknown\x20scope:\x20'+query['scope']);const N=query['scope']||(o['scopes']?.['default']?O(0x12a):undefined);N&&(H['sql']+=(H['sql']?'\x20AND\x20':'\x20WHERE\x20')+('('+(o['scopes']?.[N]||'true')+')'));const h=await buildUserResourceScopeFilter(o,j,p['pg'],H['values']['length']+0x1);h['sql']&&(H['sql']+=(H['sql']?O(0x12b):'\x20WHERE\x20')+('('+h['sql']+')'),H['values']['push'](...h[O(0x12c)]));const E=o[O(0x12d)]?.[O(0x12e)](V=>V['scope']!=='item')['map'](V=>V[O(0x123)]+'\x20')['join']('\x20')||'',a=O(0x12f)+readableFields(o,'all')['join'](',\x20')+'\x20'+('FROM\x20'+qt(o['table'])+'\x20t\x20')+(E+'\x20'+H['sql']['replace'](/:uid/g,'\x27'+(j?.['id']??'NULL')+'\x27')+'\x20'+e+'\x20')+('LIMIT\x20$'+(H['values']['length']+0x1)+'\x20')+('OFFSET\x20$'+(H[O(0x12c)][O(0x130)]+0x2)),X=buildSummary(o,query,j,h),[K,Q]=await Promise['all']([p['pg']['query'](a,[...H[O(0x12c)],R,B]),p['pg'][O(0x131)](X[O(0x123)],X['values'])['then'](V=>V['rows'][0x0]??{})]),G=K['rows'];return await addDictionaryLookupData(G,o[O(0x132)],p['dictionary']),await addTableLookupData(G,o['fields'],p['pg']),addFileToken(G,o['fields'],p['file']),{'time':Date['now']()-D,'limit':R,'offset':B,'count':K['rowCount'],'total':Q?.[O(0x133)]??0x0,'summary':Q,'rows':G,...query['include']?.['includes']('fields')?{'fields':o[O(0x132)]}:{}};};}
1
+ import{ValidationError}from'../../../errors.js';import{buildFilters,buildIndex}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';import{buildSort}from'../utils/sort.js';import{qt,readableFields}from'../utils/sql.js';import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';function O(){const k=['get','read','max','limit','sql','\x20AND\x20','Invalid\x20pagination','fields','filter','map','text','values',')\x20LIKE\x20$','scope','\x20WHERE\x20','true','joins','join','NULL','LIMIT\x20$','length','dictionary','rowCount','include'];O=function(){return k;};return O();}import{autoIndex}from'../utils/auto-index.js';function c(S,Z){S=S-0x16c;const h=O();let U=h[S];return U;}import{buildSummary}from'../utils/summary.js';import{buildUserResourceScopeFilter}from'../utils/scope.js';export function createFind(S,Z){return async function h({name:U,query:query={},user:D}){const V=c,u=Date['now'](),e=Z[V(0x16c)](U);assertOperation(e,V(0x16d),D);const q=Math['min'](Math[V(0x16e)](query[V(0x16f)]??0x14,0x1),0xc8),x=Math['max'](query['offset']??0x0,0x0);buildIndex(e,query['filter'],S['pg']);const n=buildFilters(e,query['filter']);e['where']&&(n['sql']+=(n[V(0x170)]?V(0x171):'\x20WHERE\x20')+('('+e['where']+')'));const N=buildSort(e,query['sort']);if(!Number['isFinite'](q)||!Number['isFinite'](x))throw new ValidationError(V(0x172));const o=e['searchable']||Object['keys'](e[V(0x173)])[V(0x174)](L=>e['fields'][L]?.['searchable']);query['search']&&o['length']&&(o[V(0x175)](L=>autoIndex(e['table'],L,V(0x176),S['pg'])),n[V(0x177)]['push'](query['search']['toLowerCase']()+'%'),n['sql']+=(n[V(0x170)]?'\x20AND\x20':'\x20WHERE\x20')+('\x20('+o?.['map'](L=>'lower('+qt(L)+V(0x178)+n[V(0x177)]['length'])['join']('\x20OR\x20')+')'));if(query['scope']&&e['scopes']?.[query['scope']]===undefined)throw new ValidationError('Unknown\x20scope:\x20'+query[V(0x179)]);const j=query['scope']||(e['scopes']?.['default']?'default':undefined);j&&(n['sql']+=(n[V(0x170)]?'\x20AND\x20':V(0x17a))+('('+(e['scopes']?.[j]||V(0x17b))+')'));const X=await buildUserResourceScopeFilter(e,D,S['pg'],n[V(0x177)]['length']+0x1);X['sql']&&(n[V(0x170)]+=(n[V(0x170)]?'\x20AND\x20':'\x20WHERE\x20')+('('+X['sql']+')'),n['values']['push'](...X['values']));const i=e[V(0x17c)]?.['filter'](L=>L[V(0x179)]!=='item')['map'](L=>L['sql']+'\x20')['join']('\x20')||'',l='SELECT\x20'+readableFields(e,'all')[V(0x17d)](',\x20')+'\x20'+('FROM\x20'+qt(e['table'])+'\x20t\x20')+(i+'\x20'+n['sql']['replace'](/:uid/g,'\x27'+(D?.['id']??V(0x17e))+'\x27')+'\x20'+N+'\x20')+(V(0x17f)+(n[V(0x177)][V(0x180)]+0x1)+'\x20')+('OFFSET\x20$'+(n['values']['length']+0x2)),b=buildSummary(e,query,D,X),[Y,r]=await Promise['all']([S['pg']['query'](l,[...n['values'],q,x]),S['pg']['query'](b['sql'],b['values'])['then'](L=>L['rows'][0x0]??{})]),E=Y['rows'];return await addDictionaryLookupData(E,e['fields'],S[V(0x181)]),await addTableLookupData(E,e['fields'],S['pg']),addFileToken(E,e[V(0x173)],S['file']),{'time':Date['now']()-u,'limit':q,'offset':x,'count':Y[V(0x182)],'total':r?.['count']??0x0,'summary':r,'rows':E,...query[V(0x183)]?.['includes']('fields')?{'fields':e['fields']}:{}};};}
@@ -1 +1 @@
1
- function s(){const D=['query'];s=function(){return D;};return s();}function f(p,Z){p=p-0x68;const A=s();let I=A[p];return I;}export async function getTableColumns(p,Z){const j=f;if(!p)throw new Error('not\x20enough\x20params:\x20table');if(!Z?.['pg'])return[];const A=await Z['pg'][j(0x68)]('\x0a\x20\x20\x20\x20select\x0a\x20\x20\x20\x20\x20\x20\x20\x20attname\x20as\x20name,\x20pg_catalog.col_description(attrelid,attnum)\x20as\x20title\x0a\x20\x20\x20\x20from\x20pg_catalog.pg_attribute\x20where\x20attrelid=$1::regclass\x20and\x20attnum>0\x20and\x20NOT\x20attisdropped',[p])['then'](I=>I['rows']||[]);return A;}
1
+ function O(){const u=['rows'];O=function(){return u;};return O();}function c(S,Z){S=S-0xab;const h=O();let U=h[S];return U;}export async function getTableColumns(S,Z){const D=c;if(!S)throw new Error('not\x20enough\x20params:\x20table');if(!Z?.['pg'])return[];const h=await Z['pg']['query']('\x0a\x20\x20\x20\x20select\x0a\x20\x20\x20\x20\x20\x20\x20\x20attname\x20as\x20name,\x20pg_catalog.col_description(attrelid,attnum)\x20as\x20title\x0a\x20\x20\x20\x20from\x20pg_catalog.pg_attribute\x20where\x20attrelid=$1::regclass\x20and\x20attnum>0\x20and\x20NOT\x20attisdropped',[S])['then'](U=>U[D(0xab)]||[]);return h;}
@@ -1 +1 @@
1
- import{UnsupportedError,ValidationError}from'../../../errors.js';function s(){const E=['resource','Relation\x20update\x20is\x20not\x20configured:\x20','hasOwn','Cannot\x20change\x20relation:\x20','foreignKey'];s=function(){return E;};return s();}function f(p,Z){p=p-0x1df;const A=s();let I=A[p];return I;}import{createUpdate}from'./update.js';export function createUpdateRelation(p,Z){const A=createUpdate(p,Z);return async function I({name:j,id:D,relation:o,relationId:R,data:B,user:H},e){const h=f,g=Z['get'](j),N=g['relations']?.[o];if(!N?.[h(0x1df)]||!N['foreignKey'])throw new UnsupportedError(h(0x1e0)+o);if(Object[h(0x1e1)](B,N['foreignKey'])&&B[N['foreignKey']]!==D)throw new ValidationError(h(0x1e2)+N[h(0x1e3)]);return A({'name':N['resource'],'id':R,'data':B,'user':H,'where':{'column':N['foreignKey'],'value':D}},e);};}
1
+ import{UnsupportedError,ValidationError}from'../../../errors.js';import{createUpdate}from'./update.js';function O(){const i=['foreignKey'];O=function(){return i;};return O();}function c(S,Z){S=S-0x9c;const h=O();let U=h[S];return U;}export function createUpdateRelation(S,Z){const h=createUpdate(S,Z);return async function U({name:D,id:u,relation:e,relationId:q,data:x,user:n},N){const X=c,o=Z['get'](D),j=o['relations']?.[e];if(!j?.['resource']||!j['foreignKey'])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+e);if(Object['hasOwn'](x,j['foreignKey'])&&x[j['foreignKey']]!==u)throw new ValidationError('Cannot\x20change\x20relation:\x20'+j['foreignKey']);return h({'name':j['resource'],'id':q,'data':x,'user':n,'where':{'column':j[X(0x9c)],'value':u}},N);};}
@@ -1 +1 @@
1
- import{NotFoundError,ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';import{validateInputData}from'../utils/fields.js';function f(p,Z){p=p-0x113;const A=s();let I=A[p];return I;}import{clearTableLookupCache}from'./add-table-lookup-data.js';function s(){const V=['get','length','updated_at','push','user_type','key','\x20=\x20$','column','query','UPDATE\x20','SET\x20','join','table','audit','update','keys'];s=function(){return V;};return s();}export function createUpdate(p,Z){return async function A({name:I,id:j,data:D,user:o,where:R},B){const G=f,H=Z[G(0x113)](I);assertOperation(H,'update',o);const e=writableData(H,D);if(!e[G(0x114)])throw new ValidationError('No\x20writable\x20fields');const g=B?.['pg']??p['pg'];validateInputData({'resource':H,'data':D,'update':!![]});H['fields']['updated_at']&&e['push']([G(0x115),new Date()]);H['fields']['updated_by']&&e[G(0x116)](['updated_by',o?.['id']]);delete D[G(0x117)];const N=e['map'](([K],Q)=>qi(K)+'\x20=\x20$'+(Q+0x1)),h=[...e['map'](([,K])=>K),j];let E='WHERE\x20'+qi(H[G(0x118)])+G(0x119)+h[G(0x114)];R&&(h['push'](R['value']),E+='\x20AND\x20'+qi(R[G(0x11a)])+'\x20=\x20$'+h[G(0x114)]);H['where']&&(E+='\x20AND\x20('+H['where']+')');const a=await g[G(0x11b)](G(0x11c)+qt(H['table'])+'\x20'+(G(0x11d)+N[G(0x11e)](',\x20')+'\x20')+(E+'\x20')+('RETURNING\x20'+Object['keys'](D)['map'](qi)['join'](',\x20')),h),X=a['rows'][0x0];if(!X)throw new NotFoundError(I+':'+j);return clearTableLookupCache(H[G(0x11f)],g),await(B?.[G(0x120)]??p['audit'])?.['write']({'userId':o?.['id'],'module':H['module'],'resource':H['name'],'resourceId':j,'action':G(0x121),'fields':Object[G(0x122)](D)}),X;};}
1
+ import{NotFoundError,ValidationError}from'../../../errors.js';function O(){const L=['update','length','No\x20writable\x20fields','fields','updated_by','push','map','\x20=\x20$','where','query','join','table','module'];O=function(){return L;};return O();}import{assertOperation}from'../utils/permissions.js';import{qi,qt,writableData}from'../utils/sql.js';function c(S,Z){S=S-0xea;const h=O();let U=h[S];return U;}import{validateInputData}from'../utils/fields.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createUpdate(S,Z){return async function h({name:U,id:D,data:u,user:e,where:q},x){const E=c,n=Z['get'](U);assertOperation(n,E(0xea),e);const N=writableData(n,u);if(!N[E(0xeb)])throw new ValidationError(E(0xec));const o=x?.['pg']??S['pg'];validateInputData({'resource':n,'data':u,'update':!![]});n['fields']['updated_at']&&N['push'](['updated_at',new Date()]);n[E(0xed)][E(0xee)]&&N[E(0xef)](['updated_by',e?.['id']]);delete u['user_type'];const j=N[E(0xf0)](([Y],r)=>qi(Y)+E(0xf1)+(r+0x1)),X=[...N[E(0xf0)](([,Y])=>Y),D];let i='WHERE\x20'+qi(n['key'])+'\x20=\x20$'+X['length'];q&&(X['push'](q['value']),i+='\x20AND\x20'+qi(q['column'])+'\x20=\x20$'+X['length']);n[E(0xf2)]&&(i+='\x20AND\x20('+n['where']+')');const l=await o[E(0xf3)]('UPDATE\x20'+qt(n['table'])+'\x20'+('SET\x20'+j['join'](',\x20')+'\x20')+(i+'\x20')+('RETURNING\x20'+Object['keys'](u)['map'](qi)[E(0xf4)](',\x20')),X),b=l['rows'][0x0];if(!b)throw new NotFoundError(U+':'+D);return clearTableLookupCache(n[E(0xf5)],o),await(x?.['audit']??S['audit'])?.['write']({'userId':e?.['id'],'module':n[E(0xf6)],'resource':n['name'],'resourceId':D,'action':E(0xea),'fields':Object['keys'](u)}),b;};}
@@ -1 +1 @@
1
- const B=f;import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(p,Z,A=B(0x1b2),I){const H=B,j=requestedIndexes[H(0x1b3)](I)??new Set();requestedIndexes['set'](I,j);const D=p+':'+Z+':'+A;if(j['has'](D))return;j[H(0x1b4)](D),void ensureIndex(p,Z,A,I)['catch'](()=>{j['delete'](D);});}function s(){const g=['btree','get','add','split','query','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'];s=function(){return g;};return s();}function f(p,Z){p=p-0x1b2;const A=s();let I=A[p];return I;}async function ensureIndex(p,Z,A,I){const e=B,j=p[e(0x1b5)]('.'),D=j['length']===0x2?j[0x0]:'public',o=(p+'_'+Z+'_'+A+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),R=await I[e(0x1b6)]('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[D,o]);if(R['rowCount'])return;if(A==='text'){await I['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await I['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(o+'_l')+'\x20ON\x20'+qt(p)+'\x20USING\x20btree\x20(lower('+qi(Z)+')\x20text_pattern_ops)'),await I['query']('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(o)+'\x20ON\x20'+qt(p)+'\x20USING\x20gin\x20(lower('+qi(Z)+')\x20gin_trgm_ops)');return;}await I['query'](e(0x1b7)+qi(o)+'\x20ON\x20'+qt(p)+'\x20USING\x20'+A+'\x20('+qi(Z)+')');}
1
+ const x=c;import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(S,Z,h=x(0x152),U){const n=x,D=requestedIndexes['get'](U)??new Set();requestedIndexes['set'](U,D);const u=S+':'+Z+':'+h;if(D['has'](u))return;D['add'](u),void ensureIndex(S,Z,h,U)[n(0x153)](()=>{D['delete'](u);});}function c(S,Z){S=S-0x152;const h=O();let U=h[S];return U;}function O(){const o=['btree','catch','length','query','\x20USING\x20btree\x20(lower(',')\x20text_pattern_ops)','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20','\x20USING\x20gin\x20(lower('];O=function(){return o;};return O();}async function ensureIndex(S,Z,h,U){const N=x,D=S['split']('.'),u=D[N(0x154)]===0x2?D[0x0]:'public',e=(S+'_'+Z+'_'+h+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),q=await U['query']('SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2',[u,e]);if(q['rowCount'])return;if(h==='text'){await U['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await U[N(0x155)]('CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20'+qi(e+'_l')+'\x20ON\x20'+qt(S)+N(0x156)+qi(Z)+N(0x157)),await U['query'](N(0x158)+qi(e)+'\x20ON\x20'+qt(S)+N(0x159)+qi(Z)+')\x20gin_trgm_ops)');return;}await U['query'](N(0x158)+qi(e)+'\x20ON\x20'+qt(S)+'\x20USING\x20'+h+'\x20('+qi(Z)+')');}
@@ -1 +1 @@
1
- function s(){const D=['fields','writable','required','hasOwn','string','length','maximum','includes','\x20should\x20be\x20one\x20of\x20(','join','test','\x20should\x20match\x20regular\x20expression\x20('];s=function(){return D;};return s();}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';function f(p,Z){p=p-0x15a;const A=s();let I=A[p];return I;}const validateInputData=({resource:p,data:Z,update:update=![]})=>{const j=f;for(const [A,I]of Object['entries'](p[j(0x15a)])){if(I['required']&&I[j(0x15b)]!==![]&&(Z[A]===undefined||Z[A]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+A);if(I[j(0x15c)]&&I['writable']!==![]&&Object[j(0x15d)](Z,A)&&(Z[A]===undefined||Z[A]===null)&&update)throw new ValidationError('Required\x20field:\x20'+A);if(I['minLength']&&typeof Z[A]===j(0x15e)&&Z[A]['length']<I['minLength'])throw new ValidationError('minLength\x20not\x20met:\x20'+A);if(I['maxLength']&&typeof Z[A]==='string'&&Z[A][j(0x15f)]>I['maxLength'])throw new ValidationError('maxLength\x20exceeded:\x20'+A);if(I['minimum']&&typeof Z[A]==='number'&&Z[A]<I['minimum'])throw new ValidationError(A+'\x20should\x20be\x20>=\x20'+I['minimum']);if(I['maximum']&&typeof Z[A]==='number'&&Z[A]>I[j(0x160)])throw new ValidationError(A+'\x20should\x20be\x20<=\x20'+I['maximum']);if(I['enum']&&Z[A]&&!I['enum'][j(0x161)](Z[A]))throw new ValidationError(A+j(0x162)+I['enum'][j(0x163)](',\x20')+')');if(I['pattern']&&typeof Z[A]==='string'&&!new RegExp(I['pattern'])[j(0x164)](Z[A]))throw new ValidationError(A+j(0x165)+I['pattern']+')');}};export{validateInputData};
1
+ function O(){const u=['entries','fields','writable','Required\x20field:\x20','minLength','string','minLength\x20not\x20met:\x20','maxLength\x20exceeded:\x20','minimum','\x20should\x20be\x20>=\x20','pattern'];O=function(){return u;};return O();}function c(S,Z){S=S-0x128;const h=O();let U=h[S];return U;}import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';const validateInputData=({resource:S,data:Z,update:update=![]})=>{const D=c;for(const [h,U]of Object[D(0x128)](S[D(0x129)])){if(U['required']&&U[D(0x12a)]!==![]&&(Z[h]===undefined||Z[h]===null)&&!update)throw new ValidationError(D(0x12b)+h);if(U['required']&&U[D(0x12a)]!==![]&&Object['hasOwn'](Z,h)&&(Z[h]===undefined||Z[h]===null)&&update)throw new ValidationError('Required\x20field:\x20'+h);if(U[D(0x12c)]&&typeof Z[h]===D(0x12d)&&Z[h]['length']<U['minLength'])throw new ValidationError(D(0x12e)+h);if(U['maxLength']&&typeof Z[h]==='string'&&Z[h]['length']>U['maxLength'])throw new ValidationError(D(0x12f)+h);if(U['minimum']&&typeof Z[h]==='number'&&Z[h]<U[D(0x130)])throw new ValidationError(h+D(0x131)+U[D(0x130)]);if(U['maximum']&&typeof Z[h]==='number'&&Z[h]>U['maximum'])throw new ValidationError(h+'\x20should\x20be\x20<=\x20'+U['maximum']);if(U['enum']&&Z[h]&&!U['enum']['includes'](Z[h]))throw new ValidationError(h+'\x20should\x20be\x20one\x20of\x20('+U['enum']['join'](',\x20')+')');if(U['pattern']&&typeof Z[h]==='string'&&!new RegExp(U[D(0x132)])['test'](Z[h]))throw new ValidationError(h+'\x20should\x20match\x20regular\x20expression\x20('+U['pattern']+')');}};export{validateInputData};
@@ -1 +1 @@
1
- const a=f;import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';import{autoIndex}from'./auto-index.js';const filterOperators=new Set(['eq','ne','gt','gte','lt',a(0x1b6),'in','nin',a(0x1b7),a(0x1b8),a(0x1b9)]);export function parseFilterQuery(p){const X=a,Z={...isRecord(p['filter'])?p[X(0x1ba)]:{}};for(const [A,I]of Object['entries'](p)){const j=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/['exec'](A);if(!j)continue;const [,D,o]=j;if(!D)continue;if(!o){Z[D]=I;continue;}if(!filterOperators[X(0x1bb)](o))throw new ValidationError(X(0x1bc)+o);const R=isRecord(Z[D])?Z[D]:{};R[o]=(o==='in'||o===X(0x1bd))&&typeof I===X(0x1be)?I[X(0x1bf)](','):I,Z[D]=R;}return Object[X(0x1c0)](Z)[X(0x1c1)]?Z:undefined;}export function buildIndex(p,Z,A){for(const [I,j]of Object['entries'](Z??{})){const D=p['fields'][I];if(!D||D['filter']!==!![]&&D['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+I);A&&autoIndex(p['table'],fieldColumn(p,I),indexTypeFor(D['type'],'eq'),A);}}function f(p,Z){p=p-0x1b6;const A=s();let I=A[p];return I;}export function buildFilters(p,Z,A=0x1){const K=a,I=[],j=[];for(const [D,o]of Object[K(0x1c2)](Z??{})){const R=p['fields'][D];if(!R||R[K(0x1ba)]!==!![]&&R['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+D);const B=qi(fieldColumn(p,D)),H=isRecord(o)?o:{'eq':o};for(const [e,g]of Object[K(0x1c2)](H)){if(!filterOperators['has'](e))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+e);if((e==='like'||e===K(0x1b8))&&R['type']!=='string'&&R['type']!=='text')throw new ValidationError(K(0x1c3)+e+'\x20requires\x20a\x20text\x20field:\x20'+D);if(e===K(0x1b9)){I[K(0x1c4)](B+'\x20IS\x20'+(isTruthy(g)?'':K(0x1c5))+'NULL');continue;}if(e==='in'||e==='nin'){const E=Array['isArray'](g)?g:[g];if(E['length']===0x0){I['push'](e==='in'?'FALSE':K(0x1c6));continue;}j[K(0x1c4)](E),I['push'](B+'\x20'+(e==='in'?'=\x20ANY':K(0x1c7))+'($'+(A+j[K(0x1c1)]-0x1)+')');continue;}const N={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':K(0x1b7)},h='$'+(A+j['length']);if(e==='like'){j['push'](g+'%'),I[K(0x1c4)]('lower('+B+K(0x1c8)+h+')');continue;}j['push'](g),I['push'](B+'\x20'+N[e]+'\x20'+h);}}return{'sql':I[K(0x1c1)]?'\x20WHERE\x20'+I['join']('\x20AND\x20'):'','values':j};}function s(){const V=['lte','like','ilike','null','filter','has','Unsupported\x20filter\x20operator:\x20','nin','string','split','keys','length','entries','Operator\x20','push','NOT\x20','TRUE','<>\x20ALL',')\x20like\x20lower(','isArray','geom','gist','btree'];s=function(){return V;};return s();}function isRecord(p){const Q=a;return typeof p==='object'&&p!==null&&!Array[Q(0x1c9)](p);}function isTruthy(p){return p===!![]||p==='true'||p==='1'||p===0x1;}function indexTypeFor(p,Z){const G=a;if(Z==='like'||Z===G(0x1b8))return'text';if(p===G(0x1ca)||p==='geometry')return G(0x1cb);return G(0x1cc);}
1
+ import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';import{autoIndex}from'./auto-index.js';function O(){const L=['exec','Unsupported\x20filter\x20operator:\x20','keys','entries','fields','filter','has','type','text','Operator\x20','\x20IS\x20','isArray','push','\x20WHERE\x20','like','geom'];O=function(){return L;};return O();}const filterOperators=new Set(['eq','ne','gt','gte','lt','lte','in','nin','like','ilike','null']);export function parseFilterQuery(S){const l=c,Z={...isRecord(S['filter'])?S['filter']:{}};for(const [h,U]of Object['entries'](S)){const D=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/[l(0x167)](h);if(!D)continue;const [,u,e]=D;if(!u)continue;if(!e){Z[u]=U;continue;}if(!filterOperators['has'](e))throw new ValidationError(l(0x168)+e);const q=isRecord(Z[u])?Z[u]:{};q[e]=(e==='in'||e==='nin')&&typeof U==='string'?U['split'](','):U,Z[u]=q;}return Object[l(0x169)](Z)['length']?Z:undefined;}function c(S,Z){S=S-0x167;const h=O();let U=h[S];return U;}export function buildIndex(S,Z,h){const b=c;for(const [U,D]of Object[b(0x16a)](Z??{})){const u=S[b(0x16b)][U];if(!u||u['filter']!==!![]&&u['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+U);h&&autoIndex(S['table'],fieldColumn(S,U),indexTypeFor(u['type'],'eq'),h);}}export function buildFilters(S,Z,h=0x1){const Y=c,U=[],D=[];for(const [u,e]of Object['entries'](Z??{})){const q=S['fields'][u];if(!q||q[Y(0x16c)]!==!![]&&q['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+u);const x=qi(fieldColumn(S,u)),n=isRecord(e)?e:{'eq':e};for(const [N,o]of Object['entries'](n)){if(!filterOperators[Y(0x16d)](N))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+N);if((N==='like'||N==='ilike')&&q[Y(0x16e)]!=='string'&&q['type']!==Y(0x16f))throw new ValidationError(Y(0x170)+N+'\x20requires\x20a\x20text\x20field:\x20'+u);if(N==='null'){U['push'](x+Y(0x171)+(isTruthy(o)?'':'NOT\x20')+'NULL');continue;}if(N==='in'||N==='nin'){const i=Array[Y(0x172)](o)?o:[o];if(i['length']===0x0){U['push'](N==='in'?'FALSE':'TRUE');continue;}D[Y(0x173)](i),U[Y(0x173)](x+'\x20'+(N==='in'?'=\x20ANY':'<>\x20ALL')+'($'+(h+D['length']-0x1)+')');continue;}const j={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':'like'},X='$'+(h+D['length']);if(N==='like'){D[Y(0x173)](o+'%'),U['push']('lower('+x+')\x20like\x20lower('+X+')');continue;}D[Y(0x173)](o),U['push'](x+'\x20'+j[N]+'\x20'+X);}}return{'sql':U['length']?Y(0x174)+U['join']('\x20AND\x20'):'','values':D};}function isRecord(S){const r=c;return typeof S==='object'&&S!==null&&!Array[r(0x172)](S);}function isTruthy(S){return S===!![]||S==='true'||S==='1'||S===0x1;}function indexTypeFor(S,Z){const E=c;if(Z===E(0x175)||Z==='ilike')return E(0x16f);if(S===E(0x176)||S==='geometry')return'gist';return'btree';}
@@ -1 +1 @@
1
- import{ForbiddenError}from'../../../errors.js';function s(){const o=['config','public','admin','type','includes','Missing\x20permission:\x20'];s=function(){return o;};return s();}function f(p,Z){p=p-0x86;const A=s();let I=A[p];return I;}import{getContext}from'../../../index.js';export function assertOperation(p,Z,A){const D=f,I=getContext()[D(0x86)];if(I['debug'])return;if(!p['operations']['includes'](Z))throw new ForbiddenError(p['name']+'.'+Z+'\x20is\x20disabled');if(p['access']!==D(0x87)&&A===undefined)throw new ForbiddenError('Authentication\x20required');if(p['access']===D(0x88)&&A?.[D(0x89)]!==D(0x88))throw new ForbiddenError('Admin\x20access\x20required');if(A?.['type']!==D(0x88)){const j=(p['permission']??p['name'])+':'+Z;if(!A?.['permissions']?.[D(0x8a)](j))throw new ForbiddenError(D(0x8b)+j);}}
1
+ function c(S,Z){S=S-0x75;const h=O();let U=h[S];return U;}import{ForbiddenError}from'../../../errors.js';import{getContext}from'../../../index.js';export function assertOperation(S,Z,h){const u=c,U=getContext()[u(0x75)];if(U['debug'])return;if(!S['operations']['includes'](Z))throw new ForbiddenError(S['name']+'.'+Z+u(0x76));if(S['access']!=='public'&&h===undefined)throw new ForbiddenError(u(0x77));if(S['access']==='admin'&&h?.[u(0x78)]!=='admin')throw new ForbiddenError('Admin\x20access\x20required');if(h?.['type']!=='admin'){const D=(S['permission']??S['name'])+':'+Z;if(!h?.['permissions']?.[u(0x79)](D))throw new ForbiddenError('Missing\x20permission:\x20'+D);}}function O(){const e=['config','\x20is\x20disabled','Authentication\x20required','type','includes'];O=function(){return e;};return O();}
@@ -1 +1 @@
1
- import{ValidationError}from'../../../errors.js';import{qi}from'./sql.js';function f(p,Z){p=p-0xe3;const A=s();let I=A[p];return I;}const scopeCache=new Map(),CACHE_TTL_MS=0x7530;export function clearResourceScopeCache(p,Z){const g=f;if(p&&Z){scopeCache['delete'](p+':'+Z);return;}if(p){for(const A of scopeCache['keys']()){if(A['startsWith'](p+':'))scopeCache['delete'](A);}return;}scopeCache[g(0xe3)]();}function s(){const K=['clear','get','promise','query','scope','value','set','fromEntries','name','key','user_uid','created_by','fields','type','admin','\x20=\x20$','push','length','\x20AND\x20'];s=function(){return K;};return s();}async function loadScopeRows(p,Z,A){const N=f,I=p+':'+Z,j=scopeCache[N(0xe4)](I);if(j&&j['expiresAt']>Date['now']())return j[N(0xe5)];const D=A[N(0xe6)]('SELECT\x20DISTINCT\x20ras.scope,\x20ras.value\x0a\x20\x20\x20\x20\x20FROM\x20admin.role_access_scope\x20ras\x0a\x20\x20\x20\x20\x20WHERE\x20ras.resource\x20=\x20$2\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20ras.enabled\x20=\x20TRUE\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20OR\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20ras.role_id\x20IN\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ur.role_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20(ur.expiration\x20IS\x20NULL\x20OR\x20ur.expiration\x20>=\x20CURRENT_DATE)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20)',[p,Z])['then'](({rows:o})=>{const h=N,R=new Map();for(const B of o){const H=R['get'](B[h(0xe7)])??[];if(Array['isArray'](B['value']))H['push'](...B['value']);else{if(B['value']!==null&&B[h(0xe8)]!==undefined)H['push'](B['value']);}R['set'](B[h(0xe7)],H);}return R;})['catch'](o=>{scopeCache['delete'](I);throw o;});return scopeCache[N(0xe9)](I,{'expiresAt':Date['now']()+CACHE_TTL_MS,'promise':D}),D;}export async function getUserResourceScopes(p,Z,A){const E=f,I=await loadScopeRows(p,Z,A);return Object[E(0xea)]([...I]['map'](([j,D])=>[j,j==='me'?p:D]));}function columnForScope(p,Z){const a=f;if(Z===p[a(0xeb)])return p[a(0xec)];if(Z==='me'){const I=['user_id',a(0xed),'owner_id',a(0xee)]['find'](j=>p[a(0xef)][j]);if(!I)throw new ValidationError('Cannot\x20apply\x20\x22me\x22\x20scope\x20to\x20resource\x20without\x20an\x20owner\x20field:\x20'+p[a(0xeb)]);return p['fields'][I]?.['column']??I;}const A=p['fields'][Z];if(!A)return'';return A['column']??Z;}export async function buildUserResourceScopeFilter(p,Z,A,I){const X=f;if(!Z||Z[X(0xf0)]===X(0xf1))return{'sql':'','values':[]};const j=await loadScopeRows(Z['id'],p[X(0xeb)],A),D=[],o=[];for(const [R,B]of j){const H=columnForScope(p,R);if(!H){D['push']('(FALSE)');continue;}const e='t.'+qi(H);if(R==='me'){o['push'](Z['id']),D['push']('('+e+X(0xf2)+(I+o['length']-0x1)+')');continue;}if(B['length']===0x0){D[X(0xf3)]('(FALSE)');continue;}o[X(0xf3)](B),D['push']('('+e+'\x20=\x20ANY($'+(I+o[X(0xf4)]-0x1)+'))');}return{'sql':D['join'](X(0xf5)),'values':o};}
1
+ import{ValidationError}from'../../../errors.js';import{qi}from'./sql.js';const scopeCache=new Map(),CACHE_TTL_MS=0x7530;export function clearResourceScopeCache(S,Z){const o=c;if(S&&Z){scopeCache[o(0x1e8)](S+':'+Z);return;}if(S){for(const h of scopeCache[o(0x1e9)]()){if(h[o(0x1ea)](S+':'))scopeCache['delete'](h);}return;}scopeCache['clear']();}async function loadScopeRows(S,Z,h){const j=c,U=S+':'+Z,D=scopeCache[j(0x1eb)](U);if(D&&D['expiresAt']>Date[j(0x1ec)]())return D['promise'];const u=h[j(0x1ed)]('SELECT\x20DISTINCT\x20ras.scope,\x20ras.value\x0a\x20\x20\x20\x20\x20FROM\x20admin.role_access_scope\x20ras\x0a\x20\x20\x20\x20\x20WHERE\x20ras.resource\x20=\x20$2\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20ras.enabled\x20=\x20TRUE\x0a\x20\x20\x20\x20\x20\x20\x20AND\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20OR\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ras.user_id\x20IS\x20NULL\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20ras.role_id\x20IN\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20ur.role_id\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20FROM\x20admin.user_roles\x20ur\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20ur.user_uid\x20=\x20$1\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20AND\x20(ur.expiration\x20IS\x20NULL\x20OR\x20ur.expiration\x20>=\x20CURRENT_DATE)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20)\x0a\x20\x20\x20\x20\x20\x20\x20)',[S,Z])['then'](({rows:e})=>{const X=j,q=new Map();for(const x of e){const n=q['get'](x['scope'])??[];if(Array['isArray'](x['value']))n[X(0x1ee)](...x['value']);else{if(x['value']!==null&&x['value']!==undefined)n['push'](x['value']);}q['set'](x[X(0x1ef)],n);}return q;})['catch'](e=>{scopeCache['delete'](U);throw e;});return scopeCache['set'](U,{'expiresAt':Date['now']()+CACHE_TTL_MS,'promise':u}),u;}export async function getUserResourceScopes(S,Z,h){const i=c,U=await loadScopeRows(S,Z,h);return Object['fromEntries']([...U][i(0x1f0)](([D,u])=>[D,D==='me'?S:u]));}function columnForScope(S,Z){const l=c;if(Z===S['name'])return S['key'];if(Z==='me'){const U=['user_id',l(0x1f1),l(0x1f2),'created_by']['find'](D=>S['fields'][D]);if(!U)throw new ValidationError(l(0x1f3)+S[l(0x1f4)]);return S[l(0x1f5)][U]?.['column']??U;}const h=S['fields'][Z];if(!h)return'';return h['column']??Z;}export async function buildUserResourceScopeFilter(S,Z,h,U){const b=c;if(!Z||Z['type']==='admin')return{'sql':'','values':[]};const D=await loadScopeRows(Z['id'],S[b(0x1f4)],h),u=[],e=[];for(const [q,x]of D){const n=columnForScope(S,q);if(!n){u['push'](b(0x1f6));continue;}const N='t.'+qi(n);if(q==='me'){e[b(0x1ee)](Z['id']),u['push']('('+N+b(0x1f7)+(U+e[b(0x1f8)]-0x1)+')');continue;}if(x['length']===0x0){u['push']('(FALSE)');continue;}e['push'](x),u[b(0x1ee)]('('+N+b(0x1f9)+(U+e[b(0x1f8)]-0x1)+'))');}return{'sql':u[b(0x1fa)](b(0x1fb)),'values':e};}function c(S,Z){S=S-0x1e8;const h=O();let U=h[S];return U;}function O(){const Y=['delete','keys','startsWith','get','now','query','push','scope','map','user_uid','owner_id','Cannot\x20apply\x20\x22me\x22\x20scope\x20to\x20resource\x20without\x20an\x20owner\x20field:\x20','name','fields','(FALSE)','\x20=\x20$','length','\x20=\x20ANY($','join','\x20AND\x20'];O=function(){return Y;};return O();}
@@ -1 +1 @@
1
- function s(){const H=['string','ASC','join'];s=function(){return H;};return s();}import{fieldColumn,qi}from'./sql.js';function f(p,Z){p=p-0x67;const A=s();let I=A[p];return I;}import{ValidationError}from'../../../errors.js';export function buildSort(p,Z){const R=f;if(!Z?.['length'])return'';typeof Z===R(0x67)&&(Z=[Z]);const A=Z['map'](I=>{const B=R,j=I['startsWith']('-'),D=j?I['slice'](0x1):I,o=p['fields'][D];if(!o||o['sortable']!==!![])throw new ValidationError('Field\x20is\x20not\x20sortable:\x20'+D);return qi(fieldColumn(p,D))+'\x20'+(j?'DESC':B(0x68));});return'\x20ORDER\x20BY\x20'+A[R(0x69)](',\x20');}
1
+ function c(S,Z){S=S-0x159;const h=O();let U=h[S];return U;}import{fieldColumn,qi}from'./sql.js';function O(){const n=['string','sortable','Field\x20is\x20not\x20sortable:\x20','DESC','ASC','\x20ORDER\x20BY\x20'];O=function(){return n;};return O();}import{ValidationError}from'../../../errors.js';export function buildSort(S,Z){const q=c;if(!Z?.['length'])return'';typeof Z===q(0x159)&&(Z=[Z]);const h=Z['map'](U=>{const x=q,D=U['startsWith']('-'),u=D?U['slice'](0x1):U,e=S['fields'][u];if(!e||e[x(0x15a)]!==!![])throw new ValidationError(x(0x15b)+u);return qi(fieldColumn(S,u))+'\x20'+(D?x(0x15c):x(0x15d));});return q(0x15e)+h['join'](',\x20');}
@@ -1 +1 @@
1
- const o=f;import{ValidationError}from'../../../errors.js';export const quoteIdentifier=p=>'\x22'+p['replace'](/"/g,'\x22\x22')+'\x22';function s(){const e=['split','Unknown\x20field:\x20','fields','read','scope','column','unshift','write'];s=function(){return e;};return s();}export const quoteTable=p=>p[o(0x1cd)]('.')['map'](quoteIdentifier)['join']('.');function f(p,Z){p=p-0x1cd;const A=s();let I=A[p];return I;}export function fieldColumn(p,Z){const R=o;if(Z===p['key'])return p['key'];const A=p['fields'][Z];if(!A)throw new ValidationError(R(0x1ce)+Z);return A['column']??Z;}export function readableFields(p,Z){const B=o,A=Object['entries'](p[B(0x1cf)])['filter'](([,I])=>I[B(0x1d0)]!==![]&&I['readable']!==![]&&(Z?(I[B(0x1d1)]??'all')===Z:!![]))['map'](([I,j])=>quoteIdentifier(j[B(0x1d2)]??I)+'\x20AS\x20'+quoteIdentifier(I));return!p['fields'][p['key']]&&A[B(0x1d3)](quoteIdentifier(p['key'])),A;}export function writableData(p,Z){const H=o,A=[];for(const [I,j]of Object['entries'](Z)){const D=p['fields'][I];if(!D||D[H(0x1d4)]===![]||D['writable']===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+I);if((D[H(0x1d4)]??D['writable'])!==!![])continue;if(D['type']==='date'&&!Z[I])continue;A['push']([D[H(0x1d2)]??I,j]);}return A;}export const qi=quoteIdentifier;export const qt=quoteTable;
1
+ function O(){const N=['split','join','Unknown\x20field:\x20','column','entries','read','all','key','write'];O=function(){return N;};return O();}const e=c;import{ValidationError}from'../../../errors.js';export const quoteIdentifier=S=>'\x22'+S['replace'](/"/g,'\x22\x22')+'\x22';export const quoteTable=S=>S[e(0x113)]('.')['map'](quoteIdentifier)[e(0x114)]('.');export function fieldColumn(S,Z){const q=e;if(Z===S['key'])return S['key'];const h=S['fields'][Z];if(!h)throw new ValidationError(q(0x115)+Z);return h[q(0x116)]??Z;}export function readableFields(S,Z){const x=e,h=Object[x(0x117)](S['fields'])['filter'](([,U])=>U[x(0x118)]!==![]&&U['readable']!==![]&&(Z?(U['scope']??x(0x119))===Z:!![]))['map'](([U,D])=>quoteIdentifier(D['column']??U)+'\x20AS\x20'+quoteIdentifier(U));return!S['fields'][S[x(0x11a)]]&&h['unshift'](quoteIdentifier(S[x(0x11a)])),h;}export function writableData(S,Z){const n=e,h=[];for(const [U,D]of Object['entries'](Z)){const u=S['fields'][U];if(!u||u[n(0x11b)]===![]||u['writable']===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+U);if((u['write']??u['writable'])!==!![])continue;if(u['type']==='date'&&!Z[U])continue;h['push']([u['column']??U,D]);}return h;}export const qi=quoteIdentifier;function c(S,Z){S=S-0x113;const h=O();let U=h[S];return U;}export const qt=quoteTable;