@superlikers/microsites-api 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/.npmignore +3 -0
- package/CHANGELOG.md +14 -0
- package/README.md +222 -0
- package/fesm2022/superlikers-microsites-api-forms.mjs +48 -0
- package/fesm2022/superlikers-microsites-api-forms.mjs.map +1 -0
- package/fesm2022/superlikers-microsites-api-testing.mjs +47 -0
- package/fesm2022/superlikers-microsites-api-testing.mjs.map +1 -0
- package/fesm2022/superlikers-microsites-api.mjs +723 -0
- package/fesm2022/superlikers-microsites-api.mjs.map +1 -0
- package/package.json +56 -0
- package/types/superlikers-microsites-api-forms.d.ts +28 -0
- package/types/superlikers-microsites-api-testing.d.ts +39 -0
- package/types/superlikers-microsites-api.d.ts +1958 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superlikers-microsites-api.mjs","sources":["../../../projects/microsites-api/src/lib/config/provide-microsites-api.ts","../../../projects/microsites-api/src/lib/errors/api-error.ts","../../../projects/microsites-api/src/lib/http/query-params.ts","../../../projects/microsites-api/src/lib/http/api-client.ts","../../../projects/microsites-api/src/lib/achievements/achievements.service.ts","../../../projects/microsites-api/src/lib/activities/activities.service.ts","../../../projects/microsites-api/src/lib/badges/badges.service.ts","../../../projects/microsites-api/src/lib/blogs/blogs.service.ts","../../../projects/microsites-api/src/lib/boards/boards.service.ts","../../../projects/microsites-api/src/lib/comments/comments.service.ts","../../../projects/microsites-api/src/lib/entries/entries.service.ts","../../../projects/microsites-api/src/lib/entries/is-entry-type.ts","../../../projects/microsites-api/src/lib/external-forms/external-forms.service.ts","../../../projects/microsites-api/src/lib/goals/goals.service.ts","../../../projects/microsites-api/src/lib/metrics/metrics.service.ts","../../../projects/microsites-api/src/lib/participant/participant.service.ts","../../../projects/microsites-api/src/lib/password/password.service.ts","../../../projects/microsites-api/src/lib/prizes/prizes.service.ts","../../../projects/microsites-api/src/lib/ranking/ranking.service.ts","../../../projects/microsites-api/src/lib/referrals/referrals.service.ts","../../../projects/microsites-api/src/lib/registrations/registrations.service.ts","../../../projects/microsites-api/src/lib/session/session.service.ts","../../../projects/microsites-api/src/lib/teams/teams.service.ts","../../../projects/microsites-api/src/lib/votes/votes.service.ts","../../../projects/microsites-api/src/public-api.ts","../../../projects/microsites-api/src/superlikers-microsites-api.ts"],"sourcesContent":["import { EnvironmentProviders, inject, InjectionToken, makeEnvironmentProviders } from '@angular/core'\n\nimport { MicrositesApiConfig } from './microsites-api-config'\n\n/** @internal Holds the normalized config. Not part of the public API. */\nexport const MICROSITES_API_CONFIG = new InjectionToken<MicrositesApiConfig>('MICROSITES_API_CONFIG')\n\n/**\n * Configures `@superlikers/microsites-api` for the application.\n *\n * @example\n * ```ts\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [provideMicrositesApi({ baseUrl: environment.baseUrl })]\n * }\n * ```\n */\nexport function provideMicrositesApi(config: MicrositesApiConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: MICROSITES_API_CONFIG, useValue: normalizeConfig(config) }])\n}\n\n/** @internal Reads the config inside the library, with a helpful error when it is missing. */\nexport function injectMicrositesApiConfig(): MicrositesApiConfig {\n const config = inject(MICROSITES_API_CONFIG, { optional: true })\n if (!config) {\n throw new Error('[@superlikers/microsites-api] Missing configuration. Add provideMicrositesApi({ baseUrl }) to your app.config.ts providers.')\n }\n return config\n}\n\nfunction normalizeConfig(config: MicrositesApiConfig): MicrositesApiConfig {\n const baseUrl = config.baseUrl?.trim().replace(/\\/+$/, '') ?? ''\n\n if (!URL.canParse(baseUrl) || !/^https?:$/.test(new URL(baseUrl).protocol)) {\n throw new Error(`[@superlikers/microsites-api] Invalid baseUrl \"${config.baseUrl}\". Expected an absolute http(s) URL, e.g. https://4x.superlikerslabs.com`)\n }\n\n return { ...config, baseUrl }\n}\n","import { HttpErrorResponse } from '@angular/common/http'\n\n/** Error body returned by the Superlikers backend. */\ninterface ErrorBody {\n state?: string\n message?: string\n code_error?: number\n errors?: Record<string, string>\n}\n\n/**\n * Error thrown by every `@superlikers/microsites-api` request.\n *\n * @example\n * ```ts\n * try {\n * await firstValueFrom(sessionService.login(data))\n * } catch (error) {\n * if (isApiError(error)) this.message.set(error.message)\n * }\n * ```\n */\nexport class ApiError extends Error {\n override readonly name = 'ApiError'\n\n /** HTTP status. `0` means the request never reached the server (network, CORS, offline). */\n readonly status: number\n /** Backend error code (`code_error`), e.g. `140`. `null` when the backend did not send one. */\n readonly code: number | null\n /** Validation errors by field name, e.g. `{ email: 'is invalid' }`. Empty when there are none. */\n readonly fieldErrors: Readonly<Record<string, string>>\n /** URL of the failed request. */\n readonly url: string | null\n\n /**\n * `true` when the server answered with something that is not JSON (e.g. an HTML page).\n * Happens when a module is disabled for the campaign: the backend redirects to the site instead of answering.\n */\n readonly isInvalidResponse: boolean\n\n constructor(response: HttpErrorResponse) {\n const invalidResponse = isParseFailure(response)\n const body = invalidResponse ? {} : readBody(response.error)\n super(body.message || defaultMessage(response.status, invalidResponse), { cause: response })\n\n this.status = response.status\n this.code = typeof body.code_error === 'number' ? body.code_error : null\n this.fieldErrors = body.errors ?? {}\n this.url = response.url\n this.isInvalidResponse = invalidResponse\n }\n\n get isNetworkError(): boolean {\n return this.status === 0\n }\n\n get isUnauthorized(): boolean {\n return this.status === 401\n }\n}\n\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError\n}\n\nfunction readBody(error: unknown): ErrorBody {\n return typeof error === 'object' && error !== null ? (error as ErrorBody) : {}\n}\n\n/**\n * A 2xx body HttpClient could not parse: the fetch backend (Angular's default) reports the `SyntaxError`\n * itself, the XHR backend wraps it as `{ error: SyntaxError, text }`.\n */\nfunction isParseFailure(response: HttpErrorResponse): boolean {\n if (response.status < 200 || response.status >= 300) return false\n const error: unknown = response.error\n return error instanceof SyntaxError || (typeof error === 'object' && error !== null && (error as { error?: unknown }).error instanceof SyntaxError)\n}\n\nfunction defaultMessage(status: number, invalidResponse: boolean): string {\n if (invalidResponse) return 'The server did not answer with JSON. The module may be disabled for this campaign.'\n return status === 0 ? 'Could not reach the server. Check your connection.' : `Request failed with status ${status}.`\n}\n","import { HttpParameterCodec, HttpParams } from '@angular/common/http'\n\ntype ParamValue = string | number | boolean\ntype Nullable<T> = T | null | undefined\ntype ParamObject = Record<string, Nullable<ParamValue>>\n\n/** Query params as a plain object. `null`/`undefined` values are skipped. */\nexport type ApiParams = Record<string, Nullable<ParamValue> | readonly Nullable<ParamValue>[] | ParamObject>\n\n/**\n * Encodes every reserved character. Angular's default codec leaves `+` unencoded,\n * which the backend decodes as a space (`ana+test@mail.com` → `ana test@mail.com`).\n */\nclass StrictUrlCodec implements HttpParameterCodec {\n encodeKey(key: string): string {\n return encodeURIComponent(key)\n }\n encodeValue(value: string): string {\n return encodeURIComponent(value)\n }\n decodeKey(key: string): string {\n return decodeURIComponent(key)\n }\n decodeValue(value: string): string {\n return decodeURIComponent(value)\n }\n}\n\nconst codec = new StrictUrlCodec()\n\n/**\n * @internal Builds query params: arrays use `key[]`, plain objects use `key[subkey]`,\n * empty values are skipped. `{ page: 2, tags: ['a', 'b'], q: undefined }` → `page=2&tags[]=a&tags[]=b`.\n */\nexport function toHttpParams(params: ApiParams): HttpParams {\n let httpParams = new HttpParams({ encoder: codec })\n\n for (const [key, value] of Object.entries(params)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null) httpParams = httpParams.append(`${key}[]`, String(item))\n }\n } else if (isPlainObject(value)) {\n for (const [subkey, subvalue] of Object.entries(value)) {\n if (subvalue != null) httpParams = httpParams.append(`${key}[${subkey}]`, String(subvalue))\n }\n } else if (value != null) {\n httpParams = httpParams.append(key, String(value))\n }\n }\n\n return httpParams\n}\n\nfunction isPlainObject(value: unknown): value is ParamObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * @internal Casts a params object with a named nested type (e.g. a `date_filter: DateFilter` field) to\n * {@link ApiParams}. Named types without an index signature aren't structurally assignable to `ApiParams`\n * even when every property matches; `toHttpParams` handles arbitrary shapes safely at runtime regardless.\n */\nexport function asApiParams<T extends object>(params: T): ApiParams {\n return params as unknown as ApiParams\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http'\nimport { EnvironmentInjector, inject, runInInjectionContext, Service } from '@angular/core'\nimport { catchError, map, Observable, throwError } from 'rxjs'\n\nimport { injectMicrositesApiConfig } from '../config/provide-microsites-api'\nimport { ApiError } from '../errors/api-error'\nimport { ApiParams, toHttpParams } from './query-params'\n\n/** Options a domain service can pass to a request. */\nexport interface ApiRequestOptions {\n /** Plain object (serialized by {@link toHttpParams}) or ready-made `HttpParams`. */\n params?: ApiParams | HttpParams\n headers?: Record<string, string>\n}\n\n/**\n * @internal The library's only gateway to the microsite backend.\n * Every domain service makes its requests through here; nothing else uses `HttpClient`.\n */\n@Service()\nexport class ApiClient {\n readonly #http = inject(HttpClient)\n readonly #injector = inject(EnvironmentInjector)\n readonly #config = injectMicrositesApiConfig()\n\n get<T>(path: string, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.get<T>(url, this.#options(options)), url)\n }\n\n post<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.post<T>(url, body, this.#options(options)), url)\n }\n\n put<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.put<T>(url, body, this.#options(options)), url)\n }\n\n patch<T>(path: string, body: unknown, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.patch<T>(url, body, this.#options(options)), url)\n }\n\n delete<T>(path: string, options?: ApiRequestOptions): Observable<T> {\n const url = this.#url(path)\n return this.#handleErrors(this.#http.delete<T>(url, this.#options(options)), url)\n }\n\n /** `/sessions/login` → `https://4x.superlikerslabs.com/sessions/login` */\n #url(path: string): string {\n return `${this.#config.baseUrl}/${path.replace(/^\\/+/, '')}`\n }\n\n /** What every request shares. `Content-Type` is left to HttpClient (JSON for objects, none for FormData). */\n #options(options?: ApiRequestOptions) {\n return {\n params: options?.params instanceof HttpParams ? options.params : toHttpParams(options?.params ?? {}),\n headers: new HttpHeaders({ Accept: 'application/json', ...options?.headers }),\n withCredentials: true\n }\n }\n\n /**\n * Turns every failure into an {@link ApiError} and notifies `onUnauthorized` on 401.\n * Some endpoints report errors with HTTP 200 and `state: 'error'` (e.g. referral code validation);\n * those are thrown as an `ApiError` with status 200 too, so callers only handle errors in one place.\n */\n #handleErrors<T>(request: Observable<T>, url: string): Observable<T> {\n return request.pipe(\n map(body => {\n if (isErrorBody(body)) throw new ApiError(new HttpErrorResponse({ status: 200, statusText: 'OK', error: body, url }))\n return body\n }),\n catchError((error: unknown) => {\n if (!(error instanceof HttpErrorResponse)) return throwError(() => error)\n\n const apiError = new ApiError(error)\n const onUnauthorized = this.#config.onUnauthorized\n if (apiError.isUnauthorized && onUnauthorized) runInInjectionContext(this.#injector, () => onUnauthorized(apiError))\n\n return throwError(() => apiError)\n })\n )\n }\n}\n\nfunction isErrorBody(body: unknown): boolean {\n return typeof body === 'object' && body !== null && !Array.isArray(body) && (body as { state?: unknown }).state === 'error'\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { AchievementsListResponse, AchievementsParams, BadgeAchievement, GoalAchievement } from './achievements-models'\n\n/** Achievements earned by participants (goal and badge achievements). */\n@Service()\nexport class AchievementsService {\n readonly #api = inject(ApiClient)\n\n list<T = GoalAchievement | BadgeAchievement>(params: AchievementsParams = {}): Observable<AchievementsListResponse<T>> {\n return this.#api.get<AchievementsListResponse<T>>('/achievements/index', { params: asApiParams({ ...params, view: params.view ?? 'list' }) })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { UploadDocumentParams, UploadDocumentResponse, UploadPhotoParams, UploadPhotoResponse } from './activities-models'\n\n/** Photo and document uploads. */\n@Service()\nexport class ActivitiesService {\n readonly #api = inject(ApiClient)\n\n uploadPhoto({ file, filename, category }: UploadPhotoParams): Observable<UploadPhotoResponse> {\n const body = new FormData()\n if (filename) body.append('upload_photo[image]', file, filename)\n else body.append('upload_photo[image]', file)\n if (category != null) body.append('upload_photo[category]', category)\n\n return this.#api.post<UploadPhotoResponse>('/mod/photos', body)\n }\n\n uploadDocument({ file, category }: UploadDocumentParams): Observable<UploadDocumentResponse> {\n const body = new FormData()\n body.append('upload_document[document]', file)\n if (category) body.append('upload_document[category]', category)\n\n return this.#api.post<UploadDocumentResponse>('/mod/documents', body)\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { BadgeResponse, BadgesListResponse, BadgesParams, ParticipantBadgesResponse } from './badges-models'\n\n/** Badges and the badges earned by a participant. */\n@Service()\nexport class BadgesService {\n readonly #api = inject(ApiClient)\n\n list(params: BadgesParams = {}): Observable<BadgesListResponse> {\n return this.#api.get<BadgesListResponse>('/badges/index', { params: { ...params } })\n }\n\n get(id: string): Observable<BadgeResponse> {\n return this.#api.get<BadgeResponse>(`/badges/${id}/show`)\n }\n\n /** Badges earned by the logged participant, or by `uid` when given. */\n getStats(uid?: string): Observable<ParticipantBadgesResponse> {\n return this.#api.get<ParticipantBadgesResponse>('/badges/stats', { params: { participant_uid: uid } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ActivityParticipant } from '../shared/activity-participant'\nimport { BlogPostResponse, BlogPostsParams, BlogPostsResponse, CreateBlogPostParams, CreateBlogPostResponse } from './blogs-models'\n\n/** Blog posts (mod/blog activity). */\n@Service()\nexport class BlogsService {\n readonly #api = inject(ApiClient)\n\n list<T = ActivityParticipant>(params: BlogPostsParams = {}): Observable<BlogPostsResponse<T>> {\n return this.#api.get<BlogPostsResponse<T>>('/mod/blog', { params: { ...params, page: params.page ?? 1 } })\n }\n\n get<T = ActivityParticipant>(id: string): Observable<BlogPostResponse<T>> {\n return this.#api.get<BlogPostResponse<T>>(`/mod/blog/${id}/show`)\n }\n\n create<T = ActivityParticipant>({ title, body, format, attached_file, category, tags, push_redirect_url }: CreateBlogPostParams): Observable<CreateBlogPostResponse<T>> {\n const data = new FormData()\n data.append('blog_post[title]', title)\n data.append('blog_post[body]', body)\n data.append('blog_post[format]', format ?? 'text')\n if (attached_file) data.append('blog_post[attached_file]', attached_file)\n if (category) data.append('blog_post[category]', category)\n if (push_redirect_url) data.append('blog_post[push_redirect_url]', push_redirect_url)\n for (const tag of tags ?? []) data.append('blog_post[tags][]', tag)\n\n return this.#api.post<CreateBlogPostResponse<T>>('/mod/blogs', data)\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { BoardReportsResponse, BoardsListResponse, BoardsParams, ExecuteReportParams, ExecuteReportResponse } from './boards-models'\n\n/** Dashboards (boards) and their reports. */\n@Service()\nexport class BoardsService {\n readonly #api = inject(ApiClient)\n\n list(params: BoardsParams = {}): Observable<BoardsListResponse> {\n return this.#api.get<BoardsListResponse>('/boards/index', { params: { ...params } })\n }\n\n listReports(board: string, page?: number): Observable<BoardReportsResponse> {\n return this.#api.get<BoardReportsResponse>(`/boards/${board}/reports`, { params: { page } })\n }\n\n /** Either `timeframe` or `start_date`/`end_date` is used, never both. */\n executeReport(board: string, report: string, params: ExecuteReportParams = {}): Observable<ExecuteReportResponse> {\n const query = params.timeframe ? { timeframe: params.timeframe } : { start_date: params.start_date, end_date: params.end_date }\n return this.#api.get<ExecuteReportResponse>(`/boards/${board}/reports/${report}/exec`, { params: query })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ActivityParticipant } from '../shared/activity-participant'\nimport { CommentsListResponse, CommentsParams, CreateCommentParams, CreateCommentResponse } from './comments-models'\n\n/** Comments on an activity (target). */\n@Service()\nexport class CommentsService {\n readonly #api = inject(ApiClient)\n\n list<T = ActivityParticipant>(targetId: string, params: CommentsParams = {}): Observable<CommentsListResponse<T>> {\n return this.#api.get<CommentsListResponse<T>>(`/mod/comments/${targetId}`, { params: { ...params } })\n }\n\n create<T = ActivityParticipant>(targetId: string, { body, category }: CreateCommentParams): Observable<CreateCommentResponse<T>> {\n return this.#api.post<CreateCommentResponse<T>>(`/mod/comments/${targetId}`, { comment: { body, category } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { CreateExternalOptions, CreateExternalResponse, DocumentEntry, EntriesListParams, EntriesParams, EntriesResponse, Entry, EntryData, ExternalEntry, PhotoEntry, PurchaseEntry, RedeemEntry } from './entries-models'\n\n/**\n * Entries (activities) of the logged participant, or of another one with `participant_uid` (admins).\n * Every method uses the detailed `show` view. Types without a method of their own are listed with `list({ _type })`.\n */\n@Service()\nexport class EntriesService {\n readonly #api = inject(ApiClient)\n\n /** `T`: shape of `data` (the campaign's external action fields). */\n listExternals<T = EntryData>(params: EntriesParams = {}): Observable<EntriesResponse<ExternalEntry<T>>> {\n return this.#list<ExternalEntry<T>>({ ...params, _type: 'External' })\n }\n\n listRedemptions(params: EntriesParams = {}): Observable<EntriesResponse<RedeemEntry>> {\n return this.#list<RedeemEntry>({ ...params, _type: 'Redeem' })\n }\n\n listPhotos(params: EntriesParams = {}): Observable<EntriesResponse<PhotoEntry>> {\n return this.#list<PhotoEntry>({ ...params, _type: 'UploadPhoto' })\n }\n\n listDocuments(params: EntriesParams = {}): Observable<EntriesResponse<DocumentEntry>> {\n return this.#list<DocumentEntry>({ ...params, _type: 'UploadDocument' })\n }\n\n listPurchases(params: EntriesParams = {}): Observable<EntriesResponse<PurchaseEntry>> {\n return this.#list<PurchaseEntry>({ ...params, _type: 'Retail::Buy' })\n }\n\n /** Every entry, or one `_type` (including the ones without a method of their own). Narrow each item with `isEntryType`. */\n list(params: EntriesListParams = {}): Observable<EntriesResponse<Entry>> {\n return this.#list<Entry>(params)\n }\n\n /** Entries of several participants at once (admins only, 100 per page). `uids` is required by the backend. */\n search(uids: string[], params: EntriesListParams = {}): Observable<EntriesResponse<Entry>> {\n return this.#api.get<EntriesResponse<Entry>>('/entries/search', { params: asApiParams({ ...params, participant_uids: uids, hide_undo: params.hide_undo ?? true, view: 'show' }) })\n }\n\n /**\n * Records an external action event.\n * @param event An external action configured in the campaign (otherwise `code_error: 30`).\n * @param properties Event data. Must not be empty (otherwise `code_error: 11`).\n */\n createExternal(event: string, properties: Record<string, unknown>, { category, points_type }: CreateExternalOptions = {}): Observable<CreateExternalResponse> {\n return this.#api.post<CreateExternalResponse>('/mod/external', { event, properties, category, points_type })\n }\n\n #list<E>(params: EntriesListParams): Observable<EntriesResponse<E>> {\n return this.#api.get<EntriesResponse<E>>('/participant_entries', { params: asApiParams({ ...params, hide_undo: params.hide_undo ?? true, view: 'show' }) })\n }\n}\n","import { Entry, EntryTypes, KnownEntryType } from './entries-models'\n\n/**\n * Narrows an entry to its type.\n *\n * @example\n * ```ts\n * for (const entry of response.data) {\n * if (isEntryType(entry, 'Redeem')) console.log(entry.prize.name)\n * }\n * ```\n */\nexport function isEntryType<K extends KnownEntryType>(entry: Entry, type: K): entry is EntryTypes[K] {\n return entry._type === type\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { EntryData, ExternalEntry } from '../entries/entries-models'\nimport { ExternalFormFieldsResponse, ExternalFormsListParams, ExternalFormsListResponse, ExternalFormSubmissionResponse, ExternalFormSubmissionsParams, ExternalFormSubmissionsResponse } from './external-forms-models'\n\n/** External forms (custom actions configured per campaign) and their submissions. */\n@Service()\nexport class ExternalFormsService {\n readonly #api = inject(ApiClient)\n\n listForms(params: ExternalFormsListParams = {}): Observable<ExternalFormsListResponse> {\n return this.#api.get<ExternalFormsListResponse>('/external_forms/actions/list', { params: { ...params, participant_match_rules: params.participant_match_rules ?? true } })\n }\n\n getFormFields(id: string): Observable<ExternalFormFieldsResponse> {\n return this.#api.get<ExternalFormFieldsResponse>(`/external_forms/actions/${id}/fields_info`)\n }\n\n submit(id: string, values: Record<string, unknown>, category?: string): Observable<ExternalFormSubmissionResponse> {\n return this.#api.post<ExternalFormSubmissionResponse>(`/external_forms/actions/${id}/fillup`, { external_form: values, category })\n }\n\n /** Submitted forms (`External` entries), paginated. It is a read, but the backend only accepts POST. `T`: shape of `data`. */\n listSubmissions<T = EntryData>(params: ExternalFormSubmissionsParams = {}): Observable<ExternalFormSubmissionsResponse<T>> {\n return this.#api.post<ExternalFormSubmissionsResponse<T>>('/external_forms/list', { ...params, hide_undo: params.hide_undo ?? true })\n }\n\n /** @param id The submission (entry) `_id`. */\n getSubmission<T = EntryData>(id: string): Observable<ExternalEntry<T>> {\n return this.#api.get<ExternalEntry<T>>(`/external_forms/${id}`)\n }\n\n updateSubmission(id: string, values: Record<string, unknown>): Observable<ExternalFormSubmissionResponse> {\n return this.#api.patch<ExternalFormSubmissionResponse>(`/external_forms/${id}`, { external_form: values })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { GoalAcceptanceResponse, GoalData, GoalsListParams, GoalsListResponse, ParticipantGoalsParams, ParticipantGoalsResponse } from './goals-models'\n\n/** Campaign goals: the participant's goals with progress, the campaign catalog, and accepting goals. */\n@Service()\nexport class GoalsService {\n readonly #api = inject(ApiClient)\n\n /** Goals that apply to the logged participant (or `participant_uid`), with their progress. `T`: shape of `goal_data`. */\n listParticipantGoals<T = GoalData>(params: ParticipantGoalsParams = {}): Observable<ParticipantGoalsResponse<T>> {\n return this.#api.get<ParticipantGoalsResponse<T>>('/participants/goals', { params: { ...params } })\n }\n\n /** Every goal of the campaign (no progress), paginated. It is a read, but the backend only accepts POST. */\n list<T = GoalData>(params: GoalsListParams = {}): Observable<GoalsListResponse<T>> {\n return this.#api.post<GoalsListResponse<T>>('/goals/index', { ...params, include_ended: params.include_ended ?? true })\n }\n\n /** @param goalId The goal id (`ParticipantGoal.goal_id`, not its `_id`). */\n accept(goalId: string): Observable<GoalAcceptanceResponse> {\n return this.#api.post<GoalAcceptanceResponse>('/participants/goals/accept', { goal_id: goalId })\n }\n\n /** @param goalId The goal id (`ParticipantGoal.goal_id`, not its `_id`). */\n decline(goalId: string): Observable<GoalAcceptanceResponse> {\n return this.#api.post<GoalAcceptanceResponse>('/participants/goals/unaccept', { goal_id: goalId })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CalculateMetricParams, CalculateMetricResponse, MetricsListResponse, MetricsParams } from './metrics-models'\n\n/** Campaign metrics (custom aggregations configured per campaign). */\n@Service()\nexport class MetricsService {\n readonly #api = inject(ApiClient)\n\n list(params: MetricsParams = {}): Observable<MetricsListResponse> {\n return this.#api.get<MetricsListResponse>('/metrics/index', { params: { ...params } })\n }\n\n calculate(params: CalculateMetricParams): Observable<CalculateMetricResponse> {\n return this.#api.get<CalculateMetricResponse>('/metrics/exec', { params: { ...params } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport {\n BaseCurrentParticipant,\n BaseParticipant,\n BaseParticipantRankData,\n CurrentParticipantResponse,\n ParticipantListParams,\n ParticipantListResponse,\n ParticipantRankResponse,\n ParticipantResponse,\n PushSubscriptionPayload,\n RemovePushSubscriptionsResponse,\n SavePushSubscriptionResponse\n} from './participant-models'\n\n/** Logged participant, participant lists and push notification subscriptions. */\n@Service()\nexport class ParticipantService {\n readonly #api = inject(ApiClient)\n\n /** Logged participant and site config. `T`: your participant interface (`extends BaseCurrentParticipant`). */\n getCurrent<T = BaseCurrentParticipant>(): Observable<CurrentParticipantResponse<T>> {\n return this.#api.get<CurrentParticipantResponse<T>>('/sconfig')\n }\n\n /** Points, level and position of the logged participant. `T`: shape of `data.data` (`extends BaseParticipantRankData`). */\n getRank<T = BaseParticipantRankData>(): Observable<ParticipantRankResponse<T>> {\n return this.#api.get<ParticipantRankResponse<T>>('/participant_rank')\n }\n\n /** `T`: your participant interface (`extends BaseParticipant`). */\n list<T = BaseParticipant>(params: ParticipantListParams = {}): Observable<ParticipantListResponse<T>> {\n return this.#api.get<ParticipantListResponse<T>>('/participants/list', { params: { ...params } })\n }\n\n /** `T`: your participant interface (`extends BaseParticipant`). */\n getByUid<T = BaseParticipant>(uid: string): Observable<ParticipantResponse<T>> {\n return this.#api.get<ParticipantResponse<T>>('/participants/show', { params: { uid } })\n }\n\n /** Sends the browser subscription as the request body, unwrapped. */\n savePushSubscription(subscription: PushSubscriptionPayload): Observable<SavePushSubscriptionResponse> {\n return this.#api.post<SavePushSubscriptionResponse>('/participants/save_push_subscription', subscription)\n }\n\n removePushSubscriptions(): Observable<RemovePushSubscriptionsResponse> {\n return this.#api.post<RemovePushSubscriptionsResponse>('/participants/remove_push_subscriptions', {})\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ChangePasswordParams, ChangePasswordResponse, NotificationChannel, ResetPasswordParams, ResetPasswordResponse, SendResetTokenParams, SendResetTokenResponse, ValidateChannelResponse } from './password-models'\n\n/** Change password (logged participant) and the password recovery flow. */\n@Service()\nexport class PasswordService {\n readonly #api = inject(ApiClient)\n\n changePassword(params: ChangePasswordParams): Observable<ChangePasswordResponse> {\n return this.#api.put<ChangePasswordResponse>('/password/change', { participation: params })\n }\n\n /** Checks that a participant exists for the given channel value (e.g. an email or a phone number). */\n validateChannel(channel: NotificationChannel, value: string): Observable<ValidateChannelResponse> {\n return this.#api.post<ValidateChannelResponse>('/password/validate_channel', { [channel]: value })\n }\n\n sendResetToken({ channel, data, edit_password_url, uid }: SendResetTokenParams): Observable<SendResetTokenResponse> {\n const body: Record<string, unknown> = { participation: data, notification_channel: channel, edit_password_url }\n if (uid) body['uid'] = uid\n\n return this.#api.post<SendResetTokenResponse>('/password', body)\n }\n\n resetPassword({ password, password_confirmation, token, channel }: ResetPasswordParams): Observable<ResetPasswordResponse> {\n return this.#api.post<ResetPasswordResponse>('/password/update', { participation: { password, password_confirmation }, token, channel })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { asApiParams } from '../http/query-params'\nimport { CheckRedeemResponse, ExternalCouponDataResponse, PrizesListResponse, PrizesParams, RedeemedPrize, ToggleWishlistResponse, WishlistResponse } from './prizes-models'\n\n/** Prizes and redemptions. */\n@Service()\nexport class PrizesService {\n readonly #api = inject(ApiClient)\n\n list(params: PrizesParams = {}): Observable<PrizesListResponse> {\n return this.#api.get<PrizesListResponse>('/prizes/index', { params: asApiParams({ ...params, page: params.page ?? 1, view: params.view ?? 'show' }) })\n }\n\n checkRedeem(id: string): Observable<CheckRedeemResponse> {\n return this.#api.get<CheckRedeemResponse>(`/prizes/${id}/redeem/check`)\n }\n\n redeem(id: string, opts: Record<string, unknown> = {}): Observable<RedeemedPrize> {\n return this.#api.post<RedeemedPrize>(`/prizes/${id}/redeem`, opts)\n }\n\n getWishlist(page?: number): Observable<WishlistResponse> {\n return this.#api.get<WishlistResponse>('/prizes/whislist', { params: { page } })\n }\n\n toggleWishlist(id: string): Observable<ToggleWishlistResponse> {\n return this.#api.get<ToggleWishlistResponse>(`/prizes/${id}/whislist_toggle`, { params: { id } })\n }\n\n getExternalCouponData(id: string, key: string, city?: string): Observable<ExternalCouponDataResponse> {\n return this.#api.get<ExternalCouponDataResponse>(`/prizes/${id}/redeem/external/${key}`, { params: { city } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { AdvancedRankingParams, AdvancedRankingResponse, SegmentRankingParams, SegmentRankingResponse } from './ranking-models'\n\n/** Segment and advanced participant rankings. */\n@Service()\nexport class RankingService {\n readonly #api = inject(ApiClient)\n\n getSegment(params: SegmentRankingParams = {}): Observable<SegmentRankingResponse> {\n return this.#api.get<SegmentRankingResponse>('/participants/ranks/segment', { params: { ...params } })\n }\n\n getAdvanced<T = Record<string, unknown>>(params: AdvancedRankingParams = {}): Observable<AdvancedRankingResponse<T>> {\n return this.#api.get<AdvancedRankingResponse<T>>('/participants/ranks/advanced', { params: { ...params } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ChangeReferralCodeResponse } from './referrals-models'\n\n/** The participant's referral code. */\n@Service()\nexport class ReferralsService {\n readonly #api = inject(ApiClient)\n\n changeCode(code: string): Observable<ChangeReferralCodeResponse> {\n return this.#api.post<ChangeReferralCodeResponse>('/mod/referrals', {}, { params: { code } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { ConfirmEmailResponse, SendEmailVerificationTokenResponse, SignupData, SignupFormResponse, SignupResponse, UpdateParticipantResponse, ValidateEmailTokenResponse } from './registrations-models'\n\n/** Signup and email verification. */\n@Service()\nexport class RegistrationsService {\n readonly #api = inject(ApiClient)\n\n getSignupForm(): Observable<SignupFormResponse> {\n return this.#api.get<SignupFormResponse>('/registrations/signupform')\n }\n\n signup(data: SignupData): Observable<SignupResponse> {\n return this.#api.post<SignupResponse>('/registrations/fillup', { participation: data })\n }\n\n updateParticipant(data: SignupData): Observable<UpdateParticipantResponse> {\n return this.#api.post<UpdateParticipantResponse>('/registrations/update', { participation: data })\n }\n\n /** Sends (or resends) the email verification token to the given address. */\n sendEmailVerificationToken(email: string): Observable<SendEmailVerificationTokenResponse> {\n return this.#api.post<SendEmailVerificationTokenResponse>('/registrations/reset_email_verify_token', { email })\n }\n\n validateEmailToken(token: string): Observable<ValidateEmailTokenResponse> {\n return this.#api.post<ValidateEmailTokenResponse>('/registrations/validate_email_token', { token })\n }\n\n confirmEmail(token: string): Observable<ConfirmEmailResponse> {\n return this.#api.post<ConfirmEmailResponse>('/registrations/confirm_email', { token })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { LoginCredentials, LoginFormResponse, LoginRequirementsResponse, LoginResponse, LogoutResponse, SsoLoginResponse } from './session-models'\n\n/** Participant session: login form, login/logout, SSO and login requirements. */\n@Service()\nexport class SessionService {\n readonly #api = inject(ApiClient)\n\n /** Fields the microsite asks for on login (the login identifier varies: email, code, document…). */\n getLoginForm(): Observable<LoginFormResponse> {\n return this.#api.get<LoginFormResponse>('/sessions/loginform')\n }\n\n login(credentials: LoginCredentials): Observable<LoginResponse> {\n return this.#api.post<LoginResponse>('/sessions/login', { participation: credentials })\n }\n\n logout(): Observable<LogoutResponse> {\n return this.#api.get<LogoutResponse>('/sessions/logout')\n }\n\n /** URL to redirect the participant to the SSO provider. */\n getSsoLoginUrl(provider: string): Observable<SsoLoginResponse> {\n return this.#api.get<SsoLoginResponse>('/auth/sso_login', { params: { provider } })\n }\n\n /** Whether the logged participant can use the site or must complete something first (`redirect_page`). */\n checkLoginRequirements(): Observable<LoginRequirementsResponse> {\n return this.#api.get<LoginRequirementsResponse>('/participant_login_requirements')\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CreateTeamParams, CreateTeamResponse, RemoveMemberResponse, TeamResponse, TeamsListResponse, TeamsParams } from './teams-models'\n\n/** Teams. */\n@Service()\nexport class TeamsService {\n readonly #api = inject(ApiClient)\n\n list(params: TeamsParams = {}): Observable<TeamsListResponse> {\n return this.#api.get<TeamsListResponse>('/mod/teams', { params: { ...params } })\n }\n\n get(id: string): Observable<TeamResponse> {\n return this.#api.get<TeamResponse>(`/mod/teams/${id}/show`)\n }\n\n create(params: CreateTeamParams): Observable<CreateTeamResponse> {\n return this.#api.post<CreateTeamResponse>('/mod/teams', { team: params })\n }\n\n /** Removes the logged participant, or `uid` when given, from the team. */\n removeMember(id: string, uid?: string): Observable<RemoveMemberResponse> {\n return this.#api.post<RemoveMemberResponse>(`/mod/teams/${id}/remove_member`, {}, { params: { participant_uid: uid } })\n }\n}\n","import { inject, Service } from '@angular/core'\nimport { Observable } from 'rxjs'\n\nimport { ApiClient } from '../http/api-client'\nimport { CreateVoteParams, UpdateVoteParams, VoteResponse, VotesResponse } from './votes-models'\n\n/** Votes on an activity (target): like, support, interest, curiosity. */\n@Service()\nexport class VotesService {\n readonly #api = inject(ApiClient)\n\n get(targetId: string): Observable<VotesResponse> {\n return this.#api.get<VotesResponse>(`/mod/votes/${targetId}`)\n }\n\n create(targetId: string, params: CreateVoteParams = {}): Observable<VoteResponse> {\n return this.#api.post<VoteResponse>(`/mod/votes/${targetId}`, params)\n }\n\n update(targetId: string, params: UpdateVoteParams = {}): Observable<VoteResponse> {\n return this.#api.patch<VoteResponse>(`/mod/votes/${targetId}`, params)\n }\n\n delete(targetId: string): Observable<VoteResponse> {\n return this.#api.delete<VoteResponse>(`/mod/votes/${targetId}`)\n }\n}\n","/*\n * Public API Surface of @superlikers/microsites-api\n *\n * Everything exported here is public API (the contract with consumers).\n * Domain folders only hold public models and their service, so they are exported through their\n * `index.ts`; `config`, `errors` and `http` also hold internal pieces and are exported one by one.\n */\n\n// Config\nexport type { MicrositesApiConfig } from './lib/config/microsites-api-config'\nexport { provideMicrositesApi } from './lib/config/provide-microsites-api'\n\n// Errors\nexport { ApiError, isApiError } from './lib/errors/api-error'\n\n// Shared models\nexport type * from './lib/shared/activity-participant'\nexport type * from './lib/shared/date-filter'\nexport type * from './lib/shared/field'\n\n// Domains\nexport * from './lib/achievements'\nexport * from './lib/activities'\nexport * from './lib/badges'\nexport * from './lib/blogs'\nexport * from './lib/boards'\nexport * from './lib/comments'\nexport * from './lib/entries'\nexport * from './lib/external-forms'\nexport * from './lib/goals'\nexport * from './lib/metrics'\nexport * from './lib/participant'\nexport * from './lib/password'\nexport * from './lib/prizes'\nexport * from './lib/ranking'\nexport * from './lib/referrals'\nexport * from './lib/registrations'\nexport * from './lib/session'\nexport * from './lib/teams'\nexport * from './lib/votes'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAIA;AACO,MAAM,qBAAqB,GAAG,IAAI,cAAc,CAAsB,uBAAuB,CAAC;AAErG;;;;;;;;;;AAUG;AACG,SAAU,oBAAoB,CAAC,MAA2B,EAAA;AAC9D,IAAA,OAAO,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC1G;AAEA;SACgB,yBAAyB,GAAA;AACvC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAChE,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,MAAM,IAAI,KAAK,CAAC,6HAA6H,CAAC;IAChJ;AACA,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,eAAe,CAAC,MAA2B,EAAA;AAClD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE;IAEhE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE;QAC1E,MAAM,IAAI,KAAK,CAAC,CAAA,+CAAA,EAAkD,MAAM,CAAC,OAAO,CAAA,wEAAA,CAA0E,CAAC;IAC7J;AAEA,IAAA,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE;AAC/B;;AC7BA;;;;;;;;;;;AAWG;AACG,MAAO,QAAS,SAAQ,KAAK,CAAA;IACf,IAAI,GAAG,UAAU;;AAG1B,IAAA,MAAM;;AAEN,IAAA,IAAI;;AAEJ,IAAA,WAAW;;AAEX,IAAA,GAAG;AAEZ;;;AAGG;AACM,IAAA,iBAAiB;AAE1B,IAAA,WAAA,CAAY,QAA2B,EAAA;AACrC,QAAA,MAAM,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC;AAChD,QAAA,MAAM,IAAI,GAAG,eAAe,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAE5F,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;AAC7B,QAAA,IAAI,CAAC,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;QACxE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE;AACpC,QAAA,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG;AACvB,QAAA,IAAI,CAAC,iBAAiB,GAAG,eAAe;IAC1C;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC;IAC1B;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,GAAG;IAC5B;AACD;AAEK,SAAU,UAAU,CAAC,KAAc,EAAA;IACvC,OAAO,KAAK,YAAY,QAAQ;AAClC;AAEA,SAAS,QAAQ,CAAC,KAAc,EAAA;AAC9B,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,GAAI,KAAmB,GAAG,EAAE;AAChF;AAEA;;;AAGG;AACH,SAAS,cAAc,CAAC,QAA2B,EAAA;IACjD,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;AAAE,QAAA,OAAO,KAAK;AACjE,IAAA,MAAM,KAAK,GAAY,QAAQ,CAAC,KAAK;IACrC,OAAO,KAAK,YAAY,WAAW,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA6B,CAAC,KAAK,YAAY,WAAW,CAAC;AACrJ;AAEA,SAAS,cAAc,CAAC,MAAc,EAAE,eAAwB,EAAA;AAC9D,IAAA,IAAI,eAAe;AAAE,QAAA,OAAO,oFAAoF;AAChH,IAAA,OAAO,MAAM,KAAK,CAAC,GAAG,oDAAoD,GAAG,CAAA,2BAAA,EAA8B,MAAM,GAAG;AACtH;;ACzEA;;;AAGG;AACH,MAAM,cAAc,CAAA;AAClB,IAAA,SAAS,CAAC,GAAW,EAAA;AACnB,QAAA,OAAO,kBAAkB,CAAC,GAAG,CAAC;IAChC;AACA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,OAAO,kBAAkB,CAAC,KAAK,CAAC;IAClC;AACA,IAAA,SAAS,CAAC,GAAW,EAAA;AACnB,QAAA,OAAO,kBAAkB,CAAC,GAAG,CAAC;IAChC;AACA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,OAAO,kBAAkB,CAAC,KAAK,CAAC;IAClC;AACD;AAED,MAAM,KAAK,GAAG,IAAI,cAAc,EAAE;AAElC;;;AAGG;AACG,SAAU,YAAY,CAAC,MAAiB,EAAA;IAC5C,IAAI,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEnD,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACjD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,IAAI,IAAI,IAAI,IAAI;AAAE,oBAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA,EAAG,GAAG,CAAA,EAAA,CAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5E;QACF;AAAO,aAAA,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;AAC/B,YAAA,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACtD,IAAI,QAAQ,IAAI,IAAI;AAAE,oBAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7F;QACF;AAAO,aAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACxB,YAAA,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD;IACF;AAEA,IAAA,OAAO,UAAU;AACnB;AAEA,SAAS,aAAa,CAAC,KAAc,EAAA;AACnC,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAC7E;AAEA;;;;AAIG;AACG,SAAU,WAAW,CAAmB,MAAS,EAAA;AACrD,IAAA,OAAO,MAA8B;AACvC;;AClDA;;;AAGG;MAEU,SAAS,CAAA;AACX,IAAA,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;AAC1B,IAAA,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACvC,OAAO,GAAG,yBAAyB,EAAE;IAE9C,GAAG,CAAI,IAAY,EAAE,OAA2B,EAAA;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAI,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;IAChF;AAEA,IAAA,IAAI,CAAI,IAAY,EAAE,IAAa,EAAE,OAA2B,EAAA;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;IACvF;AAEA,IAAA,GAAG,CAAI,IAAY,EAAE,IAAa,EAAE,OAA2B,EAAA;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;IACtF;AAEA,IAAA,KAAK,CAAI,IAAY,EAAE,IAAa,EAAE,OAA2B,EAAA;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;IACxF;IAEA,MAAM,CAAI,IAAY,EAAE,OAA2B,EAAA;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAI,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC;IACnF;;AAGA,IAAA,IAAI,CAAC,IAAY,EAAA;AACf,QAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;IAC9D;;AAGA,IAAA,QAAQ,CAAC,OAA2B,EAAA;QAClC,OAAO;YACL,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;AACpG,YAAA,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AAC7E,YAAA,eAAe,EAAE;SAClB;IACH;AAEA;;;;AAIG;IACH,aAAa,CAAI,OAAsB,EAAE,GAAW,EAAA;QAClD,OAAO,OAAO,CAAC,IAAI,CACjB,GAAG,CAAC,IAAI,IAAG;YACT,IAAI,WAAW,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACrH,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,KAAc,KAAI;AAC5B,YAAA,IAAI,EAAE,KAAK,YAAY,iBAAiB,CAAC;AAAE,gBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;AAEzE,YAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC;AACpC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc;AAClD,YAAA,IAAI,QAAQ,CAAC,cAAc,IAAI,cAAc;AAAE,gBAAA,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;AAEpH,YAAA,OAAO,UAAU,CAAC,MAAM,QAAQ,CAAC;QACnC,CAAC,CAAC,CACH;IACH;uGAjEW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAT,SAAS,EAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBADrB;;AAqED,SAAS,WAAW,CAAC,IAAa,EAAA;IAChC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAK,IAA4B,CAAC,KAAK,KAAK,OAAO;AAC7H;;ACnFA;MAEa,mBAAmB,CAAA;AACrB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,IAAI,CAAyC,SAA6B,EAAE,EAAA;AAC1E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA8B,qBAAqB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/I;uGALW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAnB,mBAAmB,EAAA,CAAA;;2FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;ACFD;MAEa,iBAAiB,CAAA;AACnB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;AAEjC,IAAA,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAqB,EAAA;AACzD,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC3B,QAAA,IAAI,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,IAAI,EAAE,QAAQ,CAAC;;AAC3D,YAAA,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC;QAC7C,IAAI,QAAQ,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,QAAQ,CAAC;QAErE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAsB,aAAa,EAAE,IAAI,CAAC;IACjE;AAEA,IAAA,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAwB,EAAA;AACrD,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,IAAI,CAAC;AAC9C,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,QAAQ,CAAC;QAEhE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAyB,gBAAgB,EAAE,IAAI,CAAC;IACvE;uGAlBW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAjB,iBAAiB,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B;;;ACDD;MAEa,aAAa,CAAA;AACf,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,IAAI,CAAC,SAAuB,EAAE,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAqB,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACtF;AAEA,IAAA,GAAG,CAAC,EAAU,EAAA;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,CAAA,QAAA,EAAW,EAAE,CAAA,KAAA,CAAO,CAAC;IAC3D;;AAGA,IAAA,QAAQ,CAAC,GAAY,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA4B,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,CAAC;IACxG;uGAdW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAb,aAAa,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACAD;MAEa,YAAY,CAAA;AACd,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,IAAI,CAA0B,SAA0B,EAAE,EAAA;QACxD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAuB,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;IAC5G;AAEA,IAAA,GAAG,CAA0B,EAAU,EAAA;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,CAAA,UAAA,EAAa,EAAE,CAAA,KAAA,CAAO,CAAC;IACnE;AAEA,IAAA,MAAM,CAA0B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAwB,EAAA;AAC7H,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,IAAI,MAAM,CAAC;AAClD,QAAA,IAAI,aAAa;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,aAAa,CAAC;AACzE,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,QAAQ,CAAC;AAC1D,QAAA,IAAI,iBAAiB;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,8BAA8B,EAAE,iBAAiB,CAAC;AACrF,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,CAAC;QAEnE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA4B,YAAY,EAAE,IAAI,CAAC;IACtE;uGAtBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAZ,YAAY,EAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;ACFD;MAEa,aAAa,CAAA;AACf,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,IAAI,CAAC,SAAuB,EAAE,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAqB,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACtF;IAEA,WAAW,CAAC,KAAa,EAAE,IAAa,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAuB,WAAW,KAAK,CAAA,QAAA,CAAU,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAC9F;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAE,MAAc,EAAE,SAA8B,EAAE,EAAA;AAC3E,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;AAC/H,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAwB,WAAW,KAAK,CAAA,SAAA,EAAY,MAAM,CAAA,KAAA,CAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3G;uGAfW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAb,aAAa,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACAD;MAEa,eAAe,CAAA;AACjB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;AAEjC,IAAA,IAAI,CAA0B,QAAgB,EAAE,MAAA,GAAyB,EAAE,EAAA;AACzE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA0B,iBAAiB,QAAQ,CAAA,CAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACvG;AAEA,IAAA,MAAM,CAA0B,QAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAuB,EAAA;QACvF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA2B,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IAC/G;uGATW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;ACDD;;;AAGG;MAEU,cAAc,CAAA;AAChB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;;IAGjC,aAAa,CAAgB,SAAwB,EAAE,EAAA;AACrD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAmB,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACvE;IAEA,eAAe,CAAC,SAAwB,EAAE,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAc,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAChE;IAEA,UAAU,CAAC,SAAwB,EAAE,EAAA;AACnC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAa,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IACpE;IAEA,aAAa,CAAC,SAAwB,EAAE,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAgB,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1E;IAEA,aAAa,CAAC,SAAwB,EAAE,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAgB,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvE;;IAGA,IAAI,CAAC,SAA4B,EAAE,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAQ,MAAM,CAAC;IAClC;;AAGA,IAAA,MAAM,CAAC,IAAc,EAAE,MAAA,GAA4B,EAAE,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAyB,iBAAiB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACpL;AAEA;;;;AAIG;IACH,cAAc,CAAC,KAAa,EAAE,UAAmC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAA,GAA4B,EAAE,EAAA;AACtH,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAyB,eAAe,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAC9G;AAEA,IAAA,KAAK,CAAI,MAAyB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAqB,sBAAsB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7J;uGA7CW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAd,cAAc,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACTD;;;;;;;;;AASG;AACG,SAAU,WAAW,CAA2B,KAAY,EAAE,IAAO,EAAA;AACzE,IAAA,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI;AAC7B;;ACPA;MAEa,oBAAoB,CAAA;AACtB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,SAAS,CAAC,SAAkC,EAAE,EAAA;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA4B,8BAA8B,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,IAAI,IAAI,EAAE,EAAE,CAAC;IAC7K;AAEA,IAAA,aAAa,CAAC,EAAU,EAAA;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA6B,CAAA,wBAAA,EAA2B,EAAE,CAAA,YAAA,CAAc,CAAC;IAC/F;AAEA,IAAA,MAAM,CAAC,EAAU,EAAE,MAA+B,EAAE,QAAiB,EAAA;AACnE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAiC,2BAA2B,EAAE,CAAA,OAAA,CAAS,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACpI;;IAGA,eAAe,CAAgB,SAAwC,EAAE,EAAA;QACvE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAqC,sBAAsB,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;IACvI;;AAGA,IAAA,aAAa,CAAgB,EAAU,EAAA;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAmB,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAC;IACjE;IAEA,gBAAgB,CAAC,EAAU,EAAE,MAA+B,EAAA;AAC1D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAiC,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAC5G;uGA3BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAApB,oBAAoB,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACFD;MAEa,YAAY,CAAA;AACd,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;;IAGjC,oBAAoB,CAAe,SAAiC,EAAE,EAAA;AACpE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA8B,qBAAqB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACrG;;IAGA,IAAI,CAAe,SAA0B,EAAE,EAAA;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAuB,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;IACzH;;AAGA,IAAA,MAAM,CAAC,MAAc,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAyB,4BAA4B,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClG;;AAGA,IAAA,OAAO,CAAC,MAAc,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAyB,8BAA8B,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACpG;uGArBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAZ,YAAY,EAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;ACDD;MAEa,cAAc,CAAA;AAChB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,IAAI,CAAC,SAAwB,EAAE,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACxF;AAEA,IAAA,SAAS,CAAC,MAA6B,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA0B,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IAC3F;uGATW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAd,cAAc,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACWD;MAEa,kBAAkB,CAAA;AACpB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;;IAGjC,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgC,UAAU,CAAC;IACjE;;IAGA,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA6B,mBAAmB,CAAC;IACvE;;IAGA,IAAI,CAAsB,SAAgC,EAAE,EAAA;AAC1D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA6B,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACnG;;AAGA,IAAA,QAAQ,CAAsB,GAAW,EAAA;AACvC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAyB,oBAAoB,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;IACzF;;AAGA,IAAA,oBAAoB,CAAC,YAAqC,EAAA;QACxD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA+B,sCAAsC,EAAE,YAAY,CAAC;IAC3G;IAEA,uBAAuB,GAAA;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkC,yCAAyC,EAAE,EAAE,CAAC;IACvG;uGA9BW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAlB,kBAAkB,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACbD;MAEa,eAAe,CAAA;AACjB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;AAEjC,IAAA,cAAc,CAAC,MAA4B,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAyB,kBAAkB,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAC7F;;IAGA,eAAe,CAAC,OAA4B,EAAE,KAAa,EAAA;AACzD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA0B,4BAA4B,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;IACpG;IAEA,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAwB,EAAA;AAC5E,QAAA,MAAM,IAAI,GAA4B,EAAE,aAAa,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,iBAAiB,EAAE;AAC/G,QAAA,IAAI,GAAG;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG;QAE1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAyB,WAAW,EAAE,IAAI,CAAC;IAClE;IAEA,aAAa,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAuB,EAAA;QACpF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAwB,kBAAkB,EAAE,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1I;uGArBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;ACAD;MAEa,aAAa,CAAA;AACf,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,IAAI,CAAC,SAAuB,EAAE,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAqB,eAAe,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;IACxJ;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,CAAA,QAAA,EAAW,EAAE,CAAA,aAAA,CAAe,CAAC;IACzE;AAEA,IAAA,MAAM,CAAC,EAAU,EAAE,IAAA,GAAgC,EAAE,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAgB,CAAA,QAAA,EAAW,EAAE,CAAA,OAAA,CAAS,EAAE,IAAI,CAAC;IACpE;AAEA,IAAA,WAAW,CAAC,IAAa,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAmB,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAClF;AAEA,IAAA,cAAc,CAAC,EAAU,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAyB,WAAW,EAAE,CAAA,gBAAA,CAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACnG;AAEA,IAAA,qBAAqB,CAAC,EAAU,EAAE,GAAW,EAAE,IAAa,EAAA;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA6B,CAAA,QAAA,EAAW,EAAE,CAAA,iBAAA,EAAoB,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAChH;uGAzBW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAb,aAAa,EAAA,CAAA;;2FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACFD;MAEa,cAAc,CAAA;AAChB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,UAAU,CAAC,SAA+B,EAAE,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAyB,6BAA6B,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACxG;IAEA,WAAW,CAA8B,SAAgC,EAAE,EAAA;AACzE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA6B,8BAA8B,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IAC7G;uGATW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAd,cAAc,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACDD;MAEa,gBAAgB,CAAA;AAClB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;AAEjC,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA6B,gBAAgB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAC/F;uGALW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAhB,gBAAgB,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;ACDD;MAEa,oBAAoB,CAAA;AACtB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAqB,2BAA2B,CAAC;IACvE;AAEA,IAAA,MAAM,CAAC,IAAgB,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAiB,uBAAuB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACzF;AAEA,IAAA,iBAAiB,CAAC,IAAgB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA4B,uBAAuB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACpG;;AAGA,IAAA,0BAA0B,CAAC,KAAa,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAqC,yCAAyC,EAAE,EAAE,KAAK,EAAE,CAAC;IACjH;AAEA,IAAA,kBAAkB,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA6B,qCAAqC,EAAE,EAAE,KAAK,EAAE,CAAC;IACrG;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAuB,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC;IACxF;uGA1BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAApB,oBAAoB,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACDD;MAEa,cAAc,CAAA;AAChB,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;;IAGjC,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB,qBAAqB,CAAC;IAChE;AAEA,IAAA,KAAK,CAAC,WAA6B,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAgB,iBAAiB,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IACzF;IAEA,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAiB,kBAAkB,CAAC;IAC1D;;AAGA,IAAA,cAAc,CAAC,QAAgB,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAmB,iBAAiB,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;IACrF;;IAGA,sBAAsB,GAAA;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA4B,iCAAiC,CAAC;IACpF;uGAxBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAd,cAAc,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACDD;MAEa,YAAY,CAAA;AACd,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAEjC,IAAI,CAAC,SAAsB,EAAE,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAoB,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IAClF;AAEA,IAAA,GAAG,CAAC,EAAU,EAAA;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,CAAA,WAAA,EAAc,EAAE,CAAA,KAAA,CAAO,CAAC;IAC7D;AAEA,IAAA,MAAM,CAAC,MAAwB,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAqB,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC3E;;IAGA,YAAY,CAAC,EAAU,EAAE,GAAY,EAAA;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAuB,CAAA,WAAA,EAAc,EAAE,CAAA,cAAA,CAAgB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,CAAC;IACzH;uGAlBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAZ,YAAY,EAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;ACDD;MAEa,YAAY,CAAA;AACd,IAAA,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;AAEjC,IAAA,GAAG,CAAC,QAAgB,EAAA;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAC;IAC/D;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAE,MAAA,GAA2B,EAAE,EAAA;AACpD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAe,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,EAAE,MAAM,CAAC;IACvE;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAE,MAAA,GAA2B,EAAE,EAAA;AACpD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAe,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,EAAE,MAAM,CAAC;IACxE;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAA;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAe,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAC;IACjE;uGAjBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAZ,YAAY,EAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;ACPD;;;;;;AAMG;;ACNH;;AAEG;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@superlikers/microsites-api",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Typed Angular services for the Superlikers microsites backend",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"superlikers",
|
|
8
|
+
"microsites",
|
|
9
|
+
"api"
|
|
10
|
+
],
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://bitbucket.org/superlikers-microsites/sl-libraries.git",
|
|
14
|
+
"directory": "projects/microsites-api"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://bitbucket.org/superlikers-microsites/sl-libraries/src/main/projects/microsites-api/README.md",
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"@angular/common": "^22.0.0",
|
|
19
|
+
"@angular/core": "^22.0.0",
|
|
20
|
+
"@angular/forms": "^22.0.0",
|
|
21
|
+
"rxjs": "^7.8.0"
|
|
22
|
+
},
|
|
23
|
+
"peerDependenciesMeta": {
|
|
24
|
+
"@angular/forms": {
|
|
25
|
+
"optional": true
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"tslib": "^2.3.0"
|
|
30
|
+
},
|
|
31
|
+
"sideEffects": false,
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public",
|
|
34
|
+
"directory": "../../dist/microsites-api"
|
|
35
|
+
},
|
|
36
|
+
"module": "fesm2022/superlikers-microsites-api.mjs",
|
|
37
|
+
"typings": "types/superlikers-microsites-api.d.ts",
|
|
38
|
+
"exports": {
|
|
39
|
+
"./package.json": {
|
|
40
|
+
"default": "./package.json"
|
|
41
|
+
},
|
|
42
|
+
".": {
|
|
43
|
+
"types": "./types/superlikers-microsites-api.d.ts",
|
|
44
|
+
"default": "./fesm2022/superlikers-microsites-api.mjs"
|
|
45
|
+
},
|
|
46
|
+
"./forms": {
|
|
47
|
+
"types": "./types/superlikers-microsites-api-forms.d.ts",
|
|
48
|
+
"default": "./fesm2022/superlikers-microsites-api-forms.mjs"
|
|
49
|
+
},
|
|
50
|
+
"./testing": {
|
|
51
|
+
"types": "./types/superlikers-microsites-api-testing.d.ts",
|
|
52
|
+
"default": "./fesm2022/superlikers-microsites-api-testing.mjs"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"type": "module"
|
|
56
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AsyncValidatorFn } from '@angular/forms';
|
|
2
|
+
import { NotificationChannel } from '@superlikers/microsites-api';
|
|
3
|
+
|
|
4
|
+
interface ChannelValidatorOptions {
|
|
5
|
+
/** Debounce before validating against the backend, in ms. @default 500 */
|
|
6
|
+
debounceMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Validates that a participant exists for the given channel value (an email or a phone number) against the
|
|
10
|
+
* backend, for "forgot password" forms. Must be called in an injection context (e.g. a component field
|
|
11
|
+
* initializer). Debounces while the control keeps changing; Angular cancels the pending check on every new value.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* readonly form = this.#fb.nonNullable.group({
|
|
16
|
+
* correo: ['', [Validators.required, Validators.email], [channelValidator('email')]]
|
|
17
|
+
* })
|
|
18
|
+
* ```
|
|
19
|
+
* ```html
|
|
20
|
+
* @if (form.controls.correo.errors?.['channel']; as error) {
|
|
21
|
+
* <p>{{ error.message }}</p>
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
declare function channelValidator(channel: NotificationChannel, options?: ChannelValidatorOptions): AsyncValidatorFn;
|
|
26
|
+
|
|
27
|
+
export { channelValidator };
|
|
28
|
+
export type { ChannelValidatorOptions };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ApiError, MicrositesApiConfig } from '@superlikers/microsites-api';
|
|
2
|
+
import { EnvironmentProviders } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
interface CreateApiErrorOptions {
|
|
5
|
+
/** HTTP status. Defaults to `404`, the status the backend uses for most business errors. */
|
|
6
|
+
status?: number;
|
|
7
|
+
message?: string;
|
|
8
|
+
/** Backend error code (`code_error`). */
|
|
9
|
+
code?: number;
|
|
10
|
+
fieldErrors?: Record<string, string>;
|
|
11
|
+
url?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Builds an {@link ApiError} as if the backend had answered with an error, to simulate failures in tests.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* { provide: SessionService, useValue: { login: () => throwError(() => createApiError({ code: 141, message: 'Contraseña incorrecta' })) } }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare function createApiError({ status, message, code, fieldErrors, url }?: CreateApiErrorOptions): ApiError;
|
|
22
|
+
|
|
23
|
+
/** baseUrl used by {@link provideMicrositesApiTesting}; use it to match requests in `HttpTestingController`. */
|
|
24
|
+
declare const MICROSITES_API_TEST_BASE_URL = "https://microsite.test";
|
|
25
|
+
/**
|
|
26
|
+
* Everything a test needs to use the library without a real backend:
|
|
27
|
+
* the library config, `HttpClient` and `HttpTestingController`.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* TestBed.configureTestingModule({ providers: [provideMicrositesApiTesting()] })
|
|
32
|
+
* const http = TestBed.inject(HttpTestingController)
|
|
33
|
+
* http.expectOne(`${MICROSITES_API_TEST_BASE_URL}/sessions/logout`).flush({ state: 'success', message: 'ok' })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare function provideMicrositesApiTesting(config?: Partial<MicrositesApiConfig>): EnvironmentProviders;
|
|
37
|
+
|
|
38
|
+
export { MICROSITES_API_TEST_BASE_URL, createApiError, provideMicrositesApiTesting };
|
|
39
|
+
export type { CreateApiErrorOptions };
|