@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.
- package/LICENSE +21 -0
- package/README.md +319 -0
- package/dist/access/helpers/index.d.ts +9 -0
- package/dist/access/helpers/index.d.ts.map +1 -0
- package/dist/access/helpers/index.js +25 -0
- package/dist/access/index.d.ts +3 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/index.js +2 -0
- package/dist/access/roles/index.d.ts +15 -0
- package/dist/access/roles/index.d.ts.map +1 -0
- package/dist/access/roles/index.js +55 -0
- package/dist/admin/ActorField.d.ts +9 -0
- package/dist/admin/ActorField.d.ts.map +1 -0
- package/dist/admin/ActorField.js +19 -0
- package/dist/admin/MetricChangeField.d.ts +9 -0
- package/dist/admin/MetricChangeField.d.ts.map +1 -0
- package/dist/admin/MetricChangeField.js +21 -0
- package/dist/admin/MetricField.d.ts +9 -0
- package/dist/admin/MetricField.d.ts.map +1 -0
- package/dist/admin/MetricField.js +23 -0
- package/dist/admin/useEventTypeFlags.d.ts +7 -0
- package/dist/admin/useEventTypeFlags.d.ts.map +1 -0
- package/dist/admin/useEventTypeFlags.js +68 -0
- package/dist/catalog.d.ts +21 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +9 -0
- package/dist/collections/AchievementRequests/access/index.d.ts +3 -0
- package/dist/collections/AchievementRequests/access/index.d.ts.map +1 -0
- package/dist/collections/AchievementRequests/access/index.js +8 -0
- package/dist/collections/AchievementRequests/hooks/index.d.ts +3 -0
- package/dist/collections/AchievementRequests/hooks/index.d.ts.map +1 -0
- package/dist/collections/AchievementRequests/hooks/index.js +5 -0
- package/dist/collections/AchievementRequests/hooks/prepareAchievementRequest.d.ts +12 -0
- package/dist/collections/AchievementRequests/hooks/prepareAchievementRequest.d.ts.map +1 -0
- package/dist/collections/AchievementRequests/hooks/prepareAchievementRequest.js +105 -0
- package/dist/collections/AchievementRequests/index.d.ts +3 -0
- package/dist/collections/AchievementRequests/index.d.ts.map +1 -0
- package/dist/collections/AchievementRequests/index.js +39 -0
- package/dist/collections/Achievements/access/index.d.ts +3 -0
- package/dist/collections/Achievements/access/index.d.ts.map +1 -0
- package/dist/collections/Achievements/access/index.js +2 -0
- package/dist/collections/Achievements/hooks/index.d.ts +3 -0
- package/dist/collections/Achievements/hooks/index.d.ts.map +1 -0
- package/dist/collections/Achievements/hooks/index.js +4 -0
- package/dist/collections/Achievements/hooks/validateEligibilityRules.d.ts +3 -0
- package/dist/collections/Achievements/hooks/validateEligibilityRules.d.ts.map +1 -0
- package/dist/collections/Achievements/hooks/validateEligibilityRules.js +8 -0
- package/dist/collections/Achievements/index.d.ts +3 -0
- package/dist/collections/Achievements/index.d.ts.map +1 -0
- package/dist/collections/Achievements/index.js +62 -0
- package/dist/collections/EventTypes/access/index.d.ts +12 -0
- package/dist/collections/EventTypes/access/index.d.ts.map +1 -0
- package/dist/collections/EventTypes/access/index.js +2 -0
- package/dist/collections/EventTypes/hooks/index.d.ts +3 -0
- package/dist/collections/EventTypes/hooks/index.d.ts.map +1 -0
- package/dist/collections/EventTypes/hooks/index.js +6 -0
- package/dist/collections/EventTypes/index.d.ts +3 -0
- package/dist/collections/EventTypes/index.d.ts.map +1 -0
- package/dist/collections/EventTypes/index.js +67 -0
- package/dist/collections/Grants/access/index.d.ts +3 -0
- package/dist/collections/Grants/access/index.d.ts.map +1 -0
- package/dist/collections/Grants/access/index.js +8 -0
- package/dist/collections/Grants/hooks/ensureUniqueGrant.d.ts +4 -0
- package/dist/collections/Grants/hooks/ensureUniqueGrant.d.ts.map +1 -0
- package/dist/collections/Grants/hooks/ensureUniqueGrant.js +34 -0
- package/dist/collections/Grants/hooks/index.d.ts +3 -0
- package/dist/collections/Grants/hooks/index.d.ts.map +1 -0
- package/dist/collections/Grants/hooks/index.js +7 -0
- package/dist/collections/Grants/hooks/setGrantTitle.d.ts +4 -0
- package/dist/collections/Grants/hooks/setGrantTitle.d.ts.map +1 -0
- package/dist/collections/Grants/hooks/setGrantTitle.js +47 -0
- package/dist/collections/Grants/index.d.ts +3 -0
- package/dist/collections/Grants/index.d.ts.map +1 -0
- package/dist/collections/Grants/index.js +62 -0
- package/dist/collections/Logs/access/index.d.ts +3 -0
- package/dist/collections/Logs/access/index.d.ts.map +1 -0
- package/dist/collections/Logs/access/index.js +8 -0
- package/dist/collections/Logs/fields/validators.d.ts +5 -0
- package/dist/collections/Logs/fields/validators.d.ts.map +1 -0
- package/dist/collections/Logs/fields/validators.js +44 -0
- package/dist/collections/Logs/hooks/ensureTypeRequirements.d.ts +3 -0
- package/dist/collections/Logs/hooks/ensureTypeRequirements.d.ts.map +1 -0
- package/dist/collections/Logs/hooks/ensureTypeRequirements.js +35 -0
- package/dist/collections/Logs/hooks/index.d.ts +3 -0
- package/dist/collections/Logs/hooks/index.d.ts.map +1 -0
- package/dist/collections/Logs/hooks/index.js +4 -0
- package/dist/collections/Logs/index.d.ts +4 -0
- package/dist/collections/Logs/index.d.ts.map +1 -0
- package/dist/collections/Logs/index.js +113 -0
- package/dist/collections/Metrics/access/index.d.ts +12 -0
- package/dist/collections/Metrics/access/index.d.ts.map +1 -0
- package/dist/collections/Metrics/access/index.js +2 -0
- package/dist/collections/Metrics/hooks/index.d.ts +3 -0
- package/dist/collections/Metrics/hooks/index.d.ts.map +1 -0
- package/dist/collections/Metrics/hooks/index.js +6 -0
- package/dist/collections/Metrics/index.d.ts +3 -0
- package/dist/collections/Metrics/index.d.ts.map +1 -0
- package/dist/collections/Metrics/index.js +35 -0
- package/dist/collections/Tiers/access/index.d.ts +3 -0
- package/dist/collections/Tiers/access/index.d.ts.map +1 -0
- package/dist/collections/Tiers/access/index.js +2 -0
- package/dist/collections/Tiers/hooks/index.d.ts +3 -0
- package/dist/collections/Tiers/hooks/index.d.ts.map +1 -0
- package/dist/collections/Tiers/hooks/index.js +4 -0
- package/dist/collections/Tiers/hooks/validateUnlockRules.d.ts +3 -0
- package/dist/collections/Tiers/hooks/validateUnlockRules.d.ts.map +1 -0
- package/dist/collections/Tiers/hooks/validateUnlockRules.js +7 -0
- package/dist/collections/Tiers/index.d.ts +3 -0
- package/dist/collections/Tiers/index.d.ts.map +1 -0
- package/dist/collections/Tiers/index.js +81 -0
- package/dist/collections/access/definitions.d.ts +5 -0
- package/dist/collections/access/definitions.d.ts.map +1 -0
- package/dist/collections/access/definitions.js +11 -0
- package/dist/collections/applyOverrides.d.ts +9 -0
- package/dist/collections/applyOverrides.d.ts.map +1 -0
- package/dist/collections/applyOverrides.js +34 -0
- package/dist/collections/fields/catalogFilter.d.ts +8 -0
- package/dist/collections/fields/catalogFilter.d.ts.map +1 -0
- package/dist/collections/fields/catalogFilter.js +10 -0
- package/dist/collections/fields/index.d.ts +6 -0
- package/dist/collections/fields/index.d.ts.map +1 -0
- package/dist/collections/fields/index.js +5 -0
- package/dist/collections/fields/localizedText.d.ts +10 -0
- package/dist/collections/fields/localizedText.d.ts.map +1 -0
- package/dist/collections/fields/localizedText.js +20 -0
- package/dist/collections/fields/ruleFields.d.ts +8 -0
- package/dist/collections/fields/ruleFields.d.ts.map +1 -0
- package/dist/collections/fields/ruleFields.js +123 -0
- package/dist/collections/fields/scopeField.d.ts +7 -0
- package/dist/collections/fields/scopeField.d.ts.map +1 -0
- package/dist/collections/fields/scopeField.js +22 -0
- package/dist/collections/fields/userField.d.ts +4 -0
- package/dist/collections/fields/userField.d.ts.map +1 -0
- package/dist/collections/fields/userField.js +12 -0
- package/dist/collections/fields/usersAchievementsGroup.d.ts +8 -0
- package/dist/collections/fields/usersAchievementsGroup.d.ts.map +1 -0
- package/dist/collections/fields/usersAchievementsGroup.js +36 -0
- package/dist/collections/helpers.d.ts +16 -0
- package/dist/collections/helpers.d.ts.map +1 -0
- package/dist/collections/helpers.js +31 -0
- package/dist/collections/hooks/eachRuleLeaf.d.ts +3 -0
- package/dist/collections/hooks/eachRuleLeaf.d.ts.map +1 -0
- package/dist/collections/hooks/eachRuleLeaf.js +20 -0
- package/dist/collections/hooks/index.d.ts +4 -0
- package/dist/collections/hooks/index.d.ts.map +1 -0
- package/dist/collections/hooks/index.js +3 -0
- package/dist/collections/hooks/lockSystemCatalogFields.d.ts +7 -0
- package/dist/collections/hooks/lockSystemCatalogFields.d.ts.map +1 -0
- package/dist/collections/hooks/lockSystemCatalogFields.js +15 -0
- package/dist/collections/hooks/preventCatalogDelete.d.ts +5 -0
- package/dist/collections/hooks/preventCatalogDelete.d.ts.map +1 -0
- package/dist/collections/hooks/preventCatalogDelete.js +89 -0
- package/dist/collections/index.d.ts +4 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +23 -0
- package/dist/collections/slugs.d.ts +22 -0
- package/dist/collections/slugs.d.ts.map +1 -0
- package/dist/collections/slugs.js +51 -0
- package/dist/defaults.d.ts +21 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +31 -0
- package/dist/enabled.d.ts +4 -0
- package/dist/enabled.d.ts.map +1 -0
- package/dist/enabled.js +9 -0
- package/dist/endpoints/index.d.ts +4 -0
- package/dist/endpoints/index.d.ts.map +1 -0
- package/dist/endpoints/index.js +6 -0
- package/dist/endpoints/me.d.ts +7 -0
- package/dist/endpoints/me.d.ts.map +1 -0
- package/dist/endpoints/me.js +50 -0
- package/dist/exports/client.d.ts +4 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +3 -0
- package/dist/extensions/registry.d.ts +3 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +12 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/options-store.d.ts +7 -0
- package/dist/options-store.d.ts.map +1 -0
- package/dist/options-store.js +15 -0
- package/dist/plugin.d.ts +8 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +31 -0
- package/dist/seed/index.d.ts +63 -0
- package/dist/seed/index.d.ts.map +1 -0
- package/dist/seed/index.js +375 -0
- package/dist/services/achievement/buildCatalogProgressGroups.d.ts +37 -0
- package/dist/services/achievement/buildCatalogProgressGroups.d.ts.map +1 -0
- package/dist/services/achievement/buildCatalogProgressGroups.js +70 -0
- package/dist/services/achievement/builtInRules.d.ts +3 -0
- package/dist/services/achievement/builtInRules.d.ts.map +1 -0
- package/dist/services/achievement/builtInRules.js +280 -0
- package/dist/services/achievement/evaluateRules.d.ts +48 -0
- package/dist/services/achievement/evaluateRules.d.ts.map +1 -0
- package/dist/services/achievement/evaluateRules.js +206 -0
- package/dist/services/achievement/eventTypeRequiresActor.d.ts +24 -0
- package/dist/services/achievement/eventTypeRequiresActor.d.ts.map +1 -0
- package/dist/services/achievement/eventTypeRequiresActor.js +46 -0
- package/dist/services/achievement/getUserProgress.d.ts +53 -0
- package/dist/services/achievement/getUserProgress.d.ts.map +1 -0
- package/dist/services/achievement/getUserProgress.js +163 -0
- package/dist/services/achievement/index.d.ts +14 -0
- package/dist/services/achievement/index.d.ts.map +1 -0
- package/dist/services/achievement/index.js +9 -0
- package/dist/services/achievement/recordEvent.d.ts +41 -0
- package/dist/services/achievement/recordEvent.d.ts.map +1 -0
- package/dist/services/achievement/recordEvent.js +126 -0
- package/dist/services/achievement/relationId.d.ts +3 -0
- package/dist/services/achievement/relationId.d.ts.map +1 -0
- package/dist/services/achievement/relationId.js +15 -0
- package/dist/services/achievement/resolveCatalog.d.ts +14 -0
- package/dist/services/achievement/resolveCatalog.d.ts.map +1 -0
- package/dist/services/achievement/resolveCatalog.js +34 -0
- package/dist/services/achievement/resolveCurrentTier.d.ts +21 -0
- package/dist/services/achievement/resolveCurrentTier.d.ts.map +1 -0
- package/dist/services/achievement/resolveCurrentTier.js +51 -0
- package/dist/services/achievement/resolveTierProgress.d.ts +35 -0
- package/dist/services/achievement/resolveTierProgress.d.ts.map +1 -0
- package/dist/services/achievement/resolveTierProgress.js +99 -0
- package/dist/services/achievement/reviewAchievementRequest.d.ts +11 -0
- package/dist/services/achievement/reviewAchievementRequest.d.ts.map +1 -0
- package/dist/services/achievement/reviewAchievementRequest.js +37 -0
- package/dist/services/achievement/submitAchievementRequest.d.ts +21 -0
- package/dist/services/achievement/submitAchievementRequest.d.ts.map +1 -0
- package/dist/services/achievement/submitAchievementRequest.js +126 -0
- package/dist/services/achievement/validateRules.d.ts +11 -0
- package/dist/services/achievement/validateRules.d.ts.map +1 -0
- package/dist/services/achievement/validateRules.js +74 -0
- package/dist/services/achievement/where.d.ts +9 -0
- package/dist/services/achievement/where.d.ts.map +1 -0
- package/dist/services/achievement/where.js +23 -0
- package/dist/types.d.ts +117 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { scopeField } from './scopeField';
|
|
2
|
+
export { userField } from './userField';
|
|
3
|
+
export { buildRuleRowFields, buildRuleTreeFields } from './ruleFields';
|
|
4
|
+
export { usersAchievementsGroup } from './usersAchievementsGroup';
|
|
5
|
+
export { localizedDescriptionField, localizedNameField } from './localizedText';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { scopeField } from './scopeField';
|
|
2
|
+
export { userField } from './userField';
|
|
3
|
+
export { buildRuleRowFields, buildRuleTreeFields } from './ruleFields';
|
|
4
|
+
export { usersAchievementsGroup } from './usersAchievementsGroup';
|
|
5
|
+
export { localizedDescriptionField, localizedNameField } from './localizedText';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Field } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Display copy for catalog rows. Localized when the host enables Payload `localization`.
|
|
4
|
+
* Slugs stay non-localized identifiers for rules and code.
|
|
5
|
+
*/
|
|
6
|
+
export declare function localizedNameField(admin?: {
|
|
7
|
+
width?: string;
|
|
8
|
+
}): Field;
|
|
9
|
+
export declare function localizedDescriptionField(): Field;
|
|
10
|
+
//# sourceMappingURL=localizedText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localizedText.d.ts","sourceRoot":"","sources":["../../../src/collections/fields/localizedText.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAQpE;AAED,wBAAgB,yBAAyB,IAAI,KAAK,CAMjD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display copy for catalog rows. Localized when the host enables Payload `localization`.
|
|
3
|
+
* Slugs stay non-localized identifiers for rules and code.
|
|
4
|
+
*/
|
|
5
|
+
export function localizedNameField(admin) {
|
|
6
|
+
return {
|
|
7
|
+
name: 'name',
|
|
8
|
+
type: 'text',
|
|
9
|
+
required: true,
|
|
10
|
+
localized: true,
|
|
11
|
+
...(admin ? { admin } : {}),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function localizedDescriptionField() {
|
|
15
|
+
return {
|
|
16
|
+
name: 'description',
|
|
17
|
+
type: 'textarea',
|
|
18
|
+
localized: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Field } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Top-level rule group: combinator + rules, with one nested group level.
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildRuleTreeFields(): Field[];
|
|
6
|
+
/** @deprecated Use {@link buildRuleTreeFields}. */
|
|
7
|
+
export declare function buildRuleRowFields(): Field[];
|
|
8
|
+
//# sourceMappingURL=ruleFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruleFields.d.ts","sourceRoot":"","sources":["../../../src/collections/fields/ruleFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAqGpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,KAAK,EAAE,CAqB7C;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,IAAI,KAAK,EAAE,CAE5C"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { catalogFilterOptions } from './catalogFilter';
|
|
2
|
+
import { collectionOf } from '../helpers';
|
|
3
|
+
function combinatorField(visibleWhenGroup) {
|
|
4
|
+
return {
|
|
5
|
+
name: 'combinator',
|
|
6
|
+
type: 'select',
|
|
7
|
+
required: true,
|
|
8
|
+
defaultValue: 'and',
|
|
9
|
+
options: [
|
|
10
|
+
{ label: 'All of these', value: 'and' },
|
|
11
|
+
{ label: 'Any of these', value: 'or' },
|
|
12
|
+
],
|
|
13
|
+
...(visibleWhenGroup
|
|
14
|
+
? { admin: { condition: (_, sibling) => sibling?.type === 'group' } }
|
|
15
|
+
: {}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function ruleTypeSelect(includeGroup) {
|
|
19
|
+
return {
|
|
20
|
+
name: 'type',
|
|
21
|
+
type: 'select',
|
|
22
|
+
required: true,
|
|
23
|
+
options: [
|
|
24
|
+
{ label: 'Tier at least', value: 'tier-at-least' },
|
|
25
|
+
{ label: 'Achievement complete', value: 'achievement-complete' },
|
|
26
|
+
{ label: 'Metric minimum', value: 'metric-minimum' },
|
|
27
|
+
{ label: 'Event count', value: 'event-count' },
|
|
28
|
+
...(includeGroup ? [{ label: 'Group', value: 'group' }] : []),
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function ruleParamFields() {
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
name: 'tier',
|
|
36
|
+
type: 'relationship',
|
|
37
|
+
relationTo: collectionOf('tiers'),
|
|
38
|
+
filterOptions: catalogFilterOptions,
|
|
39
|
+
admin: {
|
|
40
|
+
condition: (_, sibling) => sibling?.type === 'tier-at-least',
|
|
41
|
+
description: 'They must be at least this tier.',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'achievement',
|
|
46
|
+
type: 'relationship',
|
|
47
|
+
relationTo: collectionOf('achievements'),
|
|
48
|
+
filterOptions: catalogFilterOptions,
|
|
49
|
+
admin: {
|
|
50
|
+
condition: (_, sibling) => sibling?.type === 'achievement-complete',
|
|
51
|
+
description: 'They must already have this achievement.',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'metric',
|
|
56
|
+
type: 'relationship',
|
|
57
|
+
relationTo: collectionOf('metrics'),
|
|
58
|
+
filterOptions: catalogFilterOptions,
|
|
59
|
+
admin: {
|
|
60
|
+
condition: (_, sibling) => sibling?.type === 'metric-minimum',
|
|
61
|
+
description: 'Which score to check.',
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'minimum',
|
|
66
|
+
type: 'number',
|
|
67
|
+
admin: {
|
|
68
|
+
condition: (_, sibling) => sibling?.type === 'metric-minimum',
|
|
69
|
+
description: 'They need at least this much.',
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'eventType',
|
|
74
|
+
type: 'relationship',
|
|
75
|
+
relationTo: collectionOf('eventTypes'),
|
|
76
|
+
filterOptions: catalogFilterOptions,
|
|
77
|
+
admin: {
|
|
78
|
+
condition: (_, sibling) => sibling?.type === 'event-count',
|
|
79
|
+
description: 'Which event type to count.',
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'count',
|
|
84
|
+
type: 'number',
|
|
85
|
+
admin: {
|
|
86
|
+
condition: (_, sibling) => sibling?.type === 'event-count',
|
|
87
|
+
description: 'How many times it needs to have happened.',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
function buildRuleLeafFields() {
|
|
93
|
+
return [ruleTypeSelect(false), ...ruleParamFields()];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Top-level rule group: combinator + rules, with one nested group level.
|
|
97
|
+
*/
|
|
98
|
+
export function buildRuleTreeFields() {
|
|
99
|
+
return [
|
|
100
|
+
combinatorField(),
|
|
101
|
+
{
|
|
102
|
+
name: 'rules',
|
|
103
|
+
type: 'array',
|
|
104
|
+
labels: { singular: 'Rule', plural: 'Rules' },
|
|
105
|
+
fields: [
|
|
106
|
+
ruleTypeSelect(true),
|
|
107
|
+
...ruleParamFields(),
|
|
108
|
+
combinatorField(true),
|
|
109
|
+
{
|
|
110
|
+
name: 'rules',
|
|
111
|
+
type: 'array',
|
|
112
|
+
labels: { singular: 'Rule', plural: 'Rules' },
|
|
113
|
+
admin: { condition: (_, sibling) => sibling?.type === 'group' },
|
|
114
|
+
fields: buildRuleLeafFields(),
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
/** @deprecated Use {@link buildRuleTreeFields}. */
|
|
121
|
+
export function buildRuleRowFields() {
|
|
122
|
+
return buildRuleTreeFields();
|
|
123
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Field } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Optional relationship to the host scope collection.
|
|
4
|
+
* Returns `null` when `options.scope.collection` is unset — callers should omit it.
|
|
5
|
+
*/
|
|
6
|
+
export declare function scopeField(): Field | null;
|
|
7
|
+
//# sourceMappingURL=scopeField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopeField.d.ts","sourceRoot":"","sources":["../../../src/collections/fields/scopeField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAIpC;;;GAGG;AACH,wBAAgB,UAAU,IAAI,KAAK,GAAG,IAAI,CAiBzC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { getAchievementOptions } from '../../options-store';
|
|
2
|
+
/**
|
|
3
|
+
* Optional relationship to the host scope collection.
|
|
4
|
+
* Returns `null` when `options.scope.collection` is unset — callers should omit it.
|
|
5
|
+
*/
|
|
6
|
+
export function scopeField() {
|
|
7
|
+
const options = getAchievementOptions();
|
|
8
|
+
const relationTo = options.scope?.collection;
|
|
9
|
+
if (!relationTo)
|
|
10
|
+
return null;
|
|
11
|
+
const name = options.scope?.relationField ?? 'scope';
|
|
12
|
+
return {
|
|
13
|
+
name,
|
|
14
|
+
type: 'relationship',
|
|
15
|
+
relationTo,
|
|
16
|
+
required: false,
|
|
17
|
+
index: true,
|
|
18
|
+
admin: {
|
|
19
|
+
description: 'Optional tenant or workspace this belongs to.',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userField.d.ts","sourceRoot":"","sources":["../../../src/collections/fields/userField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAIpC,4CAA4C;AAC5C,wBAAgB,SAAS,IAAI,KAAK,CAUjC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getAchievementOptions } from '../../options-store';
|
|
2
|
+
/** Relationship to the users collection. */
|
|
3
|
+
export function userField() {
|
|
4
|
+
const users = getAchievementOptions().usersCollectionSlug ?? 'users';
|
|
5
|
+
return {
|
|
6
|
+
name: 'user',
|
|
7
|
+
type: 'relationship',
|
|
8
|
+
relationTo: users,
|
|
9
|
+
required: true,
|
|
10
|
+
index: true,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Field } from 'payload';
|
|
2
|
+
import type { ResolvedAchievementOptions } from '../../defaults';
|
|
3
|
+
/**
|
|
4
|
+
* Group on the users collection: reverse joins into grants + requests.
|
|
5
|
+
* Nested JSON shape: `user.achievements.grants` / `.requests`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function usersAchievementsGroup(options: ResolvedAchievementOptions): Field;
|
|
8
|
+
//# sourceMappingURL=usersAchievementsGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usersAchievementsGroup.d.ts","sourceRoot":"","sources":["../../../src/collections/fields/usersAchievementsGroup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAEhE;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,0BAA0B,GAAG,KAAK,CAgCjF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Group on the users collection: reverse joins into grants + requests.
|
|
3
|
+
* Nested JSON shape: `user.achievements.grants` / `.requests`.
|
|
4
|
+
*/
|
|
5
|
+
export function usersAchievementsGroup(options) {
|
|
6
|
+
const slugs = options.collectionSlugs;
|
|
7
|
+
return {
|
|
8
|
+
name: 'achievements',
|
|
9
|
+
type: 'group',
|
|
10
|
+
admin: {
|
|
11
|
+
description: 'Their grants and open requests.',
|
|
12
|
+
},
|
|
13
|
+
fields: [
|
|
14
|
+
{
|
|
15
|
+
name: 'grants',
|
|
16
|
+
type: 'join',
|
|
17
|
+
collection: slugs.grants,
|
|
18
|
+
on: 'user',
|
|
19
|
+
admin: {
|
|
20
|
+
allowCreate: false,
|
|
21
|
+
defaultColumns: ['achievement', 'completedAt', 'scope'],
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'requests',
|
|
26
|
+
type: 'join',
|
|
27
|
+
collection: slugs.achievementRequests,
|
|
28
|
+
on: 'user',
|
|
29
|
+
admin: {
|
|
30
|
+
allowCreate: false,
|
|
31
|
+
defaultColumns: ['achievement', 'status', 'createdAt'],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CollectionConfig, Field } from 'payload';
|
|
2
|
+
import type { AchievementCollectionKey } from '../types';
|
|
3
|
+
/** Resolved slug for a logical achievement collection. */
|
|
4
|
+
export declare function slugOf(key: AchievementCollectionKey): string;
|
|
5
|
+
/**
|
|
6
|
+
* Local API / relationship target. Host `generate:types` owns the real CollectionSlug union;
|
|
7
|
+
* plugins cast loosely at the boundary.
|
|
8
|
+
*/
|
|
9
|
+
export declare function collectionOf(key: AchievementCollectionKey): any;
|
|
10
|
+
/** Drop nullish optional fields (e.g. scope when unset). */
|
|
11
|
+
export declare function optionalFields(...fields: Array<Field | null | undefined>): Field[];
|
|
12
|
+
/** Admin defaultColumns — strips `scope` when the host did not configure a scope collection. */
|
|
13
|
+
export declare function columnsWithOptionalScope(columns: string[]): string[];
|
|
14
|
+
/** Shared admin bits (sidebar group + caller overrides). */
|
|
15
|
+
export declare function collectionAdmin(admin: NonNullable<CollectionConfig['admin']>): NonNullable<CollectionConfig['admin']>;
|
|
16
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/collections/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAGxD,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CAE5D;AAED;;;GAGG;AAEH,wBAAgB,YAAY,CAAC,GAAG,EAAE,wBAAwB,GAAG,GAAG,CAE/D;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,KAAK,EAAE,CAElF;AAED,gGAAgG;AAChG,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAGpE;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAC5C,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAMxC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getAchievementOptions } from '../options-store';
|
|
2
|
+
/** Resolved slug for a logical achievement collection. */
|
|
3
|
+
export function slugOf(key) {
|
|
4
|
+
return getAchievementOptions().collectionSlugs[key];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Local API / relationship target. Host `generate:types` owns the real CollectionSlug union;
|
|
8
|
+
* plugins cast loosely at the boundary.
|
|
9
|
+
*/
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- host owns CollectionSlug
|
|
11
|
+
export function collectionOf(key) {
|
|
12
|
+
return slugOf(key);
|
|
13
|
+
}
|
|
14
|
+
/** Drop nullish optional fields (e.g. scope when unset). */
|
|
15
|
+
export function optionalFields(...fields) {
|
|
16
|
+
return fields.filter((field) => field != null);
|
|
17
|
+
}
|
|
18
|
+
/** Admin defaultColumns — strips `scope` when the host did not configure a scope collection. */
|
|
19
|
+
export function columnsWithOptionalScope(columns) {
|
|
20
|
+
if (getAchievementOptions().scope?.collection)
|
|
21
|
+
return columns;
|
|
22
|
+
return columns.filter((column) => column !== 'scope');
|
|
23
|
+
}
|
|
24
|
+
/** Shared admin bits (sidebar group + caller overrides). */
|
|
25
|
+
export function collectionAdmin(admin) {
|
|
26
|
+
const group = getAchievementOptions().adminGroup;
|
|
27
|
+
return {
|
|
28
|
+
...admin,
|
|
29
|
+
...(group === false ? {} : { group }),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eachRuleLeaf.d.ts","sourceRoot":"","sources":["../../../src/collections/hooks/eachRuleLeaf.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;AAEjE,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAgBpE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function eachRuleLeaf(node, visit) {
|
|
2
|
+
if (Array.isArray(node)) {
|
|
3
|
+
for (const item of node)
|
|
4
|
+
eachRuleLeaf(item, visit);
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
if (!node || typeof node !== 'object')
|
|
8
|
+
return;
|
|
9
|
+
const rec = node;
|
|
10
|
+
if (rec.type === 'group') {
|
|
11
|
+
eachRuleLeaf(rec.rules, visit);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (Array.isArray(rec.rules) && (rec.combinator === 'and' || rec.combinator === 'or' || !rec.type)) {
|
|
15
|
+
eachRuleLeaf(rec.rules, visit);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (typeof rec.type === 'string')
|
|
19
|
+
visit(rec);
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CollectionBeforeChangeHook } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* System catalog rows keep a fixed slug and stay marked system on update
|
|
4
|
+
* so engine lookups by slug cannot be broken from Admin.
|
|
5
|
+
*/
|
|
6
|
+
export declare const lockSystemCatalogFields: CollectionBeforeChangeHook;
|
|
7
|
+
//# sourceMappingURL=lockSystemCatalogFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockSystemCatalogFields.d.ts","sourceRoot":"","sources":["../../../src/collections/hooks/lockSystemCatalogFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAEzD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,0BASrC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System catalog rows keep a fixed slug and stay marked system on update
|
|
3
|
+
* so engine lookups by slug cannot be broken from Admin.
|
|
4
|
+
*/
|
|
5
|
+
export const lockSystemCatalogFields = ({ data, originalDoc, operation }) => {
|
|
6
|
+
if (!data || operation !== 'update')
|
|
7
|
+
return data;
|
|
8
|
+
if (!originalDoc?.system)
|
|
9
|
+
return data;
|
|
10
|
+
data.system = true;
|
|
11
|
+
if (typeof originalDoc.slug === 'string') {
|
|
12
|
+
data.slug = originalDoc.slug;
|
|
13
|
+
}
|
|
14
|
+
return data;
|
|
15
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preventCatalogDelete.d.ts","sourceRoot":"","sources":["../../../src/collections/hooks/preventCatalogDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AA6CzD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAA;CAC7B,GAAG,0BAA0B,CAqD7B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { APIError } from 'payload';
|
|
2
|
+
import { collectionOf } from '../helpers';
|
|
3
|
+
import { relationId } from '../../services/achievement/relationId';
|
|
4
|
+
import { eachRuleLeaf } from './eachRuleLeaf';
|
|
5
|
+
async function countMatchingLeaves(args) {
|
|
6
|
+
let count = 0;
|
|
7
|
+
const visit = (rule) => {
|
|
8
|
+
if (args.match(rule))
|
|
9
|
+
count += 1;
|
|
10
|
+
};
|
|
11
|
+
const [tiers, achievements] = await Promise.all([
|
|
12
|
+
args.req.payload.find({
|
|
13
|
+
collection: collectionOf('tiers'),
|
|
14
|
+
depth: 0,
|
|
15
|
+
limit: 1000,
|
|
16
|
+
pagination: false,
|
|
17
|
+
overrideAccess: true,
|
|
18
|
+
req: args.req,
|
|
19
|
+
}),
|
|
20
|
+
args.req.payload.find({
|
|
21
|
+
collection: collectionOf('achievements'),
|
|
22
|
+
depth: 0,
|
|
23
|
+
limit: 1000,
|
|
24
|
+
pagination: false,
|
|
25
|
+
overrideAccess: true,
|
|
26
|
+
req: args.req,
|
|
27
|
+
}),
|
|
28
|
+
]);
|
|
29
|
+
for (const doc of tiers.docs) {
|
|
30
|
+
eachRuleLeaf(doc.unlockRules, visit);
|
|
31
|
+
}
|
|
32
|
+
for (const doc of achievements.docs) {
|
|
33
|
+
eachRuleLeaf(doc.eligibilityRules, visit);
|
|
34
|
+
eachRuleLeaf(doc.completionRules, visit);
|
|
35
|
+
}
|
|
36
|
+
return count;
|
|
37
|
+
}
|
|
38
|
+
export function preventCatalogDelete(args) {
|
|
39
|
+
const { kind } = args;
|
|
40
|
+
return async ({ id, req }) => {
|
|
41
|
+
const collectionKey = kind === 'eventType' ? 'eventTypes' : 'metrics';
|
|
42
|
+
const doc = (await req.payload.findByID({
|
|
43
|
+
collection: collectionOf(collectionKey),
|
|
44
|
+
id,
|
|
45
|
+
depth: 0,
|
|
46
|
+
overrideAccess: true,
|
|
47
|
+
req,
|
|
48
|
+
}));
|
|
49
|
+
if (doc?.system) {
|
|
50
|
+
throw new APIError('System catalog entries cannot be deleted.', 400);
|
|
51
|
+
}
|
|
52
|
+
const parts = [];
|
|
53
|
+
if (kind === 'eventType') {
|
|
54
|
+
const logs = await req.payload.count({
|
|
55
|
+
collection: collectionOf('logs'),
|
|
56
|
+
overrideAccess: true,
|
|
57
|
+
req,
|
|
58
|
+
where: { type: { equals: id } },
|
|
59
|
+
});
|
|
60
|
+
if (logs.totalDocs > 0)
|
|
61
|
+
parts.push(`${logs.totalDocs} log row(s)`);
|
|
62
|
+
const rules = await countMatchingLeaves({
|
|
63
|
+
req,
|
|
64
|
+
match: (rule) => rule.type === 'event-count' && relationId(rule.eventType) === id,
|
|
65
|
+
});
|
|
66
|
+
if (rules > 0)
|
|
67
|
+
parts.push(`${rules} rule(s)`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const logs = await req.payload.count({
|
|
71
|
+
collection: collectionOf('logs'),
|
|
72
|
+
overrideAccess: true,
|
|
73
|
+
req,
|
|
74
|
+
where: { metric: { equals: id } },
|
|
75
|
+
});
|
|
76
|
+
if (logs.totalDocs > 0)
|
|
77
|
+
parts.push(`${logs.totalDocs} log row(s)`);
|
|
78
|
+
const rules = await countMatchingLeaves({
|
|
79
|
+
req,
|
|
80
|
+
match: (rule) => rule.type === 'metric-minimum' && relationId(rule.metric) === id,
|
|
81
|
+
});
|
|
82
|
+
if (rules > 0)
|
|
83
|
+
parts.push(`${rules} rule(s)`);
|
|
84
|
+
}
|
|
85
|
+
if (parts.length > 0) {
|
|
86
|
+
throw new APIError(`Cannot delete "${doc?.name ?? id}": in use by ${parts.join(', ')}.`, 400);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAuB/C,qEAAqE;AACrE,wBAAgB,2BAA2B,IAAI,gBAAgB,EAAE,CAMhE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getAchievementOptions } from '../options-store';
|
|
2
|
+
import { applyCollectionOverrides } from './applyOverrides';
|
|
3
|
+
import { buildAchievementRequestsCollection } from './AchievementRequests/index';
|
|
4
|
+
import { buildAchievementsCollection } from './Achievements/index';
|
|
5
|
+
import { buildEventTypesCollection } from './EventTypes/index';
|
|
6
|
+
import { buildGrantsCollection } from './Grants/index';
|
|
7
|
+
import { buildLogsCollection } from './Logs/index';
|
|
8
|
+
import { buildMetricsCollection } from './Metrics/index';
|
|
9
|
+
import { buildTiersCollection } from './Tiers/index';
|
|
10
|
+
const builders = {
|
|
11
|
+
metrics: buildMetricsCollection,
|
|
12
|
+
eventTypes: buildEventTypesCollection,
|
|
13
|
+
tiers: buildTiersCollection,
|
|
14
|
+
achievements: buildAchievementsCollection,
|
|
15
|
+
grants: buildGrantsCollection,
|
|
16
|
+
achievementRequests: buildAchievementRequestsCollection,
|
|
17
|
+
logs: buildLogsCollection,
|
|
18
|
+
};
|
|
19
|
+
/** Build achievement collections after plugin options are stored. */
|
|
20
|
+
export function buildAchievementCollections() {
|
|
21
|
+
const overrides = getAchievementOptions().collections?.overrides;
|
|
22
|
+
return Object.keys(builders).map((key) => applyCollectionOverrides(builders[key](), overrides?.[key]));
|
|
23
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AchievementCollectionKey, AchievementPluginOptions } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Default slug prefix — always applied unless a per-collection `slugs` override is set.
|
|
4
|
+
* Drives collection slug, REST `/api/{slug}`, and default DB table names.
|
|
5
|
+
* Keeps plugin collections from colliding with host slugs.
|
|
6
|
+
* Admin nav grouping is separate (`adminGroup`).
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_COLLECTION_PREFIX = "achievement";
|
|
9
|
+
/**
|
|
10
|
+
* Base names combined with {@link DEFAULT_COLLECTION_PREFIX}.
|
|
11
|
+
* Example: `definitions` → `achievement-definitions` (avoids `achievement-achievements`).
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_COLLECTION_BASE_SLUGS: Record<AchievementCollectionKey, string>;
|
|
14
|
+
export declare const DEFAULT_ADMIN_GROUP = "Achievements";
|
|
15
|
+
/**
|
|
16
|
+
* Resolve final collection slugs from plugin options.
|
|
17
|
+
* Per-key `collections.slugs` overrides are absolute (ignore `prefix`);
|
|
18
|
+
* otherwise `${prefix}-${base}` with {@link DEFAULT_COLLECTION_PREFIX} when `prefix` is omitted.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveCollectionSlugs(options?: AchievementPluginOptions): Record<AchievementCollectionKey, string>;
|
|
21
|
+
export declare function resolveAdminGroup(options?: AchievementPluginOptions): string | false;
|
|
22
|
+
//# sourceMappingURL=slugs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slugs.d.ts","sourceRoot":"","sources":["../../src/collections/slugs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAElF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,gBAAgB,CAAA;AAEtD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAQlF,CAAA;AAED,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AAEjD;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAkB1C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,GAAG,KAAK,CAMxF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default slug prefix — always applied unless a per-collection `slugs` override is set.
|
|
3
|
+
* Drives collection slug, REST `/api/{slug}`, and default DB table names.
|
|
4
|
+
* Keeps plugin collections from colliding with host slugs.
|
|
5
|
+
* Admin nav grouping is separate (`adminGroup`).
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_COLLECTION_PREFIX = 'achievement';
|
|
8
|
+
/**
|
|
9
|
+
* Base names combined with {@link DEFAULT_COLLECTION_PREFIX}.
|
|
10
|
+
* Example: `definitions` → `achievement-definitions` (avoids `achievement-achievements`).
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_COLLECTION_BASE_SLUGS = {
|
|
13
|
+
tiers: 'tiers',
|
|
14
|
+
achievements: 'definitions',
|
|
15
|
+
grants: 'grants',
|
|
16
|
+
achievementRequests: 'requests',
|
|
17
|
+
logs: 'logs',
|
|
18
|
+
eventTypes: 'event-types',
|
|
19
|
+
metrics: 'metrics',
|
|
20
|
+
};
|
|
21
|
+
export const DEFAULT_ADMIN_GROUP = 'Achievements';
|
|
22
|
+
/**
|
|
23
|
+
* Resolve final collection slugs from plugin options.
|
|
24
|
+
* Per-key `collections.slugs` overrides are absolute (ignore `prefix`);
|
|
25
|
+
* otherwise `${prefix}-${base}` with {@link DEFAULT_COLLECTION_PREFIX} when `prefix` is omitted.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveCollectionSlugs(options = {}) {
|
|
28
|
+
const rawPrefix = options.collections?.prefix ?? options.slugPrefix;
|
|
29
|
+
const prefix = typeof rawPrefix === 'string' && rawPrefix.trim()
|
|
30
|
+
? rawPrefix.trim()
|
|
31
|
+
: DEFAULT_COLLECTION_PREFIX;
|
|
32
|
+
const overrides = options.collections?.slugs ?? {};
|
|
33
|
+
const slugs = {};
|
|
34
|
+
for (const key of Object.keys(DEFAULT_COLLECTION_BASE_SLUGS)) {
|
|
35
|
+
const override = overrides[key]?.trim();
|
|
36
|
+
if (override) {
|
|
37
|
+
slugs[key] = override;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
slugs[key] = `${prefix}-${DEFAULT_COLLECTION_BASE_SLUGS[key]}`;
|
|
41
|
+
}
|
|
42
|
+
return slugs;
|
|
43
|
+
}
|
|
44
|
+
export function resolveAdminGroup(options = {}) {
|
|
45
|
+
if (options.collections?.adminGroup === false)
|
|
46
|
+
return false;
|
|
47
|
+
if (typeof options.collections?.adminGroup === 'string') {
|
|
48
|
+
return options.collections.adminGroup;
|
|
49
|
+
}
|
|
50
|
+
return DEFAULT_ADMIN_GROUP;
|
|
51
|
+
}
|