diff --git a/.changeset/four-cherries-kneel.md b/.changeset/four-cherries-kneel.md new file mode 100644 index 000000000000..095d5af0aa76 --- /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 000000000000..ee57330ffc86 --- /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 000000000000..d38150970310 --- /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 000000000000..4c3565e75523 --- /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 000000000000..18b4b0bef373 --- /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 4e6e4bb29da9..dbad2c29a22c 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 6bee52f55927..b2827ee3fb89 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 000000000000..5c3574f0b395 --- /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 123df96ee264..d947c1b30c2e 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 1fbe658e5682..b05157416e31 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 dd4da47bff05..8348b8429e4e 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 74032121ee50..bc7c06e0eaae 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 000000000000..5e2a3bf2b4d7 --- /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 03d0cae77ab9..293eb8607342 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 536ba8a04ef7..06619f0618f5 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 c890dc61e658..3654d17b5dec 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 f10d3e989e0a..3b784e24c375 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 a744c47b2a41..b4da1cd913e9 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 9532fd4214ab..b5d89762c614 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 c07f7bcecc81..7ce582025538 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 64da050cfd88..ca39a64c21a9 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 d309c2d54599..233e71b719e5 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 a18e01b590e8..61a5ab30e647 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 fa411c6f7e47..d6854bef7243 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 d3324c6e749a..849582f934b7 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 182653a9c664..a6cae97facbf 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 1f684b56d6ed..6c5d605c5c7a 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 000000000000..c280ee75b4a0 --- /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 e8e72a5882f1..b035999204ce 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 1e083fde5d70..fcf371474bf2 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 f0a66c843c50..e2be47cf5499 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 7ce868eb3707..0ae903f9250d 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 9197fbb0b63a..aa2b104e5190 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