sonamu 0.5.0 → 0.5.1
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/api/context.d.ts +4 -1
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +1 -1
- package/dist/api/decorators.js.map +1 -1
- package/dist/api/sonamu.d.ts +7 -6
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +1 -1
- package/dist/api/sonamu.js.map +1 -1
- package/dist/bin/build-config.d.ts +4 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +1 -1
- package/dist/bin/build-config.js.map +1 -1
- package/dist/bin/cli-wrapper.js +1 -1
- package/dist/bin/cli-wrapper.js.map +1 -1
- package/dist/bin/cli.js +1 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/database/base-model.d.ts +8 -1
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +1 -1
- package/dist/database/base-model.js.map +1 -1
- package/dist/database/db.js +1 -1
- package/dist/database/db.js.map +1 -1
- package/dist/file-storage/driver.d.ts +3 -0
- package/dist/file-storage/driver.d.ts.map +1 -1
- package/dist/file-storage/driver.js +1 -1
- package/dist/file-storage/driver.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stream/index.d.ts +2 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +2 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/sse.d.ts +13 -0
- package/dist/stream/sse.d.ts.map +1 -0
- package/dist/stream/sse.js +2 -0
- package/dist/stream/sse.js.map +1 -0
- package/dist/types/types.d.ts +5 -3
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js.map +1 -1
- package/package.json +6 -4
- package/src/api/context.ts +10 -5
- package/src/api/decorators.ts +1 -3
- package/src/api/sonamu.ts +60 -26
- package/src/bin/build-config.ts +5 -0
- package/src/bin/cli-wrapper.ts +20 -6
- package/src/bin/cli.ts +16 -21
- package/src/database/base-model.ts +29 -3
- package/src/database/db.ts +1 -1
- package/src/file-storage/driver.ts +10 -0
- package/src/index.ts +1 -0
- package/src/stream/index.ts +1 -0
- package/src/stream/sse.ts +49 -0
- package/src/types/types.ts +10 -4
- package/tsconfig.json +4 -0
- package/dist/api/sonamu.types.d.ts +0 -30
- package/dist/api/sonamu.types.d.ts.map +0 -1
- package/dist/api/sonamu.types.js +0 -2
- package/dist/api/sonamu.types.js.map +0 -1
- package/dist/base-model-CEB0H0aO.d.mts +0 -43
- package/dist/base-model-CrqDMYhI.d.ts +0 -43
- package/dist/bin/cli-wrapper.d.mts +0 -1
- package/dist/bin/cli-wrapper.mjs +0 -43
- package/dist/bin/cli-wrapper.mjs.map +0 -1
- package/dist/bin/cli.d.mts +0 -2
- package/dist/bin/cli.mjs +0 -907
- package/dist/bin/cli.mjs.map +0 -1
- package/dist/chunk-2WAC2GER.js +0 -7625
- package/dist/chunk-2WAC2GER.js.map +0 -1
- package/dist/chunk-C3IPIF6O.mjs +0 -1581
- package/dist/chunk-C3IPIF6O.mjs.map +0 -1
- package/dist/chunk-EXHKSVTE.js +0 -280
- package/dist/chunk-EXHKSVTE.js.map +0 -1
- package/dist/chunk-FCERKIIF.mjs +0 -7623
- package/dist/chunk-FCERKIIF.mjs.map +0 -1
- package/dist/chunk-HGIBJYOU.mjs +0 -231
- package/dist/chunk-HGIBJYOU.mjs.map +0 -1
- package/dist/chunk-JKSOJRQA.mjs +0 -280
- package/dist/chunk-JKSOJRQA.mjs.map +0 -1
- package/dist/chunk-OTKKFP3Y.js +0 -1581
- package/dist/chunk-OTKKFP3Y.js.map +0 -1
- package/dist/chunk-PTFDTOJU.mjs +0 -19
- package/dist/chunk-PTFDTOJU.mjs.map +0 -1
- package/dist/chunk-UZ2IY5VE.js +0 -231
- package/dist/chunk-UZ2IY5VE.js.map +0 -1
- package/dist/database/drivers/knex/base-model.d.mts +0 -16
- package/dist/database/drivers/knex/base-model.d.ts +0 -16
- package/dist/database/drivers/knex/base-model.js +0 -55
- package/dist/database/drivers/knex/base-model.js.map +0 -1
- package/dist/database/drivers/knex/base-model.mjs +0 -56
- package/dist/database/drivers/knex/base-model.mjs.map +0 -1
- package/dist/database/drivers/kysely/base-model.d.mts +0 -22
- package/dist/database/drivers/kysely/base-model.d.ts +0 -22
- package/dist/database/drivers/kysely/base-model.js +0 -64
- package/dist/database/drivers/kysely/base-model.js.map +0 -1
- package/dist/database/drivers/kysely/base-model.mjs +0 -65
- package/dist/database/drivers/kysely/base-model.mjs.map +0 -1
- package/dist/database/types.d.ts +0 -39
- package/dist/database/types.d.ts.map +0 -1
- package/dist/database/types.js +0 -2
- package/dist/database/types.js.map +0 -1
- package/dist/index.d.mts +0 -813
- package/dist/index.mjs +0 -435
- package/dist/index.mjs.map +0 -1
- package/dist/model-aFgomcdc.d.mts +0 -1112
- package/dist/model-aFgomcdc.d.ts +0 -1112
- package/dist/smd/smd-manager.d.ts +0 -28
- package/dist/smd/smd-manager.d.ts.map +0 -1
- package/dist/smd/smd-manager.js +0 -2
- package/dist/smd/smd-manager.js.map +0 -1
- package/dist/smd/smd.d.ts +0 -40
- package/dist/smd/smd.d.ts.map +0 -1
- package/dist/smd/smd.js +0 -2
- package/dist/smd/smd.js.map +0 -1
package/dist/api/context.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
2
|
import type { RouteGenericInterface } from "fastify/types/route";
|
|
3
|
-
import {
|
|
3
|
+
import type { Server, IncomingMessage, ServerResponse, IncomingHttpHeaders } from "http";
|
|
4
4
|
import type { FileStorage } from "../file-storage/file-storage";
|
|
5
|
+
import type { ZodObject } from "zod";
|
|
6
|
+
import type { createSSEFactory } from "../stream/sse";
|
|
5
7
|
export interface ContextExtend {
|
|
6
8
|
}
|
|
7
9
|
export type Context = {
|
|
8
10
|
request: FastifyRequest;
|
|
9
11
|
reply: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>;
|
|
10
12
|
headers: IncomingHttpHeaders;
|
|
13
|
+
createSSE: <T extends ZodObject>(events: T) => ReturnType<typeof createSSEFactory<T>>;
|
|
11
14
|
} & ContextExtend;
|
|
12
15
|
export type UploadContext = {
|
|
13
16
|
file?: FileStorage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,MAAM,EACN,eAAe,EACf,cAAc,EACd,mBAAmB,EACpB,MAAM,MAAM,CAAC;AACd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,aAAa;CAAG;AACjC,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,YAAY,CACjB,MAAM,EACN,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,OAAO,CACR,CAAC;IACF,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,SAAS,SAAS,EAC7B,MAAM,EAAE,CAAC,KACN,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7C,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAe,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAK7E,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;CACZ;AACD,MAAM,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;AACvC,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,iBAAiB,GACjB,KAAK,GACL,cAAc,CAAC;AACnB,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,WAAW,CAAC,EACR,YAAY,GACZ,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,0BAA0B,CAAC;IAC/B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,eAAO,MAAM,cAAc,EAAE;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC,EAAO,CAAC;AACT,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,cAAc,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;IACzC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;CAC1B,CAAC;AAEF,wBAAgB,GAAG,CAAC,OAAO,GAAE,mBAAwB,IAQlC,QAAQ,MAAM,EAAE,aAAa,MAAM,UAwBrD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,sBAAsB,IACnC,QAAQ,MAAM,EAAE,aAAa,MAAM,UA2BrD;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,IAI5D,SAAS,MAAM,EACf,cAAc,MAAM,EACpB,YAAY,kBAAkB,wBA8CjC;AAED,wBAAgB,MAAM,KAElB,SAAS,MAAM,EACf,cAAc,MAAM,EACpB,YAAY,kBAAkB,
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/api/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAe,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAK7E,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;CACZ;AACD,MAAM,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;AACvC,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,iBAAiB,GACjB,KAAK,GACL,cAAc,CAAC;AACnB,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,WAAW,CAAC,EACR,YAAY,GACZ,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,0BAA0B,CAAC;IAC/B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AACF,eAAO,MAAM,cAAc,EAAE;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC,EAAO,CAAC;AACT,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAC;IAC7B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,cAAc,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC;IACzC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;CAC1B,CAAC;AAEF,wBAAgB,GAAG,CAAC,OAAO,GAAE,mBAAwB,IAQlC,QAAQ,MAAM,EAAE,aAAa,MAAM,UAwBrD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,sBAAsB,IACnC,QAAQ,MAAM,EAAE,aAAa,MAAM,UA2BrD;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,IAI5D,SAAS,MAAM,EACf,cAAc,MAAM,EACpB,YAAY,kBAAkB,wBA8CjC;AAED,wBAAgB,MAAM,KAElB,SAAS,MAAM,EACf,cAAc,MAAM,EACpB,YAAY,kBAAkB,wBAuCjC"}
|
package/dist/api/decorators.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get api(){return api},get registeredApis(){return registeredApis},get stream(){return stream},get transactional(){return transactional},get upload(){return upload}});var _inflection=/*#__PURE__*/_interop_require_default(require("inflection"));var _db=require("../database/db");var _sonamu=require("./sonamu");function _async_iterator(iterable){var method,async,sync,retry=2;for("undefined"!=typeof Symbol&&(async=Symbol.asyncIterator,sync=Symbol.iterator);retry--;){if(async&&null!=(method=iterable[async]))return method.call(iterable);if(sync&&null!=(method=iterable[sync]))return new AsyncFromSyncIterator(method.call(iterable));async="@@asyncIterator",sync="@@iterator"}throw new TypeError("Object is not async iterable")}function AsyncFromSyncIterator(s){function AsyncFromSyncIteratorContinuation(r){if(Object(r)!==r)return Promise.reject(new TypeError(r+" is not an object."));var done=r.done;return Promise.resolve(r.value).then(function(value){return{value:value,done:done}})}return AsyncFromSyncIterator=function(s){this.s=s,this.n=s.next},AsyncFromSyncIterator.prototype={s:null,n:null,next:function(){return AsyncFromSyncIteratorContinuation(this.n.apply(this.s,arguments))},return:function(value){var ret=this.s.return;return void 0===ret?Promise.resolve({value:value,done:!0}):AsyncFromSyncIteratorContinuation(ret.apply(this.s,arguments))},throw:function(value){var thr=this.s.return;return void 0===thr?Promise.reject(value):AsyncFromSyncIteratorContinuation(thr.apply(this.s,arguments))}},new AsyncFromSyncIterator(s)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var registeredApis=[];function api(){var options=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};options=_object_spread({httpMethod:"GET",contentType:"application/json",clients:["axios"]},options);return function(target,propertyKey){var modelName=target.constructor.name.match(/(.+)Class$/)[1];var methodName=propertyKey;var defaultPath="/".concat(_inflection.default.camelize(modelName.replace(/Model$/,"").replace(/Frame$/,""),true),"/").concat(_inflection.default.camelize(propertyKey,true));var existingApi=registeredApis.find(function(api){return api.modelName===modelName&&api.methodName===methodName});if(existingApi){existingApi.options=options}else{var _options_path;registeredApis.push({modelName:modelName,methodName:methodName,path:(_options_path=options.path)!==null&&_options_path!==void 0?_options_path:defaultPath,options:options})}}}function stream(options){return function(target,propertyKey){var modelName=target.constructor.name.match(/(.+)Class$/)[1];var methodName=propertyKey;var defaultPath="/".concat(_inflection.default.camelize(modelName.replace(/Model$/,"").replace(/Frame$/,""),true),"/").concat(_inflection.default.camelize(propertyKey,true));var existingApi=registeredApis.find(function(api){return api.modelName===modelName&&api.methodName===methodName});if(existingApi){existingApi.options=options}else{var _options_path;registeredApis.push({modelName:modelName,methodName:methodName,path:(_options_path=options.path)!==null&&_options_path!==void 0?_options_path:defaultPath,options:_object_spread_props(_object_spread({},options),{httpMethod:"GET"}),streamOptions:options})}}}function transactional(){var options=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};var isolation=options.isolation,readOnly=options.readOnly,_options_dbPreset=options.dbPreset,dbPreset=_options_dbPreset===void 0?"w":_options_dbPreset;return function(_target,_propertyKey,descriptor){var originalMethod=descriptor.value;descriptor.value=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _async_to_generator(function(){var _this,existingContext,startTransaction;return _ts_generator(this,function(_state){_this=this;existingContext=_db.DB.transactionStorage.getStore();if(existingContext){if(existingContext.getTransaction(dbPreset)){return[2,originalMethod.apply(this,args)]}}startTransaction=function(){return _async_to_generator(function(){var _this,puri;return _ts_generator(this,function(_state){_this=this;puri=this.getPuri(dbPreset);return[2,puri.transaction(function(trx){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:_db.DB.getTransactionContext().setTransaction(dbPreset,trx);_state.label=1;case 1:_state.trys.push([1,,3,4]);return[4,originalMethod.apply(this,args)];case 2:return[2,_state.sent()];case 3:_db.DB.getTransactionContext().deleteTransaction(dbPreset);return[7];case 4:return[2]}})}).call(_this)},{isolation:isolation,readOnly:readOnly})]})}).call(_this)};if(!existingContext){return[2,_db.DB.runWithTransaction(startTransaction)]}else{return[2,startTransaction()]}return[2]})}).call(this)};return descriptor}}function upload(){return function(_target,_propertyKey,descriptor){var originalMethod=descriptor.value;descriptor.value=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _async_to_generator(function(){var _this,request,uploadContext,storage,rawFile,FileStorage,FileStorage1,rawFilesIterator,_iteratorAbruptCompletion,_didIteratorError,_iteratorError,_iterator,_step,_value,rawFile1,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;request=_sonamu.Sonamu.getContext().request;uploadContext={file:undefined,files:[]};storage=_sonamu.Sonamu.storage;if(!storage){throw new Error("Storage가 설정되지 않았습니다.")}if(!request.file)return[3,3];return[4,request.file()];case 1:rawFile=_state.sent();if(!rawFile)return[3,3];return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../file-storage/file-storage"))})];case 2:FileStorage=_state.sent().FileStorage;uploadContext.file=new FileStorage(rawFile,storage);_state.label=3;case 3:if(!request.files)return[3,16];return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../file-storage/file-storage"))})];case 4:FileStorage1=_state.sent().FileStorage;rawFilesIterator=request.files();_iteratorAbruptCompletion=false,_didIteratorError=false;_state.label=5;case 5:_state.trys.push([5,10,11,16]);_iterator=_async_iterator(rawFilesIterator);_state.label=6;case 6:return[4,_iterator.next()];case 7:if(!(_iteratorAbruptCompletion=!(_step=_state.sent()).done))return[3,9];_value=_step.value;rawFile1=_value;if(rawFile1){uploadContext.files.push(new FileStorage1(rawFile1,storage))}_state.label=8;case 8:_iteratorAbruptCompletion=false;return[3,6];case 9:return[3,16];case 10:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,16];case 11:_state.trys.push([11,,14,15]);if(!(_iteratorAbruptCompletion&&_iterator.return!=null))return[3,13];return[4,_iterator.return()];case 12:_state.sent();_state.label=13;case 13:return[3,15];case 14:if(_didIteratorError){throw _iteratorError}return[7];case 15:return[7];case 16:return[2,_sonamu.Sonamu.uploadStorage.run({uploadContext:uploadContext},function(){return originalMethod.apply(_this,args)})]}})}).call(this)};return descriptor}}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get api(){return api},get registeredApis(){return registeredApis},get stream(){return stream},get transactional(){return transactional},get upload(){return upload}});var _inflection=/*#__PURE__*/_interop_require_default(require("inflection"));var _db=require("../database/db");var _sonamu=require("./sonamu");function _async_iterator(iterable){var method,async,sync,retry=2;for("undefined"!=typeof Symbol&&(async=Symbol.asyncIterator,sync=Symbol.iterator);retry--;){if(async&&null!=(method=iterable[async]))return method.call(iterable);if(sync&&null!=(method=iterable[sync]))return new AsyncFromSyncIterator(method.call(iterable));async="@@asyncIterator",sync="@@iterator"}throw new TypeError("Object is not async iterable")}function AsyncFromSyncIterator(s){function AsyncFromSyncIteratorContinuation(r){if(Object(r)!==r)return Promise.reject(new TypeError(r+" is not an object."));var done=r.done;return Promise.resolve(r.value).then(function(value){return{value:value,done:done}})}return AsyncFromSyncIterator=function(s){this.s=s,this.n=s.next},AsyncFromSyncIterator.prototype={s:null,n:null,next:function(){return AsyncFromSyncIteratorContinuation(this.n.apply(this.s,arguments))},return:function(value){var ret=this.s.return;return void 0===ret?Promise.resolve({value:value,done:!0}):AsyncFromSyncIteratorContinuation(ret.apply(this.s,arguments))},throw:function(value){var thr=this.s.return;return void 0===thr?Promise.reject(value):AsyncFromSyncIteratorContinuation(thr.apply(this.s,arguments))}},new AsyncFromSyncIterator(s)}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable})}keys.push.apply(keys,symbols)}return keys}function _object_spread_props(target,source){source=source!=null?source:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}return target}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var registeredApis=[];function api(){var options=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};options=_object_spread({httpMethod:"GET",contentType:"application/json",clients:["axios"]},options);return function(target,propertyKey){var modelName=target.constructor.name.match(/(.+)Class$/)[1];var methodName=propertyKey;var defaultPath="/".concat(_inflection.default.camelize(modelName.replace(/Model$/,"").replace(/Frame$/,""),true),"/").concat(_inflection.default.camelize(propertyKey,true));var existingApi=registeredApis.find(function(api){return api.modelName===modelName&&api.methodName===methodName});if(existingApi){existingApi.options=options}else{var _options_path;registeredApis.push({modelName:modelName,methodName:methodName,path:(_options_path=options.path)!==null&&_options_path!==void 0?_options_path:defaultPath,options:options})}}}function stream(options){return function(target,propertyKey){var modelName=target.constructor.name.match(/(.+)Class$/)[1];var methodName=propertyKey;var defaultPath="/".concat(_inflection.default.camelize(modelName.replace(/Model$/,"").replace(/Frame$/,""),true),"/").concat(_inflection.default.camelize(propertyKey,true));var existingApi=registeredApis.find(function(api){return api.modelName===modelName&&api.methodName===methodName});if(existingApi){existingApi.options=options}else{var _options_path;registeredApis.push({modelName:modelName,methodName:methodName,path:(_options_path=options.path)!==null&&_options_path!==void 0?_options_path:defaultPath,options:_object_spread_props(_object_spread({},options),{httpMethod:"GET"}),streamOptions:options})}}}function transactional(){var options=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};var isolation=options.isolation,readOnly=options.readOnly,_options_dbPreset=options.dbPreset,dbPreset=_options_dbPreset===void 0?"w":_options_dbPreset;return function(_target,_propertyKey,descriptor){var originalMethod=descriptor.value;descriptor.value=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _async_to_generator(function(){var _this,existingContext,startTransaction;return _ts_generator(this,function(_state){_this=this;existingContext=_db.DB.transactionStorage.getStore();if(existingContext){if(existingContext.getTransaction(dbPreset)){return[2,originalMethod.apply(this,args)]}}startTransaction=function(){return _async_to_generator(function(){var _this,puri;return _ts_generator(this,function(_state){_this=this;puri=this.getPuri(dbPreset);return[2,puri.transaction(function(trx){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:_db.DB.getTransactionContext().setTransaction(dbPreset,trx);_state.label=1;case 1:_state.trys.push([1,,3,4]);return[4,originalMethod.apply(this,args)];case 2:return[2,_state.sent()];case 3:_db.DB.getTransactionContext().deleteTransaction(dbPreset);return[7];case 4:return[2]}})}).call(_this)},{isolation:isolation,readOnly:readOnly})]})}).call(_this)};if(!existingContext){return[2,_db.DB.runWithTransaction(startTransaction)]}else{return[2,startTransaction()]}return[2]})}).call(this)};return descriptor}}function upload(){return function(_target,_propertyKey,descriptor){var originalMethod=descriptor.value;descriptor.value=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return _async_to_generator(function(){var _this,request,uploadContext,storage,rawFile,FileStorage,FileStorage1,rawFilesIterator,_iteratorAbruptCompletion,_didIteratorError,_iteratorError,_iterator,_step,_value,rawFile1,err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;request=_sonamu.Sonamu.getContext().request;uploadContext={file:undefined,files:[]};storage=_sonamu.Sonamu.storage;if(!storage){throw new Error("Storage가 설정되지 않았습니다.")}if(!request.file)return[3,4];return[4,request.file()];case 1:rawFile=_state.sent();if(!rawFile)return[3,3];return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../file-storage/file-storage"))})];case 2:FileStorage=_state.sent().FileStorage;uploadContext.file=new FileStorage(rawFile,storage);_state.label=3;case 3:return[3,17];case 4:if(!request.files)return[3,17];return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../file-storage/file-storage"))})];case 5:FileStorage1=_state.sent().FileStorage;rawFilesIterator=request.files();_iteratorAbruptCompletion=false,_didIteratorError=false;_state.label=6;case 6:_state.trys.push([6,11,12,17]);_iterator=_async_iterator(rawFilesIterator);_state.label=7;case 7:return[4,_iterator.next()];case 8:if(!(_iteratorAbruptCompletion=!(_step=_state.sent()).done))return[3,10];_value=_step.value;rawFile1=_value;if(rawFile1){uploadContext.files.push(new FileStorage1(rawFile1,storage))}_state.label=9;case 9:_iteratorAbruptCompletion=false;return[3,7];case 10:return[3,17];case 11:err=_state.sent();_didIteratorError=true;_iteratorError=err;return[3,17];case 12:_state.trys.push([12,,15,16]);if(!(_iteratorAbruptCompletion&&_iterator.return!=null))return[3,14];return[4,_iterator.return()];case 13:_state.sent();_state.label=14;case 14:return[3,16];case 15:if(_didIteratorError){throw _iteratorError}return[7];case 16:return[7];case 17:return[2,_sonamu.Sonamu.uploadStorage.run({uploadContext:uploadContext},function(){return originalMethod.apply(_this,args)})]}})}).call(this)};return descriptor}}
|
|
2
2
|
//# sourceMappingURL=decorators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/decorators.ts"],"sourcesContent":["import type { HTTPMethods } from \"fastify\";\nimport inflection from \"inflection\";\nimport type { ApiParam, ApiParamType } from \"../types/types\";\nimport { z } from \"zod\";\nimport { PuriWrapper, TransactionalOptions } from \"../database/puri-wrapper\";\nimport { DB } from \"../database/db\";\nimport { Sonamu } from \"./sonamu\";\nimport type { UploadContext } from \"./context\";\n\nexport interface GuardKeys {\n query: true;\n admin: true;\n user: true;\n}\nexport type GuardKey = keyof GuardKeys;\nexport type ServiceClient =\n | \"axios\"\n | \"axios-multipart\"\n | \"swr\"\n | \"window-fetch\";\nexport type ApiDecoratorOptions = {\n httpMethod?: HTTPMethods;\n contentType?:\n | \"text/plain\"\n | \"text/html\"\n | \"text/xml\"\n | \"application/json\"\n | \"application/octet-stream\";\n clients?: ServiceClient[];\n path?: string;\n resourceName?: string;\n guards?: GuardKey[];\n description?: string;\n};\nexport type StreamDecoratorOptions = {\n type: \"sse\"; // | 'ws\n events: z.ZodObject<any>;\n path?: string;\n resourceName?: string;\n guards?: GuardKey[];\n description?: string;\n};\nexport const registeredApis: {\n modelName: string;\n methodName: string;\n path: string;\n options: ApiDecoratorOptions;\n streamOptions?: StreamDecoratorOptions;\n}[] = [];\nexport type ExtendedApi = {\n modelName: string;\n methodName: string;\n path: string;\n options: ApiDecoratorOptions;\n streamOptions?: StreamDecoratorOptions;\n typeParameters: ApiParamType.TypeParam[];\n parameters: ApiParam[];\n returnType: ApiParamType;\n};\n\nexport function api(options: ApiDecoratorOptions = {}) {\n options = {\n httpMethod: \"GET\",\n contentType: \"application/json\",\n clients: [\"axios\"],\n ...options,\n };\n\n return function (target: Object, propertyKey: string) {\n const modelName = target.constructor.name.match(/(.+)Class$/)![1];\n const methodName = propertyKey;\n\n const defaultPath = `/${inflection.camelize(\n modelName.replace(/Model$/, \"\").replace(/Frame$/, \"\"),\n true\n )}/${inflection.camelize(propertyKey, true)}`;\n\n // 기존 동일한 메서드가 있는지 확인 후 있는 경우 override\n const existingApi = registeredApis.find(\n (api) => api.modelName === modelName && api.methodName === methodName\n );\n if (existingApi) {\n existingApi.options = options;\n } else {\n registeredApis.push({\n modelName,\n methodName,\n path: options.path ?? defaultPath,\n options,\n });\n }\n };\n}\n\nexport function stream(options: StreamDecoratorOptions) {\n return function (target: Object, propertyKey: string) {\n const modelName = target.constructor.name.match(/(.+)Class$/)![1];\n const methodName = propertyKey;\n\n const defaultPath = `/${inflection.camelize(\n modelName.replace(/Model$/, \"\").replace(/Frame$/, \"\"),\n true\n )}/${inflection.camelize(propertyKey, true)}`;\n\n const existingApi = registeredApis.find(\n (api) => api.modelName === modelName && api.methodName === methodName\n );\n if (existingApi) {\n existingApi.options = options;\n } else {\n registeredApis.push({\n modelName,\n methodName,\n path: options.path ?? defaultPath,\n options: {\n ...options,\n httpMethod: \"GET\",\n },\n streamOptions: options,\n });\n }\n };\n}\n\nexport function transactional(options: TransactionalOptions = {}) {\n const { isolation, readOnly, dbPreset = \"w\" } = options;\n\n return function (\n _target: Object,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const existingContext = DB.transactionStorage.getStore();\n\n // 이미 AsyncLocalStorage 컨텍스트 안에 있는지 확인\n if (existingContext) {\n // 해당 preset의 트랜잭션이 이미 있으면 재사용\n if (existingContext.getTransaction(dbPreset)) {\n return originalMethod.apply(this, args);\n }\n }\n\n // AsyncLocalStorage 컨텍스트 없거나 해당 preset의 트랜잭션이 없으면 새로 시작\n const startTransaction = async () => {\n const puri = this.getPuri(dbPreset) as PuriWrapper;\n\n return puri.transaction(\n async (trx: PuriWrapper) => {\n // TransactionContext에 트랜잭션 저장\n DB.getTransactionContext().setTransaction(dbPreset, trx);\n\n try {\n return await originalMethod.apply(this, args);\n } finally {\n // 트랜잭션 제거\n DB.getTransactionContext().deleteTransaction(dbPreset);\n }\n },\n { isolation, readOnly }\n );\n };\n\n // AsyncLocalStorage 컨텍스트가 없으면 새로 생성\n if (!existingContext) {\n return DB.runWithTransaction(startTransaction);\n } else {\n // 컨텍스트는 있지만 이 preset의 트랜잭션은 없는 경우 (같은 컨텍스트 내에서 실행)\n return startTransaction();\n }\n };\n\n return descriptor;\n };\n}\n\nexport function upload() {\n return function (\n _target: Object,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const { request } = Sonamu.getContext();\n const uploadContext: UploadContext = {\n file: undefined,\n files: [],\n };\n\n const storage = Sonamu.storage;\n if (!storage) {\n throw new Error(\"Storage가 설정되지 않았습니다.\");\n }\n\n if (request.file) {\n const rawFile = await request.file();\n if (rawFile) {\n const { FileStorage } = await import(\"../file-storage/file-storage\");\n uploadContext.file = new FileStorage(rawFile, storage);\n }\n }\n\n if (request.files) {\n const { FileStorage } = await import(\"../file-storage/file-storage\");\n const rawFilesIterator = request.files();\n for await (const rawFile of rawFilesIterator) {\n if (rawFile) {\n uploadContext.files.push(new FileStorage(rawFile, storage));\n }\n }\n }\n\n return Sonamu.uploadStorage.run({ uploadContext }, () => {\n return originalMethod.apply(this, args);\n });\n };\n\n return descriptor;\n };\n}\n"],"names":["api","registeredApis","stream","transactional","upload","options","httpMethod","contentType","clients","target","propertyKey","modelName","name","match","methodName","defaultPath","inflection","camelize","replace","existingApi","find","push","path","streamOptions","isolation","readOnly","dbPreset","_target","_propertyKey","descriptor","originalMethod","value","args","existingContext","startTransaction","DB","transactionStorage","getStore","getTransaction","apply","puri","getPuri","transaction","trx","getTransactionContext","setTransaction","deleteTransaction","runWithTransaction","request","uploadContext","storage","rawFile","FileStorage","rawFilesIterator","Sonamu","getContext","file","undefined","files","Error","uploadStorage","run"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/api/decorators.ts"],"sourcesContent":["import type { HTTPMethods } from \"fastify\";\nimport inflection from \"inflection\";\nimport type { ApiParam, ApiParamType } from \"../types/types\";\nimport { z } from \"zod\";\nimport { PuriWrapper, TransactionalOptions } from \"../database/puri-wrapper\";\nimport { DB } from \"../database/db\";\nimport { Sonamu } from \"./sonamu\";\nimport type { UploadContext } from \"./context\";\n\nexport interface GuardKeys {\n query: true;\n admin: true;\n user: true;\n}\nexport type GuardKey = keyof GuardKeys;\nexport type ServiceClient =\n | \"axios\"\n | \"axios-multipart\"\n | \"swr\"\n | \"window-fetch\";\nexport type ApiDecoratorOptions = {\n httpMethod?: HTTPMethods;\n contentType?:\n | \"text/plain\"\n | \"text/html\"\n | \"text/xml\"\n | \"application/json\"\n | \"application/octet-stream\";\n clients?: ServiceClient[];\n path?: string;\n resourceName?: string;\n guards?: GuardKey[];\n description?: string;\n};\nexport type StreamDecoratorOptions = {\n type: \"sse\"; // | 'ws\n events: z.ZodObject<any>;\n path?: string;\n resourceName?: string;\n guards?: GuardKey[];\n description?: string;\n};\nexport const registeredApis: {\n modelName: string;\n methodName: string;\n path: string;\n options: ApiDecoratorOptions;\n streamOptions?: StreamDecoratorOptions;\n}[] = [];\nexport type ExtendedApi = {\n modelName: string;\n methodName: string;\n path: string;\n options: ApiDecoratorOptions;\n streamOptions?: StreamDecoratorOptions;\n typeParameters: ApiParamType.TypeParam[];\n parameters: ApiParam[];\n returnType: ApiParamType;\n};\n\nexport function api(options: ApiDecoratorOptions = {}) {\n options = {\n httpMethod: \"GET\",\n contentType: \"application/json\",\n clients: [\"axios\"],\n ...options,\n };\n\n return function (target: Object, propertyKey: string) {\n const modelName = target.constructor.name.match(/(.+)Class$/)![1];\n const methodName = propertyKey;\n\n const defaultPath = `/${inflection.camelize(\n modelName.replace(/Model$/, \"\").replace(/Frame$/, \"\"),\n true\n )}/${inflection.camelize(propertyKey, true)}`;\n\n // 기존 동일한 메서드가 있는지 확인 후 있는 경우 override\n const existingApi = registeredApis.find(\n (api) => api.modelName === modelName && api.methodName === methodName\n );\n if (existingApi) {\n existingApi.options = options;\n } else {\n registeredApis.push({\n modelName,\n methodName,\n path: options.path ?? defaultPath,\n options,\n });\n }\n };\n}\n\nexport function stream(options: StreamDecoratorOptions) {\n return function (target: Object, propertyKey: string) {\n const modelName = target.constructor.name.match(/(.+)Class$/)![1];\n const methodName = propertyKey;\n\n const defaultPath = `/${inflection.camelize(\n modelName.replace(/Model$/, \"\").replace(/Frame$/, \"\"),\n true\n )}/${inflection.camelize(propertyKey, true)}`;\n\n const existingApi = registeredApis.find(\n (api) => api.modelName === modelName && api.methodName === methodName\n );\n if (existingApi) {\n existingApi.options = options;\n } else {\n registeredApis.push({\n modelName,\n methodName,\n path: options.path ?? defaultPath,\n options: {\n ...options,\n httpMethod: \"GET\",\n },\n streamOptions: options,\n });\n }\n };\n}\n\nexport function transactional(options: TransactionalOptions = {}) {\n const { isolation, readOnly, dbPreset = \"w\" } = options;\n\n return function (\n _target: Object,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const existingContext = DB.transactionStorage.getStore();\n\n // 이미 AsyncLocalStorage 컨텍스트 안에 있는지 확인\n if (existingContext) {\n // 해당 preset의 트랜잭션이 이미 있으면 재사용\n if (existingContext.getTransaction(dbPreset)) {\n return originalMethod.apply(this, args);\n }\n }\n\n // AsyncLocalStorage 컨텍스트 없거나 해당 preset의 트랜잭션이 없으면 새로 시작\n const startTransaction = async () => {\n const puri = this.getPuri(dbPreset) as PuriWrapper;\n\n return puri.transaction(\n async (trx: PuriWrapper) => {\n // TransactionContext에 트랜잭션 저장\n DB.getTransactionContext().setTransaction(dbPreset, trx);\n\n try {\n return await originalMethod.apply(this, args);\n } finally {\n // 트랜잭션 제거\n DB.getTransactionContext().deleteTransaction(dbPreset);\n }\n },\n { isolation, readOnly }\n );\n };\n\n // AsyncLocalStorage 컨텍스트가 없으면 새로 생성\n if (!existingContext) {\n return DB.runWithTransaction(startTransaction);\n } else {\n // 컨텍스트는 있지만 이 preset의 트랜잭션은 없는 경우 (같은 컨텍스트 내에서 실행)\n return startTransaction();\n }\n };\n\n return descriptor;\n };\n}\n\nexport function upload() {\n return function (\n _target: Object,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const { request } = Sonamu.getContext();\n const uploadContext: UploadContext = {\n file: undefined,\n files: [],\n };\n\n const storage = Sonamu.storage;\n if (!storage) {\n throw new Error(\"Storage가 설정되지 않았습니다.\");\n }\n\n if (request.file) {\n const rawFile = await request.file();\n if (rawFile) {\n const { FileStorage } = await import(\"../file-storage/file-storage\");\n uploadContext.file = new FileStorage(rawFile, storage);\n }\n } else if (request.files) {\n const { FileStorage } = await import(\"../file-storage/file-storage\");\n const rawFilesIterator = request.files();\n for await (const rawFile of rawFilesIterator) {\n if (rawFile) {\n uploadContext.files.push(new FileStorage(rawFile, storage));\n }\n }\n }\n\n return Sonamu.uploadStorage.run({ uploadContext }, () => {\n return originalMethod.apply(this, args);\n });\n };\n\n return descriptor;\n };\n}\n"],"names":["api","registeredApis","stream","transactional","upload","options","httpMethod","contentType","clients","target","propertyKey","modelName","name","match","methodName","defaultPath","inflection","camelize","replace","existingApi","find","push","path","streamOptions","isolation","readOnly","dbPreset","_target","_propertyKey","descriptor","originalMethod","value","args","existingContext","startTransaction","DB","transactionStorage","getStore","getTransaction","apply","puri","getPuri","transaction","trx","getTransactionContext","setTransaction","deleteTransaction","runWithTransaction","request","uploadContext","storage","rawFile","FileStorage","rawFilesIterator","Sonamu","getContext","file","undefined","files","Error","uploadStorage","run"],"mappings":"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"}
|
package/dist/api/sonamu.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "async_hooks";
|
|
2
|
-
import {
|
|
3
|
-
import { SonamuDBConfig } from "../database/db";
|
|
4
|
-
import type { ExtendedApi } from "./decorators";
|
|
2
|
+
import type { FSWatcher } from "chokidar";
|
|
5
3
|
import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
|
|
6
4
|
import type { IncomingMessage, Server, ServerResponse } from "http";
|
|
7
|
-
import
|
|
8
|
-
import type { Syncer } from "../syncer/syncer";
|
|
9
|
-
import type { FSWatcher } from "chokidar";
|
|
5
|
+
import { SonamuDBConfig } from "../database/db";
|
|
10
6
|
import type { Driver } from "../file-storage/driver";
|
|
7
|
+
import type { Syncer } from "../syncer/syncer";
|
|
8
|
+
import { SonamuFastifyConfig, SonamuServerOptions } from "../types/types";
|
|
9
|
+
import type { Context, UploadContext } from "./context";
|
|
10
|
+
import type { ExtendedApi } from "./decorators";
|
|
11
11
|
export type SonamuConfig = {
|
|
12
12
|
projectName?: string;
|
|
13
13
|
api: {
|
|
@@ -72,6 +72,7 @@ declare class SonamuClass {
|
|
|
72
72
|
}): Promise<void>;
|
|
73
73
|
getApiHandler(api: ExtendedApi, config: SonamuFastifyConfig): (request: FastifyRequest, reply: FastifyReply) => Promise<unknown>;
|
|
74
74
|
startWatcher(): void;
|
|
75
|
+
runScript(fn: () => Promise<void>): Promise<void>;
|
|
75
76
|
private registerPlugins;
|
|
76
77
|
private boot;
|
|
77
78
|
private handleFileChange;
|
package/dist/api/sonamu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"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"}
|
package/dist/api/sonamu.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Sonamu",{enumerable:true,get:function(){return Sonamu}});var _path=/*#__PURE__*/_interop_require_default(require("path"));var _promises=require("fs/promises");var _fsutils=require("../utils/fs-utils");var _async_hooks=require("async_hooks");var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _fastify=/*#__PURE__*/_interop_require_default(require("fastify"));var _zod=require("zod");var _codeconverters=require("./code-converters");var _soexceptions=require("../exceptions/so-exceptions");var _zoderror=require("../utils/zod-error");var _caster=require("./caster");var _types=require("../types/types");var _controller=require("../utils/controller");var _utils=require("../utils/utils");var _db=require("../database/db");var _knexonduplicateupdate=require("../database/knex-plugins/knex-on-duplicate-update");var _datefnstz=require("date-fns-tz");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var SonamuClass=/*#__PURE__*/function(){"use strict";function SonamuClass(){_class_call_check(this,SonamuClass);_define_property(this,"isInitialized",false);_define_property(this,"asyncLocalStorage",new _async_hooks.AsyncLocalStorage);_define_property(this,"uploadStorage",new _async_hooks.AsyncLocalStorage);_define_property(this,"_apiRootPath",null);_define_property(this,"_dbConfig",null);_define_property(this,"_syncer",null);_define_property(this,"_config",null);_define_property(this,"_secrets",null);_define_property(this,"_storage",null);_define_property(this,"watcher",null);_define_property(this,"pendingFiles",[]);_define_property(this,"hmrStartTime",0);_define_property(this,"server",null)}_create_class(SonamuClass,[{key:"getContext",value:function getContext(){var store=this.asyncLocalStorage.getStore();if(store===null||store===void 0?void 0:store.context){return store.context}throw new Error("Sonamu cannot find context")}},{key:"getUploadContext",value:function getUploadContext(){var store=this.uploadStorage.getStore();if(store===null||store===void 0?void 0:store.uploadContext){return store.uploadContext}throw new Error("Sonamu cannot find upload context. Did you use @upload decorator?")}},{key:"apiRootPath",get:function get(){if(this._apiRootPath===null){throw new Error("Sonamu has not been initialized")}return this._apiRootPath},set:function set(apiRootPath){this._apiRootPath=apiRootPath}},{key:"appRootPath",get:function get(){return this.apiRootPath.split(_path.default.sep).slice(0,-1).join(_path.default.sep)}},{key:"dbConfig",get:function get(){if(this._dbConfig===null){throw new Error("Sonamu has not been initialized")}return this._dbConfig},set:function set(dbConfig){this._dbConfig=dbConfig}},{key:"syncer",get:function get(){if(this._syncer===null){throw new Error("Sonamu has not been initialized")}return this._syncer},set:function set(syncer){this._syncer=syncer}},{key:"config",get:function get(){if(this._config===null){throw new Error("Sonamu has not been initialized")}return this._config},set:function set(config){this._config=config}},{key:"secrets",get:function get(){return this._secrets},set:function set(secrets){this._secrets=secrets}},{key:"storage",get:function get(){return this._storage},set:function set(storage){this._storage=storage}},{key:"initForTesting",value:function initForTesting(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.init(true,false,undefined,true)];case 1:_state.sent();return[2]}})}).call(this)}},{key:"init",value:function init(){var doSilent=arguments.length>0&&arguments[0]!==void 0?arguments[0]:false,enableSync=arguments.length>1&&arguments[1]!==void 0?arguments[1]:true,apiRootPath=arguments.length>2?arguments[2]:void 0,forTesting=arguments.length>3&&arguments[3]!==void 0?arguments[3]:false;return _async_to_generator(function(){var configPath,secretsPath,_,_1,_2,_3,_4,EntityManager,Syncer;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(this.isInitialized){return[2]}!doSilent&&console.time(_chalk.default.cyan("Sonamu.init".concat(forTesting?" for testing":"")));this.apiRootPath=apiRootPath!==null&&apiRootPath!==void 0?apiRootPath:(0,_utils.findApiRootPath)();configPath=_path.default.join(this.apiRootPath,"sonamu.config.json");secretsPath=_path.default.join(this.apiRootPath,"sonamu.secrets.json");return[4,(0,_fsutils.exists)(configPath)];case 1:if(!_state.sent()){throw new Error("Cannot find sonamu.config.json in ".concat(configPath))}_=this;_1=JSON.parse;return[4,(0,_promises.readFile)(configPath)];case 2:_.config=_1.apply(JSON,[_state.sent().toString()]);return[4,(0,_fsutils.exists)(secretsPath)];case 3:if(!_state.sent())return[3,5];_2=this;_3=JSON.parse;return[4,(0,_promises.readFile)(secretsPath)];case 4:_2.secrets=_3.apply(JSON,[_state.sent().toString()]);_state.label=5;case 5:_4=this;return[4,_db.DB.readKnexfile()];case 6:_4.dbConfig=_state.sent();!doSilent&&console.log(_chalk.default.green("DB Config Loaded!"));(0,_knexonduplicateupdate.attachOnDuplicateUpdate)();if(forTesting){this.isInitialized=true;return[2]}return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../entity/entity-manager"))})];case 7:EntityManager=_state.sent().EntityManager;return[4,EntityManager.autoload(doSilent)];case 8:_state.sent();return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../syncer/syncer"))})];case 9:Syncer=_state.sent().Syncer;this.syncer=new Syncer;return[4,this.syncer.autoloadModels()];case 10:_state.sent();return[4,this.syncer.autoloadTypes()];case 11:_state.sent();return[4,this.syncer.autoloadApis()];case 12:_state.sent();if(!((0,_controller.isLocal)()&&!(0,_controller.isTest)()&&enableSync))return[3,14];return[4,this.syncer.sync()];case 13:_state.sent();this.startWatcher();this.syncer.syncUI();_state.label=14;case 14:this.isInitialized=true;!doSilent&&console.timeEnd(_chalk.default.cyan("Sonamu.init"));return[2]}})}).call(this)}},{key:"createServer",value:function createServer(options,initOptions){return _async_to_generator(function(){var server;return _ts_generator(this,function(_state){switch(_state.label){case 0:server=(0,_fastify.default)(options.fastify);this.server=server;if(options.storage){this.storage=options.storage}if(options.plugins){this.registerPlugins(server,options.plugins)}return[4,this.withFastify(server,options.apiConfig,{enableSync:initOptions===null||initOptions===void 0?void 0:initOptions.enableSync,doSilent:initOptions===null||initOptions===void 0?void 0:initOptions.doSilent})];case 1:_state.sent();return[4,this.boot(server,options)];case 2:_state.sent();return[2,server]}})}).call(this)}},{key:"withFastify",value:function withFastify(server,config,options){return _async_to_generator(function(){var _this,timezone,DATE_FORMAT,ISO_DATE_REGEX;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;if(!(this.isInitialized===false))return[3,2];return[4,this.init(options===null||options===void 0?void 0:options.doSilent,options===null||options===void 0?void 0:options.enableSync)];case 1:_state.sent();_state.label=2;case 2:this.server=server;timezone=this.config.timezone;if(timezone){DATE_FORMAT="yyyy-MM-dd'T'HH:mm:ssXXX";ISO_DATE_REGEX=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/;server.setReplySerializer(function(payload){return JSON.stringify(payload,function(_key,value){if(typeof value==="string"&&ISO_DATE_REGEX.test(value)){return(0,_datefnstz.formatInTimeZone)(new Date(value),timezone,DATE_FORMAT)}return value})});!(options===null||options===void 0?void 0:options.doSilent)&&console.log(_chalk.default.green("Timezone set to ".concat(timezone)))}server.get("".concat(this.config.route.prefix,"/routes"),function(_request,_reply){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.syncer.apis]})}).call(_this)});server.get("".concat(this.config.route.prefix,"/healthcheck"),function(_request,_reply){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,"ok"]})})()});if((0,_controller.isLocal)()){server.all("*",function(request,reply){var found=_this.syncer.apis.find(function(api){var _api_options_httpMethod;return _this.config.route.prefix+api.path===request.url.split("?")[0]&&((_api_options_httpMethod=api.options.httpMethod)!==null&&_api_options_httpMethod!==void 0?_api_options_httpMethod:"GET")===request.method.toUpperCase()});if(found){return _this.getApiHandler(found,config)(request,reply)}throw new _soexceptions.NotFoundException("존재하지 않는 API 접근입니다.")})}else{this.syncer.apis.map(function(api){if(_this.syncer.models[api.modelName]===undefined){throw new Error("정의되지 않은 모델에 접근 ".concat(api.modelName))}server.route({method:api.options.httpMethod,url:_this.config.route.prefix+api.path,handler:_this.getApiHandler(api,config)})})}return[2]}})}).call(this)}},{key:"getApiHandler",value:function getApiHandler(api,config){var _this=this;return function(request,reply){return _async_to_generator(function(){var _api_options_guards,ReqType,which,reqBody,_request_which,messages,_api_options_contentType,_ref,cacheKey,cacheTtl,cachedData,context,model;return _ts_generator(this,function(_state){switch(_state.label){case 0:((_api_options_guards=api.options.guards)!==null&&_api_options_guards!==void 0?_api_options_guards:[]).every(function(guard){return config.guardHandler(guard,request,api)});ReqType=(0,_codeconverters.getZodObjectFromApi)(api,this.syncer.types);which=api.options.httpMethod==="GET"?"query":"body";try{;reqBody=(0,_caster.fastifyCaster)(ReqType).parse((_request_which=request[which])!==null&&_request_which!==void 0?_request_which:{})}catch(e){if(_instanceof(e,_zod.ZodError)){messages=(0,_zoderror.humanizeZodError)(e).map(function(issue){return issue.message}).join(" ");throw new _soexceptions.BadRequestException(messages,{zodError:e})}else{throw e}}reply.type((_api_options_contentType=api.options.contentType)!==null&&_api_options_contentType!==void 0?_api_options_contentType:"application/json");return[4,function(){return _async_to_generator(function(){var cacheKeyRes,cacheKey,cacheTtl,cachedData,e;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!config.cache)return[3,5];_state.label=1;case 1:_state.trys.push([1,3,,4]);cacheKeyRes=config.cache.resolveKey(api.path,reqBody);if(cacheKeyRes.cache===false){return[2,{cacheKey:null,cachedData:null}]}cacheKey=cacheKeyRes.key;cacheTtl=cacheKeyRes.ttl;return[4,config.cache.get(cacheKey)];case 2:cachedData=_state.sent();return[2,{cacheKey:cacheKey,cacheTtl:cacheTtl,cachedData:cachedData}];case 3:e=_state.sent();console.error(e);return[3,4];case 4:return[2,{cacheKey:null,cachedData:null}];case 5:return[2,{cacheKey:null,cachedData:null}]}})})()}()];case 1:_ref=_state.sent(),cacheKey=_ref.cacheKey,cacheTtl=_ref.cacheTtl,cachedData=_ref.cachedData;if(cachedData!==null){return[2,cachedData]}context=config.contextProvider({request:request,reply:reply,headers:request.headers},request,reply);model=this.syncer.models[api.modelName];return[2,this.asyncLocalStorage.run({context:context},function(){return _async_to_generator(function(){var result,_api_options_contentType;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,model[api.methodName].apply(model,api.parameters.map(function(param){if(_types.ApiParamType.isContext(param.type)){return context}else{return reqBody[param.name]}}))];case 1:result=_state.sent();reply.type((_api_options_contentType=api.options.contentType)!==null&&_api_options_contentType!==void 0?_api_options_contentType:"application/json");if(!(config.cache&&cacheKey))return[3,3];return[4,config.cache.put(cacheKey,result,cacheTtl)];case 2:_state.sent();_state.label=3;case 3:return[2,result]}})})()})]}})}).call(_this)}}},{key:"startWatcher",value:function startWatcher(){var _this=this;var watchPath=_path.default.join(this.apiRootPath,"src");var chokidar=require("chokidar");this.watcher=chokidar.watch(watchPath,{ignored:function(path,stats){return!!(stats===null||stats===void 0?void 0:stats.isFile())&&!path.endsWith(".ts")&&!path.endsWith(".json")||path.endsWith("src/index.ts")},persistent:true,ignoreInitial:true});this.watcher.on("all",function(event,filePath){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:if(event!=="change"&&event!=="add"){return[2]}return[4,this.handleFileChange(event,filePath)];case 1:_state.sent();return[2]}})}).call(_this)})}},{key:"registerPlugins",value:function registerPlugins(server,plugins){if(!plugins){return}var pluginsModules={formbody:"@fastify/formbody",qs:"fastify-qs",cors:"@fastify/cors",multipart:"@fastify/multipart"};var registerPlugin=function(key,pluginName){var option=plugins[key];if(!option)return;if(option===true){server.register(Promise.resolve(pluginName).then(function(p){return /*#__PURE__*/_interop_require_wildcard(require(p))}))}else{server.register(Promise.resolve(pluginName).then(function(p){return /*#__PURE__*/_interop_require_wildcard(require(p))}),option)}};Object.entries(pluginsModules).forEach(function(param){var _param=_sliced_to_array(param,2),key=_param[0],pluginName=_param[1];registerPlugin(key,pluginName)});if(plugins.custom){plugins.custom(server)}}},{key:"boot",value:function boot(server,options){return _async_to_generator(function(){var _this,_options_listen,_options_listen1,_options_lifecycle,_options_listen_port,port,_options_listen_host,host,shutdown,_options_lifecycle1;return _ts_generator(this,function(_state){_this=this;port=(_options_listen_port=(_options_listen=options.listen)===null||_options_listen===void 0?void 0:_options_listen.port)!==null&&_options_listen_port!==void 0?_options_listen_port:3e3;host=(_options_listen_host=(_options_listen1=options.listen)===null||_options_listen1===void 0?void 0:_options_listen1.host)!==null&&_options_listen_host!==void 0?_options_listen_host:"localhost";server.addHook("onClose",function(){return _async_to_generator(function(){var _options_lifecycle_onShutdown,_options_lifecycle;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_options_lifecycle=options.lifecycle)===null||_options_lifecycle===void 0?void 0:(_options_lifecycle_onShutdown=_options_lifecycle.onShutdown)===null||_options_lifecycle_onShutdown===void 0?void 0:_options_lifecycle_onShutdown.call(_options_lifecycle,server)];case 1:_state.sent();return[4,this.destroy()];case 2:_state.sent();return[2]}})}).call(_this)});shutdown=function(){return _async_to_generator(function(){var err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_state.trys.push([0,2,,3]);return[4,server.close()];case 1:_state.sent();process.exit(0);return[3,3];case 2:err=_state.sent();console.error("Error during shutdown:",err);process.exit(1);return[3,3];case 3:return[2]}})})()};process.on("SIGINT",shutdown);process.on("SIGTERM",shutdown);if((_options_lifecycle=options.lifecycle)===null||_options_lifecycle===void 0?void 0:_options_lifecycle.onError){;server.setErrorHandler((_options_lifecycle1=options.lifecycle)===null||_options_lifecycle1===void 0?void 0:_options_lifecycle1.onError)}server.listen({port:port,host:host}).then(function(){return _async_to_generator(function(){var _options_lifecycle_onStart,_options_lifecycle;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_options_lifecycle=options.lifecycle)===null||_options_lifecycle===void 0?void 0:(_options_lifecycle_onStart=_options_lifecycle.onStart)===null||_options_lifecycle_onStart===void 0?void 0:_options_lifecycle_onStart.call(_options_lifecycle,server)];case 1:_state.sent();return[2]}})})()}).catch(function(err){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:console.error(_chalk.default.red("Failed to start server:",err));return[4,shutdown()];case 1:_state.sent();return[2]}})})()});return[2]})}).call(this)}},{key:"handleFileChange",value:function handleFileChange(event,filePath){return _async_to_generator(function(){var relativePath;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(this.pendingFiles.length===0){this.hmrStartTime=Date.now()}this.pendingFiles.push(filePath);relativePath=filePath.replace(this.apiRootPath,"api");console.log(_chalk.default.bold("Detected(".concat(event,"): ").concat(_chalk.default.blue(relativePath))));return[4,this.syncer.syncFromWatcher([filePath])];case 1:_state.sent();this.pendingFiles=this.pendingFiles.slice(1);if(!(this.pendingFiles.length===0))return[3,3];return[4,this.finishHMR()];case 2:_state.sent();_state.label=3;case 3:return[2]}})}).call(this)}},{key:"finishHMR",value:function finishHMR(){return _async_to_generator(function(){var _,_1,endTime,totalTime,msg,margin;return _ts_generator(this,function(_state){switch(_state.label){case 0:_1=(_=this.syncer).saveChecksums;return[4,this.syncer.getCurrentChecksums()];case 1:return[4,_1.apply(_,[_state.sent()])];case 2:_state.sent();endTime=Date.now();totalTime=endTime-this.hmrStartTime;msg="HMR Done! ".concat(_chalk.default.bold.white("".concat(totalTime,"ms")));margin=Math.max(0,(process.stdout.columns-msg.length)/2);console.log(_chalk.default.black.bgGreen(" ".repeat(margin)+msg+" ".repeat(margin)));return[2]}})}).call(this)}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){var _this_watcher,BaseModel;return _ts_generator(this,function(_state){switch(_state.label){case 0:BaseModel=require("../database/base-model").BaseModel;return[4,BaseModel.destroy()];case 1:_state.sent();return[4,(_this_watcher=this.watcher)===null||_this_watcher===void 0?void 0:_this_watcher.close()];case 2:_state.sent();return[2]}})}).call(this)}}]);return SonamuClass}();var Sonamu=new SonamuClass;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Sonamu",{enumerable:true,get:function(){return Sonamu}});var _async_hooks=require("async_hooks");var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _fastify=/*#__PURE__*/_interop_require_default(require("fastify"));var _promises=require("fs/promises");var _path=/*#__PURE__*/_interop_require_default(require("path"));var _fsutils=require("../utils/fs-utils");var _datefnstz=require("date-fns-tz");var _zod=require("zod");var _db=require("../database/db");var _knexonduplicateupdate=require("../database/knex-plugins/knex-on-duplicate-update");var _soexceptions=require("../exceptions/so-exceptions");var _sse=require("../stream/sse");var _types=require("../types/types");var _controller=require("../utils/controller");var _utils=require("../utils/utils");var _zoderror=require("../utils/zod-error");var _caster=require("./caster");var _codeconverters=require("./code-converters");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_with_holes(arr){if(Array.isArray(arr))return arr}function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _instanceof(left,right){if(right!=null&&typeof Symbol!=="undefined"&&right[Symbol.hasInstance]){return!!right[Symbol.hasInstance](left)}else{return left instanceof right}}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function _iterable_to_array_limit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==="function"){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable}))}ownKeys.forEach(function(key){_define_property(target,key,source[key])})}return target}function _sliced_to_array(arr,i){return _array_with_holes(arr)||_iterable_to_array_limit(arr,i)||_unsupported_iterable_to_array(arr,i)||_non_iterable_rest()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var SonamuClass=/*#__PURE__*/function(){"use strict";function SonamuClass(){_class_call_check(this,SonamuClass);_define_property(this,"isInitialized",false);_define_property(this,"asyncLocalStorage",new _async_hooks.AsyncLocalStorage);_define_property(this,"uploadStorage",new _async_hooks.AsyncLocalStorage);_define_property(this,"_apiRootPath",null);_define_property(this,"_dbConfig",null);_define_property(this,"_syncer",null);_define_property(this,"_config",null);_define_property(this,"_secrets",null);_define_property(this,"_storage",null);_define_property(this,"watcher",null);_define_property(this,"pendingFiles",[]);_define_property(this,"hmrStartTime",0);_define_property(this,"server",null)}_create_class(SonamuClass,[{key:"getContext",value:function getContext(){var store=this.asyncLocalStorage.getStore();if(store===null||store===void 0?void 0:store.context){return store.context}throw new Error("Sonamu cannot find context")}},{key:"getUploadContext",value:function getUploadContext(){var store=this.uploadStorage.getStore();if(store===null||store===void 0?void 0:store.uploadContext){return store.uploadContext}throw new Error("Sonamu cannot find upload context. Did you use @upload decorator?")}},{key:"apiRootPath",get:function get(){if(this._apiRootPath===null){throw new Error("Sonamu has not been initialized")}return this._apiRootPath},set:function set(apiRootPath){this._apiRootPath=apiRootPath}},{key:"appRootPath",get:function get(){return this.apiRootPath.split(_path.default.sep).slice(0,-1).join(_path.default.sep)}},{key:"dbConfig",get:function get(){if(this._dbConfig===null){throw new Error("Sonamu has not been initialized")}return this._dbConfig},set:function set(dbConfig){this._dbConfig=dbConfig}},{key:"syncer",get:function get(){if(this._syncer===null){throw new Error("Sonamu has not been initialized")}return this._syncer},set:function set(syncer){this._syncer=syncer}},{key:"config",get:function get(){if(this._config===null){throw new Error("Sonamu has not been initialized")}return this._config},set:function set(config){this._config=config}},{key:"secrets",get:function get(){return this._secrets},set:function set(secrets){this._secrets=secrets}},{key:"storage",get:function get(){return this._storage},set:function set(storage){this._storage=storage}},{key:"initForTesting",value:function initForTesting(){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.init(true,false,undefined,true)];case 1:_state.sent();return[2]}})}).call(this)}},{key:"init",value:function init(){var doSilent=arguments.length>0&&arguments[0]!==void 0?arguments[0]:false,enableSync=arguments.length>1&&arguments[1]!==void 0?arguments[1]:true,apiRootPath=arguments.length>2?arguments[2]:void 0,forTesting=arguments.length>3&&arguments[3]!==void 0?arguments[3]:false;return _async_to_generator(function(){var configPath,secretsPath,_,_1,_2,_3,_4,EntityManager,Syncer;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(this.isInitialized){return[2]}!doSilent&&console.time(_chalk.default.cyan("Sonamu.init".concat(forTesting?" for testing":"")));this.apiRootPath=apiRootPath!==null&&apiRootPath!==void 0?apiRootPath:(0,_utils.findApiRootPath)();configPath=_path.default.join(this.apiRootPath,"sonamu.config.json");secretsPath=_path.default.join(this.apiRootPath,"sonamu.secrets.json");return[4,(0,_fsutils.exists)(configPath)];case 1:if(!_state.sent()){throw new Error("Cannot find sonamu.config.json in ".concat(configPath))}_=this;_1=JSON.parse;return[4,(0,_promises.readFile)(configPath)];case 2:_.config=_1.apply(JSON,[_state.sent().toString()]);return[4,(0,_fsutils.exists)(secretsPath)];case 3:if(!_state.sent())return[3,5];_2=this;_3=JSON.parse;return[4,(0,_promises.readFile)(secretsPath)];case 4:_2.secrets=_3.apply(JSON,[_state.sent().toString()]);_state.label=5;case 5:_4=this;return[4,_db.DB.readKnexfile()];case 6:_4.dbConfig=_state.sent();!doSilent&&console.log(_chalk.default.green("DB Config Loaded!"));(0,_knexonduplicateupdate.attachOnDuplicateUpdate)();if(forTesting){this.isInitialized=true;return[2]}return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../entity/entity-manager"))})];case 7:EntityManager=_state.sent().EntityManager;return[4,EntityManager.autoload(doSilent)];case 8:_state.sent();return[4,Promise.resolve().then(function(){return /*#__PURE__*/_interop_require_wildcard(require("../syncer/syncer"))})];case 9:Syncer=_state.sent().Syncer;this.syncer=new Syncer;return[4,this.syncer.autoloadModels()];case 10:_state.sent();return[4,this.syncer.autoloadTypes()];case 11:_state.sent();return[4,this.syncer.autoloadApis()];case 12:_state.sent();if(!((0,_controller.isLocal)()&&!(0,_controller.isTest)()&&enableSync))return[3,14];return[4,this.syncer.sync()];case 13:_state.sent();this.startWatcher();this.syncer.syncUI();_state.label=14;case 14:this.isInitialized=true;!doSilent&&console.timeEnd(_chalk.default.cyan("Sonamu.init"));return[2]}})}).call(this)}},{key:"createServer",value:function createServer(options,initOptions){return _async_to_generator(function(){var server;return _ts_generator(this,function(_state){switch(_state.label){case 0:server=(0,_fastify.default)(options.fastify);this.server=server;if(options.storage){this.storage=options.storage}if(options.plugins){this.registerPlugins(server,options.plugins)}return[4,this.withFastify(server,options.apiConfig,{enableSync:initOptions===null||initOptions===void 0?void 0:initOptions.enableSync,doSilent:initOptions===null||initOptions===void 0?void 0:initOptions.doSilent})];case 1:_state.sent();return[4,this.boot(server,options)];case 2:_state.sent();return[2,server]}})}).call(this)}},{key:"withFastify",value:function withFastify(server,config,options){return _async_to_generator(function(){var _this,timezone,DATE_FORMAT,ISO_DATE_REGEX;return _ts_generator(this,function(_state){switch(_state.label){case 0:_this=this;if(!(this.isInitialized===false))return[3,2];return[4,this.init(options===null||options===void 0?void 0:options.doSilent,options===null||options===void 0?void 0:options.enableSync)];case 1:_state.sent();_state.label=2;case 2:this.server=server;timezone=this.config.timezone;if(timezone){DATE_FORMAT="yyyy-MM-dd'T'HH:mm:ssXXX";ISO_DATE_REGEX=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/;server.setReplySerializer(function(payload){return JSON.stringify(payload,function(_key,value){if(typeof value==="string"&&ISO_DATE_REGEX.test(value)){return(0,_datefnstz.formatInTimeZone)(new Date(value),timezone,DATE_FORMAT)}return value})});!(options===null||options===void 0?void 0:options.doSilent)&&console.log(_chalk.default.green("Timezone set to ".concat(timezone)))}server.get("".concat(this.config.route.prefix,"/routes"),function(_request,_reply){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.syncer.apis]})}).call(_this)});server.get("".concat(this.config.route.prefix,"/healthcheck"),function(_request,_reply){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,"ok"]})})()});if((0,_controller.isLocal)()){server.all("*",function(request,reply){var found=_this.syncer.apis.find(function(api){var _api_options_httpMethod;return _this.config.route.prefix+api.path===request.url.split("?")[0]&&((_api_options_httpMethod=api.options.httpMethod)!==null&&_api_options_httpMethod!==void 0?_api_options_httpMethod:"GET")===request.method.toUpperCase()});if(found){return _this.getApiHandler(found,config)(request,reply)}throw new _soexceptions.NotFoundException("존재하지 않는 API 접근입니다.")})}else{this.syncer.apis.map(function(api){if(_this.syncer.models[api.modelName]===undefined){throw new Error("정의되지 않은 모델에 접근 ".concat(api.modelName))}server.route({method:api.options.httpMethod,url:_this.config.route.prefix+api.path,handler:_this.getApiHandler(api,config)})})}return[2]}})}).call(this)}},{key:"getApiHandler",value:function getApiHandler(api,config){var _this=this;return function(request,reply){return _async_to_generator(function(){var _api_options_guards,ReqType,which,reqBody,_request_which,messages,_api_options_contentType,_ref,cacheKey,cacheTtl,cachedData,createSSE,context,model;return _ts_generator(this,function(_state){switch(_state.label){case 0:((_api_options_guards=api.options.guards)!==null&&_api_options_guards!==void 0?_api_options_guards:[]).every(function(guard){return config.guardHandler(guard,request,api)});ReqType=(0,_codeconverters.getZodObjectFromApi)(api,this.syncer.types);which=api.options.httpMethod==="GET"?"query":"body";try{;reqBody=(0,_caster.fastifyCaster)(ReqType).parse((_request_which=request[which])!==null&&_request_which!==void 0?_request_which:{})}catch(e){if(_instanceof(e,_zod.ZodError)){messages=(0,_zoderror.humanizeZodError)(e).map(function(issue){return issue.message}).join(" ");throw new _soexceptions.BadRequestException(messages,{zodError:e})}else{throw e}}reply.type((_api_options_contentType=api.options.contentType)!==null&&_api_options_contentType!==void 0?_api_options_contentType:"application/json");return[4,function(){return _async_to_generator(function(){var cacheKeyRes,cacheKey,cacheTtl,cachedData,e;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!config.cache)return[3,5];_state.label=1;case 1:_state.trys.push([1,3,,4]);cacheKeyRes=config.cache.resolveKey(api.path,reqBody);if(cacheKeyRes.cache===false){return[2,{cacheKey:null,cachedData:null}]}cacheKey=cacheKeyRes.key;cacheTtl=cacheKeyRes.ttl;return[4,config.cache.get(cacheKey)];case 2:cachedData=_state.sent();return[2,{cacheKey:cacheKey,cacheTtl:cacheTtl,cachedData:cachedData}];case 3:e=_state.sent();console.error(e);return[3,4];case 4:return[2,{cacheKey:null,cachedData:null}];case 5:return[2,{cacheKey:null,cachedData:null}]}})})()}()];case 1:_ref=_state.sent(),cacheKey=_ref.cacheKey,cacheTtl=_ref.cacheTtl,cachedData=_ref.cachedData;if(cachedData!==null){return[2,cachedData]}createSSE=(function(_request,_reply,_events){return(0,_sse.createSSEFactory)(_request.socket,_reply,_events)}).bind(null,request,reply);context=_object_spread({},config.contextProvider({request:request,reply:reply,headers:request.headers,createSSE:createSSE},request,reply));model=this.syncer.models[api.modelName];return[2,this.asyncLocalStorage.run({context:context},function(){return _async_to_generator(function(){var result,_api_options_contentType;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,model[api.methodName].apply(model,api.parameters.map(function(param){if(_types.ApiParamType.isContext(param.type)){return context}else{return reqBody[param.name]}}))];case 1:result=_state.sent();reply.type((_api_options_contentType=api.options.contentType)!==null&&_api_options_contentType!==void 0?_api_options_contentType:"application/json");if(!(config.cache&&cacheKey))return[3,3];return[4,config.cache.put(cacheKey,result,cacheTtl)];case 2:_state.sent();_state.label=3;case 3:return[2,result]}})})()})]}})}).call(_this)}}},{key:"startWatcher",value:function startWatcher(){var _this=this;var watchPath=_path.default.join(this.apiRootPath,"src");var chokidar=require("chokidar");this.watcher=chokidar.watch(watchPath,{ignored:function(path,stats){return!!(stats===null||stats===void 0?void 0:stats.isFile())&&!path.endsWith(".ts")&&!path.endsWith(".json")||path.endsWith("src/index.ts")},persistent:true,ignoreInitial:true});this.watcher.on("all",function(event,filePath){return _async_to_generator(function(){var e;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(event!=="change"&&event!=="add"){return[2]}_state.label=1;case 1:_state.trys.push([1,3,,4]);return[4,this.handleFileChange(event,filePath)];case 2:_state.sent();return[3,4];case 3:e=_state.sent();console.error(e);return[3,4];case 4:return[2]}})}).call(_this)})}},{key:"runScript",value:function runScript(fn){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.init(true,false,undefined,false)];case 1:_state.sent();_state.label=2;case 2:_state.trys.push([2,,4,6]);return[4,fn()];case 3:_state.sent();return[3,6];case 4:return[4,this.destroy()];case 5:_state.sent();return[7];case 6:return[2]}})}).call(this)}},{key:"registerPlugins",value:function registerPlugins(server,plugins){if(!plugins){return}var pluginsModules={cors:"@fastify/cors",formbody:"@fastify/formbody",multipart:"@fastify/multipart",qs:"fastify-qs",sse:"fastify-sse-v2"};var registerPlugin=function(key,pluginName){var option=plugins[key];if(!option)return;if(option===true){server.register(Promise.resolve(pluginName).then(function(p){return /*#__PURE__*/_interop_require_wildcard(require(p))}))}else{server.register(Promise.resolve(pluginName).then(function(p){return /*#__PURE__*/_interop_require_wildcard(require(p))}),option)}};Object.entries(pluginsModules).forEach(function(param){var _param=_sliced_to_array(param,2),key=_param[0],pluginName=_param[1];registerPlugin(key,pluginName)});if(plugins.custom){plugins.custom(server)}}},{key:"boot",value:function boot(server,options){return _async_to_generator(function(){var _this,_options_listen,_options_listen1,_options_lifecycle,_options_listen_port,port,_options_listen_host,host,shutdown,_options_lifecycle1;return _ts_generator(this,function(_state){_this=this;port=(_options_listen_port=(_options_listen=options.listen)===null||_options_listen===void 0?void 0:_options_listen.port)!==null&&_options_listen_port!==void 0?_options_listen_port:3e3;host=(_options_listen_host=(_options_listen1=options.listen)===null||_options_listen1===void 0?void 0:_options_listen1.host)!==null&&_options_listen_host!==void 0?_options_listen_host:"localhost";server.addHook("onClose",function(){return _async_to_generator(function(){var _options_lifecycle_onShutdown,_options_lifecycle;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_options_lifecycle=options.lifecycle)===null||_options_lifecycle===void 0?void 0:(_options_lifecycle_onShutdown=_options_lifecycle.onShutdown)===null||_options_lifecycle_onShutdown===void 0?void 0:_options_lifecycle_onShutdown.call(_options_lifecycle,server)];case 1:_state.sent();return[4,this.destroy()];case 2:_state.sent();return[2]}})}).call(_this)});shutdown=function(){return _async_to_generator(function(){var err;return _ts_generator(this,function(_state){switch(_state.label){case 0:_state.trys.push([0,2,,3]);return[4,server.close()];case 1:_state.sent();process.exit(0);return[3,3];case 2:err=_state.sent();console.error("Error during shutdown:",err);process.exit(1);return[3,3];case 3:return[2]}})})()};process.on("SIGINT",shutdown);process.on("SIGTERM",shutdown);if((_options_lifecycle=options.lifecycle)===null||_options_lifecycle===void 0?void 0:_options_lifecycle.onError){;server.setErrorHandler((_options_lifecycle1=options.lifecycle)===null||_options_lifecycle1===void 0?void 0:_options_lifecycle1.onError)}server.listen({port:port,host:host}).then(function(){return _async_to_generator(function(){var _options_lifecycle_onStart,_options_lifecycle;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,(_options_lifecycle=options.lifecycle)===null||_options_lifecycle===void 0?void 0:(_options_lifecycle_onStart=_options_lifecycle.onStart)===null||_options_lifecycle_onStart===void 0?void 0:_options_lifecycle_onStart.call(_options_lifecycle,server)];case 1:_state.sent();return[2]}})})()}).catch(function(err){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:console.error(_chalk.default.red("Failed to start server:",err));return[4,shutdown()];case 1:_state.sent();return[2]}})})()});return[2]})}).call(this)}},{key:"handleFileChange",value:function handleFileChange(event,filePath){return _async_to_generator(function(){var relativePath;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(this.pendingFiles.length===0){this.hmrStartTime=Date.now()}this.pendingFiles.push(filePath);relativePath=filePath.replace(this.apiRootPath,"api");console.log(_chalk.default.bold("Detected(".concat(event,"): ").concat(_chalk.default.blue(relativePath))));return[4,this.syncer.syncFromWatcher([filePath])];case 1:_state.sent();this.pendingFiles=this.pendingFiles.slice(1);if(!(this.pendingFiles.length===0))return[3,3];return[4,this.finishHMR()];case 2:_state.sent();_state.label=3;case 3:return[2]}})}).call(this)}},{key:"finishHMR",value:function finishHMR(){return _async_to_generator(function(){var _,_1,endTime,totalTime,msg,margin;return _ts_generator(this,function(_state){switch(_state.label){case 0:_1=(_=this.syncer).saveChecksums;return[4,this.syncer.getCurrentChecksums()];case 1:return[4,_1.apply(_,[_state.sent()])];case 2:_state.sent();endTime=Date.now();totalTime=endTime-this.hmrStartTime;msg="HMR Done! ".concat(_chalk.default.bold.white("".concat(totalTime,"ms")));margin=Math.max(0,(process.stdout.columns-msg.length)/2);console.log(_chalk.default.black.bgGreen(" ".repeat(margin)+msg+" ".repeat(margin)));return[2]}})}).call(this)}},{key:"destroy",value:function destroy(){return _async_to_generator(function(){var _this_watcher,_this_storage,BaseModel;return _ts_generator(this,function(_state){switch(_state.label){case 0:BaseModel=require("../database/base-model").BaseModel;return[4,BaseModel.destroy()];case 1:_state.sent();return[4,(_this_watcher=this.watcher)===null||_this_watcher===void 0?void 0:_this_watcher.close()];case 2:_state.sent();(_this_storage=this.storage)===null||_this_storage===void 0?void 0:_this_storage.destroy();return[2]}})}).call(this)}}]);return SonamuClass}();var Sonamu=new SonamuClass;
|
|
2
2
|
//# sourceMappingURL=sonamu.js.map
|
package/dist/api/sonamu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api/sonamu.ts"],"sourcesContent":["import path from \"path\";\nimport { readFile } from \"fs/promises\";\nimport { exists } from \"../utils/fs-utils\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport chalk from \"chalk\";\nimport fastify from \"fastify\";\n\nimport { ZodError } from \"zod\";\nimport { getZodObjectFromApi } from \"./code-converters\";\nimport {\n BadRequestException,\n NotFoundException,\n} from \"../exceptions/so-exceptions\";\nimport { humanizeZodError } from \"../utils/zod-error\";\nimport { fastifyCaster } from \"./caster\";\nimport {\n ApiParamType,\n SonamuFastifyConfig,\n SonamuServerOptions,\n} from \"../types/types\";\nimport { isLocal, isTest } from \"../utils/controller\";\nimport { findApiRootPath } from \"../utils/utils\";\nimport { DB, SonamuDBConfig } from \"../database/db\";\nimport { attachOnDuplicateUpdate } from \"../database/knex-plugins/knex-on-duplicate-update\";\nimport type { ExtendedApi } from \"./decorators\";\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport type { IncomingMessage, Server, ServerResponse } from \"http\";\nimport type { Context, UploadContext } from \"./context\";\nimport type { Syncer } from \"../syncer/syncer\";\nimport type { FSWatcher } from \"chokidar\";\nimport { formatInTimeZone } from \"date-fns-tz\";\nimport type { Driver } from \"../file-storage/driver\";\n\nexport type SonamuConfig = {\n projectName?: string;\n api: {\n dir: string;\n };\n sync: {\n targets: string[];\n };\n route: {\n prefix: string;\n };\n timezone?: string;\n ui?: {\n port: number;\n };\n};\nexport type SonamuSecrets = {\n [key: string]: string;\n};\nclass SonamuClass {\n public isInitialized: boolean = false;\n public asyncLocalStorage: AsyncLocalStorage<{\n context: Context;\n }> = new AsyncLocalStorage();\n\n public uploadStorage: AsyncLocalStorage<{\n uploadContext: UploadContext;\n }> = new AsyncLocalStorage();\n\n public getContext(): Context {\n const store = this.asyncLocalStorage.getStore();\n if (store?.context) {\n return store.context;\n }\n throw new Error(\"Sonamu cannot find context\");\n }\n\n public getUploadContext(): UploadContext {\n const store = this.uploadStorage.getStore();\n if (store?.uploadContext) {\n return store.uploadContext;\n }\n throw new Error(\n \"Sonamu cannot find upload context. Did you use @upload decorator?\"\n );\n }\n\n private _apiRootPath: string | null = null;\n set apiRootPath(apiRootPath: string) {\n this._apiRootPath = apiRootPath;\n }\n get apiRootPath(): string {\n if (this._apiRootPath === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._apiRootPath!;\n }\n get appRootPath(): string {\n return this.apiRootPath.split(path.sep).slice(0, -1).join(path.sep);\n }\n\n private _dbConfig: SonamuDBConfig | null = null;\n set dbConfig(dbConfig: SonamuDBConfig) {\n this._dbConfig = dbConfig;\n }\n get dbConfig(): SonamuDBConfig {\n if (this._dbConfig === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._dbConfig!;\n }\n\n private _syncer: Syncer | null = null;\n set syncer(syncer: Syncer) {\n this._syncer = syncer;\n }\n get syncer(): Syncer {\n if (this._syncer === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._syncer!;\n }\n\n private _config: SonamuConfig | null = null;\n set config(config: SonamuConfig) {\n this._config = config;\n }\n get config(): SonamuConfig {\n if (this._config === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._config;\n }\n\n private _secrets: SonamuSecrets | null = null;\n set secrets(secrets: SonamuSecrets) {\n this._secrets = secrets;\n }\n get secrets(): SonamuSecrets | null {\n return this._secrets;\n }\n\n private _storage: Driver | null = null;\n set storage(storage: Driver) {\n this._storage = storage;\n }\n get storage(): Driver | null {\n return this._storage;\n }\n\n // HMR 처리\n public watcher: FSWatcher | null = null;\n private pendingFiles: string[] = [];\n private hmrStartTime: number = 0;\n\n public server: FastifyInstance | null = null;\n\n async initForTesting() {\n await this.init(true, false, undefined, true);\n }\n\n async init(\n doSilent: boolean = false,\n enableSync: boolean = true,\n apiRootPath?: string,\n forTesting: boolean = false\n ) {\n if (this.isInitialized) {\n return;\n }\n !doSilent &&\n console.time(\n chalk.cyan(`Sonamu.init${forTesting ? \" for testing\" : \"\"}`)\n );\n\n // API 루트 패스\n this.apiRootPath = apiRootPath ?? findApiRootPath();\n const configPath = path.join(this.apiRootPath, \"sonamu.config.json\");\n const secretsPath = path.join(this.apiRootPath, \"sonamu.secrets.json\");\n if (!(await exists(configPath))) {\n throw new Error(`Cannot find sonamu.config.json in ${configPath}`);\n }\n this.config = JSON.parse(\n (await readFile(configPath)).toString()\n ) as SonamuConfig;\n if (await exists(secretsPath)) {\n this.secrets = JSON.parse(\n (await readFile(secretsPath)).toString()\n ) as SonamuSecrets;\n }\n\n // DB 로드\n this.dbConfig = await DB.readKnexfile();\n !doSilent && console.log(chalk.green(\"DB Config Loaded!\"));\n attachOnDuplicateUpdate();\n\n // 테스팅인 경우 엔티티 로드 & 싱크 없이 중단\n if (forTesting) {\n this.isInitialized = true;\n return;\n }\n\n // Entity 로드\n const { EntityManager } = await import(\"../entity/entity-manager\");\n await EntityManager.autoload(doSilent);\n\n // Syncer\n const { Syncer } = await import(\"../syncer/syncer\");\n this.syncer = new Syncer();\n\n // Autoload: Models / Types / APIs\n await this.syncer.autoloadModels();\n await this.syncer.autoloadTypes();\n await this.syncer.autoloadApis();\n\n if (isLocal() && !isTest() && enableSync) {\n await this.syncer.sync();\n\n // FIXME: hmr 설정된 경우만 워처 시작\n this.startWatcher();\n\n this.syncer.syncUI();\n }\n\n this.isInitialized = true;\n !doSilent && console.timeEnd(chalk.cyan(\"Sonamu.init\"));\n }\n\n async createServer(\n options: SonamuServerOptions,\n initOptions?: {\n enableSync?: boolean;\n doSilent?: boolean;\n }\n ) {\n const server = fastify(options.fastify);\n this.server = server;\n\n // Storage 설정 저장\n if (options.storage) {\n this.storage = options.storage;\n }\n\n // 플러그인 등록\n if (options.plugins) {\n this.registerPlugins(server, options.plugins);\n }\n\n // API 라우팅 설정\n await this.withFastify(server, options.apiConfig, {\n enableSync: initOptions?.enableSync,\n doSilent: initOptions?.doSilent,\n });\n\n // 서버 시작\n await this.boot(server, options);\n\n return server;\n }\n\n async withFastify(\n server: FastifyInstance<Server, IncomingMessage, ServerResponse>,\n config: SonamuFastifyConfig,\n options?: {\n enableSync?: boolean;\n doSilent?: boolean;\n }\n ) {\n if (this.isInitialized === false) {\n await this.init(options?.doSilent, options?.enableSync);\n }\n\n this.server = server;\n\n // timezone 설정\n const timezone = this.config.timezone;\n if (timezone) {\n const DATE_FORMAT = \"yyyy-MM-dd'T'HH:mm:ssXXX\";\n // ISO 8601 날짜 형식 정규식 (예: 2024-01-15T09:30:00.000Z)\n const ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/;\n\n server.setReplySerializer((payload) => {\n return JSON.stringify(payload, (_key, value) => {\n if (typeof value === \"string\" && ISO_DATE_REGEX.test(value)) {\n return formatInTimeZone(new Date(value), timezone, DATE_FORMAT);\n }\n return value;\n });\n });\n !options?.doSilent &&\n console.log(chalk.green(`Timezone set to ${timezone}`));\n }\n\n // 전체 라우팅 리스트\n server.get(\n `${this.config.route.prefix}/routes`,\n async (_request, _reply): Promise<any> => {\n return this.syncer.apis;\n }\n );\n\n // Healthcheck API\n server.get(\n `${this.config.route.prefix}/healthcheck`,\n async (_request, _reply): Promise<string> => {\n return \"ok\";\n }\n );\n\n // API 라우팅 (로컬HMR 상태와 구분)\n if (isLocal()) {\n server.all(\"*\", (request, reply) => {\n const found = this.syncer.apis.find(\n (api) =>\n this.config.route.prefix + api.path === request.url.split(\"?\")[0] &&\n (api.options.httpMethod ?? \"GET\") === request.method.toUpperCase()\n );\n if (found) {\n return this.getApiHandler(found, config)(request, reply);\n }\n throw new NotFoundException(\"존재하지 않는 API 접근입니다.\");\n });\n } else {\n this.syncer.apis.map((api) => {\n // model\n if (this.syncer.models[api.modelName] === undefined) {\n throw new Error(`정의되지 않은 모델에 접근 ${api.modelName}`);\n }\n\n // route\n server.route({\n method: api.options.httpMethod!,\n url: this.config.route.prefix + api.path,\n handler: this.getApiHandler(api, config),\n }); // END server.route\n });\n }\n }\n\n getApiHandler(api: ExtendedApi, config: SonamuFastifyConfig) {\n return async (\n request: FastifyRequest,\n reply: FastifyReply\n ): Promise<unknown> => {\n (api.options.guards ?? []).every((guard) =>\n config.guardHandler(guard, request, api)\n );\n\n // 파라미터 정보로 zod 스키마 빌드\n const ReqType = getZodObjectFromApi(api, this.syncer.types);\n\n // request 파싱\n const which = api.options.httpMethod === \"GET\" ? \"query\" : \"body\";\n let reqBody: {\n [key: string]: unknown;\n };\n try {\n reqBody = fastifyCaster(ReqType).parse(request[which] ?? {});\n } catch (e) {\n if (e instanceof ZodError) {\n const messages = humanizeZodError(e)\n .map((issue) => issue.message)\n .join(\" \");\n throw new BadRequestException(messages, {\n zodError: e,\n });\n } else {\n throw e;\n }\n }\n\n // Content-Type\n reply.type(api.options.contentType ?? \"application/json\");\n\n // 캐시\n const { cacheKey, cacheTtl, cachedData } = await (async () => {\n if (config.cache) {\n try {\n const cacheKeyRes = config.cache.resolveKey(api.path, reqBody);\n if (cacheKeyRes.cache === false) {\n return { cacheKey: null, cachedData: null };\n }\n\n const cacheKey = cacheKeyRes.key;\n const cacheTtl = cacheKeyRes.ttl;\n const cachedData = await config.cache.get(cacheKey);\n return { cacheKey, cacheTtl, cachedData };\n } catch (e) {\n console.error(e);\n }\n return { cacheKey: null, cachedData: null };\n }\n return { cacheKey: null, cachedData: null };\n })();\n if (cachedData !== null) {\n return cachedData;\n }\n\n // 결과 (AsyncLocalStorage 적용)\n const context = config.contextProvider(\n {\n request,\n reply,\n headers: request.headers,\n },\n request,\n reply\n );\n const model = this.syncer.models[api.modelName];\n return this.asyncLocalStorage.run({ context }, async () => {\n const result = await (model as any)[api.methodName].apply(\n model,\n api.parameters.map((param) => {\n // Context 인젝션\n if (ApiParamType.isContext(param.type)) {\n return context;\n } else {\n return reqBody[param.name];\n }\n })\n );\n reply.type(api.options.contentType ?? \"application/json\");\n\n // 캐시 키 있는 경우 갱신 후 저장\n if (config.cache && cacheKey) {\n await config.cache.put(cacheKey, result, cacheTtl);\n }\n return result;\n });\n };\n }\n\n startWatcher(): void {\n const watchPath = path.join(this.apiRootPath, \"src\");\n const chokidar = require(\"chokidar\") as typeof import(\"chokidar\");\n this.watcher = chokidar.watch(watchPath, {\n ignored: (path, stats) =>\n (!!stats?.isFile() &&\n !path.endsWith(\".ts\") &&\n !path.endsWith(\".json\")) ||\n path.endsWith(\"src/index.ts\"),\n persistent: true,\n ignoreInitial: true,\n });\n this.watcher.on(\"all\", async (event: string, filePath: string) => {\n if (event !== \"change\" && event !== \"add\") {\n return;\n }\n\n await this.handleFileChange(event, filePath);\n });\n }\n\n private registerPlugins(\n server: FastifyInstance,\n plugins: SonamuServerOptions[\"plugins\"]\n ) {\n if (!plugins) {\n return;\n }\n\n const pluginsModules = {\n formbody: \"@fastify/formbody\",\n qs: \"fastify-qs\",\n cors: \"@fastify/cors\",\n multipart: \"@fastify/multipart\",\n } as const;\n\n const registerPlugin = <K extends keyof NonNullable<typeof plugins>>(\n key: K,\n pluginName: string\n ) => {\n const option = plugins[key];\n if (!option) return;\n\n if (option === true) {\n server.register(import(pluginName));\n } else {\n server.register(import(pluginName), option);\n }\n };\n\n Object.entries(pluginsModules).forEach(([key, pluginName]) => {\n registerPlugin(key as keyof typeof plugins, pluginName);\n });\n\n if (plugins.custom) {\n plugins.custom(server);\n }\n }\n\n private async boot(server: FastifyInstance, options: SonamuServerOptions) {\n const port = options.listen?.port ?? 3000;\n const host = options.listen?.host ?? \"localhost\";\n\n server.addHook(\"onClose\", async () => {\n await options.lifecycle?.onShutdown?.(server);\n await this.destroy();\n });\n\n const shutdown = async () => {\n try {\n await server.close();\n process.exit(0);\n } catch (err) {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n }\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n if (options.lifecycle?.onError) {\n server.setErrorHandler(options.lifecycle?.onError);\n }\n\n server\n .listen({ port, host })\n .then(async () => {\n await options.lifecycle?.onStart?.(server);\n })\n .catch(async (err) => {\n console.error(chalk.red(\"Failed to start server:\", err));\n await shutdown();\n });\n }\n\n private async handleFileChange(\n event: string,\n filePath: string\n ): Promise<void> {\n // 첫 번째 파일이면 HMR 시작 시간 기록\n if (this.pendingFiles.length === 0) {\n this.hmrStartTime = Date.now();\n }\n\n this.pendingFiles.push(filePath);\n\n const relativePath = filePath.replace(this.apiRootPath, \"api\");\n console.log(chalk.bold(`Detected(${event}): ${chalk.blue(relativePath)}`));\n\n await this.syncer.syncFromWatcher([filePath]);\n\n // 처리 완료된 파일을 대기 목록에서 제거\n this.pendingFiles = this.pendingFiles.slice(1);\n\n // 모든 파일 처리가 완료되면 최종 메시지 출력\n if (this.pendingFiles.length === 0) {\n await this.finishHMR();\n }\n }\n\n private async finishHMR(): Promise<void> {\n await this.syncer.saveChecksums(await this.syncer.getCurrentChecksums());\n\n const endTime = Date.now();\n const totalTime = endTime - this.hmrStartTime;\n const msg = `HMR Done! ${chalk.bold.white(`${totalTime}ms`)}`;\n const margin = Math.max(0, (process.stdout.columns - msg.length) / 2);\n\n console.log(\n chalk.black.bgGreen(\" \".repeat(margin) + msg + \" \".repeat(margin))\n );\n }\n\n async destroy(): Promise<void> {\n const { BaseModel } = require(\"../database/base-model\");\n await BaseModel.destroy();\n await this.watcher?.close();\n }\n}\nexport const Sonamu = new SonamuClass();\n"],"names":["Sonamu","SonamuClass","isInitialized","asyncLocalStorage","AsyncLocalStorage","uploadStorage","_apiRootPath","_dbConfig","_syncer","_config","_secrets","_storage","watcher","pendingFiles","hmrStartTime","server","getContext","store","getStore","context","Error","getUploadContext","uploadContext","apiRootPath","appRootPath","split","path","sep","slice","join","dbConfig","syncer","config","secrets","storage","initForTesting","init","undefined","doSilent","enableSync","forTesting","configPath","secretsPath","EntityManager","Syncer","console","time","chalk","cyan","findApiRootPath","exists","JSON","parse","readFile","toString","DB","readKnexfile","log","green","attachOnDuplicateUpdate","autoload","autoloadModels","autoloadTypes","autoloadApis","isLocal","isTest","sync","startWatcher","syncUI","timeEnd","createServer","options","initOptions","fastify","plugins","registerPlugins","withFastify","apiConfig","boot","timezone","DATE_FORMAT","ISO_DATE_REGEX","setReplySerializer","payload","stringify","_key","value","test","formatInTimeZone","Date","get","route","prefix","_request","_reply","apis","all","request","reply","found","find","api","url","httpMethod","method","toUpperCase","getApiHandler","NotFoundException","map","models","modelName","handler","ReqType","which","reqBody","messages","cacheKey","cacheTtl","cachedData","model","guards","every","guard","guardHandler","getZodObjectFromApi","types","fastifyCaster","e","ZodError","humanizeZodError","issue","message","BadRequestException","zodError","type","contentType","cacheKeyRes","cache","resolveKey","key","ttl","error","contextProvider","headers","run","result","methodName","apply","parameters","param","ApiParamType","isContext","name","put","watchPath","chokidar","require","watch","ignored","stats","isFile","endsWith","persistent","ignoreInitial","on","event","filePath","handleFileChange","pluginsModules","formbody","qs","cors","multipart","registerPlugin","pluginName","option","register","Object","entries","forEach","custom","port","host","shutdown","listen","addHook","lifecycle","onShutdown","destroy","err","close","process","exit","onError","setErrorHandler","then","onStart","catch","red","relativePath","length","now","push","replace","bold","blue","syncFromWatcher","finishHMR","endTime","totalTime","msg","margin","saveChecksums","getCurrentChecksums","white","Math","max","stdout","columns","black","bgGreen","repeat","BaseModel"],"mappings":"oGAqjBaA,gDAAAA,kEArjBI,+BACQ,oCACF,8CACW,wEAChB,qEACE,6BAEK,mCACW,+CAI7B,qDAC0B,0CACH,+BAKvB,0CACyB,0CACA,kCACG,qDACK,4EAOP,sqKAsBjC,IAAA,AAAMC,yBAAN,iCAAMA,qCAAAA,aACJ,sBAAOC,gBAAyB,OAChC,sBAAOC,oBAEF,IAAIC,8BAAiB,EAE1B,sBAAOC,gBAEF,IAAID,8BAAiB,EAoB1B,sBAAQE,eAA8B,MActC,sBAAQC,YAAmC,MAW3C,sBAAQC,UAAyB,MAWjC,sBAAQC,UAA+B,MAWvC,sBAAQC,WAAiC,MAQzC,sBAAQC,WAA0B,MASlC,sBAAOC,UAA4B,MACnC,sBAAQC,eAAyB,EAAE,EACnC,sBAAQC,eAAuB,GAE/B,sBAAOC,SAAiC,oBAhGpCd,cAUGe,IAAAA,mBAAP,SAAOA,aACL,IAAMC,MAAQ,IAAI,CAACd,iBAAiB,CAACe,QAAQ,GAC7C,GAAID,cAAAA,sBAAAA,MAAOE,OAAO,CAAE,CAClB,OAAOF,MAAME,OAAO,AACtB,CACA,MAAM,IAAIC,MAAM,6BAClB,IAEOC,IAAAA,yBAAP,SAAOA,mBACL,IAAMJ,MAAQ,IAAI,CAACZ,aAAa,CAACa,QAAQ,GACzC,GAAID,cAAAA,sBAAAA,MAAOK,aAAa,CAAE,CACxB,OAAOL,MAAMK,aAAa,AAC5B,CACA,MAAM,IAAIF,MACR,oEAEJ,IAGIG,IAAAA,kBAGJ,eACE,GAAI,IAAI,CAACjB,YAAY,GAAK,KAAM,CAC9B,MAAM,IAAIc,MAAM,kCAClB,CACA,OAAO,IAAI,CAACd,YAAY,AAC1B,MARA,aAAgBiB,WAAmB,EACjC,IAAI,CAACjB,YAAY,CAAGiB,WACtB,IAOIC,IAAAA,kBAAJ,eACE,OAAO,IAAI,CAACD,WAAW,CAACE,KAAK,CAACC,aAAI,CAACC,GAAG,EAAEC,KAAK,CAAC,EAAG,CAAC,GAAGC,IAAI,CAACH,aAAI,CAACC,GAAG,CACpE,IAGIG,IAAAA,eAGJ,eACE,GAAI,IAAI,CAACvB,SAAS,GAAK,KAAM,CAC3B,MAAM,IAAIa,MAAM,kCAClB,CACA,OAAO,IAAI,CAACb,SAAS,AACvB,MARA,aAAauB,QAAwB,EACnC,IAAI,CAACvB,SAAS,CAAGuB,QACnB,IASIC,IAAAA,aAGJ,eACE,GAAI,IAAI,CAACvB,OAAO,GAAK,KAAM,CACzB,MAAM,IAAIY,MAAM,kCAClB,CACA,OAAO,IAAI,CAACZ,OAAO,AACrB,MARA,aAAWuB,MAAc,EACvB,IAAI,CAACvB,OAAO,CAAGuB,MACjB,IASIC,IAAAA,aAGJ,eACE,GAAI,IAAI,CAACvB,OAAO,GAAK,KAAM,CACzB,MAAM,IAAIW,MAAM,kCAClB,CACA,OAAO,IAAI,CAACX,OAAO,AACrB,MARA,aAAWuB,MAAoB,EAC7B,IAAI,CAACvB,OAAO,CAAGuB,MACjB,IASIC,IAAAA,cAGJ,eACE,OAAO,IAAI,CAACvB,QAAQ,AACtB,MALA,aAAYuB,OAAsB,EAChC,IAAI,CAACvB,QAAQ,CAAGuB,OAClB,IAMIC,IAAAA,cAGJ,eACE,OAAO,IAAI,CAACvB,QAAQ,AACtB,MALA,aAAYuB,OAAe,EACzB,IAAI,CAACvB,QAAQ,CAAGuB,OAClB,IAYMC,IAAAA,uBAAN,SAAMA,8HACJ,SAAM,IAAI,CAACC,IAAI,CAAC,KAAM,MAAOC,UAAW,cAAxC,0BACF,iBAEMD,IAAAA,aAAN,SAAMA,WACJE,SAAAA,uDAAoB,MACpBC,WAAAA,uDAAsB,KACtBhB,mDACAiB,WAAAA,uDAAsB,gDAYhBC,WACAC,0BAyBEC,cAIAC,8EAxCR,GAAI,IAAI,CAAC1C,aAAa,CAAE,CACtB,SACF,CACA,CAACoC,UACCO,QAAQC,IAAI,CACVC,cAAK,CAACC,IAAI,CAAC,AAAC,cAA8C,OAAjCR,WAAa,eAAiB,KAI3D,CAAA,IAAI,CAACjB,WAAW,CAAGA,oBAAAA,qBAAAA,YAAe0B,GAAAA,sBAAe,IAC3CR,WAAaf,aAAI,CAACG,IAAI,CAAC,IAAI,CAACN,WAAW,CAAE,sBACzCmB,YAAchB,aAAI,CAACG,IAAI,CAAC,IAAI,CAACN,WAAW,CAAE,uBAC1C,SAAM2B,GAAAA,eAAM,EAACT,oBAAnB,GAAI,CAAE,cAA2B,CAC/B,MAAM,IAAIrB,MAAM,AAAC,qCAA+C,OAAXqB,YACvD,GACA,IAAI,IAAUU,KAAKC,KAAK,CACrB,SAAMC,GAAAA,kBAAQ,EAACZ,oBADlB,EAAKT,MAAM,CAAGmB,SAAAA,MACZ,AAAC,cAA4BG,QAAQ,KAEnC,SAAMJ,GAAAA,eAAM,EAACR,yBAAb,cAAA,eACF,IAAI,IAAWS,KAAKC,KAAK,CACtB,SAAMC,GAAAA,kBAAQ,EAACX,qBADlB,GAAKT,OAAO,CAAGkB,SAAAA,MACb,AAAC,cAA6BG,QAAQ,8BAK1C,IAAI,CAAY,SAAMC,MAAE,CAACC,YAAY,WAArC,GAAK1B,QAAQ,CAAG,aAChB,EAACQ,UAAYO,QAAQY,GAAG,CAACV,cAAK,CAACW,KAAK,CAAC,sBACrCC,GAAAA,8CAAuB,IAGvB,GAAInB,WAAY,CACd,IAAI,CAACtC,aAAa,CAAG,KACrB,SACF,CAG0B,SAAM,gFAAA,QAAO,uCAA/ByC,cAAkB,cAAlBA,cACR,SAAMA,cAAciB,QAAQ,CAACtB,kBAA7B,cAGmB,SAAM,gFAAA,QAAO,+BAAxBM,OAAW,cAAXA,MACR,CAAA,IAAI,CAACb,MAAM,CAAG,IAAIa,OAGlB,SAAM,IAAI,CAACb,MAAM,CAAC8B,cAAc,YAAhC,cACA,SAAM,IAAI,CAAC9B,MAAM,CAAC+B,aAAa,YAA/B,cACA,SAAM,IAAI,CAAC/B,MAAM,CAACgC,YAAY,YAA9B,kBAEIC,CAAAA,GAAAA,mBAAO,KAAM,CAACC,GAAAA,kBAAM,KAAM1B,UAAS,EAAnCyB,aACF,SAAM,IAAI,CAACjC,MAAM,CAACmC,IAAI,YAAtB,cAGA,IAAI,CAACC,YAAY,GAEjB,IAAI,CAACpC,MAAM,CAACqC,MAAM,2BAGpB,IAAI,CAAClE,aAAa,CAAG,IACrB,EAACoC,UAAYO,QAAQwB,OAAO,CAACtB,cAAK,CAACC,IAAI,CAAC,4BAC1C,iBAEMsB,IAAAA,qBAAN,SAAMA,aACJC,OAA4B,CAC5BC,WAGC,4CAEKzD,8EAAAA,OAAS0D,GAAAA,gBAAO,EAACF,QAAQE,OAAO,CACtC,CAAA,IAAI,CAAC1D,MAAM,CAAGA,OAGd,GAAIwD,QAAQrC,OAAO,CAAE,CACnB,IAAI,CAACA,OAAO,CAAGqC,QAAQrC,OAAO,AAChC,CAGA,GAAIqC,QAAQG,OAAO,CAAE,CACnB,IAAI,CAACC,eAAe,CAAC5D,OAAQwD,QAAQG,OAAO,CAC9C,CAGA,SAAM,IAAI,CAACE,WAAW,CAAC7D,OAAQwD,QAAQM,SAAS,CAAE,CAChDtC,UAAU,CAAEiC,oBAAAA,4BAAAA,YAAajC,UAAU,CACnCD,QAAQ,CAAEkC,oBAAAA,4BAAAA,YAAalC,QAAQ,AACjC,WAHA,cAMA,SAAM,IAAI,CAACwC,IAAI,CAAC/D,OAAQwD,iBAAxB,cAEA,SAAOxD,UACT,iBAEM6D,IAAAA,oBAAN,SAAMA,YACJ7D,MAAgE,CAChEiB,MAA2B,CAC3BuC,OAGC,kDASKQ,SAEEC,YAEAC,qGAXJ,CAAA,IAAI,CAAC/E,aAAa,GAAK,KAAI,EAA3B,YACF,SAAM,IAAI,CAACkC,IAAI,CAACmC,gBAAAA,wBAAAA,QAASjC,QAAQ,CAAEiC,gBAAAA,wBAAAA,QAAShC,UAAU,UAAtD,oCAGF,IAAI,CAACxB,MAAM,CAAGA,OAGRgE,SAAW,IAAI,CAAC/C,MAAM,CAAC+C,QAAQ,CACrC,GAAIA,SAAU,CACNC,YAAc,2BAEdC,eAAiB,mDAEvBlE,OAAOmE,kBAAkB,CAAC,SAACC,SACzB,OAAOhC,KAAKiC,SAAS,CAACD,QAAS,SAACE,KAAMC,OACpC,GAAI,OAAOA,QAAU,UAAYL,eAAeM,IAAI,CAACD,OAAQ,CAC3D,MAAOE,GAAAA,2BAAgB,EAAC,IAAIC,KAAKH,OAAQP,SAAUC,YACrD,CACA,OAAOM,KACT,EACF,EACA,GAACf,gBAAAA,wBAAAA,QAASjC,QAAQ,GAChBO,QAAQY,GAAG,CAACV,cAAK,CAACW,KAAK,CAAC,AAAC,mBAA2B,OAATqB,WAC/C,CAGAhE,OAAO2E,GAAG,CACR,AAAC,GAA2B,OAAzB,IAAI,CAAC1D,MAAM,CAAC2D,KAAK,CAACC,MAAM,CAAC,WAC5B,SAAOC,SAAUC,yFACf,SAAO,IAAI,CAAC/D,MAAM,CAACgE,IAAI,GACzB,iBAIFhF,OAAO2E,GAAG,CACR,AAAC,GAA2B,OAAzB,IAAI,CAAC1D,MAAM,CAAC2D,KAAK,CAACC,MAAM,CAAC,gBAC5B,SAAOC,SAAUC,yFACf,SAAO,OACT,OAIF,GAAI9B,GAAAA,mBAAO,IAAI,CACbjD,OAAOiF,GAAG,CAAC,IAAK,SAACC,QAASC,OACxB,IAAMC,MAAQ,MAAKpE,MAAM,CAACgE,IAAI,CAACK,IAAI,CACjC,SAACC,SAEEA,+BADD,MAAKrE,MAAM,CAAC2D,KAAK,CAACC,MAAM,CAAGS,IAAI3E,IAAI,GAAKuE,QAAQK,GAAG,CAAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,EACjE,AAAC4E,CAAAA,CAAAA,wBAAAA,IAAI9B,OAAO,CAACgC,UAAU,UAAtBF,iCAAAA,wBAA0B,KAAI,IAAOJ,QAAQO,MAAM,CAACC,WAAW,KAEpE,GAAIN,MAAO,CACT,OAAO,MAAKO,aAAa,CAACP,MAAOnE,QAAQiE,QAASC,MACpD,CACA,MAAM,IAAIS,+BAAiB,CAAC,qBAC9B,EACF,KAAO,CACL,IAAI,CAAC5E,MAAM,CAACgE,IAAI,CAACa,GAAG,CAAC,SAACP,KAEpB,GAAI,MAAKtE,MAAM,CAAC8E,MAAM,CAACR,IAAIS,SAAS,CAAC,GAAKzE,UAAW,CACnD,MAAM,IAAIjB,MAAM,AAAC,kBAA+B,OAAdiF,IAAIS,SAAS,EACjD,CAGA/F,OAAO4E,KAAK,CAAC,CACXa,OAAQH,IAAI9B,OAAO,CAACgC,UAAU,CAC9BD,IAAK,MAAKtE,MAAM,CAAC2D,KAAK,CAACC,MAAM,CAAGS,IAAI3E,IAAI,CACxCqF,QAAS,MAAKL,aAAa,CAACL,IAAKrE,OACnC,EACF,EACF,aACF,iBAEA0E,IAAAA,sBAAAA,SAAAA,cAAcL,GAAgB,CAAErE,MAA2B,iBACzD,OAAO,SACLiE,QACAC,iDAECG,oBAKKW,QAGAC,MACFC,QAIqCjB,eAG/BkB,SAYCd,yBAGgC,KAAnCe,SAAUC,SAAUC,WAwBtBnG,QASAoG,6EAhEN,AAAClB,CAAAA,CAAAA,oBAAAA,IAAI9B,OAAO,CAACiD,MAAM,UAAlBnB,6BAAAA,sBAAuB,EAAGoB,KAAK,CAAC,SAACC,cAChC1F,OAAO2F,YAAY,CAACD,MAAOzB,QAASI,OAIhCW,QAAUY,GAAAA,mCAAmB,EAACvB,IAAK,IAAI,CAACtE,MAAM,CAAC8F,KAAK,EAGpDZ,MAAQZ,IAAI9B,OAAO,CAACgC,UAAU,GAAK,MAAQ,QAAU,OAI3D,GAAI,EACFW,QAAUY,GAAAA,qBAAa,EAACd,SAAS5D,KAAK,CAAC6C,CAAAA,eAAAA,OAAO,CAACgB,MAAM,UAAdhB,wBAAAA,eAAkB,CAAC,EAC5D,CAAE,MAAO8B,EAAG,CACV,GAAIA,AAAC,YAADA,EAAaC,aAAQ,EAAE,CACnBb,SAAWc,GAAAA,0BAAgB,EAACF,GAC/BnB,GAAG,CAAC,SAACsB,cAAUA,MAAMC,OAAO,GAC5BtG,IAAI,CAAC,IACR,OAAM,IAAIuG,iCAAmB,CAACjB,SAAU,CACtCkB,SAAUN,CACZ,EACF,KAAO,CACL,MAAMA,CACR,CACF,CAGA7B,MAAMoC,IAAI,CAACjC,CAAAA,yBAAAA,IAAI9B,OAAO,CAACgE,WAAW,UAAvBlC,kCAAAA,yBAA2B,oBAGK,SAAM,AAAC,qDAGtCmC,YAKApB,SACAC,SACAC,WAECS,6EAXP/F,OAAOyG,KAAK,CAAZzG,6DAEMwG,YAAcxG,OAAOyG,KAAK,CAACC,UAAU,CAACrC,IAAI3E,IAAI,CAAEwF,SACtD,GAAIsB,YAAYC,KAAK,GAAK,MAAO,CAC/B,SAAO,CAAErB,SAAU,KAAME,WAAY,IAAK,EAC5C,CAEMF,SAAWoB,YAAYG,GAAG,CAC1BtB,SAAWmB,YAAYI,GAAG,CACb,SAAM5G,OAAOyG,KAAK,CAAC/C,GAAG,CAAC0B,kBAApCE,WAAa,cACnB,SAAO,CAAEF,SAAAA,SAAUC,SAAAA,SAAUC,WAAAA,UAAW,UACjCS,gBACPlF,QAAQgG,KAAK,CAACd,sBAEhB,SAAO,CAAEX,SAAU,KAAME,WAAY,IAAK,UAE5C,SAAO,CAAEF,SAAU,KAAME,WAAY,IAAK,KAC5C,gBAlB2C,KAAA,cAAnCF,SAAmC,KAAnCA,SAAUC,SAAyB,KAAzBA,SAAUC,WAAe,KAAfA,WAmB5B,GAAIA,aAAe,KAAM,CACvB,SAAOA,WACT,CAGMnG,QAAUa,OAAO8G,eAAe,CACpC,CACE7C,QAAAA,QACAC,MAAAA,MACA6C,QAAS9C,QAAQ8C,OAAO,AAC1B,EACA9C,QACAC,OAEIqB,MAAQ,IAAI,CAACxF,MAAM,CAAC8E,MAAM,CAACR,IAAIS,SAAS,CAAC,CAC/C,SAAO,IAAI,CAAC3G,iBAAiB,CAAC6I,GAAG,CAAC,CAAE7H,QAAAA,OAAQ,EAAG,qDACvC8H,OAWK5C,gGAXI,SAAM,AAACkB,KAAa,CAAClB,IAAI6C,UAAU,CAAC,CAACC,KAAK,CACvD5B,MACAlB,IAAI+C,UAAU,CAACxC,GAAG,CAAC,SAACyC,OAElB,GAAIC,mBAAY,CAACC,SAAS,CAACF,MAAMf,IAAI,EAAG,CACtC,OAAOnH,OACT,KAAO,CACL,OAAO+F,OAAO,CAACmC,MAAMG,IAAI,CAAC,AAC5B,CACF,YATIP,OAAS,cAWf/C,MAAMoC,IAAI,CAACjC,CAAAA,yBAAAA,IAAI9B,OAAO,CAACgE,WAAW,UAAvBlC,kCAAAA,yBAA2B,wBAGlCrE,CAAAA,OAAOyG,KAAK,EAAIrB,QAAO,EAAvBpF,YACF,SAAMA,OAAOyG,KAAK,CAACgB,GAAG,CAACrC,SAAU6B,OAAQ5B,kBAAzC,oCAEF,SAAO4B,UACT,UACF,eACF,IAEA9E,IAAAA,qBAAAA,SAAAA,8BACE,IAAMuF,UAAYhI,aAAI,CAACG,IAAI,CAAC,IAAI,CAACN,WAAW,CAAE,OAC9C,IAAMoI,SAAWC,QAAQ,WACzB,CAAA,IAAI,CAAChJ,OAAO,CAAG+I,SAASE,KAAK,CAACH,UAAW,CACvCI,QAAS,SAACpI,KAAMqI,aACd,AAAC,CAAC,EAACA,cAAAA,sBAAAA,MAAOC,MAAM,KACd,CAACtI,KAAKuI,QAAQ,CAAC,QACf,CAACvI,KAAKuI,QAAQ,CAAC,UACjBvI,KAAKuI,QAAQ,CAAC,iBAChBC,WAAY,KACZC,cAAe,IACjB,GACA,IAAI,CAACvJ,OAAO,CAACwJ,EAAE,CAAC,MAAO,SAAOC,MAAeC,uHAC3C,GAAID,QAAU,UAAYA,QAAU,MAAO,CACzC,SACF,CAEA,SAAM,IAAI,CAACE,gBAAgB,CAACF,MAAOC,kBAAnC,0BACF,gBACF,IAEQ3F,IAAAA,wBAAR,SAAQA,gBACN5D,MAAuB,CACvB2D,OAAuC,EAEvC,GAAI,CAACA,QAAS,CACZ,MACF,CAEA,IAAM8F,eAAiB,CACrBC,SAAU,oBACVC,GAAI,aACJC,KAAM,gBACNC,UAAW,oBACb,EAEA,IAAMC,eAAiB,SACrBlC,IACAmC,YAEA,IAAMC,OAASrG,OAAO,CAACiE,IAAI,CAC3B,GAAI,CAACoC,OAAQ,OAEb,GAAIA,SAAW,KAAM,CACnBhK,OAAOiK,QAAQ,CAAC,gBAAOF,2EAAP,cAClB,KAAO,CACL/J,OAAOiK,QAAQ,CAAC,gBAAOF,2EAAP,cAAoBC,OACtC,CACF,EAEAE,OAAOC,OAAO,CAACV,gBAAgBW,OAAO,CAAC,qDAAExC,cAAKmC,qBAC5CD,eAAelC,IAA6BmC,WAC9C,GAEA,GAAIpG,QAAQ0G,MAAM,CAAE,CAClB1G,QAAQ0G,MAAM,CAACrK,OACjB,CACF,IAEc+D,IAAAA,aAAd,SAAcA,KAAK/D,MAAuB,CAAEwD,OAA4B,kDACzDA,gBACAA,iBAoBTA,mBArBSA,qBAAP8G,KACO9G,qBAAP+G,KAOAC,SAcmBhH,0EAtBnB8G,KAAO9G,CAAAA,sBAAAA,gBAAAA,QAAQiH,MAAM,UAAdjH,gCAAAA,gBAAgB8G,IAAI,UAApB9G,8BAAAA,qBAAwB,IAC/B+G,KAAO/G,CAAAA,sBAAAA,iBAAAA,QAAQiH,MAAM,UAAdjH,iCAAAA,iBAAgB+G,IAAI,UAApB/G,8BAAAA,qBAAwB,YAErCxD,OAAO0K,OAAO,CAAC,UAAW,qDAClBlH,8BAAAA,0FAAN,UAAMA,mBAAAA,QAAQmH,SAAS,UAAjBnH,oCAAAA,8BAAAA,mBAAmBoH,UAAU,UAA7BpH,8CAAAA,mCAAAA,mBAAgCxD,gBAAtC,cACA,SAAM,IAAI,CAAC6K,OAAO,WAAlB,0BACF,iBAEML,SAAW,qDAINM,sGAFP,SAAM9K,OAAO+K,KAAK,WAAlB,cACAC,QAAQC,IAAI,CAAC,sBACNH,kBACPhJ,QAAQgG,KAAK,CAAC,yBAA0BgD,KACxCE,QAAQC,IAAI,CAAC,kCAEjB,MAEAD,QAAQ3B,EAAE,CAAC,SAAUmB,UACrBQ,QAAQ3B,EAAE,CAAC,UAAWmB,UAEtB,IAAIhH,mBAAAA,QAAQmH,SAAS,UAAjBnH,mCAAAA,mBAAmB0H,OAAO,CAAE,EAC9BlL,OAAOmL,eAAe,EAAC3H,oBAAAA,QAAQmH,SAAS,UAAjBnH,oCAAAA,oBAAmB0H,OAAO,CACnD,CAEAlL,OACGyK,MAAM,CAAC,CAAEH,KAAAA,KAAMC,KAAAA,IAAK,GACpBa,IAAI,CAAC,qDACE5H,2BAAAA,0FAAN,UAAMA,mBAAAA,QAAQmH,SAAS,UAAjBnH,oCAAAA,2BAAAA,mBAAmB6H,OAAO,UAA1B7H,2CAAAA,gCAAAA,mBAA6BxD,gBAAnC,0BACF,OACCsL,KAAK,CAAC,SAAOR,kHACZhJ,QAAQgG,KAAK,CAAC9F,cAAK,CAACuJ,GAAG,CAAC,0BAA2BT,MACnD,SAAMN,mBAAN,0BACF,kBACJ,iBAEchB,IAAAA,yBAAd,SAAcA,iBACZF,KAAa,CACbC,QAAgB,4CASViC,oFANN,GAAI,IAAI,CAAC1L,YAAY,CAAC2L,MAAM,GAAK,EAAG,CAClC,IAAI,CAAC1L,YAAY,CAAG2E,KAAKgH,GAAG,EAC9B,CAEA,IAAI,CAAC5L,YAAY,CAAC6L,IAAI,CAACpC,UAEjBiC,aAAejC,SAASqC,OAAO,CAAC,IAAI,CAACpL,WAAW,CAAE,OACxDsB,QAAQY,GAAG,CAACV,cAAK,CAAC6J,IAAI,CAAC,AAAC,YAAsB7J,OAAXsH,MAAM,OAA8B,OAAzBtH,cAAK,CAAC8J,IAAI,CAACN,iBAEzD,SAAM,IAAI,CAACxK,MAAM,CAAC+K,eAAe,EAAExC,mBAAnC,aAGA,CAAA,IAAI,CAACzJ,YAAY,CAAG,IAAI,CAACA,YAAY,CAACe,KAAK,CAAC,OAGxC,CAAA,IAAI,CAACf,YAAY,CAAC2L,MAAM,GAAK,CAAA,EAA7B,YACF,SAAM,IAAI,CAACO,SAAS,WAApB,gDAEJ,iBAEcA,IAAAA,kBAAd,SAAcA,2DAGNC,QACAC,UACAC,IACAC,iFALA,GAAA,IAAI,CAACpL,MAAM,EAACqL,aAAa,CAAC,SAAM,IAAI,CAACrL,MAAM,CAACsL,mBAAmB,WAArE,SAAM,YAA0B,wBAAhC,cAEML,QAAUvH,KAAKgH,GAAG,GAClBQ,UAAYD,QAAU,IAAI,CAAClM,YAAY,CACvCoM,IAAM,AAAC,aAA+C,OAAnCnK,cAAK,CAAC6J,IAAI,CAACU,KAAK,CAAC,AAAC,GAAY,OAAVL,UAAU,QACjDE,OAASI,KAAKC,GAAG,CAAC,EAAG,AAACzB,CAAAA,QAAQ0B,MAAM,CAACC,OAAO,CAAGR,IAAIV,MAAM,AAAD,EAAK,GAEnE3J,QAAQY,GAAG,CACTV,cAAK,CAAC4K,KAAK,CAACC,OAAO,CAAC,IAAIC,MAAM,CAACV,QAAUD,IAAM,IAAIW,MAAM,CAACV,sBAE9D,iBAEMvB,IAAAA,gBAAN,SAAMA,oDAGE,cAFEkC,iFAAAA,UAAclE,QAAQ,0BAAtBkE,UACR,SAAMA,UAAUlC,OAAO,WAAvB,cACA,UAAM,cAAA,IAAI,CAAChL,OAAO,UAAZ,8BAAA,cAAckL,KAAK,WAAzB,0BACF,yBA/fI7L,eAigBC,IAAMD,OAAS,IAAIC"}
|
|
1
|
+
{"version":3,"sources":["../../src/api/sonamu.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"async_hooks\";\nimport chalk from \"chalk\";\nimport fastify from \"fastify\";\nimport { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport { exists } from \"../utils/fs-utils\";\n\nimport type { FSWatcher } from \"chokidar\";\nimport { formatInTimeZone } from \"date-fns-tz\";\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport type { IncomingMessage, Server, ServerResponse } from \"http\";\nimport { ZodError, ZodObject } from \"zod\";\nimport { DB, SonamuDBConfig } from \"../database/db\";\nimport { attachOnDuplicateUpdate } from \"../database/knex-plugins/knex-on-duplicate-update\";\nimport {\n BadRequestException,\n NotFoundException,\n} from \"../exceptions/so-exceptions\";\nimport type { Driver } from \"../file-storage/driver\";\nimport { createSSEFactory } from \"../stream/sse\";\nimport type { Syncer } from \"../syncer/syncer\";\nimport {\n ApiParamType,\n SonamuFastifyConfig,\n SonamuServerOptions,\n} from \"../types/types\";\nimport { isLocal, isTest } from \"../utils/controller\";\nimport { findApiRootPath } from \"../utils/utils\";\nimport { humanizeZodError } from \"../utils/zod-error\";\nimport { fastifyCaster } from \"./caster\";\nimport { getZodObjectFromApi } from \"./code-converters\";\nimport type { Context, UploadContext } from \"./context\";\nimport type { ExtendedApi } from \"./decorators\";\n\nexport type SonamuConfig = {\n projectName?: string;\n api: {\n dir: string;\n };\n sync: {\n targets: string[];\n };\n route: {\n prefix: string;\n };\n timezone?: string;\n ui?: {\n port: number;\n };\n};\nexport type SonamuSecrets = {\n [key: string]: string;\n};\nclass SonamuClass {\n public isInitialized: boolean = false;\n public asyncLocalStorage: AsyncLocalStorage<{\n context: Context;\n }> = new AsyncLocalStorage();\n\n public uploadStorage: AsyncLocalStorage<{\n uploadContext: UploadContext;\n }> = new AsyncLocalStorage();\n\n public getContext(): Context {\n const store = this.asyncLocalStorage.getStore();\n if (store?.context) {\n return store.context;\n }\n throw new Error(\"Sonamu cannot find context\");\n }\n\n public getUploadContext(): UploadContext {\n const store = this.uploadStorage.getStore();\n if (store?.uploadContext) {\n return store.uploadContext;\n }\n throw new Error(\n \"Sonamu cannot find upload context. Did you use @upload decorator?\"\n );\n }\n\n private _apiRootPath: string | null = null;\n set apiRootPath(apiRootPath: string) {\n this._apiRootPath = apiRootPath;\n }\n get apiRootPath(): string {\n if (this._apiRootPath === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._apiRootPath!;\n }\n get appRootPath(): string {\n return this.apiRootPath.split(path.sep).slice(0, -1).join(path.sep);\n }\n\n private _dbConfig: SonamuDBConfig | null = null;\n set dbConfig(dbConfig: SonamuDBConfig) {\n this._dbConfig = dbConfig;\n }\n get dbConfig(): SonamuDBConfig {\n if (this._dbConfig === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._dbConfig!;\n }\n\n private _syncer: Syncer | null = null;\n set syncer(syncer: Syncer) {\n this._syncer = syncer;\n }\n get syncer(): Syncer {\n if (this._syncer === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._syncer!;\n }\n\n private _config: SonamuConfig | null = null;\n set config(config: SonamuConfig) {\n this._config = config;\n }\n get config(): SonamuConfig {\n if (this._config === null) {\n throw new Error(\"Sonamu has not been initialized\");\n }\n return this._config;\n }\n\n private _secrets: SonamuSecrets | null = null;\n set secrets(secrets: SonamuSecrets) {\n this._secrets = secrets;\n }\n get secrets(): SonamuSecrets | null {\n return this._secrets;\n }\n\n private _storage: Driver | null = null;\n set storage(storage: Driver) {\n this._storage = storage;\n }\n get storage(): Driver | null {\n return this._storage;\n }\n\n // HMR 처리\n public watcher: FSWatcher | null = null;\n private pendingFiles: string[] = [];\n private hmrStartTime: number = 0;\n\n public server: FastifyInstance | null = null;\n\n async initForTesting() {\n await this.init(true, false, undefined, true);\n }\n\n async init(\n doSilent: boolean = false,\n enableSync: boolean = true,\n apiRootPath?: string,\n forTesting: boolean = false\n ) {\n if (this.isInitialized) {\n return;\n }\n !doSilent &&\n console.time(\n chalk.cyan(`Sonamu.init${forTesting ? \" for testing\" : \"\"}`)\n );\n\n // API 루트 패스\n this.apiRootPath = apiRootPath ?? findApiRootPath();\n const configPath = path.join(this.apiRootPath, \"sonamu.config.json\");\n const secretsPath = path.join(this.apiRootPath, \"sonamu.secrets.json\");\n if (!(await exists(configPath))) {\n throw new Error(`Cannot find sonamu.config.json in ${configPath}`);\n }\n this.config = JSON.parse(\n (await readFile(configPath)).toString()\n ) as SonamuConfig;\n if (await exists(secretsPath)) {\n this.secrets = JSON.parse(\n (await readFile(secretsPath)).toString()\n ) as SonamuSecrets;\n }\n\n // DB 로드\n this.dbConfig = await DB.readKnexfile();\n !doSilent && console.log(chalk.green(\"DB Config Loaded!\"));\n attachOnDuplicateUpdate();\n\n // 테스팅인 경우 엔티티 로드 & 싱크 없이 중단\n if (forTesting) {\n this.isInitialized = true;\n return;\n }\n\n // Entity 로드\n const { EntityManager } = await import(\"../entity/entity-manager\");\n await EntityManager.autoload(doSilent);\n\n // Syncer\n const { Syncer } = await import(\"../syncer/syncer\");\n this.syncer = new Syncer();\n\n // Autoload: Models / Types / APIs\n await this.syncer.autoloadModels();\n await this.syncer.autoloadTypes();\n await this.syncer.autoloadApis();\n\n if (isLocal() && !isTest() && enableSync) {\n await this.syncer.sync();\n\n // FIXME: hmr 설정된 경우만 워처 시작\n this.startWatcher();\n\n this.syncer.syncUI();\n }\n\n this.isInitialized = true;\n !doSilent && console.timeEnd(chalk.cyan(\"Sonamu.init\"));\n }\n\n async createServer(\n options: SonamuServerOptions,\n initOptions?: {\n enableSync?: boolean;\n doSilent?: boolean;\n }\n ) {\n const server = fastify(options.fastify);\n this.server = server;\n\n // Storage 설정 저장\n if (options.storage) {\n this.storage = options.storage;\n }\n\n // 플러그인 등록\n if (options.plugins) {\n this.registerPlugins(server, options.plugins);\n }\n\n // API 라우팅 설정\n await this.withFastify(server, options.apiConfig, {\n enableSync: initOptions?.enableSync,\n doSilent: initOptions?.doSilent,\n });\n\n // 서버 시작\n await this.boot(server, options);\n\n return server;\n }\n\n async withFastify(\n server: FastifyInstance<Server, IncomingMessage, ServerResponse>,\n config: SonamuFastifyConfig,\n options?: {\n enableSync?: boolean;\n doSilent?: boolean;\n }\n ) {\n if (this.isInitialized === false) {\n await this.init(options?.doSilent, options?.enableSync);\n }\n\n this.server = server;\n\n // timezone 설정\n const timezone = this.config.timezone;\n if (timezone) {\n const DATE_FORMAT = \"yyyy-MM-dd'T'HH:mm:ssXXX\";\n // ISO 8601 날짜 형식 정규식 (예: 2024-01-15T09:30:00.000Z)\n const ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/;\n\n server.setReplySerializer((payload) => {\n return JSON.stringify(payload, (_key, value) => {\n if (typeof value === \"string\" && ISO_DATE_REGEX.test(value)) {\n return formatInTimeZone(new Date(value), timezone, DATE_FORMAT);\n }\n return value;\n });\n });\n !options?.doSilent &&\n console.log(chalk.green(`Timezone set to ${timezone}`));\n }\n\n // 전체 라우팅 리스트\n server.get(\n `${this.config.route.prefix}/routes`,\n async (_request, _reply): Promise<any> => {\n return this.syncer.apis;\n }\n );\n\n // Healthcheck API\n server.get(\n `${this.config.route.prefix}/healthcheck`,\n async (_request, _reply): Promise<string> => {\n return \"ok\";\n }\n );\n\n // API 라우팅 (로컬HMR 상태와 구분)\n if (isLocal()) {\n server.all(\"*\", (request, reply) => {\n const found = this.syncer.apis.find(\n (api) =>\n this.config.route.prefix + api.path === request.url.split(\"?\")[0] &&\n (api.options.httpMethod ?? \"GET\") === request.method.toUpperCase()\n );\n if (found) {\n return this.getApiHandler(found, config)(request, reply);\n }\n throw new NotFoundException(\"존재하지 않는 API 접근입니다.\");\n });\n } else {\n this.syncer.apis.map((api) => {\n // model\n if (this.syncer.models[api.modelName] === undefined) {\n throw new Error(`정의되지 않은 모델에 접근 ${api.modelName}`);\n }\n\n // route\n server.route({\n method: api.options.httpMethod!,\n url: this.config.route.prefix + api.path,\n handler: this.getApiHandler(api, config),\n }); // END server.route\n });\n }\n }\n\n getApiHandler(api: ExtendedApi, config: SonamuFastifyConfig) {\n return async (\n request: FastifyRequest,\n reply: FastifyReply\n ): Promise<unknown> => {\n (api.options.guards ?? []).every((guard) =>\n config.guardHandler(guard, request, api)\n );\n\n // 파라미터 정보로 zod 스키마 빌드\n const ReqType = getZodObjectFromApi(api, this.syncer.types);\n\n // request 파싱\n const which = api.options.httpMethod === \"GET\" ? \"query\" : \"body\";\n let reqBody: {\n [key: string]: unknown;\n };\n try {\n reqBody = fastifyCaster(ReqType).parse(request[which] ?? {});\n } catch (e) {\n if (e instanceof ZodError) {\n const messages = humanizeZodError(e)\n .map((issue) => issue.message)\n .join(\" \");\n throw new BadRequestException(messages, {\n zodError: e,\n });\n } else {\n throw e;\n }\n }\n\n // Content-Type\n reply.type(api.options.contentType ?? \"application/json\");\n\n // 캐시\n const { cacheKey, cacheTtl, cachedData } = await (async () => {\n if (config.cache) {\n try {\n const cacheKeyRes = config.cache.resolveKey(api.path, reqBody);\n if (cacheKeyRes.cache === false) {\n return { cacheKey: null, cachedData: null };\n }\n\n const cacheKey = cacheKeyRes.key;\n const cacheTtl = cacheKeyRes.ttl;\n const cachedData = await config.cache.get(cacheKey);\n return { cacheKey, cacheTtl, cachedData };\n } catch (e) {\n console.error(e);\n }\n return { cacheKey: null, cachedData: null };\n }\n return { cacheKey: null, cachedData: null };\n })();\n if (cachedData !== null) {\n return cachedData;\n }\n\n // createSSEFactory 함수에 미리 request의 socket과 reply를 바인딩.\n const createSSE = (<T extends ZodObject>(\n _request: FastifyRequest,\n _reply: FastifyReply,\n _events: T\n ) => createSSEFactory(_request.socket, _reply, _events)).bind(\n null,\n request,\n reply\n );\n\n // 결과 (AsyncLocalStorage 적용)\n const context: Context = {\n ...config.contextProvider(\n {\n request,\n reply,\n headers: request.headers,\n createSSE,\n },\n request,\n reply\n ),\n };\n\n const model = this.syncer.models[api.modelName];\n return this.asyncLocalStorage.run({ context }, async () => {\n const result = await (model as any)[api.methodName].apply(\n model,\n api.parameters.map((param) => {\n // Context 인젝션\n if (ApiParamType.isContext(param.type)) {\n return context;\n } else {\n return reqBody[param.name];\n }\n })\n );\n reply.type(api.options.contentType ?? \"application/json\");\n\n // 캐시 키 있는 경우 갱신 후 저장\n if (config.cache && cacheKey) {\n await config.cache.put(cacheKey, result, cacheTtl);\n }\n return result;\n });\n };\n }\n\n startWatcher(): void {\n const watchPath = path.join(this.apiRootPath, \"src\");\n const chokidar = require(\"chokidar\") as typeof import(\"chokidar\");\n this.watcher = chokidar.watch(watchPath, {\n ignored: (path, stats) =>\n (!!stats?.isFile() &&\n !path.endsWith(\".ts\") &&\n !path.endsWith(\".json\")) ||\n path.endsWith(\"src/index.ts\"),\n persistent: true,\n ignoreInitial: true,\n });\n this.watcher.on(\"all\", async (event: string, filePath: string) => {\n if (event !== \"change\" && event !== \"add\") {\n return;\n }\n\n try {\n await this.handleFileChange(event, filePath);\n } catch (e) {\n console.error(e);\n }\n });\n }\n\n /*\n A function that automatically handles init and destroy when using Sonamu via scripts. \n */\n async runScript(fn: () => Promise<void>) {\n await this.init(true, false, undefined, false);\n try {\n await fn();\n } finally {\n await this.destroy();\n }\n }\n\n private registerPlugins(\n server: FastifyInstance,\n plugins: SonamuServerOptions[\"plugins\"]\n ) {\n if (!plugins) {\n return;\n }\n\n const pluginsModules = {\n cors: \"@fastify/cors\",\n formbody: \"@fastify/formbody\",\n multipart: \"@fastify/multipart\",\n qs: \"fastify-qs\",\n sse: \"fastify-sse-v2\",\n } as const;\n\n const registerPlugin = <K extends keyof NonNullable<typeof plugins>>(\n key: K,\n pluginName: string\n ) => {\n const option = plugins[key];\n if (!option) return;\n\n if (option === true) {\n server.register(import(pluginName));\n } else {\n server.register(import(pluginName), option);\n }\n };\n\n Object.entries(pluginsModules).forEach(([key, pluginName]) => {\n registerPlugin(key as keyof typeof plugins, pluginName);\n });\n\n if (plugins.custom) {\n plugins.custom(server);\n }\n }\n\n private async boot(server: FastifyInstance, options: SonamuServerOptions) {\n const port = options.listen?.port ?? 3000;\n const host = options.listen?.host ?? \"localhost\";\n\n server.addHook(\"onClose\", async () => {\n await options.lifecycle?.onShutdown?.(server);\n await this.destroy();\n });\n\n const shutdown = async () => {\n try {\n await server.close();\n process.exit(0);\n } catch (err) {\n console.error(\"Error during shutdown:\", err);\n process.exit(1);\n }\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n if (options.lifecycle?.onError) {\n server.setErrorHandler(options.lifecycle?.onError);\n }\n\n server\n .listen({ port, host })\n .then(async () => {\n await options.lifecycle?.onStart?.(server);\n })\n .catch(async (err) => {\n console.error(chalk.red(\"Failed to start server:\", err));\n await shutdown();\n });\n }\n\n private async handleFileChange(\n event: string,\n filePath: string\n ): Promise<void> {\n // 첫 번째 파일이면 HMR 시작 시간 기록\n if (this.pendingFiles.length === 0) {\n this.hmrStartTime = Date.now();\n }\n\n this.pendingFiles.push(filePath);\n\n const relativePath = filePath.replace(this.apiRootPath, \"api\");\n console.log(chalk.bold(`Detected(${event}): ${chalk.blue(relativePath)}`));\n\n await this.syncer.syncFromWatcher([filePath]);\n\n // 처리 완료된 파일을 대기 목록에서 제거\n this.pendingFiles = this.pendingFiles.slice(1);\n\n // 모든 파일 처리가 완료되면 최종 메시지 출력\n if (this.pendingFiles.length === 0) {\n await this.finishHMR();\n }\n }\n\n private async finishHMR(): Promise<void> {\n await this.syncer.saveChecksums(await this.syncer.getCurrentChecksums());\n\n const endTime = Date.now();\n const totalTime = endTime - this.hmrStartTime;\n const msg = `HMR Done! ${chalk.bold.white(`${totalTime}ms`)}`;\n const margin = Math.max(0, (process.stdout.columns - msg.length) / 2);\n\n console.log(\n chalk.black.bgGreen(\" \".repeat(margin) + msg + \" \".repeat(margin))\n );\n }\n\n async destroy(): Promise<void> {\n const { BaseModel } = require(\"../database/base-model\");\n await BaseModel.destroy();\n await this.watcher?.close();\n this.storage?.destroy();\n }\n}\nexport const Sonamu = new SonamuClass();\n"],"names":["Sonamu","SonamuClass","isInitialized","asyncLocalStorage","AsyncLocalStorage","uploadStorage","_apiRootPath","_dbConfig","_syncer","_config","_secrets","_storage","watcher","pendingFiles","hmrStartTime","server","getContext","store","getStore","context","Error","getUploadContext","uploadContext","apiRootPath","appRootPath","split","path","sep","slice","join","dbConfig","syncer","config","secrets","storage","initForTesting","init","undefined","doSilent","enableSync","forTesting","configPath","secretsPath","EntityManager","Syncer","console","time","chalk","cyan","findApiRootPath","exists","JSON","parse","readFile","toString","DB","readKnexfile","log","green","attachOnDuplicateUpdate","autoload","autoloadModels","autoloadTypes","autoloadApis","isLocal","isTest","sync","startWatcher","syncUI","timeEnd","createServer","options","initOptions","fastify","plugins","registerPlugins","withFastify","apiConfig","boot","timezone","DATE_FORMAT","ISO_DATE_REGEX","setReplySerializer","payload","stringify","_key","value","test","formatInTimeZone","Date","get","route","prefix","_request","_reply","apis","all","request","reply","found","find","api","url","httpMethod","method","toUpperCase","getApiHandler","NotFoundException","map","models","modelName","handler","ReqType","which","reqBody","messages","cacheKey","cacheTtl","cachedData","createSSE","model","guards","every","guard","guardHandler","getZodObjectFromApi","types","fastifyCaster","e","ZodError","humanizeZodError","issue","message","BadRequestException","zodError","type","contentType","cacheKeyRes","cache","resolveKey","key","ttl","error","_events","createSSEFactory","socket","bind","contextProvider","headers","run","result","methodName","apply","parameters","param","ApiParamType","isContext","name","put","watchPath","chokidar","require","watch","ignored","stats","isFile","endsWith","persistent","ignoreInitial","on","event","filePath","handleFileChange","runScript","fn","destroy","pluginsModules","cors","formbody","multipart","qs","sse","registerPlugin","pluginName","option","register","Object","entries","forEach","custom","port","host","shutdown","listen","addHook","lifecycle","onShutdown","err","close","process","exit","onError","setErrorHandler","then","onStart","catch","red","relativePath","length","now","push","replace","bold","blue","syncFromWatcher","finishHMR","endTime","totalTime","msg","margin","saveChecksums","getCurrentChecksums","white","Math","max","stdout","columns","black","bgGreen","repeat","BaseModel"],"mappings":"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"}
|
|
@@ -2,4 +2,8 @@
|
|
|
2
2
|
* SWC 빌드 명령어
|
|
3
3
|
*/
|
|
4
4
|
export declare const SWC_BUILD_COMMAND = "swc src -d dist --strip-leading-paths --source-maps -C module.type=commonjs -C jsc.parser.syntax=typescript -C jsc.parser.decorators=true -C jsc.target=es5";
|
|
5
|
+
/**
|
|
6
|
+
* TSC 타입 체크 명령어
|
|
7
|
+
*/
|
|
8
|
+
export declare const TSC_TYPE_CHECK_COMMAND = "tsc --noEmit";
|
|
5
9
|
//# sourceMappingURL=build-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB,gKACiI,CAAC"}
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB,gKACiI,CAAC;AAEhK;;GAEG;AACH,eAAO,MAAM,sBAAsB,iBAAiB,CAAC"}
|
package/dist/bin/build-config.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get SWC_BUILD_COMMAND(){return SWC_BUILD_COMMAND},get TSC_TYPE_CHECK_COMMAND(){return TSC_TYPE_CHECK_COMMAND}});var SWC_BUILD_COMMAND="swc src -d dist --strip-leading-paths --source-maps -C module.type=commonjs -C jsc.parser.syntax=typescript -C jsc.parser.decorators=true -C jsc.target=es5";var TSC_TYPE_CHECK_COMMAND="tsc --noEmit";
|
|
2
2
|
//# sourceMappingURL=build-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/build-config.ts"],"sourcesContent":["/**\n * SWC 빌드 명령어\n */\nexport const SWC_BUILD_COMMAND =\n \"swc src -d dist --strip-leading-paths --source-maps -C module.type=commonjs -C jsc.parser.syntax=typescript -C jsc.parser.decorators=true -C jsc.target=es5\";\n"],"names":["SWC_BUILD_COMMAND"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/bin/build-config.ts"],"sourcesContent":["/**\n * SWC 빌드 명령어\n */\nexport const SWC_BUILD_COMMAND =\n \"swc src -d dist --strip-leading-paths --source-maps -C module.type=commonjs -C jsc.parser.syntax=typescript -C jsc.parser.decorators=true -C jsc.target=es5\";\n\n/**\n * TSC 타입 체크 명령어\n */\nexport const TSC_TYPE_CHECK_COMMAND = \"tsc --noEmit\";\n"],"names":["SWC_BUILD_COMMAND","TSC_TYPE_CHECK_COMMAND"],"mappings":"mPAGaA,2BAAAA,uBAMAC,gCAAAA,0BANN,IAAMD,kBACX,8JAKK,IAAMC,uBAAyB"}
|
package/dist/bin/cli-wrapper.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env ts-node
|
|
2
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _child_process=require("child_process");var _path=require("path");var _fs=require("fs");var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _buildconfig=require("./build-config");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}var scriptPath=(0,_path.resolve)(__dirname,"cli.js");var args=process.argv.slice(2);function build(){try{(0,_child_process.execSync)(_buildconfig.SWC_BUILD_COMMAND,{cwd:process.cwd(),stdio:"inherit"})}catch(error){console.error(_chalk.default.red("Build failed."),error);process.exit(1)}}if(args[0]==="build"){console.log(_chalk.default.blue("Building the project..."));build();console.log(_chalk.default.green("Build completed successfully."));process.exit(0)}if(args[0]==="dev:serve"){build()}if(!(0,_fs.existsSync)(scriptPath)){console.error("Error: Script not found at ".concat(scriptPath));process.exit(1)}var result=(0,_child_process.spawnSync)(process.execPath,[scriptPath].concat(_to_consumable_array(args)),{stdio:"inherit"});var _result_status;process.exit((_result_status=result.status)!==null&&_result_status!==void 0?_result_status:1);
|
|
2
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _child_process=require("child_process");var _path=require("path");var _fs=require("fs");var _chalk=/*#__PURE__*/_interop_require_default(require("chalk"));var _buildconfig=require("./build-config");function _array_like_to_array(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _array_without_holes(arr){if(Array.isArray(arr))return _array_like_to_array(arr)}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _iterable_to_array(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _to_consumable_array(arr){return _array_without_holes(arr)||_iterable_to_array(arr)||_unsupported_iterable_to_array(arr)||_non_iterable_spread()}function _unsupported_iterable_to_array(o,minLen){if(!o)return;if(typeof o==="string")return _array_like_to_array(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _array_like_to_array(o,minLen)}var scriptPath=(0,_path.resolve)(__dirname,"cli.js");var args=process.argv.slice(2);function build(){var checkTypes=arguments.length>0&&arguments[0]!==void 0?arguments[0]:false;try{(0,_child_process.execSync)(_buildconfig.SWC_BUILD_COMMAND,{cwd:process.cwd(),stdio:"inherit"})}catch(error){console.error(_chalk.default.red("Build failed."),error);process.exit(1)}if(checkTypes){try{console.log(_chalk.default.blue("Checking types with tsc..."));(0,_child_process.execSync)(_buildconfig.TSC_TYPE_CHECK_COMMAND,{cwd:process.cwd(),stdio:"inherit"})}catch(error){console.error(_chalk.default.red("Type check failed."),error);process.exit(1)}}}if(args[0]==="build"){console.log(_chalk.default.blue("Building the project..."));build(true);console.log(_chalk.default.green("Build completed successfully."));process.exit(0)}if(args[0]==="dev:serve"){build()}if(!(0,_fs.existsSync)(scriptPath)){console.error("Error: Script not found at ".concat(scriptPath));process.exit(1)}var result=(0,_child_process.spawnSync)(process.execPath,["--no-warnings",scriptPath].concat(_to_consumable_array(args)),{stdio:"inherit"});var _result_status;process.exit((_result_status=result.status)!==null&&_result_status!==void 0?_result_status:1);
|
|
3
3
|
//# sourceMappingURL=cli-wrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/cli-wrapper.ts"],"sourcesContent":["#!/usr/bin/env ts-node\n\nimport { spawnSync, execSync } from \"child_process\";\nimport { resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport chalk from \"chalk\";\nimport { SWC_BUILD_COMMAND } from \"./build-config\";\n\nconst scriptPath = resolve(__dirname, \"cli.js\");\nconst args = process.argv.slice(2);\n\n// build 명령어는 dist 없이도 실행 가능하도록 cli.ts 외부에서 처리(Sonamu.init에서 dist 필요)\nfunction build() {\n try {\n execSync(SWC_BUILD_COMMAND, { cwd: process.cwd(), stdio: \"inherit\" });\n } catch (error) {\n console.error(chalk.red(\"Build failed.\"), error);\n process.exit(1);\n }\n}\n\nif (args[0] === \"build\") {\n console.log(chalk.blue(\"Building the project...\"));\n build();\n console.log(chalk.green(\"Build completed successfully.\"));\n process.exit(0);\n}\n\nif (args[0] === \"dev:serve\") {\n build();\n}\n\nif (!existsSync(scriptPath)) {\n console.error(`Error: Script not found at ${scriptPath}`);\n process.exit(1);\n}\n\nconst result = spawnSync(process.execPath,
|
|
1
|
+
{"version":3,"sources":["../../src/bin/cli-wrapper.ts"],"sourcesContent":["#!/usr/bin/env ts-node\n\nimport { spawnSync, execSync } from \"child_process\";\nimport { resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport chalk from \"chalk\";\nimport { SWC_BUILD_COMMAND, TSC_TYPE_CHECK_COMMAND } from \"./build-config\";\n\nconst scriptPath = resolve(__dirname, \"cli.js\");\nconst args = process.argv.slice(2);\n\n// build 명령어는 dist 없이도 실행 가능하도록 cli.ts 외부에서 처리(Sonamu.init에서 dist 필요)\nfunction build(checkTypes: boolean = false) {\n try {\n execSync(SWC_BUILD_COMMAND, { cwd: process.cwd(), stdio: \"inherit\" });\n } catch (error) {\n console.error(chalk.red(\"Build failed.\"), error);\n process.exit(1);\n }\n\n if (checkTypes) {\n try {\n console.log(chalk.blue(\"Checking types with tsc...\"));\n execSync(TSC_TYPE_CHECK_COMMAND, { cwd: process.cwd(), stdio: \"inherit\" });\n } catch (error) {\n console.error(chalk.red(\"Type check failed.\"), error);\n process.exit(1);\n }\n }\n}\n\nif (args[0] === \"build\") {\n console.log(chalk.blue(\"Building the project...\"));\n build(true);\n console.log(chalk.green(\"Build completed successfully.\"));\n process.exit(0);\n}\n\nif (args[0] === \"dev:serve\") {\n build();\n}\n\nif (!existsSync(scriptPath)) {\n console.error(`Error: Script not found at ${scriptPath}`);\n process.exit(1);\n}\n\nconst result = spawnSync(\n process.execPath,\n [\"--no-warnings\", scriptPath, ...args],\n {\n stdio: \"inherit\",\n }\n);\n\nprocess.exit(result.status ?? 1);\n"],"names":["scriptPath","resolve","__dirname","args","process","argv","slice","build","checkTypes","execSync","SWC_BUILD_COMMAND","cwd","stdio","error","console","chalk","red","exit","log","blue","TSC_TYPE_CHECK_COMMAND","green","existsSync","result","spawnSync","execPath","status"],"mappings":";iGAEoC,mCACZ,wBACG,+DACT,mCACwC,6rCAE1D,IAAMA,WAAaC,GAAAA,aAAO,EAACC,UAAW,UACtC,IAAMC,KAAOC,QAAQC,IAAI,CAACC,KAAK,CAAC,GAGhC,SAASC,YAAMC,WAAAA,uDAAsB,MACnC,GAAI,CACFC,GAAAA,uBAAQ,EAACC,8BAAiB,CAAE,CAAEC,IAAKP,QAAQO,GAAG,GAAIC,MAAO,SAAU,EACrE,CAAE,MAAOC,MAAO,CACdC,QAAQD,KAAK,CAACE,cAAK,CAACC,GAAG,CAAC,iBAAkBH,OAC1CT,QAAQa,IAAI,CAAC,EACf,CAEA,GAAIT,WAAY,CACd,GAAI,CACFM,QAAQI,GAAG,CAACH,cAAK,CAACI,IAAI,CAAC,+BACvBV,GAAAA,uBAAQ,EAACW,mCAAsB,CAAE,CAAET,IAAKP,QAAQO,GAAG,GAAIC,MAAO,SAAU,EAC1E,CAAE,MAAOC,MAAO,CACdC,QAAQD,KAAK,CAACE,cAAK,CAACC,GAAG,CAAC,sBAAuBH,OAC/CT,QAAQa,IAAI,CAAC,EACf,CACF,CACF,CAEA,GAAId,IAAI,CAAC,EAAE,GAAK,QAAS,CACvBW,QAAQI,GAAG,CAACH,cAAK,CAACI,IAAI,CAAC,4BACvBZ,MAAM,MACNO,QAAQI,GAAG,CAACH,cAAK,CAACM,KAAK,CAAC,kCACxBjB,QAAQa,IAAI,CAAC,EACf,CAEA,GAAId,IAAI,CAAC,EAAE,GAAK,YAAa,CAC3BI,OACF,CAEA,GAAI,CAACe,GAAAA,cAAU,EAACtB,YAAa,CAC3Bc,QAAQD,KAAK,CAAC,AAAC,8BAAwC,OAAXb,aAC5CI,QAAQa,IAAI,CAAC,EACf,CAEA,IAAMM,OAASC,GAAAA,wBAAS,EACtBpB,QAAQqB,QAAQ,CAChB,CAAC,gBAAiBzB,WAAoB,CAAtC,OAA8B,qBAAGG,OACjC,CACES,MAAO,SACT,OAGWW,eAAbnB,QAAQa,IAAI,CAACM,CAAAA,eAAAA,OAAOG,MAAM,UAAbH,wBAAAA,eAAiB"}
|