@metamask-previews/notification-services-controller 18.1.0-preview-bc6087f6 → 18.2.0-preview-622f3f09

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,8 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [18.2.0]
11
+
10
12
  ### Added
11
13
 
14
+ - Add max bound version segmentation for feature announcements ([#6773](https://github.com/MetaMask/core/pull/6773))
15
+ - Add `extensionMaximumVersionNumber` and `mobileMaximumVersionNumber` properties to feature announcements
12
16
  - Add optional `platformVersion` property to `NotificationServicesController` `FeatureAnnouncementEnv` type ([#6568](https://github.com/MetaMask/core/pull/6568))
13
17
  - Filtering logic to filter feature annonucements by version number ([#6568](https://github.com/MetaMask/core/pull/6568))
14
18
  - Add package `semver@^7.7.2` to handle semver version comparisons for announcement notification filtering ([#6568](https://github.com/MetaMask/core/pull/6568))
@@ -561,7 +565,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
561
565
 
562
566
  - Initial release
563
567
 
564
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@18.1.0...HEAD
568
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@18.2.0...HEAD
569
+ [18.2.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@18.1.0...@metamask/notification-services-controller@18.2.0
565
570
  [18.1.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@18.0.0...@metamask/notification-services-controller@18.1.0
566
571
  [18.0.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@17.0.0...@metamask/notification-services-controller@18.0.0
567
572
  [17.0.0]: https://github.com/MetaMask/core/compare/@metamask/notification-services-controller@16.0.0...@metamask/notification-services-controller@17.0.0
@@ -85,24 +85,46 @@ const fetchFeatureAnnouncementNotifications = async (env, previewToken) => {
85
85
  },
86
86
  extensionMinimumVersionNumber: fields.extensionMinimumVersionNumber,
87
87
  mobileMinimumVersionNumber: fields.mobileMinimumVersionNumber,
88
+ extensionMaximumVersionNumber: fields.extensionMaximumVersionNumber,
89
+ mobileMaximumVersionNumber: fields.mobileMaximumVersionNumber,
88
90
  },
89
91
  };
90
92
  return notification;
91
93
  });
92
- const versionKey = {
93
- extension: 'extensionMinimumVersionNumber',
94
- mobile: 'mobileMinimumVersionNumber',
94
+ const versionKeys = {
95
+ extension: {
96
+ min: 'extensionMinimumVersionNumber',
97
+ max: 'extensionMaximumVersionNumber',
98
+ },
99
+ mobile: {
100
+ min: 'mobileMinimumVersionNumber',
101
+ max: 'mobileMaximumVersionNumber',
102
+ },
95
103
  };
96
104
  const filteredRawNotifications = rawNotifications.filter((n) => {
97
- const notificationVersion = n.data?.[versionKey[env.platform]];
98
- if (!env.platformVersion || !notificationVersion) {
105
+ const minVersion = n.data?.[versionKeys[env.platform].min];
106
+ const maxVersion = n.data?.[versionKeys[env.platform].max];
107
+ // If no platform version is provided, show all notifications
108
+ if (!env.platformVersion) {
99
109
  return true;
100
110
  }
111
+ // min/max filtering
101
112
  try {
102
- return (0, semver_1.gte)(env.platformVersion, notificationVersion);
113
+ let showNotification = true;
114
+ // Check minimum version: current version must be greater than minimum
115
+ if (minVersion) {
116
+ showNotification =
117
+ showNotification && (0, semver_1.gt)(env.platformVersion, minVersion);
118
+ }
119
+ // Check maximum version: current version must be less than maximum
120
+ if (maxVersion) {
121
+ showNotification =
122
+ showNotification && (0, semver_1.lt)(env.platformVersion, maxVersion);
123
+ }
124
+ return showNotification;
103
125
  }
104
126
  catch {
105
- // something went wrong filtering, do not show notif
127
+ // something went wrong filtering, do not show notification
106
128
  return false;
107
129
  }
108
130
  });
@@ -1 +1 @@
1
- {"version":3,"file":"feature-announcements.cjs","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"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","sourcesContent":["import { documentToHtmlString } from '@contentful/rich-text-html-renderer';\nimport type { Entry, Asset, EntryCollection } from 'contentful';\nimport { gte } from 'semver';\n\nimport { TRIGGER_TYPES } from '../constants/notification-schema';\nimport { processFeatureAnnouncement } from '../processors/process-feature-announcement';\nimport type { FeatureAnnouncementRawNotification } from '../types/feature-announcement/feature-announcement';\nimport type {\n ImageFields,\n TypeFeatureAnnouncement,\n} from '../types/feature-announcement/type-feature-announcement';\nimport type {\n TypeExternalLinkFields,\n TypePortfolioLinkFields,\n TypeExtensionLinkFields,\n TypeMobileLinkFields,\n} from '../types/feature-announcement/type-links';\nimport type { INotification } from '../types/notification/notification';\n\nconst DEFAULT_SPACE_ID = ':space_id';\nconst DEFAULT_ACCESS_TOKEN = ':access_token';\nconst DEFAULT_CLIENT_ID = ':client_id';\nconst DEFAULT_DOMAIN = 'cdn.contentful.com';\nconst PREVIEW_DOMAIN = 'preview.contentful.com';\nexport const FEATURE_ANNOUNCEMENT_API = `https://${DEFAULT_DOMAIN}/spaces/${DEFAULT_SPACE_ID}/environments/master/entries`;\nexport const FEATURE_ANNOUNCEMENT_URL = `${FEATURE_ANNOUNCEMENT_API}?access_token=${DEFAULT_ACCESS_TOKEN}&content_type=productAnnouncement&include=10&fields.clients[in]=${DEFAULT_CLIENT_ID}`;\n\ntype Env = {\n spaceId: string;\n accessToken: string;\n platform: 'extension' | 'mobile';\n platformVersion?: string;\n};\n\n/**\n * Contentful API Response Shape\n */\nexport type ContentfulResult = {\n includes?: {\n Entry?: Entry[];\n Asset?: Asset[];\n };\n items?: TypeFeatureAnnouncement[];\n};\n\nexport const getFeatureAnnouncementUrl = (env: Env, previewToken?: string) => {\n const domain = previewToken ? PREVIEW_DOMAIN : DEFAULT_DOMAIN;\n const replacedUrl = FEATURE_ANNOUNCEMENT_URL.replace(\n DEFAULT_SPACE_ID,\n env.spaceId,\n )\n .replace(DEFAULT_ACCESS_TOKEN, previewToken || env.accessToken)\n .replace(DEFAULT_CLIENT_ID, env.platform)\n .replace(DEFAULT_DOMAIN, domain);\n return encodeURI(replacedUrl);\n};\n\nconst fetchFeatureAnnouncementNotifications = async (\n env: Env,\n previewToken?: string,\n): Promise<FeatureAnnouncementRawNotification[]> => {\n const url = getFeatureAnnouncementUrl(env, previewToken);\n\n const data = await fetch(url)\n .then((r) => r.json())\n .catch(() => null);\n\n if (!data) {\n return [];\n }\n\n const findIncludedItem = (sysId: string) => {\n const typedData: EntryCollection<\n | ImageFields\n | TypeExtensionLinkFields\n | TypePortfolioLinkFields\n | TypeMobileLinkFields\n | TypeExternalLinkFields\n > = data;\n const item =\n typedData?.includes?.Entry?.find((i: Entry) => i?.sys?.id === sysId) ||\n typedData?.includes?.Asset?.find((i: Asset) => i?.sys?.id === sysId);\n return item ? item?.fields : null;\n };\n\n const contentfulNotifications = data?.items ?? [];\n const rawNotifications: FeatureAnnouncementRawNotification[] =\n contentfulNotifications.map((n: TypeFeatureAnnouncement) => {\n const { fields } = n;\n const imageFields = fields.image\n ? (findIncludedItem(fields.image.sys.id) as ImageFields['fields'])\n : undefined;\n\n const externalLinkFields = fields.externalLink\n ? (findIncludedItem(\n fields.externalLink.sys.id,\n ) as TypeExternalLinkFields['fields'])\n : undefined;\n const portfolioLinkFields = fields.portfolioLink\n ? (findIncludedItem(\n fields.portfolioLink.sys.id,\n ) as TypePortfolioLinkFields['fields'])\n : undefined;\n const extensionLinkFields = fields.extensionLink\n ? (findIncludedItem(\n fields.extensionLink.sys.id,\n ) as TypeExtensionLinkFields['fields'])\n : undefined;\n const mobileLinkFields = fields.mobileLink\n ? (findIncludedItem(\n fields.mobileLink.sys.id,\n ) as TypeMobileLinkFields['fields'])\n : undefined;\n\n const notification: FeatureAnnouncementRawNotification = {\n type: TRIGGER_TYPES.FEATURES_ANNOUNCEMENT,\n createdAt: new Date(n.sys.createdAt).toString(),\n data: {\n id: fields.id,\n category: fields.category,\n title: fields.title,\n longDescription: documentToHtmlString(fields.longDescription),\n shortDescription: fields.shortDescription,\n image: {\n title: imageFields?.title,\n description: imageFields?.description,\n url: imageFields?.file?.url ?? '',\n },\n externalLink: externalLinkFields && {\n externalLinkText: externalLinkFields?.externalLinkText,\n externalLinkUrl: externalLinkFields?.externalLinkUrl,\n },\n portfolioLink: portfolioLinkFields && {\n portfolioLinkText: portfolioLinkFields?.portfolioLinkText,\n portfolioLinkUrl: portfolioLinkFields?.portfolioLinkUrl,\n },\n extensionLink: extensionLinkFields && {\n extensionLinkText: extensionLinkFields?.extensionLinkText,\n extensionLinkRoute: extensionLinkFields?.extensionLinkRoute,\n },\n mobileLink: mobileLinkFields && {\n mobileLinkText: mobileLinkFields?.mobileLinkText,\n mobileLinkUrl: mobileLinkFields?.mobileLinkUrl,\n },\n extensionMinimumVersionNumber: fields.extensionMinimumVersionNumber,\n mobileMinimumVersionNumber: fields.mobileMinimumVersionNumber,\n },\n };\n\n return notification;\n });\n\n const versionKey = {\n extension: 'extensionMinimumVersionNumber',\n mobile: 'mobileMinimumVersionNumber',\n } as const;\n\n const filteredRawNotifications = rawNotifications.filter((n) => {\n const notificationVersion = n.data?.[versionKey[env.platform]];\n if (!env.platformVersion || !notificationVersion) {\n return true;\n }\n\n try {\n return gte(env.platformVersion, notificationVersion);\n } catch {\n // something went wrong filtering, do not show notif\n return false;\n }\n });\n\n return filteredRawNotifications;\n};\n\n/**\n * Gets Feature Announcement from our services\n *\n * @param env - environment for feature announcements\n * @param previewToken - the preview token to use if needed\n * @returns Raw Feature Announcements\n */\nexport async function getFeatureAnnouncementNotifications(\n env: Env,\n previewToken?: string,\n): Promise<INotification[]> {\n if (env?.accessToken && env?.spaceId && env?.platform) {\n const rawNotifications = await fetchFeatureAnnouncementNotifications(\n env,\n previewToken,\n );\n const notifications = rawNotifications.map((notification) =>\n processFeatureAnnouncement(notification),\n );\n\n return notifications;\n }\n\n return [];\n}\n"]}
1
+ {"version":3,"file":"feature-announcements.cjs","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"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","sourcesContent":["import { documentToHtmlString } from '@contentful/rich-text-html-renderer';\nimport type { Entry, Asset, EntryCollection } from 'contentful';\nimport { gt, lt } from 'semver';\n\nimport { TRIGGER_TYPES } from '../constants/notification-schema';\nimport { processFeatureAnnouncement } from '../processors/process-feature-announcement';\nimport type { FeatureAnnouncementRawNotification } from '../types/feature-announcement/feature-announcement';\nimport type {\n ImageFields,\n TypeFeatureAnnouncement,\n} from '../types/feature-announcement/type-feature-announcement';\nimport type {\n TypeExternalLinkFields,\n TypePortfolioLinkFields,\n TypeExtensionLinkFields,\n TypeMobileLinkFields,\n} from '../types/feature-announcement/type-links';\nimport type { INotification } from '../types/notification/notification';\n\nconst DEFAULT_SPACE_ID = ':space_id';\nconst DEFAULT_ACCESS_TOKEN = ':access_token';\nconst DEFAULT_CLIENT_ID = ':client_id';\nconst DEFAULT_DOMAIN = 'cdn.contentful.com';\nconst PREVIEW_DOMAIN = 'preview.contentful.com';\nexport const FEATURE_ANNOUNCEMENT_API = `https://${DEFAULT_DOMAIN}/spaces/${DEFAULT_SPACE_ID}/environments/master/entries`;\nexport const FEATURE_ANNOUNCEMENT_URL = `${FEATURE_ANNOUNCEMENT_API}?access_token=${DEFAULT_ACCESS_TOKEN}&content_type=productAnnouncement&include=10&fields.clients[in]=${DEFAULT_CLIENT_ID}`;\n\ntype Env = {\n spaceId: string;\n accessToken: string;\n platform: 'extension' | 'mobile';\n platformVersion?: string;\n};\n\n/**\n * Contentful API Response Shape\n */\nexport type ContentfulResult = {\n includes?: {\n Entry?: Entry[];\n Asset?: Asset[];\n };\n items?: TypeFeatureAnnouncement[];\n};\n\nexport const getFeatureAnnouncementUrl = (env: Env, previewToken?: string) => {\n const domain = previewToken ? PREVIEW_DOMAIN : DEFAULT_DOMAIN;\n const replacedUrl = FEATURE_ANNOUNCEMENT_URL.replace(\n DEFAULT_SPACE_ID,\n env.spaceId,\n )\n .replace(DEFAULT_ACCESS_TOKEN, previewToken || env.accessToken)\n .replace(DEFAULT_CLIENT_ID, env.platform)\n .replace(DEFAULT_DOMAIN, domain);\n return encodeURI(replacedUrl);\n};\n\nconst fetchFeatureAnnouncementNotifications = async (\n env: Env,\n previewToken?: string,\n): Promise<FeatureAnnouncementRawNotification[]> => {\n const url = getFeatureAnnouncementUrl(env, previewToken);\n\n const data = await fetch(url)\n .then((r) => r.json())\n .catch(() => null);\n\n if (!data) {\n return [];\n }\n\n const findIncludedItem = (sysId: string) => {\n const typedData: EntryCollection<\n | ImageFields\n | TypeExtensionLinkFields\n | TypePortfolioLinkFields\n | TypeMobileLinkFields\n | TypeExternalLinkFields\n > = data;\n const item =\n typedData?.includes?.Entry?.find((i: Entry) => i?.sys?.id === sysId) ||\n typedData?.includes?.Asset?.find((i: Asset) => i?.sys?.id === sysId);\n return item ? item?.fields : null;\n };\n\n const contentfulNotifications = data?.items ?? [];\n const rawNotifications: FeatureAnnouncementRawNotification[] =\n contentfulNotifications.map((n: TypeFeatureAnnouncement) => {\n const { fields } = n;\n const imageFields = fields.image\n ? (findIncludedItem(fields.image.sys.id) as ImageFields['fields'])\n : undefined;\n\n const externalLinkFields = fields.externalLink\n ? (findIncludedItem(\n fields.externalLink.sys.id,\n ) as TypeExternalLinkFields['fields'])\n : undefined;\n const portfolioLinkFields = fields.portfolioLink\n ? (findIncludedItem(\n fields.portfolioLink.sys.id,\n ) as TypePortfolioLinkFields['fields'])\n : undefined;\n const extensionLinkFields = fields.extensionLink\n ? (findIncludedItem(\n fields.extensionLink.sys.id,\n ) as TypeExtensionLinkFields['fields'])\n : undefined;\n const mobileLinkFields = fields.mobileLink\n ? (findIncludedItem(\n fields.mobileLink.sys.id,\n ) as TypeMobileLinkFields['fields'])\n : undefined;\n\n const notification: FeatureAnnouncementRawNotification = {\n type: TRIGGER_TYPES.FEATURES_ANNOUNCEMENT,\n createdAt: new Date(n.sys.createdAt).toString(),\n data: {\n id: fields.id,\n category: fields.category,\n title: fields.title,\n longDescription: documentToHtmlString(fields.longDescription),\n shortDescription: fields.shortDescription,\n image: {\n title: imageFields?.title,\n description: imageFields?.description,\n url: imageFields?.file?.url ?? '',\n },\n externalLink: externalLinkFields && {\n externalLinkText: externalLinkFields?.externalLinkText,\n externalLinkUrl: externalLinkFields?.externalLinkUrl,\n },\n portfolioLink: portfolioLinkFields && {\n portfolioLinkText: portfolioLinkFields?.portfolioLinkText,\n portfolioLinkUrl: portfolioLinkFields?.portfolioLinkUrl,\n },\n extensionLink: extensionLinkFields && {\n extensionLinkText: extensionLinkFields?.extensionLinkText,\n extensionLinkRoute: extensionLinkFields?.extensionLinkRoute,\n },\n mobileLink: mobileLinkFields && {\n mobileLinkText: mobileLinkFields?.mobileLinkText,\n mobileLinkUrl: mobileLinkFields?.mobileLinkUrl,\n },\n extensionMinimumVersionNumber: fields.extensionMinimumVersionNumber,\n mobileMinimumVersionNumber: fields.mobileMinimumVersionNumber,\n extensionMaximumVersionNumber: fields.extensionMaximumVersionNumber,\n mobileMaximumVersionNumber: fields.mobileMaximumVersionNumber,\n },\n };\n\n return notification;\n });\n\n const versionKeys = {\n extension: {\n min: 'extensionMinimumVersionNumber',\n max: 'extensionMaximumVersionNumber',\n },\n mobile: {\n min: 'mobileMinimumVersionNumber',\n max: 'mobileMaximumVersionNumber',\n },\n } as const;\n\n const filteredRawNotifications = rawNotifications.filter((n) => {\n const minVersion = n.data?.[versionKeys[env.platform].min];\n const maxVersion = n.data?.[versionKeys[env.platform].max];\n\n // If no platform version is provided, show all notifications\n if (!env.platformVersion) {\n return true;\n }\n\n // min/max filtering\n try {\n let showNotification = true;\n\n // Check minimum version: current version must be greater than minimum\n if (minVersion) {\n showNotification =\n showNotification && gt(env.platformVersion, minVersion);\n }\n\n // Check maximum version: current version must be less than maximum\n if (maxVersion) {\n showNotification =\n showNotification && lt(env.platformVersion, maxVersion);\n }\n\n return showNotification;\n } catch {\n // something went wrong filtering, do not show notification\n return false;\n }\n });\n\n return filteredRawNotifications;\n};\n\n/**\n * Gets Feature Announcement from our services\n *\n * @param env - environment for feature announcements\n * @param previewToken - the preview token to use if needed\n * @returns Raw Feature Announcements\n */\nexport async function getFeatureAnnouncementNotifications(\n env: Env,\n previewToken?: string,\n): Promise<INotification[]> {\n if (env?.accessToken && env?.spaceId && env?.platform) {\n const rawNotifications = await fetchFeatureAnnouncementNotifications(\n env,\n previewToken,\n );\n const notifications = rawNotifications.map((notification) =>\n processFeatureAnnouncement(notification),\n );\n\n return notifications;\n }\n\n return [];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"feature-announcements.d.cts","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAmB,mBAAmB;AAMhE,OAAO,KAAK,EAEV,uBAAuB,EACxB,oEAAgE;AAOjE,OAAO,KAAK,EAAE,aAAa,EAAE,+CAA2C;AAOxE,eAAO,MAAM,wBAAwB,4EAAqF,CAAC;AAC3H,eAAO,MAAM,wBAAwB,iLAAyJ,CAAC;AAE/L,KAAK,GAAG,GAAG;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAS,GAAG,iBAAiB,MAAM,WAUxE,CAAC;AAuHF;;;;;;GAMG;AACH,wBAAsB,mCAAmC,CACvD,GAAG,EAAE,GAAG,EACR,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B"}
1
+ {"version":3,"file":"feature-announcements.d.cts","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAmB,mBAAmB;AAMhE,OAAO,KAAK,EAEV,uBAAuB,EACxB,oEAAgE;AAOjE,OAAO,KAAK,EAAE,aAAa,EAAE,+CAA2C;AAOxE,eAAO,MAAM,wBAAwB,4EAAqF,CAAC;AAC3H,eAAO,MAAM,wBAAwB,iLAAyJ,CAAC;AAE/L,KAAK,GAAG,GAAG;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAS,GAAG,iBAAiB,MAAM,WAUxE,CAAC;AAiJF;;;;;;GAMG;AACH,wBAAsB,mCAAmC,CACvD,GAAG,EAAE,GAAG,EACR,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"feature-announcements.d.mts","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAmB,mBAAmB;AAMhE,OAAO,KAAK,EAEV,uBAAuB,EACxB,oEAAgE;AAOjE,OAAO,KAAK,EAAE,aAAa,EAAE,+CAA2C;AAOxE,eAAO,MAAM,wBAAwB,4EAAqF,CAAC;AAC3H,eAAO,MAAM,wBAAwB,iLAAyJ,CAAC;AAE/L,KAAK,GAAG,GAAG;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAS,GAAG,iBAAiB,MAAM,WAUxE,CAAC;AAuHF;;;;;;GAMG;AACH,wBAAsB,mCAAmC,CACvD,GAAG,EAAE,GAAG,EACR,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B"}
1
+ {"version":3,"file":"feature-announcements.d.mts","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAmB,mBAAmB;AAMhE,OAAO,KAAK,EAEV,uBAAuB,EACxB,oEAAgE;AAOjE,OAAO,KAAK,EAAE,aAAa,EAAE,+CAA2C;AAOxE,eAAO,MAAM,wBAAwB,4EAAqF,CAAC;AAC3H,eAAO,MAAM,wBAAwB,iLAAyJ,CAAC;AAE/L,KAAK,GAAG,GAAG;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAS,GAAG,iBAAiB,MAAM,WAUxE,CAAC;AAiJF;;;;;;GAMG;AACH,wBAAsB,mCAAmC,CACvD,GAAG,EAAE,GAAG,EACR,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B"}
@@ -1,5 +1,5 @@
1
1
  import { documentToHtmlString } from "@contentful/rich-text-html-renderer";
2
- import { gte } from "semver";
2
+ import { gt, lt } from "semver";
3
3
  import { TRIGGER_TYPES } from "../constants/notification-schema.mjs";
4
4
  import { processFeatureAnnouncement } from "../processors/process-feature-announcement.mjs";
5
5
  const DEFAULT_SPACE_ID = ':space_id';
@@ -81,24 +81,46 @@ const fetchFeatureAnnouncementNotifications = async (env, previewToken) => {
81
81
  },
82
82
  extensionMinimumVersionNumber: fields.extensionMinimumVersionNumber,
83
83
  mobileMinimumVersionNumber: fields.mobileMinimumVersionNumber,
84
+ extensionMaximumVersionNumber: fields.extensionMaximumVersionNumber,
85
+ mobileMaximumVersionNumber: fields.mobileMaximumVersionNumber,
84
86
  },
85
87
  };
86
88
  return notification;
87
89
  });
88
- const versionKey = {
89
- extension: 'extensionMinimumVersionNumber',
90
- mobile: 'mobileMinimumVersionNumber',
90
+ const versionKeys = {
91
+ extension: {
92
+ min: 'extensionMinimumVersionNumber',
93
+ max: 'extensionMaximumVersionNumber',
94
+ },
95
+ mobile: {
96
+ min: 'mobileMinimumVersionNumber',
97
+ max: 'mobileMaximumVersionNumber',
98
+ },
91
99
  };
92
100
  const filteredRawNotifications = rawNotifications.filter((n) => {
93
- const notificationVersion = n.data?.[versionKey[env.platform]];
94
- if (!env.platformVersion || !notificationVersion) {
101
+ const minVersion = n.data?.[versionKeys[env.platform].min];
102
+ const maxVersion = n.data?.[versionKeys[env.platform].max];
103
+ // If no platform version is provided, show all notifications
104
+ if (!env.platformVersion) {
95
105
  return true;
96
106
  }
107
+ // min/max filtering
97
108
  try {
98
- return gte(env.platformVersion, notificationVersion);
109
+ let showNotification = true;
110
+ // Check minimum version: current version must be greater than minimum
111
+ if (minVersion) {
112
+ showNotification =
113
+ showNotification && gt(env.platformVersion, minVersion);
114
+ }
115
+ // Check maximum version: current version must be less than maximum
116
+ if (maxVersion) {
117
+ showNotification =
118
+ showNotification && lt(env.platformVersion, maxVersion);
119
+ }
120
+ return showNotification;
99
121
  }
100
122
  catch {
101
- // something went wrong filtering, do not show notif
123
+ // something went wrong filtering, do not show notification
102
124
  return false;
103
125
  }
104
126
  });
@@ -1 +1 @@
1
- {"version":3,"file":"feature-announcements.mjs","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"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","sourcesContent":["import { documentToHtmlString } from '@contentful/rich-text-html-renderer';\nimport type { Entry, Asset, EntryCollection } from 'contentful';\nimport { gte } from 'semver';\n\nimport { TRIGGER_TYPES } from '../constants/notification-schema';\nimport { processFeatureAnnouncement } from '../processors/process-feature-announcement';\nimport type { FeatureAnnouncementRawNotification } from '../types/feature-announcement/feature-announcement';\nimport type {\n ImageFields,\n TypeFeatureAnnouncement,\n} from '../types/feature-announcement/type-feature-announcement';\nimport type {\n TypeExternalLinkFields,\n TypePortfolioLinkFields,\n TypeExtensionLinkFields,\n TypeMobileLinkFields,\n} from '../types/feature-announcement/type-links';\nimport type { INotification } from '../types/notification/notification';\n\nconst DEFAULT_SPACE_ID = ':space_id';\nconst DEFAULT_ACCESS_TOKEN = ':access_token';\nconst DEFAULT_CLIENT_ID = ':client_id';\nconst DEFAULT_DOMAIN = 'cdn.contentful.com';\nconst PREVIEW_DOMAIN = 'preview.contentful.com';\nexport const FEATURE_ANNOUNCEMENT_API = `https://${DEFAULT_DOMAIN}/spaces/${DEFAULT_SPACE_ID}/environments/master/entries`;\nexport const FEATURE_ANNOUNCEMENT_URL = `${FEATURE_ANNOUNCEMENT_API}?access_token=${DEFAULT_ACCESS_TOKEN}&content_type=productAnnouncement&include=10&fields.clients[in]=${DEFAULT_CLIENT_ID}`;\n\ntype Env = {\n spaceId: string;\n accessToken: string;\n platform: 'extension' | 'mobile';\n platformVersion?: string;\n};\n\n/**\n * Contentful API Response Shape\n */\nexport type ContentfulResult = {\n includes?: {\n Entry?: Entry[];\n Asset?: Asset[];\n };\n items?: TypeFeatureAnnouncement[];\n};\n\nexport const getFeatureAnnouncementUrl = (env: Env, previewToken?: string) => {\n const domain = previewToken ? PREVIEW_DOMAIN : DEFAULT_DOMAIN;\n const replacedUrl = FEATURE_ANNOUNCEMENT_URL.replace(\n DEFAULT_SPACE_ID,\n env.spaceId,\n )\n .replace(DEFAULT_ACCESS_TOKEN, previewToken || env.accessToken)\n .replace(DEFAULT_CLIENT_ID, env.platform)\n .replace(DEFAULT_DOMAIN, domain);\n return encodeURI(replacedUrl);\n};\n\nconst fetchFeatureAnnouncementNotifications = async (\n env: Env,\n previewToken?: string,\n): Promise<FeatureAnnouncementRawNotification[]> => {\n const url = getFeatureAnnouncementUrl(env, previewToken);\n\n const data = await fetch(url)\n .then((r) => r.json())\n .catch(() => null);\n\n if (!data) {\n return [];\n }\n\n const findIncludedItem = (sysId: string) => {\n const typedData: EntryCollection<\n | ImageFields\n | TypeExtensionLinkFields\n | TypePortfolioLinkFields\n | TypeMobileLinkFields\n | TypeExternalLinkFields\n > = data;\n const item =\n typedData?.includes?.Entry?.find((i: Entry) => i?.sys?.id === sysId) ||\n typedData?.includes?.Asset?.find((i: Asset) => i?.sys?.id === sysId);\n return item ? item?.fields : null;\n };\n\n const contentfulNotifications = data?.items ?? [];\n const rawNotifications: FeatureAnnouncementRawNotification[] =\n contentfulNotifications.map((n: TypeFeatureAnnouncement) => {\n const { fields } = n;\n const imageFields = fields.image\n ? (findIncludedItem(fields.image.sys.id) as ImageFields['fields'])\n : undefined;\n\n const externalLinkFields = fields.externalLink\n ? (findIncludedItem(\n fields.externalLink.sys.id,\n ) as TypeExternalLinkFields['fields'])\n : undefined;\n const portfolioLinkFields = fields.portfolioLink\n ? (findIncludedItem(\n fields.portfolioLink.sys.id,\n ) as TypePortfolioLinkFields['fields'])\n : undefined;\n const extensionLinkFields = fields.extensionLink\n ? (findIncludedItem(\n fields.extensionLink.sys.id,\n ) as TypeExtensionLinkFields['fields'])\n : undefined;\n const mobileLinkFields = fields.mobileLink\n ? (findIncludedItem(\n fields.mobileLink.sys.id,\n ) as TypeMobileLinkFields['fields'])\n : undefined;\n\n const notification: FeatureAnnouncementRawNotification = {\n type: TRIGGER_TYPES.FEATURES_ANNOUNCEMENT,\n createdAt: new Date(n.sys.createdAt).toString(),\n data: {\n id: fields.id,\n category: fields.category,\n title: fields.title,\n longDescription: documentToHtmlString(fields.longDescription),\n shortDescription: fields.shortDescription,\n image: {\n title: imageFields?.title,\n description: imageFields?.description,\n url: imageFields?.file?.url ?? '',\n },\n externalLink: externalLinkFields && {\n externalLinkText: externalLinkFields?.externalLinkText,\n externalLinkUrl: externalLinkFields?.externalLinkUrl,\n },\n portfolioLink: portfolioLinkFields && {\n portfolioLinkText: portfolioLinkFields?.portfolioLinkText,\n portfolioLinkUrl: portfolioLinkFields?.portfolioLinkUrl,\n },\n extensionLink: extensionLinkFields && {\n extensionLinkText: extensionLinkFields?.extensionLinkText,\n extensionLinkRoute: extensionLinkFields?.extensionLinkRoute,\n },\n mobileLink: mobileLinkFields && {\n mobileLinkText: mobileLinkFields?.mobileLinkText,\n mobileLinkUrl: mobileLinkFields?.mobileLinkUrl,\n },\n extensionMinimumVersionNumber: fields.extensionMinimumVersionNumber,\n mobileMinimumVersionNumber: fields.mobileMinimumVersionNumber,\n },\n };\n\n return notification;\n });\n\n const versionKey = {\n extension: 'extensionMinimumVersionNumber',\n mobile: 'mobileMinimumVersionNumber',\n } as const;\n\n const filteredRawNotifications = rawNotifications.filter((n) => {\n const notificationVersion = n.data?.[versionKey[env.platform]];\n if (!env.platformVersion || !notificationVersion) {\n return true;\n }\n\n try {\n return gte(env.platformVersion, notificationVersion);\n } catch {\n // something went wrong filtering, do not show notif\n return false;\n }\n });\n\n return filteredRawNotifications;\n};\n\n/**\n * Gets Feature Announcement from our services\n *\n * @param env - environment for feature announcements\n * @param previewToken - the preview token to use if needed\n * @returns Raw Feature Announcements\n */\nexport async function getFeatureAnnouncementNotifications(\n env: Env,\n previewToken?: string,\n): Promise<INotification[]> {\n if (env?.accessToken && env?.spaceId && env?.platform) {\n const rawNotifications = await fetchFeatureAnnouncementNotifications(\n env,\n previewToken,\n );\n const notifications = rawNotifications.map((notification) =>\n processFeatureAnnouncement(notification),\n );\n\n return notifications;\n }\n\n return [];\n}\n"]}
1
+ {"version":3,"file":"feature-announcements.mjs","sourceRoot":"","sources":["../../../src/NotificationServicesController/services/feature-announcements.ts"],"names":[],"mappings":"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","sourcesContent":["import { documentToHtmlString } from '@contentful/rich-text-html-renderer';\nimport type { Entry, Asset, EntryCollection } from 'contentful';\nimport { gt, lt } from 'semver';\n\nimport { TRIGGER_TYPES } from '../constants/notification-schema';\nimport { processFeatureAnnouncement } from '../processors/process-feature-announcement';\nimport type { FeatureAnnouncementRawNotification } from '../types/feature-announcement/feature-announcement';\nimport type {\n ImageFields,\n TypeFeatureAnnouncement,\n} from '../types/feature-announcement/type-feature-announcement';\nimport type {\n TypeExternalLinkFields,\n TypePortfolioLinkFields,\n TypeExtensionLinkFields,\n TypeMobileLinkFields,\n} from '../types/feature-announcement/type-links';\nimport type { INotification } from '../types/notification/notification';\n\nconst DEFAULT_SPACE_ID = ':space_id';\nconst DEFAULT_ACCESS_TOKEN = ':access_token';\nconst DEFAULT_CLIENT_ID = ':client_id';\nconst DEFAULT_DOMAIN = 'cdn.contentful.com';\nconst PREVIEW_DOMAIN = 'preview.contentful.com';\nexport const FEATURE_ANNOUNCEMENT_API = `https://${DEFAULT_DOMAIN}/spaces/${DEFAULT_SPACE_ID}/environments/master/entries`;\nexport const FEATURE_ANNOUNCEMENT_URL = `${FEATURE_ANNOUNCEMENT_API}?access_token=${DEFAULT_ACCESS_TOKEN}&content_type=productAnnouncement&include=10&fields.clients[in]=${DEFAULT_CLIENT_ID}`;\n\ntype Env = {\n spaceId: string;\n accessToken: string;\n platform: 'extension' | 'mobile';\n platformVersion?: string;\n};\n\n/**\n * Contentful API Response Shape\n */\nexport type ContentfulResult = {\n includes?: {\n Entry?: Entry[];\n Asset?: Asset[];\n };\n items?: TypeFeatureAnnouncement[];\n};\n\nexport const getFeatureAnnouncementUrl = (env: Env, previewToken?: string) => {\n const domain = previewToken ? PREVIEW_DOMAIN : DEFAULT_DOMAIN;\n const replacedUrl = FEATURE_ANNOUNCEMENT_URL.replace(\n DEFAULT_SPACE_ID,\n env.spaceId,\n )\n .replace(DEFAULT_ACCESS_TOKEN, previewToken || env.accessToken)\n .replace(DEFAULT_CLIENT_ID, env.platform)\n .replace(DEFAULT_DOMAIN, domain);\n return encodeURI(replacedUrl);\n};\n\nconst fetchFeatureAnnouncementNotifications = async (\n env: Env,\n previewToken?: string,\n): Promise<FeatureAnnouncementRawNotification[]> => {\n const url = getFeatureAnnouncementUrl(env, previewToken);\n\n const data = await fetch(url)\n .then((r) => r.json())\n .catch(() => null);\n\n if (!data) {\n return [];\n }\n\n const findIncludedItem = (sysId: string) => {\n const typedData: EntryCollection<\n | ImageFields\n | TypeExtensionLinkFields\n | TypePortfolioLinkFields\n | TypeMobileLinkFields\n | TypeExternalLinkFields\n > = data;\n const item =\n typedData?.includes?.Entry?.find((i: Entry) => i?.sys?.id === sysId) ||\n typedData?.includes?.Asset?.find((i: Asset) => i?.sys?.id === sysId);\n return item ? item?.fields : null;\n };\n\n const contentfulNotifications = data?.items ?? [];\n const rawNotifications: FeatureAnnouncementRawNotification[] =\n contentfulNotifications.map((n: TypeFeatureAnnouncement) => {\n const { fields } = n;\n const imageFields = fields.image\n ? (findIncludedItem(fields.image.sys.id) as ImageFields['fields'])\n : undefined;\n\n const externalLinkFields = fields.externalLink\n ? (findIncludedItem(\n fields.externalLink.sys.id,\n ) as TypeExternalLinkFields['fields'])\n : undefined;\n const portfolioLinkFields = fields.portfolioLink\n ? (findIncludedItem(\n fields.portfolioLink.sys.id,\n ) as TypePortfolioLinkFields['fields'])\n : undefined;\n const extensionLinkFields = fields.extensionLink\n ? (findIncludedItem(\n fields.extensionLink.sys.id,\n ) as TypeExtensionLinkFields['fields'])\n : undefined;\n const mobileLinkFields = fields.mobileLink\n ? (findIncludedItem(\n fields.mobileLink.sys.id,\n ) as TypeMobileLinkFields['fields'])\n : undefined;\n\n const notification: FeatureAnnouncementRawNotification = {\n type: TRIGGER_TYPES.FEATURES_ANNOUNCEMENT,\n createdAt: new Date(n.sys.createdAt).toString(),\n data: {\n id: fields.id,\n category: fields.category,\n title: fields.title,\n longDescription: documentToHtmlString(fields.longDescription),\n shortDescription: fields.shortDescription,\n image: {\n title: imageFields?.title,\n description: imageFields?.description,\n url: imageFields?.file?.url ?? '',\n },\n externalLink: externalLinkFields && {\n externalLinkText: externalLinkFields?.externalLinkText,\n externalLinkUrl: externalLinkFields?.externalLinkUrl,\n },\n portfolioLink: portfolioLinkFields && {\n portfolioLinkText: portfolioLinkFields?.portfolioLinkText,\n portfolioLinkUrl: portfolioLinkFields?.portfolioLinkUrl,\n },\n extensionLink: extensionLinkFields && {\n extensionLinkText: extensionLinkFields?.extensionLinkText,\n extensionLinkRoute: extensionLinkFields?.extensionLinkRoute,\n },\n mobileLink: mobileLinkFields && {\n mobileLinkText: mobileLinkFields?.mobileLinkText,\n mobileLinkUrl: mobileLinkFields?.mobileLinkUrl,\n },\n extensionMinimumVersionNumber: fields.extensionMinimumVersionNumber,\n mobileMinimumVersionNumber: fields.mobileMinimumVersionNumber,\n extensionMaximumVersionNumber: fields.extensionMaximumVersionNumber,\n mobileMaximumVersionNumber: fields.mobileMaximumVersionNumber,\n },\n };\n\n return notification;\n });\n\n const versionKeys = {\n extension: {\n min: 'extensionMinimumVersionNumber',\n max: 'extensionMaximumVersionNumber',\n },\n mobile: {\n min: 'mobileMinimumVersionNumber',\n max: 'mobileMaximumVersionNumber',\n },\n } as const;\n\n const filteredRawNotifications = rawNotifications.filter((n) => {\n const minVersion = n.data?.[versionKeys[env.platform].min];\n const maxVersion = n.data?.[versionKeys[env.platform].max];\n\n // If no platform version is provided, show all notifications\n if (!env.platformVersion) {\n return true;\n }\n\n // min/max filtering\n try {\n let showNotification = true;\n\n // Check minimum version: current version must be greater than minimum\n if (minVersion) {\n showNotification =\n showNotification && gt(env.platformVersion, minVersion);\n }\n\n // Check maximum version: current version must be less than maximum\n if (maxVersion) {\n showNotification =\n showNotification && lt(env.platformVersion, maxVersion);\n }\n\n return showNotification;\n } catch {\n // something went wrong filtering, do not show notification\n return false;\n }\n });\n\n return filteredRawNotifications;\n};\n\n/**\n * Gets Feature Announcement from our services\n *\n * @param env - environment for feature announcements\n * @param previewToken - the preview token to use if needed\n * @returns Raw Feature Announcements\n */\nexport async function getFeatureAnnouncementNotifications(\n env: Env,\n previewToken?: string,\n): Promise<INotification[]> {\n if (env?.accessToken && env?.spaceId && env?.platform) {\n const rawNotifications = await fetchFeatureAnnouncementNotifications(\n env,\n previewToken,\n );\n const notifications = rawNotifications.map((notification) =>\n processFeatureAnnouncement(notification),\n );\n\n return notifications;\n }\n\n return [];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"type-feature-announcement.cjs","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"","sourcesContent":["import type { Entry, EntryFieldTypes } from 'contentful';\n\nimport type {\n TypeExternalLinkFields,\n TypeExtensionLinkFields,\n TypePortfolioLinkFields,\n TypeMobileLinkFields,\n} from './type-links';\n\nexport type ImageFields = {\n fields: {\n title?: string;\n description?: string;\n file?: {\n url: string;\n fileName: string;\n contentType: string;\n details: {\n size: number;\n image?: {\n width: number;\n height: number;\n };\n };\n };\n };\n contentTypeId: 'Image';\n};\n\nexport type TypeFeatureAnnouncementFields = {\n fields: {\n title: EntryFieldTypes.Text;\n id: EntryFieldTypes.Symbol;\n category: EntryFieldTypes.Text; // E.g. Announcement, etc.\n shortDescription: EntryFieldTypes.Text;\n image: EntryFieldTypes.EntryLink<ImageFields>;\n longDescription: EntryFieldTypes.RichText;\n\n // External Link\n externalLink?: EntryFieldTypes.EntryLink<TypeExternalLinkFields>;\n // Portfolio Link\n portfolioLink?: EntryFieldTypes.EntryLink<TypePortfolioLinkFields>;\n // Extension Link\n extensionLink?: EntryFieldTypes.EntryLink<TypeExtensionLinkFields>;\n // Mobile Link\n mobileLink?: EntryFieldTypes.EntryLink<TypeMobileLinkFields>;\n\n clients?: EntryFieldTypes.Text<'extension' | 'mobile' | 'portfolio'>;\n\n // Min Versions\n extensionMinimumVersionNumber?: EntryFieldTypes.Text;\n mobileMinimumVersionNumber?: EntryFieldTypes.Text;\n };\n contentTypeId: 'productAnnouncement';\n};\n\nexport type TypeFeatureAnnouncement = Entry<\n TypeFeatureAnnouncementFields,\n 'WITHOUT_UNRESOLVABLE_LINKS'\n>;\n"]}
1
+ {"version":3,"file":"type-feature-announcement.cjs","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"","sourcesContent":["import type { Entry, EntryFieldTypes } from 'contentful';\n\nimport type {\n TypeExternalLinkFields,\n TypeExtensionLinkFields,\n TypePortfolioLinkFields,\n TypeMobileLinkFields,\n} from './type-links';\n\nexport type ImageFields = {\n fields: {\n title?: string;\n description?: string;\n file?: {\n url: string;\n fileName: string;\n contentType: string;\n details: {\n size: number;\n image?: {\n width: number;\n height: number;\n };\n };\n };\n };\n contentTypeId: 'Image';\n};\n\nexport type TypeFeatureAnnouncementFields = {\n fields: {\n title: EntryFieldTypes.Text;\n id: EntryFieldTypes.Symbol;\n category: EntryFieldTypes.Text; // E.g. Announcement, etc.\n shortDescription: EntryFieldTypes.Text;\n image: EntryFieldTypes.EntryLink<ImageFields>;\n longDescription: EntryFieldTypes.RichText;\n\n // External Link\n externalLink?: EntryFieldTypes.EntryLink<TypeExternalLinkFields>;\n // Portfolio Link\n portfolioLink?: EntryFieldTypes.EntryLink<TypePortfolioLinkFields>;\n // Extension Link\n extensionLink?: EntryFieldTypes.EntryLink<TypeExtensionLinkFields>;\n // Mobile Link\n mobileLink?: EntryFieldTypes.EntryLink<TypeMobileLinkFields>;\n\n clients?: EntryFieldTypes.Text<'extension' | 'mobile' | 'portfolio'>;\n\n // Min Versions\n extensionMinimumVersionNumber?: EntryFieldTypes.Text;\n mobileMinimumVersionNumber?: EntryFieldTypes.Text;\n // Max Versions\n extensionMaximumVersionNumber?: EntryFieldTypes.Text;\n mobileMaximumVersionNumber?: EntryFieldTypes.Text;\n };\n contentTypeId: 'productAnnouncement';\n};\n\nexport type TypeFeatureAnnouncement = Entry<\n TypeFeatureAnnouncementFields,\n 'WITHOUT_UNRESOLVABLE_LINKS'\n>;\n"]}
@@ -34,6 +34,8 @@ export type TypeFeatureAnnouncementFields = {
34
34
  clients?: EntryFieldTypes.Text<'extension' | 'mobile' | 'portfolio'>;
35
35
  extensionMinimumVersionNumber?: EntryFieldTypes.Text;
36
36
  mobileMinimumVersionNumber?: EntryFieldTypes.Text;
37
+ extensionMaximumVersionNumber?: EntryFieldTypes.Text;
38
+ mobileMaximumVersionNumber?: EntryFieldTypes.Text;
37
39
  };
38
40
  contentTypeId: 'productAnnouncement';
39
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"type-feature-announcement.d.cts","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,mBAAmB;AAEzD,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACrB,yBAAqB;AAEtB,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE;YACL,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM,CAAC;gBACb,KAAK,CAAC,EAAE;oBACN,KAAK,EAAE,MAAM,CAAC;oBACd,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC;QAC5B,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC;QAC3B,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,gBAAgB,EAAE,eAAe,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;QAG1C,YAAY,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAEjE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,UAAU,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAE7D,OAAO,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;QAGrE,6BAA6B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QACrD,0BAA0B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;KACnD,CAAC;IACF,aAAa,EAAE,qBAAqB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,KAAK,CACzC,6BAA6B,EAC7B,4BAA4B,CAC7B,CAAC"}
1
+ {"version":3,"file":"type-feature-announcement.d.cts","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,mBAAmB;AAEzD,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACrB,yBAAqB;AAEtB,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE;YACL,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM,CAAC;gBACb,KAAK,CAAC,EAAE;oBACN,KAAK,EAAE,MAAM,CAAC;oBACd,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC;QAC5B,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC;QAC3B,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,gBAAgB,EAAE,eAAe,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;QAG1C,YAAY,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAEjE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,UAAU,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAE7D,OAAO,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;QAGrE,6BAA6B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QACrD,0BAA0B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QAElD,6BAA6B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QACrD,0BAA0B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;KACnD,CAAC;IACF,aAAa,EAAE,qBAAqB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,KAAK,CACzC,6BAA6B,EAC7B,4BAA4B,CAC7B,CAAC"}
@@ -34,6 +34,8 @@ export type TypeFeatureAnnouncementFields = {
34
34
  clients?: EntryFieldTypes.Text<'extension' | 'mobile' | 'portfolio'>;
35
35
  extensionMinimumVersionNumber?: EntryFieldTypes.Text;
36
36
  mobileMinimumVersionNumber?: EntryFieldTypes.Text;
37
+ extensionMaximumVersionNumber?: EntryFieldTypes.Text;
38
+ mobileMaximumVersionNumber?: EntryFieldTypes.Text;
37
39
  };
38
40
  contentTypeId: 'productAnnouncement';
39
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"type-feature-announcement.d.mts","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,mBAAmB;AAEzD,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACrB,yBAAqB;AAEtB,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE;YACL,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM,CAAC;gBACb,KAAK,CAAC,EAAE;oBACN,KAAK,EAAE,MAAM,CAAC;oBACd,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC;QAC5B,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC;QAC3B,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,gBAAgB,EAAE,eAAe,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;QAG1C,YAAY,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAEjE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,UAAU,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAE7D,OAAO,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;QAGrE,6BAA6B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QACrD,0BAA0B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;KACnD,CAAC;IACF,aAAa,EAAE,qBAAqB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,KAAK,CACzC,6BAA6B,EAC7B,4BAA4B,CAC7B,CAAC"}
1
+ {"version":3,"file":"type-feature-announcement.d.mts","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,mBAAmB;AAEzD,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACrB,yBAAqB;AAEtB,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE;YACL,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM,CAAC;gBACb,KAAK,CAAC,EAAE;oBACN,KAAK,EAAE,MAAM,CAAC;oBACd,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;IACF,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC;QAC5B,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC;QAC3B,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC;QAC/B,gBAAgB,EAAE,eAAe,CAAC,IAAI,CAAC;QACvC,KAAK,EAAE,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;QAG1C,YAAY,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAEjE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,aAAa,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAEnE,UAAU,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAE7D,OAAO,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;QAGrE,6BAA6B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QACrD,0BAA0B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QAElD,6BAA6B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;QACrD,0BAA0B,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;KACnD,CAAC;IACF,aAAa,EAAE,qBAAqB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,KAAK,CACzC,6BAA6B,EAC7B,4BAA4B,CAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"type-feature-announcement.mjs","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"","sourcesContent":["import type { Entry, EntryFieldTypes } from 'contentful';\n\nimport type {\n TypeExternalLinkFields,\n TypeExtensionLinkFields,\n TypePortfolioLinkFields,\n TypeMobileLinkFields,\n} from './type-links';\n\nexport type ImageFields = {\n fields: {\n title?: string;\n description?: string;\n file?: {\n url: string;\n fileName: string;\n contentType: string;\n details: {\n size: number;\n image?: {\n width: number;\n height: number;\n };\n };\n };\n };\n contentTypeId: 'Image';\n};\n\nexport type TypeFeatureAnnouncementFields = {\n fields: {\n title: EntryFieldTypes.Text;\n id: EntryFieldTypes.Symbol;\n category: EntryFieldTypes.Text; // E.g. Announcement, etc.\n shortDescription: EntryFieldTypes.Text;\n image: EntryFieldTypes.EntryLink<ImageFields>;\n longDescription: EntryFieldTypes.RichText;\n\n // External Link\n externalLink?: EntryFieldTypes.EntryLink<TypeExternalLinkFields>;\n // Portfolio Link\n portfolioLink?: EntryFieldTypes.EntryLink<TypePortfolioLinkFields>;\n // Extension Link\n extensionLink?: EntryFieldTypes.EntryLink<TypeExtensionLinkFields>;\n // Mobile Link\n mobileLink?: EntryFieldTypes.EntryLink<TypeMobileLinkFields>;\n\n clients?: EntryFieldTypes.Text<'extension' | 'mobile' | 'portfolio'>;\n\n // Min Versions\n extensionMinimumVersionNumber?: EntryFieldTypes.Text;\n mobileMinimumVersionNumber?: EntryFieldTypes.Text;\n };\n contentTypeId: 'productAnnouncement';\n};\n\nexport type TypeFeatureAnnouncement = Entry<\n TypeFeatureAnnouncementFields,\n 'WITHOUT_UNRESOLVABLE_LINKS'\n>;\n"]}
1
+ {"version":3,"file":"type-feature-announcement.mjs","sourceRoot":"","sources":["../../../../src/NotificationServicesController/types/feature-announcement/type-feature-announcement.ts"],"names":[],"mappings":"","sourcesContent":["import type { Entry, EntryFieldTypes } from 'contentful';\n\nimport type {\n TypeExternalLinkFields,\n TypeExtensionLinkFields,\n TypePortfolioLinkFields,\n TypeMobileLinkFields,\n} from './type-links';\n\nexport type ImageFields = {\n fields: {\n title?: string;\n description?: string;\n file?: {\n url: string;\n fileName: string;\n contentType: string;\n details: {\n size: number;\n image?: {\n width: number;\n height: number;\n };\n };\n };\n };\n contentTypeId: 'Image';\n};\n\nexport type TypeFeatureAnnouncementFields = {\n fields: {\n title: EntryFieldTypes.Text;\n id: EntryFieldTypes.Symbol;\n category: EntryFieldTypes.Text; // E.g. Announcement, etc.\n shortDescription: EntryFieldTypes.Text;\n image: EntryFieldTypes.EntryLink<ImageFields>;\n longDescription: EntryFieldTypes.RichText;\n\n // External Link\n externalLink?: EntryFieldTypes.EntryLink<TypeExternalLinkFields>;\n // Portfolio Link\n portfolioLink?: EntryFieldTypes.EntryLink<TypePortfolioLinkFields>;\n // Extension Link\n extensionLink?: EntryFieldTypes.EntryLink<TypeExtensionLinkFields>;\n // Mobile Link\n mobileLink?: EntryFieldTypes.EntryLink<TypeMobileLinkFields>;\n\n clients?: EntryFieldTypes.Text<'extension' | 'mobile' | 'portfolio'>;\n\n // Min Versions\n extensionMinimumVersionNumber?: EntryFieldTypes.Text;\n mobileMinimumVersionNumber?: EntryFieldTypes.Text;\n // Max Versions\n extensionMaximumVersionNumber?: EntryFieldTypes.Text;\n mobileMaximumVersionNumber?: EntryFieldTypes.Text;\n };\n contentTypeId: 'productAnnouncement';\n};\n\nexport type TypeFeatureAnnouncement = Entry<\n TypeFeatureAnnouncementFields,\n 'WITHOUT_UNRESOLVABLE_LINKS'\n>;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/notification-services-controller",
3
- "version": "18.1.0-preview-bc6087f6",
3
+ "version": "18.2.0-preview-622f3f09",
4
4
  "description": "Manages New MetaMask decentralized Notification system",
5
5
  "keywords": [
6
6
  "MetaMask",