diff --git a/.changeset/four-cherries-kneel.md b/.changeset/four-cherries-kneel.md new file mode 100644 index 0000000000000..095d5af0aa765 --- /dev/null +++ b/.changeset/four-cherries-kneel.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Allow to use the token from `room.v` when requesting transcript instead of visitor token. Visitors may change their tokens at any time, rendering old conversations impossible to access for them (or for APIs depending on token) as the visitor token won't match the `room.v` token. diff --git a/.changeset/short-drinks-itch.md b/.changeset/short-drinks-itch.md new file mode 100644 index 0000000000000..ee57330ffc863 --- /dev/null +++ b/.changeset/short-drinks-itch.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/message-parser': patch +'@rocket.chat/peggy-loader': patch +--- + +Improved the performance of the message parser diff --git a/.changeset/tiny-geckos-kiss.md b/.changeset/tiny-geckos-kiss.md new file mode 100644 index 0000000000000..d381509703101 --- /dev/null +++ b/.changeset/tiny-geckos-kiss.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': minor +'@rocket.chat/meteor': minor +--- + +Added a new setting which allows workspace admins to disable email two factor authentication for SSO (OAuth) users. If enabled, SSO users won't be asked for email two factor authentication. diff --git a/.changeset/wet-hats-walk.md b/.changeset/wet-hats-walk.md new file mode 100644 index 0000000000000..4c3565e755233 --- /dev/null +++ b/.changeset/wet-hats-walk.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed issue that caused an infinite loading state when uploading a private app to Rocket.Chat diff --git a/.github/workflows/ci-preview.yml b/.github/workflows/ci-preview.yml new file mode 100644 index 0000000000000..18b4b0bef373a --- /dev/null +++ b/.github/workflows/ci-preview.yml @@ -0,0 +1,44 @@ +# .github/workflows/ci-preview.yml +name: Deploy PR previews +concurrency: preview-${{ github.ref }} +on: + pull_request: + types: + - opened + - reopened + - synchronize + - closed + push: + branches: + - main + - master + - develop +jobs: + deploy-preview: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: rharkor/caching-for-turbo@v1.5 + if: github.event.action != 'closed' + + - name: Setup NodeJS + uses: ./.github/actions/setup-node + if: github.event.action != 'closed' + with: + node-version: 14.21.3 + cache-modules: true + install: true + + - name: Build + if: github.event.action != 'closed' + run: | + yarn turbo run build-preview + yarn turbo run .:build-preview-move + + - uses: rossjrw/pr-preview-action@v1 + with: + source-dir: .preview + preview-branch: gh-pages + umbrella-dir: pr-preview + action: auto diff --git a/.gitignore b/.gitignore index 4e6e4bb29da9f..dbad2c29a22c9 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,8 @@ yarn-error.log* .history .envrc +.preview + *.sublime-workspace **/.vim/ diff --git a/_templates/package/new/package.json.ejs.t b/_templates/package/new/package.json.ejs.t index 6bee52f55927a..b2827ee3fb89b 100644 --- a/_templates/package/new/package.json.ejs.t +++ b/_templates/package/new/package.json.ejs.t @@ -19,6 +19,7 @@ to: packages/<%= name %>/package.json "test": "jest", "build": "rm -rf dist && tsc -p tsconfig.json", "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + "build-preview": "mkdir -p ../../.preview && cp -r ./dist ../../.preview/<%= name.toLowerCase() %>" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", diff --git a/apps/meteor/app/2fa/server/code/EmailCheck.spec.ts b/apps/meteor/app/2fa/server/code/EmailCheck.spec.ts new file mode 100644 index 0000000000000..5c3574f0b395b --- /dev/null +++ b/apps/meteor/app/2fa/server/code/EmailCheck.spec.ts @@ -0,0 +1,70 @@ +import { expect } from 'chai'; +import { describe, it } from 'mocha'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +const settingsMock = sinon.stub(); + +const { EmailCheck } = proxyquire.noCallThru().load('./EmailCheck', { + '@rocket.chat/models': { + Users: {}, + }, + 'meteor/accounts-base': { + Accounts: { + _bcryptRounds: () => '123', + }, + }, + '../../../../server/lib/i18n': { + i18n: { + t: (key: string) => key, + }, + }, + '../../../mailer/server/api': { + send: () => undefined, + }, + '../../../settings/server': { + settings: { + get: settingsMock, + }, + }, +}); + +const normalUserMock = { services: { email2fa: { enabled: true } }, emails: [{ email: 'abc@gmail.com', verified: true }] }; +const normalUserWithUnverifiedEmailMock = { + services: { email2fa: { enabled: true } }, + emails: [{ email: 'abc@gmail.com', verified: false }], +}; +const OAuthUserMock = { services: { google: {} }, emails: [{ email: 'abc@gmail.com', verified: true }] }; + +describe('EmailCheck', () => { + let emailCheck: typeof EmailCheck; + beforeEach(() => { + settingsMock.reset(); + + emailCheck = new EmailCheck(); + }); + + it('should return EmailCheck is enabled for a normal user', () => { + settingsMock.returns(true); + + const isEmail2FAEnabled = emailCheck.isEnabled(normalUserMock); + + expect(isEmail2FAEnabled).to.be.equal(true); + }); + + it('should return EmailCheck is not enabled for a normal user with unverified email', () => { + settingsMock.returns(true); + + const isEmail2FAEnabled = emailCheck.isEnabled(normalUserWithUnverifiedEmailMock); + + expect(isEmail2FAEnabled).to.be.equal(false); + }); + + it('should return EmailCheck is not enabled for a OAuth user with setting being false', () => { + settingsMock.returns(true); + + const isEmail2FAEnabled = emailCheck.isEnabled(OAuthUserMock); + + expect(isEmail2FAEnabled).to.be.equal(false); + }); +}); diff --git a/apps/meteor/app/2fa/server/code/EmailCheck.ts b/apps/meteor/app/2fa/server/code/EmailCheck.ts index 123df96ee264c..d947c1b30c2e3 100644 --- a/apps/meteor/app/2fa/server/code/EmailCheck.ts +++ b/apps/meteor/app/2fa/server/code/EmailCheck.ts @@ -1,4 +1,4 @@ -import type { IUser } from '@rocket.chat/core-typings'; +import { isOAuthUser, type IUser } from '@rocket.chat/core-typings'; import { Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; import bcrypt from 'bcrypt'; @@ -24,6 +24,10 @@ export class EmailCheck implements ICodeCheck { return false; } + if (!settings.get('Accounts_twoFactorAuthentication_email_available_for_OAuth_users') && isOAuthUser(user)) { + return false; + } + if (!user.services?.email2fa?.enabled) { return false; } diff --git a/apps/meteor/app/2fa/server/code/index.ts b/apps/meteor/app/2fa/server/code/index.ts index 1fbe658e5682a..b05157416e313 100644 --- a/apps/meteor/app/2fa/server/code/index.ts +++ b/apps/meteor/app/2fa/server/code/index.ts @@ -45,14 +45,10 @@ function getAvailableMethodNames(user: IUser): string[] { export async function getUserForCheck(userId: string): Promise { return Users.findOneById(userId, { projection: { - 'emails': 1, - 'language': 1, - 'createdAt': 1, - 'services.totp': 1, - 'services.email2fa': 1, - 'services.emailCode': 1, - 'services.password': 1, - 'services.resume.loginTokens': 1, + emails: 1, + language: 1, + createdAt: 1, + services: 1, }, }); } diff --git a/apps/meteor/app/api/server/v1/misc.ts b/apps/meteor/app/api/server/v1/misc.ts index dd4da47bff052..8348b8429e4e2 100644 --- a/apps/meteor/app/api/server/v1/misc.ts +++ b/apps/meteor/app/api/server/v1/misc.ts @@ -1,6 +1,6 @@ import crypto from 'crypto'; -import type { IUser } from '@rocket.chat/core-typings'; +import { isOAuthUser, type IUser } from '@rocket.chat/core-typings'; import { Settings, Users } from '@rocket.chat/models'; import { isShieldSvgProps, @@ -26,7 +26,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { passwordPolicy } from '../../../lib/server'; import { notifyOnSettingChangedById } from '../../../lib/server/lib/notifyListener'; import { settings } from '../../../settings/server'; -import { getDefaultUserFields } from '../../../utils/server/functions/getDefaultUserFields'; +import { getBaseUserFields } from '../../../utils/server/functions/getBaseUserFields'; import { isSMTPConfigured } from '../../../utils/server/functions/isSMTPConfigured'; import { getURL } from '../../../utils/server/getURL'; import { API } from '../api'; @@ -176,15 +176,19 @@ API.v1.addRoute( { authRequired: true }, { async get() { - const fields = getDefaultUserFields(); - const { services, ...user } = (await Users.findOneById(this.userId, { projection: fields })) as IUser; + const userFields = { ...getBaseUserFields(), services: 1 }; + const { services, ...user } = (await Users.findOneById(this.userId, { projection: userFields })) as IUser; return API.v1.success( await getUserInfo({ ...user, + isOAuthUser: isOAuthUser({ ...user, services }), ...(services && { services: { - ...services, + ...(services.github && { github: services.github }), + ...(services.gitlab && { gitlab: services.gitlab }), + ...(services.email2fa?.enabled && { email2fa: { enabled: services.email2fa.enabled } }), + ...(services.totp?.enabled && { totp: { enabled: services.totp.enabled } }), password: { // The password hash shouldn't be leaked but the client may need to know if it exists. exists: Boolean(services?.password?.bcrypt), diff --git a/apps/meteor/app/livechat/server/lib/sendTranscript.ts b/apps/meteor/app/livechat/server/lib/sendTranscript.ts index 74032121ee509..bc7c06e0eaaed 100644 --- a/apps/meteor/app/livechat/server/lib/sendTranscript.ts +++ b/apps/meteor/app/livechat/server/lib/sendTranscript.ts @@ -3,12 +3,13 @@ import { type IUser, type MessageTypesValues, type IOmnichannelSystemMessage, + type ILivechatVisitor, isFileAttachment, isFileImageAttachment, } from '@rocket.chat/core-typings'; import colors from '@rocket.chat/fuselage-tokens/colors'; import { Logger } from '@rocket.chat/logger'; -import { LivechatRooms, LivechatVisitors, Messages, Uploads, Users } from '@rocket.chat/models'; +import { LivechatRooms, Messages, Uploads, Users } from '@rocket.chat/models'; import { check } from 'meteor/check'; import moment from 'moment-timezone'; @@ -41,16 +42,12 @@ export async function sendTranscript({ const room = await LivechatRooms.findOneById(rid); - const visitor = await LivechatVisitors.getVisitorByToken(token, { - projection: { _id: 1, token: 1, language: 1, username: 1, name: 1 }, - }); - - if (!visitor) { - throw new Error('error-invalid-token'); + const visitor = room?.v as ILivechatVisitor; + if (token !== visitor?.token) { + throw new Error('error-invalid-visitor'); } - // @ts-expect-error - Visitor typings should include language? - const userLanguage = visitor?.language || settings.get('Language') || 'en'; + const userLanguage = settings.get('Language') || 'en'; const timezone = getTimezone(user); logger.debug(`Transcript will be sent using ${timezone} as timezone`); @@ -59,7 +56,7 @@ export async function sendTranscript({ } // allow to only user to send transcripts from their own chats - if (room.t !== 'l' || !room.v || room.v.token !== token) { + if (room.t !== 'l') { throw new Error('error-invalid-room'); } diff --git a/apps/meteor/app/utils/server/functions/getBaseUserFields.ts b/apps/meteor/app/utils/server/functions/getBaseUserFields.ts new file mode 100644 index 0000000000000..5e2a3bf2b4d73 --- /dev/null +++ b/apps/meteor/app/utils/server/functions/getBaseUserFields.ts @@ -0,0 +1,34 @@ +type UserFields = { + [k: string]: number; +}; + +export const getBaseUserFields = (): UserFields => ({ + 'name': 1, + 'username': 1, + 'nickname': 1, + 'emails': 1, + 'status': 1, + 'statusDefault': 1, + 'statusText': 1, + 'statusConnection': 1, + 'bio': 1, + 'avatarOrigin': 1, + 'utcOffset': 1, + 'language': 1, + 'settings': 1, + 'enableAutoAway': 1, + 'idleTimeLimit': 1, + 'roles': 1, + 'active': 1, + 'defaultRoom': 1, + 'customFields': 1, + 'requirePasswordChange': 1, + 'requirePasswordChangeReason': 1, + 'statusLivechat': 1, + 'banners': 1, + 'oauth.authorizedClients': 1, + '_updatedAt': 1, + 'avatarETag': 1, + 'extension': 1, + 'openBusinessHours': 1, +}); diff --git a/apps/meteor/app/utils/server/functions/getDefaultUserFields.ts b/apps/meteor/app/utils/server/functions/getDefaultUserFields.ts index 03d0cae77ab94..293eb8607342d 100644 --- a/apps/meteor/app/utils/server/functions/getDefaultUserFields.ts +++ b/apps/meteor/app/utils/server/functions/getDefaultUserFields.ts @@ -1,39 +1,14 @@ -type DefaultUserFields = { +import { getBaseUserFields } from './getBaseUserFields'; + +type UserFields = { [k: string]: number; }; -export const getDefaultUserFields = (): DefaultUserFields => ({ - 'name': 1, - 'username': 1, - 'nickname': 1, - 'emails': 1, - 'status': 1, - 'statusDefault': 1, - 'statusText': 1, - 'statusConnection': 1, - 'bio': 1, - 'avatarOrigin': 1, - 'utcOffset': 1, - 'language': 1, - 'settings': 1, - 'enableAutoAway': 1, - 'idleTimeLimit': 1, - 'roles': 1, - 'active': 1, - 'defaultRoom': 1, - 'customFields': 1, - 'requirePasswordChange': 1, - 'requirePasswordChangeReason': 1, +export const getDefaultUserFields = (): UserFields => ({ + ...getBaseUserFields(), 'services.github': 1, 'services.gitlab': 1, 'services.password.bcrypt': 1, 'services.totp.enabled': 1, 'services.email2fa.enabled': 1, - 'statusLivechat': 1, - 'banners': 1, - 'oauth.authorizedClients': 1, - '_updatedAt': 1, - 'avatarETag': 1, - 'extension': 1, - 'openBusinessHours': 1, }); diff --git a/apps/meteor/client/views/account/security/AccountSecurityPage.tsx b/apps/meteor/client/views/account/security/AccountSecurityPage.tsx index 536ba8a04ef79..06619f0618f57 100644 --- a/apps/meteor/client/views/account/security/AccountSecurityPage.tsx +++ b/apps/meteor/client/views/account/security/AccountSecurityPage.tsx @@ -1,6 +1,6 @@ import { Box, Accordion, ButtonGroup, Button } from '@rocket.chat/fuselage'; import { useUniqueId } from '@rocket.chat/fuselage-hooks'; -import { useSetting, useTranslation } from '@rocket.chat/ui-contexts'; +import { useSetting, useTranslation, useUser } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import React from 'react'; import { FormProvider, useForm } from 'react-hook-form'; @@ -15,6 +15,11 @@ const passwordDefaultValues = { password: '', confirmationPassword: '' }; const AccountSecurityPage = (): ReactElement => { const t = useTranslation(); + const user = useUser(); + + const isEmail2FAAvailableForOAuth = useSetting('Accounts_twoFactorAuthentication_email_available_for_OAuth_users'); + const isOAuthUser = user?.isOAuthUser; + const isEmail2FAAllowed = !isOAuthUser || isEmail2FAAvailableForOAuth; const methods = useForm({ defaultValues: passwordDefaultValues, @@ -30,6 +35,7 @@ const AccountSecurityPage = (): ReactElement => { const twoFactorByEmailEnabled = useSetting('Accounts_TwoFactorAuthentication_By_Email_Enabled'); const e2eEnabled = useSetting('E2E_Enable'); const allowPasswordChange = useSetting('Accounts_AllowPasswordChange'); + const showEmailTwoFactor = twoFactorByEmailEnabled && isEmail2FAAllowed; const passwordFormId = useUniqueId(); @@ -48,10 +54,10 @@ const AccountSecurityPage = (): ReactElement => { )} - {(twoFactorTOTP || twoFactorByEmailEnabled) && twoFactorEnabled && ( + {(twoFactorTOTP || showEmailTwoFactor) && twoFactorEnabled && ( {twoFactorTOTP && } - {twoFactorByEmailEnabled && } + {showEmailTwoFactor && } )} {e2eEnabled && ( diff --git a/apps/meteor/client/views/account/security/TwoFactorEmail.tsx b/apps/meteor/client/views/account/security/TwoFactorEmail.tsx index c890dc61e6586..3654d17b5dec9 100644 --- a/apps/meteor/client/views/account/security/TwoFactorEmail.tsx +++ b/apps/meteor/client/views/account/security/TwoFactorEmail.tsx @@ -1,11 +1,11 @@ import { Box, Button, Margins } from '@rocket.chat/fuselage'; import { useUser, useTranslation } from '@rocket.chat/ui-contexts'; -import type { ComponentProps, ReactElement } from 'react'; +import type { ComponentProps } from 'react'; import React, { useCallback } from 'react'; import { useEndpointAction } from '../../../hooks/useEndpointAction'; -const TwoFactorEmail = (props: ComponentProps): ReactElement => { +const TwoFactorEmail = (props: ComponentProps) => { const t = useTranslation(); const user = useUser(); diff --git a/apps/meteor/client/views/marketplace/hooks/useInstallApp.tsx b/apps/meteor/client/views/marketplace/hooks/useInstallApp.tsx index f10d3e989e0a3..3b784e24c375b 100644 --- a/apps/meteor/client/views/marketplace/hooks/useInstallApp.tsx +++ b/apps/meteor/client/views/marketplace/hooks/useInstallApp.tsx @@ -114,8 +114,11 @@ export const useInstallApp = (file: File, url: string): { install: () => void; i }; const extractManifestFromAppFile = async (appFile: File) => { - const manifest = await getManifestFromZippedApp(appFile); - return manifest; + try { + return getManifestFromZippedApp(appFile); + } catch (error) { + handleInstallError(error as Error); + } }; const install = async () => { @@ -158,6 +161,7 @@ export const useInstallApp = (file: File, url: string): { install: () => void; i handleEnableUnlimitedApps={() => { openExternalLink(manageSubscriptionUrl); setModal(null); + setInstalling(false); }} />, ); diff --git a/apps/meteor/server/settings/accounts.ts b/apps/meteor/server/settings/accounts.ts index a744c47b2a41b..b4da1cd913e9f 100644 --- a/apps/meteor/server/settings/accounts.ts +++ b/apps/meteor/server/settings/accounts.ts @@ -31,6 +31,18 @@ export const createAccountSettings = () => public: true, }); + await this.add('Accounts_twoFactorAuthentication_email_available_for_OAuth_users', true, { + type: 'boolean', + enableQuery: [ + enable2FA, + { + _id: 'Accounts_TwoFactorAuthentication_By_Email_Enabled', + value: true, + }, + ], + public: true, + }); + await this.add('Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In', true, { type: 'boolean', enableQuery: [ diff --git a/apps/meteor/tests/data/livechat/rooms.ts b/apps/meteor/tests/data/livechat/rooms.ts index 9532fd4214ab5..b5d89762c614c 100644 --- a/apps/meteor/tests/data/livechat/rooms.ts +++ b/apps/meteor/tests/data/livechat/rooms.ts @@ -33,10 +33,10 @@ export const createLivechatRoom = async (visitorToken: string, extraRoomParams?: return response.body.room; }; -export const createVisitor = (department?: string, visitorName?: string): Promise => +export const createVisitor = (department?: string, visitorName?: string, customEmail?: string): Promise => new Promise((resolve, reject) => { const token = getRandomVisitorToken(); - const email = `${token}@${token}.com`; + const email = customEmail || `${token}@${token}.com`; const phone = `${Math.floor(Math.random() * 10000000000)}`; void request.get(api(`livechat/visitor/${token}`)).end((err: Error, res: DummyResponse) => { if (!err && res && res.body && res.body.visitor) { diff --git a/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts b/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts index c07f7bcecc816..7ce582025538a 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts @@ -283,6 +283,27 @@ describe('LIVECHAT - Utils', () => { .send({ token: visitor.token, rid: room._id, email: 'visitor@notadomain.com' }); expect(body).to.have.property('success', true); }); + it('should allow a visitor to get a transcript even if token changed by using an old token that matches room.v', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + await closeOmnichannelRoom(room._id); + const visitor2 = await createVisitor(undefined, undefined, visitor.visitorEmails?.[0].address); + const room2 = await createLivechatRoom(visitor2.token); + await closeOmnichannelRoom(room2._id); + + expect(visitor.token !== visitor2.token).to.be.true; + const { body } = await request + .post(api('livechat/transcript')) + .set(credentials) + .send({ token: visitor.token, rid: room._id, email: 'visitor@notadomain.com' }); + expect(body).to.have.property('success', true); + + const { body: body2 } = await request + .post(api('livechat/transcript')) + .set(credentials) + .send({ token: visitor2.token, rid: room2._id, email: 'visitor@notadomain.com' }); + expect(body2).to.have.property('success', true); + }); }); describe('livechat/transcript/:rid', () => { diff --git a/apps/meteor/tests/unit/app/livechat/server/lib/sendTranscript.spec.ts b/apps/meteor/tests/unit/app/livechat/server/lib/sendTranscript.spec.ts index 64da050cfd884..ca39a64c21a9a 100644 --- a/apps/meteor/tests/unit/app/livechat/server/lib/sendTranscript.spec.ts +++ b/apps/meteor/tests/unit/app/livechat/server/lib/sendTranscript.spec.ts @@ -6,9 +6,6 @@ const modelsMock = { LivechatRooms: { findOneById: sinon.stub(), }, - LivechatVisitors: { - getVisitorByToken: sinon.stub(), - }, Messages: { findLivechatClosingMessage: sinon.stub(), findVisibleByRoomIdNotContainingTypesBeforeTs: sinon.stub(), @@ -75,7 +72,6 @@ describe('Send transcript', () => { beforeEach(() => { checkMock.reset(); modelsMock.LivechatRooms.findOneById.reset(); - modelsMock.LivechatVisitors.getVisitorByToken.reset(); modelsMock.Messages.findLivechatClosingMessage.reset(); modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.reset(); modelsMock.Users.findOneById.reset(); @@ -87,11 +83,9 @@ describe('Send transcript', () => { await expect(sendTranscript({})).to.be.rejectedWith(Error); }); it('should throw error when visitor not found', async () => { - modelsMock.LivechatVisitors.getVisitorByToken.resolves(null); await expect(sendTranscript({ rid: 'rid', email: 'email', logger: mockLogger })).to.be.rejectedWith(Error); }); it('should attempt to send an email when params are valid using default subject', async () => { - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'token' } }); modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.resolves([]); tStub.returns('Conversation Transcript'); @@ -117,7 +111,6 @@ describe('Send transcript', () => { ).to.be.true; }); it('should use provided subject', async () => { - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'token' } }); modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.resolves([]); @@ -143,7 +136,6 @@ describe('Send transcript', () => { ).to.be.true; }); it('should use subject from setting (when configured) when no subject provided', async () => { - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'token' } }); modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.resolves([]); mockSettingValues.Livechat_transcript_email_subject = 'A custom subject obtained from setting.get'; @@ -170,36 +162,63 @@ describe('Send transcript', () => { }); it('should fail if room provided is invalid', async () => { modelsMock.LivechatRooms.findOneById.resolves(null); - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); await expect(sendTranscript({ rid: 'rid', email: 'email', logger: mockLogger })).to.be.rejectedWith(Error); }); it('should fail if room provided is of different type', async () => { modelsMock.LivechatRooms.findOneById.resolves({ t: 'c' }); - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); await expect(sendTranscript({ rid: 'rid', email: 'email' })).to.be.rejectedWith(Error); }); it('should fail if room is of valid type, but doesnt doesnt have `v` property', async () => { - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); modelsMock.LivechatRooms.findOneById.resolves({ t: 'l' }); await expect(sendTranscript({ rid: 'rid', email: 'email' })).to.be.rejectedWith(Error); }); it('should fail if room is of valid type, has `v` prop, but it doesnt contain `token`', async () => { - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { otherProp: 'xxx' } }); await expect(sendTranscript({ rid: 'rid', email: 'email' })).to.be.rejectedWith(Error); }); it('should fail if room is of valid type, has `v.token`, but its different from the one on param (room from another visitor)', async () => { - modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'xxx' } }); await expect(sendTranscript({ rid: 'rid', email: 'email', token: 'xveasdf' })).to.be.rejectedWith(Error); }); + + it('should throw an error when token is not the one on room.v', async () => { + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'xxx' } }); + + await expect(sendTranscript({ rid: 'rid', email: 'email', token: 'xveasdf' })).to.be.rejectedWith(Error); + }); + it('should work when token matches room.v', async () => { + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'token-123' } }); + modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.resolves([]); + delete mockSettingValues.Livechat_transcript_email_subject; + tStub.returns('Conversation Transcript'); + + await sendTranscript({ + rid: 'rid', + token: 'token-123', + email: 'email', + user: { _id: 'x', name: 'x', utcOffset: '-6', username: 'x' }, + }); + + expect(getTimezoneMock.calledWith({ _id: 'x', name: 'x', utcOffset: '-6', username: 'x' })).to.be.true; + expect(modelsMock.Messages.findLivechatClosingMessage.calledWith('rid', { projection: { ts: 1 } })).to.be.true; + expect(modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.called).to.be.true; + expect( + mailerMock.calledWith({ + to: 'email', + from: 'test@rocket.chat', + subject: 'Conversation Transcript', + replyTo: 'test@rocket.chat', + html: '

', + }), + ).to.be.true; + }); }); diff --git a/packages/uikit-playground/.eslintignore b/apps/uikit-playground/.eslintignore similarity index 100% rename from packages/uikit-playground/.eslintignore rename to apps/uikit-playground/.eslintignore diff --git a/packages/uikit-playground/.eslintrc.cjs b/apps/uikit-playground/.eslintrc.cjs similarity index 100% rename from packages/uikit-playground/.eslintrc.cjs rename to apps/uikit-playground/.eslintrc.cjs diff --git a/packages/uikit-playground/.gitignore b/apps/uikit-playground/.gitignore similarity index 100% rename from packages/uikit-playground/.gitignore rename to apps/uikit-playground/.gitignore diff --git a/packages/uikit-playground/.prettierrc b/apps/uikit-playground/.prettierrc similarity index 100% rename from packages/uikit-playground/.prettierrc rename to apps/uikit-playground/.prettierrc diff --git a/packages/uikit-playground/CHANGELOG.md b/apps/uikit-playground/CHANGELOG.md similarity index 100% rename from packages/uikit-playground/CHANGELOG.md rename to apps/uikit-playground/CHANGELOG.md diff --git a/packages/uikit-playground/index.html b/apps/uikit-playground/index.html similarity index 100% rename from packages/uikit-playground/index.html rename to apps/uikit-playground/index.html diff --git a/packages/uikit-playground/package.json b/apps/uikit-playground/package.json similarity index 92% rename from packages/uikit-playground/package.json rename to apps/uikit-playground/package.json index d309c2d545994..233e71b719e5d 100644 --- a/packages/uikit-playground/package.json +++ b/apps/uikit-playground/package.json @@ -5,7 +5,8 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc && vite build", + "build-preview": "tsc && vite build", + ".:build-preview-move": "mkdir -p ../../.preview/ && cp -r ./dist ../../.preview/uikit-playground", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview" }, diff --git a/packages/uikit-playground/postcss.config.js b/apps/uikit-playground/postcss.config.js similarity index 100% rename from packages/uikit-playground/postcss.config.js rename to apps/uikit-playground/postcss.config.js diff --git a/packages/uikit-playground/public/vite.svg b/apps/uikit-playground/public/vite.svg similarity index 100% rename from packages/uikit-playground/public/vite.svg rename to apps/uikit-playground/public/vite.svg diff --git a/packages/uikit-playground/src/App.css b/apps/uikit-playground/src/App.css similarity index 100% rename from packages/uikit-playground/src/App.css rename to apps/uikit-playground/src/App.css diff --git a/packages/uikit-playground/src/App.tsx b/apps/uikit-playground/src/App.tsx similarity index 100% rename from packages/uikit-playground/src/App.tsx rename to apps/uikit-playground/src/App.tsx diff --git a/packages/uikit-playground/src/Components/CodeEditor/BlockEditor.tsx b/apps/uikit-playground/src/Components/CodeEditor/BlockEditor.tsx similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/BlockEditor.tsx rename to apps/uikit-playground/src/Components/CodeEditor/BlockEditor.tsx diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/Extensions.ts b/apps/uikit-playground/src/Components/CodeEditor/Extensions/Extensions.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Extensions/Extensions.ts rename to apps/uikit-playground/src/Components/CodeEditor/Extensions/Extensions.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts b/apps/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts rename to apps/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts b/apps/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts rename to apps/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/index.ts b/apps/uikit-playground/src/Components/CodeEditor/Extensions/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Extensions/index.ts rename to apps/uikit-playground/src/Components/CodeEditor/Extensions/index.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/jsonLinter.ts b/apps/uikit-playground/src/Components/CodeEditor/Extensions/jsonLinter.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Extensions/jsonLinter.ts rename to apps/uikit-playground/src/Components/CodeEditor/Extensions/jsonLinter.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/payloadLinter.ts b/apps/uikit-playground/src/Components/CodeEditor/Extensions/payloadLinter.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Extensions/payloadLinter.ts rename to apps/uikit-playground/src/Components/CodeEditor/Extensions/payloadLinter.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts b/apps/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts rename to apps/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Parser/index.ts b/apps/uikit-playground/src/Components/CodeEditor/Parser/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Parser/index.ts rename to apps/uikit-playground/src/Components/CodeEditor/Parser/index.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/Parser/parsePayload.ts b/apps/uikit-playground/src/Components/CodeEditor/Parser/parsePayload.ts similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/Parser/parsePayload.ts rename to apps/uikit-playground/src/Components/CodeEditor/Parser/parsePayload.ts diff --git a/packages/uikit-playground/src/Components/CodeEditor/PreviewEditor.tsx b/apps/uikit-playground/src/Components/CodeEditor/PreviewEditor.tsx similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/PreviewEditor.tsx rename to apps/uikit-playground/src/Components/CodeEditor/PreviewEditor.tsx diff --git a/packages/uikit-playground/src/Components/CodeEditor/index.tsx b/apps/uikit-playground/src/Components/CodeEditor/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/CodeEditor/index.tsx rename to apps/uikit-playground/src/Components/CodeEditor/index.tsx diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx b/apps/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx rename to apps/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx b/apps/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx rename to apps/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx b/apps/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx rename to apps/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/index.tsx b/apps/uikit-playground/src/Components/ComponentSideBar/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ComponentSideBar/index.tsx rename to apps/uikit-playground/src/Components/ComponentSideBar/index.tsx diff --git a/packages/uikit-playground/src/Components/CreateNewScreen/CreateNewScreenContainer.tsx b/apps/uikit-playground/src/Components/CreateNewScreen/CreateNewScreenContainer.tsx similarity index 100% rename from packages/uikit-playground/src/Components/CreateNewScreen/CreateNewScreenContainer.tsx rename to apps/uikit-playground/src/Components/CreateNewScreen/CreateNewScreenContainer.tsx diff --git a/packages/uikit-playground/src/Components/CreateNewScreen/ScreenThumbnail.tsx b/apps/uikit-playground/src/Components/CreateNewScreen/ScreenThumbnail.tsx similarity index 100% rename from packages/uikit-playground/src/Components/CreateNewScreen/ScreenThumbnail.tsx rename to apps/uikit-playground/src/Components/CreateNewScreen/ScreenThumbnail.tsx diff --git a/packages/uikit-playground/src/Components/CreateNewScreen/index.ts b/apps/uikit-playground/src/Components/CreateNewScreen/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/CreateNewScreen/index.ts rename to apps/uikit-playground/src/Components/CreateNewScreen/index.ts diff --git a/packages/uikit-playground/src/Components/Draggable/DraggableList.tsx b/apps/uikit-playground/src/Components/Draggable/DraggableList.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Draggable/DraggableList.tsx rename to apps/uikit-playground/src/Components/Draggable/DraggableList.tsx diff --git a/packages/uikit-playground/src/Components/Draggable/DraggableListItem.tsx b/apps/uikit-playground/src/Components/Draggable/DraggableListItem.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Draggable/DraggableListItem.tsx rename to apps/uikit-playground/src/Components/Draggable/DraggableListItem.tsx diff --git a/packages/uikit-playground/src/Components/DropDown/DropDown.tsx b/apps/uikit-playground/src/Components/DropDown/DropDown.tsx similarity index 100% rename from packages/uikit-playground/src/Components/DropDown/DropDown.tsx rename to apps/uikit-playground/src/Components/DropDown/DropDown.tsx diff --git a/packages/uikit-playground/src/Components/DropDown/Items.tsx b/apps/uikit-playground/src/Components/DropDown/Items.tsx similarity index 100% rename from packages/uikit-playground/src/Components/DropDown/Items.tsx rename to apps/uikit-playground/src/Components/DropDown/Items.tsx diff --git a/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx b/apps/uikit-playground/src/Components/DropDown/ItemsIcon.tsx similarity index 100% rename from packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx rename to apps/uikit-playground/src/Components/DropDown/ItemsIcon.tsx diff --git a/packages/uikit-playground/src/Components/DropDown/index.tsx b/apps/uikit-playground/src/Components/DropDown/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/DropDown/index.tsx rename to apps/uikit-playground/src/Components/DropDown/index.tsx diff --git a/packages/uikit-playground/src/Components/DropDown/itemsStyle.ts b/apps/uikit-playground/src/Components/DropDown/itemsStyle.ts similarity index 100% rename from packages/uikit-playground/src/Components/DropDown/itemsStyle.ts rename to apps/uikit-playground/src/Components/DropDown/itemsStyle.ts diff --git a/packages/uikit-playground/src/Components/DropDown/types.ts b/apps/uikit-playground/src/Components/DropDown/types.ts similarity index 100% rename from packages/uikit-playground/src/Components/DropDown/types.ts rename to apps/uikit-playground/src/Components/DropDown/types.ts diff --git a/packages/uikit-playground/src/Components/FlowContainer/ConnectionLine.tsx b/apps/uikit-playground/src/Components/FlowContainer/ConnectionLine.tsx similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/ConnectionLine.tsx rename to apps/uikit-playground/src/Components/FlowContainer/ConnectionLine.tsx diff --git a/packages/uikit-playground/src/Components/FlowContainer/ControlButtons/ControlButtons.tsx b/apps/uikit-playground/src/Components/FlowContainer/ControlButtons/ControlButtons.tsx similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/ControlButtons/ControlButtons.tsx rename to apps/uikit-playground/src/Components/FlowContainer/ControlButtons/ControlButtons.tsx diff --git a/packages/uikit-playground/src/Components/FlowContainer/ControlButtons/index.ts b/apps/uikit-playground/src/Components/FlowContainer/ControlButtons/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/ControlButtons/index.ts rename to apps/uikit-playground/src/Components/FlowContainer/ControlButtons/index.ts diff --git a/packages/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx b/apps/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx rename to apps/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx diff --git a/packages/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.scss b/apps/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.scss similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.scss rename to apps/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.scss diff --git a/packages/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.tsx b/apps/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.tsx similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.tsx rename to apps/uikit-playground/src/Components/FlowContainer/UIKitWrapper/UIKitWrapper.tsx diff --git a/packages/uikit-playground/src/Components/FlowContainer/UIKitWrapper/index.ts b/apps/uikit-playground/src/Components/FlowContainer/UIKitWrapper/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/UIKitWrapper/index.ts rename to apps/uikit-playground/src/Components/FlowContainer/UIKitWrapper/index.ts diff --git a/packages/uikit-playground/src/Components/FlowContainer/index.ts b/apps/uikit-playground/src/Components/FlowContainer/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/index.ts rename to apps/uikit-playground/src/Components/FlowContainer/index.ts diff --git a/packages/uikit-playground/src/Components/FlowContainer/utils.ts b/apps/uikit-playground/src/Components/FlowContainer/utils.ts similarity index 100% rename from packages/uikit-playground/src/Components/FlowContainer/utils.ts rename to apps/uikit-playground/src/Components/FlowContainer/utils.ts diff --git a/packages/uikit-playground/src/Components/HomeContainer/HomeContainer.tsx b/apps/uikit-playground/src/Components/HomeContainer/HomeContainer.tsx similarity index 100% rename from packages/uikit-playground/src/Components/HomeContainer/HomeContainer.tsx rename to apps/uikit-playground/src/Components/HomeContainer/HomeContainer.tsx diff --git a/packages/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsList.tsx b/apps/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsList.tsx similarity index 100% rename from packages/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsList.tsx rename to apps/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsList.tsx diff --git a/packages/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsThumbnail.tsx b/apps/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsThumbnail.tsx similarity index 100% rename from packages/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsThumbnail.tsx rename to apps/uikit-playground/src/Components/HomeContainer/ProjectsList/ProjectsThumbnail.tsx diff --git a/packages/uikit-playground/src/Components/HomeContainer/ProjectsList/index.ts b/apps/uikit-playground/src/Components/HomeContainer/ProjectsList/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/HomeContainer/ProjectsList/index.ts rename to apps/uikit-playground/src/Components/HomeContainer/ProjectsList/index.ts diff --git a/packages/uikit-playground/src/Components/HomeContainer/index.ts b/apps/uikit-playground/src/Components/HomeContainer/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/HomeContainer/index.ts rename to apps/uikit-playground/src/Components/HomeContainer/index.ts diff --git a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx b/apps/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx rename to apps/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx b/apps/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx rename to apps/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/Wrapper.tsx b/apps/uikit-playground/src/Components/NavBar/BurgerIcon/Wrapper.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/BurgerIcon/Wrapper.tsx rename to apps/uikit-playground/src/Components/NavBar/BurgerIcon/Wrapper.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/index.tsx b/apps/uikit-playground/src/Components/NavBar/BurgerIcon/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/BurgerIcon/index.tsx rename to apps/uikit-playground/src/Components/NavBar/BurgerIcon/index.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/Divider.tsx b/apps/uikit-playground/src/Components/NavBar/Divider.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/Divider.tsx rename to apps/uikit-playground/src/Components/NavBar/Divider.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/Logo.tsx b/apps/uikit-playground/src/Components/NavBar/Logo.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/Logo.tsx rename to apps/uikit-playground/src/Components/NavBar/Logo.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/NavBar.tsx b/apps/uikit-playground/src/Components/NavBar/NavBar.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/NavBar.tsx rename to apps/uikit-playground/src/Components/NavBar/NavBar.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/RightNavBtn.tsx b/apps/uikit-playground/src/Components/NavBar/RightNavBtn.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/RightNavBtn.tsx rename to apps/uikit-playground/src/Components/NavBar/RightNavBtn.tsx diff --git a/packages/uikit-playground/src/Components/NavBar/index.tsx b/apps/uikit-playground/src/Components/NavBar/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/NavBar/index.tsx rename to apps/uikit-playground/src/Components/NavBar/index.tsx diff --git a/packages/uikit-playground/src/Components/PersistStore/PersistStore.tsx b/apps/uikit-playground/src/Components/PersistStore/PersistStore.tsx similarity index 100% rename from packages/uikit-playground/src/Components/PersistStore/PersistStore.tsx rename to apps/uikit-playground/src/Components/PersistStore/PersistStore.tsx diff --git a/packages/uikit-playground/src/Components/PersistStore/index.ts b/apps/uikit-playground/src/Components/PersistStore/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/PersistStore/index.ts rename to apps/uikit-playground/src/Components/PersistStore/index.ts diff --git a/packages/uikit-playground/src/Components/Preview/Display/Display.tsx b/apps/uikit-playground/src/Components/Preview/Display/Display.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Display.tsx rename to apps/uikit-playground/src/Components/Preview/Display/Display.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/BannerSurface.tsx b/apps/uikit-playground/src/Components/Preview/Display/Surface/BannerSurface.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/BannerSurface.tsx rename to apps/uikit-playground/src/Components/Preview/Display/Surface/BannerSurface.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/ContextualBarSurface.tsx b/apps/uikit-playground/src/Components/Preview/Display/Surface/ContextualBarSurface.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/ContextualBarSurface.tsx rename to apps/uikit-playground/src/Components/Preview/Display/Surface/ContextualBarSurface.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/MessageSurface.tsx b/apps/uikit-playground/src/Components/Preview/Display/Surface/MessageSurface.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/MessageSurface.tsx rename to apps/uikit-playground/src/Components/Preview/Display/Surface/MessageSurface.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/ModalSurface.tsx b/apps/uikit-playground/src/Components/Preview/Display/Surface/ModalSurface.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/ModalSurface.tsx rename to apps/uikit-playground/src/Components/Preview/Display/Surface/ModalSurface.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/Reorder.ts b/apps/uikit-playground/src/Components/Preview/Display/Surface/Reorder.ts similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/Reorder.ts rename to apps/uikit-playground/src/Components/Preview/Display/Surface/Reorder.ts diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/Surface.tsx b/apps/uikit-playground/src/Components/Preview/Display/Surface/Surface.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/Surface.tsx rename to apps/uikit-playground/src/Components/Preview/Display/Surface/Surface.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/SurfaceRender.tsx b/apps/uikit-playground/src/Components/Preview/Display/Surface/SurfaceRender.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/SurfaceRender.tsx rename to apps/uikit-playground/src/Components/Preview/Display/Surface/SurfaceRender.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/constant.ts b/apps/uikit-playground/src/Components/Preview/Display/Surface/constant.ts similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/constant.ts rename to apps/uikit-playground/src/Components/Preview/Display/Surface/constant.ts diff --git a/packages/uikit-playground/src/Components/Preview/Display/Surface/index.ts b/apps/uikit-playground/src/Components/Preview/Display/Surface/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/Surface/index.ts rename to apps/uikit-playground/src/Components/Preview/Display/Surface/index.ts diff --git a/packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/DeleteElementBtn.tsx b/apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/DeleteElementBtn.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/DeleteElementBtn.tsx rename to apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/DeleteElementBtn.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.scss b/apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.scss similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.scss rename to apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.scss diff --git a/packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.tsx b/apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.tsx rename to apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/UiKitElementWrapper.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/index.ts b/apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/index.ts rename to apps/uikit-playground/src/Components/Preview/Display/UiKitElementWrapper/index.ts diff --git a/packages/uikit-playground/src/Components/Preview/Display/index.ts b/apps/uikit-playground/src/Components/Preview/Display/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Display/index.ts rename to apps/uikit-playground/src/Components/Preview/Display/index.ts diff --git a/packages/uikit-playground/src/Components/Preview/Editor/ActionBlockEditor.tsx b/apps/uikit-playground/src/Components/Preview/Editor/ActionBlockEditor.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Editor/ActionBlockEditor.tsx rename to apps/uikit-playground/src/Components/Preview/Editor/ActionBlockEditor.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Editor/ActionPreviewEditor.tsx b/apps/uikit-playground/src/Components/Preview/Editor/ActionPreviewEditor.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Editor/ActionPreviewEditor.tsx rename to apps/uikit-playground/src/Components/Preview/Editor/ActionPreviewEditor.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Editor/EditorPanel.tsx b/apps/uikit-playground/src/Components/Preview/Editor/EditorPanel.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Editor/EditorPanel.tsx rename to apps/uikit-playground/src/Components/Preview/Editor/EditorPanel.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Editor/index.tsx b/apps/uikit-playground/src/Components/Preview/Editor/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Editor/index.tsx rename to apps/uikit-playground/src/Components/Preview/Editor/index.tsx diff --git a/packages/uikit-playground/src/Components/Preview/NavPanel/NavPanel.tsx b/apps/uikit-playground/src/Components/Preview/NavPanel/NavPanel.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/NavPanel/NavPanel.tsx rename to apps/uikit-playground/src/Components/Preview/NavPanel/NavPanel.tsx diff --git a/packages/uikit-playground/src/Components/Preview/NavPanel/index.tsx b/apps/uikit-playground/src/Components/Preview/NavPanel/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/NavPanel/index.tsx rename to apps/uikit-playground/src/Components/Preview/NavPanel/index.tsx diff --git a/packages/uikit-playground/src/Components/Preview/Preview.tsx b/apps/uikit-playground/src/Components/Preview/Preview.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Preview.tsx rename to apps/uikit-playground/src/Components/Preview/Preview.tsx diff --git a/packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx b/apps/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx rename to apps/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx diff --git a/packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/index.ts b/apps/uikit-playground/src/Components/Preview/SplitPlaneContainer/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/index.ts rename to apps/uikit-playground/src/Components/Preview/SplitPlaneContainer/index.ts diff --git a/packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/splitPlane.css b/apps/uikit-playground/src/Components/Preview/SplitPlaneContainer/splitPlane.css similarity index 100% rename from packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/splitPlane.css rename to apps/uikit-playground/src/Components/Preview/SplitPlaneContainer/splitPlane.css diff --git a/packages/uikit-playground/src/Components/Preview/Wrapper.tsx b/apps/uikit-playground/src/Components/Preview/Wrapper.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/Wrapper.tsx rename to apps/uikit-playground/src/Components/Preview/Wrapper.tsx diff --git a/packages/uikit-playground/src/Components/Preview/index.tsx b/apps/uikit-playground/src/Components/Preview/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Preview/index.tsx rename to apps/uikit-playground/src/Components/Preview/index.tsx diff --git a/packages/uikit-playground/src/Components/PrototypeRender/PrototypeRender.scss b/apps/uikit-playground/src/Components/PrototypeRender/PrototypeRender.scss similarity index 100% rename from packages/uikit-playground/src/Components/PrototypeRender/PrototypeRender.scss rename to apps/uikit-playground/src/Components/PrototypeRender/PrototypeRender.scss diff --git a/packages/uikit-playground/src/Components/PrototypeRender/PrototypeRender.tsx b/apps/uikit-playground/src/Components/PrototypeRender/PrototypeRender.tsx similarity index 100% rename from packages/uikit-playground/src/Components/PrototypeRender/PrototypeRender.tsx rename to apps/uikit-playground/src/Components/PrototypeRender/PrototypeRender.tsx diff --git a/packages/uikit-playground/src/Components/PrototypeRender/index.ts b/apps/uikit-playground/src/Components/PrototypeRender/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/PrototypeRender/index.ts rename to apps/uikit-playground/src/Components/PrototypeRender/index.ts diff --git a/packages/uikit-playground/src/Components/PtototypeContainer/PrototypeContainer.tsx b/apps/uikit-playground/src/Components/PtototypeContainer/PrototypeContainer.tsx similarity index 100% rename from packages/uikit-playground/src/Components/PtototypeContainer/PrototypeContainer.tsx rename to apps/uikit-playground/src/Components/PtototypeContainer/PrototypeContainer.tsx diff --git a/packages/uikit-playground/src/Components/PtototypeContainer/index.ts b/apps/uikit-playground/src/Components/PtototypeContainer/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/PtototypeContainer/index.ts rename to apps/uikit-playground/src/Components/PtototypeContainer/index.ts diff --git a/packages/uikit-playground/src/Components/RenderPayload/RenderPayload.tsx b/apps/uikit-playground/src/Components/RenderPayload/RenderPayload.tsx similarity index 100% rename from packages/uikit-playground/src/Components/RenderPayload/RenderPayload.tsx rename to apps/uikit-playground/src/Components/RenderPayload/RenderPayload.tsx diff --git a/packages/uikit-playground/src/Components/RenderPayload/intex.ts b/apps/uikit-playground/src/Components/RenderPayload/intex.ts similarity index 100% rename from packages/uikit-playground/src/Components/RenderPayload/intex.ts rename to apps/uikit-playground/src/Components/RenderPayload/intex.ts diff --git a/packages/uikit-playground/src/Components/Routes/HomeLayout.tsx b/apps/uikit-playground/src/Components/Routes/HomeLayout.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Routes/HomeLayout.tsx rename to apps/uikit-playground/src/Components/Routes/HomeLayout.tsx diff --git a/packages/uikit-playground/src/Components/Routes/ProjectSpecificLayout.tsx b/apps/uikit-playground/src/Components/Routes/ProjectSpecificLayout.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Routes/ProjectSpecificLayout.tsx rename to apps/uikit-playground/src/Components/Routes/ProjectSpecificLayout.tsx diff --git a/packages/uikit-playground/src/Components/Routes/ProtectedLayout.tsx b/apps/uikit-playground/src/Components/Routes/ProtectedLayout.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Routes/ProtectedLayout.tsx rename to apps/uikit-playground/src/Components/Routes/ProtectedLayout.tsx diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/CreateNewScreenButton.tsx b/apps/uikit-playground/src/Components/ScreenThumbnail/CreateNewScreenButton.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/CreateNewScreenButton.tsx rename to apps/uikit-playground/src/Components/ScreenThumbnail/CreateNewScreenButton.tsx diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/EditMenu/EditMenu.tsx b/apps/uikit-playground/src/Components/ScreenThumbnail/EditMenu/EditMenu.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/EditMenu/EditMenu.tsx rename to apps/uikit-playground/src/Components/ScreenThumbnail/EditMenu/EditMenu.tsx diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/EditMenu/index.ts b/apps/uikit-playground/src/Components/ScreenThumbnail/EditMenu/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/EditMenu/index.ts rename to apps/uikit-playground/src/Components/ScreenThumbnail/EditMenu/index.ts diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/EditableLabel.tsx b/apps/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/EditableLabel.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/EditableLabel.tsx rename to apps/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/EditableLabel.tsx diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/Editablelabel.scss b/apps/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/Editablelabel.scss similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/Editablelabel.scss rename to apps/uikit-playground/src/Components/ScreenThumbnail/EditableLabel/Editablelabel.scss diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/ScreenThumbnailWrapper.tsx b/apps/uikit-playground/src/Components/ScreenThumbnail/ScreenThumbnailWrapper.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/ScreenThumbnailWrapper.tsx rename to apps/uikit-playground/src/Components/ScreenThumbnail/ScreenThumbnailWrapper.tsx diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.scss b/apps/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.scss similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.scss rename to apps/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.scss diff --git a/packages/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.tsx b/apps/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.tsx rename to apps/uikit-playground/src/Components/ScreenThumbnail/Thumbnail.tsx diff --git a/packages/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx b/apps/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx similarity index 100% rename from packages/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx rename to apps/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx diff --git a/packages/uikit-playground/src/Components/SurfaceSelect/index.ts b/apps/uikit-playground/src/Components/SurfaceSelect/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/SurfaceSelect/index.ts rename to apps/uikit-playground/src/Components/SurfaceSelect/index.ts diff --git a/packages/uikit-playground/src/Components/SurfaceSelect/options.ts b/apps/uikit-playground/src/Components/SurfaceSelect/options.ts similarity index 100% rename from packages/uikit-playground/src/Components/SurfaceSelect/options.ts rename to apps/uikit-playground/src/Components/SurfaceSelect/options.ts diff --git a/packages/uikit-playground/src/Components/Templates/Container/Container.tsx b/apps/uikit-playground/src/Components/Templates/Container/Container.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Templates/Container/Container.tsx rename to apps/uikit-playground/src/Components/Templates/Container/Container.tsx diff --git a/packages/uikit-playground/src/Components/Templates/Container/Payload.tsx b/apps/uikit-playground/src/Components/Templates/Container/Payload.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Templates/Container/Payload.tsx rename to apps/uikit-playground/src/Components/Templates/Container/Payload.tsx diff --git a/packages/uikit-playground/src/Components/Templates/Container/Section.tsx b/apps/uikit-playground/src/Components/Templates/Container/Section.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Templates/Container/Section.tsx rename to apps/uikit-playground/src/Components/Templates/Container/Section.tsx diff --git a/packages/uikit-playground/src/Components/Templates/Container/index.ts b/apps/uikit-playground/src/Components/Templates/Container/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/Templates/Container/index.ts rename to apps/uikit-playground/src/Components/Templates/Container/index.ts diff --git a/packages/uikit-playground/src/Components/Templates/Templates.tsx b/apps/uikit-playground/src/Components/Templates/Templates.tsx similarity index 100% rename from packages/uikit-playground/src/Components/Templates/Templates.tsx rename to apps/uikit-playground/src/Components/Templates/Templates.tsx diff --git a/packages/uikit-playground/src/Components/Templates/index.ts b/apps/uikit-playground/src/Components/Templates/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/Templates/index.ts rename to apps/uikit-playground/src/Components/Templates/index.ts diff --git a/packages/uikit-playground/src/Components/ToggleTabs/index.tsx b/apps/uikit-playground/src/Components/ToggleTabs/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/ToggleTabs/index.tsx rename to apps/uikit-playground/src/Components/ToggleTabs/index.tsx diff --git a/packages/uikit-playground/src/Components/navMenu/Menu/MenuItem.tsx b/apps/uikit-playground/src/Components/navMenu/Menu/MenuItem.tsx similarity index 100% rename from packages/uikit-playground/src/Components/navMenu/Menu/MenuItem.tsx rename to apps/uikit-playground/src/Components/navMenu/Menu/MenuItem.tsx diff --git a/packages/uikit-playground/src/Components/navMenu/Menu/Wrapper.tsx b/apps/uikit-playground/src/Components/navMenu/Menu/Wrapper.tsx similarity index 100% rename from packages/uikit-playground/src/Components/navMenu/Menu/Wrapper.tsx rename to apps/uikit-playground/src/Components/navMenu/Menu/Wrapper.tsx diff --git a/packages/uikit-playground/src/Components/navMenu/Menu/index.tsx b/apps/uikit-playground/src/Components/navMenu/Menu/index.tsx similarity index 100% rename from packages/uikit-playground/src/Components/navMenu/Menu/index.tsx rename to apps/uikit-playground/src/Components/navMenu/Menu/index.tsx diff --git a/packages/uikit-playground/src/Components/navMenu/NavMenu.tsx b/apps/uikit-playground/src/Components/navMenu/NavMenu.tsx similarity index 100% rename from packages/uikit-playground/src/Components/navMenu/NavMenu.tsx rename to apps/uikit-playground/src/Components/navMenu/NavMenu.tsx diff --git a/packages/uikit-playground/src/Components/navMenu/index.ts b/apps/uikit-playground/src/Components/navMenu/index.ts similarity index 100% rename from packages/uikit-playground/src/Components/navMenu/index.ts rename to apps/uikit-playground/src/Components/navMenu/index.ts diff --git a/packages/uikit-playground/src/Context/action/actionPreviewAction.ts b/apps/uikit-playground/src/Context/action/actionPreviewAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/actionPreviewAction.ts rename to apps/uikit-playground/src/Context/action/actionPreviewAction.ts diff --git a/packages/uikit-playground/src/Context/action/activeProjectAction.ts b/apps/uikit-playground/src/Context/action/activeProjectAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/activeProjectAction.ts rename to apps/uikit-playground/src/Context/action/activeProjectAction.ts diff --git a/packages/uikit-playground/src/Context/action/activeScreenAction.ts b/apps/uikit-playground/src/Context/action/activeScreenAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/activeScreenAction.ts rename to apps/uikit-playground/src/Context/action/activeScreenAction.ts diff --git a/packages/uikit-playground/src/Context/action/createNewProjectAction.ts b/apps/uikit-playground/src/Context/action/createNewProjectAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/createNewProjectAction.ts rename to apps/uikit-playground/src/Context/action/createNewProjectAction.ts diff --git a/packages/uikit-playground/src/Context/action/createNewScreenAction.ts b/apps/uikit-playground/src/Context/action/createNewScreenAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/createNewScreenAction.ts rename to apps/uikit-playground/src/Context/action/createNewScreenAction.ts diff --git a/packages/uikit-playground/src/Context/action/deleteProjectAction.ts b/apps/uikit-playground/src/Context/action/deleteProjectAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/deleteProjectAction.ts rename to apps/uikit-playground/src/Context/action/deleteProjectAction.ts diff --git a/packages/uikit-playground/src/Context/action/deleteScreenAction.ts b/apps/uikit-playground/src/Context/action/deleteScreenAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/deleteScreenAction.ts rename to apps/uikit-playground/src/Context/action/deleteScreenAction.ts diff --git a/packages/uikit-playground/src/Context/action/duplicateProjectAction.ts b/apps/uikit-playground/src/Context/action/duplicateProjectAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/duplicateProjectAction.ts rename to apps/uikit-playground/src/Context/action/duplicateProjectAction.ts diff --git a/packages/uikit-playground/src/Context/action/duplicateScreenAction.ts b/apps/uikit-playground/src/Context/action/duplicateScreenAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/duplicateScreenAction.ts rename to apps/uikit-playground/src/Context/action/duplicateScreenAction.ts diff --git a/packages/uikit-playground/src/Context/action/editorTabsToggleAction.ts b/apps/uikit-playground/src/Context/action/editorTabsToggleAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/editorTabsToggleAction.ts rename to apps/uikit-playground/src/Context/action/editorTabsToggleAction.ts diff --git a/packages/uikit-playground/src/Context/action/index.ts b/apps/uikit-playground/src/Context/action/index.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/index.ts rename to apps/uikit-playground/src/Context/action/index.ts diff --git a/packages/uikit-playground/src/Context/action/isMobileAction.ts b/apps/uikit-playground/src/Context/action/isMobileAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/isMobileAction.ts rename to apps/uikit-playground/src/Context/action/isMobileAction.ts diff --git a/packages/uikit-playground/src/Context/action/isTabletAction.ts b/apps/uikit-playground/src/Context/action/isTabletAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/isTabletAction.ts rename to apps/uikit-playground/src/Context/action/isTabletAction.ts diff --git a/packages/uikit-playground/src/Context/action/navMenuToggleAction.ts b/apps/uikit-playground/src/Context/action/navMenuToggleAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/navMenuToggleAction.ts rename to apps/uikit-playground/src/Context/action/navMenuToggleAction.ts diff --git a/packages/uikit-playground/src/Context/action/openCreateNewScreenAction.ts b/apps/uikit-playground/src/Context/action/openCreateNewScreenAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/openCreateNewScreenAction.ts rename to apps/uikit-playground/src/Context/action/openCreateNewScreenAction.ts diff --git a/packages/uikit-playground/src/Context/action/previewTabsToggleAction.ts b/apps/uikit-playground/src/Context/action/previewTabsToggleAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/previewTabsToggleAction.ts rename to apps/uikit-playground/src/Context/action/previewTabsToggleAction.ts diff --git a/packages/uikit-playground/src/Context/action/renameProjectAction.ts b/apps/uikit-playground/src/Context/action/renameProjectAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/renameProjectAction.ts rename to apps/uikit-playground/src/Context/action/renameProjectAction.ts diff --git a/packages/uikit-playground/src/Context/action/renameScreenAction.ts b/apps/uikit-playground/src/Context/action/renameScreenAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/renameScreenAction.ts rename to apps/uikit-playground/src/Context/action/renameScreenAction.ts diff --git a/packages/uikit-playground/src/Context/action/sidebarToggleAction.ts b/apps/uikit-playground/src/Context/action/sidebarToggleAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/sidebarToggleAction.ts rename to apps/uikit-playground/src/Context/action/sidebarToggleAction.ts diff --git a/packages/uikit-playground/src/Context/action/surfaceAction.ts b/apps/uikit-playground/src/Context/action/surfaceAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/surfaceAction.ts rename to apps/uikit-playground/src/Context/action/surfaceAction.ts diff --git a/packages/uikit-playground/src/Context/action/tabsToggleAction.ts b/apps/uikit-playground/src/Context/action/tabsToggleAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/tabsToggleAction.ts rename to apps/uikit-playground/src/Context/action/tabsToggleAction.ts diff --git a/packages/uikit-playground/src/Context/action/templatesToggleAction.ts b/apps/uikit-playground/src/Context/action/templatesToggleAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/templatesToggleAction.ts rename to apps/uikit-playground/src/Context/action/templatesToggleAction.ts diff --git a/packages/uikit-playground/src/Context/action/updateFlowEdgesAction.ts b/apps/uikit-playground/src/Context/action/updateFlowEdgesAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/updateFlowEdgesAction.ts rename to apps/uikit-playground/src/Context/action/updateFlowEdgesAction.ts diff --git a/packages/uikit-playground/src/Context/action/updateNodesAndViewPortAction.ts b/apps/uikit-playground/src/Context/action/updateNodesAndViewPortAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/updateNodesAndViewPortAction.ts rename to apps/uikit-playground/src/Context/action/updateNodesAndViewPortAction.ts diff --git a/packages/uikit-playground/src/Context/action/updatePayloadAction.ts b/apps/uikit-playground/src/Context/action/updatePayloadAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/updatePayloadAction.ts rename to apps/uikit-playground/src/Context/action/updatePayloadAction.ts diff --git a/packages/uikit-playground/src/Context/action/userAction.ts b/apps/uikit-playground/src/Context/action/userAction.ts similarity index 100% rename from packages/uikit-playground/src/Context/action/userAction.ts rename to apps/uikit-playground/src/Context/action/userAction.ts diff --git a/packages/uikit-playground/src/Context/createCtx.tsx b/apps/uikit-playground/src/Context/createCtx.tsx similarity index 100% rename from packages/uikit-playground/src/Context/createCtx.tsx rename to apps/uikit-playground/src/Context/createCtx.tsx diff --git a/packages/uikit-playground/src/Context/index.tsx b/apps/uikit-playground/src/Context/index.tsx similarity index 100% rename from packages/uikit-playground/src/Context/index.tsx rename to apps/uikit-playground/src/Context/index.tsx diff --git a/packages/uikit-playground/src/Context/initialState.ts b/apps/uikit-playground/src/Context/initialState.ts similarity index 100% rename from packages/uikit-playground/src/Context/initialState.ts rename to apps/uikit-playground/src/Context/initialState.ts diff --git a/packages/uikit-playground/src/Context/reducer.ts b/apps/uikit-playground/src/Context/reducer.ts similarity index 100% rename from packages/uikit-playground/src/Context/reducer.ts rename to apps/uikit-playground/src/Context/reducer.ts diff --git a/packages/uikit-playground/src/Pages/FlowDiagram.tsx b/apps/uikit-playground/src/Pages/FlowDiagram.tsx similarity index 100% rename from packages/uikit-playground/src/Pages/FlowDiagram.tsx rename to apps/uikit-playground/src/Pages/FlowDiagram.tsx diff --git a/packages/uikit-playground/src/Pages/Home.tsx b/apps/uikit-playground/src/Pages/Home.tsx similarity index 100% rename from packages/uikit-playground/src/Pages/Home.tsx rename to apps/uikit-playground/src/Pages/Home.tsx diff --git a/packages/uikit-playground/src/Pages/Playground.tsx b/apps/uikit-playground/src/Pages/Playground.tsx similarity index 100% rename from packages/uikit-playground/src/Pages/Playground.tsx rename to apps/uikit-playground/src/Pages/Playground.tsx diff --git a/packages/uikit-playground/src/Pages/Prototype.tsx b/apps/uikit-playground/src/Pages/Prototype.tsx similarity index 100% rename from packages/uikit-playground/src/Pages/Prototype.tsx rename to apps/uikit-playground/src/Pages/Prototype.tsx diff --git a/packages/uikit-playground/src/Pages/SignInSignUp.tsx b/apps/uikit-playground/src/Pages/SignInSignUp.tsx similarity index 100% rename from packages/uikit-playground/src/Pages/SignInSignUp.tsx rename to apps/uikit-playground/src/Pages/SignInSignUp.tsx diff --git a/packages/uikit-playground/src/Payload/action/checkbox.ts b/apps/uikit-playground/src/Payload/action/checkbox.ts similarity index 100% rename from packages/uikit-playground/src/Payload/action/checkbox.ts rename to apps/uikit-playground/src/Payload/action/checkbox.ts diff --git a/packages/uikit-playground/src/Payload/action/radioButton.ts b/apps/uikit-playground/src/Payload/action/radioButton.ts similarity index 100% rename from packages/uikit-playground/src/Payload/action/radioButton.ts rename to apps/uikit-playground/src/Payload/action/radioButton.ts diff --git a/packages/uikit-playground/src/Payload/action/timePicker.ts b/apps/uikit-playground/src/Payload/action/timePicker.ts similarity index 100% rename from packages/uikit-playground/src/Payload/action/timePicker.ts rename to apps/uikit-playground/src/Payload/action/timePicker.ts diff --git a/packages/uikit-playground/src/Payload/action/toggleSwitch.ts b/apps/uikit-playground/src/Payload/action/toggleSwitch.ts similarity index 100% rename from packages/uikit-playground/src/Payload/action/toggleSwitch.ts rename to apps/uikit-playground/src/Payload/action/toggleSwitch.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/BlocksTree.ts b/apps/uikit-playground/src/Payload/actionBlock/BlocksTree.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/BlocksTree.ts rename to apps/uikit-playground/src/Payload/actionBlock/BlocksTree.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/button.ts b/apps/uikit-playground/src/Payload/actionBlock/action/button.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/button.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/button.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/datePicker.ts b/apps/uikit-playground/src/Payload/actionBlock/action/datePicker.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/datePicker.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/datePicker.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/image.ts b/apps/uikit-playground/src/Payload/actionBlock/action/image.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/image.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/image.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/index.ts b/apps/uikit-playground/src/Payload/actionBlock/action/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/index.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/index.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/input.ts b/apps/uikit-playground/src/Payload/actionBlock/action/input.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/input.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/input.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/linearScale.ts b/apps/uikit-playground/src/Payload/actionBlock/action/linearScale.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/linearScale.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/linearScale.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/menu.ts b/apps/uikit-playground/src/Payload/actionBlock/action/menu.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/menu.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/menu.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/action/staticSelect.ts b/apps/uikit-playground/src/Payload/actionBlock/action/staticSelect.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/action/staticSelect.ts rename to apps/uikit-playground/src/Payload/actionBlock/action/staticSelect.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/context/index.ts b/apps/uikit-playground/src/Payload/actionBlock/context/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/context/index.ts rename to apps/uikit-playground/src/Payload/actionBlock/context/index.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/divider/index.ts b/apps/uikit-playground/src/Payload/actionBlock/divider/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/divider/index.ts rename to apps/uikit-playground/src/Payload/actionBlock/divider/index.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/image/index.ts b/apps/uikit-playground/src/Payload/actionBlock/image/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/image/index.ts rename to apps/uikit-playground/src/Payload/actionBlock/image/index.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/input/datePicker.ts b/apps/uikit-playground/src/Payload/actionBlock/input/datePicker.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/input/datePicker.ts rename to apps/uikit-playground/src/Payload/actionBlock/input/datePicker.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/input/index.ts b/apps/uikit-playground/src/Payload/actionBlock/input/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/input/index.ts rename to apps/uikit-playground/src/Payload/actionBlock/input/index.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/input/input.ts b/apps/uikit-playground/src/Payload/actionBlock/input/input.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/input/input.ts rename to apps/uikit-playground/src/Payload/actionBlock/input/input.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/input/linearScale.ts b/apps/uikit-playground/src/Payload/actionBlock/input/linearScale.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/input/linearScale.ts rename to apps/uikit-playground/src/Payload/actionBlock/input/linearScale.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/input/staticSelect.ts b/apps/uikit-playground/src/Payload/actionBlock/input/staticSelect.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/input/staticSelect.ts rename to apps/uikit-playground/src/Payload/actionBlock/input/staticSelect.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/preview/index.ts b/apps/uikit-playground/src/Payload/actionBlock/preview/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/preview/index.ts rename to apps/uikit-playground/src/Payload/actionBlock/preview/index.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/section/button.ts b/apps/uikit-playground/src/Payload/actionBlock/section/button.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/section/button.ts rename to apps/uikit-playground/src/Payload/actionBlock/section/button.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/section/datePicker.ts b/apps/uikit-playground/src/Payload/actionBlock/section/datePicker.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/section/datePicker.ts rename to apps/uikit-playground/src/Payload/actionBlock/section/datePicker.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/section/image.ts b/apps/uikit-playground/src/Payload/actionBlock/section/image.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/section/image.ts rename to apps/uikit-playground/src/Payload/actionBlock/section/image.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/section/index.ts b/apps/uikit-playground/src/Payload/actionBlock/section/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/section/index.ts rename to apps/uikit-playground/src/Payload/actionBlock/section/index.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/section/menu.ts b/apps/uikit-playground/src/Payload/actionBlock/section/menu.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/section/menu.ts rename to apps/uikit-playground/src/Payload/actionBlock/section/menu.ts diff --git a/packages/uikit-playground/src/Payload/actionBlock/section/text.ts b/apps/uikit-playground/src/Payload/actionBlock/section/text.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionBlock/section/text.ts rename to apps/uikit-playground/src/Payload/actionBlock/section/text.ts diff --git a/packages/uikit-playground/src/Payload/actionPreview/container.ts b/apps/uikit-playground/src/Payload/actionPreview/container.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionPreview/container.ts rename to apps/uikit-playground/src/Payload/actionPreview/container.ts diff --git a/packages/uikit-playground/src/Payload/actionPreview/generateActionPreview.ts b/apps/uikit-playground/src/Payload/actionPreview/generateActionPreview.ts similarity index 100% rename from packages/uikit-playground/src/Payload/actionPreview/generateActionPreview.ts rename to apps/uikit-playground/src/Payload/actionPreview/generateActionPreview.ts diff --git a/packages/uikit-playground/src/Payload/callout/index.ts b/apps/uikit-playground/src/Payload/callout/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/callout/index.ts rename to apps/uikit-playground/src/Payload/callout/index.ts diff --git a/packages/uikit-playground/src/Payload/index.ts b/apps/uikit-playground/src/Payload/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/index.ts rename to apps/uikit-playground/src/Payload/index.ts diff --git a/packages/uikit-playground/src/Payload/tabNavigation/disabled.ts b/apps/uikit-playground/src/Payload/tabNavigation/disabled.ts similarity index 100% rename from packages/uikit-playground/src/Payload/tabNavigation/disabled.ts rename to apps/uikit-playground/src/Payload/tabNavigation/disabled.ts diff --git a/packages/uikit-playground/src/Payload/tabNavigation/index.ts b/apps/uikit-playground/src/Payload/tabNavigation/index.ts similarity index 100% rename from packages/uikit-playground/src/Payload/tabNavigation/index.ts rename to apps/uikit-playground/src/Payload/tabNavigation/index.ts diff --git a/packages/uikit-playground/src/Payload/tabNavigation/plain.ts b/apps/uikit-playground/src/Payload/tabNavigation/plain.ts similarity index 100% rename from packages/uikit-playground/src/Payload/tabNavigation/plain.ts rename to apps/uikit-playground/src/Payload/tabNavigation/plain.ts diff --git a/packages/uikit-playground/src/Payload/tabNavigation/selected.ts b/apps/uikit-playground/src/Payload/tabNavigation/selected.ts similarity index 100% rename from packages/uikit-playground/src/Payload/tabNavigation/selected.ts rename to apps/uikit-playground/src/Payload/tabNavigation/selected.ts diff --git a/packages/uikit-playground/src/Routes/Routes.ts b/apps/uikit-playground/src/Routes/Routes.ts similarity index 100% rename from packages/uikit-playground/src/Routes/Routes.ts rename to apps/uikit-playground/src/Routes/Routes.ts diff --git a/packages/uikit-playground/src/_global.css b/apps/uikit-playground/src/_global.css similarity index 100% rename from packages/uikit-playground/src/_global.css rename to apps/uikit-playground/src/_global.css diff --git a/packages/uikit-playground/src/cssVariables.css b/apps/uikit-playground/src/cssVariables.css similarity index 100% rename from packages/uikit-playground/src/cssVariables.css rename to apps/uikit-playground/src/cssVariables.css diff --git a/packages/uikit-playground/src/hooks/useAuth.tsx b/apps/uikit-playground/src/hooks/useAuth.tsx similarity index 100% rename from packages/uikit-playground/src/hooks/useAuth.tsx rename to apps/uikit-playground/src/hooks/useAuth.tsx diff --git a/packages/uikit-playground/src/hooks/useCodeMirror.ts b/apps/uikit-playground/src/hooks/useCodeMirror.ts similarity index 100% rename from packages/uikit-playground/src/hooks/useCodeMirror.ts rename to apps/uikit-playground/src/hooks/useCodeMirror.ts diff --git a/packages/uikit-playground/src/hooks/useFormatCodeMirrorValue.ts b/apps/uikit-playground/src/hooks/useFormatCodeMirrorValue.ts similarity index 100% rename from packages/uikit-playground/src/hooks/useFormatCodeMirrorValue.ts rename to apps/uikit-playground/src/hooks/useFormatCodeMirrorValue.ts diff --git a/packages/uikit-playground/src/hooks/useHorizontalScroll.ts b/apps/uikit-playground/src/hooks/useHorizontalScroll.ts similarity index 100% rename from packages/uikit-playground/src/hooks/useHorizontalScroll.ts rename to apps/uikit-playground/src/hooks/useHorizontalScroll.ts diff --git a/packages/uikit-playground/src/hooks/useNodesAndEdges.ts b/apps/uikit-playground/src/hooks/useNodesAndEdges.ts similarity index 100% rename from packages/uikit-playground/src/hooks/useNodesAndEdges.ts rename to apps/uikit-playground/src/hooks/useNodesAndEdges.ts diff --git a/packages/uikit-playground/src/index.css b/apps/uikit-playground/src/index.css similarity index 100% rename from packages/uikit-playground/src/index.css rename to apps/uikit-playground/src/index.css diff --git a/packages/uikit-playground/src/logo.svg b/apps/uikit-playground/src/logo.svg similarity index 100% rename from packages/uikit-playground/src/logo.svg rename to apps/uikit-playground/src/logo.svg diff --git a/packages/uikit-playground/src/main.tsx b/apps/uikit-playground/src/main.tsx similarity index 100% rename from packages/uikit-playground/src/main.tsx rename to apps/uikit-playground/src/main.tsx diff --git a/packages/uikit-playground/src/module.d.ts b/apps/uikit-playground/src/module.d.ts similarity index 100% rename from packages/uikit-playground/src/module.d.ts rename to apps/uikit-playground/src/module.d.ts diff --git a/packages/uikit-playground/src/utils/codePrettier.ts b/apps/uikit-playground/src/utils/codePrettier.ts similarity index 100% rename from packages/uikit-playground/src/utils/codePrettier.ts rename to apps/uikit-playground/src/utils/codePrettier.ts diff --git a/packages/uikit-playground/src/utils/filterEdges.ts b/apps/uikit-playground/src/utils/filterEdges.ts similarity index 100% rename from packages/uikit-playground/src/utils/filterEdges.ts rename to apps/uikit-playground/src/utils/filterEdges.ts diff --git a/packages/uikit-playground/src/utils/formatDate.ts b/apps/uikit-playground/src/utils/formatDate.ts similarity index 100% rename from packages/uikit-playground/src/utils/formatDate.ts rename to apps/uikit-playground/src/utils/formatDate.ts diff --git a/packages/uikit-playground/src/utils/getDate.ts b/apps/uikit-playground/src/utils/getDate.ts similarity index 100% rename from packages/uikit-playground/src/utils/getDate.ts rename to apps/uikit-playground/src/utils/getDate.ts diff --git a/packages/uikit-playground/src/utils/getUniqueId.ts b/apps/uikit-playground/src/utils/getUniqueId.ts similarity index 100% rename from packages/uikit-playground/src/utils/getUniqueId.ts rename to apps/uikit-playground/src/utils/getUniqueId.ts diff --git a/packages/uikit-playground/src/utils/intendCode.ts b/apps/uikit-playground/src/utils/intendCode.ts similarity index 100% rename from packages/uikit-playground/src/utils/intendCode.ts rename to apps/uikit-playground/src/utils/intendCode.ts diff --git a/packages/uikit-playground/src/utils/persistStore.ts b/apps/uikit-playground/src/utils/persistStore.ts similarity index 100% rename from packages/uikit-playground/src/utils/persistStore.ts rename to apps/uikit-playground/src/utils/persistStore.ts diff --git a/packages/uikit-playground/src/utils/templates.ts b/apps/uikit-playground/src/utils/templates.ts similarity index 100% rename from packages/uikit-playground/src/utils/templates.ts rename to apps/uikit-playground/src/utils/templates.ts diff --git a/packages/uikit-playground/src/utils/uiKitRenderer.ts b/apps/uikit-playground/src/utils/uiKitRenderer.ts similarity index 100% rename from packages/uikit-playground/src/utils/uiKitRenderer.ts rename to apps/uikit-playground/src/utils/uiKitRenderer.ts diff --git a/packages/uikit-playground/src/vite-env.d.ts b/apps/uikit-playground/src/vite-env.d.ts similarity index 100% rename from packages/uikit-playground/src/vite-env.d.ts rename to apps/uikit-playground/src/vite-env.d.ts diff --git a/packages/uikit-playground/tsconfig.json b/apps/uikit-playground/tsconfig.json similarity index 100% rename from packages/uikit-playground/tsconfig.json rename to apps/uikit-playground/tsconfig.json diff --git a/packages/uikit-playground/vite.config.ts b/apps/uikit-playground/vite.config.ts similarity index 95% rename from packages/uikit-playground/vite.config.ts rename to apps/uikit-playground/vite.config.ts index a18e01b590e88..61a5ab30e6479 100644 --- a/packages/uikit-playground/vite.config.ts +++ b/apps/uikit-playground/vite.config.ts @@ -3,7 +3,7 @@ import react from '@vitejs/plugin-react'; // https://vitejs.dev/config/ export default defineConfig(() => ({ - logLevel: 'info', + base: './', esbuild: {}, plugins: [react()], optimizeDeps: { diff --git a/packages/core-typings/src/IUser.ts b/packages/core-typings/src/IUser.ts index fa411c6f7e47a..d6854bef72436 100644 --- a/packages/core-typings/src/IUser.ts +++ b/packages/core-typings/src/IUser.ts @@ -45,7 +45,35 @@ export type ILoginUsername = }; export type LoginUsername = string | ILoginUsername; -export interface IUserServices { +export interface IOAuthUserServices { + google?: any; + facebook?: any; + github?: any; + linkedin?: any; + twitter?: any; + gitlab?: any; + saml?: { + inResponseTo?: string; + provider?: string; + idp?: string; + idpSession?: string; + nameID?: string; + }; + ldap?: { + id: string; + idAttribute?: string; + }; + nextcloud?: { + accessToken: string; + refreshToken: string; + serverURL: string; + }; + dolphin?: { + NickName?: string; + }; +} + +export interface IUserServices extends IOAuthUserServices { password?: { exists?: boolean; bcrypt?: string; @@ -62,12 +90,6 @@ export interface IUserServices { refreshToken: string; expiresAt: Date; }; - google?: any; - facebook?: any; - github?: any; - linkedin?: any; - twitter?: any; - gitlab?: any; totp?: { enabled: boolean; hashedBackup: string[]; @@ -79,27 +101,37 @@ export interface IUserServices { changedAt: Date; }; emailCode?: IUserEmailCode; - saml?: { - inResponseTo?: string; - provider?: string; - idp?: string; - idpSession?: string; - nameID?: string; - }; - ldap?: { - id: string; - idAttribute?: string; - }; - nextcloud?: { - accessToken: string; - refreshToken: string; - serverURL: string; - }; - dolphin?: { - NickName?: string; - }; } +type IUserService = keyof IUserServices; +type IOAuthService = keyof IOAuthUserServices; + +const defaultOAuthKeys = [ + 'google', + 'dolphin', + 'facebook', + 'github', + 'gitlab', + 'google', + 'ldap', + 'linkedin', + 'nextcloud', + 'saml', + 'twitter', +] as IOAuthService[]; +const userServiceKeys = ['emailCode', 'email2fa', 'totp', 'resume', 'password', 'passwordHistory', 'cloud', 'email'] as IUserService[]; + +export const isUserServiceKey = (key: string): key is IUserService => + userServiceKeys.includes(key as IUserService) || defaultOAuthKeys.includes(key as IOAuthService); + +export const isDefaultOAuthUser = (user: IUser): boolean => + !!user.services && Object.keys(user.services).some((key) => defaultOAuthKeys.includes(key as IOAuthService)); + +export const isCustomOAuthUser = (user: IUser): boolean => + !!user.services && Object.keys(user.services).some((key) => !isUserServiceKey(key)); + +export const isOAuthUser = (user: IUser): boolean => isDefaultOAuthUser(user) || isCustomOAuthUser(user); + export interface IUserEmail { address: string; verified?: boolean; @@ -183,6 +215,7 @@ export interface IUser extends IRocketChatRecord { _pendingAvatarUrl?: string; requirePasswordChange?: boolean; requirePasswordChangeReason?: string; + isOAuthUser?: boolean; // client only field } export interface IRegisterUser extends IUser { diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json index d3324c6e749a9..849582f934b7e 100644 --- a/packages/i18n/src/locales/en.i18n.json +++ b/packages/i18n/src/locales/en.i18n.json @@ -282,6 +282,8 @@ "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Time to expire the code sent via email in seconds", "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Enable Two Factor Authentication via Email", "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Users with email verified and the option enabled in their profile page will receive an email with a temporary code to authorize certain actions like login, save the profile, etc.", + "Accounts_twoFactorAuthentication_email_available_for_OAuth_users": "Make two factor via email available for oAuth users", + "Accounts_twoFactorAuthentication_email_available_for_OAuth_users_Description": "People that use oAuth will receive an email with a temporary code to authorize actions like login, save profile, etc.", "Accounts_TwoFactorAuthentication_Enabled": "Enable Two Factor Authentication", "Accounts_TwoFactorAuthentication_Enabled_Description": "If deactivated, this setting will deactivate all Two Factor Authentication. \nTo force users to use Two Factor Authentication, the admin has to configure the 'user' role to enforce it.", "Accounts_TwoFactorAuthentication_Enforce_Password_Fallback": "Enforce password fallback", @@ -1798,7 +1800,7 @@ "Markdown_SupportSchemesForLink_Description": "Comma-separated list of allowed schemes", "E2E_enable": "Enable E2E", "E2E_disable": "Disable E2E", - "E2E_Enable_alert": "This feature is currently in beta! Please report bugs to github.com/RocketChat/Rocket.Chat/issues and be aware of:
- Encrypted messages of encrypted rooms will not be found by search operations.
- The mobile apps may not support the encrypted messages (they are implementing it).
- Bots may not be able to see encrypted messages until they implement support for it.
- Uploads will not be encrypted in this version.", + "E2E_Enable_alert": "This feature is currently in beta! Please report bugs to github.com/RocketChat/Rocket.Chat/issues and be aware of:
- Encrypted messages of encrypted rooms will not be found by search operations.
- Bots may not be able to see encrypted messages until they implement support for it.", "E2E_Enable_description": "Enable option to create encrypted groups and be able to change groups and direct messages to be encrypted", "E2E_Enabled": "E2E Enabled", "E2E_Enabled_Default_DirectRooms": "Enable encryption for Direct Rooms by default", diff --git a/packages/message-parser/src/grammar.pegjs b/packages/message-parser/src/grammar.pegjs index 182653a9c6640..a6cae97facbfa 100644 --- a/packages/message-parser/src/grammar.pegjs +++ b/packages/message-parser/src/grammar.pegjs @@ -10,6 +10,7 @@ emoji, emojiUnicode, emoticon, + extractFirstResult, heading, image, inlineCode, @@ -33,6 +34,11 @@ unorderedList, timestamp, } = require('./utils'); + +let skipBold = false; +let skipItalic = false; +let skipStrikethrough = false; +let skipReferences = false; }} Start @@ -212,7 +218,7 @@ Inline = value:(InlineItem / Any)+ EndOfLine? { return reducePlainTexts(value); InlineItem = Whitespace / Timestamp - / References + / MaybeReferences / AutolinkedPhone / AutolinkedEmail / AutolinkedURL @@ -240,7 +246,7 @@ References = "[" title:LinkTitle* "](" href:LinkRef ")" { return title.length ? link(href, reducePlainTexts(title)) : link(href); } / "<" href:LinkRef "|" title:LinkTitle2 ">" { return link(href, [plain(title)]); } -LinkTitle = (Whitespace / EmphasisForReferences) / anyTitle:$(!("](" .) .) { return plain(anyTitle) } +LinkTitle = (Whitespace / Emphasis) / anyTitle:$(!("](" .) .) { return plain(anyTitle) } LinkTitle2 = $([\x20-\x3B\x3D\x3F-\x60\x61-\x7B\x7D-\xFF] / NonASCII)+ @@ -349,14 +355,7 @@ AutoLinkURLBody = !(Extra* (Whitespace / EndOfLine)) . * Emphasis * */ -Emphasis = Bold / Italic / Strikethrough - -/** - * - * Emphasis for References - * -*/ -EmphasisForReferences = BoldForReferences / ItalicForReferences / StrikethroughForReferences +Emphasis = MaybeBold / MaybeItalic / MaybeStrikethrough /** * @@ -365,6 +364,63 @@ EmphasisForReferences = BoldForReferences / ItalicForReferences / StrikethroughF * */ +// This rule is used inside expressions that have a JS code ensuring they always fail, +// Without any pattern to match, peggy will think the rule may end up succedding without consuming any input, which could cause infinite loops +// So this unreachable rule is added to them to satisfy peggy's requirement. +BlockedByJavascript = 'unreachable' + +MaybeBold + = result:( + & { + if (skipBold) { return false; } + skipBold = true; + return true; + } + ( + (text:Bold { skipBold = false; return text; }) + / (& { skipBold = false; return false; } BlockedByJavascript) + ) + ) { return extractFirstResult(result); } + +MaybeStrikethrough + = result:( + & { + if (skipStrikethrough) { return false; } + skipStrikethrough = true; + return true; + } + ( + (text:Strikethrough { skipStrikethrough = false; return text; }) + / (& { skipStrikethrough = false; return false; } BlockedByJavascript) + ) + ) { return extractFirstResult(result); } + +MaybeItalic + = result:( + & { + if (skipItalic) { return false; } + skipItalic = true; + return true; + } + ( + (text:Italic { skipItalic = false; return text; }) + / (& { skipItalic = false; return false; } BlockedByJavascript) + ) + ) { return extractFirstResult(result); } + +MaybeReferences + = result:( + & { + if (skipReferences) { return false; } + skipReferences = true; + return true; + } + ( + (text:References { skipReferences = false; return text; }) + / (& { skipReferences = false; return false; } BlockedByJavascript) + ) + ) { return extractFirstResult(result); } + /* Italic */ Italic = value:$([a-zA-Z0-9]+ [\x5F] [\x5F]?) { return plain(value); } @@ -384,11 +440,11 @@ ItalicContentItems = text:ItalicContentItem+ { return reducePlainTexts(text); } ItalicContentItem = Whitespace / InlineCode - / References + / MaybeReferences / UserMention / ChannelMention - / Bold - / Strikethrough + / MaybeBold + / MaybeStrikethrough / Emoji / Emoticon / AnyItalic @@ -399,52 +455,12 @@ Bold = [\x2A] [\x2A] @BoldContent [\x2A] [\x2A] / [\x2A] @BoldContent [\x2A] BoldContent = text:BoldContentItem+ { return bold(reducePlainTexts(text)); } -BoldContentItem = Whitespace / InlineCode / References / UserMention / ChannelMention / Italic / Strikethrough / Emoji / Emoticon / AnyBold / Line +BoldContentItem = Whitespace / InlineCode / MaybeReferences / UserMention / ChannelMention / MaybeItalic / MaybeStrikethrough / Emoji / Emoticon / AnyBold / Line /* Strike */ Strikethrough = [\x7E] [\x7E] @StrikethroughContent [\x7E] [\x7E] / [\x7E] @StrikethroughContent [\x7E] -StrikethroughContent = text:(Timestamp / InlineCode / Whitespace / References / UserMention / ChannelMention / Italic / Bold / Emoji / Emoticon / AnyStrike / Line)+ { - return strike(reducePlainTexts(text)); - } - -/* Italic for References */ -ItalicForReferences - = value:$([a-zA-Z0-9]+ [\x5F] [\x5F]?) { return plain(value); } - / [\x5F] [\x5F] i:ItalicContentItemsForReferences [\x5F] [\x5F] t:$[a-zA-Z0-9]+ { - return reducePlainTexts([plain('__'), ...i, plain('__'), plain(t)])[0]; - } - / [\x5F] i:ItalicContentItemsForReferences [\x5F] t:$[a-zA-Z]+ { - return reducePlainTexts([plain('_'), ...i, plain('_'), plain(t)])[0]; - } - / [\x5F] [\x5F] @ItalicContentForReferences [\x5F] [\x5F] - / [\x5F] @ItalicContentForReferences [\x5F] - -ItalicContentForReferences = text:ItalicContentItemsForReferences { return italic(text); } - -ItalicContentItemsForReferences = text:ItalicContentItemForReferences+ { return reducePlainTexts(text); } - -ItalicContentItemForReferences - = Whitespace - / UserMention - / ChannelMention - / BoldForReferences - / StrikethroughForReferences - / Emoji - / Emoticon - / AnyItalic - / Line - / InlineCode - -/* Bold for References */ -BoldForReferences = [\x2A] [\x2A] @BoldContentForReferences [\x2A] [\x2A] / [\x2A] @BoldContentForReferences [\x2A] - -BoldContentForReferences = text:(Whitespace / UserMention / ChannelMention / ItalicForReferences / StrikethroughForReferences / Emoji / Emoticon / AnyBold / Line / InlineCode)+ { return bold(reducePlainTexts(text)); } - -/* Strike for References */ -StrikethroughForReferences = [\x7E] [\x7E] @StrikethroughContentForReferences [\x7E] [\x7E] / [\x7E] @StrikethroughContentForReferences [\x7E] - -StrikethroughContentForReferences = text:(Whitespace / UserMention / ChannelMention / ItalicForReferences / BoldForReferences / Emoji / Emoticon / AnyStrike / Line / InlineCode)+ { +StrikethroughContent = text:(Timestamp / Whitespace / InlineCode / MaybeReferences / UserMention / ChannelMention / MaybeItalic / MaybeBold / Emoji / Emoticon / AnyStrike / Line)+ { return strike(reducePlainTexts(text)); } diff --git a/packages/message-parser/src/utils.ts b/packages/message-parser/src/utils.ts index 1f684b56d6ed9..6c5d605c5c7ac 100644 --- a/packages/message-parser/src/utils.ts +++ b/packages/message-parser/src/utils.ts @@ -198,21 +198,19 @@ const joinEmoji = ( export const reducePlainTexts = ( values: Paragraph['value'] ): Paragraph['value'] => - values - .flatMap((item) => item) - .reduce((result, item, index, values) => { - const next = values[index + 1]; - const current = joinEmoji(item, values[index - 1], next); - const previous: Inlines = result[result.length - 1]; - - if (previous) { - if (current.type === 'PLAIN_TEXT' && current.type === previous.type) { - previous.value += current.value; - return result; - } + values.flat().reduce((result, item, index, values) => { + const next = values[index + 1]; + const current = joinEmoji(item, values[index - 1], next); + const previous: Inlines = result[result.length - 1]; + + if (previous) { + if (current.type === 'PLAIN_TEXT' && current.type === previous.type) { + previous.value += current.value; + return result; } - return [...result, current]; - }, [] as Paragraph['value']); + } + return [...result, current]; + }, [] as Paragraph['value']); export const lineBreak = (): LineBreak => ({ type: 'LINE_BREAK', value: undefined, @@ -249,3 +247,13 @@ export const timestamp = ( fallback: plain(``), }; }; + +export const extractFirstResult = ( + value: Types[keyof Types]['value'] +): Types[keyof Types]['value'] => { + if (typeof value !== 'object' || !Array.isArray(value)) { + return value; + } + + return value.filter((item) => item).shift() as Types[keyof Types]['value']; +}; diff --git a/packages/message-parser/tests/abuse.test.ts b/packages/message-parser/tests/abuse.test.ts new file mode 100644 index 0000000000000..c280ee75b4a03 --- /dev/null +++ b/packages/message-parser/tests/abuse.test.ts @@ -0,0 +1,268 @@ +import { parse } from '../src'; +import { paragraph, plain, bold, italic, strike } from '../src/utils'; + +test.each([ + [ + `This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. , REPEATx2 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. REPEAT x3 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. REPEAT x4 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. REPEATx 5 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. , REPEAT x6 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. this can go long for some time, repeat x7 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. ,repeat x8 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some.`, + [ + paragraph([ + plain( + 'This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&' + ), + bold([ + plain('()'), + italic([ + plain( + `+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok` + ), + strike([ + plain( + `, from now on we repeat some. , REPEATx2 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok` + ), + ]), + plain( + ', from now on we repeat some. REPEAT x3 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()' + ), + ]), + plain( + `+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok` + ), + strike([ + plain( + ', from now on we repeat some. REPEAT x4 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()' + ), + italic([ + plain( + `+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. REPEATx 5 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()` + ), + ]), + plain( + `+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok` + ), + ]), + plain( + `, from now on we repeat some. , REPEAT x6 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&` + ), + ]), + plain( + `()_+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok` + ), + strike([ + plain( + `, from now on we repeat some. this can go long for some time, repeat x7 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()` + ), + italic([ + plain( + `+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok~, from now on we repeat some. ,repeat x8 This a message designed to stress test the message parser, trying to force several rules to stack at the same time !!@#$%^&*()` + ), + ]), + plain( + `+, overloading the symbols {}:"|<>?, some more text ,./;'\\[], numbers too 1234567890-= let it call s o s ok` + ), + ]), + plain(', from now on we repeat some.'), + ]), + ], + ], + [ + '**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__**_**__', + [ + paragraph([ + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + italic([bold([plain('_')])]), + bold([italic([plain('**')]), italic([plain('**')])]), + plain('__'), + ]), + ], + ], +])('parses %p', (input, output) => { + expect(parse(input)).toMatchObject(output); +}); diff --git a/packages/message-parser/tests/emphasis.test.ts b/packages/message-parser/tests/emphasis.test.ts index e8e72a5882f1a..b035999204ce5 100644 --- a/packages/message-parser/tests/emphasis.test.ts +++ b/packages/message-parser/tests/emphasis.test.ts @@ -185,6 +185,68 @@ test.each([ ]), ], ], + [ + '**bold ~~and strike~~** **not bold ~~but strike** ~~ not strike~~', + [ + paragraph([ + bold([plain('bold '), strike([plain('and strike')])]), + plain(' **not bold '), + strike([plain('but strike** ')]), + plain(' not strike~~'), + ]), + ], + ], + [ + '**bold** **another bold** ~~strike~~ ~~another strike~~ **bold ~~and strike~~** **not bold ~~but strike** ~~ not strike~~', + [ + paragraph([ + bold([plain('bold')]), + plain(' '), + bold([plain('another bold')]), + plain(' '), + strike([plain('strike')]), + plain(' '), + strike([plain('another strike')]), + plain(' '), + bold([plain('bold '), strike([plain('and strike')])]), + plain(' **not bold '), + strike([plain('but strike** ')]), + plain(' not strike~~'), + ]), + ], + ], + [ + 'some_snake_case_text and even_more', + [paragraph([plain('some_snake_case_text and even_more')])], + ], + [ + 'some_snake_case_text and some __italic__ text', + [ + paragraph([ + plain('some_snake_case_text and some '), + italic([plain('italic')]), + plain(' text'), + ]), + ], + ], + [ + 'some__double__snake__case__text and even_more', + [paragraph([plain('some__double__snake__case__text and even_more')])], + ], + [ + 'some__double__snake__case__text and some __italic__ text', + [ + paragraph([ + plain('some__double__snake__case__text and some '), + italic([plain('italic')]), + plain(' text'), + ]), + ], + ], + [ + 'something__ __and italic__', + [paragraph([plain('something__ '), italic([plain('and italic')])])], + ], ])('parses %p', (input, output) => { expect(parse(input)).toMatchObject(output); }); diff --git a/packages/message-parser/tests/link.test.ts b/packages/message-parser/tests/link.test.ts index 1e083fde5d70d..fcf371474bf21 100644 --- a/packages/message-parser/tests/link.test.ts +++ b/packages/message-parser/tests/link.test.ts @@ -584,6 +584,30 @@ Text after line break`, ]), ], ], + [ + '[test **bold** and __italic__](https://rocket.chat)', + [ + paragraph([ + link('https://rocket.chat', [ + plain('test '), + bold([plain('bold')]), + plain(' and '), + italic([plain('italic')]), + ]), + ]), + ], + ], + [ + '[test **bold with __italic__**](https://rocket.chat)', + [ + paragraph([ + link('https://rocket.chat', [ + plain('test '), + bold([plain('bold with '), italic([plain('italic')])]), + ]), + ]), + ], + ], ])('parses %p', (input, output) => { expect(parse(input)).toMatchObject(output); }); diff --git a/packages/password-policies/tsconfig.json b/packages/password-policies/tsconfig.json index f0a66c843c50e..e2be47cf5499f 100644 --- a/packages/password-policies/tsconfig.json +++ b/packages/password-policies/tsconfig.json @@ -2,8 +2,7 @@ "extends": "../../tsconfig.base.client.json", "compilerOptions": { "rootDir": "./src", - "outDir": "./dist", - "module": "commonjs" + "outDir": "./dist" }, "include": ["./src/**/*"] } diff --git a/turbo.json b/turbo.json index 7ce868eb37070..0ae903f9250d4 100644 --- a/turbo.json +++ b/turbo.json @@ -2,6 +2,14 @@ "$schema": "https://turborepo.org/schema.json", "globalDependencies": ["tsconfig.base.json", "tsconfig.base.server.json", "tsconfig.base.client.json"], "tasks": { + "build-preview": { + "dependsOn": ["^build"], + "outputs": ["storybook-static/**", ".storybook/**", "dist/**"] + }, + ".:build-preview-move": { + "dependsOn": ["^build-preview"], + "cache": false + }, "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] diff --git a/yarn.lock b/yarn.lock index 9197fbb0b63a0..aa2b104e51908 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10455,9 +10455,9 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/uikit-playground@workspace:packages/uikit-playground": +"@rocket.chat/uikit-playground@workspace:apps/uikit-playground": version: 0.0.0-use.local - resolution: "@rocket.chat/uikit-playground@workspace:packages/uikit-playground" + resolution: "@rocket.chat/uikit-playground@workspace:apps/uikit-playground" dependencies: "@codemirror/lang-javascript": ^6.1.9 "@codemirror/lang-json": ^6.0.1