From 6437f3747d8028313b8089b8b24695544c3d6994 Mon Sep 17 00:00:00 2001 From: Utku Bakir <74243531+utkubakir@users.noreply.github.com> Date: Wed, 10 Aug 2022 18:43:04 +0300 Subject: [PATCH 01/15] Move eslint to config package --- .eslintrc.js | 20 -------- apps/landing/.eslintrc.js | 8 ++++ apps/landing/package.json | 1 + apps/mobile/.eslintignore | 4 -- apps/mobile/.eslintrc.js | 8 ++++ apps/mobile/.eslintrc.json | 44 ------------------ apps/mobile/package.json | 4 +- apps/mobile/pnpm-lock.yaml | Bin 304815 -> 293354 bytes .../components/browse/BrowseLocationItem.tsx | 1 + package.json | 8 ---- packages/config/eslint-preset.js | 11 ----- packages/config/eslint-react-native.js | 42 +++++++++++++++++ packages/config/eslint-react.js | 44 ++++++++++++++++++ packages/config/package.json | 14 +++++- packages/interface/.eslintrc.js | 7 +++ packages/interface/package.json | 1 + pnpm-lock.yaml | Bin 668113 -> 663697 bytes 17 files changed, 125 insertions(+), 92 deletions(-) delete mode 100644 .eslintrc.js create mode 100644 apps/landing/.eslintrc.js delete mode 100644 apps/mobile/.eslintignore create mode 100644 apps/mobile/.eslintrc.js delete mode 100755 apps/mobile/.eslintrc.json delete mode 100644 packages/config/eslint-preset.js create mode 100644 packages/config/eslint-react-native.js create mode 100644 packages/config/eslint-react.js create mode 100644 packages/interface/.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 16fa89674..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - parserOptions: { - project: [ - 'apps/desktop/tsconfig.json', - 'apps/web/tsconfig.json', - 'apps/landing/tsconfig.json', - 'apps/mobile/tsconfig.json', - 'packages/client/tsconfig.json', - 'packages/interface/tsconfig.json', - 'packages/ui/tsconfig.json' - ] - }, - plugins: ['@typescript-eslint'], - extends: ['standard-with-typescript', 'prettier'], - rules: { - '@typescript-eslint/explicit-function-return-type': 'off' - } -}; diff --git a/apps/landing/.eslintrc.js b/apps/landing/.eslintrc.js new file mode 100644 index 000000000..ec48f24d4 --- /dev/null +++ b/apps/landing/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + ...require('@sd/config/eslint-react.js'), + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + }, + ignorePatterns: ['**/*.js', '**/*.json', 'node_modules', 'public', 'dist'] +}; diff --git a/apps/landing/package.json b/apps/landing/package.json index 4a5a08e58..7f6727e81 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -39,6 +39,7 @@ "vite-plugin-ssr": "^0.4.15" }, "devDependencies": { + "@sd/config": "link:../../packages/config", "@tailwindcss/line-clamp": "^0.4.0", "@tailwindcss/typography": "^0.5.4", "@types/prismjs": "^1.26.0", diff --git a/apps/mobile/.eslintignore b/apps/mobile/.eslintignore deleted file mode 100644 index b85fcb7dd..000000000 --- a/apps/mobile/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -android/ -ios/ -.expo \ No newline at end of file diff --git a/apps/mobile/.eslintrc.js b/apps/mobile/.eslintrc.js new file mode 100644 index 000000000..7eb0515e1 --- /dev/null +++ b/apps/mobile/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + ...require('@sd/config/eslint-react-native.js'), + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + }, + ignorePatterns: ['**/*.js', '**/*.json', 'android', 'ios', '.expo'] +}; diff --git a/apps/mobile/.eslintrc.json b/apps/mobile/.eslintrc.json deleted file mode 100755 index 3c3fc8145..000000000 --- a/apps/mobile/.eslintrc.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "env": { - "react-native/react-native": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "ecmaVersion": 12, - "sourceType": "module" - }, - "plugins": ["react", "react-native", "react-hooks", "@typescript-eslint"], - "rules": { - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "react/display-name": "off", - "react/prop-types": "off", - "no-control-regex": "off", - "no-mixed-spaces-and-tabs": ["warn", "smart-tabs"], - "react/react-in-jsx-scope": "off", - // Aggressively disable some rules for React Native. - "@typescript-eslint/strict-boolean-expressions": "off", - "@typescript-eslint/consistent-type-definitions": "off", - "@typescript-eslint/no-floating-promises": "off" - }, - "settings": { - "react": { - "version": "detect" // "detect" automatically picks the version you have installed. - } - } -} diff --git a/apps/mobile/package.json b/apps/mobile/package.json index bd510e6c2..cccdaf41b 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -41,15 +41,13 @@ "zustand": "^4.0.0" }, "devDependencies": { + "@sd/config": "file:../../packages/config", "@babel/core": "^7.12.9", "@babel/runtime": "^7.18.9", "@rnx-kit/metro-config": "^1.2.36", "@rnx-kit/metro-resolver-symlinks": "^0.1.21", "@types/react": "~18.0.15", "@types/react-native": "~0.69.5", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-native": "^4.0.0", "metro-minify-terser": "^0.72.0", "react-native-svg": "^12.4.3", "react-native-svg-transformer": "^1.0.0" diff --git a/apps/mobile/pnpm-lock.yaml b/apps/mobile/pnpm-lock.yaml index 6e200d20ad7957ded7182609a6a99adb603944b5..6fc817ce26cd17b977b095ebc2fb8f4a67f1a3ef 100644 GIT binary patch delta 363 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 RH?z~0oV$4V6LF8c{Qu&9Rtx|D diff --git a/apps/mobile/src/components/browse/BrowseLocationItem.tsx b/apps/mobile/src/components/browse/BrowseLocationItem.tsx index 8d0ba86d2..383b50624 100644 --- a/apps/mobile/src/components/browse/BrowseLocationItem.tsx +++ b/apps/mobile/src/components/browse/BrowseLocationItem.tsx @@ -11,6 +11,7 @@ interface BrowseLocationItemProps { const BrowseLocationItem: React.FC = (props) => { const { folderName, onPress } = props; + return ( diff --git a/package.json b/package.json index 4ea589009..763f3442a 100644 --- a/package.json +++ b/package.json @@ -26,15 +26,7 @@ "@cspell/dict-typescript": "^2.0.1", "@evilmartians/lefthook": "^1.0.5", "@trivago/prettier-plugin-sort-imports": "^3.3.0", - "@typescript-eslint/eslint-plugin": "^5.30.7", - "@typescript-eslint/parser": "^5.30.7", "cspell": "^6.4.0", - "eslint": "^8.20.0", - "eslint-config-prettier": "^8.5.0", - "eslint-config-standard-with-typescript": "^22.0.0", - "eslint-plugin-import": ">=2.25.2 <3.0.0", - "eslint-plugin-n": ">=15.0.0 <16.0.0", - "eslint-plugin-promise": ">=6.0.0 <7.0.0", "markdown-link-check": "^3.10.2", "prettier": "^2.7.1", "typescript": "^4.7.4" diff --git a/packages/config/eslint-preset.js b/packages/config/eslint-preset.js deleted file mode 100644 index c99e0d465..000000000 --- a/packages/config/eslint-preset.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - extends: ['next', 'prettier'], - settings: { - next: { - rootDir: ['apps/*/', 'packages/*/'] - } - }, - rules: { - 'no-html-link-for-pages': 'off' - } -}; diff --git a/packages/config/eslint-react-native.js b/packages/config/eslint-react-native.js new file mode 100644 index 000000000..f275951ff --- /dev/null +++ b/packages/config/eslint-react-native.js @@ -0,0 +1,42 @@ +module.exports = { + env: { + 'react-native/react-native': true + }, + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaFeatures: { + jsx: true + }, + ecmaVersion: 12, + sourceType: 'module' + }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react-hooks/recommended', + 'plugin:@typescript-eslint/recommended' + ], + plugins: ['react', 'react-native'], + rules: { + 'react/display-name': 'off', + 'react/prop-types': 'off', + 'react/no-unescaped-entities': 'off', + 'react/react-in-jsx-scope': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + 'no-control-regex': 'off', + 'no-mixed-spaces-and-tabs': ['warn', 'smart-tabs'] + }, + ignorePatterns: ['**/*.js', '**/*.json', 'node_modules'], + settings: { + react: { + version: 'detect' + } + } +}; diff --git a/packages/config/eslint-react.js b/packages/config/eslint-react.js new file mode 100644 index 000000000..5a232b963 --- /dev/null +++ b/packages/config/eslint-react.js @@ -0,0 +1,44 @@ +module.exports = { + env: { + browser: true, + node: true + }, + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaFeatures: { + jsx: true + }, + ecmaVersion: 12, + sourceType: 'module' + }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react-hooks/recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier' + ], + plugins: ['react'], + rules: { + 'react/display-name': 'off', + 'react/prop-types': 'off', + 'react/no-unescaped-entities': 'off', + 'react/react-in-jsx-scope': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + 'no-control-regex': 'off', + 'no-mixed-spaces-and-tabs': ['warn', 'smart-tabs'] + }, + ignorePatterns: ['**/*.js', '**/*.json', 'node_modules'], + settings: { + react: { + version: 'detect' + } + } +}; diff --git a/packages/config/package.json b/packages/config/package.json index b91b1f836..79110a252 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -4,6 +4,16 @@ "main": "index.js", "license": "GPL-3.0-only", "files": [ - "eslint-preset.js" - ] + "eslint-react.js", + "eslint-react-native.js" + ], + "devDependencies": { + "eslint": "^8.21.0", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-native": "^4.0.0" + } } diff --git a/packages/interface/.eslintrc.js b/packages/interface/.eslintrc.js new file mode 100644 index 000000000..b3e0f403d --- /dev/null +++ b/packages/interface/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + ...require('@sd/config/eslint-react.js'), + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + } +}; diff --git a/packages/interface/package.json b/packages/interface/package.json index 2f1961121..0d5a34959 100644 --- a/packages/interface/package.json +++ b/packages/interface/package.json @@ -67,6 +67,7 @@ "zustand": "4.0.0" }, "devDependencies": { + "@sd/config": "workspace:*", "@types/babel-core": "^6.25.7", "@types/byte-size": "^8.1.0", "@types/lodash": "^4.14.182", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a06b10e41f893f0bd29b4f66cd1fe80be4f9ef29..a3abc04873818f2420196cc625941f8ac3d32f66 100644 GIT binary patch delta 4007 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 Date: Thu, 11 Aug 2022 12:14:33 +0300 Subject: [PATCH 02/15] Fix types - Landing --- apps/landing/package.json | 3 ++- apps/landing/src/components/AppEmbed.tsx | 5 ++--- apps/landing/src/components/Footer.tsx | 1 + apps/landing/src/components/NavBar.tsx | 6 ++++-- apps/landing/src/components/TeamMember.tsx | 2 +- apps/landing/src/pages/blog/index.page.tsx | 9 +++++---- apps/landing/src/pages/blog/post.page.tsx | 10 +++++----- apps/landing/src/pages/careers.page.tsx | 17 ++++++++++++----- apps/landing/src/pages/index.page.tsx | 5 +++-- apps/landing/src/pages/team.page.tsx | 2 +- apps/landing/src/renderer/types.ts | 18 +++++++++--------- apps/landing/src/utils/index.ts | 4 ++-- 12 files changed, 47 insertions(+), 35 deletions(-) diff --git a/apps/landing/package.json b/apps/landing/package.json index 7f6727e81..0a41ad7a9 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -6,7 +6,8 @@ "vercel-build": "./vercel/deploy.sh", "build": "vite build && vite build --ssr && vite-plugin-ssr prerender", "server": "ts-node ./server", - "server:prod": "cross-env NODE_ENV=production ts-node ./server" + "server:prod": "cross-env NODE_ENV=production ts-node ./server", + "lint": "eslint src/**/*.{ts,tsx} && tsc --noEmit" }, "dependencies": { "@heroicons/react": "^1.0.6", diff --git a/apps/landing/src/components/AppEmbed.tsx b/apps/landing/src/components/AppEmbed.tsx index dbd065d78..6073603ed 100644 --- a/apps/landing/src/components/AppEmbed.tsx +++ b/apps/landing/src/components/AppEmbed.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import clsx from 'clsx'; import React, { useEffect, useRef, useState } from 'react'; @@ -87,9 +88,7 @@ const AppEmbed = () => { /> )} - {renderImage && ( -
- )} + {renderImage &&
}
diff --git a/apps/landing/src/components/Footer.tsx b/apps/landing/src/components/Footer.tsx index 2ac443954..a0a74210d 100644 --- a/apps/landing/src/components/Footer.tsx +++ b/apps/landing/src/components/Footer.tsx @@ -16,6 +16,7 @@ function FooterLink(props: { children: string | JSX.Element; link: string; blank href={props.link} target={props.blank ? '_blank' : ''} className="text-gray-300 hover:text-white" + rel="noreferrer" > {props.children} diff --git a/apps/landing/src/components/NavBar.tsx b/apps/landing/src/components/NavBar.tsx index 11db4243d..d917f7ca3 100644 --- a/apps/landing/src/components/NavBar.tsx +++ b/apps/landing/src/components/NavBar.tsx @@ -15,6 +15,7 @@ function NavLink(props: { link?: string; children: string }) { href={props.link ?? '#'} target={props.link?.startsWith('http') ? '_blank' : undefined} className="p-4 text-gray-300 no-underline transition cursor-pointer hover:text-gray-50" + rel="noreferrer" > {props.children} @@ -54,6 +55,7 @@ export default function NavBar() { setTimeout(onScroll, 0); getWindow()?.addEventListener('scroll', onScroll); return () => getWindow()?.removeEventListener('scroll', onScroll); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( @@ -136,10 +138,10 @@ export default function NavBar() { buttonProps={{ className: '!p-1 ml-[140px]' }} /> diff --git a/apps/landing/src/components/TeamMember.tsx b/apps/landing/src/components/TeamMember.tsx index 3101aac59..3dd5f0724 100644 --- a/apps/landing/src/components/TeamMember.tsx +++ b/apps/landing/src/components/TeamMember.tsx @@ -36,7 +36,7 @@ function Link(props: LinkProps) { {props.children} diff --git a/apps/landing/src/pages/blog/index.page.tsx b/apps/landing/src/pages/blog/index.page.tsx index 3a90b23c1..071a11ac7 100644 --- a/apps/landing/src/pages/blog/index.page.tsx +++ b/apps/landing/src/pages/blog/index.page.tsx @@ -8,7 +8,7 @@ import { blogEnabled } from './api'; function Page({ posts }: { posts: PostOrPage[] }) { if (!blogEnabled) { - let window = getWindow(); + const window = getWindow(); if (!window) return; window.location.href = '/blog-not-enabled'; return <>; @@ -28,6 +28,7 @@ function Page({ posts }: { posts: PostOrPage[] }) { {posts.map((post) => { return (
{ window.location.href = `/blog/${post.slug}`; }} @@ -49,9 +50,9 @@ function Page({ posts }: { posts: PostOrPage[] }) { {new Date(post.published_at ?? '').toLocaleDateString()}

- {post.tags?.map((tag: Tag) => { - return ; - })} + {post.tags?.map((tag: Tag) => ( + + ))}
diff --git a/apps/landing/src/pages/blog/post.page.tsx b/apps/landing/src/pages/blog/post.page.tsx index 560377514..150738380 100644 --- a/apps/landing/src/pages/blog/post.page.tsx +++ b/apps/landing/src/pages/blog/post.page.tsx @@ -12,10 +12,10 @@ function MarkdownPage({ post }: { post: PostOrPage }) { Prism.highlightAll(); }, []); - let description = + const description = post?.excerpt?.length || 0 > 160 ? post?.excerpt?.substring(0, 160) + '...' : post?.excerpt; - let featured_image = + const featured_image = post?.feature_image || 'https://raw.githubusercontent.com/spacedriveapp/.github/main/profile/spacedrive_icon.png'; @@ -50,9 +50,9 @@ function MarkdownPage({ post }: { post: PostOrPage }) {

- {post?.tags?.map((tag: Tag) => { - return ; - })} + {post?.tags?.map((tag: Tag) => ( + + ))}
Our Values

What drives us daily.

- {values.map((value) => ( -
+ {values.map((value, index) => ( +

{value.title}

{value.desc}

@@ -132,8 +135,9 @@ function Page() {

We're behind you 100%.

- {perks.map((value) => ( + {perks.map((value, index) => (
@@ -154,8 +158,11 @@ function Page() { There are no positions open at this time. Please check back later!

) : ( - positions.map((value) => ( -
+ positions.map((value, index) => ( +

{value.name}

diff --git a/apps/landing/src/pages/index.page.tsx b/apps/landing/src/pages/index.page.tsx index d4c39fa7f..6c7077ec0 100644 --- a/apps/landing/src/pages/index.page.tsx +++ b/apps/landing/src/pages/index.page.tsx @@ -20,7 +20,7 @@ interface SectionProps { } function Section(props: SectionProps = { orientation: 'left' }) { - let info = ( + const info = (
{props.heading &&

{props.heading}

} {props.description && ( @@ -78,7 +78,7 @@ function Page() { alert('An error occurred while unsubscribing from waitlist'); } })(); - }, []); + }, [urlParsed.search]); return ( <> @@ -144,6 +144,7 @@ function Page() { className="transition text-primary-600 hover:text-primary-500" href="https://github.com/spacedriveapp" target="_blank" + rel="noreferrer" > Find out more → diff --git a/apps/landing/src/pages/team.page.tsx b/apps/landing/src/pages/team.page.tsx index 312599d4c..2b5d822eb 100644 --- a/apps/landing/src/pages/team.page.tsx +++ b/apps/landing/src/pages/team.page.tsx @@ -245,7 +245,7 @@ function Page() {
open source contributors diff --git a/apps/landing/src/renderer/types.ts b/apps/landing/src/renderer/types.ts index 01633e865..f988b9697 100644 --- a/apps/landing/src/renderer/types.ts +++ b/apps/landing/src/renderer/types.ts @@ -1,11 +1,11 @@ -export type PageProps = {} +export type PageProps = Record; // The `pageContext` that are available in both on the server-side and browser-side export type PageContext = { - Page: (pageProps: PageProps) => React.ReactElement - pageProps: PageProps - urlPathname: string - documentProps?: { - title?: string - description?: string - } -} + Page: (pageProps: PageProps) => React.ReactElement; + pageProps: PageProps; + urlPathname: string; + documentProps?: { + title?: string; + description?: string; + }; +}; diff --git a/apps/landing/src/utils/index.ts b/apps/landing/src/utils/index.ts index 488b9f2c7..e7f9bafdd 100644 --- a/apps/landing/src/utils/index.ts +++ b/apps/landing/src/utils/index.ts @@ -6,9 +6,9 @@ export function getWindow(): (Window & typeof globalThis) | null { return typeof window !== 'undefined' ? window : null; } +// eslint-disable-next-line no-useless-escape const FILE_NAME_REGEX = /^.*[\\\/]/; - /** * Extracts the file name including its extension from a file path */ @@ -19,7 +19,7 @@ export function filename(path: string) { /** * Takes the result of `import.meta.globEager` and returns an object * with the keys being the file names and the values being the imported file. - * + * * Does not work with directories. */ export function resolveFilesGlob(files: Record): Record { From b33583fde3e686ef571e421cabb7d923b72117b7 Mon Sep 17 00:00:00 2001 From: Utku Bakir <74243531+utkubakir@users.noreply.github.com> Date: Thu, 11 Aug 2022 12:22:58 +0300 Subject: [PATCH 03/15] Fix types - Mobile --- apps/mobile/.eslintrc.js | 44 +++++++++++++++++++++--- apps/mobile/package.json | 14 ++++++-- apps/mobile/pnpm-lock.yaml | Bin 293354 -> 322567 bytes apps/mobile/src/types/declarations.d.ts | 1 + packages/config/eslint-react-native.js | 42 ---------------------- packages/config/package.json | 6 ++-- pnpm-lock.yaml | Bin 663697 -> 663002 bytes 7 files changed, 53 insertions(+), 54 deletions(-) delete mode 100644 packages/config/eslint-react-native.js diff --git a/apps/mobile/.eslintrc.js b/apps/mobile/.eslintrc.js index 7eb0515e1..d440a4ae9 100644 --- a/apps/mobile/.eslintrc.js +++ b/apps/mobile/.eslintrc.js @@ -1,8 +1,42 @@ module.exports = { - ...require('@sd/config/eslint-react-native.js'), - parserOptions: { - tsconfigRootDir: __dirname, - project: './tsconfig.json' + env: { + 'react-native/react-native': true }, - ignorePatterns: ['**/*.js', '**/*.json', 'android', 'ios', '.expo'] + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaFeatures: { + jsx: true + }, + ecmaVersion: 12, + sourceType: 'module' + }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react-hooks/recommended', + 'plugin:@typescript-eslint/recommended' + ], + plugins: ['react', 'react-native'], + rules: { + 'react/display-name': 'off', + 'react/prop-types': 'off', + 'react/no-unescaped-entities': 'off', + 'react/react-in-jsx-scope': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + 'no-control-regex': 'off', + 'no-mixed-spaces-and-tabs': ['warn', 'smart-tabs'] + }, + ignorePatterns: ['**/*.js', '**/*.json', 'node_modules', 'android', 'ios', '.expo'], + settings: { + react: { + version: 'detect' + } + } }; diff --git a/apps/mobile/package.json b/apps/mobile/package.json index cccdaf41b..9fe4e2594 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "expo start --dev-client", "android": "expo run:android", - "ios": "expo run:ios" + "ios": "expo run:ios", + "lint": "eslint src/**/*.{ts,tsx} && tsc --noEmit" }, "dependencies": { "@expo/vector-icons": "^13.0.0", @@ -41,16 +42,23 @@ "zustand": "^4.0.0" }, "devDependencies": { - "@sd/config": "file:../../packages/config", "@babel/core": "^7.12.9", "@babel/runtime": "^7.18.9", "@rnx-kit/metro-config": "^1.2.36", "@rnx-kit/metro-resolver-symlinks": "^0.1.21", "@types/react": "~18.0.15", "@types/react-native": "~0.69.5", + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint": "^8.21.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-native": "^4.0.0", "metro-minify-terser": "^0.72.0", "react-native-svg": "^12.4.3", - "react-native-svg-transformer": "^1.0.0" + "react-native-svg-transformer": "^1.0.0", + "typescript": "^4.7.4" }, "private": true } diff --git a/apps/mobile/pnpm-lock.yaml b/apps/mobile/pnpm-lock.yaml index 6fc817ce26cd17b977b095ebc2fb8f4a67f1a3ef..1cf083f98ee040cefbbe37285f0b834a66c23d33 100644 GIT binary patch delta 19255 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 sjweW`UA17EgpoNWHsi2h$8|i(zV?ZHVV9=%Aw zYN5=2t=3|C>Qim#EL|x-1dsVNH(WW5tw8;QF07cdSvJo(^9Pv~#L%_=d;jsg_kNz| zz1KU_=Bu|dhRXq4Hb2Xp7;jMC1nT(!^5a(BU8(EX z`LE#*$%$_vTT5Z$lV%p?37trwK@FQrbs&-m<2oE3(AW=-rgsD8TXHx z7?KAB#rh#H6zQsURu|V+)pvN>UX6s-HLQ)+*`3c+wbj>$i+z#DYwVkg!gkeP>8Vm% zi`8glu&%^k5D1iPbX13272%>aTRWfXa(b&>r7w1QD@y9uN7rtpOZS9r?+oPZ&6XAl zJc7%pVMMN>$x)f$@#Atx;i;4IST?&8@~4M*=9)aHrIv<;#@@OuCpdLhs;P^c?wLV7 zzb5e3N^V?@FB$1ZDW>sXF3i!=aHT-%nnV-Z+$eQ4_bZrrg%3OR^mZ+d@N5X*5OlkA zp~UVwJhzlhuV6&O<=uFF3BCL&W^n=GP6Ivv?n3UFgV@WNpJ7yxZ4kA*mM3w=B8B8lVh&wAEj0fET9sA~ diff --git a/apps/mobile/src/types/declarations.d.ts b/apps/mobile/src/types/declarations.d.ts index 9784ae9de..793f67889 100644 --- a/apps/mobile/src/types/declarations.d.ts +++ b/apps/mobile/src/types/declarations.d.ts @@ -8,6 +8,7 @@ declare module '*.svg' { // This declaration is used by useNavigation, Link, ref etc. declare global { namespace ReactNavigation { + // eslint-disable-next-line @typescript-eslint/no-empty-interface interface RootParamList extends RootStackParamList {} } } diff --git a/packages/config/eslint-react-native.js b/packages/config/eslint-react-native.js deleted file mode 100644 index f275951ff..000000000 --- a/packages/config/eslint-react-native.js +++ /dev/null @@ -1,42 +0,0 @@ -module.exports = { - env: { - 'react-native/react-native': true - }, - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaFeatures: { - jsx: true - }, - ecmaVersion: 12, - sourceType: 'module' - }, - extends: [ - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:@typescript-eslint/recommended' - ], - plugins: ['react', 'react-native'], - rules: { - 'react/display-name': 'off', - 'react/prop-types': 'off', - 'react/no-unescaped-entities': 'off', - 'react/react-in-jsx-scope': 'off', - 'react-hooks/rules-of-hooks': 'error', - 'react-hooks/exhaustive-deps': 'warn', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-non-null-assertion': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - 'no-control-regex': 'off', - 'no-mixed-spaces-and-tabs': ['warn', 'smart-tabs'] - }, - ignorePatterns: ['**/*.js', '**/*.json', 'node_modules'], - settings: { - react: { - version: 'detect' - } - } -}; diff --git a/packages/config/package.json b/packages/config/package.json index 79110a252..6d9f656ba 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -4,8 +4,7 @@ "main": "index.js", "license": "GPL-3.0-only", "files": [ - "eslint-react.js", - "eslint-react-native.js" + "eslint-react.js" ], "devDependencies": { "eslint": "^8.21.0", @@ -13,7 +12,6 @@ "@typescript-eslint/parser": "^5.30.7", "eslint-config-prettier": "^8.5.0", "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-native": "^4.0.0" + "eslint-plugin-react-hooks": "^4.6.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3abc04873818f2420196cc625941f8ac3d32f66..27c6b5734acdb00edb6c0770155b2ed0825bd0ed 100644 GIT binary patch delta 121 zcmbPuP~+BajSV~HCNDFToPHsTS!gq_yclD1q(Xb70wWMJZI4u7o*Fs1hEs6*-}9Wt zlQ)#Iwrf{0Z`ZD3nRT_@G>8?5*?^cGh&i^K260-~!xRTjj+Erve&r%32ix?NTb#n% QA71BdX4+nKi&NeW0It?7-v9sr delta 467 zcmcb$TVvuujSV~HCQp143ENL$iHzQ!0vrBh4KR!_!j=6WyJ) ziz4-nEQ&JBvz^@ioPvt8O)T=u3bO-qQ_@YdOuV&S65VoB(_Q^ss(g!5e6sUP)4bh- z{Ib0x%#zZB%L7B49V;d`?o^z9&zF^hJxo+xgFPim^@K abBU90yW>^PDyHdedpU)-AGppb Date: Thu, 11 Aug 2022 12:35:27 +0300 Subject: [PATCH 04/15] Fix types - Interface --- packages/interface/package.json | 3 ++- packages/interface/src/App.tsx | 6 +++--- packages/interface/src/AppRouter.tsx | 2 +- packages/interface/src/components/file/FileList.tsx | 8 +++++--- packages/interface/src/components/file/FileThumb.tsx | 2 +- packages/interface/src/components/file/Inspector.tsx | 1 + packages/interface/src/components/file/Sidebar.tsx | 3 ++- .../src/components/jobs/RunningJobsWidget.tsx | 3 ++- packages/interface/src/components/layout/TopBar.tsx | 6 +++--- .../interface/src/components/primitive/Codeblock.tsx | 2 +- .../interface/src/components/primitive/Listbox.tsx | 2 +- packages/interface/src/screens/Content.tsx | 2 +- packages/interface/src/screens/Debug.tsx | 2 +- packages/interface/src/screens/Explorer.tsx | 10 +++++----- packages/interface/src/screens/Overview.tsx | 5 +++-- packages/interface/src/screens/Photos.tsx | 2 +- packages/interface/src/screens/Redirect.tsx | 1 + packages/interface/src/screens/Tag.tsx | 4 ++-- .../settings/library/LibraryGeneralSettings.tsx | 3 +++ .../src/screens/settings/library/TagsSettings.tsx | 4 +++- .../src/screens/settings/node/LibrariesSettings.tsx | 2 +- 21 files changed, 43 insertions(+), 30 deletions(-) diff --git a/packages/interface/package.json b/packages/interface/package.json index 0d5a34959..e3222e971 100644 --- a/packages/interface/package.json +++ b/packages/interface/package.json @@ -11,7 +11,8 @@ "./components/*": "./src/components/*" }, "scripts": { - "icons": "./scripts/generateSvgImports.mjs" + "icons": "./scripts/generateSvgImports.mjs", + "lint": "eslint src/**/*.{ts,tsx} && tsc --noEmit" }, "dependencies": { "@apollo/client": "^3.6.9", diff --git a/packages/interface/src/App.tsx b/packages/interface/src/App.tsx index 02484c6df..12d27ea0d 100644 --- a/packages/interface/src/App.tsx +++ b/packages/interface/src/App.tsx @@ -21,10 +21,10 @@ function RouterContainer(props: { props: AppProps }) { const { data: client } = useBridgeQuery(['getNode']); useEffect(() => { - setAppProps({ + setAppProps((appProps) => ({ ...appProps, data_path: client?.data_path - }); + })); }, [client?.data_path]); return ( @@ -40,7 +40,7 @@ export default function SpacedriveInterface(props: AppProps) { useInvalidateQuery(); return ( - {}}> + {import.meta.env.MODE === 'development' && } diff --git a/packages/interface/src/AppRouter.tsx b/packages/interface/src/AppRouter.tsx index c74fc65cb..cd1ed725b 100644 --- a/packages/interface/src/AppRouter.tsx +++ b/packages/interface/src/AppRouter.tsx @@ -44,7 +44,7 @@ export function AppRouter() { if (libraryState.currentLibraryUuid === null && libraries && libraries.length > 0) { libraryState.switchLibrary(libraries[0].uuid); } - }, [libraryState.currentLibraryUuid, libraries]); + }, [libraryState, libraryState.currentLibraryUuid, libraries]); return ( <> diff --git a/packages/interface/src/components/file/FileList.tsx b/packages/interface/src/components/file/FileList.tsx index 4f88db3f5..a8f89d0db 100644 --- a/packages/interface/src/components/file/FileList.tsx +++ b/packages/interface/src/components/file/FileList.tsx @@ -73,10 +73,11 @@ export const FileList: React.FC<{ location_id: number; path: string; limit: numb index: goingUp ? selectedRowIndex - 1 : selectedRowIndex }); } - }, [selectedRowIndex]); + }, [goingUp, selectedRowIndex]); useEffect(() => { setLocationId(props.location_id); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [props.location_id]); useKey('ArrowUp', (e) => { @@ -168,7 +169,7 @@ interface RenderItemProps { const RenderGridItem: React.FC = ({ item, index, dirId }) => { const { selectedRowIndex, setSelectedRowIndex } = useExplorerStore(); - let [_, setSearchParams] = useSearchParams(); + const [_, setSearchParams] = useSearchParams(); return ( = ({ item, index, dirId }) => { const RenderRow: React.FC = ({ item, index, dirId }) => { const { selectedRowIndex, setSelectedRowIndex } = useExplorerStore(); const isActive = selectedRowIndex === index; - let [_, setSearchParams] = useSearchParams(); + const [_, setSearchParams] = useSearchParams(); return useMemo( () => ( @@ -217,6 +218,7 @@ const RenderRow: React.FC = ({ item, index, dirId }) => { ))}
), + // eslint-disable-next-line react-hooks/exhaustive-deps [item.id, isActive] ); }; diff --git a/packages/interface/src/components/file/FileThumb.tsx b/packages/interface/src/components/file/FileThumb.tsx index 162712245..e82f46832 100644 --- a/packages/interface/src/components/file/FileThumb.tsx +++ b/packages/interface/src/components/file/FileThumb.tsx @@ -32,7 +32,7 @@ export default function FileThumb(props: { } if (icons[props.file.extension as keyof typeof icons]) { - let Icon = icons[props.file.extension as keyof typeof icons]; + const Icon = icons[props.file.extension as keyof typeof icons]; return ; } return
; diff --git a/packages/interface/src/components/file/Inspector.tsx b/packages/interface/src/components/file/Inspector.tsx index 8d08d26ea..427e87260 100644 --- a/packages/interface/src/components/file/Inspector.tsx +++ b/packages/interface/src/components/file/Inspector.tsx @@ -62,6 +62,7 @@ export const Inspector = (props: { return () => { clearTimeout(handler); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [note]); const toggleFavorite = () => { diff --git a/packages/interface/src/components/file/Sidebar.tsx b/packages/interface/src/components/file/Sidebar.tsx index 5012f89ba..a9e074ead 100644 --- a/packages/interface/src/components/file/Sidebar.tsx +++ b/packages/interface/src/components/file/Sidebar.tsx @@ -18,7 +18,7 @@ import RunningJobsWidget from '../jobs/RunningJobsWidget'; import { MacTrafficLights } from '../os/TrafficLights'; import { DefaultProps } from '../primitive/types'; -interface SidebarProps extends DefaultProps {} +type SidebarProps = DefaultProps; export const SidebarLink = (props: NavLinkProps & { children: React.ReactNode }) => ( @@ -88,6 +88,7 @@ export const Sidebar: React.FC = (props) => { useEffect(() => { if (libraries && !currentLibraryUuid) initLibraries(libraries); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [libraries, currentLibraryUuid]); const { mutate: createLocation } = useLibraryMutation('locations.create'); diff --git a/packages/interface/src/components/jobs/RunningJobsWidget.tsx b/packages/interface/src/components/jobs/RunningJobsWidget.tsx index d042f4a15..5c23d5821 100644 --- a/packages/interface/src/components/jobs/RunningJobsWidget.tsx +++ b/packages/interface/src/components/jobs/RunningJobsWidget.tsx @@ -55,8 +55,9 @@ export default function RunningJobsWidget() { return (
- {jobs?.map((job) => ( + {jobs?.map((job, index) => ( , HTMLButtonElement> { icon: React.ComponentType; @@ -18,7 +18,7 @@ export interface TopBarButtonProps left?: boolean; right?: boolean; } -interface SearchBarProps extends DefaultProps {} +type SearchBarProps = DefaultProps; const TopBarButton: React.FC = ({ icon: Icon, @@ -90,7 +90,7 @@ export const TopBar: React.FC = (props) => { } }); - let navigate = useNavigate(); + const navigate = useNavigate(); return ( <>
diff --git a/packages/interface/src/screens/Content.tsx b/packages/interface/src/screens/Content.tsx index 3166734ff..cb94ffc1e 100644 --- a/packages/interface/src/screens/Content.tsx +++ b/packages/interface/src/screens/Content.tsx @@ -1,6 +1,6 @@ import React from 'react'; -export const ContentScreen: React.FC<{}> = (props) => { +export const ContentScreen: React.FC = (props) => { // const [address, setAddress] = React.useState(''); return (
diff --git a/packages/interface/src/screens/Debug.tsx b/packages/interface/src/screens/Debug.tsx index 804b2066a..97326b21a 100644 --- a/packages/interface/src/screens/Debug.tsx +++ b/packages/interface/src/screens/Debug.tsx @@ -4,7 +4,7 @@ import React, { useContext } from 'react'; import CodeBlock from '../components/primitive/Codeblock'; -export const DebugScreen: React.FC<{}> = (props) => { +export const DebugScreen: React.FC = (props) => { const appPropsContext = useContext(AppPropsContext); const { data: nodeState } = useBridgeQuery(['getNode']); const { data: libraryState } = useBridgeQuery(['library.get']); diff --git a/packages/interface/src/screens/Explorer.tsx b/packages/interface/src/screens/Explorer.tsx index d8ca6e066..8c408fb4f 100644 --- a/packages/interface/src/screens/Explorer.tsx +++ b/packages/interface/src/screens/Explorer.tsx @@ -6,12 +6,12 @@ import { FileList } from '../components/file/FileList'; import { Inspector } from '../components/file/Inspector'; import { TopBar } from '../components/layout/TopBar'; -export const ExplorerScreen: React.FC<{}> = () => { - let [searchParams] = useSearchParams(); - let path = searchParams.get('path') || ''; +export const ExplorerScreen: React.FC = () => { + const [searchParams] = useSearchParams(); + const path = searchParams.get('path') || ''; - let { id } = useParams(); - let location_id = Number(id); + const { id } = useParams(); + const location_id = Number(id); const [limit, setLimit] = React.useState(100); diff --git a/packages/interface/src/screens/Overview.tsx b/packages/interface/src/screens/Overview.tsx index 60ca38d26..2011fbff5 100644 --- a/packages/interface/src/screens/Overview.tsx +++ b/packages/interface/src/screens/Overview.tsx @@ -70,7 +70,7 @@ const StatItem: React.FC = (props) => { setCount((count) => count + 1); }, quadratic(appProps?.demoMode ? 1000 : 500, +size.value, count)); } - }, [count, size]); + }, [appProps?.demoMode, count, size]); return (
{ setOverviewStats(newStatistics); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [appProps, libraryStatistics]); // useEffect(() => { @@ -187,7 +188,7 @@ export const OverviewScreen = () => { {}} + // ctaAction={() => {}} ctaLabel="Connect" trigger={ } From 6e275302568abca3acaff681ba9c906a524332b9 Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Fri, 12 Aug 2022 14:48:49 +0800 Subject: [PATCH 05/15] fix Windows support --- apps/desktop/src/index.tsx | 2 +- packages/client/src/context/AppPropsContext.tsx | 2 +- packages/interface/src/App.tsx | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/desktop/src/index.tsx b/apps/desktop/src/index.tsx index 002eb506e..d1f54a364 100644 --- a/apps/desktop/src/index.tsx +++ b/apps/desktop/src/index.tsx @@ -29,7 +29,7 @@ function App() { } } - const [platform, setPlatform] = useState('macOS'); + const [platform, setPlatform] = useState('unknown'); const [focused, setFocused] = useState(true); useEffect(() => { diff --git a/packages/client/src/context/AppPropsContext.tsx b/packages/client/src/context/AppPropsContext.tsx index 59e6cf4b7..9b9f4d4a2 100644 --- a/packages/client/src/context/AppPropsContext.tsx +++ b/packages/client/src/context/AppPropsContext.tsx @@ -2,7 +2,7 @@ import { createContext } from 'react'; export const AppPropsContext = createContext(null); -export type Platform = 'browser' | 'macOS' | 'windows' | 'linux'; +export type Platform = 'browser' | 'macOS' | 'windows' | 'linux' | 'unknown'; export type CdnUrl = 'internal' | string; export interface AppProps { diff --git a/packages/interface/src/App.tsx b/packages/interface/src/App.tsx index 02484c6df..6954d9969 100644 --- a/packages/interface/src/App.tsx +++ b/packages/interface/src/App.tsx @@ -6,7 +6,7 @@ import { useBridgeQuery, useInvalidateQuery } from '@sd/client'; -import { QueryClientProvider } from '@tanstack/react-query'; +import { QueryClientProvider, defaultContext } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import React, { useEffect, useState } from 'react'; import { ErrorBoundary } from 'react-error-boundary'; @@ -41,8 +41,11 @@ export default function SpacedriveInterface(props: AppProps) { return ( {}}> - - {import.meta.env.MODE === 'development' && } + + {/* The `context={defaultContext}` part is required for this to work on Windows. Why, idk, don't question it */} + {import.meta.env.MODE === 'development' && ( + + )} From 0e74c0ee6f704778825a492045169b221afe6070 Mon Sep 17 00:00:00 2001 From: Utku <74243531+utkubakir@users.noreply.github.com> Date: Thu, 18 Aug 2022 14:04:38 +0300 Subject: [PATCH 06/15] Update index.page.tsx --- apps/landing/src/pages/index.page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/landing/src/pages/index.page.tsx b/apps/landing/src/pages/index.page.tsx index 6c7077ec0..ad7755e7c 100644 --- a/apps/landing/src/pages/index.page.tsx +++ b/apps/landing/src/pages/index.page.tsx @@ -78,7 +78,7 @@ function Page() { alert('An error occurred while unsubscribing from waitlist'); } })(); - }, [urlParsed.search]); + }, []); return ( <> From deb82fb13c0e314b435b9c58b7a886945560757f Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 19 Aug 2022 07:24:15 +0800 Subject: [PATCH 07/15] update pnpm-lock --- pnpm-lock.yaml | Bin 668113 -> 667748 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a06b10e41f893f0bd29b4f66cd1fe80be4f9ef29..62449eeb5a58de825fd11c5355b6b7140d30d273 100644 GIT binary patch delta 893 zcmYjOX-HI280F4=+kJ0z#+mVr=#*pSxHK-KIhu-&Wt*fn5ELOf2_;g2KU@k_1c{15 z!&}`5+BKq$RPbvf|5TJwHbtvNg0?^_7_{3mSHgeiaPD```Mw(*O&l9ZJa<1F<2wWs!tNngVoTwvB35BkeJDA`grEfpnac>Y)QxdtaTo)IbMqm2BApMPYa6 z;BflhYoqTnOtdvhrzawfeP1nQh|0Q^rt2QM$fnc&Oeby8<7rTL(0Vn7p7g48r#Fmt z*z#ynWHo#2B05biu+p&@oiaU-e#|tt8SP-SBXuU5$Wc@ln~M%|bUhax2_dM>LuUo% z^PxEA@Sz#7#)ooeu;-7E2HjQYP!)Tt8#E}phK9|2)cgjikpB?L#asQ+2JlDY7J(}X zPHbYYr{i5yXh$sW_)jOp%~@E62Toifvop=I%0fIX5uZ1(rS(W-?G;#JUy||FDe|q^ z_&5%A;qvO#zaHDta28@a2{y8h3M|6ybX*-i+45gTaUrh3?9x2E2UgF=O%i*v1b0u- z50v0uG9{#PIj)$+7rwR$gZm#;VM{j-NX)T^sPN$wE;fMgEWQ~NvH{B=PA`CEiqIgk z^`fA`-7sOX9bECkdIulbUnJD|!9j)cSUytME8HmK+5#jVa`Qe5Q$!2=P7%A7Ku@D+ z+5mS(#gS=n8A;xi{i~#v608eIG02q^DThLYJY)8Atx3@Pn?wj+vYFyJJ2+&pe?DS6Hh2~8`=cs?}mCQlIW zR=Jm4$m2^k1c@0u_sA7F#OYxr8Z1vqKVqjJi7Et#$+yrSt8o7X0SWfKB0rPiXoPyv Q%A2l@S5HH%OYPPE0FqWcEC2ui delta 1111 zcmYk4eN0tl9LM*Z=bY!9=UiS6_pK|)%jCxEjkg5kML=q7a7{3jY;(hr%~(mkA-3ki zWU)~J@)W;{Q7j2_yqe1&u6AQho2;BTk(^Oo)5da(mTlM{C7pXuTmAR_?f3k?pYQW~ zo;$&`tGCmpu0@H#f=m%ijuN)$W>~XZiV}0)D6!&oLF|BJ6K_TL!BmQ-iJrnZk(0vC z)*9O-82XaCMIhNJDmF$6SCRefK1V4Le;SeEFQ+d0*T#zC0*`ptRU(G%jbh%lM-+NI za&Fe6SrD^Za*OBV^2E|cr_y}jaB-3d7;e$xjt~K7p5U%Z;g8Wpulr%K*%fzu#Em0v zlAa8!exk$8A~I;HSBuFIOl~7K%qk&cGW=amlHf);NyhjJQoK$K_UYKvL_TPOy+5iP zx-St89T&;G0d=)R$9va_@i=s(5l5#QE1?=oUy`9`8@0h333L!@>rL4DL{o*aiy_rm zLJjOnqBSa1^2NU}l$JmePE(S)cnX7Kh9O@dSWfHV6NDPA6Y6N~W zPA|rVmdg8QsZ8?W_e?n*XJ@HY7Q)-1j>|G$Q{@)LGW18v)eiyNA=_bJs;odDS+?QF zUiqoDFm+zmQQssV+zO|jQ|)-HPxdEfPzR*=Toc1YpeC82l zxH^nNTbp8g0Y(NC2gco2zKe(1`zGbes-ln$aO;ejE1fX90~$J*19P8d^$gY=mh6za zi$%g$Pm&b;tdV_Q*+0shc=SVdw8&!1i|j#8n1~UPYHK>or%*F|p{ih4fqFF>W>yrA z&sM2zd0{^c9#MNduu#qI5bRbpeEEd>ZHnn?2jjfTv2j}csS{?}%#}v_GzPDiYc||j zp*<*rxh;%CZ@Z>r%PZPM4Ak^$PF#0FTaK}uohP-gGoW2EdB0rNy0=;@J(kF?_+X}r z>&k)k1=%^U->+m~*JeJ>;fqf=$4w3VkJA4=+6KX|6ZmbI>*#r#PnU%LE{Ci+Zs6TH z9#F&ghBt5V2n^id7YIC&Yvu~q@7(0SQn-9j`nMkVfsZmMyvrR@^C2*LnGctjxGq8d kIa5w9aghcMCDe{phJMZgMuIuWy!seSCFl-BuRd=32NWfR4*&oF From 2c375ce27a18ec848301cb60301a32b841aa3ce2 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 19 Aug 2022 07:41:08 +0800 Subject: [PATCH 08/15] use latest prisma-client-rust --- Cargo.lock | Bin 165043 -> 170602 bytes core/Cargo.toml | 16 +++++++++++++--- core/prisma/Cargo.toml | 5 ++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c143a58ec412a659813abb47ca2d51b9943e242e..d4285c8fed94c934c71b81c163f37088f0f960a1 100644 GIT binary patch delta 6406 zcmcIoYmA)LdDa=Q*Sm`^>&q-QUNdWBCpF&9xnF3^LeiwfHej37ZDKdhxn>7;XVx=g za2zfsG${y52%qB9A1#TcQWB+#NH^)UDTzR8m8umbpeRWrVxYOSrBQ%NNGYMD?>D

69GAJ)iQp8cE84Faf5V?vfKfMc8ix;0T;3d{%Z${ORo9e>G7ubymWfJeaF8S+jjcm&v$)&{@I57>4(q_ zvwhbe8{89owA2emy;Dlr0DpTq=iJWbU#^C?@Y#4@xp=C z#U1s5V%PrN#l!pm>HIHPJaK^cPqk;pIv<{i?b(+P+_h){78%`DExzkk=Holi@a&NP z;R3CZAO8*-EGFy!a{iA{Ud-0wu^X4=qf_Y8i`#xOPTP&!25KAUhGXthzi z;{HGTjoD8=^>5>APXlM;z|FDMt~VRC?X`_~+~gsK_D)bHH6xH9hC}iP!kBl)G76az zqZBSevM^?~hs-B|avdqf)N-A4lG+yb;c9X4b4&BLj-hqM+p3H5&Yz8%h$@P>!fi)QEB?`HKMx z&P%`Fmp34^_RH@>Vo`VRVzlD|q>E23-+N^gG&;#Nb}~>)aCD3_ZllLq3#K?XI0>hz zFGDY&_Gw6Z&AibLc2#`i1H;9WoBR8wW2aU3?R@F-%4q&rKN>E+@WS2+!prgj6A{Xs z)WL9qHEhgc6F5YPSOVY1V1yGqhyb^3EEik}sIEAb1+AF*%98%t#xv)?Wd6fgJTlX4 zbz*C5rqzUJlkspnANnD36Gp&QI41!smOH~RPdp@LoY6jb6QFo00?RTig*C}rLOjM^ z1Vc1&vN-WbwLS?IqtydQy%FLOfY98BnMUmNM)SJ>BoQ-?&wMm?xKp1hpR@VrGq!b8 zz44)gQ_W8Kn2gij>xT~8M#pASsjSMim1r>6?gRk5(H%Y&&f@t!)m*z9u*OYfSQ7@& zPD&^j1>7)+0yAwaaDZ3AIZ8b@2|}$Rqy+)0Z~|)!$vB6Ck!9+lQ?V# z0R}u30j3cvOt58II%1S3%vxfMa{)t~U{#njS;%LjXmHx#xvAgz=+L0;oaV~n3%|Xo zsO?;INAH}Iwms=u&08909{#MTo)JquPI^CT9G*VtXAaNhZL<|(D~7Q&)wFZb|Ft3Q zP0+HTzW&HTz-8=xZr>C;P}kaHA{3#%vb@>1PsK4}R-LXOR z^$XrAHU)tbBv+&&X~=5qAfp*`-f``{6sbgw#K*_b#rYFkE6ejcm!sXw&e#;($k`ZO zRowIXW!=Y@qj&KRk=xmH&G+dSC(OCx2DTudPAN&2#0j z#QP~cpP6{&b2?7CzKUZ10&HV+Z1eHgQD4c_-2*jr`vps!n~Dc-jy@l%AbS;vIRPvk zl1WUa2D}n9`M=hqk?z~xjef6EJp1zA3D{}Wk#GY!YCQ&K zm(qhqVk$Atg-*n4FL3!ynZ=Yx3vmQ_0A_mn`*v$>kjns(f79E&D*8Lgc#=|s6P+XFQfp`CXAyAEK%|T#w2;Q=^S6| zIj21RGqfsyb{)E?cIv5T^f9zLe{%{wvtTi>9<*zlf&8(gS)Yslp=_~GjeOZ3sIJz`n zH;lG)KYAw$mA+8#3CMioXF(`~gEgKg@CyO19IPzpZm92?VUWeRM5zlr8BpPv6T?}g zzz-UHuq7U^%|je3unizXfE{@^b3cYOn3Q0L8PK3FRoP6tL|HppZjpo50Wx z=G_mVi@T59i+)t8Y}}UrvA?pp`?vR_*~RA{%VizAy!+y((A(D)CnkUA{4a1yF%B0; z_b<=KPeQ4B^+y1?(MQn-7G$-}`PD}e9w_@Sb4{0g;>Q5&=XK?`7G%Ai9v;rCk3qWZ z`!ZTnCeGmExvo#X`fH$iF8d<-n_B+r5^$kJLK&u1xDb^Ei$ocCb_J~*r9pHV!G#E* z9TRm%K@U^L=*!Ls7$z`Mfs`GOzWH`c@xk3&hJL}fRm~d*D{J!4KLs@Q z*lM)mP5JX?t1@D+p} zWEK(JC}KJDa913pK6HpcTt?_!nZTgIlVq|W%_)Uu4K$XR?$wPgb?B~in$4*>7v5;j zx!A*vx^ISf(A!S@P_tFfdlFjTz3(}6bSpB&p>OS(V5QnkPB{W?Z>ogjJ_#wEg@TEp zr@(^7IKqDi2%=>h3)C&Nxg9q?#a<-=%3j=^9jJWi5~PZuNA^r42OTFk1(X~>6ci+k zg#lA51p^nMG|XZ^3r7t-c?IqzfwvJ}E1DAEf)wPbY96_)vaDo^m0c+L-(R-u|D5B{ zrI2cm-&WZ@!3;o`J818bV4&TNW%N-(+bdWL8+ID{?*WC}LwsX%t2Ri#P z`k^bqBART2tweW}qX|QeLE}H$NM|mY9|@57hkroP=*)C%QxGw3FmS{~mw8IF>HKS1 za{qaA-;;aK?|Gi{`#sO^{O!5g+5NT8KGrZhw)|Y(Y`OiRj;azWhh^&CI07px{WCAy zH9u&vuk_a1-`(}n|E;{R>GFG4t~TEI0^|11+EV+l9v(GjTu->OdtrsW_UYT*zrP*y z_b?VEk|G&Lir_GfkVxY&4wF=3l14(Ml&3h-QH(+=36Dt_DV|azun{C?uHoLGU^m`X zZD(Fw?5-byWd)DQ%47jlP9?f)a%6C1(C(UUz7hDE&-~#%Vb^aVA}I2Ii6#_F_r}doa6f+vmM$?nx(1Dp z1D7$f``T8x;;T@cN1rWizPPwAPJI$W#*|5^RfK3PBc5_)s3KZ(9&4(6u6XVHe9>ZA zu)_meYepuA&5+zNPV65C?!M_EJw9POx6kE*=hBlA8)ICcz;CgX=T z2CMDUrzatFXM2Os_V6@`gyD%NVj3$IX_6$!u$07-rZ`QAVj@x0uQ0`_5>(Nc=_E`E zjxdSsu@?&V{BV5*DTnr-XG-?+mg4Mfa~I1$`8d1^*|h-T%EkZH$ArDIUiMHFBBG-- z2_?m;WJn>EFd?vDltkPU-h?Q`!jqK8NJX3_A`x+t7!(VQ?ADJqWgUy4x57^w=UrzEvpYJB$g_ zL@SPoiMZQZ4Ncjli`?^fLeZUWhU)Bi5$>zVg-C8sGn~w4=P#UsCik-z_(eY3ztRf3?UjM5 z?D00ZrzRhaXMf{~F>`U*4T)tB-vZMW+3!2y{-SHU1Agm%<$|TI{*$o5Z5i?tM`L9~ zg1w-Gq$)}^6QQCZi3Bw=5-3R((pYQBLgN{LLlGI4P$7^A~J(z?t z!ZkJ;bB;Z4)5LcLVb69J?dU*(Vf2nA9AlxLA9IsGHlNU z(hq@>Yi{#RLQO-L+kF)lyYF0u)$V)K@L?BCLWjFN<AgU!c1_B` zkqP(m-Uawowr}uew`?D@+S6bETz2>?@cqg@i5MY<&=6xvMaY~D?J7W+`slil1uTO??27ixdTwh zNt5s7b<3erP-s+RqvPX=mcw1UCiSHDGu}^Mcj5^cbC1kGxBL4HwAaitT&s!EG51Ux zthaBzy~=&@AZ*F5AA}zT**Bhqlhs-2FkA>~-t`FX$8Ev7tn<4tTa`!Eve+#!!TOYgXQ3aL+;$ za;!LK{x%T$8-jNnj5BU!Q^D3Bt#zNj;ODsb3;Z;v>GIBiEYG)%L-~}(v-Ey<>s4^` zn&7VS8f?pk{sB|By19?}k;TK%*CFvmB2;^$=PxNKPGaSK59ccOW(;w~A|^x31@fMS zG9CF+5uzngXyIn!T}xH=*4??x=d~2yY+8q=#zCJi!mp$JbtjWm=&9wx~ Wjcg7Y-2N@Wwp`95yQ42yx9LAu50=6J diff --git a/core/Cargo.toml b/core/Cargo.toml index 3eddc564e..2399c855c 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -8,7 +8,8 @@ repository = "https://github.com/spacedriveapp/spacedrive" edition = "2021" [features] -p2p = [] # This feature controlls whether the Spacedrive Core contains the Peer to Peer syncing engine (It isn't required for the hosted core so we can disable it). +p2p = [ +] # This feature controlls whether the Spacedrive Core contains the Peer to Peer syncing engine (It isn't required for the hosted core so we can disable it). [dependencies] hostname = "0.3.1" @@ -26,8 +27,17 @@ rmp = "^0.8.11" rmp-serde = "^1.1.0" # Project dependencies -prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust.git", branch = "0.6.0", features = ["rspc"] } -rspc = { version = "0.0.4", features = ["axum", "tauri", "uuid", "chrono", "tracing"] } +prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust.git", rev = "6a0119bce951c8d956542a59b2f783fc5a591fc7", features = [ + "rspc", + "sqlite-create-many", +] } +rspc = { version = "0.0.4", features = [ + "axum", + "tauri", + "uuid", + "chrono", + "tracing", +] } walkdir = "^2.3.2" uuid = { version = "1.1.2", features = ["v4", "serde"] } sysinfo = "0.23.9" diff --git a/core/prisma/Cargo.toml b/core/prisma/Cargo.toml index d9b60cd5a..b24c05939 100644 --- a/core/prisma/Cargo.toml +++ b/core/prisma/Cargo.toml @@ -4,4 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust.git", branch = "0.6.0", features = ["rspc"] } +prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust.git", rev = "6a0119bce951c8d956542a59b2f783fc5a591fc7", features = [ + "rspc", + "sqlite-create-many", +] } From d919dff99ec1a0707cabf274a5bc7dad95dd380b Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 19 Aug 2022 08:58:27 +0800 Subject: [PATCH 09/15] update to latest prisma-client-rust --- Cargo.lock | Bin 165043 -> 170602 bytes Cargo.toml | 11 ++++++----- core/Cargo.toml | 18 ++++++++++++++---- core/prisma/Cargo.toml | 5 ++++- core/src/api/files.rs | 12 ++++++------ core/src/api/locations.rs | 12 ++++++------ core/src/api/tags.rs | 14 +++++--------- core/src/file/cas/identifier.rs | 26 ++++++++++++++------------ core/src/file/indexer.rs | 3 ++- core/src/job/job_manager.rs | 26 +++++++++++++++----------- core/src/job/mod.rs | 4 ++-- core/src/library/library_manager.rs | 8 ++------ core/src/sys/locations.rs | 4 ++-- core/src/sys/volumes.rs | 7 ++----- core/src/util/db.rs | 13 ++++++++----- 15 files changed, 88 insertions(+), 75 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c143a58ec412a659813abb47ca2d51b9943e242e..d4285c8fed94c934c71b81c163f37088f0f960a1 100644 GIT binary patch delta 6406 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 Wjcg7Y-2N@Wwp`95yQ42yx9LAu50=6J diff --git a/Cargo.toml b/Cargo.toml index 5b06d38b2..bb526593c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,9 @@ [workspace] members = [ - "apps/desktop/src-tauri", - "core", - "core/prisma", - "core/derive", - "apps/server" + "apps/desktop/src-tauri", + "core", + "core/prisma", + "core/derive", + "apps/server", ] +resolver = "2" diff --git a/core/Cargo.toml b/core/Cargo.toml index 3eddc564e..f199eefdd 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -8,7 +8,8 @@ repository = "https://github.com/spacedriveapp/spacedrive" edition = "2021" [features] -p2p = [] # This feature controlls whether the Spacedrive Core contains the Peer to Peer syncing engine (It isn't required for the hosted core so we can disable it). +p2p = [ +] # This feature controlls whether the Spacedrive Core contains the Peer to Peer syncing engine (It isn't required for the hosted core so we can disable it). [dependencies] hostname = "0.3.1" @@ -26,8 +27,17 @@ rmp = "^0.8.11" rmp-serde = "^1.1.0" # Project dependencies -prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust.git", branch = "0.6.0", features = ["rspc"] } -rspc = { version = "0.0.4", features = ["axum", "tauri", "uuid", "chrono", "tracing"] } +prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust.git", rev = "6a0119bce951c8d956542a59b2f783fc5a591fc7", features = [ + "rspc", + "sqlite-create-many", +] } +rspc = { version = "0.0.4", features = [ + "axum", + "tauri", + "uuid", + "chrono", + "tracing", +] } walkdir = "^2.3.2" uuid = { version = "1.1.2", features = ["v4", "serde"] } sysinfo = "0.23.9" @@ -42,7 +52,7 @@ webp = "0.2.2" ffmpeg-next = "5.0.3" fs_extra = "1.2.0" tracing = "0.1.35" -tracing-subscriber = "0.3.14" +tracing-subscriber = { version = "0.3.14", features = ["env-filter"] } async-stream = "0.3.3" once_cell = "1.13.0" ctor = "0.1.22" diff --git a/core/prisma/Cargo.toml b/core/prisma/Cargo.toml index d9b60cd5a..b24c05939 100644 --- a/core/prisma/Cargo.toml +++ b/core/prisma/Cargo.toml @@ -4,4 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust.git", branch = "0.6.0", features = ["rspc"] } +prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust.git", rev = "6a0119bce951c8d956542a59b2f783fc5a591fc7", features = [ + "rspc", + "sqlite-create-many", +] } diff --git a/core/src/api/files.rs b/core/src/api/files.rs index bb33d9acd..e8329c6ac 100644 --- a/core/src/api/files.rs +++ b/core/src/api/files.rs @@ -26,8 +26,7 @@ pub(crate) fn mount() -> RouterBuilder { library .db .file() - .find_unique(file::id::equals(args.id)) - .update(vec![file::note::set(args.note)]) + .update(file::id::equals(args.id), vec![file::note::set(args.note)]) .exec() .await?; @@ -54,8 +53,10 @@ pub(crate) fn mount() -> RouterBuilder { library .db .file() - .find_unique(file::id::equals(args.id)) - .update(vec![file::favorite::set(args.favorite)]) + .update( + file::id::equals(args.id), + vec![file::favorite::set(args.favorite)], + ) .exec() .await?; @@ -82,8 +83,7 @@ pub(crate) fn mount() -> RouterBuilder { library .db .file() - .find_unique(file::id::equals(id)) - .delete() + .delete(file::id::equals(id)) .exec() .await?; diff --git a/core/src/api/locations.rs b/core/src/api/locations.rs index 666afcc48..d690597f5 100644 --- a/core/src/api/locations.rs +++ b/core/src/api/locations.rs @@ -133,8 +133,10 @@ pub(crate) fn mount() -> RouterBuilder { library .db .location() - .find_unique(location::id::equals(args.id)) - .update(vec![location::name::set(args.name)]) + .update( + location::id::equals(args.id), + vec![location::name::set(args.name)], + ) .exec() .await?; @@ -147,16 +149,14 @@ pub(crate) fn mount() -> RouterBuilder { library .db .file_path() - .find_many(vec![file_path::location_id::equals(Some(location_id))]) - .delete() + .delete_many(vec![file_path::location_id::equals(Some(location_id))]) .exec() .await?; library .db .location() - .find_unique(location::id::equals(location_id)) - .delete() + .delete(location::id::equals(location_id)) .exec() .await?; diff --git a/core/src/api/tags.rs b/core/src/api/tags.rs index c8a75bc9d..b7a7996d5 100644 --- a/core/src/api/tags.rs +++ b/core/src/api/tags.rs @@ -97,8 +97,10 @@ pub(crate) fn mount() -> RouterBuilder { library .db .tag() - .find_unique(tag::id::equals(args.id)) - .update(vec![tag::name::set(args.name), tag::color::set(args.color)]) + .update( + tag::id::equals(args.id), + vec![tag::name::set(args.name), tag::color::set(args.color)], + ) .exec() .await?; @@ -117,13 +119,7 @@ pub(crate) fn mount() -> RouterBuilder { .mutation("delete", |ctx, arg: LibraryArgs| async move { let (id, library) = arg.get_library(&ctx).await?; - library - .db - .tag() - .find_unique(tag::id::equals(id)) - .delete() - .exec() - .await?; + library.db.tag().delete(tag::id::equals(id)).exec().await?; invalidate_query!( library, diff --git a/core/src/file/cas/identifier.rs b/core/src/file/cas/identifier.rs index 8cbe5bbcc..ac13c7b92 100644 --- a/core/src/file/cas/identifier.rs +++ b/core/src/file/cas/identifier.rs @@ -3,7 +3,7 @@ use super::checksum::generate_cas_id; use crate::{ job::{JobError, JobReportUpdate, JobResult, JobState, StatefulJob, WorkerContext}, library::LibraryContext, - prisma::{self, file, file_path, location}, + prisma::{file, file_path, location}, }; use chrono::{DateTime, FixedOffset}; use prisma_client_rust::{prisma_models::PrismaValue, raw, raw::Raw, Direction}; @@ -160,10 +160,10 @@ impl StatefulJob for FileIdentifierJob { if let Err(e) = library_ctx .db .file_path() - .find_unique(file_path::id::equals( - *cas_lookup.get(&existing_file.cas_id).unwrap(), - )) - .update(vec![file_path::file_id::set(Some(existing_file.id))]) + .update( + file_path::id::equals(*cas_lookup.get(&existing_file.cas_id).unwrap()), + vec![file_path::file_id::set(Some(existing_file.id))], + ) .exec() .await { @@ -205,6 +205,7 @@ impl StatefulJob for FileIdentifierJob { ), values, )) + .exec() .await .unwrap_or_else(|e| { error!("Error inserting files: {:#?}", e); @@ -219,10 +220,10 @@ impl StatefulJob for FileIdentifierJob { .library_ctx() .db .file_path() - .find_unique(file_path::id::equals( - *cas_lookup.get(&created_file.cas_id).unwrap(), - )) - .update(vec![file_path::file_id::set(Some(created_file.id))]) + .update( + file_path::id::equals(*cas_lookup.get(&created_file.cas_id).unwrap()), + vec![file_path::file_id::set(Some(created_file.id))], + ) .exec() .await { @@ -277,12 +278,13 @@ struct CountRes { pub async fn count_orphan_file_paths( ctx: &LibraryContext, location_id: i64, -) -> Result { +) -> Result { let files_count = ctx.db ._query_raw::(raw!( "SELECT COUNT(*) AS count FROM file_paths WHERE file_id IS NULL AND is_dir IS FALSE AND location_id = {}", PrismaValue::Int(location_id) )) + .exec() .await?; Ok(files_count[0].count.unwrap_or(0)) } @@ -290,7 +292,7 @@ pub async fn count_orphan_file_paths( pub async fn get_orphan_file_paths( ctx: &LibraryContext, cursor: i32, -) -> Result, prisma::QueryError> { +) -> Result, prisma_client_rust::QueryError> { info!( "discovering {} orphan file paths at cursor: {:?}", CHUNK_SIZE, cursor @@ -302,7 +304,7 @@ pub async fn get_orphan_file_paths( file_path::is_dir::equals(false), ]) .order_by(file_path::id::order(Direction::Asc)) - .cursor(file_path::id::cursor(cursor)) + .cursor(file_path::id::equals(cursor)) .take(CHUNK_SIZE as i64) .exec() .await diff --git a/core/src/file/indexer.rs b/core/src/file/indexer.rs index b9189b17d..36c75b470 100644 --- a/core/src/file/indexer.rs +++ b/core/src/file/indexer.rs @@ -86,6 +86,7 @@ impl StatefulJob for IndexerJob { .library_ctx() .db ._query_raw::(raw!("SELECT MAX(id) id FROM file_paths")) + .exec() .await { Ok(rows) => rows[0].id.unwrap_or(0), @@ -241,7 +242,7 @@ impl StatefulJob for IndexerJob { files ); - let count = ctx.library_ctx().db._execute_raw(raw).await; + let count = ctx.library_ctx().db._execute_raw(raw).exec().await; info!("Inserted {:?} records", count); diff --git a/core/src/job/job_manager.rs b/core/src/job/job_manager.rs index 140b1ddf2..f79996579 100644 --- a/core/src/job/job_manager.rs +++ b/core/src/job/job_manager.rs @@ -6,7 +6,7 @@ use crate::{ }, job::{worker::Worker, DynJob, Job, JobError}, library::LibraryContext, - prisma::{self, job, node}, + prisma::{job, node}, }; use int_enum::IntEnum; use rspc::Type; @@ -117,7 +117,9 @@ impl JobManager { ret } - pub async fn get_history(ctx: &LibraryContext) -> Result, prisma::QueryError> { + pub async fn get_history( + ctx: &LibraryContext, + ) -> Result, prisma_client_rust::QueryError> { let jobs = ctx .db .job() @@ -291,15 +293,17 @@ impl JobReport { pub async fn update(&self, ctx: &LibraryContext) -> Result<(), JobError> { ctx.db .job() - .find_unique(job::id::equals(self.id.as_bytes().to_vec())) - .update(vec![ - job::status::set(self.status.int_value()), - job::data::set(self.data.clone()), - job::task_count::set(self.task_count), - job::completed_task_count::set(self.completed_task_count), - job::date_modified::set(chrono::Utc::now().into()), - job::seconds_elapsed::set(self.seconds_elapsed), - ]) + .update( + job::id::equals(self.id.as_bytes().to_vec()), + vec![ + job::status::set(self.status.int_value()), + job::data::set(self.data.clone()), + job::task_count::set(self.task_count), + job::completed_task_count::set(self.completed_task_count), + job::date_modified::set(chrono::Utc::now().into()), + job::seconds_elapsed::set(self.seconds_elapsed), + ], + ) .exec() .await?; Ok(()) diff --git a/core/src/job/mod.rs b/core/src/job/mod.rs index 31b7ce16a..3ecd9015e 100644 --- a/core/src/job/mod.rs +++ b/core/src/job/mod.rs @@ -1,4 +1,4 @@ -use crate::{prisma, sys::LocationError}; +use crate::sys::LocationError; use rmp_serde::{decode::Error as DecodeError, encode::Error as EncodeError}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use std::{collections::VecDeque, fmt::Debug}; @@ -14,7 +14,7 @@ pub use worker::*; #[derive(Error, Debug)] pub enum JobError { #[error("Database error: {0}")] - DatabaseError(#[from] prisma::QueryError), + DatabaseError(#[from] prisma_client_rust::QueryError), #[error("Location error: {0}")] LocationError(#[from] LocationError), #[error("I/O error: {0}")] diff --git a/core/src/library/library_manager.rs b/core/src/library/library_manager.rs index 9f40cc5d6..2b873ea7a 100644 --- a/core/src/library/library_manager.rs +++ b/core/src/library/library_manager.rs @@ -10,11 +10,7 @@ use tokio::sync::RwLock; use uuid::Uuid; use crate::{ - invalidate_query, - node::Platform, - prisma::{self, node}, - util::db::load_and_migrate, - NodeContext, + invalidate_query, node::Platform, prisma::node, util::db::load_and_migrate, NodeContext, }; use super::{LibraryConfig, LibraryConfigWrapped, LibraryContext}; @@ -36,7 +32,7 @@ pub enum LibraryManagerError { #[error("error serializing or deserializing the JSON in the config file")] Json(#[from] serde_json::Error), #[error("Database error: {0}")] - Database(#[from] prisma::QueryError), + Database(#[from] prisma_client_rust::QueryError), #[error("Library not found error")] LibraryNotFound, #[error("error migrating the config file")] diff --git a/core/src/sys/locations.rs b/core/src/sys/locations.rs index 6c1b54a99..1a34e1066 100644 --- a/core/src/sys/locations.rs +++ b/core/src/sys/locations.rs @@ -8,7 +8,7 @@ use crate::{ invalidate_query, job::Job, library::LibraryContext, - prisma::{self, location}, + prisma::location, }; use rspc::ErrorCode; @@ -195,7 +195,7 @@ pub enum LocationError { #[error("Failed to connect to database (error: {0:?})")] IOError(io::Error), #[error("Database error")] - DatabaseError(#[from] prisma::QueryError), + DatabaseError(#[from] prisma_client_rust::QueryError), } impl From for rspc::Error { diff --git a/core/src/sys/volumes.rs b/core/src/sys/volumes.rs index 81a3c3e06..dbf581570 100644 --- a/core/src/sys/volumes.rs +++ b/core/src/sys/volumes.rs @@ -1,7 +1,4 @@ -use crate::{ - library::LibraryContext, - prisma::{self, volume::*}, -}; +use crate::{library::LibraryContext, prisma::volume::*}; use rspc::Type; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -24,7 +21,7 @@ pub struct Volume { #[derive(Error, Debug)] pub enum VolumeError { #[error("Database error: {0}")] - DatabaseErr(#[from] prisma::QueryError), + DatabaseErr(#[from] prisma_client_rust::QueryError), #[error("FromUtf8Error: {0}")] FromUtf8Error(#[from] std::string::FromUtf8Error), } diff --git a/core/src/util/db.rs b/core/src/util/db.rs index 4ced4361a..9df21142e 100644 --- a/core/src/util/db.rs +++ b/core/src/util/db.rs @@ -14,7 +14,7 @@ pub enum MigrationError { #[error("An error occurred while initialising a new database connection")] DatabaseInitialization(#[from] NewClientError), #[error("An error occurred with the database while applying migrations")] - DatabaseError(#[from] prisma_client_rust::queries::Error), + DatabaseError(#[from] prisma_client_rust::QueryError), #[error("An error occurred reading the embedded migration files. {0}. Please report to Spacedrive developers!")] InvalidEmbeddedMigration(&'static str), } @@ -27,11 +27,12 @@ pub async fn load_and_migrate(db_url: &str) -> Result(raw!( "SELECT name FROM sqlite_master WHERE type='table' AND name='_migrations'" )) + .exec() .await? .is_empty(); if migrations_table_missing { - client._execute_raw(raw!(INIT_MIGRATION)).await?; + client._execute_raw(raw!(INIT_MIGRATION)).exec().await?; } let mut migration_directories = MIGRATIONS_DIR @@ -102,11 +103,13 @@ pub async fn load_and_migrate(db_url: &str) -> Result>(); let steps = &steps[0..steps.len() - 1]; for (i, step) in steps.iter().enumerate() { - client._execute_raw(raw!(*step)).await?; + client._execute_raw(raw!(*step)).exec().await?; client .migration() - .find_unique(migration::checksum::equals(checksum.clone())) - .update(vec![migration::steps_applied::set(i as i32 + 1)]) + .update( + migration::checksum::equals(checksum.clone()), + vec![migration::steps_applied::set(i as i32 + 1)], + ) .exec() .await?; } From a64ac38005792a26a7bd5024c25fd6e9eed07683 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 19 Aug 2022 09:03:47 +0800 Subject: [PATCH 10/15] keep dist folder in desktop --- .gitignore | 4 ++-- apps/desktop/dist/.gitignore | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 apps/desktop/dist/.gitignore diff --git a/.gitignore b/.gitignore index 53da2a22b..500449750 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules .next dist +!apps/desktop/dist *.tsbuildinfo package-lock.json .eslintcache @@ -15,7 +16,6 @@ storybook-static/ cache .env vendor/ -dist data node_modules packages/turbo-server/data/ @@ -61,4 +61,4 @@ todos.md examples/*/*.lock /target -/sdserver_data \ No newline at end of file +/sdserver_data diff --git a/apps/desktop/dist/.gitignore b/apps/desktop/dist/.gitignore new file mode 100644 index 000000000..c53272268 --- /dev/null +++ b/apps/desktop/dist/.gitignore @@ -0,0 +1,5 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore +# This is done so that Tauri never complains that '../dist does not exist' From 5208628060ced19ef6cdff3066c6529ef7fe8db4 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Fri, 19 Aug 2022 09:57:52 +0800 Subject: [PATCH 11/15] fix clippy ci --- .github/workflows/clippy.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml index f2c039e33..3de8c04df 100644 --- a/.github/workflows/clippy.yml +++ b/.github/workflows/clippy.yml @@ -48,10 +48,6 @@ jobs: working-directory: core if: steps.cache-prisma.outputs.cache-hit != 'true' run: cargo run -p prisma-cli --release -- generate - - # This is do the proc-macro `tauri::generate_context!()` doesn't panic - - name: Create fake `dist` folder - run: mkdir ./apps/desktop/dist - name: Run Clippy uses: actions-rs/clippy-check@v1 From d10cf558bd0775c2add7619d765baff00a5d9858 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 20 Aug 2022 02:18:52 +0800 Subject: [PATCH 12/15] use ghost api v5 on landing --- apps/landing/package.json | 102 +++++++++--------- apps/landing/src/pages/blog/api.ts | 52 ++++----- .../src/pages/blog/post.page.server.ts | 26 ++--- 3 files changed, 90 insertions(+), 90 deletions(-) diff --git a/apps/landing/package.json b/apps/landing/package.json index 4a5a08e58..d6e3ac3f1 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -1,53 +1,53 @@ { - "name": "@sd/landing", - "scripts": { - "dev": "pnpm run server", - "prod": "pnpm run build && pnpm run server:prod", - "vercel-build": "./vercel/deploy.sh", - "build": "vite build && vite build --ssr && vite-plugin-ssr prerender", - "server": "ts-node ./server", - "server:prod": "cross-env NODE_ENV=production ts-node ./server" - }, - "dependencies": { - "@heroicons/react": "^1.0.6", - "@icons-pack/react-simple-icons": "^5.2.0", - "@sd/interface": "link:../../packages/interface", - "@sd/ui": "link:../../packages/ui", - "@tryghost/content-api": "^1.11.0", - "@types/compression": "^1.7.2", - "@types/express": "^4.17.13", - "@types/node": "^17.0.31", - "@types/react": "^18.0.8", - "@types/react-dom": "^18.0.3", - "@vitejs/plugin-react": "^1.3.2", - "clsx": "^1.2.1", - "compression": "^1.7.4", - "cross-env": "^7.0.3", - "express": "^4.18.1", - "phosphor-react": "^1.4.1", - "prismjs": "^1.28.0", - "react": "^18.1.0", - "react-dom": "^18.1.0", - "react-helmet": "^6.1.0", - "react-hook-form": "^7.33.1", - "react-tsparticles": "^2.1.3", - "sirv": "^2.0.2", - "ts-node": "^10.7.0", - "tsparticles": "^2.1.3", - "typescript": "^4.6.4", - "vite": "^2.9.14", - "vite-plugin-ssr": "^0.4.15" - }, - "devDependencies": { - "@tailwindcss/line-clamp": "^0.4.0", - "@tailwindcss/typography": "^0.5.4", - "@types/prismjs": "^1.26.0", - "@types/react-helmet": "^6.1.5", - "@types/tryghost__content-api": "^1.3.11", - "postcss": "^8.4.14", - "sass": "^1.54.0", - "tailwind": "^4.0.0", - "vite-plugin-markdown": "^2.0.2", - "vite-plugin-svgr": "^2.2.1" - } + "name": "@sd/landing", + "scripts": { + "dev": "pnpm run server", + "prod": "pnpm run build && pnpm run server:prod", + "vercel-build": "./vercel/deploy.sh", + "build": "vite build", + "server": "ts-node ./server", + "server:prod": "cross-env NODE_ENV=production ts-node ./server" + }, + "dependencies": { + "@heroicons/react": "^1.0.6", + "@icons-pack/react-simple-icons": "^5.2.0", + "@sd/interface": "link:../../packages/interface", + "@sd/ui": "link:../../packages/ui", + "@tryghost/content-api": "^1.11.0", + "@types/compression": "^1.7.2", + "@types/express": "^4.17.13", + "@types/node": "^17.0.31", + "@types/react": "^18.0.8", + "@types/react-dom": "^18.0.3", + "@vitejs/plugin-react": "^1.3.2", + "clsx": "^1.2.1", + "compression": "^1.7.4", + "cross-env": "^7.0.3", + "express": "^4.18.1", + "phosphor-react": "^1.4.1", + "prismjs": "^1.28.0", + "react": "^18.1.0", + "react-dom": "^18.1.0", + "react-helmet": "^6.1.0", + "react-hook-form": "^7.33.1", + "react-tsparticles": "^2.1.3", + "sirv": "^2.0.2", + "ts-node": "^10.7.0", + "tsparticles": "^2.1.3", + "typescript": "^4.6.4", + "vite": "^2.9.14", + "vite-plugin-ssr": "^0.4.15" + }, + "devDependencies": { + "@tailwindcss/line-clamp": "^0.4.0", + "@tailwindcss/typography": "^0.5.4", + "@types/prismjs": "^1.26.0", + "@types/react-helmet": "^6.1.5", + "@types/tryghost__content-api": "^1.3.11", + "postcss": "^8.4.14", + "sass": "^1.54.0", + "tailwind": "^4.0.0", + "vite-plugin-markdown": "^2.0.2", + "vite-plugin-svgr": "^2.2.1" + } } diff --git a/apps/landing/src/pages/blog/api.ts b/apps/landing/src/pages/blog/api.ts index 03778da1e..64b298abf 100644 --- a/apps/landing/src/pages/blog/api.ts +++ b/apps/landing/src/pages/blog/api.ts @@ -7,35 +7,35 @@ const ghostURL = import.meta.env.VITE_API_URL; export const blogEnabled = !!(ghostURL && ghostKey); export const api = blogEnabled - ? new GhostContentAPI({ - url: ghostURL, - key: ghostKey, - version: 'v4' - }) - : null; + ? new GhostContentAPI({ + url: ghostURL, + key: ghostKey, + version: 'v5.0' + }) + : null; export async function getPosts() { - if (!api) { - return []; - } - const posts = await api.posts - .browse({ - include: ['tags', 'authors'] - }) - .catch(() => []); - return posts; + if (!api) { + return []; + } + const posts = await api.posts + .browse({ + include: ['tags', 'authors'] + }) + .catch(() => []); + return posts; } export async function getPost(slug: string) { - if (!api) { - return null; - } - return await api.posts - .read( - { slug }, - { - include: ['tags', 'authors'] - } - ) - .catch(() => null); + if (!api) { + return null; + } + return await api.posts + .read( + { slug }, + { + include: ['tags', 'authors'] + } + ) + .catch(() => null); } diff --git a/apps/landing/src/pages/blog/post.page.server.ts b/apps/landing/src/pages/blog/post.page.server.ts index 25d68151c..9f366b450 100644 --- a/apps/landing/src/pages/blog/post.page.server.ts +++ b/apps/landing/src/pages/blog/post.page.server.ts @@ -3,22 +3,22 @@ import { PageContextBuiltIn } from 'vite-plugin-ssr'; import { getPost, getPosts } from './api'; export async function onBeforeRender(pageContext: PageContextBuiltIn) { - const post = await getPost(pageContext.routeParams['slug']); + const post = await getPost(pageContext.routeParams['slug']); - return { - pageContext: { - pageProps: { - post - } - } - }; + return { + pageContext: { + pageProps: { + post + } + } + }; } export async function prerender() { - const posts = await getPosts(); + const posts = await getPosts(); - return posts.map((post) => ({ - url: `/blog/${post.slug}`, - pageContext: { pageProps: { post } } - })); + return posts.map((post) => ({ + url: `/blog/${post.slug}`, + pageContext: { pageProps: { post } } + })); } From d54f4b1c373ed31ccee1cd3b6ab94557d21c0fbb Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Sat, 20 Aug 2022 02:41:47 +0800 Subject: [PATCH 13/15] hide funding announcement as blog post isn't working --- .../src/pages/blog/index.page.server.ts | 33 ++- apps/landing/src/pages/blog/index.page.tsx | 104 +++---- .../src/pages/blog/post.page.server.ts | 9 - apps/landing/src/pages/index.page.tsx | 256 +++++++++--------- 4 files changed, 200 insertions(+), 202 deletions(-) diff --git a/apps/landing/src/pages/blog/index.page.server.ts b/apps/landing/src/pages/blog/index.page.server.ts index c92ae28dc..b2962ec40 100644 --- a/apps/landing/src/pages/blog/index.page.server.ts +++ b/apps/landing/src/pages/blog/index.page.server.ts @@ -1,22 +1,27 @@ -import { getPosts } from './api'; +import { blogEnabled, getPosts } from './api'; export async function onBeforeRender() { - const posts = await getPosts(); + const posts = await getPosts(); - return { - pageContext: { - pageProps: { - posts - } - } - }; + return { + pageContext: { + pageProps: { + posts + } + } + }; } export async function prerender() { - const posts = await getPosts(); + const posts = await getPosts(); - return { - url: '/blog', - pageContext: { pageProps: { posts } } - }; + const individualPosts = posts.map((post) => ({ + url: `/blog/${post.slug}`, + pageContext: { pageProps: { post } } + })); + + return [...individualPosts, { + url: '/blog', + pageContext: { pageProps: { posts } } + }]; } diff --git a/apps/landing/src/pages/blog/index.page.tsx b/apps/landing/src/pages/blog/index.page.tsx index 3a90b23c1..123a9e066 100644 --- a/apps/landing/src/pages/blog/index.page.tsx +++ b/apps/landing/src/pages/blog/index.page.tsx @@ -7,59 +7,59 @@ import { getWindow } from '../../utils'; import { blogEnabled } from './api'; function Page({ posts }: { posts: PostOrPage[] }) { - if (!blogEnabled) { - let window = getWindow(); - if (!window) return; - window.location.href = '/blog-not-enabled'; - return <>; - } + if (!blogEnabled) { + let window = getWindow(); + if (!window) return; + window.location.href = '/blog-not-enabled'; + return <>; + } - return ( -

- - Spacedrive Blog - - -
-

Blog

-

Get the latest from Spacedrive.

-
-
- {posts.map((post) => { - return ( -
{ - window.location.href = `/blog/${post.slug}`; - }} - className="relative z-0 flex flex-col gap-2 mb-8 overflow-hidden transition-colors border border-gray-500 cursor-pointer rounded-xl" - > - {post.feature_image && ( - - )} -
-

{post.title}

- {post.reading_time} minute read. -

{post.excerpt}

-

- by {post.primary_author?.name} ·{' '} - {new Date(post.published_at ?? '').toLocaleDateString()} -

-
- {post.tags?.map((tag: Tag) => { - return ; - })} -
-
-
- ); - })} -
-
- ); + return ( +
+ + Spacedrive Blog + + +
+

Blog

+

Get the latest from Spacedrive.

+
+
+ {posts.map((post) => { + return ( +
{ + window.location.href = `/blog/${post.slug}`; + }} + className="relative z-0 flex flex-col gap-2 mb-8 overflow-hidden transition-colors border border-gray-500 cursor-pointer rounded-xl" + > + {post.feature_image && ( + + )} +
+

{post.title}

+ {post.reading_time} minute read. +

{post.excerpt}

+

+ by {post.primary_author?.name} ·{' '} + {new Date(post.published_at ?? '').toLocaleDateString()} +

+
+ {post.tags?.map((tag: Tag) => { + return ; + })} +
+
+
+ ); + })} +
+
+ ); } export { Page }; diff --git a/apps/landing/src/pages/blog/post.page.server.ts b/apps/landing/src/pages/blog/post.page.server.ts index 9f366b450..73d5a08a2 100644 --- a/apps/landing/src/pages/blog/post.page.server.ts +++ b/apps/landing/src/pages/blog/post.page.server.ts @@ -13,12 +13,3 @@ export async function onBeforeRender(pageContext: PageContextBuiltIn) { } }; } - -export async function prerender() { - const posts = await getPosts(); - - return posts.map((post) => ({ - url: `/blog/${post.slug}`, - pageContext: { pageProps: { post } } - })); -} diff --git a/apps/landing/src/pages/index.page.tsx b/apps/landing/src/pages/index.page.tsx index d4c39fa7f..dbd90e136 100644 --- a/apps/landing/src/pages/index.page.tsx +++ b/apps/landing/src/pages/index.page.tsx @@ -12,147 +12,149 @@ import { usePageContext } from '../renderer/usePageContext'; import { getWindow } from '../utils'; interface SectionProps { - orientation: 'left' | 'right'; - heading?: string; - description?: string | React.ReactNode; - children?: React.ReactNode; - className?: string; + orientation: 'left' | 'right'; + heading?: string; + description?: string | React.ReactNode; + children?: React.ReactNode; + className?: string; } function Section(props: SectionProps = { orientation: 'left' }) { - let info = ( -
- {props.heading &&

{props.heading}

} - {props.description && ( -

{props.description}

- )} -
- ); - return ( -
- {props.orientation === 'right' ? ( - <> - {info} - {props.children} - - ) : ( - <> - {props.children} - {info} - - )} -
- ); + let info = ( +
+ {props.heading &&

{props.heading}

} + {props.description && ( +

{props.description}

+ )} +
+ ); + return ( +
+ {props.orientation === 'right' ? ( + <> + {info} + {props.children} + + ) : ( + <> + {props.children} + {info} + + )} +
+ ); } function Page() { - const { urlParsed } = usePageContext(); - const [unsubscribedFromWaitlist, setUnsubscribedFromWaitlist] = useState(false); + const { urlParsed } = usePageContext(); + const [unsubscribedFromWaitlist, setUnsubscribedFromWaitlist] = useState(false); - useEffect(() => { - if (!getWindow()) return; + useEffect(() => { + if (!getWindow()) return; - const cuid = urlParsed.search?.['wunsub']; - if (!cuid) return; + const cuid = urlParsed.search?.['wunsub']; + if (!cuid) return; - (async () => { - const prod = import.meta.env.PROD; - const url = prod ? 'https://waitlist-api.spacedrive.com' : 'http://localhost:3000'; + (async () => { + const prod = import.meta.env.PROD; + const url = prod ? 'https://waitlist-api.spacedrive.com' : 'http://localhost:3000'; - const req = await fetch(`${url}/api/waitlist?i=${cuid}`, { - method: 'DELETE' - }); + const req = await fetch(`${url}/api/waitlist?i=${cuid}`, { + method: 'DELETE' + }); - if (req.status === 200) { - setUnsubscribedFromWaitlist(true); - window.history.replaceState( - {}, - '', - prod ? 'https://spacedrive.com' : 'http://localhost:8003' - ); + if (req.status === 200) { + setUnsubscribedFromWaitlist(true); + window.history.replaceState( + {}, + '', + prod ? 'https://spacedrive.com' : 'http://localhost:8003' + ); - setTimeout(() => { - setUnsubscribedFromWaitlist(false); - }, 5000); - } else if (req.status >= 400 && req.status < 500) { - alert('An error occurred while unsubscribing from waitlist'); - } - })(); - }, []); + setTimeout(() => { + setUnsubscribedFromWaitlist(false); + }, 5000); + } else if (req.status >= 400 && req.status < 500) { + alert('An error occurred while unsubscribing from waitlist'); + } + })(); + }, []); - return ( - <> - - Spacedrive — A file manager from the future. - - - - - -