diff --git a/packages/mock-providers/.eslintrc.json b/packages/mock-providers/.eslintrc.json new file mode 100644 index 0000000000000..a83aeda48e66d --- /dev/null +++ b/packages/mock-providers/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": ["@rocket.chat/eslint-config"], + "ignorePatterns": ["**/dist"] +} diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json new file mode 100644 index 0000000000000..9cbe0db459627 --- /dev/null +++ b/packages/mock-providers/package.json @@ -0,0 +1,31 @@ +{ + "name": "@rocket.chat/mock-providers", + "version": "0.0.1", + "private": true, + "devDependencies": { + "@rocket.chat/ui-contexts": "workspace:*", + "@tanstack/react-query": "^4.16.1", + "@types/jest": "^27.4.1", + "eslint": "^8.12.0", + "jest": "~29.5.0", + "react": "~17.0.2", + "ts-jest": "~29.0.5", + "typescript": "~5.0.2" + }, + "peerDependencies": { + "@tanstack/react-query": "*", + "react": "*" + }, + "scripts": { + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "test": "jest", + "build": "rm -rf dist && tsc -p tsconfig.json", + "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + }, + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "files": [ + "/dist" + ] +} diff --git a/packages/mock-providers/src/MockedAuthorizationContext.tsx b/packages/mock-providers/src/MockedAuthorizationContext.tsx new file mode 100644 index 0000000000000..18f791f1dd984 --- /dev/null +++ b/packages/mock-providers/src/MockedAuthorizationContext.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { AuthorizationContext } from '@rocket.chat/ui-contexts'; + +export const MockedAuthorizationContext = ({ permissions = [], children }: { permissions: string[]; children: React.ReactNode }) => { + return ( + [() => (): void => undefined, (): boolean => permissions.includes(id)], + queryAtLeastOnePermission: () => [() => (): void => undefined, (): boolean => false], + queryAllPermissions: () => [() => (): void => undefined, (): boolean => false], + queryRole: () => [() => (): void => undefined, (): boolean => false], + roleStore: { + roles: {}, + emit: (): void => undefined, + on: () => (): void => undefined, + off: (): void => undefined, + events: (): 'change'[] => ['change'], + has: (): boolean => false, + once: () => (): void => undefined, + }, + }} + > + {children} + + ); +}; diff --git a/packages/mock-providers/src/MockedServerContext.tsx b/packages/mock-providers/src/MockedServerContext.tsx new file mode 100644 index 0000000000000..f3c13004ed775 --- /dev/null +++ b/packages/mock-providers/src/MockedServerContext.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import type { Serialized } from '@rocket.chat/core-typings'; +import type { Method, OperationParams, OperationResult, PathPattern, UrlParams } from '@rocket.chat/rest-typings'; +import type { ServerMethodName, ServerMethodParameters } from '@rocket.chat/ui-contexts'; +import { ServerContext } from '@rocket.chat/ui-contexts'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; + +export const MockedServerContext = ({ + handleRequest, + children, +}: { + handleRequest: (args: { + method: TMethod; + pathPattern: TPathPattern; + keys: UrlParams; + params: OperationParams; + }) => Promise>>; + children: React.ReactNode; +}): any => { + const [queryClient] = React.useState(() => new QueryClient()); + return ( + `http://localhost:3000/${path}`, + callMethod: (_methodName: MethodName, ..._args: ServerMethodParameters) => + Promise.reject('mock not implemented'), + callEndpoint: async (args: { + method: TMethod; + pathPattern: TPathPattern; + keys: UrlParams; + params: OperationParams; + }) => { + return handleRequest(args); + }, + } as any + } + > + {children} + + ); +}; diff --git a/packages/mock-providers/src/MockedSettingsContext.tsx b/packages/mock-providers/src/MockedSettingsContext.tsx new file mode 100644 index 0000000000000..f916f4a6fb475 --- /dev/null +++ b/packages/mock-providers/src/MockedSettingsContext.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import type { ISetting } from '@rocket.chat/core-typings'; +import { SettingsContext } from '@rocket.chat/ui-contexts'; +import type { ContextType } from 'react'; + +const settingContextValue: ContextType = { + hasPrivateAccess: true, + isLoading: false, + querySetting: (_id: string) => [() => () => undefined, () => undefined], + querySettings: () => [() => () => undefined, () => []], + dispatch: async () => undefined, +}; + +const createSettingContextValue = ({ settings }: { settings?: Record }): ContextType => { + const cache = new Map(); + + return { + ...settingContextValue, + ...(settings && { + querySetting: (_id: string) => [ + () => () => undefined, + () => { + if (cache.has(_id)) { + return cache.get(_id) as any; + } + cache.set(_id, { value: settings[_id] } as any); + return cache.get(_id) as any; + }, + ], + }), + }; +}; + +export const MockedSettingsContext = ({ + settings, + children, +}: { + children: React.ReactNode; + settings?: Record; +}) => { + return {children}; +}; diff --git a/packages/mock-providers/src/MockedUiKitActionManager.tsx b/packages/mock-providers/src/MockedUiKitActionManager.tsx new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/packages/mock-providers/src/MockedUserContext.tsx b/packages/mock-providers/src/MockedUserContext.tsx new file mode 100644 index 0000000000000..8dd9ae53cf3f4 --- /dev/null +++ b/packages/mock-providers/src/MockedUserContext.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import type { LoginService } from '@rocket.chat/ui-contexts'; +import { UserContext } from '@rocket.chat/ui-contexts'; +import type { ContextType } from 'react'; + +const userContextValue: ContextType = { + userId: 'john.doe', + user: { + _id: 'john.doe', + username: 'john.doe', + name: 'John Doe', + createdAt: new Date(), + active: true, + _updatedAt: new Date(), + roles: ['admin'], + type: 'user', + }, + queryPreference: ((pref: string, defaultValue: T) => [ + () => () => undefined, + () => (typeof pref === 'string' ? undefined : defaultValue), + ]) as any, + querySubscriptions: () => [() => () => undefined, () => []], + querySubscription: () => [() => () => undefined, () => undefined], + queryRoom: () => [() => () => undefined, () => undefined], + + queryAllServices: () => [() => (): void => undefined, (): LoginService[] => []], + loginWithService: () => () => Promise.reject('loginWithService not implemented'), + loginWithPassword: async () => Promise.reject('loginWithPassword not implemented'), + loginWithToken: async () => Promise.reject('loginWithToken not implemented'), + logout: () => Promise.resolve(), +}; + +const createUserContextValue = ({ userPreferences }: { userPreferences?: Record }): ContextType => { + return { + ...userContextValue, + ...(userPreferences && { queryPreference: (id) => [() => () => undefined, () => userPreferences[id as unknown as string] as any] }), + }; +}; + +export const MockedUserContext = ({ + userPreferences, + children, +}: { + children: React.ReactNode; + userPreferences?: Record; +}) => { + return {children}; +}; diff --git a/packages/mock-providers/tsconfig.json b/packages/mock-providers/tsconfig.json new file mode 100644 index 0000000000000..58749dfbb7e45 --- /dev/null +++ b/packages/mock-providers/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.client.json", + "compilerOptions": { + "jsx": "react", + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["./src/**/*"] +} diff --git a/yarn.lock b/yarn.lock index df384064d532f..e35cc8a86c4ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,13 @@ __metadata: version: 6 cacheKey: 8 +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd + languageName: node + linkType: hard + "@actions/core@npm:^1.10.0": version: 1.10.0 resolution: "@actions/core@npm:1.10.0" @@ -5002,6 +5009,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^2.1.0": + version: 2.1.0 + resolution: "@eslint/eslintrc@npm:2.1.0" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.6.0 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: d5ed0adbe23f6571d8c9bb0ca6edf7618dc6aed4046aa56df7139f65ae7b578874e0d9c796df784c25bda648ceb754b6320277d828c8b004876d7443b8dc018c + languageName: node + linkType: hard + "@eslint/js@npm:8.43.0": version: 8.43.0 resolution: "@eslint/js@npm:8.43.0" @@ -5009,6 +5033,13 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:8.44.0": + version: 8.44.0 + resolution: "@eslint/js@npm:8.44.0" + checksum: fc539583226a28f5677356e9f00d2789c34253f076643d2e32888250e509a4e13aafe0880cb2425139051de0f3a48d25bfc5afa96b7304f203b706c17340e3cf + languageName: node + linkType: hard + "@faker-js/faker@npm:~8.0.2": version: 8.0.2 resolution: "@faker-js/faker@npm:8.0.2" @@ -10326,6 +10357,24 @@ __metadata: languageName: unknown linkType: soft +"@rocket.chat/mock-providers@workspace:packages/mock-providers": + version: 0.0.0-use.local + resolution: "@rocket.chat/mock-providers@workspace:packages/mock-providers" + dependencies: + "@rocket.chat/ui-contexts": "workspace:*" + "@tanstack/react-query": ^4.16.1 + "@types/jest": ^27.4.1 + eslint: ^8.12.0 + jest: ~29.5.0 + react: ~17.0.2 + ts-jest: ~29.0.5 + typescript: ~5.0.2 + peerDependencies: + "@tanstack/react-query": "*" + react: "*" + languageName: unknown + linkType: soft + "@rocket.chat/model-typings@workspace:^, @rocket.chat/model-typings@workspace:packages/model-typings": version: 0.0.0-use.local resolution: "@rocket.chat/model-typings@workspace:packages/model-typings" @@ -10851,7 +10900,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/ui-contexts@workspace:^, @rocket.chat/ui-contexts@workspace:packages/ui-contexts, @rocket.chat/ui-contexts@workspace:~": +"@rocket.chat/ui-contexts@workspace:*, @rocket.chat/ui-contexts@workspace:^, @rocket.chat/ui-contexts@workspace:packages/ui-contexts, @rocket.chat/ui-contexts@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/ui-contexts@workspace:packages/ui-contexts" dependencies: @@ -15463,6 +15512,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.9.0": + version: 8.10.0 + resolution: "acorn@npm:8.10.0" + bin: + acorn: bin/acorn + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + languageName: node + linkType: hard + "add-px-to-style@npm:1.0.0": version: 1.0.0 resolution: "add-px-to-style@npm:1.0.0" @@ -22159,6 +22217,55 @@ __metadata: languageName: node linkType: hard +"eslint@npm:^8.12.0": + version: 8.44.0 + resolution: "eslint@npm:8.44.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.4.0 + "@eslint/eslintrc": ^2.1.0 + "@eslint/js": 8.44.0 + "@humanwhocodes/config-array": ^0.11.10 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.2.0 + eslint-visitor-keys: ^3.4.1 + espree: ^9.6.0 + esquery: ^1.4.2 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + graphemer: ^1.4.0 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.3 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: d06309ce4aafb9d27d558c8e5e5aa5cba3bbec3ce8ceccbc7d4b7a35f2b67fd40189159155553270e2e6febeb69bd8a3b60d6241c8f5ddc2ef1702ccbd328501 + languageName: node + linkType: hard + "eslint@npm:^8.43.0, eslint@npm:~8.43.0": version: 8.43.0 resolution: "eslint@npm:8.43.0" @@ -22230,6 +22337,17 @@ __metadata: languageName: node linkType: hard +"espree@npm:^9.6.0": + version: 9.6.0 + resolution: "espree@npm:9.6.0" + dependencies: + acorn: ^8.9.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.4.1 + checksum: 1287979510efb052a6a97c73067ea5d0a40701b29adde87bbe2d3eb1667e39ca55e8129e20e2517fed3da570150e7ef470585228459a8f3e3755f45007a1c662 + languageName: node + linkType: hard + "esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -31625,6 +31743,20 @@ __metadata: languageName: node linkType: hard +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" + dependencies: + "@aashutoshrathi/word-wrap": ^1.2.3 + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + languageName: node + linkType: hard + "optipng-bin@npm:^7.0.0": version: 7.0.1 resolution: "optipng-bin@npm:7.0.1" @@ -39582,6 +39714,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:~5.0.2": + version: 5.0.4 + resolution: "typescript@npm:5.0.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172 + languageName: node + linkType: hard + "typescript@patch:typescript@^5.1.3#~builtin, typescript@patch:typescript@~5.1.3#~builtin": version: 5.1.3 resolution: "typescript@patch:typescript@npm%3A5.1.3#~builtin::version=5.1.3&hash=f456af" @@ -39592,6 +39734,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@~5.0.2#~builtin": + version: 5.0.4 + resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=f456af" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 6a1fe9a77bb9c5176ead919cc4a1499ee63e46b4e05bf667079f11bf3a8f7887f135aa72460a4c3b016e6e6bb65a822cb8689a6d86cbfe92d22cc9f501f09213 + languageName: node + linkType: hard + "ua-parser-js@npm:^1.0.35": version: 1.0.35 resolution: "ua-parser-js@npm:1.0.35"