@dappermountain/payload-plugin-achievements 0.4.0 → 0.4.2

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/README.md CHANGED
@@ -294,9 +294,9 @@ achievementPlugin({
294
294
  canReview,
295
295
  extensions: {
296
296
  metricAnchors: {
297
- 'membership-granted': {
297
+ 'enrollment-started': {
298
298
  // Admin UI i18n (Payload label / OptionLabel)
299
- label: ({ t }) => t('custom:achievements:anchors:membershipGranted'),
299
+ label: ({ t }) => t('custom:achievements:anchors:enrollmentStarted'),
300
300
  resolve: async ({ payload, userId, scopeId }) => {
301
301
  // return a Date from host data, or null
302
302
  return null
@@ -371,12 +371,12 @@ await reconcileProgression({
371
371
  payload,
372
372
  userId: '…',
373
373
  scopeId: '…',
374
- achievementSlug: 'ring-grim',
375
- tierSlug: 'ring-solid',
374
+ achievementSlug: 'path-complete',
375
+ tierSlug: 'veteran',
376
376
  })
377
377
 
378
378
  // Host CLI (only boot config in the app — flags live in the plugin):
379
- // bun --env-file=.env ./scripts/reconcile-achievements.ts -- --user=<id> --achievement=ring-grim
379
+ // bun --env-file=.env ./scripts/reconcile-achievements.ts -- --user=<id> --achievement=path-complete
380
380
  import { runReconcileCli } from '@dappermountain/payload-plugin-achievements/cli'
381
381
  await runReconcileCli({ config })
382
382
  ```
@@ -440,8 +440,8 @@ await seedAchievements(payload, {
440
440
  metrics: [{ name: 'Streak days', slug: 'streak-days' }],
441
441
  tiers: [
442
442
  {
443
- name: 'Prospect',
444
- slug: 'prospect',
443
+ name: 'Novice',
444
+ slug: 'novice',
445
445
  rank: 0,
446
446
  unlockRules: [], // open
447
447
  },
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,EAEL,sBAAsB,EACvB,MAAM,wBAAwB,CAAA;AAE/B,eAAO,MAAM,wBAAwB,UAAU,CAAA;AAC/C,eAAO,MAAM,wBAAwB,qBAAqB,CAAA;AAC1D,eAAO,MAAM,iCAAiC,8BAA8B,CAAA;AAC5E,eAAO,MAAM,+BAA+B,4BAA4B,CAAA;AAExE,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,wBAAwB,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC,GAAG;IAC5G,OAAO,EAAE,OAAO,CAAA;IAChB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAA;IAChC,kFAAkF;IAClF,kBAAkB,EAAE,MAAM,EAAE,CAAA;IAC5B,+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,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAA;CAC1F,CAAA;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAWtF;AAQD,wBAAgB,qBAAqB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAIzE;AAED,wBAAgB,8BAA8B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAIpF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAIlF;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,wBAA6B,GAAG,0BAA0B,CAmBjG"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,EAEL,sBAAsB,EACvB,MAAM,wBAAwB,CAAA;AAE/B,eAAO,MAAM,wBAAwB,UAAU,CAAA;AAC/C,eAAO,MAAM,wBAAwB,qBAAqB,CAAA;AAC1D,eAAO,MAAM,iCAAiC,8BAA8B,CAAA;AAC5E,eAAO,MAAM,+BAA+B,4BAA4B,CAAA;AAExE,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,wBAAwB,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC,GAAG;IAC5G,OAAO,EAAE,OAAO,CAAA;IAChB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAA;IAChC,kFAAkF;IAClF,kBAAkB,EAAE,MAAM,EAAE,CAAA;IAC5B,+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,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAA;CAC1F,CAAA;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAWtF;AAQD,wBAAgB,qBAAqB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAIzE;AAED,wBAAgB,8BAA8B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAIpF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAIlF;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,wBAA6B,GAAG,0BAA0B,CAwBjG"}
package/dist/defaults.js CHANGED
@@ -46,6 +46,10 @@ export function resolveReconcileEndpointPath(path) {
46
46
  }
47
47
  export function resolveOptions(options = {}) {
48
48
  const { subjects: _subjects, ...rest } = options;
49
+ // Idempotent: `setAchievementOptions(resolveOptions(opts))` strips `subjects` and would
50
+ // otherwise wipe `subjectCollections` on the second pass.
51
+ const fromConfig = resolveSubjectCollections(options);
52
+ const alreadyResolved = options.subjectCollections;
49
53
  return {
50
54
  ...rest,
51
55
  enabled: options.enabled !== false,
@@ -54,7 +58,7 @@ export function resolveOptions(options = {}) {
54
58
  users: {
55
59
  includeJoins: options.users?.includeJoins !== false,
56
60
  },
57
- subjectCollections: resolveSubjectCollections(options),
61
+ subjectCollections: options.subjects != null ? fromConfig : (alreadyResolved ?? fromConfig),
58
62
  collectionSlugs: resolveCollectionSlugs(options),
59
63
  adminGroup: resolveAdminGroup(options),
60
64
  endpoints: {
@@ -1 +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,YAAY,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC3B,UAAS,wBAA6B,KAAG,MAmCzC,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,SAAS,CAAA;AAM7C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC3B,UAAS,wBAA6B,KAAG,MAqCzC,CAAA"}
package/dist/plugin.js CHANGED
@@ -1,15 +1,16 @@
1
1
  import { buildAchievementCollections } from './collections/index.js';
2
2
  import { usersAchievementsGroup } from './collections/fields/usersAchievementsGroup.js';
3
- import { resolveOptions } from './defaults.js';
4
3
  import { buildAchievementEndpoints } from './endpoints/index.js';
5
- import { setAchievementOptions } from './options-store.js';
4
+ import { getAchievementOptions, setAchievementOptions } from './options-store.js';
6
5
  /**
7
6
  * Payload achievements plugin — merges collections (hooks own request/grant flow)
8
7
  * and an optional current-user grants endpoint.
9
8
  */
10
9
  export const achievementPlugin = (options = {}) => (config) => {
11
- const resolved = resolveOptions(options);
12
- setAchievementOptions(resolved);
10
+ // Store the host options (not a pre-resolved object) so `subjects.collections`
11
+ // survives `setAchievementOptions` → `resolveOptions`.
12
+ setAchievementOptions(options);
13
+ const resolved = getAchievementOptions();
13
14
  if (!resolved.enabled)
14
15
  return config;
15
16
  const achievementCollections = buildAchievementCollections();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dappermountain/payload-plugin-achievements",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "A robust, Admin-configured achievements engine for Payload: composable unlock rules, derived rank progress, request/review grants, metrics, and scoped multi-tenant support.",
5
5
  "license": "MIT",
6
6
  "type": "module",