Index

src/utils/disqus.ts

ACCESS_TOKEN_URL
Type : string
Default value : 'https://disqus.com/api/oauth/2.0/access_token/'
AUTHORIZE_URL
Type : string
Default value : 'https://disqus.com/api/oauth/2.0/authorize'
DISQUS_PUBKEY
Default value : `E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F`
getApiURL
Default value : (resource: string) => `https://disqus.com/api/3.0/${resource}.json`
normalizeAxiosError
Default value : (error: any) => { return error?.response?.data?.response || error?.response?.data || error?.toJSON() || error?.message || error }
resourcesRequiringPost
Type : []
Default value : [ 'blacklists/add', 'blacklists/remove', 'categories/create', 'exports/exportForum', 'forums/addModerator', 'forums/create', 'forums/removeModerator', 'posts/approve', 'posts/create', 'posts/highlight', 'posts/remove', 'posts/report', 'posts/restore', 'posts/spam', 'posts/unhighlight', 'posts/update', 'posts/vote', 'reactions/remove', 'reactions/restore', 'threads/close', 'threads/create', 'threads/open', 'threads/remove', 'threads/restore', 'threads/subscribe', 'threads/unsubscribe', 'threads/update', 'threads/vote', 'users/checkUsername', 'users/follow', 'users/unfollow', 'whitelists/add', 'whitelists/remove' ]

src/modules/auth/auth.model.ts

AdminProvider
Default value : getProviderByTypegooseClass(Admin)
DEFAULT_ADMIN_PROFILE
Default value : Object.freeze<Admin>({ name: '', slogan: '', avatar: '' })

src/app.config.ts

AKISMET
Type : object
Default value : { key: argv.akismet_key || 'your Akismet Key', blog: argv.akismet_blog || 'your Akismet blog site, e.g. https://surmon.me' }
APP
Type : object
Default value : { PORT: 8000, ROOT_PATH, DEFAULT_CACHE_TTL: 0, MASTER: 'Surmon', NAME: 'NodePress', URL: 'https://api.surmon.me', ADMIN_EMAIL: argv.admin_email || 'admin email, e.g. [email protected]', FE_NAME: 'Surmon.me', FE_URL: 'https://surmon.me', STATIC_URL: 'https://static.surmon.me' }
argv
Default value : yargs.argv as Record<string, string | void>
AUTH
Type : object
Default value : { expiresIn: argv.auth_expires_in || 3600, data: argv.auth_data || { user: 'root' }, jwtSecret: argv.auth_key || 'nodepress', defaultPassword: argv.auth_default_password || 'root' }
AWS
Type : object
Default value : { accessKeyId: argv.aws_access_key_id as string, secretAccessKey: argv.aws_secret_access_key as string, s3StaticRegion: argv.aws_s3_static_region as string, s3StaticBucket: argv.aws_s3_static_bucket as string }
BING_INDEXED
Type : object
Default value : { site: argv.bing_site || 'your bing site url. e.g. https://surmon.me', apiKey: argv.bing_api_key || 'your bing webmaster api key' }
CROSS_DOMAIN
Type : object
Default value : { allowedOrigins: ['https://surmon.me', 'https://cdn.surmon.me', 'https://admin.surmon.me'], allowedReferer: 'surmon.me' }
DB_BACKUP
Type : object
Default value : { s3Region: argv.db_backup_s3_region as string, s3Bucket: argv.db_backup_s3_bucket as string, password: argv.db_backup_file_password as string }
DISQUS
Type : object
Default value : { // https://disqus.com/api/applications/<app_id> & Keep permissions: <Read, Write, Manage Forums> adminAccessToken: argv.disqus_admin_access_token || 'Disqus admin access_token', adminUsername: argv.disqus_admin_username || 'Disqus admin username', forum: argv.disqus_forum_shortname || 'Disqus forum shortname', // https://disqus.com/api/applications/ publicKey: argv.disqus_public_key || 'Disqus application public_key', secretKey: argv.disqus_secret_key || 'Disqus application secret_key' }
EMAIL
Type : object
Default value : { port: 587, host: argv.email_host || 'your email host, e.g. smtp.qq.com', account: argv.email_account || 'your email address, e.g. [email protected]', password: argv.email_password || 'your email password', from: `"${APP.FE_NAME}" <${argv.email_from || argv.email_account}>` }
GOOGLE
Type : object
Default value : { analyticsV4PropertyId: argv.google_analytics_v4_property_id, jwtServiceAccountCredentials: argv.google_jwt_cred_json ? JSON.parse(argv.google_jwt_cred_json as string) : null }
MONGO_DB
Type : object
Default value : { uri: argv.db_uri || `mongodb://127.0.0.1:27017/NodePress` }
packageJSON
Default value : require(path.resolve(ROOT_PATH, 'package.json'))
PROJECT
Type : object
Default value : { name: packageJSON.name, version: packageJSON.version, author: packageJSON.author, homepage: packageJSON.homepage, documentation: packageJSON.documentation, repository: packageJSON.repository.url }
REDIS
Type : object
Default value : { namespace: argv.redis_namespace || 'nodepress', host: argv.redis_host || 'localhost', port: argv.redis_port || 6379, username: argv.redis_username || null, password: argv.redis_password || null }
ROOT_PATH
Default value : path.join(__dirname, '..')

src/modules/announcement/announcement.model.ts

ANNOUNCEMENT_STATES
Default value : [PublishState.Draft, PublishState.Published] as const
AnnouncementProvider
Default value : getProviderByTypegooseClass(Announcement)

src/modules/article/article.model.ts

ARTICLE_DEFAULT_META
Type : ArticleMeta
Default value : Object.freeze({ likes: 0, views: 0, comments: 0 })
ARTICLE_FULL_QUERY_REF_POPULATE
Type : []
Default value : ['categories', 'tags']
ARTICLE_HOTTEST_SORT_PARAMS
Default value : Object.freeze({ 'meta.comments': SortType.Desc, 'meta.likes': SortType.Desc })
ARTICLE_LANGUAGES
Default value : [Language.English, Language.Chinese, Language.Mixed] as const
ARTICLE_LIST_QUERY_GUEST_FILTER
Default value : Object.freeze({ state: PublishState.Published, public: PublicState.Public })
ARTICLE_LIST_QUERY_PROJECTION
Type : object
Default value : { content: false }
ARTICLE_ORIGIN_STATES
Default value : [OriginState.Original, OriginState.Reprint, OriginState.Hybrid] as const
ARTICLE_PUBLIC_STATES
Default value : [PublicState.Public, PublicState.Secret, PublicState.Reserve] as const
ARTICLE_PUBLISH_STATES
Default value : [PublishState.Draft, PublishState.Published, PublishState.Recycle] as const
ArticleProvider
Default value : getProviderByTypegooseClass(Article)

src/modules/disqus/disqus.constant.ts

ARTICLE_IDENTIFIER_PREFIX
Type : string
Default value : 'article-'
ARTICLE_THREAD_ID_EXTEND_KEY
Type : string
Default value : 'disqus-thread-id'
COMMENT_ANONYMOUS_EXTEND_KEY
Type : string
Default value : 'disqus-anonymous'
COMMENT_AUTHOR_ID_EXTEND_KEY
Type : string
Default value : 'disqus-author-id'
COMMENT_AUTHOR_USERNAME_EXTEND_KEY
Type : string
Default value : 'disqus-author-username'
COMMENT_POST_ID_EXTEND_KEY
Type : string
Default value : 'disqus-post-id'
COMMENT_THREAD_ID_EXTEND_KEY
Type : string
Default value : 'disqus-thread-id'
DISQUS_OAUTH_CALLBACK_URL
Default value : isProdEnv ? `${APP.URL}/disqus/oauth-callback` : `http://localhost:8000/disqus/oauth-callback`
getIDByThreadIdentifier
Default value : (id: string) => { return id === GUESTBOOK_IDENTIFIER ? GUESTBOOK_POST_ID : id.replace(ARTICLE_IDENTIFIER_PREFIX, '') }
getThreadIdentifierById
Default value : (postId: number) => { return postId === GUESTBOOK_POST_ID ? GUESTBOOK_IDENTIFIER : `${ARTICLE_IDENTIFIER_PREFIX}${postId}` }
GUESTBOOK_IDENTIFIER
Type : string
Default value : 'guestbook'

src/modules/extension/extension.service.dbbackup.ts

BACKUP_DIR_PATH
Default value : path.join(APP.ROOT_PATH, 'dbbackup')
BACKUP_FILE_NAME
Type : string
Default value : 'nodepress.zip'
logger
Default value : createLogger({ scope: 'DBBackupService', time: isDevEnv })
UP_FAILED_TIMEOUT
Default value : 1000 * 60 * 5
UPLOAD_INTERVAL
Type : string
Default value : '0 0 3 * * *'

src/constants/meta.constant.ts

CACHE_KEY_METADATA
Type : string
Default value : '__appCacheKey__'
CACHE_TTL_METADATA
Type : string
Default value : '__appCacheTTL__'
GUEST_REQUEST_METADATA
Type : string
Default value : '__appGuestRequestOption__'
HTTP_ERROR_CODE
Type : string
Default value : '__appHttpErrorCode__'
HTTP_ERROR_MESSAGE
Type : string
Default value : '__appHttpErrorMessage__'
HTTP_RESPONSE_TRANSFORM
Type : string
Default value : '__appHttpResponseTransform__'
HTTP_RESPONSE_TRANSFORM_TO_PAGINATE
Type : string
Default value : '__appHttpResponseTransformToPaginate__'
HTTP_SUCCESS_CODE
Default value : constants.HTTP_CODE_METADATA
HTTP_SUCCESS_MESSAGE
Type : string
Default value : '__appHttpSuccessMessage__'

src/modules/category/category.model.ts

CategoryProvider
Default value : getProviderByTypegooseClass(Category)

src/modules/comment/comment.model.ts

COMMENT_GUEST_QUERY_FILTER
Default value : Object.freeze({ state: CommentState.Published })
COMMENT_STATES
Default value : [ CommentState.Auditing, CommentState.Published, CommentState.Deleted, CommentState.Spam ] as const
CommentProvider
Default value : getProviderByTypegooseClass(Comment)

src/decorators/responser.decorator.ts

createDecorator
Default value : (options: DecoratorCreatorOption): MethodDecorator => { const { errorMessage, successMessage, errorCode, successCode, usePaginate } = options return (_, __, descriptor: PropertyDescriptor) => { SetMetadata(META.HTTP_RESPONSE_TRANSFORM, true)(descriptor.value) if (errorCode) { SetMetadata(META.HTTP_ERROR_CODE, errorCode)(descriptor.value) } if (successCode) { SetMetadata(META.HTTP_SUCCESS_CODE, successCode)(descriptor.value) } if (errorMessage) { SetMetadata(META.HTTP_ERROR_MESSAGE, errorMessage)(descriptor.value) } if (successMessage) { SetMetadata(META.HTTP_SUCCESS_MESSAGE, successMessage)(descriptor.value) } if (usePaginate) { SetMetadata(META.HTTP_RESPONSE_TRANSFORM_TO_PAGINATE, true)(descriptor.value) } return descriptor } }
error
Default value : (message: ResponseMessage, statusCode?: HttpStatus): MethodDecorator => { return createDecorator({ errorMessage: message, errorCode: statusCode }) }
getResponserOptions
Default value : (target: any): ResponserOptions => { return { errorCode: reflector.get(META.HTTP_ERROR_CODE, target), successCode: reflector.get(META.HTTP_SUCCESS_CODE, target), errorMessage: reflector.get(META.HTTP_ERROR_MESSAGE, target), successMessage: reflector.get(META.HTTP_SUCCESS_MESSAGE, target), transform: reflector.get(META.HTTP_RESPONSE_TRANSFORM, target), paginate: reflector.get(META.HTTP_RESPONSE_TRANSFORM_TO_PAGINATE, target) } }
paginate
Default value : (): MethodDecorator => { return createDecorator({ usePaginate: true }) }
Responser
Type : object
Default value : { error, success, handle, paginate }
success
Default value : (message: ResponseMessage, statusCode?: HttpStatus): MethodDecorator => { return createDecorator({ successMessage: message, successCode: statusCode }) }

src/utils/logger.ts

createLogger
Default value : (opts?: LoggerOptions) => ({ // levels log: renderLogger({ label: '⚪', consoler: console.log, formatter: pico.cyanBright, ...opts }), info: renderLogger({ label: '🔵', consoler: console.info, formatter: pico.greenBright, ...opts }), warn: renderLogger({ label: '🟠', consoler: console.warn, formatter: pico.yellowBright, ...opts }), error: renderLogger({ label: '🔴', consoler: console.error, formatter: pico.redBright, ...opts }), debug: renderLogger({ label: '🟤', consoler: console.debug, formatter: pico.cyanBright, ...opts }), // aliases success: renderLogger({ label: '🟢', consoler: console.log, formatter: pico.greenBright, ...opts }), failure: renderLogger({ label: '🔴', consoler: console.warn, formatter: pico.redBright, ...opts }) })
renderLogger
Default value : (options: LoggerRenderOptions) => { return (...messages: any) => { const logs: any[] = [] // label logs.push(options.label) // timestamp if (options.time) { const now = new Date() const formattedDate = now.toLocaleDateString() const formattedTime = now.toLocaleTimeString() const timestamp = `[${formattedDate} ${formattedTime}]` logs.push(timestamp) } // scope if (options.scope) { const scope = pico.green(pico.underline(pico.bold(options.scope))) logs.push(scope) } // message const msgs = messages.map((m) => (typeof m === 'string' ? options.formatter(m) : m)) return options.consoler(...logs, ...msgs) } }

src/processors/cache/redis.store.ts

createRedisStore
Default value : (redisClient: RedisClientType, options?: RedisStoreOptions) => { const getKeyName = (key: string): string => { return options?.namespace ? `${options.namespace}:${key}` : key } const get = async <T>(key: string) => { const value = await redisClient.get(getKeyName(key)) return parseValue<T>(value) } // https://redis.io/commands/set/ const set = async (key: string, value: any, ttl?: number): Promise<void> => { const _key = getKeyName(key) const _value = stringifyValue(value) const _ttl = isUndefined(ttl) ? options?.defaultTTL : ttl if (!isNil(_ttl) && _ttl !== 0) { // EX — Set the specified expire time, in seconds. await redisClient.set(_key, _value, { EX: _ttl }) } else { await redisClient.set(_key, _value) } } const mset = async (kvs: [string, any][], ttl?: number): Promise<void> => { const _ttl = isUndefined(ttl) ? options?.defaultTTL : ttl if (!isNil(_ttl) && _ttl !== 0) { const multi = redisClient.multi() for (const [key, value] of kvs) { // EX — Set the specified expire time, in seconds. multi.set(getKeyName(key), stringifyValue(value), { EX: _ttl }) } await multi.exec() } else { await redisClient.mSet( kvs.map(([key, value]) => { return [getKeyName(key), stringifyValue(value)] as [string, string] }) ) } } const mget = (...keys: string[]) => { return redisClient.mGet(keys.map(getKeyName)).then((values) => { return values.map((value) => parseValue<unknown>(value)) }) } const mdel = async (...keys: string[]) => { await redisClient.del(keys.map(getKeyName)) } const del = async (key: string) => { const deleted = await redisClient.del(getKeyName(key)) return deleted > 0 } const has = async (key: string) => { const count = await redisClient.exists(getKeyName(key)) return count !== 0 } const ttl = (key: string) => redisClient.ttl(getKeyName(key)) const keys = (pattern = getKeyName('*')) => redisClient.keys(pattern) const clear = async () => { await redisClient.del(await keys()) } return { has, get, set, delete: del, mset, mget, mdel, ttl, keys, clear } }
parseValue
Default value : <T>(value: string | null | void) => { return isNil(value) ? UNDEFINED : (JSON.parse(value) as T) }
stringifyValue
Default value : (value: unknown) => { return isNil(value) ? '' : JSON.stringify(value) }

src/processors/database/database.provider.ts

databaseProvider
Type : object
Default value : { inject: [EmailService], provide: DB_CONNECTION_TOKEN, useFactory: async (emailService: EmailService) => { let reconnectionTask: NodeJS.Timeout | null = null const RECONNECT_INTERVAL = 6000 const sendAlarmMail = (error: string) => { emailService.sendMailAs(APP_CONFIG.APP.NAME, { to: APP_CONFIG.APP.ADMIN_EMAIL, subject: `MongoDB Error!`, text: error, html: `<pre><code>${error}</code></pre>` }) } const connection = () => { return mongoose.connect(APP_CONFIG.MONGO_DB.uri, {}) } // DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7. // Use `mongoose.set('strictQuery', false);` if you want to prepare for this change. // Or use `mongoose.set('strictQuery', true);` to suppress this warning. // https://mongoosejs.com/docs/guide.html#strictQuery mongoose.set('strictQuery', false) mongoose.connection.on('connecting', () => { logger.log('connecting...') }) mongoose.connection.on('open', () => { logger.success('readied (open).') if (reconnectionTask) { clearTimeout(reconnectionTask) reconnectionTask = null } }) mongoose.connection.on('disconnected', () => { logger.error(`disconnected! retry after ${RECONNECT_INTERVAL / 1000}s`) reconnectionTask = setTimeout(connection, RECONNECT_INTERVAL) }) mongoose.connection.on('error', (error) => { logger.error('error!', error) mongoose.disconnect() sendAlarmMail(String(error)) }) return await connection() } }
logger
Default value : createLogger({ scope: 'MongoDB', time: isDevEnv })

src/constants/system.constant.ts

DB_CONNECTION_TOKEN
Type : string
Default value : 'DBConnectionToken'
DB_MODEL_TOKEN_SUFFIX
Type : string
Default value : 'ModelToken'

src/modules/disqus/disqus.token.ts

decodeToken
Default value : (token: string): AccessToken | null => { try { const result = jwt.verify(token, DISQUS.adminAccessToken) return (result as any) || null } catch (error) { return null } }
DisqusToken
Default value : createParamDecorator((key: string = TOKEN_COOKIE_KEY, context: ExecutionContext) => { const request = context.switchToHttp().getRequest() const cookies = request.cookies const token = cookies[key] return token ? decodeToken(token) : null })
encodeToken
Default value : (token: AccessToken) => { return jwt.sign(token, DISQUS.adminAccessToken, { expiresIn: token.expires_in }) }
TOKEN_COOKIE_KEY
Type : string
Default value : '_disqus'

src/modules/option/option.model.ts

DEFAULT_OPTION
Type : Option
Default value : Object.freeze<Option>({ title: 'NodePress', sub_title: 'Blog server app', description: 'RESTful API service for blog', keywords: [], statement: '', site_url: 'https://github.com/surmon-china/nodepress', site_email: '[email protected]', friend_links: [ { name: APP.FE_NAME, value: APP.FE_URL } ], meta: { likes: 0 }, blocklist: { ips: [], mails: [], keywords: [] }, ad_config: '' })
OptionProvider
Default value : getProviderByTypegooseClass(Option)

src/utils/paginate.ts

DEFAULT_OPTIONS
Type : Required<Pick<PaginateOptions, "page" | "perPage" | "dateSort" | "lean">>
Default value : Object.freeze({ page: 1, perPage: 16, dateSort: -1, lean: false })

src/modules/extension/extension.service.statistic.ts

DEFAULT_STATISTIC
Default value : Object.freeze({ tags: null, articles: null, comments: null, totalViews: null, totalLikes: null, todayViews: null, averageEmotion: null })
logger
Default value : createLogger({ scope: 'StatisticService', time: isDevEnv })

src/modules/feedback/feedback.model.ts

emotionMap
Default value : new Map( [ { value: FeedbackEmotion.Terrible, text: FeedbackEmotion[FeedbackEmotion.Terrible], emoji: '😠' }, { value: FeedbackEmotion.Bad, text: FeedbackEmotion[FeedbackEmotion.Bad], emoji: '🙁' }, { value: FeedbackEmotion.Neutral, text: FeedbackEmotion[FeedbackEmotion.Neutral], emoji: '😐' }, { value: FeedbackEmotion.Great, text: FeedbackEmotion[FeedbackEmotion.Great], emoji: '😃' }, { value: FeedbackEmotion.Amazing, text: FeedbackEmotion[FeedbackEmotion.Amazing], emoji: '🥰' } ].map((item) => [item.value, item]) )
FEEDBACK_EMOTION_VALUES
Default value : FEEDBACK_EMOTIONS.map((e) => e.value)
FEEDBACK_EMOTIONS
Default value : Array.from(emotionMap.values())
FeedbackProvider
Default value : getProviderByTypegooseClass(Feedback)

src/app.environment.ts

environment
Default value : process.env.NODE_ENV
isDevEnv
Default value : Object.is(environment, 'development')
isProdEnv
Default value : Object.is(environment, 'production')
isTestEnv
Default value : Object.is(environment, 'test')

src/constants/increment.constant.ts

GENERAL_AUTO_INCREMENT_ID_CONFIG
Type : AutoIncrementIDOptions
Default value : { field: 'id', startAt: 1, incrementBy: 1, trackerCollection: 'identitycounters', trackerModelName: 'identitycounter' // https://github.com/typegoose/auto-increment // https://github.com/typegoose/auto-increment/blob/master/src/autoIncrement.ts // https://github.com/typegoose/auto-increment/issues/11 // https://github.com/typegoose/auto-increment#overwritemodelname // field: '_id', // overwriteModelName: 'modelName', }

src/decorators/cache.decorator.ts

getCacheKey
Default value : (target: any): CacheOptions['key'] => { return reflector.get(META.CACHE_KEY_METADATA, target) }
getCacheTTL
Default value : (target: any): CacheOptions['ttl'] => { return reflector.get(META.CACHE_TTL_METADATA, target) }

src/modules/disqus/disqus.xml.ts

getCommentItemXML
Default value : (comment: Comment) => { return ` <wp:comment> <wp:comment_id>${comment.id}</wp:comment_id> <wp:comment_parent>${comment.pid || ''}</wp:comment_parent> <wp:comment_author>${comment.author.name || ''}</wp:comment_author> <wp:comment_author_email>${comment.author.email || ''}</wp:comment_author_email> <wp:comment_author_url>${comment.author.site || ''}</wp:comment_author_url> <wp:comment_author_IP>${comment.ip || ''}</wp:comment_author_IP> <wp:comment_date_gmt>${dayjs(comment.created_at).format('YYYY-MM-DD HH:mm:ss')}</wp:comment_date_gmt> <wp:comment_content><![CDATA[${comment.content || ''}]]></wp:comment_content> <wp:comment_approved>${comment.state === CommentState.Published ? 1 : 0}</wp:comment_approved> </wp:comment> ` }
getDisqusXML
Default value : (data: XMLItemData[], guestbook: Array<Comment>) => { return `<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dsq="http://www.disqus.com/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wp="http://wordpress.org/export/1.0/" > <channel> <item> <title>Guestbook</title> <link>${getPermalinkById(GUESTBOOK_POST_ID)}</link> <content:encoded><![CDATA[${APP.FE_NAME}]]></content:encoded> <dsq:thread_identifier>${getThreadIdentifierById(GUESTBOOK_POST_ID)}</dsq:thread_identifier> <wp:post_date_gmt>2017-01-01 00:00:00</wp:post_date_gmt> <wp:comment_status>open</wp:comment_status> ${guestbook.map(getCommentItemXML).join('\n')} </item> ${data .map( (item) => ` <item> <title>${item.article.title}</title> <link>${getPermalinkById(item.article.id)}</link> <content:encoded><![CDATA[${item.article.description || ''}]]></content:encoded> <dsq:thread_identifier>${getThreadIdentifierById(item.article.id)}</dsq:thread_identifier> <wp:post_date_gmt>${dayjs(item.article.created_at).format('YYYY-MM-DD HH:mm:ss')}</wp:post_date_gmt> <wp:comment_status>${ item.article.disabled_comments ? ThreadState.Closed : ThreadState.Open }</wp:comment_status> ${item.comments.map(getCommentItemXML).join('\n')} </item> ` ) .join('\n')} </channel> </rss>` }

src/constants/cache.constant.ts

getDecoratorCacheKey
Default value : (key: string) => { return `decorator:${key}` }
getDisqusCacheKey
Default value : (key: string) => { return `disqus:${key}` }

src/transformers/extend.transformer.ts

getExtendObject
Default value : (_extends: KeyValueModel[]): { [key: string]: string } => { return _extends.length ? _extends.reduce((v, c) => ({ ...v, [c.name]: c.value }), {}) : {} }
getExtendValue
Default value : (_extends: KeyValueModel[], key: string): string | void => { return _extends.length ? getExtendObject(_extends)[key] : void 0 }

src/decorators/guest.decorator.ts

getGuestRequestOptions
Default value : (target: any): Record<string, GuestRequestOption> => { return reflector.get(GUEST_REQUEST_METADATA, target) }

src/modules/extension/extension.helper.ts

getTodayViewsCount
Default value : async (cache: CacheService) => { const count = await cache.get<number>(CacheKeys.TodayViewCount) return count ? Number(count) : 0 }
increaseTodayViewsCount
Default value : async (cache: CacheService) => { const views = await getTodayViewsCount(cache) await cache.set(CacheKeys.TodayViewCount, views + 1) return views + 1 }
resetTodayViewsCount
Default value : (cache: CacheService) => { return cache.set(CacheKeys.TodayViewCount, 0) }

src/constants/biz.constant.ts

GUESTBOOK_POST_ID
Type : number
Default value : 0
ROOT_COMMENT_PID
Type : number
Default value : 0
ROOT_FEEDBACK_TID
Type : number
Default value : 0

src/constants/text.constant.ts

HTTP_ANONYMOUS_TEXT
Type : string
Default value : 'Who are U?'
HTTP_BAD_REQUEST_TEXT_DEFAULT
Type : string
Default value : 'Unknown error'
HTTP_DEFAULT_ERROR_TEXT
Default value : HTTP_DEFAULT_TEXT + HTTP_ERROR_SUFFIX
HTTP_DEFAULT_SUCCESS_TEXT
Default value : HTTP_DEFAULT_TEXT + HTTP_SUCCESS_SUFFIX
HTTP_DEFAULT_TEXT
Type : string
Default value : 'request'
HTTP_ERROR_SUFFIX
Type : string
Default value : ' failed'
HTTP_PARAMS_PERMISSION_ERROR_DEFAULT
Type : string
Default value : 'Permission denied'
HTTP_SUCCESS_SUFFIX
Type : string
Default value : ' succeeded'
HTTP_UNAUTHORIZED_TEXT_DEFAULT
Type : string
Default value : 'Unauthorized'
VALIDATION_ERROR_DEFAULT
Type : string
Default value : 'Invalid params'

src/constants/value.constant.ts

isNil
Default value : (value): value is null | void => isNull(value) || isUndefined(value)
isNull
Default value : (value): value is null => value === NULL
isUndefined
Default value : (value): value is void => value === UNDEFINED
NULL
Type : null
Default value : null
UNDEFINED
Default value : void 0

src/pipes/validation.pipe.ts

isUnverifiableMetaType
Default value : (metatype: any): metatype is undefined => { const basicTypes = [String, Boolean, Number, Array, Object] return !metatype || basicTypes.includes(metatype) }

src/interceptors/cache.interceptor.ts

logger
Default value : createLogger({ scope: 'CacheInterceptor', time: isDevEnv })

src/interceptors/logging.interceptor.ts

logger
Default value : createLogger({ scope: 'LoggingInterceptor', time: isDevEnv })

src/modules/archive/archive.service.ts

logger
Default value : createLogger({ scope: 'ArchiveService', time: isDevEnv })

src/modules/category/category.service.ts

logger
Default value : createLogger({ scope: 'CategoryService', time: isDevEnv })

src/modules/comment/comment.service.ts

logger
Default value : createLogger({ scope: 'CommentService', time: isDevEnv })

src/modules/disqus/disqus.service.private.ts

logger
Default value : createLogger({ scope: 'DisqusPrivateService', time: isDevEnv })

src/modules/disqus/disqus.service.public.ts

logger
Default value : createLogger({ scope: 'DisqusPublicService', time: isDevEnv })

src/modules/option/option.service.ts

logger
Default value : createLogger({ scope: 'OptionService', time: isDevEnv })

src/modules/tag/tag.service.ts

logger
Default value : createLogger({ scope: 'TagService', time: isDevEnv })

src/processors/cache/cache.service.ts

logger
Default value : createLogger({ scope: 'CacheService', time: isDevEnv })

src/processors/cache/redis.service.ts

logger
Default value : createLogger({ scope: 'RedisService', time: isDevEnv })

src/processors/helper/helper.service.akismet.ts

logger
Default value : createLogger({ scope: 'AkismetService', time: isDevEnv })

src/processors/helper/helper.service.email.ts

logger
Default value : createLogger({ scope: 'EmailService', time: isDevEnv })

src/processors/helper/helper.service.google.ts

logger
Default value : createLogger({ scope: 'GoogleAPIService', time: isDevEnv })

src/processors/helper/helper.service.ip.ts

logger
Default value : createLogger({ scope: 'IPService', time: isDevEnv })

src/processors/helper/helper.service.seo.ts

logger
Default value : createLogger({ scope: 'SeoService', time: isDevEnv })

src/decorators/queryparams.decorator.ts

QueryParams
Default value : createParamDecorator( (field: keyof QueryParamsResult, context: ExecutionContext): QueryParamsResult => { const request = context.switchToHttp().getRequest<Request>() // from passport middleware // https://github.com/jaredhanson/passport/blob/master/CHANGELOG.md // http://www.passportjs.org/docs/configure/ const isAuthenticated = request.isAuthenticated() const isUnauthenticated = request.isUnauthenticated() const ip = (request.headers['x-forwarded-for'] as string) || (request.headers['x-real-ip'] as string) || request.socket.remoteAddress || request.ip || request.ips[0] const visitor: QueryVisitor = { ip: ip.replace('::ffff:', '').replace('::1', '') || null, ua: request.headers['user-agent'], origin: request.headers.origin, referer: request.headers.referer } const result = { isAuthenticated, isUnauthenticated, params: request.params, query: request.query as any, cookies: request.cookies, visitor, request } return field ? result[field] : result } )

src/constants/reflector.constant.ts

reflector
Default value : new Reflector()

src/processors/helper/helper.module.ts

services
Type : []
Default value : [GoogleService, AkismetService, AWSService, EmailService, SeoService, IPService]

src/modules/tag/tag.model.ts

TagProvider
Default value : getProviderByTypegooseClass(Tag)

src/modules/vote/vote.model.ts

VOTE_AUTHOR_TYPES
Default value : [VoteAuthorType.Anonymous, VoteAuthorType.Guest, VoteAuthorType.Disqus] as const
VOTE_TARGETS
Default value : [VoteTarget.Post, VoteTarget.Comment] as const
VOTE_TYPES
Default value : [VoteType.Upvote, VoteType.Downvote] as const
VoteProvider
Default value : getProviderByTypegooseClass(Vote)
voteTypeMap
Default value : new Map([ [VoteType.Upvote, '+1'], [VoteType.Downvote, '-1'] ])

results matching ""

    No results matching ""