@atproto/api 0.20.32 → 0.20.34

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
@@ -1,5 +1,17 @@
1
1
  # @atproto/api
2
2
 
3
+ ## 0.20.34
4
+
5
+ ### Patch Changes
6
+
7
+ - [#5263](https://github.com/bluesky-social/atproto/pull/5263) [`102503c`](https://github.com/bluesky-social/atproto/commit/102503c0781e3605ac725adf5c94893870f7d2f7) Thanks [@ds-boyce](https://github.com/ds-boyce)! - Hydrate starter pack details on follow notifications created via a starter pack
8
+
9
+ ## 0.20.33
10
+
11
+ ### Patch Changes
12
+
13
+ - [#5261](https://github.com/bluesky-social/atproto/pull/5261) [`5d6dae2`](https://github.com/bluesky-social/atproto/commit/5d6dae261032033eb4c818944208b9342c1d49d4) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Support platform-specific Age Assurance config
14
+
3
15
  ## 0.20.32
4
16
 
5
17
  ### Patch Changes
@@ -2,11 +2,15 @@ import { AppBskyAgeassuranceDefs } from './client/index.js';
2
2
  export type AgeAssuranceRuleID = Exclude<AppBskyAgeassuranceDefs.ConfigRegionRuleDefault['$type'] | AppBskyAgeassuranceDefs.ConfigRegionRuleIfDeclaredOverAge['$type'] | AppBskyAgeassuranceDefs.ConfigRegionRuleIfDeclaredUnderAge['$type'] | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAssuredOverAge['$type'] | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAssuredUnderAge['$type'] | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAccountNewerThan['$type'] | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAccountOlderThan['$type'], undefined>;
3
3
  export declare const ageAssuranceRuleIDs: Record<string, AgeAssuranceRuleID>;
4
4
  /**
5
- * Returns the first matched region configuration based on the provided geolocation.
5
+ * Returns the first matched region configuration based on the provided
6
+ * filters. Region configurations that declare `platforms` only match when the
7
+ * provided platform is included in that list. If no platform filter is
8
+ * provided, platform restrictions are ignored.
6
9
  */
7
- export declare function getAgeAssuranceRegionConfig(config: AppBskyAgeassuranceDefs.Config, geolocation: {
10
+ export declare function getAgeAssuranceRegionConfig(config: AppBskyAgeassuranceDefs.Config, filters: {
8
11
  countryCode: string;
9
12
  regionCode?: string;
13
+ platform?: string;
10
14
  }): AppBskyAgeassuranceDefs.ConfigRegion | undefined;
11
15
  export declare function computeAgeAssuranceRegionAccess(region: AppBskyAgeassuranceDefs.ConfigRegion, data: {
12
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"age-assurance.d.ts","sourceRoot":"","sources":["../src/age-assurance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAG3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACpC,uBAAuB,CAAC,uBAAuB,CAAC,OAAO,CAAC,GACxD,uBAAuB,CAAC,iCAAiC,CAAC,OAAO,CAAC,GAClE,uBAAuB,CAAC,kCAAkC,CAAC,OAAO,CAAC,GACnE,uBAAuB,CAAC,gCAAgC,CAAC,OAAO,CAAC,GACjE,uBAAuB,CAAC,iCAAiC,CAAC,OAAO,CAAC,GAClE,uBAAuB,CAAC,kCAAkC,CAAC,OAAO,CAAC,GACnE,uBAAuB,CAAC,kCAAkC,CAAC,OAAO,CAAC,EACrE,SAAS,CACV,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAQlE,CAAA;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,uBAAuB,CAAC,MAAM,EACtC,WAAW,EAAE;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACA,uBAAuB,CAAC,YAAY,GAAG,SAAS,CAOlD;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,uBAAuB,CAAC,YAAY,EAC5C,IAAI,EACA;IACE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACD,SAAS,GAEX;IACE,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAA;IACtC,MAAM,EAAE,kBAAkB,CAAA;CAC3B,GACD,SAAS,CAsEZ"}
1
+ {"version":3,"file":"age-assurance.d.ts","sourceRoot":"","sources":["../src/age-assurance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAG3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACpC,uBAAuB,CAAC,uBAAuB,CAAC,OAAO,CAAC,GACxD,uBAAuB,CAAC,iCAAiC,CAAC,OAAO,CAAC,GAClE,uBAAuB,CAAC,kCAAkC,CAAC,OAAO,CAAC,GACnE,uBAAuB,CAAC,gCAAgC,CAAC,OAAO,CAAC,GACjE,uBAAuB,CAAC,iCAAiC,CAAC,OAAO,CAAC,GAClE,uBAAuB,CAAC,kCAAkC,CAAC,OAAO,CAAC,GACnE,uBAAuB,CAAC,kCAAkC,CAAC,OAAO,CAAC,EACrE,SAAS,CACV,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAQlE,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,uBAAuB,CAAC,MAAM,EACtC,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GACA,uBAAuB,CAAC,YAAY,GAAG,SAAS,CAclD;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,uBAAuB,CAAC,YAAY,EAC5C,IAAI,EACA;IACE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GACD,SAAS,GAEX;IACE,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAA;IACtC,MAAM,EAAE,kBAAkB,CAAA;CAC3B,GACD,SAAS,CAsEZ"}
@@ -10,13 +10,21 @@ export const ageAssuranceRuleIDs = {
10
10
  IfAccountOlderThan: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAccountOlderThan`,
11
11
  };
12
12
  /**
13
- * Returns the first matched region configuration based on the provided geolocation.
13
+ * Returns the first matched region configuration based on the provided
14
+ * filters. Region configurations that declare `platforms` only match when the
15
+ * provided platform is included in that list. If no platform filter is
16
+ * provided, platform restrictions are ignored.
14
17
  */
15
- export function getAgeAssuranceRegionConfig(config, geolocation) {
18
+ export function getAgeAssuranceRegionConfig(config, filters) {
16
19
  const { regions } = config;
17
- return regions.find(({ countryCode, regionCode }) => {
18
- if (countryCode === geolocation.countryCode) {
19
- return !regionCode || regionCode === geolocation.regionCode;
20
+ return regions.find(({ countryCode, regionCode, platforms }) => {
21
+ if (filters.platform &&
22
+ platforms?.length &&
23
+ !platforms.includes(filters.platform)) {
24
+ return false;
25
+ }
26
+ if (countryCode === filters.countryCode) {
27
+ return !regionCode || regionCode === filters.regionCode;
20
28
  }
21
29
  });
22
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"age-assurance.js","sourceRoot":"","sources":["../src/age-assurance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAa1C,MAAM,CAAC,MAAM,mBAAmB,GAAuC;IACrE,OAAO,EAAE,GAAG,GAAG,CAAC,uBAAuB,0BAA0B;IACjE,iBAAiB,EAAE,GAAG,GAAG,CAAC,uBAAuB,oCAAoC;IACrF,kBAAkB,EAAE,GAAG,GAAG,CAAC,uBAAuB,qCAAqC;IACvF,gBAAgB,EAAE,GAAG,GAAG,CAAC,uBAAuB,mCAAmC;IACnF,iBAAiB,EAAE,GAAG,GAAG,CAAC,uBAAuB,oCAAoC;IACrF,kBAAkB,EAAE,GAAG,GAAG,CAAC,uBAAuB,qCAAqC;IACvF,kBAAkB,EAAE,GAAG,GAAG,CAAC,uBAAuB,qCAAqC;CACxF,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAsC,EACtC,WAGC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE;QAClD,IAAI,WAAW,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,CAAC,UAAU,IAAI,UAAU,KAAK,WAAW,CAAC,UAAU,CAAA;QAC7D,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,MAA4C,EAC5C,IAgBa;IAOb,mBAAmB;IACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,uBAAuB,CAAC,oCAAoC,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,IAAI,IAAI,EAAE,gBAAgB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;gBAChD,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;gBACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACrC,IAAI,gBAAgB,IAAI,SAAS,EAAE,CAAC;oBAClC,OAAO;wBACL,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;qBACnB,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IACL,uBAAuB,CAAC,oCAAoC,CAAC,IAAI,CAAC,EAClE,CAAC;YACD,IAAI,IAAI,EAAE,gBAAgB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;gBAChD,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;gBACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACrC,IAAI,gBAAgB,GAAG,SAAS,EAAE,CAAC;oBACjC,OAAO;wBACL,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;qBACnB,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IACL,uBAAuB,CAAC,mCAAmC,CAAC,IAAI,CAAC,EACjE,CAAC;YACD,IAAI,IAAI,EAAE,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpE,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;iBACnB,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IACL,uBAAuB,CAAC,oCAAoC,CAAC,IAAI,CAAC,EAClE,CAAC;YACD,IAAI,IAAI,EAAE,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnE,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;iBACnB,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IACL,uBAAuB,CAAC,kCAAkC,CAAC,IAAI,CAAC,EAChE,CAAC;YACD,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACpD,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;iBACnB,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IACL,uBAAuB,CAAC,mCAAmC,CAAC,IAAI,CAAC,EACjE,CAAC;YACD,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACnD,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;iBACnB,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IAAI,uBAAuB,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;aACnB,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { AppBskyAgeassuranceDefs } from './client/index.js'\nimport { ids } from './client/lexicons.js'\n\nexport type AgeAssuranceRuleID = Exclude<\n | AppBskyAgeassuranceDefs.ConfigRegionRuleDefault['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfDeclaredOverAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfDeclaredUnderAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAssuredOverAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAssuredUnderAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAccountNewerThan['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAccountOlderThan['$type'],\n undefined\n>\n\nexport const ageAssuranceRuleIDs: Record<string, AgeAssuranceRuleID> = {\n Default: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleDefault`,\n IfDeclaredOverAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfDeclaredOverAge`,\n IfDeclaredUnderAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfDeclaredUnderAge`,\n IfAssuredOverAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAssuredOverAge`,\n IfAssuredUnderAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAssuredUnderAge`,\n IfAccountNewerThan: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAccountNewerThan`,\n IfAccountOlderThan: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAccountOlderThan`,\n}\n\n/**\n * Returns the first matched region configuration based on the provided geolocation.\n */\nexport function getAgeAssuranceRegionConfig(\n config: AppBskyAgeassuranceDefs.Config,\n geolocation: {\n countryCode: string\n regionCode?: string\n },\n): AppBskyAgeassuranceDefs.ConfigRegion | undefined {\n const { regions } = config\n return regions.find(({ countryCode, regionCode }) => {\n if (countryCode === geolocation.countryCode) {\n return !regionCode || regionCode === geolocation.regionCode\n }\n })\n}\n\nexport function computeAgeAssuranceRegionAccess(\n region: AppBskyAgeassuranceDefs.ConfigRegion,\n data:\n | {\n /**\n * The account creation date in ISO 8601 format. Only checked if we\n * don't have an assured age, such as on the client.\n */\n accountCreatedAt?: string\n /**\n * The user's declared age\n */\n declaredAge?: number\n /**\n * The user's minimum age as assured by a trusted third party.\n */\n assuredAge?: number\n }\n | undefined,\n):\n | {\n access: AppBskyAgeassuranceDefs.Access\n reason: AgeAssuranceRuleID\n }\n | undefined {\n // first match wins\n for (const rule of region.rules) {\n if (AppBskyAgeassuranceDefs.isConfigRegionRuleIfAccountNewerThan(rule)) {\n if (data?.accountCreatedAt && !data?.assuredAge) {\n const accountCreatedAt = new Date(data.accountCreatedAt)\n const threshold = new Date(rule.date)\n if (accountCreatedAt >= threshold) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfAccountOlderThan(rule)\n ) {\n if (data?.accountCreatedAt && !data?.assuredAge) {\n const accountCreatedAt = new Date(data.accountCreatedAt)\n const threshold = new Date(rule.date)\n if (accountCreatedAt < threshold) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfDeclaredOverAge(rule)\n ) {\n if (data?.declaredAge !== undefined && data.declaredAge >= rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfDeclaredUnderAge(rule)\n ) {\n if (data?.declaredAge !== undefined && data.declaredAge < rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfAssuredOverAge(rule)\n ) {\n if (data?.assuredAge && data.assuredAge >= rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfAssuredUnderAge(rule)\n ) {\n if (data?.assuredAge && data.assuredAge < rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (AppBskyAgeassuranceDefs.isConfigRegionRuleDefault(rule)) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"age-assurance.js","sourceRoot":"","sources":["../src/age-assurance.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppBskyAgeassuranceDefs } from './client/index.js'\nimport { ids } from './client/lexicons.js'\n\nexport type AgeAssuranceRuleID = Exclude<\n | AppBskyAgeassuranceDefs.ConfigRegionRuleDefault['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfDeclaredOverAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfDeclaredUnderAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAssuredOverAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAssuredUnderAge['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAccountNewerThan['$type']\n | AppBskyAgeassuranceDefs.ConfigRegionRuleIfAccountOlderThan['$type'],\n undefined\n>\n\nexport const ageAssuranceRuleIDs: Record<string, AgeAssuranceRuleID> = {\n Default: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleDefault`,\n IfDeclaredOverAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfDeclaredOverAge`,\n IfDeclaredUnderAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfDeclaredUnderAge`,\n IfAssuredOverAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAssuredOverAge`,\n IfAssuredUnderAge: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAssuredUnderAge`,\n IfAccountNewerThan: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAccountNewerThan`,\n IfAccountOlderThan: `${ids.AppBskyAgeassuranceDefs}#configRegionRuleIfAccountOlderThan`,\n}\n\n/**\n * Returns the first matched region configuration based on the provided\n * filters. Region configurations that declare `platforms` only match when the\n * provided platform is included in that list. If no platform filter is\n * provided, platform restrictions are ignored.\n */\nexport function getAgeAssuranceRegionConfig(\n config: AppBskyAgeassuranceDefs.Config,\n filters: {\n countryCode: string\n regionCode?: string\n platform?: string\n },\n): AppBskyAgeassuranceDefs.ConfigRegion | undefined {\n const { regions } = config\n return regions.find(({ countryCode, regionCode, platforms }) => {\n if (\n filters.platform &&\n platforms?.length &&\n !platforms.includes(filters.platform)\n ) {\n return false\n }\n if (countryCode === filters.countryCode) {\n return !regionCode || regionCode === filters.regionCode\n }\n })\n}\n\nexport function computeAgeAssuranceRegionAccess(\n region: AppBskyAgeassuranceDefs.ConfigRegion,\n data:\n | {\n /**\n * The account creation date in ISO 8601 format. Only checked if we\n * don't have an assured age, such as on the client.\n */\n accountCreatedAt?: string\n /**\n * The user's declared age\n */\n declaredAge?: number\n /**\n * The user's minimum age as assured by a trusted third party.\n */\n assuredAge?: number\n }\n | undefined,\n):\n | {\n access: AppBskyAgeassuranceDefs.Access\n reason: AgeAssuranceRuleID\n }\n | undefined {\n // first match wins\n for (const rule of region.rules) {\n if (AppBskyAgeassuranceDefs.isConfigRegionRuleIfAccountNewerThan(rule)) {\n if (data?.accountCreatedAt && !data?.assuredAge) {\n const accountCreatedAt = new Date(data.accountCreatedAt)\n const threshold = new Date(rule.date)\n if (accountCreatedAt >= threshold) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfAccountOlderThan(rule)\n ) {\n if (data?.accountCreatedAt && !data?.assuredAge) {\n const accountCreatedAt = new Date(data.accountCreatedAt)\n const threshold = new Date(rule.date)\n if (accountCreatedAt < threshold) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfDeclaredOverAge(rule)\n ) {\n if (data?.declaredAge !== undefined && data.declaredAge >= rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfDeclaredUnderAge(rule)\n ) {\n if (data?.declaredAge !== undefined && data.declaredAge < rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfAssuredOverAge(rule)\n ) {\n if (data?.assuredAge && data.assuredAge >= rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (\n AppBskyAgeassuranceDefs.isConfigRegionRuleIfAssuredUnderAge(rule)\n ) {\n if (data?.assuredAge && data.assuredAge < rule.age) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n } else if (AppBskyAgeassuranceDefs.isConfigRegionRuleDefault(rule)) {\n return {\n access: rule.access,\n reason: rule.$type,\n }\n }\n }\n}\n"]}
@@ -10,6 +10,13 @@ describe('age-assurance', () => {
10
10
  minAccessAge: 13,
11
11
  rules: [],
12
12
  },
13
+ {
14
+ platforms: ['ios', 'android'],
15
+ countryCode: 'US',
16
+ regionCode: 'TX',
17
+ minAccessAge: 18,
18
+ rules: [],
19
+ },
13
20
  {
14
21
  countryCode: 'US',
15
22
  minAccessAge: 13,
@@ -45,6 +52,46 @@ describe('age-assurance', () => {
45
52
  });
46
53
  expect(result).toBeUndefined();
47
54
  });
55
+ it('should find platform-restricted region when platform matches', () => {
56
+ const result = getAgeAssuranceRegionConfig(config, {
57
+ countryCode: 'US',
58
+ regionCode: 'TX',
59
+ platform: 'ios',
60
+ });
61
+ expect(result).toEqual({
62
+ platforms: ['ios', 'android'],
63
+ countryCode: 'US',
64
+ regionCode: 'TX',
65
+ minAccessAge: 18,
66
+ rules: [],
67
+ });
68
+ });
69
+ it('should skip platform-restricted region when platform does not match', () => {
70
+ const result = getAgeAssuranceRegionConfig(config, {
71
+ countryCode: 'US',
72
+ regionCode: 'TX',
73
+ platform: 'web',
74
+ });
75
+ // falls through to the country-wide US config
76
+ expect(result).toEqual({
77
+ countryCode: 'US',
78
+ minAccessAge: 13,
79
+ rules: [],
80
+ });
81
+ });
82
+ it('should ignore platform restrictions when platform is not provided', () => {
83
+ const result = getAgeAssuranceRegionConfig(config, {
84
+ countryCode: 'US',
85
+ regionCode: 'TX',
86
+ });
87
+ expect(result).toEqual({
88
+ platforms: ['ios', 'android'],
89
+ countryCode: 'US',
90
+ regionCode: 'TX',
91
+ minAccessAge: 18,
92
+ rules: [],
93
+ });
94
+ });
48
95
  });
49
96
  describe('computeAgeAssuranceRegionAccess', () => {
50
97
  const region = {
@@ -1 +1 @@
1
- {"version":3,"file":"age-assurance.test.js","sourceRoot":"","sources":["../src/age-assurance.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from '@jest/globals'\nimport {\n ageAssuranceRuleIDs,\n computeAgeAssuranceRegionAccess,\n getAgeAssuranceRegionConfig,\n} from './age-assurance.js'\nimport type { AppBskyAgeassuranceDefs } from './client/index.js'\n\ndescribe('age-assurance', () => {\n describe('getAgeAssuranceRegionConfig', () => {\n const config: AppBskyAgeassuranceDefs.Config = {\n regions: [\n {\n countryCode: 'US',\n regionCode: 'CA',\n minAccessAge: 13,\n rules: [],\n },\n {\n countryCode: 'US',\n minAccessAge: 13,\n rules: [],\n },\n ],\n }\n\n it('should find region by country code only', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'US',\n })\n\n expect(result).toEqual({\n countryCode: 'US',\n minAccessAge: 13,\n rules: [],\n })\n })\n\n it('should find region by country code and region code', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'US',\n regionCode: 'CA',\n })\n\n expect(result).toEqual({\n countryCode: 'US',\n regionCode: 'CA',\n minAccessAge: 13,\n rules: [],\n })\n })\n\n it('should return undefined when no matching region found', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'GB',\n })\n\n expect(result).toBeUndefined()\n })\n })\n\n describe('computeAgeAssuranceRegionAccess', () => {\n const region: AppBskyAgeassuranceDefs.ConfigRegion = {\n countryCode: 'US',\n minAccessAge: 13,\n rules: [\n {\n $type: ageAssuranceRuleIDs.IfAccountNewerThan,\n date: '2025-12-10T00:00:00Z',\n access: 'none',\n },\n {\n $type: ageAssuranceRuleIDs.IfAssuredOverAge,\n age: 18,\n access: 'full',\n },\n {\n $type: ageAssuranceRuleIDs.IfAssuredOverAge,\n age: 16,\n access: 'safe',\n },\n {\n $type: ageAssuranceRuleIDs.IfDeclaredOverAge,\n age: 16,\n access: 'safe',\n },\n {\n $type: ageAssuranceRuleIDs.Default,\n access: 'none',\n },\n ],\n }\n\n it('should apply default if no data provided', () => {\n const result = computeAgeAssuranceRegionAccess(region, {})\n\n expect(result).toEqual({\n access: 'none',\n reason: ageAssuranceRuleIDs.Default,\n })\n })\n\n describe('IfAccountNewerThan', () => {\n it('should block accounts created after threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 11, 15).toISOString(),\n declaredAge: 18,\n })\n expect(result).toEqual({\n access: 'none',\n reason: ageAssuranceRuleIDs.IfAccountNewerThan,\n })\n })\n\n it('should allow accounts created before threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 10, 1).toISOString(),\n declaredAge: 18,\n })\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should allow accounts created exactly at threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 11, 1).toISOString(),\n declaredAge: 18,\n })\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should not apply rule when accountCreatedAt is not provided', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 15,\n })\n expect(result).toEqual({\n access: 'none',\n reason: ageAssuranceRuleIDs.Default,\n })\n })\n\n it('should not apply rule when assuredAge is present', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 11, 15).toISOString(),\n assuredAge: 20,\n })\n expect(result).toEqual({\n access: 'full',\n reason: ageAssuranceRuleIDs.IfAssuredOverAge,\n })\n })\n })\n\n describe('IfDeclaredOverAge rule', () => {\n it('should allow users at or above age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 18,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should allow users above age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 25,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should not allow users below age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 17,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n })\n\n describe('IfAssuredOverAge rule', () => {\n it('should allow users at or above assured age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n assuredAge: 18,\n })\n\n expect(result).toEqual({\n access: 'full',\n reason: ageAssuranceRuleIDs.IfAssuredOverAge,\n })\n })\n\n it('should not allow users below assured age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n assuredAge: 17,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfAssuredOverAge,\n })\n })\n })\n })\n})\n"]}
1
+ {"version":3,"file":"age-assurance.test.js","sourceRoot":"","sources":["../src/age-assurance.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from '@jest/globals'\nimport {\n ageAssuranceRuleIDs,\n computeAgeAssuranceRegionAccess,\n getAgeAssuranceRegionConfig,\n} from './age-assurance.js'\nimport type { AppBskyAgeassuranceDefs } from './client/index.js'\n\ndescribe('age-assurance', () => {\n describe('getAgeAssuranceRegionConfig', () => {\n const config: AppBskyAgeassuranceDefs.Config = {\n regions: [\n {\n countryCode: 'US',\n regionCode: 'CA',\n minAccessAge: 13,\n rules: [],\n },\n {\n platforms: ['ios', 'android'],\n countryCode: 'US',\n regionCode: 'TX',\n minAccessAge: 18,\n rules: [],\n },\n {\n countryCode: 'US',\n minAccessAge: 13,\n rules: [],\n },\n ],\n }\n\n it('should find region by country code only', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'US',\n })\n\n expect(result).toEqual({\n countryCode: 'US',\n minAccessAge: 13,\n rules: [],\n })\n })\n\n it('should find region by country code and region code', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'US',\n regionCode: 'CA',\n })\n\n expect(result).toEqual({\n countryCode: 'US',\n regionCode: 'CA',\n minAccessAge: 13,\n rules: [],\n })\n })\n\n it('should return undefined when no matching region found', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'GB',\n })\n\n expect(result).toBeUndefined()\n })\n\n it('should find platform-restricted region when platform matches', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'US',\n regionCode: 'TX',\n platform: 'ios',\n })\n\n expect(result).toEqual({\n platforms: ['ios', 'android'],\n countryCode: 'US',\n regionCode: 'TX',\n minAccessAge: 18,\n rules: [],\n })\n })\n\n it('should skip platform-restricted region when platform does not match', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'US',\n regionCode: 'TX',\n platform: 'web',\n })\n\n // falls through to the country-wide US config\n expect(result).toEqual({\n countryCode: 'US',\n minAccessAge: 13,\n rules: [],\n })\n })\n\n it('should ignore platform restrictions when platform is not provided', () => {\n const result = getAgeAssuranceRegionConfig(config, {\n countryCode: 'US',\n regionCode: 'TX',\n })\n\n expect(result).toEqual({\n platforms: ['ios', 'android'],\n countryCode: 'US',\n regionCode: 'TX',\n minAccessAge: 18,\n rules: [],\n })\n })\n })\n\n describe('computeAgeAssuranceRegionAccess', () => {\n const region: AppBskyAgeassuranceDefs.ConfigRegion = {\n countryCode: 'US',\n minAccessAge: 13,\n rules: [\n {\n $type: ageAssuranceRuleIDs.IfAccountNewerThan,\n date: '2025-12-10T00:00:00Z',\n access: 'none',\n },\n {\n $type: ageAssuranceRuleIDs.IfAssuredOverAge,\n age: 18,\n access: 'full',\n },\n {\n $type: ageAssuranceRuleIDs.IfAssuredOverAge,\n age: 16,\n access: 'safe',\n },\n {\n $type: ageAssuranceRuleIDs.IfDeclaredOverAge,\n age: 16,\n access: 'safe',\n },\n {\n $type: ageAssuranceRuleIDs.Default,\n access: 'none',\n },\n ],\n }\n\n it('should apply default if no data provided', () => {\n const result = computeAgeAssuranceRegionAccess(region, {})\n\n expect(result).toEqual({\n access: 'none',\n reason: ageAssuranceRuleIDs.Default,\n })\n })\n\n describe('IfAccountNewerThan', () => {\n it('should block accounts created after threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 11, 15).toISOString(),\n declaredAge: 18,\n })\n expect(result).toEqual({\n access: 'none',\n reason: ageAssuranceRuleIDs.IfAccountNewerThan,\n })\n })\n\n it('should allow accounts created before threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 10, 1).toISOString(),\n declaredAge: 18,\n })\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should allow accounts created exactly at threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 11, 1).toISOString(),\n declaredAge: 18,\n })\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should not apply rule when accountCreatedAt is not provided', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 15,\n })\n expect(result).toEqual({\n access: 'none',\n reason: ageAssuranceRuleIDs.Default,\n })\n })\n\n it('should not apply rule when assuredAge is present', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n accountCreatedAt: new Date(2025, 11, 15).toISOString(),\n assuredAge: 20,\n })\n expect(result).toEqual({\n access: 'full',\n reason: ageAssuranceRuleIDs.IfAssuredOverAge,\n })\n })\n })\n\n describe('IfDeclaredOverAge rule', () => {\n it('should allow users at or above age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 18,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should allow users above age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 25,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n\n it('should not allow users below age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n declaredAge: 17,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfDeclaredOverAge,\n })\n })\n })\n\n describe('IfAssuredOverAge rule', () => {\n it('should allow users at or above assured age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n assuredAge: 18,\n })\n\n expect(result).toEqual({\n access: 'full',\n reason: ageAssuranceRuleIDs.IfAssuredOverAge,\n })\n })\n\n it('should not allow users below assured age threshold', () => {\n const result = computeAgeAssuranceRegionAccess(region, {\n assuredAge: 17,\n })\n\n expect(result).toEqual({\n access: 'safe',\n reason: ageAssuranceRuleIDs.IfAssuredOverAge,\n })\n })\n })\n })\n})\n"]}
@@ -1337,6 +1337,14 @@ export declare const schemaDict: {
1337
1337
  readonly description: 'The Age Assurance configuration for a specific region.';
1338
1338
  readonly required: ["countryCode", "minAccessAge", "rules"];
1339
1339
  readonly properties: {
1340
+ readonly platforms: {
1341
+ readonly type: 'array';
1342
+ readonly description: 'The platforms this configuration applies to. If omitted, the configuration applies to all platforms.';
1343
+ readonly items: {
1344
+ readonly type: 'string';
1345
+ readonly knownValues: ["web", "ios", "android"];
1346
+ };
1347
+ };
1340
1348
  readonly countryCode: {
1341
1349
  readonly type: 'string';
1342
1350
  readonly description: 'The ISO 3166-1 alpha-2 country code this configuration applies to.';
@@ -7431,6 +7439,11 @@ export declare const schemaDict: {
7431
7439
  readonly record: {
7432
7440
  readonly type: 'unknown';
7433
7441
  };
7442
+ readonly starterPack: {
7443
+ readonly description: 'The starter pack associated with this notification. Present when the notification is for a follow originating from a starter pack.';
7444
+ readonly type: 'ref';
7445
+ readonly ref: 'lex:app.bsky.graph.defs#starterPackViewBasic';
7446
+ };
7434
7447
  readonly isRead: {
7435
7448
  readonly type: 'boolean';
7436
7449
  };
@@ -25762,6 +25775,14 @@ export declare const schemas: ({
25762
25775
  readonly description: 'The Age Assurance configuration for a specific region.';
25763
25776
  readonly required: ["countryCode", "minAccessAge", "rules"];
25764
25777
  readonly properties: {
25778
+ readonly platforms: {
25779
+ readonly type: 'array';
25780
+ readonly description: 'The platforms this configuration applies to. If omitted, the configuration applies to all platforms.';
25781
+ readonly items: {
25782
+ readonly type: 'string';
25783
+ readonly knownValues: ["web", "ios", "android"];
25784
+ };
25785
+ };
25765
25786
  readonly countryCode: {
25766
25787
  readonly type: 'string';
25767
25788
  readonly description: 'The ISO 3166-1 alpha-2 country code this configuration applies to.';
@@ -31761,6 +31782,11 @@ export declare const schemas: ({
31761
31782
  readonly record: {
31762
31783
  readonly type: 'unknown';
31763
31784
  };
31785
+ readonly starterPack: {
31786
+ readonly description: 'The starter pack associated with this notification. Present when the notification is for a follow originating from a starter pack.';
31787
+ readonly type: 'ref';
31788
+ readonly ref: 'lex:app.bsky.graph.defs#starterPackViewBasic';
31789
+ };
31764
31790
  readonly isRead: {
31765
31791
  readonly type: 'boolean';
31766
31792
  };