From 4ac45137b84277d3404547e95275f8530e8dedf9 Mon Sep 17 00:00:00 2001 From: Thomas Lehmann Date: Thu, 16 May 2024 17:15:21 +0200 Subject: [PATCH] Use AuthTokenSection in App (build fails with TS errors) * package.json: add Nextcloud, Vue, typescipt dependencies (from Nextcloud) * remove .ts suffix from import paths (causes build error otherwise) * add declare global to define Nextcloud types. This should be changed to @nextcloud/typings. * annotated import of Nextcloud components (JS) with @ts-expect-error to solve tsc errors. This is most likely due to missing type definitions. Unclear how Nextcloud core made this working. * tsconfig: extend from @vue/tsconfig/tsconfig.json as documented elsewhere and as done in Nextcloud's core tsconfig.json * the eslint rule set @nextcloud/eslint-config/typescript was added to prevent: ERROR in [eslint] /app/src/components/AuthTokenSection.vue 35:27 error "@nextcloud/initial-state" is not published n/no-unpublished-import 36:32 error "@nextcloud/l10n" is not published n/no-unpublished-import I can only assume that that rule is disabled in the rule set we extend from or that the module resolution "node" can not find the files. The error actually complains about the module not being part of "dependencies" in package.json, which is the case, however. The internet calls for allowing such modules, which IMO defeats the purpose. The rule is also present in Nextcloud's core config. Build fails with errors like ERROR in /app/src/components/AuthTokenSetup.vue.ts 47:9-14 [tsl] ERROR in /app/src/components/AuthTokenSetup.vue.ts(47,10) TS2339: Property 'reset' does not exist on type 'CreateComponentPublicInstance<{}, { authTokenStore: Store<"auth-token", { tokens: IToken[]; }, {}, { updateToken(token: IToken): Promise; addToken(name: string): Promise; deleteToken(token: IToken): Promise<...>; wipeToken(token: IToken): Promise<...>; renameToken(token: IToken, newName: ...'. This hints at Typescript not being able to infer types from the component definition. Related issues: * https://github.com/vuejs/vue/issues/9873 * https://github.com/vuejs/vue/issues/12628 * https://github.com/vuejs/vue/issues/8721 Unsuccessfully attempted proposed solutions: * Declaring return types on methods like: reset(): void { async submit(): Promise { * Using arrow functions Did not work and would introduce new errors anyway * Defining interfaces for the returned component Caused another rabbit hole of more and more required type definitions, that should be infered by the Vue typings anyway --- .eslintrc.js | 1 + src/App.vue | 15 ++++++-------- src/components/AuthToken.vue | 27 ++++++++++++++++++++++++- src/components/AuthTokenSetup.vue | 2 ++ src/components/AuthTokenSetupDialog.vue | 4 ++++ src/store/authtoken.ts | 5 +++++ tsconfig.json | 8 ++++---- 7 files changed, 48 insertions(+), 14 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 9175db9..f71e55f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,7 @@ module.exports = { extends: [ '@nextcloud', + '@nextcloud/eslint-config/typescript', ], rules: { 'jsdoc/require-jsdoc': 'off', diff --git a/src/App.vue b/src/App.vue index 69a1206..e4d80ef 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,20 +1,17 @@