diff --git a/build/prepare.js b/build/prepare.js index 9cfb1e292..6d59ad0bb 100644 --- a/build/prepare.js +++ b/build/prepare.js @@ -62,11 +62,11 @@ const UIConfig = { exclude: [ 'packages/ui-default/public', ], - include: [ - 'packages/ui-default/**/*.ts', - 'packages/**/public/**/*.ts', - 'plugins/**/public/**/*.ts', - ], + include: ['ts', 'tsx'].flatMap((i) => [ + `packages/ui-default/**/*.${i}`, + `packages/**/public/**/*.${i}`, + `plugins/**/public/**/*.${i}`, + ]), compilerOptions: { experimentalDecorators: true, esModuleInterop: true, diff --git a/install/install.ts b/install/install.ts index ad291624f..c8e9a3281 100644 --- a/install/install.ts +++ b/install/install.ts @@ -4,6 +4,8 @@ import { execSync, ExecSyncOptions } from 'child_process'; import { existsSync, readFileSync, writeFileSync } from 'fs'; import net from 'net'; +import os from 'os'; +import path from 'path'; const exec = (command: string, args?: ExecSyncOptions) => { try { @@ -217,6 +219,8 @@ function rollbackResolveField() { return true; } +const tmpFile = path.join(os.tmpdir(), `${Math.random().toString()}.js`); + const Steps = () => [ { init: 'install.preparing', @@ -315,12 +319,12 @@ connect-timeout = 10`); operations: [ 'pm2 start mongod', () => sleep(3000), - () => writeFileSync('/tmp/createUser.js', `db.createUser(${JSON.stringify({ + () => writeFileSync(tmpFile, `db.createUser(${JSON.stringify({ user: 'hydro', pwd: password, roles: [{ role: 'readWrite', db: 'hydro' }], })})`), - ['mongo 127.0.0.1:27017/hydro /tmp/createUser.js', { retry: true }], + [`mongo 127.0.0.1:27017/hydro ${tmpFile}`, { retry: true }], () => writeFileSync(`${process.env.HOME}/.hydro/config.json`, JSON.stringify({ host: '127.0.0.1', port: 27017, diff --git a/package.json b/package.json index 5733a1cbf..40e7c89bb 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@types/autocannon": "^7.9.0", "@types/cross-spawn": "^6.0.2", "@types/mocha": "^10.0.0", - "@types/node": "^18.11.3", + "@types/node": "^18.11.9", "@types/semver": "^7.3.13", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^5.43.0", @@ -61,7 +61,7 @@ "ora": "^6.1.2", "semver": "^7.3.8", "supertest": "^6.3.1", - "typescript": "4.8.4" + "typescript": "4.9.3" }, "packageManager": "yarn@3.2.3" } diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 8ccbc3e23..686782221 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -12,11 +12,11 @@ }, "preferUnplugged": true, "dependencies": { - "@aws-sdk/client-s3": "^3.210.0", - "@aws-sdk/lib-storage": "^3.210.0", - "@aws-sdk/middleware-endpoint": "^3.208.0", - "@aws-sdk/s3-presigned-post": "^3.210.0", - "@aws-sdk/s3-request-presigner": "^3.210.0", + "@aws-sdk/client-s3": "^3.212.0", + "@aws-sdk/lib-storage": "^3.212.0", + "@aws-sdk/middleware-endpoint": "^3.212.0", + "@aws-sdk/s3-presigned-post": "^3.212.0", + "@aws-sdk/s3-request-presigner": "^3.212.0", "@graphql-tools/schema": "^8.5.1", "@hydrooj/utils": "workspace:*", "adm-zip": "0.5.5", diff --git a/packages/hydrooj/src/handler/misc.ts b/packages/hydrooj/src/handler/misc.ts index 9db61434e..a909931ce 100644 --- a/packages/hydrooj/src/handler/misc.ts +++ b/packages/hydrooj/src/handler/misc.ts @@ -3,7 +3,7 @@ import { statSync } from 'fs'; import { pick } from 'lodash'; import { lookup } from 'mime-types'; import { - BadRequestError, ForbiddenError, ValidationError, + BadRequestError, ForbiddenError, NotFoundError, ValidationError, } from '../error'; import { PRIV } from '../model/builtin'; import * as oplog from '../model/oplog'; @@ -96,6 +96,7 @@ export class FSDownloadHandler extends Handler { @param('noDisposition', Types.Boolean) async get(domainId: string, uid: number, filename: string, noDisposition = false) { const targetUser = await user.getById('system', uid); + if (!targetUser) throw new NotFoundError(uid); if (this.user._id !== uid && !targetUser.hasPriv(PRIV.PRIV_CREATE_FILE)) throw new ForbiddenError('Access denied'); this.response.addHeader('Cache-Control', 'public'); const target = `user/${uid}/${filename}`; diff --git a/packages/ui-default/build/config/webpack.ts b/packages/ui-default/build/config/webpack.ts index 76c103820..3e327f56b 100644 --- a/packages/ui-default/build/config/webpack.ts +++ b/packages/ui-default/build/config/webpack.ts @@ -248,7 +248,10 @@ export default function (env: { watch?: boolean, production?: boolean, measure?: patterns: [ { from: root('static') }, { from: root('components/navigation/nav-logo-small_dark.png'), to: 'components/navigation/nav-logo-small_dark.png' }, + { from: root(`${dirname(require.resolve('streamsaver/package.json'))}/mitm.html`), to: 'streamsaver/mitm.html' }, + { from: root(`${dirname(require.resolve('streamsaver/package.json'))}/sw.js`), to: 'streamsaver/sw.js' }, { from: root(`${dirname(require.resolve('vditor/package.json'))}/dist`), to: 'vditor/dist' }, + { from: root(`${dirname(require.resolve('graphiql/package.json'))}/graphiql.min.css`), to: 'graphiql.min.css' }, { from: `${dirname(require.resolve('monaco-themes/package.json'))}/themes`, to: 'monaco/themes/' }, ], }), @@ -268,13 +271,6 @@ export default function (env: { watch?: boolean, production?: boolean, measure?: id: 'vs/language/yaml/yamlWorker', entry: require.resolve('monaco-yaml/yaml.worker.js'), }, - }, { - label: 'graphql', - entry: require.resolve('monaco-graphql/esm/monaco.contribution.js'), - worker: { - id: 'vs/language/graphql/graphqlWorker', - entry: require.resolve('monaco-graphql/esm/graphql.worker.js'), - }, }], }), ...env.measure ? [new BundleAnalyzerPlugin({ analyzerPort: 'auto' })] : [], diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index a5c6540a1..18082d9e1 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -52,7 +52,7 @@ "fancy-log": "^2.0.0", "flatpickr": "^4.6.13", "friendly-errors-webpack-plugin": "^1.7.0", - "graphiql": "1.8.9", + "graphiql": "2.1.0", "gulp": "^4.0.2", "gulp-iconfont": "^11.0.1", "gulp-if": "^3.0.0", @@ -63,12 +63,11 @@ "jquery.easing": "^1.4.1", "jquery.transit": "^0.9.12", "matchmedia-polyfill": "^0.3.2", - "mini-css-extract-plugin": "^2.6.1", + "mini-css-extract-plugin": "^2.7.0", "moment": "^2.29.4", "monaco-editor": "0.33.0", "monaco-editor-nls": "^2.0.0", "monaco-editor-webpack-plugin": "^7.0.1", - "monaco-graphql": "^1.1.6", "monaco-themes": "^0.4.3", "monaco-yaml": "^4.0.2", "nanoid": "^4.0.0", diff --git a/packages/ui-default/pages/api.page.tsx b/packages/ui-default/pages/api.page.tsx index 6524c2847..9b7355a52 100644 --- a/packages/ui-default/pages/api.page.tsx +++ b/packages/ui-default/pages/api.page.tsx @@ -1,9 +1,4 @@ -import 'graphiql/src/css/doc-explorer.css'; - -import type { GraphQLSchema } from 'graphql'; -import { load as loadYaml } from 'js-yaml'; -import type * as monaco from 'monaco-editor'; -import type { SchemaConfig } from 'monaco-graphql/src/typings'; +import { pick } from 'lodash'; import React from 'react'; import { createRoot } from 'react-dom/client'; import { NamedPage } from 'vj/misc/Page'; @@ -18,154 +13,17 @@ query Example( uname } }`; -const variablesString = 'name: Hydro'; -const resultsString = '{}'; -const schemaSdlString = `\ -""" -Loading schema... -"""`; -const page = new NamedPage('api', async () => { - const [{ DocExplorer }, { buildClientSchema, getIntrospectionQuery, printSchema }, { load }] = await Promise.all([ - import('graphiql/esm/components/DocExplorer'), - import('graphql/utilities'), - import('vj/components/monaco/loader'), - ]); - const { monaco } = await load(['graphql', 'json', 'yaml']); - const { initializeMode } = await import('monaco-graphql/esm/initializeMode'); - - const variablesModel = monaco.editor.createModel( - variablesString, - 'yaml', - monaco.Uri.file('/1/variables.yaml'), +export default new NamedPage('api', async () => { + const { GraphiQL } = await import('graphiql'); + GraphiQL.Logo = function () { + return
; + } as any; + createRoot(document.getElementById('main')!).render( +