From 60bdb1f0b148f1e1affdb4033f597d70a7d64add Mon Sep 17 00:00:00 2001 From: Freeplay Date: Fri, 2 Jun 2023 14:44:41 -0400 Subject: [PATCH 1/6] Add delay & start adding cubic-bezier to mfm --- packages/client/src/components/mfm.ts | 32 +++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 23a933348..331fd3c12 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -57,6 +57,10 @@ export default defineComponent({ if (t == null) return null; return t.match(/^[0-9.]+s$/) ? t : null; }; + const validEase = (e: string | null | undefined) => { + if (e == null) return null; + return e.match(/\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) ? e : null; + } const genEl = (ast: mfm.MfmNode[]) => concat( @@ -102,22 +106,27 @@ export default defineComponent({ switch (token.props.name) { case "tada": { const speed = validTime(token.props.args.speed) || "1s"; - style = `font-size: 150%; animation: tada ${speed} linear infinite both;`; + const delay = validTime(token.props.args.delay) || "0s"; + const ease = validEase(token.props.args.ease) ?? "(0,0,1,1)"; + style = `font-size: 150%; animation: tada ${speed} ${delay} cubic-bezier${ease} infinite both;`; break; } case "jelly": { const speed = validTime(token.props.args.speed) || "1s"; - style = `animation: mfm-rubberBand ${speed} linear infinite both;`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: mfm-rubberBand ${speed} ${delay} linear infinite both;`; break; } case "twitch": { const speed = validTime(token.props.args.speed) || "0.5s"; - style = `animation: mfm-twitch ${speed} ease infinite;`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: mfm-twitch ${speed} ${delay} ease infinite;`; break; } case "shake": { const speed = validTime(token.props.args.speed) || "0.5s"; - style = `animation: mfm-shake ${speed} ease infinite;`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: mfm-shake ${speed} ${delay} ease infinite;`; break; } case "spin": { @@ -132,22 +141,26 @@ export default defineComponent({ ? "mfm-spinY" : "mfm-spin"; const speed = validTime(token.props.args.speed) || "1.5s"; - style = `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: ${anime} ${speed} ${delay} linear infinite; animation-direction: ${direction};`; break; } case "jump": { const speed = validTime(token.props.args.speed) || "0.75s"; - style = `animation: mfm-jump ${speed} linear infinite;`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: mfm-jump ${speed} ${delay} linear infinite;`; break; } case "bounce": { const speed = validTime(token.props.args.speed) || "0.75s"; - style = `animation: mfm-bounce ${speed} linear infinite; transform-origin: center bottom;`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: mfm-bounce ${speed} ${delay} linear infinite; transform-origin: center bottom;`; break; } case "rainbow": { const speed = validTime(token.props.args.speed) || "1s"; - style = `animation: mfm-rainbow ${speed} linear infinite;`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: mfm-rainbow ${speed} ${delay} linear infinite;`; break; } case "sparkle": { @@ -161,7 +174,8 @@ export default defineComponent({ ? "alternate-reverse" : "alternate"; const speed = validTime(token.props.args.speed) || "1.5s"; - style = `animation: mfm-fade ${speed} linear infinite; animation-direction: ${direction};`; + const delay = validTime(token.props.args.delay) || "0s"; + style = `animation: mfm-fade ${speed} ${delay} linear infinite; animation-direction: ${direction};`; break; } case "flip": { From a5792fed7f459e92ba9e9dc09f4425d1a7e1f9cc Mon Sep 17 00:00:00 2001 From: Freeplay Date: Fri, 2 Jun 2023 15:06:57 -0400 Subject: [PATCH 2/6] Idk why I used ?? there --- packages/client/src/components/mfm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 331fd3c12..74a92ee48 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -107,7 +107,7 @@ export default defineComponent({ case "tada": { const speed = validTime(token.props.args.speed) || "1s"; const delay = validTime(token.props.args.delay) || "0s"; - const ease = validEase(token.props.args.ease) ?? "(0,0,1,1)"; + const ease = validEase(token.props.args.ease) || "(0,0,1,1)"; style = `font-size: 150%; animation: tada ${speed} ${delay} cubic-bezier${ease} infinite both;`; break; } From 068826aa3b2542a61faa0e05a5bdb46533f84134 Mon Sep 17 00:00:00 2001 From: Freeplay Date: Fri, 2 Jun 2023 15:39:33 -0400 Subject: [PATCH 3/6] Setup to also support steps --- packages/client/src/components/mfm.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 74a92ee48..86a9aba2e 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -59,7 +59,9 @@ export default defineComponent({ }; const validEase = (e: string | null | undefined) => { if (e == null) return null; - return e.match(/\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) ? e : null; + return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) + ? (e.startsWith("steps") ? e : "cubic-bezier" + e) + : null } const genEl = (ast: mfm.MfmNode[]) => @@ -107,8 +109,8 @@ export default defineComponent({ case "tada": { const speed = validTime(token.props.args.speed) || "1s"; const delay = validTime(token.props.args.delay) || "0s"; - const ease = validEase(token.props.args.ease) || "(0,0,1,1)"; - style = `font-size: 150%; animation: tada ${speed} ${delay} cubic-bezier${ease} infinite both;`; + const ease = validEase(token.props.args.ease) || "linear"; + style = `font-size: 150%; animation: tada ${speed} ${delay} ${ease} infinite both;`; break; } case "jelly": { From da5b199e6ca3574bcd715d3d5b61b6f295a8c004 Mon Sep 17 00:00:00 2001 From: Freeplay Date: Mon, 5 Jun 2023 15:28:42 -0400 Subject: [PATCH 4/6] comment out easing part for now --- packages/client/src/components/mfm.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 86a9aba2e..50a566d33 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -57,12 +57,12 @@ export default defineComponent({ if (t == null) return null; return t.match(/^[0-9.]+s$/) ? t : null; }; - const validEase = (e: string | null | undefined) => { - if (e == null) return null; - return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) - ? (e.startsWith("steps") ? e : "cubic-bezier" + e) - : null - } + // const validEase = (e: string | null | undefined) => { + // if (e == null) return null; + // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) + // ? (e.startsWith("steps") ? e : "cubic-bezier" + e) + // : null + // } const genEl = (ast: mfm.MfmNode[]) => concat( @@ -109,8 +109,8 @@ export default defineComponent({ case "tada": { const speed = validTime(token.props.args.speed) || "1s"; const delay = validTime(token.props.args.delay) || "0s"; - const ease = validEase(token.props.args.ease) || "linear"; - style = `font-size: 150%; animation: tada ${speed} ${delay} ${ease} infinite both;`; + // const ease = validEase(token.props.args.ease) || "linear"; + style = `font-size: 150%; animation: tada ${speed} ${delay} linear infinite both;`; break; } case "jelly": { From 75c0b0853df595155805245f8721b7d91f36b6be Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Mon, 5 Jun 2023 15:08:35 -0700 Subject: [PATCH 5/6] fix --- packages/backend/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/backend/package.json b/packages/backend/package.json index 2e29fa72a..6ea02e1be 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -112,7 +112,7 @@ "random-seed": "0.3.0", "ratelimiter": "3.4.1", "re2": "1.19.0", - "redis-lock": "1.0.0", + "redis-lock": "0.1.4", "reflect-metadata": "0.1.13", "rename": "1.0.4", "rndstr": "1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11c8c2122..557b317fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -331,8 +331,8 @@ importers: specifier: 1.19.0 version: 1.19.0 redis-lock: - specifier: 1.0.0 - version: 1.0.0 + specifier: 0.1.4 + version: 0.1.4 reflect-metadata: specifier: 0.1.13 version: 0.1.13 @@ -13227,9 +13227,9 @@ packages: lodash: 4.17.21 dev: false - /redis-lock@1.0.0: - resolution: {integrity: sha512-zfI+Il36jXwRT/W8SBsG132Bc2yp3tMuf3KTGjSzXimadI17NEGBvb/KrDkCuAC2hzVxW5uR5ns/rxuqiWeV3Q==} - engines: {node: '>=12'} + /redis-lock@0.1.4: + resolution: {integrity: sha512-7/+zu86XVQfJVx1nHTzux5reglDiyUCDwmW7TSlvVezfhH2YLc/Rc8NE0ejQG+8/0lwKzm29/u/4+ogKeLosiA==} + engines: {node: '>=0.6'} dev: false /redis-parser@3.0.0: From 115f92c8d0b2735b5f23cd5fdb276f0ecb7dfcfd Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Mon, 5 Jun 2023 16:40:48 -0700 Subject: [PATCH 6/6] chore: formatting --- cypress.config.ts | 20 +-- cypress/e2e/basic.cy.js | 126 +++++++++--------- cypress/e2e/widgets.cy.js | 78 +++++------ cypress/plugins/index.js | 6 +- cypress/support/commands.js | 34 ++--- cypress/support/e2e.js | 18 +-- locales/index.js | 113 ++++++++++------ package.json | 4 +- .../1658656633972-note-replies-function.js | 2 +- ...ddFkAbuseUserReportTargetUserIdToUserId.js | 2 +- .../migration/1680375641101-clean-charts.js | 16 +-- packages/backend/package.json | 3 +- packages/backend/src/boot/master.ts | 2 +- .../remote/activitypub/misc/ld-signature.ts | 8 +- .../src/remote/activitypub/models/image.ts | 4 +- .../backend/src/server/api/endpoints/meta.ts | 4 +- .../src/server/api/endpoints/notes/edit.ts | 4 +- .../server/api/mastodon/endpoints/timeline.ts | 2 +- packages/backend/src/server/web/boot.js | 4 +- packages/backend/src/services/note/create.ts | 6 +- packages/backend/test/api-visibility.ts | 16 +-- packages/backend/test/get-file-info.ts | 72 +++++----- packages/backend/test/streaming.ts | 8 +- packages/backend/test/utils.ts | 10 +- .../src/components/MkSubNoteContent.vue | 2 +- .../global/MkMisskeyFlavoredMarkdown.vue | 6 +- packages/client/src/components/mfm.ts | 2 +- packages/sw/package.json | 3 +- scripts/clean-all.js | 44 ++++-- scripts/clean.js | 19 ++- scripts/dev.js | 28 ++-- 31 files changed, 366 insertions(+), 300 deletions(-) diff --git a/cypress.config.ts b/cypress.config.ts index e390c41a5..25ff2aa07 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from 'cypress' +import { defineConfig } from "cypress"; export default defineConfig({ - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents(on, config) { - return require('./cypress/plugins/index.js')(on, config) - }, - baseUrl: 'http://localhost:61812', - }, -}) + e2e: { + // We've imported your old cypress plugins here. + // You may want to clean this up later by importing these. + setupNodeEvents(on, config) { + return require("./cypress/plugins/index.js")(on, config); + }, + baseUrl: "http://localhost:61812", + }, +}); diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js index eb5195c4b..f73a25efb 100644 --- a/cypress/e2e/basic.cy.js +++ b/cypress/e2e/basic.cy.js @@ -1,4 +1,4 @@ -describe('Before setup instance', () => { +describe("Before setup instance", () => { beforeEach(() => { cy.resetState(); }); @@ -9,31 +9,31 @@ describe('Before setup instance', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('setup instance', () => { - cy.visit('/'); + it("setup instance", () => { + cy.visit("/"); - cy.intercept('POST', '/api/admin/accounts/create').as('signup'); - - cy.get('[data-cy-admin-username] input').type('admin'); - cy.get('[data-cy-admin-password] input').type('admin1234'); - cy.get('[data-cy-admin-ok]').click(); + cy.intercept("POST", "/api/admin/accounts/create").as("signup"); + + cy.get("[data-cy-admin-username] input").type("admin"); + cy.get("[data-cy-admin-password] input").type("admin1234"); + cy.get("[data-cy-admin-ok]").click(); // なぜか動かない //cy.wait('@signup').should('have.property', 'response.statusCode'); - cy.wait('@signup'); - }); + cy.wait("@signup"); + }); }); -describe('After setup instance', () => { +describe("After setup instance", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); }); afterEach(() => { @@ -42,34 +42,34 @@ describe('After setup instance', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('signup', () => { - cy.visit('/'); + it("signup", () => { + cy.visit("/"); - cy.intercept('POST', '/api/signup').as('signup'); + cy.intercept("POST", "/api/signup").as("signup"); - cy.get('[data-cy-signup]').click(); - cy.get('[data-cy-signup-username] input').type('alice'); - cy.get('[data-cy-signup-password] input').type('alice1234'); - cy.get('[data-cy-signup-password-retype] input').type('alice1234'); - cy.get('[data-cy-signup-submit]').click(); + cy.get("[data-cy-signup]").click(); + cy.get("[data-cy-signup-username] input").type("alice"); + cy.get("[data-cy-signup-password] input").type("alice1234"); + cy.get("[data-cy-signup-password-retype] input").type("alice1234"); + cy.get("[data-cy-signup-submit]").click(); - cy.wait('@signup'); - }); + cy.wait("@signup"); + }); }); -describe('After user signup', () => { +describe("After user signup", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); }); afterEach(() => { @@ -78,51 +78,53 @@ describe('After user signup', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.visit('/'); - }); + it("successfully loads", () => { + cy.visit("/"); + }); - it('signin', () => { - cy.visit('/'); + it("signin", () => { + cy.visit("/"); - cy.intercept('POST', '/api/signin').as('signin'); + cy.intercept("POST", "/api/signin").as("signin"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type('alice'); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type("alice"); // Enterキーでサインインできるかの確認も兼ねる - cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + cy.get("[data-cy-signin-password] input").type("alice1234{enter}"); - cy.wait('@signin'); - }); + cy.wait("@signin"); + }); - it('suspend', function() { - cy.request('POST', '/api/admin/suspend-user', { + it("suspend", function () { + cy.request("POST", "/api/admin/suspend-user", { i: this.admin.token, userId: this.alice.id, }); - cy.visit('/'); + cy.visit("/"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type('alice'); - cy.get('[data-cy-signin-password] input').type('alice1234{enter}'); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type("alice"); + cy.get("[data-cy-signin-password] input").type("alice1234{enter}"); // TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする - cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi); + cy.contains( + /アカウントが凍結されています|This account has been suspended due to/gi, + ); }); }); -describe('After user singed in', () => { +describe("After user singed in", () => { beforeEach(() => { cy.resetState(); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); - cy.login('alice', 'alice1234'); + cy.login("alice", "alice1234"); }); afterEach(() => { @@ -131,17 +133,17 @@ describe('After user singed in', () => { cy.wait(1000); }); - it('successfully loads', () => { - cy.get('[data-cy-open-post-form]').should('be.visible'); - }); + it("successfully loads", () => { + cy.get("[data-cy-open-post-form]").should("be.visible"); + }); - it('note', () => { - cy.get('[data-cy-open-post-form]').click(); - cy.get('[data-cy-post-form-text]').type('Hello, Misskey!'); - cy.get('[data-cy-open-post-form-submit]').click(); + it("note", () => { + cy.get("[data-cy-open-post-form]").click(); + cy.get("[data-cy-post-form-text]").type("Hello, Misskey!"); + cy.get("[data-cy-open-post-form-submit]").click(); - cy.contains('Hello, Misskey!'); - }); + cy.contains("Hello, Misskey!"); + }); }); // TODO: 投稿フォームの公開範囲指定のテスト diff --git a/cypress/e2e/widgets.cy.js b/cypress/e2e/widgets.cy.js index 9eea010bd..e3c9326db 100644 --- a/cypress/e2e/widgets.cy.js +++ b/cypress/e2e/widgets.cy.js @@ -1,14 +1,14 @@ -describe('After user signed in', () => { +describe("After user signed in", () => { beforeEach(() => { cy.resetState(); - cy.viewport('macbook-16'); + cy.viewport("macbook-16"); // インスタンス初期セットアップ - cy.registerUser('admin', 'pass', true); + cy.registerUser("admin", "pass", true); // ユーザー作成 - cy.registerUser('alice', 'alice1234'); + cy.registerUser("alice", "alice1234"); - cy.login('alice', 'alice1234'); + cy.login("alice", "alice1234"); }); afterEach(() => { @@ -17,47 +17,47 @@ describe('After user signed in', () => { cy.wait(1000); }); - it('widget edit toggle is visible', () => { - cy.get('.mk-widget-edit').should('be.visible'); - }); + it("widget edit toggle is visible", () => { + cy.get(".mk-widget-edit").should("be.visible"); + }); - it('widget select should be visible in edit mode', () => { - cy.get('.mk-widget-edit').click(); - cy.get('.mk-widget-select').should('be.visible'); - }); + it("widget select should be visible in edit mode", () => { + cy.get(".mk-widget-edit").click(); + cy.get(".mk-widget-select").should("be.visible"); + }); - it('first widget should be removed', () => { - cy.get('.mk-widget-edit').click(); - cy.get('.customize-container:first-child .remove._button').click(); - cy.get('.customize-container').should('have.length', 2); + it("first widget should be removed", () => { + cy.get(".mk-widget-edit").click(); + cy.get(".customize-container:first-child .remove._button").click(); + cy.get(".customize-container").should("have.length", 2); }); function buildWidgetTest(widgetName) { it(`${widgetName} widget should get added`, () => { - cy.get('.mk-widget-edit').click(); - cy.get('.mk-widget-select select').select(widgetName, { force: true }); - cy.get('.bg._modalBg.transparent').click({ multiple: true, force: true }); - cy.get('.mk-widget-add').click({ force: true }); - cy.get(`.mkw-${widgetName}`).should('exist'); + cy.get(".mk-widget-edit").click(); + cy.get(".mk-widget-select select").select(widgetName, { force: true }); + cy.get(".bg._modalBg.transparent").click({ multiple: true, force: true }); + cy.get(".mk-widget-add").click({ force: true }); + cy.get(`.mkw-${widgetName}`).should("exist"); }); } - buildWidgetTest('memo'); - buildWidgetTest('notifications'); - buildWidgetTest('timeline'); - buildWidgetTest('calendar'); - buildWidgetTest('rss'); - buildWidgetTest('trends'); - buildWidgetTest('clock'); - buildWidgetTest('activity'); - buildWidgetTest('photos'); - buildWidgetTest('digitalClock'); - buildWidgetTest('federation'); - buildWidgetTest('postForm'); - buildWidgetTest('slideshow'); - buildWidgetTest('serverMetric'); - buildWidgetTest('onlineUsers'); - buildWidgetTest('jobQueue'); - buildWidgetTest('button'); - buildWidgetTest('aiscript'); + buildWidgetTest("memo"); + buildWidgetTest("notifications"); + buildWidgetTest("timeline"); + buildWidgetTest("calendar"); + buildWidgetTest("rss"); + buildWidgetTest("trends"); + buildWidgetTest("clock"); + buildWidgetTest("activity"); + buildWidgetTest("photos"); + buildWidgetTest("digitalClock"); + buildWidgetTest("federation"); + buildWidgetTest("postForm"); + buildWidgetTest("slideshow"); + buildWidgetTest("serverMetric"); + buildWidgetTest("onlineUsers"); + buildWidgetTest("jobQueue"); + buildWidgetTest("button"); + buildWidgetTest("aiscript"); }); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index aa9918d21..3a4b6deb1 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -16,6 +16,6 @@ * @type {Cypress.PluginConfig} */ module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config -} + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +}; diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 95bfcf685..3fe95b93d 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -24,32 +24,34 @@ // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -Cypress.Commands.add('resetState', () => { - cy.window(win => { - win.indexedDB.deleteDatabase('keyval-store'); +Cypress.Commands.add("resetState", () => { + cy.window((win) => { + win.indexedDB.deleteDatabase("keyval-store"); }); - cy.request('POST', '/api/reset-db').as('reset'); - cy.get('@reset').its('status').should('equal', 204); + cy.request("POST", "/api/reset-db").as("reset"); + cy.get("@reset").its("status").should("equal", 204); cy.reload(true); }); -Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => { - const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup'; +Cypress.Commands.add("registerUser", (username, password, isAdmin = false) => { + const route = isAdmin ? "/api/admin/accounts/create" : "/api/signup"; - cy.request('POST', route, { + cy.request("POST", route, { username: username, password: password, - }).its('body').as(username); + }) + .its("body") + .as(username); }); -Cypress.Commands.add('login', (username, password) => { - cy.visit('/'); +Cypress.Commands.add("login", (username, password) => { + cy.visit("/"); - cy.intercept('POST', '/api/signin').as('signin'); + cy.intercept("POST", "/api/signin").as("signin"); - cy.get('[data-cy-signin]').click(); - cy.get('[data-cy-signin-username] input').type(username); - cy.get('[data-cy-signin-password] input').type(`${password}{enter}`); + cy.get("[data-cy-signin]").click(); + cy.get("[data-cy-signin-username] input").type(username); + cy.get("[data-cy-signin-password] input").type(`${password}{enter}`); - cy.wait('@signin').as('signedIn'); + cy.wait("@signin").as("signedIn"); }); diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js index 9185be344..961c6ac88 100644 --- a/cypress/support/e2e.js +++ b/cypress/support/e2e.js @@ -14,19 +14,21 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands' +import "./commands"; // Alternatively you can use CommonJS syntax: // require('./commands') -Cypress.on('uncaught:exception', (err, runnable) => { - if ([ - // Chrome - 'ResizeObserver loop limit exceeded', +Cypress.on("uncaught:exception", (err, runnable) => { + if ( + [ + // Chrome + "ResizeObserver loop limit exceeded", - // Firefox - 'ResizeObserver loop completed with undelivered notifications', - ].some(msg => err.message.includes(msg))) { + // Firefox + "ResizeObserver loop completed with undelivered notifications", + ].some((msg) => err.message.includes(msg)) + ) { return false; } }); diff --git a/locales/index.js b/locales/index.js index 7399bb5a1..20e9593da 100644 --- a/locales/index.js +++ b/locales/index.js @@ -2,59 +2,90 @@ * Languages Loader */ -const fs = require('fs'); -const yaml = require('js-yaml'); -let languages = [] -let languages_custom = [] - -const merge = (...args) => args.reduce((a, c) => ({ - ...a, - ...c, - ...Object.entries(a) - .filter(([k]) => c && typeof c[k] === 'object') - .reduce((a, [k, v]) => (a[k] = merge(v, c[k]), a), {}) -}), {}); +const fs = require("fs"); +const yaml = require("js-yaml"); +let languages = []; +let languages_custom = []; +const merge = (...args) => + args.reduce( + (a, c) => ({ + ...a, + ...c, + ...Object.entries(a) + .filter(([k]) => c && typeof c[k] === "object") + .reduce((a, [k, v]) => ((a[k] = merge(v, c[k])), a), {}), + }), + {}, + ); fs.readdirSync(__dirname).forEach((file) => { - if (file.includes('.yml')){ - file = file.slice(0, file.indexOf('.')) + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); languages.push(file); } -}) +}); -fs.readdirSync(__dirname + '/../custom/locales').forEach((file) => { - if (file.includes('.yml')){ - file = file.slice(0, file.indexOf('.')) +fs.readdirSync(__dirname + "/../custom/locales").forEach((file) => { + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); languages_custom.push(file); } -}) +}); const primaries = { - 'en': 'US', - 'ja': 'JP', - 'zh': 'CN', + en: "US", + ja: "JP", + zh: "CN", }; // 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く -const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), ''); +const clean = (text) => + text.replace(new RegExp(String.fromCodePoint(0x08), "g"), ""); -const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, 'utf-8'))) || {}, a), {}); -const locales_custom = languages_custom.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, 'utf-8'))) || {}, a), {}); -Object.assign(locales, locales_custom) +const locales = languages.reduce( + (a, c) => ( + (a[c] = + yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, "utf-8"))) || + {}), + a + ), + {}, +); +const locales_custom = languages_custom.reduce( + (a, c) => ( + (a[c] = + yaml.load( + clean( + fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, "utf-8"), + ), + ) || {}), + a + ), + {}, +); +Object.assign(locales, locales_custom); -module.exports = Object.entries(locales) - .reduce((a, [k ,v]) => (a[k] = (() => { - const [lang] = k.split('-'); - switch (k) { - case 'ja-JP': return v; - case 'ja-KS': - case 'en-US': return merge(locales['ja-JP'], v); - default: return merge( - locales['ja-JP'], - locales['en-US'], - locales[`${lang}-${primaries[lang]}`] || {}, - v - ); - } - })(), a), {}); +module.exports = Object.entries(locales).reduce( + (a, [k, v]) => ( + (a[k] = (() => { + const [lang] = k.split("-"); + switch (k) { + case "ja-JP": + return v; + case "ja-KS": + case "en-US": + return merge(locales["ja-JP"], v); + default: + return merge( + locales["ja-JP"], + locales["en-US"], + locales[`${lang}-${primaries[lang]}`] || {}, + v, + ); + } + })()), + a + ), + {}, +); diff --git a/package.json b/package.json index 3269caa81..1118cc39d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "14.0.0-dev40", + "version": "14.0.0-dev44", "codename": "aqua", "repository": { "type": "git", @@ -27,7 +27,7 @@ "e2e": "start-server-and-test start:test http://localhost:61812 cy:run", "mocha": "pnpm --filter backend run mocha", "test": "pnpm run mocha", - "format": "pnpm rome format packages/**/* --write && pnpm -r run format", + "format": "pnpm -r run format", "clean": "pnpm node ./scripts/clean.js", "clean-all": "pnpm node ./scripts/clean-all.js", "cleanall": "pnpm run clean-all" diff --git a/packages/backend/migration/1658656633972-note-replies-function.js b/packages/backend/migration/1658656633972-note-replies-function.js index 810e23843..705d1c935 100644 --- a/packages/backend/migration/1658656633972-note-replies-function.js +++ b/packages/backend/migration/1658656633972-note-replies-function.js @@ -47,6 +47,6 @@ export class noteRepliesFunction1658656633972 { } async down(queryRunner) { - await queryRunner.query(`DROP FUNCTION note_replies`); + await queryRunner.query("DROP FUNCTION note_replies"); } } diff --git a/packages/backend/migration/1671199573000-AddFkAbuseUserReportTargetUserIdToUserId.js b/packages/backend/migration/1671199573000-AddFkAbuseUserReportTargetUserIdToUserId.js index 96ed8e1d6..8fb5d08af 100644 --- a/packages/backend/migration/1671199573000-AddFkAbuseUserReportTargetUserIdToUserId.js +++ b/packages/backend/migration/1671199573000-AddFkAbuseUserReportTargetUserIdToUserId.js @@ -12,7 +12,7 @@ export class addFkAbuseUserReportTargetUserIdToUserId1671199573000 { async down(queryRunner) { await queryRunner.query( - `ALTER TABLE abuse_user_report DROP CONSTRAINT fk_7f4e851a35d81b64dda28eee0`, + "ALTER TABLE abuse_user_report DROP CONSTRAINT fk_7f4e851a35d81b64dda28eee0", ); } } diff --git a/packages/backend/migration/1680375641101-clean-charts.js b/packages/backend/migration/1680375641101-clean-charts.js index bfb8aa9d9..827dcd2ce 100644 --- a/packages/backend/migration/1680375641101-clean-charts.js +++ b/packages/backend/migration/1680375641101-clean-charts.js @@ -4,22 +4,22 @@ export class CleanCharts1680375641101 { } async up(queryRunner) { await queryRunner.query( - `delete from __chart__hashtag where ___local_users = 0 and ___remote_users = 0;`, + "delete from __chart__hashtag where ___local_users = 0 and ___remote_users = 0;", ); await queryRunner.query( - `delete from __chart_day__hashtag where ___local_users = 0 and ___remote_users = 0;`, + "delete from __chart_day__hashtag where ___local_users = 0 and ___remote_users = 0;", ); - await queryRunner.query(`COMMIT;`); - await queryRunner.query(`vacuum __chart__hashtag;`); - await queryRunner.query(`vacuum __chart_day__hashtag;`); - await queryRunner.query(`COMMIT;`); + await queryRunner.query("COMMIT;"); + await queryRunner.query("vacuum __chart__hashtag;"); + await queryRunner.query("vacuum __chart_day__hashtag;"); + await queryRunner.query("COMMIT;"); } async down(queryRunner) { await queryRunner.query( - `delete from __chart__hashtag where ___local_users = 0 and ___remote_users = 0;`, + "delete from __chart__hashtag where ___local_users = 0 and ___remote_users = 0;", ); await queryRunner.query( - `delete from __chart_day__hashtag where ___local_users = 0 and ___remote_users = 0;`, + "delete from __chart_day__hashtag where ___local_users = 0 and ___remote_users = 0;", ); } } diff --git a/packages/backend/package.json b/packages/backend/package.json index 6ea02e1be..d0f549e9a 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -17,7 +17,8 @@ "watch": "pnpm swc src -d built -D -w", "lint": "pnpm rome check \"src/**/*.ts\"", "mocha": "cross-env NODE_ENV=test TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha", - "test": "pnpm run mocha" + "test": "pnpm run mocha", + "format": "pnpm rome format * --write && pnpm rome check --apply-suggested *" }, "resolutions": { "chokidar": "^3.3.1" diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts index f22fafb5a..df5ad1d67 100644 --- a/packages/backend/src/boot/master.ts +++ b/packages/backend/src/boot/master.ts @@ -93,7 +93,7 @@ export async function masterMain() { true, ); - if (!envOption.noDaemons && !config.onlyQueueProcessor) { + if (!(envOption.noDaemons || config.onlyQueueProcessor)) { import("../daemons/server-stats.js").then((x) => x.default()); import("../daemons/queue-stats.js").then((x) => x.default()); import("../daemons/janitor.js").then((x) => x.default()); diff --git a/packages/backend/src/remote/activitypub/misc/ld-signature.ts b/packages/backend/src/remote/activitypub/misc/ld-signature.ts index 1657597ab..0a4ec3a53 100644 --- a/packages/backend/src/remote/activitypub/misc/ld-signature.ts +++ b/packages/backend/src/remote/activitypub/misc/ld-signature.ts @@ -70,13 +70,13 @@ export class LdSignature { ...options, "@context": "https://w3id.org/identity/v1", }; - delete transformedOptions["type"]; - delete transformedOptions["id"]; - delete transformedOptions["signatureValue"]; + transformedOptions["type"] = undefined; + transformedOptions["id"] = undefined; + transformedOptions["signatureValue"] = undefined; const canonizedOptions = await this.normalize(transformedOptions); const optionsHash = this.sha256(canonizedOptions); const transformedData = { ...data }; - delete transformedData["signature"]; + transformedData["signature"] = undefined; const cannonidedData = await this.normalize(transformedData); if (this.debug) console.debug(`cannonidedData: ${cannonidedData}`); const documentHash = this.sha256(cannonidedData); diff --git a/packages/backend/src/remote/activitypub/models/image.ts b/packages/backend/src/remote/activitypub/models/image.ts index 211aa3931..b47b16c86 100644 --- a/packages/backend/src/remote/activitypub/models/image.ts +++ b/packages/backend/src/remote/activitypub/models/image.ts @@ -29,8 +29,8 @@ export async function createImage( throw new Error("invalid image: url not privided"); } - if (!image.url.startsWith("https://") && !image.url.startsWith("http://")) { - throw new Error("invalid image: unexpected shcema of url: " + image.url); + if (!(image.url.startsWith("https://") || image.url.startsWith("http://"))) { + throw new Error(`invalid image: unexpected shcema of url: ${image.url}`); } logger.info(`Creating the Image: ${image.url}`); diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts index c603cb9ac..4c222d7c3 100644 --- a/packages/backend/src/server/api/endpoints/meta.ts +++ b/packages/backend/src/server/api/endpoints/meta.ts @@ -529,8 +529,8 @@ export default define(meta, paramDef, async (ps, me) => { github: instance.enableGithubIntegration, discord: instance.enableDiscordIntegration, serviceWorker: instance.enableServiceWorker, - postEditing: instance.experimentalFeatures?.postEditing || false, - postImports: instance.experimentalFeatures?.postImports || false, + postEditing: instance.experimentalFeatures?.postEditing, + postImports: instance.experimentalFeatures?.postImports, miauth: true, }; } diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 66db6f644..37d0f3170 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -614,13 +614,13 @@ export default define(meta, paramDef, async (ps, user) => { } // Post is a reply and remote user is the contributor of the original post - if (note.reply && note.reply.userHost !== null) { + if (note.reply?.userHost !== null) { const u = await Users.findOneBy({ id: note.reply.userId }); if (u && Users.isRemoteUser(u)) dm.addDirectRecipe(u); } // Post is a renote and remote user is the contributor of the original post - if (note.renote && note.renote.userHost !== null) { + if (note.renote?.userHost !== null) { const u = await Users.findOneBy({ id: note.renote.userId }); if (u && Users.isRemoteUser(u)) dm.addDirectRecipe(u); } diff --git a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts index b8ef0929e..91841a19a 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts @@ -49,7 +49,7 @@ export function toTextWithReaction(status: Entity.Status[], host: string) { if (t.reblog) t.reblog = toTextWithReaction([t.reblog], host)[0]; const reactions = t.emoji_reactions.map((r) => { const emojiNotation = r.url ? `:${r.name.replace("@.", "")}:` : r.name; - return `${emojiNotation} (${r.count}${r.me ? `* ` : ""})`; + return `${emojiNotation} (${r.count}${r.me ? "* " : ""})`; }); const reaction = t.emoji_reactions as Entity.Reaction[]; const emoji = t.emojis || []; diff --git a/packages/backend/src/server/web/boot.js b/packages/backend/src/server/web/boot.js index e7e859d20..d80d3ca13 100644 --- a/packages/backend/src/server/web/boot.js +++ b/packages/backend/src/server/web/boot.js @@ -97,7 +97,7 @@ const fontSize = localStorage.getItem("fontSize"); if (fontSize) { - document.documentElement.classList.add("f-" + fontSize); + document.documentElement.classList.add(`f-${fontSize}`); } const useSystemFont = localStorage.getItem("useSystemFont"); @@ -292,7 +292,7 @@ const meta = await res.json(); - if (meta.version != v) { + if (meta.version !== v) { localStorage.setItem("v", meta.version); refresh(); } diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index abb8d94e8..723a6be3d 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -564,13 +564,13 @@ export default async ( } // 投稿がリプライかつ投稿者がローカルユーザーかつリプライ先の投稿の投稿者がリモートユーザーなら配送 - if (data.reply && data.reply.userHost !== null) { + if (data.reply?.userHost !== null) { const u = await Users.findOneBy({ id: data.reply.userId }); if (u && Users.isRemoteUser(u)) dm.addDirectRecipe(u); } // 投稿がRenoteかつ投稿者がローカルユーザーかつRenote元の投稿の投稿者がリモートユーザーなら配送 - if (data.renote && data.renote.userHost !== null) { + if (data.renote?.userHost !== null) { const u = await Users.findOneBy({ id: data.renote.userId }); if (u && Users.isRemoteUser(u)) dm.addDirectRecipe(u); } @@ -671,7 +671,7 @@ async function insertNote( tags: tags.map((tag) => normalizeForSearch(tag)), emojis, userId: user.id, - localOnly: data.localOnly || false, + localOnly: data.localOnly, visibility: data.visibility as any, visibleUserIds: data.visibility === "specified" diff --git a/packages/backend/test/api-visibility.ts b/packages/backend/test/api-visibility.ts index 0ee4a4d33..20a530fce 100644 --- a/packages/backend/test/api-visibility.ts +++ b/packages/backend/test/api-visibility.ts @@ -462,21 +462,21 @@ describe("API visibility", () => { it("[HTL] public-post が 自分が見れる", async(async () => { const res = await request("/notes/timeline", { limit: 100 }, alice); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == pub.id); + const notes = res.body.filter((n: any) => n.id === pub.id); assert.strictEqual(notes[0].text, "x"); })); it("[HTL] public-post が 非フォロワーから見れない", async(async () => { const res = await request("/notes/timeline", { limit: 100 }, other); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == pub.id); + const notes = res.body.filter((n: any) => n.id === pub.id); assert.strictEqual(notes.length, 0); })); it("[HTL] followers-post が フォロワーから見れる", async(async () => { const res = await request("/notes/timeline", { limit: 100 }, follower); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == fol.id); + const notes = res.body.filter((n: any) => n.id === fol.id); assert.strictEqual(notes[0].text, "x"); })); //#endregion @@ -489,7 +489,7 @@ describe("API visibility", () => { follower, ); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == folR.id); + const notes = res.body.filter((n: any) => n.id === folR.id); assert.strictEqual(notes[0].text, "x"); })); @@ -500,7 +500,7 @@ describe("API visibility", () => { other, ); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == folR.id); + const notes = res.body.filter((n: any) => n.id === folR.id); assert.strictEqual(notes.length, 0); })); @@ -511,7 +511,7 @@ describe("API visibility", () => { target, ); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == folR.id); + const notes = res.body.filter((n: any) => n.id === folR.id); assert.strictEqual(notes[0].text, "x"); })); //#endregion @@ -520,14 +520,14 @@ describe("API visibility", () => { it("[mentions] followers-reply が 非フォロワー (リプライ先である) から見れる", async(async () => { const res = await request("/notes/mentions", { limit: 100 }, target); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == folR.id); + const notes = res.body.filter((n: any) => n.id === folR.id); assert.strictEqual(notes[0].text, "x"); })); it("[mentions] followers-mention が 非フォロワー (メンション先である) から見れる", async(async () => { const res = await request("/notes/mentions", { limit: 100 }, target); assert.strictEqual(res.status, 200); - const notes = res.body.filter((n: any) => n.id == folM.id); + const notes = res.body.filter((n: any) => n.id === folM.id); assert.strictEqual(notes[0].text, "@target x"); })); //#endregion diff --git a/packages/backend/test/get-file-info.ts b/packages/backend/test/get-file-info.ts index 22dc28c8e..d39900514 100644 --- a/packages/backend/test/get-file-info.ts +++ b/packages/backend/test/get-file-info.ts @@ -13,10 +13,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 0, md5: "d41d8cd98f00b204e9800998ecf8427e", @@ -35,10 +35,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 25360, md5: "091b3f259662aa31e2ffef4519951168", @@ -57,10 +57,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 1868, md5: "08189c607bea3b952704676bb3c979e0", @@ -79,10 +79,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 2248, md5: "32c47a11555675d9267aee1a86571e7e", @@ -101,10 +101,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 3772, md5: "f73535c3e1e27508885b69b10cf6e991", @@ -123,10 +123,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 505, md5: "b6f52b4b021e7b92cdd04509c7267965", @@ -146,10 +146,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 544, md5: "4b7a346cde9ccbeb267e812567e33397", @@ -168,10 +168,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 75933, md5: "268c5dde99e17cf8fe09f1ab3f97df56", @@ -190,10 +190,10 @@ describe("Get file info", () => { const info = (await getFileInfo(path, { skipSensitiveDetection: true, })) as any; - delete info.warnings; - delete info.blurhash; - delete info.sensitive; - delete info.porn; + info.warnings = undefined; + info.blurhash = undefined; + info.sensitive = undefined; + info.porn = undefined; assert.deepStrictEqual(info, { size: 12624, md5: "68d5b2d8d1d1acbbce99203e3ec3857e", diff --git a/packages/backend/test/streaming.ts b/packages/backend/test/streaming.ts index 3292c66e1..05c972992 100644 --- a/packages/backend/test/streaming.ts +++ b/packages/backend/test/streaming.ts @@ -599,7 +599,7 @@ describe("Streaming", () => { chitose, "hashtag", ({ type, body }) => { - if (type == "note") { + if (type === "note") { assert.deepStrictEqual(body.text, "#foo"); ws.close(); done(); @@ -625,7 +625,7 @@ describe("Streaming", () => { chitose, "hashtag", ({ type, body }) => { - if (type == "note") { + if (type === "note") { if (body.text === "#foo") fooCount++; if (body.text === "#bar") barCount++; if (body.text === "#foo #bar") fooBarCount++; @@ -668,7 +668,7 @@ describe("Streaming", () => { chitose, "hashtag", ({ type, body }) => { - if (type == "note") { + if (type === "note") { if (body.text === "#foo") fooCount++; if (body.text === "#bar") barCount++; if (body.text === "#foo #bar") fooBarCount++; @@ -718,7 +718,7 @@ describe("Streaming", () => { chitose, "hashtag", ({ type, body }) => { - if (type == "note") { + if (type === "note") { if (body.text === "#foo") fooCount++; if (body.text === "#bar") barCount++; if (body.text === "#foo #bar") fooBarCount++; diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts index f3f68b260..28c1a7925 100644 --- a/packages/backend/test/utils.ts +++ b/packages/backend/test/utils.ts @@ -53,7 +53,7 @@ export const api = async (endpoint: string, params: any, me?: any) => { beforeError: [ (error) => { const { response } = error; - if (response && response.body) console.warn(response.body); + if (response?.body) console.warn(response.body); return error; }, ], @@ -316,7 +316,7 @@ export function launchServer( moreProcess: () => Promise = async () => {}, ) { return (done: (err?: Error) => any) => { - const p = childProcess.spawn("node", [_dirname + "/../index.js"], { + const p = childProcess.spawn("node", [`${_dirname}/../index.js`], { stdio: ["inherit", "inherit", "inherit", "ipc"], env: { NODE_ENV: "test", PATH: process.env.PATH }, }); @@ -340,8 +340,8 @@ export async function initTestDb(justBorrow = false, initEntities?: any[]) { username: config.db.user, password: config.db.pass, database: config.db.db, - synchronize: true && !justBorrow, - dropSchema: true && !justBorrow, + synchronize: !justBorrow, + dropSchema: !justBorrow, entities: initEntities || entities, }); @@ -359,7 +359,7 @@ export function startServer( rej("timeout to start"); }, timeout); - const p = childProcess.spawn("node", [_dirname + "/../built/index.js"], { + const p = childProcess.spawn("node", [`${_dirname}/../built/index.js`], { stdio: ["inherit", "inherit", "inherit", "ipc"], env: { NODE_ENV: "test", PATH: process.env.PATH }, }); diff --git a/packages/client/src/components/MkSubNoteContent.vue b/packages/client/src/components/MkSubNoteContent.vue index 93f6d5567..6aaaa16e2 100644 --- a/packages/client/src/components/MkSubNoteContent.vue +++ b/packages/client/src/components/MkSubNoteContent.vue @@ -42,7 +42,7 @@ isLong, manyImages: note.files.length > 4, showContent: note.cw && !showContent, - animatedMfm: !disableMfm + animatedMfm: !disableMfm, }" > diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts index 50a566d33..152143808 100644 --- a/packages/client/src/components/mfm.ts +++ b/packages/client/src/components/mfm.ts @@ -59,7 +59,7 @@ export default defineComponent({ }; // const validEase = (e: string | null | undefined) => { // if (e == null) return null; - // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) + // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) // ? (e.startsWith("steps") ? e : "cubic-bezier" + e) // : null // } diff --git a/packages/sw/package.json b/packages/sw/package.json index bb8098dc3..6c052b5cc 100644 --- a/packages/sw/package.json +++ b/packages/sw/package.json @@ -4,7 +4,8 @@ "scripts": { "build": "webpack", "watch": "pnpm swc src -d built -D -w", - "lint": "pnpm rome check \"src/**/*.ts\"" + "lint": "pnpm rome check \"src/**/*.ts\"", + "format": "pnpm rome format * --write && pnpm rome check --apply-suggested *" }, "devDependencies": { "@swc/cli": "^0.1.62", diff --git a/scripts/clean-all.js b/scripts/clean-all.js index e347ee6a9..5b7469040 100644 --- a/scripts/clean-all.js +++ b/scripts/clean-all.js @@ -1,21 +1,39 @@ -const fs = require('fs'); -const execa = require('execa'); +const fs = require("fs"); +const execa = require("execa"); (async () => { - fs.rmSync(__dirname + '/../packages/backend/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/backend/node_modules', { recursive: true, force: true }); + fs.rmSync(`${__dirname}/../packages/backend/built`, { + recursive: true, + force: true, + }); + fs.rmSync(`${__dirname}/../packages/backend/node_modules`, { + recursive: true, + force: true, + }); - fs.rmSync(__dirname + '/../packages/client/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/client/node_modules', { recursive: true, force: true }); + fs.rmSync(`${__dirname}/../packages/client/built`, { + recursive: true, + force: true, + }); + fs.rmSync(`${__dirname}/../packages/client/node_modules`, { + recursive: true, + force: true, + }); - fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/sw/node_modules', { recursive: true, force: true }); + fs.rmSync(`${__dirname}/../packages/sw/built`, { + recursive: true, + force: true, + }); + fs.rmSync(`${__dirname}/../packages/sw/node_modules`, { + recursive: true, + force: true, + }); - fs.rmSync(__dirname + '/../built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../node_modules', { recursive: true, force: true }); + fs.rmSync(`${__dirname}/../built`, { recursive: true, force: true }); + fs.rmSync(`${__dirname}/../node_modules`, { recursive: true, force: true }); - execa('pnpm', ['store', 'prune'], { - cwd: __dirname + '/../', - stdio: 'inherit' + execa("pnpm", ["store", "prune"], { + cwd: `${__dirname}/../`, + stdio: "inherit", }); })(); diff --git a/scripts/clean.js b/scripts/clean.js index 70b9d882b..e052e3def 100644 --- a/scripts/clean.js +++ b/scripts/clean.js @@ -1,8 +1,17 @@ -const fs = require('fs'); +const fs = require("fs"); (async () => { - fs.rmSync(__dirname + '/../packages/backend/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/client/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../packages/sw/built', { recursive: true, force: true }); - fs.rmSync(__dirname + '/../built', { recursive: true, force: true }); + fs.rmSync(`${__dirname}/../packages/backend/built`, { + recursive: true, + force: true, + }); + fs.rmSync(`${__dirname}/../packages/client/built`, { + recursive: true, + force: true, + }); + fs.rmSync(`${__dirname}/../packages/sw/built`, { + recursive: true, + force: true, + }); + fs.rmSync(`${__dirname}/../built`, { recursive: true, force: true }); })(); diff --git a/scripts/dev.js b/scripts/dev.js index 7a61070f5..2a79e9b37 100644 --- a/scripts/dev.js +++ b/scripts/dev.js @@ -1,45 +1,45 @@ -const execa = require('execa'); +const execa = require("execa"); (async () => { - await execa('pnpm', ['clean'], { - cwd: __dirname + '/../', + await execa("pnpm", ["clean"], { + cwd: `${__dirname}/../`, stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['dlx', 'gulp', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["dlx", "gulp", "watch"], { + cwd: `${__dirname}/../`, stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'backend', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "backend", "watch"], { + cwd: `${__dirname}/../`, stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'client', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "client", "watch"], { + cwd: `${__dirname}/../`, stdout: process.stdout, stderr: process.stderr, }); - execa('pnpm', ['--filter', 'sw', 'watch'], { - cwd: __dirname + '/../', + execa("pnpm", ["--filter", "sw", "watch"], { + cwd: `${__dirname}/../`, stdout: process.stdout, stderr: process.stderr, }); const start = async () => { try { - await execa('pnpm', ['start'], { - cwd: __dirname + '/../', + await execa("pnpm", ["start"], { + cwd: `${__dirname}/../`, stdout: process.stdout, stderr: process.stderr, }); } catch (e) { - await new Promise(resolve => setTimeout(resolve, 3000)); + await new Promise((resolve) => setTimeout(resolve, 3000)); start(); } };