@timardex/cluemart-shared 1.6.130 → 1.7.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/dist/ad-CVkVX_z5.d.ts +296 -0
- package/dist/ad-DA9ECAhK.d.mts +296 -0
- package/dist/affiliate-1RtkLnLP.d.ts +35 -0
- package/dist/affiliate-Cos2Syz5.d.mts +35 -0
- package/dist/chunk-HZMP7GXC.mjs +5330 -0
- package/dist/chunk-HZMP7GXC.mjs.map +1 -0
- package/dist/chunk-KZTOISPA.mjs +272 -0
- package/dist/chunk-KZTOISPA.mjs.map +1 -0
- package/dist/chunk-MVQ3CFQR.mjs +230 -0
- package/dist/chunk-MVQ3CFQR.mjs.map +1 -0
- package/dist/chunk-NPFJ2CN2.mjs +109 -0
- package/dist/chunk-NPFJ2CN2.mjs.map +1 -0
- package/dist/chunk-RKIRWZCH.mjs +368 -0
- package/dist/chunk-RKIRWZCH.mjs.map +1 -0
- package/dist/{chunk-OHHJ3KJJ.mjs → chunk-TAECMXM4.mjs} +267 -304
- package/dist/chunk-TAECMXM4.mjs.map +1 -0
- package/dist/chunk-VA5YN2K3.mjs +48 -0
- package/dist/chunk-VA5YN2K3.mjs.map +1 -0
- package/dist/chunk-ZZJSCYJK.mjs +958 -0
- package/dist/chunk-ZZJSCYJK.mjs.map +1 -0
- package/dist/contactUs-DGrDzJaM.d.mts +11 -0
- package/dist/contactUs-H7799pWe.d.ts +11 -0
- package/dist/enums/index.cjs +223 -2
- package/dist/enums/index.cjs.map +1 -1
- package/dist/enums/index.d.mts +164 -5
- package/dist/enums/index.d.ts +164 -5
- package/dist/enums/index.mjs +41 -1
- package/dist/formFields/index.cjs +168 -403
- package/dist/formFields/index.cjs.map +1 -1
- package/dist/formFields/index.d.mts +3 -6
- package/dist/formFields/index.d.ts +3 -6
- package/dist/formFields/index.mjs +47 -921
- package/dist/formFields/index.mjs.map +1 -1
- package/dist/global-BUUfmCo7.d.mts +698 -0
- package/dist/global-fKbMmluy.d.ts +698 -0
- package/dist/graphql/index.cjs +3329 -3340
- package/dist/graphql/index.cjs.map +1 -1
- package/dist/graphql/index.d.mts +487 -690
- package/dist/graphql/index.d.ts +487 -690
- package/dist/graphql/index.mjs +153 -2552
- package/dist/graphql/index.mjs.map +1 -1
- package/dist/hooks/index.cjs +3478 -773
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.mts +6 -13
- package/dist/hooks/index.d.ts +6 -13
- package/dist/hooks/index.mjs +99 -193
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/images/apple-maps-icon.webp.d.ts +1 -8
- package/dist/images/banner-horizontal.webp.d.ts +1 -8
- package/dist/images/banner-vertical.webp.d.ts +1 -8
- package/dist/images/cluiTui.webp.d.ts +1 -8
- package/dist/images/corporate.webp.d.ts +1 -8
- package/dist/images/facebook.webp.d.ts +1 -8
- package/dist/images/gazebo-top.webp.d.ts +1 -8
- package/dist/images/google-maps-icon.webp.d.ts +1 -8
- package/dist/images/googleMaps-logo-dark.webp.d.ts +1 -8
- package/dist/images/googleMaps-logo-light.webp.d.ts +1 -8
- package/dist/images/index.mjs +21 -86
- package/dist/images/index.mjs.map +1 -1
- package/dist/images/instagram.webp.d.ts +1 -8
- package/dist/images/logo-atr.webp.d.ts +1 -8
- package/dist/images/logo-dark.webp.d.ts +1 -8
- package/dist/images/logo.webp.d.ts +1 -8
- package/dist/images/meet.webp.d.ts +1 -8
- package/dist/images/mini-market1.webp.d.ts +1 -8
- package/dist/images/mini-market2.webp.d.ts +1 -8
- package/dist/images/mini-market3.webp.d.ts +1 -8
- package/dist/images/mini-market4.webp.d.ts +1 -8
- package/dist/images/mini-market5.webp.d.ts +1 -8
- package/dist/images/poll.webp.d.ts +1 -8
- package/dist/images/poster1.webp.d.ts +1 -8
- package/dist/images/poster2.webp.d.ts +1 -8
- package/dist/images/poster3.webp.d.ts +1 -8
- package/dist/images/poster4.webp.d.ts +1 -8
- package/dist/images/private.webp.d.ts +1 -8
- package/dist/images/qr-code.webp.d.ts +1 -8
- package/dist/images/school.webp.d.ts +1 -8
- package/dist/images/sima.webp.d.ts +1 -8
- package/dist/images/store-android.webp.d.ts +1 -8
- package/dist/images/store-ios.webp.d.ts +1 -8
- package/dist/images/tablas.webp.d.ts +1 -8
- package/dist/images/telefonos.webp.d.ts +1 -8
- package/dist/images/tiktok.webp.d.ts +1 -8
- package/dist/images/tip.webp.d.ts +1 -8
- package/dist/images/ugralos.webp.d.ts +1 -8
- package/dist/images/waze-maps-icon.webp.d.ts +1 -8
- package/dist/images/website.webp.d.ts +1 -8
- package/dist/images/youtube.webp.d.ts +1 -8
- package/dist/index.cjs +5883 -7079
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +1692 -2966
- package/dist/index.d.ts +1692 -2966
- package/dist/index.mjs +5020 -6162
- package/dist/index.mjs.map +1 -1
- package/dist/map/index.cjs +9 -14
- package/dist/map/index.cjs.map +1 -1
- package/dist/map/index.d.mts +14 -18
- package/dist/map/index.d.ts +14 -18
- package/dist/map/index.mjs +9 -14
- package/dist/map/index.mjs.map +1 -1
- package/dist/resourceActivities-BL_12IAo.d.ts +125 -0
- package/dist/resourceActivities-zczOntNk.d.mts +125 -0
- package/dist/sharing/index.cjs +1272 -63
- package/dist/sharing/index.cjs.map +1 -1
- package/dist/sharing/index.d.mts +7 -32
- package/dist/sharing/index.d.ts +7 -32
- package/dist/sharing/index.mjs +30 -188
- package/dist/sharing/index.mjs.map +1 -1
- package/dist/theme/index.mjs +5 -41
- package/dist/theme/index.mjs.map +1 -1
- package/dist/types/index.cjs +110 -868
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.mts +24 -230
- package/dist/types/index.d.ts +24 -230
- package/dist/types/index.mjs +27 -61
- package/dist/utils/index.cjs +214 -608
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.mts +53 -107
- package/dist/utils/index.d.ts +53 -107
- package/dist/utils/index.mjs +15 -43
- package/package.json +12 -40
- package/dist/affiliate-Bqqlffw8.d.mts +0 -36
- package/dist/affiliate-Btlp5XUp.d.ts +0 -36
- package/dist/affiliateAdapters-BW3BY7c5.d.mts +0 -118
- package/dist/affiliateAdapters-C51ISmuA.d.ts +0 -118
- package/dist/apollo/index.cjs +0 -1383
- package/dist/apollo/index.cjs.map +0 -1
- package/dist/apollo/index.d.mts +0 -323
- package/dist/apollo/index.d.ts +0 -323
- package/dist/apollo/index.mjs +0 -1295
- package/dist/apollo/index.mjs.map +0 -1
- package/dist/auth/index.cjs +0 -3322
- package/dist/auth/index.cjs.map +0 -1
- package/dist/auth/index.d.mts +0 -164
- package/dist/auth/index.d.ts +0 -164
- package/dist/auth/index.mjs +0 -379
- package/dist/auth/index.mjs.map +0 -1
- package/dist/auth-BOmAO53v.d.ts +0 -169
- package/dist/auth-CsITA95p.d.mts +0 -169
- package/dist/chunk-DATBGC2K.mjs +0 -347
- package/dist/chunk-DATBGC2K.mjs.map +0 -1
- package/dist/chunk-DDHECBJR.mjs +0 -726
- package/dist/chunk-DDHECBJR.mjs.map +0 -1
- package/dist/chunk-INQCDU24.mjs +0 -139
- package/dist/chunk-INQCDU24.mjs.map +0 -1
- package/dist/chunk-NWWKI4PJ.mjs +0 -297
- package/dist/chunk-NWWKI4PJ.mjs.map +0 -1
- package/dist/chunk-OHHJ3KJJ.mjs.map +0 -1
- package/dist/chunk-RAYUJODN.mjs +0 -45
- package/dist/chunk-RAYUJODN.mjs.map +0 -1
- package/dist/chunk-TOEFAEF2.mjs +0 -69
- package/dist/chunk-TOEFAEF2.mjs.map +0 -1
- package/dist/chunk-UKW7NZEQ.mjs +0 -2813
- package/dist/chunk-UKW7NZEQ.mjs.map +0 -1
- package/dist/dailyClue-C6WXY73z.d.mts +0 -105
- package/dist/dailyClue-C6WXY73z.d.ts +0 -105
- package/dist/event-C9K7CSg4.d.ts +0 -53
- package/dist/event-W0NhL5Cd.d.mts +0 -53
- package/dist/global-BbSFfYdd.d.ts +0 -181
- package/dist/global-C6v9tRji.d.mts +0 -181
- package/dist/graphql-CDOfA79A.d.ts +0 -1253
- package/dist/graphql-CcvzTs9k.d.mts +0 -1253
- package/dist/resourceActivities-CS8YRIIL.d.mts +0 -89
- package/dist/resourceActivities-DOdNPkhW.d.ts +0 -89
- package/dist/subscription-Cj_qBA7u.d.mts +0 -20
- package/dist/subscription-OiJ50uJb.d.ts +0 -20
- package/dist/vendor-DmMi2qmx.d.mts +0 -73
- package/dist/vendor-M9hVZlni.d.ts +0 -73
package/dist/auth-CsITA95p.d.mts
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { h as SubscriptionStatusEnumType, e as LicencesEnumType, i as RedeemRewardResponseType, R as ResourceImageType, L as LocationType, O as OsPlatformEnumType, j as RewardEnumType, D as DateTimeType, N as NotificationResourceEnumType, U as UserRoleEnumType, k as AuthPayloadType, l as RefreshTokenPayloadType, m as VerificationEnumType } from './graphql-CcvzTs9k.mjs';
|
|
2
|
-
import { M as MutationResponse, T as TermsAgreement, a as CreateFormData, U as UserLicenceType, P as PromoCodeType } from './global-C6v9tRji.mjs';
|
|
3
|
-
|
|
4
|
-
type UserFormData = {
|
|
5
|
-
_id?: string;
|
|
6
|
-
active: boolean;
|
|
7
|
-
avatar?: ResourceImageType | null;
|
|
8
|
-
avatarUpload?: ResourceImageType | null;
|
|
9
|
-
confirmPassword?: string | null;
|
|
10
|
-
email: string;
|
|
11
|
-
firstName: string;
|
|
12
|
-
isTester: boolean;
|
|
13
|
-
lastName: string;
|
|
14
|
-
location?: LocationType | null;
|
|
15
|
-
password?: string | null;
|
|
16
|
-
platform?: OsPlatformEnumType;
|
|
17
|
-
preferredRegion: string;
|
|
18
|
-
termsAgreement?: TermsAgreement | null;
|
|
19
|
-
};
|
|
20
|
-
type CreateUserFormData = CreateFormData<UserFormData>;
|
|
21
|
-
/**
|
|
22
|
-
* Write-side / mongoose activity event. GraphQL EventReferenceType uses the
|
|
23
|
-
* same fields; DateTimeType is already the generated ISO-string shape.
|
|
24
|
-
*/
|
|
25
|
-
type UserActivityEvent = {
|
|
26
|
-
resourceId: string;
|
|
27
|
-
dateTime: DateTimeType;
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Write-side Stripe subscription document (mongoose Dates).
|
|
31
|
-
* GraphQL StripeSubscriptionType serializes dates as ISO strings — dual-shape.
|
|
32
|
-
*/
|
|
33
|
-
type StripeSubscription = {
|
|
34
|
-
currentPlan?: LicencesEnumType;
|
|
35
|
-
customerId?: string;
|
|
36
|
-
endDate?: Date;
|
|
37
|
-
startDate?: Date;
|
|
38
|
-
status?: SubscriptionStatusEnumType;
|
|
39
|
-
subscriptionId?: string;
|
|
40
|
-
};
|
|
41
|
-
type SubscriptionStatusData = {
|
|
42
|
-
subscriptionId: string | null;
|
|
43
|
-
status: SubscriptionStatusEnumType;
|
|
44
|
-
priceId: string | null;
|
|
45
|
-
currentPlan: LicencesEnumType | null;
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* Write-side embedded userActivity (mongoose). GraphQL UserActivityType uses
|
|
49
|
-
* Maybe lists / EventReferenceType — dual-shape, do not collapse.
|
|
50
|
-
*/
|
|
51
|
-
type UserActivity = {
|
|
52
|
-
favourites: {
|
|
53
|
-
events: string[];
|
|
54
|
-
vendors: string[];
|
|
55
|
-
partners: string[];
|
|
56
|
-
};
|
|
57
|
-
going: {
|
|
58
|
-
events: UserActivityEvent[];
|
|
59
|
-
};
|
|
60
|
-
interested: {
|
|
61
|
-
events: UserActivityEvent[];
|
|
62
|
-
};
|
|
63
|
-
present: {
|
|
64
|
-
events: UserActivityEvent[];
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
/** GraphQL envelope for `redeemReward`. */
|
|
68
|
-
type RedeemRewardMutationResponse = MutationResponse<RedeemRewardResponseType>;
|
|
69
|
-
/**
|
|
70
|
-
* Write-side redeemed reward (mongoose Date). GraphQL RedeemedRewardType
|
|
71
|
-
* serializes redeemedAt as an ISO string — dual-shape.
|
|
72
|
-
*/
|
|
73
|
-
type RedeemedReward = {
|
|
74
|
-
name: RewardEnumType;
|
|
75
|
-
pointsUsed: number;
|
|
76
|
-
redeemedAt: Date;
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* Persistence / mongoose user document. Includes secrets (password hash,
|
|
80
|
-
* refreshToken) and internal emailSentFor that GraphQL UserType never exposes.
|
|
81
|
-
* Dates stay as JS Date for mongoose. Dual-shape vs generated UserType —
|
|
82
|
-
* do not collapse.
|
|
83
|
-
*
|
|
84
|
-
* Client-facing GraphQL UserType / SafeUserType are generated — see
|
|
85
|
-
* src/generated/graphql.ts, re-exported from types/index.ts. SafeUserType is
|
|
86
|
-
* an alias of that generated UserType (schema UserType already omits
|
|
87
|
-
* password/refreshToken).
|
|
88
|
-
*/
|
|
89
|
-
type UserWriteType = Omit<UserFormData, "confirmPassword" | "avatarUpload" | "_id"> & {
|
|
90
|
-
_id: string;
|
|
91
|
-
affiliate?: string | null;
|
|
92
|
-
createdAt: Date;
|
|
93
|
-
deletedAt: Date | null;
|
|
94
|
-
emailSentFor?: NotificationResourceEnumType[] | null;
|
|
95
|
-
events: string[] | null;
|
|
96
|
-
game: string | null;
|
|
97
|
-
licences: UserLicenceType[] | null;
|
|
98
|
-
overallPoints: number | null;
|
|
99
|
-
partner: string | null;
|
|
100
|
-
password: string;
|
|
101
|
-
promoCodes?: PromoCodeType[] | null;
|
|
102
|
-
redeemedRewards?: RedeemedReward[] | null;
|
|
103
|
-
refreshToken: string | null;
|
|
104
|
-
roles: UserRoleEnumType[];
|
|
105
|
-
school: string | null;
|
|
106
|
-
stripe?: StripeSubscription;
|
|
107
|
-
updatedAt: Date | null;
|
|
108
|
-
userActivity: UserActivity | null;
|
|
109
|
-
vendor: string | null;
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
interface AppSettingsFormData {
|
|
113
|
-
appVersion: string;
|
|
114
|
-
isOfflineMode: boolean;
|
|
115
|
-
minimumRedeemableAffiliatePoints: number;
|
|
116
|
-
}
|
|
117
|
-
type CreateAppSettingsFormData = CreateFormData<AppSettingsFormData>;
|
|
118
|
-
type AppSettingsType = AppSettingsFormData & {
|
|
119
|
-
_id: string;
|
|
120
|
-
activeSchoolsStudentCountTotal: number;
|
|
121
|
-
activeSchoolsStudentCountUpdatedAt: Date;
|
|
122
|
-
createdAt: Date;
|
|
123
|
-
key: string;
|
|
124
|
-
updatedAt: Date | null;
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
type LoginFormData = {
|
|
128
|
-
email: string;
|
|
129
|
-
isAdminPage?: boolean;
|
|
130
|
-
password: string;
|
|
131
|
-
platform?: OsPlatformEnumType;
|
|
132
|
-
};
|
|
133
|
-
type CreateLoginFormData = CreateFormData<LoginFormData>;
|
|
134
|
-
type RegisterFormData = {
|
|
135
|
-
email: string;
|
|
136
|
-
firstName: string;
|
|
137
|
-
lastName: string;
|
|
138
|
-
password: string;
|
|
139
|
-
platform?: OsPlatformEnumType;
|
|
140
|
-
preferredRegion: string;
|
|
141
|
-
promoCode?: PromoCodeType | null;
|
|
142
|
-
termsAgreement?: TermsAgreement | null;
|
|
143
|
-
};
|
|
144
|
-
type CreateRegisterFormData = CreateFormData<RegisterFormData>;
|
|
145
|
-
type RequestPasswordResetFormData = {
|
|
146
|
-
email: string;
|
|
147
|
-
};
|
|
148
|
-
type CreateRequestPasswordResetFormData = CreateFormData<RequestPasswordResetFormData>;
|
|
149
|
-
type ResetPasswordFormData = {
|
|
150
|
-
confirmPassword: string;
|
|
151
|
-
email: string;
|
|
152
|
-
password: string;
|
|
153
|
-
};
|
|
154
|
-
type CreateResetPasswordFormData = CreateFormData<ResetPasswordFormData>;
|
|
155
|
-
type ValidateVerificationTokenFormData = {
|
|
156
|
-
email: string;
|
|
157
|
-
verificationToken: string;
|
|
158
|
-
verificationType?: VerificationEnumType;
|
|
159
|
-
};
|
|
160
|
-
type CreateValidateVerificationTokenFormData = CreateFormData<ValidateVerificationTokenFormData>;
|
|
161
|
-
/**
|
|
162
|
-
* GraphQL AuthPayloadType / RefreshTokenPayloadType are generated —
|
|
163
|
-
* re-exported from types/index.ts. AuthPayloadType.user is schema UserType,
|
|
164
|
-
* which is already the redacted client shape (no password / refreshToken).
|
|
165
|
-
*/
|
|
166
|
-
type AuthMutationResponse = MutationResponse<AuthPayloadType>;
|
|
167
|
-
type RefreshTokenMutationResponse = MutationResponse<RefreshTokenPayloadType>;
|
|
168
|
-
|
|
169
|
-
export type { AppSettingsFormData as A, CreateAppSettingsFormData as C, LoginFormData as L, RedeemRewardMutationResponse as R, StripeSubscription as S, UserFormData as U, ValidateVerificationTokenFormData as V, AppSettingsType as a, AuthMutationResponse as b, CreateLoginFormData as c, CreateRegisterFormData as d, CreateRequestPasswordResetFormData as e, CreateResetPasswordFormData as f, CreateUserFormData as g, CreateValidateVerificationTokenFormData as h, RedeemedReward as i, RefreshTokenMutationResponse as j, RegisterFormData as k, RequestPasswordResetFormData as l, ResetPasswordFormData as m, SubscriptionStatusData as n, UserActivity as o, UserActivityEvent as p, UserWriteType as q };
|
package/dist/chunk-DATBGC2K.mjs
DELETED
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
// src/types/subscription.ts
|
|
2
|
-
var TIERS_BY_PRIORITY = ["pro_plus", "pro", "standard"];
|
|
3
|
-
var TIER_DISPLAY_LABELS = {
|
|
4
|
-
pro: "Pro",
|
|
5
|
-
// eslint-disable-next-line camelcase
|
|
6
|
-
pro_plus: "Pro+ Ads",
|
|
7
|
-
standard: "Standard"
|
|
8
|
-
};
|
|
9
|
-
var TIER_FROM_LICENCE = {
|
|
10
|
-
["pro_event" /* ProEvent */]: "pro",
|
|
11
|
-
["pro_plus_event" /* ProPlusEvent */]: "pro_plus",
|
|
12
|
-
["pro_plus_vendor" /* ProPlusVendor */]: "pro_plus",
|
|
13
|
-
["pro_vendor" /* ProVendor */]: "pro",
|
|
14
|
-
["standard_event" /* StandardEvent */]: "standard",
|
|
15
|
-
["standard_partner" /* StandardPartner */]: "standard",
|
|
16
|
-
["standard_vendor" /* StandardVendor */]: "standard",
|
|
17
|
-
["standard_affiliate" /* StandardAffiliate */]: "standard",
|
|
18
|
-
["standard_school" /* StandardSchool */]: "standard"
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
// src/auth/permissions/permissions.ts
|
|
22
|
-
var PERMISSIONS = [
|
|
23
|
-
"*",
|
|
24
|
-
// Dashboards
|
|
25
|
-
"dashboard.admin",
|
|
26
|
-
"dashboard.affiliate",
|
|
27
|
-
"dashboard.customer",
|
|
28
|
-
"dashboard.event",
|
|
29
|
-
"dashboard.partner",
|
|
30
|
-
"dashboard.school",
|
|
31
|
-
"dashboard.vendor",
|
|
32
|
-
// Admin: users
|
|
33
|
-
"users.delete",
|
|
34
|
-
"users.read",
|
|
35
|
-
"users.update",
|
|
36
|
-
// Admin: events
|
|
37
|
-
"events.create",
|
|
38
|
-
"events.delete",
|
|
39
|
-
"events.read",
|
|
40
|
-
"events.update",
|
|
41
|
-
// Admin: vendors
|
|
42
|
-
"vendors.create",
|
|
43
|
-
"vendors.delete",
|
|
44
|
-
"vendors.read",
|
|
45
|
-
"vendors.update",
|
|
46
|
-
// Admin: partners
|
|
47
|
-
"partners.create",
|
|
48
|
-
"partners.delete",
|
|
49
|
-
"partners.read",
|
|
50
|
-
"partners.update",
|
|
51
|
-
// Admin: schools
|
|
52
|
-
"schools.create",
|
|
53
|
-
"schools.delete",
|
|
54
|
-
"schools.read",
|
|
55
|
-
"schools.update",
|
|
56
|
-
// Admin: affiliates
|
|
57
|
-
"affiliates.create",
|
|
58
|
-
"affiliates.delete",
|
|
59
|
-
"affiliates.read",
|
|
60
|
-
"affiliates.update",
|
|
61
|
-
// Admin: ads / posts / settings
|
|
62
|
-
"ads.create",
|
|
63
|
-
"ads.delete",
|
|
64
|
-
"ads.read",
|
|
65
|
-
"ads.update",
|
|
66
|
-
"posts.create",
|
|
67
|
-
"posts.delete",
|
|
68
|
-
"posts.read",
|
|
69
|
-
"posts.update",
|
|
70
|
-
"settings.read",
|
|
71
|
-
"settings.update",
|
|
72
|
-
// Product: own-resource management
|
|
73
|
-
"affiliates.manage_own",
|
|
74
|
-
"events.manage_own",
|
|
75
|
-
"partners.manage_own",
|
|
76
|
-
"schools.manage_own",
|
|
77
|
-
"vendors.manage_own"
|
|
78
|
-
];
|
|
79
|
-
var WILDCARD_PERMISSION = "*";
|
|
80
|
-
|
|
81
|
-
// src/auth/permissions/rolePermissions.ts
|
|
82
|
-
var ADMIN_PERMISSIONS = [
|
|
83
|
-
"dashboard.admin",
|
|
84
|
-
"events.read",
|
|
85
|
-
"events.create",
|
|
86
|
-
"events.update",
|
|
87
|
-
"events.delete",
|
|
88
|
-
"vendors.read",
|
|
89
|
-
"vendors.create",
|
|
90
|
-
"vendors.update",
|
|
91
|
-
"vendors.delete",
|
|
92
|
-
"partners.read",
|
|
93
|
-
"partners.create",
|
|
94
|
-
"partners.update",
|
|
95
|
-
"partners.delete",
|
|
96
|
-
"schools.read",
|
|
97
|
-
"schools.create",
|
|
98
|
-
"schools.update",
|
|
99
|
-
"schools.delete",
|
|
100
|
-
"affiliates.read",
|
|
101
|
-
"affiliates.create",
|
|
102
|
-
"affiliates.update",
|
|
103
|
-
"affiliates.delete",
|
|
104
|
-
"ads.read",
|
|
105
|
-
"ads.create",
|
|
106
|
-
"ads.update",
|
|
107
|
-
"ads.delete",
|
|
108
|
-
"posts.read",
|
|
109
|
-
"posts.create",
|
|
110
|
-
"posts.update",
|
|
111
|
-
"posts.delete"
|
|
112
|
-
];
|
|
113
|
-
var ROLE_PERMISSIONS = {
|
|
114
|
-
["super_admin" /* SuperAdmin */]: ["*"],
|
|
115
|
-
["admin" /* Admin */]: ADMIN_PERMISSIONS,
|
|
116
|
-
["customer" /* Customer */]: ["dashboard.customer"],
|
|
117
|
-
["event" /* Event */]: ["dashboard.event", "events.manage_own"],
|
|
118
|
-
["vendor" /* Vendor */]: ["dashboard.vendor", "vendors.manage_own"],
|
|
119
|
-
["partner" /* Partner */]: ["dashboard.partner", "partners.manage_own"],
|
|
120
|
-
["school" /* School */]: ["dashboard.school", "schools.manage_own"],
|
|
121
|
-
["affiliate" /* Affiliate */]: [
|
|
122
|
-
"dashboard.affiliate",
|
|
123
|
-
"affiliates.manage_own"
|
|
124
|
-
]
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
// src/auth/permissions/helpers.ts
|
|
128
|
-
function normalizeRoles(roles) {
|
|
129
|
-
if (!roles?.length) return [];
|
|
130
|
-
return roles;
|
|
131
|
-
}
|
|
132
|
-
function getPermissionsForRoles(roles) {
|
|
133
|
-
const seen = /* @__PURE__ */ new Set();
|
|
134
|
-
const result = [];
|
|
135
|
-
for (const role of normalizeRoles(roles)) {
|
|
136
|
-
const perms = ROLE_PERMISSIONS[role] ?? [];
|
|
137
|
-
for (const perm of perms) {
|
|
138
|
-
if (!seen.has(perm)) {
|
|
139
|
-
seen.add(perm);
|
|
140
|
-
result.push(perm);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return result;
|
|
145
|
-
}
|
|
146
|
-
function permissionListIncludes(permissions, permission) {
|
|
147
|
-
if (!permissions?.length) return false;
|
|
148
|
-
const set = new Set(permissions);
|
|
149
|
-
if (set.has(WILDCARD_PERMISSION)) return true;
|
|
150
|
-
return set.has(permission);
|
|
151
|
-
}
|
|
152
|
-
function hasPermission(roles, permission) {
|
|
153
|
-
return permissionListIncludes(getPermissionsForRoles(roles), permission);
|
|
154
|
-
}
|
|
155
|
-
function hasAnyPermission(roles, permissions) {
|
|
156
|
-
if (permissions.length === 0) return false;
|
|
157
|
-
const granted = getPermissionsForRoles(roles);
|
|
158
|
-
return permissions.some((p) => permissionListIncludes(granted, p));
|
|
159
|
-
}
|
|
160
|
-
function hasAllPermissions(roles, permissions) {
|
|
161
|
-
if (permissions.length === 0) return true;
|
|
162
|
-
const granted = getPermissionsForRoles(roles);
|
|
163
|
-
return permissions.every((p) => permissionListIncludes(granted, p));
|
|
164
|
-
}
|
|
165
|
-
function hasRole(roles, role) {
|
|
166
|
-
return normalizeRoles(roles).includes(role);
|
|
167
|
-
}
|
|
168
|
-
function hasAnyRole(roles, checkRoles) {
|
|
169
|
-
if (checkRoles.length === 0) return false;
|
|
170
|
-
const set = new Set(normalizeRoles(roles));
|
|
171
|
-
return checkRoles.some((r) => set.has(r));
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// src/auth/permissions/adminAppAccess.ts
|
|
175
|
-
var ADMIN_APP_ROLES = [
|
|
176
|
-
"super_admin" /* SuperAdmin */,
|
|
177
|
-
"admin" /* Admin */,
|
|
178
|
-
"event" /* Event */,
|
|
179
|
-
"vendor" /* Vendor */,
|
|
180
|
-
"partner" /* Partner */,
|
|
181
|
-
"school" /* School */,
|
|
182
|
-
"affiliate" /* Affiliate */
|
|
183
|
-
];
|
|
184
|
-
var ADMIN_DASHBOARD_CONTEXTS = [
|
|
185
|
-
{
|
|
186
|
-
context: "staff",
|
|
187
|
-
home: "/dashboard",
|
|
188
|
-
label: "Staff",
|
|
189
|
-
pathPrefixes: ["/dashboard"],
|
|
190
|
-
roles: ["super_admin" /* SuperAdmin */, "admin" /* Admin */]
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
context: "event",
|
|
194
|
-
home: "/event/dashboard",
|
|
195
|
-
label: "Events",
|
|
196
|
-
pathPrefixes: ["/event"],
|
|
197
|
-
roles: ["event" /* Event */]
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
context: "vendor",
|
|
201
|
-
home: "/vendor/dashboard",
|
|
202
|
-
label: "Stallholders",
|
|
203
|
-
pathPrefixes: ["/vendor"],
|
|
204
|
-
roles: ["vendor" /* Vendor */]
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
context: "partner",
|
|
208
|
-
home: "/partner/dashboard",
|
|
209
|
-
label: "Partners",
|
|
210
|
-
pathPrefixes: ["/partner"],
|
|
211
|
-
roles: ["partner" /* Partner */]
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
context: "school",
|
|
215
|
-
home: "/school/dashboard",
|
|
216
|
-
label: "Schools",
|
|
217
|
-
pathPrefixes: ["/school"],
|
|
218
|
-
roles: ["school" /* School */]
|
|
219
|
-
},
|
|
220
|
-
{
|
|
221
|
-
context: "affiliate",
|
|
222
|
-
home: "/affiliate/dashboard",
|
|
223
|
-
label: "Affiliate",
|
|
224
|
-
pathPrefixes: ["/affiliate"],
|
|
225
|
-
roles: ["affiliate" /* Affiliate */]
|
|
226
|
-
}
|
|
227
|
-
];
|
|
228
|
-
function canAccessAdminApp(roles) {
|
|
229
|
-
return hasAnyRole(roles, ADMIN_APP_ROLES);
|
|
230
|
-
}
|
|
231
|
-
function getUsableAdminContexts(roles) {
|
|
232
|
-
return ADMIN_DASHBOARD_CONTEXTS.filter((ctx) => hasAnyRole(roles, ctx.roles));
|
|
233
|
-
}
|
|
234
|
-
function getDefaultAdminHome(roles, preferredContext) {
|
|
235
|
-
const usable = getUsableAdminContexts(roles);
|
|
236
|
-
if (usable.length === 0) {
|
|
237
|
-
return "/login";
|
|
238
|
-
}
|
|
239
|
-
if (preferredContext) {
|
|
240
|
-
const preferred = usable.find((ctx) => ctx.context === preferredContext);
|
|
241
|
-
if (preferred) return preferred.home;
|
|
242
|
-
}
|
|
243
|
-
return usable[0].home;
|
|
244
|
-
}
|
|
245
|
-
function resolveAdminContextFromPath(pathname) {
|
|
246
|
-
for (const ctx of ADMIN_DASHBOARD_CONTEXTS) {
|
|
247
|
-
if (ctx.pathPrefixes.some(
|
|
248
|
-
(prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`)
|
|
249
|
-
)) {
|
|
250
|
-
return ctx.context;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
function canAccessAdminPath(roles, pathname) {
|
|
256
|
-
if (!canAccessAdminApp(roles)) return false;
|
|
257
|
-
const context = resolveAdminContextFromPath(pathname);
|
|
258
|
-
if (!context) {
|
|
259
|
-
return true;
|
|
260
|
-
}
|
|
261
|
-
const info = ADMIN_DASHBOARD_CONTEXTS.find((ctx) => ctx.context === context);
|
|
262
|
-
if (!info) return false;
|
|
263
|
-
return hasAnyRole(roles, info.roles);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// src/types/global.ts
|
|
267
|
-
var PROMO_CODE_PREFIX = "CM-";
|
|
268
|
-
|
|
269
|
-
// src/types/userAdapters.ts
|
|
270
|
-
var PERMISSION_SET = new Set(PERMISSIONS);
|
|
271
|
-
function toUserPermissions(permissions) {
|
|
272
|
-
return permissions.filter(
|
|
273
|
-
(permission) => PERMISSION_SET.has(permission)
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
function toUserPromoCodes(codes) {
|
|
277
|
-
if (codes == null) {
|
|
278
|
-
return null;
|
|
279
|
-
}
|
|
280
|
-
return codes.map((code) => {
|
|
281
|
-
if (!code.startsWith(PROMO_CODE_PREFIX)) {
|
|
282
|
-
throw new Error(
|
|
283
|
-
`Invalid promo code from GraphQL: ${JSON.stringify(code)}`
|
|
284
|
-
);
|
|
285
|
-
}
|
|
286
|
-
return code;
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
function userToFormData(user) {
|
|
290
|
-
return {
|
|
291
|
-
_id: user._id,
|
|
292
|
-
active: user.active,
|
|
293
|
-
avatar: user.avatar ?? null,
|
|
294
|
-
avatarUpload: null,
|
|
295
|
-
confirmPassword: null,
|
|
296
|
-
email: user.email,
|
|
297
|
-
firstName: user.firstName,
|
|
298
|
-
isTester: user.isTester,
|
|
299
|
-
lastName: user.lastName,
|
|
300
|
-
location: user.location ?? null,
|
|
301
|
-
password: null,
|
|
302
|
-
platform: user.platform ?? void 0,
|
|
303
|
-
preferredRegion: user.preferredRegion,
|
|
304
|
-
termsAgreement: user.termsAgreement ? {
|
|
305
|
-
appBuildNumber: user.termsAgreement.appBuildNumber,
|
|
306
|
-
appId: user.termsAgreement.appId,
|
|
307
|
-
appVersion: user.termsAgreement.appVersion,
|
|
308
|
-
brand: user.termsAgreement.brand,
|
|
309
|
-
deviceName: user.termsAgreement.deviceName,
|
|
310
|
-
installationId: user.termsAgreement.installationId,
|
|
311
|
-
manufacturer: user.termsAgreement.manufacturer,
|
|
312
|
-
modelName: user.termsAgreement.modelName,
|
|
313
|
-
osName: user.termsAgreement.osName,
|
|
314
|
-
osVersion: user.termsAgreement.osVersion,
|
|
315
|
-
termVersion: user.termsAgreement.termVersion,
|
|
316
|
-
timestamp: user.termsAgreement.timestamp
|
|
317
|
-
} : null
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
export {
|
|
322
|
-
TIERS_BY_PRIORITY,
|
|
323
|
-
TIER_DISPLAY_LABELS,
|
|
324
|
-
TIER_FROM_LICENCE,
|
|
325
|
-
PERMISSIONS,
|
|
326
|
-
WILDCARD_PERMISSION,
|
|
327
|
-
ROLE_PERMISSIONS,
|
|
328
|
-
getPermissionsForRoles,
|
|
329
|
-
permissionListIncludes,
|
|
330
|
-
hasPermission,
|
|
331
|
-
hasAnyPermission,
|
|
332
|
-
hasAllPermissions,
|
|
333
|
-
hasRole,
|
|
334
|
-
hasAnyRole,
|
|
335
|
-
ADMIN_APP_ROLES,
|
|
336
|
-
ADMIN_DASHBOARD_CONTEXTS,
|
|
337
|
-
canAccessAdminApp,
|
|
338
|
-
getUsableAdminContexts,
|
|
339
|
-
getDefaultAdminHome,
|
|
340
|
-
resolveAdminContextFromPath,
|
|
341
|
-
canAccessAdminPath,
|
|
342
|
-
PROMO_CODE_PREFIX,
|
|
343
|
-
toUserPermissions,
|
|
344
|
-
toUserPromoCodes,
|
|
345
|
-
userToFormData
|
|
346
|
-
};
|
|
347
|
-
//# sourceMappingURL=chunk-DATBGC2K.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/subscription.ts","../src/auth/permissions/permissions.ts","../src/auth/permissions/rolePermissions.ts","../src/auth/permissions/helpers.ts","../src/auth/permissions/adminAppAccess.ts","../src/types/global.ts","../src/types/userAdapters.ts"],"sourcesContent":["import { LicencesEnumType } from \"../generated/graphql\";\n\n/** Tier keys in descending priority (highest first) for licence resolution. */\nexport const TIERS_BY_PRIORITY = [\"pro_plus\", \"pro\", \"standard\"] as const;\n\n/** Canonical subscription tier keys — matches Stripe/server tier identifiers. */\nexport type Tier = (typeof TIERS_BY_PRIORITY)[number];\n\n/** User-facing tier labels (decoupled from the Tier discriminant). */\nexport const TIER_DISPLAY_LABELS: Record<Tier, string> = {\n pro: \"Pro\",\n // eslint-disable-next-line camelcase\n pro_plus: \"Pro+ Ads\",\n standard: \"Standard\",\n};\n\n/** Maps licence enums to their canonical tier key. */\nexport const TIER_FROM_LICENCE: Record<LicencesEnumType, Tier> = {\n [LicencesEnumType.ProEvent]: \"pro\",\n [LicencesEnumType.ProPlusEvent]: \"pro_plus\",\n [LicencesEnumType.ProPlusVendor]: \"pro_plus\",\n [LicencesEnumType.ProVendor]: \"pro\",\n [LicencesEnumType.StandardEvent]: \"standard\",\n [LicencesEnumType.StandardPartner]: \"standard\",\n [LicencesEnumType.StandardVendor]: \"standard\",\n [LicencesEnumType.StandardAffiliate]: \"standard\",\n [LicencesEnumType.StandardSchool]: \"standard\",\n};\n","/**\n * Canonical permission IDs. Add new permissions here first, then map them in\n * ROLE_PERMISSIONS. Prefer resource.action names (e.g. users.read).\n */\nexport const PERMISSIONS = [\n \"*\",\n // Dashboards\n \"dashboard.admin\",\n \"dashboard.affiliate\",\n \"dashboard.customer\",\n \"dashboard.event\",\n \"dashboard.partner\",\n \"dashboard.school\",\n \"dashboard.vendor\",\n // Admin: users\n \"users.delete\",\n \"users.read\",\n \"users.update\",\n // Admin: events\n \"events.create\",\n \"events.delete\",\n \"events.read\",\n \"events.update\",\n // Admin: vendors\n \"vendors.create\",\n \"vendors.delete\",\n \"vendors.read\",\n \"vendors.update\",\n // Admin: partners\n \"partners.create\",\n \"partners.delete\",\n \"partners.read\",\n \"partners.update\",\n // Admin: schools\n \"schools.create\",\n \"schools.delete\",\n \"schools.read\",\n \"schools.update\",\n // Admin: affiliates\n \"affiliates.create\",\n \"affiliates.delete\",\n \"affiliates.read\",\n \"affiliates.update\",\n // Admin: ads / posts / settings\n \"ads.create\",\n \"ads.delete\",\n \"ads.read\",\n \"ads.update\",\n \"posts.create\",\n \"posts.delete\",\n \"posts.read\",\n \"posts.update\",\n \"settings.read\",\n \"settings.update\",\n // Product: own-resource management\n \"affiliates.manage_own\",\n \"events.manage_own\",\n \"partners.manage_own\",\n \"schools.manage_own\",\n \"vendors.manage_own\",\n] as const;\n\nexport type Permission = (typeof PERMISSIONS)[number];\n\nexport const WILDCARD_PERMISSION: Permission = \"*\";\n","import { UserRoleEnumType } from \"../../generated/graphql\";\n\nimport type { Permission } from \"./permissions\";\n\nconst ADMIN_PERMISSIONS: readonly Permission[] = [\n \"dashboard.admin\",\n \"events.read\",\n \"events.create\",\n \"events.update\",\n \"events.delete\",\n \"vendors.read\",\n \"vendors.create\",\n \"vendors.update\",\n \"vendors.delete\",\n \"partners.read\",\n \"partners.create\",\n \"partners.update\",\n \"partners.delete\",\n \"schools.read\",\n \"schools.create\",\n \"schools.update\",\n \"schools.delete\",\n \"affiliates.read\",\n \"affiliates.create\",\n \"affiliates.update\",\n \"affiliates.delete\",\n \"ads.read\",\n \"ads.create\",\n \"ads.update\",\n \"ads.delete\",\n \"posts.read\",\n \"posts.create\",\n \"posts.update\",\n \"posts.delete\",\n];\n\n/**\n * Static role → permissions map. Source of truth for access.\n * Permissions for a user = union of all their roles' lists.\n */\nexport const ROLE_PERMISSIONS: Record<UserRoleEnumType, readonly Permission[]> =\n {\n [UserRoleEnumType.SuperAdmin]: [\"*\"],\n [UserRoleEnumType.Admin]: ADMIN_PERMISSIONS,\n [UserRoleEnumType.Customer]: [\"dashboard.customer\"],\n [UserRoleEnumType.Event]: [\"dashboard.event\", \"events.manage_own\"],\n [UserRoleEnumType.Vendor]: [\"dashboard.vendor\", \"vendors.manage_own\"],\n [UserRoleEnumType.Partner]: [\"dashboard.partner\", \"partners.manage_own\"],\n [UserRoleEnumType.School]: [\"dashboard.school\", \"schools.manage_own\"],\n [UserRoleEnumType.Affiliate]: [\n \"dashboard.affiliate\",\n \"affiliates.manage_own\",\n ],\n };\n","import { UserRoleEnumType } from \"../../generated/graphql\";\n\nimport type { Permission } from \"./permissions\";\nimport { WILDCARD_PERMISSION } from \"./permissions\";\nimport { ROLE_PERMISSIONS } from \"./rolePermissions\";\n\nfunction normalizeRoles(\n roles: UserRoleEnumType[] | null | undefined,\n): UserRoleEnumType[] {\n if (!roles?.length) return [];\n return roles;\n}\n\n/**\n * Union of permissions for the given roles (deduped, stable order).\n */\nexport function getPermissionsForRoles(\n roles: UserRoleEnumType[] | null | undefined,\n): Permission[] {\n const seen = new Set<Permission>();\n const result: Permission[] = [];\n\n for (const role of normalizeRoles(roles)) {\n const perms = ROLE_PERMISSIONS[role] ?? [];\n for (const perm of perms) {\n if (!seen.has(perm)) {\n seen.add(perm);\n result.push(perm);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check a concrete permission list (e.g. authUser.permissions) for a grant.\n * Honours the \"*\" wildcard.\n */\nexport function permissionListIncludes(\n permissions: readonly Permission[] | null | undefined,\n permission: Permission,\n): boolean {\n if (!permissions?.length) return false;\n const set = new Set(permissions);\n if (set.has(WILDCARD_PERMISSION)) return true;\n return set.has(permission);\n}\n\nexport function hasPermission(\n roles: UserRoleEnumType[] | null | undefined,\n permission: Permission,\n): boolean {\n return permissionListIncludes(getPermissionsForRoles(roles), permission);\n}\n\nexport function hasAnyPermission(\n roles: UserRoleEnumType[] | null | undefined,\n permissions: readonly Permission[],\n): boolean {\n if (permissions.length === 0) return false;\n const granted = getPermissionsForRoles(roles);\n return permissions.some((p) => permissionListIncludes(granted, p));\n}\n\nexport function hasAllPermissions(\n roles: UserRoleEnumType[] | null | undefined,\n permissions: readonly Permission[],\n): boolean {\n if (permissions.length === 0) return true;\n const granted = getPermissionsForRoles(roles);\n return permissions.every((p) => permissionListIncludes(granted, p));\n}\n\nexport function hasRole(\n roles: UserRoleEnumType[] | null | undefined,\n role: UserRoleEnumType,\n): boolean {\n return normalizeRoles(roles).includes(role);\n}\n\nexport function hasAnyRole(\n roles: UserRoleEnumType[] | null | undefined,\n checkRoles: readonly UserRoleEnumType[],\n): boolean {\n if (checkRoles.length === 0) return false;\n const set = new Set(normalizeRoles(roles));\n return checkRoles.some((r) => set.has(r));\n}\n","import { UserRoleEnumType } from \"../../generated/graphql\";\n\nimport { hasAnyRole } from \"./helpers\";\n\n/** Roles allowed to sign into the admin web app (CUSTOMER-only is denied). */\nexport const ADMIN_APP_ROLES = [\n UserRoleEnumType.SuperAdmin,\n UserRoleEnumType.Admin,\n UserRoleEnumType.Event,\n UserRoleEnumType.Vendor,\n UserRoleEnumType.Partner,\n UserRoleEnumType.School,\n UserRoleEnumType.Affiliate,\n] as const;\n\nexport type AdminAppRole = (typeof ADMIN_APP_ROLES)[number];\n\nexport type AdminDashboardContext =\n | \"staff\"\n | \"event\"\n | \"vendor\"\n | \"partner\"\n | \"school\"\n | \"affiliate\";\n\nexport type AdminDashboardContextInfo = {\n context: AdminDashboardContext;\n home: string;\n label: string;\n /** Path prefixes that belong to this context (including home). */\n pathPrefixes: readonly string[];\n roles: readonly UserRoleEnumType[];\n};\n\n/**\n * Priority order for default home + role switcher.\n * Staff first, then product roles.\n */\nexport const ADMIN_DASHBOARD_CONTEXTS: readonly AdminDashboardContextInfo[] = [\n {\n context: \"staff\",\n home: \"/dashboard\",\n label: \"Staff\",\n pathPrefixes: [\"/dashboard\"],\n roles: [UserRoleEnumType.SuperAdmin, UserRoleEnumType.Admin],\n },\n {\n context: \"event\",\n home: \"/event/dashboard\",\n label: \"Events\",\n pathPrefixes: [\"/event\"],\n roles: [UserRoleEnumType.Event],\n },\n {\n context: \"vendor\",\n home: \"/vendor/dashboard\",\n label: \"Stallholders\",\n pathPrefixes: [\"/vendor\"],\n roles: [UserRoleEnumType.Vendor],\n },\n {\n context: \"partner\",\n home: \"/partner/dashboard\",\n label: \"Partners\",\n pathPrefixes: [\"/partner\"],\n roles: [UserRoleEnumType.Partner],\n },\n {\n context: \"school\",\n home: \"/school/dashboard\",\n label: \"Schools\",\n pathPrefixes: [\"/school\"],\n roles: [UserRoleEnumType.School],\n },\n {\n context: \"affiliate\",\n home: \"/affiliate/dashboard\",\n label: \"Affiliate\",\n pathPrefixes: [\"/affiliate\"],\n roles: [UserRoleEnumType.Affiliate],\n },\n] as const;\n\nexport function canAccessAdminApp(\n roles: UserRoleEnumType[] | null | undefined,\n): boolean {\n return hasAnyRole(roles, ADMIN_APP_ROLES);\n}\n\nexport function getUsableAdminContexts(\n roles: UserRoleEnumType[] | null | undefined,\n): AdminDashboardContextInfo[] {\n return ADMIN_DASHBOARD_CONTEXTS.filter((ctx) => hasAnyRole(roles, ctx.roles));\n}\n\nexport function getDefaultAdminHome(\n roles: UserRoleEnumType[] | null | undefined,\n preferredContext?: AdminDashboardContext | null,\n): string {\n const usable = getUsableAdminContexts(roles);\n if (usable.length === 0) {\n return \"/login\";\n }\n\n if (preferredContext) {\n const preferred = usable.find((ctx) => ctx.context === preferredContext);\n if (preferred) return preferred.home;\n }\n\n return usable[0].home;\n}\n\nexport function resolveAdminContextFromPath(\n pathname: string,\n): AdminDashboardContext | null {\n for (const ctx of ADMIN_DASHBOARD_CONTEXTS) {\n if (\n ctx.pathPrefixes.some(\n (prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`),\n )\n ) {\n return ctx.context;\n }\n }\n return null;\n}\n\nexport function canAccessAdminPath(\n roles: UserRoleEnumType[] | null | undefined,\n pathname: string,\n): boolean {\n if (!canAccessAdminApp(roles)) return false;\n\n const context = resolveAdminContextFromPath(pathname);\n if (!context) {\n // Authenticated admin-app users may hit non-dashboard admin routes later;\n // unknown paths are allowed only if they have any admin-app role.\n return true;\n }\n\n const info = ADMIN_DASHBOARD_CONTEXTS.find((ctx) => ctx.context === context);\n if (!info) return false;\n return hasAnyRole(roles, info.roles);\n}\n","import {\n Control,\n FieldValues,\n FormState,\n UseFormGetValues,\n UseFormHandleSubmit,\n UseFormReset,\n UseFormSetValue,\n UseFormWatch,\n} from \"react-hook-form\";\n\nimport {\n EventEnumType,\n PostTypeEnum,\n ResourceTypeEnum,\n SocialMediaEnumType,\n LicencesEnumType,\n} from \"../generated/graphql\";\nimport type {\n DateTimeType,\n EventListItemType,\n LocationType,\n ResourceImageType,\n VendorType,\n} from \"../generated/graphql\";\n\nexport type {\n DateTimeType,\n LocationGeoType,\n LocationType,\n ResourceImageType,\n} from \"../generated/graphql\";\nexport const PROMO_CODE_PREFIX = \"CM-\";\n\nexport type PromoCodeType = `${typeof PROMO_CODE_PREFIX}${string}`;\n\nexport type Nullable<T> = {\n [K in keyof T]: T[K] | null | undefined;\n};\n\n/** Uniform mutation response envelope used across GraphQL mutations. */\nexport type MutationResponse<T> = {\n data: T | null;\n message: string | null;\n};\n\nexport type DeviceInfo = {\n appBuildNumber: string;\n appId: string;\n appVersion: string;\n brand: string;\n deviceName: string;\n installationId: string;\n manufacturer: string;\n modelName: string;\n osName: string;\n osVersion: string;\n timestamp: string;\n};\n\nexport type TermsAgreement = DeviceInfo & {\n termVersion: string;\n};\n\nexport type ResourceContactDetailsType = {\n email?: string | null;\n landlinePhone?: string | null;\n mobilePhone?: string | null;\n};\n\n/** Form/UI social links — optional fields. GraphQL `SocialMediaType` requires name+link. */\nexport type SocialMediaType = {\n name?: SocialMediaEnumType;\n link?: string;\n};\n\nexport type UserLicenceType = {\n expiryDate: Date;\n issuedDate: Date;\n licenceType: LicencesEnumType;\n prevLicenceType?: LicencesEnumType | null;\n};\n\nexport type OwnerType = {\n email: string;\n userId: string;\n};\n\nexport interface BaseResourceTypeFormData {\n _id?: string;\n active: boolean;\n contactDetails: ResourceContactDetailsType | null;\n cover: ResourceImageType;\n coverUpload?: ResourceImageType | null;\n description: string;\n images?: ResourceImageType[] | null;\n imagesUpload?: ResourceImageType[] | null;\n logo?: ResourceImageType | null;\n logoUpload?: ResourceImageType | null;\n name: string;\n promoCodes?: PromoCodeType[] | null;\n region: string;\n socialMedia: SocialMediaType[] | null;\n termsAgreement?: TermsAgreement | null;\n}\n\nexport type PosterUsageType = {\n month: string;\n count: number;\n};\n\nexport type RelatedPostType = {\n postActive: boolean;\n postId: string;\n postSlug: string;\n postType: PostTypeEnum;\n};\n\nexport type SocialShareResourceType = {\n qrCode: ResourceImageType;\n socialImage: ResourceImageType;\n};\n\nexport type BaseResourceType = Omit<\n BaseResourceTypeFormData,\n \"_id\" | \"coverUpload\" | \"imagesUpload\" | \"logoUpload\"\n> & {\n _id: string;\n adIds?: string[] | null;\n /** ISO 8601 UTC string — GraphQL Date scalar serializes to string, not JS Date. */\n approvedAt?: string | null;\n createdAt: string;\n deletedAt: string | null;\n owner: OwnerType;\n posterUsage?: PosterUsageType | null;\n rating?: number | null;\n relatedPost?: RelatedPostType | null;\n reviewCount?: number | null;\n slug: string;\n updatedAt: string | null;\n};\n\nexport type Region = {\n latitude: number;\n latitudeDelta: number;\n longitude: number;\n longitudeDelta: number;\n};\n\nexport type ResourceDetails = {\n dateTime: DateTimeType[] | null;\n description: string | null;\n eventStatus?: EventStatusType | null;\n location: LocationType | null;\n resourceCover: ResourceImageType | null;\n resourceId: string;\n resourceLogo: ResourceImageType | null;\n resourceName: string;\n resourceType: ResourceTypeEnum;\n};\n\nexport type GeocodeLocation = Pick<LocationType, \"latitude\" | \"longitude\">;\n\nexport type EventStatusType = {\n claimed: boolean;\n eventType: EventEnumType;\n googlePlaceId?: string | null;\n};\n\nexport interface FormField {\n disabled?: boolean;\n helperText?: string;\n isTextArea?: boolean;\n keyboardType?:\n | \"default\"\n | \"email-address\"\n | \"number-pad\"\n | \"url\"\n | \"decimal-pad\"\n | \"phone-pad\";\n name: string;\n placeholder: string;\n required?: boolean;\n secureTextEntry?: boolean;\n}\n\nexport interface FormDateField {\n dateMode: \"date\" | \"time\";\n helperText?: string;\n name: \"endDate\" | \"endTime\" | \"startDate\" | \"startTime\";\n placeholder: string;\n}\n\nexport interface SubcategoryItems {\n id: string;\n name: string;\n description?: string | null;\n}\n\nexport interface Subcategory {\n id: string;\n name: string;\n items?: SubcategoryItems[] | null;\n}\n\nexport interface Category {\n color?: string | null;\n description?: string | null;\n id: string;\n name: string;\n subcategories: Subcategory[];\n}\n\nexport type OptionItem = {\n value: string;\n label: string;\n};\n\nexport type ImageObjectType = {\n uri: string;\n type: string;\n name: string;\n};\n\nexport interface ResourceConnectionsType {\n events: EventListItemType[] | null;\n vendors: VendorType[] | null;\n}\n\nexport interface CreateFormData<T extends FieldValues> {\n control: Control<T, any>;\n fields: T;\n formState: FormState<T>;\n handleSubmit: UseFormHandleSubmit<T, any>;\n reset: UseFormReset<T>;\n setValue: UseFormSetValue<T>;\n watch: UseFormWatch<T>;\n getValues: UseFormGetValues<T>;\n}\n\nexport interface UseGetResourcesByRegionOptions {\n onlyClaimed?: boolean;\n limit?: number;\n offset?: number;\n}\n","/**\n * Adapters between generated GraphQL User/Auth entity types and form/UI shapes.\n *\n * GraphQL UserType is already the redacted client shape (no password /\n * refreshToken). These converters make remaining differences explicit:\n * branded promo codes, draft-optional terms, permission string → Permission,\n * and entity-to-form bridging (password fields stay empty — never round-trip).\n */\nimport type { Permission } from \"../auth/permissions\";\nimport { PERMISSIONS } from \"../auth/permissions\";\nimport type { UserType } from \"../generated/graphql\";\n\nimport type { PromoCodeType } from \"./global\";\nimport { PROMO_CODE_PREFIX } from \"./global\";\nimport type { UserFormData } from \"./user\";\n\nconst PERMISSION_SET = new Set<string>(PERMISSIONS);\n\nexport function toUserPermissions(\n permissions: ReadonlyArray<string>,\n): Permission[] {\n return permissions.filter((permission): permission is Permission =>\n PERMISSION_SET.has(permission),\n );\n}\n\nexport function toUserPromoCodes(\n codes: ReadonlyArray<string> | null | undefined,\n): PromoCodeType[] | null {\n if (codes == null) {\n return null;\n }\n return codes.map((code) => {\n if (!code.startsWith(PROMO_CODE_PREFIX)) {\n throw new Error(\n `Invalid promo code from GraphQL: ${JSON.stringify(code)}`,\n );\n }\n return code as PromoCodeType;\n });\n}\n\n/**\n * Convert a stored GraphQL UserType into UserFormData for profile edit forms.\n *\n * Password / confirmPassword are never populated from the entity (GraphQL\n * UserType does not include them). avatarUpload is a local draft field.\n * termsAgreement is copied field-by-field (form TermsAgreement vs GraphQL\n * TermsAgreementType — same fields, kept explicit like other resources).\n */\nexport function userToFormData(user: UserType): UserFormData {\n return {\n _id: user._id,\n active: user.active,\n avatar: user.avatar ?? null,\n avatarUpload: null,\n confirmPassword: null,\n email: user.email,\n firstName: user.firstName,\n isTester: user.isTester,\n lastName: user.lastName,\n location: user.location ?? null,\n password: null,\n platform: user.platform ?? undefined,\n preferredRegion: user.preferredRegion,\n termsAgreement: user.termsAgreement\n ? {\n appBuildNumber: user.termsAgreement.appBuildNumber,\n appId: user.termsAgreement.appId,\n appVersion: user.termsAgreement.appVersion,\n brand: user.termsAgreement.brand,\n deviceName: user.termsAgreement.deviceName,\n installationId: user.termsAgreement.installationId,\n manufacturer: user.termsAgreement.manufacturer,\n modelName: user.termsAgreement.modelName,\n osName: user.termsAgreement.osName,\n osVersion: user.termsAgreement.osVersion,\n termVersion: user.termsAgreement.termVersion,\n timestamp: user.termsAgreement.timestamp,\n }\n : null,\n };\n}\n"],"mappings":"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","names":[]}
|