From ec69e8041ff57778e72a5709d923ccff77dadbd8 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Fri, 8 Sep 2023 00:15:21 +0530 Subject: [PATCH] chore: enable vaults if dev mode or if user has role (#2483) --- ...core-npm-1.28.0-e07c009747-9ee58eea35.zip} | Bin 69057 -> 70990 bytes packages/api/package.json | 2 +- packages/desktop/package.json | 2 +- packages/encryption/package.json | 2 +- packages/features/package.json | 2 +- .../Domain/Feature/NativeFeatureIdentifier.ts | 2 ++ .../src/Domain/Lists/ServerFeatures.ts | 6 +++++ .../src/Domain/Permission/PermissionName.ts | 1 + packages/models/package.json | 2 +- packages/services/package.json | 2 +- packages/snjs/package.json | 2 +- packages/ui-services/package.json | 2 +- .../Dependencies/WebDependencies.ts | 1 + .../ContentListView/ListItemVaultInfo.tsx | 3 +-- .../FileContextMenu/FileMenuOptions.tsx | 5 ++-- .../Footer/VaultSelectionButton.tsx | 3 +-- .../NoteView/CollaborationInfoHUD.tsx | 5 ++-- .../Components/NotesOptions/NotesOptions.tsx | 5 ++-- .../PasswordWizard/PasswordWizard.tsx | 3 +-- .../PreferencesSessionController.ts | 4 +-- .../Components/Tags/Navigation.tsx | 3 +-- .../Components/Tags/TagContextMenu.tsx | 3 +-- .../Vaults/AddToVaultMenuOption.tsx | 4 +-- .../Controllers/FeaturesController.ts | 10 ++++++++ .../Controllers/LinkingController.spec.ts | 4 +++ .../Controllers/LinkingController.tsx | 5 ++-- yarn.lock | 24 +++++++++--------- 27 files changed, 64 insertions(+), 43 deletions(-) rename .yarn/cache/{@standardnotes-domain-core-npm-1.25.0-51a2ed924b-f99196f620.zip => @standardnotes-domain-core-npm-1.28.0-e07c009747-9ee58eea35.zip} (77%) diff --git a/.yarn/cache/@standardnotes-domain-core-npm-1.25.0-51a2ed924b-f99196f620.zip b/.yarn/cache/@standardnotes-domain-core-npm-1.28.0-e07c009747-9ee58eea35.zip similarity index 77% rename from .yarn/cache/@standardnotes-domain-core-npm-1.25.0-51a2ed924b-f99196f620.zip rename to .yarn/cache/@standardnotes-domain-core-npm-1.28.0-e07c009747-9ee58eea35.zip index aa20e6ae09b3503d0c171c33a5edbd804270a89f..8de0cca17bcb1cd7e6ee235d7512a6bea14316a7 100644 GIT binary patch delta 6163 zcmZ8l2|SeD_n+snkHKWiGA|)ZmO*xkvc}j&B$Tb}OWBtR5lP{uX|rWZk}aWR4^h@q z$Pz`eCXsCa$Gr6Z`pJg+&b=Yd$#?e;)r<_F?wdY`qA(>&ob=K03!~N@f=z$WQw8dH&gEs+o_xKrkQ>0- zS!og-C~y0^vq^;DqUeFvQKvw+31oCqxw2}8b6{EuT6u|vcYe|48|%v)Kwn^Gj9L}p zGKdnopeyl@)9Ln4_PBTI1nT~Ax(jKCDy*xdBjrV6hYx<4bze*&o$*cCzcyrgmw4&G zZ^@X&+aD>kdtOE^J(Mm#t31rCPAPMqiRwqk!D@nhj}L!aB|sV}4!&DU?Z-b(*NHG87#c%QGBk;jcEwp$wu zYAiD)l4_dr0}~pdIRUB$Or<5$clx7 zQK)9zT;nlIVgJos)wp8A`PTQ1`F!B=m9^}iFa001Slrx*`?)F0o8|q*Sknu#GC8uP z;di4~niX4xmCV{@Gwc;u2ZiFbzC`g06ouG}$(%!5UJ*~BZ)~@#W^k&G zPFM$0RT^Ug1tlvAM$w{_H{3qql&7O7FFujKhE#+ckT#USp4}^__hZJ((gH zEoCcrtDY(Wmc0>MAuf8Q510zf+Uhf|uM8iq5il$fJnd-AD%5d*uqEA?!&Y68^<(BR zbVrSDCV-2v3!p}&wJ}A{Y;{>$=%lZ@=KkoUX?wjL}k@XHtVvp z5_-${cywWF@nwN02P%T*4fmuyI&#du{tTrNMODP6>5DAD^`@5!1m-@9`A zps>A+?-{QnDY7?SMG^(i|W%2u6xRvmf4kprO^kXWM{66Vm^-|Op+rz}ClzPPy zJY!-B;x3+0$WiSF9(hSqt_?(P^}_)#lcgWOa-1&zVUOjC(%AUmGS|mR zOloh-hs#6{^KIEPic;&Ek+K&&U;mv9(!Q ze1^^8;6xdAwRZ>Ka{Y>rD4KludNt(J7el*+$m;@1TT-O~FO(L2yVYcuoL{+^l>eC6}Z47*F#`*gtN@Z5yQYhW7OUK6@@~* zLR`iI__!S+%~C;J+wKyUc+{v-3KKoQ!DeAtDC;z?*F@)|nZZ|S!6(gcEcnvDIX8bR zwdmmLiHKxxs-OM}!B)tz&;3%hyTPNLW)%T0kEk`RoXG_FDmz5O`8l0b{(}mn%|vX3N-!fN^f4QR}lVXeUGpy zeSVzH#yu0u zPWyDiKv|a^vfi}`H?WU62~^csfv&|NU{k|TcJ0Cf1)cXbbI}Wk?Y;qTPc?A*77dvH z#y~6w^GHdPGQ8yn9Uq$}=37#|fdgU` zL`B@iWu=EsolF7a(wOWaabu=a6f~1>wZhj&+btd4RZZjxM<4b&DHo1PN#Mr6_ZMvv=J{(Q54Q(31J z#>-U%`wq<;+lGg1>|fj@ZzLM=WfV|W*aLLE5AEy+x-2bN2t#))Ja6;|vQ;MFP0V59 zpewgDHf-fYY?$mjTaS6=Y(c>o_LKT`(W*DN99`VoALVHEP?HjgMR>RQ0lJ`M*~!

Y@WW4OF?NN0(lGPdn;@kIr)Tv3==68}-2l8i=u* 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 delta 5095 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.FilesController), this.get(Web_TYPES.SubscriptionController), this.get(Web_TYPES.NavigationController), + this.get(Web_TYPES.FeaturesController), this.get(Web_TYPES.ItemGroupController), this.get(Web_TYPES.VaultDisplayService), application.preferences, diff --git a/packages/web/src/javascripts/Components/ContentListView/ListItemVaultInfo.tsx b/packages/web/src/javascripts/Components/ContentListView/ListItemVaultInfo.tsx index 953cb25af..a5402281a 100644 --- a/packages/web/src/javascripts/Components/ContentListView/ListItemVaultInfo.tsx +++ b/packages/web/src/javascripts/Components/ContentListView/ListItemVaultInfo.tsx @@ -3,7 +3,6 @@ import { useApplication } from '../ApplicationProvider' import Icon from '../Icon/Icon' import { DecryptedItemInterface, classNames } from '@standardnotes/snjs' import VaultNameBadge from '../Vaults/VaultNameBadge' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' type Props = { item: DecryptedItemInterface @@ -13,7 +12,7 @@ type Props = { const ListItemVaultInfo: FunctionComponent = ({ item, className }) => { const application = useApplication() - if (!featureTrunkVaultsEnabled()) { + if (!application.featuresController.isEntitledToVaults()) { return null } diff --git a/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx b/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx index 5cfc99053..23b59caba 100644 --- a/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx +++ b/packages/web/src/javascripts/Components/FileContextMenu/FileMenuOptions.tsx @@ -14,7 +14,6 @@ import AddTagOption from '../NotesOptions/AddTagOption' import { MenuItemIconSize } from '@/Constants/TailwindClassNames' import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption' import { iconClass } from '../NotesOptions/ClassNames' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' import { useApplication } from '../ApplicationProvider' type Props = { @@ -87,7 +86,9 @@ const FileMenuOptions: FunctionComponent = ({ ) : null} )} - {featureTrunkVaultsEnabled() && } + {application.featuresController.isEntitledToVaults() && ( + + )} { @@ -16,7 +15,7 @@ const VaultSelectionButton = ({ isMobileNavigation = false }: { isMobileNavigati const [isOpen, setIsOpen] = useState(false) const toggleMenu = () => setIsOpen(!isOpen) - if (!featureTrunkVaultsEnabled()) { + if (!application.featuresController.isEntitledToVaults()) { return null } diff --git a/packages/web/src/javascripts/Components/NoteView/CollaborationInfoHUD.tsx b/packages/web/src/javascripts/Components/NoteView/CollaborationInfoHUD.tsx index c59d0ec0b..57df63d86 100644 --- a/packages/web/src/javascripts/Components/NoteView/CollaborationInfoHUD.tsx +++ b/packages/web/src/javascripts/Components/NoteView/CollaborationInfoHUD.tsx @@ -2,7 +2,6 @@ import { FunctionComponent } from 'react' import Icon from '../Icon/Icon' import { useApplication } from '../ApplicationProvider' import { DecryptedItemInterface } from '@standardnotes/snjs' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' import VaultNameBadge from '../Vaults/VaultNameBadge' type Props = { @@ -12,7 +11,7 @@ type Props = { const CollaborationInfoHUD: FunctionComponent = ({ item }) => { const application = useApplication() - if (!featureTrunkVaultsEnabled()) { + if (!application.featuresController.isEntitledToVaults()) { return null } @@ -32,7 +31,7 @@ const CollaborationInfoHUD: FunctionComponent = ({ item }) => { {lastEditedBy && ( -

+
{lastEditedBy?.name}
diff --git a/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx b/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx index f3dddd96b..04f4d5e7c 100644 --- a/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx +++ b/packages/web/src/javascripts/Components/NotesOptions/NotesOptions.tsx @@ -41,7 +41,6 @@ import SuperExportModal from './SuperExportModal' import { useApplication } from '../ApplicationProvider' import { MutuallyExclusiveMediaQueryBreakpoints } from '@/Hooks/useMediaQuery' import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' import Menu from '../Menu/Menu' import Popover from '../Popover/Popover' @@ -267,7 +266,9 @@ const NotesOptions = ({ notes, closeMenu }: NotesOptionsProps) => { )} - {featureTrunkVaultsEnabled() && } + {application.featuresController.isEntitledToVaults() && ( + + )} {application.navigationController.tagsCount > 0 && ( { continueTitle: DEFAULT_CONTINUE_TITLE, } - if (featureTrunkVaultsEnabled()) { + if (props.application.featuresController.isEntitledToVaults()) { this.state = { ...baseState, lockContinue: true, diff --git a/packages/web/src/javascripts/Components/Preferences/Controller/PreferencesSessionController.ts b/packages/web/src/javascripts/Components/Preferences/Controller/PreferencesSessionController.ts index e53b4863d..3b0f43fc7 100644 --- a/packages/web/src/javascripts/Components/Preferences/Controller/PreferencesSessionController.ts +++ b/packages/web/src/javascripts/Components/Preferences/Controller/PreferencesSessionController.ts @@ -4,7 +4,7 @@ import { PackageProvider } from '../Panes/General/Advanced/Packages/Provider/Pac import { securityPrefsHasBubble } from '../Panes/Security/securityPrefsHasBubble' import { PreferencePaneId, StatusServiceEvent } from '@standardnotes/services' import { isDesktopApplication } from '@/Utils' -import { featureTrunkHomeServerEnabled, featureTrunkVaultsEnabled } from '@/FeatureTrunk' +import { featureTrunkHomeServerEnabled } from '@/FeatureTrunk' import { PreferencesMenuItem } from './PreferencesMenuItem' import { SelectableMenuItem } from './SelectableMenuItem' import { PREFERENCES_MENU_ITEMS, READY_PREFERENCES_MENU_ITEMS } from './MenuItems' @@ -26,7 +26,7 @@ export class PreferencesSessionController { ? PREFERENCES_MENU_ITEMS.slice() : READY_PREFERENCES_MENU_ITEMS.slice() - if (featureTrunkVaultsEnabled()) { + if (application.featuresController.isEntitledToVaults()) { menuItems.push({ id: 'vaults', label: 'Vaults', icon: 'safe-square', order: 5 }) } diff --git a/packages/web/src/javascripts/Components/Tags/Navigation.tsx b/packages/web/src/javascripts/Components/Tags/Navigation.tsx index 922b61cc7..fbb79ccb5 100644 --- a/packages/web/src/javascripts/Components/Tags/Navigation.tsx +++ b/packages/web/src/javascripts/Components/Tags/Navigation.tsx @@ -14,7 +14,6 @@ import { PaneLayout } from '@/Controllers/PaneController/PaneLayout' import { usePaneSwipeGesture } from '../Panes/usePaneGesture' import { mergeRefs } from '@/Hooks/mergeRefs' import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' import QuickSettingsButton from '../Footer/QuickSettingsButton' import VaultSelectionButton from '../Footer/VaultSelectionButton' @@ -131,7 +130,7 @@ const Navigation = forwardRef(({ application, className, icon="tune" /> - {featureTrunkVaultsEnabled() && } + {application.featuresController.isEntitledToVaults() && }
{children} diff --git a/packages/web/src/javascripts/Components/Tags/TagContextMenu.tsx b/packages/web/src/javascripts/Components/Tags/TagContextMenu.tsx index 872346a4b..b045aacc7 100644 --- a/packages/web/src/javascripts/Components/Tags/TagContextMenu.tsx +++ b/packages/web/src/javascripts/Components/Tags/TagContextMenu.tsx @@ -12,7 +12,6 @@ import { PremiumFeatureIconClass, PremiumFeatureIconName } from '../Icon/Premium import Popover from '../Popover/Popover' import IconPicker from '../Icon/IconPicker' import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' import { useApplication } from '../ApplicationProvider' type ContextMenuProps = { @@ -82,7 +81,7 @@ const TagContextMenu = ({ navigationController, isEntitledToFolders, selectedTag iconGridClassName="max-h-30" /> - {featureTrunkVaultsEnabled() && ( + {application.featuresController.isEntitledToVaults() && ( )} diff --git a/packages/web/src/javascripts/Components/Vaults/AddToVaultMenuOption.tsx b/packages/web/src/javascripts/Components/Vaults/AddToVaultMenuOption.tsx index 9a911188a..a6284808d 100644 --- a/packages/web/src/javascripts/Components/Vaults/AddToVaultMenuOption.tsx +++ b/packages/web/src/javascripts/Components/Vaults/AddToVaultMenuOption.tsx @@ -7,7 +7,6 @@ import { classNames, DecryptedItemInterface, VaultListingInterface } from '@stan import { useApplication } from '../ApplicationProvider' import MenuItem from '../Menu/MenuItem' import Menu from '../Menu/Menu' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' const VaultMenu = observer(({ items }: { items: DecryptedItemInterface[] }) => { const application = useApplication() @@ -107,6 +106,7 @@ const VaultMenu = observer(({ items }: { items: DecryptedItemInterface[] }) => { }) const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string; items: DecryptedItemInterface[] }) => { + const application = useApplication() const buttonRef = useRef(null) const [isSubMenuOpen, setIsSubMenuOpen] = useState(false) @@ -115,7 +115,7 @@ const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string; setIsSubMenuOpen((isOpen) => !isOpen) }, []) - if (!featureTrunkVaultsEnabled()) { + if (!application.featuresController.isEntitledToVaults()) { return null } diff --git a/packages/web/src/javascripts/Controllers/FeaturesController.ts b/packages/web/src/javascripts/Controllers/FeaturesController.ts index 6675bb040..8b23759b8 100644 --- a/packages/web/src/javascripts/Controllers/FeaturesController.ts +++ b/packages/web/src/javascripts/Controllers/FeaturesController.ts @@ -12,6 +12,7 @@ import { import { action, makeObservable, observable, runInAction, when } from 'mobx' import { AbstractViewController } from './Abstract/AbstractViewController' import { CrossControllerEvent } from './CrossControllerEvent' +import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' export class FeaturesController extends AbstractViewController implements InternalEventHandlerInterface { hasFolders: boolean @@ -128,4 +129,13 @@ export class FeaturesController extends AbstractViewController implements Intern return status === FeatureStatus.Entitled } + + isEntitledToVaults(): boolean { + const status = this.features.getFeatureStatus( + NativeFeatureIdentifier.create(NativeFeatureIdentifier.TYPES.SharedVaults).getValue(), + ) + const isEntitledToFeature = status === FeatureStatus.Entitled + + return featureTrunkVaultsEnabled() || isEntitledToFeature + } } diff --git a/packages/web/src/javascripts/Controllers/LinkingController.spec.ts b/packages/web/src/javascripts/Controllers/LinkingController.spec.ts index a4b339761..6d2c5ddbf 100644 --- a/packages/web/src/javascripts/Controllers/LinkingController.spec.ts +++ b/packages/web/src/javascripts/Controllers/LinkingController.spec.ts @@ -22,6 +22,7 @@ import { LinkingController } from './LinkingController' import { NavigationController } from './Navigation/NavigationController' import { SubscriptionController } from './Subscription/SubscriptionController' import { getLinkingSearchResults } from '@/Utils/Items/Search/getSearchResults' +import { FeaturesController } from './FeaturesController' const createNote = (name: string, options?: Partial) => { return { @@ -63,11 +64,13 @@ describe('LinkingController', () => { itemListController: {} as jest.Mocked, filesController: {} as jest.Mocked, subscriptionController: {} as jest.Mocked, + featuresController: {} as jest.Mocked, } as unknown as jest.Mocked application.getPreference = jest.fn() application.addSingleEventObserver = jest.fn() application.sync.sync = jest.fn() + application.featuresController.isEntitledToVaults = jest.fn().mockReturnValue(true) Object.defineProperty(application, 'items', { value: {} as jest.Mocked }) @@ -81,6 +84,7 @@ describe('LinkingController', () => { application.filesController, application.subscriptionController, application.navigationController, + application.featuresController, application.itemControllerGroup, application.vaultDisplayService, application.preferences, diff --git a/packages/web/src/javascripts/Controllers/LinkingController.tsx b/packages/web/src/javascripts/Controllers/LinkingController.tsx index 2ca063e91..7eba1d9d7 100644 --- a/packages/web/src/javascripts/Controllers/LinkingController.tsx +++ b/packages/web/src/javascripts/Controllers/LinkingController.tsx @@ -32,9 +32,9 @@ import { FilesController } from './FilesController' import { ItemListController } from './ItemList/ItemListController' import { NavigationController } from './Navigation/NavigationController' import { SubscriptionController } from './Subscription/SubscriptionController' -import { featureTrunkVaultsEnabled } from '@/FeatureTrunk' import { ItemGroupController } from '@/Components/NoteView/Controller/ItemGroupController' import { VaultDisplayServiceInterface } from '@standardnotes/ui-services' +import { FeaturesController } from './FeaturesController' export class LinkingController extends AbstractViewController implements InternalEventHandlerInterface { shouldLinkToParentFolders: boolean @@ -45,6 +45,7 @@ export class LinkingController extends AbstractViewController implements Interna private filesController: FilesController, private subscriptionController: SubscriptionController, private navigationController: NavigationController, + private featuresController: FeaturesController, private itemControllerGroup: ItemGroupController, private vaultDisplayService: VaultDisplayServiceInterface, private preferences: PreferenceServiceInterface, @@ -207,7 +208,7 @@ export class LinkingController extends AbstractViewController implements Interna const linkNoteAndFile = async (note: SNNote, file: FileItem) => { const updatedFile = await this.mutator.associateFileWithNote(file, note) - if (featureTrunkVaultsEnabled()) { + if (this.featuresController.isEntitledToVaults()) { if (updatedFile) { const noteVault = this.vaults.getItemVault(note) const fileVault = this.vaults.getItemVault(updatedFile) diff --git a/yarn.lock b/yarn.lock index 6f2bd5b12..7a5c81b13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4138,7 +4138,7 @@ __metadata: resolution: "@standardnotes/api@workspace:packages/api" dependencies: "@standardnotes/common": ^1.50.0 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@standardnotes/models": "workspace:*" "@standardnotes/responses": "workspace:*" "@standardnotes/utils": "workspace:*" @@ -4288,7 +4288,7 @@ __metadata: "@babel/core": "*" "@babel/preset-env": "*" "@electron/remote": ^2.0.9 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@standardnotes/electron-clear-data": 1.1.1 "@standardnotes/web": "workspace:*" "@types/fs-extra": ^11.0.1 @@ -4340,12 +4340,12 @@ __metadata: languageName: node linkType: hard -"@standardnotes/domain-core@npm:^1.25.0": - version: 1.25.0 - resolution: "@standardnotes/domain-core@npm:1.25.0" +"@standardnotes/domain-core@npm:^1.28.0": + version: 1.28.0 + resolution: "@standardnotes/domain-core@npm:1.28.0" dependencies: uuid: ^9.0.0 - checksum: f99196f6209a05a50e84371d3a59cf870937a5589f4ba4caab0f2eb17c2cfa733142b18ca8788016c81ca609d1f5a0461e51bcf159a67d631e249a04a5568244 + checksum: 9ee58eea35ed5d988513c5a24f751b9c3a2be2a324c30684db54ecbd16f0c8e19a80b8e464bde46e86905590085923c7e1abbe1b792a4ef0a19c1171e8f3b6c2 languageName: node linkType: hard @@ -4392,7 +4392,7 @@ __metadata: dependencies: "@standardnotes/common": ^1.50.0 "@standardnotes/config": 2.4.3 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@standardnotes/models": "workspace:*" "@standardnotes/responses": "workspace:*" "@standardnotes/sncrypto-common": "workspace:*" @@ -4427,7 +4427,7 @@ __metadata: resolution: "@standardnotes/features@workspace:packages/features" dependencies: "@standardnotes/common": ^1.50.0 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@types/jest": ^29.2.3 "@typescript-eslint/eslint-plugin": "*" eslint: "*" @@ -4633,7 +4633,7 @@ __metadata: resolution: "@standardnotes/models@workspace:packages/models" dependencies: "@standardnotes/common": ^1.50.0 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@standardnotes/features": "workspace:*" "@standardnotes/responses": "workspace:*" "@standardnotes/sncrypto-common": "workspace:^" @@ -4729,7 +4729,7 @@ __metadata: dependencies: "@standardnotes/api": "workspace:^" "@standardnotes/common": ^1.50.0 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@standardnotes/encryption": "workspace:^" "@standardnotes/features": "workspace:^" "@standardnotes/files": "workspace:^" @@ -4828,7 +4828,7 @@ __metadata: "@babel/preset-env": "*" "@standardnotes/api": "workspace:*" "@standardnotes/common": ^1.50.0 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@standardnotes/domain-events": ^2.122.0 "@standardnotes/encryption": "workspace:*" "@standardnotes/features": "workspace:*" @@ -4953,7 +4953,7 @@ __metadata: resolution: "@standardnotes/ui-services@workspace:packages/ui-services" dependencies: "@standardnotes/common": ^1.50.0 - "@standardnotes/domain-core": ^1.25.0 + "@standardnotes/domain-core": ^1.28.0 "@standardnotes/features": "workspace:^" "@standardnotes/filepicker": "workspace:^" "@standardnotes/models": "workspace:^"