From 8af621222ce82fe11a871111aecc1351afea492f Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 2 Apr 2025 00:35:45 +0800 Subject: [PATCH] fix ci issues --- README.md | 5 +++ build/prepare.js | 2 +- framework/eslint-config/package.json | 6 ++-- framework/framework/decorators.ts | 2 +- framework/framework/package.json | 2 +- framework/framework/server.ts | 2 +- package.json | 2 +- .../frontend/autocomplete/AutoComplete.tsx | 2 +- packages/components/package.json | 2 +- packages/hydrojudge/package.json | 2 +- packages/hydrooj/src/entry/cli.ts | 9 ++--- packages/hydrooj/src/entry/worker.ts | 17 ++++------ packages/hydrooj/src/handler/home.ts | 4 +-- packages/hydrooj/src/handler/judge.ts | 8 ++--- packages/hydrooj/src/handler/user.ts | 26 ++++++++++---- packages/hydrooj/src/interface.ts | 22 +----------- packages/hydrooj/src/model/oauth.ts | 34 ++++++++++++++++++- packages/hydrooj/src/service/api.ts | 2 +- packages/hydrooj/src/service/bus.ts | 2 +- packages/hydrooj/src/service/server.ts | 18 +++++----- packages/login-with-github/index.ts | 3 +- packages/login-with-google/index.ts | 8 ++--- packages/telegram/index.ts | 3 +- packages/ui-default/package.json | 2 +- .../ui-default/templates/home_security.html | 7 ++-- .../ui-default/templates/layout/html5.html | 1 + 26 files changed, 108 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 2a58ec9bf..91243df74 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,11 @@ Hydro 用户群:1085853538 - core: 支持存储并显示提交记录重测历史 - core: 新的加域逻辑 - ui: UserSelect.Multi: 支持批量粘贴用户名 +- core: oauth: 支持绑定/解绑三方平台账户 (#971) +- ui: 修复暗色模式表格边框 (#968) +- core: 优化 icpc 题目包导入 (#966) +- judge: 弃用 diff (#965) +- core: 支持设置加域时自动加入小组 ### Breaking API Changes diff --git a/build/prepare.js b/build/prepare.js index 415292497..e44c4dc6e 100644 --- a/build/prepare.js +++ b/build/prepare.js @@ -71,7 +71,7 @@ for (const name of ['plugins', 'modules']) { // Write an empty file to make eslint happy fs.writeFileSync(path.resolve(process.cwd(), name, 'nop.ts'), 'export default {};\n'); fs.writeFileSync( - path.resolve(process.cwd(), name, 'vue.d.ts'), + path.resolve(process.cwd(), name, 'vue-types.d.ts'), 'declare module "*.vue" {\n const content: any;\n export default content;\n}\n', ); } diff --git a/framework/eslint-config/package.json b/framework/eslint-config/package.json index 24b3800c6..f3a8e986b 100644 --- a/framework/eslint-config/package.json +++ b/framework/eslint-config/package.json @@ -4,12 +4,12 @@ "license": "MIT", "main": "base.mjs", "dependencies": { - "@eslint-react/eslint-plugin": "^1.38.4", + "@eslint-react/eslint-plugin": "^1.40.0", "@eslint/compat": "^1.2.7", "@eslint/eslintrc": "^3.3.1", "@stylistic/eslint-plugin": "^4.2.0", - "@typescript-eslint/eslint-plugin": "^8.28.0", - "@typescript-eslint/parser": "^8.28.0", + "@typescript-eslint/eslint-plugin": "^8.29.0", + "@typescript-eslint/parser": "^8.29.0", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-de-morgan": "^1.2.1", "eslint-plugin-github": "^6.0.0", diff --git a/framework/framework/decorators.ts b/framework/framework/decorators.ts index 83423de43..14133357e 100644 --- a/framework/framework/decorators.ts +++ b/framework/framework/decorators.ts @@ -29,7 +29,7 @@ function _buildParam(name: string, source: 'get' | 'post' | 'all' | 'route', ... if (type[2]) v.isOptional = type[2]; } else if (typeof current === 'boolean') v.isOptional = current; else if (isValidate) { - if (current !== null) v.validate = mergeValidator(v.validate, current); + if (current !== null) v.validate = v.validate ? mergeValidator(v.validate, current) : current; isValidate = false; } else v.convert = current; cursor++; diff --git a/framework/framework/package.json b/framework/framework/package.json index 62c1c032e..3c1a84cb0 100644 --- a/framework/framework/package.json +++ b/framework/framework/package.json @@ -29,6 +29,6 @@ "@types/koa-router": "^7.4.8", "@types/lodash": "^4.17.16", "@types/saslprep": "^1.0.3", - "@types/ws": "^8.18.0" + "@types/ws": "^8.18.1" } } diff --git a/framework/framework/server.ts b/framework/framework/server.ts index 607381a16..fd649c38f 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -461,7 +461,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } catch (e) { } }); socket.pause(); - const c: any = koa.createContext(request, {} as any); + const c: any = koa.createContext(request, {} as any); // eslint-disable-line await executeMiddlewareStack(c, this.wsLayers); for (const manager of router.wsStack) { if (manager.accept(socket, request, c)) return; diff --git a/package.json b/package.json index 327a05ca3..1ba43c103 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "mongodb-memory-server": "10.1.4", "nyc": "^17.1.0", "ora": "^8.2.0", - "oxlint": "^0.16.3", + "oxlint": "^0.16.4", "package-json": "^10.0.1", "semver": "^7.7.1", "simple-git": "^3.27.0", diff --git a/packages/components/frontend/autocomplete/AutoComplete.tsx b/packages/components/frontend/autocomplete/AutoComplete.tsx index f7b6f4224..0fcaae7d5 100644 --- a/packages/components/frontend/autocomplete/AutoComplete.tsx +++ b/packages/components/frontend/autocomplete/AutoComplete.tsx @@ -99,7 +99,7 @@ const AutoComplete = forwardRef(function Impl(props: AutoCompleteProps, re const [itemList, setItemList] = useState([]); // items list const [currentItem, setCurrentItem] = useState(null); // index of current item (in item list) const [rerender, setRerender] = useState(false); - const [draggableId] = useState(uniqueId()); + const [draggableId] = useState(() => uniqueId()); const inputRef = useRef(null); const listRef = useRef(null); diff --git a/packages/components/package.json b/packages/components/package.json index 63a40eef8..2fa35e0b3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -15,6 +15,6 @@ "@types/diff": "^7.0.2", "@types/js-yaml": "^4.0.9", "@types/lodash": "^4.17.16", - "sass": "^1.86.0" + "sass": "^1.86.1" } } diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index cbfbc44f0..902a9d6bf 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -22,6 +22,6 @@ "devDependencies": { "@types/adm-zip": "^0.5.7", "@types/shell-quote": "^1.7.5", - "@types/ws": "^8.18.0" + "@types/ws": "^8.18.1" } } diff --git a/packages/hydrooj/src/entry/cli.ts b/packages/hydrooj/src/entry/cli.ts index de2ccdbf6..5cae2ac69 100644 --- a/packages/hydrooj/src/entry/cli.ts +++ b/packages/hydrooj/src/entry/cli.ts @@ -123,9 +123,7 @@ export async function load(ctx: Context) { ctx.loader.reloadPlugin(require.resolve('../service/server'), 'server'), ]); require('../lib/index'); - await Promise.all([ - service(pending, fail, ctx), - ]); + await service(pending, fail, ctx); await builtinModel(ctx); await model(pending, fail, ctx); ctx = await new Promise((resolve) => { @@ -135,8 +133,7 @@ export async function load(ctx: Context) { }); await addon(pending, fail, ctx); const scriptDir = path.resolve(__dirname, '..', 'script'); - for (const h of await fs.readdir(scriptDir)) { - ctx.loader.reloadPlugin(path.resolve(scriptDir, h), ''); - } + await Promise.all((await fs.readdir(scriptDir)) + .map((h) => ctx.loader.reloadPlugin(path.resolve(scriptDir, h), ''))); await cli(); } diff --git a/packages/hydrooj/src/entry/worker.ts b/packages/hydrooj/src/entry/worker.ts index 99ad2419e..50656efcf 100644 --- a/packages/hydrooj/src/entry/worker.ts +++ b/packages/hydrooj/src/entry/worker.ts @@ -49,7 +49,7 @@ export async function apply(ctx: Context) { resolve(c); }); }); - await require('../service/api').apply(ctx); + await ctx.plugin(require('../service/api')); require('../lib/index'); ctx.plugin(require('../service/monitor')); @@ -62,17 +62,12 @@ export async function apply(ctx: Context) { resolve(c); }); }); - const handlerDir = path.resolve(__dirname, '..', 'handler'); - const handlers = await fs.readdir(handlerDir); - for (const h of handlers.filter((i) => i.endsWith('.ts'))) { - ctx.loader.reloadPlugin(path.resolve(handlerDir, h), ''); - } - ctx.plugin(require('../service/migration').default); + const loadDir = async (dir: string) => Promise.all((await fs.readdir(dir)).filter((i) => i.endsWith('.ts')) + .map((h) => ctx.loader.reloadPlugin(path.resolve(dir, h), ''))); + await loadDir(path.resolve(__dirname, '..', 'handler')); + await ctx.plugin(require('../service/migration').default); await addon(pending, fail, ctx); - const scriptDir = path.resolve(__dirname, '..', 'script'); - for (const h of await fs.readdir(scriptDir)) { - ctx.loader.reloadPlugin(path.resolve(scriptDir, h), ''); - } + await loadDir(path.resolve(__dirname, '..', 'script')); await ctx.parallel('app/started'); if (process.env.NODE_APP_INSTANCE === '0') { await new Promise((resolve, reject) => { diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index 9ccaba54b..af34c627c 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -254,9 +254,9 @@ class HomeSecurityHandler extends Handler { @param('platform', Types.String) async postLinkAccount({ }, platform: string) { - if (!global.Hydro.module.oauth[platform]) throw new ValidationError('platform'); + if (!this.ctx.oauth.providers[platform]) throw new ValidationError('platform'); this.session.oauthBind = platform; - await global.Hydro.module.oauth[platform].get.call(this); + await this.ctx.oauth.providers[platform].get.call(this); } @param('tokenDigest', Types.String) diff --git a/packages/hydrooj/src/handler/judge.ts b/packages/hydrooj/src/handler/judge.ts index be8434b3c..23c4d3916 100644 --- a/packages/hydrooj/src/handler/judge.ts +++ b/packages/hydrooj/src/handler/judge.ts @@ -115,7 +115,7 @@ export class JudgeResultCallbackContext { return this.operationPromise; } - static async postJudge(rdoc: RecordDoc) { + static async postJudge(rdoc: RecordDoc, context?: JudgeResultCallbackContext) { if (rdoc.contest?.toString().startsWith('0'.repeat(23))) return; const accept = rdoc.status === builtin.STATUS.STATUS_ACCEPTED; const updated = await problem.updateStatus(rdoc.domainId, rdoc.pid, rdoc.uid, rdoc._id, rdoc.status, rdoc.score); @@ -134,7 +134,7 @@ export class JudgeResultCallbackContext { problem.inc(pdoc.domainId, pdoc.docId, `stats.s${Math.floor(rdoc.score)}`, 1), ]); } - await app.parallel('record/judge', rdoc, updated, pdoc, this); + await app.parallel('record/judge', rdoc, updated, pdoc, context); } async _end(body: Partial) { @@ -155,7 +155,7 @@ export class JudgeResultCallbackContext { const rdoc = await record.update(this.task.domainId, new ObjectId(this.task.rid as string), $set, $push, $unset); if (rdoc) bus.broadcast('record/change', rdoc, null, null, body); // trigger a full update - await JudgeResultCallbackContext.postJudge(rdoc); + await JudgeResultCallbackContext.postJudge(rdoc, this); this.resolve(rdoc); } @@ -357,7 +357,7 @@ export async function apply(ctx: Context) { const priority = await record.submissionPriority(rdoc.uid, -5000 - rdocs.length * 5 - 50); await record.judge(rdoc.domainId, rdocs.map((r) => r._id), priority, {}, { hackRejudge: input }); } catch (e) { - t.next({ + t?.next?.({ rid: rdoc._id.toString(), domainId: rdoc.domainId, key: 'next', diff --git a/packages/hydrooj/src/handler/user.ts b/packages/hydrooj/src/handler/user.ts index 7bfef8844..783b33672 100644 --- a/packages/hydrooj/src/handler/user.ts +++ b/packages/hydrooj/src/handler/user.ts @@ -4,7 +4,8 @@ import moment from 'moment-timezone'; import type { Binary } from 'mongodb'; import type { Context } from '../context'; import { - AuthOperationError, BadRequestError, BlacklistedError, BuiltinLoginError, ForbiddenError, InvalidTokenError, + AuthOperationError, BadRequestError, BlacklistedError, BuiltinLoginError, + ForbiddenError, InvalidTokenError, NotFoundError, SystemError, UserAlreadyExistError, UserFacingError, UserNotFoundError, ValidationError, VerifyPasswordError, } from '../error'; @@ -279,9 +280,9 @@ class UserRegisterWithCodeHandler extends Handler { domainId: string, password: string, verify: string, uname = '', code: string, ) { - if (global.Hydro.module.oauth[this.tdoc.identity.provider].lockUsername) { - uname = this.tdoc.identity.username; - } + const provider = this.ctx.oauth.providers[this.tdoc.identity.provider]; + if (!provider) throw new SystemError(`OAuth provider ${this.tdoc.identity.provider} not found`); + if (provider.lockUsername) uname = this.tdoc.identity.username; if (!Types.Username[1](uname)) throw new ValidationError('uname'); if (password !== verify) throw new VerifyPasswordError(); const randomEmail = `${String.random(12)}@invalid.local`; // some random email to remove in the future @@ -428,7 +429,7 @@ class OauthHandler extends Handler { @param('type', Types.Key) async get(domainId: string, type: string) { - await global.Hydro.module.oauth[type]?.get.call(this); + await this.ctx.oauth.providers[type]?.get.call(this); } } @@ -436,8 +437,8 @@ class OauthCallbackHandler extends Handler { noCheckPermView = true; async get(args: any) { - if (!global.Hydro.module.oauth[args.type]) throw new UserFacingError('Oauth type'); - const r = await global.Hydro.module.oauth[args.type].callback.call(this, args); + if (!this.ctx.oauth.providers[args.type]) throw new UserFacingError('Oauth type'); + const r = await this.ctx.oauth.providers[args.type].callback.call(this, args); if (this.session.oauthBind === args.type) { delete this.session.oauthBind; const existing = await this.ctx.oauth.get(args.type, r._id); @@ -529,6 +530,17 @@ export async function apply(ctx: Context) { if (system.get('server.contestmode')) { ctx.Route('contest_mode', '/contestmode', ContestModeHandler, PRIV.PRIV_EDIT_SYSTEM); } + ctx.oauth.provide('mail', { + text: 'Mail', + name: 'mail', + hidden: true, + async get() { + throw new NotFoundError(); + }, + async callback() { + throw new NotFoundError(); + }, + }); ctx.inject(['api'], ({ api }) => { api.value('User', [ ['_id', 'Int!'], diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index a4d13289b..8935b795f 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -10,7 +10,6 @@ import type { Context } from './context'; import type { DocStatusType } from './model/document'; import type { OauthMap } from './model/oauth'; import type { ProblemDoc } from './model/problem'; -import type { Handler } from './service/server'; export * from '@hydrooj/common/types'; @@ -56,17 +55,6 @@ export interface Setting { flag: number, } -export interface OAuthUserResponse { - _id: string; - email: string; - avatar?: string; - bio?: string; - uname?: string[]; - viewLang?: string; - set?: Record; - setInDomain?: Record; -} - export interface Authenticator { name: string; regat: number; @@ -506,7 +494,7 @@ export interface OpCountDoc { opcount: number; } -export type { OauthMap } from './model/oauth'; +export type { OauthMap, OAuthProvider, OAuthUserResponse } from './model/oauth'; export interface DiscussionHistoryDoc { title?: string; @@ -622,14 +610,6 @@ export interface UI { } export interface ModuleInterfaces { - oauth: { - text: string; - name: string; - icon?: string; - get: (this: Handler) => Promise; - callback: (this: Handler, args: Record) => Promise; - lockUsername?: boolean; - }; hash: (password: string, salt: string, user: User) => boolean | string | Promise; problemSearch: ProblemSearch; } diff --git a/packages/hydrooj/src/model/oauth.ts b/packages/hydrooj/src/model/oauth.ts index e37fb7424..1eeef213b 100644 --- a/packages/hydrooj/src/model/oauth.ts +++ b/packages/hydrooj/src/model/oauth.ts @@ -1,5 +1,6 @@ import { Collection } from 'mongodb'; import { Context, Service } from '../context'; +import type { Handler } from '../service/server'; export interface OauthMap { platform: string; @@ -15,9 +16,31 @@ declare module '../context' { } } +export interface OAuthUserResponse { + _id: string; + email: string; + avatar?: string; + bio?: string; + uname?: string[]; + viewLang?: string; + set?: Record; + setInDomain?: Record; +} + +export interface OAuthProvider { + text: string; + name: string; + icon?: string; + hidden?: boolean; + get: (this: Handler) => Promise; + callback: (this: Handler, args: Record) => Promise; + lockUsername?: boolean; +} + export default class OauthModel extends Service { static inject = ['db']; coll: Collection; + providers: Record = Object.create(null); constructor(ctx: Context) { super(ctx, 'oauth'); @@ -29,7 +52,6 @@ export default class OauthModel extends Service { // { key: { platform: 1, id: 1 }, name: 'platform_id', unique: true }, { key: { uid: 1, platform: 1 }, name: 'uid_platform' }, ); - console.log('oauth init'); } async get(platform: string, id: string) { @@ -54,4 +76,14 @@ export default class OauthModel extends Service { async list(uid: number) { return this.coll.find({ uid }).toArray(); } + + async provide(name: string, provider: OAuthProvider) { + if (this.providers[name]) throw new Error(`OAuth provider ${name} already exists`); + this.ctx.effect(() => { + this.providers[name] = provider; + return () => { + delete this.providers[name]; + }; + }); + } } diff --git a/packages/hydrooj/src/service/api.ts b/packages/hydrooj/src/service/api.ts index e8c34d512..eef4fc229 100644 --- a/packages/hydrooj/src/service/api.ts +++ b/packages/hydrooj/src/service/api.ts @@ -194,7 +194,7 @@ class ApiService extends Service { } export const sideEffect = true; -export const inject = ['server']; +export const inject = ['server', 'setting']; export function apply(ctx: Context) { ctx.plugin(ApiService); diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index cd4adee83..687e1a5fd 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -90,7 +90,7 @@ export interface EventMap { 'training/get': (tdoc: TrainingDoc, handler: any) => VoidReturn 'record/change': (rdoc: RecordDoc, $set?: any, $push?: any, body?: any) => void - 'record/judge': (rdoc: RecordDoc, updated: boolean, pdoc: ProblemDoc, updater: any) => VoidReturn + 'record/judge': (rdoc: RecordDoc, updated: boolean, pdoc?: ProblemDoc, updater?: any) => VoidReturn } export function apply(ctx: Context) { diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 424821f4e..28668324a 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -90,7 +90,7 @@ export async function apply(ctx: Context) { xhost: system.get('server.xhost'), }); if (process.env.HYDRO_CLI) return; - ctx.inject(['server'], ({ server, on }) => { + ctx.inject(['server', 'oauth'], ({ server, on, oauth }) => { server.addHandlerLayer('init', async (c, next) => { const init = Date.now(); try { @@ -119,7 +119,7 @@ export async function apply(ctx: Context) { server.addLayer('base', baseLayer); server.addLayer('user', userLayer); - let cachedTranslate = null; + const cachedTranslate = ctx.i18n.translate; server.handlerMixin({ url(name: string, ...kwargsList: Record[]) { @@ -164,7 +164,6 @@ export async function apply(ctx: Context) { const langs = lang ? [lang, ...this.context.acceptsLanguages()] : [...this.context.acceptsLanguages(), system.get('server.language')]; - cachedTranslate ||= ctx.i18n.translate; return cachedTranslate(str.toString(), langs); }, paginate(cursor: FindCursor, page: number, key: string | number) { @@ -259,12 +258,13 @@ export async function apply(ctx: Context) { }); on('handler/create/http', async (h) => { if (!argv.options.benchmark && !h.notUsage) await h.limitRate('global', 5, 100); - h.loginMethods = Object.keys(global.Hydro.module.oauth) - .map((key) => ({ - id: key, - icon: global.Hydro.module.oauth[key].icon, - text: global.Hydro.module.oauth[key].text, - name: global.Hydro.module.oauth[key].name, + h.loginMethods = Object.entries(oauth.providers) + .filter(([_, v]) => !v.hidden) + .map(([k, v]) => ({ + id: k, + icon: v.icon, + text: v.text, + name: v.name, })); if (!h.noCheckPermView && !h.user.hasPriv(PRIV.PRIV_VIEW_ALL_DOMAIN)) h.checkPerm(PERM.PERM_VIEW); if (h.context.pendingError) throw h.context.pendingError; diff --git a/packages/login-with-github/index.ts b/packages/login-with-github/index.ts index a9d7d69d1..47682df4b 100644 --- a/packages/login-with-github/index.ts +++ b/packages/login-with-github/index.ts @@ -8,6 +8,7 @@ import { const icon = ''; export default class LoginWithGithubService extends Service { + static inject = ['oauth']; static Config = Schema.object({ id: Schema.string().description('Github OAuth AppID').required(), secret: Schema.string().description('Github OAuth Secret').role('secret').required(), @@ -16,7 +17,7 @@ export default class LoginWithGithubService extends Service { constructor(ctx: Context, config: ReturnType) { super(ctx, 'oauth.github'); - ctx.provideModule('oauth', 'github', { + ctx.oauth.provide('github', { text: 'Login with Github', name: 'Github', icon, diff --git a/packages/login-with-google/index.ts b/packages/login-with-google/index.ts index 528326cb7..e67381272 100644 --- a/packages/login-with-google/index.ts +++ b/packages/login-with-google/index.ts @@ -26,6 +26,7 @@ function decodeJWT(idToken: string) { } export default class GoogleOAuthService extends Service { + static inject = ['oauth']; static Config = Schema.object({ id: Schema.string().description('Google OAuth AppID').required(), secret: Schema.string().description('Google OAuth Secret').role('secret').required(), @@ -34,7 +35,7 @@ export default class GoogleOAuthService extends Service { constructor(ctx: Context, config: ReturnType) { super(ctx, 'oauth.google'); - ctx.provideModule('oauth', 'google', { + ctx.oauth.provide('google', { text: 'Login with Google', name: 'Google', callback: async function callback(this: Handler, { @@ -57,10 +58,9 @@ export default class GoogleOAuthService extends Service { await TokenModel.del(state, TokenModel.TYPE_OAUTH); this.response.redirect = s.redirect; return { - // TODO use openid - _id: payload.email, + _id: payload.sub, email: payload.email, - uname: [payload.given_name, payload.name, payload.family_name], + uname: [`${payload.given_name} ${payload.family_name}`, payload.name], viewLang: payload.locale.replace('-', '_'), }; }, diff --git a/packages/telegram/index.ts b/packages/telegram/index.ts index 1a60168f6..9e540e5b6 100644 --- a/packages/telegram/index.ts +++ b/packages/telegram/index.ts @@ -8,6 +8,7 @@ import { const icon = ''; export default class TelegramService extends Service { + static inject = ['oauth']; static Config = Schema.object({ token: Schema.string().role('secret').required(), botLogin: Schema.string().required(), @@ -16,7 +17,7 @@ export default class TelegramService extends Service { constructor(ctx: Context, config: ReturnType) { super(ctx, 'oauth.telegram'); - ctx.provideModule('oauth', 'telegram', { + ctx.oauth.provide('telegram', { text: 'Login with Telegram', name: 'Telegram', icon, diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index d0e0015bc..3b02fbe8b 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -99,7 +99,7 @@ "redux-promise-middleware": "^6.2.0", "redux-thunk": "^3.1.0", "rupture": "^0.7.1", - "sass": "^1.86.0", + "sass": "^1.86.1", "sass-loader": "^16.0.5", "schemastery": "^3.16.1", "schemastery-react": "^0.1.2", diff --git a/packages/ui-default/templates/home_security.html b/packages/ui-default/templates/home_security.html index 50d525c7d..2a76c3422 100644 --- a/packages/ui-default/templates/home_security.html +++ b/packages/ui-default/templates/home_security.html @@ -103,10 +103,9 @@ - {%- endif -%} - {%- endfor -%} - - + {%- endif -%} + {%- endfor -%} + diff --git a/packages/ui-default/templates/layout/html5.html b/packages/ui-default/templates/layout/html5.html index 2e28e7b4e..243e7e8fd 100644 --- a/packages/ui-default/templates/layout/html5.html +++ b/packages/ui-default/templates/layout/html5.html @@ -40,6 +40,7 @@ {% if process.env.DEV %} + {% else %} {% endif %}