@opengis/fcore 0.0.1-beta.22 → 0.0.1-beta.23
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.
- package/dist/config.js +1 -1
- package/dist/context.js +1 -1
- package/dist/errors.js +1 -1
- package/dist/fastify.js +1 -1
- package/dist/fcore.js +1 -1
- package/dist/migrations/cli.js +1 -1
- package/dist/migrations/runner.js +1 -1
- package/dist/modules/auth/adduser-cli.js +1 -1
- package/dist/modules/auth/passwd-cli.js +1 -1
- package/dist/modules/auth/permission-cli.js +1 -1
- package/dist/modules/auth/route.js +1 -1
- package/dist/modules/auth/schema.js +1 -1
- package/dist/modules/auth/services/change-password.js +1 -1
- package/dist/modules/auth/services/get-current-user.js +1 -1
- package/dist/modules/auth/services/registration.js +1 -1
- package/dist/modules/auth/services/verify-two-factor.js +1 -1
- package/dist/modules/file/mime.js +1 -1
- package/dist/modules/file/route.js +1 -1
- package/dist/modules/file/schema.js +1 -1
- package/dist/modules/file/services/get-file.js +1 -1
- package/dist/modules/file/services/resize-file.js +1 -1
- package/dist/modules/file/services/upload-file.js +1 -1
- package/dist/modules/resource/route.js +1 -1
- package/dist/modules/resource/schema.js +1 -1
- package/dist/modules/resource/services/add-note.js +1 -1
- package/dist/modules/resource/services/add-resource-file.js +1 -1
- package/dist/modules/resource/services/create-resource-relation.js +1 -1
- package/dist/modules/resource/services/create-resource.js +1 -1
- package/dist/modules/resource/services/delete-resource-relation.js +1 -1
- package/dist/modules/resource/services/delete-resource.js +1 -1
- package/dist/modules/resource/services/export-resource.js +1 -1
- package/dist/modules/resource/services/get-resource.js +1 -1
- package/dist/modules/resource/services/list-resource-relation.js +1 -1
- package/dist/modules/resource/services/list-resources.js +1 -1
- package/dist/modules/resource/services/search-resource.js +1 -1
- package/dist/modules/resource/services/suggest-resource.js +1 -1
- package/dist/modules/resource/services/update-resource-relation.js +1 -1
- package/dist/modules/resource/services/update-resource.js +1 -1
- package/dist/modules/resource/services/upload-resource-file.js +1 -1
- package/dist/modules/system/route.js +1 -1
- package/dist/modules/system/schema.js +1 -1
- package/dist/modules/system/services/check-system.js +1 -1
- package/dist/modules/system/services/get-access.js +1 -1
- package/dist/modules/system/services/get-api-list.js +1 -1
- package/dist/modules/system/services/get-audit-log.js +1 -1
- package/dist/modules/system/services/get-dictionary.js +1 -1
- package/dist/modules/system/services/get-system-log.js +1 -1
- package/dist/modules/system/services/get-system-settings.js +1 -1
- package/dist/modules/system/services/list-dictionaries.js +1 -1
- package/dist/modules/system/services/set-access.js +1 -1
- package/dist/modules/system/services/update-dictionary.js +1 -1
- package/dist/modules/system/services/update-system-settings.js +1 -1
- package/dist/modules/utils/require-admin.js +1 -1
- package/dist/modules/utils/safe-user.js +1 -1
- package/dist/modules/utils/unsupported.js +1 -1
- package/dist/plugins/audit/audit.js +1 -1
- package/dist/plugins/audit/services/write-audit.js +1 -1
- package/dist/plugins/auth/get-user-permissions.js +1 -1
- package/dist/plugins/auth/index.js +1 -1
- package/dist/plugins/auth/verifyUser.js +1 -1
- package/dist/plugins/dictionary.js +1 -1
- package/dist/plugins/file.js +1 -1
- package/dist/plugins/jwt.js +1 -1
- package/dist/plugins/logger/index.js +1 -1
- package/dist/plugins/logger/transport.js +1 -1
- package/dist/plugins/pg.js +1 -1
- package/dist/plugins/redis.js +1 -1
- package/dist/plugins/resource/resource.js +1 -1
- package/dist/plugins/resource/resource.registry.js +1 -1
- package/dist/plugins/resource/services/add-dictionary-lookup-data.js +1 -1
- package/dist/plugins/resource/services/add-file-token.js +1 -1
- package/dist/plugins/resource/services/add-table-lookup-data.js +1 -1
- package/dist/plugins/resource/services/create-relation.js +1 -1
- package/dist/plugins/resource/services/create.js +1 -1
- package/dist/plugins/resource/services/delete-relation.js +1 -1
- package/dist/plugins/resource/services/delete.js +1 -1
- package/dist/plugins/resource/services/find-one.d.ts.map +1 -1
- package/dist/plugins/resource/services/find-one.js +1 -1
- package/dist/plugins/resource/services/find-relation.js +1 -1
- package/dist/plugins/resource/services/find.js +1 -1
- package/dist/plugins/resource/services/get-table-columns.d.ts +8 -0
- package/dist/plugins/resource/services/get-table-columns.d.ts.map +1 -0
- package/dist/plugins/resource/services/get-table-columns.js +1 -0
- package/dist/plugins/resource/services/update-relation.js +1 -1
- package/dist/plugins/resource/services/update.js +1 -1
- package/dist/plugins/resource/utils/auto-index.js +1 -1
- package/dist/plugins/resource/utils/fields.js +1 -1
- package/dist/plugins/resource/utils/filters.js +1 -1
- package/dist/plugins/resource/utils/permissions.js +1 -1
- package/dist/plugins/resource/utils/sort.js +1 -1
- package/dist/plugins/resource/utils/sql.js +1 -1
- package/dist/shared/getIP.js +1 -1
- package/migrations/20260903120000_core_schema.sql +1 -1
- package/migrations/20260905120000_add_user_foreign_keys.sql +42 -42
- package/package.json +93 -93
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function v(){const t=['delete','WHERE\x20','key','push','rowCount','name'];v=function(){return t;};return v();}import{assertOperation}from'../utils/permissions.js';function S(i,n){i=i-0x150;const x=v();let N=x[i];return N;}import{qt,qi}from'../utils/sql.js';import{clearTableLookupCache}from'./add-table-lookup-data.js';export function createRemove(i,n){return async function x({name:N,id:a,user:B,where:q},X){const U=S,f=n['get'](N);assertOperation(f,U(0x150),B);const A=X?.['pg']??i['pg'],u=[a];let V=U(0x151)+qi(f[U(0x152)])+'\x20=\x20$1';q&&(u[U(0x153)](q['value']),V+='\x20AND\x20'+qi(q['column'])+'\x20=\x20$'+u['length']);f['where']&&(V+='\x20AND\x20('+f['where']+')');const M=await A['query']('DELETE\x20FROM\x20'+qt(f['table'])+'\x20'+V,u);if((M['rowCount']??0x0)>0x0)clearTableLookupCache(f['table'],A);if((M[U(0x154)]??0x0)>0x0)await(X?.['audit']??i['audit'])?.['write']({'module':f['module'],'resource':f[U(0x155)],'resourceId':a,'action':U(0x150)});return(M[U(0x154)]??0x0)>0x0;};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-one.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-one.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"find-one.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/find-one.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAK9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,gBAAgB,gCAOvB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB,6CAyHF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{ValidationError}from'../../../errors.js';import{assertOperation}from'../utils/permissions.js';function v(){const k=['key','integer','Invalid\x20id:\x20','joins','join','query','SELECT\x20','=$1','\x20LIMIT\x201','rows','dictionary','include','split','table','find','targetKey','\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)','junctionTargetKey','fields','now'];v=function(){return k;};return v();}import{qt,qi,readableFields}from'../utils/sql.js';function S(i,n){i=i-0xd3;const x=v();let N=x[i];return N;}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';import{addTableLookupData}from'./add-table-lookup-data.js';import{addFileToken}from'./add-file-token.js';import{getTableColumns}from'./get-table-columns.js';export function createFindOne(i,n){return async function x({name:N,id:a,query:query={},user:B}){const o=S,q=Date['now'](),X=n['get'](N);assertOperation(X,'read',B);if(X['fields'][X[o(0xd3)]]?.['type']===o(0xd4)&&!Number['isInteger'](Number(a)))throw new ValidationError(o(0xd5)+a+'\x20name:'+N);const f=X[o(0xd6)]?.['map'](U=>U['sql']+'\x20')[o(0xd7)]('\x20')||'',A=X['where']?'\x20AND\x20('+X['where']+')':'',u=await i['pg'][o(0xd8)](o(0xd9)+readableFields(X)['join'](',\x20')+'\x20FROM\x20'+qt(X['table'])+'\x20t\x20'+f+'\x20WHERE\x20'+qi(X[o(0xd3)])+o(0xda)+A+o(0xdb),[a]),V=u[o(0xdc)][0x0];if(!V)return null;await addDictionaryLookupData([V],X['fields'],i[o(0xdd)]),await addTableLookupData([V],X['fields'],i['pg']),addFileToken([V],X['fields'],i['file']);const M=Array['isArray'](query[o(0xde)])?query['include']:query[o(0xde)]?.[o(0xdf)](',')??[];for(const U of M){const t=X['relations']?.[U];if(!t)throw new ValidationError('Unknown\x20relation:\x20'+U);const z=!!(t?.['junctionTable']&&t['junctionLocalKey']&&t['junctionForeignKey']);if(!t?.['foreignKey']&&!z||!t['resource']&&!t['table'])throw new ValidationError('Invalid\x20relation:\x20'+U);const J=t['resource']?n['get'](t['resource']):undefined,p=t[o(0xe0)]??J['table'],h=J?.['key']??'id',O=p?await getTableColumns(p,i):[],m=J?readableFields(J)['map'](b=>''+(O[o(0xe1)](T=>T['name']===b['split']('\x20')['shift']()?.['replace'](/\"/g,''))?'t.':'')+b)['join'](',\x20'):'t.*',P=t['foreignKey']?'SELECT\x20'+m+'\x20FROM\x20'+qt(p)+'\x20t\x20WHERE\x20'+(t[o(0xe2)]||qi(h))+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(t['foreignKey'])+'\x20FROM\x20'+qt(X['table'])+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(X['key'])+o(0xe3):'SELECT\x20'+m+'\x20FROM\x20'+qt(p)+'\x20t\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20'+qt(t['junctionTable'])+'\x20j\x20ON\x20j.'+qi(t['junctionForeignKey'])+'\x20=\x20t.'+(t[o(0xe4)]||qi(h))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20j.'+qi(t['junctionLocalKey'])+'\x20=\x20(\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20SELECT\x20'+qi(X['key'])+'\x20FROM\x20'+qt(X[o(0xe0)])+'\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20'+qi(X[o(0xd3)])+'\x20=\x20$1\x20LIMIT\x201\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20)',G=(await i['pg']['query'](P,[a]))['rows'];J&&(await addDictionaryLookupData(G,J[o(0xe5)],i['dictionary']),await addTableLookupData(G,J['fields'],i['pg']),addFileToken(G,J['fields'],i['file'])),V[U]=G;}return V['time']=Date[o(0xe6)]()-q,V;};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{UnsupportedError,ValidationError}from'../../../errors.js';function
|
|
1
|
+
import{UnsupportedError,ValidationError}from'../../../errors.js';import{qi,qt}from'../utils/sql.js';function S(i,n){i=i-0xc8;const x=v();let N=x[i];return N;}import{addDictionaryLookupData}from'./add-dictionary-lookup-data.js';function v(){const o=['limit','Invalid\x20pagination','get','files','notes','now','SELECT\x20*\x20FROM\x20admin.files\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC','file','junctionLocalKey','localKey','resource','Generic\x20Resource\x20relation\x20\x22','table','key','fields','foreignKey','item','where','SELECT\x20','\x20t\x20','\x20j\x20ON\x20j.','\x20=\x20t.','\x20FROM\x20','\x20=\x20(select\x20','\x20where\x20','\x20LIMIT\x20$2\x20OFFSET\x20$3','rows','length'];v=function(){return o;};return v();}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(i,n){return async function x({name:N,id:a,relation:B,query:query={}}){const T=S,q=Date['now'](),X=Math['min'](Math['max'](query[T(0xc8)]??0x14,0x1),0xc8),f=Math['max'](query['offset']??0x0,0x0);if(!Number['isFinite'](X)||!Number['isFinite'](f))throw new ValidationError(T(0xc9));const A=n[T(0xca)](N),u=A['relations']?.[B];if(['notes',T(0xcb)]['includes'](B)&&!A['capabilities']?.['includes'](B))throw new UnsupportedError('Generic\x20Resource\x20relation\x20\x22'+B+'\x22\x20requires\x20a\x20capabilities\x20\x22'+B+'\x22');if(B===T(0xcc)){const P=await i['pg']['query']('SELECT\x20*\x20FROM\x20admin.notes\x20WHERE\x20resource\x20=\x20$1\x20AND\x20resource_id\x20=\x20$2\x20ORDER\x20BY\x20created_at\x20DESC',[N,String(a)]);return{'total':P['rows']['length'],'time':Date[T(0xcd)]()-q,'rows':P['rows']};}if(B==='files'){const G=await i['pg']['query'](T(0xce),[N,String(a)]);return addFileToken(G['rows'],{'file_path':{'type':T(0xcf)}},i[T(0xcf)]),{'total':G['rows']['length'],'time':Date['now']()-q,'rows':G['rows']};}const V=!!(u?.['junctionTable']&&u[T(0xd0)]&&u['junctionForeignKey']);if(!u||!V&&!u['foreignKey']&&!u[T(0xd1)]||!u[T(0xd2)]&&!u['table'])throw new UnsupportedError(T(0xd3)+B+'\x22\x20requires\x20a\x20project/provider\x20implementation');const M=u['resource']?n['get'](u[T(0xd2)]):undefined,U=u[T(0xd4)]??M[T(0xd4)],t=M?.[T(0xd5)]??'id',z=!V&&Object['keys'](M?.[T(0xd6)]??{})['filter'](b=>M?.[T(0xd6)][b]?.['read']&&M?.['fields'][b]?.['scope']!=='item')['map'](qi)['join'](',\x20'),J=u[T(0xd6)]?.['join'](',\x20')||z||'*';u['foreignKey']&&autoIndex(U,u[T(0xd7)],'btree',i['pg']);const p=M?.['joins']?.['filter'](b=>b['scope']!==T(0xd8))['map'](b=>b['sql']+'\x20')['join']('\x20')||'',h=u['where']?'\x20AND\x20('+u[T(0xd9)]+')':'',O=(V?T(0xda)+J+'\x20FROM\x20'+qt(U)+T(0xdb)+p+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20JOIN\x20'+qt(u['junctionTable'])+T(0xdc)+qi(u['junctionForeignKey'])+T(0xdd)+(u['junctionTargetKey']||qi(t))+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20WHERE\x20j.'+qi(u['junctionLocalKey'])+'\x20=\x20$1'+h+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20LIMIT\x20$2\x20OFFSET\x20$3':'')||(u[T(0xd7)]?'SELECT\x20'+J+'\x20FROM\x20'+qt(U)+T(0xdb)+p+'\x20WHERE\x20t.'+qi(u[T(0xd7)])+'\x20=\x20$1'+h+'\x20LIMIT\x20$2\x20OFFSET\x20$3':T(0xda)+J+T(0xde)+qt(U)+T(0xdb)+p+'\x20WHERE\x20t.'+qi(u[T(0xd7)]||t)+T(0xdf)+qi(u[T(0xd1)])+T(0xde)+qt(A['table'])+T(0xe0)+qi(A['key'])+'\x20=\x20$1\x20limit\x201)'+h+T(0xe1)),m=await i['pg']['query'](O,[a,X,f]);return M&&(await addDictionaryLookupData(m['rows'],M['fields'],i['dictionary']),await addTableLookupData(m['rows'],M['fields'],i['pg']),addFileToken(m[T(0xe2)],M[T(0xd6)],i['file'])),{'limit':X,'offset':f,'total':m['rows'][T(0xe3)],'time':Date['now']()-q,'rows':m['rows']??null};};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ValidationError}from'../../../errors.js';import{buildFilters}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';
|
|
1
|
+
import{ValidationError}from'../../../errors.js';import{buildFilters}from'../utils/filters.js';import{assertOperation}from'../utils/permissions.js';function v(){const m=['filter','sql','\x20AND\x20','\x20WHERE\x20','where','text','values','search','item','map','join','all','table','OFFSET\x20$','\x20t\x20','query','fields','dictionary','rows'];v=function(){return m;};return v();}import{buildSort}from'../utils/sort.js';function S(i,n){i=i-0x173;const x=v();let N=x[i];return N;}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';export function createFind(i,n){return async function x({name:N,query:query={},user:a}){const O=S,B=Date['now'](),q=n['get'](N);assertOperation(q,'read',a);const X=Math['min'](Math['max'](query['limit']??0x14,0x1),0xc8),f=Math['max'](query['offset']??0x0,0x0),A=buildFilters(q,query[O(0x173)],0x1,i['pg']);q['where']&&(A[O(0x174)]+=(A[O(0x174)]?O(0x175):O(0x176))+('('+q[O(0x177)]+')'));const u=buildSort(q,query['sort']);if(!Number['isFinite'](X)||!Number['isFinite'](f))throw new ValidationError('Invalid\x20pagination');const V=q['searchable']||Object['keys'](q['fields'])['filter'](h=>q['fields'][h]?.['searchable']);query['search']&&V['length']&&(V['map'](h=>autoIndex(q['table'],h,O(0x178),i['pg'])),A[O(0x179)]['push'](query[O(0x17a)]['toLowerCase']()+'%'),A['sql']+=(A['sql']?O(0x175):'\x20WHERE\x20')+('\x20('+V?.['map'](h=>'lower('+qt(h)+')\x20LIKE\x20$'+A['values']['length'])['join']('\x20OR\x20')+')'));const M=q['joins']?.['filter'](h=>h['scope']!==O(0x17b))[O(0x17c)](h=>h['sql']+'\x20')[O(0x17d)]('\x20')||'',U='SELECT\x20'+readableFields(q,O(0x17e))['join'](',\x20')+'\x20'+('FROM\x20'+qt(q[O(0x17f)])+'\x20t\x20')+(M+'\x20'+A[O(0x174)]+'\x20'+u+'\x20')+('LIMIT\x20$'+(A['values']['length']+0x1)+'\x20')+(O(0x180)+(A['values']['length']+0x2)),t='SELECT\x20COUNT(*)::int\x20AS\x20total\x20'+('FROM\x20'+qt(q[O(0x17f)])+O(0x181))+(M+'\x20'+A['sql']),[z,J]=await Promise[O(0x17e)]([i['pg']['query'](U,[...A[O(0x179)],X,f]),i['pg'][O(0x182)](t,A['values'])]),p=z['rows'];return await addDictionaryLookupData(p,q[O(0x183)],i[O(0x184)]),await addTableLookupData(p,q['fields'],i['pg']),addFileToken(p,q['fields'],i['file']),{'limit':X,'offset':f,'count':z['rowCount'],'total':J[O(0x185)][0x0]?.['total']??0x0,'time':Date['now']()-B,'rows':p};};}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResourceDependencies } from "../resource.types.js";
|
|
2
|
+
type Field = {
|
|
3
|
+
name: string;
|
|
4
|
+
title: string | null | undefined;
|
|
5
|
+
};
|
|
6
|
+
export declare function getTableColumns(table: string, deps: ResourceDependencies): Promise<Field[]>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=get-table-columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-table-columns.d.ts","sourceRoot":"","sources":["../../../../src/plugins/resource/services/get-table-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,KAAK,EAAE,CAAC,CAoBlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function S(i,n){i=i-0x93;const x=v();let N=x[i];return N;}function v(){const B=['query','then'];v=function(){return B;};return v();}export async function getTableColumns(i,n){const a=S;if(!i)throw new Error('not\x20enough\x20params:\x20table');if(!n?.['pg'])return[];const x=await n['pg'][a(0x93)]('\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',[i])[a(0x94)](N=>N['rows']||[]);return x;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{UnsupportedError,ValidationError}from'../../../errors.js';function
|
|
1
|
+
import{UnsupportedError,ValidationError}from'../../../errors.js';function S(i,n){i=i-0x177;const x=v();let N=x[i];return N;}import{createUpdate}from'./update.js';function v(){const t=['get','relations','foreignKey'];v=function(){return t;};return v();}export function createUpdateRelation(i,n){const x=createUpdate(i,n);return async function N({name:a,id:B,relation:q,relationId:X,data:f,user:A},u){const U=S,V=n[U(0x177)](a),M=V[U(0x178)]?.[q];if(!M?.['resource']||!M['foreignKey'])throw new UnsupportedError('Relation\x20update\x20is\x20not\x20configured:\x20'+q);if(Object['hasOwn'](f,M['foreignKey'])&&f[M[U(0x179)]]!==B)throw new ValidationError('Cannot\x20change\x20relation:\x20'+M['foreignKey']);return x({'name':M['resource'],'id':X,'data':f,'user':A,'where':{'column':M['foreignKey'],'value':B}},u);};}
|
|
@@ -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
|
|
1
|
+
function S(i,n){i=i-0xdc;const x=v();let N=x[i];return N;}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';import{clearTableLookupCache}from'./add-table-lookup-data.js';function v(){const m=['get','No\x20writable\x20fields','fields','updated_by','user_type','\x20=\x20$','\x20AND\x20','where','query','join','map'];v=function(){return m;};return v();}export function createUpdate(i,n){return async function x({name:N,id:a,data:B,user:q,where:X},f){const O=S,A=n[O(0xdc)](N);assertOperation(A,'update',q);const u=writableData(A,B);if(!u['length'])throw new ValidationError(O(0xdd));const V=f?.['pg']??i['pg'];validateInputData({'resource':A,'data':B,'update':!![]});A[O(0xde)]['updated_at']&&u['push'](['updated_at',new Date()]);A['fields']['updated_by']&&u['push']([O(0xdf),q?.['id']]);delete B[O(0xe0)];const M=u['map'](([p],h)=>qi(p)+O(0xe1)+(h+0x1)),U=[...u['map'](([,p])=>p),a];let t='WHERE\x20'+qi(A['key'])+O(0xe1)+U['length'];X&&(U['push'](X['value']),t+=O(0xe2)+qi(X['column'])+'\x20=\x20$'+U['length']);A['where']&&(t+='\x20AND\x20('+A[O(0xe3)]+')');const z=await V[O(0xe4)]('UPDATE\x20'+qt(A['table'])+'\x20'+('SET\x20'+M[O(0xe5)](',\x20')+'\x20')+(t+'\x20')+('RETURNING\x20'+Object['keys'](B)[O(0xe6)](qi)['join'](',\x20')),U),J=z['rows'][0x0];if(!J)throw new NotFoundError(N+':'+a);return clearTableLookupCache(A['table'],V),await(f?.['audit']??i['audit'])?.['write']({'userId':q?.['id'],'module':A['module'],'resource':A['name'],'resourceId':a,'action':'update','fields':Object['keys'](B)}),J;};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{qi,qt}from'./sql.js';const requestedIndexes=new WeakMap();export function autoIndex(i,n,x='btree',N){const f=S,a=requestedIndexes['get'](N)??new Set();requestedIndexes['set'](N,a);const B=i+':'+n+':'+x;if(a[f(0xf9)](B))return;a['add'](B),void ensureIndex(i,n,x,N)[f(0xfa)](()=>{a['delete'](B);});}async function ensureIndex(i,n,x,N){const A=S,a=i['split']('.'),B=a['length']===0x2?a[0x0]:A(0xfb),q=(i+'_'+n+'_'+x+'_idx')['replace'](/[^A-Za-z0-9_]/g,'_'),X=await N['query'](A(0xfc),[B,q]);if(X['rowCount'])return;if(x==='text'){await N['query']('CREATE\x20EXTENSION\x20IF\x20NOT\x20EXISTS\x20pg_trgm'),await N['query'](A(0xfd)+qi(q+'_l')+'\x20ON\x20'+qt(i)+A(0xfe)+qi(n)+')\x20text_pattern_ops)'),await N['query'](A(0xfd)+qi(q)+A(0xff)+qt(i)+'\x20USING\x20gin\x20(lower('+qi(n)+')\x20gin_trgm_ops)');return;}await N['query'](A(0xfd)+qi(q)+'\x20ON\x20'+qt(i)+'\x20USING\x20'+x+'\x20('+qi(n)+')');}function S(i,n){i=i-0xf9;const x=v();let N=x[i];return N;}function v(){const u=['has','catch','public','SELECT\x201\x20FROM\x20pg_indexes\x20WHERE\x20schemaname\x20=\x20$1\x20AND\x20indexname\x20=\x20$2','CREATE\x20INDEX\x20IF\x20NOT\x20EXISTS\x20','\x20USING\x20btree\x20(lower(','\x20ON\x20'];v=function(){return u;};return v();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{ValidationError}from'../../../errors.js';export{readableFields,writableData,fieldColumn}from'./sql.js';function v(){const B=['required','writable','hasOwn','string','length','\x20should\x20be\x20>=\x20','maximum','enum','test','\x20should\x20match\x20regular\x20expression\x20('];v=function(){return B;};return v();}function S(i,n){i=i-0x11b;const x=v();let N=x[i];return N;}const validateInputData=({resource:i,data:n,update:update=![]})=>{const a=S;for(const [x,N]of Object['entries'](i['fields'])){if(N['required']&&N['writable']!==![]&&(n[x]===undefined||n[x]===null)&&!update)throw new ValidationError('Required\x20field:\x20'+x);if(N[a(0x11b)]&&N[a(0x11c)]!==![]&&Object[a(0x11d)](n,x)&&(n[x]===undefined||n[x]===null)&&update)throw new ValidationError('Required\x20field:\x20'+x);if(N['minLength']&&typeof n[x]===a(0x11e)&&n[x][a(0x11f)]<N['minLength'])throw new ValidationError('minLength\x20not\x20met:\x20'+x);if(N['maxLength']&&typeof n[x]==='string'&&n[x][a(0x11f)]>N['maxLength'])throw new ValidationError('maxLength\x20exceeded:\x20'+x);if(N['minimum']&&typeof n[x]==='number'&&n[x]<N['minimum'])throw new ValidationError(x+a(0x120)+N['minimum']);if(N[a(0x121)]&&typeof n[x]==='number'&&n[x]>N['maximum'])throw new ValidationError(x+'\x20should\x20be\x20<=\x20'+N['maximum']);if(N['enum']&&n[x]&&!N['enum']['includes'](n[x]))throw new ValidationError(x+'\x20should\x20be\x20one\x20of\x20('+N[a(0x122)]['join'](',\x20')+')');if(N['pattern']&&typeof n[x]==='string'&&!new RegExp(N['pattern'])[a(0x123)](n[x]))throw new ValidationError(x+a(0x124)+N['pattern']+')');}};export{validateInputData};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const J=S;import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';import{autoIndex}from'./auto-index.js';function S(i,n){i=i-0x13f;const x=v();let N=x[i];return N;}const filterOperators=new Set(['eq','ne','gt',J(0x13f),'lt','lte','in','nin',J(0x140),J(0x141),'null']);function v(){const P=['gte','like','ilike','filter','Unsupported\x20filter\x20operator:\x20','string','split','entries','has','\x20requires\x20a\x20text\x20field:\x20','push','<>\x20ALL','lower(',')\x20like\x20lower(','join','\x20AND\x20','object','geom','geometry'];v=function(){return P;};return v();}export function parseFilterQuery(i){const p=J,n={...isRecord(i[p(0x142)])?i['filter']:{}};for(const [x,N]of Object['entries'](i)){const a=/^filter\[([^\]]+)\](?:\[([^\]]+)\])?$/['exec'](x);if(!a)continue;const [,B,q]=a;if(!B)continue;if(!q){n[B]=N;continue;}if(!filterOperators['has'](q))throw new ValidationError(p(0x143)+q);const X=isRecord(n[B])?n[B]:{};X[q]=(q==='in'||q==='nin')&&typeof N===p(0x144)?N[p(0x145)](','):N,n[B]=X;}return Object['keys'](n)['length']?n:undefined;}export function buildFilters(i,n,x=0x1,N){const h=J,a=[],B=[];for(const [q,X]of Object['entries'](n??{})){const f=i['fields'][q];if(!f||f['filter']!==!![]&&f['filterable']!==!![])throw new ValidationError('Field\x20is\x20not\x20filterable:\x20'+q);const A=qi(fieldColumn(i,q)),u=isRecord(X)?X:{'eq':X};for(const [V,M]of Object[h(0x146)](u)){if(!filterOperators[h(0x147)](V))throw new ValidationError('Unsupported\x20filter\x20operator:\x20'+V);if((V==='like'||V==='ilike')&&f['type']!=='string'&&f['type']!=='text')throw new ValidationError('Operator\x20'+V+h(0x148)+q);N&&autoIndex(i['table'],fieldColumn(i,q),indexTypeFor(f['type'],V),N);if(V==='null'){a['push'](A+'\x20IS\x20'+(isTruthy(M)?'':'NOT\x20')+'NULL');continue;}if(V==='in'||V==='nin'){const z=Array['isArray'](M)?M:[M];if(z['length']===0x0){a['push'](V==='in'?'FALSE':'TRUE');continue;}B[h(0x149)](z),a['push'](A+'\x20'+(V==='in'?'=\x20ANY':h(0x14a))+'($'+(x+B['length']-0x1)+')');continue;}const U={'eq':'=','ne':'<>','gt':'>','gte':'>=','lt':'<','lte':'<=','like':'like'},t='$'+(x+B['length']);if(V==='like'){B['push'](M+'%'),a['push'](h(0x14b)+A+h(0x14c)+t+')');continue;}B['push'](M),a['push'](A+'\x20'+U[V]+'\x20'+t);}}return{'sql':a['length']?'\x20WHERE\x20'+a[h(0x14d)](h(0x14e)):'','values':B};}function isRecord(i){const O=J;return typeof i===O(0x14f)&&i!==null&&!Array['isArray'](i);}function isTruthy(i){return i===!![]||i==='true'||i==='1'||i===0x1;}function indexTypeFor(i,n){const m=J;if(n==='like'||n==='ilike')return'text';if(i===m(0x150)||i===m(0x151))return'gist';return'btree';}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{ForbiddenError}from'../../../errors.js';import{getContext}from'../../../index.js';function v(){const q=['public','admin','Admin\x20access\x20required','Missing\x20permission:\x20'];v=function(){return q;};return v();}function S(i,n){i=i-0x191;const x=v();let N=x[i];return N;}export function assertOperation(i,n,x){const B=S,N=getContext()['config'];if(N['debug'])return;if(!i['operations']['includes'](n))throw new ForbiddenError(i['name']+'.'+n+'\x20is\x20disabled');if(i['access']!==B(0x191)&&x===undefined)throw new ForbiddenError('Authentication\x20required');if(i['access']===B(0x192)&&x?.['type']!=='admin')throw new ForbiddenError(B(0x193));if(x?.['type']!==B(0x192)){const a=(i['permission']??i['name'])+':'+n;if(!x?.['permissions']?.['includes'](a))throw new ForbiddenError(B(0x194)+a);}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';function
|
|
1
|
+
import{fieldColumn,qi}from'./sql.js';import{ValidationError}from'../../../errors.js';function v(){const A=['length','Field\x20is\x20not\x20sortable:\x20'];v=function(){return A;};return v();}function S(i,n){i=i-0x122;const x=v();let N=x[i];return N;}export function buildSort(i,n){const X=S;if(!n?.[X(0x122)])return'';typeof n==='string'&&(n=[n]);const x=n['map'](N=>{const f=X,a=N['startsWith']('-'),B=a?N['slice'](0x1):N,q=i['fields'][B];if(!q||q['sortable']!==!![])throw new ValidationError(f(0x123)+B);return qi(fieldColumn(i,B))+'\x20'+(a?'DESC':'ASC');});return'\x20ORDER\x20BY\x20'+x['join'](',\x20');}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const q=S;import{ValidationError}from'../../../errors.js';export const quoteIdentifier=i=>'\x22'+i[q(0x199)](/"/g,'\x22\x22')+'\x22';export const quoteTable=i=>i[q(0x19a)]('.')['map'](quoteIdentifier)['join']('.');function v(){const A=['replace','split','key','fields','\x20AS\x20'];v=function(){return A;};return v();}function S(i,n){i=i-0x199;const x=v();let N=x[i];return N;}export function fieldColumn(i,n){const X=q;if(n===i['key'])return i[X(0x19b)];const x=i[X(0x19c)][n];if(!x)throw new ValidationError('Unknown\x20field:\x20'+n);return x['column']??n;}export function readableFields(i,n){const f=q,x=Object['entries'](i['fields'])['filter'](([,N])=>N['read']!==![]&&N['readable']!==![]&&(n?(N['scope']??'all')===n:!![]))['map'](([N,a])=>quoteIdentifier(a['column']??N)+f(0x19d)+quoteIdentifier(N));return!i['fields'][i['key']]&&x['unshift'](quoteIdentifier(i['key'])),x;}export function writableData(i,n){const x=[];for(const [N,a]of Object['entries'](n)){const B=i['fields'][N];if(!B||B['write']===![]||B['writable']===![])throw new ValidationError('Field\x20is\x20not\x20writable:\x20'+N);if((B['write']??B['writable'])!==!![])continue;if(B['type']==='date'&&!n[N])continue;x['push']([B['column']??N,a]);}return x;}export const qi=quoteIdentifier;export const qt=quoteTable;
|
package/dist/shared/getIP.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
function S(i,n){i=i-0x19a;const x=v();let N=x[i];return N;}const n=S,getIP=i=>(i['headers']?.['x-real-ip']||i[n(0x19a)]?.[n(0x19b)]||i['ip']||i['connection']?.['remoteAddress']||'')['split'](':')['pop']();function v(){const x=['headers','x-forwarded-for'];v=function(){return x;};return v();}export default getIP;
|
|
@@ -186,7 +186,7 @@ CREATE TABLE IF NOT EXISTS admin.files (
|
|
|
186
186
|
tags text[],
|
|
187
187
|
file_path text,
|
|
188
188
|
field_name text,
|
|
189
|
-
status text DEFAULT 'pending',
|
|
189
|
+
status text DEFAULT 'pending', -- File processing status, e.g., 'pending', 'attached'
|
|
190
190
|
expires_at timestamptz DEFAULT now() + interval '1 day',
|
|
191
191
|
verified boolean DEFAULT false,
|
|
192
192
|
resized boolean,
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
ALTER TABLE admin.users
|
|
2
|
-
ADD CONSTRAINT users_created_by_fkey
|
|
3
|
-
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
4
|
-
ADD CONSTRAINT users_updated_by_fkey
|
|
5
|
-
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
6
|
-
|
|
7
|
-
ALTER TABLE admin.user_roles
|
|
8
|
-
ADD CONSTRAINT user_roles_created_by_fkey
|
|
9
|
-
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
10
|
-
ADD CONSTRAINT user_roles_updated_by_fkey
|
|
11
|
-
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
12
|
-
|
|
13
|
-
ALTER TABLE admin.role_access
|
|
14
|
-
ADD CONSTRAINT role_access_user_uid_fkey
|
|
15
|
-
FOREIGN KEY (user_uid) REFERENCES admin.users(uid) ON DELETE CASCADE,
|
|
16
|
-
ADD CONSTRAINT role_access_created_by_fkey
|
|
17
|
-
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
18
|
-
ADD CONSTRAINT role_access_updated_by_fkey
|
|
19
|
-
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
20
|
-
|
|
21
|
-
ALTER TABLE admin.dictionaries
|
|
22
|
-
ADD CONSTRAINT dictionaries_created_by_fkey
|
|
23
|
-
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
24
|
-
ADD CONSTRAINT dictionaries_updated_by_fkey
|
|
25
|
-
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
26
|
-
|
|
27
|
-
ALTER TABLE admin.notes
|
|
28
|
-
ADD CONSTRAINT notes_created_by_fkey
|
|
29
|
-
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
30
|
-
ADD CONSTRAINT notes_updated_by_fkey
|
|
31
|
-
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
32
|
-
|
|
33
|
-
ALTER TABLE admin.files
|
|
34
|
-
ADD CONSTRAINT files_created_by_fkey
|
|
35
|
-
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
36
|
-
ADD CONSTRAINT files_updated_by_fkey
|
|
37
|
-
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
38
|
-
|
|
39
|
-
ALTER TABLE admin.settings
|
|
40
|
-
ADD CONSTRAINT settings_created_by_fkey
|
|
41
|
-
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
42
|
-
ADD CONSTRAINT settings_updated_by_fkey
|
|
1
|
+
ALTER TABLE admin.users
|
|
2
|
+
ADD CONSTRAINT users_created_by_fkey
|
|
3
|
+
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
4
|
+
ADD CONSTRAINT users_updated_by_fkey
|
|
5
|
+
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
6
|
+
|
|
7
|
+
ALTER TABLE admin.user_roles
|
|
8
|
+
ADD CONSTRAINT user_roles_created_by_fkey
|
|
9
|
+
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
10
|
+
ADD CONSTRAINT user_roles_updated_by_fkey
|
|
11
|
+
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
12
|
+
|
|
13
|
+
ALTER TABLE admin.role_access
|
|
14
|
+
ADD CONSTRAINT role_access_user_uid_fkey
|
|
15
|
+
FOREIGN KEY (user_uid) REFERENCES admin.users(uid) ON DELETE CASCADE,
|
|
16
|
+
ADD CONSTRAINT role_access_created_by_fkey
|
|
17
|
+
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
18
|
+
ADD CONSTRAINT role_access_updated_by_fkey
|
|
19
|
+
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
20
|
+
|
|
21
|
+
ALTER TABLE admin.dictionaries
|
|
22
|
+
ADD CONSTRAINT dictionaries_created_by_fkey
|
|
23
|
+
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
24
|
+
ADD CONSTRAINT dictionaries_updated_by_fkey
|
|
25
|
+
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
26
|
+
|
|
27
|
+
ALTER TABLE admin.notes
|
|
28
|
+
ADD CONSTRAINT notes_created_by_fkey
|
|
29
|
+
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
30
|
+
ADD CONSTRAINT notes_updated_by_fkey
|
|
31
|
+
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
32
|
+
|
|
33
|
+
ALTER TABLE admin.files
|
|
34
|
+
ADD CONSTRAINT files_created_by_fkey
|
|
35
|
+
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
36
|
+
ADD CONSTRAINT files_updated_by_fkey
|
|
37
|
+
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
|
38
|
+
|
|
39
|
+
ALTER TABLE admin.settings
|
|
40
|
+
ADD CONSTRAINT settings_created_by_fkey
|
|
41
|
+
FOREIGN KEY (created_by) REFERENCES admin.users(uid) ON DELETE SET NULL,
|
|
42
|
+
ADD CONSTRAINT settings_updated_by_fkey
|
|
43
43
|
FOREIGN KEY (updated_by) REFERENCES admin.users(uid) ON DELETE SET NULL;
|
package/package.json
CHANGED
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@opengis/fcore",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
4
|
-
"description": "Reusable backend foundation for OpenGIS Node.js applications",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"files": [
|
|
9
|
-
"dist",
|
|
10
|
-
"migrations",
|
|
11
|
-
"README.md",
|
|
12
|
-
"LICENSE"
|
|
13
|
-
],
|
|
14
|
-
"exports": {
|
|
15
|
-
".": {
|
|
16
|
-
"types": "./dist/index.d.ts",
|
|
17
|
-
"import": "./dist/index.js"
|
|
18
|
-
},
|
|
19
|
-
"./fastify": {
|
|
20
|
-
"types": "./dist/fastify.d.ts",
|
|
21
|
-
"import": "./dist/fastify.js"
|
|
22
|
-
},
|
|
23
|
-
"./migrate": {
|
|
24
|
-
"types": "./dist/migrations/runner.d.ts",
|
|
25
|
-
"import": "./dist/migrations/runner.js"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
"bin": {
|
|
29
|
-
"fcore-migrate": "./dist/migrations/cli.js",
|
|
30
|
-
"fcore-adduser": "./dist/modules/auth/adduser-cli.js",
|
|
31
|
-
"fcore-passwd": "./dist/modules/auth/passwd-cli.js",
|
|
32
|
-
"fcore-permission": "./dist/modules/auth/permission-cli.js"
|
|
33
|
-
},
|
|
34
|
-
"scripts": {
|
|
35
|
-
"clean": "rm -rf dist",
|
|
36
|
-
"build": "npm run clean && tsc -p tsconfig.json && node scripts/obfuscate.mjs",
|
|
37
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
|
-
"test": "node --test --import tsx test/**/*.test.ts",
|
|
39
|
-
"test-env": "node --env-file=.env.test --test --import tsx test/**/env.test.ts",
|
|
40
|
-
"dev": "bun ./server.ts",
|
|
41
|
-
"adduser": "node --import tsx ./src/modules/auth/adduser-cli.ts",
|
|
42
|
-
"passwd": "node --import tsx ./src/modules/auth/passwd-cli.ts",
|
|
43
|
-
"permission": "node --import tsx ./src/modules/auth/permission-cli.ts",
|
|
44
|
-
"migrate": "node --import tsx src/migrations/cli.ts",
|
|
45
|
-
"migration-test": "node --env-file=.env.test --import tsx src/migrations/cli.ts",
|
|
46
|
-
"prepublishOnly": "npm run build",
|
|
47
|
-
"prepublishOnly1": "npm run build && npm test",
|
|
48
|
-
"patch": "npm version patch && git push && npm publish",
|
|
49
|
-
"minor": "npm version minor && git push && npm publish",
|
|
50
|
-
"major": "npm version major && git push && npm publish"
|
|
51
|
-
},
|
|
52
|
-
"engines": {
|
|
53
|
-
"node": ">=20"
|
|
54
|
-
},
|
|
55
|
-
"dependencies": {
|
|
56
|
-
"@aws-sdk/client-s3": "3.1125.0",
|
|
57
|
-
"@aws-sdk/lib-storage": "3.1125.0",
|
|
58
|
-
"@fastify/cookie": "11.1.2",
|
|
59
|
-
"@fastify/multipart": "10.1.1",
|
|
60
|
-
"@fastify/passport": "4.0.2",
|
|
61
|
-
"@fastify/rate-limit": "11.2.0",
|
|
62
|
-
"@fastify/session": "11.1.2",
|
|
63
|
-
"@sinclair/typebox": "^0.34.52",
|
|
64
|
-
"apache-crypt": "1.2.6",
|
|
65
|
-
"dotenv": "17.4.2",
|
|
66
|
-
"fastify-session-redis-store": "7.1.2",
|
|
67
|
-
"file-type": "22.0.2",
|
|
68
|
-
"ioredis": "6.0.0",
|
|
69
|
-
"jose": "^6.2.12",
|
|
70
|
-
"otplib": "13.5.0",
|
|
71
|
-
"pg": "8.23.0",
|
|
72
|
-
"pino": "10.3.1",
|
|
73
|
-
"pino-abstract-transport": "3.0.0",
|
|
74
|
-
"qrcode": "1.5.4",
|
|
75
|
-
"sharp": "0.35.4"
|
|
76
|
-
},
|
|
77
|
-
"peerDependencies": {
|
|
78
|
-
"fastify": ">=5.12.1"
|
|
79
|
-
},
|
|
80
|
-
"devDependencies": {
|
|
81
|
-
"@types/node": "22.20.1",
|
|
82
|
-
"@types/passport": "1.0.17",
|
|
83
|
-
"@types/passport-local": "1.0.38",
|
|
84
|
-
"@types/pg": "8.23.1",
|
|
85
|
-
"@types/qrcode": "1.5.6",
|
|
86
|
-
"fastify": "5.12.1",
|
|
87
|
-
"javascript-obfuscator": "5.6.0",
|
|
88
|
-
"tsx": "4.23.13",
|
|
89
|
-
"typescript": "7.0.2",
|
|
90
|
-
"vitest": "4.1.11"
|
|
91
|
-
},
|
|
92
|
-
"license": "UNLICENSED"
|
|
93
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@opengis/fcore",
|
|
3
|
+
"version": "0.0.1-beta.23",
|
|
4
|
+
"description": "Reusable backend foundation for OpenGIS Node.js applications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"migrations",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./fastify": {
|
|
20
|
+
"types": "./dist/fastify.d.ts",
|
|
21
|
+
"import": "./dist/fastify.js"
|
|
22
|
+
},
|
|
23
|
+
"./migrate": {
|
|
24
|
+
"types": "./dist/migrations/runner.d.ts",
|
|
25
|
+
"import": "./dist/migrations/runner.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"bin": {
|
|
29
|
+
"fcore-migrate": "./dist/migrations/cli.js",
|
|
30
|
+
"fcore-adduser": "./dist/modules/auth/adduser-cli.js",
|
|
31
|
+
"fcore-passwd": "./dist/modules/auth/passwd-cli.js",
|
|
32
|
+
"fcore-permission": "./dist/modules/auth/permission-cli.js"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"clean": "rm -rf dist",
|
|
36
|
+
"build": "npm run clean && tsc -p tsconfig.json && node scripts/obfuscate.mjs",
|
|
37
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
|
+
"test": "node --test --import tsx test/**/*.test.ts",
|
|
39
|
+
"test-env": "node --env-file=.env.test --test --import tsx test/**/env.test.ts",
|
|
40
|
+
"dev": "bun ./server.ts",
|
|
41
|
+
"adduser": "node --import tsx ./src/modules/auth/adduser-cli.ts",
|
|
42
|
+
"passwd": "node --import tsx ./src/modules/auth/passwd-cli.ts",
|
|
43
|
+
"permission": "node --import tsx ./src/modules/auth/permission-cli.ts",
|
|
44
|
+
"migrate": "node --import tsx src/migrations/cli.ts",
|
|
45
|
+
"migration-test": "node --env-file=.env.test --import tsx src/migrations/cli.ts",
|
|
46
|
+
"prepublishOnly": "npm run build",
|
|
47
|
+
"prepublishOnly1": "npm run build && npm test",
|
|
48
|
+
"patch": "npm version patch && git push && npm publish",
|
|
49
|
+
"minor": "npm version minor && git push && npm publish",
|
|
50
|
+
"major": "npm version major && git push && npm publish"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=20"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@aws-sdk/client-s3": "3.1125.0",
|
|
57
|
+
"@aws-sdk/lib-storage": "3.1125.0",
|
|
58
|
+
"@fastify/cookie": "11.1.2",
|
|
59
|
+
"@fastify/multipart": "10.1.1",
|
|
60
|
+
"@fastify/passport": "4.0.2",
|
|
61
|
+
"@fastify/rate-limit": "11.2.0",
|
|
62
|
+
"@fastify/session": "11.1.2",
|
|
63
|
+
"@sinclair/typebox": "^0.34.52",
|
|
64
|
+
"apache-crypt": "1.2.6",
|
|
65
|
+
"dotenv": "17.4.2",
|
|
66
|
+
"fastify-session-redis-store": "7.1.2",
|
|
67
|
+
"file-type": "22.0.2",
|
|
68
|
+
"ioredis": "6.0.0",
|
|
69
|
+
"jose": "^6.2.12",
|
|
70
|
+
"otplib": "13.5.0",
|
|
71
|
+
"pg": "8.23.0",
|
|
72
|
+
"pino": "10.3.1",
|
|
73
|
+
"pino-abstract-transport": "3.0.0",
|
|
74
|
+
"qrcode": "1.5.4",
|
|
75
|
+
"sharp": "0.35.4"
|
|
76
|
+
},
|
|
77
|
+
"peerDependencies": {
|
|
78
|
+
"fastify": ">=5.12.1"
|
|
79
|
+
},
|
|
80
|
+
"devDependencies": {
|
|
81
|
+
"@types/node": "22.20.1",
|
|
82
|
+
"@types/passport": "1.0.17",
|
|
83
|
+
"@types/passport-local": "1.0.38",
|
|
84
|
+
"@types/pg": "8.23.1",
|
|
85
|
+
"@types/qrcode": "1.5.6",
|
|
86
|
+
"fastify": "5.12.1",
|
|
87
|
+
"javascript-obfuscator": "5.6.0",
|
|
88
|
+
"tsx": "4.23.13",
|
|
89
|
+
"typescript": "7.0.2",
|
|
90
|
+
"vitest": "4.1.11"
|
|
91
|
+
},
|
|
92
|
+
"license": "UNLICENSED"
|
|
93
|
+
}
|