@dappermountain/payload-plugin-achievements 0.1.0

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.
Files changed (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/dist/access/helpers/index.d.ts +9 -0
  4. package/dist/access/helpers/index.d.ts.map +1 -0
  5. package/dist/access/helpers/index.js +25 -0
  6. package/dist/access/index.d.ts +3 -0
  7. package/dist/access/index.d.ts.map +1 -0
  8. package/dist/access/index.js +2 -0
  9. package/dist/access/roles/index.d.ts +15 -0
  10. package/dist/access/roles/index.d.ts.map +1 -0
  11. package/dist/access/roles/index.js +55 -0
  12. package/dist/admin/ActorField.d.ts +9 -0
  13. package/dist/admin/ActorField.d.ts.map +1 -0
  14. package/dist/admin/ActorField.js +19 -0
  15. package/dist/admin/MetricChangeField.d.ts +9 -0
  16. package/dist/admin/MetricChangeField.d.ts.map +1 -0
  17. package/dist/admin/MetricChangeField.js +21 -0
  18. package/dist/admin/MetricField.d.ts +9 -0
  19. package/dist/admin/MetricField.d.ts.map +1 -0
  20. package/dist/admin/MetricField.js +23 -0
  21. package/dist/admin/useEventTypeFlags.d.ts +7 -0
  22. package/dist/admin/useEventTypeFlags.d.ts.map +1 -0
  23. package/dist/admin/useEventTypeFlags.js +68 -0
  24. package/dist/catalog.d.ts +21 -0
  25. package/dist/catalog.d.ts.map +1 -0
  26. package/dist/catalog.js +9 -0
  27. package/dist/collections/AchievementRequests/access/index.d.ts +3 -0
  28. package/dist/collections/AchievementRequests/access/index.d.ts.map +1 -0
  29. package/dist/collections/AchievementRequests/access/index.js +8 -0
  30. package/dist/collections/AchievementRequests/hooks/index.d.ts +3 -0
  31. package/dist/collections/AchievementRequests/hooks/index.d.ts.map +1 -0
  32. package/dist/collections/AchievementRequests/hooks/index.js +5 -0
  33. package/dist/collections/AchievementRequests/hooks/prepareAchievementRequest.d.ts +12 -0
  34. package/dist/collections/AchievementRequests/hooks/prepareAchievementRequest.d.ts.map +1 -0
  35. package/dist/collections/AchievementRequests/hooks/prepareAchievementRequest.js +105 -0
  36. package/dist/collections/AchievementRequests/index.d.ts +3 -0
  37. package/dist/collections/AchievementRequests/index.d.ts.map +1 -0
  38. package/dist/collections/AchievementRequests/index.js +39 -0
  39. package/dist/collections/Achievements/access/index.d.ts +3 -0
  40. package/dist/collections/Achievements/access/index.d.ts.map +1 -0
  41. package/dist/collections/Achievements/access/index.js +2 -0
  42. package/dist/collections/Achievements/hooks/index.d.ts +3 -0
  43. package/dist/collections/Achievements/hooks/index.d.ts.map +1 -0
  44. package/dist/collections/Achievements/hooks/index.js +4 -0
  45. package/dist/collections/Achievements/hooks/validateEligibilityRules.d.ts +3 -0
  46. package/dist/collections/Achievements/hooks/validateEligibilityRules.d.ts.map +1 -0
  47. package/dist/collections/Achievements/hooks/validateEligibilityRules.js +8 -0
  48. package/dist/collections/Achievements/index.d.ts +3 -0
  49. package/dist/collections/Achievements/index.d.ts.map +1 -0
  50. package/dist/collections/Achievements/index.js +62 -0
  51. package/dist/collections/EventTypes/access/index.d.ts +12 -0
  52. package/dist/collections/EventTypes/access/index.d.ts.map +1 -0
  53. package/dist/collections/EventTypes/access/index.js +2 -0
  54. package/dist/collections/EventTypes/hooks/index.d.ts +3 -0
  55. package/dist/collections/EventTypes/hooks/index.d.ts.map +1 -0
  56. package/dist/collections/EventTypes/hooks/index.js +6 -0
  57. package/dist/collections/EventTypes/index.d.ts +3 -0
  58. package/dist/collections/EventTypes/index.d.ts.map +1 -0
  59. package/dist/collections/EventTypes/index.js +67 -0
  60. package/dist/collections/Grants/access/index.d.ts +3 -0
  61. package/dist/collections/Grants/access/index.d.ts.map +1 -0
  62. package/dist/collections/Grants/access/index.js +8 -0
  63. package/dist/collections/Grants/hooks/ensureUniqueGrant.d.ts +4 -0
  64. package/dist/collections/Grants/hooks/ensureUniqueGrant.d.ts.map +1 -0
  65. package/dist/collections/Grants/hooks/ensureUniqueGrant.js +34 -0
  66. package/dist/collections/Grants/hooks/index.d.ts +3 -0
  67. package/dist/collections/Grants/hooks/index.d.ts.map +1 -0
  68. package/dist/collections/Grants/hooks/index.js +7 -0
  69. package/dist/collections/Grants/hooks/setGrantTitle.d.ts +4 -0
  70. package/dist/collections/Grants/hooks/setGrantTitle.d.ts.map +1 -0
  71. package/dist/collections/Grants/hooks/setGrantTitle.js +47 -0
  72. package/dist/collections/Grants/index.d.ts +3 -0
  73. package/dist/collections/Grants/index.d.ts.map +1 -0
  74. package/dist/collections/Grants/index.js +62 -0
  75. package/dist/collections/Logs/access/index.d.ts +3 -0
  76. package/dist/collections/Logs/access/index.d.ts.map +1 -0
  77. package/dist/collections/Logs/access/index.js +8 -0
  78. package/dist/collections/Logs/fields/validators.d.ts +5 -0
  79. package/dist/collections/Logs/fields/validators.d.ts.map +1 -0
  80. package/dist/collections/Logs/fields/validators.js +44 -0
  81. package/dist/collections/Logs/hooks/ensureTypeRequirements.d.ts +3 -0
  82. package/dist/collections/Logs/hooks/ensureTypeRequirements.d.ts.map +1 -0
  83. package/dist/collections/Logs/hooks/ensureTypeRequirements.js +35 -0
  84. package/dist/collections/Logs/hooks/index.d.ts +3 -0
  85. package/dist/collections/Logs/hooks/index.d.ts.map +1 -0
  86. package/dist/collections/Logs/hooks/index.js +4 -0
  87. package/dist/collections/Logs/index.d.ts +4 -0
  88. package/dist/collections/Logs/index.d.ts.map +1 -0
  89. package/dist/collections/Logs/index.js +113 -0
  90. package/dist/collections/Metrics/access/index.d.ts +12 -0
  91. package/dist/collections/Metrics/access/index.d.ts.map +1 -0
  92. package/dist/collections/Metrics/access/index.js +2 -0
  93. package/dist/collections/Metrics/hooks/index.d.ts +3 -0
  94. package/dist/collections/Metrics/hooks/index.d.ts.map +1 -0
  95. package/dist/collections/Metrics/hooks/index.js +6 -0
  96. package/dist/collections/Metrics/index.d.ts +3 -0
  97. package/dist/collections/Metrics/index.d.ts.map +1 -0
  98. package/dist/collections/Metrics/index.js +35 -0
  99. package/dist/collections/Tiers/access/index.d.ts +3 -0
  100. package/dist/collections/Tiers/access/index.d.ts.map +1 -0
  101. package/dist/collections/Tiers/access/index.js +2 -0
  102. package/dist/collections/Tiers/hooks/index.d.ts +3 -0
  103. package/dist/collections/Tiers/hooks/index.d.ts.map +1 -0
  104. package/dist/collections/Tiers/hooks/index.js +4 -0
  105. package/dist/collections/Tiers/hooks/validateUnlockRules.d.ts +3 -0
  106. package/dist/collections/Tiers/hooks/validateUnlockRules.d.ts.map +1 -0
  107. package/dist/collections/Tiers/hooks/validateUnlockRules.js +7 -0
  108. package/dist/collections/Tiers/index.d.ts +3 -0
  109. package/dist/collections/Tiers/index.d.ts.map +1 -0
  110. package/dist/collections/Tiers/index.js +81 -0
  111. package/dist/collections/access/definitions.d.ts +5 -0
  112. package/dist/collections/access/definitions.d.ts.map +1 -0
  113. package/dist/collections/access/definitions.js +11 -0
  114. package/dist/collections/applyOverrides.d.ts +9 -0
  115. package/dist/collections/applyOverrides.d.ts.map +1 -0
  116. package/dist/collections/applyOverrides.js +34 -0
  117. package/dist/collections/fields/catalogFilter.d.ts +8 -0
  118. package/dist/collections/fields/catalogFilter.d.ts.map +1 -0
  119. package/dist/collections/fields/catalogFilter.js +10 -0
  120. package/dist/collections/fields/index.d.ts +6 -0
  121. package/dist/collections/fields/index.d.ts.map +1 -0
  122. package/dist/collections/fields/index.js +5 -0
  123. package/dist/collections/fields/localizedText.d.ts +10 -0
  124. package/dist/collections/fields/localizedText.d.ts.map +1 -0
  125. package/dist/collections/fields/localizedText.js +20 -0
  126. package/dist/collections/fields/ruleFields.d.ts +8 -0
  127. package/dist/collections/fields/ruleFields.d.ts.map +1 -0
  128. package/dist/collections/fields/ruleFields.js +123 -0
  129. package/dist/collections/fields/scopeField.d.ts +7 -0
  130. package/dist/collections/fields/scopeField.d.ts.map +1 -0
  131. package/dist/collections/fields/scopeField.js +22 -0
  132. package/dist/collections/fields/userField.d.ts +4 -0
  133. package/dist/collections/fields/userField.d.ts.map +1 -0
  134. package/dist/collections/fields/userField.js +12 -0
  135. package/dist/collections/fields/usersAchievementsGroup.d.ts +8 -0
  136. package/dist/collections/fields/usersAchievementsGroup.d.ts.map +1 -0
  137. package/dist/collections/fields/usersAchievementsGroup.js +36 -0
  138. package/dist/collections/helpers.d.ts +16 -0
  139. package/dist/collections/helpers.d.ts.map +1 -0
  140. package/dist/collections/helpers.js +31 -0
  141. package/dist/collections/hooks/eachRuleLeaf.d.ts +3 -0
  142. package/dist/collections/hooks/eachRuleLeaf.d.ts.map +1 -0
  143. package/dist/collections/hooks/eachRuleLeaf.js +20 -0
  144. package/dist/collections/hooks/index.d.ts +4 -0
  145. package/dist/collections/hooks/index.d.ts.map +1 -0
  146. package/dist/collections/hooks/index.js +3 -0
  147. package/dist/collections/hooks/lockSystemCatalogFields.d.ts +7 -0
  148. package/dist/collections/hooks/lockSystemCatalogFields.d.ts.map +1 -0
  149. package/dist/collections/hooks/lockSystemCatalogFields.js +15 -0
  150. package/dist/collections/hooks/preventCatalogDelete.d.ts +5 -0
  151. package/dist/collections/hooks/preventCatalogDelete.d.ts.map +1 -0
  152. package/dist/collections/hooks/preventCatalogDelete.js +89 -0
  153. package/dist/collections/index.d.ts +4 -0
  154. package/dist/collections/index.d.ts.map +1 -0
  155. package/dist/collections/index.js +23 -0
  156. package/dist/collections/slugs.d.ts +22 -0
  157. package/dist/collections/slugs.d.ts.map +1 -0
  158. package/dist/collections/slugs.js +51 -0
  159. package/dist/defaults.d.ts +21 -0
  160. package/dist/defaults.d.ts.map +1 -0
  161. package/dist/defaults.js +31 -0
  162. package/dist/enabled.d.ts +4 -0
  163. package/dist/enabled.d.ts.map +1 -0
  164. package/dist/enabled.js +9 -0
  165. package/dist/endpoints/index.d.ts +4 -0
  166. package/dist/endpoints/index.d.ts.map +1 -0
  167. package/dist/endpoints/index.js +6 -0
  168. package/dist/endpoints/me.d.ts +7 -0
  169. package/dist/endpoints/me.d.ts.map +1 -0
  170. package/dist/endpoints/me.js +50 -0
  171. package/dist/exports/client.d.ts +4 -0
  172. package/dist/exports/client.d.ts.map +1 -0
  173. package/dist/exports/client.js +3 -0
  174. package/dist/extensions/registry.d.ts +3 -0
  175. package/dist/extensions/registry.d.ts.map +1 -0
  176. package/dist/extensions/registry.js +12 -0
  177. package/dist/index.d.ts +13 -0
  178. package/dist/index.d.ts.map +1 -0
  179. package/dist/index.js +8 -0
  180. package/dist/options-store.d.ts +7 -0
  181. package/dist/options-store.d.ts.map +1 -0
  182. package/dist/options-store.js +15 -0
  183. package/dist/plugin.d.ts +8 -0
  184. package/dist/plugin.d.ts.map +1 -0
  185. package/dist/plugin.js +31 -0
  186. package/dist/seed/index.d.ts +63 -0
  187. package/dist/seed/index.d.ts.map +1 -0
  188. package/dist/seed/index.js +375 -0
  189. package/dist/services/achievement/buildCatalogProgressGroups.d.ts +37 -0
  190. package/dist/services/achievement/buildCatalogProgressGroups.d.ts.map +1 -0
  191. package/dist/services/achievement/buildCatalogProgressGroups.js +70 -0
  192. package/dist/services/achievement/builtInRules.d.ts +3 -0
  193. package/dist/services/achievement/builtInRules.d.ts.map +1 -0
  194. package/dist/services/achievement/builtInRules.js +280 -0
  195. package/dist/services/achievement/evaluateRules.d.ts +48 -0
  196. package/dist/services/achievement/evaluateRules.d.ts.map +1 -0
  197. package/dist/services/achievement/evaluateRules.js +206 -0
  198. package/dist/services/achievement/eventTypeRequiresActor.d.ts +24 -0
  199. package/dist/services/achievement/eventTypeRequiresActor.d.ts.map +1 -0
  200. package/dist/services/achievement/eventTypeRequiresActor.js +46 -0
  201. package/dist/services/achievement/getUserProgress.d.ts +53 -0
  202. package/dist/services/achievement/getUserProgress.d.ts.map +1 -0
  203. package/dist/services/achievement/getUserProgress.js +163 -0
  204. package/dist/services/achievement/index.d.ts +14 -0
  205. package/dist/services/achievement/index.d.ts.map +1 -0
  206. package/dist/services/achievement/index.js +9 -0
  207. package/dist/services/achievement/recordEvent.d.ts +41 -0
  208. package/dist/services/achievement/recordEvent.d.ts.map +1 -0
  209. package/dist/services/achievement/recordEvent.js +126 -0
  210. package/dist/services/achievement/relationId.d.ts +3 -0
  211. package/dist/services/achievement/relationId.d.ts.map +1 -0
  212. package/dist/services/achievement/relationId.js +15 -0
  213. package/dist/services/achievement/resolveCatalog.d.ts +14 -0
  214. package/dist/services/achievement/resolveCatalog.d.ts.map +1 -0
  215. package/dist/services/achievement/resolveCatalog.js +34 -0
  216. package/dist/services/achievement/resolveCurrentTier.d.ts +21 -0
  217. package/dist/services/achievement/resolveCurrentTier.d.ts.map +1 -0
  218. package/dist/services/achievement/resolveCurrentTier.js +51 -0
  219. package/dist/services/achievement/resolveTierProgress.d.ts +35 -0
  220. package/dist/services/achievement/resolveTierProgress.d.ts.map +1 -0
  221. package/dist/services/achievement/resolveTierProgress.js +99 -0
  222. package/dist/services/achievement/reviewAchievementRequest.d.ts +11 -0
  223. package/dist/services/achievement/reviewAchievementRequest.d.ts.map +1 -0
  224. package/dist/services/achievement/reviewAchievementRequest.js +37 -0
  225. package/dist/services/achievement/submitAchievementRequest.d.ts +21 -0
  226. package/dist/services/achievement/submitAchievementRequest.d.ts.map +1 -0
  227. package/dist/services/achievement/submitAchievementRequest.js +126 -0
  228. package/dist/services/achievement/validateRules.d.ts +11 -0
  229. package/dist/services/achievement/validateRules.d.ts.map +1 -0
  230. package/dist/services/achievement/validateRules.js +74 -0
  231. package/dist/services/achievement/where.d.ts +9 -0
  232. package/dist/services/achievement/where.d.ts.map +1 -0
  233. package/dist/services/achievement/where.js +23 -0
  234. package/dist/types.d.ts +117 -0
  235. package/dist/types.d.ts.map +1 -0
  236. package/dist/types.js +1 -0
  237. package/package.json +85 -0
@@ -0,0 +1,21 @@
1
+ import type { AchievementPluginOptions } from './types';
2
+ import { resolveCollectionSlugs } from './collections/slugs';
3
+ export declare const DEFAULT_USERS_COLLECTION = "users";
4
+ export declare const DEFAULT_ME_ENDPOINT_PATH = "/achievements/me";
5
+ export type ResolvedAchievementOptions = Omit<AchievementPluginOptions, 'users' | 'endpoints'> & {
6
+ enabled: boolean;
7
+ usersCollectionSlug: string;
8
+ users: {
9
+ includeJoins: boolean;
10
+ };
11
+ /** Resolved collection slug map (after prefix + overrides). */
12
+ collectionSlugs: ReturnType<typeof resolveCollectionSlugs>;
13
+ /** Admin nav group for plugin collections (`false` = ungrouped). */
14
+ adminGroup: string | false;
15
+ endpoints: {
16
+ me: string | false;
17
+ };
18
+ };
19
+ export declare function resolveMeEndpointPath(me?: string | false): string | false;
20
+ export declare function resolveOptions(options?: AchievementPluginOptions): ResolvedAchievementOptions;
21
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAEL,sBAAsB,EACvB,MAAM,qBAAqB,CAAA;AAE5B,eAAO,MAAM,wBAAwB,UAAU,CAAA;AAC/C,eAAO,MAAM,wBAAwB,qBAAqB,CAAA;AAE1D,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,wBAAwB,EAAE,OAAO,GAAG,WAAW,CAAC,GAAG;IAC/F,OAAO,EAAE,OAAO,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAA;IAChC,+DAA+D;IAC/D,eAAe,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAA;IAC1D,oEAAoE;IACpE,UAAU,EAAE,MAAM,GAAG,KAAK,CAAA;IAC1B,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAA;CAClC,CAAA;AAQD,wBAAgB,qBAAqB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAIzE;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,wBAA6B,GAAG,0BAA0B,CAcjG"}
@@ -0,0 +1,31 @@
1
+ import { resolveAdminGroup, resolveCollectionSlugs, } from './collections/slugs';
2
+ export const DEFAULT_USERS_COLLECTION = 'users';
3
+ export const DEFAULT_ME_ENDPOINT_PATH = '/achievements/me';
4
+ function normalizeEndpointPath(path) {
5
+ const trimmed = path.trim();
6
+ if (!trimmed)
7
+ return DEFAULT_ME_ENDPOINT_PATH;
8
+ return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
9
+ }
10
+ export function resolveMeEndpointPath(me) {
11
+ if (me === false)
12
+ return false;
13
+ if (me == null)
14
+ return DEFAULT_ME_ENDPOINT_PATH;
15
+ return normalizeEndpointPath(me);
16
+ }
17
+ export function resolveOptions(options = {}) {
18
+ return {
19
+ ...options,
20
+ enabled: options.enabled !== false,
21
+ usersCollectionSlug: options.usersCollectionSlug ?? DEFAULT_USERS_COLLECTION,
22
+ users: {
23
+ includeJoins: options.users?.includeJoins !== false,
24
+ },
25
+ collectionSlugs: resolveCollectionSlugs(options),
26
+ adminGroup: resolveAdminGroup(options),
27
+ endpoints: {
28
+ me: resolveMeEndpointPath(options.endpoints?.me),
29
+ },
30
+ };
31
+ }
@@ -0,0 +1,4 @@
1
+ import type { Payload } from 'payload';
2
+ /** True when the plugin is opted in and its collections are on this Payload config. */
3
+ export declare function isAchievementPluginEnabled(payload: Payload): boolean;
4
+ //# sourceMappingURL=enabled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enabled.d.ts","sourceRoot":"","sources":["../src/enabled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAKtC,uFAAuF;AACvF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAIpE"}
@@ -0,0 +1,9 @@
1
+ import { slugOf } from './collections/helpers';
2
+ import { getAchievementOptions } from './options-store';
3
+ /** True when the plugin is opted in and its collections are on this Payload config. */
4
+ export function isAchievementPluginEnabled(payload) {
5
+ if (!getAchievementOptions().enabled)
6
+ return false;
7
+ const slug = slugOf('logs');
8
+ return Boolean(payload.config.collections?.some((collection) => collection.slug === slug));
9
+ }
@@ -0,0 +1,4 @@
1
+ import type { Endpoint } from 'payload';
2
+ import type { ResolvedAchievementOptions } from '../defaults';
3
+ export declare function buildAchievementEndpoints(options: ResolvedAchievementOptions): Endpoint[];
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/endpoints/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAG7D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,QAAQ,EAAE,CAGzF"}
@@ -0,0 +1,6 @@
1
+ import { buildMeEndpoint } from './me';
2
+ export function buildAchievementEndpoints(options) {
3
+ if (options.endpoints.me === false)
4
+ return [];
5
+ return [buildMeEndpoint(options.endpoints.me)];
6
+ }
@@ -0,0 +1,7 @@
1
+ import type { Endpoint } from 'payload';
2
+ /**
3
+ * `GET` current user’s snapshot. Body is Payload `find`-shaped for **grants**,
4
+ * plus ladder-derived `tiers` and lean `requests`. Optional `?scope=` / `limit` / `page`.
5
+ */
6
+ export declare function buildMeEndpoint(path: string): Endpoint;
7
+ //# sourceMappingURL=me.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../src/endpoints/me.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,SAAS,CAAA;AA+BvD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAqBtD"}
@@ -0,0 +1,50 @@
1
+ import { getUserId } from '../access/helpers/index';
2
+ import { getUserProgress } from '../services/achievement/getUserProgress';
3
+ function requestUrl(req) {
4
+ return req.url ? new URL(req.url, 'http://local') : null;
5
+ }
6
+ function scopeFromRequest(req) {
7
+ const url = requestUrl(req);
8
+ const raw = url?.searchParams.get('scope') ?? url?.searchParams.get('scopeId');
9
+ return raw && raw.length > 0 ? raw : null;
10
+ }
11
+ function positiveInt(raw, fallback) {
12
+ if (raw == null || raw === '')
13
+ return fallback;
14
+ const n = Number(raw);
15
+ if (!Number.isFinite(n) || n < 1)
16
+ return fallback;
17
+ return Math.floor(n);
18
+ }
19
+ function pagingFromRequest(req) {
20
+ const params = requestUrl(req)?.searchParams;
21
+ return {
22
+ limit: positiveInt(params?.get('limit') ?? null, 10),
23
+ page: positiveInt(params?.get('page') ?? null, 1),
24
+ requestsLimit: positiveInt(params?.get('requestsLimit') ?? null, 20),
25
+ };
26
+ }
27
+ /**
28
+ * `GET` current user’s snapshot. Body is Payload `find`-shaped for **grants**,
29
+ * plus ladder-derived `tiers` and lean `requests`. Optional `?scope=` / `limit` / `page`.
30
+ */
31
+ export function buildMeEndpoint(path) {
32
+ return {
33
+ path,
34
+ method: 'get',
35
+ handler: async (req) => {
36
+ const userId = getUserId(req);
37
+ if (!userId) {
38
+ return Response.json({ errors: [{ message: 'Unauthorized' }] }, { status: 401 });
39
+ }
40
+ const body = await getUserProgress({
41
+ payload: req.payload,
42
+ req,
43
+ userId,
44
+ scopeId: scopeFromRequest(req),
45
+ paging: pagingFromRequest(req),
46
+ });
47
+ return Response.json(body);
48
+ },
49
+ };
50
+ }
@@ -0,0 +1,4 @@
1
+ export { ActorField } from '../admin/ActorField';
2
+ export { MetricChangeField } from '../admin/MetricChangeField';
3
+ export { MetricField } from '../admin/MetricField';
4
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { ActorField } from '../admin/ActorField';
2
+ export { MetricChangeField } from '../admin/MetricChangeField';
3
+ export { MetricField } from '../admin/MetricField';
@@ -0,0 +1,3 @@
1
+ import type { AchievementRuleType } from '../types';
2
+ export declare function getRuleTypeMap(): Map<string, AchievementRuleType>;
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/extensions/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAInD,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CASjE"}
@@ -0,0 +1,12 @@
1
+ import { getAchievementOptions } from '../options-store';
2
+ import { builtInRuleTypes } from '../services/achievement/builtInRules';
3
+ export function getRuleTypeMap() {
4
+ const map = new Map();
5
+ for (const rule of builtInRuleTypes) {
6
+ map.set(rule.type, rule);
7
+ }
8
+ for (const rule of getAchievementOptions().extensions?.ruleTypes ?? []) {
9
+ map.set(rule.type, rule);
10
+ }
11
+ return map;
12
+ }
@@ -0,0 +1,13 @@
1
+ export { DEFAULT_ACHIEVEMENT_METRIC, DEFAULT_ACHIEVEMENT_METRIC_SLUG, ENGINE_EVENT_TYPES, ENGINE_METRICS, } from './catalog';
2
+ export type { EngineEventTypeSlug, EngineMetricSlug } from './catalog';
3
+ export { achievementPlugin } from './plugin';
4
+ export { seedAchievementCatalog, seedAchievements } from './seed/index';
5
+ export type { AchievementSeedAchievement, AchievementSeedCatalogRow, AchievementSeedInput, AchievementSeedLocalizedText, AchievementSeedTier, } from './seed/index';
6
+ export { evaluateRules, evaluateRuleProgress, collectAchievementCompleteRefs, buildCatalogProgressGroups, getUserProgress, grantAchievement, recordEvent, recordLog, recordMetricChange, resolveCurrentTier, resolveTierProgress, reviewAchievementRequest, submitAchievementRequest, syncTierChangedLog, validateRuleGroup, validateRuleNode, } from './services/achievement/index';
7
+ export type { ResolvedTier, RuleGroup, TierLadderProgress, CatalogProgressGroup, CatalogProgressItem } from './services/achievement/index';
8
+ export type { BuiltInEventType, BuiltInRuleType, AchievementCollectionKey, AchievementCollectionOverride, AchievementCollectionsOptions, AchievementEndpointsOptions, AchievementPluginOptions, AchievementRuleType, AchievementScopeConfig, AchievementUsersOptions, } from './types';
9
+ export { DEFAULT_COLLECTION_BASE_SLUGS, DEFAULT_COLLECTION_PREFIX, DEFAULT_ADMIN_GROUP } from './collections/slugs';
10
+ export { DEFAULT_ME_ENDPOINT_PATH } from './defaults';
11
+ export { collectionOf, slugOf } from './collections/helpers';
12
+ export { isAchievementPluginEnabled } from './enabled';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,kBAAkB,EAClB,cAAc,GACf,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACvE,YAAY,EACV,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,8BAA8B,EAC9B,0BAA0B,EAC1B,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,8BAA8B,CAAA;AACrC,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAC1I,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,wBAAwB,EACxB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACnH,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { DEFAULT_ACHIEVEMENT_METRIC, DEFAULT_ACHIEVEMENT_METRIC_SLUG, ENGINE_EVENT_TYPES, ENGINE_METRICS, } from './catalog';
2
+ export { achievementPlugin } from './plugin';
3
+ export { seedAchievementCatalog, seedAchievements } from './seed/index';
4
+ export { evaluateRules, evaluateRuleProgress, collectAchievementCompleteRefs, buildCatalogProgressGroups, getUserProgress, grantAchievement, recordEvent, recordLog, recordMetricChange, resolveCurrentTier, resolveTierProgress, reviewAchievementRequest, submitAchievementRequest, syncTierChangedLog, validateRuleGroup, validateRuleNode, } from './services/achievement/index';
5
+ export { DEFAULT_COLLECTION_BASE_SLUGS, DEFAULT_COLLECTION_PREFIX, DEFAULT_ADMIN_GROUP } from './collections/slugs';
6
+ export { DEFAULT_ME_ENDPOINT_PATH } from './defaults';
7
+ export { collectionOf, slugOf } from './collections/helpers';
8
+ export { isAchievementPluginEnabled } from './enabled';
@@ -0,0 +1,7 @@
1
+ import type { AchievementPluginOptions } from './types';
2
+ import { type ResolvedAchievementOptions } from './defaults';
3
+ export declare function setAchievementOptions(options: AchievementPluginOptions): void;
4
+ /** Test helper — clears the process-wide options singleton. */
5
+ export declare function resetAchievementOptions(): void;
6
+ export declare function getAchievementOptions(): ResolvedAchievementOptions;
7
+ //# sourceMappingURL=options-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options-store.d.ts","sourceRoot":"","sources":["../src/options-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,EAAkB,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAI5E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAE7E;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,qBAAqB,IAAI,0BAA0B,CAKlE"}
@@ -0,0 +1,15 @@
1
+ import { resolveOptions } from './defaults';
2
+ let stored = null;
3
+ export function setAchievementOptions(options) {
4
+ stored = resolveOptions(options);
5
+ }
6
+ /** Test helper — clears the process-wide options singleton. */
7
+ export function resetAchievementOptions() {
8
+ stored = null;
9
+ }
10
+ export function getAchievementOptions() {
11
+ if (!stored) {
12
+ stored = resolveOptions({});
13
+ }
14
+ return stored;
15
+ }
@@ -0,0 +1,8 @@
1
+ import type { Plugin } from 'payload';
2
+ import type { AchievementPluginOptions } from './types';
3
+ /**
4
+ * Payload achievements plugin — merges collections (hooks own request/grant flow)
5
+ * and an optional current-user grants endpoint.
6
+ */
7
+ export declare const achievementPlugin: (options?: AchievementPluginOptions) => Plugin;
8
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;AAO7C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC3B,UAAS,wBAA6B,KAAG,MA0BzC,CAAA"}
package/dist/plugin.js ADDED
@@ -0,0 +1,31 @@
1
+ import { buildAchievementCollections } from './collections/index';
2
+ import { usersAchievementsGroup } from './collections/fields/usersAchievementsGroup';
3
+ import { resolveOptions } from './defaults';
4
+ import { buildAchievementEndpoints } from './endpoints/index';
5
+ import { setAchievementOptions } from './options-store';
6
+ /**
7
+ * Payload achievements plugin — merges collections (hooks own request/grant flow)
8
+ * and an optional current-user grants endpoint.
9
+ */
10
+ export const achievementPlugin = (options = {}) => (config) => {
11
+ const resolved = resolveOptions(options);
12
+ setAchievementOptions(resolved);
13
+ if (!resolved.enabled)
14
+ return config;
15
+ const achievementCollections = buildAchievementCollections();
16
+ const usersSlug = resolved.usersCollectionSlug;
17
+ const collections = (config.collections ?? []).map((collection) => {
18
+ if (collection.slug !== usersSlug || resolved.users?.includeJoins === false) {
19
+ return collection;
20
+ }
21
+ return {
22
+ ...collection,
23
+ fields: [...(collection.fields ?? []), usersAchievementsGroup(resolved)],
24
+ };
25
+ });
26
+ return {
27
+ ...config,
28
+ collections: [...collections, ...achievementCollections],
29
+ endpoints: [...(config.endpoints ?? []), ...buildAchievementEndpoints(resolved)],
30
+ };
31
+ };
@@ -0,0 +1,63 @@
1
+ import type { Payload } from 'payload';
2
+ /** Default-locale string, or per-locale map for fields marked `localized: true` (host locales). */
3
+ export type AchievementSeedLocalizedText = string | {
4
+ en: string;
5
+ [locale: string]: string | undefined;
6
+ };
7
+ export type AchievementSeedTier = {
8
+ name: AchievementSeedLocalizedText;
9
+ slug: string;
10
+ rank: number;
11
+ description?: AchievementSeedLocalizedText;
12
+ /** Optional Lucide-style icon key for the rank ladder (e.g. `sparkles`, `shield`). */
13
+ icon?: string;
14
+ /** Optional media upload id when the host configured `mediaCollection`. */
15
+ image?: string;
16
+ scope?: string;
17
+ /** Bare rule array (AND) or `{ combinator, rules }`. Seed slugs resolved to relationships. */
18
+ unlockRules?: Record<string, unknown>[] | {
19
+ combinator?: string;
20
+ rules?: Record<string, unknown>[];
21
+ };
22
+ };
23
+ export type AchievementSeedAchievement = {
24
+ name: AchievementSeedLocalizedText;
25
+ slug: string;
26
+ description?: AchievementSeedLocalizedText;
27
+ scope?: string;
28
+ requiresReview?: boolean;
29
+ eligibilityRules?: Record<string, unknown>[] | {
30
+ combinator?: string;
31
+ rules?: Record<string, unknown>[];
32
+ };
33
+ /** What this achievement is composed of (auto-grant when these pass and requiresReview is false). */
34
+ completionRules?: Record<string, unknown>[] | {
35
+ combinator?: string;
36
+ rules?: Record<string, unknown>[];
37
+ };
38
+ };
39
+ export type AchievementSeedCatalogRow = {
40
+ name: AchievementSeedLocalizedText;
41
+ slug: string;
42
+ scope?: string;
43
+ system?: boolean;
44
+ /** Event types only — when true, logging the event requires an actor. */
45
+ requiresActor?: boolean;
46
+ /** Event types only — when true, logging the event requires metric + change. */
47
+ requiresMetric?: boolean;
48
+ };
49
+ export type AchievementSeedInput = {
50
+ eventTypes?: AchievementSeedCatalogRow[];
51
+ metrics?: AchievementSeedCatalogRow[];
52
+ tiers?: AchievementSeedTier[];
53
+ achievements?: AchievementSeedAchievement[];
54
+ /** Slugs to delete after upsert (e.g. renamed catalog rows). */
55
+ removeAchievementSlugs?: string[];
56
+ };
57
+ /** Upsert engine event types + metrics (`system: true`). English (default locale) only. */
58
+ export declare function seedAchievementCatalog(payload: Payload, scope?: string): Promise<void>;
59
+ /**
60
+ * Idempotent upsert of achievement definitions by slug. Host supplies its own catalog and ladder data.
61
+ */
62
+ export declare function seedAchievements(payload: Payload, input: AchievementSeedInput): Promise<void>;
63
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seed/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAMtC,mGAAmG;AACnG,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,CAAA;AAExG,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,4BAA4B,CAAA;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8FAA8F;IAC9F,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAA;CACrG,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,4BAA4B,CAAA;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,4BAA4B,CAAA;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAA;IACzG,qGAAqG;IACrG,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAA;CACzG,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,4BAA4B,CAAA;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,yBAAyB,EAAE,CAAA;IACxC,OAAO,CAAC,EAAE,yBAAyB,EAAE,CAAA;IACrC,KAAK,CAAC,EAAE,mBAAmB,EAAE,CAAA;IAC7B,YAAY,CAAC,EAAE,0BAA0B,EAAE,CAAA;IAC3C,gEAAgE;IAChE,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAA;CAClC,CAAA;AAmMD,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5F;AAiCD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkLnG"}